1 /*>>> epddefs.h: Extended Position Description definitions */
2 
3 /* Revised: 1996.06.23 */
4 
5 /*
6 Copyright (C) 1996 by Steven J. Edwards (sje@mv.mv.com)
7 All rights reserved.  This code may be freely redistibuted and used by
8 both research and commerical applications.  No warranty exists.
9 */
10 
11 /*
12 Everything in this source file is independent of the host program.
13 Requests for changes and additions should be communicated to the author
14 via the e-mail address given above.
15 */
16 
17 /*
18 This file was originally prepared on an Apple Macintosh using the
19 Metrowerks CodeWarrior 6 ANSI C compiler.  Tabs are set at every
20 four columns.  Further testing and development was performed on a
21 generic PC running Linux 1.3.20 and using the gcc 2.7.0 compiler.
22 */
23 
24 /* inclusion telltale */
25 
26 #if (!defined(_epddefs))
27 #define _epddefs 1
28 
29 /* subprogram storage class for non-statics (usually empty definition) */
30 
31 #define nonstatic
32 
33 /* a bit */
34 
35 #define bit 0x01
36 
37 /* bit positions */
38 
39 #define bit_00 (bit <<  0)
40 #define bit_01 (bit <<  1)
41 #define bit_02 (bit <<  2)
42 #define bit_03 (bit <<  3)
43 #define bit_04 (bit <<  4)
44 #define bit_05 (bit <<  5)
45 #define bit_06 (bit <<  6)
46 #define bit_07 (bit <<  7)
47 #define bit_08 (bit <<  8)
48 #define bit_09 (bit <<  9)
49 #define bit_10 (bit << 10)
50 #define bit_11 (bit << 11)
51 #define bit_12 (bit << 12)
52 #define bit_13 (bit << 13)
53 #define bit_14 (bit << 14)
54 #define bit_15 (bit << 15)
55 
56 /* bit width constants */
57 
58 #define nybbW  4
59 #define byteW  8
60 
61 /* simple masks */
62 
63 #define nybbM 0x000f
64 
65 /* useful types */
66 
67 typedef void *voidptrT;
68 typedef unsigned char byteT, *byteptrT;
69 typedef char *charptrT;
70 typedef short int siT, *siptrT;
71 typedef long int liT, *liptrT;
72 typedef float srT, *srptrT;
73 typedef double lrT, *lrptrT;
74 typedef FILE *fptrT;
75 
76 /* text I/O buffer length */
77 
78 #define tL 256
79 
80 /* EPD I/O buffer length */
81 
82 #define epdL 4096
83 
84 /* the standard algebraic notation character vector type */
85 
86 #define sanL 16 /* must be at least 8; extra room for alternatives */
87 
88 typedef char sanT[sanL];
89 typedef sanT *sanptrT;
90 
91 /* SAN style attributes, priority ordered (used for encoding) */
92 
93 typedef siT ssaT;
94 #define ssaL 12
95 #define ssa_nil (-1)
96 
97 #define ssa_capt  0 /* 5 way: capture indicator */
98 #define ssa_case  1 /* 2 way: letter case */
99 #define ssa_chec  2 /* 3 way: checking */
100 #define ssa_cast  3 /* 5 way: castling */
101 #define ssa_prom  4 /* 4 way: promoting */
102 #define ssa_ptar  5 /* 2 way: pawn target rank skip */
103 #define ssa_chmt  6 /* 4 way: checkmating */
104 #define ssa_epct  7 /* 2 way: en passant capture */
105 #define ssa_draw  8 /* 2 way: drawing */
106 #define ssa_move  9 /* 2 way: movement indicator */
107 #define ssa_edcf 10 /* 2 way: extra disambiguating character (file) */
108 #define ssa_edcr 11 /* 2 way: extra disambiguating character (rank) */
109 
110 /* SAN style vector */
111 
112 typedef siT ssavT[ssaL];
113 
114 /* colors (ordering is critical) */
115 
116 typedef siT cT, *cptrT;
117 #define cQ 2
118 #define cL (bit << cQ)
119 #define rcQ 1
120 #define rcL (bit << rcQ)
121 #define c_nil (-1)
122 
123 #define c_w 0 /* white */
124 #define c_b 1 /* black */
125 #define c_v 2 /* vacant */
126 #define c_x 3 /* extra */
127 
128 /* pieces (ordering is critical) */
129 
130 typedef siT pT, *pptrT;
131 #define pL 8
132 #define rpL 6
133 #define p_nil (-1)
134 
135 #define p_p 0 /* pawn */
136 #define p_n 1 /* knight */
137 #define p_b 2 /* bishop */
138 #define p_r 3 /* rook */
139 #define p_q 4 /* queen */
140 #define p_k 5 /* king */
141 #define p_v 6 /* vacant */
142 #define p_x 7 /* extra */
143 
144 /* color piece combinations (ordering is critical) */
145 
146 typedef siT cpT;
147 #define cpL 16
148 #define rcpL 12
149 #define cp_nil (-1)
150 
151 #define cp_wp  0 /* white pawn */
152 #define cp_wn  1 /* white knight */
153 #define cp_wb  2 /* white bishop */
154 #define cp_wr  3 /* white rook */
155 #define cp_wq  4 /* white queen */
156 #define cp_wk  5 /* white king */
157 #define cp_bp  6 /* black pawn */
158 #define cp_bn  7 /* black knight */
159 #define cp_bb  8 /* black bishop */
160 #define cp_br  9 /* black rook */
161 #define cp_bq 10 /* black queen */
162 #define cp_bk 11 /* black king */
163 #define cp_v0 12 /* vacant */
164 #define cp_x0 13 /* extra 0 */
165 #define cp_x1 14 /* extra 1 */
166 #define cp_x2 15 /* extra 2 */
167 
168 /* ranks */
169 
170 typedef siT rankT;
171 #define rankM (0x0007)
172 #define rankQ 3
173 #define rankL (bit << rankQ)
174 #define rank_nil (-1)
175 
176 #define rank_1 0
177 #define rank_2 1
178 #define rank_3 2
179 #define rank_4 3
180 #define rank_5 4
181 #define rank_6 5
182 #define rank_7 6
183 #define rank_8 7
184 
185 /* files */
186 
187 typedef siT fileT;
188 #define fileM (0x0007)
189 #define fileQ 3
190 #define fileL (bit << fileQ)
191 #define file_nil (-1)
192 
193 #define file_a 0 /* QR */
194 #define file_b 1 /* QN */
195 #define file_c 2 /* QB */
196 #define file_d 3 /* Q */
197 #define file_e 4 /* K */
198 #define file_f 5 /* KB */
199 #define file_g 6 /* KN */
200 #define file_h 7 /* KR */
201 
202 /* location mappings */
203 
204 #define map_sq(r, f) (((r) << fileQ | (f)))
205 #define map_file(sq) ((sq) & 0x07)
206 #define map_rank(sq) ((sq) >> fileQ)
207 
208 /* squares */
209 
210 typedef siT sqT, *sqptrT;
211 #define sqM (0x003f)
212 #define sqQ (rankQ + fileQ)
213 #define sqL (bit << sqQ)
214 #define sq_nil (-1)
215 
216 #define sq_a1 map_sq(rank_1, file_a)
217 #define sq_b1 map_sq(rank_1, file_b)
218 #define sq_c1 map_sq(rank_1, file_c)
219 #define sq_d1 map_sq(rank_1, file_d)
220 #define sq_e1 map_sq(rank_1, file_e)
221 #define sq_f1 map_sq(rank_1, file_f)
222 #define sq_g1 map_sq(rank_1, file_g)
223 #define sq_h1 map_sq(rank_1, file_h)
224 #define sq_a2 map_sq(rank_2, file_a)
225 #define sq_b2 map_sq(rank_2, file_b)
226 #define sq_c2 map_sq(rank_2, file_c)
227 #define sq_d2 map_sq(rank_2, file_d)
228 #define sq_e2 map_sq(rank_2, file_e)
229 #define sq_f2 map_sq(rank_2, file_f)
230 #define sq_g2 map_sq(rank_2, file_g)
231 #define sq_h2 map_sq(rank_2, file_h)
232 #define sq_a3 map_sq(rank_3, file_a)
233 #define sq_b3 map_sq(rank_3, file_b)
234 #define sq_c3 map_sq(rank_3, file_c)
235 #define sq_d3 map_sq(rank_3, file_d)
236 #define sq_e3 map_sq(rank_3, file_e)
237 #define sq_f3 map_sq(rank_3, file_f)
238 #define sq_g3 map_sq(rank_3, file_g)
239 #define sq_h3 map_sq(rank_3, file_h)
240 #define sq_a4 map_sq(rank_4, file_a)
241 #define sq_b4 map_sq(rank_4, file_b)
242 #define sq_c4 map_sq(rank_4, file_c)
243 #define sq_d4 map_sq(rank_4, file_d)
244 #define sq_e4 map_sq(rank_4, file_e)
245 #define sq_f4 map_sq(rank_4, file_f)
246 #define sq_g4 map_sq(rank_4, file_g)
247 #define sq_h4 map_sq(rank_4, file_h)
248 #define sq_a5 map_sq(rank_5, file_a)
249 #define sq_b5 map_sq(rank_5, file_b)
250 #define sq_c5 map_sq(rank_5, file_c)
251 #define sq_d5 map_sq(rank_5, file_d)
252 #define sq_e5 map_sq(rank_5, file_e)
253 #define sq_f5 map_sq(rank_5, file_f)
254 #define sq_g5 map_sq(rank_5, file_g)
255 #define sq_h5 map_sq(rank_5, file_h)
256 #define sq_a6 map_sq(rank_6, file_a)
257 #define sq_b6 map_sq(rank_6, file_b)
258 #define sq_c6 map_sq(rank_6, file_c)
259 #define sq_d6 map_sq(rank_6, file_d)
260 #define sq_e6 map_sq(rank_6, file_e)
261 #define sq_f6 map_sq(rank_6, file_f)
262 #define sq_g6 map_sq(rank_6, file_g)
263 #define sq_h6 map_sq(rank_6, file_h)
264 #define sq_a7 map_sq(rank_7, file_a)
265 #define sq_b7 map_sq(rank_7, file_b)
266 #define sq_c7 map_sq(rank_7, file_c)
267 #define sq_d7 map_sq(rank_7, file_d)
268 #define sq_e7 map_sq(rank_7, file_e)
269 #define sq_f7 map_sq(rank_7, file_f)
270 #define sq_g7 map_sq(rank_7, file_g)
271 #define sq_h7 map_sq(rank_7, file_h)
272 #define sq_a8 map_sq(rank_8, file_a)
273 #define sq_b8 map_sq(rank_8, file_b)
274 #define sq_c8 map_sq(rank_8, file_c)
275 #define sq_d8 map_sq(rank_8, file_d)
276 #define sq_e8 map_sq(rank_8, file_e)
277 #define sq_f8 map_sq(rank_8, file_f)
278 #define sq_g8 map_sq(rank_8, file_g)
279 #define sq_h8 map_sq(rank_8, file_h)
280 
281 /* regular board */
282 
283 typedef union rbU
284     {
285     cpT rbm[rankL][fileL]; /* rank/file indexing */
286     cpT rbv[sqL];          /* square indexing */
287     } rbT, *rbptrT;
288 
289 /* nybble board vector */
290 
291 #define nbL (sqL / (byteW / nybbW))
292 typedef byteT nbvT[nbL];
293 
294 /* flanks */
295 
296 typedef siT flankT;
297 #define flankL 2
298 #define flank_nil (-1)
299 
300 #define flank_k 0 /* kingside */
301 #define flank_q 1 /* queenside */
302 
303 /* direction indices */
304 
305 typedef siT dxT;
306 #define dxQ 4
307 #define dxL (bit << dxQ)
308 #define dx_nil (-1)
309 
310 #define dx_0  0
311 #define dx_1  1
312 #define dx_2  2
313 #define dx_3  3
314 #define dx_4  4
315 #define dx_5  5
316 #define dx_6  6
317 #define dx_7  7
318 #define dx_8  8
319 #define dx_9  9
320 #define dx_a 10
321 #define dx_b 11
322 #define dx_c 12
323 #define dx_d 13
324 #define dx_e 14
325 #define dx_f 15
326 
327 /* direction vector displacements */
328 
329 typedef siT dvT;
330 
331 #define dv_0 (( 0 * fileL) + 1)
332 #define dv_1 (( 1 * fileL) + 0)
333 #define dv_2 (( 0 * fileL) - 1)
334 #define dv_3 ((-1 * fileL) - 0)
335 #define dv_4 (( 1 * fileL) + 1)
336 #define dv_5 (( 1 * fileL) - 1)
337 #define dv_6 ((-1 * fileL) - 1)
338 #define dv_7 ((-1 * fileL) + 1)
339 #define dv_8 (( 1 * fileL) + 2)
340 #define dv_9 (( 2 * fileL) + 1)
341 #define dv_a (( 2 * fileL) - 1)
342 #define dv_b (( 1 * fileL) - 2)
343 #define dv_c ((-1 * fileL) - 2)
344 #define dv_d ((-2 * fileL) - 1)
345 #define dv_e ((-2 * fileL) + 1)
346 #define dv_f ((-1 * fileL) + 2)
347 
348 /* extended direction vector offsets */
349 
350 typedef siT xdvT;
351 
352 #define xdv_0 (( 0 * xfileL) + 1)
353 #define xdv_1 (( 1 * xfileL) + 0)
354 #define xdv_2 (( 0 * xfileL) - 1)
355 #define xdv_3 ((-1 * xfileL) - 0)
356 #define xdv_4 (( 1 * xfileL) + 1)
357 #define xdv_5 (( 1 * xfileL) - 1)
358 #define xdv_6 ((-1 * xfileL) - 1)
359 #define xdv_7 ((-1 * xfileL) + 1)
360 #define xdv_8 (( 1 * xfileL) + 2)
361 #define xdv_9 (( 2 * xfileL) + 1)
362 #define xdv_a (( 2 * xfileL) - 1)
363 #define xdv_b (( 1 * xfileL) - 2)
364 #define xdv_c ((-1 * xfileL) - 2)
365 #define xdv_d ((-2 * xfileL) - 1)
366 #define xdv_e ((-2 * xfileL) + 1)
367 #define xdv_f ((-1 * xfileL) + 2)
368 
369 /* extended rank, file, and square types */
370 
371 typedef siT xrankT;
372 #define xrankQ (rankQ + 1)
373 #define xrankL (bit << xrankQ)
374 
375 typedef siT xfileT;
376 #define xfileQ (fileQ + 1)
377 #define xfileM 0x0f
378 #define xfileL (bit << xfileQ)
379 
380 typedef siT xsqT, *xsqptrT;
381 #define xsqQ (xrankQ + xfileQ)
382 #define xsqL (bit << xsqQ)
383 
384 /* the extended board type */
385 
386 typedef union xbU
387 	{
388 	cpT xbm[xrankL][xfileL];
389 	cpT xbv[xsqL];
390 	} xbT, *xbptrT;
391 
392 /* extended board mapping macros */
393 
394 #define map_xrank_xsq(xsq) ((xsq) >> xfileQ)
395 #define map_xfile_xsq(xsq) ((xsq) & xfileM)
396 #define map_xsq_xrank_xfile(xrank, xfile) (((xrank) << xfileQ) | (xfile))
397 
398 /* extended conversion macros */
399 
400 #define xbdrL 4
401 
402 #define map_xfile_file(file) ((file) + xbdrL)
403 #define map_xrank_rank(rank) ((rank) + xbdrL)
404 
405 #define map_file_xfile(xfile) ((xfile) - xbdrL)
406 #define map_rank_xrank(xrank) ((xrank) - xbdrL)
407 
408 #define map_sq_xsq(xsq) \
409 	(((((xsq) >> xfileQ) - xbdrL) << fileQ) | (((xsq) & xfileM) - xbdrL))
410 
411 #define map_xsq_sq(sq) \
412 	((((((sq) >> fileQ) & fileM) + xbdrL) << xfileQ) | \
413 	(((sq) & fileM) + xbdrL))
414 
415 /* castling availability indicators */
416 
417 typedef siT caiT;
418 #define caiL (rcL * flankL)
419 #define cai_nil (-1)
420 
421 #define cai_wk ((c_w * flankL) + flank_k)
422 #define cai_wq ((c_w * flankL) + flank_q)
423 #define cai_bk ((c_b * flankL) + flank_k)
424 #define cai_bq ((c_b * flankL) + flank_q)
425 
426 /* castling index mapper */
427 
428 #define castim(cai) (bit << (cai))
429 
430 /* castling flags */
431 
432 typedef siT castT;
433 typedef castT *castptrT;
434 
435 #define cf_wk castim(cai_wk)
436 #define cf_wq castim(cai_wq)
437 #define cf_bk castim(cai_bk)
438 #define cf_bq castim(cai_bq)
439 
440 /* centipawn evaluation */
441 
442 typedef siT cpevT, *cpevptrT;
443 
444 /* some interesting centipawn evaluations */
445 
446 #define cpev_best ((cpevT) ((((liT) bit) << 15) - 1))
447 #define cpev_bust (-cpev_best)
448 #define cpev_draw 0
449 #define cpev_mate cpev_best
450 #define cpev_wrck (cpev_bust - 1)
451 
452 /* mate and loss synthesis macros (fullmove distance argument) */
453 
454 #define synth_mate(n) (cpev_mate - ((n) * 2) + 1)
455 #define synth_loss(n) (cpev_bust + ((n) * 2))
456 
457 /* distance to mate/loss macros (mate/loss centipawn argument) */
458 
459 #define synth_distance_mate(cpev)  ((siT) (((cpev_mate - (cpev)) + 1) / 2))
460 #define synth_distance_loss(cpev)  ((siT) (((cpev) - cpev_bust) / 2))
461 
462 /* maximum distance to mate/loss (fullmove distance count) */
463 
464 #define max_dist_mateL 1024
465 #define max_dist_lossL 1024
466 
467 /* forced mate/loss detection macros (mate/loss centipawn argument) */
468 
469 #define forced_mate(cpev) ((cpev) >= ((cpev_mate - (max_dist_mateL * 2)) + 1))
470 #define forced_loss(cpev) ((cpev) <= (cpev_bust + (max_dist_lossL * 2)))
471 
472 /* move flag bits */
473 
474 typedef siT mfT;
475 
476 #define mf_bust (bit << 0) /* illegal move */
477 #define mf_chec (bit << 1) /* checking */
478 #define mf_chmt (bit << 2) /* checkmating */
479 #define mf_draw (bit << 3) /* drawing (includes stalemating) */
480 #define mf_exec (bit << 4) /* executed at least once */
481 #define mf_null (bit << 5) /* special null move */
482 #define mf_sanf (bit << 6) /* needs file disambiguation */
483 #define mf_sanr (bit << 7) /* needs rank disambiguation */
484 #define mf_stmt (bit << 8) /* stalemating */
485 
486 /* special case move type */
487 
488 typedef siT scmvT;
489 #define scmvQ 3
490 #define scmvL (bit << scmvQ)
491 #define scmv_nil (-1)
492 
493 #define scmv_reg 0 /* regular */
494 #define scmv_epc 1 /* en passant capture */
495 #define scmv_cks 2 /* castles kingside */
496 #define scmv_cqs 3 /* castles queenside */
497 #define scmv_ppn 4 /* pawn promotes to knight */
498 #define scmv_ppb 5 /* pawn promotes to bishop */
499 #define scmv_ppr 6 /* pawn promotes to rook */
500 #define scmv_ppq 7 /* pawn promotes to queen */
501 
502 /* move type */
503 
504 typedef struct mS
505 	{
506 	mfT   m_flag; /* move flags */
507 	sqT   m_frsq; /* from square */
508 	sqT   m_tosq; /* to square */
509 	cpT   m_frcp; /* from color-piece */
510 	cpT   m_tocp; /* to color-piece */
511 	scmvT m_scmv; /* special case move indication */
512 	} mT, *mptrT;
513 
514 /* game termination indicator markers */
515 
516 typedef siT gtimT, *gtimptrT;
517 #define gtimL 4
518 #define gtim_nil (-1)
519 
520 #define gtim_w 0 /* White won */
521 #define gtim_b 1 /* Black won */
522 #define gtim_d 2 /* draw */
523 #define gtim_u 3 /* unknown */
524 
525 /* clockstamp length hh:mm:ss */
526 
527 #define clockstampL (2 + 1 + 2 + 1 + 2 + 1)
528 
529 /* datestamp length YYYY.MM.DD */
530 
531 #define datestampL (4 + 1 + 2 + 1 + 2 + 1)
532 
533 /* duration length dddd:hh:mm:ss */
534 
535 #define durationL (4 + 1 + 2 + 1 + 2 + 1 + 2 + 1)
536 
537 /* EPD operand basetype */
538 
539 typedef siT eobT;
540 #define eobL 2
541 #define eob_nil (-1)
542 
543 #define eob_string 0 /* quoted string */
544 #define eob_symbol 1 /* unquoted symbol */
545 
546 /* EPD operand value type */
547 
548 typedef struct eovS
549 	{
550 	eobT         eov_eob;  /* basetype */
551 	charptrT     eov_str;  /* string value */
552 	struct eovS *eov_prev; /* previous operand */
553 	struct eovS *eov_next; /* next operand */
554 	} eovT, *eovptrT;
555 
556 /* EPD operation type */
557 
558 typedef struct eopS
559 	{
560 	charptrT     eop_opsym;   /* operation code symbol */
561 	eovptrT      eop_headeov; /* head of operand value list */
562 	eovptrT      eop_taileov; /* tail of operand value list */
563 	struct eopS *eop_prev;    /* previous operation */
564 	struct eopS *eop_next;    /* next operation */
565 	} eopT, *eopptrT;
566 
567 /* EPD record type */
568 
569 typedef struct epdS
570 	{
571 	nbvT     epd_nbv;     /* piece placement nybble board vector */
572 	cT       epd_actc;    /* active color */
573 	castT    epd_cast;    /* castling availability */
574 	sqT      epd_epsq;    /* en passant target square */
575 	eopptrT  epd_headeop; /* head of operation list */
576 	eopptrT  epd_taileop; /* tail of operation list */
577 	} epdT, *epdptrT;
578 
579 /* EPD standard operators */
580 
581 typedef siT epdsoT, *epdsoptrT;
582 #define epdsoL 51
583 #define epdso_nil (-1)
584 
585 #define epdso_acd          0 /* analysis count: depth */
586 #define epdso_acn          1 /* analysis count: nodes */
587 #define epdso_acs          2 /* analysis count: seconds */
588 #define epdso_am           3 /* avoid move(s) */
589 #define epdso_bm           4 /* best move(s) */
590 #define epdso_c0           5 /* comment slot 0 */
591 #define epdso_c1           6 /* comment slot 1 */
592 #define epdso_c2           7 /* comment slot 2 */
593 #define epdso_c3           8 /* comment slot 3 */
594 #define epdso_c4           9 /* comment slot 4 */
595 #define epdso_c5          10 /* comment slot 5 */
596 #define epdso_c6          11 /* comment slot 6 */
597 #define epdso_c7          12 /* comment slot 7 */
598 #define epdso_c8          13 /* comment slot 8 */
599 #define epdso_c9          14 /* comment slot 9 */
600 #define epdso_cc          15 /* chess clock */
601 #define epdso_ce          16 /* centipawn evaluation */
602 #define epdso_dm          17 /* direct move count */
603 #define epdso_draw_accept 18 /* draw accept */
604 #define epdso_draw_claim  19 /* draw claim */
605 #define epdso_draw_offer  20 /* draw offer */
606 #define epdso_draw_reject 21 /* draw reject */
607 #define epdso_eco         22 /* ECO code */
608 #define epdso_fmvn        23 /* fullmove number */
609 #define epdso_hmvc        24 /* halfmove clock */
610 #define epdso_id          25 /* position identification */
611 #define epdso_nic         26 /* NIC code */
612 #define epdso_noop        27 /* no operation */
613 #define epdso_pm          28 /* predicted move */
614 #define epdso_ptp         29 /* PGN tag pair(s) */
615 #define epdso_pv          30 /* predicted variation */
616 #define epdso_rc          31 /* repetition count */
617 #define epdso_refcom      32 /* referee command */
618 #define epdso_refreq      33 /* referee request */
619 #define epdso_resign      34 /* resign */
620 #define epdso_sm          35 /* supplied move */
621 #define epdso_sv          36 /* supplied variation */
622 #define epdso_tcgs        37 /* telecommunications: game selector */
623 #define epdso_tcri        38 /* telecommunications: receiver identification */
624 #define epdso_tcsi        39 /* telecommunications: sender identification */
625 #define epdso_ts          40 /* timestamp */
626 #define epdso_v0          41 /* variation slot 0 */
627 #define epdso_v1          42 /* variation slot 1 */
628 #define epdso_v2          43 /* variation slot 2 */
629 #define epdso_v3          44 /* variation slot 3 */
630 #define epdso_v4          45 /* variation slot 4 */
631 #define epdso_v5          46 /* variation slot 5 */
632 #define epdso_v6          47 /* variation slot 6 */
633 #define epdso_v7          48 /* variation slot 7 */
634 #define epdso_v8          49 /* variation slot 8 */
635 #define epdso_v9          50 /* variation slot 9 */
636 
637 /* referee commands */
638 
639 typedef siT refcomT, *refcomptrT;
640 #define refcomL 7
641 #define refcom_nil (-1)
642 
643 #define refcom_conclude   0
644 #define refcom_disconnect 1
645 #define refcom_execute    2
646 #define refcom_fault      3
647 #define refcom_inform     4
648 #define refcom_respond    5
649 #define refcom_reset      6
650 
651 /* referee requests */
652 
653 typedef siT refreqT, *refreqptrT;
654 #define refreqL 4
655 #define refreq_nil (-1)
656 
657 #define refreq_fault    0
658 #define refreq_reply    1
659 #define refreq_sign_on  2
660 #define refreq_sign_off 3
661 
662 /* referee interface procedure type */
663 
664 typedef epdptrT (*refintptrT)(epdptrT epdptr, siptrT flagptr);
665 
666 /* PGN Seven Tag Roster names */
667 
668 typedef siT pgnstrT, *pgnstrptrT;
669 #define pgnstrL 7
670 #define pgnstr_nil (-1)
671 
672 #define pgnstr_event  0
673 #define pgnstr_site   1
674 #define pgnstr_date   2
675 #define pgnstr_round  3
676 #define pgnstr_white  4
677 #define pgnstr_black  5
678 #define pgnstr_result 6
679 
680 /* benchmark score structure */
681 
682 typedef struct bmsS
683 	{
684 	siT bms_acdflag;   /* ACD (depth) data valid flag */
685 	siT bms_acnflag;   /* ACN (nodes) data valid flag */
686 	siT bms_acsflag;   /* ACS (seconds) data valid flag */
687 	liT bms_total;     /* total record count */
688 	liT bms_solve;     /* solved record count */
689 	liT bms_unsol;     /* unsolved record count */
690 	liT bms_total_acd; /* ACD used, all records */
691 	liT bms_solve_acd; /* ACD used, solved records */
692 	liT bms_unsol_acd; /* ACD used, unsolved records */
693 	liT bms_total_acn; /* ACN used, all records */
694 	liT bms_solve_acn; /* ACN used, solved records */
695 	liT bms_unsol_acn; /* ACN used, unsolved records */
696 	liT bms_total_acs; /* ACS used, all records */
697 	liT bms_solve_acs; /* ACS used, solved records */
698 	liT bms_unsol_acs; /* ACS used, unsolved records */
699 	} bmsT, *bmsptrT;
700 
701 /* environment stack entry record type */
702 
703 typedef struct eseS
704 	{
705 	cT    ese_actc;      /* active color */
706 	castT ese_cast;      /* castling availability */
707 	sqT   ese_epsq;      /* en passant target square */
708 	siT   ese_hmvc;      /* halfmove clock */
709 	siT   ese_fmvn;      /* fullmove number */
710 	sqT   ese_ksqv[rcL]; /* king square locations */
711 	} eseT, *eseptrT;
712 
713 /* game played move record type (entries are prior to move) */
714 
715 typedef struct gpmS
716 	{
717 	mT           gpm_m;    /* the move to be played */
718 	eseT         gpm_ese;  /* environment statck entry storage */
719 	nbvT         gpm_nbv;  /* nybble board vector */
720 	struct gpmS *gpm_prev; /* previous played move record */
721 	struct gpmS *gpm_next; /* next played move record */
722 	} gpmT, *gpmptrT;
723 
724 /* game record type */
725 
726 typedef struct gamS
727 	{
728 	charptrT     gam_strv[pgnstrL]; /* PGN STR tag values */
729 	gtimT        gam_gtim;          /* game termination indicator */
730 	gpmptrT      gam_headgpm;       /* head of game played move list */
731 	gpmptrT      gam_tailgpm;       /* tail of game played move list */
732 	struct gamS *gam_prev;          /* previous game */
733 	struct gamS *gam_next;          /* next game */
734 	} gamT, *gamptrT;
735 
736 /* tablebase byte entry semispan length */
737 
738 #define tbbe_ssL (((bit << byteW) - 4) / 2)
739 
740 /* the signed byte evaulation type */
741 
742 typedef signed char bevT, *bevptrT;
743 
744 /* tablebase signed byte entry values */
745 
746 #define bev_broken   (tbbe_ssL + 1)  /* illegal or busted */
747 
748 #define bev_mi1      tbbe_ssL        /* mate in 1 move */
749 #define bev_mimin    1               /* mate in 126 moves */
750 
751 #define bev_draw     0               /* draw */
752 
753 #define bev_limax    (-1)            /* mated in 125 moves */
754 #define bev_li0      (-tbbe_ssL)     /* mated in 0 moves */
755 
756 #define bev_reserved (-tbbe_ssL - 1) /* reserved */
757 #define bev_unknown  (-tbbe_ssL - 2) /* unknown */
758 
759 /* signed byte entry range testing macros */
760 
761 #define tbe_mating(bev) \
762 	(((bev) >= bev_mimin) && ((bev) <= bev_mi1))
763 
764 #define tbe_losing(bev) \
765 	(((bev) >= bev_li0) && ((bev) <= bev_limax))
766 
767 #define tbe_wld(bev) \
768 	(((bev) >= bev_li0) && ((bev) <= bev_mi1))
769 
770 #define tbe_special(bev) \
771 	(((bev) < bev_li0) || ((bev) > bev_mi1))
772 
773 /* tablebase piece limits */
774 
775 #define tbmecL 4 /* either color by itself */
776 #define tbmbcL 5 /* both colors combined */
777 
778 /* tablebase class identifiers */
779 
780 typedef siT tbidT, *tbidptrT;
781 #define tbidL 146
782 #define tbid_nil (-1)
783 
784 #define tbid_kk      0
785 #define tbid_kpk     1
786 #define tbid_knk     2
787 #define tbid_kbk     3
788 #define tbid_krk     4
789 #define tbid_kqk     5
790 #define tbid_kpkp    6
791 #define tbid_knkp    7
792 #define tbid_knkn    8
793 #define tbid_kbkp    9
794 #define tbid_kbkn   10
795 #define tbid_kbkb   11
796 #define tbid_krkp   12
797 #define tbid_krkn   13
798 #define tbid_krkb   14
799 #define tbid_krkr   15
800 #define tbid_kqkp   16
801 #define tbid_kqkn   17
802 #define tbid_kqkb   18
803 #define tbid_kqkr   19
804 #define tbid_kqkq   20
805 #define tbid_kppk   21
806 #define tbid_knpk   22
807 #define tbid_knnk   23
808 #define tbid_kbpk   24
809 #define tbid_kbnk   25
810 #define tbid_kbbk   26
811 #define tbid_krpk   27
812 #define tbid_krnk   28
813 #define tbid_krbk   29
814 #define tbid_krrk   30
815 #define tbid_kqpk   31
816 #define tbid_kqnk   32
817 #define tbid_kqbk   33
818 #define tbid_kqrk   34
819 #define tbid_kqqk   35
820 #define tbid_kppkp  36
821 #define tbid_kppkn  37
822 #define tbid_kppkb  38
823 #define tbid_kppkr  39
824 #define tbid_kppkq  40
825 #define tbid_knpkp  41
826 #define tbid_knpkn  42
827 #define tbid_knpkb  43
828 #define tbid_knpkr  44
829 #define tbid_knpkq  45
830 #define tbid_knnkp  46
831 #define tbid_knnkn  47
832 #define tbid_knnkb  48
833 #define tbid_knnkr  49
834 #define tbid_knnkq  50
835 #define tbid_kbpkp  51
836 #define tbid_kbpkn  52
837 #define tbid_kbpkb  53
838 #define tbid_kbpkr  54
839 #define tbid_kbpkq  55
840 #define tbid_kbnkp  56
841 #define tbid_kbnkn  57
842 #define tbid_kbnkb  58
843 #define tbid_kbnkr  59
844 #define tbid_kbnkq  60
845 #define tbid_kbbkp  61
846 #define tbid_kbbkn  62
847 #define tbid_kbbkb  63
848 #define tbid_kbbkr  64
849 #define tbid_kbbkq  65
850 #define tbid_krpkp  66
851 #define tbid_krpkn  67
852 #define tbid_krpkb  68
853 #define tbid_krpkr  69
854 #define tbid_krpkq  70
855 #define tbid_krnkp  71
856 #define tbid_krnkn  72
857 #define tbid_krnkb  73
858 #define tbid_krnkr  74
859 #define tbid_krnkq  75
860 #define tbid_krbkp  76
861 #define tbid_krbkn  77
862 #define tbid_krbkb  78
863 #define tbid_krbkr  79
864 #define tbid_krbkq  80
865 #define tbid_krrkp  81
866 #define tbid_krrkn  82
867 #define tbid_krrkb  83
868 #define tbid_krrkr  84
869 #define tbid_krrkq  85
870 #define tbid_kqpkp  86
871 #define tbid_kqpkn  87
872 #define tbid_kqpkb  88
873 #define tbid_kqpkr  89
874 #define tbid_kqpkq  90
875 #define tbid_kqnkp  91
876 #define tbid_kqnkn  92
877 #define tbid_kqnkb  93
878 #define tbid_kqnkr  94
879 #define tbid_kqnkq  95
880 #define tbid_kqbkp  96
881 #define tbid_kqbkn  97
882 #define tbid_kqbkb  98
883 #define tbid_kqbkr  99
884 #define tbid_kqbkq 100
885 #define tbid_kqrkp 101
886 #define tbid_kqrkn 102
887 #define tbid_kqrkb 103
888 #define tbid_kqrkr 104
889 #define tbid_kqrkq 105
890 #define tbid_kqqkp 106
891 #define tbid_kqqkn 107
892 #define tbid_kqqkb 108
893 #define tbid_kqqkr 109
894 #define tbid_kqqkq 110
895 #define tbid_kpppk 111
896 #define tbid_knppk 112
897 #define tbid_knnpk 113
898 #define tbid_knnnk 114
899 #define tbid_kbppk 115
900 #define tbid_kbnpk 116
901 #define tbid_kbnnk 117
902 #define tbid_kbbpk 118
903 #define tbid_kbbnk 119
904 #define tbid_kbbbk 120
905 #define tbid_krppk 121
906 #define tbid_krnpk 122
907 #define tbid_krnnk 123
908 #define tbid_krbpk 124
909 #define tbid_krbnk 125
910 #define tbid_krbbk 126
911 #define tbid_krrpk 127
912 #define tbid_krrnk 128
913 #define tbid_krrbk 129
914 #define tbid_krrrk 130
915 #define tbid_kqppk 131
916 #define tbid_kqnpk 132
917 #define tbid_kqnnk 133
918 #define tbid_kqbpk 134
919 #define tbid_kqbnk 135
920 #define tbid_kqbbk 136
921 #define tbid_kqrpk 137
922 #define tbid_kqrnk 138
923 #define tbid_kqrbk 139
924 #define tbid_kqrrk 140
925 #define tbid_kqqpk 141
926 #define tbid_kqqnk 142
927 #define tbid_kqqbk 143
928 #define tbid_kqqrk 144
929 #define tbid_kqqqk 145
930 
931 /* tablebase fold modes */
932 
933 typedef siT foldT;
934 #define foldL 2
935 #define fold_nil (-1)
936 
937 #define fold_flank    0
938 #define fold_triangle 1
939 
940 #define ff_flankL    (sqL / 2)
941 #define ff_triangleL (((rankL * rankL) + (rankL * 2)) / 8)
942 
943 /* tablebase flags */
944 
945 #define tbf_has_pawns      bit_00
946 #define tbf_has_white_pawn bit_01
947 #define tbf_has_black_pawn bit_02
948 #define tbf_ep_captures    bit_03
949 #define tbf_fold_triangle  bit_04
950 #define tbf_fold_flank     bit_05
951 
952 /* piece distribution type */
953 
954 typedef siT distvT[rcL][rpL];
955 
956 /* position vector type */
957 
958 typedef sqT posvT[rcL][tbmecL];
959 
960 /* file indexing type */
961 
962 typedef liT indexT, *indexptrT;
963 
964 /* the tablebase master vector entry */
965 
966 typedef struct tbS
967 	{
968 	charptrT tb_name;                /* class name */
969 	siT      tb_flags;               /* flag bits */
970 	foldT    tb_fold;                /* fold mode */
971 	cT       tb_pivot_c;             /* pivot color */
972 	siT      tb_pivot_slot;          /* pivot slot within color */
973 	siT      tb_count;               /* man count */
974 	indexT   tb_length;              /* length of file */
975 	siT      tb_mcv[rcL];            /* man count per color */
976 	distvT   tb_distv;               /* piece distribution */
977 	liT      tb_sig0;                /* distribution signature */
978 	liT      tb_sig1;                /* inverted distribution signature */
979 	pT       tb_pv[rcL][tbmecL];     /* pieces */
980 	cpT      tb_cpv[rcL][tbmecL];    /* color-pieces */
981 	siT      tb_scalev[rcL][tbmecL]; /* scale factors */
982 	liT      tb_multv[rcL][tbmecL];  /* multipliers */
983 	} tbT, *tbptrT;
984 
985 /* reflection macros */
986 
987 #define reflect_x(sq) ((sq) ^ 0x38)
988 #define reflect_y(sq) ((sq) ^ 0x07)
989 #define reflect_xy(sq) ((((sq) >> 3) & 0x07) | (((sq) << 3) & 0x38))
990 
991 /* tablebase file pointer cache limit (max simul open files) */
992 
993 #define tbcL 8
994 
995 /* tablebase file pointer cache entry type  */
996 
997 typedef struct tbcS
998 	{
999 	siT   tbc_inuse; /* entry in use flag */
1000 	tbidT tbc_tbid;  /* tablebase class ID */
1001 	cT    tbc_c;     /* color selector for class file pair */
1002 	fptrT tbc_fptr;  /* pointer to the open file */
1003 	} tbcT, *tbcptrT;
1004 
1005 /* statndard disply output column limit */
1006 
1007 #define columnL 80
1008 
1009 /* inclusion telltale closure */
1010 
1011 #endif
1012 
1013 /*<<< epddefs.h: EOF */
1014