// Dit is een schaak programma de 6502 junior computer // Herschreven door Jacques de Wit // Orgineel MICROCHESS voor de KIM-1 //© COPYRIGHT 1976, PETER JENNINGS, MICROCHESS, // 1612-43 THORNCLIFFE PK DR, TORONTO, CANADA. // ALL RIGHTS RESERVED. REPRODUCTION BY ANY // MEANS, IN WHOLE OR IN PART, IS PROHIBITED. //voor insr Break 1A7E = 00 1A7F = 1C //voor step 1A7A = 00 1A7B = 1C // .equ OLDKY = $0023 // vervallen CHESS 0000 D8 CLD // INITIALIZE 0001 A2 FF LDX #$FF // TWO STACKS 0003 9A TXS 0004 A2 C8 LDX #$C8 0006 86 B2 STX SP2 // // ROUTINES TO LIGHT LED // DISPLAY AND GET KEY // FROM KEYBOARD. //Press GO to run the program //Press C to reset the board //Press PC to make the program play the first move (1333 P-K4) //Press 6343 to respond with your move (P-K4) //Press PC to tell the computer to play VERVALLEN een kleine aanpassing voor de Junior computer (0008 20 1F 1F OUT JSR AND ) (000B 20 6A 1F JSR *GETKEY GET INPUT ) (000E C5 F3 CMPZ .OLDKY KEY IN ACC ) (0010 F0 F6 BEQ OUT (DEBOUNCE) ) (0012 85 F3 STAZ .OLDKY ) OUT 0008 20 8E 1D JSR $1D8E // SCAND: DISPLAY AND 000B D0 FB BNE OUT // Toets ingedrukt ? OUT2 000D 20 8E 1D JSR $1D8E 0010 F0 FB BEQ OUT2 // Toets ingedrukt ? 0012 20 F9 1D JSR $1DF9 // GETKEY monitor programma 0015 C9 0C CMP #$0C // [C] Clear board 0017 D0 0F BNE NOSET 0019 A2 1F LDX #$1F // Board zetten naar de begin toestand. WHSET 001B B5 70 LDA SETW,X 001D 95 50 STA board,X 001F CA DEX 0020 10 F9 BPL WHSET 0022 86 DC STX OMOVE // OMOVE=0xFF openings zet 0024 A9 CC LDA #$CC // Zet CC in display's 0026 D0 12 BNE CLDSP NOSET 0028 C9 0E CMP #$0E // toets[E] verwissel wit/zwart 002A D0 07 BNE NOREV 002C 20 B2 02 JSR REVERSE // Draai het bord om 002F A9 EE LDA #$EE // Zet EE in display's 0031 D0 07 BNE CLDSP NOREV 0033 C9 14 CMP #$14 // [PC] toets 0035 D0 0B BNE NOGO // PLAY CHESS 0037 20 A3 03 JSR GO CLDSP 003A 85 FB STA DIS1 003C 85 FA STA DIS2 003E 85 F9 STA DIS3 0040 D0 BE BNE CHESS NOGO //This key is used to move the piece on the FROM square //to the TO square to register the player's move, or to // move one of the computer's men if desired. 0042 C9 0F CMP #$0F // [F] De F toets bevestigd //de zet die gedaan is en slaat deze op. 0044 D0 06 BNE NOMV 0046 20 4B 03 JSR MOVE // zet bevestigen. 0049 4C 9D 01 JMP DISP NOMV 004C 4C 96 01 JMP INPUT // Eigen zet invoeren met de numerieke toetsen 0....7 // BLOCK DATA // COMPUTER // // ----------------------------------------------------- // | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | // |----+----+----+----+----+----+----+----+----- // | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | // |----+----+----+----+----+----+----+----+----- // | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | // |----+----+----+----+----+----+----+----+----- // | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | // |----+----+----+----+----+----+----+----+----- // | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | // |----+----+----+----+----+----+----+----+----- // | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | // |----+----+----+----+----+----+----+----+----- // | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | // |----+----+----+----+----+----+----+----+----- // | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | // ----------------------------------------------------- // PLAYER // SETW geeft aan welk stuk op welke plaats komt te staan in //de begin stand. Stuk 00 (koning Wit) komt op plaats 03, //Stuk 01 (koningin Wit) komt op plaats 04. Stuk 02 (Toren //Wit) komt op plaats 00 enz........... Zwarte koning op 73 //...... SETW 0070 3 ,4 ,0 ,7 ,2 ,5 ,1 ,6 ,10 ,17 ,11 ,16 ,12 ,15 ,14 ,13 ,73 ,74 ,70 ,77 ,72 ,75 ,71 ,76 ,60 ,67 ,61 ,66 ,62 ,65 ,64 ,63 ,00 movex // F0.......F1 zijn de konings zet mogelijkheden. // DF......21 de paardensprongen . 0090 F0 ,FF ,1 ,10 ,11 ,F ,EF ,F1 ,DF ,E1 ,EE ,F2 ,12 ,E ,1F ,21 POINTS 00A0 B ,A ,6 ,6 ,4 ,4 ,4 ,4 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 OPENINGS_ZETTEN 00C0 99 ,25 ,B ,25 ,1 ,0 ,33 ,25 ,7 ,36 ,34 ,D ,34 ,34 ,E ,52 ,25 ,D ,45 ,35 ,4 ,55 ,22 ,6 ,43 ,33 ,F ,CC // // THE ROUTINE Janus DIRECTS THE // ANALYSIS BY DETERMINING WHAT // SHOULD OCCUR AFTER EACH MOVE // GENERATED BY GNM // // // PROGRAM FUNCTION FOR EACH VALUE OF .STATE // STATE SET BY FUNCTION Janus 0100 A6 B5 LDX state 0102 30 5C BMI NOCOUNT // // THIS ROUTINE COUNTS OCCURRENCES // IT DEPENDS UPON state TO INDEX // THE CORRECT COUNTERS COUNTS 0104 A5 B0 LDA PIECE 0106 F0 08 BEQ OVER // IF state=8 0108 E0 08 CPX #$08 // DO NOT COUNT 010A D0 04 BNE OVER // BLK MAX CAP 010C C5 E6 CMP BmaxP // MOVES FOR 010E F0 2E BEQ xrt // WHITE OVER 0110 F6 E3 INC MOB,X // MOBILITY 0112 C9 01 CMP #$01 // + QUEEN 0114 D0 02 BNE NOQ // FOR TWO 0116 F6 E3 INC MOB,X NOQ 0118 50 1E BVC NOcap 011A A0 0F LDY #$0F // CALCULATE 011C A5 B1 LDA square // POINTS ELOOP 011E D9 60 00 CMP BK,Y // CAPTURED 0121 F0 03 BEQ FOUN // BY THIS 0123 88 DEY // MOVE 0124 10 F8 BPL ELOOP FOUN 0126 B9 A0 00 LDA POINTS,Y 0129 D5 E4 CMP maxc,X 012B 90 04 BCC LESS // SAVE IF 012D 94 E6 STY Pcap,X // BEST THIS 012F 95 E4 STA maxc,X // state LESS 0131 18 CLC 0132 08 PHP // ADD TO 0133 75 E5 ADC CC,X // CAPTURE 0135 95 E5 STA CC,X // COUNTS 0137 28 PLP NOcap 0138 E0 04 CPX #$04 013A F0 03 BEQ ON4 013C 30 31 BMI TREE // (=00 ONLY) xrt 013E 60 RTS // // GENERATE FURTHER MOVES FOR COUNT // AND ANALYSIS // ON4 013F A5 E8 LDA xMaxc // SAVE ACTUAL 0141 85 DD STA Wcap0 // CAPTURE 0143 A9 00 LDA #$00 // state=0 0145 85 B5 STA state 0147 20 4B 03 JSR MOVE // GENERATE 014A 20 B2 02 JSR REVERSE // #MEDIATE 014D 20 00 02 JSR GNMZ // REPLY MOVES 0150 20 B2 02 JSR REVERSE 0153 A9 08 LDA #$08 // state=8 0155 85 B5 STA state // GENERATE 0157 20 09 02 JSR GNM // CONTINUATION 015A 20 31 03 JSR UMOVE // MOVES 015D 4C 00 1A JMP Stratgy // FINAL EVALUATION NOCOUNT 0160 E0 F9 CPX #$F9 0162 D0 0B BNE TREE // DETERMINE IF THE KING CAN BE // TakeN, USED BY CHKCHK // 0164 A5 60 LDA BK // IS KING 0166 C5 B1 CMP square // IN CHECK? 0168 D0 04 BNE RETJ // SET INCHEK=0 016A A9 00 LDA #$00 // IF IT IS 016C 85 B4 STA INCHEK RETJ 016E 60 RTS // // IF A PIECE HAS BEEN CAPTURED BY // A TRIAL MOVE, GENERATE REPLIES & // EVALUATE THE EXCHANGE GAIN/LOSS // TREE 016F 50 FD BVC RETJ // NO CAP 0171 A0 07 LDY #$07 // (PIECES) 0173 A5 B1 LDA square Loopx 0175 D9 60 00 CMP BK,Y 0178 F0 05 BEQ Founx 017A 88 DEY 017B F0 F1 BEQ RETJ // (KING) 017D 10 F6 BPL Loopx // SAVE Founx 017F B9 A0 00 LDA POINTS,Y // BEST CAP 0182 D5 E2 CMP Bcap0,X // AT THIS 0184 90 02 BCC Nomax // LEVEL 0186 95 E2 STA Bcap0,X Nomax 0188 C6 B5 DEC state 018A A9 FB LDA #$FB // IF state=FB 018C C5 B5 CMP state // T E TO TURN 018E F0 03 BEQ UPTREE // AROUND 0190 20 25 03 JSR GENRM // GENERATE FURTHER UPTREE 0193 E6 B5 INC state // CAPTURES 0195 60 RTS // // THE PLAYER'S MOVE IS INPUT // Bij het invoeren van een zet kunnnen we eenvoudig het //veld nummer van het "FROM" veld en daarna // het veld nummer van het "TO" veld opgeven. alle //numerieke toetsen van 0.....7 zijn toegestaan. INPUT 0196 C9 08 CMP #$08 0198 B0 12 BCS ERROR // Alleen num toetsen 0 .....7 019A 20 EB 03 JSR DISMV // laat ingedrukt toets zien op het display DISP 019D A2 1F LDX #$1F Search 019F B5 50 LDA board,X 01A1 C5 FA CMP DIS2 01A3 F0 03 BEQ HERE 01A5 CA DEX 01A6 10 F7 BPL Search HERE 01A8 86 FB STX DIS1 01AA 86 B0 STX PIECE ERROR 01AC 4C 00 00 JMP CHESS // Keer terug naar CHESS en wacht op e volgende toetsenbord invoer. // // GENERATE ALL MOVES FOR ONE // SIDE, CALL Janus AFTER EACH // ONE FOR NexT STEP GNMZ 0200 A2 10 LDX #$10 // Clear Gnmx 0202 A9 00 LDA #$00 // COUNTERS Clear 0204 95 DE STA COUNT,X 0206 CA DEX 0207 10 FB BPL Clear // Alle 'reken' registers 0x7E .... 0x92 worden gereset. GNM 0209 A9 10 LDA #$10 // stuk = 0x10 020B 85 B0 STA PIECE NewTestPiece 020D C6 B0 DEC PIECE // Te beginnen bij stuk 0x0F konings pion 020F 10 01 BPL Nex // Ga alle stukken bij langs 0211 60 RTS Nex 0212 20 1E 03 JSR RESET 0215 A4 B0 LDY PIECE 0217 A2 08 LDX #$08 0219 86 B6 STX MOVEN // COMMON START 021B C0 08 CPY #$08 // Wat voor stuk is het ? 021D 10 41 BPL Pawn // pion 021F C0 06 CPY #$06 0221 10 2E BPL KNIGHT // Paard 0223 C0 04 CPY #$04 0225 10 1F BPL BISHOP // Loper 0227 C0 01 CPY #$01 0229 F0 09 BEQ QUEEN // Koningin 022B 10 0E BPL ROOK // Toren KING 022D 20 8E 02 JSR SNGMV // Koning 0230 D0 FB BNE KING // MOVES 0232 F0 D9 BEQ NewTestPiece // 8 TO 1 QUEEN 0234 20 9C 02 JSR LINE 0237 D0 FB BNE QUEEN // MOVES 0239 F0 D2 BEQ NewTestPiece // 8 TO 1 ROOK 023B A2 04 LDX #$04 023D 86 B6 STX MOVEN // MOVES agnr 023F 20 9C 02 JSR LINE // 4 TO 1 0242 D0 FB BNE agnr 0244 F0 C7 BEQ NewTestPiece BISHOP 0246 20 9C 02 JSR LINE 0249 A5 B6 LDA MOVEN // MOVES 024B C9 04 CMP #$04 // 8 TO 5 024D D0 F7 BNE BISHOP 024F F0 BC BEQ NewTestPiece KNIGHT 0251 A2 10 LDX #$10 0253 86 B6 STX MOVEN // test move pointer agnn 0255 20 8E 02 JSR SNGMV // 16 TO 9 0258 A5 B6 LDA MOVEN 025A C9 08 CMP #$08 025C D0 F7 BNE agnn 025E F0 AD BEQ NewTestPiece Pawn 0260 A2 06 LDX #$06 0262 86 B6 STX MOVEN P1 0264 20 CA 02 JSR CMOVE 0267 50 05 BVC P2 // RIGHT CAPTURE 0269 30 03 BMI P2 026B 20 00 01 JSR Janus // YES P2 026E 20 1E 03 JSR RESET 0271 C6 B6 DEC MOVEN // LEFT CAPTURE 0273 A5 B6 LDA MOVEN 0275 C9 05 CMP #$05 0277 F0 EB BEQ P1 P3 0279 20 CA 02 JSR CMOVE 027C 70 8F BVS NewTestPiece // Illegal 027E 30 8D BMI NewTestPiece 0280 20 00 01 JSR Janus 0283 A5 B1 LDA square 0285 29 F0 AND #$F0 0287 C9 20 CMP #$20 // test of het testveld van de pion de 3e rij is, in dat geval // doe de test dan nog een // veld verder. (2 pion zetten in eerste pion zet) 0289 F0 EE BEQ P3 028B 4C 0D 02 JMP NewTestPiece // // CALCULATE SINGLE STEP MOVES // FOR K, N // SNGMV 028E 20 CA 02 JSR CMOVE 0291 30 03 BMI ILL1 // -IF LEGAL 0293 20 00 01 JSR Janus // -EVALUATE ILL1 0296 20 1E 03 JSR RESET 0299 C6 B6 DEC MOVEN 029B 60 RTS // // CALCULATE ALL MOVES DOWN A // STRAIGHT LINE FOR Q,B,R // LINE 029C 20 CA 02 JSR CMOVE 029F 90 02 BCC OVL // NO CHK 02A1 50 F9 BVC LINE // CH,NOcap OVL 02A3 30 07 BMI ILL // RETURN 02A5 08 PHP 02A6 20 00 01 JSR Janus // EVALUATE POSN 02A9 28 PLP 02AA 50 F0 BVC LINE // NOT A CAP ILL 02AC 20 1E 03 JSR RESET // LINE STOPPED 02AF C6 B6 DEC MOVEN // NexT DIR 02B1 60 RTS REVERSE 02B2 A2 0F LDX #$0F ETC 02B4 38 SEC 02B5 B4 60 LDY BK,X // SUBTRACT 02B7 A9 77 LDA #$77 // POSITION 02B9 F5 50 SBC board,X // FROM 77 02BB 95 60 STA BK,X 02BD 94 50 STY board,X // AND 02BF 38 SEC 02C0 A9 77 LDA #$77 // EXCHANGE 02C2 F5 50 SBC board,X // PIECES 02C4 95 50 STA board,X 02C6 CA DEX 02C7 10 EB BPL ETC 02C9 60 RTS // // CMOVE berekend het TO veld/square en maakt gebruik van // het veld warop het stuk snu staat. (opgeslagen in square) en de movex tabel // De vlaggen worden als olgt gezet. // N - Illegale zet // V - CAPTURE (LEGAL UNLESS IN CH) // C - Illegal omdat de speler schaak staat. CMOVE 02CA A5 B1 LDA square // veld waar het stuk staat 02CC A6 B6 LDX MOVEN // test zet pointer naar movex //tabel 02CE 18 CLC 02CF 75 8F ADC movex,X //bepaal nieuwe positie van // het stuk van een zet 02D1 85 B1 STA square // wel of niet mogelijk is // hier nog niet aan de orde 02D3 29 88 AND #$88 02D5 D0 42 BNE Illegal //positie valt buiten het bord 02D7 A5 B1 LDA square // test veld 02D9 A2 20 LDX #$20 LOOP 02DB CA DEX 02DC 30 0E BMI NO 02DE D5 50 CMP board,X 02E0 D0 F9 BNE LOOP // loop de stukken bij langs en //kijk of het veld bezet door //een ander stuk ? 02E2 E0 10 CPX #$10 02E4 30 33 BMI Illegal //is het een stuk van de //speler zelf ? 02E6 A9 7F LDA #$7F 02E8 69 01 ADC #$01 // Het is dus een stuk van de //andere partij,er wordt dus //een stuk geslagen 02EA 70 01 BVS spx // Flag V wordt geset (JMP) NO 02EC B8 CLV //Veld is niet bezet door een //ander stuk spx 02ED A5 B5 LDA state 02EF 30 24 BMI RETL //statussen >= 80 -> RETL 02F1 C9 08 CMP #$08 // CHECK CHECK? 02F3 10 20 BPL RETL // In status 00,04 en 08 -> RETL // In ststus 0C wordt de schaak check gedaan. // // CHKCHK REVERSES SIDES // AND LOOKS FOR A KING // CAPTURE TO INDICATE // Illegal MOVE BECAUSE OF // CHECK. SINCE THIS IS // T #$E CONSUMING, IT IS NOT // ALWAYS DONE. // CHKCHK 02F5 48 PHA // state 02F6 08 PHP 02F7 A9 F9 LDA #$F9 02F9 85 B5 STA state // GENERATE 02FB 85 B4 STA INCHEK // ALL REPLY 02FD 20 4B 03 JSR MOVE // MOVES TO 0300 20 B2 02 JSR REVERSE // SEE IF KING 0303 20 09 02 JSR GNM // IS IN 0306 20 2E 03 JSR RUM // CHECK 0309 28 PLP 030A 68 PLA 030B 85 B5 STA state 030D A5 B4 LDA INCHEK 030F 30 04 BMI RETL // NO - SAFE 0311 38 SEC // YES - IN CHK 0312 A9 FF LDA #$FF 0314 60 RTS RETL 0315 18 CLC // LEGAL 0316 A9 00 LDA #$00 // RETURN 0318 60 RTS Illegal 0319 A9 FF LDA #$FF 031B 18 CLC // Illegal 031C B8 CLV // RETURN 031D 60 RTS // Stel de variabele square in op de positie van het stuk RESET 031E A6 B0 LDX PIECE 0320 B5 50 LDA board,X 0322 85 B1 STA square 0324 60 RTS GENRM 0325 20 4B 03 JSR MOVE // MAKE MOVE GENR2 0328 20 B2 02 JSR REVERSE // REVERSE BOARD 032B 20 09 02 JSR GNM // GENERATE MOVES RUM 032E 20 B2 02 JSR REVERSE // REVERSE BACK // // ROUTINE TO UNMAKE A MOVE MADE BY // MOVE // UMOVE 0331 BA TSX // UNMAKE MOVE 0332 86 B3 STX SP1 0334 A6 B2 LDX SP2 // EXCHANGE 0336 9A TXS // STACKS 0337 68 PLA // MOVEN 0338 85 B6 STA MOVEN 033A 68 PLA // CAPTURED 033B 85 B0 STA PIECE // PIECE 033D AA TAX 033E 68 PLA // FROM square 033F 95 50 STA board,X 0341 68 PLA // PIECE 0342 AA TAX 0343 68 PLA // TO SOUARE 0344 85 B1 STA square 0346 95 50 STA board,X 0348 4C 70 03 JMP STRV // // THIS ROUTINE MOVES .PIECE // TO .square, PARAMETERS // ARE SAVED IN A STACK TO UNMAKE // THE MOVE LATER // MOVE 034B BA TSX 034C 86 B3 STX SP1 034E A6 B2 LDX SP2 0350 9A TXS 0351 A5 B1 LDA square // "TO" square in accu 0353 48 PHA 0354 A8 TAY 0355 A2 1F LDX #$1F CHECK 0357 D5 50 CMP board,X 0359 F0 03 BEQ Take 035B CA DEX 035C 10 F9 BPL CHECK Take 035E A9 CC LDA #$CC 0360 95 50 STA board,X 0362 8A TXA 0363 48 PHA 0364 A6 B0 LDX PIECE 0366 B5 50 LDA board,X 0368 94 50 STY board,X 036A 48 PHA 036B 8A TXA 036C 48 PHA 036D A5 B6 LDA MOVEN 036F 48 PHA STRV 0370 BA TSX 0371 86 B2 STX SP2 0373 A6 B3 LDX SP1 0375 9A TXS 0376 60 RTS // // CONTINUATION OF SUB Stratgy // -CHECKS FOR CHECK OR CHECkmate // AND ASSIGNS VALUE TO MOVE // Ckmate 0377 A6 E4 LDX Bmaxc // CAN BLK CAP 0379 E4 A0 CPX POINTS // MY KING? 037B D0 04 BNE NOCHEK 037D A9 00 LDA #$00 // GULP! 037F F0 0A BEQ RETV // DUMB MOVE! NOCHEK 0381 A6 E3 LDX BMOB // IS BLACK 0383 D0 06 BNE RETV // UNABLE TO 0385 A6 EE LDX WmaxP // MOVE AND 0387 D0 02 BNE RETV // KING IN CH? 0389 A9 FF LDA #$FF // YES! Mate RETV 038B A2 04 LDX #$04 // RESTORE 038D 86 B5 STX state // state=4 // // THE VALUE OF THE MOVE (IN ACCU) // IS COMPARED TO THE BEST MOVE AND // REPLACES IT IF IT IS BETTER // PUSH 038F C5 FA CMP BESTV // IS THIS BEST 0391 90 0C BCC RETP // MOVE SO FAR? 0393 F0 0A BEQ RETP 0395 85 FA STA BESTV // YES! 0397 A5 B0 LDA PIECE // SAVE IT 0399 85 FB STA BESTP 039B A5 B1 LDA square 039D 85 F9 STA BESTM // FLASH DISPLAY RETP // AANPASSING voor de junior computer 039F 20 8E 1D JSR $1D8E 03A2 60 RTS // JMP *OUT // AND RTS // MAIN PROGRAM TO PLAY CHESS PLAY FROM OPENING OR THINK GO 03A3 A6 DC LDX OMOVE //na een schaak spel reset 03A5 10 17 BPL NOOPEN //OPENING? -NO -> NOOPEN 03A7 A5 F9 LDA DIS3 //YES (DIS3=0xCC na startspel) 03A9 D5 DC CMP OPNING,X 03AB D0 0F BNE END // Eerste zet oxCC ? 03AD CA DEX 03AE B5 DC LDA OPNING,X // 0xOF koning pion op E2 03B0 85 FB STA DIS1 03B2 CA DEX 03B3 B5 DC LDA OPNING,X // 0x33 pion naar plaats 33 = //E4 op schaakbord 03B5 85 F9 STA DIS3 // beeldaf op Display 3 03B7 CA DEX 03B8 86 DC STX OMOVE // OMOVE 0xFC na eerste zet 03BA D0 1A BNE MV2 // (JMP) END 03BC 85 DC STA OMOVE // FLAG OPENING NOOPEN 03BE A2 0C LDX #$0C // FINISHED 03C0 86 B5 STX state // state=C 03C2 86 FA STX BESTV // Clear BESTV 03C4 A2 14 LDX #$14 // GENERATE P 03C6 20 02 02 JSR Gnmx // MOVES 03C9 A2 04 LDX #$04 // state=4 03CB 86 B5 STX state // GENERATE AND 03CD 20 00 02 JSR GNMZ // TEST AVAILABLE MOVES 03D0 A6 FA LDX BESTV // GET BEST MOVE 03D2 E0 0F CPX #$0F // IF NONE 03D4 90 12 BCC Mate // OH OH! MV2 03D6 A6 FB LDX BESTP // 03D8 B5 50 LDA board,X // accu met positie van stuk 03DA 85 FA STA BESTV // zet positie in het //display paar 2 03DC 86 B0 STX PIECE // zet stuk in piece 03DE A5 F9 LDA BESTM 03E0 85 B1 STA square // zet bestemmings veld in //square 03E2 20 4B 03 JSR MOVE 03E5 4C 00 00 JMP CHESS Mate 03E8 A9 FF LDA #$FF // RESIGN 03EA 60 RTS // OR STALEMate // // SUBROUTINE TO ENTER THE // PLAYER'S MOVE // DISMV 03EB A2 04 LDX #$04 // ROTATE ROL_ 03ED 06 F9 ASL DIS3 // KEY 03EF 26 FA ROL DIS2 // INTO 03F1 CA DEX // DISPLAY 03F2 D0 F9 BNE ROL_ 03F4 05 F9 ORA DIS3 03F6 85 F9 STA DIS3 03F8 85 B1 STA square // "TO" veld wordt //opgeslagen in "square" 03FA 60 RTS // // THE FOLLOWING SUBROUTINE ASSIGNS // A VALUE TO THE MOVE UNDER // CONSIDERATION AND RETURNS IT IN // THE ACCUMULATOR // // Adressen zijn aangepast voor de Junior computer!! Stratgy 1A00 18 CLC 1A01 A9 80 LDA #$80 1A03 65 EB ADC WMOB // PARAMETERS 1A05 65 EC ADC Wmaxc // WITH WEIGHT 1A07 65 ED ADC WCC // OF 0.25 1A09 65 E1 ADC Wcap1 1A0B 65 DF ADC Wcap2 1A0D 38 SEC 1A0E E5 F0 SBC pmaxc 1A10 E5 F1 SBC PCC 1A12 E5 E2 SBC Bcap0 1A14 E5 E0 SBC Bcap1 1A16 E5 DE SBC Bcap2 1A18 E5 EF SBC PMOB 1A1A E5 E3 SBC BMOB 1A1C B0 02 BCS POS // UNDERFLOW 1A1E A9 00 LDA #$00 // PREVENTION POS 1A20 4A LSR A 1A21 18 CLC 1A22 69 40 ADC #$40 1A24 65 EC ADC Wmaxc // PARAMETERS 1A26 65 ED ADC WCC // WITH WEIGHT 1A28 38 SEC // OF 0.5 1A29 E5 E4 SBC Bmaxc 1A2B 4A LSR A 1A2C 18 CLC 1A2D 69 90 ADC #$90 1A2F 65 DD ADC Wcap0 // PARAMETERS 1A31 65 DD ADC Wcap0 // WITH WEIGHT 1A33 65 DD ADC Wcap0 // OF 1.0 1A35 65 DD ADC Wcap0 1A37 65 E1 ADC Wcap1 1A39 38 SEC // [UNDER OR OVER- 1A3A E5 E4 SBC Bmaxc // FLOW MAY OCCUR 1A3C E5 E4 SBC Bmaxc // FROM THIS 1A3E E5 E5 SBC BCC // SECTION] 1A40 E5 E5 SBC BCC 1A42 E5 E0 SBC Bcap1 1A44 A6 B1 LDX square // 1A46 E0 33 CPX #$33 1A48 F0 16 BEQ POSN // POSITION 1A4A E0 34 CPX #$34 // BONUS FOR 1A4C F0 12 BEQ POSN // MOVE TO 1A4E E0 22 CPX #$22 // CENTRE 1A50 F0 0E BEQ POSN // OR 1A52 E0 25 CPX #$25 // OUT OF 1A54 F0 0A BEQ POSN // BACK RANK 1A56 A6 B0 LDX PIECE 1A58 F0 09 BEQ NOPOSN 1A5A B4 50 LDY board,X 1A5C C0 10 CPY #$10 1A5E 10 03 BPL NOPOSN POSN 1A60 18 CLC 1A61 69 02 ADC #$02 NOPOSN 1A63 4C 77 03 JMP Ckmate // CONTINUE // ------- EINDE SCHAAKPROGRAMMA -----------------------