21 / :::::::::::::::::::::::::::::::
26 / : CHESS PROGRAM 2/74 :
30 / :::::::::::::::::::::::::::::::
35 / FIELD 0 CORE UTILIZATION
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
46 PDLS=6400 /BEGINING OF 1000(OCTAL) WORDS RESERVED FOR PUSH DOWN LISTS
50 KING= 15^32 /15. RELATIVE TO A PAWNS VALUE
51 QUEEN= 9^32 /9.0 RELATIVE TO A PAWNS VALUE
52 ROOK= 5^32 /5.0 RELATIVE TO A PAWNS VALUE
53 BISHOP= 3^32+10 /3.3 RELATIVE TO A PAWNS VALUE
54 KNIGHT= 3^32+4 /3.1 RELATIVE TO A PAWNS VALUE
55 PAWN= 1^32 /1.0 RELATIVE TO A PAWNS VALUE
59 /PSEUDO INSTRUCTIONS DEFINED
60 PUSH1= JMS I [PUSH01 /PUSH THE AC INTO PUSH DOWN LIST #1
61 POP1= JMS I [POP01 /POP THE TOP ENTRY OF PUSH DOWN LIST #1 INTO THE AC
62 PRINTO= JMS I [MES /PRINT 6BIT 2CHAR/WORD TEXT AT ADDRESS SPECIFIED IN THE AC
63 IPDL1= JMS I [IPDL01 /INITIALIZE PUSH DOWN LIST #1
64 PUSH2= JMS I [PUSHIT /PUSH THE CONTENTS OF THE AC INTO PUSH DOWN LIST #2
65 POP2= JMS I [POPIT /POP THE TOP ENTRY OF PUSH DOWN LIST #2 INTO THE AC
66 IPDL2= JMS I [PDLIN /INITIALIZE PUSH DOWN LIST #2
67 SNO= JMS I [RFOFL /SKIP NO OVERFLOW (C(AC)>=0 & C(AC8)=0)
77 /CONDITIONAL ASSEMBLY DEFINITIONS
78 OS8=1 /NO SPECIAL MEANING TO "^C"
79 LPTREE=1 /DON'T INCLUDE LINE PRINTER CAPABILITIES
80 DEBUG=1 /OPT FOR DYNAMIC ERROR DETECTION
81 RANVAL=1 /NOISY EVALUATIONS PLEASE
83 /DEFAULT ASSEMBLY DEFINITIONS
84 IFNDEF OS8 <OS8=0> /NON OS8 SYSTEM
85 IFNDEF DEBUG <DEBUG=0> /DEBUG SWITCH CLEARED
86 IFNDEF LPTREE <LPTREE=0> /DONT INCLUDE TREE PRINTOUT CAPABILITIES
87 IFNDEF RANVAL <RANVAL=1> /INCLUDE A SMIDGEN OF RANDOMNESS IN EVALUATIONS
95 / - MINUS, NEGATIVE OR TO
105 / MSW MOVE SQUARE WORD
111 / PSW POSITION STATUS WORD
114 / PDL#1 PUSH DOWN LIST #1
115 / PDL#2 PUSH DOWN LIST #2
121 \f/ MOVE SQUARE WORD(MSW) FORMAT
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 / -------------------------------------------------------------------------
129 / -----------------I----------------- -----------------I-----------------
131 / SIXBIT ADDRESS OF THE SIXBIT ADDRESS OF THE
132 / "FROM SQUARE" "TO SQUARE"
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 / -------------------------------------------------------------------------
146 / I ----I---- ----------------I---------------- -------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
169 INTHAN /ADDRESS OF THE INTERUPT HANDLER
170 REV, ZZZ /LOC 3 HOLDS PROGRAM REVISION #
171 ODT4, 0000 /LOCATIONS 4, 5, AND 6 ARE RESERVED FOR DEBUGERS
175 / ZERO PAGE CONSTANTS
180 ITMP1, 0000 /AUTO-INCREMENT TEMPORARY STORAGE
182 CLIST, KBUF-1 /INPUT BUFFER POINTER
184 TEMP, 0000 /TEMPORARY STORAGE LOCATIONS
189 TMP, 0000 /TEMPORARY STORAGE
190 ZOUT, OUT /POINTS TO OUTPUT ROUTINE
191 CHAR, 0000 /TEMP. STORAGE PLACE FOR A CHARACTER
192 ZCRLF, CRLF /POINTS TO CR-LF PRINTING ROUTINE
193 XXXX, 0000 /TEMPORARY STORAGE
194 ZBEGIN, BEGIN /POINTS TO INPUT INITIATING ROUTINE
195 CNTCHR, 0000 /CHARACTER COUNT
196 ISW, 0000 /INPUT SWITCH
197 ZGETC, GETC /POINTS TO INPUT BUFFER READING ROUTINE
198 PONDIR, 0001 /PAWN DIRECTION CONSTANT
203 GN1, 0000 /COMMON STORAGE FOR THE MOVE GENERATION ROUTINES
209 FSTRNK, 7777 /-VALUE OF THE FIRST RANK
210 ZCHKIO, CHKIO /POINTS TO IO STALL ROUTINE
211 WPSW, 0000 /WHITES POSITION STATUS WORD
212 BPSW, 0000 /BLACKS POSITION STATUS WORD
213 CPSW, 0000 /ADDRESS OF CURRENT POSITION STATUS WORD IS KEPT HERE
216 TOMAK1, 0000 /MOVE SQUARE WORD HERE
217 TOMAK2, 0000 /MOVE DATA WORD HERE
221 WKING, 0000 /ADDRESS OF THE WHITE KING IS STORED HERE
222 BKING, 0000 /ADDRESS OF THE BLACK KING IS STORED HERE
223 CKING, 0000 /ADRESS OF THE KING BEING TESTED
224 TKING, 0000 /TEMP STORAGE FOR KING ADDR
225 LSTMV, 0000 /LOCATION WHICH DESCRIBES THE LAST MOVE MADE IF DOUBLE PAWN MOVE
226 ZGNMV, GNMV /POINTS TO MOVE GENERATION ROUTINE
227 ZMKMV, MKMV /POINTS TO THE MOVE MAKING ROUTINE
228 ZUNMV, UNMV /POINTS TO THE MOVE UNMAKING ROUTINE
229 ZMAPEC, MAPEC /POINTS TO PIECE MAP ROUTINE
230 PW, 0000 /SET = TO TOTAL VALUE OF ALL PIECES ON THE BOARD BY 'MAPEC'
231 WHOSE, 0000 /THIS LOC =0 IF IT IS WHITES MOVE, =-1 IF BLACKS
232 PCNT, 0000 /USED BY CHKATK =# OF PIECES ATTACKING THE SQUARE
233 PVAL, 0000 /USED BY CHKATK =LEAST VALUABLE ATTACKER
234 PSQR, 0000 /USED BY CHKATK =ADDRESS OF THE LEAST VALUABLE ATTACKING PIECE
235 ZSPLIT, SPLIT /POINTS TO A SUBROUTINE WHICH SPLITS UP A MSW
236 ZTSTCH, TSTCHK /POINTS TO CHECK TESTING ROUTINE
237 ZFNL, TSTCHK /POINTS TO FINAL LEGAL MOVE VERIFICATION ROUTINE
238 GNCNT, 0000 /LOC=NUMBER OF MOVES GENERATED BY GNWMV
240 IOMDW, 0000 /ARGUMENT STORAGE FOR I/O ROUTINES
241 IOMSW, 0000 /ARGUMENT STORAGE FOR I/O ROUTINES
242 CMSW, 0000 /CHECKMATE SWITCH
243 SMSW, 0000 /STALEMATE SWITCH
245 ZLOOKA, LOOKA /POINTS TO THE RECURSIVE LOOKAHEAD SUBROUTINE
249 MVAL1, 0000 /HOLDS MOBILITY VALUE
250 PLY, 0000 /HOLDS CURRENT RECURSION LEVEL OF THE "LOOKA" SUBROUTINE
251 DEPTH, 0003 /HOLDS THE MAXIMUM RECURSION LEVEL FOR THE "LOOKA" SUBROUTINE
254 RNKKNT, 0000 /TEMP STORAGE FOR BOARD OUTPRINT & BOARD INPUT ROUTINES
260 KNGBLK, 0000 /SET BY "GNMV" TO # OF KING MOVES ILLEGAL BECAUSE OF CHECK
264 STRATG, 0000 /HOLDS STRATEGIC VALUE
265 PC01, 0000 /POINTER FOR PUSH DOWN LIST #1
266 PDLADR, 0000 /POINTER FOR PUSH DOWN LIST #2
277 START, IFNZRO LPTREE <
279 DCA ZOUT /MAKE SURE OUTPUT GOES TO THE TTY
282 PRINTO; NAME /PRINT "CHEKMO-II"
285 JMS SETBRD /SETUP THE BOARD
286 COMPN, DCA WHOWHI /RESET SWITCH FOR THE USER TO PLAY WHITE
287 DCA WHOBLK /RESET SWITCH FOR THE USER TO PLAY BLACK
288 COMMAN, IPDL2 /INITIALIZE PUSH DOWN LISTS
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?
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?
299 USER, PRINTO; MESG24 /PRINT "YOUR MOVE?"
300 JMS I ZBEGIN /SETUP TO ACCEPT A LINE OF INPUT
301 ION /ACCEPT IT ANY TIME NOW
302 JMS I ZCHKIO /WAIT FOR IT TO FINISH
303 JMS I ZGETC /GET 1ST CHAR
304 AND [0077 /ONLY NEED 6 BITS
305 RTL CLL /MOVE THEM TO THE HIGH ORDER 6 BITS
308 DCA COMTMP /STORE FOR A WHILE
309 JMS I ZGETC /GET 2ND CHAR
310 AND [0077 /ONLY NEED 6 BITS
311 TAD COMTMP /WE NOW HAVE THE FIRST 2 INPUT CHARS PACKED
312 DCA COMTMP /6BIT STYLE IN 1 WORD
313 TAD (COMLST-2/ADDRESS-2 OF THE COMMAND LIST
314 DCA XR0 /TO AUTO INDEX REGISTER
315 NUTHER, ISZ XR0 /INC POINTER TO POINT AT A 6BIT COMMAND IN THE COMMAND LIST
316 TAD I XR0 /GET A LEGAL 6BIT COMMAND
317 SNA /WERE THERE ANY MORE TO GET?
318 JMP UINP /NO. THE USER MUST BE TRYING TO ENTER A MOVE
319 TAD COMTMP /YES. COMPARE WITH THE ONE THE USER JUST INPUTED
320 SZA CLA /IS IT A MATCH?
321 JMP NUTHER /NO. TRY AGAIN
322 TAD I XR0 /YES. GET THE TRANSFER ADDRESS
326 COMPW, ISZ WHOWHI /SET SWITCH TO INDICATE THAT WHITE IS PLAYED
327 JMP COMMAN /BY THE COMPUTER
329 COMPB, ISZ WHOBLK /SET THE SWITCH TO INDICATE THAT BLACK IS PLAYED
330 JMP COMMAN /BY THE COMPUTER
332 COMBD, JMS DISPLAY /DISPLAY THE BOARD ON THE TELLETYPE
335 COMIP, JMS INPUT /GET THE INPUT OF A POSITION FROM THE TELLETYPE
338 UINP, JMS I ZBEGIN /REINIT THE KEYBOARD BUFFER POINTER
339 JMS INMV /WAS A LEGAL MOVE TYPED IN?
341 JMP COMMAN /YES. IT WAS ALSO MADE BY THE "INMOVE" SUBROUTINE
343 JMS I ZOUT /TO INDICATE THE ERROR
345 JMP COMMAN /TRY AGAIN
347 BLKMVE, PRINTO; MESG22 /BRINT "B. "
349 SNA CLA /DOES THE USER PLAY BLACK, OR DOES THE COMPUTER?
351 CMOVE, CLA /COMPUTER NOW MAKES A MOVE
352 TAD (3777 /INITIALIZE SEARCH VALUE TO PREVENT PRUNING AT THE FIRST PLY
354 DCA PLY /MAKE SURE PLY # IS 0 BEFORE ENTERING RECURSIVE EVALUATOR
356 TAD (LPTOUT /SWITCH OUTPUT DEVICE TO LINE PRINTER
359 JMS DISPLA /PRINT THE BOARD AT PLY 0
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
367 DCA RDEPTH /SAVE THE REAL DEPTH
369 DCA DEPTH /SET THE DEPTH TO 1 TEMPORARILY
370 JMS I ZLOOKA /FIND OUT WHICH MOVE LOOKS THE BEST
372 DCA DEPTH /RESTORE THE REAL DEPTH
373 CMOVE1, JMS I ZLOOKA /FIGURE OUT WHICH MOVE TO MAKE
375 TAD (OUT /SWITCH OUTPUT DEV. BACK TO TTY
382 TAD BESTBL /GET THE LAST MOVE TO WIN A COMPARE ON PLY #1
383 DCA TOMAK1 /FROM THE TABLE OF BEST MOVES
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
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
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
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
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
434 TAD CNTR1 /SPLIT THE KINGS SQUARES ADDR UP INTO RANK AND FILE #'S
436 DCA GN2 /STORE THE FILE #
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
445 SZA CLA /IS THE KING IN DOUBLE CHECK?
446 JMP TSCMSM /YES. NO USE TRYING TO GENERATE MOVES BY OTHER PIECES
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
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
458 DCA CTNEED /INITIALIZE THE CHECK TEST NEED SWITCH
459 TAD CNTR1 /NOW STRIP RANK AND FILE NUMBERS FROM THE ADDRESS
461 DCA GN2 /STORE THE FILE NUMBER
466 DCA GN1 /STORE THE RANK NUMBER
467 TAD I CNTR1 /GET THE VALUE OF THE PIECE ON THE SQUARE
483 JMP NXTSQR /YES. TRY NEXT PIECE SINCE KING MOVES HAVE ALLREADY BEEN GENERATED
487 HLT /NO. SOMTHINGS WRONG HERE !
492 TSCMSM, TAD QMVCNT /ADD # OF QUEEN MOVES & QUEEN MOVE REJECTS
495 CLL RAR /AC WIL EQUAL 3/4 OF THE # OF QUEEN MOVES & REJECTS
497 TAD MOBMOD /FROM THE MOBILITY MODIFIER
498 TAD GNCNT /ADD "REAL" MOBILITY IN WITH THE MOBILITY MODIFIER
501 TAD GNCNT /GET # OF MOVES GENERATED
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
511 /ROUTINE TO ALLOW THE TIMING OF THE "GNMV" SUBROUTINE
512 /CALLS IT 4000(OCTAL) TIMES, THEN HALTS
518 4000 /# OF ITTERATIONS OF THE TIMING LOOP
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
528 JMP I RFOFL /YES. RETURN
529 RTR /SHIFT BIT 8 INTO LINK
530 RTR /IF IT'S SET OVERFLOW HAS OCCURED
532 JMP I RFOFL /YES. RETURN (WITH A GARBLED ACCUMULATOR)
534 RTL /SHIFT THE WORD BACK TO NORMAL
535 ISZ RFOFL /INC RETURN ADDRESS
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
544 TAD I ITMP0 /GET THE VERTICAL DIRECTION
546 TAD I ITMP0 /GET THE HORIZINTAL DIRECTION
547 DCA DIR2 /SAVE THAT ALSO
552 LINEM, TAD GN3 /BUILD SQUARE RANK NUMBER
554 SNO /IS THAT RANK REALY ON THE BOARD?
555 JMP XXOX /NO. IT DOES NOT EXIST
561 TAD I CNTR1 /GET VALUE OF THE MOVING PIECE
564 SNA CLA /ARE WE TESTING FOR A LEGAL QUEEN MOVE?
565 ISZ QMVCNT /YES. INC QUEEN MOVE COUNTER
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
573 JMS GNSTR /PUSH THE MOVE INTO THE STACK
574 XOOO, TAD I TOADR /GET THE VALUE OF THE PIECE ON THE 'TO SQUARE'
575 SNA CLA /WAS THE MOVE A CAPTURE?
576 JMP LINEM /NO. COULD BE MORE MOVES IN THIS DIRECTION
577 XXOX, CLA /YES. NO MORE MOVES IN THIS DIRECTION
578 ISZ LCNT /DONE ALL DIRECTIONS?
579 JMP LINE /NO. TRY ANOTHER
580 JMP NXTSQR /YES. DONE WITH THIS PIECE. TRY NEXT
583 /ROUTINE TO STORE THE MSW AND MDW IN THE PDL
585 ISZ GNCNT /INC GENERATION COUNT
588 SZA CLA /SHOULD THESE MOVES GO INTO PDL#2?
589 JMP I GNSTR /NO. DONT PUT ANY THERE!
591 PUSH2 /PUSH IT INTO THE LIST
592 TAD GNMDW /GET THE MDW
593 PUSH2 /PUSH IT INTO LIST
596 /SUBROUTINE TO TEST IF THE 'TO' SQUARE IS OCCUPIED BY OWN PIECE
597 /IF NOT SKIP FOR RETURN AND BUILD MSW
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
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
611 GQM, CLA /GENERATE QUEEN MOVES
612 TAD [-10 /DO ALL DIRECTIONS
614 TAD (OTRX-1 /DIAGONAL AND ORTHOGONAL
618 GRM, CLA /GENERATE ROOK MOVES
619 TAD (-4 /DO ONLY HALF OF THE DIRECTIONS
621 TAD (OTR-1 /THE ORTHOGONAL ONES
625 GBM, CLA /GENERATE BISHOP MOVES
626 TAD (-4 /DO ONLY HALF OF THE DIRECTIONS
628 TAD (OTRX-1 /THE DIAGONAL ONES
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
638 AND [0077 /STRIP THE 'TO SQUARE' ADDRESS DOWN INTO 6BIT
639 DCA GNMSW /STORE IT TEMPORARILY
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
645 TAD GNMSW /NOW PACK THE 6BIT 'TO SQUARE' ADDRESS IN WITH IT
646 DCA GNMSW /STORE AWAY THE NEW MSW
649 PUSHIT, 0000 /PUSH ROUTINE
650 DCA I PDLADR /PUT NEW ITEM ON TOP
652 JMS OFLOW /TEST FOR LIST OVERLAP
655 POPIT, 0000 /POP ROUTINE
657 TAD PDLADR /MOVE LIST POINTER DOWN
658 SMA /MAKE SURE LIST DOESN'T GO WILD
659 HLT /IT DID! MANY EXTRA POPS
661 TAD I PDLADR /GRAB THE TOP WORD
662 JMP I POPIT /RETURN WITH IT
665 DCA I PC01 /PUT NEW ITEM ON TOP
668 DCA PC01 /PUSH IT DOWN
669 JMS OFLOW /TEST FOR PDL OVERFLOW
673 ISZ PC01 /MOVE THE LIST POINTER DOWN
675 HLT /LOTS OF EXTRA POPS
676 TAD I PC01 /GRAB THE WORD ON TOP
677 JMP I POP01 /RETURN WITH IT
680 \f/ROUTINE TO GENERATE ALL MOVES OF A KING OR KNIGHT
681 /CALLED WITH THE MOVE GENERATION LIST ADDRESS-1 IN AC
683 DCA ITMP0 /STORE THE ADDRESS OF THE LIST
685 DCA SCNT /THERE ARE 8 DIRECTIONS
686 DCA GNMDW /INITIALIZE THE MDW
690 JMP XXXO-1 /YES TRY ANOTHER DIRECTION
696 TAD I CNTR1 /GET VALUE OF THE MOVING PIECE
699 SZA CLA /IS IT A KING?
700 JMP SNGKNT /NO: ITS A KNIGHT
702 JMS MMOVE /MAKE THE KING MOVE
704 DCA TEMP /TEST FOR AN ATTACK ON THE KINGS NEW SQUARE
705 IAC /AND RETURN AFTER THE FIRST ATTACK IS FOUND
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
714 JMS I ZFNL /DO FINAL CHECK
715 JMP XXXO /KING IS ATTACKED: KNIGHT MOVE NO GOOD
716 SNGLGL, TAD I TOADR /GET VALUE OF THE 'TO' SQUARE
717 SZA CLA /IS THE MOVE A CAPTURE?
718 CLA STL RAR /YES: SET CAPTURE BIT
720 DCA GNMDW /STORE MDW AGAIN
721 JMS GNSTR /PUSH MOVE INTO LIST
723 ISZ ITMP0 /FAILED ON FIRST LIST ELEMENT. PASS OVER SECOND
725 ISZ SCNT /TESTED ALL DIRECTIONS?
726 JMP SNGMV+4 /NO. TRY THE NEXT ONE
727 JMP I SNGMV /YES. RETURN
729 SCNT, 0000 /DIRECTION COUNTER
732 GPM, CLA /GENERATE THE MOVES OF A PAWN
738 JMP GPM1 /MOVING 1 FORWARD BLOCKED: FORGET 2
739 TAD GN1 /MOVING 1 FORWARD IS NOT BLOCKED. NOW TEST FOR 2
742 JMP GPM1 /NOT THIS PAWNS FIRST MOVE. CAN'T MOVE 2
744 DCA GNMDW /SETUP MDW TO INDICATE DOUBLE PAWN MOVE(TEMPORARY INDICATION)
747 NOP /MUST BE HERE CAUSE "PST" SUBROUTINE SOMETIMES RETURNS TO ADDRESS+2 OF THE CALLING JMS
748 GPM1, CLA /NOW TEST CAPTURES
757 SZA CLA /CAN IT CAPTURE TO THE HIGH SIDE?
758 JMP .+2 /NO. IT WAS ON THE EDGE OF THE HIGH SIDE
762 SPA /CAN IT CAPTURE TO THE LOW SIDE?
763 JMP .+3 /NO. IT WAS ON THE LOW EDGE
767 \f/FOLLOWING ARE THE MOVE GENERATION DIRECTION LISTS
768 OTRX, 1 /BISHOP MOVE DIRECTION LIST
780 OTR, 1 /ROOK MOVE DIRECTION LIST
792 KNLST, 2 /KNIGHT MOVE DIRECTION LIST
817 \f/GENERATE KING MOVES
820 IAC CLA /SETUP MDW TO INDICATE CASTLING
822 TAD PONDIR /BUILD THE ADDRESS OF THE KINGS ORIGINAL SQUARE
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
829 SNA CLA /IS IT A KING?
831 TAD I CPSW /NO. MAKE 'CPSW' REFLECT THIS
832 AND [0007 /SAVE BITS 9-11 IN CASE HE IS CASTLED
833 TAD (3000 /SET THE "NO MORE CASTLING" BITS
834 DCA I CPSW /NO MORE CASTLING
835 JMP GKM1 /BUT NORMAL KING MOVES ARE OK. GENERATE THEM NOW
836 GKM2, TAD TEMP /CHANGE 'TEMP' TO EQUAL THE ADDRESS OF THE QUEENS ROOK
837 AND [7770 /BY CHANGING THE FILE TO A
838 DCA TEMP /STORE ADDRESS OF QUEENS ROOK
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)
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
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
878 DCA GNMSW /STORE THE NEW MSW
879 JMS GNSTR /PUSH THE MOVE ONTO PDL2
881 TAD I CPSW /TRY TO GENERATE A KING SIDE CASTLING MOVE
882 RAL /MOVE 'KING ROOK BIT' OF THE PSW INTO AC0
884 JMP GKM1 /YES. KINGS ROOK HAS ALLREADY MOVED
885 TAD TEMP /NO. BUILD ADDRESS OF THE KINGS ROOK
889 TAD I TEMP /GET THE VALUE OF THE PIECE ON H1(H8)
892 SNA CLA /IS IT A ROOK?
893 JMP .+5 /YES CONTINUE
894 CLA STL RTR /NO. 'KING ROOK BIT' LIED: FIX IT
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
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!!
911 ISZ GNMDW /INC MDW SO THAT IT INDICATES KING SIDE CASTLING
912 JMS GNSTR /STORE THE MOVE IN PDL2
914 TAD (OTRX-1 /NOW GENERATE 'NORMAL' KING MOVES
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
928 GNM, CLA /GENERATE KNIGHT MOVES
929 TAD (KNLST-1/GET ADDRESS OF THE KNIGHT MOVE GENERATION LIST
933 \f/SUBROUTINE TO BUILD A 'TO SQUARE' ADDRESS
934 /RETURN WITH ADDRESS IN LOC 'TOADR'
936 TAD GN3 /GET RANK # AND ROTATE IT
937 RTL CLL /INTO ITS PROPER PLACE(BITS 6-8)
939 TAD GN4 /ADD IN THE FILE #
940 TAD [BOARD /ADD IN BOARD ADDRESS CONSTANT
941 DCA TOADR /STORE THE ADDRESS
945 /SUBROUTINE TO FIX THE COLOR PROBLEM, AND ALLOW ANY SUBROUTINE
946 /TO WORK WITH BLACK PIECES AS WELL AS WHITE PIECES
948 COLR, HLT /=NOP FOR WHITE, =CIA FOR BLACK
950 \f/SUBROUTINE TO GENERATE 'EN PASSANT' PAWN CAPTURES
951 /IF PAWNS MYSTERYOUSLY CHANGE COLOR, THIS ROUTINE IS THE LIKLEY SUSPECT
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
961 TAD [BOARD /ADD IN BOARD ADDRESS CONSTANT
962 DCA CNTR1 /STORE THE ADDRESS OF THE CAPTURED PAWN
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
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
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
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
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
996 TAD CNTR1 /GET THE 'FROM SQUARE ADDRESS'
997 TAD (-2 /CHANGE IT TO POINT TO THE ADDJACENT FILE ON THE OTHER SIDE
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
1006 SZA CLA /IS IT A PAWN?
1008 JMS BLDMSW /YES. BUILD AN MSW
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
1015 DCA I GNEPTM /REPLACE THE PAWN THAT WAS REMOVED EARLIER
1017 GNEPTM, 0000 /LOCATION FOR STORAGE OF THE CAPTURED PAWNS ADDRESS
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
1025 TAD [BOARD /SETUP BOARD ADDRESS
1028 SNA CLA /IS A MAP REALY NECCESARY?
1029 JMP I MAPEC /NO. RETURN
1031 TAD (MAP-1 /YES. SETUP MAP OF WHITES PIECE ADDRESSES
1033 TAD (MAP+23 /SETUP MAP OF BLACK PIECE ADDRESSES
1035 TAD (-100 /SETUP COUNT FOR 100(OCTAL) SQUARES ON THE BOARD
1037 TAD I ITMP2 /GET VALUE OF THE PIECE ON THE SQUARE
1038 SZA /IS SQUARE OCCUPIED?
1040 MAPGO, ISZ TEMP4 /FINISHED BOARD YET?
1041 JMP .-4 /NO. DO MORE SQUARES
1042 DCA I ITMP0 /YES. PUT A 0000 AT THE END OF THE WHITE MAP
1043 DCA I ITMP1 /ALSO AT THE END OF THE BLACK MAP
1045 MAPOC, SPA /IS IT WHITE OR BLACK?
1046 JMP MAPOCB /ITS BLACK
1047 TAD (-KING /ITS WHITE. IS IT A KING?
1051 DCA WKING /STORE ADDRESS OF THE WHITE KING
1053 DCA I ITMP0 /PUT IT IN THE WHITE MAP WHATEVER IT IS
1055 MAPOCB, TAD (KING /IS IT THE BLACK KING?
1057 JMP .+3 /NO. PROCEDE NORMALY
1058 TAD ITMP2 /YES, GET ITS ADDRESS
1060 TAD ITMP2 /GET THE ADDRESS
1061 DCA I ITMP1 /EITHER WAY, PUT IT IN THE BLACK MAP
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
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
1080 TAD [0004 /SET 'PAWN PROMOTION BIT' (BIT 9) OF THE MDW
1082 JMS GNSTR /STORE PROMOTION TO KNIGHT MOVE IN PDL2
1083 ISZ GNMDW /CHANGE MDW TO INDICATE PROMOTION TO A BISHOP
1084 JMS GNSTR /STORE MOVE IN PDL2
1085 ISZ GNMDW /CHANGE MDW TO INDICATE PROMOTION TO A ROOK
1086 JMS GNSTR /STORE MOVE IN PDL2
1087 ISZ GNMDW /CHANGE THE MDW TO INDICATE PROMOTION TO A QUEEN
1088 PPLSTR, JMS GNSTR /STORE MOVE IN PDL2
1089 JMP I PROMCK /RETURN
1090 PROM1, CLL RTR /CLEAR LINK(BIT 1)AND REROTATE THE MDW BACK INTO POSITION
1091 DCA GNMDW /RESTORE THE MDW
1092 TAD GNMSW /NOW GET THE MSW
1093 AND [0077 /EXTRACT 'TO SQUARE' INFO
1094 RTL CLL /ROTATE THE INFO SO THAT IT FITS IN MDW BITS 3-8
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
1100 /SUBROUTINE TO CHECK FOR LEGAL PAWN CAPTURES
1102 JMS BLDTO /BUILD THE ADDRESS OF THE 'TO' SQUARE
1103 TAD I TOADR /GET THE VALUE OF THE SQUARE
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
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
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.
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
1131 /TEST FOR LEGAL KNIGHT CAPTURE:
1135 TAD M1 /COMPARE RANKS
1166 PDLIN, 0000 /INITIALIZE THE LIST
1169 DCA PDLADR /INITIALIZE LIST ADDRESS
1172 \fIPDL01, 0000 /INITIALIZE PUSH DOWN LIST #1
1176 JMP I IPDL01 /RETURN
1178 /SUBROUTINE TO TEST FOR PUSH DOWN LIST OVERFLOW
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!!!!!
1188 DCA ZOUT /MAKE SURE OUTPUT GOES TO THE TTY
1190 PRINTO; MESG26 /PRINT "I RESIGN"
1193 MESG26, TEXT \I RESIGN\
1197 /CHECK FOR LEGAL KING MOVE
1219 /ROUTINE TO CHECK FOR PIECES IN THE MOVE ROW
1225 RAL CLL /GET THE SIGN
1234 RAL CLL /GET THE SIGN
1241 TAD TMATK /GET THE SQUARE OF THE ATTACKER
1242 DCA TEMP3 /COPY IT SO WE DONT HAVE TO DESTROY THE ORIGINAL
1243 MIDLIN, TAD TEMP3 /SET TO NEXT SQUARE
1246 TAD TEMP3 /COMPARE IT WITH THE ATTACKED SQUARE
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
1257 /CHECK FOR LEGAL BISHOP MOVE
1272 SZA CLA /ARE BOTH SQUARES ON THE SAME DIAGONAL?
1274 JMS ROW /YES. FIND OUT IF ANY PIECES ARE BLOCKING THAT DIAGONAL
1275 ISZ SUBR1 /NONE FOUND -- INC RETURN ADDRESS
1278 /CHECK FOR LEGAL ROOK MOVE
1285 JMP .+6 /SAME RANK. FORGET FILE
1290 JMP I SUBR2 /BOTH RANK AND FILE CHANGED?!
1292 ISZ SUBR2 /NO PIECES IN THE WAY-- INC RETURN ADDRESS
1295 /CHECK FOR LEGAL QUEEN MOVE
1296 /GO TO 'GATAK' IF IT IS
1297 ISLQM, JMS SUBR2 /CHECK FOR A QUEEN MOVE 'ROOK STYLE'
1300 JMS SUBR1 /IF NOT CHECK FOR BISHOP STYLE QUEEN MOVE
1301 JMP BATAK /NIETHER ONE
1302 JMP GATAK /FOUND BISHOP STYLE QUEEN MOVE
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
1329 DCA CKMODE /SET RETURN MODE SWITCH
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 #
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
1342 DCA M3 /STORE RANK #
1343 TAD PONDIR /CHECK FOR AN ATTACK BY A PAWN
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
1350 SNO /IS THAT FILE REALY ON THE BOARD?
1352 RTR CLL /YES: PASTE TOGETHER THE ADDRESS OF THIS HYPOTHETICAL PAWN
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
1362 SZA CLA /PER CHANCE A PAWN?
1363 JMP TAG3 /NO: TRY NEXT PIECE
1364 TAG2, ISZ PCNT /YES. ITS A PAWN ATTACK. INC PIECE COUNT
1365 TAD I TEMP1 /SET LOWEST VALUED ATTACKING PIECE VALUE = PAWN
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
1371 JMP I CHKATK /RETURN NOW
1372 TAG3, ISZ TMATK /TESTED FOR PAWNS ON BOTH ADJACENT FILES?
1374 CMA CLA /NO. LOOP BACK FOR THE OTHER FILE
1380 TAD OMAP /GET ADDRESS-1 OF THE ATTACKERS PIECE MAP
1382 BATAK, ISZ TOMAK1 /INC THE PIECE TABLE ADDRESS
1383 TAD I TOMAK1 /GET THE ADDRESS OF THE PIECE
1384 SNA /IS IT REALY A PIECE, OR IS THE SQUARE BLANK?
1385 JMP I CHKATK /BLANK. TABLE EXAUSTED:RETURN
1386 DCA TMATK /NO. SOMTHINGS THERE. STORE ITS ADDRESS
1387 TAD TMATK /GET THE ATTACKERS SQR ADDR
1389 TAD TEMP /COMPARE WITH THE ATTACKED SQUARS ADDRESS
1390 SNA CLA /ARE THEY THE SAME?
1391 JMP BATAK /YES.PIECES CANNOT ATTACK THEMSELVES
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
1400 TAD TMATK /GET ADDRESS AGAIN
1401 RTR /ROTATE RANK # INTO BITS 9-11
1403 AND [0007 /ISOLATE RANK INFO
1405 TAD I TMATK /GET THE VALUE OF THE PIECE AGAIN
1407 TAD (ROOK /NOW IDENTIFY IT
1411 SNA /IS IT A BISHOP?
1414 SNA /IS IT A KNIGHT?
1420 SNA CLA /IS IT A QUEEN?
1422 JMP BATAK /NO? WHATEVER WAS THERE MUST HAVE MOVED! PLEASE TO IGNORE.
1424 \f/WE REACH HERE IF AN ATTACK ON THE SQUARE IN QUESTION IS FOUND
1425 GATAK, ISZ PCNT /INC ATTACK COUNTER
1426 TAD CKMODE /TEST FOR FAST RETURN
1427 SZA CLA /'FAST RETURN' MODE?
1428 JMP I CHKATK /YES. RETURN NOW
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
1437 SMA CLA /IS THE VALUE OF THIS PIECE LOWER?
1439 TAG4, TAD I TMATK /YES. REPLACE THE OLD VALUE WITH THIS ONE
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
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
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
1488 DCA CTNEED /SET CHECK TEST NEED SWITCH
1489 TAD MMUMTM /GET THE MSW BACK AGAIN
1491 TAD CKING /ADDRESS TO TEST FOR ATTACK
1493 IAC /RETURN AFTER FIRST ATTACK IS FOUND
1495 JMS UMOVE /PUT THE PIECE BACK WHERE IT BELONGS
1496 TAD PCNT /GET # OF ATTACKS
1498 TSTCH2, ISZ TSTCHK /NO. INC RETURN ADDRESS
1499 SNA CLA /I'LL ASK AGAIN: WERE THERE ANY?
1500 JMP I TSTCHK /NO. RETURN
1502 SZA CLA /WAS IT A CHECK REPLY?
1503 ISZ MOBMOD /TALLY ONE MORE ILLEGAL BY VIRTUE OF KING IN CHECK
1506 \f/SUBROUTINE TO MAKE A SIMPLE TYPE MOVE
1507 /CALL WITH MSW IN AC
1509 DCA MMUMT1 /STORE THE MSW
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
1519 /SUBROUTINE TO UMMAKE SIMPLE TYPE MOVES
1520 /AS MADE BY THE MMOVE SUBROUTINE
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
1528 DCA I TEMP1 /RESTORE CAPTURED PIECE
1533 /SUBROUTINE TO GENERATE ALL MOVES FOR WHITE
1535 CMA CLA /SETUP FIRST RANK CONSTANT
1537 JMS I ZMAPEC /MAP THE PIECES
1538 TAD (NOP /SETUP COLOR COMPLIMENTOR
1540 IAC /SETUP PAWN DIRECTION CONSTANT
1542 TAD WKING /SAVE THE ADDRESS OF THE WHITE KING
1544 TAD (MAP-1 /SETUP ADDRESS OF WHITE PIECE MAP
1546 TAD (MAP+23 /SETUP ADDRESS OF BLACK PIECE MAP
1548 TAD (WPSW /SETUP CURRENT PSW ADDRESS
1550 JMS I ZGNMV /GENERATE THE MOVES
1554 /SUBROUTINE TO GENERATE ALL MOVES FOR BLACK
1556 CMA CLA /SETUP THE PAWN DIRECTION CONSTANT
1558 JMS I ZMAPEC /MAP THE PIECES
1559 TAD [CIA /SETUP COLOR COMPLIMENTOR
1561 TAD BKING /SAVE THE ADDRESS OF THE BLACK KING
1563 TAD (7772 /SETUP FIRST RANK CONSTANT
1565 TAD (MAP+23 /SETUP ADDRESS OF BLACK PIECE MAP
1567 TAD (MAP-1 /SETUP ADDRESS OF WHITE PIECE MAP
1569 TAD (BPSW /SETUP POSITION STATUS WORD ADDRESS
1571 JMS I ZGNMV /GENERATE THE MOVES
1576 /SUBROUTINE TO TEST FOR WHITE ATTACKS
1577 /CALL WITH ADDRESS OF THE SQUARE TO BE TESTED IN AC
1584 TAD (MAP-1 /ADDRESS-1 OF MAP OF ATTACKING PIECES
1586 JMS CHKATK /DO THE TEST
1587 JMP I TSTWAT /RETURN
1589 /SUBROUTINE TO TEST FOR BLACK ATTACKS ON ANY SQUARE
1590 /CALL WITH THE ADDRESS OF THE SQUARE TO BE TESTED IN AC
1592 DCA TEMP /STORE ADDRESS OF SQUARE TO BE TESTED
1597 TAD (MAP+23 /ADDRESS-1 OF THE BLACK PIECE MAP
1599 JMS CHKATK /DO THE TEST
1600 JMP I TSTBAT /RETURN
1604 /SUBROUTINE TO MAKE A MOVE. CALLED WITH MSW IN LOCATION 'TOMAK1'
1605 /AND MDW IN LOCATION 'TOMAK2'
1608 ISZ DOMAP /SET SWITCH INDICATING THAT A PIECE MAP IS NESSECARY
1610 JMS TSTBRD /TEST BOARD
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?
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
1625 MKMV1, TAD I TEMP2 /NOW PHYSICALY MOVE THE PIECE
1626 DCA I TEMP1 /ONTO ITS NEW SQUARE
1627 DCA I TEMP2 /REMOVE THE PIECE FROM ITS OLD SQUARE
1628 TAD WPSW /SAVE WHITES POSITION STATUS WORD
1630 TAD BPSW /SAVE BLACKS POSITION STATUS WORD
1633 PUSH1 /SAVE THE 'LSTMV' INFORMATION
1634 TAD TOMAK2 /INSTALL NEW INFORMATION ON THE LAST(THIS) MOVE MADE
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
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
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
1657 TAD I TEMP1 /GET THE VAL OF THE MOVING PAWN
1658 RAL /LOAD THE SIGN INTO THE LINK
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
1669 MKQSC, TAD TEMP1 /IT'S QUEENS SIDE CASTLING
1671 DCA TEMP2 /STORE THE ADDR OF QUEENS ROOK BEFORE CASTLING
1674 DCA TEMP1 /STORE ADDRESS OF ROOKS NEW SQUARE
1675 MKCA1, TAD I TEMP2 /LOAD AC WITH VALUE OF THE ROOK
1676 DCA I TEMP1 /PUT THE ROOK DOWN ON ITS NEW SQR
1677 DCA I TEMP2 /REMOVE THE ROOK FROM ITS OLD SQR
1678 TAD I TEMP1 /GET COLOR OF CASTLING SIDE
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
1685 MKKSC, TAD TEMP1 /BUILD ADDRESS OF THE
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
1691 MKEP, TAD TEMP2 /IT'S AN 'EN PASSANT' CAPTURE
1692 AND [7770 /BUILD ADDRESS OF THE PAWN THAT WAS TAKEN
1698 TAD I TEMP3 /SUBTRACT THE PAWNS VALUE
1702 DCA I TEMP3 /REMOVE CAPTURED PAWN FROM THE BOARD
1703 MKMVDN, IFNZRO DEBUG <
1704 JMS TSTBRD /TEST BOARD VALUE
1706 TAD WHOSE /NOW THAT THE MOVE IS MADE
1708 DCA WHOSE /THE "WHOSE MOVE" SWITCH
1709 JMP I MKMV /AND RETURN
1714 /SUBROUTINE TO UNMAKE A MOVE MADE BY THE 'MKMV' ROUTINE
1715 /LIKE THE 'MKMV' SUBROUTINE 'UNMV' IS COLOR INDEPENDENT- USES NO 'CLRFIX'
1718 ISZ DOMAP /SET SWITCH FOR OBSOLETE PIECE MAP
1720 JMS TSTBRD /MAKE SURE BOARD VALUE IS OK
1722 TAD LSTMV /GET THE MDW FOR THE LAST(THIS) MOVE MADE
1724 POP1 /GET THE OLD 'LSTMV' INFO
1725 DCA LSTMV /RESTORE IT
1726 POP1 /RESTORE BLACKS PSW
1728 POP1 /RESTORE WHITES PSW
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
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
1740 SNA /IS IT STILL THERE?
1743 DCA I TEMP2 /PUT IT BACK ON ITS OLD SQUARE
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
1751 SNA /WAS THE MOVE A SPECIAL TYPE?
1752 JMP UNMVDN /NO. RETURN
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
1764 UNQP, TAD I TEMP2 /PAWN PROM. MOVE
1765 CIA /SUBTRACT PROMOTION VALUE
1766 TAD PW /FROM THE TOTAL
1768 TAD I TEMP2 /GET VALUE OF THE PROMOTION PIECE
1769 SMA CLA /WHICH COLOR IS MOVING?
1770 TAD (PAWN+PAWN /WHITE IS MOVING.
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
1778 UNKSC, TAD TEMP2 /BUILD ADDR OF ROOKS 'POST CASTLING' SQUARE
1779 IAC /BY ADDING +1 TO THE KINGS 'PRE CASTLING' SQUARE ADDRESS
1781 UNKS1, TAD TEMP2 /BUILD ADDRESS OF THE ROOKS 'PRE CASTLING' SQUARE ADDR
1782 TAD (2 /BY ADDING +2 TO ITS 'POST-CASTLING' SQUARE ADDR
1783 DCA TEMP1 /STORE ROOKS PRE CASTLING SQUARE ADDRESS
1784 TAD I TEMP2 /GET THE ROOKS VALUE
1785 DCA I TEMP1 /PLACE THE ROOK BACK ON ITS 'PRE CASTLING' SQUARE
1786 DCA I TEMP2 /REMOVE IT FROM ITS 'POST CASTLING SQUARE'
1789 UNQSC, TAD TEMP1 /BUILD THE ADDR OF THE ROOKS 'POST CASTLING SQUARE
1790 IAC /BY ADDING +1 TO THE KINGS 'POST CASTLING' SQUARE ADDRESS
1792 TAD (-5 /BUILD THE ADDRESS OF THE ROOKS 'PRE CASTLING SQUARE'
1793 JMP UNKS1 /SAME AS KING SIDE EXCEPT OVER 5 FILES
1794 UNEP, TAD TEMP1 /BUILD THE ADDRESS OF THE CAPTURED PAWN
1795 AND [0007 /TAKE THE FILE OF THE 'TO SQUARE'
1796 DCA TEMP3 /STORE THE TO SQUARE' FILE #
1797 TAD TEMP2 /AND EVERYTHING BUT THE FILE #
1798 AND [7770 /FROM THE FROM SQUARE ADDRESS
1799 TAD TEMP3 /ADD THEN TOGEATHER
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
1807 UNMVDN, IFNZRO DEBUG <
1808 JMS TSTBRD /VERIFY BOARD VALUE
1810 TAD WHOSE /NOW THAT THE MOVE IS UNMADE
1812 DCA WHOSE /THE "WHOSE MOVE" SWITCH
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
1820 TAD TEMP1 /FIRST BUILD THE 'FROM' SQUARE ADDRESS
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
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
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
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
1852 JMS BRDVAL /GET CURRENT BOARD VALUE
1855 SZA CLA /ARE THEY THE SAME?
1856 HLT /NO. ERROR SOMEWHERE
1857 JMP I TSTBRD /ALL IS WELL
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
1868 DCA COMPAC /STORE THE COMPLIMENT OF THE AC
1869 TAD COMPAC /COMPARE THE AC WITH '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
1877 SMA /IS 'COMP' POSITIVE?
1878 JMP XXCL /YES. 'COMP' IS LARGER ALSO
1879 TAD COMPAC /NO. BOTH ARE NEGATIVE
1880 SPA CLA /BUT WHICH IS THE LARGER?
1881 JMP XXAL /THE AC IS THE LARGER
1882 JMP XXCL /'COMP' IS THE LARGER
1883 XXAP, TAD COMP /THE AC WAS POSITIVE
1884 SPA /TEST 'COMP' FOR ITS SIGN
1885 JMP XXAL /'COMP' IS NEGATIVE, AND THEREFORE LARGER
1888 XXCL, ISZ COMPAR /'COMP' IS LARGER
1889 XXAL, ISZ COMPAR /AC IS LARGER
1891 JMP I COMPAR /RETURN
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
1898 TAD (-100 /INITIALIZE FOR 64 SQUARES
1900 TAD (BOARD-1/ADDRESS-1 OF BOARD
1901 DCA ITMP1 /TO AUTO INDEX REG
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
1914 TAD I RANDOM /INTRODUCE A RANDOM VARIATION INTO THIS EVALUATION
1915 AND (0001 /LET IT BE NO GREATER THAN +1
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
1925 JMS MOBGET /GET MOBILITY VALUE
1926 TAD STRATG /ADD IT IN WITH THE TOTAL
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
1935 DCA COMP /LOAD SOFTWARE COMPARE REGISTER
1938 JMS COMPARE/COMPARE VALUES
1939 JMP EVAL2 /THEY ARE EQUAL. PRUNE
1940 JMP EVAL1 /"HIEP" EVALUATION IS NESSECARY
1941 JMP EVAL2 /NO "HIEP" NESSECARY(GOOD)
1942 EVAL1, JMS HIEP /GET THE CONTROVERSIAL VALUE
1947 EVAL2, IFNZRO LPTREE<
1948 TAD ("_ /SIGNAL THAT A MINI-PRUNE WAS DONE
1951 TAD STRATG /GET VALUE
1954 \f/SUBROUTINE TO GET THE MOBILITY VALUE FOR THIS POINT IN
1956 /RETURN WITH VALUE IN THE AC
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
1967 JMS GNBMV /DO A PSEUDO MOVE GENERATION
1968 TAD MOBMOD /GET MOBILITY VALUE FOR BLACK
1969 DCA MOBGTM /SAVE FOR THE MOMENT
1971 JMS GNWMV /DO ANOTHER PSUEDO MOVE GENERATION
1972 TAD MOBGTM /SUBTRACT BLACKS MOBILITY VALUE
1974 TAD MOBMOD /FROM WHITES
1976 DCA MOBGTM /STORE VALUE FOR THE MOMENT
1977 POP1 /RESTORE THE COUNTERS THAT WE DESTROYED
1981 TAD MOBGTM /GET VALUE BACK AGAIN
1982 JMP I MOBGET /RETURN
1983 MOBGE1, TAD MOBMOD /GET MOBILITY VALUE FOR THIS LEVEL
1984 SNA /IS THERE ONE FOR THIS LEVEL?
1985 TAD MOB0 /NO. USE THE ONE FOR 2 PLYS BACK
1990 JMP I MOBGET /RETURN
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
2005 TAD LOOKA /GET RETURN ADDRESS
2006 PUSH1 /SAVE IT IN PDL#1
2007 ISZ PLY /INC PLY NUMBER
2010 SZA CLA /IS THIS THE FIRST PLY?
2012 TAD WHOSE /YES. SETUP "LCLRFX"
2013 SMA CLA /WHICH COLOR ARE WE TO LOOK AHEAD ON BEHALF OF?
2017 DCA MOBMOD /INITIALIZE MOBILITY VALUES
2020 DCA ENO /SET EVALUATION COUNTER TO 0
2021 LOOKA1, TAD UVAL1 /SAVE THE OLD "UPPER LEVEL VALUE"
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
2027 TAD GNCNT /SAVE GENERATION COUNTER
2029 TAD STRATG /SAVE STRATEGIC VALUE
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
2034 TAD MOB1 /BUMP ALL THE LEVELS BY 1
2038 DCA MOBMOD /!!!BUG OF AUG 13 FIXED!!!/
2040 TAD PDLADR /PUSH A MARKER SO THAT PDL#2 CAN BE VERIFIED
2042 TAD PC01 /PUSH A MARKER SO THAT PDL#1 CAN BE
2043 PUSH1 /VERIFIED TO BE IN LINE
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
2051 TAD PLY /PLY # TO AC
2052 CIA /COMPARE AGAINST
2053 TAD DEPTH /THE MAXIMUM DEPTH
2054 SPA CLA /DOES CURRENT PLY# EXCCEDE THE MAX DEPTH #?
2055 JMP LEVAL /YES. DO A STATIC EVALUATION OF THE POSITION
2056 LKFUR, TAD (-3777 /NO. BUILD A STARTING VALUE FOR THIS LEVEL
2058 DCA CVAL1 /INITIALIZE VALUE FOR THIS LEVEL
2059 JMS GNMVSM /GENERATE THE MOVES OF THE SIDE WHOSE MOVE IT IS
2060 TAD CMSW /GIT CHECKMATE SWITCH
2061 SZA CLA /IS SIDE TO MOVE IN CHECKMATE?
2062 JMP LKCM /YES. DO SOMTHING
2063 TAD SMSW /GET STALEMATE SWITCH
2064 SZA CLA /IS THE SIDE TO MOVE IN STALEMATE?
2065 JMP LKSM /YES. DO SOMTHING
2066 JMS PRUNE /ONLY CONSIDER "GOOD" MOVES
2067 PICK, POP2 /POP A MOVE OUT OF PDL2
2068 DCA TOMAK2 /STORE THE MDW
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
2078 JMS OUTMV /PRINT OUT THE MOVE
2079 JMS SPACE /ALSO A SPACE SO THAT THE NEXT TAB STOP IS REACHED
2081 JMS I ZMKMV /MAKE THE MOVE
2082 JMS I ZLOOKA /PEER FURTHER INTO THE MURKY DEPTHS OF THE GAME TREE
2084 JMS I ZCRLF /PRINT A CARRIAGE RETURN
2086 JMS I ZUNMV /UNMAKE THE MOVE
2087 JMP COMPMV /GO DO A COMPARE
2089 /SUBROUTINE TO POP OUT A GROUP OF MOVES FROM PDP#2
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
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
2103 TAD WHOSE /GET "WHOSE MOVE" SWITCH
2104 SMA CLA /IS IT WHITES MOVE?
2105 JMS GNWMV /YES. GENERATE WHITES MOVES
2107 SPA CLA /OR IS IT BLACKS MOVE?
2108 JMS GNBMV /YES. GENERATE BLACKS MOVES
2109 JMP I GNMVSM /RETURN
2114 JMS TABPLY /TAB TO COLOMN "PLY"
2118 JMS OCTOUT /PRINT THE VALUE TO BEAT
2120 TAD RVAL1 /GET VALUE RETURNED
2121 JMS PLYFIX /FIX W/RESPECT TO PLY NUMBER
2122 DCA COMP /LOAD SOFTWARE COMPARE REGISTER WITH IT
2123 TAD CVAL1 /GET CURRENT VALUE FOR THIS LEVEL
2124 JMS PLYFIX /FIX W/RESPECT TO PLY #
2125 JMS COMPAR /COMPARE IT WITH THE RETURNED VALUE NOW IN COMPARE REGISTER
2126 JMP JMPICK /THEY ARE EQUAL:
2127 JMP JMPICK /UNFAVORABLE COMPARE: GO ON TO NEXT MOVE
2128 RPLACE, TAD RVAL1 /HAIL NEW "BEST MOVE VALUE"
2129 DCA CVAL1 /STORE NEW "BEST MOVE VALUE"
2132 JMS I ZOUT /THE RETURN MOVE WON INDICATION
2136 DCA I XR0 /INTO "BEST MOVE" TABLE
2138 DCA I XR0 /INTO THE "BEST MOVE" TABLE
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
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
2149 JMS COMPAR /COMPARE WITH THE CURRENT LEVEL VALUE IN THE COMPARE REGISTER
2150 JMP ALPHAP /EQUAL MEANS PRUNE
2151 JMP JMPICK /SORRY. THE VALUE WOULD STILL BE COMPETITIVE ON THE LEVEL ABOVE
2152 ALPHAP, JMS POPOUT /REMOVE ALL OTHER MOVES ON THIS LEVEL
2157 JMS I ZOUT /PRINT INDICATION FOR PRUNE
2159 JMP LKAD /YES. GO SET RETURN VALUE
2161 JMPICK, IFNZRO LPTREE <
2162 JMS I ZCRLF /CARRIAGE RETURN
2163 JMS TABPLY /TAD TO COLOMN # "PLY"
2184 BESTBL, ZBLOCK 30 /TABLE TO HOLD THE LAST "BEST MOVE" ON ANY LEVEL
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
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
2215 LKAD, CLA /FINISHED GENERATING & EXPLORING MOVES ON THIS LEVEL
2216 TAD CVAL1 /SET RETURN VALUE = THIS LEVELS VALUE
2218 JMP DONE /PREPARE TO RETURN
2220 LKSM, CLA /ITS A STALEMATE!
2223 JMS I ZOUT /PRINTOUT STALEMATE INDICATION
2225 DCA RVAL1 /SET RETURN VALUE TO TOTALY EVEN GAME ( 0 )
2226 JMP LKXM /TAKE SAME RETURN PATH AS A CHECKMATE NOW
2228 /COME HERE TO RETURN FROM THE "LOOKA" SUBROUTINE
2229 DONE, CLA CMA /-1 TO AC
2230 TAD PLY /DECREMENT PLY #
2232 TAD UVAL1 /RESTORE VARIOUS DATA TO ITS STATE BEFORE CALLING
2235 POP1 /POP OUT PDL#1 VERIFIER WORD
2236 CIA /SHOULD BE SAME ON EXIT AS WAS ON ENTRY
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
2243 SZA /IS PDL#2 IN LINE?
2244 HLT /NO. AMOUNT OFF IS IN THE AC
2247 DCA MOBMOD /RESTORE MOBMOD COUNTER
2253 DCA STRATG /RESTORE STRATEGIC VALUE
2255 DCA GNCNT /RESTORE OLD MOVE GENERATION COUNTER
2256 POP1 /POP OFF OLD PLY COMPENSATOR VALUE
2257 DCA PLYFIX+1 /RESTORE IT
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
2264 \fLKCM, CLA /ITS A CHECKMATE.
2267 JMS I ZOUT /PRINT CHECKMATE INDICATION
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
2273 LKXM, POP2 /POP THE 2 MARKER WORDS OFF OF PDL2
2274 POP2 /THAT "GNMV" PUT THERE
2275 JMP DONE /READY TO RETURN
2277 /COLOR FIXING SUBROUTINE EXCLUSIVLY FOR THE "LOOKA" SUBROUTINE.
2278 /FIXES COLOR WITH RESPECT TO PLY EVEN/ODD
2280 CIA /=NOP IF PLY IS ODD, OR TO = CIA IF PLY IS EVEN
2281 JMP I PLYFIX /RETURN
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
2288 NOP /COMPUTER HAS: WHITE="NOP", BLACK="CIA"
2289 JMP I LCLRFX /RETURN
2291 \f/STATIC EVALUATION ROUTINE
2293 JMS I ZMAPEC /MAP PIECES
2294 TAD WHOSE /GET "WHOSE MOVE SWITCH"
2295 SMA CLA /IS IT WHITES OR BLACKS?
2297 TAD BKING /BLACKS. GET BLACKS KING ADDRESS
2298 JMS TSTWAT /FIND OUT IF IT IS ATTACKED
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
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
2313 NOP /YES. A BREAKPOINT FOR ODT MAY BE PLACED HERE
2314 TAD ENO /PRINT OUT THE EVALUATION #
2317 JMS EVAL /GET AN EVALUATION
2318 DCA RVAL1 /SETUP RETURN VALUE
2319 JMP DONE /READY TO RETURN
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
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
2337 PRNPRO, PPA /PRUNE PROCEDURE FOR PLY 1
2338 PPB /PRUNE PROCEDURE FOR PLY 2
2339 PPB /PRUNE PROCEDURE FOR PLY 3
2340 PPB /PRUNE PROCEDURE FOR PLY 4
2341 PPB /PRUNE PROCEDURE FOR PLY 5
2342 PPB /PRUNE PROCEDURE FOR PLY 6
2343 PPB /PRUNE PROCEDURE FOR PLY 7
2344 PPB /PRUNE PROCEDURE FOR PLY 8 OR GREATER
2346 PPA, JMS BSTOP /COUNT ON A "PRE-ANALYSIS"
2347 PPZ, JMP I PRUNE /RETURN
2349 PPB, JMS HIEP /FIND OUT THE VALUE OF THE MOST FAVORABLE EN PRISE PIECE CAPTURE
2350 SNA CLA /DOES A FAVORABLE ONE EXIST?
2351 JMP .+4 /NO. COUNT ON THE ENTRY IN "BESTBL"
2352 JMS SETPNT /YES. SETUP POINTER FOR THE INSERTION
2353 TAD HIEPMS /OF THE EN PRISE PIECE CAPTURE MSW
2354 DCA I XR0 /INTO THE "BESTBL"
2355 JMS BSTOP /IF IT EXISTS, BSTOP WILL INSURE THAT IT IS LOOKED AT FIRST
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
2369 SNA /ANY MOVES TO RUMMAGE THRU?
2370 JMP I BSTOP /NO. RETURN
2371 DCA TEMP /SETUP COUNT
2373 CLL RAL /MULT TIMES 2 WORDS PER MOVE
2376 BSTOP1, TAD I TEMP1 /GET AN MSW
2378 SNA /DOES IT LOOK LIKE AN MSW
2379 HLT /NOT IF ITS 0 IT DOESNT
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
2386 ISZ TEMP /COMPARED AGAINST ALL MOVES?
2387 JMP BSTOP1 /NO. DO ANOTHER
2388 JMP I BSTOP /YES. RETURN
2408 \f/SUBROUTINE TO EVALUATE THE BACK RANK
2409 /TO FIND OUT WHAT'S NOT DEVELOPED, AND RETURN A VALUE FOR DEVELOPMENT
2413 DCA BREV2 /SETUP TO DO THE WHITE SIDE FIRST
2414 JMS BREV1 /DO AN EVALUATION
2415 CIA /NEGATE THE VALUE FOR WHITES SIDE
2419 DCA BREV2 /SETUP TO DO THE BLACK SIDE
2421 JMS BREV1 /DO THE BLACK EVALUATION
2424 JMP I BREV /RETURN WITH IT
2427 TAD (BOARD-1/CONSTANT FOR BOARD ADDRESS
2429 DCA TEMP2 /INIT MINOR PIECE COUNTER
2430 TAD [7770 /COUNT FOR 10 SQUARES ON THE BACK RANK
2432 TAD I ITMP0 /GET THE PIECES VALUE
2433 BREV2, HLT /COMPLIMENT IT IF IT IS BLACK
2435 SNA /IS IT A KNIGHT?
2436 ISZ TEMP2 /YES. INC MINOR PIECE COUNTER
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
2447 /CENTER OCCUPATION EVALUATOR
2450 TAD (-4 /SETUP COUNT FOR 4 CENTER SQUARES
2452 TAD (TAD I COTB /SETUP TO ACCESS ADDRESSES OF THE 4 CENTER SQUARES
2454 COEV1, HLT /GET SQUARES VALUE
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
2462 COEV2, ISZ COEV1 /INC INSTRUCTION SO THAT IT REFFRENCES THE NEXT CENTER SQUARE
2463 ISZ TEMP1 /DONE ALL 4 SQUARES YET?
2464 JMP COEV1 /NO. DO ANOTHER
2465 TAD TEMP /YES. GET FINAL VALUE
2466 JMP I COEV /AND RETURN
2468 /ADDRESSES OF THE 4 CENTER SQUARES
2474 /CASTLING STATUS EVALUATOR
2478 RAR /MOVE "CASTLED BIT" INTO LINK
2479 SZL CLA /HAS WHITE CASTLED?
2480 TAD (10 /YES ADD TO STRATEGIC VALUE
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
2489 JMP I CASTEV /RETURN
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"
2502 DCA ENPRAD /SAVE ADDR OF EN PRIS SQUARE
2503 JMS I ZMAPEC /MAKE SURE PIECE MAP IS UP TO DATE
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
2512 DCA ENPVAL /SAVE VALUE OF SMALEST ATTACKER
2515 JMP I ENPRIS /NO.RETURN
2516 DCA ENPCNT /SAVE # OF ATTACKERS
2518 DCA ENPSQR /SAVE ADDR OF LEAST VALUABLE ATTACKER
2519 TAD ENPRAD /FIND OUT ABOUT DEFENDERS NOW
2521 JMP ENPR0 /ALL DONE SETTING UP. GO TO THE BUISINESS PART
2522 ENPRWH, TAD ENPRAD /FIND OUT ABOUT BLACK ATTACKS
2526 DCA ENPVAL /SAVE VALUE OF LEAST VALUABLE ATTACKER
2528 DCA ENPSQR /SAVE ADDR OF LEAST VALUABLE ATTACKER
2531 JMP I ENPRIS /NO. RETURN
2532 DCA ENPCNT /STORE # OF ATTACKERS
2533 TAD ENPRAD /FIND OUT ABOUT WHITES DEFENCE
2536 CIA /COMPLIMENT VALUE OF LEAST VALUABLE DEFENDER
2538 ENPR0, TAD ENPCNT /GET # OF ATTACKERS
2540 TAD PCNT /COMPARE WITH # OF DEFENDERS
2541 SMA CLA /MORE ATTACKERS THAN DEFENDERS?
2543 TAD PCNT /# OF DEFENDERS
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
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
2557 SPA SNA CLA /IS DEFENDER SMALLER THAN ATTACKER?
2558 JMP ENPR2 /NO. HE WONT CAPTURE BACK THEN
2564 JMP I ENPRIS /RETURN
2566 TAD I ENPRAD /COMPARE VALUE OF OBJECT
2568 TAD ENPVAL /WITH THE VALUE OF THE ATTACKER
2569 SMA /IS THE ATTACKERS VALUE SMALLER?
2570 ENPR3, CLA /NO. PIECE IS NOT EN PRISE
2573 JMP I ENPRIS /RETURN
2579 /TEST OF THE "ENPRIS" ROUTINE
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
2608 /THE VALUE IS RETURNED IN SUCH A WAY THAT IT CAN SIMPLY BE ADDED
2610 /CALL WITH AC CLEAR TO USE NORMALY
2611 /THIS ROUTINE CALCULATES WHOSE MOVE IT IS BY EXAMINING LOCATION "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
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
2624 TAD (MAP+12 /BUILD THE ADDR OF THE PIECE MAP(WHICHEVER ONE IT IS)
2627 TAD I HMAPAD /GET PIECE ADDR
2628 ISZ HMAPAD /INC MAP ADDRESS POINTER
2629 SNA /DONE ALL PIECES YET?
2631 DCA HIEPTM /STORE ADDR FOR THE MOMENT
2632 TAD I HIEPTM /GET THE PIECES VALUE
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
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
2645 TAD HIEPTM /COMPARE IT WITH THE ONE JUST AQUIRED
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
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
2657 TAD ENPRAD /"TO SQUARE" IS THAT OF THE PIECE ITSELF
2659 TAD HIEPTM /COMBINE "TO" AND "FROM" 6BIT ADDRESSES
2660 DCA HIEPMS /INTO ONE CONVIENIENT MSW
2661 JMP HIEP1 /GO TRY ANOTHER PIECE
2663 TAD HIEPCN /GET # OF EN PRISE PIECES
2664 SPA /WERE THERE ANY?
2667 RAL /MULT TIMES 8 AND INCLUDE IN THE VALUE RETURNED
2670 TAD HIEPVL /GET THE EXCHANGE VALUE
2674 HIEPX, HLT /NOP,BLACKS MOVE/CIA,WHITES MOVE
2684 /SUBROUTINE TO SETUP THE BOARD
2687 TAD (-100 /IST PUT ALL OF THE PIECES ON THE BOARD
2688 DCA TEMP /SETUP A COUNT FOR 64 SQUARES
2690 DCA ITMP0 /BOARD ADDRESS TO AUTO INDEX REG
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
2702 ISZ TEMP /CLEARED OUT 32 SQUARES YET?
2703 JMP .-2 /NO. DO 1 MORE
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
2710 COMTM, IAC /TOURNAMENT MODE SETTING
2712 COMBM, IAC /BLITZ MODE SETTING
2713 DCA DEPTH /DEPTH=3 FOR TOURNAMENT MODE, DEPTH=1 FOR BLITZ MODE
2718 /THIS IS THE INTERRUPT HANDLING ROUTINE
2719 INTHAN, DCA ACHOLD /SAVE ACCUMULATOR
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
2732 JMP RTINT /NO. RETURN AND FORGET THAT THIS HAPPENED
2733 TAD CHAR /LOAD IT BACK INTO THE AC
2735 TAD CHAR /TEST IF IT IS TO BE IGNORED
2737 SNA CLA /IS IT A SPACE ?
2738 JMP RTINT /YES. IGNOR IT
2739 ISZ CNTCHR /TOO MUCH INPUT?
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)
2745 JMP LINDUN /YES! HE'S DONE TYPING THE INPUT LINE
2747 SNA /IS IT A RUBOUT CHAR?
2748 JMP RUBGO /YES. DELETE THE LAST CHAR TYPED
2750 SNA CLA /IS IT A CONTROL-U?
2751 JMP UGO /YES. DELETE A WHOLE LINE
2755 SNA CLA /IS CHAR A CONTROL-C ?
2757 TAD CHAR /NO. GET ITS VALUE BACK AGAIN
2759 DCA I CLIST /STORE THE CHAR. IN THE KEYBOARD BUFFER
2760 RTINT, TAD LKHOLD /RESTORE THE LINK TO ITS PRE-INTERRUPT STATE
2762 TAD ACHOLD /RESTORE ACCUMULATOR
2763 RMF /AND THE MEMORY FIELDS
2764 ION /WITH INTERRUPT ENABLED,
2765 JMP I IFRM /RETURN TO MAIN PROGRAM
2766 ACHOLD, 0000 /HOLD AC AFTER INTERRUPT
2767 LKHOLD, 0000 /HOLD LINK AFTER INTERRUPT
2769 LINDUN, DCA I CLIST /MARK THE END OF INPUT WITH A 0000 CHAR. IN BUFFER
2770 TAD (KBUF-1 /REINITIALIZE THE KEYBOARD BUFFER
2772 DCA ISW /CLEAR THE INPUT SWITCH
2773 JMS I ZCRLF /PRINT A CARRIAGE RETURN-LINE FEED
2776 LNOGO, JMS I ZCRLF /PRINT A CARRIAGE RETURN LINE FEED
2777 JMS I ZBEGIN /REINITIALIZE INPUT BUFFER
2778 JMP RTINT /RETURN FROM THE LAST INTERRUPT
2780 /IO STALL SUBROUTINE: RETURN WHEN INPUT IS DONE
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
2794 SNA CLA /ARE WE AT THE BEGINING OF A LINE ALLREADY?
2796 TAD ("\ /NO. PRINT A "\" CHAR
2798 CMA CLA /NOW MOVE BACK THE BUFFER POINTER
2801 JMP RTINT /RETURN FROM INTERUPT
2804 PRINTO; MESG21 /PRINT A "^U"
2805 JMP LNOGO /GO SETUP FOR A NEW LINE
2807 \f/FOLLOWING IS THE LEGAL COMMAND LIST
2808 /IT CONSISTS OF A NUMBER OF 2WORD ENTRIES
2809 /THE 1ST WORD IN EACH ENTRY IS THE 6BIT REPRESENTATION(NEGATED FOR EASY COMPARING)
2810 /OF A 2 CHARACTER COMMAND
2811 /THE 2ND WORD CONTAINS THE ADDRESS TO GO TO IF THAT COMMAND IS TYPED
2812 COMLST, -2027; COMPW /PW - PLAY WHITE
2813 -2002; COMPB /PB - PLAY BLACK
2814 -2016; COMPN /PN - PLAY NIETHER WHITE OR BLACK
2815 -0204; COMBD /BD - DISPLAY THE POSITION
2816 -1120; COMIP /IP - INPUT A POSITION
2817 -2205; START /RE - RESET (RESIGN)
2818 -1526; CMOVE /MV - MOVE
2819 -2313; COMSK /SK - SKIP A MOVE
2820 -0215; COMBM /BM - BLITZ MODE
2821 -2415; COMTM /TM - TOURNAMENT
2823 -1424; COMLT /LT - OUTPUT TREE TO LINE PRINTER(LP08)
2825 -0000; 0000 /END OF COMMAND LIST
2827 MESG14, TEXT \STALEMATE\
2828 MESG24, TEXT \YOUR MOVE? \
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
2838 SZA /IS THE ADDRESS OF THE MESSAGE IN THE AC?
2839 JMP .+3 /YES. DONT BOTHER GETTING IT FROM THE WORD FOLLOWING THE JMS
2840 TAD I MES /NO. BOTHER PLEASE
2841 ISZ MES /AND INC THE RETURN ADDRESS
2842 DCA TEMP /STORE THE ADDRESS OF THE MASSAGE
2843 MES2, TAD I TEMP /GRAB 2 CHARS. PACKED INTO 1 WORD
2847 JMS TYPO /PRINT CHAR IN BITS 0-5
2849 JMS TYPO /PRINT CHAR IN BITS 6-11
2850 ISZ TEMP /NEXT WORD PLEASE
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
2861 JMS I ZOUT /NOW PRINT IT
2864 /PRINTOUT SUBROUTINE--SINGLE CHARACTER
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
2873 /CARRIAGE RETURN & LINE FEED SUBROUTINE
2877 JMS I ZOUT /PRINT THE CR
2878 JMS I ZOUT /AND A NULL
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
2888 DCA ISW /SET THE 'INPUT IN PROGRESS' SWITCH
2889 TAD (KBUF-1 /INITIALIZE THE KEYBOARD BUFFER POINTER
2892 DCA CNTCHR /30 CHARACTERS MAXIMUM
2893 KCC /REINITIALZE THE KEYBOARD FLAG
2896 /GET A CHARACTER FROM THE INPUT BUFFER
2897 /IGNOR "-" AND ":" CHARACTERS
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
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
2912 /SUBROUTINE TO PRINT A "SIGNED OCTAL" NUMBER
2915 JMS SPACE /PRINT A LEADING SPACE
2917 SPA CLA /IS IT A NEGATIVE #?
2918 TAD ("--" /YES PRINT A MINUS SIGN
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
2927 /SUBROUTINE TO PRINT OUT AN OCTAL NUMBER WITH NO FORMATING
2929 RAL /ROTATE INTO POSITION
2932 DCA TEMP1 /SETUP COUNT FOR 4 DIGITS
2943 JMP I OCTNFM /RETURN
2945 /SUBROUTINE TO PRINT A SPACE CHARACTER
2948 TAD (240 /LOAD AC WITH SPACE CODE
2949 JMS I ZOUT /SEND IT OUT
2953 /PRINT A "^C" AND RETURN TO THE OS8 MONITOR
2955 PRINTO; MESG18 /PRINT "^C"
2956 CIF CDF 0 /MONITOR IS IN FIELD 0
2957 JMP I (7600 /GO TO MONITOR
2961 /SUBROUTINE TO TAB OVER TO COLOMN # "PLY"
2966 IAC /YES. DO ONE TAB ANYWAYS
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
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
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
2985 DCA IOMSW /INITIALIZE MSW AND MDW
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
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
2998 RTR CLL /ROTATE BITS 9-11 INTO THE 'FROM RANK' POSITION
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
3005 JMS IS128 /IS IT A NUMBER "1" TO "8" ?
3006 JMP I INMV /NO. TAKE ERROR RETURN
3008 RTL CLL /YES. ROTATE BITS 9-11 INTO THE 'TO RANK' POSITION
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
3023 SNA /IS IT A BISHOP?
3026 SNA /IS IT A KNIGHT?
3028 JMP I INMV /NO. NONE OF THE ABOVE. TAKE ERROR RETURN
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
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
3046 TAD (0406 /KING ALWAYS STARTS FROM FILE 4
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
3055 JMS GNMVSM /GENERATE THE MOVES OF THE SIDE TO MOVE
3056 INMID, POP2 /POP OFF AN MDW
3057 DCA TOMAK2 /STORE IT
3058 POP2 /POP OFF AN MSW
3059 SNA /IS IT AN MSW OR THE END OF THE LIST?
3060 JMP I INMV /END OF LIST AND MOVE NOT FOUND, TAKE ERROR RETURN
3062 TAD IOMSW /COMPARE THE MSW WITH THE ONE HE INPUTED
3064 JMP INMID /NO: TRY NEXT
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
3071 AND [0007 /CLEAR IRRELEVENT BITS
3074 SZA CLA /DO THE IMPORTANT PARTS OF THE MDW'S MATCH?
3075 JMP INMID /NO TRY NEXT MOVE FOR A MATCK
3076 INMID2, JMS I ZMKMV /MAKE THE MOVE
3077 IPDL1 /REINITIALIZE PUSH DOWN LIST #1
3078 JMS POPOUT /REINITIALIZE PDL2
3079 ISZ INMV /NORMAL RETURN IS TO THE ADDRESS+2 OF THE CALLING JMS
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
3091 MESG15, TEXT \O-O-O\
3092 NAME, TEXT \CHEKMO-II\
3095 \f/SUBROUTINE TO OUTPUT A MOVE IN MODIFIED ALGEBREIC NOTATION
3096 /CALL WITH MSW IN 'IOMSW', AND MDW IN 'IOMDW'
3104 AND [0007 /BUILD A JUMP
3107 HLT /A JUMP TO ONE OF THE NEXT 8 INSTRUCTIONS IS PLACED HERE
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
3118 TAD ("= /PRINT AN EQUAL SIGN BEFORE LETTER OF THE PROMOTION PIECE
3120 OUTSTD, CLA /DO STANDARD OUTPUT
3121 TAD IOMSW /GET THE MSW FOR THE MOVE TO BE OUTPUT
3122 RTR /ROTATE THE 'FROM FILE' BITS INTO AC 9-11
3125 JMS OUTSQR /OUTPUT THE "FROM" SQUARE COORDINATES
3126 TAD IOMDW /TEST TO SEE IF MOVE IS A CAPTURE
3128 TAD (":-"- /YES: OUTPUT A ":" INSTEAD OF A "-"
3129 TAD ("- /LOAD AC WITH THE CODE FOR A DASH
3130 JMS I ZOUT /OUTPUT IT
3132 JMS OUTSQR /OUTPUT THE "TO" SQUARE COORDINATES
3133 TAD IOCH1 /THIS IS A SPACE UNLESS MOVE IS A PAWN PROMOTION
3135 TAD IOCH2 /THIS IS A SPACE UNLESS MOVE IS A PAWN PROMOTION
3136 JMS I ZOUT /PRINT THE LAST CHARACTER AND,
3139 \f/SUBROUTINE TO OUTPUT THE COORDINATES OF A SQUARE
3140 /CALL WITH SQUARE # IN AC BITS 6-11
3142 DCA IOTMP /SAVE SQR #
3144 AND [0007 /CLEAR BITS 0-8
3145 TAD (301 /OUTPUT FILE AS A CHARACTER "A" TO "H"
3148 RTR /MOVE RANK INTO BITS 9-11
3151 TAD (261 /BUILD A CHARACTER "1" TO "8"
3152 JMS I ZOUT /OUTPUT IT
3153 JMP I OUTSQR /RETURN
3155 OUTKCA, IAC /PASS OVER THE FIRST "O-" OF THE QUEEN SIDE CASTLING MESSAGE
3156 OUTQCA, TAD (MESG15 /GET ADDRESS OF THE QUEEN SIDE CASTLING MESSAGE
3157 PRINTO /TYPE THE MESSAGE
3163 /SUBROUTINE TO CHECK FOR A CHARACTER FROM "1" TO "8". SKIP IF IT IS
3164 /CALL W/CHARACTER IN AC, RETURN SAME WAY
3167 SPA /GREATER OR EQUAL TO "1"?
3168 JMP .+4 /NO. DON'T SKIP
3170 SPA CLA /LESS THAN "8"?
3171 ISZ IS128 /YES. INC RETURN ADDRESS
3173 TAD TEMP /LOAD THE CHARACTER BACK INTO THE AC
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"
3182 JMP .+4 /NO. DONT SKIP
3184 SPA CLA /IS IT <= "H" ?
3185 ISZ ISA2H /YES. INC RETURN ADDRESS
3187 TAD TEMP /GET CHAR BACK
3190 /SUBROUTINE TO TEST FOR CHECKMATE OR STALEMATE
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
3196 JMP I QMATE /YES. RETURN
3197 TAD CMSW /NO. GET CHECKMATE SWITCH
3199 TAD (-MESG9+MESG14 /NO. GET ADDR OF STALEMATE MESSAGE
3200 TAD (MESG9 /ADD ADDR OF CHECKMATE MESAGE
3201 PRINTO /PRINT THE MESSAGE OUT
3203 JMS DISPLA /PRINTOUT THE FINAL POSITION
3204 JMP START /START A NEW GAME
3213 COMSK, TAD WHOSE /COMPLIMENT THE "WHOSE MOVE" SWITCH
3214 CMA /SO THAT SOMEONE MISSES A MOVE
3216 DCA LSTMV /DISABLE EN PASSANT PAWN CAPTURES FOR THE NEXT MOVE
3224 /SUBROUTINE TO OUTPUT A CHARACTER TO THE LINE PRINTER
3225 /CALL WITH THE CHAR. IN THE AC, RETURN WITH THE AC CLEARED
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
3232 JMP I LPTOUT /NO. DO NO OUTPUT TO THE LINE PRINTER
3234 SMA CLA /SWITCH 0 SET?
3235 JMP I LPTOUT /NO. DO NOT OUTPUT TO LINE PRINTER
3239 JMP .-2 /YES. WAIT FOR THE ERROR TO GO AWAY
3240 PSKF /IS THE PRINTER READY TO ACCEPT THE CHAR?
3241 JMP .-1 /NO. TEST AGAIN, AND AGAIN
3242 PCLF PSTB /YES. PRINT IT
3243 CLA /GET READY TO RETURN
3244 PCIE /CLEAR LINE PRINTER INTERUPT FLAG
3245 JMP I LPTOUT /RETURN
3246 LPTMP, 0000 /TEMP STORAGE FOR LINE PRINTER ROUTINE
3247 LTSW, 0000 /TREE PRINTOUT SWITCH
3249 \f/ CHESSBOARD PRINTER
3252 JMS I ZCRLF /PRINT A BLANK LINE
3254 DCA RNKPTR /POINT TO TOP RANK
3256 DCA RNKKNT /SET UP FOR 8 RANKS
3258 DCA XR0 /POINT TO BEFORE LEFTMOST SQUARE IN RANK
3260 DCA FILKNT /SET UP FOR 8 SQUARES PER RANK
3264 RL1, DCA COLOR /SET COLOR TO ZERO
3265 TAD I XR0 /GET PIECE
3266 SNA /IS SQUARE OCCUPIED?
3269 ISZ COLOR /SET COLOR TO 1 IF BLACK PIECE
3271 CIA /TAKE ABSOLUTE VALUE OF PIECE
3276 SNA /IS IT A KNIGHT?
3278 TAD (KNIGHT-BISHOP/NO
3279 SNA /IS IT A BISHOP?
3285 SNA /IS IT HER MAJESTY?
3288 SNA CLA /IS IT HIS HIGHNESS?
3290 TAD ("?-"P /IT'S AN UNKNOWN PIECE
3297 DCA PIECE /SAVE PIECE
3298 TAD COLOR /WHICH COLOR PIECE IS IT?
3302 JMS I ZOUT /PRINT COLOR OF PIECE
3304 JMS I ZOUT /PRINT NAME OF PIECE
3309 AND [0007 /ISOLATE RANK
3310 TAD XR0 /ADD IN FILE
3311 RAR /PUT PARITY IN LINK
3312 SZL CLA /WHITE OR BLACK SQUARE?
3320 NEXT, ISZ FILKNT /AT END OF RANK?
3321 JMP RL2 /NO, GO ON TO NEXT SQUARE
3322 JMS I ZCRLF /YES, GO TO NEXT RANK
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
3333 /CHESS POSITION INPUTTER
3334 /INPUT A LINE AT A TIME IN FORSYTH NOTATION
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"
3347 DCA RNKKNT /SET UP FOR 8 RANKS
3351 JMS I ZOUT /PRINT A ">" TO INDIACTE READYNESS FOR INPUT
3354 JMS I ZBEGIN /SETUP TO READ A LINE OF INPUT
3357 RL3, JMS I ZGETC /READ A CHARACTER
3358 SNA /AT END OF LINE?
3360 JMS I (IS128 /IS CHAR A DIGIT?
3362 TAD (-260 /YES, CONVERT TO DIGIT
3365 JMS CHK /TEST FOR TOO ENOUGH STUFF ON THIS RANK ALREADY
3372 SNA /IS IT A BLACK PIECE?
3375 SZA CLA /IS IT A WHITE PIECE?
3376 JMP ERR4 /NOT "B" OR "W"
3380 JMS I ZGETC /GET PIECE NAME
3382 SNA /IS IT A BISHOP?
3385 SNA /IS IT A KNIGHT?
3400 SNA CLA /IS IT A SPRINGER?
3401 JMP GN /YES, ACCEPT AS KNIGHT
3402 JMP ERR3 /UNKNOWN PIECE
3404 GP, TAD (PAWN-KNIGHT
3405 GN, TAD (KNIGHT-BISHOP
3406 GB, TAD (BISHOP-ROOK
3410 ISZ COLOR /WHICH COLOR
3411 CIA /COMPLEMENT VALUE IF BLACK
3412 DCA I XR0 /STORE AWAY PIECE
3415 EOL, ISZ FILKNT /WERE 8 SQUARES INPUTTED?
3416 JMP ERR2 /NO, TOO FEW SQUARES
3419 DCA RNKPTR /POINT TO NEXT RANK
3420 ISZ RNKKNT /WAS THIS LAST RANK?
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
3442 ISZ FILKNT /IS THIS RANK FULL ALREADY?
3443 JMP I CHK /NO. KEEP GOING
3444 JMP ERR1 /YES. SIGNAL ERROR
3446 MESG9, TEXT \CHECKMATE\
3454 MAP, ZBLOCK 50 /50 WORDS RESERVED FOR PIECE MAP
3456 KBUF, ZBLOCK 30 /30 WORDS RESERVED FOR THE KEYBOARD BUFFER
3460 BOARD, IFNZRO .&0077<?BOARD MUST OCCUPY 1ST OR 2ND HALF OF A PAGE ?>
3509 \fCHEKMO-II WAS WRITTEN, PRODUCED AND DIRECTED BY: JOHN E. COMEAU