vm6502/microchess.lst

1077 lines
55 KiB
Plaintext

ca65 V2.13.2 - (C) Copyright 1998-2005 Ullrich von Bassewitz
Main file : microchess.asm
Current file: microchess.asm
000000r 1 ;***********************************************************************
000000r 1 ;
000000r 1 ; MicroChess (c) 1996-2002 Peter Jennings, peterj@benlo.com
000000r 1 ;
000000r 1 ;***********************************************************************
000000r 1 ; Daryl Rictor:
000000r 1 ; I have been given permission to distribute this program by the
000000r 1 ; author and copyright holder, Peter Jennings. Please get his
000000r 1 ; permission if you wish to re-distribute a modified copy of
000000r 1 ; this file to others. He specifically requested that his
000000r 1 ; copyright notice be included in the source and binary images.
000000r 1 ; Thanks!
000000r 1 ;
000000r 1 ; Marek Karcz:
000000r 1 ; I have been given permission to distribute this program by the
000000r 1 ; original author Peter Jennings under condition that I include
000000r 1 ; link to his website in attribution.
000000r 1 ; Here it is: http://www.benlo.com/microchess/index.html
000000r 1 ; I did not bother to contact Daryl Rictor to ask permission to
000000r 1 ; distribute his modifications to this software because according to
000000r 1 ; the copyright notice on the web page of his project, permission is
000000r 1 ; already given for personal non-commercial use:
000000r 1 ; http://sbc.rictor.org/avr65c02.html
000000r 1 ; http://sbc.rictor.org/download/AVR65C02.zip, readme.txt
000000r 1 ; If this is incorrect or I misunderstood the author's intention,
000000r 1 ; please note that I acted with no malicious intent and will remove
000000r 1 ; this file from my project if I receive such request.
000000r 1 ;
000000r 1 ; To build this program with CL65:
000000r 1 ;
000000r 1 ; cl65 -C microchess.cfg -l --start-addr 1024 -t none -o microchess.bin
000000r 1 ; microchess.asm
000000r 1 ;
000000r 1 ; Binary image microchess.bin can be loaded to emulator with 'L'
000000r 1 ; command in debug console. Start emulator: mkbasic, then issue
000000r 1 ; command in debug console:
000000r 1 ; L B MICROCHESS.BIN
000000r 1 ;
000000r 1 ; Memory image definition file can be generated which can be loaded
000000r 1 ; to emulator via command line argument and automatically executed.
000000r 1 ; To create that file, build microchess.bin image, then execute:
000000r 1 ;
000000r 1 ; bin2hex -f microchess.bin -o microchess.dat -w 0 -x 1024 -z
000000r 1 ;
000000r 1 ; and add following lines at the end of microchess.dat file:
000000r 1 ;
000000r 1 ; IOADDR
000000r 1 ; $E000
000000r 1 ; ENIO
000000r 1 ;
000000r 1 ; Instructions to play:
000000r 1 ;
000000r 1 ; Load the game to emulator and auto-execute with command:
000000r 1 ; mkbasic microchess.dat
000000r 1 ; then perform following steps:
000000r 1 ; 1. Press 'C' to setup board.
000000r 1 ; 2. Enter your move: 4 digits - BBEE, BB - piece coordinates,
000000r 1 ; EE - destination coordinates and press ENTER
000000r 1 ; 3. After board is updated, press 'P' to make program make the move.
000000r 1 ; 4. Repeat steps 2 and 3 until the game is finished.
000000r 1 ;
000000r 1 ;
000000r 1 ; 1/14/2012
000000r 1 ; Modified Daryl Rictor's port to run on MKHBC-8-R1 homebrew
000000r 1 ; computer under MKHBCOS (derivative of M.O.S. by Scott
000000r 1 ; Chidester).
000000r 1 ;
000000r 1 ; 3/11/2016
000000r 1 ; Adapted to run in MKBASIC (V65) emulator.
000000r 1 ;
000000r 1 ; 3/12/2016
000000r 1 ; Modified UI behavior:
000000r 1 ; - chess board is only printed after move, not after each
000000r 1 ; keystroke
000000r 1 ; - copyright banner is only printed once at the start
000000r 1 ; of the program
000000r 1 ;
000000r 1 ; 6551 I/O Port Addresses
000000r 1 ;
000000r 1 ;ACIADat = $7F70
000000r 1 ;ACIAsta = $7F71
000000r 1 ;ACIACmd = $7F72
000000r 1 ;ACIACtl = $7F73
000000r 1
000000r 1 ; M.O.S. API defines (kernal) - OK for emulator, no changes
000000r 1
000000r 1 .define mos_StrPtr $E0
000000r 1 .define tmp_zpgPt $F6
000000r 1
000000r 1 ; jumps, originally for M.O.S., now modified for emulator
000000r 1
000000r 1 .define mos_CallGetCh $FFED
000000r 1 .define mos_CallPutCh $FFF0
000000r 1 .define mos_CallPuts $FFF3
000000r 1
000000r 1
000000r 1 ;
000000r 1 ; page zero variables
000000r 1 ;
000000r 1 BOARD = $50
000000r 1 BK = $60
000000r 1 PIECE = $B0
000000r 1 SQUARE = $B1
000000r 1 SP2 = $B2
000000r 1 SP1 = $B3
000000r 1 incHEK = $B4
000000r 1 STATE = $B5
000000r 1 MOVEN = $B6
000000r 1 REV = $B7
000000r 1 OMOVE = $2C
000000r 1 WCAP0 = $2D
000000r 1 COUNT = $2E
000000r 1 BCAP2 = $2E
000000r 1 WCAP2 = $2F
000000r 1 BCAP1 = $20
000000r 1 WCAP1 = $21
000000r 1 BCAP0 = $22
000000r 1 MOB = $23
000000r 1 MAXC = $24
000000r 1 CC = $25
000000r 1 PCAP = $26
000000r 1 BMOB = $23
000000r 1 BMAXC = $24
000000r 1 BMCC = $25 ; was bcc (TASS doesn't like it as a label)
000000r 1 BMAXP = $26
000000r 1 XMAXC = $28
000000r 1 WMOB = $2B
000000r 1 WMAXC = $3C
000000r 1 WCC = $3D
000000r 1 WMAXP = $3E
000000r 1 PMOB = $3F
000000r 1 PMAXC = $40
000000r 1 PCC = $41
000000r 1 PCP = $42
000000r 1 OLDKY = $43
000000r 1 BESTP = $4B
000000r 1 BESTV = $4A
000000r 1 BESTM = $49
000000r 1 DIS1 = $4B
000000r 1 DIS2 = $4A
000000r 1 DIS3 = $49
000000r 1 temp = $4C
000000r 1
000000r 1 ;
000000r 1 ;
000000r 1 ;
000000r 1
000000r 1 .segment "BEGN"
000000r 1
000000r 1 .ORG $0000
000000 1
000000 1 .segment "CODE"
000000 1
000000 1 .ORG $0400 ; load into RAM @ $1000-$15FF
000400 1
000400 1 A9 00 lda #$00 ; REVERSE TOGGLE
000402 1 85 B7 sta REV
000404 1 4C 09 04 jmp CHESS
000407 1
000407 1 FF PAINT: .byte $FF ; set this flag if board needs painting
000408 1 ; unset otherwise
000408 1 PRNBANN:
000408 1 FF .byte $FF ; set this flag to print copyright banner
000409 1
000409 1 ;jsr Init_6551
000409 1 D8 CHESS: cld ; INITIALIZE
00040A 1 A2 FF ldx #$FF ; TWO STACKS
00040C 1 9A txs
00040D 1 A2 C8 ldx #$C8
00040F 1 86 B2 stx SP2
000411 1 ;
000411 1 ; ROUTINES TO LIGHT LED
000411 1 ; DISPLAY and GET KEY
000411 1 ; FROM KEYBOARD
000411 1 ;
000411 1 20 92 07 OUT: jsr POUT ; DISPLAY and
000414 1 20 7D 08 jsr KIN ; GET INPUT *** my routine waits for a keypress
000417 1 C9 43 cmp #$43 ; [C]
000419 1 D0 17 bne NOSET ; SET UP
00041B 1 A9 FF lda #$FF ; set PAINT flag
00041D 1 8D 07 04 sta PAINT ; board needs to be diplayed
000420 1 A2 1F ldx #$1F ; BOARD
000422 1 BD 20 0A WHSET: lda SETW,X ; FROM
000425 1 95 50 sta BOARD,X ; SETW
000427 1 CA dex
000428 1 10 F8 bpl WHSET
00042A 1 A2 1B ldx #$1B ; *ADDED
00042C 1 86 2C stx OMOVE ; INITS TO $FF
00042E 1 A9 CC lda #$CC ; DISPLAY CCC
000430 1 D0 23 bne CLDSP
000432 1 ;
000432 1 C9 45 NOSET: cmp #$45 ; [E]
000434 1 D0 13 bne NOREV ; REVERSE
000436 1 A9 FF lda #$FF
000438 1 8D 07 04 sta PAINT
00043B 1 20 DB 05 jsr REVERSE ; BOARD IS
00043E 1 38 sec
00043F 1 A9 01 lda #$01
000441 1 E5 B7 sbc REV
000443 1 85 B7 sta REV ; TOGGLE REV FLAG
000445 1 A9 EE lda #$EE ; IS
000447 1 D0 0C bne CLDSP
000449 1 ;
000449 1 C9 40 NOREV: cmp #$40 ; [P]
00044B 1 D0 10 bne NOGO ; PLAY CHESS
00044D 1 A9 FF lda #$FF
00044F 1 8D 07 04 sta PAINT
000452 1 20 CF 06 jsr GO
000455 1 85 4B CLDSP: sta DIS1 ; DISPLAY
000457 1 85 4A sta DIS2 ; ACROSS
000459 1 85 49 sta DIS3 ; DISPLAY
00045B 1 D0 AC bne CHESS
00045D 1 ;
00045D 1 C9 0D NOGO: cmp #$0D ; [Enter]
00045F 1 D0 0D bne NOMV ; MOVE MAN
000461 1 48 pha
000462 1 A9 FF lda #$FF
000464 1 8D 07 04 sta PAINT
000467 1 68 pla
000468 1 20 75 06 jsr MOVE ; AS ENTERED
00046B 1 4C 17 05 jmp DISP
00046E 1 C9 41 NOMV: cmp #$41 ; [Q] ***Added to allow game exit***
000470 1 F0 0A beq DONE ; quit the game, exit back to system.
000472 1 48 pha
000473 1 A9 00 lda #$00
000475 1 8D 07 04 sta PAINT
000478 1 68 pla
000479 1 4C 10 05 jmp INPUT ; process move
00047C 1 60 DONE: rts
00047D 1 ;jmp $FF00 ; *** MUST set this to YOUR OS starting address
00047D 1 ;
00047D 1 ; THE ROUTINE JANUS DIRECTS THE
00047D 1 ; ANALYSIS BY DETERMINING WHAT
00047D 1 ; SHOULD OCCUR AFTER EACH MOVE
00047D 1 ; GENERATED BY GNM
00047D 1 ;
00047D 1 ;
00047D 1 ;
00047D 1 A6 B5 JANUS: ldx STATE
00047F 1 30 59 bmi NOCOUNT
000481 1 ;
000481 1 ; THIS ROUTINE COUNTS OCCURRENCES
000481 1 ; IT DEPENDS UPON STATE TO INdex
000481 1 ; THE CORRECT COUNTERS
000481 1 ;
000481 1 A5 B0 COUNTS: lda PIECE
000483 1 F0 08 beq OVER ; IF STATE=8
000485 1 E0 08 cpx #$08 ; DO NOT COUNT
000487 1 D0 04 bne OVER ; BLK MAX CAP
000489 1 C5 26 cmp BMAXP ; MOVES FOR
00048B 1 F0 2E beq XRT ; WHITE
00048D 1 ;
00048D 1 F6 23 OVER: inc MOB,X ; MOBILITY
00048F 1 C9 01 cmp #$01 ; + QUEEN
000491 1 D0 02 bne NOQ ; FOR TWO
000493 1 F6 23 inc MOB,X
000495 1 ;
000495 1 50 1E NOQ: bvc NOCAP
000497 1 A0 0F ldy #$0F ; CALCULATE
000499 1 A5 B1 lda SQUARE ; POINTS
00049B 1 D9 60 00 ELOOP: cmp BK,Y ; CAPTURED
00049E 1 F0 03 beq FOUN ; BY THIS
0004A0 1 88 dey ; MOVE
0004A1 1 10 F8 bpl ELOOP
0004A3 1 B9 51 0A FOUN: lda POINTS,Y
0004A6 1 D5 24 cmp MAXC,X
0004A8 1 90 04 bcc LESS ; SAVE IF
0004AA 1 94 26 sty PCAP,X ; BEST THIS
0004AC 1 95 24 sta MAXC,X ; STATE
0004AE 1 ;
0004AE 1 18 LESS: clc
0004AF 1 08 php ; ADD TO
0004B0 1 75 25 adc CC,X ; CAPTURE
0004B2 1 95 25 sta CC,X ; COUNTS
0004B4 1 28 plp
0004B5 1 ;
0004B5 1 E0 04 NOCAP: cpx #$04
0004B7 1 F0 03 beq ON4
0004B9 1 30 2E bmi TREE ;(=00 ONLY)
0004BB 1 60 XRT: rts
0004BC 1 ;
0004BC 1 ; GENERATE FURTHER MOVES FOR COUNT
0004BC 1 ; and ANALYSIS
0004BC 1 ;
0004BC 1 A5 28 ON4: lda XMAXC ; SAVE ACTUAL
0004BE 1 85 2D sta WCAP0 ; CAPTURE
0004C0 1 A9 00 lda #$00 ; STATE=0
0004C2 1 85 B5 sta STATE
0004C4 1 20 75 06 jsr MOVE ; GENERATE
0004C7 1 20 DB 05 jsr REVERSE ; IMMEDIATE
0004CA 1 20 29 05 jsr GNMZ ; REPLY MOVES
0004CD 1 20 DB 05 jsr REVERSE
0004D0 1 ;
0004D0 1 A9 08 lda #$08 ; STATE=8
0004D2 1 85 B5 sta STATE ; GENERATE
0004D4 1 ; jsr OHM ; CONTINUATION
0004D4 1 20 5B 06 jsr UMOVE ; MOVES
0004D7 1 ;
0004D7 1 4C 2C 07 jmp STRATGY ; FINAL EVALUATION
0004DA 1 E0 F9 NOCOUNT:cpx #$F9
0004DC 1 D0 0B bne TREE
0004DE 1 ;
0004DE 1 ; DETERMINE IF THE KING CAN BE
0004DE 1 ; TAKEN, USED BY CHKCHK
0004DE 1 ;
0004DE 1 A5 60 lda BK ; IS KING
0004E0 1 C5 B1 cmp SQUARE ; IN CHECK?
0004E2 1 D0 04 bne RETJ ; SET incHEK=0
0004E4 1 A9 00 lda #$00 ; IF IT IS
0004E6 1 85 B4 sta incHEK
0004E8 1 60 RETJ: rts
0004E9 1 ;
0004E9 1 ; IF A PIECE HAS BEEN CAPTURED BY
0004E9 1 ; A TRIAL MOVE, GENERATE REPLIES &
0004E9 1 ; EVALUATE THE EXCHANGE GAIN/LOSS
0004E9 1 ;
0004E9 1 50 FD TREE: bvc RETJ ; NO CAP
0004EB 1 A0 07 ldy #$07 ; (PIECES)
0004ED 1 A5 B1 lda SQUARE
0004EF 1 D9 60 00 LOOPX: cmp BK,Y
0004F2 1 F0 05 beq FOUNX
0004F4 1 88 dey
0004F5 1 F0 F1 beq RETJ ; (KING)
0004F7 1 10 F6 bpl LOOPX ; SAVE
0004F9 1 B9 51 0A FOUNX: lda POINTS,Y ; BEST CAP
0004FC 1 D5 22 cmp BCAP0,X ; AT THIS
0004FE 1 90 02 bcc NOMAX ; LEVEL
000500 1 95 22 sta BCAP0,X
000502 1 C6 B5 NOMAX: dec STATE
000504 1 A9 FB lda #$FB ; IF STATE=FB
000506 1 C5 B5 cmp STATE ; TIME TO TURN
000508 1 F0 03 beq UPTREE ; AROUND
00050A 1 20 4F 06 jsr GENRM ; GENERATE FURTHER
00050D 1 E6 B5 UPTREE: inc STATE ; CAPTURES
00050F 1 60 rts
000510 1 ;
000510 1 ; THE PLAYER'S MOVE IS INPUT
000510 1 ;
000510 1 C9 08 INPUT: cmp #$08 ; NOT A LEGAL
000512 1 B0 12 bcs ERROR ; SQUARE #
000514 1 20 1C 07 jsr DISMV
000517 1 A2 1F DISP: ldx #$1F
000519 1 B5 50 SEARCH: lda BOARD,X
00051B 1 C5 4A cmp DIS2
00051D 1 F0 03 beq HERE ; DISPLAY
00051F 1 CA dex ; PIECE AT
000520 1 10 F7 bpl SEARCH ; FROM
000522 1 86 4B HERE: stx DIS1 ; SQUARE
000524 1 86 B0 stx PIECE
000526 1 4C 09 04 ERROR: jmp CHESS
000529 1 ;
000529 1 ; GENERATE ALL MOVES FOR ONE
000529 1 ; SIDE, CALL JANUS AFTER EACH
000529 1 ; ONE FOR NEXT STE?
000529 1 ;
000529 1 ;
000529 1 A2 10 GNMZ: ldx #$10 ; CLEAR
00052B 1 A9 00 GNMX: lda #$00 ; COUNTERS
00052D 1 95 2E CLEAR: sta COUNT,X
00052F 1 CA dex
000530 1 10 FB bpl CLEAR
000532 1 ;
000532 1 A9 10 GNM: lda #$10 ; SET UP
000534 1 85 B0 sta PIECE ; PIECE
000536 1 C6 B0 NEWP: dec PIECE ; NEW PIECE
000538 1 10 01 bpl NEX ; ALL DONE?
00053A 1 60 rts ; #NAME?
00053B 1 ;
00053B 1 20 48 06 NEX: jsr RESET ; READY
00053E 1 A4 B0 ldy PIECE ; GET PIECE
000540 1 A2 08 ldx #$08
000542 1 86 B6 stx MOVEN ; COMMON staRT
000544 1 C0 08 cpy #$08 ; WHAT IS IT?
000546 1 10 41 bpl PAWN ; PAWN
000548 1 C0 06 cpy #$06
00054A 1 10 2E bpl KNIGHT ; KNIGHT
00054C 1 C0 04 cpy #$04
00054E 1 10 1F bpl BISHOP ; BISHOP
000550 1 C0 01 cpy #$01
000552 1 F0 09 beq QUEEN ; QUEEN
000554 1 10 0E bpl ROOK ; ROOK
000556 1 ;
000556 1 20 B7 05 KING: jsr SNGMV ; MUST BE KING!
000559 1 D0 FB bne KING ; MOVES
00055B 1 F0 D9 beq NEWP ; 8 TO 1
00055D 1 20 C5 05 QUEEN: jsr LINE
000560 1 D0 FB bne QUEEN ; MOVES
000562 1 F0 D2 beq NEWP ; 8 TO 1
000564 1 ;
000564 1 A2 04 ROOK: ldx #$04
000566 1 86 B6 stx MOVEN ; MOVES
000568 1 20 C5 05 AGNR: jsr LINE ; 4 TO 1
00056B 1 D0 FB bne AGNR
00056D 1 F0 C7 beq NEWP
00056F 1 ;
00056F 1 20 C5 05 BISHOP: jsr LINE
000572 1 A5 B6 lda MOVEN ; MOVES
000574 1 C9 04 cmp #$04 ; 8 TO 5
000576 1 D0 F7 bne BISHOP
000578 1 F0 BC beq NEWP
00057A 1 ;
00057A 1 A2 10 KNIGHT: ldx #$10
00057C 1 86 B6 stx MOVEN ; MOVES
00057E 1 20 B7 05 AGNN: jsr SNGMV ; 16 TO 9
000581 1 A5 B6 lda MOVEN
000583 1 C9 08 cmp #$08
000585 1 D0 F7 bne AGNN
000587 1 F0 AD beq NEWP
000589 1 ;
000589 1 A2 06 PAWN: ldx #$06
00058B 1 86 B6 stx MOVEN
00058D 1 20 F3 05 P1: jsr CMOVE ; RIGHT CAP?
000590 1 50 05 bvc P2
000592 1 30 03 bmi P2
000594 1 20 7D 04 jsr JANUS ; YES
000597 1 20 48 06 P2: jsr RESET
00059A 1 C6 B6 dec MOVEN ; LEFT CAP?
00059C 1 A5 B6 lda MOVEN
00059E 1 C9 05 cmp #$05
0005A0 1 F0 EB beq P1
0005A2 1 20 F3 05 P3: jsr CMOVE ; AHEAD
0005A5 1 70 8F bvs NEWP ; ILLEGAL
0005A7 1 30 8D bmi NEWP
0005A9 1 20 7D 04 jsr JANUS
0005AC 1 A5 B1 lda SQUARE ; GETS TO
0005AE 1 29 F0 and #$F0 ; 3RD RANK?
0005B0 1 C9 20 cmp #$20
0005B2 1 F0 EE beq P3 ; DO DOUBLE
0005B4 1 4C 36 05 jmp NEWP
0005B7 1 ;
0005B7 1 ; CALCULATE SINGLE STEP MOVES
0005B7 1 ; FOR K,N
0005B7 1 ;
0005B7 1 20 F3 05 SNGMV: jsr CMOVE ; CALC MOVE
0005BA 1 30 03 bmi ILL1 ; -IF LEGAL
0005BC 1 20 7D 04 jsr JANUS ; -EVALUATE
0005BF 1 20 48 06 ILL1: jsr RESET
0005C2 1 C6 B6 dec MOVEN
0005C4 1 60 rts
0005C5 1 ;
0005C5 1 ; CALCULATE ALL MOVES DOWN A
0005C5 1 ; STRAIGHT LINE FOR Q,B,R
0005C5 1 ;
0005C5 1 20 F3 05 LINE: jsr CMOVE ; CALC MOVE
0005C8 1 90 02 bcc OVL ; NO CHK
0005CA 1 50 F9 bvc LINE ; NOCAP
0005CC 1 30 07 OVL: bmi ILL ; RETURN
0005CE 1 08 php
0005CF 1 20 7D 04 jsr JANUS ; EVALUATE POSN
0005D2 1 28 plp
0005D3 1 50 F0 bvc LINE ; NOT A CAP
0005D5 1 20 48 06 ILL: jsr RESET ; LINE STOPPED
0005D8 1 C6 B6 dec MOVEN ; NEXT DIR
0005DA 1 60 rts
0005DB 1 ;
0005DB 1 ; EXCHANGE SIDES FOR REPLY
0005DB 1 ; ANALYSIS
0005DB 1 ;
0005DB 1 A2 0F REVERSE:ldx #$0F
0005DD 1 38 ETC: sec
0005DE 1 B4 60 ldy BK,X ; SUBTRACT
0005E0 1 A9 77 lda #$77 ; POSITION
0005E2 1 F5 50 sbc BOARD,X ; FROM 77
0005E4 1 95 60 sta BK,X
0005E6 1 94 50 sty BOARD,X ; and
0005E8 1 38 sec
0005E9 1 A9 77 lda #$77 ; EXCHANGE
0005EB 1 F5 50 sbc BOARD,X ; PIECES
0005ED 1 95 50 sta BOARD,X
0005EF 1 CA dex
0005F0 1 10 EB bpl ETC
0005F2 1 60 rts
0005F3 1 ;
0005F3 1 ; CMOVE CALCULATES THE TO SQUARE
0005F3 1 ; USING SQUARE and THE MOVE
0005F3 1 ; TABLE FLAGS SET AS FOLLOWS:
0005F3 1 ; N#NAME? MOVE
0005F3 1 ; V#NAME? (LEGAL UNLESS IN CR)
0005F3 1 ; C#NAME? BECAUSE OF CHECK
0005F3 1 ; [MY &THANKS TO JIM BUTTERFIELD
0005F3 1 ; WHO WROTE THIS MORE EFFICIENT
0005F3 1 ; VERSION OF CMOVE)
0005F3 1 ;
0005F3 1 A5 B1 CMOVE: lda SQUARE ; GET SQUARE
0005F5 1 A6 B6 ldx MOVEN ; MOVE POINTER
0005F7 1 18 clc
0005F8 1 7D 40 0A adc MOVEX,X ; MOVE LIST
0005FB 1 85 B1 sta SQUARE ; NEW POS'N
0005FD 1 29 88 and #$88
0005FF 1 D0 42 bne ILLEGAL ; OFF BOARD
000601 1 A5 B1 lda SQUARE
000603 1 ;
000603 1 A2 20 ldx #$20
000605 1 CA LOOP: dex ; IS TO
000606 1 30 0E bmi NO ; SQUARE
000608 1 D5 50 cmp BOARD,X ; OCCUPIED?
00060A 1 D0 F9 bne LOOP
00060C 1 ;
00060C 1 E0 10 cpx #$10 ; BY SELF?
00060E 1 30 33 bmi ILLEGAL
000610 1 ;
000610 1 A9 7F lda #$7F ; MUST BE CAP!
000612 1 69 01 adc #$01 ; SET V FLAG
000614 1 70 01 bvs SPX ; (jmp)
000616 1 ;
000616 1 B8 NO: clv ; NO CAPTURE
000617 1 ;
000617 1 A5 B5 SPX: lda STATE ; SHOULD WE
000619 1 30 24 bmi RETL ; DO THE
00061B 1 C9 08 cmp #$08 ; CHECK CHECK?
00061D 1 10 20 bpl RETL
00061F 1 ;
00061F 1 ; CHKCHK REVERSES SIDES
00061F 1 ; and LOOKS FOR A KING
00061F 1 ; CAPTURE TO INDICATE
00061F 1 ; ILLEGAL MOVE BECAUSE OF
00061F 1 ; CHECK SincE THIS IS
00061F 1 ; TIME CONSUMING, IT IS NOT
00061F 1 ; ALWAYS DONE
00061F 1 ;
00061F 1 48 CHKCHK: pha ; STATE #392
000620 1 08 php
000621 1 A9 F9 lda #$F9
000623 1 85 B5 sta STATE ; GENERATE
000625 1 85 B4 sta incHEK ; ALL REPLY
000627 1 20 75 06 jsr MOVE ; MOVES TO
00062A 1 20 DB 05 jsr REVERSE ; SEE IF KING
00062D 1 20 32 05 jsr GNM ; IS IN
000630 1 20 58 06 jsr RUM ; CHECK
000633 1 28 plp
000634 1 68 pla
000635 1 85 B5 sta STATE
000637 1 A5 B4 lda incHEK
000639 1 30 04 bmi RETL ; NO - SAFE
00063B 1 38 sec ; YES - IN CHK
00063C 1 A9 FF lda #$FF
00063E 1 60 rts
00063F 1 ;
00063F 1 18 RETL: clc ; LEGAL
000640 1 A9 00 lda #$00 ; RETURN
000642 1 60 rts
000643 1 ;
000643 1 A9 FF ILLEGAL:lda #$FF
000645 1 18 clc ; ILLEGAL
000646 1 B8 clv ; RETURN
000647 1 60 rts
000648 1 ;
000648 1 ; REPLACE PIECE ON CORRECT SQUARE
000648 1 ;
000648 1 A6 B0 RESET: ldx PIECE ; GET LOGAT
00064A 1 B5 50 lda BOARD,X ; FOR PIECE
00064C 1 85 B1 sta SQUARE ; FROM BOARD
00064E 1 60 rts
00064F 1 ;
00064F 1 ;
00064F 1 ;
00064F 1 20 75 06 GENRM: jsr MOVE ; MAKE MOVE
000652 1 20 DB 05 GENR2: jsr REVERSE ; REVERSE BOARD
000655 1 20 32 05 jsr GNM ; GENERATE MOVES
000658 1 20 DB 05 RUM: jsr REVERSE ; REVERSE BACK
00065B 1 ;
00065B 1 ; ROUTINE TO UNMAKE A MOVE MADE BY
00065B 1 ; MOVE
00065B 1 ;
00065B 1 BA UMOVE: tsx ; UNMAKE MOVE
00065C 1 86 B3 stx SP1
00065E 1 A6 B2 ldx SP2 ; EXCHANGE
000660 1 9A txs ; STACKS
000661 1 68 pla ; MOVEN
000662 1 85 B6 sta MOVEN
000664 1 68 pla ; CAPTURED
000665 1 85 B0 sta PIECE ; PIECE
000667 1 AA tax
000668 1 68 pla ; FROM SQUARE
000669 1 95 50 sta BOARD,X
00066B 1 68 pla ; PIECE
00066C 1 AA tax
00066D 1 68 pla ; TO SOUARE
00066E 1 85 B1 sta SQUARE
000670 1 95 50 sta BOARD,X
000672 1 4C 9A 06 jmp STRV
000675 1 ;
000675 1 ; THIS ROUTINE MOVES PIECE
000675 1 ; TO SQUARE, PARAMETERS
000675 1 ; ARE SAVED IN A staCK TO UNMAKE
000675 1 ; THE MOVE LATER
000675 1 ;
000675 1 BA MOVE: tsx
000676 1 86 B3 stx SP1 ; SWITCH
000678 1 A6 B2 ldx SP2 ; STACKS
00067A 1 9A txs
00067B 1 A5 B1 lda SQUARE
00067D 1 48 pha ; TO SQUARE
00067E 1 A8 tay
00067F 1 A2 1F ldx #$1F
000681 1 D5 50 CHECK: cmp BOARD,X ; CHECK FOR
000683 1 F0 03 beq TAKE ; CAPTURE
000685 1 CA dex
000686 1 10 F9 bpl CHECK
000688 1 A9 CC TAKE: lda #$CC
00068A 1 95 50 sta BOARD,X
00068C 1 8A txa ; CAPTURED
00068D 1 48 pha ; PIECE
00068E 1 A6 B0 ldx PIECE
000690 1 B5 50 lda BOARD,X
000692 1 94 50 sty BOARD,X ; FROM
000694 1 48 pha ; SQUARE
000695 1 8A txa
000696 1 48 pha ; PIECE
000697 1 A5 B6 lda MOVEN
000699 1 48 pha ; MOVEN
00069A 1 BA STRV: tsx
00069B 1 86 B2 stx SP2 ; SWITCH
00069D 1 A6 B3 ldx SP1 ; STACKS
00069F 1 9A txs ; BACK
0006A0 1 60 rts
0006A1 1 ;
0006A1 1 ; CONTINUATION OF SUB STRATGY
0006A1 1 ; -CHECKS FOR CHECK OR CHECKMATE
0006A1 1 ; and ASSIGNS VALUE TO MOVE
0006A1 1 ;
0006A1 1 A4 24 CKMATE: ldy BMAXC ; CAN BLK CAP
0006A3 1 EC 51 0A cpx POINTS ; MY KING?
0006A6 1 D0 04 bne NOCHEK
0006A8 1 A9 00 lda #$00 ; GULP!
0006AA 1 F0 0A beq RETV ; DUMB MOVE!
0006AC 1 ;
0006AC 1 A6 23 NOCHEK: ldx BMOB ; IS BLACK
0006AE 1 D0 06 bne RETV ; UNABLE TO
0006B0 1 A6 3E ldx WMAXP ; MOVE and
0006B2 1 D0 02 bne RETV ; KING IN CH?
0006B4 1 A9 FF lda #$FF ; YES! MATE
0006B6 1 ;
0006B6 1 A2 04 RETV: ldx #$04 ; RESTORE
0006B8 1 86 B5 stx STATE ; STATE=4
0006BA 1 ;
0006BA 1 ; THE VALUE OF THE MOVE (IN ACCU)
0006BA 1 ; IS COMPARED TO THE BEST MOVE and
0006BA 1 ; REPLACES IT IF IT IS BETTER
0006BA 1 ;
0006BA 1 C5 4A PUSH: cmp BESTV ; IS THIS BEST
0006BC 1 90 0C bcc RETP ; MOVE SO FAR?
0006BE 1 F0 0A beq RETP
0006C0 1 85 4A sta BESTV ; YES!
0006C2 1 A5 B0 lda PIECE ; SAVE IT
0006C4 1 85 4B sta BESTP
0006C6 1 A5 B1 lda SQUARE
0006C8 1 85 49 sta BESTM ; FLASH DISPLAY
0006CA 1 A9 2E RETP: lda #'.' ; print ... instead of flashing disp
0006CC 1 4C 8F 08 jmp syschout ; print . and return
0006CF 1 ;
0006CF 1 ; MAIN PROGRAM TO PLAY CHESS
0006CF 1 ; PLAY FROM OPENING OR THINK
0006CF 1 ;
0006CF 1 A6 2C GO: ldx OMOVE ; OPENING?
0006D1 1 30 1C bmi NOOPEN ; -NO *ADD CHANGE FROM bpl
0006D3 1 A5 49 lda DIS3 ; -YES WAS
0006D5 1 DD 61 0A cmp OPNING,X ; OPPONENT'S
0006D8 1 D0 11 bne END ; MOVE OK?
0006DA 1 CA dex
0006DB 1 BD 61 0A lda OPNING,X ; GET NEXT
0006DE 1 85 4B sta DIS1 ; CANNED
0006E0 1 CA dex ; OPENING MOVE
0006E1 1 BD 61 0A lda OPNING,X
0006E4 1 85 49 sta DIS3 ; DISPLAY IT
0006E6 1 CA dex
0006E7 1 86 2C stx OMOVE ; MOVE IT
0006E9 1 D0 1C bne MV2 ; (jmp)
0006EB 1 ;
0006EB 1 A9 FF END: lda #$FF ; *ADD - STOP CANNED MOVES
0006ED 1 85 2C sta OMOVE ; FLAG OPENING
0006EF 1 A2 0C NOOPEN: ldx #$0C ; FINISHED
0006F1 1 86 B5 stx STATE ; STATE=C
0006F3 1 86 4A stx BESTV ; CLEAR BESTV
0006F5 1 A2 14 ldx #$14 ; GENERATE P
0006F7 1 20 2B 05 jsr GNMX ; MOVES
0006FA 1 ;
0006FA 1 A2 04 ldx #$04 ; STATE=4
0006FC 1 86 B5 stx STATE ; GENERATE and
0006FE 1 20 29 05 jsr GNMZ ; TEST AVAILABLE
000701 1 ;
000701 1 ; MOVES
000701 1 ;
000701 1 A6 4A ldx BESTV ; GET BEST MOVE
000703 1 E0 0F cpx #$0F ; IF NONE
000705 1 90 12 bcc MATE ; OH OH!
000707 1 ;
000707 1 A6 4B MV2: ldx BESTP ; MOVE
000709 1 B5 50 lda BOARD,X ; THE
00070B 1 85 4A sta BESTV ; BEST
00070D 1 86 B0 stx PIECE ; MOVE
00070F 1 A5 49 lda BESTM
000711 1 85 B1 sta SQUARE ; and DISPLAY
000713 1 20 75 06 jsr MOVE ; IT
000716 1 4C 09 04 jmp CHESS
000719 1 ;
000719 1 A9 FF MATE: lda #$FF ; RESIGN
00071B 1 60 rts ; OR staLEMATE
00071C 1 ;
00071C 1 ; SUBROUTINE TO ENTER THE
00071C 1 ; PLAYER'S MOVE
00071C 1 ;
00071C 1 A2 04 DISMV: ldx #$04 ; ROTATE
00071E 1 06 49 Drol: asl DIS3 ; KEY
000720 1 26 4A rol DIS2 ; INTO
000722 1 CA dex ; DISPLAY
000723 1 D0 F9 bne Drol ;
000725 1 05 49 ora DIS3
000727 1 85 49 sta DIS3
000729 1 85 B1 sta SQUARE
00072B 1 60 rts
00072C 1 ;
00072C 1 ; THE FOLLOWING SUBROUTINE ASSIGNS
00072C 1 ; A VALUE TO THE MOVE UNDER
00072C 1 ; CONSIDERATION and RETURNS IT IN
00072C 1 ; THE ACCUMULATOR
00072C 1 ;
00072C 1
00072C 1 18 STRATGY:clc
00072D 1 A9 80 lda #$80
00072F 1 65 2B adc WMOB ; PARAMETERS
000731 1 65 3C adc WMAXC ; WITH WHEIGHT
000733 1 65 3D adc WCC ; OF O25
000735 1 65 21 adc WCAP1
000737 1 65 2F adc WCAP2
000739 1 38 sec
00073A 1 E5 40 sbc PMAXC
00073C 1 E5 41 sbc PCC
00073E 1 E5 22 sbc BCAP0
000740 1 E5 20 sbc BCAP1
000742 1 E5 2E sbc BCAP2
000744 1 E5 3F sbc PMOB
000746 1 E5 23 sbc BMOB
000748 1 B0 02 bcs POS ; UNDERFLOW
00074A 1 A9 00 lda #$00 ; PREVENTION
00074C 1 4A POS: lsr
00074D 1 18 clc ; **************
00074E 1 69 40 adc #$40
000750 1 65 3C adc WMAXC ; PARAMETERS
000752 1 65 3D adc WCC ; WITH WEIGHT
000754 1 38 sec ; OF 05
000755 1 E5 24 sbc BMAXC
000757 1 4A lsr ; **************
000758 1 18 clc
000759 1 69 90 adc #$90
00075B 1 65 2D adc WCAP0 ; PARAMETERS
00075D 1 65 2D adc WCAP0 ; WITH WEIGHT
00075F 1 65 2D adc WCAP0 ; OF 10
000761 1 65 2D adc WCAP0
000763 1 65 21 adc WCAP1
000765 1 38 sec ; [UNDER OR OVER-
000766 1 E5 24 sbc BMAXC ; FLOW MAY OCCUR
000768 1 E5 24 sbc BMAXC ; FROM THIS
00076A 1 E5 25 sbc BMCC ; secTION]
00076C 1 E5 25 sbc BMCC
00076E 1 E5 20 sbc BCAP1
000770 1 A6 B1 ldx SQUARE ; ***************
000772 1 E0 33 cpx #$33
000774 1 F0 16 beq POSN ; POSITION
000776 1 E0 34 cpx #$34 ; BONUS FOR
000778 1 F0 12 beq POSN ; MOVE TO
00077A 1 E0 22 cpx #$22 ; CENTRE
00077C 1 F0 0E beq POSN ; OR
00077E 1 E0 25 cpx #$25 ; OUT OF
000780 1 F0 0A beq POSN ; BACK RANK
000782 1 A6 B0 ldx PIECE
000784 1 F0 09 beq NOPOSN
000786 1 B4 50 ldy BOARD,X
000788 1 C0 10 cpy #$10
00078A 1 10 03 bpl NOPOSN
00078C 1 18 POSN: clc
00078D 1 69 02 adc #$02
00078F 1 4C A1 06 NOPOSN: jmp CKMATE ; CONTINUE
000792 1
000792 1
000792 1 ;-----------------------------------------------------------------
000792 1 ; The following routines were added to allow text-based board
000792 1 ; DISPLAY over a standard RS-232 port.
000792 1 ;
000792 1 AD 07 04 POUT: lda PAINT
000795 1 D0 01 bne POUT0
000797 1 60 rts ; return if PAINT flag = 0
000798 1 20 37 08 POUT0: jsr POUT9 ; print CRLF
00079B 1 20 5B 08 jsr POUT13 ; print copyright
00079E 1 20 42 08 jsr POUT10 ; print column labels
0007A1 1 A0 00 ldy #$00 ; init board location
0007A3 1 20 09 08 jsr POUT5 ; print board horz edge
0007A6 1 A9 7C POUT1: lda #'|' ; print vert edge
0007A8 1 20 8F 08 jsr syschout ; PRINT ONE ASCII CHR - SPACE
0007AB 1 A2 1F ldx #$1F
0007AD 1 98 POUT2: tya ; scan the pieces for a location match
0007AE 1 D5 50 cmp BOARD,X ; match found?
0007B0 1 F0 40 beq POUT4 ; yes; print the piece's color and type
0007B2 1 CA dex ; no
0007B3 1 10 F8 bpl POUT2 ; if not the last piece, try again
0007B5 1 98 tya ; empty square
0007B6 1 29 01 and #$01 ; odd or even column?
0007B8 1 85 4C sta temp ; save it
0007BA 1 98 tya ; is the row odd or even
0007BB 1 4A lsr ; shift column right 4 spaces
0007BC 1 4A lsr ;
0007BD 1 4A lsr ;
0007BE 1 4A lsr ;
0007BF 1 29 01 and #$01 ; strip LSB
0007C1 1 18 clc ;
0007C2 1 65 4C adc temp ; combine row & col to determine square color
0007C4 1 29 01 and #$01 ; is board square white or blk?
0007C6 1 D0 03 bne POUT25 ; white, print space
0007C8 1 A9 2A lda #'*' ; black, print *
0007CA 1
0007CA 1 2C .byte $2c ; used to skip over lda #$20
0007CB 1 ;jmp POUT25A
0007CB 1
0007CB 1 A9 20 POUT25: lda #$20 ; ASCII space
0007CD 1 20 8F 08 POUT25A:jsr syschout ; PRINT ONE ASCII CHR - SPACE
0007D0 1 20 8F 08 jsr syschout ; PRINT ONE ASCII CHR - SPACE
0007D3 1 C8 POUT3: iny ;
0007D4 1 98 tya ; get row number
0007D5 1 29 08 and #$08 ; have we completed the row?
0007D7 1 F0 CD beq POUT1 ; no, do next column
0007D9 1 A9 7C lda #'|' ; yes, put the right edge on
0007DB 1 20 8F 08 jsr syschout ; PRINT ONE ASCII CHR - |
0007DE 1 20 54 08 jsr POUT12 ; print row number
0007E1 1 20 37 08 jsr POUT9 ; print CRLF
0007E4 1 20 09 08 jsr POUT5 ; print bottom edge of board
0007E7 1 18 clc ;
0007E8 1 98 tya ;
0007E9 1 69 08 adc #$08 ; point y to beginning of next row
0007EB 1 A8 tay ;
0007EC 1 C0 80 cpy #$80 ; was that the last row?
0007EE 1 F0 2B beq POUT8 ; yes, print the LED values
0007F0 1 D0 B4 bne POUT1 ; no, do new row
0007F2 1
0007F2 1 A5 B7 POUT4: lda REV ; print piece's color & type
0007F4 1 F0 05 beq POUT41 ;
0007F6 1 BD 0D 09 lda cpl+16,X ;
0007F9 1 D0 03 bne POUT42 ;
0007FB 1 BD FD 08 POUT41: lda cpl,x ;
0007FE 1 20 8F 08 POUT42: jsr syschout ;
000801 1 BD 2D 09 lda cph,x ;
000804 1 20 8F 08 jsr syschout ;
000807 1 D0 CA bne POUT3 ; branch always
000809 1
000809 1 8A POUT5: txa ; print "-----...-----<crlf>"
00080A 1 48 pha
00080B 1 A2 19 ldx #$19
00080D 1 A9 2D lda #'-'
00080F 1 20 8F 08 POUT6: jsr syschout ; PRINT ONE ASCII CHR - "-"
000812 1 CA dex
000813 1 D0 FA bne POUT6
000815 1 68 pla
000816 1 AA tax
000817 1 20 37 08 jsr POUT9
00081A 1 60 rts
00081B 1
00081B 1 20 42 08 POUT8: jsr POUT10 ;
00081E 1 A5 4B lda BESTP
000820 1 20 9B 08 jsr syshexout ; PRINT 1 BYTE AS 2 HEX CHRS
000823 1 A9 20 lda #$20
000825 1 20 8F 08 jsr syschout ; PRINT ONE ASCII CHR - SPACE
000828 1 A5 4A lda BESTV
00082A 1 20 9B 08 jsr syshexout ; PRINT 1 BYTE AS 2 HEX CHRS
00082D 1 A9 20 lda #$20
00082F 1 20 8F 08 jsr syschout ; PRINT ONE ASCII CHR - SPACE
000832 1 A5 49 lda DIS3
000834 1 20 9B 08 jsr syshexout ; PRINT 1 BYTE AS 2 HEX CHRS
000837 1
000837 1 A9 0D POUT9: lda #$0D
000839 1 20 8F 08 jsr syschout ; PRINT ONE ASCII CHR - CR
00083C 1 A9 0A lda #$0A
00083E 1 20 8F 08 jsr syschout ; PRINT ONE ASCII CHR - LF
000841 1 60 rts
000842 1
000842 1 A2 00 POUT10: ldx #$00 ; print the column labels
000844 1 A9 20 POUT11: lda #$20 ; 00 01 02 03 ... 07 <CRLF>
000846 1 20 8F 08 jsr syschout
000849 1 8A txa
00084A 1 20 9B 08 jsr syshexout
00084D 1 E8 inx
00084E 1 E0 08 cpx #$08
000850 1 D0 F2 bne POUT11
000852 1 F0 E3 beq POUT9
000854 1 98 POUT12: tya
000855 1 29 70 and #$70
000857 1 20 9B 08 jsr syshexout
00085A 1 60 rts
00085B 1
00085B 1 ; print banner only once, preserve registers A, X, Y
00085B 1 86 F6 POUT13: stx tmp_zpgPt
00085D 1 85 F7 sta tmp_zpgPt+1
00085F 1 84 F8 sty tmp_zpgPt+2
000861 1 AD 08 04 lda PRNBANN
000864 1 F0 0B beq NOPRNBANN
000866 1 A9 C1 lda #<banner
000868 1 85 E0 sta mos_StrPtr
00086A 1 A9 08 lda #>banner
00086C 1 85 E1 sta mos_StrPtr+1
00086E 1 20 F3 FF jsr mos_CallPuts
000871 1 NOPRNBANN:
000871 1 A9 00 lda #$00
000873 1 8D 08 04 sta PRNBANN
000876 1 A6 F6 ldx tmp_zpgPt
000878 1 A5 F7 lda tmp_zpgPt+1
00087A 1 A4 F8 ldy tmp_zpgPt+2
00087C 1 60 rts
00087D 1
00087D 1 ; ldx #$00 ; Print the copyright banner
00087D 1 ;POUT14: lda banner,x
00087D 1 ; beq POUT15
00087D 1 ; jsr syschout
00087D 1 ; inx
00087D 1 ; bne POUT14
00087D 1 ;POUT15: rts
00087D 1
00087D 1 A9 3F KIN: lda #'?'
00087F 1 20 8F 08 jsr syschout ; PRINT ONE ASCII CHR - ?
000882 1 20 8B 08 jsr syskin ; GET A KEYSTROKE FROM SYSTEM
000885 1 20 8F 08 jsr syschout ; echo entered character
000888 1 29 4F and #$4F ; MASK 0-7, and ALpha'S
00088A 1 60 rts
00088B 1 ;
00088B 1 ; 6551 I/O Support Routines
00088B 1 ;
00088B 1 ;
00088B 1 ;Init_6551 lda #$1F ; 19.2K/8/1
00088B 1 ; sta ACIActl ; control reg
00088B 1 ; lda #$0B ; N parity/echo off/rx int off/ dtr active low
00088B 1 ; sta ACIAcmd ; command reg
00088B 1 ; rts ; done
00088B 1 ;
00088B 1 ; input chr from ACIA1 (waiting)
00088B 1 ;
00088B 1 syskin:
00088B 1 20 ED FF jsr mos_CallGetCh
00088E 1 60 rts
00088F 1
00088F 1 ;lda ACIAsta ; Serial port status
00088F 1 ;and #$08 ; is recvr full
00088F 1 ;beq syskin ; no char to get
00088F 1 ;lda ACIAdat ; get chr
00088F 1 ;rts ;
00088F 1 ;
00088F 1 ; output to OutPut Port
00088F 1 ;
00088F 1 syschout: ; MKHBCOS: must preserve X, Y and A
00088F 1 86 F6 stx tmp_zpgPt
000891 1 85 F7 sta tmp_zpgPt+1
000893 1 ;sty tmp_zpgPt+2
000893 1 20 F0 FF jsr mos_CallPutCh
000896 1 A6 F6 ldx tmp_zpgPt
000898 1 A5 F7 lda tmp_zpgPt+1
00089A 1 ;ldy tmp_zpgPt+2
00089A 1 60 rts
00089B 1 ; pha ; save registers
00089B 1 ;ACIA_Out1 lda ACIAsta ; serial port status
00089B 1 ; and #$10 ; is tx buffer empty
00089B 1 ; beq ACIA_Out1 ; no
00089B 1 ; pla ; get chr
00089B 1 ; sta ACIAdat ; put character to Port
00089B 1 ; rts ; done
00089B 1
00089B 1 48 syshexout: pha ; prints AA hex digits
00089C 1 4A lsr ; MOVE UPPER NIBBLE TO LOWER
00089D 1 4A lsr ;
00089E 1 4A lsr ;
00089F 1 4A lsr ;
0008A0 1 20 A4 08 jsr PrintDig ;
0008A3 1 68 pla ;
0008A4 1 PrintDig:
0008A4 1 84 F8 sty tmp_zpgPt+2
0008A6 1 29 0F and #$0F ;
0008A8 1 A8 tay ;
0008A9 1 B9 B1 08 lda Hexdigdata,Y ;
0008AC 1 A4 F8 ldy tmp_zpgPt+2 ;
0008AE 1 4C 8F 08 jmp syschout ;
0008B1 1
0008B1 1 30 31 32 33 Hexdigdata: .byte "0123456789ABCDEF"
0008B5 1 34 35 36 37
0008B9 1 38 39 41 42
0008C1 1 4D 69 63 72 banner: .byte "MicroChess (c) 1996-2002 Peter Jennings, peterj@benlo.com"
0008C5 1 6F 43 68 65
0008C9 1 73 73 20 28
0008FA 1 0D 0A 00 .byte $0d, $0a, $00
0008FD 1 57 57 57 57 cpl: .byte "WWWWWWWWWWWWWWWWBBBBBBBBBBBBBBBBWWWWWWWWWWWWWWWW"
000901 1 57 57 57 57
000905 1 57 57 57 57
00092D 1 4B 51 43 43 cph: .byte "KQCCBBRRPPPPPPPPKQCCBBRRPPPPPPPP"
000931 1 42 42 52 52
000935 1 50 50 50 50
00094D 1 00 .byte $00
00094E 1 ;
00094E 1 ; end of added code
00094E 1 ;
00094E 1 ; BLOCK DATA
00094E 1
00094E 1 .segment "DATA"
00094E 1
00094E 1 .ORG $0A20
000A20 1
000A20 1 03 04 00 07 SETW: .byte $03, $04, $00, $07, $02, $05, $01, $06
000A24 1 02 05 01 06
000A28 1 10 17 11 16 .byte $10, $17, $11, $16, $12, $15, $14, $13
000A2C 1 12 15 14 13
000A30 1 73 74 70 77 .byte $73, $74, $70, $77, $72, $75, $71, $76
000A34 1 72 75 71 76
000A38 1 60 67 61 66 .byte $60, $67, $61, $66, $62, $65, $64, $63
000A3C 1 62 65 64 63
000A40 1
000A40 1 00 F0 FF 01 MOVEX: .byte $00, $F0, $FF, $01, $10, $11, $0F, $EF, $F1
000A44 1 10 11 0F EF
000A48 1 F1
000A49 1 DF E1 EE F2 .byte $DF, $E1, $EE, $F2, $12, $0E, $1F, $21
000A4D 1 12 0E 1F 21
000A51 1
000A51 1 0B 0A 06 06 POINTS: .byte $0B, $0A, $06, $06, $04, $04, $04, $04
000A55 1 04 04 04 04
000A59 1 02 02 02 02 .byte $02, $02, $02, $02, $02, $02, $02, $02
000A5D 1 02 02 02 02
000A61 1
000A61 1 99 25 0B 25 OPNING: .byte $99, $25, $0B, $25, $01, $00, $33, $25
000A65 1 01 00 33 25
000A69 1 07 36 34 0D .byte $07, $36, $34, $0D, $34, $34, $0E, $52
000A6D 1 34 34 0E 52
000A71 1 25 0D 45 35 .byte $25, $0D, $45, $35, $04, $55, $22, $06
000A75 1 04 55 22 06
000A79 1 43 33 0F CC .byte $43, $33, $0F, $CC
000A7D 1
000A7D 1 .segment "KERN"
000A7D 1
000A7D 1 .ORG $FE00
00FE00 1
00FE00 1 AD 00 E0 CHRIN: lda $E000
00FE03 1 60 rts
00FE04 1
00FE04 1 8D 00 E0 CHROUT: sta $E000
00FE07 1 60 rts
00FE08 1
00FE08 1 ; this function was shamelessly ripped :-) from M.O.S. code (c) by Scott Chidester
00FE08 1
00FE08 1 STROUT:
00FE08 1 A0 00 ldy #0 ; Non-indexed variant starts at zero, of course
00FE0A 1 A5 E1 lda mos_StrPtr+1 ; Save StrPtr so it isn't modified
00FE0C 1 48 pha
00FE0D 1 PutsLoop:
00FE0D 1 B1 E0 lda (mos_StrPtr),y ; Get the next char in the string
00FE0F 1 F0 0B beq PutsDone ; Zero means end of string
00FE11 1 20 04 FE jsr CHROUT ; Otherwise put the char
00FE14 1
00FE14 1 ; Update string pointer
00FE14 1 C8 iny ; increment StrPtr-lo
00FE15 1 D0 F6 bne PutsLoop ; No rollover? Loop back for next character
00FE17 1 E6 E1 inc mos_StrPtr+1 ; StrPtr-lo rolled over--carry hi byte
00FE19 1 4C 0D FE jmp PutsLoop ; Now loop back
00FE1C 1
00FE1C 1 PutsDone:
00FE1C 1 68 pla
00FE1D 1 85 E1 sta mos_StrPtr+1 ; Restore StrPtr
00FE1F 1 60 rts
00FE20 1
00FE20 1 .segment "VECT"
00FE20 1
00FE20 1 .ORG $FFED
00FFED 1
00FFED 1 4C 00 FE jmp CHRIN
00FFF0 1 4C 04 FE jmp CHROUT
00FFF3 1 4C 08 FE jmp STROUT
00FFF6 1
00FFF6 1 ;
00FFF6 1 ;
00FFF6 1 ; end of file
00FFF6 1 ;
00FFF6 1