X-Git-Url: http://gitweb.hachti.de/?a=blobdiff_plain;f=sw%2Fchekmo%2FCHEKMO.PA;fp=sw%2Fchekmo%2FCHEKMO.PA;h=5aec3427edf28d83af68288de30a3974cf3a1e7f;hb=81e70d488b71bf995c459ca3a02c025993460ffa;hp=0000000000000000000000000000000000000000;hpb=07ec0278333ed187ac242dedcff13c56cf1b0b91;p=pdp8.git diff --git a/sw/chekmo/CHEKMO.PA b/sw/chekmo/CHEKMO.PA new file mode 100644 index 0000000..5aec342 --- /dev/null +++ b/sw/chekmo/CHEKMO.PA @@ -0,0 +1,3510 @@ +/ CHEKMO II +ZZZ=63 +/AUTHOR JOHN E. COMEAU + + + + + + + + + + + + + + + + + +/ ::::::::::::::::::::::::::::::: +/ : : +/ : : +/ : : +/ : CHEKMO II : +/ : CHESS PROGRAM 2/74 : +/ : : +/ : : +/ : : +/ ::::::::::::::::::::::::::::::: + + + + +/ FIELD 0 CORE UTILIZATION + +/ 0000-0177 CONSTANTS AND POINTERS +/ 0200-0377 INITIALIZATION +/ 0400-4777 THE THINKER PART +/ 5000-6377 INPUT/OUTPUT ROUTINES +/ 6400-7377 PUSH DOWN LIST AREA +/ 7400-7577 BOARD & MISC. TABLES +/ 7600-7777 BINARY LOADER PROGRAM + /SYMBOL DEFINITIONS +/MISC. SYMBOLS +PDLS=6400 /BEGINING OF 1000(OCTAL) WORDS RESERVED FOR PUSH DOWN LISTS + +/PIECE VALUES DEFINED +DECIMAL +KING= 15^32 /15. RELATIVE TO A PAWNS VALUE +QUEEN= 9^32 /9.0 RELATIVE TO A PAWNS VALUE +ROOK= 5^32 /5.0 RELATIVE TO A PAWNS VALUE +BISHOP= 3^32+10 /3.3 RELATIVE TO A PAWNS VALUE +KNIGHT= 3^32+4 /3.1 RELATIVE TO A PAWNS VALUE +PAWN= 1^32 /1.0 RELATIVE TO A PAWNS VALUE + +OCTAL + +/PSEUDO INSTRUCTIONS DEFINED +PUSH1= JMS I [PUSH01 /PUSH THE AC INTO PUSH DOWN LIST #1 +POP1= JMS I [POP01 /POP THE TOP ENTRY OF PUSH DOWN LIST #1 INTO THE AC +PRINTO= JMS I [MES /PRINT 6BIT 2CHAR/WORD TEXT AT ADDRESS SPECIFIED IN THE AC +IPDL1= JMS I [IPDL01 /INITIALIZE PUSH DOWN LIST #1 +PUSH2= JMS I [PUSHIT /PUSH THE CONTENTS OF THE AC INTO PUSH DOWN LIST #2 +POP2= JMS I [POPIT /POP THE TOP ENTRY OF PUSH DOWN LIST #2 INTO THE AC +IPDL2= JMS I [PDLIN /INITIALIZE PUSH DOWN LIST #2 +SNO= JMS I [RFOFL /SKIP NO OVERFLOW (C(AC)>=0 & C(AC8)=0) + +/PDP 8/E IOTS DEFINED +CAF= 6007 +PSKF=6661 +PCLF=6662 +PSKE=6663 +PSTB=6664 +PCIE=6667 + +/CONDITIONAL ASSEMBLY DEFINITIONS +OS8=1 /NO SPECIAL MEANING TO "^C" +LPTREE=1 /DON'T INCLUDE LINE PRINTER CAPABILITIES +DEBUG=1 /OPT FOR DYNAMIC ERROR DETECTION +RANVAL=1 /NOISY EVALUATIONS PLEASE + +/DEFAULT ASSEMBLY DEFINITIONS +IFNDEF OS8 /NON OS8 SYSTEM +IFNDEF DEBUG /DEBUG SWITCH CLEARED +IFNDEF LPTREE /DONT INCLUDE TREE PRINTOUT CAPABILITIES +IFNDEF RANVAL /INCLUDE A SMIDGEN OF RANDOMNESS IN EVALUATIONS + +/ABREVIATIONS USED + +/ SQR SQUARE +/ INC INCREMENT +/ # NUMBER +/ = EQUALS +/ - MINUS, NEGATIVE OR TO +/ & AND +/ INFO INFORMATION +/ AC ACCUMULATOR +/ TEMP TEMPORARY +/K-SIDE KING SIDE +/Q-SIDE QUEEN SIDE +/ LOC LOCATION +/ CR CARRIAGE RETURN +/ LF LINE FEED +/ MSW MOVE SQUARE WORD +/ MDW MOVE DATA WORD +/ CHAR CHARACTER +/ W/ WITH +/ < LESS THAN +/ > GREATER THAN +/ PSW POSITION STATUS WORD +/ ADDR ADDRESS +/ PDL PUSH DOWN LIST +/ PDL#1 PUSH DOWN LIST #1 +/ PDL#2 PUSH DOWN LIST #2 +/ ABS ABSOLUTE +/ PROM PROMOTION +/ ARG ARGUMENT +/ VAL VALUE + + / MOVE SQUARE WORD(MSW) FORMAT +/ +/ ------------------------------------------------------------------------- +/ I I I I I I I I I I I I I +/ 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 +/ I I I I I I I I I I I I I +/ ------------------------------------------------------------------------- +/ I I I I +/ -----------------I----------------- -----------------I----------------- +/ +/ SIXBIT ADDRESS OF THE SIXBIT ADDRESS OF THE +/ "FROM SQUARE" "TO SQUARE" + + + + + + +/ MOVE DATA WORD(MDW) FORMAT +/ ------------------------------------------------------------------------- +/ I I I I I I I I I I I I I +/ 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 +/ I I I I I I I I I I I I I +/ ------------------------------------------------------------------------- +/ I I I I I I I +/ I ----I---- ----------------I---------------- -------I------- +/ I +/ I UNUSED = THE SIXBIT ADDRESS OF 0 = NORMAL +/ I ALLWAYS THE "TO SQUARE" IF THE 1 = QUEEN SIDE CASTLING +/ I EQUALS 0 MOVE IS A 2 SQUARE 2 = KING SIDE CASTLING +/ I PAWN MOVE 3 = EN PASSANT CAPTURE +/ I 4 = PAWN PROM. TO KNIGHT +/ I 5 = PAWN PROM. TO BISHOP +/ I 6 = PAWN PROM. TO ROOK +/ I 7 = PAWN PROM. TO QUEEN +/ I +/ I +/ I +/ I +/ +/ = 1 IF THIS MOVE +/ IS A CAPTURE + + +*0000 +/INTERRUPT! +IFRM, 0000 + JMP I .+1 + INTHAN /ADDRESS OF THE INTERUPT HANDLER +REV, ZZZ /LOC 3 HOLDS PROGRAM REVISION # +ODT4, 0000 /LOCATIONS 4, 5, AND 6 ARE RESERVED FOR DEBUGERS +ODT5, 0000 +ODT6, 0000 + +/ ZERO PAGE CONSTANTS +*11 +RANDOM, 0000 +XR0, 0000 +ITMP0, 0000 +ITMP1, 0000 /AUTO-INCREMENT TEMPORARY STORAGE +ITMP2, 0000 +CLIST, KBUF-1 /INPUT BUFFER POINTER +LIST2, 0000 +TEMP, 0000 /TEMPORARY STORAGE LOCATIONS +TEMP1, 0000 / . +TEMP2, 0000 / . +TEMP3, 0000 / . +TEMP4, 0000 / . +TMP, 0000 /TEMPORARY STORAGE +ZOUT, OUT /POINTS TO OUTPUT ROUTINE +CHAR, 0000 /TEMP. STORAGE PLACE FOR A CHARACTER +ZCRLF, CRLF /POINTS TO CR-LF PRINTING ROUTINE +XXXX, 0000 /TEMPORARY STORAGE +ZBEGIN, BEGIN /POINTS TO INPUT INITIATING ROUTINE +CNTCHR, 0000 /CHARACTER COUNT +ISW, 0000 /INPUT SWITCH +ZGETC, GETC /POINTS TO INPUT BUFFER READING ROUTINE +PONDIR, 0001 /PAWN DIRECTION CONSTANT +M1, 0000 +M2, 0000 +M3, 0000 +M4, 0000 +GN1, 0000 /COMMON STORAGE FOR THE MOVE GENERATION ROUTINES +GN2, 0000 / . +GN3, 0000 / . +GN4, 0000 / . +GNMSW, 0000 / . +GNMDW, 0000 / . +FSTRNK, 7777 /-VALUE OF THE FIRST RANK +ZCHKIO, CHKIO /POINTS TO IO STALL ROUTINE +WPSW, 0000 /WHITES POSITION STATUS WORD +BPSW, 0000 /BLACKS POSITION STATUS WORD +CPSW, 0000 /ADDRESS OF CURRENT POSITION STATUS WORD IS KEPT HERE +GMAP, 0000 +OMAP, 0000 +TOMAK1, 0000 /MOVE SQUARE WORD HERE +TOMAK2, 0000 /MOVE DATA WORD HERE +DIR1, 0000 +DIR2, 0000 +CNTR1, 0000 +WKING, 0000 /ADDRESS OF THE WHITE KING IS STORED HERE +BKING, 0000 /ADDRESS OF THE BLACK KING IS STORED HERE +CKING, 0000 /ADRESS OF THE KING BEING TESTED +TKING, 0000 /TEMP STORAGE FOR KING ADDR +LSTMV, 0000 /LOCATION WHICH DESCRIBES THE LAST MOVE MADE IF DOUBLE PAWN MOVE +ZGNMV, GNMV /POINTS TO MOVE GENERATION ROUTINE +ZMKMV, MKMV /POINTS TO THE MOVE MAKING ROUTINE +ZUNMV, UNMV /POINTS TO THE MOVE UNMAKING ROUTINE +ZMAPEC, MAPEC /POINTS TO PIECE MAP ROUTINE +PW, 0000 /SET = TO TOTAL VALUE OF ALL PIECES ON THE BOARD BY 'MAPEC' +WHOSE, 0000 /THIS LOC =0 IF IT IS WHITES MOVE, =-1 IF BLACKS +PCNT, 0000 /USED BY CHKATK =# OF PIECES ATTACKING THE SQUARE +PVAL, 0000 /USED BY CHKATK =LEAST VALUABLE ATTACKER +PSQR, 0000 /USED BY CHKATK =ADDRESS OF THE LEAST VALUABLE ATTACKING PIECE +ZSPLIT, SPLIT /POINTS TO A SUBROUTINE WHICH SPLITS UP A MSW +ZTSTCH, TSTCHK /POINTS TO CHECK TESTING ROUTINE +ZFNL, TSTCHK /POINTS TO FINAL LEGAL MOVE VERIFICATION ROUTINE +GNCNT, 0000 /LOC=NUMBER OF MOVES GENERATED BY GNWMV +TOADR, 0000 +IOMDW, 0000 /ARGUMENT STORAGE FOR I/O ROUTINES +IOMSW, 0000 /ARGUMENT STORAGE FOR I/O ROUTINES +CMSW, 0000 /CHECKMATE SWITCH +SMSW, 0000 /STALEMATE SWITCH +COMP, 0000 +ZLOOKA, LOOKA /POINTS TO THE RECURSIVE LOOKAHEAD SUBROUTINE +UVAL1, 0000 +CVAL1, 3777 +RVAL1, 0000 +MVAL1, 0000 /HOLDS MOBILITY VALUE +PLY, 0000 /HOLDS CURRENT RECURSION LEVEL OF THE "LOOKA" SUBROUTINE +DEPTH, 0003 /HOLDS THE MAXIMUM RECURSION LEVEL FOR THE "LOOKA" SUBROUTINE +RDEPTH, 0000 +BUG, 0000 +RNKKNT, 0000 /TEMP STORAGE FOR BOARD OUTPRINT & BOARD INPUT ROUTINES +FILKNT, 0 +PIECE, 0 +COLOR, 0 +RNKPTR, 0 +MOBMOD, 0000 +KNGBLK, 0000 /SET BY "GNMV" TO # OF KING MOVES ILLEGAL BECAUSE OF CHECK +MOB0, 0000 +MOB1, 0000 +CTNEED, 0000 +STRATG, 0000 /HOLDS STRATEGIC VALUE +PC01, 0000 /POINTER FOR PUSH DOWN LIST #1 +PDLADR, 0000 /POINTER FOR PUSH DOWN LIST #2 +IFNZRO DEBUG< +ENO, 0000 +ENOB, 0000 +> +WHOWHI, 0000 +WHOBLK, 0000 +COMTMP, 0000 +BOGUS, 0000 +DOMAP, 0000 + *200 +START, IFNZRO LPTREE < + TAD (OUT + DCA ZOUT /MAKE SURE OUTPUT GOES TO THE TTY +> + JMS I ZCRLF + PRINTO; NAME /PRINT "CHEKMO-II" + JMS I ZCRLF + DCA WHOSE + JMS SETBRD /SETUP THE BOARD +COMPN, DCA WHOWHI /RESET SWITCH FOR THE USER TO PLAY WHITE + DCA WHOBLK /RESET SWITCH FOR THE USER TO PLAY BLACK +COMMAN, IPDL2 /INITIALIZE PUSH DOWN LISTS + IPDL1 + ISZ DOMAP /MAKE SURE A PIECE MAP IS REALY DONE + JMS QMATE /TEST FOR SIDE TO MOVE IN CHECKMATE OR STALEMATE + TAD WHOSE /GET "WHOSE MOVE" SWITCH + SPA CLA /IS IT WHITES OR BLACKS MOVE? + JMP BLKMVE /BLACKS + PRINTO; MESG23 /PRINT "W. " + TAD WHOWHI /GET THE "WHO PLAYS WHITE" SWITCH + SZA CLA /DOES THE COMPUTER PLAY ON BEHALF OF WHITE? + JMP CMOVE /YES +USER, PRINTO; MESG24 /PRINT "YOUR MOVE?" + JMS I ZBEGIN /SETUP TO ACCEPT A LINE OF INPUT + ION /ACCEPT IT ANY TIME NOW + JMS I ZCHKIO /WAIT FOR IT TO FINISH + JMS I ZGETC /GET 1ST CHAR + AND [0077 /ONLY NEED 6 BITS + RTL CLL /MOVE THEM TO THE HIGH ORDER 6 BITS + RTL /POSITION + RTL + DCA COMTMP /STORE FOR A WHILE + JMS I ZGETC /GET 2ND CHAR + AND [0077 /ONLY NEED 6 BITS + TAD COMTMP /WE NOW HAVE THE FIRST 2 INPUT CHARS PACKED + DCA COMTMP /6BIT STYLE IN 1 WORD + TAD (COMLST-2/ADDRESS-2 OF THE COMMAND LIST + DCA XR0 /TO AUTO INDEX REGISTER +NUTHER, ISZ XR0 /INC POINTER TO POINT AT A 6BIT COMMAND IN THE COMMAND LIST + TAD I XR0 /GET A LEGAL 6BIT COMMAND + SNA /WERE THERE ANY MORE TO GET? + JMP UINP /NO. THE USER MUST BE TRYING TO ENTER A MOVE + TAD COMTMP /YES. COMPARE WITH THE ONE THE USER JUST INPUTED + SZA CLA /IS IT A MATCH? + JMP NUTHER /NO. TRY AGAIN + TAD I XR0 /YES. GET THE TRANSFER ADDRESS + DCA TEMP + JMP I TEMP /TRANSFER + +COMPW, ISZ WHOWHI /SET SWITCH TO INDICATE THAT WHITE IS PLAYED + JMP COMMAN /BY THE COMPUTER + +COMPB, ISZ WHOBLK /SET THE SWITCH TO INDICATE THAT BLACK IS PLAYED + JMP COMMAN /BY THE COMPUTER + +COMBD, JMS DISPLAY /DISPLAY THE BOARD ON THE TELLETYPE + JMP COMMAN + +COMIP, JMS INPUT /GET THE INPUT OF A POSITION FROM THE TELLETYPE + JMP COMPN + +UINP, JMS I ZBEGIN /REINIT THE KEYBOARD BUFFER POINTER + JMS INMV /WAS A LEGAL MOVE TYPED IN? + SKP CLA /NO. + JMP COMMAN /YES. IT WAS ALSO MADE BY THE "INMOVE" SUBROUTINE + TAD ("? /PRINT A "?" + JMS I ZOUT /TO INDICATE THE ERROR + JMS I ZCRLF + JMP COMMAN /TRY AGAIN + +BLKMVE, PRINTO; MESG22 /BRINT "B. " + TAD WHOBLK + SNA CLA /DOES THE USER PLAY BLACK, OR DOES THE COMPUTER? + JMP USER /THE USER +CMOVE, CLA /COMPUTER NOW MAKES A MOVE + TAD (3777 /INITIALIZE SEARCH VALUE TO PREVENT PRUNING AT THE FIRST PLY + DCA CVAL1 + DCA PLY /MAKE SURE PLY # IS 0 BEFORE ENTERING RECURSIVE EVALUATOR + IFNZRO LPTREE< + TAD (LPTOUT /SWITCH OUTPUT DEVICE TO LINE PRINTER + DCA ZOUT + JMS I ZCRLF + JMS DISPLA /PRINT THE BOARD AT PLY 0 + JMS TABPLY +> + CMA CLA + TAD DEPTH /DO A SHORT "PRE ANALYSIS" + SNA /UNLESS WE ARE IN "BLITZ MODE" (DEPTH OF 1) + JMP CMOVE1 /WHICH WE ARE + IAC + DCA RDEPTH /SAVE THE REAL DEPTH + IAC + DCA DEPTH /SET THE DEPTH TO 1 TEMPORARILY + JMS I ZLOOKA /FIND OUT WHICH MOVE LOOKS THE BEST + TAD RDEPTH + DCA DEPTH /RESTORE THE REAL DEPTH +CMOVE1, JMS I ZLOOKA /FIGURE OUT WHICH MOVE TO MAKE + IFNZRO LPTREE< + TAD (OUT /SWITCH OUTPUT DEV. BACK TO TTY + DCA ZOUT +> + TAD BESTBL + DCA IOMSW + TAD BESTBL+1 + DCA IOMDW + TAD BESTBL /GET THE LAST MOVE TO WIN A COMPARE ON PLY #1 + DCA TOMAK1 /FROM THE TABLE OF BEST MOVES + TAD BESTBL+1 + DCA TOMAK2 + JMS I ZMKMV /MAKE THE MOVE + JMS OUTMV /PRINT OUT THE MOVE JUST MADE + JMS GNMVSM /GENERATE MOVES FOR THE SIDE TO MOVE + TAD GNCHEK /GET # OF ATTACKS ON THE KING + SZA CLA /IS THE SIDE TO MOVE IN CHECK? + TAD ("+ /YES. PRINT A "+" TO INDICATE IT + JMS I ZOUT + JMS I ZCRLF + JMP COMMAN + +PAGE + /THIS SUBROUTINE GENERATES ALL MOVES FOR A SIDE +/AND STICKS THEM INTO PDL2. +/THIS SUBROUTINE IN ADDITION... +/SETS "GNCNT" TO THE # OF MOVES GENERATED +/SETS "CMSW" TO A NON-ZERO VALUE IF NO MOVES CAN BE GENERATED BECAUSE OF CHECKMATE +/SETS "SMSW" TO A NON-ZERO VALUE IF NO MOVES CAN BE GENERATED BECAUSE OF STALEMATE +/SETS "GNCHEK" TO THE NUMBER OF PIECES ATTACKING THE KING IF THE KING IS IN CHECK +/SETS "KNGBLK" TO THE NUMBER OF ADJACENT SQUARES THE KING CANNOT MOVE +/INTO BECAUSE THAT WOULD PUT HIM IN CHECK +/SETS "MOBMOD" TO THE MOVING SIDES MOBILITY VALUE, BASED ON "GNCNT" AND +/THE NUMBER OF MOVES THAT ARE ILLEGAL BECAUSE THEY DO NOT +/GET THE KING OUT OF CHECK, BUT ARE OTHERWISE LEGAL, MINUS +/50% OF THE TOTAL # OF QUEEN MOVES. +/IF THIS ROUTINE IS CALLED WITH "BOGUS" SET TO A NON-ZERO VALUE +/THIS SUBROUTINE WILL NOT PUT ANY MOVES IN PDL#2 OR TRY TO GENERATE +/EN PASSANT PAWN CAPTURES +/THIS SUBROUTINE SETS BOGUS TO ZERO BEFORE RETURNING +GNMV, 0000 + CLL CLA + DCA MOBMOD /INITIALIZE THE MOBMOD COUNTER + DCA KNGBLK /INITIALIZE THE BLOCKED KING MOVE COUNTER + DCA CMSW /INITIALIZE CHECKMATE SWITCH TO = NO CHECKMATE + DCA SMSW /INITIALIZE STALEMATE SWITCH TO = NO STALEMATE + DCA QMVCNT /INIT QUEEN MOVE COUNTER + TAD CKING /TEST FOR KING IN CHECK + DCA TEMP + JMS CHKATK /CALL W/AC CLEAR---FIND ALL ATTACKS ON THE KING + TAD PCNT /GET # OF ATTACKS + DCA GNCHEK /SAVE THE # OF ATTACKS ON THE KING + DCA GNCNT /INITIALIZE GENERATION COUNT = 0 + TAD BOGUS + SZA CLA /ARE WE GOING TO BE PUTTING MOVES IN PDL#2? + JMP .+3 /NO. NO NEED FOR MARKERS THEN + PUSH2 /YES. FIRST THING TO DO IS PUSH 2 BLANK WORDS + PUSH2 /TO MARK LIST PLACE + TAD CKING /SETUP TO GENERATE KING MOVES + DCA CNTR1 + TAD CNTR1 /SPLIT THE KINGS SQUARES ADDR UP INTO RANK AND FILE #'S + AND [0007 + DCA GN2 /STORE THE FILE # + TAD CNTR1 + RTR + RAR + AND [0007 + DCA GN1 /STORE THE RANK # + JMS GKM /GENERATE THOSE KING MOVES + TAD GNCHEK /GET THE NUMBER OF PIECES PRESENTLY CHECKING THE KING + RAR CLL /NO COMMENT + SZA CLA /IS THE KING IN DOUBLE CHECK? + JMP TSCMSM /YES. NO USE TRYING TO GENERATE MOVES BY OTHER PIECES + TAD BOGUS /NO. + SNA CLA /IS THIS FOR REAL? + JMS GNEP /YES. GENERATE ANY POSIBLE 'EN PASSANT' PAWN CAPTURES NOW + TAD GMAP /ADDRESS-1 OF MAP + DCA ITMP2 /STORE IT +NXTSQR, CLL CLA + TAD I ITMP2 /GET THE ADDRESS OF THE NEXT PIECE + SNA /IS IT REALY A PIECE? + JMP TSCMSM /NO. MOVES ARE ALL GENERATED. + DCA CNTR1 /YES. STORE ITS ADDRESS + IAC + DCA CTNEED /INITIALIZE THE CHECK TEST NEED SWITCH + TAD CNTR1 /NOW STRIP RANK AND FILE NUMBERS FROM THE ADDRESS + AND [0007 + DCA GN2 /STORE THE FILE NUMBER + TAD CNTR1 + RTR + RAR + AND [0007 + DCA GN1 /STORE THE RANK NUMBER + TAD I CNTR1 /GET THE VALUE OF THE PIECE ON THE SQUARE + JMS CLRFIX + TAD [-PAWN + SNA /IS IT A PAWN? + JMP GPM /YES + TAD (PAWN-KNIGHT + SNA /IS IT A KNIGHT? + JMP GNM /YES + TAD (KNIGHT-BISHOP + SNA /IS IT A BISHOP? + JMP GBM /YES + TAD (BISHOP-ROOK + SNA /IS IT A ROOK? + JMP GRM /YES + TAD (ROOK-KING + SNA /IS IT A KING? + JMP NXTSQR /YES. TRY NEXT PIECE SINCE KING MOVES HAVE ALLREADY BEEN GENERATED + TAD (KING-QUEEN + SNA /IS IT A QUEEN? + JMP GQM /YES + HLT /NO. SOMTHINGS WRONG HERE ! + +QMVCNT, 0000 +GNCHEK, 0000 + +TSCMSM, TAD QMVCNT /ADD # OF QUEEN MOVES & QUEEN MOVE REJECTS + CLL RAR /DIVIDE BY 2 + TAD QMVCNT + CLL RAR /AC WIL EQUAL 3/4 OF THE # OF QUEEN MOVES & REJECTS + CIA /SUBTRACT + TAD MOBMOD /FROM THE MOBILITY MODIFIER + TAD GNCNT /ADD "REAL" MOBILITY IN WITH THE MOBILITY MODIFIER + DCA MOBMOD + DCA BOGUS + TAD GNCNT /GET # OF MOVES GENERATED + SZA CLA /ANY? + JMP I GNMV /YES: RETURN + TAD GNCHEK /NO. ITS EITHER A CHECKMATE OR STALEMATE POSITION + SNA /WAS THE KING IN CHECK? + ISZ SMSW /NO. SET THE STALEMATE SWITCH + DCA CMSW /IF KING WAS IN CHECK (GNCHEK>=1) SET THE CHECKMATE SWITCH + JMP I GNMV /RETURN + + IFNZRO DEBUG< +/ROUTINE TO ALLOW THE TIMING OF THE "GNMV" SUBROUTINE +/CALLS IT 4000(OCTAL) TIMES, THEN HALTS +TIME, IPDL2 + IPDL1 + JMS GNWMV + ISZ .+2 + JMP .-4 + 4000 /# OF ITTERATIONS OF THE TIMING LOOP + HLT +> + +/ SNO -- SKIP NO OVERFLOW +/PSEUDO-INSTRUCTION TO TEST FOR RANK OR FILE OVERFLOW. +/EFFECTIVLY SKIPS IF NO OVERFLOW. CALL WITH RANK OR FILE +/NUMBER IN AC. RETURN WITH NUMBER IN AC IF NO OVERFLOW, GARBAGE OTHERWISE +RFOFL, 0000 + SPA /LESS THAN ZERO? + JMP I RFOFL /YES. RETURN + RTR /SHIFT BIT 8 INTO LINK + RTR /IF IT'S SET OVERFLOW HAS OCCURED + SZL /GREATER THAN 7? + JMP I RFOFL /YES. RETURN (WITH A GARBLED ACCUMULATOR) + RTL + RTL /SHIFT THE WORD BACK TO NORMAL + ISZ RFOFL /INC RETURN ADDRESS + JMP I RFOFL /RETURN +PAGE + +/THIS ROUTINE GENERATES ALL THE MOVES OF A 'STRAIGHT LINE' MOVING +/PIECE. ITMP0 MUST BE PRESET TO THE ADDRESS-1 OF THE MOVE GENERATION +/DIRECTION LIST. LCNT MUST BE SET TO MINUS THE NUMBER OF 2-WORD +/ENTRIES IN THAT LIST +LINE, CLA + TAD I ITMP0 /GET THE VERTICAL DIRECTION + DCA DIR1 /SAVE IT + TAD I ITMP0 /GET THE HORIZINTAL DIRECTION + DCA DIR2 /SAVE THAT ALSO + TAD GN1 + DCA GN3 + TAD GN2 + DCA GN4 +LINEM, TAD GN3 /BUILD SQUARE RANK NUMBER + TAD DIR1 + SNO /IS THAT RANK REALY ON THE BOARD? + JMP XXOX /NO. IT DOES NOT EXIST + DCA GN3 + TAD DIR2 + TAD GN4 + JMS XYZ + JMP XXOX + TAD I CNTR1 /GET VALUE OF THE MOVING PIECE + JMS CLRFIX + TAD (-QUEEN + SNA CLA /ARE WE TESTING FOR A LEGAL QUEEN MOVE? + ISZ QMVCNT /YES. INC QUEEN MOVE COUNTER + TAD GNMSW + JMS I ZFNL /DO FINAL TEST FOR KING CHECK + JMP XOOO /MOVE ILLEGAL: KING IS IN CHECK + TAD I TOADR /GET VALUE OF THE 'TO' SQUARE + SZA CLA /IS THE MOVE A CAPTURE? + STL RAR /YES: SET CAPTURE BIT + DCA GNMDW + JMS GNSTR /PUSH THE MOVE INTO THE STACK +XOOO, TAD I TOADR /GET THE VALUE OF THE PIECE ON THE 'TO SQUARE' + SNA CLA /WAS THE MOVE A CAPTURE? + JMP LINEM /NO. COULD BE MORE MOVES IN THIS DIRECTION +XXOX, CLA /YES. NO MORE MOVES IN THIS DIRECTION + ISZ LCNT /DONE ALL DIRECTIONS? + JMP LINE /NO. TRY ANOTHER + JMP NXTSQR /YES. DONE WITH THIS PIECE. TRY NEXT +LCNT, 0000 + +/ROUTINE TO STORE THE MSW AND MDW IN THE PDL +GNSTR, 0000 + ISZ GNCNT /INC GENERATION COUNT + CLA + TAD BOGUS + SZA CLA /SHOULD THESE MOVES GO INTO PDL#2? + JMP I GNSTR /NO. DONT PUT ANY THERE! + TAD GNMSW /GET MSW + PUSH2 /PUSH IT INTO THE LIST + TAD GNMDW /GET THE MDW + PUSH2 /PUSH IT INTO LIST + JMP I GNSTR /RETURN + +/SUBROUTINE TO TEST IF THE 'TO' SQUARE IS OCCUPIED BY OWN PIECE +/IF NOT SKIP FOR RETURN AND BUILD MSW +XYZ, 0000 + SNO /DID IT GO OFF THE BOARD? + JMP I XYZ /YES: RETURN + DCA GN4 /NO: SAVE THIS HALF + JMS BLDTO /BUILD 'TO' ADDR + TAD I TOADR /GET VALUE OF THE 'TO' SQUARE + JMS CLRFIX + SMA SZA CLA /OCCUPIED BY OWN PIECE? + JMP I XYZ /YES: RETURN + JMS BLDMSW /NO: BUILD THE MSW + ISZ XYZ /INC RETURN ADDR + JMP I XYZ /RETURN + +GQM, CLA /GENERATE QUEEN MOVES + TAD [-10 /DO ALL DIRECTIONS + DCA LCNT + TAD (OTRX-1 /DIAGONAL AND ORTHOGONAL + DCA ITMP0 + JMP LINE + +GRM, CLA /GENERATE ROOK MOVES + TAD (-4 /DO ONLY HALF OF THE DIRECTIONS + DCA LCNT + TAD (OTR-1 /THE ORTHOGONAL ONES + DCA ITMP0 + JMP LINE + +GBM, CLA /GENERATE BISHOP MOVES + TAD (-4 /DO ONLY HALF OF THE DIRECTIONS + DCA LCNT + TAD (OTRX-1 /THE DIAGONAL ONES + DCA ITMP0 + JMP LINE + +/SUBROUTINE TO BUILD AN MSW. CALL WITH ADDRESS OF THE 'TO SQUARE' IN LOCATION +/'TOADR', AND THE LOCATION OF THE 'FROM SQUARE IN LOCATION "CNTR1". RETURN WITH THE +/NEW MSW IN LOCATION 'GNMSW +BLDMSW, 0000 + CLA + TAD TOADR + AND [0077 /STRIP THE 'TO SQUARE' ADDRESS DOWN INTO 6BIT + DCA GNMSW /STORE IT TEMPORARILY + TAD CNTR1 + AND [0077 /DO THE SAME FOR THE 'FROM SQUARE' ADDRESS + RTL CLL /BUT INSTEAD OF STORING IT, ROTATE IT INTO BITS 0-5 + RTL + RTL + TAD GNMSW /NOW PACK THE 6BIT 'TO SQUARE' ADDRESS IN WITH IT + DCA GNMSW /STORE AWAY THE NEW MSW + JMP I BLDMSW /RETURN + +PUSHIT, 0000 /PUSH ROUTINE + DCA I PDLADR /PUT NEW ITEM ON TOP + ISZ PDLADR /PUSH + JMS OFLOW /TEST FOR LIST OVERLAP + JMP I PUSHIT /RETURN + +POPIT, 0000 /POP ROUTINE + CLA CMA + TAD PDLADR /MOVE LIST POINTER DOWN + SMA /MAKE SURE LIST DOESN'T GO WILD + HLT /IT DID! MANY EXTRA POPS + DCA PDLADR + TAD I PDLADR /GRAB THE TOP WORD + JMP I POPIT /RETURN WITH IT + +PUSH01, 0000 + DCA I PC01 /PUT NEW ITEM ON TOP + CMA + TAD PC01 + DCA PC01 /PUSH IT DOWN + JMS OFLOW /TEST FOR PDL OVERFLOW + JMP I PUSH01 /RETURN + +POP01, 0000 + ISZ PC01 /MOVE THE LIST POINTER DOWN + SKP CLA + HLT /LOTS OF EXTRA POPS + TAD I PC01 /GRAB THE WORD ON TOP + JMP I POP01 /RETURN WITH IT + +PAGE + /ROUTINE TO GENERATE ALL MOVES OF A KING OR KNIGHT +/CALLED WITH THE MOVE GENERATION LIST ADDRESS-1 IN AC +SNGMV, 0000 + DCA ITMP0 /STORE THE ADDRESS OF THE LIST + TAD [7770 + DCA SCNT /THERE ARE 8 DIRECTIONS + DCA GNMDW /INITIALIZE THE MDW + TAD GN1 + TAD I ITMP0 + SNO /OFF THE BOARD + JMP XXXO-1 /YES TRY ANOTHER DIRECTION + DCA GN3 + TAD GN2 + TAD I ITMP0 + JMS XYZ + JMP XXXO + TAD I CNTR1 /GET VALUE OF THE MOVING PIECE + JMS CLRFIX + TAD (-KING + SZA CLA /IS IT A KING? + JMP SNGKNT /NO: ITS A KNIGHT + TAD GNMSW /YES + JMS MMOVE /MAKE THE KING MOVE + TAD TOADR + DCA TEMP /TEST FOR AN ATTACK ON THE KINGS NEW SQUARE + IAC /AND RETURN AFTER THE FIRST ATTACK IS FOUND + JMS CHKATK + JMS UMOVE /UNMAKE THE MOVE + TAD PCNT /NOW WORRY ABOUT LEGAL OR ILLEGAL + SNA CLA /WAS THE KING IN CHECK? + JMP SNGLGL /NO. MOVE IS LEGAL + ISZ KNGBLK /YES. INC BLOCKED KING MOVE COUNTER + JMP XXXO /GO TO THE ILLEGAL PLACE +SNGKNT, TAD GNMSW + JMS I ZFNL /DO FINAL CHECK + JMP XXXO /KING IS ATTACKED: KNIGHT MOVE NO GOOD +SNGLGL, TAD I TOADR /GET VALUE OF THE 'TO' SQUARE + SZA CLA /IS THE MOVE A CAPTURE? + CLA STL RAR /YES: SET CAPTURE BIT + TAD GNMDW + DCA GNMDW /STORE MDW AGAIN + JMS GNSTR /PUSH MOVE INTO LIST + SKP + ISZ ITMP0 /FAILED ON FIRST LIST ELEMENT. PASS OVER SECOND +XXXO, CLA + ISZ SCNT /TESTED ALL DIRECTIONS? + JMP SNGMV+4 /NO. TRY THE NEXT ONE + JMP I SNGMV /YES. RETURN + +SCNT, 0000 /DIRECTION COUNTER + + +GPM, CLA /GENERATE THE MOVES OF A PAWN + DCA GNMDW + TAD GN2 + DCA GN4 + TAD GN1 + JMS PST + JMP GPM1 /MOVING 1 FORWARD BLOCKED: FORGET 2 + TAD GN1 /MOVING 1 FORWARD IS NOT BLOCKED. NOW TEST FOR 2 + TAD FSTRNK + SZA CLA + JMP GPM1 /NOT THIS PAWNS FIRST MOVE. CAN'T MOVE 2 + CLA STL RTR + DCA GNMDW /SETUP MDW TO INDICATE DOUBLE PAWN MOVE(TEMPORARY INDICATION) + TAD GN3 + JMS PST + NOP /MUST BE HERE CAUSE "PST" SUBROUTINE SOMETIMES RETURNS TO ADDRESS+2 OF THE CALLING JMS +GPM1, CLA /NOW TEST CAPTURES + TAD GN1 + TAD PONDIR + DCA GN3 + IAC + TAD GN2 + DCA GN4 + TAD GN4 + AND [7770 + SZA CLA /CAN IT CAPTURE TO THE HIGH SIDE? + JMP .+2 /NO. IT WAS ON THE EDGE OF THE HIGH SIDE + JMS CAPTST + CLA CMA + TAD GN2 + SPA /CAN IT CAPTURE TO THE LOW SIDE? + JMP .+3 /NO. IT WAS ON THE LOW EDGE + DCA GN4 + JMS CAPTST + JMP NXTSQR + /FOLLOWING ARE THE MOVE GENERATION DIRECTION LISTS +OTRX, 1 /BISHOP MOVE DIRECTION LIST + -1 + + 1 + 1 + + -1 + -1 + + -1 + 1 + +OTR, 1 /ROOK MOVE DIRECTION LIST + 0 + + 0 + -1 + + 0 + 1 + + -1 + 0 + +KNLST, 2 /KNIGHT MOVE DIRECTION LIST + -1 + + 2 + 1 + + 1 + 2 + + -1 + 2 + + -2 + 1 + + -2 + -1 + + -1 + -2 + + 1 + -2 + +PAGE + /GENERATE KING MOVES +GKM, 0000 + /FIRST TRY CASTLING + IAC CLA /SETUP MDW TO INDICATE CASTLING + DCA GNMDW + TAD PONDIR /BUILD THE ADDRESS OF THE KINGS ORIGINAL SQUARE + AND (0070 + TAD (BOARD+4/KING IS ON FILE E + DCA TEMP /STORE THE ADDRESS OF THE KINGS ORIGINAL SQUARE + TAD I TEMP /GET THE VALUE OF THE PIECE ON IT + JMS CLRFIX + TAD (-KING + SNA CLA /IS IT A KING? + JMP GKM2 /YES + TAD I CPSW /NO. MAKE 'CPSW' REFLECT THIS + AND [0007 /SAVE BITS 9-11 IN CASE HE IS CASTLED + TAD (3000 /SET THE "NO MORE CASTLING" BITS + DCA I CPSW /NO MORE CASTLING + JMP GKM1 /BUT NORMAL KING MOVES ARE OK. GENERATE THEM NOW +GKM2, TAD TEMP /CHANGE 'TEMP' TO EQUAL THE ADDRESS OF THE QUEENS ROOK + AND [7770 /BY CHANGING THE FILE TO A + DCA TEMP /STORE ADDRESS OF QUEENS ROOK + TAD I CPSW + RTL /MOVE 'QUEEN ROOK BIT' INTO AC0 + SPA CLA /IF ITS SET THE QUEENS ROOK HAS MOVED + JMP CAKR /QUEENS ROOK HAS MOVED ALLREADY: TRY KING SIDE CASTLING + TAD I TEMP /GET VALUE OF PIECE ON A1(A8) + JMS CLRFIX + TAD (-ROOK + SNA CLA /IS IT A ROOK? + JMP .+5 /YES. CONTINUE + TAD (1000 /NO. 'QUEEN ROOK BIT' LIED + TAD I CPSW /CHANGE IT TO GIVE A TRUE INDICATION + DCA I CPSW /NO MARE CASTLING WITH THE QUEENS ROOK + JMP CAKR /AND TRY KING-SIDE CASTLING + TAD GNCHEK /FIND OUT IF THE KING IS IN CHECK + SZA CLA /IS THE KING IN CHECK + JMP CAKR /YES. GO SEE IF THE KINGS ROOK HAS MOVED + ISZ TEMP /NO. INC 'TEMP' SO THAT IT EQUALS THE ADDRESS OF B1(B8) + TAD I TEMP /GET THE VALUE OF THE SQUARE + SZA CLA /IS IT EMPTY? + JMP CAKR /NO. TRY KING-SIDE CASTLING + ISZ TEMP /INC 'TEMP' SO THAT IT EQUALS THE ADDRESS OF C1(C8) + TAD I TEMP /GET THE VALUE OF THE SQUARE + SZA CLA /IS IT EMPTY? + JMP CAKR /NO. TRY KING-SIDE CASTLING + JMS CHKATK /CHECK FOR AN ATTACK ON THAT SQUARE BY AN ENEMY PIECE + TAD PCNT /GET # OF ATTACKS + SZA CLA /ANY? + JMP CAKR /YES. Q-SIDE CASTLING ILLEGAL, TRY K-SIDE + ISZ TEMP /INC 'TEMP' TO EQUAL ADDRESS OF D1(D8) + TAD I TEMP /GET THE SQUARES VALUE + SZA CLA /IS IT OCCUPIED? + JMP CAKR /YES. TRY K-SIDE CASTLING INSTEAD + JMS CHKATK /CHECK FOR ATTACKS ON SQUARE D1(D8) + TAD PCNT /GET # OF ATTACKS + SZA CLA /ARE THERE ANY? + JMP CAKR /YES. TRY K-SIDE CASTLING + TAD PONDIR /NO. QUEEN SIDE CASTLING IS LEGAL!! + AND (7070 /BUILD AN MSW FOR QUEEN SIDE CASTLING + TAD (0402 + DCA GNMSW /STORE THE NEW MSW + JMS GNSTR /PUSH THE MOVE ONTO PDL2 +CAKR, CLA + TAD I CPSW /TRY TO GENERATE A KING SIDE CASTLING MOVE + RAL /MOVE 'KING ROOK BIT' OF THE PSW INTO AC0 + SPA CLA /IS IT SET? + JMP GKM1 /YES. KINGS ROOK HAS ALLREADY MOVED + TAD TEMP /NO. BUILD ADDRESS OF THE KINGS ROOK + AND [7770 + TAD [0007 + DCA TEMP + TAD I TEMP /GET THE VALUE OF THE PIECE ON H1(H8) + JMS CLRFIX + TAD (-ROOK + SNA CLA /IS IT A ROOK? + JMP .+5 /YES CONTINUE + CLA STL RTR /NO. 'KING ROOK BIT' LIED: FIX IT + TAD I CPSW + DCA I CPSW + JMP GKM1 /GO TRY PROPER STYLE KING MOVES + TAD GNCHEK /TEST FOR KING IN CHECK + SZA CLA /IS THEKING IN CHECK? + JMP GKM1 /YES. GO TRY REGULAR STYLE KING MOVES + TAD TEMP /NO. CONTINUE TRYING FOR KING SIDE CASTLING + TAD (-2 + DCA TEMP /SET 'TEMP' = THE ADDRESS OF SQUARE E1(E8) + JMS CAKR1 /TEST TO SEE IF THE SQUARE IS OCUPIED OR ATTACKED + ISZ TEMP /NO. INC 'TEMP' TO EQUAL THE ADDRESS OF F1(F8) + JMS CAKR1 /TEST THE SQUARE FOR OCCUPATION OR ATTACKS + TAD PONDIR /NO. BUILD AN MSW CAUSE KING SIDE CASTLING IS LEGAL!! + AND (7070 + TAD (0406 + DCA GNMSW + ISZ GNMDW /INC MDW SO THAT IT INDICATES KING SIDE CASTLING + JMS GNSTR /STORE THE MOVE IN PDL2 +GKM1, CLA + TAD (OTRX-1 /NOW GENERATE 'NORMAL' KING MOVES + JMS SNGMV + JMP I GKM /RETURN + + CAKR1, 0000 + TAD I TEMP /GET THE VALUE OF THE SQUARE + SZA CLA /IS THERE A PIECE ON IT? + JMP GKM1 /YES. MOVE ON TO NORMAL KING MOVES + JMS CHKATK /NO. TEST FOR ATTACKS ON THAT SQUARE BY ENEMY PIECES + TAD PCNT /GET # OF ATTACKS + SZA CLA /ANY? + JMP GKM1 /YES. + JMP I CAKR1 /RETURN + +GNM, CLA /GENERATE KNIGHT MOVES + TAD (KNLST-1/GET ADDRESS OF THE KNIGHT MOVE GENERATION LIST + JMS SNGMV + JMP NXTSQR +PAGE + /SUBROUTINE TO BUILD A 'TO SQUARE' ADDRESS +/RETURN WITH ADDRESS IN LOC 'TOADR' +BLDTO, 0000 + TAD GN3 /GET RANK # AND ROTATE IT + RTL CLL /INTO ITS PROPER PLACE(BITS 6-8) + RAL + TAD GN4 /ADD IN THE FILE # + TAD [BOARD /ADD IN BOARD ADDRESS CONSTANT + DCA TOADR /STORE THE ADDRESS + JMP I BLDTO /RETURN + + +/SUBROUTINE TO FIX THE COLOR PROBLEM, AND ALLOW ANY SUBROUTINE +/TO WORK WITH BLACK PIECES AS WELL AS WHITE PIECES +CLRFIX, 0000 +COLR, HLT /=NOP FOR WHITE, =CIA FOR BLACK + JMP I CLRFIX /RETURN + /SUBROUTINE TO GENERATE 'EN PASSANT' PAWN CAPTURES +/IF PAWNS MYSTERYOUSLY CHANGE COLOR, THIS ROUTINE IS THE LIKLEY SUSPECT +GNEP, 0000 + CMA CLA /-1 TO THE AC + DCA CTNEED /ALWAYS TEST FOR KING IN CHECK + TAD LSTMV /GET SOME INFORMATION ON THE LAST MOVE MADE + AND (0770 /ISOLATE THE 'DOUBLE PAWN MOVE' INFO + SNA /WAS THE LAST MOVE MADE A DOUBLE PAWN MOVE? + JMP I GNEP /NO. 'EN PASSANT' CAPTURES ARE NOT POSIBLE. RETURN + RTR CLL /YES. ROTATE THE INFO(6BIT 'TO ADDRESS') INTO BITS 6-11 + RAR + TAD [BOARD /ADD IN BOARD ADDRESS CONSTANT + DCA CNTR1 /STORE THE ADDRESS OF THE CAPTURED PAWN + TAD CNTR1 + DCA GNEPTM /STORE THE ADDRESS OF THE CAPTURED PAWN + DCA I GNEPTM /TAKE THE PAWN OFF THE BOARD NOW FOR CONVIENIENCE + TAD CNTR1 /BUILD A 'TO RANK' THEN A 'TO ADDRESS' + RTR CLL /FIRST ROTATE THE OLD 'TO RANK' INTO BITS 9-11 + RAR + AND [0007 + TAD PONDIR /NEW 'TO RANK' IS 1 MOVE GREATER THAN THE OLD ONE + RTL CLL /ROTATE THE 'TO RANK' BACK INTO PLACE AGAIN + RAL + DCA GNMDW /STORE IT TEMPORARILY + TAD CNTR1 /GET THE ADDRESS OF THE PAWN BEING CAPTURED + AND (7707 /CLEAR OUT ROOM FOR THE NEW 'TO RANK' + TAD GNMDW /ADD THE NEW 'TO RANK' IN + DCA TOADR /STORE THE 'TO SQUARE' ADDRESS + TAD (4003 /4003 IS THE MDW REPRESENTING AN 'EN PASSANT' CAPTURE + DCA GNMDW /STORE THE NEW MDW + ISZ CNTR1 /TRY THE ADDJACENT FILE ON THE HIGH SIDE FIRST + TAD CNTR1 + AND [0007 + SNA CLA /IS THERE REALY A FILE ON THAT SIDE? + JMP GNOTF /NO. TRY THE OTHER SIDE + TAD I CNTR1 /GET THE VALUE OF THE PIECE ON THE SQUARE + JMS CLRFIX + TAD [-PAWN + SZA CLA /IS IT A PAWN? + JMP GNOTF /NO. TRY THE OTHER ADDJACENT FILE + JMS BLDMSW /YES. MOVE SEEMS OK. BUILD AN MSW FOR IT + TAD GNMSW /LOAD THE MSW INTO THE AC + JMS I ZTSTCH /TEST IF THE MOVE IS ILLEGAL BY VIRTUE OF KING IN CHECK + SKP /IT IS ILLEGAL DONT STORE IT IN THE PUSH DOWN LIST + JMS GNSTR /MOVE IS LEGAL STORE IT IN PDL2 +GNOTF, CLA + TAD CNTR1 /GET THE 'FROM SQUARE ADDRESS' + TAD (-2 /CHANGE IT TO POINT TO THE ADDJACENT FILE ON THE OTHER SIDE + DCA CNTR1 + TAD GNEPTM /NOW TEST IF THAT FILE REALY EXISTS + AND [0007 /IF THE FILE IS 0 WE'RE ON THE EDGE + SNA CLA /DOES THE FILE REALY EXIST, OR IS THE PAWN ON THE EDGE OF THE BOARD + JMP GNEPDN /DOES NOT EXIST! + TAD I CNTR1 /GET THE VALUE OF THE PIECE ON THAT SQUARE + JMS CLRFIX + TAD [-PAWN + SZA CLA /IS IT A PAWN? + JMP GNEPDN /NO + JMS BLDMSW /YES. BUILD AN MSW + TAD GNMSW + JMS I ZTSTCH /IS THE KING IN CHECK IF THAT MOVE IS MADE + SKP /YES. DONT STORE THE MOVE IN THE PDL + JMS GNSTR /NO. STORE THE MOVE IN PDL2 +GNEPDN, TAD [-PAWN + JMS CLRFIX + DCA I GNEPTM /REPLACE THE PAWN THAT WAS REMOVED EARLIER + JMP I GNEP /RETURN +GNEPTM, 0000 /LOCATION FOR STORAGE OF THE CAPTURED PAWNS ADDRESS + +/SUBROUTINE TO MAP THE PIECES IF NECCESARY(IF DOMAP=-1). +/MAP IS IN TWO PARTS, 1 FOR EACH COLOR +/WHITE MAP STARTS AT LOC 7400. BLACK MAP STARTS AT LOC 7424. +/MAP FORMAT-- 1 WORD PER PIECE, REPRESENTING THE ADDRESS OF THAT PIECE +MAPEC, 0000 + CLA CMA + TAD [BOARD /SETUP BOARD ADDRESS + DCA ITMP2 + TAD DOMAP + SNA CLA /IS A MAP REALY NECCESARY? + JMP I MAPEC /NO. RETURN + DCA DOMAP + TAD (MAP-1 /YES. SETUP MAP OF WHITES PIECE ADDRESSES + DCA ITMP0 + TAD (MAP+23 /SETUP MAP OF BLACK PIECE ADDRESSES + DCA ITMP1 + TAD (-100 /SETUP COUNT FOR 100(OCTAL) SQUARES ON THE BOARD + DCA TEMP4 + TAD I ITMP2 /GET VALUE OF THE PIECE ON THE SQUARE + SZA /IS SQUARE OCCUPIED? + JMP MAPOC /YES +MAPGO, ISZ TEMP4 /FINISHED BOARD YET? + JMP .-4 /NO. DO MORE SQUARES + DCA I ITMP0 /YES. PUT A 0000 AT THE END OF THE WHITE MAP + DCA I ITMP1 /ALSO AT THE END OF THE BLACK MAP + JMP I MAPEC /RETURN +MAPOC, SPA /IS IT WHITE OR BLACK? + JMP MAPOCB /ITS BLACK + TAD (-KING /ITS WHITE. IS IT A KING? + SZA CLA + JMP .+3 /NO + TAD ITMP2 /YES + DCA WKING /STORE ADDRESS OF THE WHITE KING + TAD ITMP2 + DCA I ITMP0 /PUT IT IN THE WHITE MAP WHATEVER IT IS + JMP MAPGO +MAPOCB, TAD (KING /IS IT THE BLACK KING? + SZA CLA + JMP .+3 /NO. PROCEDE NORMALY + TAD ITMP2 /YES, GET ITS ADDRESS + DCA BKING /STORE IT + TAD ITMP2 /GET THE ADDRESS + DCA I ITMP1 /EITHER WAY, PUT IT IN THE BLACK MAP + JMP MAPGO +PAGE + /SUBROUTINE TO CHECK FOR A 'DOUBLE PAWN MOVE', AND MODIFY THE +/MDW IF IT IS. ALSO TEST IF A LEGAL PAWN MOVE IS ALSO A PROMOTING MOVE +/APPROPRIATE ACTION IS TAKEN IF IT IS. IN ANY CASE THIS ROUTINE CALLS +/'GNSTR' TO STORE MSW & MDW IN PDL2 +PROMCK, 0000 + CLA + TAD GNMDW /GET THE MOVE DATA WORD + RTL /ROTATE AC BIT 1 INTO THE LINK + SZL CLA /DOES IT SAY 'DOUBLE PAWN MOVE'? + JMP PROM1 /YES. SET THE MDW TO SHOW IT + TAD GN3 /BUILD THE RANK OF THE PAWN, IF IT WERE TO BE + TAD PONDIR /MOVED ONE MORE TIME + SNO /IS IT STILL ON THE BOARD? + SKP CLA /NO: IT'S A PROMOTIMG MOVE + JMP PPLSTR /YES: IT'S NOT A PROMOTING MOVE + TAD GNMDW + TAD [0004 /SET 'PAWN PROMOTION BIT' (BIT 9) OF THE MDW + DCA GNMDW + JMS GNSTR /STORE PROMOTION TO KNIGHT MOVE IN PDL2 + ISZ GNMDW /CHANGE MDW TO INDICATE PROMOTION TO A BISHOP + JMS GNSTR /STORE MOVE IN PDL2 + ISZ GNMDW /CHANGE MDW TO INDICATE PROMOTION TO A ROOK + JMS GNSTR /STORE MOVE IN PDL2 + ISZ GNMDW /CHANGE THE MDW TO INDICATE PROMOTION TO A QUEEN +PPLSTR, JMS GNSTR /STORE MOVE IN PDL2 + JMP I PROMCK /RETURN +PROM1, CLL RTR /CLEAR LINK(BIT 1)AND REROTATE THE MDW BACK INTO POSITION + DCA GNMDW /RESTORE THE MDW + TAD GNMSW /NOW GET THE MSW + AND [0077 /EXTRACT 'TO SQUARE' INFO + RTL CLL /ROTATE THE INFO SO THAT IT FITS IN MDW BITS 3-8 + RAL + TAD GNMDW /ADD IT TO THE MDW + DCA GNMDW /THERES THE NEW MDW!!! + JMP PPLSTR /IF THE PAWN MOVE A DOUBLE MOVE, IT WASN'T QUEENING + +/SUBROUTINE TO CHECK FOR LEGAL PAWN CAPTURES +CAPTST, 0000 + JMS BLDTO /BUILD THE ADDRESS OF THE 'TO' SQUARE + TAD I TOADR /GET THE VALUE OF THE SQUARE + JMS CLRFIX + SMA CLA /IS IT AN ENEMY PIECE? + JMP I CAPTST /YES. CAN ONLY CAPTURE OPPOSING PIECES + JMS BLDMSW /NO. CAPTURE SEEMS LEGAL. BUILD AN MSW + CLA STL RAR /BUILD AN MDW WHICH INDICATES CASTLING + DCA GNMDW + TAD GNMSW /FINAL TEST FOR MOVE LEGALITY COMING UP + JMS I ZFNL /IS KING IN CHECK? + JMP I CAPTST /YES: MOVE ILLEGAL + JMS PROMCK /NO: CHECK FOR PROMOTION + JMP I CAPTST /RETURN + + PST, 0000 + TAD PONDIR + DCA GN3 + JMS BLDTO /BUILD THE 'TO' ADDR + TAD I TOADR /GET VALUE OF 'TO' SQUARE + SZA CLA /IS THE SQUARE OCCUPIED? + JMP I PST /YES, MOVE NO GOOD + JMS BLDMSW /NO. PACK IT INTO 12 BITS. + TAD GNMSW + JMS I ZFNL /IS KING IN CHECK? + SKP /YES: MOVE NO GOOD + JMS PROMCK /MOVE IS LEGAL. CHECK FOR PAWN PROMOTION + ISZ PST /INC RETURN ADDRESS IF "TO" SQUARE WAS NOT OCCUPIED + JMP I PST + +/TEST FOR LEGAL KNIGHT CAPTURE: +ISLNM, CLA CLL CMA + RAL /AC WILL=-2 + DCA TOOS + TAD M1 /COMPARE RANKS + CIA + TAD M3 + SMA + CIA + IAC + SNA + JMP .+5 + IAC + SZA CLA + JMP BATAK + ISZ TOOS + TAD M2 + CIA + TAD M4 + SMA + CIA + IAC + SNA + JMP .+5 + IAC + SZA CLA + JMP BATAK + ISZ TOOS + SKP + JMP BATAK + ISZ TOOS + JMP BATAK + JMP GATAK +TOOS, 0000 + +PDLIN, 0000 /INITIALIZE THE LIST + CLA + TAD (PDLS + DCA PDLADR /INITIALIZE LIST ADDRESS + JMP I PDLIN /RETURN + + IPDL01, 0000 /INITIALIZE PUSH DOWN LIST #1 + CLA + TAD (PDLS+777 + DCA PC01 + JMP I IPDL01 /RETURN + +/SUBROUTINE TO TEST FOR PUSH DOWN LIST OVERFLOW +OFLOW, 0000 + TAD PC01 /GET ADDR OF BOTTOM PDL#1 + CIA /COMPARE IT WITH + TAD PDLADR /THE ADDR OF BOTTOM PDL#2 + SZA CLA /ARE THEY THE SAME? + JMP I OFLOW /NO. RETURN. +/PUSH DOWN LIST HAS OVERFLOWED!!!!! + IFNZRO LPTREE< + TAD (OUT + DCA ZOUT /MAKE SURE OUTPUT GOES TO THE TTY +> + PRINTO; MESG26 /PRINT "I RESIGN" + JMS I ZCRLF + HLT +MESG26, TEXT \I RESIGN\ + +PAGE + +/CHECK FOR LEGAL KING MOVE +ISLKM, CLA + TAD M1 + CIA + TAD M3 + SMA + CIA + SZA + IAC + SZA CLA + JMP BATAK + TAD M2 + CIA + TAD M4 + SMA + CIA + SZA + IAC + SNA CLA + JMP GATAK + JMP BATAK + +/ROUTINE TO CHECK FOR PIECES IN THE MOVE ROW +ROW, 0000 + CLA + TAD M1 + CIA + TAD M3 + RAL CLL /GET THE SIGN + SZA CLA + TAD (10 + SZL + CIA + DCA TEMP3 + TAD M4 + CIA + TAD M2 + RAL CLL /GET THE SIGN + SZA CLA + IAC + SNL + CIA + TAD TEMP3 + DCA TMP + TAD TMATK /GET THE SQUARE OF THE ATTACKER + DCA TEMP3 /COPY IT SO WE DONT HAVE TO DESTROY THE ORIGINAL +MIDLIN, TAD TEMP3 /SET TO NEXT SQUARE + TAD TMP + DCA TEMP3 + TAD TEMP3 /COMPARE IT WITH THE ATTACKED SQUARE + CIA + TAD TEMP + SNA CLA /ARE THEY THE SAME? + JMP I ROW /YES RETURN + TAD I TEMP3 /NO. GET THE VALUE OF THE PIECE ON THE SQUARE + SNA CLA /IS THE SQUARE EMPTY? + JMP MIDLIN /YES- KEEP GOING UNTIL WE FIND ONE THAT ISN'T + ISZ ROW /NO. ITS NOT A LEGAL ATTACK--INC RETURN ADDRESS + JMP I ROW /RETURN + +/CHECK FOR LEGAL BISHOP MOVE +SUBR1, 0000 + CLA + TAD M1 + CIA + TAD M3 + SMA + CIA + DCA TEMP3 + TAD M2 + CIA + TAD M4 + SPA + CIA + TAD TEMP3 + SZA CLA /ARE BOTH SQUARES ON THE SAME DIAGONAL? + JMP I SUBR1 /NO + JMS ROW /YES. FIND OUT IF ANY PIECES ARE BLOCKING THAT DIAGONAL + ISZ SUBR1 /NONE FOUND -- INC RETURN ADDRESS + JMP I SUBR1 /RETURN + +/CHECK FOR LEGAL ROOK MOVE +SUBR2, 0000 + CLA + TAD M1 + CIA + TAD M3 + SNA CLA + JMP .+6 /SAME RANK. FORGET FILE + TAD M2 + CIA + TAD M4 + SZA CLA + JMP I SUBR2 /BOTH RANK AND FILE CHANGED?! + JMS ROW + ISZ SUBR2 /NO PIECES IN THE WAY-- INC RETURN ADDRESS + JMP I SUBR2 + +/CHECK FOR LEGAL QUEEN MOVE +/GO TO 'GATAK' IF IT IS +ISLQM, JMS SUBR2 /CHECK FOR A QUEEN MOVE 'ROOK STYLE' + SKP /NOT FOUND + JMP GATAK /FOUND + JMS SUBR1 /IF NOT CHECK FOR BISHOP STYLE QUEEN MOVE + JMP BATAK /NIETHER ONE + JMP GATAK /FOUND BISHOP STYLE QUEEN MOVE + +ISLBM, CLA + JMS SUBR1 + JMP BATAK + JMP GATAK + +ISLRM, CLA + JMS SUBR2 + JMP BATAK + JMP GATAK + +PAGE + + +/SUBROUTINE TO TEST IF A SQUARE IS ATTACKED BY A PIECE. +/ALSO FINDS OUT HOW MANY ATTACKERS, AND THE VALUE OF THE LEAST VALUABLE ATTACKER +/CALL WITH ADDRESS OF SQUARE TO BE TESTED IN LOCATION 'TEMP' +/ALSO PONDIR AND COLR SET IN REVERSE OF THE ATTACKERS +/AND THE ATTACKERS PIECE LIST ADDRESS-1 IN LOC 'OMAP' +/RETURNS WITH NUMBER OF ATTACKERS IN LOC. 'PCNT', THE ADDRESS +/OF THE LEATST VALUABLE ATTACKER IN LOC "PSQR" AND VALUE OF THE LEAST +/VALUABLE ATTACKER IN LOC. 'PVAL' +/IF THE VALUE OF THE LEAST VALUABLE ATTACKER, AND THE # OF ATTACKERS +/IS NOT IMPORTANT, CALL WITH AC NOT =0 +/RETURN IN THIS CASE IS DIRECTLY AFTER THE FIRST ATTACK IS FOUND +CHKATK, 0000 + DCA CKMODE /SET RETURN MODE SWITCH + CLA CMA + DCA TMATK /INITIALIZE SWITCH ENABLING 1 LOOPBACK IN THE PAWN SECTION + DCA PCNT /INITIALIZE PIECE COUNT + DCA PVAL /INITIALIZE PIECE VALUE TO 0 + DCA PSQR /INIT PIECE ADDRESS + TAD TEMP /GET SQUARE TO BE CHECKED + AND [0007 /EXTRACT THE FILE # + DCA M4 /RECORD IT + TAD TEMP /GET SQUARE ADDR AGAIN + RTR CLL /ROTATE RIGHT 3 BITS SO THAT THE RANK CAN + RAR /BE EXTRACTED IN A SIMILAR MANNER + AND [0007 + DCA M3 /STORE RANK # + TAD PONDIR /CHECK FOR AN ATTACK BY A PAWN + TAD M3 + SNO /IMPOSIBLE RANK? + JMP TAG1 /YES. FORGET PAWN ATTACKS + DCA M1 /NO. SAVE THE RANK + IAC CLA /NOW BUILD A FILE +TAG0, TAD M4 + SNO /IS THAT FILE REALY ON THE BOARD? + JMP TAG3 /NO. + RTR CLL /YES: PASTE TOGETHER THE ADDRESS OF THIS HYPOTHETICAL PAWN + RAR + TAD M1 + RTL + RAL + TAD [BOARD /ADD IN BOARD ADDRESS CONSTANT + DCA TEMP1 /VOLIA! STORE THE ADDRESS + TAD I TEMP1 /GET THE VALUE OF THE PIECE AT THAT ADDR + JMS CLRFIX + TAD (PAWN + SZA CLA /PER CHANCE A PAWN? + JMP TAG3 /NO: TRY NEXT PIECE +TAG2, ISZ PCNT /YES. ITS A PAWN ATTACK. INC PIECE COUNT + TAD I TEMP1 /SET LOWEST VALUED ATTACKING PIECE VALUE = PAWN + DCA PVAL + TAD TEMP1 /ALSO SET THE ADDRESS OF THE LOWEST ATTACKING PIECE + DCA PSQR /EQUAL TO THE ADDRESS OF THE PAWN + TAD CKMODE /TEST FOR 'FAST RETURN' MODE + SZA CLA + JMP I CHKATK /RETURN NOW +TAG3, ISZ TMATK /TESTED FOR PAWNS ON BOTH ADJACENT FILES? + JMP TAG1 /YES + CMA CLA /NO. LOOP BACK FOR THE OTHER FILE + JMP TAG0 +TMATK, 0000 +CKMODE, 0000 +TMATK1, 0000 +TAG1, CLA + TAD OMAP /GET ADDRESS-1 OF THE ATTACKERS PIECE MAP + DCA TOMAK1 +BATAK, ISZ TOMAK1 /INC THE PIECE TABLE ADDRESS + TAD I TOMAK1 /GET THE ADDRESS OF THE PIECE + SNA /IS IT REALY A PIECE, OR IS THE SQUARE BLANK? + JMP I CHKATK /BLANK. TABLE EXAUSTED:RETURN + DCA TMATK /NO. SOMTHINGS THERE. STORE ITS ADDRESS + TAD TMATK /GET THE ATTACKERS SQR ADDR + CIA + TAD TEMP /COMPARE WITH THE ATTACKED SQUARS ADDRESS + SNA CLA /ARE THEY THE SAME? + JMP BATAK /YES.PIECES CANNOT ATTACK THEMSELVES + TAD I TMATK + JMS CLRFIX + TAD (PAWN + SNA CLA /IS IT A PAWN? + JMP BATAK /YES, DONE PAWNS ALLREADY, TRY NEXT PIECE + TAD TMATK /NO GET SQUARE ADDRESS + AND [0007 /EXTRACT THE FILE + DCA M2 /STORE IT + TAD TMATK /GET ADDRESS AGAIN + RTR /ROTATE RANK # INTO BITS 9-11 + RAR + AND [0007 /ISOLATE RANK INFO + DCA M1 /STORE IT + TAD I TMATK /GET THE VALUE OF THE PIECE AGAIN + JMS CLRFIX + TAD (ROOK /NOW IDENTIFY IT + SNA /IS IT A ROOK? + JMP ISLRM /YES + TAD (-ROOK+BISHOP + SNA /IS IT A BISHOP? + JMP ISLBM /YES + TAD (-BISHOP+KNIGHT + SNA /IS IT A KNIGHT? + JMP ISLNM /YES + TAD (-KNIGHT+KING + SNA /IS IT A KING? + JMP ISLKM /YES + TAD (-KING+QUEEN + SNA CLA /IS IT A QUEEN? + JMP ISLQM /YES + JMP BATAK /NO? WHATEVER WAS THERE MUST HAVE MOVED! PLEASE TO IGNORE. + + /WE REACH HERE IF AN ATTACK ON THE SQUARE IN QUESTION IS FOUND +GATAK, ISZ PCNT /INC ATTACK COUNTER + TAD CKMODE /TEST FOR FAST RETURN + SZA CLA /'FAST RETURN' MODE? + JMP I CHKATK /YES. RETURN NOW + CMA CLA + TAD PCNT + SNA CLA /IS THIS THE FIRST ATTACK FOUND? + JMP TAG4 /YES. DONT COMPARE + TAD I TMATK /NOW COMPARE THE VALUE OF THIS ATTACKING PIECE + CIA /WITH THE LOWEST VALUED ATTACKER FOUND SO FAR + TAD PVAL + JMS CLRFIX + SMA CLA /IS THE VALUE OF THIS PIECE LOWER? + JMP BATAK /NO +TAG4, TAD I TMATK /YES. REPLACE THE OLD VALUE WITH THIS ONE + DCA PVAL + TAD TMATK + DCA PSQR + JMP BATAK + +PAGE + +/TEST FOR KING IN CHECK BY MOVING A PIECE AND CALLING CHKATK +/CALL WITH MSW IN AC, AND THE KINGS ADDRESS IN "CKING" +/RETURN TO THE ADDRESS+1 OF THE CALLING JMS IF THE KING IS IN CHECK +/RETURN TO THE ADDRESS+2 OF THE CALLING JMS IF THE KING IS NOT IN CHECK +TSTCHK, 0000 + DCA MMUMTM /STORE THE MSW FOR THE MOMENT + TAD GNCHEK /GET # OF ATTACKS ON THE KING + SZA CLA /WAS THE KING IN CHECK? + JMP TSTCH1 /YES. DO A COMPLETE TEST FOR KING IN CHECK + TAD CTNEED + SPA /HAVE WE DETERMINED THAT A CHECK TEST IS NESCESARY? + JMP TSTCH1 /YES. DO ONE + SNA CLA /NO. HAVE WE DETERMINED THAT IT IS NOT? + JMP TSTCH2 /YES. DONT DO ONE THEN + DCA CTNEED /NO. DETERMINE THAT NOW + TAD CKING + DCA TEMP + TAD CNTR1 + DCA TMATK + TAD TEMP + RTR CLL + RAR + AND [0007 + DCA M3 + TAD TEMP + AND [0007 + DCA M4 + TAD CNTR1 + RTR CLL + RAR + AND [0007 + DCA M1 + TAD CNTR1 + AND [0007 + DCA M2 + JMS SUBR1 + SKP + JMP TSTCH1 + JMS SUBR2 + JMP TSTCH2 +TSTCH1, CLA CMA + DCA CTNEED /SET CHECK TEST NEED SWITCH + TAD MMUMTM /GET THE MSW BACK AGAIN + JMS MMOVE + TAD CKING /ADDRESS TO TEST FOR ATTACK + DCA TEMP + IAC /RETURN AFTER FIRST ATTACK IS FOUND + JMS CHKATK + JMS UMOVE /PUT THE PIECE BACK WHERE IT BELONGS + TAD PCNT /GET # OF ATTACKS + SNA /ANY? +TSTCH2, ISZ TSTCHK /NO. INC RETURN ADDRESS + SNA CLA /I'LL ASK AGAIN: WERE THERE ANY? + JMP I TSTCHK /NO. RETURN + TAD GNCHEK + SZA CLA /WAS IT A CHECK REPLY? + ISZ MOBMOD /TALLY ONE MORE ILLEGAL BY VIRTUE OF KING IN CHECK + JMP I TSTCHK + + /SUBROUTINE TO MAKE A SIMPLE TYPE MOVE +/CALL WITH MSW IN AC +MMOVE, 0000 + DCA MMUMT1 /STORE THE MSW + TAD MMUMT1 + JMS I ZSPLIT /SPLIT THE MSW UP INTO 'TO' AND 'FROM' SQUARE ADDRESSES + TAD I TEMP1 /GET VALUE OF CAPTURED PIECE + DCA MMUMTM /STORE IT + TAD I TEMP2 /MOVE THE PIECE + DCA I TEMP1 /ONTO ITS NEW SQR + DCA I TEMP2 /CLEAR OUT OLD SQR + JMP I MMOVE + +/SUBROUTINE TO UMMAKE SIMPLE TYPE MOVES +/AS MADE BY THE MMOVE SUBROUTINE +UMOVE, 0000 + CLA + TAD MMUMT1 /GET THE MSW + JMS I ZSPLIT /SPLIT IT UP INTO 'TO' AND 'FROM' SQUARE ADDRESSES + TAD I TEMP1 /GET VALUE OF THE PIECE BEING UNMOVED + DCA I TEMP2 /PUT IT BACK ON ITS ORIGINAL SQUARE + TAD MMUMTM + DCA I TEMP1 /RESTORE CAPTURED PIECE + JMP I UMOVE +MMUMTM, 0000 +MMUMT1, 0000 + +/SUBROUTINE TO GENERATE ALL MOVES FOR WHITE +GNWMV, 0000 + CMA CLA /SETUP FIRST RANK CONSTANT + DCA FSTRNK + JMS I ZMAPEC /MAP THE PIECES + TAD (NOP /SETUP COLOR COMPLIMENTOR + DCA COLR + IAC /SETUP PAWN DIRECTION CONSTANT + DCA PONDIR + TAD WKING /SAVE THE ADDRESS OF THE WHITE KING + DCA CKING + TAD (MAP-1 /SETUP ADDRESS OF WHITE PIECE MAP + DCA GMAP + TAD (MAP+23 /SETUP ADDRESS OF BLACK PIECE MAP + DCA OMAP + TAD (WPSW /SETUP CURRENT PSW ADDRESS + DCA CPSW + JMS I ZGNMV /GENERATE THE MOVES + JMP I GNWMV /RETURN + + +/SUBROUTINE TO GENERATE ALL MOVES FOR BLACK +GNBMV, 0000 + CMA CLA /SETUP THE PAWN DIRECTION CONSTANT + DCA PONDIR + JMS I ZMAPEC /MAP THE PIECES + TAD [CIA /SETUP COLOR COMPLIMENTOR + DCA COLR + TAD BKING /SAVE THE ADDRESS OF THE BLACK KING + DCA CKING + TAD (7772 /SETUP FIRST RANK CONSTANT + DCA FSTRNK + TAD (MAP+23 /SETUP ADDRESS OF BLACK PIECE MAP + DCA GMAP + TAD (MAP-1 /SETUP ADDRESS OF WHITE PIECE MAP + DCA OMAP + TAD (BPSW /SETUP POSITION STATUS WORD ADDRESS + DCA CPSW + JMS I ZGNMV /GENERATE THE MOVES + JMP I GNBMV /RETURN + +PAGE + +/SUBROUTINE TO TEST FOR WHITE ATTACKS +/CALL WITH ADDRESS OF THE SQUARE TO BE TESTED IN AC +TSTWAT, 0000 + DCA TEMP + TAD [CIA + DCA COLR + CLA CMA + DCA PONDIR + TAD (MAP-1 /ADDRESS-1 OF MAP OF ATTACKING PIECES + DCA OMAP + JMS CHKATK /DO THE TEST + JMP I TSTWAT /RETURN + +/SUBROUTINE TO TEST FOR BLACK ATTACKS ON ANY SQUARE +/CALL WITH THE ADDRESS OF THE SQUARE TO BE TESTED IN AC +TSTBAT, 0000 + DCA TEMP /STORE ADDRESS OF SQUARE TO BE TESTED + TAD (NOP + DCA COLR + CLA IAC + DCA PONDIR + TAD (MAP+23 /ADDRESS-1 OF THE BLACK PIECE MAP + DCA OMAP + JMS CHKATK /DO THE TEST + JMP I TSTBAT /RETURN + + + +/SUBROUTINE TO MAKE A MOVE. CALLED WITH MSW IN LOCATION 'TOMAK1' +/AND MDW IN LOCATION 'TOMAK2' +MKMV, 0000 + CLA CLL + ISZ DOMAP /SET SWITCH INDICATING THAT A PIECE MAP IS NESSECARY + IFNZRO DEBUG< + JMS TSTBRD /TEST BOARD +> + TAD TOMAK1 + PUSH1 /SAVE THE MSW + TAD TOMAK1 /GET THE MSW + JMS I ZSPLIT /SPLIT THE MSW UP INTO A 'TO' AND A 'FROM' ADDRESSES + TAD TOMAK2 /MDW TO AC + SMA CLA /IS THE MOVE A CAPTURE? + JMP MKMV1 /NO. + TAD I TEMP1 /YES. SAVE ITS VALUE IN + PUSH1 /THE PUSH DOWN LIST + TAD I TEMP1 /GET VAL OF CAPTURED PIECE + CIA /SUBTRACT IT FROM THE + TAD PW /TOTAL VALUE OF THE BOARD + DCA PW +MKMV1, TAD I TEMP2 /NOW PHYSICALY MOVE THE PIECE + DCA I TEMP1 /ONTO ITS NEW SQUARE + DCA I TEMP2 /REMOVE THE PIECE FROM ITS OLD SQUARE + TAD WPSW /SAVE WHITES POSITION STATUS WORD + PUSH1 + TAD BPSW /SAVE BLACKS POSITION STATUS WORD + PUSH1 + TAD LSTMV + PUSH1 /SAVE THE 'LSTMV' INFORMATION + TAD TOMAK2 /INSTALL NEW INFORMATION ON THE LAST(THIS) MOVE MADE + DCA LSTMV + TAD TOMAK2 + AND [0007 + SNA /IS THIS ONE OF THE SPECIAL TYPES OF MOVES? + JMP MKMVDN /NO. ALL DONE SO RETURN + TAD (JMP .+2 /YES. BUILD A 'JMP' TO THE PROPER SPECIAL CASE HANDLER + DCA .+1 + HLT /PUT THE JUMP HERE +/A JMP TO ONE OF THE FOLLOWING 7 INSTRUCTIONS WAS EXECUTED +/BY THE PREVIOUS INSTRUCTION + JMP MKQSC /MAKE A QUEEN SIDE CASTLING MOVE + JMP MKKSC /MAKE A KING SIDE CASTLING MOVE + JMP MKEP /EN PASANT + TAD (KNIGHT-BISHOP /PROMOTING TO A KNIGHT + TAD (BISHOP-ROOK /PROMOTING TO A BISHOP + TAD (ROOK-QUEEN /PROMOTING TO A ROOK + TAD (QUEEN /PROMOTE TO A QUEEN + DCA TEMP3 /STORE ABS VALUE OF THE PROM PIECE + TAD I TEMP1 /GET THE VALUE OF THE PROMOTEING PAWN + CIA /SUBTRACT IT FROM THE + TAD PW /TOTAL VALUE OF THE BOARD + DCA PW + TAD I TEMP1 /GET THE VAL OF THE MOVING PAWN + RAL /LOAD THE SIGN INTO THE LINK + CLA + TAD TEMP3 /GET ABS VALUE OF PROM PIECE + SZL /WAS THE PROMOTING PAWN BLACK? + CIA /YES. MAKE THE PROMOTION PIECE BLACK ALSO + DCA I TEMP1 /PLACE THE NEW PIECE ON THE BOARD + TAD I TEMP1 /ADD THE VALUE OF THE NEW PIECE + TAD PW /IN WITH THE TOTAL VALUE + DCA PW + JMP MKMVDN + +MKQSC, TAD TEMP1 /IT'S QUEENS SIDE CASTLING + AND [7770 + DCA TEMP2 /STORE THE ADDR OF QUEENS ROOK BEFORE CASTLING + TAD TEMP2 + TAD (3 + DCA TEMP1 /STORE ADDRESS OF ROOKS NEW SQUARE +MKCA1, TAD I TEMP2 /LOAD AC WITH VALUE OF THE ROOK + DCA I TEMP1 /PUT THE ROOK DOWN ON ITS NEW SQR + DCA I TEMP2 /REMOVE THE ROOK FROM ITS OLD SQR + TAD I TEMP1 /GET COLOR OF CASTLING SIDE + SPA /IS IT BLACK? + ISZ BPSW /YES. SET BIT 11 OF HIS PSW + SMA CLA /OR IS IT WHITE? + ISZ WPSW /YES. SET BIT 11 OF HIS PSW + JMP MKMVDN + +MKKSC, TAD TEMP1 /BUILD ADDRESS OF THE + IAC /KINGS ROOK + DCA TEMP2 /STORE THE ADDR OF KINGS ROOK BEFORE CASTLING + TAD (-5 /BUILD THE ADDRESS OF THE ROOKS + JMP MKCA1-3 /NEW SQUARE + +MKEP, TAD TEMP2 /IT'S AN 'EN PASSANT' CAPTURE + AND [7770 /BUILD ADDRESS OF THE PAWN THAT WAS TAKEN + DCA TEMP3 + TAD TEMP1 + AND [0007 + TAD TEMP3 + DCA TEMP3 + TAD I TEMP3 /SUBTRACT THE PAWNS VALUE + CIA /FROM THE TOTAL + TAD PW + DCA PW + DCA I TEMP3 /REMOVE CAPTURED PAWN FROM THE BOARD +MKMVDN, IFNZRO DEBUG < + JMS TSTBRD /TEST BOARD VALUE +> + TAD WHOSE /NOW THAT THE MOVE IS MADE + CMA /COMPLIMENT + DCA WHOSE /THE "WHOSE MOVE" SWITCH + JMP I MKMV /AND RETURN + +PAGE + + +/SUBROUTINE TO UNMAKE A MOVE MADE BY THE 'MKMV' ROUTINE +/LIKE THE 'MKMV' SUBROUTINE 'UNMV' IS COLOR INDEPENDENT- USES NO 'CLRFIX' +UNMV, 0000 + CLA CLL + ISZ DOMAP /SET SWITCH FOR OBSOLETE PIECE MAP + IFNZRO DEBUG< + JMS TSTBRD /MAKE SURE BOARD VALUE IS OK +> + TAD LSTMV /GET THE MDW FOR THE LAST(THIS) MOVE MADE + DCA TOMAK2 + POP1 /GET THE OLD 'LSTMV' INFO + DCA LSTMV /RESTORE IT + POP1 /RESTORE BLACKS PSW + DCA BPSW + POP1 /RESTORE WHITES PSW + DCA WPSW + TAD TOMAK2 /GET THE MDW FOR THE MOVE + SPA CLA /IS IT A CAPTURE? + POP1 /YES. GET THE VALUE OF THE CAPTURED PIECE + DCA TEMP3 /STORE IT + POP1 /GET THE OLD MSW + DCA TOMAK1 /STORE THE MSW + TAD TOMAK1 /BACK AGAIN + JMS I ZSPLIT /UNPACK THE MSW AND BUILD THE 'TO' AND 'FROM' ADDRESSES + TAD I TEMP1 /GET THE MOVED PIECE AND + IFNZRO DEBUG< + SNA /IS IT STILL THERE? + HLT /BUG!!! +> + DCA I TEMP2 /PUT IT BACK ON ITS OLD SQUARE + TAD TEMP3 + DCA I TEMP1 /RESTORE THE VALUE OF THE CAPTURED PIECE(OR EMPTY SQUARE) + TAD TEMP3 /ADD VAL OF CAPTURED PIECE + TAD PW /BACK IN WITH THE TOTAL + DCA PW + TAD TOMAK2 + AND [0007 + SNA /WAS THE MOVE A SPECIAL TYPE? + JMP UNMVDN /NO. RETURN + TAD (JMP .+2 + DCA .+1 + HLT /THE JUMP GOES HERE +/A JUMP TO ONE OF THE FOLLOWING 7 LOCATIONS WAS +/EXECUTED BY THE PREVIOUS INSTRUCTION + JMP UNQSC /UNMAKE A QUEEN SIDE CASTLING MOVE + JMP UNKSC /UNMAKE KING SIDE CASTLING MOVE + JMP UNEP /UNMAKE AN EN PASSANT CAPTURE + JMP UNQP + JMP UNQP + JMP UNQP +UNQP, TAD I TEMP2 /PAWN PROM. MOVE + CIA /SUBTRACT PROMOTION VALUE + TAD PW /FROM THE TOTAL + DCA PW + TAD I TEMP2 /GET VALUE OF THE PROMOTION PIECE + SMA CLA /WHICH COLOR IS MOVING? + TAD (PAWN+PAWN /WHITE IS MOVING. + TAD [-PAWN + DCA I TEMP2 /RESTORE THE PROMOTION PIECE BACK TO A PAWN + TAD I TEMP2 /ADD THE VAL OF THE PAWN + TAD PW /IN WITH THE TOTAL VALUE + DCA PW + JMP UNMVDN + +UNKSC, TAD TEMP2 /BUILD ADDR OF ROOKS 'POST CASTLING' SQUARE + IAC /BY ADDING +1 TO THE KINGS 'PRE CASTLING' SQUARE ADDRESS + DCA TEMP2 /STORE IT +UNKS1, TAD TEMP2 /BUILD ADDRESS OF THE ROOKS 'PRE CASTLING' SQUARE ADDR + TAD (2 /BY ADDING +2 TO ITS 'POST-CASTLING' SQUARE ADDR + DCA TEMP1 /STORE ROOKS PRE CASTLING SQUARE ADDRESS + TAD I TEMP2 /GET THE ROOKS VALUE + DCA I TEMP1 /PLACE THE ROOK BACK ON ITS 'PRE CASTLING' SQUARE + DCA I TEMP2 /REMOVE IT FROM ITS 'POST CASTLING SQUARE' + JMP UNMVDN + +UNQSC, TAD TEMP1 /BUILD THE ADDR OF THE ROOKS 'POST CASTLING SQUARE + IAC /BY ADDING +1 TO THE KINGS 'POST CASTLING' SQUARE ADDRESS + DCA TEMP2 /STORE IT + TAD (-5 /BUILD THE ADDRESS OF THE ROOKS 'PRE CASTLING SQUARE' + JMP UNKS1 /SAME AS KING SIDE EXCEPT OVER 5 FILES +UNEP, TAD TEMP1 /BUILD THE ADDRESS OF THE CAPTURED PAWN + AND [0007 /TAKE THE FILE OF THE 'TO SQUARE' + DCA TEMP3 /STORE THE TO SQUARE' FILE # + TAD TEMP2 /AND EVERYTHING BUT THE FILE # + AND [7770 /FROM THE FROM SQUARE ADDRESS + TAD TEMP3 /ADD THEN TOGEATHER + DCA TEMP3 /STORE + TAD I TEMP2 /GET THE VALUE OF THE CAAPTURING PAWN + CIA /MAKE THE VALUE THAT OF AN OPOSITE COLORED PAWN + DCA I TEMP3 /REPLACE THE PAWN THAT WAS TAKEN 'EN PASSANT' + TAD I TEMP3 /ADD PAWNS VALUE + TAD PW /IN WITH THE TOTAL + DCA PW +UNMVDN, IFNZRO DEBUG < + JMS TSTBRD /VERIFY BOARD VALUE +> + TAD WHOSE /NOW THAT THE MOVE IS UNMADE + CMA /COMPLIMENT + DCA WHOSE /THE "WHOSE MOVE" SWITCH + JMP I UNMV /RETURN + + /SUBROUTINE TO SPLIT A MSW UP LEAVING THE ADDRESS +/OF THE 'TO' SQUARE IN LOC 'TEMP1' AND THE ADDRESS OF THE 'FROM' +/SQUARE IN LOC. 'TEMP2'. CALL WITH MSW IN AC +SPLIT, 0000 + DCA TEMP1 + TAD TEMP1 /FIRST BUILD THE 'FROM' SQUARE ADDRESS + RTR CLL + RTR + RTR + AND [0077 /MASK OUT THE GARBAGE IN BITS 0-5 + TAD [BOARD /ADD IN BOARD ADDRESS CONSTANT + DCA TEMP2 /STORE 'FROM' SQUARE ADDRESS + TAD TEMP1 /NOW FOR THE 'TO' SQUARE. + AND [0077 /MASK OUT BITS 0-5 + TAD [BOARD /ADD IN BOARD ADDRESS CONSTANT + DCA TEMP1 /STORE THE ADDRESS OF THE 'TO' SQUARE + JMP I SPLIT /RETURN + +/SUBROUTINE TO RETURN THE PLY#-1 IN THE AC. +/IF THE PLY # IS 8 OR GREATER, 7 IS RETURNED, AND THE LINK IS SET +/IF PLY # <8 THE LINK IS RETURNED CLEAR +PLYCHP, 0000 + CLA STL + TAD PLY /GET PLY # + TAD [7770 /SUBTRACT 8 + SMA /IS PLY # 8 OR GREATER ? + CLA /YES. PRETEND IT WAS 8 + TAD [0007 /RESTORE AC VALUE TO PLY#-1 + JMP I PLYCHP /RETURN + + IFNZRO DEBUG < +/SUBROUTINE TO GET AN OLD BOARD VALUE FROM PDL#1 AND COMPARE IT WITH THE CURRENT +/BOARD VALUE. TO VERIFY THE "MKMV" AND "UNMV" SUBROUTINES +TSTBRD, 0000 + CLA + TAD PW + DCA TEMP1 + JMS BRDVAL /GET CURRENT BOARD VALUE + CIA + TAD TEMP1 + SZA CLA /ARE THEY THE SAME? + HLT /NO. ERROR SOMEWHERE + JMP I TSTBRD /ALL IS WELL +> +PAGE + + +/SUBROUTINE TO COMPARE THE AC WITH LOCATION 'COMP' +/RETURN NORMALY IF THEY ARE EQUAL +/RETURN TO THE ADDRESS+2 OF THE JMS IF THE AC IS LARGER +/RETURN TO THE ADDRESS+3 OF THE JMS IF 'COMP' IS LARGER +COMPAR, 0000 + CIA + DCA COMPAC /STORE THE COMPLIMENT OF THE AC + TAD COMPAC /COMPARE THE AC WITH 'COMP' + TAD COMP + SNA CLA /ARE THEY EQUAL? + JMP I COMPAR /YES. RETURN NORMALY + TAD COMPAC /NO. GET COMPLIMENT OF THE AC AGAIN + SPA SNA CLA /WAS THE AC POSITIVE? + JMP XXAP /YES. AC WAS POSITIVE + TAD COMP /NEGATIVE + SMA /IS 'COMP' POSITIVE? + JMP XXCL /YES. 'COMP' IS LARGER ALSO + TAD COMPAC /NO. BOTH ARE NEGATIVE + SPA CLA /BUT WHICH IS THE LARGER? + JMP XXAL /THE AC IS THE LARGER + JMP XXCL /'COMP' IS THE LARGER +XXAP, TAD COMP /THE AC WAS POSITIVE + SPA /TEST 'COMP' FOR ITS SIGN + JMP XXAL /'COMP' IS NEGATIVE, AND THEREFORE LARGER + TAD COMPAC + SMA CLA +XXCL, ISZ COMPAR /'COMP' IS LARGER +XXAL, ISZ COMPAR /AC IS LARGER + CLA + JMP I COMPAR /RETURN +COMPAC, 0000 + +/SUBROUTINE TO TALLY UP THE VALUES OF ALL PIECES ON THE BOARD +/STORE THE RESULT IN LOC "PW", AND IN THE AC ON RETURN +BRDVAL, 0000 + CLA + TAD (-100 /INITIALIZE FOR 64 SQUARES + DCA TEMP + TAD (BOARD-1/ADDRESS-1 OF BOARD + DCA ITMP1 /TO AUTO INDEX REG + TAD I ITMP1 + ISZ TEMP /DONE ALL SQUARES? + JMP .-2 /NO DO ANNOTHER + DCA PW /YES. STORE BOARD VALUE + TAD PW /ALSO LOAD INTO AC + JMP I BRDVAL /RETURN + +PRNCNT, 0000 + + EVAL, 0000 + CLA + IFNZRO RANVAL< + TAD I RANDOM /INTRODUCE A RANDOM VARIATION INTO THIS EVALUATION + AND (0001 /LET IT BE NO GREATER THAN +1 +> + DCA STRATG + JMS BREV /DO A BACK RANK EVALUATION + JMS COEV /DO A CENTER OCCUPATION EVALUATION + JMS CASTEV /EVALUATE CASTLING STATUS + TAD PW /ADD THE VALUE OF ALL PIECES ON THE BOARD + TAD STRATG /ADD IN STRATEGICAL VALUE + JMS LCLRFX /DO A COLOR FIX + DCA STRATG /STORE + JMS MOBGET /GET MOBILITY VALUE + TAD STRATG /ADD IT IN WITH THE TOTAL + DCA STRATG /STORE +/UPCOMING IS A MINI ALPHA BETA PRUNER +/SINCE THE "HIEP" PART OF THE EVALUATION IS TIME CONSUMING +/AND IT ONLY SERVES TO MAKE THE EVALUATION RETURNED LESS +/FAVORABLE FOR THE SIDE TO THAT JUST MOVED, IT IS BOTH +/WISE AND PROFITABLE TO TRY SAVE TIME THIS WAY + TAD STRATG + JMS PLYFIX + DCA COMP /LOAD SOFTWARE COMPARE REGISTER + TAD UVAL1 + JMS PLYFIX + JMS COMPARE/COMPARE VALUES + JMP EVAL2 /THEY ARE EQUAL. PRUNE + JMP EVAL1 /"HIEP" EVALUATION IS NESSECARY + JMP EVAL2 /NO "HIEP" NESSECARY(GOOD) +EVAL1, JMS HIEP /GET THE CONTROVERSIAL VALUE + JMS LCLRFX + TAD STRATG + JMP I EVAL /RETURN + +EVAL2, IFNZRO LPTREE< + TAD ("_ /SIGNAL THAT A MINI-PRUNE WAS DONE + JMS I ZOUT +> + TAD STRATG /GET VALUE + JMP I EVAL /RETURN + + /SUBROUTINE TO GET THE MOBILITY VALUE FOR THIS POINT IN +/THE ANALYSIS +/RETURN WITH VALUE IN THE AC +MOBGET, 0000 + CLA + TAD MOB0 + SZA CLA /DO SE HAVE ANY RELIABLE INFORMATION AT HAND ALREADY? + JMP MOBGE1 /YES. USE IT + ISZ BOGUS /NO. GET SOME NOW + TAD GNCNT /SAVE COUNTERS WE ARE ABOUT TO MODIFY + PUSH1 + TAD MOBMOD + PUSH1 + JMS GNBMV /DO A PSEUDO MOVE GENERATION + TAD MOBMOD /GET MOBILITY VALUE FOR BLACK + DCA MOBGTM /SAVE FOR THE MOMENT + ISZ BOGUS + JMS GNWMV /DO ANOTHER PSUEDO MOVE GENERATION + TAD MOBGTM /SUBTRACT BLACKS MOBILITY VALUE + CIA + TAD MOBMOD /FROM WHITES + JMS LCLRFX + DCA MOBGTM /STORE VALUE FOR THE MOMENT + POP1 /RESTORE THE COUNTERS THAT WE DESTROYED + DCA MOBMOD + POP1 + DCA GNCNT + TAD MOBGTM /GET VALUE BACK AGAIN + JMP I MOBGET /RETURN +MOBGE1, TAD MOBMOD /GET MOBILITY VALUE FOR THIS LEVEL + SNA /IS THERE ONE FOR THIS LEVEL? + TAD MOB0 /NO. USE THE ONE FOR 2 PLYS BACK + CIA + TAD MOB1 + CIA + JMS PLYFIX + JMP I MOBGET /RETURN +MOBGTM, 0000 + +PAGE + /THIS IS THE RECURSIVE LOOKAHEAD SUBROUTINE +/SEARCHES THE GAME TREE "DEPTH" PLYS DEEP. LOACTION "PLY" +/HOLDS THE CURRENT RECURSION LEVEL, OR DEPTH LEVEL OF THE SEARCH +/AND MUST BE SET TO = 0, BEFORE THIS ROUTINE IS CALLED FOR THE FIRST TIME +/SETTING "CVAL1" TO -3777 BEFORE CALLING THIS ROUTINE FOR THE FIRST TIME +/IS ALSO NICE, TO PREVENT ALPHA-BETA PRUNING AT LEVEL #1 +/THIS ROUTINE ASSUMES THAT THE COMPUTER HAS WHITE, BUT THE "LCLRFX" SUBROUTINE +/ALLOWS THE COMPUTER TO PLAY BLACK, BY SETING LOCATION "LCLRFX"+1 TO EQUAL +/A CIA INSTRUCTION +LOOKA, 0000 + CLA CLL + TAD LOOKA /GET RETURN ADDRESS + PUSH1 /SAVE IT IN PDL#1 + ISZ PLY /INC PLY NUMBER + CMA CLA /-1 TO AC + TAD PLY + SZA CLA /IS THIS THE FIRST PLY? + JMP LOOKA1 /NO + TAD WHOSE /YES. SETUP "LCLRFX" + SMA CLA /WHICH COLOR ARE WE TO LOOK AHEAD ON BEHALF OF? + TAD (NOP-CIA/WHITE + TAD [CIA /BLACK + DCA LCLRFX+1 + DCA MOBMOD /INITIALIZE MOBILITY VALUES + DCA MOB0 + DCA MOB1 + DCA ENO /SET EVALUATION COUNTER TO 0 +LOOKA1, TAD UVAL1 /SAVE THE OLD "UPPER LEVEL VALUE" + PUSH1 /IN PDL#1 + TAD CVAL1 /THE OLD "CURRENT LEVEL VALUE" + DCA UVAL1 /BECOMES THE NEW "UPPER LEVEL VALUE" + TAD PLYFIX+1 /SAVE PLY COMPENSATOR VALUE + PUSH1 + TAD GNCNT /SAVE GENERATION COUNTER + PUSH1 /IN PDL#1 + TAD STRATG /SAVE STRATEGIC VALUE + PUSH1 + DCA GNCNT /CLEAR OUT GENERATION COUNTER, IN CASE NO MOVES ARE GENERATED + TAD MOB0 /SAVE MOBILITY OF THE LEVEL 2 ABOVE THIS ONE + PUSH1 + TAD MOB1 /BUMP ALL THE LEVELS BY 1 + DCA MOB0 + TAD MOBMOD + DCA MOB1 + DCA MOBMOD /!!!BUG OF AUG 13 FIXED!!!/ + IFNZRO DEBUG < + TAD PDLADR /PUSH A MARKER SO THAT PDL#2 CAN BE VERIFIED + PUSH1 + TAD PC01 /PUSH A MARKER SO THAT PDL#1 CAN BE + PUSH1 /VERIFIED TO BE IN LINE +> + TAD PLY /BUILD A NEW PLY COMPENSATOR. FIRST GET PLY # + RAR /EVEN/ODD BIT TO LINK + SZL CLA /IS PLY # EVEN ? + TAD (NOP-CIA/NO. BUILD A NOP INSTRUCTION + TAD [CIA + DCA PLYFIX+1 + TAD PLY /PLY # TO AC + CIA /COMPARE AGAINST + TAD DEPTH /THE MAXIMUM DEPTH + SPA CLA /DOES CURRENT PLY# EXCCEDE THE MAX DEPTH #? + JMP LEVAL /YES. DO A STATIC EVALUATION OF THE POSITION +LKFUR, TAD (-3777 /NO. BUILD A STARTING VALUE FOR THIS LEVEL + JMS PLYFIX + DCA CVAL1 /INITIALIZE VALUE FOR THIS LEVEL + JMS GNMVSM /GENERATE THE MOVES OF THE SIDE WHOSE MOVE IT IS + TAD CMSW /GIT CHECKMATE SWITCH + SZA CLA /IS SIDE TO MOVE IN CHECKMATE? + JMP LKCM /YES. DO SOMTHING + TAD SMSW /GET STALEMATE SWITCH + SZA CLA /IS THE SIDE TO MOVE IN STALEMATE? + JMP LKSM /YES. DO SOMTHING + JMS PRUNE /ONLY CONSIDER "GOOD" MOVES +PICK, POP2 /POP A MOVE OUT OF PDL2 + DCA TOMAK2 /STORE THE MDW + POP2 + SNA /IS IT A MOVE OR THE END OF THE LIST? + JMP LKAD /ITS THE END OF THE LIST. + DCA TOMAK1 /ITS A MOVE--STORE THE MSW +IFNZRO LPTREE < + TAD TOMAK1 + DCA IOMSW + TAD TOMAK2 + DCA IOMDW + JMS OUTMV /PRINT OUT THE MOVE + JMS SPACE /ALSO A SPACE SO THAT THE NEXT TAB STOP IS REACHED +> + JMS I ZMKMV /MAKE THE MOVE + JMS I ZLOOKA /PEER FURTHER INTO THE MURKY DEPTHS OF THE GAME TREE + IFNZRO LPTREE< + JMS I ZCRLF /PRINT A CARRIAGE RETURN +> + JMS I ZUNMV /UNMAKE THE MOVE + JMP COMPMV /GO DO A COMPARE + +/SUBROUTINE TO POP OUT A GROUP OF MOVES FROM PDP#2 +POPOUT, 0000 + CLA + POP2 /OUT MDW + POP2 /OUT MSW + SZA CLA /IS IT AN MSW OR IS IT THE END OF THE MOVES MARKER? + JMP .-3 /IST AN MSW. GO POP OUT ANOTHER MOVE + JMP I POPOUT /END. RETURN + +/SUBROUTINE TO GENERATE THE MOVES OF THE SIDE WHOSE TURN IT IS TO MOVE +/AS INDICATED BY THE "WHOSE" SWITCH +/RETURN WITH THE MOVES IN PDL#2, AND THE AC CLEARED +GNMVSM, 0000 + CLA + TAD WHOSE /GET "WHOSE MOVE" SWITCH + SMA CLA /IS IT WHITES MOVE? + JMS GNWMV /YES. GENERATE WHITES MOVES + TAD WHOSE + SPA CLA /OR IS IT BLACKS MOVE? + JMS GNBMV /YES. GENERATE BLACKS MOVES + JMP I GNMVSM /RETURN +PAGE + + COMPMV, CLA +IFNZRO LPTREE < + JMS TABPLY /TAB TO COLOMN "PLY" + TAD RVAL1 + JMS OCTOUT + TAD CVAL1 + JMS OCTOUT /PRINT THE VALUE TO BEAT +> + TAD RVAL1 /GET VALUE RETURNED + JMS PLYFIX /FIX W/RESPECT TO PLY NUMBER + DCA COMP /LOAD SOFTWARE COMPARE REGISTER WITH IT + TAD CVAL1 /GET CURRENT VALUE FOR THIS LEVEL + JMS PLYFIX /FIX W/RESPECT TO PLY # + JMS COMPAR /COMPARE IT WITH THE RETURNED VALUE NOW IN COMPARE REGISTER + JMP JMPICK /THEY ARE EQUAL: + JMP JMPICK /UNFAVORABLE COMPARE: GO ON TO NEXT MOVE +RPLACE, TAD RVAL1 /HAIL NEW "BEST MOVE VALUE" + DCA CVAL1 /STORE NEW "BEST MOVE VALUE" + IFNZRO LPTREE < + TAD ("* + JMS I ZOUT /THE RETURN MOVE WON INDICATION +> + JMS SETPNT + TAD TOMAK1 /MSW + DCA I XR0 /INTO "BEST MOVE" TABLE + TAD TOMAK2 /MDW + DCA I XR0 /INTO THE "BEST MOVE" TABLE + + /COMING UP IS THE "ALPHA BETA PRUNER" + /IT CHECKS IF THE NEW "BEST VALUE" FOR THIS LEVEL + /IS COMPETITIVE WITH THE "BEST VALUE" ON THE LEVEL ABOVE +ALPHAB, CLA + TAD CVAL1 /GET CURRENT LEVEL VALUE + JMS PLYFIX /COMPLIMENT IF THIS IS AN EVEN PLY + DCA COMP /LOAD COMPARE REGISTER WITH IT + TAD UVAL1 /GET THE VALUE OF THE LEVEL ABOVE + JMS PLYFIX + JMS COMPAR /COMPARE WITH THE CURRENT LEVEL VALUE IN THE COMPARE REGISTER + JMP ALPHAP /EQUAL MEANS PRUNE + JMP JMPICK /SORRY. THE VALUE WOULD STILL BE COMPETITIVE ON THE LEVEL ABOVE +ALPHAP, JMS POPOUT /REMOVE ALL OTHER MOVES ON THIS LEVEL + TAD PLY /FOR DEBUG + CLA CLL + IFNZRO LPTREE< + TAD ("! + JMS I ZOUT /PRINT INDICATION FOR PRUNE +> + JMP LKAD /YES. GO SET RETURN VALUE + +JMPICK, IFNZRO LPTREE < + JMS I ZCRLF /CARRIAGE RETURN + JMS TABPLY /TAD TO COLOMN # "PLY" +> + CLA + JMP PICK + +SAVBRD, ROOK + KNIGHT + BISHOP + QUEEN + KING + BISHOP + KNIGHT + ROOK + PAWN + PAWN + PAWN + PAWN + PAWN + PAWN + PAWN + PAWN +BESTBL, ZBLOCK 30 /TABLE TO HOLD THE LAST "BEST MOVE" ON ANY LEVEL + +/SUBROUTINE TO SET AUTO-INDEX REG "XRO0" TO POINT TO +/THE WORD BEFORE THE 2WORD ENTRY IN THE "BESTBL" COROSPONDING WITH THIS PLY +SETPNT, 0000 + CLA + TAD PLY /GET PLY # + CLL RAL /MULT TIMES 2 WORDS IN EACH ENTRY + TAD ADCON /ADD IN ADDRESS CONSTANT + DCA XR0 /STORE ADDR AS ADVERTISED + JMP I SETPNT /RETURN +ADCON, BESTBL-3 + -PAWN + -PAWN + -PAWN + -PAWN + -PAWN + -PAWN + -PAWN + -PAWN + -ROOK + -KNIGHT + -BISHOP + -QUEEN + -KING + -BISHOP + -KNIGHT + -ROOK + +PAGE + +LKAD, CLA /FINISHED GENERATING & EXPLORING MOVES ON THIS LEVEL + TAD CVAL1 /SET RETURN VALUE = THIS LEVELS VALUE + DCA RVAL1 + JMP DONE /PREPARE TO RETURN + +LKSM, CLA /ITS A STALEMATE! + IFNZRO LPTREE< + TAD ("= + JMS I ZOUT /PRINTOUT STALEMATE INDICATION +> + DCA RVAL1 /SET RETURN VALUE TO TOTALY EVEN GAME ( 0 ) + JMP LKXM /TAKE SAME RETURN PATH AS A CHECKMATE NOW + +/COME HERE TO RETURN FROM THE "LOOKA" SUBROUTINE +DONE, CLA CMA /-1 TO AC + TAD PLY /DECREMENT PLY # + DCA PLY + TAD UVAL1 /RESTORE VARIOUS DATA TO ITS STATE BEFORE CALLING + DCA CVAL1 + IFNZRO DEBUG < + POP1 /POP OUT PDL#1 VERIFIER WORD + CIA /SHOULD BE SAME ON EXIT AS WAS ON ENTRY + TAD PC01 + SZA /AFTER COMPLIMENTING, SHOULD BE 0. IS IT? + HLT /NO. SURE GLAD I PUT THIS TEST IN! + POP1 /DO THE SAME THING FOR PDL#2 + CIA + TAD PDLADR + SZA /IS PDL#2 IN LINE? + HLT /NO. AMOUNT OFF IS IN THE AC +> + TAD MOB1 + DCA MOBMOD /RESTORE MOBMOD COUNTER + TAD MOB0 + DCA MOB1 + POP1 + DCA MOB0 + POP1 + DCA STRATG /RESTORE STRATEGIC VALUE + POP1 + DCA GNCNT /RESTORE OLD MOVE GENERATION COUNTER + POP1 /POP OFF OLD PLY COMPENSATOR VALUE + DCA PLYFIX+1 /RESTORE IT + POP1 + DCA UVAL1 /RESTORE "UPPER LEVEL VALUE" + POP1 /POP OFF RETURN ADDRESS + DCA TEMP /RESTORE IT + JMP I TEMP /RETURN FROM "LOOKA" SUBROUTINE + + LKCM, CLA /ITS A CHECKMATE. + IFNZRO LPTREE< + TAD ("+ + JMS I ZOUT /PRINT CHECKMATE INDICATION +> + TAD PLY /SUBTRACT PLY # FROM + TAD (-3740 /VALUE FOR RETURN VALUE + JMS PLYFIX /RETURN VALUE IS POSITIVE IF THIS IS AN EVEN PLY + DCA RVAL1 +LKXM, POP2 /POP THE 2 MARKER WORDS OFF OF PDL2 + POP2 /THAT "GNMV" PUT THERE + JMP DONE /READY TO RETURN + +/COLOR FIXING SUBROUTINE EXCLUSIVLY FOR THE "LOOKA" SUBROUTINE. +/FIXES COLOR WITH RESPECT TO PLY EVEN/ODD +PLYFIX, 0000 + CIA /=NOP IF PLY IS ODD, OR TO = CIA IF PLY IS EVEN + JMP I PLYFIX /RETURN + +/GENERAL PURPOSE COLOR FIXING ROUTINE +/SET "LCLRFX"+1 ONLY ONCE A PROGRAM INITIALIZATION TIME. SET IT TO +/EQUAL A "NOP" INSTRUCTION IF THE COMPUTER HAS WHITE, SET IT TO A +/"CIA" INSTRUSTION IF THE COMPUTER HAS BLACK +LCLRFX, 0000 + NOP /COMPUTER HAS: WHITE="NOP", BLACK="CIA" + JMP I LCLRFX /RETURN + + /STATIC EVALUATION ROUTINE +LEVAL, CLA CLL + JMS I ZMAPEC /MAP PIECES + TAD WHOSE /GET "WHOSE MOVE SWITCH" + SMA CLA /IS IT WHITES OR BLACKS? + JMP .+4 /WHITES + TAD BKING /BLACKS. GET BLACKS KING ADDRESS + JMS TSTWAT /FIND OUT IF IT IS ATTACKED + JMP .+3 + TAD WKING /GET WHITES KINGS ADDRESS + JMS TSTBAT /FIND OUT IF IT IS ATTACKED + TAD PCNT /GET # OF ATTACKERS + SZA CLA /IS THE KING IN CHECK? + JMP LKFUR /YES. LOOK AHEAD 1 MORE MOVE +IFNZRO LPTREE < + TAD ("# + JMS I ZOUT /PRINT EVALUATION INDICATOR + ISZ ENO /INC EVALUATION # + TAD ENO /FIND OUT IF IT IS OF SPECIAL INTREST + CIA /BY TESTING TO SE IF IT IS THE SAME + TAD ENOB /AS "ENOB" + SNA CLA /IS IT? + NOP /YES. A BREAKPOINT FOR ODT MAY BE PLACED HERE + TAD ENO /PRINT OUT THE EVALUATION # + JMS OCTNFM +> + JMS EVAL /GET AN EVALUATION + DCA RVAL1 /SETUP RETURN VALUE + JMP DONE /READY TO RETURN + + +/SUBROUTINE TO PRUNE UNDESIRABLE MOVES OUT OF THE TREE BEFORE THEY CREATE +/HUGE BRANCHES. WHAT TYPES OF MOVES ARE DESIRABLE AND UNDESIRABLE AT ANY GIVEN +/PLY, IS DETERMINED BY THE TABLE AT LOCATION "PRNPRO" +/THIS ROUTINE SHOULD SET "PRNCNT" TO THE NUMBER OF MOVES PRUNED +PRUNE, 0000 + CLA + DCA PRNCNT /INIT PRUNED MOVE COUNTER TO 0 + TAD GNCHEK /GET # OF CHECKS ON THE KING + SZA /IS THE KING IN CHECK? + JMP I PRUNE /NO. DONT PRUNE ANY MOVES + JMS PLYCHP /GET PLY # + TAD (JMP I .+3 /BUILD A JMP I TO THE PROPER PRUNE PROCEDURE + DCA .+1 /PUT THE JMP I DOWN SO THAT IT MAY BE EXECUTED + HLT /JMP GOES HERE + +PRNPRO, PPA /PRUNE PROCEDURE FOR PLY 1 + PPB /PRUNE PROCEDURE FOR PLY 2 + PPB /PRUNE PROCEDURE FOR PLY 3 + PPB /PRUNE PROCEDURE FOR PLY 4 + PPB /PRUNE PROCEDURE FOR PLY 5 + PPB /PRUNE PROCEDURE FOR PLY 6 + PPB /PRUNE PROCEDURE FOR PLY 7 + PPB /PRUNE PROCEDURE FOR PLY 8 OR GREATER + +PPA, JMS BSTOP /COUNT ON A "PRE-ANALYSIS" +PPZ, JMP I PRUNE /RETURN + +PPB, JMS HIEP /FIND OUT THE VALUE OF THE MOST FAVORABLE EN PRISE PIECE CAPTURE + SNA CLA /DOES A FAVORABLE ONE EXIST? + JMP .+4 /NO. COUNT ON THE ENTRY IN "BESTBL" + JMS SETPNT /YES. SETUP POINTER FOR THE INSERTION + TAD HIEPMS /OF THE EN PRISE PIECE CAPTURE MSW + DCA I XR0 /INTO THE "BESTBL" + JMS BSTOP /IF IT EXISTS, BSTOP WILL INSURE THAT IT IS LOOKED AT FIRST + JMP I PRUNE /RETURN +PAGE + /SUBROUTINE TO SCAN THROUGH THE LAST BUNCH OF MOVES IN PDL#2 +/IF A MOVE EXISTS, WHICH HAS THE SAME MSW AS THE LAST "BEST MOVE" +/ON THIS PLY, THAT MOVE IS SWAPED WITH THE MOVE ON THE TOP OF THE LIST +BSTOP, 0000 + JMS SETPNT + TAD I XR0 + CIA + DCA TEMP2 + TAD GNCNT + CIA + TAD PRNCNT + SNA /ANY MOVES TO RUMMAGE THRU? + JMP I BSTOP /NO. RETURN + DCA TEMP /SETUP COUNT + TAD TEMP + CLL RAL /MULT TIMES 2 WORDS PER MOVE + TAD PDLADR + DCA TEMP1 +BSTOP1, TAD I TEMP1 /GET AN MSW + IFNZRO DEBUG < + SNA /DOES IT LOOK LIKE AN MSW + HLT /NOT IF ITS 0 IT DOESNT +> + TAD TEMP2 + SNA CLA /IS IT A MATCH? + JMP BSTOP2 /YES!! GO SWAP IT WITH THE MOVE ON TOP + ISZ TEMP1 /BUMP POINTER BY 2 TO POINT TO THE NEXT MSW + ISZ TEMP1 + ISZ TEMP /COMPARED AGAINST ALL MOVES? + JMP BSTOP1 /NO. DO ANOTHER + JMP I BSTOP /YES. RETURN +BSTOP2, TAD PDLADR + TAD (-2 + DCA TEMP + TAD I TEMP + DCA I TEMP1 + TAD TEMP2 + CIA + DCA I TEMP + ISZ TEMP + ISZ TEMP1 + TAD I TEMP1 + DCA XR0 + TAD I TEMP + DCA I TEMP1 + TAD XR0 + DCA I TEMP + JMP I BSTOP + + + /SUBROUTINE TO EVALUATE THE BACK RANK +/TO FIND OUT WHAT'S NOT DEVELOPED, AND RETURN A VALUE FOR DEVELOPMENT +BREV, 0000 + CLA + TAD (NOP + DCA BREV2 /SETUP TO DO THE WHITE SIDE FIRST + JMS BREV1 /DO AN EVALUATION + CIA /NEGATE THE VALUE FOR WHITES SIDE + TAD STRATG + DCA STRATG + TAD [CIA + DCA BREV2 /SETUP TO DO THE BLACK SIDE + TAD (70 /RANK 8 + JMS BREV1 /DO THE BLACK EVALUATION + TAD STRATG + DCA STRATG + JMP I BREV /RETURN WITH IT + +BREV1, 0000 + TAD (BOARD-1/CONSTANT FOR BOARD ADDRESS + DCA ITMP0 + DCA TEMP2 /INIT MINOR PIECE COUNTER + TAD [7770 /COUNT FOR 10 SQUARES ON THE BACK RANK + DCA TEMP1 + TAD I ITMP0 /GET THE PIECES VALUE +BREV2, HLT /COMPLIMENT IT IF IT IS BLACK + TAD (-KNIGHT + SNA /IS IT A KNIGHT? + ISZ TEMP2 /YES. INC MINOR PIECE COUNTER + TAD (KNIGHT-BISHOP + SNA CLA /IS IT A BISHOP? + ISZ TEMP2 /YES. INC MINOR PIECE COUNTER + ISZ TEMP1 /DONE ALL 8 SQUARES YET? + JMP BREV2-1 /NO. GO BACK AND DO ANOTHER + TAD TEMP2 /ADD IN # OF MINOR PIECES + RAL CLL /MULT TIMES 2 + RAL CLL /MULT TIMES 2 AGAIN (2*2=4) + JMP I BREV1 /RETURN WITH RANK EVALUATION IN THE AC +/ +/CENTER OCCUPATION EVALUATOR +COEV, 0000 + CLA + TAD (-4 /SETUP COUNT FOR 4 CENTER SQUARES + DCA TEMP1 + TAD (TAD I COTB /SETUP TO ACCESS ADDRESSES OF THE 4 CENTER SQUARES + DCA COEV1 +COEV1, HLT /GET SQUARES VALUE + SNA /IS IT OCCUPIED + JMP COEV2 /NO. TEST TO SEE IF DONE + SMA CLA /IS IT A WHITE PIECE? + TAD (10 /VALUE WILL BE +4 + TAD (-4 /OR -4 IF IT IS BLACK + TAD STRATG /ADD TO THE CENTER OCCUPATION VALUE + DCA STRATG +COEV2, ISZ COEV1 /INC INSTRUCTION SO THAT IT REFFRENCES THE NEXT CENTER SQUARE + ISZ TEMP1 /DONE ALL 4 SQUARES YET? + JMP COEV1 /NO. DO ANOTHER + TAD TEMP /YES. GET FINAL VALUE + JMP I COEV /AND RETURN + +/ADDRESSES OF THE 4 CENTER SQUARES +COTB, BOARD+33 + BOARD+34 + BOARD+43 + BOARD+44 + +/CASTLING STATUS EVALUATOR +CASTEV, 0000 + CLA + TAD WPSW + RAR /MOVE "CASTLED BIT" INTO LINK + SZL CLA /HAS WHITE CASTLED? + TAD (10 /YES ADD TO STRATEGIC VALUE + TAD STRATG + DCA STRATG + TAD BPSW + RAR /MOVE "CASTLED BIT" TO THE LINK + SZL CLA /HAS BLACK CASTLED YET? + TAD [7770 /YES. SUBTRACT POINTS FROM THE STRATEGIC VALUE + TAD STRATG + DCA STRATG + JMP I CASTEV /RETURN + +PAGE + /SUBROUTINE TO TEST IF A PIECE IS EN PRISE +/CALL WITH THE ADDRESS OF THE SQUARE TO BE TESTED IN THE AC +/IF THE PIECE IS EN PRISE, RETURN WITH THE PREDICTED EXCHANGE +/LOSS IN THE AC, IF NOT 0 IS RETURNED +/THE ADDRESS OF THE SQUARE IS RETURNED IN "ENPRAD" +/RETURN WITH ADDR OF ATTACKER IN "ENPSQR" +/RETURN WITH ADDR OF THE LEAST VALUABLE DEFENDER IN "PSQR" +/RETURN WITH THE # OF ATTACKERS IN "ENPCNT" +/RETURN WITH THE # OF DEFENDERS IN "PCNT" +ENPRIS, 0000 + DCA ENPRAD /SAVE ADDR OF EN PRIS SQUARE + JMS I ZMAPEC /MAKE SURE PIECE MAP IS UP TO DATE + TAD I ENPRAD + SNA /IS THERE A PIECE ON IT? + JMP I ENPRIS /NO. IDIOT! CONSIDER YOURSELF SAVED + SMA CLA /YES. IS IT WHITE OR BLACK? + JMP ENPRWH /ITS WHITE + TAD ENPRAD /BLACK. FIND OUT ABOUT WHITES ATTACKS + JMS TSTWAT + TAD PVAL + DCA ENPVAL /SAVE VALUE OF SMALEST ATTACKER + TAD PCNT + SNA /ANY ATTACKERS? + JMP I ENPRIS /NO.RETURN + DCA ENPCNT /SAVE # OF ATTACKERS + TAD PSQR + DCA ENPSQR /SAVE ADDR OF LEAST VALUABLE ATTACKER + TAD ENPRAD /FIND OUT ABOUT DEFENDERS NOW + JMS TSTBAT + JMP ENPR0 /ALL DONE SETTING UP. GO TO THE BUISINESS PART +ENPRWH, TAD ENPRAD /FIND OUT ABOUT BLACK ATTACKS + JMS TSTBAT + TAD PVAL + CIA + DCA ENPVAL /SAVE VALUE OF LEAST VALUABLE ATTACKER + TAD PSQR + DCA ENPSQR /SAVE ADDR OF LEAST VALUABLE ATTACKER + TAD PCNT + SNA /ANY ATTACKERS? + JMP I ENPRIS /NO. RETURN + DCA ENPCNT /STORE # OF ATTACKERS + TAD ENPRAD /FIND OUT ABOUT WHITES DEFENCE + JMS TSTWAT + TAD PVAL + CIA /COMPLIMENT VALUE OF LEAST VALUABLE DEFENDER + DCA PVAL +ENPR0, TAD ENPCNT /GET # OF ATTACKERS + CIA + TAD PCNT /COMPARE WITH # OF DEFENDERS + SMA CLA /MORE ATTACKERS THAN DEFENDERS? + JMP ENPR1 /NO. + TAD PCNT /# OF DEFENDERS + CLL RAR + SZA CLA /MORE THAN 1 DEFENDER? + JMP ENPR1 /YES. TOO COMPLICATED TO PREDICT THE SWAP ALL THE WAY DOWN + SNL CLA /NO. ARE THERE ANY DEFENDERS AT ALL? + JMP ENPR2 /NO. ITS EN PRISE ALL RIGHT + TAD I ENPRAD /YES. ITS EXACTLY 1 DEFENDER + JMS CLRFIX + TAD PVAL /ADD VALUE OF DEFENDER PLUS OBJECT + TAD ENPVAL /COMPARE WITH THE ATTACKERS VALUE + SMA CLA /IS ATTACKER SMALLER THAN DEFENDER PLUS OBJECT? + JMP ENPR3 /NO. THE OBJECT IS NOT EN PRISE + TAD PVAL /-D + TAD ENPVAL /+A + SPA SNA CLA /IS DEFENDER SMALLER THAN ATTACKER? + JMP ENPR2 /NO. HE WONT CAPTURE BACK THEN + TAD PVAL /YES + TAD ENPVAL + JMS CLRFIX +ENPR2, TAD I ENPRAD + CIA + JMP I ENPRIS /RETURN +ENPR1, CLA + TAD I ENPRAD /COMPARE VALUE OF OBJECT + JMS CLRFIX + TAD ENPVAL /WITH THE VALUE OF THE ATTACKER + SMA /IS THE ATTACKERS VALUE SMALLER? +ENPR3, CLA /NO. PIECE IS NOT EN PRISE + CIA + JMS CLRFIX + JMP I ENPRIS /RETURN +ENPRAD, 0000 +ENPVAL, 0000 +ENPSQR, 0000 +ENPCNT, 0000 + IFNZRO DEBUG< +/TEST OF THE "ENPRIS" ROUTINE +TESTEP, JMS INPUT + JMS I ZMAPEC + TAD [BOARD + DCA TSTTMP + TAD (7700 + DCA TSTCNT +TEP2, TAD TSTTMP + JMS ENPRIS + SNA /IS IT EN PRIS? + JMP TEP1 /NO + JMS OCTOUT + JMS SPACE + TAD TSTTMP + JMS OUTSQR + JMS I ZCRLF +TEP1, ISZ TSTTMP + ISZ TSTCNT + JMP TEP2 + HLT + JMP TESTEP +TSTTMP, 0000 +TSTCNT, 0000 +> +PAGE + /SUBROUTINE TO RETURN THE EXCHANGE VALUE OF THE HIGHEST EN PRISE +/PIECE THAT CAN BE TAKEN BY THE SIDE TO MOVE +/ADDED IN WITH THE VALUE IS A 10 POINT "PENALTY" FOR EACH ADDITIONAL EN PRISE PIECE +/THAT CAN BE TAKEN +/THE VALUE IS RETURNED IN SUCH A WAY THAT IT CAN SIMPLY BE ADDED +/TO THE EVALUATION +/CALL WITH AC CLEAR TO USE NORMALY +/THIS ROUTINE CALCULATES WHOSE MOVE IT IS BY EXAMINING LOCATION "WHOSE" +HIEP, 0000 + CLA + TAD WHOSE + SPA CLA /IS IT WHITES MOVE OR BLACKS? + TAD (NOP-CIA /BLACKS - SET "HIEPX"=NOP + TAD [CIA /WHITES - SET "HIEPX"=CIA + DCA HIEPX /SEE + DCA HIEPVL /INIT VALUE TO 0 + DCA HIEPCN /INIT COUNT TO 0 + JMS I ZMAPEC /MAKE SURE THE PIECE MAP IS UP TO DATE + TAD (-12 + JMS HIEPFX + TAD (MAP+12 /BUILD THE ADDR OF THE PIECE MAP(WHICHEVER ONE IT IS) + DCA HMAPAD +HIEP1, CLA + TAD I HMAPAD /GET PIECE ADDR + ISZ HMAPAD /INC MAP ADDRESS POINTER + SNA /DONE ALL PIECES YET? + JMP HIEP2 /YES + DCA HIEPTM /STORE ADDR FOR THE MOMENT + TAD I HIEPTM /GET THE PIECES VALUE + JMS HIEPFX + TAD (-KING /COMPARE IT WITH THAT OF A KING + SNA CLA /IS IT A KING? + JMP HIEP1 /YES. KINGS CANT BE SWAPED ANYWAYS + TAD HIEPTM /NO. GET THE PIECES ADDR + JMS ENPRIS /FIND OUT IF IT IS ENPRIS + SNA /IS IT? + JMP HIEP1 /NO. TRY THE NEXT ONE + DCA HIEPTM /YES. SAVE THE EXCHANGE VALUE + ISZ HIEPCN /INC EN PRIS PIECE COUNTER + TAD HIEPVL /GET BEST VALUE SO FAR + CIA + TAD HIEPTM /COMPARE IT WITH THE ONE JUST AQUIRED + JMS HIEPFX + SMA CLA /IS THE ONE WE JUST GOT BIGGER? + JMP HIEP1 /NO. GO TRY ANOTHER PIECE + TAD HIEPTM /YES.MAKE THE ONE WE JUST GOT THE NEW VALUE TO BEAT + DCA HIEPVL + TAD ENPSQR /BUILD MSW FOR THE MOVE TO CAPTURE THIS EN PRISE PIECE + AND [0077 /"FROM SQUARE" IS THAT OF THE + RTL CLL /LEAST VALUABLE ATTACKER + RTL + RTL + DCA HIEPTM + TAD ENPRAD /"TO SQUARE" IS THAT OF THE PIECE ITSELF + AND [0077 + TAD HIEPTM /COMBINE "TO" AND "FROM" 6BIT ADDRESSES + DCA HIEPMS /INTO ONE CONVIENIENT MSW + JMP HIEP1 /GO TRY ANOTHER PIECE +HIEP2, CLA CMA + TAD HIEPCN /GET # OF EN PRISE PIECES + SPA /WERE THERE ANY? + CLA /NO + CLL RTL + RAL /MULT TIMES 8 AND INCLUDE IN THE VALUE RETURNED + CIA + JMS HIEPFX + TAD HIEPVL /GET THE EXCHANGE VALUE + JMP I HIEP /RETURN + +HIEPFX, 0000 +HIEPX, HLT /NOP,BLACKS MOVE/CIA,WHITES MOVE + JMP I HIEPFX + +HIEPVL, 0000 +HIEPTM, 0000 +HIEPCN, 0000 +HIEPMS, 0000 +HMAPAD, 0000 + + +/SUBROUTINE TO SETUP THE BOARD +SETBRD, 0000 + CLA CLL + TAD (-100 /IST PUT ALL OF THE PIECES ON THE BOARD + DCA TEMP /SETUP A COUNT FOR 64 SQUARES + TAD (BOARD-1 + DCA ITMP0 /BOARD ADDRESS TO AUTO INDEX REG + TAD (SAVBRD-1 + DCA ITMP1 /SAVED BOARD ADDRESS TO AUTO-INDEX REG + TAD I ITMP1 /MOVE FROM THE SAVED BOARD AREA + DCA I ITMP0 /TO THE WORKING AREA + ISZ TEMP /DONE 64 SQUARES YET? + JMP .-3 /NO. DO MORE + TAD (-40 /NOW CLEAR OUT THE MIDDLE + DCA TEMP + TAD (BOARD+17 + DCA ITMP1 + DCA I ITMP1 + ISZ TEMP /CLEARED OUT 32 SQUARES YET? + JMP .-2 /NO. DO 1 MORE + DCA LSTMV + DCA WPSW /ENABLE CASTLING BY WHITE + DCA BPSW /AND BY BLACK + DCA PW /INITIALIZE TOTAL PIECE VALUE + JMP I SETBRD /RETURN + +COMTM, IAC /TOURNAMENT MODE SETTING + IAC +COMBM, IAC /BLITZ MODE SETTING + DCA DEPTH /DEPTH=3 FOR TOURNAMENT MODE, DEPTH=1 FOR BLITZ MODE + JMP COMMAN + +PAGE + +/THIS IS THE INTERRUPT HANDLING ROUTINE +INTHAN, DCA ACHOLD /SAVE ACCUMULATOR + RAL /LINK TO AC11 + DCA LKHOLD /SAVE LINK + KSF /KEYBOARD INTERRUPT? + HLT /NO. UNEXPLANED INTERRUPT. PRESS START (CLEAR&CONT) TO CLEAR FLAGS + KRB /YES. GET THE CHAR + SNA /IS IT A NULL CHARACTER ? + JMP RTINT /YES. IGNOR IT TOTALY + AND (0177 /MAKE SURE BIT 4 IS SET IN + TAD (200 /CASE OF A PARITY TTY + DCA CHAR /NOW STORE THE CHAR. FOR EASY ACCESS + TAD ISW /GET INPUT IN PROGRESS SWITCH + SNA CLA /IS IT SET? + JMP RTINT /NO. RETURN AND FORGET THAT THIS HAPPENED + TAD CHAR /LOAD IT BACK INTO THE AC + JMS I ZOUT /ECCO IT + TAD CHAR /TEST IF IT IS TO BE IGNORED + TAD (-240 + SNA CLA /IS IT A SPACE ? + JMP RTINT /YES. IGNOR IT + ISZ CNTCHR /TOO MUCH INPUT? + SKP /NO + JMP UGO /YES. PRINT "^U", REINITIALIZE, AND TRY AGAIN + TAD CHAR /LOAD THE CHAR BACK INTO THE AC AGAIN + TAD (-215 /FIND OUT IF IT IS A SPECIAL CHARACTER (CR OR RUBOUT) + SNA /IS IT A CR? + JMP LINDUN /YES! HE'S DONE TYPING THE INPUT LINE + TAD (215-377 + SNA /IS IT A RUBOUT CHAR? + JMP RUBGO /YES. DELETE THE LAST CHAR TYPED + TAD (377-225 /NO + SNA CLA /IS IT A CONTROL-U? + JMP UGO /YES. DELETE A WHOLE LINE + TAD CHAR /NO. +IFNZRO OS8< + TAD (-203 + SNA CLA /IS CHAR A CONTROL-C ? + JMP MONITR /YES + TAD CHAR /NO. GET ITS VALUE BACK AGAIN +> + DCA I CLIST /STORE THE CHAR. IN THE KEYBOARD BUFFER +RTINT, TAD LKHOLD /RESTORE THE LINK TO ITS PRE-INTERRUPT STATE + CLL RAR + TAD ACHOLD /RESTORE ACCUMULATOR + RMF /AND THE MEMORY FIELDS + ION /WITH INTERRUPT ENABLED, + JMP I IFRM /RETURN TO MAIN PROGRAM +ACHOLD, 0000 /HOLD AC AFTER INTERRUPT +LKHOLD, 0000 /HOLD LINK AFTER INTERRUPT + +LINDUN, DCA I CLIST /MARK THE END OF INPUT WITH A 0000 CHAR. IN BUFFER + TAD (KBUF-1 /REINITIALIZE THE KEYBOARD BUFFER + DCA CLIST + DCA ISW /CLEAR THE INPUT SWITCH + JMS I ZCRLF /PRINT A CARRIAGE RETURN-LINE FEED + JMP RTINT /RETURN + +LNOGO, JMS I ZCRLF /PRINT A CARRIAGE RETURN LINE FEED + JMS I ZBEGIN /REINITIALIZE INPUT BUFFER + JMP RTINT /RETURN FROM THE LAST INTERRUPT + +/IO STALL SUBROUTINE: RETURN WHEN INPUT IS DONE +CHKIO, 0000 + CLA + TAD ISW /GET THE INPUT SWITCH + ISZ RANDOM /INCREMENT THE RANDOM NUMBER + SZA CLA /IS INPUT DONE? + JMP .-4 /NO: CHECK AGAIN + IOF /DONT NEED THIS ANYMORE + JMP I CHKIO /YES: RETURN + +RUBGO, CLA + TAD (KBUF-1 + CIA + TAD CLIST + SNA CLA /ARE WE AT THE BEGINING OF A LINE ALLREADY? + JMP LNOGO /YES. + TAD ("\ /NO. PRINT A "\" CHAR + JMS I ZOUT + CMA CLA /NOW MOVE BACK THE BUFFER POINTER + TAD CLIST + DCA CLIST + JMP RTINT /RETURN FROM INTERUPT + +UGO, CLA + PRINTO; MESG21 /PRINT A "^U" + JMP LNOGO /GO SETUP FOR A NEW LINE + + /FOLLOWING IS THE LEGAL COMMAND LIST +/IT CONSISTS OF A NUMBER OF 2WORD ENTRIES +/THE 1ST WORD IN EACH ENTRY IS THE 6BIT REPRESENTATION(NEGATED FOR EASY COMPARING) +/OF A 2 CHARACTER COMMAND +/THE 2ND WORD CONTAINS THE ADDRESS TO GO TO IF THAT COMMAND IS TYPED +COMLST, -2027; COMPW /PW - PLAY WHITE + -2002; COMPB /PB - PLAY BLACK + -2016; COMPN /PN - PLAY NIETHER WHITE OR BLACK + -0204; COMBD /BD - DISPLAY THE POSITION + -1120; COMIP /IP - INPUT A POSITION + -2205; START /RE - RESET (RESIGN) + -1526; CMOVE /MV - MOVE + -2313; COMSK /SK - SKIP A MOVE + -0215; COMBM /BM - BLITZ MODE + -2415; COMTM /TM - TOURNAMENT + IFNZRO LPTREE < + -1424; COMLT /LT - OUTPUT TREE TO LINE PRINTER(LP08) +> + -0000; 0000 /END OF COMMAND LIST + +MESG14, TEXT \STALEMATE\ +MESG24, TEXT \YOUR MOVE? \ + +PAGE + +/MESSAGE PRINTING SUBROUTINE--CALL WITH ADDR OF MESSAGE IN AC +/RETURN WITH THE AC CLEAR +/IF CALLED WITH THE AC IS CLEAR THE ADDRESS OF THE MESSAGE IS TAKEN FROM THE WORD +/AT THE ADDRESS+1 OF THE CALL TO THIS SUBROUTINE, AND THE RETURN ADDRESS +/IS THE ADDRESS+2 OF THE CALLING JMS +MES, 0000 + SZA /IS THE ADDRESS OF THE MESSAGE IN THE AC? + JMP .+3 /YES. DONT BOTHER GETTING IT FROM THE WORD FOLLOWING THE JMS + TAD I MES /NO. BOTHER PLEASE + ISZ MES /AND INC THE RETURN ADDRESS + DCA TEMP /STORE THE ADDRESS OF THE MASSAGE +MES2, TAD I TEMP /GRAB 2 CHARS. PACKED INTO 1 WORD + RTR + RTR + RTR + JMS TYPO /PRINT CHAR IN BITS 0-5 + TAD I TEMP + JMS TYPO /PRINT CHAR IN BITS 6-11 + ISZ TEMP /NEXT WORD PLEASE + JMP MES2 + +TYPO, 0000 + AND [0077 /CLEAROUT BITS BELONGING TO THE OTHER CHAR. + SNA /IS IT A NULL CHARACTER? + JMP I MES /YES: RETURN + TAD [-40 /NO. CONVERT IT TO 8 BIT + SPA + TAD (100 + TAD (240 + JMS I ZOUT /NOW PRINT IT + JMP I TYPO + +/PRINTOUT SUBROUTINE--SINGLE CHARACTER +OUT, 0000 + TLS /FIRST PRINT THE CHAR + TSF /WAIT FOR THE FLAG TO RETURN + JMP .-1 /NOT YET IT HASN'T + TCF /CLEAR FLAG TO AVOID TELLEPRINTER INTERUPTS + CLA + JMP I OUT /RETURN + +/CARRIAGE RETURN & LINE FEED SUBROUTINE +CRLF, 0000 + CLA + TAD (215 + JMS I ZOUT /PRINT THE CR + JMS I ZOUT /AND A NULL + TAD (212 + JMS I ZOUT /PRINT THE LF + JMS I ZOUT /PRINT A COUPLE OF NULL FILLER CHARS IN CASE SOMEONE + JMS I ZOUT /TRYS TO USE A FANCY VIDEO-SCREEN TERMINAL + JMP I CRLF /RETURN + +/INITIALIZE INPUT +BEGIN, 0000 + CLA IAC + DCA ISW /SET THE 'INPUT IN PROGRESS' SWITCH + TAD (KBUF-1 /INITIALIZE THE KEYBOARD BUFFER POINTER + DCA CLIST + TAD (-30 + DCA CNTCHR /30 CHARACTERS MAXIMUM + KCC /REINITIALZE THE KEYBOARD FLAG + JMP I BEGIN /RETURN + +/GET A CHARACTER FROM THE INPUT BUFFER +/IGNOR "-" AND ":" CHARACTERS +GETC, 0000 + CLA + TAD I CLIST /TAKE A CHAR. OUT OF THE BUFFER + DCA TEMP /MAKE IT EASILY REACHED + TAD TEMP /FIND OUT IF THE CHAR SHOULD BE IGNORED + TAD (-"- + SNA /IS IT A MINUS SIGN? + JMP GETC+1 /YES. IGNOR IT + TAD ("--": /NO. TEST FOR A COLON + SNA CLA /IS IT A COLON? + JMP GETC+1 /YES. IGNOR IT + TAD TEMP /NO. LOAD IT BACK INTO AC + JMP I GETC /RETURN + +/SUBROUTINE TO PRINT A "SIGNED OCTAL" NUMBER +OCTOUT, 0000 + DCA TEMP + JMS SPACE /PRINT A LEADING SPACE + TAD TEMP + SPA CLA /IS IT A NEGATIVE #? + TAD ("--" /YES PRINT A MINUS SIGN + TAD (" + JMS I ZOUT + TAD TEMP /GET # AGAIN + SPA /IS IT NEGATIVE? + CIA /YES. MAKE POSITIVE + JMS OCTNFM /PRINT IN OCTAL + JMP I OCTOUT /RETURN + +/SUBROUTINE TO PRINT OUT AN OCTAL NUMBER WITH NO FORMATING +OCTNFM, 0000 + RAL /ROTATE INTO POSITION + DCA TEMP + TAD (-4 + DCA TEMP1 /SETUP COUNT FOR 4 DIGITS +OCTMID, TAD TEMP + RAL + RTL + DCA TEMP + TAD TEMP + AND [0007 + TAD ("0 + JMS I ZOUT + ISZ TEMP1 + JMP OCTMID + JMP I OCTNFM /RETURN + +/SUBROUTINE TO PRINT A SPACE CHARACTER +SPACE, 0000 + CLA + TAD (240 /LOAD AC WITH SPACE CODE + JMS I ZOUT /SEND IT OUT + JMP I SPACE /RETURN + +IFNZRO OS8 < +/PRINT A "^C" AND RETURN TO THE OS8 MONITOR +MONITR, CLA + PRINTO; MESG18 /PRINT "^C" + CIF CDF 0 /MONITOR IS IN FIELD 0 + JMP I (7600 /GO TO MONITOR +> + +IFNZRO LPTREE < +/SUBROUTINE TO TAB OVER TO COLOMN # "PLY" +TABPLY, 0000 + CLA + TAD PLY /GET PLY # + SNA /IS IT ZERO? + IAC /YES. DO ONE TAB ANYWAYS + CIA + DCA CMBCNT /SETUP COLOMN COUNTER + PRINTO; MESG19 /PRINT 8 SPACES + ISZ CMBCNT /TABBED ENOUGH PLACES YET? + JMP .-3 /NO. TAB AGAIN + JMP I TABPLY /YES. RETURN +CMBCNT, 0000 +> +PAGE + +/SUBROUTINE TO TRY TO INTERPERT THE CONTENTS OF THE KEYBOARD +/BUFFER AS A MOVE TYPED IN USING MODIFIED +/ALGEBREIC NOTATION, TEST THE MOVES LEGALITY, AND MAKE THE +/MOVE ON THE BOARD +/IF INPUT IS NOT A LEGAL MOVE RETURN IS TO THE ADDRESS+1 +/OF THE CALLING JMS AND THE AC MAY NOT BE CLEARED +INMV, 0000 + CLA + DCA IOMSW /INITIALIZE MSW AND MDW + DCA IOMDW + JMS I ZGETC /GET A CHARACTER + JMS ISA2H /IS IT A LETTER "A" TO "H" ? + JMP INCA /NO. MOVE MUST BE CASTLING + TAD (-301 + RTL CLL + RTL + RTL + JMS INPAK /STORE THIS CHAR AND GET NEXT + JMS IS128 /IS IT A NUMBER "1" TO "8" ? + JMP I INMV /NO: BAD INPUT, TAKE ERROR RETURN + TAD (-261 + RTR CLL /ROTATE BITS 9-11 INTO THE 'FROM RANK' POSITION + RTR + JMS INPAK /PACK IT INTO MSW AND GET NEXT CHAR + JMS ISA2H /IS IT A LETTER "A" TO "H" ? + JMP I INMV /NO. TAKE ERROR RETURN + TAD (-301 + JMS INPAK + JMS IS128 /IS IT A NUMBER "1" TO "8" ? + JMP I INMV /NO. TAKE ERROR RETURN + TAD (-261 + RTL CLL /YES. ROTATE BITS 9-11 INTO THE 'TO RANK' POSITION + RAL + JMS INPAK + TAD (-"= + SZA CLA /IS IT AN EQUAL SIGN? + JMP INMID-1 /NO. INPUT FINISHED, CHECK FOR LEGALITY + NOP /YES. HE SAYS IT'S A PAWN PROMOTION + JMS I ZGETC /GET THE LETTER OF THE PROMOTION PIECE + TAD (-"Q + SNA /IS IT A QUEEN? + JMP IPPQ /YES + TAD ("Q-"R + SNA /IS IT A ROOK? + JMP IPPR /YES + TAD ("R-"B + SNA /IS IT A BISHOP? + JMP IPPB /YES + TAD ("B-"N + SNA /IS IT A KNIGHT? + JMP IPPN /YES + JMP I INMV /NO. NONE OF THE ABOVE. TAKE ERROR RETURN +IPPQ, IAC +IPPR, IAC +IPPB, IAC +IPPN, TAD (0004 + DCA IOMDW + JMP INMID-1 + +INCA, TAD (-"O + SZA CLA /COULD IT BE CASTLING? + JMP I INMV /NO TAKE ERROR RETURN + JMS I ZGETC /IT MUST BE CASTLING, GET NEXT CHAR + TAD (-"O + SZA CLA /IS IT AN "O" ? + JMP I INMV /NO. TAKE ERROR RETURN + TAD PONDIR /YES. THE MOVE IS CASTLING CALCULATE THE 8TH RANK + AND (7070 /AND USE IT TO HELP BUILD AN MSW + + TAD (0406 /KING ALWAYS STARTS FROM FILE 4 + DCA IOMSW + JMS I ZGETC /GET ANOTHER CHAR + TAD (-"O /ANOTHER "O" MEANS QUEEN SIDE CASTLING + SZA /IS IT QUEENS SIDE? + JMP INMID-1 /NO. INPUT DONE. CHECK FOR LEGALITY + TAD (-4 /YES. CHANGE 'TO FILE' TO C + TAD IOMSW + DCA IOMSW + JMS GNMVSM /GENERATE THE MOVES OF THE SIDE TO MOVE +INMID, POP2 /POP OFF AN MDW + DCA TOMAK2 /STORE IT + POP2 /POP OFF AN MSW + SNA /IS IT AN MSW OR THE END OF THE LIST? + JMP I INMV /END OF LIST AND MOVE NOT FOUND, TAKE ERROR RETURN + CIA + TAD IOMSW /COMPARE THE MSW WITH THE ONE HE INPUTED + SZA CLA /MATCH? + JMP INMID /NO: TRY NEXT + TAD IOMSW /YES + DCA TOMAK1 /STORE THE MSW + TAD IOMDW /GET THE INPUTED MDW + SNA CLA /IS IT = 0 ? + JMP INMID2 /YES. MOVE IS LEGAL + TAD TOMAK2 + AND [0007 /CLEAR IRRELEVENT BITS + CIA + TAD IOMDW + SZA CLA /DO THE IMPORTANT PARTS OF THE MDW'S MATCH? + JMP INMID /NO TRY NEXT MOVE FOR A MATCK +INMID2, JMS I ZMKMV /MAKE THE MOVE + IPDL1 /REINITIALIZE PUSH DOWN LIST #1 + JMS POPOUT /REINITIALIZE PDL2 + ISZ INMV /NORMAL RETURN IS TO THE ADDRESS+2 OF THE CALLING JMS + JMP I INMV /RETURN + + /SUBROUTINE USED BY INMV. ADDS NEW COMPONENT TO 'IOMSW' +/ALSO GETS NEXT CHAR FROM THE BUFFER, AND RETURN WITH ITS VALUE IN THE AC +INPAK, 0000 + TAD IOMSW + DCA IOMSW + JMS I ZGETC + JMP I INPAK + +MESG18, TEXT \^C\ +MESG15, TEXT \O-O-O\ +NAME, TEXT \CHEKMO-II\ + +PAGE + /SUBROUTINE TO OUTPUT A MOVE IN MODIFIED ALGEBREIC NOTATION +/CALL WITH MSW IN 'IOMSW', AND MDW IN 'IOMDW' +OUTMV, 0000 + CLA + TAD (" + DCA IOCH1 + TAD (" + DCA IOCH2 + TAD IOMDW + AND [0007 /BUILD A JUMP + TAD (JMP .+3 + DCA .+1 + HLT /A JUMP TO ONE OF THE NEXT 8 INSTRUCTIONS IS PLACED HERE + + JMP OUTSTD /STANDARD OUTPUT FOR NORMAL MOVES + JMP OUTQCA /QUEEN-SIDE CASTLING + JMP OUTKCA /KING-SIDE CASTLING + JMP OUTSTD /STANDARD OUTPUT FOR 'EN PASSANT' CAPTURES + TAD ("N-"B /PRIMOTE TO A KNIGHT + TAD ("B-"R /PROMOTE TO A BISHOP + TAD ("R-"Q /PROMOTE TO A ROOK + TAD ("Q /PROMOTE TO A QUEEN + DCA IOCH2 + TAD ("= /PRINT AN EQUAL SIGN BEFORE LETTER OF THE PROMOTION PIECE + DCA IOCH1 +OUTSTD, CLA /DO STANDARD OUTPUT + TAD IOMSW /GET THE MSW FOR THE MOVE TO BE OUTPUT + RTR /ROTATE THE 'FROM FILE' BITS INTO AC 9-11 + RTR + RTR + JMS OUTSQR /OUTPUT THE "FROM" SQUARE COORDINATES + TAD IOMDW /TEST TO SEE IF MOVE IS A CAPTURE + SPA CLA /IS IT? + TAD (":-"- /YES: OUTPUT A ":" INSTEAD OF A "-" + TAD ("- /LOAD AC WITH THE CODE FOR A DASH + JMS I ZOUT /OUTPUT IT + TAD IOMSW /GET MSW + JMS OUTSQR /OUTPUT THE "TO" SQUARE COORDINATES + TAD IOCH1 /THIS IS A SPACE UNLESS MOVE IS A PAWN PROMOTION + JMS I ZOUT + TAD IOCH2 /THIS IS A SPACE UNLESS MOVE IS A PAWN PROMOTION + JMS I ZOUT /PRINT THE LAST CHARACTER AND, + JMP I OUTMV /RETURN + + /SUBROUTINE TO OUTPUT THE COORDINATES OF A SQUARE +/CALL WITH SQUARE # IN AC BITS 6-11 +OUTSQR, 0000 + DCA IOTMP /SAVE SQR # + TAD IOTMP + AND [0007 /CLEAR BITS 0-8 + TAD (301 /OUTPUT FILE AS A CHARACTER "A" TO "H" + JMS I ZOUT + TAD IOTMP /GET MSW + RTR /MOVE RANK INTO BITS 9-11 + RAR + AND [0007 + TAD (261 /BUILD A CHARACTER "1" TO "8" + JMS I ZOUT /OUTPUT IT + JMP I OUTSQR /RETURN + +OUTKCA, IAC /PASS OVER THE FIRST "O-" OF THE QUEEN SIDE CASTLING MESSAGE +OUTQCA, TAD (MESG15 /GET ADDRESS OF THE QUEEN SIDE CASTLING MESSAGE + PRINTO /TYPE THE MESSAGE + JMP I OUTMV /RETURN +IOCH1, 0000 +IOCH2, 0000 +IOTMP, 0000 + +/SUBROUTINE TO CHECK FOR A CHARACTER FROM "1" TO "8". SKIP IF IT IS +/CALL W/CHARACTER IN AC, RETURN SAME WAY +IS128, 0000 + TAD (-"1 + SPA /GREATER OR EQUAL TO "1"? + JMP .+4 /NO. DON'T SKIP + TAD [7770 + SPA CLA /LESS THAN "8"? + ISZ IS128 /YES. INC RETURN ADDRESS + CLA + TAD TEMP /LOAD THE CHARACTER BACK INTO THE AC + JMP I IS128 /RETURN + + /SUBROUTINE TO CHECK FOR A CHARACTER FROM "A" TO "H" +/CALL W/CHARACTER IN AC, RETURN SAME +/SUBROUTINE EFFECTS A SKIP IF CHAR IS BETWEEN "A" AND "H" +ISA2H, 0000 + TAD (-"A + SPA /IS IT >= "A" ? + JMP .+4 /NO. DONT SKIP + TAD [7770 + SPA CLA /IS IT <= "H" ? + ISZ ISA2H /YES. INC RETURN ADDRESS + CLA + TAD TEMP /GET CHAR BACK + JMP I ISA2H /RETURN + +/SUBROUTINE TO TEST FOR CHECKMATE OR STALEMATE +QMATE, 0000 + JMS GNMVSM /GENERATE THE MOVES OF THE SIDE WHOSE MOVE IT IS + JMS POPOUT /DONT NEED THE MOVES JUST THE INFO ON THEM + TAD GNCNT /GET # OF MOVES GENERATED + SZA CLA /ANY? + JMP I QMATE /YES. RETURN + TAD CMSW /NO. GET CHECKMATE SWITCH + SNA CLA /IS IT SET? + TAD (-MESG9+MESG14 /NO. GET ADDR OF STALEMATE MESSAGE + TAD (MESG9 /ADD ADDR OF CHECKMATE MESAGE + PRINTO /PRINT THE MESSAGE OUT + JMS I ZCRLF + JMS DISPLA /PRINTOUT THE FINAL POSITION + JMP START /START A NEW GAME + + + IFNZRO LPTREE < +COMLT, TAD LTSW + CMA + DCA LTSW + JMP COMMAN +> +COMSK, TAD WHOSE /COMPLIMENT THE "WHOSE MOVE" SWITCH + CMA /SO THAT SOMEONE MISSES A MOVE + DCA WHOSE + DCA LSTMV /DISABLE EN PASSANT PAWN CAPTURES FOR THE NEXT MOVE + JMP COMMAN + +PAGE + MESG19, TEXT \ \ +MESG21, TEXT \^U\ + +IFNZRO LPTREE < +/SUBROUTINE TO OUTPUT A CHARACTER TO THE LINE PRINTER +/CALL WITH THE CHAR. IN THE AC, RETURN WITH THE AC CLEARED +LPTOUT, 0000 + SNA /TRYING TO PRINT A NULL CHAR ? + JMP I LPTOUT /YES. DONT BOTHER, JUST RETURN + DCA LPTMP /STORE THE CHAR JUST FOR A MOMENT + TAD LTSW /GET TREE PRINTOUT SWITCH + SNA CLA /IS IT SET? + JMP I LPTOUT /NO. DO NO OUTPUT TO THE LINE PRINTER + LAS /READ SWITCHES + SMA CLA /SWITCH 0 SET? + JMP I LPTOUT /NO. DO NOT OUTPUT TO LINE PRINTER + TAD LPTMP /YES. + PSKE /ERROR? + SKP /NO. CONTINUE + JMP .-2 /YES. WAIT FOR THE ERROR TO GO AWAY + PSKF /IS THE PRINTER READY TO ACCEPT THE CHAR? + JMP .-1 /NO. TEST AGAIN, AND AGAIN + PCLF PSTB /YES. PRINT IT + CLA /GET READY TO RETURN + PCIE /CLEAR LINE PRINTER INTERUPT FLAG + JMP I LPTOUT /RETURN +LPTMP, 0000 /TEMP STORAGE FOR LINE PRINTER ROUTINE +LTSW, 0000 /TREE PRINTOUT SWITCH +> + / CHESSBOARD PRINTER + +DISPLAY,0 + JMS I ZCRLF /PRINT A BLANK LINE + TAD (BOARD+70-1 + DCA RNKPTR /POINT TO TOP RANK + TAD [7770 + DCA RNKKNT /SET UP FOR 8 RANKS +RNKLUP, TAD RNKPTR + DCA XR0 /POINT TO BEFORE LEFTMOST SQUARE IN RANK + TAD [7770 + DCA FILKNT /SET UP FOR 8 SQUARES PER RANK + JMP RL1 +RL2, TAD (240 + JMS I ZOUT +RL1, DCA COLOR /SET COLOR TO ZERO + TAD I XR0 /GET PIECE + SNA /IS SQUARE OCCUPIED? + JMP EMPTY /NO + SPA /YES + ISZ COLOR /SET COLOR TO 1 IF BLACK PIECE + SPA + CIA /TAKE ABSOLUTE VALUE OF PIECE + TAD [-PAWN + SNA /IS IT A PAWN? + JMP DP /YES + TAD (PAWN-KNIGHT/NO + SNA /IS IT A KNIGHT? + JMP DN /YES + TAD (KNIGHT-BISHOP/NO + SNA /IS IT A BISHOP? + JMP DB /YES + TAD (BISHOP-ROOK/NO + SNA /IS IT A ROOK? + JMP DR /YES + TAD (ROOK-QUEEN /NO + SNA /IS IT HER MAJESTY? + JMP DQ /YES + TAD (QUEEN-KING /NO + SNA CLA /IS IT HIS HIGHNESS? + JMP DK /YES + TAD ("?-"P /IT'S AN UNKNOWN PIECE +DP, TAD ("P-"N +DN, TAD ("N-"B +DB, TAD ("B-"R +DR, TAD ("R-"K +DK, TAD ("K-"Q +DQ, TAD ("Q + DCA PIECE /SAVE PIECE + TAD COLOR /WHICH COLOR PIECE IS IT? + SZA CLA + TAD ("B-"W /BLACK + TAD ("W /WHITE + JMS I ZOUT /PRINT COLOR OF PIECE + TAD PIECE + JMS I ZOUT /PRINT NAME OF PIECE + JMP NEXT +EMPTY, TAD XR0 + RTR + RAR + AND [0007 /ISOLATE RANK + TAD XR0 /ADD IN FILE + RAR /PUT PARITY IN LINK + SZL CLA /WHITE OR BLACK SQUARE? + TAD ("--"* /WHITE + TAD ("* /BLACK + DCA PIECE + TAD PIECE + JMS I ZOUT + TAD PIECE + JMS I ZOUT +NEXT, ISZ FILKNT /AT END OF RANK? + JMP RL2 /NO, GO ON TO NEXT SQUARE + JMS I ZCRLF /YES, GO TO NEXT RANK + TAD RNKPTR + TAD [7770 + DCA RNKPTR + ISZ RNKKNT /WAS THIS THE LAST RANK? + JMP RNKLUP /NO, PROCEED TO NEXT RANK + JMS I ZCRLF /AN EXTRA CRLF FOR GOOD LUCK + JMP I DISPLAY /RETURN + +PAGE + +/CHESS POSITION INPUTTER +/INPUT A LINE AT A TIME IN FORSYTH NOTATION +/ +/ POSIBLE ERRORS.... +/ 1? TRYING TO PUT TOO MUCH STUFF ON A RANK +/ 2? INCOMPLETE RANK SPECIFICATION(NOT ENOUGH STUFF) +/ 3? UNKNOWN PIECE LETTER +/ 4? PIECE COLOR NOT "W" OR "B" + +INPUT, 0 + JMS I ZCRLF + TAD (BOARD+70-1 + DCA RNKPTR + TAD [7770 + DCA RNKKNT /SET UP FOR 8 RANKS +RNLUP, TAD RNKPTR + DCA XR0 + TAD ("> + JMS I ZOUT /PRINT A ">" TO INDIACTE READYNESS FOR INPUT + TAD (7767 + DCA FILKNT + JMS I ZBEGIN /SETUP TO READ A LINE OF INPUT + ION /GO ! + JMS I ZCHKIO +RL3, JMS I ZGETC /READ A CHARACTER + SNA /AT END OF LINE? + JMP EOL /YES + JMS I (IS128 /IS CHAR A DIGIT? + JMP LETTR /NO + TAD (-260 /YES, CONVERT TO DIGIT + CIA + DCA COLOR + JMS CHK /TEST FOR TOO ENOUGH STUFF ON THIS RANK ALREADY + DCA I XR0 + ISZ COLOR + JMP .-3 + JMP RL3 + +LETTR, TAD (-"B + SNA /IS IT A BLACK PIECE? + JMP BLP /YES + TAD ("B-"W + SZA CLA /IS IT A WHITE PIECE? + JMP ERR4 /NOT "B" OR "W" +WHP, STA +BLP, DCA COLOR + JMS CHK + JMS I ZGETC /GET PIECE NAME + TAD (-"B + SNA /IS IT A BISHOP? + JMP GB /YES + TAD ("B-"N /NO + SNA /IS IT A KNIGHT? + JMP GN /YES + TAD ("N-"P /NO + SNA /IS IT A PAWN? + JMP GP /YES + TAD ("P-"R /NO + SNA /IS IT A ROOK? + JMP GR /YES + TAD ("R-"K /NO + SNA /IT IT A KING? + JMP GK /YES + TAD ("K-"Q /NO + SNA /IT IT A QUEEN? + JMP GQ /YES + TAD ("Q-"S /NO + SNA CLA /IS IT A SPRINGER? + JMP GN /YES, ACCEPT AS KNIGHT + JMP ERR3 /UNKNOWN PIECE + +GP, TAD (PAWN-KNIGHT +GN, TAD (KNIGHT-BISHOP +GB, TAD (BISHOP-ROOK +GR, TAD (ROOK-QUEEN +GQ, TAD (QUEEN-KING +GK, TAD (KING + ISZ COLOR /WHICH COLOR + CIA /COMPLEMENT VALUE IF BLACK + DCA I XR0 /STORE AWAY PIECE + JMP RL3 /REITERATE + +EOL, ISZ FILKNT /WERE 8 SQUARES INPUTTED? + JMP ERR2 /NO, TOO FEW SQUARES + TAD RNKPTR + TAD [7770 + DCA RNKPTR /POINT TO NEXT RANK + ISZ RNKKNT /WAS THIS LAST RANK? + JMP RNLUP /NO + DCA BPSW /YES. INITIALIZE POSITION STATUS WORDS + DCA WPSW /TO ALLOW CASTLING + DCA LSTMV /DISSALLOW EN PASSANT PAWN CAPTURES FOR THE NEXT MOVE + JMS BRDVAL /THEN FIGURE OUT ITS VALUE +/<> THE AC MIGHT NOT EQUAL ZERO NOW! + JMS I ZCRLF /LET GUY KNOW HE'S THROUGH + JMS DISPLA /PRINT OUT THE BOARD JUST INPUTED + JMP I INPUT /RETURN + +ERR4, IAC +ERR3, IAC +ERR2, IAC +ERR1, TAD (61 + JMS I ZOUT + TAD ("? + JMS I ZOUT + JMS I ZCRLF + JMP RNLUP + +CHK, 0 + ISZ FILKNT /IS THIS RANK FULL ALREADY? + JMP I CHK /NO. KEEP GOING + JMP ERR1 /YES. SIGNAL ERROR + +MESG9, TEXT \CHECKMATE\ +MESG22, TEXT \B. \ +MESG23, TEXT \W. \ + +PAGE + *7400 +/TABLE AREA + +MAP, ZBLOCK 50 /50 WORDS RESERVED FOR PIECE MAP + +KBUF, ZBLOCK 30 /30 WORDS RESERVED FOR THE KEYBOARD BUFFER + +/ THE BOARD + +BOARD, IFNZRO .&0077 + + + ROOK + KNIGHT + BISHOP + QUEEN + KING + BISHOP + KNIGHT + ROOK + + PAWN + PAWN + PAWN + PAWN + PAWN + PAWN + PAWN + PAWN + +ZBLOCK 40 + + -PAWN + -PAWN + -PAWN + -PAWN + -PAWN + -PAWN + -PAWN + -PAWN + + -ROOK + -KNIGHT + -BISHOP + -QUEEN + -KING + -BISHOP + -KNIGHT + -ROOK + +$&$ + SAID FARMER BROWN + WHOSE BALD + ON TOP + WISH I COULD + ROTATE THE CROP + BURMA SHAVE + + CHEKMO-II WAS WRITTEN, PRODUCED AND DIRECTED BY: JOHN E. COMEAU +