microchess.asm (24218B)
1 ;*********************************************************************** 2 ; 3 ; Kim-1 MicroChess (c) 1976-2005 Peter Jennings, www.benlo.com 4 ; 5 ;*********************************************************************** 6 7 ; All rights reserved. 8 9 ; Redistribution and use in source and binary forms, with or without 10 ; modification, are permitted provided that the following conditions 11 ; are met: 12 ; 1. Redistributions of source code must retain the above copyright 13 ; notice, this list of conditions and the following disclaimer. 14 ; 2. Redistributions in binary form must reproduce the above copyright 15 ; notice, this list of conditions and the following disclaimer in the 16 ; documentation and/or other materials provided with the distribution. 17 ; 3. The name of the author may not be used to endorse or promote products 18 ; derived from this software without specific prior written permission. 19 20 ; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR 21 ; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 22 ; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 23 ; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 24 ; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 25 ; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 ; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 ; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 ; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 29 ; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 31 ; 32 ; modified by Daryl Rictor to work over a 33 ; serial terminal connection, August 2002. 34 ; 35 ; Updated with corrections to earlier OCR errors by Bill Forster, August 2005. 36 ; 37 ; 38 ; Adapted to work on the Eris 2010 8-Bit System with 64tass by Gerd Beuster, 39 ; January 2021. All changes by Gerd Beuster toggled by VERSION_ERIS2010. 40 ; 41 VERSION_ERIS2010 = true 42 .if !VERSION_ERIS2010 43 cpu 65c02 44 page 0,132 45 .endif 46 ; 47 ; 6551 I/O Port Addresses 48 ; 49 .if VERSION_ERIS2010 50 .if SYMON 51 ACIADat = $8800 52 .else 53 ACIADat = $c000 54 .endif 55 ACIASta = ACIADat + 1 56 ACIACmd = ACIADat + 2 57 ACIACtl = ACIADat + 3 58 .else 59 ACIADat = $7F70 60 ACIASta = $7F71 61 ACIACmd = $7F72 62 ACIACtl = $7F73 63 .endif 64 ; 65 ; page zero variables 66 ; 67 BOARD = $50 68 BK = $60 69 PIECE = $B0 70 SQUARE = $B1 71 SP2 = $B2 72 SP1 = $B3 73 INCHEK = $B4 74 STATE = $B5 75 MOVEN = $B6 76 REV = $B7 77 OMOVE = $DC 78 WCAP0 = $DD 79 COUNT = $DE 80 BCAP2 = $DE 81 WCAP2 = $DF 82 BCAP1 = $E0 83 WCAP1 = $E1 84 BCAP0 = $E2 85 MOB = $E3 86 MAXC = $E4 87 CC = $E5 88 PCAP = $E6 89 BMOB = $E3 90 BMAXC = $E4 91 BMCC = $E5 ; was BCC (TASS doesn't like it as a label) 92 BMAXP = $E6 93 XMAXC = $E8 94 WMOB = $EB 95 WMAXC = $EC 96 WCC = $ED 97 WMAXP = $EE 98 PMOB = $EF 99 PMAXC = $F0 100 PCC = $F1 101 PCP = $F2 102 OLDKY = $F3 103 BESTP = $FB 104 BESTV = $FA 105 BESTM = $F9 106 DIS1 = $FB 107 DIS2 = $FA 108 DIS3 = $F9 109 temp = $FC 110 ; 111 ; 112 ; 113 .if VERSION_ERIS2010 114 .if SYMON 115 * = $0300 116 .else 117 * = $0200 118 .endif 119 .else 120 *=$1000 ; load into RAM @ $1000-$15FF 121 .endif 122 123 LDA #$00 ; REVERSE TOGGLE 124 STA REV 125 JSR Init_6551 126 CHESS CLD ; INITIALIZE 127 LDX #$FF ; TWO STACKS 128 TXS 129 LDX #$C8 130 STX SP2 131 ; 132 ; ROUTINES TO LIGHT LED 133 ; DISPLAY AND GET KEY 134 ; FROM KEYBOARD 135 ; 136 OUT JSR pout ; DISPLAY AND 137 JSR KIN ; GET INPUT *** my routine waits for a keypress 138 ; CMP OLDKY ; KEY IN ACC *** no need to debounce 139 ; BEQ OUT ; (DEBOUNCE) 140 ; STA OLDKY 141 ; 142 cmp #$43 ; [C] 143 BNE NOSET ; SET UP 144 LDX #$1F ; BOARD 145 WHSET LDA SETW,X ; FROM 146 STA BOARD,X ; SETW 147 DEX 148 BPL WHSET 149 LDX #$1B ; *ADDED 150 STX OMOVE ; INITS TO $FF 151 LDA #$CC ; Display CCC 152 BNE CLDSP 153 ; 154 NOSET cmp #$45 ; [E] 155 BNE NOREV ; REVERSE 156 JSR REVERSE ; BOARD IS 157 SEC 158 LDA #$01 159 SBC REV 160 STA REV ; TOGGLE REV FLAG 161 LDA #$EE ; IS 162 BNE CLDSP 163 ; 164 NOREV cmp #$40 ; [P] 165 BNE NOGO ; PLAY CHESS 166 JSR GO 167 CLDSP STA DIS1 ; DISPLAY 168 STA DIS2 ; ACROSS 169 STA DIS3 ; DISPLAY 170 BNE CHESS 171 ; 172 NOGO CMP #$0D ; [Enter] 173 BNE NOMV ; MOVE MAN 174 JSR MOVE ; AS ENTERED 175 JMP DISP 176 NOMV cmp #$41 ; [Q] ***Added to allow game exit*** 177 BEQ DONE ; quit the game, exit back to system. 178 JMP INPUT ; process move 179 DONE JMP ($FFFC) ; *** MUST set this to YOUR OS starting address 180 ; 181 ; THE ROUTINE JANUS DIRECTS THE 182 ; ANALYSIS BY DETERMINING WHAT 183 ; SHOULD OCCUR AFTER EACH MOVE 184 ; GENERATED BY GNM 185 ; 186 ; 187 ; 188 JANUS LDX STATE 189 BMI NOCOUNT 190 ; 191 ; THIS ROUTINE COUNTS OCCURRENCES 192 ; IT DEPENDS UPON STATE TO INDEX 193 ; THE CORRECT COUNTERS 194 ; 195 COUNTS LDA PIECE 196 BEQ OVER ; IF STATE=8 197 CPX #$08 ; DO NOT COUNT 198 BNE OVER ; BLK MAX CAP 199 CMP BMAXP ; MOVES FOR 200 BEQ XRT ; WHITE 201 ; 202 OVER INC MOB,X ; MOBILITY 203 CMP #$01 ; + QUEEN 204 BNE NOQ ; FOR TWO 205 INC MOB,X 206 ; 207 NOQ BVC NOCAP 208 LDY #$0F ; CALCULATE 209 LDA SQUARE ; POINTS 210 ELOOP CMP BK,Y ; CAPTURED 211 BEQ FOUN ; BY THIS 212 DEY ; MOVE 213 BPL ELOOP 214 FOUN LDA POINTS,Y 215 CMP MAXC,X 216 BCC LESS ; SAVE IF 217 STY PCAP,X ; BEST THIS 218 STA MAXC,X ; STATE 219 ; 220 LESS CLC 221 PHP ; ADD TO 222 ADC CC,X ; CAPTURE 223 STA CC,X ; COUNTS 224 PLP 225 ; 226 NOCAP CPX #$04 227 BEQ ON4 228 BMI TREE ;(=00 ONLY) 229 XRT RTS 230 ; 231 ; GENERATE FURTHER MOVES FOR COUNT 232 ; AND ANALYSIS 233 ; 234 ON4 LDA XMAXC ; SAVE ACTUAL 235 STA WCAP0 ; CAPTURE 236 LDA #$00 ; STATE=0 237 STA STATE 238 JSR MOVE ; GENERATE 239 JSR REVERSE ; IMMEDIATE 240 JSR GNMZ ; REPLY MOVES 241 JSR REVERSE 242 ; 243 LDA #$08 ; STATE=8 244 STA STATE ; GENERATE 245 JSR GNM ; CONTINUATION 246 JSR UMOVE ; MOVES 247 ; 248 JMP STRATGY ; FINAL EVALUATION 249 NOCOUNT CPX #$F9 250 BNE TREE 251 ; 252 ; DETERMINE IF THE KING CAN BE 253 ; TAKEN, USED BY CHKCHK 254 ; 255 LDA BK ; IS KING 256 CMP SQUARE ; IN CHECK? 257 BNE RETJ ; SET INCHEK=0 258 LDA #$00 ; IF IT IS 259 STA INCHEK 260 RETJ RTS 261 ; 262 ; IF A PIECE HAS BEEN CAPTURED BY 263 ; A TRIAL MOVE, GENERATE REPLIES & 264 ; EVALUATE THE EXCHANGE GAIN/LOSS 265 ; 266 TREE BVC RETJ ; NO CAP 267 LDY #$07 ; (PIECES) 268 LDA SQUARE 269 LOOPX CMP BK,Y 270 BEQ FOUNX 271 DEY 272 BEQ RETJ ; (KING) 273 BPL LOOPX ; SAVE 274 FOUNX LDA POINTS,Y ; BEST CAP 275 CMP BCAP0,X ; AT THIS 276 BCC NOMAX ; LEVEL 277 STA BCAP0,X 278 NOMAX DEC STATE 279 LDA #$FB ; IF STATE=FB 280 CMP STATE ; TIME TO TURN 281 BEQ UPTREE ; AROUND 282 JSR GENRM ; GENERATE FURTHER 283 UPTREE INC STATE ; CAPTURES 284 RTS 285 ; 286 ; THE PLAYER'S MOVE IS INPUT 287 ; 288 INPUT CMP #$08 ; NOT A LEGAL 289 BCS ERROR ; SQUARE # 290 JSR DISMV 291 DISP LDX #$1F 292 SEARCH LDA BOARD,X 293 CMP DIS2 294 BEQ HERE ; DISPLAY 295 DEX ; PIECE AT 296 BPL SEARCH ; FROM 297 HERE STX DIS1 ; SQUARE 298 STX PIECE 299 ERROR JMP CHESS 300 ; 301 ; GENERATE ALL MOVES FOR ONE 302 ; SIDE, CALL JANUS AFTER EACH 303 ; ONE FOR NEXT STEP 304 ; 305 ; 306 GNMZ LDX #$10 ; CLEAR 307 GNMX LDA #$00 ; COUNTERS 308 CLEAR STA COUNT,X 309 DEX 310 BPL CLEAR 311 ; 312 GNM LDA #$10 ; SET UP 313 STA PIECE ; PIECE 314 NEWP DEC PIECE ; NEW PIECE 315 BPL NEX ; ALL DONE? 316 RTS ; -YES 317 ; 318 NEX JSR RESET ; READY 319 LDY PIECE ; GET PIECE 320 LDX #$08 321 STX MOVEN ; COMMON START 322 CPY #$08 ; WHAT IS IT? 323 BPL PAWN ; PAWN 324 CPY #$06 325 BPL KNIGHT ; KNIGHT 326 CPY #$04 327 BPL BISHOP ; BISHOP 328 CPY #$01 329 BEQ QUEEN ; QUEEN 330 BPL ROOK ; ROOK 331 ; 332 KING JSR SNGMV ; MUST BE KING! 333 BNE KING ; MOVES 334 BEQ NEWP ; 8 TO 1 335 QUEEN JSR LINE 336 BNE QUEEN ; MOVES 337 BEQ NEWP ; 8 TO 1 338 ; 339 ROOK LDX #$04 340 STX MOVEN ; MOVES 341 AGNR JSR LINE ; 4 TO 1 342 BNE AGNR 343 BEQ NEWP 344 ; 345 BISHOP JSR LINE 346 LDA MOVEN ; MOVES 347 CMP #$04 ; 8 TO 5 348 BNE BISHOP 349 BEQ NEWP 350 ; 351 KNIGHT LDX #$10 352 STX MOVEN ; MOVES 353 AGNN JSR SNGMV ; 16 TO 9 354 LDA MOVEN 355 CMP #$08 356 BNE AGNN 357 BEQ NEWP 358 ; 359 PAWN LDX #$06 360 STX MOVEN 361 P1 JSR CMOVE ; RIGHT CAP? 362 BVC P2 363 BMI P2 364 JSR JANUS ; YES 365 P2 JSR RESET 366 DEC MOVEN ; LEFT CAP? 367 LDA MOVEN 368 CMP #$05 369 BEQ P1 370 P3 JSR CMOVE ; AHEAD 371 BVS NEWP ; ILLEGAL 372 BMI NEWP 373 JSR JANUS 374 LDA SQUARE ; GETS TO 375 AND #$F0 ; 3RD RANK? 376 CMP #$20 377 BEQ P3 ; DO DOUBLE 378 JMP NEWP 379 ; 380 ; CALCULATE SINGLE STEP MOVES 381 ; FOR K,N 382 ; 383 SNGMV JSR CMOVE ; CALC MOVE 384 BMI ILL1 ; -IF LEGAL 385 JSR JANUS ; -EVALUATE 386 ILL1 JSR RESET 387 DEC MOVEN 388 RTS 389 ; 390 ; CALCULATE ALL MOVES DOWN A 391 ; STRAIGHT LINE FOR Q,B,R 392 ; 393 LINE JSR CMOVE ; CALC MOVE 394 BCC OVL ; NO CHK 395 BVC LINE ; NOCAP 396 OVL BMI ILL ; RETURN 397 PHP 398 JSR JANUS ; EVALUATE POSN 399 PLP 400 BVC LINE ; NOT A CAP 401 ILL JSR RESET ; LINE STOPPED 402 DEC MOVEN ; NEXT DIR 403 RTS 404 ; 405 ; EXCHANGE SIDES FOR REPLY 406 ; ANALYSIS 407 ; 408 REVERSE LDX #$0F 409 ETC SEC 410 LDY BK,X ; SUBTRACT 411 LDA #$77 ; POSITION 412 SBC BOARD,X ; FROM 77 413 STA BK,X 414 STY BOARD,X ; AND 415 SEC 416 LDA #$77 ; EXCHANGE 417 SBC BOARD,X ; PIECES 418 STA BOARD,X 419 DEX 420 BPL ETC 421 RTS 422 ; 423 ; CMOVE CALCULATES THE TO SQUARE 424 ; USING SQUARE AND THE MOVE 425 ; TABLE, FLAGS SET AS FOLLOWS: 426 ; N - ILLEGAL MOVE 427 ; V - CAPTURE (LEGAL UNLESS IN CH) 428 ; C - ILLEGAL BECAUSE OF CHECK 429 ; [MY THANKS TO JIM BUTTERFIELD 430 ; WHO WROTE THIS MORE EFFICIENT 431 ; VERSION OF CMOVE] 432 ; 433 CMOVE LDA SQUARE ; GET SQUARE 434 LDX MOVEN ; MOVE POINTER 435 CLC 436 ADC MOVEX,X ; MOVE LIST 437 STA SQUARE ; NEW POS'N 438 AND #$88 439 BNE ILLEGAL ; OFF BOARD 440 LDA SQUARE 441 ; 442 LDX #$20 443 LOOP DEX ; IS TO 444 BMI NO ; SQUARE 445 CMP BOARD,X ; OCCUPIED? 446 BNE LOOP 447 ; 448 CPX #$10 ; BY SELF? 449 BMI ILLEGAL 450 ; 451 LDA #$7F ; MUST BE CAP! 452 ADC #$01 ; SET V FLAG 453 BVS SPX ; (JMP) 454 ; 455 NO CLV ; NO CAPTURE 456 ; 457 SPX LDA STATE ; SHOULD WE 458 BMI RETL ; DO THE 459 CMP #$08 ; CHECK CHECK? 460 BPL RETL 461 ; 462 ; CHKCHK REVERSES SIDES 463 ; AND LOOKS FOR A KING 464 ; CAPTURE TO INDICATE 465 ; ILLEGAL MOVE BECAUSE OF 466 ; CHECK SINCE THIS IS 467 ; TIME CONSUMING, IT IS NOT 468 ; ALWAYS DONE 469 ; 470 CHKCHK PHA ; STATE 471 PHP 472 LDA #$F9 473 STA STATE ; GENERATE 474 STA INCHEK ; ALL REPLY 475 JSR MOVE ; MOVES TO 476 JSR REVERSE ; SEE IF KING 477 JSR GNM ; IS IN 478 JSR RUM ; CHECK 479 PLP 480 PLA 481 STA STATE 482 LDA INCHEK 483 BMI RETL ; NO - SAFE 484 SEC ; YES - IN CHK 485 LDA #$FF 486 RTS 487 ; 488 RETL CLC ; LEGAL 489 LDA #$00 ; RETURN 490 RTS 491 ; 492 ILLEGAL LDA #$FF 493 CLC ; ILLEGAL 494 CLV ; RETURN 495 RTS 496 ; 497 ; REPLACE PIECE ON CORRECT SQUARE 498 ; 499 RESET LDX PIECE ; GET LOGAT 500 LDA BOARD,X ; FOR PIECE 501 STA SQUARE ; FROM BOARD 502 RTS 503 ; 504 ; 505 ; 506 GENRM JSR MOVE ; MAKE MOVE 507 GENR2 JSR REVERSE ; REVERSE BOARD 508 JSR GNM ; GENERATE MOVES 509 RUM JSR REVERSE ; REVERSE BACK 510 ; 511 ; ROUTINE TO UNMAKE A MOVE MADE BY 512 ; MOVE 513 ; 514 UMOVE TSX ; UNMAKE MOVE 515 STX SP1 516 LDX SP2 ; EXCHANGE 517 TXS ; STACKS 518 PLA ; MOVEN 519 STA MOVEN 520 PLA ; CAPTURED 521 STA PIECE ; PIECE 522 TAX 523 PLA ; FROM SQUARE 524 STA BOARD,X 525 PLA ; PIECE 526 TAX 527 PLA ; TO SOUARE 528 STA SQUARE 529 STA BOARD,X 530 JMP STRV 531 ; 532 ; THIS ROUTINE MOVES PIECE 533 ; TO SQUARE, PARAMETERS 534 ; ARE SAVED IN A STACK TO UNMAKE 535 ; THE MOVE LATER 536 ; 537 MOVE TSX 538 STX SP1 ; SWITCH 539 LDX SP2 ; STACKS 540 TXS 541 LDA SQUARE 542 PHA ; TO SQUARE 543 TAY 544 LDX #$1F 545 CHECK CMP BOARD,X ; CHECK FOR 546 BEQ TAKE ; CAPTURE 547 DEX 548 BPL CHECK 549 TAKE LDA #$CC 550 STA BOARD,X 551 TXA ; CAPTURED 552 PHA ; PIECE 553 LDX PIECE 554 LDA BOARD,X 555 STY BOARD,X ; FROM 556 PHA ; SQUARE 557 TXA 558 PHA ; PIECE 559 LDA MOVEN 560 PHA ; MOVEN 561 STRV TSX 562 STX SP2 ; SWITCH 563 LDX SP1 ; STACKS 564 TXS ; BACK 565 RTS 566 ; 567 ; CONTINUATION OF SUB STRATGY 568 ; -CHECKS FOR CHECK OR CHECKMATE 569 ; AND ASSIGNS VALUE TO MOVE 570 ; 571 CKMATE LDX BMAXC ; CAN BLK CAP 572 CPX POINTS ; MY KING? 573 BNE NOCHEK 574 LDA #$00 ; GULP! 575 BEQ RETV ; DUMB MOVE! 576 ; 577 NOCHEK LDX BMOB ; IS BLACK 578 BNE RETV ; UNABLE TO 579 LDX WMAXP ; MOVE AND 580 BNE RETV ; KING IN CH? 581 LDA #$FF ; YES! MATE 582 ; 583 RETV LDX #$04 ; RESTORE 584 STX STATE ; STATE=4 585 ; 586 ; THE VALUE OF THE MOVE (IN ACCU) 587 ; IS COMPARED TO THE BEST MOVE AND 588 ; REPLACES IT IF IT IS BETTER 589 ; 590 PUSH CMP BESTV ; IS THIS BEST 591 BCC RETP ; MOVE SO FAR? 592 BEQ RETP 593 STA BESTV ; YES! 594 LDA PIECE ; SAVE IT 595 STA BESTP 596 LDA SQUARE 597 STA BESTM ; FLASH DISPLAY 598 RETP LDA #"." ; print ... instead of flashing disp 599 Jmp syschout ; print . and return 600 ; 601 ; MAIN PROGRAM TO PLAY CHESS 602 ; PLAY FROM OPENING OR THINK 603 ; 604 GO LDX OMOVE ; OPENING? 605 BMI NOOPEN ; -NO *ADD CHANGE FROM BPL 606 LDA DIS3 ; -YES WAS 607 CMP OPNING,X ; OPPONENT'S 608 BNE END ; MOVE OK? 609 DEX 610 LDA OPNING,X ; GET NEXT 611 STA DIS1 ; CANNED 612 DEX ; OPENING MOVE 613 LDA OPNING,X 614 STA DIS3 ; DISPLAY IT 615 DEX 616 STX OMOVE ; MOVE IT 617 BNE MV2 ; (JMP) 618 ; 619 END LDA #$FF ; *ADD - STOP CANNED MOVES 620 STA OMOVE ; FLAG OPENING 621 NOOPEN LDX #$0C ; FINISHED 622 STX STATE ; STATE=C 623 STX BESTV ; CLEAR BESTV 624 LDX #$14 ; GENERATE P 625 JSR GNMX ; MOVES 626 ; 627 LDX #$04 ; STATE=4 628 STX STATE ; GENERATE AND 629 JSR GNMZ ; TEST AVAILABLE 630 ; MOVES 631 ; 632 LDX BESTV ; GET BEST MOVE 633 CPX #$0F ; IF NONE 634 BCC MATE ; OH OH! 635 ; 636 MV2 LDX BESTP ; MOVE 637 LDA BOARD,X ; THE 638 STA BESTV ; BEST 639 STX PIECE ; MOVE 640 LDA BESTM 641 STA SQUARE ; AND DISPLAY 642 JSR MOVE ; IT 643 JMP CHESS 644 ; 645 MATE LDA #$FF ; RESIGN 646 RTS ; OR STALEMATE 647 ; 648 ; SUBROUTINE TO ENTER THE 649 ; PLAYER'S MOVE 650 ; 651 DISMV LDX #$04 ; ROTATE 652 DROL ASL DIS3 ; KEY 653 ROL DIS2 ; INTO 654 DEX ; DISPLAY 655 BNE DROL ; 656 ORA DIS3 657 STA DIS3 658 STA SQUARE 659 RTS 660 ; 661 ; THE FOLLOWING SUBROUTINE ASSIGNS 662 ; A VALUE TO THE MOVE UNDER 663 ; CONSIDERATION AND RETURNS IT IN 664 ; THE ACCUMULATOR 665 ; 666 667 STRATGY CLC 668 LDA #$80 669 ADC WMOB ; PARAMETERS 670 ADC WMAXC ; WITH WEIGHT 671 ADC WCC ; OF 0.25 672 ADC WCAP1 673 ADC WCAP2 674 SEC 675 SBC PMAXC 676 SBC PCC 677 SBC BCAP0 678 SBC BCAP1 679 SBC BCAP2 680 SBC PMOB 681 SBC BMOB 682 BCS POS ; UNDERFLOW 683 LDA #$00 ; PREVENTION 684 POS LSR 685 CLC ; ************** 686 ADC #$40 687 ADC WMAXC ; PARAMETERS 688 ADC WCC ; WITH WEIGHT 689 SEC ; OF 0.5 690 SBC BMAXC 691 LSR ; ************** 692 CLC 693 ADC #$90 694 ADC WCAP0 ; PARAMETERS 695 ADC WCAP0 ; WITH WEIGHT 696 ADC WCAP0 ; OF 1.0 697 ADC WCAP0 698 ADC WCAP1 699 SEC ; [UNDER OR OVER- 700 SBC BMAXC ; FLOW MAY OCCUR 701 SBC BMAXC ; FROM THIS 702 SBC BMCC ; SECTION] 703 SBC BMCC 704 SBC BCAP1 705 LDX SQUARE ; *************** 706 CPX #$33 707 BEQ POSN ; POSITION 708 CPX #$34 ; BONUS FOR 709 BEQ POSN ; MOVE TO 710 CPX #$22 ; CENTRE 711 BEQ POSN ; OR 712 CPX #$25 ; OUT OF 713 BEQ POSN ; BACK RANK 714 LDX PIECE 715 BEQ NOPOSN 716 LDY BOARD,X 717 CPY #$10 718 BPL NOPOSN 719 POSN CLC 720 ADC #$02 721 NOPOSN JMP CKMATE ; CONTINUE 722 723 724 ;----------------------------------------------------------------- 725 ; The following routines were added to allow text-based board 726 ; display over a standard RS-232 port. 727 ; 728 POUT jsr pout9 ; print CRLF 729 jsr pout13 ; print copyright 730 JSR POUT10 ; print column labels 731 LDY #$00 ; init board location 732 JSR POUT5 ; print board horz edge 733 POUT1 lDA #"|" ; print vert edge 734 JSR syschout ; PRINT ONE ASCII CHR - SPACE 735 LDX #$1F 736 POUT2 TYA ; scan the pieces for a location match 737 CMP BOARD,X ; match found? 738 BEQ POUT4 ; yes; print the piece's color and type 739 DEX ; no 740 BPL POUT2 ; if not the last piece, try again 741 tya ; empty square 742 and #$01 ; odd or even column? 743 sta temp ; save it 744 tya ; is the row odd or even 745 lsr ; shift column right 4 spaces 746 lsr ; 747 lsr ; 748 lsr ; 749 and #$01 ; strip LSB 750 clc ; 751 adc temp ; combine row & col to determine square color 752 and #$01 ; is board square white or blk? 753 beq pout25 ; white, print space 754 lda #"*" ; black, print * 755 .if VERSION_ERIS2010 756 .byte $2c ; used to skip over LDA #$20 757 .else 758 db $2c ; used to skip over LDA #$20 759 .endif 760 POUT25 LDA #$20 ; ASCII space 761 JSR syschout ; PRINT ONE ASCII CHR - SPACE 762 JSR syschout ; PRINT ONE ASCII CHR - SPACE 763 POUT3 INY ; 764 TYA ; get row number 765 AND #$08 ; have we completed the row? 766 BEQ POUT1 ; no, do next column 767 LDA #"|" ; yes, put the right edge on 768 JSR syschout ; PRINT ONE ASCII CHR - | 769 jsr pout12 ; print row number 770 JSR POUT9 ; print CRLF 771 JSR POUT5 ; print bottom edge of board 772 CLC ; 773 TYA ; 774 ADC #$08 ; point y to beginning of next row 775 TAY ; 776 CPY #$80 ; was that the last row? 777 BEQ POUT8 ; yes, print the LED values 778 BNE POUT1 ; no, do new row 779 780 POUT4 LDA REV ; print piece's color & type 781 BEQ POUT41 ; 782 LDA cpl+16,X ; 783 BNE POUT42 ; 784 POUT41 LDA cpl,x ; 785 POUT42 JSR syschout ; 786 lda cph,x ; 787 jsr syschout ; 788 BNE POUT3 ; branch always 789 790 POUT5 TXA ; print "-----...-----<crlf>" 791 PHA 792 LDX #$19 793 LDA #"-" 794 POUT6 JSR syschout ; PRINT ONE ASCII CHR - "-" 795 DEX 796 BNE POUT6 797 PLA 798 TAX 799 JSR POUT9 800 RTS 801 802 POUT8 jsr pout10 ; 803 LDA $FB 804 JSR syshexout ; PRINT 1 BYTE AS 2 HEX CHRS 805 LDA #$20 806 JSR syschout ; PRINT ONE ASCII CHR - SPACE 807 LDA $FA 808 JSR syshexout ; PRINT 1 BYTE AS 2 HEX CHRS 809 LDA #$20 810 JSR syschout ; PRINT ONE ASCII CHR - SPACE 811 LDA $F9 812 JSR syshexout ; PRINT 1 BYTE AS 2 HEX CHRS 813 814 POUT9 LDA #$0D 815 JSR syschout ; PRINT ONE ASCII CHR - CR 816 LDA #$0A 817 JSR syschout ; PRINT ONE ASCII CHR - LF 818 RTS 819 820 pout10 ldx #$00 ; print the column labels 821 POUT11 lda #$20 ; 00 01 02 03 ... 07 <CRLF> 822 jsr syschout 823 txa 824 jsr syshexout 825 INX 826 CPX #$08 827 BNE POUT11 828 BEQ POUT9 829 POUT12 TYA 830 and #$70 831 JSR syshexout 832 rts 833 834 Pout13 ldx #$00 ; Print the copyright banner 835 Pout14 lda banner,x 836 beq POUT15 837 jsr syschout 838 inx 839 bne POUT14 840 POUT15 rts 841 842 KIN LDA #"?" 843 JSR syschout ; PRINT ONE ASCII CHR - ? 844 JSR syskin ; GET A KEYSTROKE FROM SYSTEM 845 AND #$4F ; MASK 0-7, AND ALPHA'S 846 RTS 847 ; 848 ; 6551 I/O Support Routines 849 ; 850 ; 851 Init_6551 lda #$1F ; 19.2K/8/1 852 sta ACIActl ; control reg 853 .if VERSION_ERIS2010 854 lda #$CB ; N parity/echo off/rx int off/ dtr ready 855 .else 856 lda #$0B ; N parity/echo off/rx int off/ dtr active low 857 .endif 858 sta ACIAcmd ; command reg 859 .if VERSION_ERIS2010 860 ;; Terminal program on PC needs some time to start up 861 ldy #$ff 862 ldx #$ff 863 io_setup_delay_delay: 864 dex 865 bne io_setup_delay_delay 866 dey 867 bne io_setup_delay_delay 868 .endif 869 rts ; done 870 ; 871 ; input chr from ACIA1 (waiting) 872 ; 873 syskin lda ACIASta ; Serial port status 874 and #$08 ; is recvr full 875 beq syskin ; no char to get 876 Lda ACIAdat ; get chr 877 RTS ; 878 ; 879 ; output to OutPut Port 880 ; 881 .if VERSION_ERIS2010 882 CLOCK_SPEED = 4 883 syschout: 884 .block 885 pha 886 phx 887 phy 888 ;; Send character. 889 ;; Due to bugs in the register and interrupt 890 ;; handling of the WDC 65C02, we have to use 891 ;; a manual delay. 892 sta ACIADat 893 .switch CLOCK_SPEED 894 .case 4 ; 4 Mhz Clock 895 SERIAL_SEND_DELAY_X = $c3 896 SERIAL_SEND_DELAY_Y = $02 897 .case 2 ; 2 Mhz Clock 898 SERIAL_SEND_DELAY_X = $c2 899 SERIAL_SEND_DELAY_Y = $01 900 .default ; 1 Mhz Clock 901 SERIAL_SEND_DELAY_X = $88 902 SERIAL_SEND_DELAY_Y = $01 903 .endswitch 904 ldy #SERIAL_SEND_DELAY_Y 905 outer_loop: 906 ldx #SERIAL_SEND_DELAY_X 907 inner_loop: 908 dex 909 bne inner_loop 910 dey 911 bne outer_loop 912 ply 913 plx 914 pla 915 rts 916 .bend 917 .else 918 syschout PHA ; save registers 919 ACIA_Out1 lda ACIASta ; serial port status 920 and #$10 ; is tx buffer empty 921 beq ACIA_Out1 ; no 922 PLA ; get chr 923 sta ACIAdat ; put character to Port 924 RTS ; done 925 .endif 926 927 syshexout PHA ; prints AA hex digits 928 LSR ; MOVE UPPER NIBBLE TO LOWER 929 LSR ; 930 LSR ; 931 LSR ; 932 JSR PrintDig ; 933 PLA ; 934 PrintDig AND #$0F ; prints A hex nibble (low 4 bits) 935 PHY 936 TAY ; 937 LDA Hexdigdata,Y ; 938 PLY 939 jmp syschout ; 940 941 .if VERSION_ERIS2010 942 Hexdigdata .text "0123456789ABCDEF" 943 banner 944 .if VERSION_ERIS2010 945 .text x"1b" .. "[2J" ; Clear screen 946 .text x"1b" .. "[1;1H" ; Set cursor to top of screen 947 .endif 948 .text "MicroChess (c) 1996-2005 Peter Jennings, www.benlo.com" 949 .byte $0d, $0a, $00 950 cpl .text "WWWWWWWWWWWWWWWWBBBBBBBBBBBBBBBBWWWWWWWWWWWWWWWW" 951 cph .text "KQRRBBNNPPPPPPPPKQRRBBNNPPPPPPPP" 952 .byte $00 953 ; 954 ; end of added code 955 ; 956 ; BLOCK DATA 957 SETW .byte $03, $04, $00, $07, $02, $05, $01, $06 958 .byte $10, $17, $11, $16, $12, $15, $14, $13 959 .byte $73, $74, $70, $77, $72, $75, $71, $76 960 .byte $60, $67, $61, $66, $62, $65, $64, $63 961 962 MOVEX .byte $00, $F0, $FF, $01, $10, $11, $0F, $EF, $F1 963 .byte $DF, $E1, $EE, $F2, $12, $0E, $1F, $21 964 965 POINTS .byte $0B, $0A, $06, $06, $04, $04, $04, $04 966 .byte $02, $02, $02, $02, $02, $02, $02, $02 967 968 OPNING .byte $99, $25, $0B, $25, $01, $00, $33, $25 969 .byte $07, $36, $34, $0D, $34, $34, $0E, $52 970 .byte $25, $0D, $45, $35, $04, $55, $22, $06 971 .byte $43, $33, $0F, $CC 972 .else 973 Hexdigdata asc "0123456789ABCDEF" 974 banner asc "MicroChess (c) 1996-2005 Peter Jennings, www.benlo.com" 975 db $0d, $0a, $00 976 cpl asc "WWWWWWWWWWWWWWWWBBBBBBBBBBBBBBBBWWWWWWWWWWWWWWWW" 977 cph asc "KQRRBBNNPPPPPPPPKQRRBBNNPPPPPPPP" 978 db $00 979 ; 980 ; end of added code 981 ; 982 ; BLOCK DATA 983 *= $1580 984 SETW db $03, $04, $00, $07, $02, $05, $01, $06 985 db $10, $17, $11, $16, $12, $15, $14, $13 986 db $73, $74, $70, $77, $72, $75, $71, $76 987 db $60, $67, $61, $66, $62, $65, $64, $63 988 989 MOVEX db $00, $F0, $FF, $01, $10, $11, $0F, $EF, $F1 990 db $DF, $E1, $EE, $F2, $12, $0E, $1F, $21 991 992 POINTS db $0B, $0A, $06, $06, $04, $04, $04, $04 993 db $02, $02, $02, $02, $02, $02, $02, $02 994 995 OPNING db $99, $25, $0B, $25, $01, $00, $33, $25 996 db $07, $36, $34, $0D, $34, $34, $0E, $52 997 db $25, $0D, $45, $35, $04, $55, $22, $06 998 db $43, $33, $0F, $CC 999 .endif 1000 1001 ; 1002 ; 1003 ; end of file 1004 ;