Commit | Line | Data |
---|---|---|
81e70d48 PH |
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 |