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