Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
128 | pmbaty | 1 | <html> |
2 | <head> |
||
3 | <title>Chess Engine Communication Protocol</title> |
||
4 | </head> |
||
5 | |||
6 | <body> |
||
7 | <hr noshade size="2"> |
||
8 | <h1>Chess Engine Communication Protocol</h1> |
||
9 | <h2><a href="http://www.tim-mann.org/">Tim Mann</a> & <a href="http://home.hccnet.nl/h.g.muller/winboardF.html">H.G.Muller</a></h2> |
||
10 | <p> |
||
11 | Version 2; implemented in xboard/WinBoard 4.2.1 and later. (Sept 3, 2009)<br> |
||
12 | Changes since version 1 are indicated in <font color=red>red</font>.<br> |
||
13 | Changes for WinBoard 4.3.xx are indicated in <font color=green>green</font>.<br> |
||
14 | Changes for WinBoard 4.4.xx are indicated in <font color=blue>blue</font>. |
||
15 | <hr noshade size="2"> |
||
16 | |||
17 | <ul> |
||
18 | <li><a href="#1">1. Introduction</a> |
||
19 | <li><a href="#2">2. Connection</a> |
||
20 | <li><a href="#3">3. Debugging</a> |
||
21 | <li><a href="#4">4. How it got this way</a> |
||
22 | <li><a href="#5">5. WinBoard requires Win32 engines</a> |
||
23 | <li><a href="#6">6. Hints on input/output</a> |
||
24 | <li><a href="#7">7. Signals</a> |
||
25 | <li><a href="#8">8. Commands from xboard to the engine</a> |
||
26 | <li><a href="#9">9. Commands from the engine to xboard</a> |
||
27 | <li><a href="#10">10. Thinking Output</a> |
||
28 | <li><a href="#11">11. Time control</a> |
||
29 | <li><a href="#12">12. Analyze Mode</a> |
||
30 | <li><a href="#13">13. Idioms and backward compatibility features</a> |
||
31 | </ul> |
||
32 | |||
33 | <hr noshade size="2"> |
||
34 | |||
35 | <h2><a name="1">1. Introduction</a></h2> |
||
36 | |||
37 | <p> |
||
38 | This document is a set of rough notes on the protocol that xboard and |
||
39 | WinBoard use to communicate with gnuchessx and other chess engines. |
||
40 | These notes may be useful if you want to connect a different chess |
||
41 | engine to xboard. Throughout the notes, "xboard" means both xboard |
||
42 | and WinBoard except where they are specifically contrasted. |
||
43 | </p> |
||
44 | |||
45 | <p> |
||
46 | There are two reasons I can imagine someone wanting to do this: |
||
47 | </p> |
||
48 | <ol> |
||
49 | <li>You have, or are developing, a chess engine but you don't want to |
||
50 | write your own graphical interface. |
||
51 | <li>You have, or are developing,a chess engine, and you want to |
||
52 | interface it to the Internet Chess Server. |
||
53 | </ol> |
||
54 | |||
55 | <p> |
||
56 | In case (2), if you are using xboard, you will need to configure the |
||
57 | "Zippy" code into it, but WinBoard includes this code already. See |
||
58 | the file <a |
||
59 | href="http://www.tim-mann.org/xboard/zippy.README">zippy.README</a> |
||
60 | in the xboard or WinBoard distribution for more information. |
||
61 | |||
62 | </p> |
||
63 | |||
64 | <p> |
||
65 | These notes are unpolished, but I've attempted to make them complete |
||
66 | in this release. If you notice any errors, omissions, or misleading |
||
67 | statements, let me know. |
||
68 | </p> |
||
69 | |||
70 | <p> |
||
71 | I'd like to hear from everyone who is trying to interface their own |
||
72 | chess engine to xboard/WinBoard. Please join the mailing list for |
||
73 | authors of xboard/WinBoard compatible chess engines and post a message |
||
74 | about what you're doing. The list is now hosted by Yahoo Groups; you |
||
75 | can join at <a href="http://groups.yahoo.com/group/chess-engines" |
||
76 | >http://groups.yahoo.com/group/chess-engines</a>, or you can read the |
||
77 | list there without joining. The list is filtered to prevent spam. |
||
78 | </p> |
||
79 | <p> |
||
80 | <font color=green> |
||
81 | Note that the WinBoard 4.3.xx line was developed independently of the |
||
82 | original GNU project, by H.G.Muller. |
||
83 | If you have questions about WinBoard 4.3.xx, or want to report bugs in it, |
||
84 | report them in the appropriate section of the |
||
85 | <a href="http://www.open-aurec.com/wbforum/">WinBoard forum</a>. |
||
86 | </font> |
||
87 | </p> |
||
88 | |||
89 | <h2><a name="2">2. Connection</a></h2> |
||
90 | |||
91 | <p> |
||
92 | An xboard chess engine runs as a separate process from xboard itself, |
||
93 | connected to xboard through a pair of anonymous pipes. The engine |
||
94 | does not have to do anything special to set up these pipes. xboard |
||
95 | sets up the pipes itself and starts the engine with one pipe as its |
||
96 | standard input and the other as its standard output. The engine then |
||
97 | reads commands from its standard input and writes responses to its |
||
98 | standard output. This is, unfortunately, a little more complicated to |
||
99 | do right than it sounds; see <a href="#6">section 6</a> below. |
||
100 | </p> |
||
101 | |||
102 | <p> |
||
103 | And yes, contrary to some people's expectations, exactly the same |
||
104 | thing is true for WinBoard. Pipes and standard input/output are |
||
105 | implemented in Win32 and work fine. You don't have to use DDE, COM, |
||
106 | DLLs, BSOD, or any of the other infinite complexity that |
||
107 | Microsoft has created just to talk between two programs. A WinBoard |
||
108 | chess engine is a Win32 console program that simply reads from its |
||
109 | standard input and writes to its standard output. See sections |
||
110 | <a href="#5">5</a> and <a href="#6">6</a> below for additional details. |
||
111 | </p> |
||
112 | |||
113 | <h2><a name="3">3. Debugging</a></h2> |
||
114 | |||
115 | <p> |
||
116 | To diagnose problems in your engine's interaction with xboard, use the |
||
117 | -debug flag on xboard's command line to see the messages that are |
||
118 | being exchanged. In WinBoard, these messages are written to the file |
||
119 | WinBoard.debug instead of going to the screen. |
||
120 | </p> |
||
121 | |||
122 | <p> |
||
123 | You can turn debug mode on or off while WinBoard is running by |
||
124 | pressing Ctrl+Alt+F12. You can turn debug mode on or off while xboard |
||
125 | is running by binding DebugProc to a shortcut key (and pressing the |
||
126 | key!); see the instructions on shortcut keys in the xboard man page. |
||
127 | </p> |
||
128 | |||
129 | <p> |
||
130 | While your engine is running under xboard/WinBoard, you can send a |
||
131 | command directly to the engine by pressing Shift+1 (xboard) or Alt+1 |
||
132 | (WinBoard 4.0.3 and later). This brings up a dialog that you can type |
||
133 | your command into. Press Shift+2 (Alt+2) instead to send to the |
||
134 | second chess engine in Two Machines mode. On WinBoard 4.0.2 and earlier, |
||
135 | Ctrl+Alt is used in place of Alt; this had to be changed due to a conflict |
||
136 | with typing the @-sign on some European keyboards. |
||
137 | </p> |
||
138 | |||
139 | <h2><a name="4">4. How it got this way</a></h2> |
||
140 | |||
141 | <p> |
||
142 | Originally, xboard was just trying to talk to the existing |
||
143 | command-line interface of GNU Chess 3.1+ and 4, which was designed |
||
144 | for people to type commands to. So the communication protocol is very |
||
145 | ad-hoc. It might have been good to redesign it early on, but because |
||
146 | xboard and GNU Chess are separate programs, I didn't want to force |
||
147 | people to upgrade them together to versions that matched. I |
||
148 | particularly wanted to keep new versions of xboard working with old |
||
149 | versions of GNU Chess, to make it easier to compare the play of old |
||
150 | and new gnuchess versions. I didn't foresee the need for a clean |
||
151 | protocol to be used with other chess engines in the future. |
||
152 | </p> |
||
153 | |||
154 | <p> |
||
155 | Circumstances have changed over the years, and now there are many more |
||
156 | engines that work with xboard. I've had to make the protocol |
||
157 | description more precise, I've added some features that GNU Chess |
||
158 | does not support, and I've specified the standard semantics of a few |
||
159 | features to be slightly different from what GNU Chess 4 does. |
||
160 | </p> |
||
161 | |||
162 | <p> |
||
163 | <font color=red> |
||
164 | This release of the protocol specification is the first to carry a |
||
165 | version number of its own -- version 2. Previous releases simply |
||
166 | carried a last-modified date and were loosely tied to specific |
||
167 | releases of xboard and WinBoard. The version number "1" applies |
||
168 | generally to all those older versions of the protocol. |
||
169 | </font> |
||
170 | |||
171 | <font color=red> |
||
172 | <p>Protocol version 2 remains compatible with older engines but has |
||
173 | several new capabilities. In particular, it adds the |
||
174 | "feature" command, a new mechanism for making backward-compatible |
||
175 | changes and extensions to the protocol. Engines that do not support a |
||
176 | particular new feature do not have to use it; new features are not |
||
177 | enabled unless the engine specifically requests them using the feature |
||
178 | command. If an engine does not send the feature command at all, the |
||
179 | protocol behavior is nearly identical to version 1. Several new |
||
180 | features can be selected by the feature command in version 2, |
||
181 | including the "ping" command (recommended for all engines), the |
||
182 | "setboard" command, and many optional parameters. Additional features |
||
183 | will probably be added in future versions. |
||
184 | </p> |
||
185 | |||
186 | <p> |
||
187 | <font color=green> |
||
188 | If it is necessary to have a separate name, |
||
189 | it would be best to refer to the protocol including the green additions as version 2f. |
||
190 | I really don't think it is a different protocol from version 2, though. |
||
191 | I just tried to clarify some ambiguities in the original definition, |
||
192 | now that the WinBoard 4.3.xx line has implemented them in a specific way. |
||
193 | The hand-shaking protocol for features as defined in protocol 2 perfectly |
||
194 | allows addition of an occasional new features without any need for stepping up the protocol version number, |
||
195 | and I think refraining from the latter would enormously lower the barrier for actual |
||
196 | implementation of these features in engines. |
||
197 | <br> |
||
198 | The two really new things are the engine debug comments, and the "nps" command. |
||
199 | The former merely tries to regulate an extremely common existing pactice |
||
200 | of having engines dump debug messages on WinBoard in an unprotected way, |
||
201 | as usually you get away with that. |
||
202 | </font> |
||
203 | |||
204 | </font> |
||
205 | |||
206 | <h2><a name="5">5. WinBoard requires Win32 engines</a></h2> |
||
207 | |||
208 | <p> |
||
209 | Due to some Microsoft brain damage that I don't understand, WinBoard |
||
210 | does not work with chess engines that were compiled to use a DOS |
||
211 | extender for 32-bit addressing. (Probably not with 16-bit DOS or |
||
212 | Windows programs either.) WinBoard works only with engines that are |
||
213 | compiled for the Win32 API. You can get a free compiler that targets |
||
214 | the Win32 API from <a href="http://sources.redhat.com/cygwin/" |
||
215 | >http://sources.redhat.com/cygwin/</a>. I think DJGPP 2.x should also |
||
216 | work if you use the RSXNTDJ extension, but I haven't tried it. Of |
||
217 | course, Microsoft Visual C++ will work. Most likely the other |
||
218 | commercial products that support Win32 will work too (Borland, etc.), |
||
219 | but I have not tried them. Delphi has been successfully used to write |
||
220 | engines for WinBoard; if you want to do this, Tony Werten has donated |
||
221 | some <a href="http://www.tim-mann.org/winboard/delphi.txt" >sample |
||
222 | code</a> that should help you get started. |
||
223 | </p> |
||
224 | |||
225 | <h2><a name="6">6. Hints on input/output</a></h2> |
||
226 | |||
227 | <p> |
||
228 | Beware of using buffered I/O in your chess engine. The C stdio |
||
229 | library, C++ streams, and the I/O packages in most other languages use |
||
230 | buffering both on input and output. That means two things. First, |
||
231 | when your engine tries to write some characters to xboard, the library |
||
232 | stashes them in an internal buffer and does not actually write them to |
||
233 | the pipe connected to xboard until either the buffer fills up or you |
||
234 | call a special library routine asking for it to be flushed. (In C |
||
235 | stdio, this routine is named <tt>fflush</tt>.) Second, when your engine tries |
||
236 | to read some characters from xboard, the library does not read just |
||
237 | the characters you asked for -- it reads all the characters that are |
||
238 | currently available (up to some limit) and stashes any characters you |
||
239 | are not yet ready for in an internal buffer. The next time you ask to |
||
240 | read, you get the characters from the buffer (if any) before the |
||
241 | library tries to read more data from the actual pipe. |
||
242 | </p> |
||
243 | |||
244 | <p> |
||
245 | Why does this cause problems? First, on the output side, remember |
||
246 | that your engine produces output in small quantities (say, a few |
||
247 | characters for a move, or a line or two giving the current analysis), |
||
248 | and that data always needs to be delivered to xboard/WinBoard for |
||
249 | display immediately. If you use buffered output, the data you print |
||
250 | will sit in a buffer in your own address space instead of being |
||
251 | delivered. |
||
252 | </p> |
||
253 | |||
254 | <p> |
||
255 | You can usually fix the output buffering problem by asking for the |
||
256 | buffering to be turned off. In C stdio, you do this by calling |
||
257 | <tt>setbuf(stdout, NULL)</tt>. A more laborious and error-prone |
||
258 | method is to carefully call <tt>fflush(stdout)</tt> after every line |
||
259 | you output; I don't recommend this. In C++, you can try |
||
260 | <tt>cout.setf(ios::unitbuf)</tt>, which is documented in current |
||
261 | editions of "The C++ Programming Language," but not older ones. |
||
262 | Another C++ method that might work is |
||
263 | <tt>cout.rdbuf()->setbuf(NULL, 0)</tt>. Alternatively, you can |
||
264 | carefully call <tt>cout.flush()</tt> after every line you output; |
||
265 | again, I don't recommend this. |
||
266 | </p> |
||
267 | |||
268 | <p> |
||
269 | Another way to fix the problem is to use unbuffered operating system |
||
270 | calls to write directly to the file descriptor for standard output. |
||
271 | On Unix, this means <tt>write(1, ...)</tt> -- see the man page for write(2). |
||
272 | On Win32, you can use either the Unix-like <tt>_write(1, ...)</tt> or Win32 |
||
273 | native routines like <tt>WriteFile</tt>. |
||
274 | </p> |
||
275 | |||
276 | <p> |
||
277 | Second, on the input side, you are likely to want to poll during your |
||
278 | search and stop it if new input has come in. If you implement |
||
279 | pondering, you'll need this so that pondering stops when the user |
||
280 | makes a move. You should also poll during normal thinking on your |
||
281 | move, so that you can implement the "?" (move now) command, and so |
||
282 | that you can respond promptly to a "result", "force", or "quit" |
||
283 | command if xboard wants to end the game or terminate your engine. |
||
284 | Buffered input makes polling more complicated -- when you poll, you |
||
285 | must stop your search if there are <em>either</em> characters in the buffer |
||
286 | <em>or</em> characters available from the underlying file descriptor. |
||
287 | </p> |
||
288 | |||
289 | <p> |
||
290 | The most direct way to fix this problem is to use unbuffered operating |
||
291 | system calls to read (and poll) the underlying file descriptor |
||
292 | directly. On Unix, use <tt>read(0, ...)</tt> to read from standard input, and |
||
293 | use <tt>select()</tt> to poll it. See the man pages read(2) and select(2). |
||
294 | (Don't follow the example of GNU Chess 4 and use the FIONREAD ioctl to |
||
295 | poll for input. It is not very portable; that is, it does not exist |
||
296 | on all versions of Unix, and is broken on some that do have it.) On |
||
297 | Win32, you can use either the Unix-like <tt>_read(0, ...)</tt> or the native |
||
298 | Win32 <tt>ReadFile()</tt> to read. Unfortunately, under Win32, the function to |
||
299 | use for polling is different depending on whether the input device is |
||
300 | a pipe, a console, or something else. (More Microsoft brain damage |
||
301 | here -- did they never hear of device independence?) For pipes, you |
||
302 | can use <tt>PeekNamedPipe</tt> to poll (even when the pipe is unnamed). |
||
303 | For consoles, |
||
304 | you can use <tt>GetNumberOfConsoleInputEvents</tt>. For sockets only, you can |
||
305 | use <tt>select()</tt>. It might be possible to use |
||
306 | <tt>WaitForSingleObject</tt> more |
||
307 | generally, but I have not tried it. Some code to do these things can |
||
308 | be found in Crafty's utility.c, but I don't guarantee that it's all |
||
309 | correct or optimal. |
||
310 | </p> |
||
311 | |||
312 | <p> |
||
313 | A second way to fix the problem might be to ask your I/O library not |
||
314 | to buffer on input. It should then be safe to poll the underlying |
||
315 | file descriptor as described above. With C, you can try calling |
||
316 | <tt>setbuf(stdin, NULL)</tt>. However, I have never tried this. Also, there |
||
317 | could be problems if you use <tt>scanf()</tt>, at least with certain patterns, |
||
318 | because <tt>scanf()</tt> sometimes needs to read one extra character and "push |
||
319 | it back" into the buffer; hence, there is a one-character pushback |
||
320 | buffer even if you asked for stdio to be unbuffered. With C++, you |
||
321 | can try <tt>cin.rdbuf()->setbuf(NULL, 0)</tt>, but again, I have never tried |
||
322 | this. |
||
323 | </p> |
||
324 | |||
325 | <p> |
||
326 | A third way to fix the problem is to check whether there are |
||
327 | characters in the buffer whenever you poll. C I/O libraries generally |
||
328 | do not provide any portable way to do this. Under C++, you can use |
||
329 | <tt>cin.rdbuf()->in_avail()</tt>. This method has been reported to |
||
330 | work with |
||
331 | EXchess. Remember that if there are no characters in the buffer, you |
||
332 | still have to poll the underlying file descriptor too, using the |
||
333 | method described above. |
||
334 | </p> |
||
335 | |||
336 | <p> |
||
337 | A fourth way to fix the problem is to use a separate thread to read |
||
338 | from stdin. This way works well if you are familiar with thread |
||
339 | programming. This thread can be blocked waiting for input to come in |
||
340 | at all times, while the main thread of your engine does its thinking. |
||
341 | When input arrives, you have the thread put the input into a buffer |
||
342 | and set a flag in a global variable. Your search routine then |
||
343 | periodically tests the global variable to see if there is input to |
||
344 | process, and stops if there is. WinBoard and my Win32 ports of ICC |
||
345 | timestamp and FICS timeseal use threads to handle multiple input |
||
346 | sources. |
||
347 | </p> |
||
348 | |||
349 | <h2><a name="7">7. Signals</a></h2> |
||
350 | |||
351 | <p>Engines that run on Unix need to be concerned with two Unix |
||
352 | signals: <tt>SIGTERM</tt> and <tt>SIGINT</tt>. This applies both to |
||
353 | engines that run under xboard and (the unusual case of) engines that |
||
354 | WinBoard remotely runs on a Unix host using the -firstHost or |
||
355 | -secondHost feature. It does not apply to engines that run on |
||
356 | Windows, because Windows does not have Unix-style signals. |
||
357 | <font color=red> |
||
358 | Beginning with version 2, you can now turn off the use of |
||
359 | either or both |
||
360 | signals. See the "feature" command in <a href="#6">section 9</a> below. |
||
361 | </font> |
||
362 | </p> |
||
363 | |||
364 | <p>First, when an engine is sent the "quit" command, it is also given |
||
365 | a <tt>SIGTERM</tt> signal shortly afterward to make sure it goes away. |
||
366 | If your engine reliably responds to "quit", and the signal causes |
||
367 | problems for you, you should either ignore it by calling |
||
368 | <tt>signal(SIGTERM, SIG_IGN)</tt> at the start of your program, |
||
369 | or disable it with the "feature" command.</p> |
||
370 | |||
371 | <p>Second, xboard will send an interrupt signal (<tt>SIGINT</tt>) at |
||
372 | certain times when it believes the engine may not be listening to user |
||
373 | input (thinking or pondering). WinBoard currently does this only when |
||
374 | the engine is running remotely using the -firstHost or -secondHost |
||
375 | feature, not when it is running locally. You probably need to know |
||
376 | only enough about this grungy feature to keep it from getting in your |
||
377 | way. |
||
378 | </p> |
||
379 | |||
380 | <p> |
||
381 | The <tt>SIGINT</tt>s are basically tailored to the needs of GNU Chess 4 |
||
382 | on systems where its input polling code is broken or disabled. |
||
383 | Because they work in a rather peculiar way, it is recommended that you |
||
384 | either ignore <tt>SIGINT</tt> by having your engine call |
||
385 | <tt>signal(SIGINT, SIG_IGN)</tt>, or disable it with the "feature" |
||
386 | command.</p> |
||
387 | |||
388 | <p> |
||
389 | Here are details for the curious. If xboard needs to send a command |
||
390 | when it is the chess engine's move (such as before the "?" command), |
||
391 | it sends a <tt>SIGINT</tt> first. If xboard needs to send commands when it is |
||
392 | not the chess engine's move, but the chess engine may be pondering |
||
393 | (thinking on its opponent's time) or analyzing (analysis or analyze |
||
394 | file mode), xboard sends a <tt>SIGINT</tt> before the first such command only. |
||
395 | Another <tt>SIGINT</tt> is not sent until another move is made, even if xboard |
||
396 | issues more commands. This behavior is necessary for GNU Chess 4. The |
||
397 | first <tt>SIGINT</tt> stops it from pondering until the next move, but on some |
||
398 | systems, GNU Chess 4 will die if it receives a <tt>SIGINT</tt> when not |
||
399 | actually thinking or pondering. |
||
400 | </p> |
||
401 | |||
402 | <p> |
||
403 | There are two reasons why WinBoard does not send the Win32 equivalent |
||
404 | of <tt>SIGINT</tt> (which is called <tt>CTRL_C_EVENT</tt>) to local |
||
405 | engines. First, the Win32 GNU Chess 4 port does not need it. Second, I |
||
406 | could not find a way to get it to work. Win32 seems to be designed |
||
407 | under the assumption that only console applications, not windowed |
||
408 | applications, would ever want to send a <tt>CTRL_C_EVENT</tt>. |
||
409 | </p> |
||
410 | |||
411 | <h2><a name="8">8. Commands from xboard to the engine</a></h2> |
||
412 | |||
413 | <p> |
||
414 | All commands from xboard to the engine end with a newline (\n), even |
||
415 | where that is not explicitly stated. All your output to xboard must |
||
416 | be in complete lines; any form of prompt or partial line will cause |
||
417 | problems. |
||
418 | </p> |
||
419 | |||
420 | <p> |
||
421 | At the beginning of each game, xboard sends an initialization string. |
||
422 | This is currently "new\nrandom\n" unless the user changes it with the |
||
423 | initString or secondInitString option. |
||
424 | </p> |
||
425 | |||
426 | <p> |
||
427 | xboard normally reuses the same chess engine process for multiple |
||
428 | games. At the end of a game, xboard will send the "force" command |
||
429 | (see below) to make sure your engine stops thinking about the current |
||
430 | position. It will later send the initString again to start a new |
||
431 | game. If your engine can't play multiple games, you can disable reuse |
||
432 | <font color=red> |
||
433 | either with the "feature" command (beginning in protocol version |
||
434 | 2; see below) or |
||
435 | </font> |
||
436 | with xboard's -xreuse (or -xreuse2) command line |
||
437 | option. xboard will then ask the process to quit after each game and |
||
438 | start a new process for the next game. |
||
439 | </p> |
||
440 | |||
441 | <dl> |
||
442 | <dt><strong>xboard</strong> |
||
443 | <dd>This command will be sent once immediately after your engine |
||
444 | process is started. You can use it to put your engine into "xboard |
||
445 | mode" if that is needed. If your engine prints a prompt to ask for |
||
446 | user input, you must turn off the prompt and output a newline when the |
||
447 | "xboard" command comes in. |
||
448 | <p> |
||
449 | |||
450 | <dt><font color=red><strong>protover N</strong></font> |
||
451 | <dd><font color=red> |
||
452 | Beginning in protocol version 2 (in which N=2), this command will |
||
453 | be sent immediately after the "xboard" command. If you receive some |
||
454 | other command immediately after "xboard" (such as "new"), you can |
||
455 | assume that protocol version 1 is in use. The "protover" command is |
||
456 | the only new command that xboard always sends in version 2. All other |
||
457 | new commands to the engine are sent only if the engine first enables |
||
458 | them with the "feature" command. Protocol versions will always be |
||
459 | simple integers so that they can easily be compared. |
||
460 | |||
461 | <p>Your engine should reply to the protover command by sending the |
||
462 | "feature" command (see below) with the list of non-default feature |
||
463 | settings that you require, if any. |
||
464 | |||
465 | <p>Your engine should never refuse to run due to receiving a higher |
||
466 | protocol version number than it is expecting! New protocol versions |
||
467 | will always be compatible with older ones by default; the larger |
||
468 | version number is simply a hint that additional "feature" command |
||
469 | options added in later protocol versions may be accepted. |
||
470 | </font> |
||
471 | <p> |
||
472 | |||
473 | <dt><font color=red><strong>accepted</strong></font> |
||
474 | <dt><font color=red><strong>rejected</strong></font> |
||
475 | <dd><font color=red> |
||
476 | These commands may be sent to your engine in reply to the "feature" |
||
477 | command; see its documentation below. |
||
478 | </font> |
||
479 | <p> |
||
480 | |||
481 | <dt><strong>new</strong> |
||
482 | <dd>Reset the board to the standard chess starting position. Set |
||
483 | White on move. Leave force mode and set the engine to play Black. |
||
484 | Associate the engine's clock with Black and the opponent's clock with |
||
485 | White. Reset clocks and time controls to the start of a new game. |
||
486 | Use wall clock for time measurement. |
||
487 | Stop clocks. Do not ponder on this move, even if pondering is on. |
||
488 | Remove any search depth limit previously set by the sd command. |
||
489 | <p> |
||
490 | |||
491 | <dt><strong>variant VARNAME</strong> |
||
492 | <dd>If the game is not standard chess, but a variant, this command is |
||
493 | sent after "new" and before the first move or "edit" command. Currently |
||
494 | defined variant names are: |
||
495 | |||
496 | <table> |
||
497 | <tr align="left"><th>wildcastle<td>Shuffle chess where king can castle from d file |
||
498 | <tr align="left"><th>nocastle<td>Shuffle chess with no castling at all |
||
499 | <tr align="left"><th>fischerandom<td>Fischer Random |
||
500 | <tr align="left"><th>bughouse<td>Bughouse, ICC/FICS rules |
||
501 | <tr align="left"><th>crazyhouse<td>Crazyhouse, ICC/FICS rules |
||
502 | <tr align="left"><th>losers<td>Win by losing all pieces or getting mated (ICC) |
||
503 | <tr align="left"><th>suicide<td>Win by losing all pieces including king, |
||
504 | or by having fewer pieces when one player has no legal moves (FICS) |
||
505 | <tr align="left"><th><font color=red>giveaway</font> |
||
506 | <td><font color=red>Win by losing all pieces including king, |
||
507 | or by having no legal moves (ICC)</font> |
||
508 | <tr align="left"><th>twokings<td>Weird ICC wild 9 |
||
509 | <tr align="left"><th>kriegspiel<td>Kriegspiel (engines not supported) |
||
510 | <tr align="left"><th>atomic<td>Atomic |
||
511 | <tr align="left"><th>3check<td>Win by giving check 3 times |
||
512 | <tr align="left"><th><font color=green>xiangqi</font> |
||
513 | <td><font color=green>Chinese Chess (9x10 board)</font> |
||
514 | <tr align="left"><th><font color=green>shogi</font> |
||
515 | <td><font color=green>Japanese Chess (9x9 bord)</font> |
||
516 | <tr align="left"><th><font color=green>capablanca</font> |
||
517 | <td><font color=green>Capablanca Chess (10x8 board, with Archbishop and Chancellor)</font> |
||
518 | <tr align="left"><th><font color=green>gothic</font> |
||
519 | <td><font color=green>Gothic Chess (10x8 board, same with better opening setup)</font> |
||
520 | <tr align="left"><th><font color=green>falcon</font> |
||
521 | <td><font color=green>Falcon Chess (10x8 board, with two Falcon pieces)</font> |
||
522 | <tr align="left"><th><font color=green>shatranj</font> |
||
523 | <td><font color=green>ancient Arabic Chess, with Elephants and General in stead of B and Q</font> |
||
524 | <tr align="left"><th><font color=green>courier</font> |
||
525 | <td><font color=green>Courier Chess (12x8 board, a medieval precursor of modern Chess</font> |
||
526 | <tr align="left"><th><font color=green>knightmate</font> |
||
527 | <td><font color=green>King moves as Knight and vice versa</font> |
||
528 | <tr align="left"><th><font color=green>berolina</font><td> |
||
529 | <font color=green>Pawns capture straight ahead, and move diagonally</font> |
||
530 | <tr align="left"><th><font color=green>janus</font><td> |
||
531 | <font color=green>Janus Chess (10x8, with two Archbishops)</font> |
||
532 | <tr align="left"><th><font color=green>caparandom</font> |
||
533 | <td><font color=green>shuffle variant like FRC (10x8 board)</font> |
||
534 | <tr align="left"><th><font color=green>cylinder</font> |
||
535 | <td><font color=green>Pieces wrap around between side edges, like board is a cylinder</font> |
||
536 | <tr align="left"><th><font color=blue>super</font> |
||
537 | <td><font color=blue>Superchess: a shuffle variant with 4 fairy pieces on 8x8 board</font> |
||
538 | <tr align="left"><th><font color=blue>great</font> |
||
539 | <td><font color=blue>Great Shatranj: sliders are replaced by corresponding short-range pieces on a 10x8 board</font> |
||
540 | <tr align="left"><th>unknown<td>Unknown variant (not supported) |
||
541 | </table> |
||
542 | <p> |
||
543 | |||
544 | <dt><strong>quit</strong> |
||
545 | <dd>The chess engine should immediately exit. This command is used |
||
546 | when xboard is itself exiting, and also between games if the -xreuse |
||
547 | command line option is given (or -xreuse2 for the second engine). |
||
548 | See also <a href="#7">Signals</a> above. |
||
549 | <p> |
||
550 | |||
551 | <dt><strong>random</strong> |
||
552 | <dd>This command is specific to GNU Chess 4. You can either ignore it |
||
553 | completely (that is, treat it as a no-op) or implement it as GNU Chess |
||
554 | does. The command toggles "random" mode (that is, it sets random = |
||
555 | !random). In random mode, the engine adds a small random value to its |
||
556 | evaluation function to vary its play. The "new" command sets random |
||
557 | mode off. |
||
558 | <p> |
||
559 | |||
560 | <dt><strong>force</strong> |
||
561 | <dd>Set the engine to play neither color ("force mode"). Stop clocks. |
||
562 | The engine should check that moves received in force mode are legal |
||
563 | and made in the proper turn, but should not think, ponder, or make |
||
564 | moves of its own. |
||
565 | <p> |
||
566 | |||
567 | <dt><strong>go</strong> |
||
568 | <dd>Leave force mode and set the engine to play the color that is on |
||
569 | move. Associate the engine's clock with the color that is on move, |
||
570 | the opponent's clock with the color that is not on move. Start the engine's |
||
571 | clock. Start thinking and eventually make a move. |
||
572 | <p> |
||
573 | |||
574 | <dt><font color=red><strong>playother</strong></font> |
||
575 | <dd> |
||
576 | <font color=red> |
||
577 | (This command is new in protocol version 2. It is not |
||
578 | sent unless you enable it with the feature command.) |
||
579 | Leave force mode and set the engine to play the color that is <i>not</i> on |
||
580 | move. Associate the opponent's clock with the color that is on move, |
||
581 | the engine's clock with the color that is not on move. Start the opponent's |
||
582 | clock. If pondering is enabled, the engine should begin pondering. |
||
583 | If the engine later receives a move, it should start thinking and eventually |
||
584 | reply. |
||
585 | </font> |
||
586 | <p> |
||
587 | |||
588 | <dt><strong>white</strong> |
||
589 | <dd> |
||
590 | <font color=red> |
||
591 | (This command is obsolete as of protocol version 2, but is still |
||
592 | sent in some situations to accommodate older engines unless you disable it |
||
593 | with the feature command.) |
||
594 | </font> |
||
595 | Set White on move. Set the engine to play Black. Stop clocks. |
||
596 | <p> |
||
597 | |||
598 | <dt><strong>black</strong> |
||
599 | <dd> |
||
600 | <font color=red> |
||
601 | (This command is obsolete as of protocol version 2, but is still |
||
602 | sent in some situations to accommodate older engines unless you disable it |
||
603 | with the feature command.) |
||
604 | </font> |
||
605 | Set Black on move. Set the engine to play White. Stop clocks. |
||
606 | <p> |
||
607 | |||
608 | <dt><strong>level MPS BASE INC</strong> |
||
609 | <dd>Set time controls. See the <a href="#11">Time Control</a> section below. |
||
610 | <p> |
||
611 | |||
612 | <dt><strong>st TIME</strong> |
||
613 | <dd>Set time controls. See the <a href="#11">Time Control</a> section |
||
614 | below. |
||
615 | <p> |
||
616 | |||
617 | <dt><strong>sd DEPTH</strong> |
||
618 | <dd>The engine should limit its thinking to DEPTH ply. |
||
619 | <font color=green>The commands "level" or "st" and "sd" can be used together in an orthogonal way. |
||
620 | If both are issued, the engine should observe both limitations:</font> |
||
621 | In the protocol, the "sd" command isn't a time control. It doesn't |
||
622 | say that your engine has unlimited time but must search to exactly the |
||
623 | given depth. It says that you should pay attention to the time |
||
624 | control as normal, but cut off the search at the specified depth even |
||
625 | if you have time to search deeper. If you don't have time to search |
||
626 | to the specified depth, given your normal time management algorithm, |
||
627 | then you will want to stop sooner than the given depth. |
||
628 | <p> |
||
629 | The "new" command should set the search depth back to unlimited. This |
||
630 | is already stated in the spec. The "level" command should not affect |
||
631 | the search depth. As it happens, xboard/WinBoard currently always |
||
632 | sends sd (if needed) right after level, but that isn't part of the |
||
633 | spec. |
||
634 | <p> |
||
635 | |||
636 | <dt><font color=green><strong>nps NODE_RATE</strong></font> |
||
637 | <dd><font color=green>The engine should not use wall-clock time to make its timing decisions, |
||
638 | but an own internal time measure based on the number of nodes it has searched |
||
639 | (and will report as "thinking output", see <a href="#10">section 10</a>), |
||
640 | converted to seconds through dividing by the given NODE_RATE. |
||
641 | Example: after receiving the commands "st 8" and "nps 10000", |
||
642 | the engine should never use more that 80,000 nodes in the search for any move. |
||
643 | In this mode, the engine should report user CPU time used (in its thinking output), |
||
644 | rather than wall-clock time. |
||
645 | This even holds if NODE_RATE is given as 0, |
||
646 | but in that case it should also use the user CPU time for its timing decisions. |
||
647 | The effect of an "nps" command should persist until the next "new" command. |
||
648 | </font> |
||
649 | <p> |
||
650 | |||
651 | <dt><strong>time N</strong> |
||
652 | <dd>Set a clock that always belongs to the engine. N is a number in |
||
653 | centiseconds (units of 1/100 second). Even if the engine changes to |
||
654 | playing the opposite color, this clock remains with the engine. |
||
655 | <p> |
||
656 | |||
657 | <dt><strong>otim N</strong> |
||
658 | |||
659 | <dd>Set a clock that always belongs to the opponent. N is a number in |
||
660 | centiseconds (units of 1/100 second). Even if the opponent changes to |
||
661 | playing the opposite color, this clock remains with the opponent. |
||
662 | <p> |
||
663 | If needed for purposes of board display in force mode (where the |
||
664 | engine is not participating in the game) the time clock should be |
||
665 | associated with the last color that the engine was set to play, the |
||
666 | otim clock with the opposite color. |
||
667 | </p> |
||
668 | <p> |
||
669 | <font color=green>This business of "clocks remaining with the engine" is apparently so ambiguous |
||
670 | that many engines implement it wrong. |
||
671 | The clocks in fact always remain with the color. |
||
672 | Which clock reading is relayed with "time", and which by "otim", is determined by which side the engine plays. |
||
673 | Note that the way the clocks operate and receive extra time (in accordance with the selected time control) |
||
674 | is not affected in any way by which moves are made by the engine, which by the opponent, and which were forced. |
||
675 | </font> |
||
676 | </p> |
||
677 | <p> |
||
678 | <font color=red> |
||
679 | Beginning in protocol version 2, if you can't handle the time and |
||
680 | otim commands, you can use the "feature" command to disable them; see |
||
681 | below. |
||
682 | </font> |
||
683 | The following techniques from older protocol versions also |
||
684 | work: You can ignore the time and otim commands (that is, treat them |
||
685 | as no-ops), or send back "Error (unknown command): time" the first |
||
686 | time you see "time". |
||
687 | </p> |
||
688 | |||
689 | <dt><strong>MOVE</strong> |
||
690 | <dd>See below for the syntax of moves. If the move is illegal, print |
||
691 | an error message; see the section "<a href="#9">Commands from the engine to |
||
692 | xboard</a>". If the move is legal and in turn, make it. If not in force |
||
693 | mode, stop the opponent's clock, start the engine's clock, start |
||
694 | thinking, and eventually make a move. |
||
695 | <p> |
||
696 | When xboard sends your engine a move, it normally sends coordinate |
||
697 | algebraic notation. Examples: |
||
698 | <p> |
||
699 | <table> |
||
700 | <tr align="left"><td>Normal moves:<td>e2e4 |
||
701 | <tr align="left"><td>Pawn promotion:<td>e7e8q |
||
702 | <tr align="left"><td>Castling:<td>e1g1, e1c1, e8g8, e8c8 |
||
703 | <tr align="left"><td>Bughouse/crazyhouse drop:<td>P@h3 |
||
704 | <tr align="left"><td>ICS Wild 0/1 castling:<td>d1f1, d1b1, d8f8, d8b8 |
||
705 | <tr align="left"><td>FischerRandom castling:<td>O-O, O-O-O (oh, not zero) |
||
706 | </table> |
||
707 | |||
708 | <p> |
||
709 | <font color=green> |
||
710 | Note that on boards with more than 9 ranks, counting of the ranks starts at 0. |
||
711 | </font> |
||
712 | </p> |
||
713 | <p> |
||
714 | <font color=red> |
||
715 | Beginning in protocol version 2, you can use the feature command |
||
716 | to select SAN (standard algebraic notation) instead; for example, e4, |
||
717 | Nf3, exd5, Bxf7+, Qxf7#, e8=Q, O-O, or P@h3. Note that the last form, |
||
718 | P@h3, is a extension to the PGN standard's definition of SAN, which does |
||
719 | not support bughouse or crazyhouse. |
||
720 | </font> |
||
721 | </p> |
||
722 | |||
723 | <p> |
||
724 | xboard doesn't reliably detect illegal moves, because it does not keep |
||
725 | track of castling unavailability due to king or rook moves, or en |
||
726 | passant availability. If xboard sends an illegal move, send back an |
||
727 | error message so that xboard can retract it and inform the user; see |
||
728 | the section "<a href="#9">Commands from the engine to xboard</a>". |
||
729 | </p> |
||
730 | |||
731 | <dt><font color=red><strong>usermove MOVE</strong></font> |
||
732 | <dd><font color=red> |
||
733 | By default, moves are sent to the engine without a command name; |
||
734 | the notation is just sent as a line by itself. |
||
735 | Beginning in protocol version 2, you can use the feature command |
||
736 | to cause the command name "usermove" to be sent before the move. |
||
737 | Example: "usermove e2e4". |
||
738 | </font> |
||
739 | </p> |
||
740 | |||
741 | <dt><strong>?</strong> |
||
742 | <dd>Move now. If your engine is thinking, it should move immediately; |
||
743 | otherwise, the command should be ignored (treated as a no-op). It |
||
744 | is permissible for your engine to always ignore the ? command. The |
||
745 | only bad consequence is that xboard's Move Now menu command will do |
||
746 | nothing. |
||
747 | <p> |
||
748 | It is also permissible for your engine to move immediately if it gets |
||
749 | any command while thinking, as long as it processes the command right |
||
750 | after moving, but it's preferable if you don't do this. For example, |
||
751 | xboard may send post, nopost, easy, hard, force, quit, |
||
752 | <font color=red> |
||
753 | or other commands |
||
754 | </font> |
||
755 | while the engine is on move. |
||
756 | </p> |
||
757 | |||
758 | <dt><font color=red><strong>ping N</strong></font> |
||
759 | <dd> |
||
760 | <font color=red> |
||
761 | In this command, N is a decimal number. When you receive the command, |
||
762 | reply by sending the string <strong>pong N</strong>, where N is the |
||
763 | same number you received. Important: You must not reply to a "ping" |
||
764 | command until you have finished executing all commands that you |
||
765 | received before it. Pondering does not count; if you receive a ping |
||
766 | while pondering, you should reply immediately and continue pondering. |
||
767 | Because of the way xboard uses the ping command, if you implement the |
||
768 | other commands in this protocol, you should never see a "ping" command |
||
769 | when it is your move; however, if you do, you must not send the "pong" |
||
770 | reply to xboard until after you send your move. For example, xboard |
||
771 | may send "?" immediately followed by "ping". If you implement the "?" |
||
772 | command, you will have moved by the time you see the subsequent ping |
||
773 | command. Similarly, xboard may send a sequence like "force", "new", |
||
774 | "ping". You must not send the pong response until after you have |
||
775 | finished executing the "new" command and are ready for the new game to |
||
776 | start. |
||
777 | |||
778 | <p> |
||
779 | The ping command is new in protocol version 2 and will not be sent |
||
780 | unless you enable it with the "feature" command. Its purpose is to |
||
781 | allow several race conditions that could occur in previous versions of |
||
782 | the protocol to be fixed, so it is highly recommended that you |
||
783 | implement it. It is especially important in simple engines that do |
||
784 | not ponder and do not poll for input while thinking, but it is needed in all |
||
785 | engines. |
||
786 | </p> |
||
787 | </font> |
||
788 | |||
789 | <dt><strong>draw</strong> |
||
790 | <dd>The engine's opponent offers the engine a draw. To accept the |
||
791 | draw, send "offer draw". To decline, ignore the offer (that is, send |
||
792 | nothing). If you're playing on ICS, it's possible for the draw offer |
||
793 | to have been withdrawn by the time you accept it, so don't assume the |
||
794 | game is over because you accept a draw offer. Continue playing until |
||
795 | xboard tells you the game is over. See also "offer draw" below. |
||
796 | <p> |
||
797 | |||
798 | <dt><strong>result RESULT {COMMENT}</strong> |
||
799 | <dd>After the end of each game, xboard will send you a result command. |
||
800 | You can use this command to trigger learning. RESULT is either 1-0, |
||
801 | 0-1, 1/2-1/2, or *, indicating whether white won, black won, the game |
||
802 | was a draw, or the game was unfinished. The COMMENT string is purely |
||
803 | a human-readable comment; its content is unspecified and subject to |
||
804 | change. In ICS mode, it is passed through from ICS uninterpreted. |
||
805 | Example: <pre>result 1-0 {White mates}</pre> |
||
806 | <p> |
||
807 | Here are some notes on interpreting the "result" command. Some apply |
||
808 | only to playing on ICS ("Zippy" mode). |
||
809 | </p> |
||
810 | |||
811 | <p> |
||
812 | If you won but did not just play a mate, your opponent must have |
||
813 | resigned or forfeited. If you lost but were not just mated, you |
||
814 | probably forfeited on time, or perhaps the operator resigned manually. |
||
815 | If there was a draw for some nonobvious reason, perhaps your opponent |
||
816 | called your flag when he had insufficient mating material (or vice |
||
817 | versa), or perhaps the operator agreed to a draw manually. |
||
818 | </p> |
||
819 | |||
820 | <p> |
||
821 | You will get a result command even if you already know the game ended |
||
822 | -- for example, after you just checkmated your opponent. In fact, if |
||
823 | you send the "RESULT {COMMENT}" command (discussed below), you will |
||
824 | simply get the same thing fed back to you with "result" tacked in |
||
825 | front. You might not always get a "result *" command, however. In |
||
826 | particular, you won't get one in local chess engine mode when the user |
||
827 | stops playing by selecting Reset, Edit Game, Exit or the like. |
||
828 | </p> |
||
829 | |||
830 | <dt><font color=red><strong>setboard FEN</strong></font> |
||
831 | <dd><font color=red> |
||
832 | The setboard command is the new way to set up positions, beginning |
||
833 | in protocol version 2. It is not used unless it has been selected |
||
834 | with the feature command. Here FEN is a position in Forsythe-Edwards |
||
835 | Notation, as defined in the PGN standard.</font> |
||
836 | <font color=green>Note that this PGN standard referred to here |
||
837 | only applies to normal Chess; |
||
838 | Obviously in variants that cannot be described by a FEN for normal Chess, |
||
839 | e.g. because the board is not 8x8, other pieces then PNBRQK participate, |
||
840 | there are holdings that need to be specified, etc., |
||
841 | xboard will use a FEN format that is standard or suitable for that varant. |
||
842 | In particular, in FRC or CRC, WinBoard will use Shredder-FEN or X-FEN standard, |
||
843 | i.e. it can use the rook-file indicator letter to represent a castling right |
||
844 | (like HAha) whenever it wants, but if it uses KQkq, this will always refer |
||
845 | to the outermost rook on the given side.</font> |
||
846 | <font color=red> |
||
847 | |||
848 | <p><i>Illegal positions:</i> Note that either setboard or edit can |
||
849 | be used to send an illegal position to the engine. The user can |
||
850 | create any position with xboard's Edit Position command (even, say, |
||
851 | an empty board, or a board with 64 white kings and no black ones). |
||
852 | If your engine receives a position that it considers illegal, |
||
853 | I suggest that you send the response "tellusererror Illegal position", |
||
854 | and then respond to any attempted move with "Illegal move" until |
||
855 | the next new, edit, or setboard command.</p> |
||
856 | </font> |
||
857 | <p> |
||
858 | |||
859 | <dt><strong>edit</strong> |
||
860 | <dd> |
||
861 | <font color=red> |
||
862 | The edit command is the old way to set up positions. For compatibility |
||
863 | with old engines, it is still used by default, but new engines may prefer |
||
864 | to use the feature command (see below) to cause xboard to use setboard instead. |
||
865 | </font> |
||
866 | The edit command puts the chess engine into a special mode, where |
||
867 | it accepts the following subcommands: |
||
868 | <table> |
||
869 | <tr align="left"><th>c<td>change current piece color, initially white |
||
870 | <tr align="left"><th>Pa4 (for example)<td>place pawn of current color on a4 |
||
871 | <tr align="left"><th>xa4 (for example)<td>empty the square a4 (not used by xboard) |
||
872 | <tr align="left"><th>#<td>clear board |
||
873 | <tr align="left"><th>.<td>leave edit mode |
||
874 | </table> |
||
875 | <font color=red> |
||
876 | See the Idioms section below for additional subcommands used in |
||
877 | ChessBase's implementation of the protocol. |
||
878 | </font> |
||
879 | |||
880 | <p>The edit command does not change the side to move. To set up a |
||
881 | black-on-move position, xboard uses the following command sequence: |
||
882 | </p> |
||
883 | <pre> |
||
884 | new |
||
885 | force |
||
886 | a2a3 |
||
887 | edit |
||
888 | <edit commands> |
||
889 | . |
||
890 | </pre> |
||
891 | |||
892 | <p> |
||
893 | This sequence is used to avoid the "black" command, which is now |
||
894 | considered obsolete and which many engines never did implement as |
||
895 | specified in this document. |
||
896 | </p> |
||
897 | |||
898 | <p> |
||
899 | After an edit command is complete, if a king and a rook are on their |
||
900 | home squares, castling is assumed to be available to them. En passant |
||
901 | capture is assumed to be illegal on the current move regardless of the |
||
902 | positions of the pawns. The clock for the 50 move rule starts at |
||
903 | zero, and for purposes of the draw by repetition rule, no prior |
||
904 | positions are deemed to have occurred. |
||
905 | <font color=green> |
||
906 | In FRC or CRC, any rook and king put on the back rank should be considered to |
||
907 | have castling rights, even if it later becomes apparent that they cannot be both in the |
||
908 | initial position, because the position just set up is asymmetric. |
||
909 | It is upto WinBoard to find work-around in cases where this is not desired, |
||
910 | similar to the "black kludge" shown above, by setting up an earlier position, |
||
911 | and then do a move to destroy castling rights or create e.p. rights. |
||
912 | (Don't bet your life on it...) |
||
913 | </font> |
||
914 | </p> |
||
915 | |||
916 | <dt><strong>hint</strong> |
||
917 | <dd>If the user asks for a hint, xboard sends your engine the command |
||
918 | "hint". Your engine should respond with "Hint: xxx", where xxx is a |
||
919 | suggested move. If there is no move to suggest, you can ignore the |
||
920 | hint command (that is, treat it as a no-op). |
||
921 | <p> |
||
922 | |||
923 | <dt><strong>bk</strong> |
||
924 | <dd>If the user selects "Book" from the xboard menu, xboard will send |
||
925 | your engine the command "bk". You can send any text you like as the |
||
926 | response, as long as each line begins with a blank space or tab (\t) |
||
927 | character, and you send an empty line at the end. The text pops up in |
||
928 | a modal information dialog. |
||
929 | <p> |
||
930 | |||
931 | <dt><strong>undo</strong> |
||
932 | <dd>If the user asks to back up one move, xboard will send you the |
||
933 | "undo" command. xboard will not send this command without putting you |
||
934 | in "force" mode first, so you don't have to worry about what should |
||
935 | happen if the user asks to undo a move your engine made. (GNU Chess 4 |
||
936 | actually switches to playing the opposite color in this case.) |
||
937 | <p> |
||
938 | |||
939 | <dt><strong>remove</strong> |
||
940 | <dd>If the user asks to retract a move, xboard will send you the |
||
941 | "remove" command. It sends this command only when the user is on |
||
942 | move. Your engine should undo the last two moves (one for each |
||
943 | player) and continue playing the same color. |
||
944 | <p> |
||
945 | |||
946 | <dt><strong>hard</strong> |
||
947 | <dd>Turn on pondering (thinking on the opponent's time, also known as |
||
948 | "permanent brain"). xboard will not make any assumption about what |
||
949 | your default is for pondering or whether "new" affects this setting. |
||
950 | <p> |
||
951 | |||
952 | <dt><strong>easy</strong> |
||
953 | <dd>Turn off pondering. |
||
954 | <p> |
||
955 | |||
956 | <dt><strong>post</strong> |
||
957 | <dd>Turn on thinking/pondering output. |
||
958 | See <a href="#10">Thinking Output</a> section. |
||
959 | <p> |
||
960 | |||
961 | <dt><strong>nopost</strong> |
||
962 | <dd>Turn off thinking/pondering output. |
||
963 | <p> |
||
964 | |||
965 | <dt><strong>analyze</strong> |
||
966 | <dd>Enter analyze mode. See <a href="#12">Analyze Mode</a> section. |
||
967 | <p> |
||
968 | |||
969 | <dt><strong>name X</strong> <dd>This command informs the engine of its |
||
970 | opponent's name. When the engine is playing on a chess server, xboard |
||
971 | obtains the opponent's name from the server. |
||
972 | <font color=red> |
||
973 | When the engine is |
||
974 | playing locally against a human user, xboard obtains the user's login |
||
975 | name from the local operating system. When the engine is playing |
||
976 | locally against another engine, xboard uses either the other engine's |
||
977 | filename or the name that the other engine supplied in the myname |
||
978 | option to the feature command. By default, xboard uses the name |
||
979 | command only when the engine is playing on a chess server. Beginning |
||
980 | in protocol version 2, you can change this with the name option to the |
||
981 | feature command; see below. |
||
982 | </font> |
||
983 | <p> |
||
984 | |||
985 | <dt><strong>rating</strong> |
||
986 | <dd>In ICS mode, xboard obtains the ICS opponent's rating from the |
||
987 | "Creating:" message that appears before each game. (This message may |
||
988 | not appear on servers using outdated versions of the FICS code.) In |
||
989 | Zippy mode, it sends these ratings on to the chess engine using the |
||
990 | "rating" command. The chess engine's own rating comes first, and if |
||
991 | either opponent is not rated, his rating is given as 0. |
||
992 | <font color=red> |
||
993 | In the future this command may also be used in other modes, if ratings |
||
994 | are known. |
||
995 | </font> |
||
996 | Example: <pre>rating 2600 1500</pre> |
||
997 | <p> |
||
998 | |||
999 | <dt><font color=red><strong>ics HOSTNAME</strong></font> |
||
1000 | <dd><font color=red> |
||
1001 | If HOSTNAME is "-", the engine is playing against a local |
||
1002 | opponent; otherwise, the engine is playing on an Internet Chess Server |
||
1003 | (ICS) with the given hostname. This command is new in protocol |
||
1004 | version 2 and is not sent unless the engine has enabled it with |
||
1005 | the "feature" command. Example: "ics freechess.org" |
||
1006 | </font> |
||
1007 | <p> |
||
1008 | |||
1009 | <dt><strong>computer</strong> |
||
1010 | <dd>The opponent is also a computer chess engine. Some engines alter |
||
1011 | their playing style when they receive this command. |
||
1012 | <p> |
||
1013 | |||
1014 | <dt><font color=red><strong>pause</strong></font> |
||
1015 | <dt><font color=red><strong>resume</strong></font> |
||
1016 | <dd><font color=red>(These commands are new in protocol |
||
1017 | version 2 and will not be sent unless feature pause=1 is set. At |
||
1018 | this writing, xboard actually does not use the commands at all, but it |
||
1019 | or other interfaces may use them in the future.) |
||
1020 | The "pause" command puts the engine into a special state where it |
||
1021 | does not think, ponder, or otherwise consume significant CPU time. |
||
1022 | The current thinking or pondering (if any) is suspended and both |
||
1023 | player's clocks are stopped. The only command that the interface may |
||
1024 | send to the engine while it is in the paused state is "resume". The |
||
1025 | paused thinking or pondering (if any) resumes from exactly where it |
||
1026 | left off, and the clock of the player on move resumes running from |
||
1027 | where it stopped. |
||
1028 | </font> |
||
1029 | <p> |
||
1030 | |||
1031 | <dt><font color=blue><strong>memory N</strong></font> |
||
1032 | <dd><font color=blue> |
||
1033 | This command informs the engine on how much memory it is allowed to use maximally, in MegaBytes. |
||
1034 | On receipt of this command, the engine should adapt the size of its hash tables accordingly. |
||
1035 | This command does only fix the total memory use, |
||
1036 | the engine has to decide for itself |
||
1037 | (or be configured by the user by other means) |
||
1038 | how to divide up the available memory between the various tables it wants to use |
||
1039 | (e.g. main hash, pawn hash, tablebase cache, bitbases). |
||
1040 | This command will only be sent to engines that have requested it through the memory feature, |
||
1041 | and only at the start of a game, |
||
1042 | as the first of the commands to relay engine option settings just before each "new" command. |
||
1043 | </font> |
||
1044 | <p> |
||
1045 | |||
1046 | <dt><font color=blue><strong>cores N</strong></font> |
||
1047 | <dd><font color=blue> |
||
1048 | This command informs the engine on how many CPU cores it is allowed to use maximally. |
||
1049 | This could be interpreted as the number of search threads for SMP engines. |
||
1050 | (Threads that do not consume significant amounts of CPU time, like I/O threads, need not be included in the count.) |
||
1051 | This command will only be sent to engines that have requested it through the smp feature. |
||
1052 | The engine should be able to respond to the "cores" command any time during a game, |
||
1053 | but it is allowed to finish a search in progress before procesing the command. |
||
1054 | (Obeying the command should take priority over finishing a ponder search, though.) |
||
1055 | In any case it will be sent at the start of every game |
||
1056 | as the last command to relay engine option settings before the "new" command. |
||
1057 | </font> |
||
1058 | <p> |
||
1059 | |||
1060 | <dt><font color=blue><strong>egtpath TYPE PATH</strong></font> |
||
1061 | <dd><font color=blue> |
||
1062 | This command informs the engine in which directory (given by the PATH argument) |
||
1063 | it can find end-game tables of the specified TYPE. |
||
1064 | The TYPE argument can be any character string which does not contain spaces. |
||
1065 | Currently <strong>nalimov</strong> and <strong>scorpio</strong> are defined types, |
||
1066 | for Nalimov tablebases and Scorpio bitbases, respectively, |
||
1067 | but future developers of other formats are free to define their own format names. |
||
1068 | The GUI simply matches the TYPE names the engine says it supports |
||
1069 | with those that the user supplied when configuring xboard. |
||
1070 | For every match, it sends a separate "y" command. |
||
1071 | The PATH argument would normally (for Nalimov) be the pathname of the directory the EGT files are in, |
||
1072 | but could also be the name of a file, or in fact anything the particular EGT type requires. |
||
1073 | It is upto the developer of the EGT format to specify the syntax of this parameter. |
||
1074 | This command will only be sent to engines that have told the GUI they support EGTs of the given TYPE |
||
1075 | through the egt feature. |
||
1076 | It will be sent at the start of each game, before the "new" command. |
||
1077 | </font> |
||
1078 | <p> |
||
1079 | |||
1080 | <dt><font color=blue><strong>option NAME[=VALUE]</strong></font> |
||
1081 | <dd><font color=blue> |
||
1082 | This command changes the setting of the option NAME defined by the engine |
||
1083 | (through an earlier feature command) |
||
1084 | to the given VALUE. |
||
1085 | XBoard will in general have no idea what the option means, |
||
1086 | and will send the command only when a user changes the value of this option through a menu, |
||
1087 | or at startup of the engine |
||
1088 | (before the first 'cores' command or, if that is not sent, the first 'new' command) |
||
1089 | in reaction to command-line options. |
||
1090 | The NAME echoes back to the engine the string that was identified as an option NAME |
||
1091 | in the feature command defining the option. |
||
1092 | The VALUE is of the type (numeric or text or absent) that was implied by the option type |
||
1093 | specified in this feature command, |
||
1094 | i.e. with 'spin' and 'check' options VALUE will be a decimal integer (in the latter case 0 or 1), |
||
1095 | with 'combo' and 'string' options VALUE will be a text string, |
||
1096 | and with 'button' and 'save' options no VALUE will be sent at all. |
||
1097 | </font> |
||
1098 | </dl> |
||
1099 | |||
1100 | <h3>Bughouse commands:</h3> |
||
1101 | |||
1102 | <p> |
||
1103 | xboard now supports bughouse engines when in Zippy mode. See |
||
1104 | <a href="http://www.tim-mann.org/xboard/zippy.README" |
||
1105 | >zippy.README</a> for information on Zippy mode and how to turn on the |
||
1106 | bughouse support. The bughouse move format is given above. xboard |
||
1107 | sends the following additional commands to the engine when in bughouse |
||
1108 | mode. |
||
1109 | Commands to inform your engine of the partner's game state may |
||
1110 | be added in the future. |
||
1111 | </p> |
||
1112 | |||
1113 | <dl> |
||
1114 | <dt><strong>partner <player></strong> |
||
1115 | <dd><player> is now your partner for future games. Example: <pre>partner mann</pre> |
||
1116 | <p> |
||
1117 | |||
1118 | <dt><strong>partner</strong> |
||
1119 | <dd>Meaning: You no longer have a partner. |
||
1120 | <p> |
||
1121 | |||
1122 | <dt><strong>ptell <text></strong> |
||
1123 | <dd>Your partner told you <text>, either with a ptell or an ordinary tell. |
||
1124 | <p> |
||
1125 | |||
1126 | <dt><strong>holding [<white>] [<black>]</strong> |
||
1127 | <dd>White currently holds <white>; black currently holds <black>. |
||
1128 | Example: <pre>holding [PPPRQ] []</pre> |
||
1129 | |||
1130 | <dt><strong>holding [<white>] [<black>] <color><piece></strong> |
||
1131 | <dd>White currently holds <white>; black currently holds <black>, after |
||
1132 | <color> acquired <piece>. Example: <pre>holding [PPPRQ] [R] BR</pre> |
||
1133 | </dl> |
||
1134 | |||
1135 | <h2><a name="9">9. Commands from the engine to xboard</a></h2> |
||
1136 | |||
1137 | <p> |
||
1138 | <font color=red> |
||
1139 | In general, an engine should not send any output to xboard that is not |
||
1140 | described in this document. As the protocol is extended, newer |
||
1141 | versions of xboard may recognize additional strings as commands that |
||
1142 | were previously not assigned a meaning. |
||
1143 | </font> |
||
1144 | </p> |
||
1145 | |||
1146 | <dl> |
||
1147 | <dt><font color=red> |
||
1148 | <strong>feature FEATURE1=VALUE1 FEATURE2=VALUE2 ...</strong> |
||
1149 | </font> |
||
1150 | |||
1151 | <dd><font color=red> |
||
1152 | Beginning with version 2, the protocol includes the "feature" |
||
1153 | command, which lets your engine control certain optional protocol |
||
1154 | features. Feature settings are written as FEATURE=VALUE, where |
||
1155 | FEATURE is a name from the list below and VALUE is the value to be |
||
1156 | assigned. Features can take string, integer, or boolean values; the |
||
1157 | type of value is listed for each feature. String values are written |
||
1158 | in double quotes (for example, <tt>feature myname="Miracle Chess |
||
1159 | 0.9"</tt>), integers are written in decimal, and boolean values are |
||
1160 | written as 0 for false, 1 for true. Any number of features can be set |
||
1161 | in one feature command, or multiple feature commands can be given. |
||
1162 | |||
1163 | <p> |
||
1164 | Your engine should send one or more feature commands immediately after |
||
1165 | receiving the "protover" command, since xboard needs to know the |
||
1166 | values of some features before sending further commands to the engine. |
||
1167 | Because engines that predate protocol version 2 do not send "feature", |
||
1168 | xboard uses a timeout mechanism: when it first starts your engine, it |
||
1169 | sends "xboard" and "protover N", then listens for feature commands for |
||
1170 | two seconds before sending any other commands. To end this timeout |
||
1171 | and avoid the wait, set the feature "done=1" at the end of your last |
||
1172 | feature command. To increase the timeout, if needed, set the feature |
||
1173 | "done=0" before your first feature command and "done=1" at the end. |
||
1174 | If needed, it is okay for your engine to set done=0 soon as it starts, |
||
1175 | even before it receives the xboard and protover commands. This can be |
||
1176 | useful if your engine takes a long time to initialize itself. It |
||
1177 | should be harmless even if you are talking to a (version 1) user |
||
1178 | interface that does not understand the "feature" command, since such |
||
1179 | interfaces generally ignore commands from the engine that they do not |
||
1180 | understand. |
||
1181 | </p> |
||
1182 | |||
1183 | <p> |
||
1184 | The feature command is designed to let the protocol change without |
||
1185 | breaking engines that were written for older protocol versions. When |
||
1186 | a new feature is added to the protocol, its default value is always |
||
1187 | chosen to be compatible with older versions of the protocol that did |
||
1188 | not have the feature. Any feature that your engine does not set in a |
||
1189 | "feature" command retains its default value, so as the protocol |
||
1190 | changes, you do not have to change your engine to keep up with it |
||
1191 | unless you want to take advantage of a new feature. Because some |
||
1192 | features are improvements to the protocol, while others are meant to |
||
1193 | cater to engines that do not implement all the protocol features, the |
||
1194 | recommended setting for a feature is not always the same as the |
||
1195 | default setting. The listing below gives both default and recommended |
||
1196 | settings for most features. |
||
1197 | </p> |
||
1198 | |||
1199 | <p> |
||
1200 | You may want to code your engine so as to be able to work with |
||
1201 | multiple versions of the engine protocol. Protocol version 1 does not |
||
1202 | send the protover command and does not implement the feature command; |
||
1203 | if you send a feature command in protocol version 1, it will have no |
||
1204 | effect and there will be no response. In protocol version 2 or later, |
||
1205 | each feature F that you set generates the response "accepted F" if the |
||
1206 | feature is implemented, or "rejected F" if it is not. Thus an engine |
||
1207 | author can request any feature without having to keep track of which |
||
1208 | protocol version it was introduced in; you need only check whether the |
||
1209 | feature is accepted or rejected. This mechanism also makes it |
||
1210 | possible for a user interface author to implement a subset of a |
||
1211 | protocol version by rejecting some features that are defined in that |
||
1212 | version; however, you should realize that engine authors are likely to |
||
1213 | code for xboard and may not be prepared to have a feature that they |
||
1214 | depend on be rejected. |
||
1215 | <font color=blue>If the GUI rejects an option feature because of the |
||
1216 | syntax of the value, it should print the value string with the |
||
1217 | "rejected" command, e.g. "rejected option nonsense" in response |
||
1218 | to receiving feature option="nonsense".</font> |
||
1219 | </p> |
||
1220 | |||
1221 | <p> |
||
1222 | Here are the features that are currently defined. |
||
1223 | </p> |
||
1224 | </font> |
||
1225 | |||
1226 | <dl> |
||
1227 | <dt><font color=red> |
||
1228 | <strong>ping</strong> (boolean, default 0, recommended 1) |
||
1229 | </font> |
||
1230 | <dd><font color=red> |
||
1231 | If ping=1, xboard may use the protocol's new "ping" command; |
||
1232 | if ping=0, xboard will not use the command. |
||
1233 | </font> |
||
1234 | |||
1235 | <dt><font color=red> |
||
1236 | <strong>setboard</strong> (boolean, default 0, recommended 1) |
||
1237 | </font> |
||
1238 | <dd><font color=red> |
||
1239 | If setboard=1, xboard will use the protocol's new "setboard" command |
||
1240 | to set up positions; if setboard=0, it will use the older "edit" command. |
||
1241 | </font> |
||
1242 | |||
1243 | <dt><font color=red> |
||
1244 | <strong>playother</strong> (boolean, default 0, recommended 1) |
||
1245 | </font> |
||
1246 | <dd><font color=red> |
||
1247 | If playother=1, xboard will use the protocol's new "playother" command |
||
1248 | when appropriate; if playother=0, it will not use the command. |
||
1249 | </font> |
||
1250 | |||
1251 | <dt><font color=red> |
||
1252 | <strong>san</strong> (boolean, default 0) |
||
1253 | </font> |
||
1254 | <dd><font color=red> |
||
1255 | If san=1, xboard will send moves to the engine in standard algebraic |
||
1256 | notation (SAN); for example, Nf3. If san=0, xboard will send moves in |
||
1257 | coordinate notation; for example, g1f3. See MOVE in |
||
1258 | <a href="#8">section 8</a> above for more details of both kinds of notation. |
||
1259 | </font> |
||
1260 | |||
1261 | <dt><font color=red> |
||
1262 | <strong>usermove</strong> (boolean, default 0) |
||
1263 | </font> |
||
1264 | <dd><font color=red> |
||
1265 | If usermove=1, xboard will send moves to the engine with the |
||
1266 | command "usermove MOVE"; if usermove=0, xboard will send just the move, |
||
1267 | with no command name. |
||
1268 | </font> |
||
1269 | |||
1270 | <dt><font color=red> |
||
1271 | <strong>time</strong> (boolean, default 1, recommended 1) |
||
1272 | </font> |
||
1273 | <dd><font color=red> |
||
1274 | If time=1, xboard will send the "time" and "otim" commands to |
||
1275 | update the engine's clocks; if time=0, it will not. |
||
1276 | </font> |
||
1277 | |||
1278 | <dt><font color=red> |
||
1279 | <strong>draw</strong> (boolean, default 1, recommended 1) |
||
1280 | </font> |
||
1281 | <dd><font color=red> |
||
1282 | If draw=1, xboard will send the "draw" command if the engine's opponent |
||
1283 | offers a draw; if draw=0, xboard will not inform the engine about |
||
1284 | draw offers. Note that if draw=1, you may receive a draw offer while you |
||
1285 | are on move; if this will cause you to move immediately, you should set |
||
1286 | draw=0. |
||
1287 | </font> |
||
1288 | |||
1289 | <dt><font color=red> |
||
1290 | <strong>sigint</strong> (boolean, default 1) |
||
1291 | </font> |
||
1292 | <dd><font color=red> |
||
1293 | If sigint=1, xboard may send SIGINT (the interrupt signal) to |
||
1294 | the engine as <a href="#7">section 7</a> above; if sigint=0, it will |
||
1295 | not. |
||
1296 | </font> |
||
1297 | |||
1298 | <dt><font color=red> |
||
1299 | <strong>sigterm</strong> (boolean, default 1) |
||
1300 | </font> |
||
1301 | <dd><font color=red> |
||
1302 | If sigterm=1, xboard may send SIGTERM (the termination signal) to |
||
1303 | the engine as <a href="#7">section 7</a> above; if sigterm=0, it will |
||
1304 | not. |
||
1305 | </font> |
||
1306 | |||
1307 | <dt><font color=red> |
||
1308 | <strong>reuse</strong> (boolean, default 1, recommended 1) |
||
1309 | </font> |
||
1310 | <dd><font color=red> |
||
1311 | If reuse=1, xboard may reuse your engine for multiple games. If |
||
1312 | reuse=0 (or if the user has set the -xreuse option on xboard's command |
||
1313 | line), xboard will kill the engine process after every game and start |
||
1314 | a fresh process for the next game. |
||
1315 | </font> |
||
1316 | |||
1317 | <dt><font color=red> |
||
1318 | <strong>analyze</strong> (boolean, default 1, recommended 1) |
||
1319 | </font> |
||
1320 | <dd><font color=red> |
||
1321 | If analyze=0, xboard will not try to use the "analyze" command; it |
||
1322 | will pop up an error message if the user asks for analysis mode. If |
||
1323 | analyze=1, xboard will try to use the command if the user asks for |
||
1324 | analysis mode. |
||
1325 | </font> |
||
1326 | |||
1327 | <dt><font color=red> |
||
1328 | <strong>myname</strong> (string, default determined from engine filename) |
||
1329 | </font> |
||
1330 | <dd><font color=red> |
||
1331 | This feature lets you set the name that xboard will use for your |
||
1332 | engine in window banners, in the PGN tags of saved game files, and when |
||
1333 | sending the "name" command to another engine. |
||
1334 | </font> |
||
1335 | |||
1336 | <dt><font color=red> |
||
1337 | <strong>variants</strong> (string, see text below) |
||
1338 | </font> |
||
1339 | <dd><font color=red> |
||
1340 | This feature indicates which chess variants your engine accepts. |
||
1341 | It should be a comma-separated list of variant names. See the table |
||
1342 | under the "variant" command in <a href="#8">section 8</a> above. If |
||
1343 | you do not set this feature, xboard will assume by default that your |
||
1344 | engine supports all variants. (However, the -zippyVariants |
||
1345 | command-line option still limits which variants will be accepted in |
||
1346 | Zippy mode.) It is recommended that you set this feature to the |
||
1347 | correct value for your engine (just "normal" in most cases) rather |
||
1348 | than leaving the default in place, so that the user will get an |
||
1349 | appropriate error message if he tries to play a variant that your |
||
1350 | engine does not support.</font> |
||
1351 | <br> |
||
1352 | <font color=green>If your engine can play variants on a deviating board size, |
||
1353 | like capablanca on an 8x8 board, or capablanca crazyhouse, |
||
1354 | it can list them amongst the variants with a prefix spcifying board size plus |
||
1355 | holdings size, like 8x8+0_capablanca or 10x8+7_capablanca. |
||
1356 | If it is capable of playing any variant with an arbitrary board size, |
||
1357 | it should list "boardsize" as one of the variants. |
||
1358 | If there is a maximum to the board size, this can be prefixed, |
||
1359 | e.g. "12x10+0_boardsize". |
||
1360 | </font> |
||
1361 | |||
1362 | <dt><font color=red> |
||
1363 | <strong>colors</strong> (boolean, default 1, recommended 0) |
||
1364 | </font> |
||
1365 | <dd><font color=red> |
||
1366 | If colors=1, xboard uses the obsolete "white" and "black" |
||
1367 | commands in a stylized way that works with most older chess engines |
||
1368 | that require the commands. See the "<a href="#13">Idioms</a>" section |
||
1369 | below for details. If colors=0, xboard does not use the "white" and |
||
1370 | "black" commands at all. |
||
1371 | </font> |
||
1372 | |||
1373 | <dt><font color=red> |
||
1374 | <strong>ics</strong> (boolean, default 0) |
||
1375 | </font> |
||
1376 | <dd><font color=red> |
||
1377 | If ics=1, xboard will use the protocol's new "ics" command |
||
1378 | to inform the engine of whether or not it is playing on a chess server; |
||
1379 | if ics=0, it will not. |
||
1380 | </font> |
||
1381 | |||
1382 | <dt><font color=red> |
||
1383 | <strong>name</strong> (boolean, see text below) |
||
1384 | </font> |
||
1385 | <dd><font color=red> |
||
1386 | If name=1, xboard will use the protocol's "name" command |
||
1387 | to inform the engine of the opponent's name; if name=0, it will not. |
||
1388 | By default, name=1 if the engine is playing on a chess server; name=0 if not. |
||
1389 | </font> |
||
1390 | |||
1391 | <dt><font color=red> |
||
1392 | <strong>pause</strong> (boolean, default 0) |
||
1393 | </font> |
||
1394 | <dd><font color=red> |
||
1395 | If pause=1, xboard may use the protocol's new "pause" command; |
||
1396 | if pause=0, xboard assumes that the engine does not support this command. |
||
1397 | </font> |
||
1398 | |||
1399 | <dt><font color=green> |
||
1400 | <strong>nps</strong> (boolean, default ?) |
||
1401 | </font> |
||
1402 | <dd><font color=green> |
||
1403 | If nps=1, it means the engine supports the nps command. |
||
1404 | If nps=0, it means the engine does not support it, and WinBoard should refrain from sending it. |
||
1405 | Default is that WinBoard sends it, in an attempt to try out if the engine understand it. |
||
1406 | The engine should properly respond with "Error (unkown command): nps" if it does not implement it, |
||
1407 | (as any protocol version pre-scribes), |
||
1408 | or WinBoard might assume that the engine did understand the command. |
||
1409 | In that case the use of different time standards that ensues could lead to time forfeits for the engine. |
||
1410 | </font> |
||
1411 | |||
1412 | <dt><font color=green> |
||
1413 | <strong>debug</strong> (boolean, default 0) |
||
1414 | </font> |
||
1415 | <dd><font color=green> |
||
1416 | If debug=1, it means the engine wants to send debug output prefixed by '#', |
||
1417 | which WinBoard should ignore, except for including it in the winboard.debug file. |
||
1418 | As this feature is added to protocol 2 ony late, |
||
1419 | so that not all protocol-2 supporting versions of WinBoard might implement it, |
||
1420 | it is important that engines check if WinBoard accepts the feature. |
||
1421 | If the feature is rejected, |
||
1422 | engines must refrain from sending the debug output, |
||
1423 | or do so at their own risk. |
||
1424 | </font> |
||
1425 | |||
1426 | <dt><font color=blue> |
||
1427 | <strong>memory</strong> (boolean, default 0) |
||
1428 | </font> |
||
1429 | <dd><font color=blue> |
||
1430 | If memory=1, the size of the total amount of memory available for the memory-consuming tables of the engine |
||
1431 | (e.g. hash, EGTB cache) |
||
1432 | will be set by the GUI through the "memory" command. |
||
1433 | </font> |
||
1434 | |||
1435 | <dt><font color=blue> |
||
1436 | <strong>smp</strong> (boolean, default 0) |
||
1437 | </font> |
||
1438 | <dd><font color=blue> |
||
1439 | If smp=1, the GUI will send the "cores" command to the engine to inform it how many CPU cores it can use. |
||
1440 | Note that sending smp=1 does not imply the engine can use more than one CPU; |
||
1441 | just that it wants to receive the "cores" command. |
||
1442 | </font> |
||
1443 | |||
1444 | <dt><font color=blue> |
||
1445 | <strong>egt</strong> (string, see text below) |
||
1446 | </font> |
||
1447 | <dd><font color=blue> |
||
1448 | This feature indicates which end-game table formats the engine supports. |
||
1449 | It should be a comma-separated list of format names. |
||
1450 | See under the "egtpath" command in <a href="#8">section 8</a> above. |
||
1451 | If you do not set this feature, xboard will assume the engine does not support end-game tables, |
||
1452 | and will not send any "egtpath" commands to inform the engine about their whereabouts. |
||
1453 | </font> |
||
1454 | |||
1455 | <dt><font color=blue> |
||
1456 | <strong>option</strong> (string, see text below) |
||
1457 | </font> |
||
1458 | <dd><font color=blue> |
||
1459 | This feature is used by the engine to define an option command to appear in a GUI menu, |
||
1460 | so that the user can change the corresponding setting of the engine through the GUI interactively. |
||
1461 | The string describes the option by defining a name, type, current value and (sometimes) the acceptable value range. |
||
1462 | Unlike other features, option features are accumulated by the GUI, |
||
1463 | and the GUI must be able to add a new option to the list at any time, |
||
1464 | even after having received feature done=1. |
||
1465 | There are ten different options types, each requiring a slighly different syntax of the defining string: |
||
1466 | <br> |
||
1467 | feature option="NAME -button" |
||
1468 | <br> |
||
1469 | feature option="NAME -save" |
||
1470 | <br> |
||
1471 | feature option="NAME -reset" |
||
1472 | <br> |
||
1473 | feature option="NAME -check VALUE" |
||
1474 | <br> |
||
1475 | feature option="NAME -string VALUE" |
||
1476 | <br> |
||
1477 | feature option="NAME -spin VALUE MIN MAX" |
||
1478 | <br> |
||
1479 | feature option="NAME -combo CHOICE1 /// CHOICE2 ..." |
||
1480 | <br> |
||
1481 | feature option="NAME -slider VALUE MIN MAX" |
||
1482 | <br> |
||
1483 | feature option="NAME -file VALUE" |
||
1484 | <br> |
||
1485 | feature option="NAME -path VALUE" |
||
1486 | <br> |
||
1487 | NAME is an arbitrary alphanumeric string which can contain spaces; |
||
1488 | the other words in capitals would be replaced by the current (default) setting of the option, |
||
1489 | (a character string for -string options, a decimal number for -spin and -check options, |
||
1490 | were the latter uses 1=checked, 0=unchecked), |
||
1491 | the minimum or maximum value of numeric (-spin) options, |
||
1492 | or arbitrary text labels (for -combo option). |
||
1493 | In the latter case, the current value will be preceded by an asterisk. |
||
1494 | The -file and -path options are similar to -string, but can be used to inform the GUI that |
||
1495 | the text represents a file name or folder name respectively, |
||
1496 | so the GUI dialog could add the appropriate browse button to the text-edit field. |
||
1497 | Similarly, a -slider option is like a -spin, but the GUI might make a different |
||
1498 | graphical representation for it. |
||
1499 | A -save option is like a -button, and defines an immediate command to be sent by the engine. |
||
1500 | With -save the GUI will make sure all current option settings are flushed to the engine |
||
1501 | before it sends this command. |
||
1502 | A -reset option is like a -button, but use of it purges the list of options before sending |
||
1503 | the corresponding option command to the engine. |
||
1504 | This enables the engine to completely redefine its options or their current settings, |
||
1505 | by sending a new set of option feature commands to the GUI, |
||
1506 | terminated by feature done=1. |
||
1507 | (The effect of sending an option feature for an option with the same name as was defined before, |
||
1508 | without first receiving a -reset option command, is undefined.) |
||
1509 | </font> |
||
1510 | |||
1511 | <dt><font color=red> |
||
1512 | <strong>done</strong> (integer, no default) |
||
1513 | </font> |
||
1514 | <dd><font color=red> |
||
1515 | If you set done=1 during the initial two-second timeout after |
||
1516 | xboard sends you the "xboard" command, the |
||
1517 | timeout will end and xboard will not look for any more feature |
||
1518 | commands before starting normal operation. |
||
1519 | If you set done=0, the initial timeout is increased to one hour; |
||
1520 | in this case, you must set done=1 before xboard will enter normal operation. |
||
1521 | </font> |
||
1522 | </dl> |
||
1523 | <p> |
||
1524 | |||
1525 | <dt><strong>Illegal move: MOVE</strong> |
||
1526 | <dt><strong>Illegal move (REASON): MOVE</strong> |
||
1527 | <dd>If your engine receives a MOVE command that is recognizably a move |
||
1528 | but is not legal in the current position, your engine must print an |
||
1529 | error message in one of the above formats so that xboard can pass the |
||
1530 | error on to the user and retract the move. The (REASON) is entirely |
||
1531 | optional. Examples: |
||
1532 | |||
1533 | <pre> |
||
1534 | Illegal move: e2e4 |
||
1535 | Illegal move (in check): Nf3 |
||
1536 | Illegal move (moving into check): e1g1 |
||
1537 | </pre> |
||
1538 | <p> |
||
1539 | Generally, xboard will never send an ambiguous move, so it does not |
||
1540 | matter whether you respond to such a move with an Illegal move message |
||
1541 | or an Error message. |
||
1542 | </p> |
||
1543 | |||
1544 | <dt><strong>Error (ERRORTYPE): COMMAND</strong> |
||
1545 | <dd>If your engine receives a command it does not understand or does |
||
1546 | not implement, it should print an error message in the above format so |
||
1547 | that xboard can parse it. Examples: |
||
1548 | <pre> |
||
1549 | Error (ambiguous move): Nf3 |
||
1550 | Error (unknown command): analyze |
||
1551 | Error (command not legal now): undo |
||
1552 | Error (too many parameters): level 1 2 3 4 5 6 7 |
||
1553 | </pre> |
||
1554 | |||
1555 | <dt><strong>move MOVE</strong> |
||
1556 | <dd>Your engine is making the move MOVE. Do not echo moves from |
||
1557 | xboard with this command; send only new moves made by the engine. |
||
1558 | |||
1559 | <font color=red> |
||
1560 | <p>For the actual move text from your chess engine (in place of MOVE |
||
1561 | above), your move should be either |
||
1562 | <ul> |
||
1563 | <li>in coordinate notation (e.g., |
||
1564 | e2e4, e7e8q) with castling indicated by the King's two-square move (e.g., |
||
1565 | e1g1), or |
||
1566 | <li>in Standard Algebraic Notation (SAN) as defined in the |
||
1567 | Portable Game Notation standard (e.g, e4, Nf3, O-O, cxb5, Nxe4, e8=Q), |
||
1568 | with the extension piece@square (e.g., P@f7) to handle piece placement |
||
1569 | in bughouse and crazyhouse. |
||
1570 | </ul> |
||
1571 | xboard itself also accepts some variants of SAN, but for compatibility |
||
1572 | with non-xboard interfaces, it is best not to rely on this behavior. |
||
1573 | </p> |
||
1574 | |||
1575 | <p>Warning: Even though all versions of this protocol specification |
||
1576 | have indicated that xboard accepts SAN moves, some non-xboard |
||
1577 | interfaces are known to accept only coordinate notation. See the |
||
1578 | Idioms section for more information on the known limitations of some |
||
1579 | non-xboard interfaces. It should be safe to send SAN moves if you |
||
1580 | receive a "protover 2" (or later) command from the interface, but |
||
1581 | otherwise it is best to stick to coordinate notation for maximum |
||
1582 | compatibility. An even more conservative approach would be for your |
||
1583 | engine to send SAN to the interface only if you have set feature san=1 |
||
1584 | (which causes the interface to send SAN to you) and have received |
||
1585 | "accepted san" in reply. |
||
1586 | </p> |
||
1587 | </font> |
||
1588 | |||
1589 | <dt><strong>RESULT {COMMENT}</strong> <dd>When your engine detects |
||
1590 | that the game has ended by rule, your engine must output a line of the |
||
1591 | form "RESULT {comment}" (without the quotes), where RESULT is a PGN |
||
1592 | result code (1-0, 0-1, or 1/2-1/2), and comment is the reason. Here |
||
1593 | "by rule" means that the game is definitely over because of what |
||
1594 | happened on the board. In normal chess, this includes checkmate, |
||
1595 | stalemate, triple repetition, the 50 move rule, or insufficient |
||
1596 | material; it does not include loss on time or the like. |
||
1597 | Examples: |
||
1598 | <pre> |
||
1599 | 0-1 {Black mates} |
||
1600 | 1-0 {White mates} |
||
1601 | 1/2-1/2 {Draw by repetition} |
||
1602 | 1/2-1/2 {Stalemate} |
||
1603 | </pre> |
||
1604 | |||
1605 | <p> |
||
1606 | xboard relays the result to the user, the ICS, the other engine in Two |
||
1607 | Machines mode, and the PGN save file as required. |
||
1608 | <font color=green>Note that "definitey over" above means that sending this command |
||
1609 | will be taken by WinBoard as an unconditional refusal of the engine to play on, |
||
1610 | which might cause you to forfeit if the game was in fact not over. |
||
1611 | This command should thus not be used to offer draws, accept draws, |
||
1612 | or make draw-by-rule claims that are not yet valid in the current position |
||
1613 | (but will be after you move). |
||
1614 | For offering and claiming such draws, "offer draw" should be used.</font> |
||
1615 | <p> |
||
1616 | <font color=blue> |
||
1617 | Note that (in accordance with FIDE rules) only KK, KNK, KBK and KBKB with all bishops on the |
||
1618 | same color can be claimed as draws on the basis of insufficient mating material. |
||
1619 | The end-games KNNK, KBKN, KNKN and KBKB with unlike bishops do have mate positions, |
||
1620 | and cannot be claimed. |
||
1621 | Complex draws based on locked Pawn chains will not be recognized as draws by most interfaces, |
||
1622 | so do not claim in such positions, but just offer a draw or play on. |
||
1623 | </font> |
||
1624 | <p> |
||
1625 | <font color=blue> |
||
1626 | Note to GUI programmers: RESULT commands that the engine sends immediately after its move |
||
1627 | might be detected by the GUI only after the opponent has moved, because of communication |
||
1628 | and scheduling delays, no matter how fast the engine sent it. |
||
1629 | Any judgement of the validity of RESULT claims based on te "current" board position |
||
1630 | will have to account for this uncertainty. |
||
1631 | </font> |
||
1632 | </p> |
||
1633 | |||
1634 | <dt><strong>resign</strong> |
||
1635 | <dd>If your engine wants to resign, it can send the command "resign". |
||
1636 | Alternatively, it can use the "RESULT {comment}" command if the string |
||
1637 | "resign" is included in the comment; for example "0-1 {White |
||
1638 | resigns}". xboard relays the resignation to the user, the ICS, the |
||
1639 | other engine in Two Machines mode, and the PGN save file as required. |
||
1640 | <font color=blue>Note that many interfaces work more smoothly if you resign <em>before</em> |
||
1641 | you move.</font> |
||
1642 | <p> |
||
1643 | |||
1644 | <dt><strong>offer draw</strong> |
||
1645 | <dd>If your engine wants to offer a draw by agreement (as opposed to |
||
1646 | claiming a draw by rule), it can send the command "offer draw". |
||
1647 | xboard relays the offer to the user, the ICS, the other engine in Two |
||
1648 | Machines mode, and the PGN save file as required. In Machine White, |
||
1649 | Machine Black, or Two Machines mode, the offer is considered valid |
||
1650 | until your engine has made two more moves. |
||
1651 | <font color=green>This command must also be used to accept a draw offer. |
||
1652 | Do not use the 1/2-1/2 command for that, as the offer might be no longer valid, |
||
1653 | in which case a refusal to play on implied by the RESULT command might make you forfeit the game. |
||
1654 | "offer draw" should also be used to claim 50-move and 3-fold-repetition draws |
||
1655 | that will occur <em>after</em> your move, by sending it <em>before</em> making the move. |
||
1656 | WinBoard will grant draw offers without the opponent having any say in |
||
1657 | it in situations where draws can be claimed. |
||
1658 | Only if the draw cannot be claimed, the offer will be passed to your opponent after you make your next move, |
||
1659 | just before WinBoard relays this move to the opponent. |
||
1660 | </font> |
||
1661 | <p> |
||
1662 | |||
1663 | <dt><font color=red><strong>tellopponent MESSAGE</strong></font> |
||
1664 | <dd><font color=red> |
||
1665 | This command lets the engine give a message to its opponent, |
||
1666 | independent of whether the opponent is a user on the local machine or |
||
1667 | a remote ICS user (Zippy mode). MESSAGE consists of any characters, |
||
1668 | including whitespace, to the end of the line. When the engine is |
||
1669 | playing against a user on the local machine, xboard pops up an |
||
1670 | information dialog containing the message. When the engine is playing |
||
1671 | against an opponent on the ICS (Zippy mode), xboard sends "say |
||
1672 | MESSAGE\n" to the ICS. |
||
1673 | <p> |
||
1674 | |||
1675 | <dt><strong>tellothers MESSAGE</strong> |
||
1676 | <dd>This command lets the engine give a message to people watching the |
||
1677 | game other than the engine's opponent. MESSAGE consists of any |
||
1678 | characters, including whitespace, to the end of the line. When the |
||
1679 | engine is playing against a user on the local machine, this command |
||
1680 | does nothing. When the engine is playing against an opponent on the |
||
1681 | ICS (Zippy mode), xboard sends "whisper MESSAGE\n" to the ICS. |
||
1682 | <p> |
||
1683 | |||
1684 | <dt><strong>tellall MESSAGE</strong> |
||
1685 | <dd>This command lets the engine give a message to its opponent and |
||
1686 | other people watching the game, |
||
1687 | independent of whether the opponent is a user on the local machine or |
||
1688 | a remote ICS user (Zippy mode). MESSAGE consists of any characters, |
||
1689 | including whitespace, to the end of the line. When the engine is |
||
1690 | playing against a user on the local machine, xboard pops up an |
||
1691 | information dialog containing the message. When the engine is playing |
||
1692 | against an opponent on the ICS (Zippy mode), xboard sends "kibitz |
||
1693 | MESSAGE\n" to the ICS. |
||
1694 | </font> |
||
1695 | <p> |
||
1696 | |||
1697 | <dt><strong>telluser MESSAGE</strong> |
||
1698 | <dd>xboard pops up an information dialog containing the message. |
||
1699 | MESSAGE consists of any characters, including whitespace, to the end |
||
1700 | of the line. |
||
1701 | <p> |
||
1702 | |||
1703 | <dt><strong>tellusererror MESSAGE</strong> |
||
1704 | <dd>xboard pops up an error dialog containing the message. |
||
1705 | MESSAGE consists of any characters, including whitespace, to the end |
||
1706 | of the line. |
||
1707 | <p> |
||
1708 | |||
1709 | <dt><strong>askuser REPTAG MESSAGE</strong> |
||
1710 | <dd>Here REPTAG is a string containing no whitespace, and MESSAGE |
||
1711 | consists of any characters, including whitespace, to the end of the |
||
1712 | line. xboard pops up a question dialog that says MESSAGE and |
||
1713 | has a typein box. If the user types in "bar", xboard sends "REPTAG |
||
1714 | bar" to the engine. The user can cancel the dialog and send nothing. |
||
1715 | <p> |
||
1716 | |||
1717 | <dt><strong>tellics MESSAGE</strong> |
||
1718 | <dd>In Zippy mode, xboard sends "MESSAGE\n" to ICS. MESSAGE consists |
||
1719 | of any characters, including whitespace, to the end of the line. |
||
1720 | <p> |
||
1721 | |||
1722 | <dt><font color=red><strong>tellicsnoalias MESSAGE</strong></font> |
||
1723 | <dd><font color=red> |
||
1724 | In Zippy mode, xboard sends "xMESSAGE\n" to ICS, where "x" is a |
||
1725 | character that prevents the ICS from expanding command aliases, if |
||
1726 | xboard knows of such a character. (On chessclub.com and chess.net, |
||
1727 | "/" is used; on freechess.org, "$" is used.) MESSAGE consists of any |
||
1728 | characters, including whitespace, to the end of the line. |
||
1729 | </font> |
||
1730 | <p> |
||
1731 | |||
1732 | <dt><font color=green><strong># COMMENT</strong></font> |
||
1733 | <dd><font color=green> |
||
1734 | The engine can send any string of printable characters, terminated by a newline, |
||
1735 | for inclusion in the winboard.debug file, provided the line starts with a '#' character. |
||
1736 | If the engine has set feature debug=1, |
||
1737 | it is guaranteed that WinBoard (and any future version of it) will completely ignore |
||
1738 | these lines in any other respect. |
||
1739 | </font> |
||
1740 | </dl> |
||
1741 | <p> |
||
1742 | |||
1743 | <h2><a name="10">10. Thinking Output</a></h2> |
||
1744 | |||
1745 | <p> |
||
1746 | If the user asks your engine to "show thinking", xboard sends your |
||
1747 | engine the "post" command. It sends "nopost" to turn thinking off. |
||
1748 | In post mode, your engine sends output lines to show the progress of |
||
1749 | its thinking. The engine can send as many or few of these lines as it |
||
1750 | wants to, whenever it wants to. Typically they would be sent when the |
||
1751 | PV (principal variation) changes or the depth changes. The thinking |
||
1752 | output should be in the following format: |
||
1753 | </p> |
||
1754 | |||
1755 | <pre>ply score time nodes pv</pre> |
||
1756 | |||
1757 | Where: |
||
1758 | <table> |
||
1759 | <tr align="left"><th>ply<td>Integer giving current search depth. |
||
1760 | <tr align="left"><th>score<td>Integer giving current evaluation in centipawns. |
||
1761 | <tr align="left"><th>time<td>Current search time in centiseconds (ex: |
||
1762 | 1028 = 10.28 seconds). |
||
1763 | |||
1764 | <tr align="left"><th>nodes<td>Nodes searched. |
||
1765 | <tr align="left"><th>pv<td>Freeform text giving current "best" line. |
||
1766 | You can continue the pv onto another line if you start each |
||
1767 | continuation line with at least four space characters. |
||
1768 | </table> |
||
1769 | |||
1770 | <p> |
||
1771 | Example: |
||
1772 | </p> |
||
1773 | |||
1774 | <pre> 9 156 1084 48000 Nf3 Nc6 Nc3 Nf6</pre> |
||
1775 | |||
1776 | <p> |
||
1777 | Meaning: |
||
1778 | </p> |
||
1779 | |||
1780 | 9 ply, score=1.56, time = 10.84 seconds, nodes=48000, |
||
1781 | PV = "Nf3 Nc6 Nc3 Nf6" |
||
1782 | |||
1783 | <p> |
||
1784 | Longer example from actual Crafty output: |
||
1785 | </p> |
||
1786 | <pre> |
||
1787 | 4 109 14 1435 1. e4 d5 2. Qf3 dxe4 3. Qxe4 Nc6 |
||
1788 | 4 116 23 2252 1. Nf3 Nc6 2. e4 e6 |
||
1789 | 4 116 27 2589 1. Nf3 Nc6 2. e4 e6 |
||
1790 | 5 141 44 4539 1. Nf3 Nc6 2. O-O e5 3. e4 |
||
1791 | 5 141 54 5568 1. Nf3 Nc6 2. O-O e5 3. e4 |
||
1792 | </pre> |
||
1793 | |||
1794 | <p> |
||
1795 | You can use the PV to show other things; for instance, while in book, |
||
1796 | Crafty shows the observed frequency of different reply moves in its |
||
1797 | book. In situations like this where your engine is not really |
||
1798 | searching, start the PV with a '(' character: |
||
1799 | </p> |
||
1800 | |||
1801 | <pre> |
||
1802 | |||
1803 | </pre> |
||
1804 | |||
1805 | <p> |
||
1806 | GNU Chess output is very slightly different. The ply number is |
||
1807 | followed by an extra nonblank character, and the time is in seconds, |
||
1808 | not hundredths of seconds. For compatibility, xboard accepts the |
||
1809 | extra character and takes it as a flag indicating the different time |
||
1810 | units. Example: |
||
1811 | </p> |
||
1812 | |||
1813 | <pre> |
||
1814 | 2. 14 0 38 d1d2 e8e7 |
||
1815 | 3+ 78 0 65 d1d2 e8e7 d2d3 |
||
1816 | 3& 14 0 89 d1d2 e8e7 d2d3 |
||
1817 | 3& 76 0 191 d1e2 e8e7 e2e3 |
||
1818 | 3. 76 0 215 d1e2 e8e7 e2e3 |
||
1819 | 4& 15 0 366 d1e2 e8e7 e2e3 e7e6 |
||
1820 | 4. 15 0 515 d1e2 e8e7 e2e3 e7e6 |
||
1821 | 5+ 74 0 702 d1e2 f7f5 e2e3 e8e7 e3f4 |
||
1822 | 5& 71 0 1085 d1e2 e8e7 e2e3 e7e6 e3f4 |
||
1823 | 5. 71 0 1669 d1e2 e8e7 e2e3 e7e6 e3f4 |
||
1824 | 6& 48 0 3035 d1e2 e8e7 e2e3 e7e6 e3e4 f7f5 e4d4 |
||
1825 | 6. 48 0 3720 d1e2 e8e7 e2e3 e7e6 e3e4 f7f5 e4d4 |
||
1826 | 7& 48 0 6381 d1e2 e8e7 e2e3 e7e6 e3e4 f7f5 e4d4 |
||
1827 | 7. 48 0 10056 d1e2 e8e7 e2e3 e7e6 e3e4 f7f5 e4d4 |
||
1828 | 8& 66 1 20536 d1e2 e8e7 e2e3 e7e6 e3d4 g7g5 a2a4 f7f5 |
||
1829 | 8. 66 1 24387 d1e2 e8e7 e2e3 e7e6 e3d4 g7g5 a2a4 f7f5 |
||
1830 | 9& 62 2 38886 d1e2 e8e7 e2e3 e7e6 e3d4 h7h5 a2a4 h5h4 |
||
1831 | d4e4 |
||
1832 | 9. 62 4 72578 d1e2 e8e7 e2e3 e7e6 e3d4 h7h5 a2a4 h5h4 |
||
1833 | d4e4 |
||
1834 | 10& 34 7 135944 d1e2 e8e7 e2e3 e7e6 e3d4 h7h5 c2c4 h5h4 |
||
1835 | d4e4 f7f5 e4f4 |
||
1836 | 10. 34 9 173474 d1e2 e8e7 e2e3 e7e6 e3d4 h7h5 c2c4 h5h4 |
||
1837 | d4e4 f7f5 e4f4 |
||
1838 | </pre> |
||
1839 | |||
1840 | <p>If your engine is pondering (thinking on its opponent's time) in post |
||
1841 | mode, it can show its thinking then too. In this case your engine may |
||
1842 | omit the hint move (the move it is assuming its opponent will make) |
||
1843 | from the thinking lines <em>if and only if</em> it sends xboard the move in |
||
1844 | the usual "Hint: xxx" format before sending the first line. |
||
1845 | </p> |
||
1846 | |||
1847 | <h2><a name="11">11. Time control</a></h2> |
||
1848 | |||
1849 | <p> |
||
1850 | xboard supports three styles of time control: conventional chess clocks, |
||
1851 | the ICS-style incremental clock, and an exact number of seconds per move. |
||
1852 | </p> |
||
1853 | |||
1854 | <p>In conventional clock mode, every time control period is the same. |
||
1855 | That is, if the time control is 40 moves in 5 minutes, then after each |
||
1856 | side has made 40 moves, they each get an additional 5 minutes, and so |
||
1857 | on, ad infinitum. At some future time it would be nice to support a |
||
1858 | series of distinct time controls. This is very low on my personal |
||
1859 | priority list, but code donations to the xboard project are accepted, |
||
1860 | so feel free to take a swing at it. I suggest you talk to me first, |
||
1861 | though. |
||
1862 | </p> |
||
1863 | |||
1864 | <p> |
||
1865 | The command to set a conventional time control looks like this: |
||
1866 | </p> |
||
1867 | |||
1868 | <pre> |
||
1869 | level 40 5 0 |
||
1870 | level 40 0:30 0 |
||
1871 | </pre> |
||
1872 | |||
1873 | <p> |
||
1874 | The 40 means that there are 40 moves per time control. The 5 means |
||
1875 | there are 5 minutes in the control. In the second example, the 0:30 |
||
1876 | means there are 30 seconds. The final 0 means that we are in |
||
1877 | conventional clock mode. |
||
1878 | </p> |
||
1879 | |||
1880 | <p> |
||
1881 | <font color=green> |
||
1882 | Note that the time parameter in this command is not a pure numeric argument, |
||
1883 | but in general is a character string, in order to pass the number of seconds. |
||
1884 | Engines are encouraged to ignore any unexpected characters at the end of this string, |
||
1885 | i.e. following the MIN or MIN:SEC specification. |
||
1886 | Future protocol versions might (under control of an appropriate feature) |
||
1887 | append such extra characters to this argument, |
||
1888 | in order to inform the engine in advance of the time control it can expect after the current session completes. |
||
1889 | E.g. "level 40 25+5 0" could mean that the engine has to play 40 moves in 25 minutes, |
||
1890 | but should expect to get only 5 minutes for the entire remainder of the game after that, |
||
1891 | rather than another 25 minutes for the next 40 moves. |
||
1892 | When the time comes, (i.e. after the 40 moves), |
||
1893 | it will be informed of the time-control change by receiving a new "level 0 5 0" command, |
||
1894 | but engines with advanced time management might want to plan for this in advance. |
||
1895 | </font> |
||
1896 | </p> |
||
1897 | |||
1898 | <p> |
||
1899 | The command to set an incremental time control looks like this: |
||
1900 | </p> |
||
1901 | |||
1902 | <pre> |
||
1903 | level 0 2 12 |
||
1904 | </pre> |
||
1905 | |||
1906 | <p> |
||
1907 | Here the 0 means "play the whole game in this time control period", |
||
1908 | the 2 means "base=2 minutes", and the 12 means "inc=12 seconds". As |
||
1909 | in conventional clock mode, the second argument to level can be in |
||
1910 | minutes and seconds. |
||
1911 | </p> |
||
1912 | |||
1913 | <p> |
||
1914 | At the start of the game, each player's clock is set to base minutes. |
||
1915 | Immediately after a player makes a move, inc seconds are added to his |
||
1916 | clock. A player's clock counts down while it is his turn. Your flag |
||
1917 | can be called whenever your clock is zero or negative. (Your clock |
||
1918 | can go negative and then become positive again because of the |
||
1919 | increment.) |
||
1920 | </p> |
||
1921 | |||
1922 | <p><font color=blue> |
||
1923 | The number of moves given in the level command (when non-zero) should |
||
1924 | be taken as the number of moves still to do before the specified time |
||
1925 | will be added to the clock, if the "level" command is received after |
||
1926 | some moves have already been played. |
||
1927 | The time given should be interpreted as the time left on its clock |
||
1928 | (including any time left over from the previous sessions), |
||
1929 | and not necessarily the time that will be added to the clock |
||
1930 | after the specified number of moves has been played. |
||
1931 | This is only relevant in WinBoard 4.3.xx, which might send the engine |
||
1932 | "level" commands during a game, |
||
1933 | just before the engine has to start thinking about the first move of |
||
1934 | a new time-control session. |
||
1935 | Example: if at the start of the game "level 40 60 0" was given |
||
1936 | (40 moves per hour), |
||
1937 | and the engine receives "level 20 22 0" just before move 41, |
||
1938 | it should understand that it should do the next 20 moves in 22 minutes |
||
1939 | (pehaps because the secondary session was 20 moves per 15 minutes, |
||
1940 | and it had 7 minutes left on its clock after the first 40 moves). |
||
1941 | </font></p> |
||
1942 | |||
1943 | <p> |
||
1944 | A special rule on some ICS implementations: if you ask for a game with |
||
1945 | base=0, the clocks really start at 10 seconds instead of 0. xboard |
||
1946 | itself does not know about this rule, so it passes the 0 on to the |
||
1947 | engine instead of changing it to 0:10. |
||
1948 | </p> |
||
1949 | |||
1950 | <p> |
||
1951 | ICS also has time odds games. With time odds, each player has his own |
||
1952 | (base, inc) pair, but otherwise things work the same as in normal |
||
1953 | games. The Zippy xboard accepts time odds games but ignores the fact |
||
1954 | that the opponent's parameters are different; this is perhaps not |
||
1955 | quite the right thing to do, but gnuchess doesn't understand time |
||
1956 | odds. Time odds games are always unrated. |
||
1957 | </p> |
||
1958 | |||
1959 | <p> |
||
1960 | The command to set an exact number of seconds per move looks like this: |
||
1961 | </p> |
||
1962 | |||
1963 | <pre> |
||
1964 | st 30 |
||
1965 | </pre> |
||
1966 | |||
1967 | <p> |
||
1968 | This means that each move must be made in at most 30 seconds. Time not used |
||
1969 | on one move does not accumulate for use on later moves. |
||
1970 | </p> |
||
1971 | |||
1972 | <h2><a name="12">12. Analyze Mode</a></h2> |
||
1973 | |||
1974 | <p>xboard supports analyzing fresh games, edited positions, and games |
||
1975 | from files. However, all of these look the same from the chess |
||
1976 | engine's perspective. Basically, the engine just has to respond to the |
||
1977 | "analyze" command. |
||
1978 | <font color=red> |
||
1979 | Beginning in protocol version 2, |
||
1980 | if your engine does not support analyze mode, it should use |
||
1981 | the feature command to set analyze=0. |
||
1982 | </font> |
||
1983 | The older method of |
||
1984 | printing the error message "Error (unknown command): analyze" in |
||
1985 | response to the "analyze" command will also work, however. |
||
1986 | </p> |
||
1987 | |||
1988 | <p> |
||
1989 | To enter analyze mode, xboard sends the command sequence "post", "analyze". |
||
1990 | Analyze mode in your engine should be |
||
1991 | similar to force mode, except that your engine thinks about what move |
||
1992 | it would make next if it were on move. Your engine should accept the |
||
1993 | following commands while in analyze mode: |
||
1994 | </p> |
||
1995 | |||
1996 | <ul> |
||
1997 | <li>Any legal move, as in force mode |
||
1998 | <li><strong>undo</strong> Back up one move and analyze previous position. |
||
1999 | <li><strong>new</strong> Reset position to start of game but stay in analyze mode. |
||
2000 | <li><font color=red><strong>setboard</strong> if you have set feature setboard=1; otherwise <strong>edit</strong>. Exiting edit mode returns to analyze mode. |
||
2001 | </font> |
||
2002 | <li><strong>exit</strong> Leave analyze mode. |
||
2003 | <li><strong>.</strong> Send a search status update (optional); see below. |
||
2004 | <li><font color=red> |
||
2005 | <strong>bk</strong> Show book moves from this position, |
||
2006 | if any; see above.</font> |
||
2007 | <li><font color=red> |
||
2008 | <strong>hint</strong> Show the predicted move from this |
||
2009 | position, if any; see above.</font> |
||
2010 | </ul> |
||
2011 | |||
2012 | <p> |
||
2013 | If the user selects "Periodic Updates", xboard will send the string |
||
2014 | ".\n" to the chess engine periodically during analyze mode, unless the |
||
2015 | last PV received began with a '(' character. |
||
2016 | </p> |
||
2017 | |||
2018 | <p> |
||
2019 | The chess engine should respond to ".\n" with a line like this: |
||
2020 | </p> |
||
2021 | |||
2022 | <pre> |
||
2023 | stat01: time nodes ply mvleft mvtot <font color=red>mvname</font> |
||
2024 | </pre> |
||
2025 | |||
2026 | Where: |
||
2027 | <table> |
||
2028 | <tr align="left"><th>time<td>Elapsed search time in centiseconds (ie: 567 = 5.67 seconds). |
||
2029 | <tr align="left"><th>nodes<td>Nodes searched so far. |
||
2030 | <tr align="left"><th>ply<td>Search depth so far. |
||
2031 | <tr align="left"><th>mvleft<td>Number of moves left to consider at this depth. |
||
2032 | <tr align="left"><th>mvtot<td>Total number of moves to consider. |
||
2033 | <tr align="left"><th><font color=red>mvname</font><td><font color=red> |
||
2034 | Move currently being considered (SAN or coordinate notation). Optional; |
||
2035 | added in protocol version 2.</font> |
||
2036 | </table> |
||
2037 | |||
2038 | <p> |
||
2039 | Examples: |
||
2040 | </p> |
||
2041 | <pre> |
||
2042 | stat01: 1234 30000 7 5 30 |
||
2043 | stat01: 1234 30000 7 5 30 Nf3 |
||
2044 | </pre> |
||
2045 | |||
2046 | <p> |
||
2047 | Meaning: |
||
2048 | </p> |
||
2049 | |||
2050 | <p>After 12.34 seconds, I've searched 7 ply/30000 nodes, there are a |
||
2051 | total of 30 legal moves, and I have 5 more moves to search |
||
2052 | before going to depth 8. In the second example, of the 30 legal |
||
2053 | moves, the one I am currently searching is Nf3.</p> |
||
2054 | |||
2055 | <p> |
||
2056 | Implementation of the "." command is optional. If the engine does not |
||
2057 | respond to the "." command with a "stat01..." line, xboard will stop |
||
2058 | sending "." commands. If the engine does not implement this command, |
||
2059 | the analysis window will use a shortened format to display the engine |
||
2060 | info. |
||
2061 | </p> |
||
2062 | |||
2063 | <p> |
||
2064 | To give the user some extra information, the chess engine can output |
||
2065 | the strings "++\n" and "--\n", to indicate that the current search is |
||
2066 | failing high or low, respectively. You don't have to send anything |
||
2067 | else to say "Okay, I'm not failing high/low anymore." xboard will |
||
2068 | figure this out itself. |
||
2069 | </p> |
||
2070 | |||
2071 | <h2><a name="13">13. Idioms and backward compatibility features</a></h2> |
||
2072 | |||
2073 | <p> |
||
2074 | Some engines have variant interpretations of the force/go/white/black, |
||
2075 | time/otim, and hard/easy command sets. |
||
2076 | In order to accommodate these older engines, xboard uses these commands |
||
2077 | only according to the stylized patterns ("idioms") given in this section. |
||
2078 | The obsolete white and black commands |
||
2079 | have historically been particularly troublesome, and it is recommended |
||
2080 | that new engines set the feature colors=0 and/or ignore the commands. |
||
2081 | </p> |
||
2082 | |||
2083 | <dl> |
||
2084 | |||
2085 | <dt><strong>time N</strong> |
||
2086 | <dt><strong>otim N</strong> |
||
2087 | <dt><strong>MOVE</strong> |
||
2088 | <dd>Sent when the opponent makes a move and the engine is already |
||
2089 | playing the opposite color. |
||
2090 | <p> |
||
2091 | |||
2092 | <dt><strong>white</strong> |
||
2093 | <dt><strong>go</strong> |
||
2094 | <dd>Sent when the engine is in force mode or playing Black but should |
||
2095 | switch to playing White. This sequence is sent only when White is |
||
2096 | already on move. |
||
2097 | <font color=red> |
||
2098 | If you set the feature colors=0, "white" is not sent. |
||
2099 | </font> |
||
2100 | <p> |
||
2101 | |||
2102 | <dt><strong>black</strong> |
||
2103 | <dt><strong>go</strong> |
||
2104 | <dd>Sent when the engine is in force mode or playing White but should |
||
2105 | switch to playing Black. This sequence is sent only when Black is |
||
2106 | already on move. |
||
2107 | <font color=red> |
||
2108 | If you set the feature colors=0, "black" is not sent. |
||
2109 | </font> |
||
2110 | <p> |
||
2111 | |||
2112 | <dt><strong>white</strong> |
||
2113 | <dt><strong>time N</strong> |
||
2114 | <dt><strong>otim N</strong> |
||
2115 | <dt><strong>black</strong> |
||
2116 | <dt><strong>go</strong> |
||
2117 | <dd>Sent when Black is on move, the engine is in force mode or playing |
||
2118 | White, and the engine's clock needs to be updated before it starts |
||
2119 | playing. |
||
2120 | The initial "white" is a kludge to accommodate GNU Chess |
||
2121 | 4's variant interpretation of these commands. |
||
2122 | <font color=red> |
||
2123 | If you set the feature colors=0, "white" and "black" are not sent. |
||
2124 | </font> |
||
2125 | <p> |
||
2126 | |||
2127 | <dt><strong>black</strong> |
||
2128 | <dt><strong>time N</strong> |
||
2129 | <dt><strong>otim N</strong> |
||
2130 | <dt><strong>white</strong> |
||
2131 | <dt><strong>go</strong> |
||
2132 | <dd>Sent when White is on move, the engine is in force mode or playing |
||
2133 | Black, and the engine's clock needs to be updated before it starts |
||
2134 | playing. See previous idiom. |
||
2135 | The initial "black" is a kludge to accommodate GNU Chess |
||
2136 | 4's variant interpretation of these commands. |
||
2137 | <font color=red> |
||
2138 | If you set the feature colors=0, "black" and "white" are not sent. |
||
2139 | </font> |
||
2140 | <p> |
||
2141 | |||
2142 | <dt><strong>hard</strong> |
||
2143 | <dt><strong>easy</strong> |
||
2144 | <dd>Sent in sequence to turn off pondering if xboard is not sure |
||
2145 | whether it is on. When xboard is sure, it will send "hard" or "easy" |
||
2146 | alone. xboard does this because "easy" is a toggle in GNU Chess 4 but |
||
2147 | "hard" is an absolute on. |
||
2148 | |||
2149 | </dl> |
||
2150 | |||
2151 | <p> |
||
2152 | To support older engines, certain additional commands from the engine |
||
2153 | to xboard are also recognized. (These are commands by themselves, not |
||
2154 | values to be placed in the comment field of the PGN result code.) |
||
2155 | These forms are not recommended for new engines; use the PGN result |
||
2156 | code commands or the resign command instead. |
||
2157 | </p> |
||
2158 | |||
2159 | <table> |
||
2160 | <tr align="left"><th>Command <th>Interpreted as |
||
2161 | <tr align="left"><td>White resigns <td>0-1 {White resigns} |
||
2162 | <tr align="left"><td>Black resigns <td>1-0 {Black resigns} |
||
2163 | <tr align="left"><td>White <td>1-0 {White mates} |
||
2164 | <tr align="left"><td>Black <td>0-1 {Black mates} |
||
2165 | <tr align="left"><td>Draw <td>1/2-1/2 {Draw} |
||
2166 | <tr align="left"><td>computer mates <td>1-0 {White mates} or 0-1 {Black mates} |
||
2167 | <tr align="left"><td>opponent mates <td>1-0 {White mates} or 0-1 {Black mates} |
||
2168 | <tr align="left"><td>computer resigns <td>0-1 {White resigns} or 1-0 {Black resigns} |
||
2169 | <tr align="left"><td>game is a draw <td>1/2-1/2 {Draw} |
||
2170 | <tr align="left"><td>checkmate <td>1-0 {White mates} or 0-1 {Black mates} |
||
2171 | </table> |
||
2172 | |||
2173 | <p> |
||
2174 | Commands in the above table are recognized if they begin a line and |
||
2175 | arbitrary characters follow, so (for example) "White mates" will be |
||
2176 | recognized as "White", and "game is a draw by the 50 move rule" will |
||
2177 | be recognized as "game is a draw". All the commands are |
||
2178 | case-sensitive. |
||
2179 | </p> |
||
2180 | |||
2181 | <p> |
||
2182 | An alternative move syntax is also recognized: |
||
2183 | </p> |
||
2184 | |||
2185 | <table> |
||
2186 | <tr align="left"><th>Command <th>Interpreted as |
||
2187 | <tr align="left"><td>NUMBER ... MOVE <td>move MOVE |
||
2188 | </table> |
||
2189 | |||
2190 | <p> |
||
2191 | Here NUMBER means any string of decimal digits, optionally ending in a |
||
2192 | period. MOVE is any string containing no whitespace. In this command |
||
2193 | format, xboard requires the "..." even if your engine is playing |
||
2194 | White. A command of the form NUMBER MOVE will be ignored. This odd |
||
2195 | treatment of the commands is needed for compatibility with gnuchessx. |
||
2196 | The original reasons for it are lost in the mists of time, but I |
||
2197 | suspect it was originally a bug in the earliest versions of xboard, |
||
2198 | before I started working on it, which someone "fixed" in the wrong |
||
2199 | way, by creating a special version of gnuchess (gnuchessx) instead of |
||
2200 | changing xboard. |
||
2201 | </p> |
||
2202 | |||
2203 | <p> |
||
2204 | Any line that contains the words "offer" and "draw" is recognized as |
||
2205 | "offer draw". |
||
2206 | </p> |
||
2207 | |||
2208 | <p> |
||
2209 | The "Illegal move" message is recognized even if spelled "illegal |
||
2210 | move" and even if the colon (":") is omitted. This accommodates GNU |
||
2211 | Chess 4, which prints messages like "Illegal move (no matching |
||
2212 | move)e2e4", and old versions of Crafty, which print just "illegal move". |
||
2213 | </p> |
||
2214 | |||
2215 | <p> |
||
2216 | In Zippy mode, for compatibility with older versions of Crafty, |
||
2217 | xboard passes through to ICS any line that begins "kibitz", "whisper", |
||
2218 | "tell", or "draw". Do not use this feature in new code. Instead, use the |
||
2219 | commands "tellall", "tellothers", "tellopponent", "tellics" (if needed), |
||
2220 | "1/2-1/2 {COMMENT}", or "offer draw", as appropriate. |
||
2221 | </p> |
||
2222 | |||
2223 | <p> |
||
2224 | <font color=red> |
||
2225 | If the engine responds to the "sd DEPTH" command with an error message |
||
2226 | indicating the command is not supported (such as "Illegal move: sd"), |
||
2227 | xboard sets an internal flag and subsequently uses the command |
||
2228 | "depth\nDEPTH" instead, for the benefit of GNU Chess 4. Note the |
||
2229 | newline in the middle of this command! New engines should not rely on |
||
2230 | this feature. |
||
2231 | </font> |
||
2232 | </p> |
||
2233 | |||
2234 | <p> |
||
2235 | <font color=red> |
||
2236 | If the engine responds to the "st TIME" command with an error message |
||
2237 | indicating the command is not supported (such as "Illegal move: st"), |
||
2238 | xboard sets an internal flag and subsequently uses the command "level |
||
2239 | 1 TIME" instead, for the benefit of GNU Chess 4. Note that this is |
||
2240 | not a standard use of the level command, as TIME seconds are not added |
||
2241 | after each player makes 1 move; rather, each move is made in at most |
||
2242 | TIME seconds. New engines should not implement or rely on this |
||
2243 | feature. |
||
2244 | </font> |
||
2245 | </p> |
||
2246 | |||
2247 | <font color=red> |
||
2248 | <p> |
||
2249 | In support of the -firstHost/-secondHost features, which allow a chess |
||
2250 | engine to be run on another machine using the rsh protocol, xboard recognizes |
||
2251 | error messages that are likely to come from rsh as fatal errors. The following |
||
2252 | messages are currently recognized: |
||
2253 | </p> |
||
2254 | |||
2255 | <blockquote> |
||
2256 | unknown host<br> |
||
2257 | No remote directory<br> |
||
2258 | not found<br> |
||
2259 | No such file<br> |
||
2260 | can't alloc<br> |
||
2261 | Permission denied<br> |
||
2262 | </blockquote> |
||
2263 | </font> |
||
2264 | |||
2265 | <p> |
||
2266 | <font color=red> |
||
2267 | ChessBase/Fritz now implements the xboard/winboard protocol and can use |
||
2268 | WinBoard-compatible engines in its GUI. ChessBase's version of the |
||
2269 | protocol is generally the same as version 1, except that they have |
||
2270 | added the commands <strong>fritz</strong>, <strong>reset</strong>, and |
||
2271 | <strong>ponder</strong>, and the edit subcommands |
||
2272 | <strong>castle</strong> and <strong>ep</strong>. If you want your |
||
2273 | engine to work well with the ChessBase/Fritz GUI, you may need to |
||
2274 | implement these additional commands, and you should also be aware of |
||
2275 | the peculiar way that ChessBase uses the protocol. See their <a |
||
2276 | href="http://www.chessbase.com/Products/engines/winboard/tech.htm" |
||
2277 | >web page</a> for documentation. |
||
2278 | </font> |
||
2279 | </p> |
||
2280 | |||
2281 | <p> |
||
2282 | <font color=red> |
||
2283 | ChessMaster 8000 also implements version 1 of the xboard/winboard |
||
2284 | protocol and can use WinBoard-compatible engines. The original |
||
2285 | release of CM8000 also has one additional restriction: only pure |
||
2286 | coordinate notation (e.g., e2e4) is accepted in the move command. A |
||
2287 | patch to correct this should be available from The Learning Company |
||
2288 | (makers of CM8000) in February 2001. |
||
2289 | </font> |
||
2290 | </p> |
||
2291 | |||
2292 | <hr noshade size="2"> |
||
2293 | <address>converted to HTML by <a href="http://www.jakob.at/steffen/">Steffen A. Jakob</a></address> |
||
2294 | </body> |
||
2295 | </html> |