A large commit.
[pdp8.git] / sw / chekmo / CHEKMO.PA
CommitLineData
81e70d48
PH
1/ CHEKMO II
2ZZZ=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
46PDLS=6400 /BEGINING OF 1000(OCTAL) WORDS RESERVED FOR PUSH DOWN LISTS
47
48/PIECE VALUES DEFINED
49DECIMAL
50KING= 15^32 /15. RELATIVE TO A PAWNS VALUE
51QUEEN= 9^32 /9.0 RELATIVE TO A PAWNS VALUE
52ROOK= 5^32 /5.0 RELATIVE TO A PAWNS VALUE
53BISHOP= 3^32+10 /3.3 RELATIVE TO A PAWNS VALUE
54KNIGHT= 3^32+4 /3.1 RELATIVE TO A PAWNS VALUE
55PAWN= 1^32 /1.0 RELATIVE TO A PAWNS VALUE
56
57OCTAL
58
59/PSEUDO INSTRUCTIONS DEFINED
60PUSH1= JMS I [PUSH01 /PUSH THE AC INTO PUSH DOWN LIST #1
61POP1= JMS I [POP01 /POP THE TOP ENTRY OF PUSH DOWN LIST #1 INTO THE AC
62PRINTO= JMS I [MES /PRINT 6BIT 2CHAR/WORD TEXT AT ADDRESS SPECIFIED IN THE AC
63IPDL1= JMS I [IPDL01 /INITIALIZE PUSH DOWN LIST #1
64PUSH2= JMS I [PUSHIT /PUSH THE CONTENTS OF THE AC INTO PUSH DOWN LIST #2
65POP2= JMS I [POPIT /POP THE TOP ENTRY OF PUSH DOWN LIST #2 INTO THE AC
66IPDL2= JMS I [PDLIN /INITIALIZE PUSH DOWN LIST #2
67SNO= JMS I [RFOFL /SKIP NO OVERFLOW (C(AC)>=0 & C(AC8)=0)
68
69/PDP 8/E IOTS DEFINED
70CAF= 6007
71PSKF=6661
72PCLF=6662
73PSKE=6663
74PSTB=6664
75PCIE=6667
76
77/CONDITIONAL ASSEMBLY DEFINITIONS
78OS8=1 /NO SPECIAL MEANING TO "^C"
79LPTREE=1 /DON'T INCLUDE LINE PRINTER CAPABILITIES
80DEBUG=1 /OPT FOR DYNAMIC ERROR DETECTION
81RANVAL=1 /NOISY EVALUATIONS PLEASE
82
83/DEFAULT ASSEMBLY DEFINITIONS
84IFNDEF OS8 <OS8=0> /NON OS8 SYSTEM
85IFNDEF DEBUG <DEBUG=0> /DEBUG SWITCH CLEARED
86IFNDEF LPTREE <LPTREE=0> /DONT INCLUDE TREE PRINTOUT CAPABILITIES
87IFNDEF 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!
167IFRM, 0000
168 JMP I .+1
169 INTHAN /ADDRESS OF THE INTERUPT HANDLER
170REV, ZZZ /LOC 3 HOLDS PROGRAM REVISION #
171ODT4, 0000 /LOCATIONS 4, 5, AND 6 ARE RESERVED FOR DEBUGERS
172ODT5, 0000
173ODT6, 0000
174
175/ ZERO PAGE CONSTANTS
176*11
177RANDOM, 0000
178XR0, 0000
179ITMP0, 0000
180ITMP1, 0000 /AUTO-INCREMENT TEMPORARY STORAGE
181ITMP2, 0000
182CLIST, KBUF-1 /INPUT BUFFER POINTER
183LIST2, 0000
184TEMP, 0000 /TEMPORARY STORAGE LOCATIONS
185TEMP1, 0000 / .
186TEMP2, 0000 / .
187TEMP3, 0000 / .
188TEMP4, 0000 / .
189TMP, 0000 /TEMPORARY STORAGE
190ZOUT, OUT /POINTS TO OUTPUT ROUTINE
191CHAR, 0000 /TEMP. STORAGE PLACE FOR A CHARACTER
192ZCRLF, CRLF /POINTS TO CR-LF PRINTING ROUTINE
193XXXX, 0000 /TEMPORARY STORAGE
194ZBEGIN, BEGIN /POINTS TO INPUT INITIATING ROUTINE
195CNTCHR, 0000 /CHARACTER COUNT
196ISW, 0000 /INPUT SWITCH
197ZGETC, GETC /POINTS TO INPUT BUFFER READING ROUTINE
198PONDIR, 0001 /PAWN DIRECTION CONSTANT
199M1, 0000
200M2, 0000
201M3, 0000
202M4, 0000
203GN1, 0000 /COMMON STORAGE FOR THE MOVE GENERATION ROUTINES
204GN2, 0000 / .
205GN3, 0000 / .
206GN4, 0000 / .
207GNMSW, 0000 / .
208GNMDW, 0000 / .
209FSTRNK, 7777 /-VALUE OF THE FIRST RANK
210ZCHKIO, CHKIO /POINTS TO IO STALL ROUTINE
211WPSW, 0000 /WHITES POSITION STATUS WORD
212BPSW, 0000 /BLACKS POSITION STATUS WORD
213CPSW, 0000 /ADDRESS OF CURRENT POSITION STATUS WORD IS KEPT HERE
214GMAP, 0000
215OMAP, 0000
216TOMAK1, 0000 /MOVE SQUARE WORD HERE
217TOMAK2, 0000 /MOVE DATA WORD HERE
218DIR1, 0000
219DIR2, 0000
220CNTR1, 0000
221WKING, 0000 /ADDRESS OF THE WHITE KING IS STORED HERE
222BKING, 0000 /ADDRESS OF THE BLACK KING IS STORED HERE
223CKING, 0000 /ADRESS OF THE KING BEING TESTED
224TKING, 0000 /TEMP STORAGE FOR KING ADDR
225LSTMV, 0000 /LOCATION WHICH DESCRIBES THE LAST MOVE MADE IF DOUBLE PAWN MOVE
226ZGNMV, GNMV /POINTS TO MOVE GENERATION ROUTINE
227ZMKMV, MKMV /POINTS TO THE MOVE MAKING ROUTINE
228ZUNMV, UNMV /POINTS TO THE MOVE UNMAKING ROUTINE
229ZMAPEC, MAPEC /POINTS TO PIECE MAP ROUTINE
230PW, 0000 /SET = TO TOTAL VALUE OF ALL PIECES ON THE BOARD BY 'MAPEC'
231WHOSE, 0000 /THIS LOC =0 IF IT IS WHITES MOVE, =-1 IF BLACKS
232PCNT, 0000 /USED BY CHKATK =# OF PIECES ATTACKING THE SQUARE
233PVAL, 0000 /USED BY CHKATK =LEAST VALUABLE ATTACKER
234PSQR, 0000 /USED BY CHKATK =ADDRESS OF THE LEAST VALUABLE ATTACKING PIECE
235ZSPLIT, SPLIT /POINTS TO A SUBROUTINE WHICH SPLITS UP A MSW
236ZTSTCH, TSTCHK /POINTS TO CHECK TESTING ROUTINE
237ZFNL, TSTCHK /POINTS TO FINAL LEGAL MOVE VERIFICATION ROUTINE
238GNCNT, 0000 /LOC=NUMBER OF MOVES GENERATED BY GNWMV
239TOADR, 0000
240IOMDW, 0000 /ARGUMENT STORAGE FOR I/O ROUTINES
241IOMSW, 0000 /ARGUMENT STORAGE FOR I/O ROUTINES
242CMSW, 0000 /CHECKMATE SWITCH
243SMSW, 0000 /STALEMATE SWITCH
244COMP, 0000
245ZLOOKA, LOOKA /POINTS TO THE RECURSIVE LOOKAHEAD SUBROUTINE
246UVAL1, 0000
247CVAL1, 3777
248RVAL1, 0000
249MVAL1, 0000 /HOLDS MOBILITY VALUE
250PLY, 0000 /HOLDS CURRENT RECURSION LEVEL OF THE "LOOKA" SUBROUTINE
251DEPTH, 0003 /HOLDS THE MAXIMUM RECURSION LEVEL FOR THE "LOOKA" SUBROUTINE
252RDEPTH, 0000
253BUG, 0000
254RNKKNT, 0000 /TEMP STORAGE FOR BOARD OUTPRINT & BOARD INPUT ROUTINES
255FILKNT, 0
256PIECE, 0
257COLOR, 0
258RNKPTR, 0
259MOBMOD, 0000
260KNGBLK, 0000 /SET BY "GNMV" TO # OF KING MOVES ILLEGAL BECAUSE OF CHECK
261MOB0, 0000
262MOB1, 0000
263CTNEED, 0000
264STRATG, 0000 /HOLDS STRATEGIC VALUE
265PC01, 0000 /POINTER FOR PUSH DOWN LIST #1
266PDLADR, 0000 /POINTER FOR PUSH DOWN LIST #2
267IFNZRO DEBUG<
268ENO, 0000
269ENOB, 0000
270>
271WHOWHI, 0000
272WHOBLK, 0000
273COMTMP, 0000
274BOGUS, 0000
275DOMAP, 0000
276\f*200
277START, 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
286COMPN, DCA WHOWHI /RESET SWITCH FOR THE USER TO PLAY WHITE
287 DCA WHOBLK /RESET SWITCH FOR THE USER TO PLAY BLACK
288COMMAN, 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
299USER, 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
315NUTHER, 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
326COMPW, ISZ WHOWHI /SET SWITCH TO INDICATE THAT WHITE IS PLAYED
327 JMP COMMAN /BY THE COMPUTER
328
329COMPB, ISZ WHOBLK /SET THE SWITCH TO INDICATE THAT BLACK IS PLAYED
330 JMP COMMAN /BY THE COMPUTER
331
332COMBD, JMS DISPLAY /DISPLAY THE BOARD ON THE TELLETYPE
333 JMP COMMAN
334
335COMIP, JMS INPUT /GET THE INPUT OF A POSITION FROM THE TELLETYPE
336 JMP COMPN
337
338UINP, 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
347BLKMVE, PRINTO; MESG22 /BRINT "B. "
348 TAD WHOBLK
349 SNA CLA /DOES THE USER PLAY BLACK, OR DOES THE COMPUTER?
350 JMP USER /THE USER
351CMOVE, 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
373CMOVE1, 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
396PAGE
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
414GNMV, 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
452NXTSQR, 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
489QMVCNT, 0000
490GNCHEK, 0000
491
492TSCMSM, 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
513TIME, 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
526RFOFL, 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
537PAGE
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
543LINE, 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
552LINEM, 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
574XOOO, 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
577XXOX, 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
581LCNT, 0000
582
583/ROUTINE TO STORE THE MSW AND MDW IN THE PDL
584GNSTR, 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
598XYZ, 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
611GQM, 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
618GRM, 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
625GBM, 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
635BLDMSW, 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
649PUSHIT, 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
655POPIT, 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
664PUSH01, 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
672POP01, 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
679PAGE
680\f/ROUTINE TO GENERATE ALL MOVES OF A KING OR KNIGHT
681/CALLED WITH THE MOVE GENERATION LIST ADDRESS-1 IN AC
682SNGMV, 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
713SNGKNT, TAD GNMSW
714 JMS I ZFNL /DO FINAL CHECK
715 JMP XXXO /KING IS ATTACKED: KNIGHT MOVE NO GOOD
716SNGLGL, 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
724XXXO, CLA
725 ISZ SCNT /TESTED ALL DIRECTIONS?
726 JMP SNGMV+4 /NO. TRY THE NEXT ONE
727 JMP I SNGMV /YES. RETURN
728
729SCNT, 0000 /DIRECTION COUNTER
730
731
732GPM, 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
748GPM1, 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
768OTRX, 1 /BISHOP MOVE DIRECTION LIST
769 -1
770
771 1
772 1
773
774 -1
775 -1
776
777 -1
778 1
779
780OTR, 1 /ROOK MOVE DIRECTION LIST
781 0
782
783 0
784 -1
785
786 0
787 1
788
789 -1
790 0
791
792KNLST, 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
816PAGE
817\f/GENERATE KING MOVES
818GKM, 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
836GKM2, 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
880CAKR, 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
913GKM1, 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
928GNM, CLA /GENERATE KNIGHT MOVES
929 TAD (KNLST-1/GET ADDRESS OF THE KNIGHT MOVE GENERATION LIST
930 JMS SNGMV
931 JMP NXTSQR
932PAGE
933\f/SUBROUTINE TO BUILD A 'TO SQUARE' ADDRESS
934/RETURN WITH ADDRESS IN LOC 'TOADR'
935BLDTO, 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
947CLRFIX, 0000
948COLR, 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
952GNEP, 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
995GNOTF, 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
1013GNEPDN, TAD [-PAWN
1014 JMS CLRFIX
1015 DCA I GNEPTM /REPLACE THE PAWN THAT WAS REMOVED EARLIER
1016 JMP I GNEP /RETURN
1017GNEPTM, 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
1023MAPEC, 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
1040MAPGO, 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
1045MAPOC, 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
1055MAPOCB, 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
1063PAGE
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
1068PROMCK, 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
1088PPLSTR, JMS GNSTR /STORE MOVE IN PDL2
1089 JMP I PROMCK /RETURN
1090PROM1, 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
1101CAPTST, 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:
1132ISLNM, 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
1164TOOS, 0000
1165 \f
1166PDLIN, 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
1179OFLOW, 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
1193MESG26, TEXT \I RESIGN\
1194
1195PAGE
1196\f
1197/CHECK FOR LEGAL KING MOVE
1198ISLKM, 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
1220ROW, 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
1243MIDLIN, 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
1258SUBR1, 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
1279SUBR2, 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
1297ISLQM, 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
1304ISLBM, CLA
1305 JMS SUBR1
1306 JMP BATAK
1307 JMP GATAK
1308
1309ISLRM, CLA
1310 JMS SUBR2
1311 JMP BATAK
1312 JMP GATAK
1313
1314PAGE
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
1328CHKATK, 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
1349TAG0, 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
1364TAG2, 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
1372TAG3, 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
1376TMATK, 0000
1377CKMODE, 0000
1378TMATK1, 0000
1379TAG1, CLA
1380 TAD OMAP /GET ADDRESS-1 OF THE ATTACKERS PIECE MAP
1381 DCA TOMAK1
1382BATAK, 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
1425GATAK, 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
1439TAG4, TAD I TMATK /YES. REPLACE THE OLD VALUE WITH THIS ONE
1440 DCA PVAL
1441 TAD TMATK
1442 DCA PSQR
1443 JMP BATAK
1444
1445PAGE
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
1451TSTCHK, 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
1487TSTCH1, 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?
1498TSTCH2, 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
1508MMOVE, 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
1521UMOVE, 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
1530MMUMTM, 0000
1531MMUMT1, 0000
1532
1533/SUBROUTINE TO GENERATE ALL MOVES FOR WHITE
1534GNWMV, 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
1555GNBMV, 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
1574PAGE
1575\f
1576/SUBROUTINE TO TEST FOR WHITE ATTACKS
1577/CALL WITH ADDRESS OF THE SQUARE TO BE TESTED IN AC
1578TSTWAT, 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
1591TSTBAT, 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'
1606MKMV, 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
1625MKMV1, 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
1669MKQSC, 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
1675MKCA1, 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
1685MKKSC, 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
1691MKEP, 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
1703MKMVDN, 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
1711PAGE
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'
1716UNMV, 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
1764UNQP, 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
1778UNKSC, 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
1781UNKS1, 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
1789UNQSC, 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
1794UNEP, 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
1807UNMVDN, 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
1818SPLIT, 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
1836PLYCHP, 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
1848TSTBRD, 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>
1859PAGE
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
1866COMPAR, 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
1883XXAP, 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
1888XXCL, ISZ COMPAR /'COMP' IS LARGER
1889XXAL, ISZ COMPAR /AC IS LARGER
1890 CLA
1891 JMP I COMPAR /RETURN
1892COMPAC, 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
1896BRDVAL, 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
1909PRNCNT, 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)
1942EVAL1, JMS HIEP /GET THE CONTROVERSIAL VALUE
1943 JMS LCLRFX
1944 TAD STRATG
1945 JMP I EVAL /RETURN
1946
1947EVAL2, 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
1957MOBGET, 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
1983MOBGE1, 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
1991MOBGTM, 0000
1992
1993PAGE
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
2003LOOKA, 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
2021LOOKA1, 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
2056LKFUR, 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
2067PICK, 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
2073IFNZRO 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
2090POPOUT, 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
2101GNMVSM, 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
2110PAGE
2111
2112\fCOMPMV, CLA
2113IFNZRO 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
2128RPLACE, 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
2143ALPHAB, 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
2152ALPHAP, 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
2161JMPICK, IFNZRO LPTREE <
2162 JMS I ZCRLF /CARRIAGE RETURN
2163 JMS TABPLY /TAD TO COLOMN # "PLY"
2164>
2165 CLA
2166 JMP PICK
2167
2168SAVBRD, 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
2184BESTBL, 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
2188SETPNT, 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
2195ADCON, 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
2213PAGE
2214\f
2215LKAD, 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
2220LKSM, 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
2229DONE, 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
2273LKXM, 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
2279PLYFIX, 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
2287LCLRFX, 0000
2288 NOP /COMPUTER HAS: WHITE="NOP", BLACK="CIA"
2289 JMP I LCLRFX /RETURN
2290
2291\f/STATIC EVALUATION ROUTINE
2292LEVAL, 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
2305IFNZRO 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
2326PRUNE, 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
2337PRNPRO, 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
2346PPA, JMS BSTOP /COUNT ON A "PRE-ANALYSIS"
2347PPZ, JMP I PRUNE /RETURN
2348
2349PPB, 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
2357PAGE
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
2361BSTOP, 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
2376BSTOP1, 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
2389BSTOP2, 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
2410BREV, 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
2426BREV1, 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
2433BREV2, 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
2448COEV, 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
2454COEV1, 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
2462COEV2, 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
2469COTB, BOARD+33
2470 BOARD+34
2471 BOARD+43
2472 BOARD+44
2473
2474/CASTLING STATUS EVALUATOR
2475CASTEV, 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
2491PAGE
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"
2501ENPRIS, 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
2522ENPRWH, 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
2538ENPR0, 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
2562ENPR2, TAD I ENPRAD
2563 CIA
2564 JMP I ENPRIS /RETURN
2565ENPR1, 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?
2570ENPR3, CLA /NO. PIECE IS NOT EN PRISE
2571 CIA
2572 JMS CLRFIX
2573 JMP I ENPRIS /RETURN
2574ENPRAD, 0000
2575ENPVAL, 0000
2576ENPSQR, 0000
2577ENPCNT, 0000
2578 IFNZRO DEBUG<
2579/TEST OF THE "ENPRIS" ROUTINE
2580TESTEP, JMS INPUT
2581 JMS I ZMAPEC
2582 TAD [BOARD
2583 DCA TSTTMP
2584 TAD (7700
2585 DCA TSTCNT
2586TEP2, 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
2595TEP1, ISZ TSTTMP
2596 ISZ TSTCNT
2597 JMP TEP2
2598 HLT
2599 JMP TESTEP
2600TSTTMP, 0000
2601TSTCNT, 0000
2602>
2603PAGE
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"
2612HIEP, 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
2626HIEP1, 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
2662HIEP2, 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
2673HIEPFX, 0000
2674HIEPX, HLT /NOP,BLACKS MOVE/CIA,WHITES MOVE
2675 JMP I HIEPFX
2676
2677HIEPVL, 0000
2678HIEPTM, 0000
2679HIEPCN, 0000
2680HIEPMS, 0000
2681HMAPAD, 0000
2682
2683
2684/SUBROUTINE TO SETUP THE BOARD
2685SETBRD, 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
2710COMTM, IAC /TOURNAMENT MODE SETTING
2711 IAC
2712COMBM, IAC /BLITZ MODE SETTING
2713 DCA DEPTH /DEPTH=3 FOR TOURNAMENT MODE, DEPTH=1 FOR BLITZ MODE
2714 JMP COMMAN
2715
2716PAGE
2717\f
2718/THIS IS THE INTERRUPT HANDLING ROUTINE
2719INTHAN, 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.
2753IFNZRO 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
2760RTINT, 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
2766ACHOLD, 0000 /HOLD AC AFTER INTERRUPT
2767LKHOLD, 0000 /HOLD LINK AFTER INTERRUPT
2768
2769LINDUN, 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
2776LNOGO, 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
2781CHKIO, 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
2790RUBGO, 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
2803UGO, 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
2812COMLST, -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
2827MESG14, TEXT \STALEMATE\
2828MESG24, TEXT \YOUR MOVE? \
2829
2830PAGE
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
2837MES, 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
2843MES2, 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
2853TYPO, 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
2865OUT, 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
2874CRLF, 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
2886BEGIN, 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
2898GETC, 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
2913OCTOUT, 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
2928OCTNFM, 0000
2929 RAL /ROTATE INTO POSITION
2930 DCA TEMP
2931 TAD (-4
2932 DCA TEMP1 /SETUP COUNT FOR 4 DIGITS
2933OCTMID, 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
2946SPACE, 0000
2947 CLA
2948 TAD (240 /LOAD AC WITH SPACE CODE
2949 JMS I ZOUT /SEND IT OUT
2950 JMP I SPACE /RETURN
2951
2952IFNZRO OS8 <
2953/PRINT A "^C" AND RETURN TO THE OS8 MONITOR
2954MONITR, CLA
2955 PRINTO; MESG18 /PRINT "^C"
2956 CIF CDF 0 /MONITOR IS IN FIELD 0
2957 JMP I (7600 /GO TO MONITOR
2958>
2959
2960IFNZRO LPTREE <
2961/SUBROUTINE TO TAB OVER TO COLOMN # "PLY"
2962TABPLY, 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
2973CMBCNT, 0000
2974>
2975PAGE
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
2983INMV, 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
3029IPPQ, IAC
3030IPPR, IAC
3031IPPB, IAC
3032IPPN, TAD (0004
3033 DCA IOMDW
3034 JMP INMID-1
3035
3036INCA, 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
3056INMID, 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
3076INMID2, 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
3084INPAK, 0000
3085 TAD IOMSW
3086 DCA IOMSW
3087 JMS I ZGETC
3088 JMP I INPAK
3089
3090MESG18, TEXT \^C\
3091MESG15, TEXT \O-O-O\
3092NAME, TEXT \CHEKMO-II\
3093
3094PAGE
3095\f/SUBROUTINE TO OUTPUT A MOVE IN MODIFIED ALGEBREIC NOTATION
3096/CALL WITH MSW IN 'IOMSW', AND MDW IN 'IOMDW'
3097OUTMV, 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
3120OUTSTD, 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
3141OUTSQR, 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
3155OUTKCA, IAC /PASS OVER THE FIRST "O-" OF THE QUEEN SIDE CASTLING MESSAGE
3156OUTQCA, TAD (MESG15 /GET ADDRESS OF THE QUEEN SIDE CASTLING MESSAGE
3157 PRINTO /TYPE THE MESSAGE
3158 JMP I OUTMV /RETURN
3159IOCH1, 0000
3160IOCH2, 0000
3161IOTMP, 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
3165IS128, 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"
3179ISA2H, 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
3191QMATE, 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 <
3208COMLT, TAD LTSW
3209 CMA
3210 DCA LTSW
3211 JMP COMMAN
3212>
3213COMSK, 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
3219PAGE
3220\fMESG19, TEXT \ \
3221MESG21, TEXT \^U\
3222
3223IFNZRO LPTREE <
3224/SUBROUTINE TO OUTPUT A CHARACTER TO THE LINE PRINTER
3225/CALL WITH THE CHAR. IN THE AC, RETURN WITH THE AC CLEARED
3226LPTOUT, 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
3246LPTMP, 0000 /TEMP STORAGE FOR LINE PRINTER ROUTINE
3247LTSW, 0000 /TREE PRINTOUT SWITCH
3248>
3249\f/ CHESSBOARD PRINTER
3250
3251DISPLAY,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
3257RNKLUP, 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
3262RL2, TAD (240
3263 JMS I ZOUT
3264RL1, 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
3291DP, TAD ("P-"N
3292DN, TAD ("N-"B
3293DB, TAD ("B-"R
3294DR, TAD ("R-"K
3295DK, TAD ("K-"Q
3296DQ, 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
3306EMPTY, 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
3320NEXT, 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
3331PAGE
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
3342INPUT, 0
3343 JMS I ZCRLF
3344 TAD (BOARD+70-1
3345 DCA RNKPTR
3346 TAD [7770
3347 DCA RNKKNT /SET UP FOR 8 RANKS
3348RNLUP, 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
3357RL3, 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
3371LETTR, 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"
3377WHP, STA
3378BLP, 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
3404GP, TAD (PAWN-KNIGHT
3405GN, TAD (KNIGHT-BISHOP
3406GB, TAD (BISHOP-ROOK
3407GR, TAD (ROOK-QUEEN
3408GQ, TAD (QUEEN-KING
3409GK, 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
3415EOL, 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
3431ERR4, IAC
3432ERR3, IAC
3433ERR2, IAC
3434ERR1, TAD (61
3435 JMS I ZOUT
3436 TAD ("?
3437 JMS I ZOUT
3438 JMS I ZCRLF
3439 JMP RNLUP
3440
3441CHK, 0
3442 ISZ FILKNT /IS THIS RANK FULL ALREADY?
3443 JMP I CHK /NO. KEEP GOING
3444 JMP ERR1 /YES. SIGNAL ERROR
3445
3446MESG9, TEXT \CHECKMATE\
3447MESG22, TEXT \B. \
3448MESG23, TEXT \W. \
3449
3450PAGE
3451\f*7400
3452/TABLE AREA
3453
3454MAP, ZBLOCK 50 /50 WORDS RESERVED FOR PIECE MAP
3455
3456KBUF, ZBLOCK 30 /30 WORDS RESERVED FOR THE KEYBOARD BUFFER
3457
3458/ THE BOARD
3459
3460BOARD, 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
3481ZBLOCK 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