| 1 | / CHEKMO II |
| 2 | ZZZ=63 |
| 3 | /AUTHOR JOHN E. COMEAU |
| 4 | |
| 5 | |
| 6 | |
| 7 | |
| 8 | |
| 9 | |
| 10 | |
| 11 | |
| 12 | |
| 13 | |
| 14 | |
| 15 | |
| 16 | |
| 17 | |
| 18 | |
| 19 | |
| 20 | |
| 21 | / ::::::::::::::::::::::::::::::: |
| 22 | / : : |
| 23 | / : : |
| 24 | / : : |
| 25 | / : CHEKMO II : |
| 26 | / : CHESS PROGRAM 2/74 : |
| 27 | / : : |
| 28 | / : : |
| 29 | / : : |
| 30 | / ::::::::::::::::::::::::::::::: |
| 31 | \f |
| 32 | |
| 33 | |
| 34 | |
| 35 | / FIELD 0 CORE UTILIZATION |
| 36 | |
| 37 | / 0000-0177 CONSTANTS AND POINTERS |
| 38 | / 0200-0377 INITIALIZATION |
| 39 | / 0400-4777 THE THINKER PART |
| 40 | / 5000-6377 INPUT/OUTPUT ROUTINES |
| 41 | / 6400-7377 PUSH DOWN LIST AREA |
| 42 | / 7400-7577 BOARD & MISC. TABLES |
| 43 | / 7600-7777 BINARY LOADER PROGRAM |
| 44 | \f/SYMBOL DEFINITIONS |
| 45 | /MISC. SYMBOLS |
| 46 | PDLS=6400 /BEGINING OF 1000(OCTAL) WORDS RESERVED FOR PUSH DOWN LISTS |
| 47 | |
| 48 | /PIECE VALUES DEFINED |
| 49 | DECIMAL |
| 50 | KING= 15^32 /15. RELATIVE TO A PAWNS VALUE |
| 51 | QUEEN= 9^32 /9.0 RELATIVE TO A PAWNS VALUE |
| 52 | ROOK= 5^32 /5.0 RELATIVE TO A PAWNS VALUE |
| 53 | BISHOP= 3^32+10 /3.3 RELATIVE TO A PAWNS VALUE |
| 54 | KNIGHT= 3^32+4 /3.1 RELATIVE TO A PAWNS VALUE |
| 55 | PAWN= 1^32 /1.0 RELATIVE TO A PAWNS VALUE |
| 56 | |
| 57 | OCTAL |
| 58 | |
| 59 | /PSEUDO INSTRUCTIONS DEFINED |
| 60 | PUSH1= JMS I [PUSH01 /PUSH THE AC INTO PUSH DOWN LIST #1 |
| 61 | POP1= JMS I [POP01 /POP THE TOP ENTRY OF PUSH DOWN LIST #1 INTO THE AC |
| 62 | PRINTO= JMS I [MES /PRINT 6BIT 2CHAR/WORD TEXT AT ADDRESS SPECIFIED IN THE AC |
| 63 | IPDL1= JMS I [IPDL01 /INITIALIZE PUSH DOWN LIST #1 |
| 64 | PUSH2= JMS I [PUSHIT /PUSH THE CONTENTS OF THE AC INTO PUSH DOWN LIST #2 |
| 65 | POP2= JMS I [POPIT /POP THE TOP ENTRY OF PUSH DOWN LIST #2 INTO THE AC |
| 66 | IPDL2= JMS I [PDLIN /INITIALIZE PUSH DOWN LIST #2 |
| 67 | SNO= JMS I [RFOFL /SKIP NO OVERFLOW (C(AC)>=0 & C(AC8)=0) |
| 68 | |
| 69 | /PDP 8/E IOTS DEFINED |
| 70 | CAF= 6007 |
| 71 | PSKF=6661 |
| 72 | PCLF=6662 |
| 73 | PSKE=6663 |
| 74 | PSTB=6664 |
| 75 | PCIE=6667 |
| 76 | |
| 77 | /CONDITIONAL ASSEMBLY DEFINITIONS |
| 78 | OS8=1 /NO SPECIAL MEANING TO "^C" |
| 79 | LPTREE=1 /DON'T INCLUDE LINE PRINTER CAPABILITIES |
| 80 | DEBUG=1 /OPT FOR DYNAMIC ERROR DETECTION |
| 81 | RANVAL=1 /NOISY EVALUATIONS PLEASE |
| 82 | |
| 83 | /DEFAULT ASSEMBLY DEFINITIONS |
| 84 | IFNDEF OS8 <OS8=0> /NON OS8 SYSTEM |
| 85 | IFNDEF DEBUG <DEBUG=0> /DEBUG SWITCH CLEARED |
| 86 | IFNDEF LPTREE <LPTREE=0> /DONT INCLUDE TREE PRINTOUT CAPABILITIES |
| 87 | IFNDEF RANVAL <RANVAL=1> /INCLUDE A SMIDGEN OF RANDOMNESS IN EVALUATIONS |
| 88 | \f |
| 89 | /ABREVIATIONS USED |
| 90 | |
| 91 | / SQR SQUARE |
| 92 | / INC INCREMENT |
| 93 | / # NUMBER |
| 94 | / = EQUALS |
| 95 | / - MINUS, NEGATIVE OR TO |
| 96 | / & AND |
| 97 | / INFO INFORMATION |
| 98 | / AC ACCUMULATOR |
| 99 | / TEMP TEMPORARY |
| 100 | /K-SIDE KING SIDE |
| 101 | /Q-SIDE QUEEN SIDE |
| 102 | / LOC LOCATION |
| 103 | / CR CARRIAGE RETURN |
| 104 | / LF LINE FEED |
| 105 | / MSW MOVE SQUARE WORD |
| 106 | / MDW MOVE DATA WORD |
| 107 | / CHAR CHARACTER |
| 108 | / W/ WITH |
| 109 | / < LESS THAN |
| 110 | / > GREATER THAN |
| 111 | / PSW POSITION STATUS WORD |
| 112 | / ADDR ADDRESS |
| 113 | / PDL PUSH DOWN LIST |
| 114 | / PDL#1 PUSH DOWN LIST #1 |
| 115 | / PDL#2 PUSH DOWN LIST #2 |
| 116 | / ABS ABSOLUTE |
| 117 | / PROM PROMOTION |
| 118 | / ARG ARGUMENT |
| 119 | / VAL VALUE |
| 120 | |
| 121 | \f/ MOVE SQUARE WORD(MSW) FORMAT |
| 122 | / |
| 123 | / ------------------------------------------------------------------------- |
| 124 | / I I I I I I I I I I I I I |
| 125 | / I 0 I 1 I 2 I 3 I 4 I 5 I 6 I 7 I 8 I 9 I 10 I 11 I |
| 126 | / I I I I I I I I I I I I I |
| 127 | / ------------------------------------------------------------------------- |
| 128 | / I I I I |
| 129 | / -----------------I----------------- -----------------I----------------- |
| 130 | / |
| 131 | / SIXBIT ADDRESS OF THE SIXBIT ADDRESS OF THE |
| 132 | / "FROM SQUARE" "TO SQUARE" |
| 133 | |
| 134 | |
| 135 | |
| 136 | |
| 137 | |
| 138 | |
| 139 | / MOVE DATA WORD(MDW) FORMAT |
| 140 | / ------------------------------------------------------------------------- |
| 141 | / I I I I I I I I I I I I I |
| 142 | / I 0 I 1 I 2 I 3 I 4 I 5 I 6 I 7 I 8 I 9 I 10 I 11 I |
| 143 | / I I I I I I I I I I I I I |
| 144 | / ------------------------------------------------------------------------- |
| 145 | / I I I I I I I |
| 146 | / I ----I---- ----------------I---------------- -------I------- |
| 147 | / I |
| 148 | / I UNUSED = THE SIXBIT ADDRESS OF 0 = NORMAL |
| 149 | / I ALLWAYS THE "TO SQUARE" IF THE 1 = QUEEN SIDE CASTLING |
| 150 | / I EQUALS 0 MOVE IS A 2 SQUARE 2 = KING SIDE CASTLING |
| 151 | / I PAWN MOVE 3 = EN PASSANT CAPTURE |
| 152 | / I 4 = PAWN PROM. TO KNIGHT |
| 153 | / I 5 = PAWN PROM. TO BISHOP |
| 154 | / I 6 = PAWN PROM. TO ROOK |
| 155 | / I 7 = PAWN PROM. TO QUEEN |
| 156 | / I |
| 157 | / I |
| 158 | / I |
| 159 | / I |
| 160 | / |
| 161 | / = 1 IF THIS MOVE |
| 162 | / IS A CAPTURE |
| 163 | \f |
| 164 | |
| 165 | *0000 |
| 166 | /INTERRUPT! |
| 167 | IFRM, 0000 |
| 168 | JMP I .+1 |
| 169 | INTHAN /ADDRESS OF THE INTERUPT HANDLER |
| 170 | REV, ZZZ /LOC 3 HOLDS PROGRAM REVISION # |
| 171 | ODT4, 0000 /LOCATIONS 4, 5, AND 6 ARE RESERVED FOR DEBUGERS |
| 172 | ODT5, 0000 |
| 173 | ODT6, 0000 |
| 174 | |
| 175 | / ZERO PAGE CONSTANTS |
| 176 | *11 |
| 177 | RANDOM, 0000 |
| 178 | XR0, 0000 |
| 179 | ITMP0, 0000 |
| 180 | ITMP1, 0000 /AUTO-INCREMENT TEMPORARY STORAGE |
| 181 | ITMP2, 0000 |
| 182 | CLIST, KBUF-1 /INPUT BUFFER POINTER |
| 183 | LIST2, 0000 |
| 184 | TEMP, 0000 /TEMPORARY STORAGE LOCATIONS |
| 185 | TEMP1, 0000 / . |
| 186 | TEMP2, 0000 / . |
| 187 | TEMP3, 0000 / . |
| 188 | TEMP4, 0000 / . |
| 189 | TMP, 0000 /TEMPORARY STORAGE |
| 190 | ZOUT, OUT /POINTS TO OUTPUT ROUTINE |
| 191 | CHAR, 0000 /TEMP. STORAGE PLACE FOR A CHARACTER |
| 192 | ZCRLF, CRLF /POINTS TO CR-LF PRINTING ROUTINE |
| 193 | XXXX, 0000 /TEMPORARY STORAGE |
| 194 | ZBEGIN, BEGIN /POINTS TO INPUT INITIATING ROUTINE |
| 195 | CNTCHR, 0000 /CHARACTER COUNT |
| 196 | ISW, 0000 /INPUT SWITCH |
| 197 | ZGETC, GETC /POINTS TO INPUT BUFFER READING ROUTINE |
| 198 | PONDIR, 0001 /PAWN DIRECTION CONSTANT |
| 199 | M1, 0000 |
| 200 | M2, 0000 |
| 201 | M3, 0000 |
| 202 | M4, 0000 |
| 203 | GN1, 0000 /COMMON STORAGE FOR THE MOVE GENERATION ROUTINES |
| 204 | GN2, 0000 / . |
| 205 | GN3, 0000 / . |
| 206 | GN4, 0000 / . |
| 207 | GNMSW, 0000 / . |
| 208 | GNMDW, 0000 / . |
| 209 | FSTRNK, 7777 /-VALUE OF THE FIRST RANK |
| 210 | ZCHKIO, CHKIO /POINTS TO IO STALL ROUTINE |
| 211 | WPSW, 0000 /WHITES POSITION STATUS WORD |
| 212 | BPSW, 0000 /BLACKS POSITION STATUS WORD |
| 213 | CPSW, 0000 /ADDRESS OF CURRENT POSITION STATUS WORD IS KEPT HERE |
| 214 | GMAP, 0000 |
| 215 | OMAP, 0000 |
| 216 | TOMAK1, 0000 /MOVE SQUARE WORD HERE |
| 217 | TOMAK2, 0000 /MOVE DATA WORD HERE |
| 218 | DIR1, 0000 |
| 219 | DIR2, 0000 |
| 220 | CNTR1, 0000 |
| 221 | WKING, 0000 /ADDRESS OF THE WHITE KING IS STORED HERE |
| 222 | BKING, 0000 /ADDRESS OF THE BLACK KING IS STORED HERE |
| 223 | CKING, 0000 /ADRESS OF THE KING BEING TESTED |
| 224 | TKING, 0000 /TEMP STORAGE FOR KING ADDR |
| 225 | LSTMV, 0000 /LOCATION WHICH DESCRIBES THE LAST MOVE MADE IF DOUBLE PAWN MOVE |
| 226 | ZGNMV, GNMV /POINTS TO MOVE GENERATION ROUTINE |
| 227 | ZMKMV, MKMV /POINTS TO THE MOVE MAKING ROUTINE |
| 228 | ZUNMV, UNMV /POINTS TO THE MOVE UNMAKING ROUTINE |
| 229 | ZMAPEC, MAPEC /POINTS TO PIECE MAP ROUTINE |
| 230 | PW, 0000 /SET = TO TOTAL VALUE OF ALL PIECES ON THE BOARD BY 'MAPEC' |
| 231 | WHOSE, 0000 /THIS LOC =0 IF IT IS WHITES MOVE, =-1 IF BLACKS |
| 232 | PCNT, 0000 /USED BY CHKATK =# OF PIECES ATTACKING THE SQUARE |
| 233 | PVAL, 0000 /USED BY CHKATK =LEAST VALUABLE ATTACKER |
| 234 | PSQR, 0000 /USED BY CHKATK =ADDRESS OF THE LEAST VALUABLE ATTACKING PIECE |
| 235 | ZSPLIT, SPLIT /POINTS TO A SUBROUTINE WHICH SPLITS UP A MSW |
| 236 | ZTSTCH, TSTCHK /POINTS TO CHECK TESTING ROUTINE |
| 237 | ZFNL, TSTCHK /POINTS TO FINAL LEGAL MOVE VERIFICATION ROUTINE |
| 238 | GNCNT, 0000 /LOC=NUMBER OF MOVES GENERATED BY GNWMV |
| 239 | TOADR, 0000 |
| 240 | IOMDW, 0000 /ARGUMENT STORAGE FOR I/O ROUTINES |
| 241 | IOMSW, 0000 /ARGUMENT STORAGE FOR I/O ROUTINES |
| 242 | CMSW, 0000 /CHECKMATE SWITCH |
| 243 | SMSW, 0000 /STALEMATE SWITCH |
| 244 | COMP, 0000 |
| 245 | ZLOOKA, LOOKA /POINTS TO THE RECURSIVE LOOKAHEAD SUBROUTINE |
| 246 | UVAL1, 0000 |
| 247 | CVAL1, 3777 |
| 248 | RVAL1, 0000 |
| 249 | MVAL1, 0000 /HOLDS MOBILITY VALUE |
| 250 | PLY, 0000 /HOLDS CURRENT RECURSION LEVEL OF THE "LOOKA" SUBROUTINE |
| 251 | DEPTH, 0003 /HOLDS THE MAXIMUM RECURSION LEVEL FOR THE "LOOKA" SUBROUTINE |
| 252 | RDEPTH, 0000 |
| 253 | BUG, 0000 |
| 254 | RNKKNT, 0000 /TEMP STORAGE FOR BOARD OUTPRINT & BOARD INPUT ROUTINES |
| 255 | FILKNT, 0 |
| 256 | PIECE, 0 |
| 257 | COLOR, 0 |
| 258 | RNKPTR, 0 |
| 259 | MOBMOD, 0000 |
| 260 | KNGBLK, 0000 /SET BY "GNMV" TO # OF KING MOVES ILLEGAL BECAUSE OF CHECK |
| 261 | MOB0, 0000 |
| 262 | MOB1, 0000 |
| 263 | CTNEED, 0000 |
| 264 | STRATG, 0000 /HOLDS STRATEGIC VALUE |
| 265 | PC01, 0000 /POINTER FOR PUSH DOWN LIST #1 |
| 266 | PDLADR, 0000 /POINTER FOR PUSH DOWN LIST #2 |
| 267 | IFNZRO DEBUG< |
| 268 | ENO, 0000 |
| 269 | ENOB, 0000 |
| 270 | > |
| 271 | WHOWHI, 0000 |
| 272 | WHOBLK, 0000 |
| 273 | COMTMP, 0000 |
| 274 | BOGUS, 0000 |
| 275 | DOMAP, 0000 |
| 276 | \f*200 |
| 277 | START, IFNZRO LPTREE < |
| 278 | TAD (OUT |
| 279 | DCA ZOUT /MAKE SURE OUTPUT GOES TO THE TTY |
| 280 | > |
| 281 | JMS I ZCRLF |
| 282 | PRINTO; NAME /PRINT "CHEKMO-II" |
| 283 | JMS I ZCRLF |
| 284 | DCA WHOSE |
| 285 | JMS SETBRD /SETUP THE BOARD |
| 286 | COMPN, DCA WHOWHI /RESET SWITCH FOR THE USER TO PLAY WHITE |
| 287 | DCA WHOBLK /RESET SWITCH FOR THE USER TO PLAY BLACK |
| 288 | COMMAN, IPDL2 /INITIALIZE PUSH DOWN LISTS |
| 289 | IPDL1 |
| 290 | ISZ DOMAP /MAKE SURE A PIECE MAP IS REALY DONE |
| 291 | JMS QMATE /TEST FOR SIDE TO MOVE IN CHECKMATE OR STALEMATE |
| 292 | TAD WHOSE /GET "WHOSE MOVE" SWITCH |
| 293 | SPA CLA /IS IT WHITES OR BLACKS MOVE? |
| 294 | JMP BLKMVE /BLACKS |
| 295 | PRINTO; MESG23 /PRINT "W. " |
| 296 | TAD WHOWHI /GET THE "WHO PLAYS WHITE" SWITCH |
| 297 | SZA CLA /DOES THE COMPUTER PLAY ON BEHALF OF WHITE? |
| 298 | JMP CMOVE /YES |
| 299 | USER, PRINTO; MESG24 /PRINT "YOUR MOVE?" |
| 300 | JMS I ZBEGIN /SETUP TO ACCEPT A LINE OF INPUT |
| 301 | ION /ACCEPT IT ANY TIME NOW |
| 302 | JMS I ZCHKIO /WAIT FOR IT TO FINISH |
| 303 | JMS I ZGETC /GET 1ST CHAR |
| 304 | AND [0077 /ONLY NEED 6 BITS |
| 305 | RTL CLL /MOVE THEM TO THE HIGH ORDER 6 BITS |
| 306 | RTL /POSITION |
| 307 | RTL |
| 308 | DCA COMTMP /STORE FOR A WHILE |
| 309 | JMS I ZGETC /GET 2ND CHAR |
| 310 | AND [0077 /ONLY NEED 6 BITS |
| 311 | TAD COMTMP /WE NOW HAVE THE FIRST 2 INPUT CHARS PACKED |
| 312 | DCA COMTMP /6BIT STYLE IN 1 WORD |
| 313 | TAD (COMLST-2/ADDRESS-2 OF THE COMMAND LIST |
| 314 | DCA XR0 /TO AUTO INDEX REGISTER |
| 315 | NUTHER, ISZ XR0 /INC POINTER TO POINT AT A 6BIT COMMAND IN THE COMMAND LIST |
| 316 | TAD I XR0 /GET A LEGAL 6BIT COMMAND |
| 317 | SNA /WERE THERE ANY MORE TO GET? |
| 318 | JMP UINP /NO. THE USER MUST BE TRYING TO ENTER A MOVE |
| 319 | TAD COMTMP /YES. COMPARE WITH THE ONE THE USER JUST INPUTED |
| 320 | SZA CLA /IS IT A MATCH? |
| 321 | JMP NUTHER /NO. TRY AGAIN |
| 322 | TAD I XR0 /YES. GET THE TRANSFER ADDRESS |
| 323 | DCA TEMP |
| 324 | JMP I TEMP /TRANSFER |
| 325 | |
| 326 | COMPW, ISZ WHOWHI /SET SWITCH TO INDICATE THAT WHITE IS PLAYED |
| 327 | JMP COMMAN /BY THE COMPUTER |
| 328 | |
| 329 | COMPB, ISZ WHOBLK /SET THE SWITCH TO INDICATE THAT BLACK IS PLAYED |
| 330 | JMP COMMAN /BY THE COMPUTER |
| 331 | |
| 332 | COMBD, JMS DISPLAY /DISPLAY THE BOARD ON THE TELLETYPE |
| 333 | JMP COMMAN |
| 334 | |
| 335 | COMIP, JMS INPUT /GET THE INPUT OF A POSITION FROM THE TELLETYPE |
| 336 | JMP COMPN |
| 337 | |
| 338 | UINP, JMS I ZBEGIN /REINIT THE KEYBOARD BUFFER POINTER |
| 339 | JMS INMV /WAS A LEGAL MOVE TYPED IN? |
| 340 | SKP CLA /NO. |
| 341 | JMP COMMAN /YES. IT WAS ALSO MADE BY THE "INMOVE" SUBROUTINE |
| 342 | TAD ("? /PRINT A "?" |
| 343 | JMS I ZOUT /TO INDICATE THE ERROR |
| 344 | JMS I ZCRLF |
| 345 | JMP COMMAN /TRY AGAIN |
| 346 | |
| 347 | BLKMVE, PRINTO; MESG22 /BRINT "B. " |
| 348 | TAD WHOBLK |
| 349 | SNA CLA /DOES THE USER PLAY BLACK, OR DOES THE COMPUTER? |
| 350 | JMP USER /THE USER |
| 351 | CMOVE, CLA /COMPUTER NOW MAKES A MOVE |
| 352 | TAD (3777 /INITIALIZE SEARCH VALUE TO PREVENT PRUNING AT THE FIRST PLY |
| 353 | DCA CVAL1 |
| 354 | DCA PLY /MAKE SURE PLY # IS 0 BEFORE ENTERING RECURSIVE EVALUATOR |
| 355 | IFNZRO LPTREE< |
| 356 | TAD (LPTOUT /SWITCH OUTPUT DEVICE TO LINE PRINTER |
| 357 | DCA ZOUT |
| 358 | JMS I ZCRLF |
| 359 | JMS DISPLA /PRINT THE BOARD AT PLY 0 |
| 360 | JMS TABPLY |
| 361 | > |
| 362 | CMA CLA |
| 363 | TAD DEPTH /DO A SHORT "PRE ANALYSIS" |
| 364 | SNA /UNLESS WE ARE IN "BLITZ MODE" (DEPTH OF 1) |
| 365 | JMP CMOVE1 /WHICH WE ARE |
| 366 | IAC |
| 367 | DCA RDEPTH /SAVE THE REAL DEPTH |
| 368 | IAC |
| 369 | DCA DEPTH /SET THE DEPTH TO 1 TEMPORARILY |
| 370 | JMS I ZLOOKA /FIND OUT WHICH MOVE LOOKS THE BEST |
| 371 | TAD RDEPTH |
| 372 | DCA DEPTH /RESTORE THE REAL DEPTH |
| 373 | CMOVE1, JMS I ZLOOKA /FIGURE OUT WHICH MOVE TO MAKE |
| 374 | IFNZRO LPTREE< |
| 375 | TAD (OUT /SWITCH OUTPUT DEV. BACK TO TTY |
| 376 | DCA ZOUT |
| 377 | > |
| 378 | TAD BESTBL |
| 379 | DCA IOMSW |
| 380 | TAD BESTBL+1 |
| 381 | DCA IOMDW |
| 382 | TAD BESTBL /GET THE LAST MOVE TO WIN A COMPARE ON PLY #1 |
| 383 | DCA TOMAK1 /FROM THE TABLE OF BEST MOVES |
| 384 | TAD BESTBL+1 |
| 385 | DCA TOMAK2 |
| 386 | JMS I ZMKMV /MAKE THE MOVE |
| 387 | JMS OUTMV /PRINT OUT THE MOVE JUST MADE |
| 388 | JMS GNMVSM /GENERATE MOVES FOR THE SIDE TO MOVE |
| 389 | TAD GNCHEK /GET # OF ATTACKS ON THE KING |
| 390 | SZA CLA /IS THE SIDE TO MOVE IN CHECK? |
| 391 | TAD ("+ /YES. PRINT A "+" TO INDICATE IT |
| 392 | JMS I ZOUT |
| 393 | JMS I ZCRLF |
| 394 | JMP COMMAN |
| 395 | |
| 396 | PAGE |
| 397 | \f/THIS SUBROUTINE GENERATES ALL MOVES FOR A SIDE |
| 398 | /AND STICKS THEM INTO PDL2. |
| 399 | /THIS SUBROUTINE IN ADDITION... |
| 400 | /SETS "GNCNT" TO THE # OF MOVES GENERATED |
| 401 | /SETS "CMSW" TO A NON-ZERO VALUE IF NO MOVES CAN BE GENERATED BECAUSE OF CHECKMATE |
| 402 | /SETS "SMSW" TO A NON-ZERO VALUE IF NO MOVES CAN BE GENERATED BECAUSE OF STALEMATE |
| 403 | /SETS "GNCHEK" TO THE NUMBER OF PIECES ATTACKING THE KING IF THE KING IS IN CHECK |
| 404 | /SETS "KNGBLK" TO THE NUMBER OF ADJACENT SQUARES THE KING CANNOT MOVE |
| 405 | /INTO BECAUSE THAT WOULD PUT HIM IN CHECK |
| 406 | /SETS "MOBMOD" TO THE MOVING SIDES MOBILITY VALUE, BASED ON "GNCNT" AND |
| 407 | /THE NUMBER OF MOVES THAT ARE ILLEGAL BECAUSE THEY DO NOT |
| 408 | /GET THE KING OUT OF CHECK, BUT ARE OTHERWISE LEGAL, MINUS |
| 409 | /50% OF THE TOTAL # OF QUEEN MOVES. |
| 410 | /IF THIS ROUTINE IS CALLED WITH "BOGUS" SET TO A NON-ZERO VALUE |
| 411 | /THIS SUBROUTINE WILL NOT PUT ANY MOVES IN PDL#2 OR TRY TO GENERATE |
| 412 | /EN PASSANT PAWN CAPTURES |
| 413 | /THIS SUBROUTINE SETS BOGUS TO ZERO BEFORE RETURNING |
| 414 | GNMV, 0000 |
| 415 | CLL CLA |
| 416 | DCA MOBMOD /INITIALIZE THE MOBMOD COUNTER |
| 417 | DCA KNGBLK /INITIALIZE THE BLOCKED KING MOVE COUNTER |
| 418 | DCA CMSW /INITIALIZE CHECKMATE SWITCH TO = NO CHECKMATE |
| 419 | DCA SMSW /INITIALIZE STALEMATE SWITCH TO = NO STALEMATE |
| 420 | DCA QMVCNT /INIT QUEEN MOVE COUNTER |
| 421 | TAD CKING /TEST FOR KING IN CHECK |
| 422 | DCA TEMP |
| 423 | JMS CHKATK /CALL W/AC CLEAR---FIND ALL ATTACKS ON THE KING |
| 424 | TAD PCNT /GET # OF ATTACKS |
| 425 | DCA GNCHEK /SAVE THE # OF ATTACKS ON THE KING |
| 426 | DCA GNCNT /INITIALIZE GENERATION COUNT = 0 |
| 427 | TAD BOGUS |
| 428 | SZA CLA /ARE WE GOING TO BE PUTTING MOVES IN PDL#2? |
| 429 | JMP .+3 /NO. NO NEED FOR MARKERS THEN |
| 430 | PUSH2 /YES. FIRST THING TO DO IS PUSH 2 BLANK WORDS |
| 431 | PUSH2 /TO MARK LIST PLACE |
| 432 | TAD CKING /SETUP TO GENERATE KING MOVES |
| 433 | DCA CNTR1 |
| 434 | TAD CNTR1 /SPLIT THE KINGS SQUARES ADDR UP INTO RANK AND FILE #'S |
| 435 | AND [0007 |
| 436 | DCA GN2 /STORE THE FILE # |
| 437 | TAD CNTR1 |
| 438 | RTR |
| 439 | RAR |
| 440 | AND [0007 |
| 441 | DCA GN1 /STORE THE RANK # |
| 442 | JMS GKM /GENERATE THOSE KING MOVES |
| 443 | TAD GNCHEK /GET THE NUMBER OF PIECES PRESENTLY CHECKING THE KING |
| 444 | RAR CLL /NO COMMENT |
| 445 | SZA CLA /IS THE KING IN DOUBLE CHECK? |
| 446 | JMP TSCMSM /YES. NO USE TRYING TO GENERATE MOVES BY OTHER PIECES |
| 447 | TAD BOGUS /NO. |
| 448 | SNA CLA /IS THIS FOR REAL? |
| 449 | JMS GNEP /YES. GENERATE ANY POSIBLE 'EN PASSANT' PAWN CAPTURES NOW |
| 450 | TAD GMAP /ADDRESS-1 OF MAP |
| 451 | DCA ITMP2 /STORE IT |
| 452 | NXTSQR, CLL CLA |
| 453 | TAD I ITMP2 /GET THE ADDRESS OF THE NEXT PIECE |
| 454 | SNA /IS IT REALY A PIECE? |
| 455 | JMP TSCMSM /NO. MOVES ARE ALL GENERATED. |
| 456 | DCA CNTR1 /YES. STORE ITS ADDRESS |
| 457 | IAC |
| 458 | DCA CTNEED /INITIALIZE THE CHECK TEST NEED SWITCH |
| 459 | TAD CNTR1 /NOW STRIP RANK AND FILE NUMBERS FROM THE ADDRESS |
| 460 | AND [0007 |
| 461 | DCA GN2 /STORE THE FILE NUMBER |
| 462 | TAD CNTR1 |
| 463 | RTR |
| 464 | RAR |
| 465 | AND [0007 |
| 466 | DCA GN1 /STORE THE RANK NUMBER |
| 467 | TAD I CNTR1 /GET THE VALUE OF THE PIECE ON THE SQUARE |
| 468 | JMS CLRFIX |
| 469 | TAD [-PAWN |
| 470 | SNA /IS IT A PAWN? |
| 471 | JMP GPM /YES |
| 472 | TAD (PAWN-KNIGHT |
| 473 | SNA /IS IT A KNIGHT? |
| 474 | JMP GNM /YES |
| 475 | TAD (KNIGHT-BISHOP |
| 476 | SNA /IS IT A BISHOP? |
| 477 | JMP GBM /YES |
| 478 | TAD (BISHOP-ROOK |
| 479 | SNA /IS IT A ROOK? |
| 480 | JMP GRM /YES |
| 481 | TAD (ROOK-KING |
| 482 | SNA /IS IT A KING? |
| 483 | JMP NXTSQR /YES. TRY NEXT PIECE SINCE KING MOVES HAVE ALLREADY BEEN GENERATED |
| 484 | TAD (KING-QUEEN |
| 485 | SNA /IS IT A QUEEN? |
| 486 | JMP GQM /YES |
| 487 | HLT /NO. SOMTHINGS WRONG HERE ! |
| 488 | |
| 489 | QMVCNT, 0000 |
| 490 | GNCHEK, 0000 |
| 491 | |
| 492 | TSCMSM, TAD QMVCNT /ADD # OF QUEEN MOVES & QUEEN MOVE REJECTS |
| 493 | CLL RAR /DIVIDE BY 2 |
| 494 | TAD QMVCNT |
| 495 | CLL RAR /AC WIL EQUAL 3/4 OF THE # OF QUEEN MOVES & REJECTS |
| 496 | CIA /SUBTRACT |
| 497 | TAD MOBMOD /FROM THE MOBILITY MODIFIER |
| 498 | TAD GNCNT /ADD "REAL" MOBILITY IN WITH THE MOBILITY MODIFIER |
| 499 | DCA MOBMOD |
| 500 | DCA BOGUS |
| 501 | TAD GNCNT /GET # OF MOVES GENERATED |
| 502 | SZA CLA /ANY? |
| 503 | JMP I GNMV /YES: RETURN |
| 504 | TAD GNCHEK /NO. ITS EITHER A CHECKMATE OR STALEMATE POSITION |
| 505 | SNA /WAS THE KING IN CHECK? |
| 506 | ISZ SMSW /NO. SET THE STALEMATE SWITCH |
| 507 | DCA CMSW /IF KING WAS IN CHECK (GNCHEK>=1) SET THE CHECKMATE SWITCH |
| 508 | JMP I GNMV /RETURN |
| 509 | |
| 510 | \fIFNZRO DEBUG< |
| 511 | /ROUTINE TO ALLOW THE TIMING OF THE "GNMV" SUBROUTINE |
| 512 | /CALLS IT 4000(OCTAL) TIMES, THEN HALTS |
| 513 | TIME, IPDL2 |
| 514 | IPDL1 |
| 515 | JMS GNWMV |
| 516 | ISZ .+2 |
| 517 | JMP .-4 |
| 518 | 4000 /# OF ITTERATIONS OF THE TIMING LOOP |
| 519 | HLT |
| 520 | > |
| 521 | |
| 522 | / SNO -- SKIP NO OVERFLOW |
| 523 | /PSEUDO-INSTRUCTION TO TEST FOR RANK OR FILE OVERFLOW. |
| 524 | /EFFECTIVLY SKIPS IF NO OVERFLOW. CALL WITH RANK OR FILE |
| 525 | /NUMBER IN AC. RETURN WITH NUMBER IN AC IF NO OVERFLOW, GARBAGE OTHERWISE |
| 526 | RFOFL, 0000 |
| 527 | SPA /LESS THAN ZERO? |
| 528 | JMP I RFOFL /YES. RETURN |
| 529 | RTR /SHIFT BIT 8 INTO LINK |
| 530 | RTR /IF IT'S SET OVERFLOW HAS OCCURED |
| 531 | SZL /GREATER THAN 7? |
| 532 | JMP I RFOFL /YES. RETURN (WITH A GARBLED ACCUMULATOR) |
| 533 | RTL |
| 534 | RTL /SHIFT THE WORD BACK TO NORMAL |
| 535 | ISZ RFOFL /INC RETURN ADDRESS |
| 536 | JMP I RFOFL /RETURN |
| 537 | PAGE |
| 538 | \f |
| 539 | /THIS ROUTINE GENERATES ALL THE MOVES OF A 'STRAIGHT LINE' MOVING |
| 540 | /PIECE. ITMP0 MUST BE PRESET TO THE ADDRESS-1 OF THE MOVE GENERATION |
| 541 | /DIRECTION LIST. LCNT MUST BE SET TO MINUS THE NUMBER OF 2-WORD |
| 542 | /ENTRIES IN THAT LIST |
| 543 | LINE, CLA |
| 544 | TAD I ITMP0 /GET THE VERTICAL DIRECTION |
| 545 | DCA DIR1 /SAVE IT |
| 546 | TAD I ITMP0 /GET THE HORIZINTAL DIRECTION |
| 547 | DCA DIR2 /SAVE THAT ALSO |
| 548 | TAD GN1 |
| 549 | DCA GN3 |
| 550 | TAD GN2 |
| 551 | DCA GN4 |
| 552 | LINEM, TAD GN3 /BUILD SQUARE RANK NUMBER |
| 553 | TAD DIR1 |
| 554 | SNO /IS THAT RANK REALY ON THE BOARD? |
| 555 | JMP XXOX /NO. IT DOES NOT EXIST |
| 556 | DCA GN3 |
| 557 | TAD DIR2 |
| 558 | TAD GN4 |
| 559 | JMS XYZ |
| 560 | JMP XXOX |
| 561 | TAD I CNTR1 /GET VALUE OF THE MOVING PIECE |
| 562 | JMS CLRFIX |
| 563 | TAD (-QUEEN |
| 564 | SNA CLA /ARE WE TESTING FOR A LEGAL QUEEN MOVE? |
| 565 | ISZ QMVCNT /YES. INC QUEEN MOVE COUNTER |
| 566 | TAD GNMSW |
| 567 | JMS I ZFNL /DO FINAL TEST FOR KING CHECK |
| 568 | JMP XOOO /MOVE ILLEGAL: KING IS IN CHECK |
| 569 | TAD I TOADR /GET VALUE OF THE 'TO' SQUARE |
| 570 | SZA CLA /IS THE MOVE A CAPTURE? |
| 571 | STL RAR /YES: SET CAPTURE BIT |
| 572 | DCA GNMDW |
| 573 | JMS GNSTR /PUSH THE MOVE INTO THE STACK |
| 574 | XOOO, TAD I TOADR /GET THE VALUE OF THE PIECE ON THE 'TO SQUARE' |
| 575 | SNA CLA /WAS THE MOVE A CAPTURE? |
| 576 | JMP LINEM /NO. COULD BE MORE MOVES IN THIS DIRECTION |
| 577 | XXOX, CLA /YES. NO MORE MOVES IN THIS DIRECTION |
| 578 | ISZ LCNT /DONE ALL DIRECTIONS? |
| 579 | JMP LINE /NO. TRY ANOTHER |
| 580 | JMP NXTSQR /YES. DONE WITH THIS PIECE. TRY NEXT |
| 581 | LCNT, 0000 |
| 582 | |
| 583 | /ROUTINE TO STORE THE MSW AND MDW IN THE PDL |
| 584 | GNSTR, 0000 |
| 585 | ISZ GNCNT /INC GENERATION COUNT |
| 586 | CLA |
| 587 | TAD BOGUS |
| 588 | SZA CLA /SHOULD THESE MOVES GO INTO PDL#2? |
| 589 | JMP I GNSTR /NO. DONT PUT ANY THERE! |
| 590 | TAD GNMSW /GET MSW |
| 591 | PUSH2 /PUSH IT INTO THE LIST |
| 592 | TAD GNMDW /GET THE MDW |
| 593 | PUSH2 /PUSH IT INTO LIST |
| 594 | JMP I GNSTR /RETURN |
| 595 | |
| 596 | /SUBROUTINE TO TEST IF THE 'TO' SQUARE IS OCCUPIED BY OWN PIECE |
| 597 | /IF NOT SKIP FOR RETURN AND BUILD MSW |
| 598 | XYZ, 0000 |
| 599 | SNO /DID IT GO OFF THE BOARD? |
| 600 | JMP I XYZ /YES: RETURN |
| 601 | DCA GN4 /NO: SAVE THIS HALF |
| 602 | JMS BLDTO /BUILD 'TO' ADDR |
| 603 | TAD I TOADR /GET VALUE OF THE 'TO' SQUARE |
| 604 | JMS CLRFIX |
| 605 | SMA SZA CLA /OCCUPIED BY OWN PIECE? |
| 606 | JMP I XYZ /YES: RETURN |
| 607 | JMS BLDMSW /NO: BUILD THE MSW |
| 608 | ISZ XYZ /INC RETURN ADDR |
| 609 | JMP I XYZ /RETURN |
| 610 | |
| 611 | GQM, CLA /GENERATE QUEEN MOVES |
| 612 | TAD [-10 /DO ALL DIRECTIONS |
| 613 | DCA LCNT |
| 614 | TAD (OTRX-1 /DIAGONAL AND ORTHOGONAL |
| 615 | DCA ITMP0 |
| 616 | JMP LINE |
| 617 | |
| 618 | GRM, CLA /GENERATE ROOK MOVES |
| 619 | TAD (-4 /DO ONLY HALF OF THE DIRECTIONS |
| 620 | DCA LCNT |
| 621 | TAD (OTR-1 /THE ORTHOGONAL ONES |
| 622 | DCA ITMP0 |
| 623 | JMP LINE |
| 624 | |
| 625 | GBM, CLA /GENERATE BISHOP MOVES |
| 626 | TAD (-4 /DO ONLY HALF OF THE DIRECTIONS |
| 627 | DCA LCNT |
| 628 | TAD (OTRX-1 /THE DIAGONAL ONES |
| 629 | DCA ITMP0 |
| 630 | JMP LINE |
| 631 | |
| 632 | /SUBROUTINE TO BUILD AN MSW. CALL WITH ADDRESS OF THE 'TO SQUARE' IN LOCATION |
| 633 | /'TOADR', AND THE LOCATION OF THE 'FROM SQUARE IN LOCATION "CNTR1". RETURN WITH THE |
| 634 | /NEW MSW IN LOCATION 'GNMSW |
| 635 | BLDMSW, 0000 |
| 636 | CLA |
| 637 | TAD TOADR |
| 638 | AND [0077 /STRIP THE 'TO SQUARE' ADDRESS DOWN INTO 6BIT |
| 639 | DCA GNMSW /STORE IT TEMPORARILY |
| 640 | TAD CNTR1 |
| 641 | AND [0077 /DO THE SAME FOR THE 'FROM SQUARE' ADDRESS |
| 642 | RTL CLL /BUT INSTEAD OF STORING IT, ROTATE IT INTO BITS 0-5 |
| 643 | RTL |
| 644 | RTL |
| 645 | TAD GNMSW /NOW PACK THE 6BIT 'TO SQUARE' ADDRESS IN WITH IT |
| 646 | DCA GNMSW /STORE AWAY THE NEW MSW |
| 647 | JMP I BLDMSW /RETURN |
| 648 | |
| 649 | PUSHIT, 0000 /PUSH ROUTINE |
| 650 | DCA I PDLADR /PUT NEW ITEM ON TOP |
| 651 | ISZ PDLADR /PUSH |
| 652 | JMS OFLOW /TEST FOR LIST OVERLAP |
| 653 | JMP I PUSHIT /RETURN |
| 654 | |
| 655 | POPIT, 0000 /POP ROUTINE |
| 656 | CLA CMA |
| 657 | TAD PDLADR /MOVE LIST POINTER DOWN |
| 658 | SMA /MAKE SURE LIST DOESN'T GO WILD |
| 659 | HLT /IT DID! MANY EXTRA POPS |
| 660 | DCA PDLADR |
| 661 | TAD I PDLADR /GRAB THE TOP WORD |
| 662 | JMP I POPIT /RETURN WITH IT |
| 663 | |
| 664 | PUSH01, 0000 |
| 665 | DCA I PC01 /PUT NEW ITEM ON TOP |
| 666 | CMA |
| 667 | TAD PC01 |
| 668 | DCA PC01 /PUSH IT DOWN |
| 669 | JMS OFLOW /TEST FOR PDL OVERFLOW |
| 670 | JMP I PUSH01 /RETURN |
| 671 | |
| 672 | POP01, 0000 |
| 673 | ISZ PC01 /MOVE THE LIST POINTER DOWN |
| 674 | SKP CLA |
| 675 | HLT /LOTS OF EXTRA POPS |
| 676 | TAD I PC01 /GRAB THE WORD ON TOP |
| 677 | JMP I POP01 /RETURN WITH IT |
| 678 | |
| 679 | PAGE |
| 680 | \f/ROUTINE TO GENERATE ALL MOVES OF A KING OR KNIGHT |
| 681 | /CALLED WITH THE MOVE GENERATION LIST ADDRESS-1 IN AC |
| 682 | SNGMV, 0000 |
| 683 | DCA ITMP0 /STORE THE ADDRESS OF THE LIST |
| 684 | TAD [7770 |
| 685 | DCA SCNT /THERE ARE 8 DIRECTIONS |
| 686 | DCA GNMDW /INITIALIZE THE MDW |
| 687 | TAD GN1 |
| 688 | TAD I ITMP0 |
| 689 | SNO /OFF THE BOARD |
| 690 | JMP XXXO-1 /YES TRY ANOTHER DIRECTION |
| 691 | DCA GN3 |
| 692 | TAD GN2 |
| 693 | TAD I ITMP0 |
| 694 | JMS XYZ |
| 695 | JMP XXXO |
| 696 | TAD I CNTR1 /GET VALUE OF THE MOVING PIECE |
| 697 | JMS CLRFIX |
| 698 | TAD (-KING |
| 699 | SZA CLA /IS IT A KING? |
| 700 | JMP SNGKNT /NO: ITS A KNIGHT |
| 701 | TAD GNMSW /YES |
| 702 | JMS MMOVE /MAKE THE KING MOVE |
| 703 | TAD TOADR |
| 704 | DCA TEMP /TEST FOR AN ATTACK ON THE KINGS NEW SQUARE |
| 705 | IAC /AND RETURN AFTER THE FIRST ATTACK IS FOUND |
| 706 | JMS CHKATK |
| 707 | JMS UMOVE /UNMAKE THE MOVE |
| 708 | TAD PCNT /NOW WORRY ABOUT LEGAL OR ILLEGAL |
| 709 | SNA CLA /WAS THE KING IN CHECK? |
| 710 | JMP SNGLGL /NO. MOVE IS LEGAL |
| 711 | ISZ KNGBLK /YES. INC BLOCKED KING MOVE COUNTER |
| 712 | JMP XXXO /GO TO THE ILLEGAL PLACE |
| 713 | SNGKNT, TAD GNMSW |
| 714 | JMS I ZFNL /DO FINAL CHECK |
| 715 | JMP XXXO /KING IS ATTACKED: KNIGHT MOVE NO GOOD |
| 716 | SNGLGL, TAD I TOADR /GET VALUE OF THE 'TO' SQUARE |
| 717 | SZA CLA /IS THE MOVE A CAPTURE? |
| 718 | CLA STL RAR /YES: SET CAPTURE BIT |
| 719 | TAD GNMDW |
| 720 | DCA GNMDW /STORE MDW AGAIN |
| 721 | JMS GNSTR /PUSH MOVE INTO LIST |
| 722 | SKP |
| 723 | ISZ ITMP0 /FAILED ON FIRST LIST ELEMENT. PASS OVER SECOND |
| 724 | XXXO, CLA |
| 725 | ISZ SCNT /TESTED ALL DIRECTIONS? |
| 726 | JMP SNGMV+4 /NO. TRY THE NEXT ONE |
| 727 | JMP I SNGMV /YES. RETURN |
| 728 | |
| 729 | SCNT, 0000 /DIRECTION COUNTER |
| 730 | |
| 731 | |
| 732 | GPM, CLA /GENERATE THE MOVES OF A PAWN |
| 733 | DCA GNMDW |
| 734 | TAD GN2 |
| 735 | DCA GN4 |
| 736 | TAD GN1 |
| 737 | JMS PST |
| 738 | JMP GPM1 /MOVING 1 FORWARD BLOCKED: FORGET 2 |
| 739 | TAD GN1 /MOVING 1 FORWARD IS NOT BLOCKED. NOW TEST FOR 2 |
| 740 | TAD FSTRNK |
| 741 | SZA CLA |
| 742 | JMP GPM1 /NOT THIS PAWNS FIRST MOVE. CAN'T MOVE 2 |
| 743 | CLA STL RTR |
| 744 | DCA GNMDW /SETUP MDW TO INDICATE DOUBLE PAWN MOVE(TEMPORARY INDICATION) |
| 745 | TAD GN3 |
| 746 | JMS PST |
| 747 | NOP /MUST BE HERE CAUSE "PST" SUBROUTINE SOMETIMES RETURNS TO ADDRESS+2 OF THE CALLING JMS |
| 748 | GPM1, CLA /NOW TEST CAPTURES |
| 749 | TAD GN1 |
| 750 | TAD PONDIR |
| 751 | DCA GN3 |
| 752 | IAC |
| 753 | TAD GN2 |
| 754 | DCA GN4 |
| 755 | TAD GN4 |
| 756 | AND [7770 |
| 757 | SZA CLA /CAN IT CAPTURE TO THE HIGH SIDE? |
| 758 | JMP .+2 /NO. IT WAS ON THE EDGE OF THE HIGH SIDE |
| 759 | JMS CAPTST |
| 760 | CLA CMA |
| 761 | TAD GN2 |
| 762 | SPA /CAN IT CAPTURE TO THE LOW SIDE? |
| 763 | JMP .+3 /NO. IT WAS ON THE LOW EDGE |
| 764 | DCA GN4 |
| 765 | JMS CAPTST |
| 766 | JMP NXTSQR |
| 767 | \f/FOLLOWING ARE THE MOVE GENERATION DIRECTION LISTS |
| 768 | OTRX, 1 /BISHOP MOVE DIRECTION LIST |
| 769 | -1 |
| 770 | |
| 771 | 1 |
| 772 | 1 |
| 773 | |
| 774 | -1 |
| 775 | -1 |
| 776 | |
| 777 | -1 |
| 778 | 1 |
| 779 | |
| 780 | OTR, 1 /ROOK MOVE DIRECTION LIST |
| 781 | 0 |
| 782 | |
| 783 | 0 |
| 784 | -1 |
| 785 | |
| 786 | 0 |
| 787 | 1 |
| 788 | |
| 789 | -1 |
| 790 | 0 |
| 791 | |
| 792 | KNLST, 2 /KNIGHT MOVE DIRECTION LIST |
| 793 | -1 |
| 794 | |
| 795 | 2 |
| 796 | 1 |
| 797 | |
| 798 | 1 |
| 799 | 2 |
| 800 | |
| 801 | -1 |
| 802 | 2 |
| 803 | |
| 804 | -2 |
| 805 | 1 |
| 806 | |
| 807 | -2 |
| 808 | -1 |
| 809 | |
| 810 | -1 |
| 811 | -2 |
| 812 | |
| 813 | 1 |
| 814 | -2 |
| 815 | |
| 816 | PAGE |
| 817 | \f/GENERATE KING MOVES |
| 818 | GKM, 0000 |
| 819 | /FIRST TRY CASTLING |
| 820 | IAC CLA /SETUP MDW TO INDICATE CASTLING |
| 821 | DCA GNMDW |
| 822 | TAD PONDIR /BUILD THE ADDRESS OF THE KINGS ORIGINAL SQUARE |
| 823 | AND (0070 |
| 824 | TAD (BOARD+4/KING IS ON FILE E |
| 825 | DCA TEMP /STORE THE ADDRESS OF THE KINGS ORIGINAL SQUARE |
| 826 | TAD I TEMP /GET THE VALUE OF THE PIECE ON IT |
| 827 | JMS CLRFIX |
| 828 | TAD (-KING |
| 829 | SNA CLA /IS IT A KING? |
| 830 | JMP GKM2 /YES |
| 831 | TAD I CPSW /NO. MAKE 'CPSW' REFLECT THIS |
| 832 | AND [0007 /SAVE BITS 9-11 IN CASE HE IS CASTLED |
| 833 | TAD (3000 /SET THE "NO MORE CASTLING" BITS |
| 834 | DCA I CPSW /NO MORE CASTLING |
| 835 | JMP GKM1 /BUT NORMAL KING MOVES ARE OK. GENERATE THEM NOW |
| 836 | GKM2, TAD TEMP /CHANGE 'TEMP' TO EQUAL THE ADDRESS OF THE QUEENS ROOK |
| 837 | AND [7770 /BY CHANGING THE FILE TO A |
| 838 | DCA TEMP /STORE ADDRESS OF QUEENS ROOK |
| 839 | TAD I CPSW |
| 840 | RTL /MOVE 'QUEEN ROOK BIT' INTO AC0 |
| 841 | SPA CLA /IF ITS SET THE QUEENS ROOK HAS MOVED |
| 842 | JMP CAKR /QUEENS ROOK HAS MOVED ALLREADY: TRY KING SIDE CASTLING |
| 843 | TAD I TEMP /GET VALUE OF PIECE ON A1(A8) |
| 844 | JMS CLRFIX |
| 845 | TAD (-ROOK |
| 846 | SNA CLA /IS IT A ROOK? |
| 847 | JMP .+5 /YES. CONTINUE |
| 848 | TAD (1000 /NO. 'QUEEN ROOK BIT' LIED |
| 849 | TAD I CPSW /CHANGE IT TO GIVE A TRUE INDICATION |
| 850 | DCA I CPSW /NO MARE CASTLING WITH THE QUEENS ROOK |
| 851 | JMP CAKR /AND TRY KING-SIDE CASTLING |
| 852 | TAD GNCHEK /FIND OUT IF THE KING IS IN CHECK |
| 853 | SZA CLA /IS THE KING IN CHECK |
| 854 | JMP CAKR /YES. GO SEE IF THE KINGS ROOK HAS MOVED |
| 855 | ISZ TEMP /NO. INC 'TEMP' SO THAT IT EQUALS THE ADDRESS OF B1(B8) |
| 856 | TAD I TEMP /GET THE VALUE OF THE SQUARE |
| 857 | SZA CLA /IS IT EMPTY? |
| 858 | JMP CAKR /NO. TRY KING-SIDE CASTLING |
| 859 | ISZ TEMP /INC 'TEMP' SO THAT IT EQUALS THE ADDRESS OF C1(C8) |
| 860 | TAD I TEMP /GET THE VALUE OF THE SQUARE |
| 861 | SZA CLA /IS IT EMPTY? |
| 862 | JMP CAKR /NO. TRY KING-SIDE CASTLING |
| 863 | JMS CHKATK /CHECK FOR AN ATTACK ON THAT SQUARE BY AN ENEMY PIECE |
| 864 | TAD PCNT /GET # OF ATTACKS |
| 865 | SZA CLA /ANY? |
| 866 | JMP CAKR /YES. Q-SIDE CASTLING ILLEGAL, TRY K-SIDE |
| 867 | ISZ TEMP /INC 'TEMP' TO EQUAL ADDRESS OF D1(D8) |
| 868 | TAD I TEMP /GET THE SQUARES VALUE |
| 869 | SZA CLA /IS IT OCCUPIED? |
| 870 | JMP CAKR /YES. TRY K-SIDE CASTLING INSTEAD |
| 871 | JMS CHKATK /CHECK FOR ATTACKS ON SQUARE D1(D8) |
| 872 | TAD PCNT /GET # OF ATTACKS |
| 873 | SZA CLA /ARE THERE ANY? |
| 874 | JMP CAKR /YES. TRY K-SIDE CASTLING |
| 875 | TAD PONDIR /NO. QUEEN SIDE CASTLING IS LEGAL!! |
| 876 | AND (7070 /BUILD AN MSW FOR QUEEN SIDE CASTLING |
| 877 | TAD (0402 |
| 878 | DCA GNMSW /STORE THE NEW MSW |
| 879 | JMS GNSTR /PUSH THE MOVE ONTO PDL2 |
| 880 | CAKR, CLA |
| 881 | TAD I CPSW /TRY TO GENERATE A KING SIDE CASTLING MOVE |
| 882 | RAL /MOVE 'KING ROOK BIT' OF THE PSW INTO AC0 |
| 883 | SPA CLA /IS IT SET? |
| 884 | JMP GKM1 /YES. KINGS ROOK HAS ALLREADY MOVED |
| 885 | TAD TEMP /NO. BUILD ADDRESS OF THE KINGS ROOK |
| 886 | AND [7770 |
| 887 | TAD [0007 |
| 888 | DCA TEMP |
| 889 | TAD I TEMP /GET THE VALUE OF THE PIECE ON H1(H8) |
| 890 | JMS CLRFIX |
| 891 | TAD (-ROOK |
| 892 | SNA CLA /IS IT A ROOK? |
| 893 | JMP .+5 /YES CONTINUE |
| 894 | CLA STL RTR /NO. 'KING ROOK BIT' LIED: FIX IT |
| 895 | TAD I CPSW |
| 896 | DCA I CPSW |
| 897 | JMP GKM1 /GO TRY PROPER STYLE KING MOVES |
| 898 | TAD GNCHEK /TEST FOR KING IN CHECK |
| 899 | SZA CLA /IS THEKING IN CHECK? |
| 900 | JMP GKM1 /YES. GO TRY REGULAR STYLE KING MOVES |
| 901 | TAD TEMP /NO. CONTINUE TRYING FOR KING SIDE CASTLING |
| 902 | TAD (-2 |
| 903 | DCA TEMP /SET 'TEMP' = THE ADDRESS OF SQUARE E1(E8) |
| 904 | JMS CAKR1 /TEST TO SEE IF THE SQUARE IS OCUPIED OR ATTACKED |
| 905 | ISZ TEMP /NO. INC 'TEMP' TO EQUAL THE ADDRESS OF F1(F8) |
| 906 | JMS CAKR1 /TEST THE SQUARE FOR OCCUPATION OR ATTACKS |
| 907 | TAD PONDIR /NO. BUILD AN MSW CAUSE KING SIDE CASTLING IS LEGAL!! |
| 908 | AND (7070 |
| 909 | TAD (0406 |
| 910 | DCA GNMSW |
| 911 | ISZ GNMDW /INC MDW SO THAT IT INDICATES KING SIDE CASTLING |
| 912 | JMS GNSTR /STORE THE MOVE IN PDL2 |
| 913 | GKM1, CLA |
| 914 | TAD (OTRX-1 /NOW GENERATE 'NORMAL' KING MOVES |
| 915 | JMS SNGMV |
| 916 | JMP I GKM /RETURN |
| 917 | |
| 918 | \fCAKR1, 0000 |
| 919 | TAD I TEMP /GET THE VALUE OF THE SQUARE |
| 920 | SZA CLA /IS THERE A PIECE ON IT? |
| 921 | JMP GKM1 /YES. MOVE ON TO NORMAL KING MOVES |
| 922 | JMS CHKATK /NO. TEST FOR ATTACKS ON THAT SQUARE BY ENEMY PIECES |
| 923 | TAD PCNT /GET # OF ATTACKS |
| 924 | SZA CLA /ANY? |
| 925 | JMP GKM1 /YES. |
| 926 | JMP I CAKR1 /RETURN |
| 927 | |
| 928 | GNM, CLA /GENERATE KNIGHT MOVES |
| 929 | TAD (KNLST-1/GET ADDRESS OF THE KNIGHT MOVE GENERATION LIST |
| 930 | JMS SNGMV |
| 931 | JMP NXTSQR |
| 932 | PAGE |
| 933 | \f/SUBROUTINE TO BUILD A 'TO SQUARE' ADDRESS |
| 934 | /RETURN WITH ADDRESS IN LOC 'TOADR' |
| 935 | BLDTO, 0000 |
| 936 | TAD GN3 /GET RANK # AND ROTATE IT |
| 937 | RTL CLL /INTO ITS PROPER PLACE(BITS 6-8) |
| 938 | RAL |
| 939 | TAD GN4 /ADD IN THE FILE # |
| 940 | TAD [BOARD /ADD IN BOARD ADDRESS CONSTANT |
| 941 | DCA TOADR /STORE THE ADDRESS |
| 942 | JMP I BLDTO /RETURN |
| 943 | |
| 944 | |
| 945 | /SUBROUTINE TO FIX THE COLOR PROBLEM, AND ALLOW ANY SUBROUTINE |
| 946 | /TO WORK WITH BLACK PIECES AS WELL AS WHITE PIECES |
| 947 | CLRFIX, 0000 |
| 948 | COLR, HLT /=NOP FOR WHITE, =CIA FOR BLACK |
| 949 | JMP I CLRFIX /RETURN |
| 950 | \f/SUBROUTINE TO GENERATE 'EN PASSANT' PAWN CAPTURES |
| 951 | /IF PAWNS MYSTERYOUSLY CHANGE COLOR, THIS ROUTINE IS THE LIKLEY SUSPECT |
| 952 | GNEP, 0000 |
| 953 | CMA CLA /-1 TO THE AC |
| 954 | DCA CTNEED /ALWAYS TEST FOR KING IN CHECK |
| 955 | TAD LSTMV /GET SOME INFORMATION ON THE LAST MOVE MADE |
| 956 | AND (0770 /ISOLATE THE 'DOUBLE PAWN MOVE' INFO |
| 957 | SNA /WAS THE LAST MOVE MADE A DOUBLE PAWN MOVE? |
| 958 | JMP I GNEP /NO. 'EN PASSANT' CAPTURES ARE NOT POSIBLE. RETURN |
| 959 | RTR CLL /YES. ROTATE THE INFO(6BIT 'TO ADDRESS') INTO BITS 6-11 |
| 960 | RAR |
| 961 | TAD [BOARD /ADD IN BOARD ADDRESS CONSTANT |
| 962 | DCA CNTR1 /STORE THE ADDRESS OF THE CAPTURED PAWN |
| 963 | TAD CNTR1 |
| 964 | DCA GNEPTM /STORE THE ADDRESS OF THE CAPTURED PAWN |
| 965 | DCA I GNEPTM /TAKE THE PAWN OFF THE BOARD NOW FOR CONVIENIENCE |
| 966 | TAD CNTR1 /BUILD A 'TO RANK' THEN A 'TO ADDRESS' |
| 967 | RTR CLL /FIRST ROTATE THE OLD 'TO RANK' INTO BITS 9-11 |
| 968 | RAR |
| 969 | AND [0007 |
| 970 | TAD PONDIR /NEW 'TO RANK' IS 1 MOVE GREATER THAN THE OLD ONE |
| 971 | RTL CLL /ROTATE THE 'TO RANK' BACK INTO PLACE AGAIN |
| 972 | RAL |
| 973 | DCA GNMDW /STORE IT TEMPORARILY |
| 974 | TAD CNTR1 /GET THE ADDRESS OF THE PAWN BEING CAPTURED |
| 975 | AND (7707 /CLEAR OUT ROOM FOR THE NEW 'TO RANK' |
| 976 | TAD GNMDW /ADD THE NEW 'TO RANK' IN |
| 977 | DCA TOADR /STORE THE 'TO SQUARE' ADDRESS |
| 978 | TAD (4003 /4003 IS THE MDW REPRESENTING AN 'EN PASSANT' CAPTURE |
| 979 | DCA GNMDW /STORE THE NEW MDW |
| 980 | ISZ CNTR1 /TRY THE ADDJACENT FILE ON THE HIGH SIDE FIRST |
| 981 | TAD CNTR1 |
| 982 | AND [0007 |
| 983 | SNA CLA /IS THERE REALY A FILE ON THAT SIDE? |
| 984 | JMP GNOTF /NO. TRY THE OTHER SIDE |
| 985 | TAD I CNTR1 /GET THE VALUE OF THE PIECE ON THE SQUARE |
| 986 | JMS CLRFIX |
| 987 | TAD [-PAWN |
| 988 | SZA CLA /IS IT A PAWN? |
| 989 | JMP GNOTF /NO. TRY THE OTHER ADDJACENT FILE |
| 990 | JMS BLDMSW /YES. MOVE SEEMS OK. BUILD AN MSW FOR IT |
| 991 | TAD GNMSW /LOAD THE MSW INTO THE AC |
| 992 | JMS I ZTSTCH /TEST IF THE MOVE IS ILLEGAL BY VIRTUE OF KING IN CHECK |
| 993 | SKP /IT IS ILLEGAL DONT STORE IT IN THE PUSH DOWN LIST |
| 994 | JMS GNSTR /MOVE IS LEGAL STORE IT IN PDL2 |
| 995 | GNOTF, CLA |
| 996 | TAD CNTR1 /GET THE 'FROM SQUARE ADDRESS' |
| 997 | TAD (-2 /CHANGE IT TO POINT TO THE ADDJACENT FILE ON THE OTHER SIDE |
| 998 | DCA CNTR1 |
| 999 | TAD GNEPTM /NOW TEST IF THAT FILE REALY EXISTS |
| 1000 | AND [0007 /IF THE FILE IS 0 WE'RE ON THE EDGE |
| 1001 | SNA CLA /DOES THE FILE REALY EXIST, OR IS THE PAWN ON THE EDGE OF THE BOARD |
| 1002 | JMP GNEPDN /DOES NOT EXIST! |
| 1003 | TAD I CNTR1 /GET THE VALUE OF THE PIECE ON THAT SQUARE |
| 1004 | JMS CLRFIX |
| 1005 | TAD [-PAWN |
| 1006 | SZA CLA /IS IT A PAWN? |
| 1007 | JMP GNEPDN /NO |
| 1008 | JMS BLDMSW /YES. BUILD AN MSW |
| 1009 | TAD GNMSW |
| 1010 | JMS I ZTSTCH /IS THE KING IN CHECK IF THAT MOVE IS MADE |
| 1011 | SKP /YES. DONT STORE THE MOVE IN THE PDL |
| 1012 | JMS GNSTR /NO. STORE THE MOVE IN PDL2 |
| 1013 | GNEPDN, TAD [-PAWN |
| 1014 | JMS CLRFIX |
| 1015 | DCA I GNEPTM /REPLACE THE PAWN THAT WAS REMOVED EARLIER |
| 1016 | JMP I GNEP /RETURN |
| 1017 | GNEPTM, 0000 /LOCATION FOR STORAGE OF THE CAPTURED PAWNS ADDRESS |
| 1018 | \f |
| 1019 | /SUBROUTINE TO MAP THE PIECES IF NECCESARY(IF DOMAP=-1). |
| 1020 | /MAP IS IN TWO PARTS, 1 FOR EACH COLOR |
| 1021 | /WHITE MAP STARTS AT LOC 7400. BLACK MAP STARTS AT LOC 7424. |
| 1022 | /MAP FORMAT-- 1 WORD PER PIECE, REPRESENTING THE ADDRESS OF THAT PIECE |
| 1023 | MAPEC, 0000 |
| 1024 | CLA CMA |
| 1025 | TAD [BOARD /SETUP BOARD ADDRESS |
| 1026 | DCA ITMP2 |
| 1027 | TAD DOMAP |
| 1028 | SNA CLA /IS A MAP REALY NECCESARY? |
| 1029 | JMP I MAPEC /NO. RETURN |
| 1030 | DCA DOMAP |
| 1031 | TAD (MAP-1 /YES. SETUP MAP OF WHITES PIECE ADDRESSES |
| 1032 | DCA ITMP0 |
| 1033 | TAD (MAP+23 /SETUP MAP OF BLACK PIECE ADDRESSES |
| 1034 | DCA ITMP1 |
| 1035 | TAD (-100 /SETUP COUNT FOR 100(OCTAL) SQUARES ON THE BOARD |
| 1036 | DCA TEMP4 |
| 1037 | TAD I ITMP2 /GET VALUE OF THE PIECE ON THE SQUARE |
| 1038 | SZA /IS SQUARE OCCUPIED? |
| 1039 | JMP MAPOC /YES |
| 1040 | MAPGO, ISZ TEMP4 /FINISHED BOARD YET? |
| 1041 | JMP .-4 /NO. DO MORE SQUARES |
| 1042 | DCA I ITMP0 /YES. PUT A 0000 AT THE END OF THE WHITE MAP |
| 1043 | DCA I ITMP1 /ALSO AT THE END OF THE BLACK MAP |
| 1044 | JMP I MAPEC /RETURN |
| 1045 | MAPOC, SPA /IS IT WHITE OR BLACK? |
| 1046 | JMP MAPOCB /ITS BLACK |
| 1047 | TAD (-KING /ITS WHITE. IS IT A KING? |
| 1048 | SZA CLA |
| 1049 | JMP .+3 /NO |
| 1050 | TAD ITMP2 /YES |
| 1051 | DCA WKING /STORE ADDRESS OF THE WHITE KING |
| 1052 | TAD ITMP2 |
| 1053 | DCA I ITMP0 /PUT IT IN THE WHITE MAP WHATEVER IT IS |
| 1054 | JMP MAPGO |
| 1055 | MAPOCB, TAD (KING /IS IT THE BLACK KING? |
| 1056 | SZA CLA |
| 1057 | JMP .+3 /NO. PROCEDE NORMALY |
| 1058 | TAD ITMP2 /YES, GET ITS ADDRESS |
| 1059 | DCA BKING /STORE IT |
| 1060 | TAD ITMP2 /GET THE ADDRESS |
| 1061 | DCA I ITMP1 /EITHER WAY, PUT IT IN THE BLACK MAP |
| 1062 | \f JMP MAPGO |
| 1063 | PAGE |
| 1064 | \f/SUBROUTINE TO CHECK FOR A 'DOUBLE PAWN MOVE', AND MODIFY THE |
| 1065 | /MDW IF IT IS. ALSO TEST IF A LEGAL PAWN MOVE IS ALSO A PROMOTING MOVE |
| 1066 | /APPROPRIATE ACTION IS TAKEN IF IT IS. IN ANY CASE THIS ROUTINE CALLS |
| 1067 | /'GNSTR' TO STORE MSW & MDW IN PDL2 |
| 1068 | PROMCK, 0000 |
| 1069 | CLA |
| 1070 | TAD GNMDW /GET THE MOVE DATA WORD |
| 1071 | RTL /ROTATE AC BIT 1 INTO THE LINK |
| 1072 | SZL CLA /DOES IT SAY 'DOUBLE PAWN MOVE'? |
| 1073 | JMP PROM1 /YES. SET THE MDW TO SHOW IT |
| 1074 | TAD GN3 /BUILD THE RANK OF THE PAWN, IF IT WERE TO BE |
| 1075 | TAD PONDIR /MOVED ONE MORE TIME |
| 1076 | SNO /IS IT STILL ON THE BOARD? |
| 1077 | SKP CLA /NO: IT'S A PROMOTIMG MOVE |
| 1078 | JMP PPLSTR /YES: IT'S NOT A PROMOTING MOVE |
| 1079 | TAD GNMDW |
| 1080 | TAD [0004 /SET 'PAWN PROMOTION BIT' (BIT 9) OF THE MDW |
| 1081 | DCA GNMDW |
| 1082 | JMS GNSTR /STORE PROMOTION TO KNIGHT MOVE IN PDL2 |
| 1083 | ISZ GNMDW /CHANGE MDW TO INDICATE PROMOTION TO A BISHOP |
| 1084 | JMS GNSTR /STORE MOVE IN PDL2 |
| 1085 | ISZ GNMDW /CHANGE MDW TO INDICATE PROMOTION TO A ROOK |
| 1086 | JMS GNSTR /STORE MOVE IN PDL2 |
| 1087 | ISZ GNMDW /CHANGE THE MDW TO INDICATE PROMOTION TO A QUEEN |
| 1088 | PPLSTR, JMS GNSTR /STORE MOVE IN PDL2 |
| 1089 | JMP I PROMCK /RETURN |
| 1090 | PROM1, CLL RTR /CLEAR LINK(BIT 1)AND REROTATE THE MDW BACK INTO POSITION |
| 1091 | DCA GNMDW /RESTORE THE MDW |
| 1092 | TAD GNMSW /NOW GET THE MSW |
| 1093 | AND [0077 /EXTRACT 'TO SQUARE' INFO |
| 1094 | RTL CLL /ROTATE THE INFO SO THAT IT FITS IN MDW BITS 3-8 |
| 1095 | RAL |
| 1096 | TAD GNMDW /ADD IT TO THE MDW |
| 1097 | DCA GNMDW /THERES THE NEW MDW!!! |
| 1098 | JMP PPLSTR /IF THE PAWN MOVE A DOUBLE MOVE, IT WASN'T QUEENING |
| 1099 | |
| 1100 | /SUBROUTINE TO CHECK FOR LEGAL PAWN CAPTURES |
| 1101 | CAPTST, 0000 |
| 1102 | JMS BLDTO /BUILD THE ADDRESS OF THE 'TO' SQUARE |
| 1103 | TAD I TOADR /GET THE VALUE OF THE SQUARE |
| 1104 | JMS CLRFIX |
| 1105 | SMA CLA /IS IT AN ENEMY PIECE? |
| 1106 | JMP I CAPTST /YES. CAN ONLY CAPTURE OPPOSING PIECES |
| 1107 | JMS BLDMSW /NO. CAPTURE SEEMS LEGAL. BUILD AN MSW |
| 1108 | CLA STL RAR /BUILD AN MDW WHICH INDICATES CASTLING |
| 1109 | DCA GNMDW |
| 1110 | TAD GNMSW /FINAL TEST FOR MOVE LEGALITY COMING UP |
| 1111 | JMS I ZFNL /IS KING IN CHECK? |
| 1112 | JMP I CAPTST /YES: MOVE ILLEGAL |
| 1113 | JMS PROMCK /NO: CHECK FOR PROMOTION |
| 1114 | JMP I CAPTST /RETURN |
| 1115 | |
| 1116 | \fPST, 0000 |
| 1117 | TAD PONDIR |
| 1118 | DCA GN3 |
| 1119 | JMS BLDTO /BUILD THE 'TO' ADDR |
| 1120 | TAD I TOADR /GET VALUE OF 'TO' SQUARE |
| 1121 | SZA CLA /IS THE SQUARE OCCUPIED? |
| 1122 | JMP I PST /YES, MOVE NO GOOD |
| 1123 | JMS BLDMSW /NO. PACK IT INTO 12 BITS. |
| 1124 | TAD GNMSW |
| 1125 | JMS I ZFNL /IS KING IN CHECK? |
| 1126 | SKP /YES: MOVE NO GOOD |
| 1127 | JMS PROMCK /MOVE IS LEGAL. CHECK FOR PAWN PROMOTION |
| 1128 | ISZ PST /INC RETURN ADDRESS IF "TO" SQUARE WAS NOT OCCUPIED |
| 1129 | JMP I PST |
| 1130 | |
| 1131 | /TEST FOR LEGAL KNIGHT CAPTURE: |
| 1132 | ISLNM, CLA CLL CMA |
| 1133 | RAL /AC WILL=-2 |
| 1134 | DCA TOOS |
| 1135 | TAD M1 /COMPARE RANKS |
| 1136 | CIA |
| 1137 | TAD M3 |
| 1138 | SMA |
| 1139 | CIA |
| 1140 | IAC |
| 1141 | SNA |
| 1142 | JMP .+5 |
| 1143 | IAC |
| 1144 | SZA CLA |
| 1145 | JMP BATAK |
| 1146 | ISZ TOOS |
| 1147 | TAD M2 |
| 1148 | CIA |
| 1149 | TAD M4 |
| 1150 | SMA |
| 1151 | CIA |
| 1152 | IAC |
| 1153 | SNA |
| 1154 | JMP .+5 |
| 1155 | IAC |
| 1156 | SZA CLA |
| 1157 | JMP BATAK |
| 1158 | ISZ TOOS |
| 1159 | SKP |
| 1160 | JMP BATAK |
| 1161 | ISZ TOOS |
| 1162 | JMP BATAK |
| 1163 | JMP GATAK |
| 1164 | TOOS, 0000 |
| 1165 | \f |
| 1166 | PDLIN, 0000 /INITIALIZE THE LIST |
| 1167 | CLA |
| 1168 | TAD (PDLS |
| 1169 | DCA PDLADR /INITIALIZE LIST ADDRESS |
| 1170 | JMP I PDLIN /RETURN |
| 1171 | |
| 1172 | \fIPDL01, 0000 /INITIALIZE PUSH DOWN LIST #1 |
| 1173 | CLA |
| 1174 | TAD (PDLS+777 |
| 1175 | DCA PC01 |
| 1176 | JMP I IPDL01 /RETURN |
| 1177 | |
| 1178 | /SUBROUTINE TO TEST FOR PUSH DOWN LIST OVERFLOW |
| 1179 | OFLOW, 0000 |
| 1180 | TAD PC01 /GET ADDR OF BOTTOM PDL#1 |
| 1181 | CIA /COMPARE IT WITH |
| 1182 | TAD PDLADR /THE ADDR OF BOTTOM PDL#2 |
| 1183 | SZA CLA /ARE THEY THE SAME? |
| 1184 | JMP I OFLOW /NO. RETURN. |
| 1185 | /PUSH DOWN LIST HAS OVERFLOWED!!!!! |
| 1186 | IFNZRO LPTREE< |
| 1187 | TAD (OUT |
| 1188 | DCA ZOUT /MAKE SURE OUTPUT GOES TO THE TTY |
| 1189 | > |
| 1190 | PRINTO; MESG26 /PRINT "I RESIGN" |
| 1191 | JMS I ZCRLF |
| 1192 | HLT |
| 1193 | MESG26, TEXT \I RESIGN\ |
| 1194 | |
| 1195 | PAGE |
| 1196 | \f |
| 1197 | /CHECK FOR LEGAL KING MOVE |
| 1198 | ISLKM, CLA |
| 1199 | TAD M1 |
| 1200 | CIA |
| 1201 | TAD M3 |
| 1202 | SMA |
| 1203 | CIA |
| 1204 | SZA |
| 1205 | IAC |
| 1206 | SZA CLA |
| 1207 | JMP BATAK |
| 1208 | TAD M2 |
| 1209 | CIA |
| 1210 | TAD M4 |
| 1211 | SMA |
| 1212 | CIA |
| 1213 | SZA |
| 1214 | IAC |
| 1215 | SNA CLA |
| 1216 | JMP GATAK |
| 1217 | JMP BATAK |
| 1218 | |
| 1219 | /ROUTINE TO CHECK FOR PIECES IN THE MOVE ROW |
| 1220 | ROW, 0000 |
| 1221 | CLA |
| 1222 | TAD M1 |
| 1223 | CIA |
| 1224 | TAD M3 |
| 1225 | RAL CLL /GET THE SIGN |
| 1226 | SZA CLA |
| 1227 | TAD (10 |
| 1228 | SZL |
| 1229 | CIA |
| 1230 | DCA TEMP3 |
| 1231 | TAD M4 |
| 1232 | CIA |
| 1233 | TAD M2 |
| 1234 | RAL CLL /GET THE SIGN |
| 1235 | SZA CLA |
| 1236 | IAC |
| 1237 | SNL |
| 1238 | CIA |
| 1239 | TAD TEMP3 |
| 1240 | DCA TMP |
| 1241 | TAD TMATK /GET THE SQUARE OF THE ATTACKER |
| 1242 | DCA TEMP3 /COPY IT SO WE DONT HAVE TO DESTROY THE ORIGINAL |
| 1243 | MIDLIN, TAD TEMP3 /SET TO NEXT SQUARE |
| 1244 | TAD TMP |
| 1245 | DCA TEMP3 |
| 1246 | TAD TEMP3 /COMPARE IT WITH THE ATTACKED SQUARE |
| 1247 | CIA |
| 1248 | TAD TEMP |
| 1249 | SNA CLA /ARE THEY THE SAME? |
| 1250 | JMP I ROW /YES RETURN |
| 1251 | TAD I TEMP3 /NO. GET THE VALUE OF THE PIECE ON THE SQUARE |
| 1252 | SNA CLA /IS THE SQUARE EMPTY? |
| 1253 | JMP MIDLIN /YES- KEEP GOING UNTIL WE FIND ONE THAT ISN'T |
| 1254 | ISZ ROW /NO. ITS NOT A LEGAL ATTACK--INC RETURN ADDRESS |
| 1255 | JMP I ROW /RETURN |
| 1256 | |
| 1257 | /CHECK FOR LEGAL BISHOP MOVE |
| 1258 | SUBR1, 0000 |
| 1259 | CLA |
| 1260 | TAD M1 |
| 1261 | CIA |
| 1262 | TAD M3 |
| 1263 | SMA |
| 1264 | CIA |
| 1265 | DCA TEMP3 |
| 1266 | TAD M2 |
| 1267 | CIA |
| 1268 | TAD M4 |
| 1269 | SPA |
| 1270 | CIA |
| 1271 | TAD TEMP3 |
| 1272 | SZA CLA /ARE BOTH SQUARES ON THE SAME DIAGONAL? |
| 1273 | JMP I SUBR1 /NO |
| 1274 | JMS ROW /YES. FIND OUT IF ANY PIECES ARE BLOCKING THAT DIAGONAL |
| 1275 | ISZ SUBR1 /NONE FOUND -- INC RETURN ADDRESS |
| 1276 | JMP I SUBR1 /RETURN |
| 1277 | |
| 1278 | /CHECK FOR LEGAL ROOK MOVE |
| 1279 | SUBR2, 0000 |
| 1280 | CLA |
| 1281 | TAD M1 |
| 1282 | CIA |
| 1283 | TAD M3 |
| 1284 | SNA CLA |
| 1285 | JMP .+6 /SAME RANK. FORGET FILE |
| 1286 | TAD M2 |
| 1287 | CIA |
| 1288 | TAD M4 |
| 1289 | SZA CLA |
| 1290 | JMP I SUBR2 /BOTH RANK AND FILE CHANGED?! |
| 1291 | JMS ROW |
| 1292 | ISZ SUBR2 /NO PIECES IN THE WAY-- INC RETURN ADDRESS |
| 1293 | JMP I SUBR2 |
| 1294 | |
| 1295 | /CHECK FOR LEGAL QUEEN MOVE |
| 1296 | /GO TO 'GATAK' IF IT IS |
| 1297 | ISLQM, JMS SUBR2 /CHECK FOR A QUEEN MOVE 'ROOK STYLE' |
| 1298 | SKP /NOT FOUND |
| 1299 | JMP GATAK /FOUND |
| 1300 | JMS SUBR1 /IF NOT CHECK FOR BISHOP STYLE QUEEN MOVE |
| 1301 | JMP BATAK /NIETHER ONE |
| 1302 | JMP GATAK /FOUND BISHOP STYLE QUEEN MOVE |
| 1303 | |
| 1304 | ISLBM, CLA |
| 1305 | JMS SUBR1 |
| 1306 | JMP BATAK |
| 1307 | JMP GATAK |
| 1308 | |
| 1309 | ISLRM, CLA |
| 1310 | JMS SUBR2 |
| 1311 | JMP BATAK |
| 1312 | JMP GATAK |
| 1313 | |
| 1314 | PAGE |
| 1315 | |
| 1316 | \f |
| 1317 | /SUBROUTINE TO TEST IF A SQUARE IS ATTACKED BY A PIECE. |
| 1318 | /ALSO FINDS OUT HOW MANY ATTACKERS, AND THE VALUE OF THE LEAST VALUABLE ATTACKER |
| 1319 | /CALL WITH ADDRESS OF SQUARE TO BE TESTED IN LOCATION 'TEMP' |
| 1320 | /ALSO PONDIR AND COLR SET IN REVERSE OF THE ATTACKERS |
| 1321 | /AND THE ATTACKERS PIECE LIST ADDRESS-1 IN LOC 'OMAP' |
| 1322 | /RETURNS WITH NUMBER OF ATTACKERS IN LOC. 'PCNT', THE ADDRESS |
| 1323 | /OF THE LEATST VALUABLE ATTACKER IN LOC "PSQR" AND VALUE OF THE LEAST |
| 1324 | /VALUABLE ATTACKER IN LOC. 'PVAL' |
| 1325 | /IF THE VALUE OF THE LEAST VALUABLE ATTACKER, AND THE # OF ATTACKERS |
| 1326 | /IS NOT IMPORTANT, CALL WITH AC NOT =0 |
| 1327 | /RETURN IN THIS CASE IS DIRECTLY AFTER THE FIRST ATTACK IS FOUND |
| 1328 | CHKATK, 0000 |
| 1329 | DCA CKMODE /SET RETURN MODE SWITCH |
| 1330 | CLA CMA |
| 1331 | DCA TMATK /INITIALIZE SWITCH ENABLING 1 LOOPBACK IN THE PAWN SECTION |
| 1332 | DCA PCNT /INITIALIZE PIECE COUNT |
| 1333 | DCA PVAL /INITIALIZE PIECE VALUE TO 0 |
| 1334 | DCA PSQR /INIT PIECE ADDRESS |
| 1335 | TAD TEMP /GET SQUARE TO BE CHECKED |
| 1336 | AND [0007 /EXTRACT THE FILE # |
| 1337 | DCA M4 /RECORD IT |
| 1338 | TAD TEMP /GET SQUARE ADDR AGAIN |
| 1339 | RTR CLL /ROTATE RIGHT 3 BITS SO THAT THE RANK CAN |
| 1340 | RAR /BE EXTRACTED IN A SIMILAR MANNER |
| 1341 | AND [0007 |
| 1342 | DCA M3 /STORE RANK # |
| 1343 | TAD PONDIR /CHECK FOR AN ATTACK BY A PAWN |
| 1344 | TAD M3 |
| 1345 | SNO /IMPOSIBLE RANK? |
| 1346 | JMP TAG1 /YES. FORGET PAWN ATTACKS |
| 1347 | DCA M1 /NO. SAVE THE RANK |
| 1348 | IAC CLA /NOW BUILD A FILE |
| 1349 | TAG0, TAD M4 |
| 1350 | SNO /IS THAT FILE REALY ON THE BOARD? |
| 1351 | JMP TAG3 /NO. |
| 1352 | RTR CLL /YES: PASTE TOGETHER THE ADDRESS OF THIS HYPOTHETICAL PAWN |
| 1353 | RAR |
| 1354 | TAD M1 |
| 1355 | RTL |
| 1356 | RAL |
| 1357 | TAD [BOARD /ADD IN BOARD ADDRESS CONSTANT |
| 1358 | DCA TEMP1 /VOLIA! STORE THE ADDRESS |
| 1359 | TAD I TEMP1 /GET THE VALUE OF THE PIECE AT THAT ADDR |
| 1360 | JMS CLRFIX |
| 1361 | TAD (PAWN |
| 1362 | SZA CLA /PER CHANCE A PAWN? |
| 1363 | JMP TAG3 /NO: TRY NEXT PIECE |
| 1364 | TAG2, ISZ PCNT /YES. ITS A PAWN ATTACK. INC PIECE COUNT |
| 1365 | TAD I TEMP1 /SET LOWEST VALUED ATTACKING PIECE VALUE = PAWN |
| 1366 | DCA PVAL |
| 1367 | TAD TEMP1 /ALSO SET THE ADDRESS OF THE LOWEST ATTACKING PIECE |
| 1368 | DCA PSQR /EQUAL TO THE ADDRESS OF THE PAWN |
| 1369 | TAD CKMODE /TEST FOR 'FAST RETURN' MODE |
| 1370 | SZA CLA |
| 1371 | JMP I CHKATK /RETURN NOW |
| 1372 | TAG3, ISZ TMATK /TESTED FOR PAWNS ON BOTH ADJACENT FILES? |
| 1373 | JMP TAG1 /YES |
| 1374 | CMA CLA /NO. LOOP BACK FOR THE OTHER FILE |
| 1375 | JMP TAG0 |
| 1376 | TMATK, 0000 |
| 1377 | CKMODE, 0000 |
| 1378 | TMATK1, 0000 |
| 1379 | TAG1, CLA |
| 1380 | TAD OMAP /GET ADDRESS-1 OF THE ATTACKERS PIECE MAP |
| 1381 | DCA TOMAK1 |
| 1382 | BATAK, ISZ TOMAK1 /INC THE PIECE TABLE ADDRESS |
| 1383 | TAD I TOMAK1 /GET THE ADDRESS OF THE PIECE |
| 1384 | SNA /IS IT REALY A PIECE, OR IS THE SQUARE BLANK? |
| 1385 | JMP I CHKATK /BLANK. TABLE EXAUSTED:RETURN |
| 1386 | DCA TMATK /NO. SOMTHINGS THERE. STORE ITS ADDRESS |
| 1387 | TAD TMATK /GET THE ATTACKERS SQR ADDR |
| 1388 | CIA |
| 1389 | TAD TEMP /COMPARE WITH THE ATTACKED SQUARS ADDRESS |
| 1390 | SNA CLA /ARE THEY THE SAME? |
| 1391 | JMP BATAK /YES.PIECES CANNOT ATTACK THEMSELVES |
| 1392 | TAD I TMATK |
| 1393 | JMS CLRFIX |
| 1394 | TAD (PAWN |
| 1395 | SNA CLA /IS IT A PAWN? |
| 1396 | JMP BATAK /YES, DONE PAWNS ALLREADY, TRY NEXT PIECE |
| 1397 | TAD TMATK /NO GET SQUARE ADDRESS |
| 1398 | AND [0007 /EXTRACT THE FILE |
| 1399 | DCA M2 /STORE IT |
| 1400 | TAD TMATK /GET ADDRESS AGAIN |
| 1401 | RTR /ROTATE RANK # INTO BITS 9-11 |
| 1402 | RAR |
| 1403 | AND [0007 /ISOLATE RANK INFO |
| 1404 | DCA M1 /STORE IT |
| 1405 | TAD I TMATK /GET THE VALUE OF THE PIECE AGAIN |
| 1406 | JMS CLRFIX |
| 1407 | TAD (ROOK /NOW IDENTIFY IT |
| 1408 | SNA /IS IT A ROOK? |
| 1409 | JMP ISLRM /YES |
| 1410 | TAD (-ROOK+BISHOP |
| 1411 | SNA /IS IT A BISHOP? |
| 1412 | JMP ISLBM /YES |
| 1413 | TAD (-BISHOP+KNIGHT |
| 1414 | SNA /IS IT A KNIGHT? |
| 1415 | JMP ISLNM /YES |
| 1416 | TAD (-KNIGHT+KING |
| 1417 | SNA /IS IT A KING? |
| 1418 | JMP ISLKM /YES |
| 1419 | TAD (-KING+QUEEN |
| 1420 | SNA CLA /IS IT A QUEEN? |
| 1421 | JMP ISLQM /YES |
| 1422 | JMP BATAK /NO? WHATEVER WAS THERE MUST HAVE MOVED! PLEASE TO IGNORE. |
| 1423 | |
| 1424 | \f/WE REACH HERE IF AN ATTACK ON THE SQUARE IN QUESTION IS FOUND |
| 1425 | GATAK, ISZ PCNT /INC ATTACK COUNTER |
| 1426 | TAD CKMODE /TEST FOR FAST RETURN |
| 1427 | SZA CLA /'FAST RETURN' MODE? |
| 1428 | JMP I CHKATK /YES. RETURN NOW |
| 1429 | CMA CLA |
| 1430 | TAD PCNT |
| 1431 | SNA CLA /IS THIS THE FIRST ATTACK FOUND? |
| 1432 | JMP TAG4 /YES. DONT COMPARE |
| 1433 | TAD I TMATK /NOW COMPARE THE VALUE OF THIS ATTACKING PIECE |
| 1434 | CIA /WITH THE LOWEST VALUED ATTACKER FOUND SO FAR |
| 1435 | TAD PVAL |
| 1436 | JMS CLRFIX |
| 1437 | SMA CLA /IS THE VALUE OF THIS PIECE LOWER? |
| 1438 | JMP BATAK /NO |
| 1439 | TAG4, TAD I TMATK /YES. REPLACE THE OLD VALUE WITH THIS ONE |
| 1440 | DCA PVAL |
| 1441 | TAD TMATK |
| 1442 | DCA PSQR |
| 1443 | JMP BATAK |
| 1444 | |
| 1445 | PAGE |
| 1446 | \f |
| 1447 | /TEST FOR KING IN CHECK BY MOVING A PIECE AND CALLING CHKATK |
| 1448 | /CALL WITH MSW IN AC, AND THE KINGS ADDRESS IN "CKING" |
| 1449 | /RETURN TO THE ADDRESS+1 OF THE CALLING JMS IF THE KING IS IN CHECK |
| 1450 | /RETURN TO THE ADDRESS+2 OF THE CALLING JMS IF THE KING IS NOT IN CHECK |
| 1451 | TSTCHK, 0000 |
| 1452 | DCA MMUMTM /STORE THE MSW FOR THE MOMENT |
| 1453 | TAD GNCHEK /GET # OF ATTACKS ON THE KING |
| 1454 | SZA CLA /WAS THE KING IN CHECK? |
| 1455 | JMP TSTCH1 /YES. DO A COMPLETE TEST FOR KING IN CHECK |
| 1456 | TAD CTNEED |
| 1457 | SPA /HAVE WE DETERMINED THAT A CHECK TEST IS NESCESARY? |
| 1458 | JMP TSTCH1 /YES. DO ONE |
| 1459 | SNA CLA /NO. HAVE WE DETERMINED THAT IT IS NOT? |
| 1460 | JMP TSTCH2 /YES. DONT DO ONE THEN |
| 1461 | DCA CTNEED /NO. DETERMINE THAT NOW |
| 1462 | TAD CKING |
| 1463 | DCA TEMP |
| 1464 | TAD CNTR1 |
| 1465 | DCA TMATK |
| 1466 | TAD TEMP |
| 1467 | RTR CLL |
| 1468 | RAR |
| 1469 | AND [0007 |
| 1470 | DCA M3 |
| 1471 | TAD TEMP |
| 1472 | AND [0007 |
| 1473 | DCA M4 |
| 1474 | TAD CNTR1 |
| 1475 | RTR CLL |
| 1476 | RAR |
| 1477 | AND [0007 |
| 1478 | DCA M1 |
| 1479 | TAD CNTR1 |
| 1480 | AND [0007 |
| 1481 | DCA M2 |
| 1482 | JMS SUBR1 |
| 1483 | SKP |
| 1484 | JMP TSTCH1 |
| 1485 | JMS SUBR2 |
| 1486 | JMP TSTCH2 |
| 1487 | TSTCH1, CLA CMA |
| 1488 | DCA CTNEED /SET CHECK TEST NEED SWITCH |
| 1489 | TAD MMUMTM /GET THE MSW BACK AGAIN |
| 1490 | JMS MMOVE |
| 1491 | TAD CKING /ADDRESS TO TEST FOR ATTACK |
| 1492 | DCA TEMP |
| 1493 | IAC /RETURN AFTER FIRST ATTACK IS FOUND |
| 1494 | JMS CHKATK |
| 1495 | JMS UMOVE /PUT THE PIECE BACK WHERE IT BELONGS |
| 1496 | TAD PCNT /GET # OF ATTACKS |
| 1497 | SNA /ANY? |
| 1498 | TSTCH2, ISZ TSTCHK /NO. INC RETURN ADDRESS |
| 1499 | SNA CLA /I'LL ASK AGAIN: WERE THERE ANY? |
| 1500 | JMP I TSTCHK /NO. RETURN |
| 1501 | TAD GNCHEK |
| 1502 | SZA CLA /WAS IT A CHECK REPLY? |
| 1503 | ISZ MOBMOD /TALLY ONE MORE ILLEGAL BY VIRTUE OF KING IN CHECK |
| 1504 | JMP I TSTCHK |
| 1505 | |
| 1506 | \f/SUBROUTINE TO MAKE A SIMPLE TYPE MOVE |
| 1507 | /CALL WITH MSW IN AC |
| 1508 | MMOVE, 0000 |
| 1509 | DCA MMUMT1 /STORE THE MSW |
| 1510 | TAD MMUMT1 |
| 1511 | JMS I ZSPLIT /SPLIT THE MSW UP INTO 'TO' AND 'FROM' SQUARE ADDRESSES |
| 1512 | TAD I TEMP1 /GET VALUE OF CAPTURED PIECE |
| 1513 | DCA MMUMTM /STORE IT |
| 1514 | TAD I TEMP2 /MOVE THE PIECE |
| 1515 | DCA I TEMP1 /ONTO ITS NEW SQR |
| 1516 | DCA I TEMP2 /CLEAR OUT OLD SQR |
| 1517 | JMP I MMOVE |
| 1518 | |
| 1519 | /SUBROUTINE TO UMMAKE SIMPLE TYPE MOVES |
| 1520 | /AS MADE BY THE MMOVE SUBROUTINE |
| 1521 | UMOVE, 0000 |
| 1522 | CLA |
| 1523 | TAD MMUMT1 /GET THE MSW |
| 1524 | JMS I ZSPLIT /SPLIT IT UP INTO 'TO' AND 'FROM' SQUARE ADDRESSES |
| 1525 | TAD I TEMP1 /GET VALUE OF THE PIECE BEING UNMOVED |
| 1526 | DCA I TEMP2 /PUT IT BACK ON ITS ORIGINAL SQUARE |
| 1527 | TAD MMUMTM |
| 1528 | DCA I TEMP1 /RESTORE CAPTURED PIECE |
| 1529 | JMP I UMOVE |
| 1530 | MMUMTM, 0000 |
| 1531 | MMUMT1, 0000 |
| 1532 | |
| 1533 | /SUBROUTINE TO GENERATE ALL MOVES FOR WHITE |
| 1534 | GNWMV, 0000 |
| 1535 | CMA CLA /SETUP FIRST RANK CONSTANT |
| 1536 | DCA FSTRNK |
| 1537 | JMS I ZMAPEC /MAP THE PIECES |
| 1538 | TAD (NOP /SETUP COLOR COMPLIMENTOR |
| 1539 | DCA COLR |
| 1540 | IAC /SETUP PAWN DIRECTION CONSTANT |
| 1541 | DCA PONDIR |
| 1542 | TAD WKING /SAVE THE ADDRESS OF THE WHITE KING |
| 1543 | DCA CKING |
| 1544 | TAD (MAP-1 /SETUP ADDRESS OF WHITE PIECE MAP |
| 1545 | DCA GMAP |
| 1546 | TAD (MAP+23 /SETUP ADDRESS OF BLACK PIECE MAP |
| 1547 | DCA OMAP |
| 1548 | TAD (WPSW /SETUP CURRENT PSW ADDRESS |
| 1549 | DCA CPSW |
| 1550 | JMS I ZGNMV /GENERATE THE MOVES |
| 1551 | JMP I GNWMV /RETURN |
| 1552 | \f |
| 1553 | |
| 1554 | /SUBROUTINE TO GENERATE ALL MOVES FOR BLACK |
| 1555 | GNBMV, 0000 |
| 1556 | CMA CLA /SETUP THE PAWN DIRECTION CONSTANT |
| 1557 | DCA PONDIR |
| 1558 | JMS I ZMAPEC /MAP THE PIECES |
| 1559 | TAD [CIA /SETUP COLOR COMPLIMENTOR |
| 1560 | DCA COLR |
| 1561 | TAD BKING /SAVE THE ADDRESS OF THE BLACK KING |
| 1562 | DCA CKING |
| 1563 | TAD (7772 /SETUP FIRST RANK CONSTANT |
| 1564 | DCA FSTRNK |
| 1565 | TAD (MAP+23 /SETUP ADDRESS OF BLACK PIECE MAP |
| 1566 | DCA GMAP |
| 1567 | TAD (MAP-1 /SETUP ADDRESS OF WHITE PIECE MAP |
| 1568 | DCA OMAP |
| 1569 | TAD (BPSW /SETUP POSITION STATUS WORD ADDRESS |
| 1570 | DCA CPSW |
| 1571 | JMS I ZGNMV /GENERATE THE MOVES |
| 1572 | JMP I GNBMV /RETURN |
| 1573 | |
| 1574 | PAGE |
| 1575 | \f |
| 1576 | /SUBROUTINE TO TEST FOR WHITE ATTACKS |
| 1577 | /CALL WITH ADDRESS OF THE SQUARE TO BE TESTED IN AC |
| 1578 | TSTWAT, 0000 |
| 1579 | DCA TEMP |
| 1580 | TAD [CIA |
| 1581 | DCA COLR |
| 1582 | CLA CMA |
| 1583 | DCA PONDIR |
| 1584 | TAD (MAP-1 /ADDRESS-1 OF MAP OF ATTACKING PIECES |
| 1585 | DCA OMAP |
| 1586 | JMS CHKATK /DO THE TEST |
| 1587 | JMP I TSTWAT /RETURN |
| 1588 | |
| 1589 | /SUBROUTINE TO TEST FOR BLACK ATTACKS ON ANY SQUARE |
| 1590 | /CALL WITH THE ADDRESS OF THE SQUARE TO BE TESTED IN AC |
| 1591 | TSTBAT, 0000 |
| 1592 | DCA TEMP /STORE ADDRESS OF SQUARE TO BE TESTED |
| 1593 | TAD (NOP |
| 1594 | DCA COLR |
| 1595 | CLA IAC |
| 1596 | DCA PONDIR |
| 1597 | TAD (MAP+23 /ADDRESS-1 OF THE BLACK PIECE MAP |
| 1598 | DCA OMAP |
| 1599 | JMS CHKATK /DO THE TEST |
| 1600 | JMP I TSTBAT /RETURN |
| 1601 | |
| 1602 | |
| 1603 | \f |
| 1604 | /SUBROUTINE TO MAKE A MOVE. CALLED WITH MSW IN LOCATION 'TOMAK1' |
| 1605 | /AND MDW IN LOCATION 'TOMAK2' |
| 1606 | MKMV, 0000 |
| 1607 | CLA CLL |
| 1608 | ISZ DOMAP /SET SWITCH INDICATING THAT A PIECE MAP IS NESSECARY |
| 1609 | IFNZRO DEBUG< |
| 1610 | JMS TSTBRD /TEST BOARD |
| 1611 | > |
| 1612 | TAD TOMAK1 |
| 1613 | PUSH1 /SAVE THE MSW |
| 1614 | TAD TOMAK1 /GET THE MSW |
| 1615 | JMS I ZSPLIT /SPLIT THE MSW UP INTO A 'TO' AND A 'FROM' ADDRESSES |
| 1616 | TAD TOMAK2 /MDW TO AC |
| 1617 | SMA CLA /IS THE MOVE A CAPTURE? |
| 1618 | JMP MKMV1 /NO. |
| 1619 | TAD I TEMP1 /YES. SAVE ITS VALUE IN |
| 1620 | PUSH1 /THE PUSH DOWN LIST |
| 1621 | TAD I TEMP1 /GET VAL OF CAPTURED PIECE |
| 1622 | CIA /SUBTRACT IT FROM THE |
| 1623 | TAD PW /TOTAL VALUE OF THE BOARD |
| 1624 | DCA PW |
| 1625 | MKMV1, TAD I TEMP2 /NOW PHYSICALY MOVE THE PIECE |
| 1626 | DCA I TEMP1 /ONTO ITS NEW SQUARE |
| 1627 | DCA I TEMP2 /REMOVE THE PIECE FROM ITS OLD SQUARE |
| 1628 | TAD WPSW /SAVE WHITES POSITION STATUS WORD |
| 1629 | PUSH1 |
| 1630 | TAD BPSW /SAVE BLACKS POSITION STATUS WORD |
| 1631 | PUSH1 |
| 1632 | TAD LSTMV |
| 1633 | PUSH1 /SAVE THE 'LSTMV' INFORMATION |
| 1634 | TAD TOMAK2 /INSTALL NEW INFORMATION ON THE LAST(THIS) MOVE MADE |
| 1635 | DCA LSTMV |
| 1636 | TAD TOMAK2 |
| 1637 | AND [0007 |
| 1638 | SNA /IS THIS ONE OF THE SPECIAL TYPES OF MOVES? |
| 1639 | JMP MKMVDN /NO. ALL DONE SO RETURN |
| 1640 | TAD (JMP .+2 /YES. BUILD A 'JMP' TO THE PROPER SPECIAL CASE HANDLER |
| 1641 | DCA .+1 |
| 1642 | HLT /PUT THE JUMP HERE |
| 1643 | /A JMP TO ONE OF THE FOLLOWING 7 INSTRUCTIONS WAS EXECUTED |
| 1644 | /BY THE PREVIOUS INSTRUCTION |
| 1645 | JMP MKQSC /MAKE A QUEEN SIDE CASTLING MOVE |
| 1646 | JMP MKKSC /MAKE A KING SIDE CASTLING MOVE |
| 1647 | JMP MKEP /EN PASANT |
| 1648 | TAD (KNIGHT-BISHOP /PROMOTING TO A KNIGHT |
| 1649 | TAD (BISHOP-ROOK /PROMOTING TO A BISHOP |
| 1650 | TAD (ROOK-QUEEN /PROMOTING TO A ROOK |
| 1651 | TAD (QUEEN /PROMOTE TO A QUEEN |
| 1652 | DCA TEMP3 /STORE ABS VALUE OF THE PROM PIECE |
| 1653 | TAD I TEMP1 /GET THE VALUE OF THE PROMOTEING PAWN |
| 1654 | CIA /SUBTRACT IT FROM THE |
| 1655 | TAD PW /TOTAL VALUE OF THE BOARD |
| 1656 | DCA PW |
| 1657 | TAD I TEMP1 /GET THE VAL OF THE MOVING PAWN |
| 1658 | RAL /LOAD THE SIGN INTO THE LINK |
| 1659 | CLA |
| 1660 | TAD TEMP3 /GET ABS VALUE OF PROM PIECE |
| 1661 | SZL /WAS THE PROMOTING PAWN BLACK? |
| 1662 | CIA /YES. MAKE THE PROMOTION PIECE BLACK ALSO |
| 1663 | DCA I TEMP1 /PLACE THE NEW PIECE ON THE BOARD |
| 1664 | TAD I TEMP1 /ADD THE VALUE OF THE NEW PIECE |
| 1665 | TAD PW /IN WITH THE TOTAL VALUE |
| 1666 | DCA PW |
| 1667 | JMP MKMVDN |
| 1668 | |
| 1669 | MKQSC, TAD TEMP1 /IT'S QUEENS SIDE CASTLING |
| 1670 | AND [7770 |
| 1671 | DCA TEMP2 /STORE THE ADDR OF QUEENS ROOK BEFORE CASTLING |
| 1672 | TAD TEMP2 |
| 1673 | TAD (3 |
| 1674 | DCA TEMP1 /STORE ADDRESS OF ROOKS NEW SQUARE |
| 1675 | MKCA1, TAD I TEMP2 /LOAD AC WITH VALUE OF THE ROOK |
| 1676 | DCA I TEMP1 /PUT THE ROOK DOWN ON ITS NEW SQR |
| 1677 | DCA I TEMP2 /REMOVE THE ROOK FROM ITS OLD SQR |
| 1678 | TAD I TEMP1 /GET COLOR OF CASTLING SIDE |
| 1679 | SPA /IS IT BLACK? |
| 1680 | ISZ BPSW /YES. SET BIT 11 OF HIS PSW |
| 1681 | SMA CLA /OR IS IT WHITE? |
| 1682 | ISZ WPSW /YES. SET BIT 11 OF HIS PSW |
| 1683 | JMP MKMVDN |
| 1684 | |
| 1685 | MKKSC, TAD TEMP1 /BUILD ADDRESS OF THE |
| 1686 | IAC /KINGS ROOK |
| 1687 | DCA TEMP2 /STORE THE ADDR OF KINGS ROOK BEFORE CASTLING |
| 1688 | TAD (-5 /BUILD THE ADDRESS OF THE ROOKS |
| 1689 | JMP MKCA1-3 /NEW SQUARE |
| 1690 | |
| 1691 | MKEP, TAD TEMP2 /IT'S AN 'EN PASSANT' CAPTURE |
| 1692 | AND [7770 /BUILD ADDRESS OF THE PAWN THAT WAS TAKEN |
| 1693 | DCA TEMP3 |
| 1694 | TAD TEMP1 |
| 1695 | AND [0007 |
| 1696 | TAD TEMP3 |
| 1697 | DCA TEMP3 |
| 1698 | TAD I TEMP3 /SUBTRACT THE PAWNS VALUE |
| 1699 | CIA /FROM THE TOTAL |
| 1700 | TAD PW |
| 1701 | DCA PW |
| 1702 | DCA I TEMP3 /REMOVE CAPTURED PAWN FROM THE BOARD |
| 1703 | MKMVDN, IFNZRO DEBUG < |
| 1704 | JMS TSTBRD /TEST BOARD VALUE |
| 1705 | > |
| 1706 | TAD WHOSE /NOW THAT THE MOVE IS MADE |
| 1707 | CMA /COMPLIMENT |
| 1708 | DCA WHOSE /THE "WHOSE MOVE" SWITCH |
| 1709 | JMP I MKMV /AND RETURN |
| 1710 | |
| 1711 | PAGE |
| 1712 | |
| 1713 | \f |
| 1714 | /SUBROUTINE TO UNMAKE A MOVE MADE BY THE 'MKMV' ROUTINE |
| 1715 | /LIKE THE 'MKMV' SUBROUTINE 'UNMV' IS COLOR INDEPENDENT- USES NO 'CLRFIX' |
| 1716 | UNMV, 0000 |
| 1717 | CLA CLL |
| 1718 | ISZ DOMAP /SET SWITCH FOR OBSOLETE PIECE MAP |
| 1719 | IFNZRO DEBUG< |
| 1720 | JMS TSTBRD /MAKE SURE BOARD VALUE IS OK |
| 1721 | > |
| 1722 | TAD LSTMV /GET THE MDW FOR THE LAST(THIS) MOVE MADE |
| 1723 | DCA TOMAK2 |
| 1724 | POP1 /GET THE OLD 'LSTMV' INFO |
| 1725 | DCA LSTMV /RESTORE IT |
| 1726 | POP1 /RESTORE BLACKS PSW |
| 1727 | DCA BPSW |
| 1728 | POP1 /RESTORE WHITES PSW |
| 1729 | DCA WPSW |
| 1730 | TAD TOMAK2 /GET THE MDW FOR THE MOVE |
| 1731 | SPA CLA /IS IT A CAPTURE? |
| 1732 | POP1 /YES. GET THE VALUE OF THE CAPTURED PIECE |
| 1733 | DCA TEMP3 /STORE IT |
| 1734 | POP1 /GET THE OLD MSW |
| 1735 | DCA TOMAK1 /STORE THE MSW |
| 1736 | TAD TOMAK1 /BACK AGAIN |
| 1737 | JMS I ZSPLIT /UNPACK THE MSW AND BUILD THE 'TO' AND 'FROM' ADDRESSES |
| 1738 | TAD I TEMP1 /GET THE MOVED PIECE AND |
| 1739 | IFNZRO DEBUG< |
| 1740 | SNA /IS IT STILL THERE? |
| 1741 | HLT /BUG!!! |
| 1742 | > |
| 1743 | DCA I TEMP2 /PUT IT BACK ON ITS OLD SQUARE |
| 1744 | TAD TEMP3 |
| 1745 | DCA I TEMP1 /RESTORE THE VALUE OF THE CAPTURED PIECE(OR EMPTY SQUARE) |
| 1746 | TAD TEMP3 /ADD VAL OF CAPTURED PIECE |
| 1747 | TAD PW /BACK IN WITH THE TOTAL |
| 1748 | DCA PW |
| 1749 | TAD TOMAK2 |
| 1750 | AND [0007 |
| 1751 | SNA /WAS THE MOVE A SPECIAL TYPE? |
| 1752 | JMP UNMVDN /NO. RETURN |
| 1753 | TAD (JMP .+2 |
| 1754 | DCA .+1 |
| 1755 | HLT /THE JUMP GOES HERE |
| 1756 | /A JUMP TO ONE OF THE FOLLOWING 7 LOCATIONS WAS |
| 1757 | /EXECUTED BY THE PREVIOUS INSTRUCTION |
| 1758 | JMP UNQSC /UNMAKE A QUEEN SIDE CASTLING MOVE |
| 1759 | JMP UNKSC /UNMAKE KING SIDE CASTLING MOVE |
| 1760 | JMP UNEP /UNMAKE AN EN PASSANT CAPTURE |
| 1761 | JMP UNQP |
| 1762 | JMP UNQP |
| 1763 | JMP UNQP |
| 1764 | UNQP, TAD I TEMP2 /PAWN PROM. MOVE |
| 1765 | CIA /SUBTRACT PROMOTION VALUE |
| 1766 | TAD PW /FROM THE TOTAL |
| 1767 | DCA PW |
| 1768 | TAD I TEMP2 /GET VALUE OF THE PROMOTION PIECE |
| 1769 | SMA CLA /WHICH COLOR IS MOVING? |
| 1770 | TAD (PAWN+PAWN /WHITE IS MOVING. |
| 1771 | TAD [-PAWN |
| 1772 | DCA I TEMP2 /RESTORE THE PROMOTION PIECE BACK TO A PAWN |
| 1773 | TAD I TEMP2 /ADD THE VAL OF THE PAWN |
| 1774 | TAD PW /IN WITH THE TOTAL VALUE |
| 1775 | DCA PW |
| 1776 | JMP UNMVDN |
| 1777 | |
| 1778 | UNKSC, TAD TEMP2 /BUILD ADDR OF ROOKS 'POST CASTLING' SQUARE |
| 1779 | IAC /BY ADDING +1 TO THE KINGS 'PRE CASTLING' SQUARE ADDRESS |
| 1780 | DCA TEMP2 /STORE IT |
| 1781 | UNKS1, TAD TEMP2 /BUILD ADDRESS OF THE ROOKS 'PRE CASTLING' SQUARE ADDR |
| 1782 | TAD (2 /BY ADDING +2 TO ITS 'POST-CASTLING' SQUARE ADDR |
| 1783 | DCA TEMP1 /STORE ROOKS PRE CASTLING SQUARE ADDRESS |
| 1784 | TAD I TEMP2 /GET THE ROOKS VALUE |
| 1785 | DCA I TEMP1 /PLACE THE ROOK BACK ON ITS 'PRE CASTLING' SQUARE |
| 1786 | DCA I TEMP2 /REMOVE IT FROM ITS 'POST CASTLING SQUARE' |
| 1787 | JMP UNMVDN |
| 1788 | |
| 1789 | UNQSC, TAD TEMP1 /BUILD THE ADDR OF THE ROOKS 'POST CASTLING SQUARE |
| 1790 | IAC /BY ADDING +1 TO THE KINGS 'POST CASTLING' SQUARE ADDRESS |
| 1791 | DCA TEMP2 /STORE IT |
| 1792 | TAD (-5 /BUILD THE ADDRESS OF THE ROOKS 'PRE CASTLING SQUARE' |
| 1793 | JMP UNKS1 /SAME AS KING SIDE EXCEPT OVER 5 FILES |
| 1794 | UNEP, TAD TEMP1 /BUILD THE ADDRESS OF THE CAPTURED PAWN |
| 1795 | AND [0007 /TAKE THE FILE OF THE 'TO SQUARE' |
| 1796 | DCA TEMP3 /STORE THE TO SQUARE' FILE # |
| 1797 | TAD TEMP2 /AND EVERYTHING BUT THE FILE # |
| 1798 | AND [7770 /FROM THE FROM SQUARE ADDRESS |
| 1799 | TAD TEMP3 /ADD THEN TOGEATHER |
| 1800 | DCA TEMP3 /STORE |
| 1801 | TAD I TEMP2 /GET THE VALUE OF THE CAAPTURING PAWN |
| 1802 | CIA /MAKE THE VALUE THAT OF AN OPOSITE COLORED PAWN |
| 1803 | DCA I TEMP3 /REPLACE THE PAWN THAT WAS TAKEN 'EN PASSANT' |
| 1804 | TAD I TEMP3 /ADD PAWNS VALUE |
| 1805 | TAD PW /IN WITH THE TOTAL |
| 1806 | DCA PW |
| 1807 | UNMVDN, IFNZRO DEBUG < |
| 1808 | JMS TSTBRD /VERIFY BOARD VALUE |
| 1809 | > |
| 1810 | TAD WHOSE /NOW THAT THE MOVE IS UNMADE |
| 1811 | CMA /COMPLIMENT |
| 1812 | DCA WHOSE /THE "WHOSE MOVE" SWITCH |
| 1813 | JMP I UNMV /RETURN |
| 1814 | |
| 1815 | \f/SUBROUTINE TO SPLIT A MSW UP LEAVING THE ADDRESS |
| 1816 | /OF THE 'TO' SQUARE IN LOC 'TEMP1' AND THE ADDRESS OF THE 'FROM' |
| 1817 | /SQUARE IN LOC. 'TEMP2'. CALL WITH MSW IN AC |
| 1818 | SPLIT, 0000 |
| 1819 | DCA TEMP1 |
| 1820 | TAD TEMP1 /FIRST BUILD THE 'FROM' SQUARE ADDRESS |
| 1821 | RTR CLL |
| 1822 | RTR |
| 1823 | RTR |
| 1824 | AND [0077 /MASK OUT THE GARBAGE IN BITS 0-5 |
| 1825 | TAD [BOARD /ADD IN BOARD ADDRESS CONSTANT |
| 1826 | DCA TEMP2 /STORE 'FROM' SQUARE ADDRESS |
| 1827 | TAD TEMP1 /NOW FOR THE 'TO' SQUARE. |
| 1828 | AND [0077 /MASK OUT BITS 0-5 |
| 1829 | TAD [BOARD /ADD IN BOARD ADDRESS CONSTANT |
| 1830 | DCA TEMP1 /STORE THE ADDRESS OF THE 'TO' SQUARE |
| 1831 | JMP I SPLIT /RETURN |
| 1832 | |
| 1833 | /SUBROUTINE TO RETURN THE PLY#-1 IN THE AC. |
| 1834 | /IF THE PLY # IS 8 OR GREATER, 7 IS RETURNED, AND THE LINK IS SET |
| 1835 | /IF PLY # <8 THE LINK IS RETURNED CLEAR |
| 1836 | PLYCHP, 0000 |
| 1837 | CLA STL |
| 1838 | TAD PLY /GET PLY # |
| 1839 | TAD [7770 /SUBTRACT 8 |
| 1840 | SMA /IS PLY # 8 OR GREATER ? |
| 1841 | CLA /YES. PRETEND IT WAS 8 |
| 1842 | TAD [0007 /RESTORE AC VALUE TO PLY#-1 |
| 1843 | JMP I PLYCHP /RETURN |
| 1844 | |
| 1845 | IFNZRO DEBUG < |
| 1846 | /SUBROUTINE TO GET AN OLD BOARD VALUE FROM PDL#1 AND COMPARE IT WITH THE CURRENT |
| 1847 | /BOARD VALUE. TO VERIFY THE "MKMV" AND "UNMV" SUBROUTINES |
| 1848 | TSTBRD, 0000 |
| 1849 | CLA |
| 1850 | TAD PW |
| 1851 | DCA TEMP1 |
| 1852 | JMS BRDVAL /GET CURRENT BOARD VALUE |
| 1853 | CIA |
| 1854 | TAD TEMP1 |
| 1855 | SZA CLA /ARE THEY THE SAME? |
| 1856 | HLT /NO. ERROR SOMEWHERE |
| 1857 | JMP I TSTBRD /ALL IS WELL |
| 1858 | > |
| 1859 | PAGE |
| 1860 | \f |
| 1861 | |
| 1862 | /SUBROUTINE TO COMPARE THE AC WITH LOCATION 'COMP' |
| 1863 | /RETURN NORMALY IF THEY ARE EQUAL |
| 1864 | /RETURN TO THE ADDRESS+2 OF THE JMS IF THE AC IS LARGER |
| 1865 | /RETURN TO THE ADDRESS+3 OF THE JMS IF 'COMP' IS LARGER |
| 1866 | COMPAR, 0000 |
| 1867 | CIA |
| 1868 | DCA COMPAC /STORE THE COMPLIMENT OF THE AC |
| 1869 | TAD COMPAC /COMPARE THE AC WITH 'COMP' |
| 1870 | TAD COMP |
| 1871 | SNA CLA /ARE THEY EQUAL? |
| 1872 | JMP I COMPAR /YES. RETURN NORMALY |
| 1873 | TAD COMPAC /NO. GET COMPLIMENT OF THE AC AGAIN |
| 1874 | SPA SNA CLA /WAS THE AC POSITIVE? |
| 1875 | JMP XXAP /YES. AC WAS POSITIVE |
| 1876 | TAD COMP /NEGATIVE |
| 1877 | SMA /IS 'COMP' POSITIVE? |
| 1878 | JMP XXCL /YES. 'COMP' IS LARGER ALSO |
| 1879 | TAD COMPAC /NO. BOTH ARE NEGATIVE |
| 1880 | SPA CLA /BUT WHICH IS THE LARGER? |
| 1881 | JMP XXAL /THE AC IS THE LARGER |
| 1882 | JMP XXCL /'COMP' IS THE LARGER |
| 1883 | XXAP, TAD COMP /THE AC WAS POSITIVE |
| 1884 | SPA /TEST 'COMP' FOR ITS SIGN |
| 1885 | JMP XXAL /'COMP' IS NEGATIVE, AND THEREFORE LARGER |
| 1886 | TAD COMPAC |
| 1887 | SMA CLA |
| 1888 | XXCL, ISZ COMPAR /'COMP' IS LARGER |
| 1889 | XXAL, ISZ COMPAR /AC IS LARGER |
| 1890 | CLA |
| 1891 | JMP I COMPAR /RETURN |
| 1892 | COMPAC, 0000 |
| 1893 | |
| 1894 | /SUBROUTINE TO TALLY UP THE VALUES OF ALL PIECES ON THE BOARD |
| 1895 | /STORE THE RESULT IN LOC "PW", AND IN THE AC ON RETURN |
| 1896 | BRDVAL, 0000 |
| 1897 | CLA |
| 1898 | TAD (-100 /INITIALIZE FOR 64 SQUARES |
| 1899 | DCA TEMP |
| 1900 | TAD (BOARD-1/ADDRESS-1 OF BOARD |
| 1901 | DCA ITMP1 /TO AUTO INDEX REG |
| 1902 | TAD I ITMP1 |
| 1903 | ISZ TEMP /DONE ALL SQUARES? |
| 1904 | JMP .-2 /NO DO ANNOTHER |
| 1905 | DCA PW /YES. STORE BOARD VALUE |
| 1906 | TAD PW /ALSO LOAD INTO AC |
| 1907 | JMP I BRDVAL /RETURN |
| 1908 | |
| 1909 | PRNCNT, 0000 |
| 1910 | |
| 1911 | \fEVAL, 0000 |
| 1912 | CLA |
| 1913 | IFNZRO RANVAL< |
| 1914 | TAD I RANDOM /INTRODUCE A RANDOM VARIATION INTO THIS EVALUATION |
| 1915 | AND (0001 /LET IT BE NO GREATER THAN +1 |
| 1916 | > |
| 1917 | DCA STRATG |
| 1918 | JMS BREV /DO A BACK RANK EVALUATION |
| 1919 | JMS COEV /DO A CENTER OCCUPATION EVALUATION |
| 1920 | JMS CASTEV /EVALUATE CASTLING STATUS |
| 1921 | TAD PW /ADD THE VALUE OF ALL PIECES ON THE BOARD |
| 1922 | TAD STRATG /ADD IN STRATEGICAL VALUE |
| 1923 | JMS LCLRFX /DO A COLOR FIX |
| 1924 | DCA STRATG /STORE |
| 1925 | JMS MOBGET /GET MOBILITY VALUE |
| 1926 | TAD STRATG /ADD IT IN WITH THE TOTAL |
| 1927 | DCA STRATG /STORE |
| 1928 | /UPCOMING IS A MINI ALPHA BETA PRUNER |
| 1929 | /SINCE THE "HIEP" PART OF THE EVALUATION IS TIME CONSUMING |
| 1930 | /AND IT ONLY SERVES TO MAKE THE EVALUATION RETURNED LESS |
| 1931 | /FAVORABLE FOR THE SIDE TO THAT JUST MOVED, IT IS BOTH |
| 1932 | /WISE AND PROFITABLE TO TRY SAVE TIME THIS WAY |
| 1933 | TAD STRATG |
| 1934 | JMS PLYFIX |
| 1935 | DCA COMP /LOAD SOFTWARE COMPARE REGISTER |
| 1936 | TAD UVAL1 |
| 1937 | JMS PLYFIX |
| 1938 | JMS COMPARE/COMPARE VALUES |
| 1939 | JMP EVAL2 /THEY ARE EQUAL. PRUNE |
| 1940 | JMP EVAL1 /"HIEP" EVALUATION IS NESSECARY |
| 1941 | JMP EVAL2 /NO "HIEP" NESSECARY(GOOD) |
| 1942 | EVAL1, JMS HIEP /GET THE CONTROVERSIAL VALUE |
| 1943 | JMS LCLRFX |
| 1944 | TAD STRATG |
| 1945 | JMP I EVAL /RETURN |
| 1946 | |
| 1947 | EVAL2, IFNZRO LPTREE< |
| 1948 | TAD ("_ /SIGNAL THAT A MINI-PRUNE WAS DONE |
| 1949 | JMS I ZOUT |
| 1950 | > |
| 1951 | TAD STRATG /GET VALUE |
| 1952 | JMP I EVAL /RETURN |
| 1953 | |
| 1954 | \f/SUBROUTINE TO GET THE MOBILITY VALUE FOR THIS POINT IN |
| 1955 | /THE ANALYSIS |
| 1956 | /RETURN WITH VALUE IN THE AC |
| 1957 | MOBGET, 0000 |
| 1958 | CLA |
| 1959 | TAD MOB0 |
| 1960 | SZA CLA /DO SE HAVE ANY RELIABLE INFORMATION AT HAND ALREADY? |
| 1961 | JMP MOBGE1 /YES. USE IT |
| 1962 | ISZ BOGUS /NO. GET SOME NOW |
| 1963 | TAD GNCNT /SAVE COUNTERS WE ARE ABOUT TO MODIFY |
| 1964 | PUSH1 |
| 1965 | TAD MOBMOD |
| 1966 | PUSH1 |
| 1967 | JMS GNBMV /DO A PSEUDO MOVE GENERATION |
| 1968 | TAD MOBMOD /GET MOBILITY VALUE FOR BLACK |
| 1969 | DCA MOBGTM /SAVE FOR THE MOMENT |
| 1970 | ISZ BOGUS |
| 1971 | JMS GNWMV /DO ANOTHER PSUEDO MOVE GENERATION |
| 1972 | TAD MOBGTM /SUBTRACT BLACKS MOBILITY VALUE |
| 1973 | CIA |
| 1974 | TAD MOBMOD /FROM WHITES |
| 1975 | JMS LCLRFX |
| 1976 | DCA MOBGTM /STORE VALUE FOR THE MOMENT |
| 1977 | POP1 /RESTORE THE COUNTERS THAT WE DESTROYED |
| 1978 | DCA MOBMOD |
| 1979 | POP1 |
| 1980 | DCA GNCNT |
| 1981 | TAD MOBGTM /GET VALUE BACK AGAIN |
| 1982 | JMP I MOBGET /RETURN |
| 1983 | MOBGE1, TAD MOBMOD /GET MOBILITY VALUE FOR THIS LEVEL |
| 1984 | SNA /IS THERE ONE FOR THIS LEVEL? |
| 1985 | TAD MOB0 /NO. USE THE ONE FOR 2 PLYS BACK |
| 1986 | CIA |
| 1987 | TAD MOB1 |
| 1988 | CIA |
| 1989 | JMS PLYFIX |
| 1990 | JMP I MOBGET /RETURN |
| 1991 | MOBGTM, 0000 |
| 1992 | |
| 1993 | PAGE |
| 1994 | \f/THIS IS THE RECURSIVE LOOKAHEAD SUBROUTINE |
| 1995 | /SEARCHES THE GAME TREE "DEPTH" PLYS DEEP. LOACTION "PLY" |
| 1996 | /HOLDS THE CURRENT RECURSION LEVEL, OR DEPTH LEVEL OF THE SEARCH |
| 1997 | /AND MUST BE SET TO = 0, BEFORE THIS ROUTINE IS CALLED FOR THE FIRST TIME |
| 1998 | /SETTING "CVAL1" TO -3777 BEFORE CALLING THIS ROUTINE FOR THE FIRST TIME |
| 1999 | /IS ALSO NICE, TO PREVENT ALPHA-BETA PRUNING AT LEVEL #1 |
| 2000 | /THIS ROUTINE ASSUMES THAT THE COMPUTER HAS WHITE, BUT THE "LCLRFX" SUBROUTINE |
| 2001 | /ALLOWS THE COMPUTER TO PLAY BLACK, BY SETING LOCATION "LCLRFX"+1 TO EQUAL |
| 2002 | /A CIA INSTRUCTION |
| 2003 | LOOKA, 0000 |
| 2004 | CLA CLL |
| 2005 | TAD LOOKA /GET RETURN ADDRESS |
| 2006 | PUSH1 /SAVE IT IN PDL#1 |
| 2007 | ISZ PLY /INC PLY NUMBER |
| 2008 | CMA CLA /-1 TO AC |
| 2009 | TAD PLY |
| 2010 | SZA CLA /IS THIS THE FIRST PLY? |
| 2011 | JMP LOOKA1 /NO |
| 2012 | TAD WHOSE /YES. SETUP "LCLRFX" |
| 2013 | SMA CLA /WHICH COLOR ARE WE TO LOOK AHEAD ON BEHALF OF? |
| 2014 | TAD (NOP-CIA/WHITE |
| 2015 | TAD [CIA /BLACK |
| 2016 | DCA LCLRFX+1 |
| 2017 | DCA MOBMOD /INITIALIZE MOBILITY VALUES |
| 2018 | DCA MOB0 |
| 2019 | DCA MOB1 |
| 2020 | DCA ENO /SET EVALUATION COUNTER TO 0 |
| 2021 | LOOKA1, TAD UVAL1 /SAVE THE OLD "UPPER LEVEL VALUE" |
| 2022 | PUSH1 /IN PDL#1 |
| 2023 | TAD CVAL1 /THE OLD "CURRENT LEVEL VALUE" |
| 2024 | DCA UVAL1 /BECOMES THE NEW "UPPER LEVEL VALUE" |
| 2025 | TAD PLYFIX+1 /SAVE PLY COMPENSATOR VALUE |
| 2026 | PUSH1 |
| 2027 | TAD GNCNT /SAVE GENERATION COUNTER |
| 2028 | PUSH1 /IN PDL#1 |
| 2029 | TAD STRATG /SAVE STRATEGIC VALUE |
| 2030 | PUSH1 |
| 2031 | DCA GNCNT /CLEAR OUT GENERATION COUNTER, IN CASE NO MOVES ARE GENERATED |
| 2032 | TAD MOB0 /SAVE MOBILITY OF THE LEVEL 2 ABOVE THIS ONE |
| 2033 | PUSH1 |
| 2034 | TAD MOB1 /BUMP ALL THE LEVELS BY 1 |
| 2035 | DCA MOB0 |
| 2036 | TAD MOBMOD |
| 2037 | DCA MOB1 |
| 2038 | DCA MOBMOD /!!!BUG OF AUG 13 FIXED!!!/ |
| 2039 | IFNZRO DEBUG < |
| 2040 | TAD PDLADR /PUSH A MARKER SO THAT PDL#2 CAN BE VERIFIED |
| 2041 | PUSH1 |
| 2042 | TAD PC01 /PUSH A MARKER SO THAT PDL#1 CAN BE |
| 2043 | PUSH1 /VERIFIED TO BE IN LINE |
| 2044 | > |
| 2045 | TAD PLY /BUILD A NEW PLY COMPENSATOR. FIRST GET PLY # |
| 2046 | RAR /EVEN/ODD BIT TO LINK |
| 2047 | SZL CLA /IS PLY # EVEN ? |
| 2048 | TAD (NOP-CIA/NO. BUILD A NOP INSTRUCTION |
| 2049 | TAD [CIA |
| 2050 | DCA PLYFIX+1 |
| 2051 | TAD PLY /PLY # TO AC |
| 2052 | CIA /COMPARE AGAINST |
| 2053 | TAD DEPTH /THE MAXIMUM DEPTH |
| 2054 | SPA CLA /DOES CURRENT PLY# EXCCEDE THE MAX DEPTH #? |
| 2055 | JMP LEVAL /YES. DO A STATIC EVALUATION OF THE POSITION |
| 2056 | LKFUR, TAD (-3777 /NO. BUILD A STARTING VALUE FOR THIS LEVEL |
| 2057 | JMS PLYFIX |
| 2058 | DCA CVAL1 /INITIALIZE VALUE FOR THIS LEVEL |
| 2059 | JMS GNMVSM /GENERATE THE MOVES OF THE SIDE WHOSE MOVE IT IS |
| 2060 | TAD CMSW /GIT CHECKMATE SWITCH |
| 2061 | SZA CLA /IS SIDE TO MOVE IN CHECKMATE? |
| 2062 | JMP LKCM /YES. DO SOMTHING |
| 2063 | TAD SMSW /GET STALEMATE SWITCH |
| 2064 | SZA CLA /IS THE SIDE TO MOVE IN STALEMATE? |
| 2065 | JMP LKSM /YES. DO SOMTHING |
| 2066 | JMS PRUNE /ONLY CONSIDER "GOOD" MOVES |
| 2067 | PICK, POP2 /POP A MOVE OUT OF PDL2 |
| 2068 | DCA TOMAK2 /STORE THE MDW |
| 2069 | POP2 |
| 2070 | SNA /IS IT A MOVE OR THE END OF THE LIST? |
| 2071 | JMP LKAD /ITS THE END OF THE LIST. |
| 2072 | DCA TOMAK1 /ITS A MOVE--STORE THE MSW |
| 2073 | IFNZRO LPTREE < |
| 2074 | TAD TOMAK1 |
| 2075 | DCA IOMSW |
| 2076 | TAD TOMAK2 |
| 2077 | DCA IOMDW |
| 2078 | JMS OUTMV /PRINT OUT THE MOVE |
| 2079 | JMS SPACE /ALSO A SPACE SO THAT THE NEXT TAB STOP IS REACHED |
| 2080 | > |
| 2081 | JMS I ZMKMV /MAKE THE MOVE |
| 2082 | JMS I ZLOOKA /PEER FURTHER INTO THE MURKY DEPTHS OF THE GAME TREE |
| 2083 | IFNZRO LPTREE< |
| 2084 | JMS I ZCRLF /PRINT A CARRIAGE RETURN |
| 2085 | > |
| 2086 | JMS I ZUNMV /UNMAKE THE MOVE |
| 2087 | JMP COMPMV /GO DO A COMPARE |
| 2088 | \f |
| 2089 | /SUBROUTINE TO POP OUT A GROUP OF MOVES FROM PDP#2 |
| 2090 | POPOUT, 0000 |
| 2091 | CLA |
| 2092 | POP2 /OUT MDW |
| 2093 | POP2 /OUT MSW |
| 2094 | SZA CLA /IS IT AN MSW OR IS IT THE END OF THE MOVES MARKER? |
| 2095 | JMP .-3 /IST AN MSW. GO POP OUT ANOTHER MOVE |
| 2096 | JMP I POPOUT /END. RETURN |
| 2097 | |
| 2098 | /SUBROUTINE TO GENERATE THE MOVES OF THE SIDE WHOSE TURN IT IS TO MOVE |
| 2099 | /AS INDICATED BY THE "WHOSE" SWITCH |
| 2100 | /RETURN WITH THE MOVES IN PDL#2, AND THE AC CLEARED |
| 2101 | GNMVSM, 0000 |
| 2102 | CLA |
| 2103 | TAD WHOSE /GET "WHOSE MOVE" SWITCH |
| 2104 | SMA CLA /IS IT WHITES MOVE? |
| 2105 | JMS GNWMV /YES. GENERATE WHITES MOVES |
| 2106 | TAD WHOSE |
| 2107 | SPA CLA /OR IS IT BLACKS MOVE? |
| 2108 | JMS GNBMV /YES. GENERATE BLACKS MOVES |
| 2109 | JMP I GNMVSM /RETURN |
| 2110 | PAGE |
| 2111 | |
| 2112 | \fCOMPMV, CLA |
| 2113 | IFNZRO LPTREE < |
| 2114 | JMS TABPLY /TAB TO COLOMN "PLY" |
| 2115 | TAD RVAL1 |
| 2116 | JMS OCTOUT |
| 2117 | TAD CVAL1 |
| 2118 | JMS OCTOUT /PRINT THE VALUE TO BEAT |
| 2119 | > |
| 2120 | TAD RVAL1 /GET VALUE RETURNED |
| 2121 | JMS PLYFIX /FIX W/RESPECT TO PLY NUMBER |
| 2122 | DCA COMP /LOAD SOFTWARE COMPARE REGISTER WITH IT |
| 2123 | TAD CVAL1 /GET CURRENT VALUE FOR THIS LEVEL |
| 2124 | JMS PLYFIX /FIX W/RESPECT TO PLY # |
| 2125 | JMS COMPAR /COMPARE IT WITH THE RETURNED VALUE NOW IN COMPARE REGISTER |
| 2126 | JMP JMPICK /THEY ARE EQUAL: |
| 2127 | JMP JMPICK /UNFAVORABLE COMPARE: GO ON TO NEXT MOVE |
| 2128 | RPLACE, TAD RVAL1 /HAIL NEW "BEST MOVE VALUE" |
| 2129 | DCA CVAL1 /STORE NEW "BEST MOVE VALUE" |
| 2130 | IFNZRO LPTREE < |
| 2131 | TAD ("* |
| 2132 | JMS I ZOUT /THE RETURN MOVE WON INDICATION |
| 2133 | > |
| 2134 | JMS SETPNT |
| 2135 | TAD TOMAK1 /MSW |
| 2136 | DCA I XR0 /INTO "BEST MOVE" TABLE |
| 2137 | TAD TOMAK2 /MDW |
| 2138 | DCA I XR0 /INTO THE "BEST MOVE" TABLE |
| 2139 | |
| 2140 | /COMING UP IS THE "ALPHA BETA PRUNER" |
| 2141 | /IT CHECKS IF THE NEW "BEST VALUE" FOR THIS LEVEL |
| 2142 | /IS COMPETITIVE WITH THE "BEST VALUE" ON THE LEVEL ABOVE |
| 2143 | ALPHAB, CLA |
| 2144 | TAD CVAL1 /GET CURRENT LEVEL VALUE |
| 2145 | JMS PLYFIX /COMPLIMENT IF THIS IS AN EVEN PLY |
| 2146 | DCA COMP /LOAD COMPARE REGISTER WITH IT |
| 2147 | TAD UVAL1 /GET THE VALUE OF THE LEVEL ABOVE |
| 2148 | JMS PLYFIX |
| 2149 | JMS COMPAR /COMPARE WITH THE CURRENT LEVEL VALUE IN THE COMPARE REGISTER |
| 2150 | JMP ALPHAP /EQUAL MEANS PRUNE |
| 2151 | JMP JMPICK /SORRY. THE VALUE WOULD STILL BE COMPETITIVE ON THE LEVEL ABOVE |
| 2152 | ALPHAP, JMS POPOUT /REMOVE ALL OTHER MOVES ON THIS LEVEL |
| 2153 | TAD PLY /FOR DEBUG |
| 2154 | CLA CLL |
| 2155 | IFNZRO LPTREE< |
| 2156 | TAD ("! |
| 2157 | JMS I ZOUT /PRINT INDICATION FOR PRUNE |
| 2158 | > |
| 2159 | JMP LKAD /YES. GO SET RETURN VALUE |
| 2160 | |
| 2161 | JMPICK, IFNZRO LPTREE < |
| 2162 | JMS I ZCRLF /CARRIAGE RETURN |
| 2163 | JMS TABPLY /TAD TO COLOMN # "PLY" |
| 2164 | > |
| 2165 | CLA |
| 2166 | JMP PICK |
| 2167 | |
| 2168 | SAVBRD, ROOK |
| 2169 | KNIGHT |
| 2170 | BISHOP |
| 2171 | QUEEN |
| 2172 | KING |
| 2173 | BISHOP |
| 2174 | KNIGHT |
| 2175 | ROOK |
| 2176 | PAWN |
| 2177 | PAWN |
| 2178 | PAWN |
| 2179 | PAWN |
| 2180 | PAWN |
| 2181 | PAWN |
| 2182 | PAWN |
| 2183 | PAWN |
| 2184 | BESTBL, ZBLOCK 30 /TABLE TO HOLD THE LAST "BEST MOVE" ON ANY LEVEL |
| 2185 | |
| 2186 | /SUBROUTINE TO SET AUTO-INDEX REG "XRO0" TO POINT TO |
| 2187 | /THE WORD BEFORE THE 2WORD ENTRY IN THE "BESTBL" COROSPONDING WITH THIS PLY |
| 2188 | SETPNT, 0000 |
| 2189 | CLA |
| 2190 | TAD PLY /GET PLY # |
| 2191 | CLL RAL /MULT TIMES 2 WORDS IN EACH ENTRY |
| 2192 | TAD ADCON /ADD IN ADDRESS CONSTANT |
| 2193 | DCA XR0 /STORE ADDR AS ADVERTISED |
| 2194 | JMP I SETPNT /RETURN |
| 2195 | ADCON, BESTBL-3 |
| 2196 | -PAWN |
| 2197 | -PAWN |
| 2198 | -PAWN |
| 2199 | -PAWN |
| 2200 | -PAWN |
| 2201 | -PAWN |
| 2202 | -PAWN |
| 2203 | -PAWN |
| 2204 | -ROOK |
| 2205 | -KNIGHT |
| 2206 | -BISHOP |
| 2207 | -QUEEN |
| 2208 | -KING |
| 2209 | -BISHOP |
| 2210 | -KNIGHT |
| 2211 | -ROOK |
| 2212 | |
| 2213 | PAGE |
| 2214 | \f |
| 2215 | LKAD, CLA /FINISHED GENERATING & EXPLORING MOVES ON THIS LEVEL |
| 2216 | TAD CVAL1 /SET RETURN VALUE = THIS LEVELS VALUE |
| 2217 | DCA RVAL1 |
| 2218 | JMP DONE /PREPARE TO RETURN |
| 2219 | |
| 2220 | LKSM, CLA /ITS A STALEMATE! |
| 2221 | IFNZRO LPTREE< |
| 2222 | TAD ("= |
| 2223 | JMS I ZOUT /PRINTOUT STALEMATE INDICATION |
| 2224 | > |
| 2225 | DCA RVAL1 /SET RETURN VALUE TO TOTALY EVEN GAME ( 0 ) |
| 2226 | JMP LKXM /TAKE SAME RETURN PATH AS A CHECKMATE NOW |
| 2227 | |
| 2228 | /COME HERE TO RETURN FROM THE "LOOKA" SUBROUTINE |
| 2229 | DONE, CLA CMA /-1 TO AC |
| 2230 | TAD PLY /DECREMENT PLY # |
| 2231 | DCA PLY |
| 2232 | TAD UVAL1 /RESTORE VARIOUS DATA TO ITS STATE BEFORE CALLING |
| 2233 | DCA CVAL1 |
| 2234 | IFNZRO DEBUG < |
| 2235 | POP1 /POP OUT PDL#1 VERIFIER WORD |
| 2236 | CIA /SHOULD BE SAME ON EXIT AS WAS ON ENTRY |
| 2237 | TAD PC01 |
| 2238 | SZA /AFTER COMPLIMENTING, SHOULD BE 0. IS IT? |
| 2239 | HLT /NO. SURE GLAD I PUT THIS TEST IN! |
| 2240 | POP1 /DO THE SAME THING FOR PDL#2 |
| 2241 | CIA |
| 2242 | TAD PDLADR |
| 2243 | SZA /IS PDL#2 IN LINE? |
| 2244 | HLT /NO. AMOUNT OFF IS IN THE AC |
| 2245 | > |
| 2246 | TAD MOB1 |
| 2247 | DCA MOBMOD /RESTORE MOBMOD COUNTER |
| 2248 | TAD MOB0 |
| 2249 | DCA MOB1 |
| 2250 | POP1 |
| 2251 | DCA MOB0 |
| 2252 | POP1 |
| 2253 | DCA STRATG /RESTORE STRATEGIC VALUE |
| 2254 | POP1 |
| 2255 | DCA GNCNT /RESTORE OLD MOVE GENERATION COUNTER |
| 2256 | POP1 /POP OFF OLD PLY COMPENSATOR VALUE |
| 2257 | DCA PLYFIX+1 /RESTORE IT |
| 2258 | POP1 |
| 2259 | DCA UVAL1 /RESTORE "UPPER LEVEL VALUE" |
| 2260 | POP1 /POP OFF RETURN ADDRESS |
| 2261 | DCA TEMP /RESTORE IT |
| 2262 | JMP I TEMP /RETURN FROM "LOOKA" SUBROUTINE |
| 2263 | |
| 2264 | \fLKCM, CLA /ITS A CHECKMATE. |
| 2265 | IFNZRO LPTREE< |
| 2266 | TAD ("+ |
| 2267 | JMS I ZOUT /PRINT CHECKMATE INDICATION |
| 2268 | > |
| 2269 | TAD PLY /SUBTRACT PLY # FROM |
| 2270 | TAD (-3740 /VALUE FOR RETURN VALUE |
| 2271 | JMS PLYFIX /RETURN VALUE IS POSITIVE IF THIS IS AN EVEN PLY |
| 2272 | DCA RVAL1 |
| 2273 | LKXM, POP2 /POP THE 2 MARKER WORDS OFF OF PDL2 |
| 2274 | POP2 /THAT "GNMV" PUT THERE |
| 2275 | JMP DONE /READY TO RETURN |
| 2276 | |
| 2277 | /COLOR FIXING SUBROUTINE EXCLUSIVLY FOR THE "LOOKA" SUBROUTINE. |
| 2278 | /FIXES COLOR WITH RESPECT TO PLY EVEN/ODD |
| 2279 | PLYFIX, 0000 |
| 2280 | CIA /=NOP IF PLY IS ODD, OR TO = CIA IF PLY IS EVEN |
| 2281 | JMP I PLYFIX /RETURN |
| 2282 | |
| 2283 | /GENERAL PURPOSE COLOR FIXING ROUTINE |
| 2284 | /SET "LCLRFX"+1 ONLY ONCE A PROGRAM INITIALIZATION TIME. SET IT TO |
| 2285 | /EQUAL A "NOP" INSTRUCTION IF THE COMPUTER HAS WHITE, SET IT TO A |
| 2286 | /"CIA" INSTRUSTION IF THE COMPUTER HAS BLACK |
| 2287 | LCLRFX, 0000 |
| 2288 | NOP /COMPUTER HAS: WHITE="NOP", BLACK="CIA" |
| 2289 | JMP I LCLRFX /RETURN |
| 2290 | |
| 2291 | \f/STATIC EVALUATION ROUTINE |
| 2292 | LEVAL, CLA CLL |
| 2293 | JMS I ZMAPEC /MAP PIECES |
| 2294 | TAD WHOSE /GET "WHOSE MOVE SWITCH" |
| 2295 | SMA CLA /IS IT WHITES OR BLACKS? |
| 2296 | JMP .+4 /WHITES |
| 2297 | TAD BKING /BLACKS. GET BLACKS KING ADDRESS |
| 2298 | JMS TSTWAT /FIND OUT IF IT IS ATTACKED |
| 2299 | JMP .+3 |
| 2300 | TAD WKING /GET WHITES KINGS ADDRESS |
| 2301 | JMS TSTBAT /FIND OUT IF IT IS ATTACKED |
| 2302 | TAD PCNT /GET # OF ATTACKERS |
| 2303 | SZA CLA /IS THE KING IN CHECK? |
| 2304 | JMP LKFUR /YES. LOOK AHEAD 1 MORE MOVE |
| 2305 | IFNZRO LPTREE < |
| 2306 | TAD ("# |
| 2307 | JMS I ZOUT /PRINT EVALUATION INDICATOR |
| 2308 | ISZ ENO /INC EVALUATION # |
| 2309 | TAD ENO /FIND OUT IF IT IS OF SPECIAL INTREST |
| 2310 | CIA /BY TESTING TO SE IF IT IS THE SAME |
| 2311 | TAD ENOB /AS "ENOB" |
| 2312 | SNA CLA /IS IT? |
| 2313 | NOP /YES. A BREAKPOINT FOR ODT MAY BE PLACED HERE |
| 2314 | TAD ENO /PRINT OUT THE EVALUATION # |
| 2315 | JMS OCTNFM |
| 2316 | > |
| 2317 | JMS EVAL /GET AN EVALUATION |
| 2318 | DCA RVAL1 /SETUP RETURN VALUE |
| 2319 | JMP DONE /READY TO RETURN |
| 2320 | |
| 2321 | |
| 2322 | /SUBROUTINE TO PRUNE UNDESIRABLE MOVES OUT OF THE TREE BEFORE THEY CREATE |
| 2323 | /HUGE BRANCHES. WHAT TYPES OF MOVES ARE DESIRABLE AND UNDESIRABLE AT ANY GIVEN |
| 2324 | /PLY, IS DETERMINED BY THE TABLE AT LOCATION "PRNPRO" |
| 2325 | /THIS ROUTINE SHOULD SET "PRNCNT" TO THE NUMBER OF MOVES PRUNED |
| 2326 | PRUNE, 0000 |
| 2327 | CLA |
| 2328 | DCA PRNCNT /INIT PRUNED MOVE COUNTER TO 0 |
| 2329 | TAD GNCHEK /GET # OF CHECKS ON THE KING |
| 2330 | SZA /IS THE KING IN CHECK? |
| 2331 | JMP I PRUNE /NO. DONT PRUNE ANY MOVES |
| 2332 | JMS PLYCHP /GET PLY # |
| 2333 | TAD (JMP I .+3 /BUILD A JMP I TO THE PROPER PRUNE PROCEDURE |
| 2334 | DCA .+1 /PUT THE JMP I DOWN SO THAT IT MAY BE EXECUTED |
| 2335 | HLT /JMP GOES HERE |
| 2336 | |
| 2337 | PRNPRO, PPA /PRUNE PROCEDURE FOR PLY 1 |
| 2338 | PPB /PRUNE PROCEDURE FOR PLY 2 |
| 2339 | PPB /PRUNE PROCEDURE FOR PLY 3 |
| 2340 | PPB /PRUNE PROCEDURE FOR PLY 4 |
| 2341 | PPB /PRUNE PROCEDURE FOR PLY 5 |
| 2342 | PPB /PRUNE PROCEDURE FOR PLY 6 |
| 2343 | PPB /PRUNE PROCEDURE FOR PLY 7 |
| 2344 | PPB /PRUNE PROCEDURE FOR PLY 8 OR GREATER |
| 2345 | |
| 2346 | PPA, JMS BSTOP /COUNT ON A "PRE-ANALYSIS" |
| 2347 | PPZ, JMP I PRUNE /RETURN |
| 2348 | |
| 2349 | PPB, JMS HIEP /FIND OUT THE VALUE OF THE MOST FAVORABLE EN PRISE PIECE CAPTURE |
| 2350 | SNA CLA /DOES A FAVORABLE ONE EXIST? |
| 2351 | JMP .+4 /NO. COUNT ON THE ENTRY IN "BESTBL" |
| 2352 | JMS SETPNT /YES. SETUP POINTER FOR THE INSERTION |
| 2353 | TAD HIEPMS /OF THE EN PRISE PIECE CAPTURE MSW |
| 2354 | DCA I XR0 /INTO THE "BESTBL" |
| 2355 | JMS BSTOP /IF IT EXISTS, BSTOP WILL INSURE THAT IT IS LOOKED AT FIRST |
| 2356 | JMP I PRUNE /RETURN |
| 2357 | PAGE |
| 2358 | \f/SUBROUTINE TO SCAN THROUGH THE LAST BUNCH OF MOVES IN PDL#2 |
| 2359 | /IF A MOVE EXISTS, WHICH HAS THE SAME MSW AS THE LAST "BEST MOVE" |
| 2360 | /ON THIS PLY, THAT MOVE IS SWAPED WITH THE MOVE ON THE TOP OF THE LIST |
| 2361 | BSTOP, 0000 |
| 2362 | JMS SETPNT |
| 2363 | TAD I XR0 |
| 2364 | CIA |
| 2365 | DCA TEMP2 |
| 2366 | TAD GNCNT |
| 2367 | CIA |
| 2368 | TAD PRNCNT |
| 2369 | SNA /ANY MOVES TO RUMMAGE THRU? |
| 2370 | JMP I BSTOP /NO. RETURN |
| 2371 | DCA TEMP /SETUP COUNT |
| 2372 | TAD TEMP |
| 2373 | CLL RAL /MULT TIMES 2 WORDS PER MOVE |
| 2374 | TAD PDLADR |
| 2375 | DCA TEMP1 |
| 2376 | BSTOP1, TAD I TEMP1 /GET AN MSW |
| 2377 | IFNZRO DEBUG < |
| 2378 | SNA /DOES IT LOOK LIKE AN MSW |
| 2379 | HLT /NOT IF ITS 0 IT DOESNT |
| 2380 | > |
| 2381 | TAD TEMP2 |
| 2382 | SNA CLA /IS IT A MATCH? |
| 2383 | JMP BSTOP2 /YES!! GO SWAP IT WITH THE MOVE ON TOP |
| 2384 | ISZ TEMP1 /BUMP POINTER BY 2 TO POINT TO THE NEXT MSW |
| 2385 | ISZ TEMP1 |
| 2386 | ISZ TEMP /COMPARED AGAINST ALL MOVES? |
| 2387 | JMP BSTOP1 /NO. DO ANOTHER |
| 2388 | JMP I BSTOP /YES. RETURN |
| 2389 | BSTOP2, TAD PDLADR |
| 2390 | TAD (-2 |
| 2391 | DCA TEMP |
| 2392 | TAD I TEMP |
| 2393 | DCA I TEMP1 |
| 2394 | TAD TEMP2 |
| 2395 | CIA |
| 2396 | DCA I TEMP |
| 2397 | ISZ TEMP |
| 2398 | ISZ TEMP1 |
| 2399 | TAD I TEMP1 |
| 2400 | DCA XR0 |
| 2401 | TAD I TEMP |
| 2402 | DCA I TEMP1 |
| 2403 | TAD XR0 |
| 2404 | DCA I TEMP |
| 2405 | JMP I BSTOP |
| 2406 | |
| 2407 | |
| 2408 | \f/SUBROUTINE TO EVALUATE THE BACK RANK |
| 2409 | /TO FIND OUT WHAT'S NOT DEVELOPED, AND RETURN A VALUE FOR DEVELOPMENT |
| 2410 | BREV, 0000 |
| 2411 | CLA |
| 2412 | TAD (NOP |
| 2413 | DCA BREV2 /SETUP TO DO THE WHITE SIDE FIRST |
| 2414 | JMS BREV1 /DO AN EVALUATION |
| 2415 | CIA /NEGATE THE VALUE FOR WHITES SIDE |
| 2416 | TAD STRATG |
| 2417 | DCA STRATG |
| 2418 | TAD [CIA |
| 2419 | DCA BREV2 /SETUP TO DO THE BLACK SIDE |
| 2420 | TAD (70 /RANK 8 |
| 2421 | JMS BREV1 /DO THE BLACK EVALUATION |
| 2422 | TAD STRATG |
| 2423 | DCA STRATG |
| 2424 | JMP I BREV /RETURN WITH IT |
| 2425 | |
| 2426 | BREV1, 0000 |
| 2427 | TAD (BOARD-1/CONSTANT FOR BOARD ADDRESS |
| 2428 | DCA ITMP0 |
| 2429 | DCA TEMP2 /INIT MINOR PIECE COUNTER |
| 2430 | TAD [7770 /COUNT FOR 10 SQUARES ON THE BACK RANK |
| 2431 | DCA TEMP1 |
| 2432 | TAD I ITMP0 /GET THE PIECES VALUE |
| 2433 | BREV2, HLT /COMPLIMENT IT IF IT IS BLACK |
| 2434 | TAD (-KNIGHT |
| 2435 | SNA /IS IT A KNIGHT? |
| 2436 | ISZ TEMP2 /YES. INC MINOR PIECE COUNTER |
| 2437 | TAD (KNIGHT-BISHOP |
| 2438 | SNA CLA /IS IT A BISHOP? |
| 2439 | ISZ TEMP2 /YES. INC MINOR PIECE COUNTER |
| 2440 | ISZ TEMP1 /DONE ALL 8 SQUARES YET? |
| 2441 | JMP BREV2-1 /NO. GO BACK AND DO ANOTHER |
| 2442 | TAD TEMP2 /ADD IN # OF MINOR PIECES |
| 2443 | RAL CLL /MULT TIMES 2 |
| 2444 | RAL CLL /MULT TIMES 2 AGAIN (2*2=4) |
| 2445 | JMP I BREV1 /RETURN WITH RANK EVALUATION IN THE AC |
| 2446 | / |
| 2447 | /CENTER OCCUPATION EVALUATOR |
| 2448 | COEV, 0000 |
| 2449 | CLA |
| 2450 | TAD (-4 /SETUP COUNT FOR 4 CENTER SQUARES |
| 2451 | DCA TEMP1 |
| 2452 | TAD (TAD I COTB /SETUP TO ACCESS ADDRESSES OF THE 4 CENTER SQUARES |
| 2453 | DCA COEV1 |
| 2454 | COEV1, HLT /GET SQUARES VALUE |
| 2455 | SNA /IS IT OCCUPIED |
| 2456 | JMP COEV2 /NO. TEST TO SEE IF DONE |
| 2457 | SMA CLA /IS IT A WHITE PIECE? |
| 2458 | TAD (10 /VALUE WILL BE +4 |
| 2459 | TAD (-4 /OR -4 IF IT IS BLACK |
| 2460 | TAD STRATG /ADD TO THE CENTER OCCUPATION VALUE |
| 2461 | DCA STRATG |
| 2462 | COEV2, ISZ COEV1 /INC INSTRUCTION SO THAT IT REFFRENCES THE NEXT CENTER SQUARE |
| 2463 | ISZ TEMP1 /DONE ALL 4 SQUARES YET? |
| 2464 | JMP COEV1 /NO. DO ANOTHER |
| 2465 | TAD TEMP /YES. GET FINAL VALUE |
| 2466 | JMP I COEV /AND RETURN |
| 2467 | \f |
| 2468 | /ADDRESSES OF THE 4 CENTER SQUARES |
| 2469 | COTB, BOARD+33 |
| 2470 | BOARD+34 |
| 2471 | BOARD+43 |
| 2472 | BOARD+44 |
| 2473 | |
| 2474 | /CASTLING STATUS EVALUATOR |
| 2475 | CASTEV, 0000 |
| 2476 | CLA |
| 2477 | TAD WPSW |
| 2478 | RAR /MOVE "CASTLED BIT" INTO LINK |
| 2479 | SZL CLA /HAS WHITE CASTLED? |
| 2480 | TAD (10 /YES ADD TO STRATEGIC VALUE |
| 2481 | TAD STRATG |
| 2482 | DCA STRATG |
| 2483 | TAD BPSW |
| 2484 | RAR /MOVE "CASTLED BIT" TO THE LINK |
| 2485 | SZL CLA /HAS BLACK CASTLED YET? |
| 2486 | TAD [7770 /YES. SUBTRACT POINTS FROM THE STRATEGIC VALUE |
| 2487 | TAD STRATG |
| 2488 | DCA STRATG |
| 2489 | JMP I CASTEV /RETURN |
| 2490 | |
| 2491 | PAGE |
| 2492 | \f/SUBROUTINE TO TEST IF A PIECE IS EN PRISE |
| 2493 | /CALL WITH THE ADDRESS OF THE SQUARE TO BE TESTED IN THE AC |
| 2494 | /IF THE PIECE IS EN PRISE, RETURN WITH THE PREDICTED EXCHANGE |
| 2495 | /LOSS IN THE AC, IF NOT 0 IS RETURNED |
| 2496 | /THE ADDRESS OF THE SQUARE IS RETURNED IN "ENPRAD" |
| 2497 | /RETURN WITH ADDR OF ATTACKER IN "ENPSQR" |
| 2498 | /RETURN WITH ADDR OF THE LEAST VALUABLE DEFENDER IN "PSQR" |
| 2499 | /RETURN WITH THE # OF ATTACKERS IN "ENPCNT" |
| 2500 | /RETURN WITH THE # OF DEFENDERS IN "PCNT" |
| 2501 | ENPRIS, 0000 |
| 2502 | DCA ENPRAD /SAVE ADDR OF EN PRIS SQUARE |
| 2503 | JMS I ZMAPEC /MAKE SURE PIECE MAP IS UP TO DATE |
| 2504 | TAD I ENPRAD |
| 2505 | SNA /IS THERE A PIECE ON IT? |
| 2506 | JMP I ENPRIS /NO. IDIOT! CONSIDER YOURSELF SAVED |
| 2507 | SMA CLA /YES. IS IT WHITE OR BLACK? |
| 2508 | JMP ENPRWH /ITS WHITE |
| 2509 | TAD ENPRAD /BLACK. FIND OUT ABOUT WHITES ATTACKS |
| 2510 | JMS TSTWAT |
| 2511 | TAD PVAL |
| 2512 | DCA ENPVAL /SAVE VALUE OF SMALEST ATTACKER |
| 2513 | TAD PCNT |
| 2514 | SNA /ANY ATTACKERS? |
| 2515 | JMP I ENPRIS /NO.RETURN |
| 2516 | DCA ENPCNT /SAVE # OF ATTACKERS |
| 2517 | TAD PSQR |
| 2518 | DCA ENPSQR /SAVE ADDR OF LEAST VALUABLE ATTACKER |
| 2519 | TAD ENPRAD /FIND OUT ABOUT DEFENDERS NOW |
| 2520 | JMS TSTBAT |
| 2521 | JMP ENPR0 /ALL DONE SETTING UP. GO TO THE BUISINESS PART |
| 2522 | ENPRWH, TAD ENPRAD /FIND OUT ABOUT BLACK ATTACKS |
| 2523 | JMS TSTBAT |
| 2524 | TAD PVAL |
| 2525 | CIA |
| 2526 | DCA ENPVAL /SAVE VALUE OF LEAST VALUABLE ATTACKER |
| 2527 | TAD PSQR |
| 2528 | DCA ENPSQR /SAVE ADDR OF LEAST VALUABLE ATTACKER |
| 2529 | TAD PCNT |
| 2530 | SNA /ANY ATTACKERS? |
| 2531 | JMP I ENPRIS /NO. RETURN |
| 2532 | DCA ENPCNT /STORE # OF ATTACKERS |
| 2533 | TAD ENPRAD /FIND OUT ABOUT WHITES DEFENCE |
| 2534 | JMS TSTWAT |
| 2535 | TAD PVAL |
| 2536 | CIA /COMPLIMENT VALUE OF LEAST VALUABLE DEFENDER |
| 2537 | DCA PVAL |
| 2538 | ENPR0, TAD ENPCNT /GET # OF ATTACKERS |
| 2539 | CIA |
| 2540 | TAD PCNT /COMPARE WITH # OF DEFENDERS |
| 2541 | SMA CLA /MORE ATTACKERS THAN DEFENDERS? |
| 2542 | JMP ENPR1 /NO. |
| 2543 | TAD PCNT /# OF DEFENDERS |
| 2544 | CLL RAR |
| 2545 | SZA CLA /MORE THAN 1 DEFENDER? |
| 2546 | JMP ENPR1 /YES. TOO COMPLICATED TO PREDICT THE SWAP ALL THE WAY DOWN |
| 2547 | SNL CLA /NO. ARE THERE ANY DEFENDERS AT ALL? |
| 2548 | JMP ENPR2 /NO. ITS EN PRISE ALL RIGHT |
| 2549 | TAD I ENPRAD /YES. ITS EXACTLY 1 DEFENDER |
| 2550 | JMS CLRFIX |
| 2551 | TAD PVAL /ADD VALUE OF DEFENDER PLUS OBJECT |
| 2552 | TAD ENPVAL /COMPARE WITH THE ATTACKERS VALUE |
| 2553 | SMA CLA /IS ATTACKER SMALLER THAN DEFENDER PLUS OBJECT? |
| 2554 | JMP ENPR3 /NO. THE OBJECT IS NOT EN PRISE |
| 2555 | TAD PVAL /-D |
| 2556 | TAD ENPVAL /+A |
| 2557 | SPA SNA CLA /IS DEFENDER SMALLER THAN ATTACKER? |
| 2558 | JMP ENPR2 /NO. HE WONT CAPTURE BACK THEN |
| 2559 | TAD PVAL /YES |
| 2560 | TAD ENPVAL |
| 2561 | JMS CLRFIX |
| 2562 | ENPR2, TAD I ENPRAD |
| 2563 | CIA |
| 2564 | JMP I ENPRIS /RETURN |
| 2565 | ENPR1, CLA |
| 2566 | TAD I ENPRAD /COMPARE VALUE OF OBJECT |
| 2567 | JMS CLRFIX |
| 2568 | TAD ENPVAL /WITH THE VALUE OF THE ATTACKER |
| 2569 | SMA /IS THE ATTACKERS VALUE SMALLER? |
| 2570 | ENPR3, CLA /NO. PIECE IS NOT EN PRISE |
| 2571 | CIA |
| 2572 | JMS CLRFIX |
| 2573 | JMP I ENPRIS /RETURN |
| 2574 | ENPRAD, 0000 |
| 2575 | ENPVAL, 0000 |
| 2576 | ENPSQR, 0000 |
| 2577 | ENPCNT, 0000 |
| 2578 | IFNZRO DEBUG< |
| 2579 | /TEST OF THE "ENPRIS" ROUTINE |
| 2580 | TESTEP, JMS INPUT |
| 2581 | JMS I ZMAPEC |
| 2582 | TAD [BOARD |
| 2583 | DCA TSTTMP |
| 2584 | TAD (7700 |
| 2585 | DCA TSTCNT |
| 2586 | TEP2, TAD TSTTMP |
| 2587 | JMS ENPRIS |
| 2588 | SNA /IS IT EN PRIS? |
| 2589 | JMP TEP1 /NO |
| 2590 | JMS OCTOUT |
| 2591 | JMS SPACE |
| 2592 | TAD TSTTMP |
| 2593 | JMS OUTSQR |
| 2594 | JMS I ZCRLF |
| 2595 | TEP1, ISZ TSTTMP |
| 2596 | ISZ TSTCNT |
| 2597 | JMP TEP2 |
| 2598 | HLT |
| 2599 | JMP TESTEP |
| 2600 | TSTTMP, 0000 |
| 2601 | TSTCNT, 0000 |
| 2602 | > |
| 2603 | PAGE |
| 2604 | \f/SUBROUTINE TO RETURN THE EXCHANGE VALUE OF THE HIGHEST EN PRISE |
| 2605 | /PIECE THAT CAN BE TAKEN BY THE SIDE TO MOVE |
| 2606 | /ADDED IN WITH THE VALUE IS A 10 POINT "PENALTY" FOR EACH ADDITIONAL EN PRISE PIECE |
| 2607 | /THAT CAN BE TAKEN |
| 2608 | /THE VALUE IS RETURNED IN SUCH A WAY THAT IT CAN SIMPLY BE ADDED |
| 2609 | /TO THE EVALUATION |
| 2610 | /CALL WITH AC CLEAR TO USE NORMALY |
| 2611 | /THIS ROUTINE CALCULATES WHOSE MOVE IT IS BY EXAMINING LOCATION "WHOSE" |
| 2612 | HIEP, 0000 |
| 2613 | CLA |
| 2614 | TAD WHOSE |
| 2615 | SPA CLA /IS IT WHITES MOVE OR BLACKS? |
| 2616 | TAD (NOP-CIA /BLACKS - SET "HIEPX"=NOP |
| 2617 | TAD [CIA /WHITES - SET "HIEPX"=CIA |
| 2618 | DCA HIEPX /SEE |
| 2619 | DCA HIEPVL /INIT VALUE TO 0 |
| 2620 | DCA HIEPCN /INIT COUNT TO 0 |
| 2621 | JMS I ZMAPEC /MAKE SURE THE PIECE MAP IS UP TO DATE |
| 2622 | TAD (-12 |
| 2623 | JMS HIEPFX |
| 2624 | TAD (MAP+12 /BUILD THE ADDR OF THE PIECE MAP(WHICHEVER ONE IT IS) |
| 2625 | DCA HMAPAD |
| 2626 | HIEP1, CLA |
| 2627 | TAD I HMAPAD /GET PIECE ADDR |
| 2628 | ISZ HMAPAD /INC MAP ADDRESS POINTER |
| 2629 | SNA /DONE ALL PIECES YET? |
| 2630 | JMP HIEP2 /YES |
| 2631 | DCA HIEPTM /STORE ADDR FOR THE MOMENT |
| 2632 | TAD I HIEPTM /GET THE PIECES VALUE |
| 2633 | JMS HIEPFX |
| 2634 | TAD (-KING /COMPARE IT WITH THAT OF A KING |
| 2635 | SNA CLA /IS IT A KING? |
| 2636 | JMP HIEP1 /YES. KINGS CANT BE SWAPED ANYWAYS |
| 2637 | TAD HIEPTM /NO. GET THE PIECES ADDR |
| 2638 | JMS ENPRIS /FIND OUT IF IT IS ENPRIS |
| 2639 | SNA /IS IT? |
| 2640 | JMP HIEP1 /NO. TRY THE NEXT ONE |
| 2641 | DCA HIEPTM /YES. SAVE THE EXCHANGE VALUE |
| 2642 | ISZ HIEPCN /INC EN PRIS PIECE COUNTER |
| 2643 | TAD HIEPVL /GET BEST VALUE SO FAR |
| 2644 | CIA |
| 2645 | TAD HIEPTM /COMPARE IT WITH THE ONE JUST AQUIRED |
| 2646 | JMS HIEPFX |
| 2647 | SMA CLA /IS THE ONE WE JUST GOT BIGGER? |
| 2648 | JMP HIEP1 /NO. GO TRY ANOTHER PIECE |
| 2649 | TAD HIEPTM /YES.MAKE THE ONE WE JUST GOT THE NEW VALUE TO BEAT |
| 2650 | DCA HIEPVL |
| 2651 | TAD ENPSQR /BUILD MSW FOR THE MOVE TO CAPTURE THIS EN PRISE PIECE |
| 2652 | AND [0077 /"FROM SQUARE" IS THAT OF THE |
| 2653 | RTL CLL /LEAST VALUABLE ATTACKER |
| 2654 | RTL |
| 2655 | RTL |
| 2656 | DCA HIEPTM |
| 2657 | TAD ENPRAD /"TO SQUARE" IS THAT OF THE PIECE ITSELF |
| 2658 | AND [0077 |
| 2659 | TAD HIEPTM /COMBINE "TO" AND "FROM" 6BIT ADDRESSES |
| 2660 | DCA HIEPMS /INTO ONE CONVIENIENT MSW |
| 2661 | JMP HIEP1 /GO TRY ANOTHER PIECE |
| 2662 | HIEP2, CLA CMA |
| 2663 | TAD HIEPCN /GET # OF EN PRISE PIECES |
| 2664 | SPA /WERE THERE ANY? |
| 2665 | CLA /NO |
| 2666 | CLL RTL |
| 2667 | RAL /MULT TIMES 8 AND INCLUDE IN THE VALUE RETURNED |
| 2668 | CIA |
| 2669 | JMS HIEPFX |
| 2670 | TAD HIEPVL /GET THE EXCHANGE VALUE |
| 2671 | JMP I HIEP /RETURN |
| 2672 | |
| 2673 | HIEPFX, 0000 |
| 2674 | HIEPX, HLT /NOP,BLACKS MOVE/CIA,WHITES MOVE |
| 2675 | JMP I HIEPFX |
| 2676 | |
| 2677 | HIEPVL, 0000 |
| 2678 | HIEPTM, 0000 |
| 2679 | HIEPCN, 0000 |
| 2680 | HIEPMS, 0000 |
| 2681 | HMAPAD, 0000 |
| 2682 | |
| 2683 | |
| 2684 | /SUBROUTINE TO SETUP THE BOARD |
| 2685 | SETBRD, 0000 |
| 2686 | CLA CLL |
| 2687 | TAD (-100 /IST PUT ALL OF THE PIECES ON THE BOARD |
| 2688 | DCA TEMP /SETUP A COUNT FOR 64 SQUARES |
| 2689 | TAD (BOARD-1 |
| 2690 | DCA ITMP0 /BOARD ADDRESS TO AUTO INDEX REG |
| 2691 | TAD (SAVBRD-1 |
| 2692 | DCA ITMP1 /SAVED BOARD ADDRESS TO AUTO-INDEX REG |
| 2693 | TAD I ITMP1 /MOVE FROM THE SAVED BOARD AREA |
| 2694 | DCA I ITMP0 /TO THE WORKING AREA |
| 2695 | ISZ TEMP /DONE 64 SQUARES YET? |
| 2696 | JMP .-3 /NO. DO MORE |
| 2697 | TAD (-40 /NOW CLEAR OUT THE MIDDLE |
| 2698 | DCA TEMP |
| 2699 | TAD (BOARD+17 |
| 2700 | DCA ITMP1 |
| 2701 | DCA I ITMP1 |
| 2702 | ISZ TEMP /CLEARED OUT 32 SQUARES YET? |
| 2703 | JMP .-2 /NO. DO 1 MORE |
| 2704 | DCA LSTMV |
| 2705 | DCA WPSW /ENABLE CASTLING BY WHITE |
| 2706 | DCA BPSW /AND BY BLACK |
| 2707 | DCA PW /INITIALIZE TOTAL PIECE VALUE |
| 2708 | JMP I SETBRD /RETURN |
| 2709 | |
| 2710 | COMTM, IAC /TOURNAMENT MODE SETTING |
| 2711 | IAC |
| 2712 | COMBM, IAC /BLITZ MODE SETTING |
| 2713 | DCA DEPTH /DEPTH=3 FOR TOURNAMENT MODE, DEPTH=1 FOR BLITZ MODE |
| 2714 | JMP COMMAN |
| 2715 | |
| 2716 | PAGE |
| 2717 | \f |
| 2718 | /THIS IS THE INTERRUPT HANDLING ROUTINE |
| 2719 | INTHAN, DCA ACHOLD /SAVE ACCUMULATOR |
| 2720 | RAL /LINK TO AC11 |
| 2721 | DCA LKHOLD /SAVE LINK |
| 2722 | KSF /KEYBOARD INTERRUPT? |
| 2723 | HLT /NO. UNEXPLANED INTERRUPT. PRESS START (CLEAR&CONT) TO CLEAR FLAGS |
| 2724 | KRB /YES. GET THE CHAR |
| 2725 | SNA /IS IT A NULL CHARACTER ? |
| 2726 | JMP RTINT /YES. IGNOR IT TOTALY |
| 2727 | AND (0177 /MAKE SURE BIT 4 IS SET IN |
| 2728 | TAD (200 /CASE OF A PARITY TTY |
| 2729 | DCA CHAR /NOW STORE THE CHAR. FOR EASY ACCESS |
| 2730 | TAD ISW /GET INPUT IN PROGRESS SWITCH |
| 2731 | SNA CLA /IS IT SET? |
| 2732 | JMP RTINT /NO. RETURN AND FORGET THAT THIS HAPPENED |
| 2733 | TAD CHAR /LOAD IT BACK INTO THE AC |
| 2734 | JMS I ZOUT /ECCO IT |
| 2735 | TAD CHAR /TEST IF IT IS TO BE IGNORED |
| 2736 | TAD (-240 |
| 2737 | SNA CLA /IS IT A SPACE ? |
| 2738 | JMP RTINT /YES. IGNOR IT |
| 2739 | ISZ CNTCHR /TOO MUCH INPUT? |
| 2740 | SKP /NO |
| 2741 | JMP UGO /YES. PRINT "^U", REINITIALIZE, AND TRY AGAIN |
| 2742 | TAD CHAR /LOAD THE CHAR BACK INTO THE AC AGAIN |
| 2743 | TAD (-215 /FIND OUT IF IT IS A SPECIAL CHARACTER (CR OR RUBOUT) |
| 2744 | SNA /IS IT A CR? |
| 2745 | JMP LINDUN /YES! HE'S DONE TYPING THE INPUT LINE |
| 2746 | TAD (215-377 |
| 2747 | SNA /IS IT A RUBOUT CHAR? |
| 2748 | JMP RUBGO /YES. DELETE THE LAST CHAR TYPED |
| 2749 | TAD (377-225 /NO |
| 2750 | SNA CLA /IS IT A CONTROL-U? |
| 2751 | JMP UGO /YES. DELETE A WHOLE LINE |
| 2752 | TAD CHAR /NO. |
| 2753 | IFNZRO OS8< |
| 2754 | TAD (-203 |
| 2755 | SNA CLA /IS CHAR A CONTROL-C ? |
| 2756 | JMP MONITR /YES |
| 2757 | TAD CHAR /NO. GET ITS VALUE BACK AGAIN |
| 2758 | > |
| 2759 | DCA I CLIST /STORE THE CHAR. IN THE KEYBOARD BUFFER |
| 2760 | RTINT, TAD LKHOLD /RESTORE THE LINK TO ITS PRE-INTERRUPT STATE |
| 2761 | CLL RAR |
| 2762 | TAD ACHOLD /RESTORE ACCUMULATOR |
| 2763 | RMF /AND THE MEMORY FIELDS |
| 2764 | ION /WITH INTERRUPT ENABLED, |
| 2765 | JMP I IFRM /RETURN TO MAIN PROGRAM |
| 2766 | ACHOLD, 0000 /HOLD AC AFTER INTERRUPT |
| 2767 | LKHOLD, 0000 /HOLD LINK AFTER INTERRUPT |
| 2768 | |
| 2769 | LINDUN, DCA I CLIST /MARK THE END OF INPUT WITH A 0000 CHAR. IN BUFFER |
| 2770 | TAD (KBUF-1 /REINITIALIZE THE KEYBOARD BUFFER |
| 2771 | DCA CLIST |
| 2772 | DCA ISW /CLEAR THE INPUT SWITCH |
| 2773 | JMS I ZCRLF /PRINT A CARRIAGE RETURN-LINE FEED |
| 2774 | JMP RTINT /RETURN |
| 2775 | |
| 2776 | LNOGO, JMS I ZCRLF /PRINT A CARRIAGE RETURN LINE FEED |
| 2777 | JMS I ZBEGIN /REINITIALIZE INPUT BUFFER |
| 2778 | JMP RTINT /RETURN FROM THE LAST INTERRUPT |
| 2779 | |
| 2780 | /IO STALL SUBROUTINE: RETURN WHEN INPUT IS DONE |
| 2781 | CHKIO, 0000 |
| 2782 | CLA |
| 2783 | TAD ISW /GET THE INPUT SWITCH |
| 2784 | ISZ RANDOM /INCREMENT THE RANDOM NUMBER |
| 2785 | SZA CLA /IS INPUT DONE? |
| 2786 | JMP .-4 /NO: CHECK AGAIN |
| 2787 | IOF /DONT NEED THIS ANYMORE |
| 2788 | JMP I CHKIO /YES: RETURN |
| 2789 | |
| 2790 | RUBGO, CLA |
| 2791 | TAD (KBUF-1 |
| 2792 | CIA |
| 2793 | TAD CLIST |
| 2794 | SNA CLA /ARE WE AT THE BEGINING OF A LINE ALLREADY? |
| 2795 | JMP LNOGO /YES. |
| 2796 | TAD ("\ /NO. PRINT A "\" CHAR |
| 2797 | JMS I ZOUT |
| 2798 | CMA CLA /NOW MOVE BACK THE BUFFER POINTER |
| 2799 | TAD CLIST |
| 2800 | DCA CLIST |
| 2801 | JMP RTINT /RETURN FROM INTERUPT |
| 2802 | |
| 2803 | UGO, CLA |
| 2804 | PRINTO; MESG21 /PRINT A "^U" |
| 2805 | JMP LNOGO /GO SETUP FOR A NEW LINE |
| 2806 | |
| 2807 | \f/FOLLOWING IS THE LEGAL COMMAND LIST |
| 2808 | /IT CONSISTS OF A NUMBER OF 2WORD ENTRIES |
| 2809 | /THE 1ST WORD IN EACH ENTRY IS THE 6BIT REPRESENTATION(NEGATED FOR EASY COMPARING) |
| 2810 | /OF A 2 CHARACTER COMMAND |
| 2811 | /THE 2ND WORD CONTAINS THE ADDRESS TO GO TO IF THAT COMMAND IS TYPED |
| 2812 | COMLST, -2027; COMPW /PW - PLAY WHITE |
| 2813 | -2002; COMPB /PB - PLAY BLACK |
| 2814 | -2016; COMPN /PN - PLAY NIETHER WHITE OR BLACK |
| 2815 | -0204; COMBD /BD - DISPLAY THE POSITION |
| 2816 | -1120; COMIP /IP - INPUT A POSITION |
| 2817 | -2205; START /RE - RESET (RESIGN) |
| 2818 | -1526; CMOVE /MV - MOVE |
| 2819 | -2313; COMSK /SK - SKIP A MOVE |
| 2820 | -0215; COMBM /BM - BLITZ MODE |
| 2821 | -2415; COMTM /TM - TOURNAMENT |
| 2822 | IFNZRO LPTREE < |
| 2823 | -1424; COMLT /LT - OUTPUT TREE TO LINE PRINTER(LP08) |
| 2824 | > |
| 2825 | -0000; 0000 /END OF COMMAND LIST |
| 2826 | |
| 2827 | MESG14, TEXT \STALEMATE\ |
| 2828 | MESG24, TEXT \YOUR MOVE? \ |
| 2829 | |
| 2830 | PAGE |
| 2831 | \f |
| 2832 | /MESSAGE PRINTING SUBROUTINE--CALL WITH ADDR OF MESSAGE IN AC |
| 2833 | /RETURN WITH THE AC CLEAR |
| 2834 | /IF CALLED WITH THE AC IS CLEAR THE ADDRESS OF THE MESSAGE IS TAKEN FROM THE WORD |
| 2835 | /AT THE ADDRESS+1 OF THE CALL TO THIS SUBROUTINE, AND THE RETURN ADDRESS |
| 2836 | /IS THE ADDRESS+2 OF THE CALLING JMS |
| 2837 | MES, 0000 |
| 2838 | SZA /IS THE ADDRESS OF THE MESSAGE IN THE AC? |
| 2839 | JMP .+3 /YES. DONT BOTHER GETTING IT FROM THE WORD FOLLOWING THE JMS |
| 2840 | TAD I MES /NO. BOTHER PLEASE |
| 2841 | ISZ MES /AND INC THE RETURN ADDRESS |
| 2842 | DCA TEMP /STORE THE ADDRESS OF THE MASSAGE |
| 2843 | MES2, TAD I TEMP /GRAB 2 CHARS. PACKED INTO 1 WORD |
| 2844 | RTR |
| 2845 | RTR |
| 2846 | RTR |
| 2847 | JMS TYPO /PRINT CHAR IN BITS 0-5 |
| 2848 | TAD I TEMP |
| 2849 | JMS TYPO /PRINT CHAR IN BITS 6-11 |
| 2850 | ISZ TEMP /NEXT WORD PLEASE |
| 2851 | JMP MES2 |
| 2852 | |
| 2853 | TYPO, 0000 |
| 2854 | AND [0077 /CLEAROUT BITS BELONGING TO THE OTHER CHAR. |
| 2855 | SNA /IS IT A NULL CHARACTER? |
| 2856 | JMP I MES /YES: RETURN |
| 2857 | TAD [-40 /NO. CONVERT IT TO 8 BIT |
| 2858 | SPA |
| 2859 | TAD (100 |
| 2860 | TAD (240 |
| 2861 | JMS I ZOUT /NOW PRINT IT |
| 2862 | JMP I TYPO |
| 2863 | |
| 2864 | /PRINTOUT SUBROUTINE--SINGLE CHARACTER |
| 2865 | OUT, 0000 |
| 2866 | TLS /FIRST PRINT THE CHAR |
| 2867 | TSF /WAIT FOR THE FLAG TO RETURN |
| 2868 | JMP .-1 /NOT YET IT HASN'T |
| 2869 | TCF /CLEAR FLAG TO AVOID TELLEPRINTER INTERUPTS |
| 2870 | CLA |
| 2871 | JMP I OUT /RETURN |
| 2872 | |
| 2873 | /CARRIAGE RETURN & LINE FEED SUBROUTINE |
| 2874 | CRLF, 0000 |
| 2875 | CLA |
| 2876 | TAD (215 |
| 2877 | JMS I ZOUT /PRINT THE CR |
| 2878 | JMS I ZOUT /AND A NULL |
| 2879 | TAD (212 |
| 2880 | JMS I ZOUT /PRINT THE LF |
| 2881 | JMS I ZOUT /PRINT A COUPLE OF NULL FILLER CHARS IN CASE SOMEONE |
| 2882 | JMS I ZOUT /TRYS TO USE A FANCY VIDEO-SCREEN TERMINAL |
| 2883 | JMP I CRLF /RETURN |
| 2884 | |
| 2885 | /INITIALIZE INPUT |
| 2886 | BEGIN, 0000 |
| 2887 | CLA IAC |
| 2888 | DCA ISW /SET THE 'INPUT IN PROGRESS' SWITCH |
| 2889 | TAD (KBUF-1 /INITIALIZE THE KEYBOARD BUFFER POINTER |
| 2890 | DCA CLIST |
| 2891 | TAD (-30 |
| 2892 | DCA CNTCHR /30 CHARACTERS MAXIMUM |
| 2893 | KCC /REINITIALZE THE KEYBOARD FLAG |
| 2894 | JMP I BEGIN /RETURN |
| 2895 | |
| 2896 | /GET A CHARACTER FROM THE INPUT BUFFER |
| 2897 | /IGNOR "-" AND ":" CHARACTERS |
| 2898 | GETC, 0000 |
| 2899 | CLA |
| 2900 | TAD I CLIST /TAKE A CHAR. OUT OF THE BUFFER |
| 2901 | DCA TEMP /MAKE IT EASILY REACHED |
| 2902 | TAD TEMP /FIND OUT IF THE CHAR SHOULD BE IGNORED |
| 2903 | TAD (-"- |
| 2904 | SNA /IS IT A MINUS SIGN? |
| 2905 | JMP GETC+1 /YES. IGNOR IT |
| 2906 | TAD ("--": /NO. TEST FOR A COLON |
| 2907 | SNA CLA /IS IT A COLON? |
| 2908 | JMP GETC+1 /YES. IGNOR IT |
| 2909 | TAD TEMP /NO. LOAD IT BACK INTO AC |
| 2910 | JMP I GETC /RETURN |
| 2911 | |
| 2912 | /SUBROUTINE TO PRINT A "SIGNED OCTAL" NUMBER |
| 2913 | OCTOUT, 0000 |
| 2914 | DCA TEMP |
| 2915 | JMS SPACE /PRINT A LEADING SPACE |
| 2916 | TAD TEMP |
| 2917 | SPA CLA /IS IT A NEGATIVE #? |
| 2918 | TAD ("--" /YES PRINT A MINUS SIGN |
| 2919 | TAD (" |
| 2920 | JMS I ZOUT |
| 2921 | TAD TEMP /GET # AGAIN |
| 2922 | SPA /IS IT NEGATIVE? |
| 2923 | CIA /YES. MAKE POSITIVE |
| 2924 | JMS OCTNFM /PRINT IN OCTAL |
| 2925 | JMP I OCTOUT /RETURN |
| 2926 | |
| 2927 | /SUBROUTINE TO PRINT OUT AN OCTAL NUMBER WITH NO FORMATING |
| 2928 | OCTNFM, 0000 |
| 2929 | RAL /ROTATE INTO POSITION |
| 2930 | DCA TEMP |
| 2931 | TAD (-4 |
| 2932 | DCA TEMP1 /SETUP COUNT FOR 4 DIGITS |
| 2933 | OCTMID, TAD TEMP |
| 2934 | RAL |
| 2935 | RTL |
| 2936 | DCA TEMP |
| 2937 | TAD TEMP |
| 2938 | AND [0007 |
| 2939 | TAD ("0 |
| 2940 | JMS I ZOUT |
| 2941 | ISZ TEMP1 |
| 2942 | JMP OCTMID |
| 2943 | JMP I OCTNFM /RETURN |
| 2944 | |
| 2945 | /SUBROUTINE TO PRINT A SPACE CHARACTER |
| 2946 | SPACE, 0000 |
| 2947 | CLA |
| 2948 | TAD (240 /LOAD AC WITH SPACE CODE |
| 2949 | JMS I ZOUT /SEND IT OUT |
| 2950 | JMP I SPACE /RETURN |
| 2951 | |
| 2952 | IFNZRO OS8 < |
| 2953 | /PRINT A "^C" AND RETURN TO THE OS8 MONITOR |
| 2954 | MONITR, CLA |
| 2955 | PRINTO; MESG18 /PRINT "^C" |
| 2956 | CIF CDF 0 /MONITOR IS IN FIELD 0 |
| 2957 | JMP I (7600 /GO TO MONITOR |
| 2958 | > |
| 2959 | |
| 2960 | IFNZRO LPTREE < |
| 2961 | /SUBROUTINE TO TAB OVER TO COLOMN # "PLY" |
| 2962 | TABPLY, 0000 |
| 2963 | CLA |
| 2964 | TAD PLY /GET PLY # |
| 2965 | SNA /IS IT ZERO? |
| 2966 | IAC /YES. DO ONE TAB ANYWAYS |
| 2967 | CIA |
| 2968 | DCA CMBCNT /SETUP COLOMN COUNTER |
| 2969 | PRINTO; MESG19 /PRINT 8 SPACES |
| 2970 | ISZ CMBCNT /TABBED ENOUGH PLACES YET? |
| 2971 | JMP .-3 /NO. TAB AGAIN |
| 2972 | JMP I TABPLY /YES. RETURN |
| 2973 | CMBCNT, 0000 |
| 2974 | > |
| 2975 | PAGE |
| 2976 | \f |
| 2977 | /SUBROUTINE TO TRY TO INTERPERT THE CONTENTS OF THE KEYBOARD |
| 2978 | /BUFFER AS A MOVE TYPED IN USING MODIFIED |
| 2979 | /ALGEBREIC NOTATION, TEST THE MOVES LEGALITY, AND MAKE THE |
| 2980 | /MOVE ON THE BOARD |
| 2981 | /IF INPUT IS NOT A LEGAL MOVE RETURN IS TO THE ADDRESS+1 |
| 2982 | /OF THE CALLING JMS AND THE AC MAY NOT BE CLEARED |
| 2983 | INMV, 0000 |
| 2984 | CLA |
| 2985 | DCA IOMSW /INITIALIZE MSW AND MDW |
| 2986 | DCA IOMDW |
| 2987 | JMS I ZGETC /GET A CHARACTER |
| 2988 | JMS ISA2H /IS IT A LETTER "A" TO "H" ? |
| 2989 | JMP INCA /NO. MOVE MUST BE CASTLING |
| 2990 | TAD (-301 |
| 2991 | RTL CLL |
| 2992 | RTL |
| 2993 | RTL |
| 2994 | JMS INPAK /STORE THIS CHAR AND GET NEXT |
| 2995 | JMS IS128 /IS IT A NUMBER "1" TO "8" ? |
| 2996 | JMP I INMV /NO: BAD INPUT, TAKE ERROR RETURN |
| 2997 | TAD (-261 |
| 2998 | RTR CLL /ROTATE BITS 9-11 INTO THE 'FROM RANK' POSITION |
| 2999 | RTR |
| 3000 | JMS INPAK /PACK IT INTO MSW AND GET NEXT CHAR |
| 3001 | JMS ISA2H /IS IT A LETTER "A" TO "H" ? |
| 3002 | JMP I INMV /NO. TAKE ERROR RETURN |
| 3003 | TAD (-301 |
| 3004 | JMS INPAK |
| 3005 | JMS IS128 /IS IT A NUMBER "1" TO "8" ? |
| 3006 | JMP I INMV /NO. TAKE ERROR RETURN |
| 3007 | TAD (-261 |
| 3008 | RTL CLL /YES. ROTATE BITS 9-11 INTO THE 'TO RANK' POSITION |
| 3009 | RAL |
| 3010 | JMS INPAK |
| 3011 | TAD (-"= |
| 3012 | SZA CLA /IS IT AN EQUAL SIGN? |
| 3013 | JMP INMID-1 /NO. INPUT FINISHED, CHECK FOR LEGALITY |
| 3014 | NOP /YES. HE SAYS IT'S A PAWN PROMOTION |
| 3015 | JMS I ZGETC /GET THE LETTER OF THE PROMOTION PIECE |
| 3016 | TAD (-"Q |
| 3017 | SNA /IS IT A QUEEN? |
| 3018 | JMP IPPQ /YES |
| 3019 | TAD ("Q-"R |
| 3020 | SNA /IS IT A ROOK? |
| 3021 | JMP IPPR /YES |
| 3022 | TAD ("R-"B |
| 3023 | SNA /IS IT A BISHOP? |
| 3024 | JMP IPPB /YES |
| 3025 | TAD ("B-"N |
| 3026 | SNA /IS IT A KNIGHT? |
| 3027 | JMP IPPN /YES |
| 3028 | JMP I INMV /NO. NONE OF THE ABOVE. TAKE ERROR RETURN |
| 3029 | IPPQ, IAC |
| 3030 | IPPR, IAC |
| 3031 | IPPB, IAC |
| 3032 | IPPN, TAD (0004 |
| 3033 | DCA IOMDW |
| 3034 | JMP INMID-1 |
| 3035 | |
| 3036 | INCA, TAD (-"O |
| 3037 | SZA CLA /COULD IT BE CASTLING? |
| 3038 | JMP I INMV /NO TAKE ERROR RETURN |
| 3039 | JMS I ZGETC /IT MUST BE CASTLING, GET NEXT CHAR |
| 3040 | TAD (-"O |
| 3041 | SZA CLA /IS IT AN "O" ? |
| 3042 | JMP I INMV /NO. TAKE ERROR RETURN |
| 3043 | TAD PONDIR /YES. THE MOVE IS CASTLING CALCULATE THE 8TH RANK |
| 3044 | AND (7070 /AND USE IT TO HELP BUILD AN MSW |
| 3045 | |
| 3046 | TAD (0406 /KING ALWAYS STARTS FROM FILE 4 |
| 3047 | DCA IOMSW |
| 3048 | JMS I ZGETC /GET ANOTHER CHAR |
| 3049 | TAD (-"O /ANOTHER "O" MEANS QUEEN SIDE CASTLING |
| 3050 | SZA /IS IT QUEENS SIDE? |
| 3051 | JMP INMID-1 /NO. INPUT DONE. CHECK FOR LEGALITY |
| 3052 | TAD (-4 /YES. CHANGE 'TO FILE' TO C |
| 3053 | TAD IOMSW |
| 3054 | DCA IOMSW |
| 3055 | JMS GNMVSM /GENERATE THE MOVES OF THE SIDE TO MOVE |
| 3056 | INMID, POP2 /POP OFF AN MDW |
| 3057 | DCA TOMAK2 /STORE IT |
| 3058 | POP2 /POP OFF AN MSW |
| 3059 | SNA /IS IT AN MSW OR THE END OF THE LIST? |
| 3060 | JMP I INMV /END OF LIST AND MOVE NOT FOUND, TAKE ERROR RETURN |
| 3061 | CIA |
| 3062 | TAD IOMSW /COMPARE THE MSW WITH THE ONE HE INPUTED |
| 3063 | SZA CLA /MATCH? |
| 3064 | JMP INMID /NO: TRY NEXT |
| 3065 | TAD IOMSW /YES |
| 3066 | DCA TOMAK1 /STORE THE MSW |
| 3067 | TAD IOMDW /GET THE INPUTED MDW |
| 3068 | SNA CLA /IS IT = 0 ? |
| 3069 | JMP INMID2 /YES. MOVE IS LEGAL |
| 3070 | TAD TOMAK2 |
| 3071 | AND [0007 /CLEAR IRRELEVENT BITS |
| 3072 | CIA |
| 3073 | TAD IOMDW |
| 3074 | SZA CLA /DO THE IMPORTANT PARTS OF THE MDW'S MATCH? |
| 3075 | JMP INMID /NO TRY NEXT MOVE FOR A MATCK |
| 3076 | INMID2, JMS I ZMKMV /MAKE THE MOVE |
| 3077 | IPDL1 /REINITIALIZE PUSH DOWN LIST #1 |
| 3078 | JMS POPOUT /REINITIALIZE PDL2 |
| 3079 | ISZ INMV /NORMAL RETURN IS TO THE ADDRESS+2 OF THE CALLING JMS |
| 3080 | JMP I INMV /RETURN |
| 3081 | |
| 3082 | \f/SUBROUTINE USED BY INMV. ADDS NEW COMPONENT TO 'IOMSW' |
| 3083 | /ALSO GETS NEXT CHAR FROM THE BUFFER, AND RETURN WITH ITS VALUE IN THE AC |
| 3084 | INPAK, 0000 |
| 3085 | TAD IOMSW |
| 3086 | DCA IOMSW |
| 3087 | JMS I ZGETC |
| 3088 | JMP I INPAK |
| 3089 | |
| 3090 | MESG18, TEXT \^C\ |
| 3091 | MESG15, TEXT \O-O-O\ |
| 3092 | NAME, TEXT \CHEKMO-II\ |
| 3093 | |
| 3094 | PAGE |
| 3095 | \f/SUBROUTINE TO OUTPUT A MOVE IN MODIFIED ALGEBREIC NOTATION |
| 3096 | /CALL WITH MSW IN 'IOMSW', AND MDW IN 'IOMDW' |
| 3097 | OUTMV, 0000 |
| 3098 | CLA |
| 3099 | TAD (" |
| 3100 | DCA IOCH1 |
| 3101 | TAD (" |
| 3102 | DCA IOCH2 |
| 3103 | TAD IOMDW |
| 3104 | AND [0007 /BUILD A JUMP |
| 3105 | TAD (JMP .+3 |
| 3106 | DCA .+1 |
| 3107 | HLT /A JUMP TO ONE OF THE NEXT 8 INSTRUCTIONS IS PLACED HERE |
| 3108 | |
| 3109 | JMP OUTSTD /STANDARD OUTPUT FOR NORMAL MOVES |
| 3110 | JMP OUTQCA /QUEEN-SIDE CASTLING |
| 3111 | JMP OUTKCA /KING-SIDE CASTLING |
| 3112 | JMP OUTSTD /STANDARD OUTPUT FOR 'EN PASSANT' CAPTURES |
| 3113 | TAD ("N-"B /PRIMOTE TO A KNIGHT |
| 3114 | TAD ("B-"R /PROMOTE TO A BISHOP |
| 3115 | TAD ("R-"Q /PROMOTE TO A ROOK |
| 3116 | TAD ("Q /PROMOTE TO A QUEEN |
| 3117 | DCA IOCH2 |
| 3118 | TAD ("= /PRINT AN EQUAL SIGN BEFORE LETTER OF THE PROMOTION PIECE |
| 3119 | DCA IOCH1 |
| 3120 | OUTSTD, CLA /DO STANDARD OUTPUT |
| 3121 | TAD IOMSW /GET THE MSW FOR THE MOVE TO BE OUTPUT |
| 3122 | RTR /ROTATE THE 'FROM FILE' BITS INTO AC 9-11 |
| 3123 | RTR |
| 3124 | RTR |
| 3125 | JMS OUTSQR /OUTPUT THE "FROM" SQUARE COORDINATES |
| 3126 | TAD IOMDW /TEST TO SEE IF MOVE IS A CAPTURE |
| 3127 | SPA CLA /IS IT? |
| 3128 | TAD (":-"- /YES: OUTPUT A ":" INSTEAD OF A "-" |
| 3129 | TAD ("- /LOAD AC WITH THE CODE FOR A DASH |
| 3130 | JMS I ZOUT /OUTPUT IT |
| 3131 | TAD IOMSW /GET MSW |
| 3132 | JMS OUTSQR /OUTPUT THE "TO" SQUARE COORDINATES |
| 3133 | TAD IOCH1 /THIS IS A SPACE UNLESS MOVE IS A PAWN PROMOTION |
| 3134 | JMS I ZOUT |
| 3135 | TAD IOCH2 /THIS IS A SPACE UNLESS MOVE IS A PAWN PROMOTION |
| 3136 | JMS I ZOUT /PRINT THE LAST CHARACTER AND, |
| 3137 | JMP I OUTMV /RETURN |
| 3138 | |
| 3139 | \f/SUBROUTINE TO OUTPUT THE COORDINATES OF A SQUARE |
| 3140 | /CALL WITH SQUARE # IN AC BITS 6-11 |
| 3141 | OUTSQR, 0000 |
| 3142 | DCA IOTMP /SAVE SQR # |
| 3143 | TAD IOTMP |
| 3144 | AND [0007 /CLEAR BITS 0-8 |
| 3145 | TAD (301 /OUTPUT FILE AS A CHARACTER "A" TO "H" |
| 3146 | JMS I ZOUT |
| 3147 | TAD IOTMP /GET MSW |
| 3148 | RTR /MOVE RANK INTO BITS 9-11 |
| 3149 | RAR |
| 3150 | AND [0007 |
| 3151 | TAD (261 /BUILD A CHARACTER "1" TO "8" |
| 3152 | JMS I ZOUT /OUTPUT IT |
| 3153 | JMP I OUTSQR /RETURN |
| 3154 | |
| 3155 | OUTKCA, IAC /PASS OVER THE FIRST "O-" OF THE QUEEN SIDE CASTLING MESSAGE |
| 3156 | OUTQCA, TAD (MESG15 /GET ADDRESS OF THE QUEEN SIDE CASTLING MESSAGE |
| 3157 | PRINTO /TYPE THE MESSAGE |
| 3158 | JMP I OUTMV /RETURN |
| 3159 | IOCH1, 0000 |
| 3160 | IOCH2, 0000 |
| 3161 | IOTMP, 0000 |
| 3162 | |
| 3163 | /SUBROUTINE TO CHECK FOR A CHARACTER FROM "1" TO "8". SKIP IF IT IS |
| 3164 | /CALL W/CHARACTER IN AC, RETURN SAME WAY |
| 3165 | IS128, 0000 |
| 3166 | TAD (-"1 |
| 3167 | SPA /GREATER OR EQUAL TO "1"? |
| 3168 | JMP .+4 /NO. DON'T SKIP |
| 3169 | TAD [7770 |
| 3170 | SPA CLA /LESS THAN "8"? |
| 3171 | ISZ IS128 /YES. INC RETURN ADDRESS |
| 3172 | CLA |
| 3173 | TAD TEMP /LOAD THE CHARACTER BACK INTO THE AC |
| 3174 | JMP I IS128 /RETURN |
| 3175 | |
| 3176 | \f/SUBROUTINE TO CHECK FOR A CHARACTER FROM "A" TO "H" |
| 3177 | /CALL W/CHARACTER IN AC, RETURN SAME |
| 3178 | /SUBROUTINE EFFECTS A SKIP IF CHAR IS BETWEEN "A" AND "H" |
| 3179 | ISA2H, 0000 |
| 3180 | TAD (-"A |
| 3181 | SPA /IS IT >= "A" ? |
| 3182 | JMP .+4 /NO. DONT SKIP |
| 3183 | TAD [7770 |
| 3184 | SPA CLA /IS IT <= "H" ? |
| 3185 | ISZ ISA2H /YES. INC RETURN ADDRESS |
| 3186 | CLA |
| 3187 | TAD TEMP /GET CHAR BACK |
| 3188 | JMP I ISA2H /RETURN |
| 3189 | |
| 3190 | /SUBROUTINE TO TEST FOR CHECKMATE OR STALEMATE |
| 3191 | QMATE, 0000 |
| 3192 | JMS GNMVSM /GENERATE THE MOVES OF THE SIDE WHOSE MOVE IT IS |
| 3193 | JMS POPOUT /DONT NEED THE MOVES JUST THE INFO ON THEM |
| 3194 | TAD GNCNT /GET # OF MOVES GENERATED |
| 3195 | SZA CLA /ANY? |
| 3196 | JMP I QMATE /YES. RETURN |
| 3197 | TAD CMSW /NO. GET CHECKMATE SWITCH |
| 3198 | SNA CLA /IS IT SET? |
| 3199 | TAD (-MESG9+MESG14 /NO. GET ADDR OF STALEMATE MESSAGE |
| 3200 | TAD (MESG9 /ADD ADDR OF CHECKMATE MESAGE |
| 3201 | PRINTO /PRINT THE MESSAGE OUT |
| 3202 | JMS I ZCRLF |
| 3203 | JMS DISPLA /PRINTOUT THE FINAL POSITION |
| 3204 | JMP START /START A NEW GAME |
| 3205 | |
| 3206 | |
| 3207 | IFNZRO LPTREE < |
| 3208 | COMLT, TAD LTSW |
| 3209 | CMA |
| 3210 | DCA LTSW |
| 3211 | JMP COMMAN |
| 3212 | > |
| 3213 | COMSK, TAD WHOSE /COMPLIMENT THE "WHOSE MOVE" SWITCH |
| 3214 | CMA /SO THAT SOMEONE MISSES A MOVE |
| 3215 | DCA WHOSE |
| 3216 | DCA LSTMV /DISABLE EN PASSANT PAWN CAPTURES FOR THE NEXT MOVE |
| 3217 | JMP COMMAN |
| 3218 | |
| 3219 | PAGE |
| 3220 | \fMESG19, TEXT \ \ |
| 3221 | MESG21, TEXT \^U\ |
| 3222 | |
| 3223 | IFNZRO LPTREE < |
| 3224 | /SUBROUTINE TO OUTPUT A CHARACTER TO THE LINE PRINTER |
| 3225 | /CALL WITH THE CHAR. IN THE AC, RETURN WITH THE AC CLEARED |
| 3226 | LPTOUT, 0000 |
| 3227 | SNA /TRYING TO PRINT A NULL CHAR ? |
| 3228 | JMP I LPTOUT /YES. DONT BOTHER, JUST RETURN |
| 3229 | DCA LPTMP /STORE THE CHAR JUST FOR A MOMENT |
| 3230 | TAD LTSW /GET TREE PRINTOUT SWITCH |
| 3231 | SNA CLA /IS IT SET? |
| 3232 | JMP I LPTOUT /NO. DO NO OUTPUT TO THE LINE PRINTER |
| 3233 | LAS /READ SWITCHES |
| 3234 | SMA CLA /SWITCH 0 SET? |
| 3235 | JMP I LPTOUT /NO. DO NOT OUTPUT TO LINE PRINTER |
| 3236 | TAD LPTMP /YES. |
| 3237 | PSKE /ERROR? |
| 3238 | SKP /NO. CONTINUE |
| 3239 | JMP .-2 /YES. WAIT FOR THE ERROR TO GO AWAY |
| 3240 | PSKF /IS THE PRINTER READY TO ACCEPT THE CHAR? |
| 3241 | JMP .-1 /NO. TEST AGAIN, AND AGAIN |
| 3242 | PCLF PSTB /YES. PRINT IT |
| 3243 | CLA /GET READY TO RETURN |
| 3244 | PCIE /CLEAR LINE PRINTER INTERUPT FLAG |
| 3245 | JMP I LPTOUT /RETURN |
| 3246 | LPTMP, 0000 /TEMP STORAGE FOR LINE PRINTER ROUTINE |
| 3247 | LTSW, 0000 /TREE PRINTOUT SWITCH |
| 3248 | > |
| 3249 | \f/ CHESSBOARD PRINTER |
| 3250 | |
| 3251 | DISPLAY,0 |
| 3252 | JMS I ZCRLF /PRINT A BLANK LINE |
| 3253 | TAD (BOARD+70-1 |
| 3254 | DCA RNKPTR /POINT TO TOP RANK |
| 3255 | TAD [7770 |
| 3256 | DCA RNKKNT /SET UP FOR 8 RANKS |
| 3257 | RNKLUP, TAD RNKPTR |
| 3258 | DCA XR0 /POINT TO BEFORE LEFTMOST SQUARE IN RANK |
| 3259 | TAD [7770 |
| 3260 | DCA FILKNT /SET UP FOR 8 SQUARES PER RANK |
| 3261 | JMP RL1 |
| 3262 | RL2, TAD (240 |
| 3263 | JMS I ZOUT |
| 3264 | RL1, DCA COLOR /SET COLOR TO ZERO |
| 3265 | TAD I XR0 /GET PIECE |
| 3266 | SNA /IS SQUARE OCCUPIED? |
| 3267 | JMP EMPTY /NO |
| 3268 | SPA /YES |
| 3269 | ISZ COLOR /SET COLOR TO 1 IF BLACK PIECE |
| 3270 | SPA |
| 3271 | CIA /TAKE ABSOLUTE VALUE OF PIECE |
| 3272 | TAD [-PAWN |
| 3273 | SNA /IS IT A PAWN? |
| 3274 | JMP DP /YES |
| 3275 | TAD (PAWN-KNIGHT/NO |
| 3276 | SNA /IS IT A KNIGHT? |
| 3277 | JMP DN /YES |
| 3278 | TAD (KNIGHT-BISHOP/NO |
| 3279 | SNA /IS IT A BISHOP? |
| 3280 | JMP DB /YES |
| 3281 | TAD (BISHOP-ROOK/NO |
| 3282 | SNA /IS IT A ROOK? |
| 3283 | JMP DR /YES |
| 3284 | TAD (ROOK-QUEEN /NO |
| 3285 | SNA /IS IT HER MAJESTY? |
| 3286 | JMP DQ /YES |
| 3287 | TAD (QUEEN-KING /NO |
| 3288 | SNA CLA /IS IT HIS HIGHNESS? |
| 3289 | JMP DK /YES |
| 3290 | TAD ("?-"P /IT'S AN UNKNOWN PIECE |
| 3291 | DP, TAD ("P-"N |
| 3292 | DN, TAD ("N-"B |
| 3293 | DB, TAD ("B-"R |
| 3294 | DR, TAD ("R-"K |
| 3295 | DK, TAD ("K-"Q |
| 3296 | DQ, TAD ("Q |
| 3297 | DCA PIECE /SAVE PIECE |
| 3298 | TAD COLOR /WHICH COLOR PIECE IS IT? |
| 3299 | SZA CLA |
| 3300 | TAD ("B-"W /BLACK |
| 3301 | TAD ("W /WHITE |
| 3302 | JMS I ZOUT /PRINT COLOR OF PIECE |
| 3303 | TAD PIECE |
| 3304 | JMS I ZOUT /PRINT NAME OF PIECE |
| 3305 | JMP NEXT |
| 3306 | EMPTY, TAD XR0 |
| 3307 | RTR |
| 3308 | RAR |
| 3309 | AND [0007 /ISOLATE RANK |
| 3310 | TAD XR0 /ADD IN FILE |
| 3311 | RAR /PUT PARITY IN LINK |
| 3312 | SZL CLA /WHITE OR BLACK SQUARE? |
| 3313 | TAD ("--"* /WHITE |
| 3314 | TAD ("* /BLACK |
| 3315 | DCA PIECE |
| 3316 | TAD PIECE |
| 3317 | JMS I ZOUT |
| 3318 | TAD PIECE |
| 3319 | JMS I ZOUT |
| 3320 | NEXT, ISZ FILKNT /AT END OF RANK? |
| 3321 | JMP RL2 /NO, GO ON TO NEXT SQUARE |
| 3322 | JMS I ZCRLF /YES, GO TO NEXT RANK |
| 3323 | TAD RNKPTR |
| 3324 | TAD [7770 |
| 3325 | DCA RNKPTR |
| 3326 | ISZ RNKKNT /WAS THIS THE LAST RANK? |
| 3327 | JMP RNKLUP /NO, PROCEED TO NEXT RANK |
| 3328 | JMS I ZCRLF /AN EXTRA CRLF FOR GOOD LUCK |
| 3329 | JMP I DISPLAY /RETURN |
| 3330 | |
| 3331 | PAGE |
| 3332 | \f |
| 3333 | /CHESS POSITION INPUTTER |
| 3334 | /INPUT A LINE AT A TIME IN FORSYTH NOTATION |
| 3335 | / |
| 3336 | / POSIBLE ERRORS.... |
| 3337 | / 1? TRYING TO PUT TOO MUCH STUFF ON A RANK |
| 3338 | / 2? INCOMPLETE RANK SPECIFICATION(NOT ENOUGH STUFF) |
| 3339 | / 3? UNKNOWN PIECE LETTER |
| 3340 | / 4? PIECE COLOR NOT "W" OR "B" |
| 3341 | |
| 3342 | INPUT, 0 |
| 3343 | JMS I ZCRLF |
| 3344 | TAD (BOARD+70-1 |
| 3345 | DCA RNKPTR |
| 3346 | TAD [7770 |
| 3347 | DCA RNKKNT /SET UP FOR 8 RANKS |
| 3348 | RNLUP, TAD RNKPTR |
| 3349 | DCA XR0 |
| 3350 | TAD ("> |
| 3351 | JMS I ZOUT /PRINT A ">" TO INDIACTE READYNESS FOR INPUT |
| 3352 | TAD (7767 |
| 3353 | DCA FILKNT |
| 3354 | JMS I ZBEGIN /SETUP TO READ A LINE OF INPUT |
| 3355 | ION /GO ! |
| 3356 | JMS I ZCHKIO |
| 3357 | RL3, JMS I ZGETC /READ A CHARACTER |
| 3358 | SNA /AT END OF LINE? |
| 3359 | JMP EOL /YES |
| 3360 | JMS I (IS128 /IS CHAR A DIGIT? |
| 3361 | JMP LETTR /NO |
| 3362 | TAD (-260 /YES, CONVERT TO DIGIT |
| 3363 | CIA |
| 3364 | DCA COLOR |
| 3365 | JMS CHK /TEST FOR TOO ENOUGH STUFF ON THIS RANK ALREADY |
| 3366 | DCA I XR0 |
| 3367 | ISZ COLOR |
| 3368 | JMP .-3 |
| 3369 | JMP RL3 |
| 3370 | |
| 3371 | LETTR, TAD (-"B |
| 3372 | SNA /IS IT A BLACK PIECE? |
| 3373 | JMP BLP /YES |
| 3374 | TAD ("B-"W |
| 3375 | SZA CLA /IS IT A WHITE PIECE? |
| 3376 | JMP ERR4 /NOT "B" OR "W" |
| 3377 | WHP, STA |
| 3378 | BLP, DCA COLOR |
| 3379 | JMS CHK |
| 3380 | JMS I ZGETC /GET PIECE NAME |
| 3381 | TAD (-"B |
| 3382 | SNA /IS IT A BISHOP? |
| 3383 | JMP GB /YES |
| 3384 | TAD ("B-"N /NO |
| 3385 | SNA /IS IT A KNIGHT? |
| 3386 | JMP GN /YES |
| 3387 | TAD ("N-"P /NO |
| 3388 | SNA /IS IT A PAWN? |
| 3389 | JMP GP /YES |
| 3390 | TAD ("P-"R /NO |
| 3391 | SNA /IS IT A ROOK? |
| 3392 | JMP GR /YES |
| 3393 | TAD ("R-"K /NO |
| 3394 | SNA /IT IT A KING? |
| 3395 | JMP GK /YES |
| 3396 | TAD ("K-"Q /NO |
| 3397 | SNA /IT IT A QUEEN? |
| 3398 | JMP GQ /YES |
| 3399 | TAD ("Q-"S /NO |
| 3400 | SNA CLA /IS IT A SPRINGER? |
| 3401 | JMP GN /YES, ACCEPT AS KNIGHT |
| 3402 | JMP ERR3 /UNKNOWN PIECE |
| 3403 | |
| 3404 | GP, TAD (PAWN-KNIGHT |
| 3405 | GN, TAD (KNIGHT-BISHOP |
| 3406 | GB, TAD (BISHOP-ROOK |
| 3407 | GR, TAD (ROOK-QUEEN |
| 3408 | GQ, TAD (QUEEN-KING |
| 3409 | GK, TAD (KING |
| 3410 | ISZ COLOR /WHICH COLOR |
| 3411 | CIA /COMPLEMENT VALUE IF BLACK |
| 3412 | DCA I XR0 /STORE AWAY PIECE |
| 3413 | JMP RL3 /REITERATE |
| 3414 | |
| 3415 | EOL, ISZ FILKNT /WERE 8 SQUARES INPUTTED? |
| 3416 | JMP ERR2 /NO, TOO FEW SQUARES |
| 3417 | TAD RNKPTR |
| 3418 | TAD [7770 |
| 3419 | DCA RNKPTR /POINT TO NEXT RANK |
| 3420 | ISZ RNKKNT /WAS THIS LAST RANK? |
| 3421 | JMP RNLUP /NO |
| 3422 | DCA BPSW /YES. INITIALIZE POSITION STATUS WORDS |
| 3423 | DCA WPSW /TO ALLOW CASTLING |
| 3424 | DCA LSTMV /DISSALLOW EN PASSANT PAWN CAPTURES FOR THE NEXT MOVE |
| 3425 | JMS BRDVAL /THEN FIGURE OUT ITS VALUE |
| 3426 | /<<DANGER>> THE AC MIGHT NOT EQUAL ZERO NOW! |
| 3427 | JMS I ZCRLF /LET GUY KNOW HE'S THROUGH |
| 3428 | JMS DISPLA /PRINT OUT THE BOARD JUST INPUTED |
| 3429 | JMP I INPUT /RETURN |
| 3430 | |
| 3431 | ERR4, IAC |
| 3432 | ERR3, IAC |
| 3433 | ERR2, IAC |
| 3434 | ERR1, TAD (61 |
| 3435 | JMS I ZOUT |
| 3436 | TAD ("? |
| 3437 | JMS I ZOUT |
| 3438 | JMS I ZCRLF |
| 3439 | JMP RNLUP |
| 3440 | |
| 3441 | CHK, 0 |
| 3442 | ISZ FILKNT /IS THIS RANK FULL ALREADY? |
| 3443 | JMP I CHK /NO. KEEP GOING |
| 3444 | JMP ERR1 /YES. SIGNAL ERROR |
| 3445 | |
| 3446 | MESG9, TEXT \CHECKMATE\ |
| 3447 | MESG22, TEXT \B. \ |
| 3448 | MESG23, TEXT \W. \ |
| 3449 | |
| 3450 | PAGE |
| 3451 | \f*7400 |
| 3452 | /TABLE AREA |
| 3453 | |
| 3454 | MAP, ZBLOCK 50 /50 WORDS RESERVED FOR PIECE MAP |
| 3455 | |
| 3456 | KBUF, ZBLOCK 30 /30 WORDS RESERVED FOR THE KEYBOARD BUFFER |
| 3457 | |
| 3458 | / THE BOARD |
| 3459 | |
| 3460 | BOARD, IFNZRO .&0077<?BOARD MUST OCCUPY 1ST OR 2ND HALF OF A PAGE ?> |
| 3461 | |
| 3462 | |
| 3463 | ROOK |
| 3464 | KNIGHT |
| 3465 | BISHOP |
| 3466 | QUEEN |
| 3467 | KING |
| 3468 | BISHOP |
| 3469 | KNIGHT |
| 3470 | ROOK |
| 3471 | |
| 3472 | PAWN |
| 3473 | PAWN |
| 3474 | PAWN |
| 3475 | PAWN |
| 3476 | PAWN |
| 3477 | PAWN |
| 3478 | PAWN |
| 3479 | PAWN |
| 3480 | |
| 3481 | ZBLOCK 40 |
| 3482 | |
| 3483 | -PAWN |
| 3484 | -PAWN |
| 3485 | -PAWN |
| 3486 | -PAWN |
| 3487 | -PAWN |
| 3488 | -PAWN |
| 3489 | -PAWN |
| 3490 | -PAWN |
| 3491 | |
| 3492 | -ROOK |
| 3493 | -KNIGHT |
| 3494 | -BISHOP |
| 3495 | -QUEEN |
| 3496 | -KING |
| 3497 | -BISHOP |
| 3498 | -KNIGHT |
| 3499 | -ROOK |
| 3500 | |
| 3501 | $&$ |
| 3502 | \fSAID FARMER BROWN |
| 3503 | \fWHOSE BALD |
| 3504 | \fON TOP |
| 3505 | \fWISH I COULD |
| 3506 | \fROTATE THE CROP |
| 3507 | \fBURMA SHAVE |
| 3508 | \f |
| 3509 | \fCHEKMO-II WAS WRITTEN, PRODUCED AND DIRECTED BY: JOHN E. COMEAU |
| 3510 | \f |