diff --git a/microchess.asm b/microchess.asm index 3b0ea01..78842aa 100644 --- a/microchess.asm +++ b/microchess.asm @@ -1,3 +1,4 @@ +<<<<<<< HEAD ;*********************************************************************** ; ; MicroChess (c) 1996-2002 Peter Jennings, peterj@benlo.com @@ -1049,3 +1050,1056 @@ PutsDone: ; ; end of file ; +======= +;*********************************************************************** +; +; MicroChess (c) 1996-2002 Peter Jennings, peterj@benlo.com +; +;*********************************************************************** +; Daryl Rictor: +; I have been given permission to distribute this program by the +; author and copyright holder, Peter Jennings. Please get his +; permission if you wish to re-distribute a modified copy of +; this file to others. He specifically requested that his +; copyright notice be included in the source and binary images. +; Thanks! +; +; Marek Karcz: +; I have been given permission to distribute this program by the +; original author Peter Jennings under condition that I include +; link to his website in attribution. +; Here it is: http://www.benlo.com/microchess/index.html +; I did not bother to contact Daryl Rictor to ask permission to +; distribute his modifications to this software because according to +; the copyright notice on the web page of his project, permission is +; already given for personal non-commercial use: +; http://sbc.rictor.org/avr65c02.html +; http://sbc.rictor.org/download/AVR65C02.zip, readme.txt +; If this is incorrect or I misunderstood the author's intention, +; please note that I acted with no malicious intent and will remove +; this file from my project if I receive such request. +; +; To build this program with CL65: +; +; cl65 -C microchess.cfg -l --start-addr 1024 -t none -o microchess.bin +; microchess.asm +; +; Binary image microchess.bin can be loaded to emulator with 'L' +; command in debug console. Start emulator: mkbasic, then issue +; command in debug console: +; L B MICROCHESS.BIN +; +; Memory image definition file can be generated which can be loaded +; to emulator via command line argument and automatically executed. +; To create that file, build microchess.bin image, then execute: +; +; bin2hex -f microchess.bin -o microchess.dat -w 0 -x 1024 -z +; +; and add following lines at the end of microchess.dat file: +; +; IOADDR +; $E000 +; ENIO +; +; Instructions to play: +; +; Load the game to emulator and auto-execute with command: +; mkbasic microchess.dat +; then perform following steps: +; 1. Press 'C' to setup board. +; 2. Enter your move: 4 digits - BBEE, BB - piece coordinates, +; EE - destination coordinates and press ENTER +; 3. After board is updated, press 'P' to make program make the move. +; 4. Repeat steps 2 and 3 until the game is finished. +; +; +; 1/14/2012 +; Modified Daryl Rictor's port to run on MKHBC-8-R1 homebrew +; computer under MKHBCOS (derivative of M.O.S. by Scott +; Chidester). +; +; 3/11/2016 +; Adapted to run in MKBASIC (V65) emulator. +; +; 3/12/2016 +; Modified UI behavior: +; - chess board is only printed after move, not after each +; keystroke +; - copyright banner is only printed once at the start +; of the program +; +; 6551 I/O Port Addresses +; +;ACIADat = $7F70 +;ACIAsta = $7F71 +;ACIACmd = $7F72 +;ACIACtl = $7F73 + +; M.O.S. API defines (kernal) - OK for emulator, no changes + +.define mos_StrPtr $E0 +.define tmp_zpgPt $F6 + +; jumps, originally for M.O.S., now modified for emulator + +.define mos_CallGetCh $FFED +.define mos_CallPutCh $FFF0 +.define mos_CallPuts $FFF3 + + +; +; page zero variables +; +BOARD = $50 +BK = $60 +PIECE = $B0 +SQUARE = $B1 +SP2 = $B2 +SP1 = $B3 +incHEK = $B4 +STATE = $B5 +MOVEN = $B6 +REV = $B7 +OMOVE = $2C +WCAP0 = $2D +COUNT = $2E +BCAP2 = $2E +WCAP2 = $2F +BCAP1 = $20 +WCAP1 = $21 +BCAP0 = $22 +MOB = $23 +MAXC = $24 +CC = $25 +PCAP = $26 +BMOB = $23 +BMAXC = $24 +BMCC = $25 ; was bcc (TASS doesn't like it as a label) +BMAXP = $26 +XMAXC = $28 +WMOB = $2B +WMAXC = $3C +WCC = $3D +WMAXP = $3E +PMOB = $3F +PMAXC = $40 +PCC = $41 +PCP = $42 +OLDKY = $43 +BESTP = $4B +BESTV = $4A +BESTM = $49 +DIS1 = $4B +DIS2 = $4A +DIS3 = $49 +temp = $4C + +; +; +; + +.segment "BEGN" + + .ORG $0000 + +.segment "CODE" + + .ORG $0400 ; load into RAM @ $1000-$15FF + + lda #$00 ; REVERSE TOGGLE + sta REV + jmp CHESS + +PAINT: .byte $FF ; set this flag if board needs painting + ; unset otherwise +PRNBANN: + .byte $FF ; set this flag to print copyright banner + + ;jsr Init_6551 +CHESS: cld ; INITIALIZE + ldx #$FF ; TWO STACKS + txs + ldx #$C8 + stx SP2 +; +; ROUTINES TO LIGHT LED +; DISPLAY and GET KEY +; FROM KEYBOARD +; +OUT: jsr POUT ; DISPLAY and + jsr KIN ; GET INPUT *** my routine waits for a keypress + cmp #$43 ; [C] + bne NOSET ; SET UP + lda #$FF ; set PAINT flag + sta PAINT ; board needs to be diplayed + ldx #$1F ; BOARD +WHSET: lda SETW,X ; FROM + sta BOARD,X ; SETW + dex + bpl WHSET + ldx #$1B ; *ADDED + stx OMOVE ; INITS TO $FF + lda #$CC ; DISPLAY CCC + bne CLDSP +; +NOSET: cmp #$45 ; [E] + bne NOREV ; REVERSE + lda #$FF + sta PAINT + jsr REVERSE ; BOARD IS + sec + lda #$01 + sbc REV + sta REV ; TOGGLE REV FLAG + lda #$EE ; IS + bne CLDSP +; +NOREV: cmp #$40 ; [P] + bne NOGO ; PLAY CHESS + lda #$FF + sta PAINT + jsr GO +CLDSP: sta DIS1 ; DISPLAY + sta DIS2 ; ACROSS + sta DIS3 ; DISPLAY + bne CHESS +; +NOGO: cmp #$0D ; [Enter] + bne NOMV ; MOVE MAN + pha + lda #$FF + sta PAINT + pla + jsr MOVE ; AS ENTERED + jmp DISP +NOMV: cmp #$41 ; [Q] ***Added to allow game exit*** + beq DONE ; quit the game, exit back to system. + pha + lda #$00 + sta PAINT + pla + jmp INPUT ; process move +DONE: rts +;jmp $FF00 ; *** MUST set this to YOUR OS starting address +; +; THE ROUTINE JANUS DIRECTS THE +; ANALYSIS BY DETERMINING WHAT +; SHOULD OCCUR AFTER EACH MOVE +; GENERATED BY GNM +; +; +; +JANUS: ldx STATE + bmi NOCOUNT +; +; THIS ROUTINE COUNTS OCCURRENCES +; IT DEPENDS UPON STATE TO INdex +; THE CORRECT COUNTERS +; +COUNTS: lda PIECE + beq OVER ; IF STATE=8 + cpx #$08 ; DO NOT COUNT + bne OVER ; BLK MAX CAP + cmp BMAXP ; MOVES FOR + beq XRT ; WHITE +; +OVER: inc MOB,X ; MOBILITY + cmp #$01 ; + QUEEN + bne NOQ ; FOR TWO + inc MOB,X +; +NOQ: bvc NOCAP + ldy #$0F ; CALCULATE + lda SQUARE ; POINTS +ELOOP: cmp BK,Y ; CAPTURED + beq FOUN ; BY THIS + dey ; MOVE + bpl ELOOP +FOUN: lda POINTS,Y + cmp MAXC,X + bcc LESS ; SAVE IF + sty PCAP,X ; BEST THIS + sta MAXC,X ; STATE +; +LESS: clc + php ; ADD TO + adc CC,X ; CAPTURE + sta CC,X ; COUNTS + plp +; +NOCAP: cpx #$04 + beq ON4 + bmi TREE ;(=00 ONLY) +XRT: rts +; +; GENERATE FURTHER MOVES FOR COUNT +; and ANALYSIS +; +ON4: lda XMAXC ; SAVE ACTUAL + sta WCAP0 ; CAPTURE + lda #$00 ; STATE=0 + sta STATE + jsr MOVE ; GENERATE + jsr REVERSE ; IMMEDIATE + jsr GNMZ ; REPLY MOVES + jsr REVERSE +; + lda #$08 ; STATE=8 + sta STATE ; GENERATE +; jsr OHM ; CONTINUATION + jsr UMOVE ; MOVES +; + jmp STRATGY ; FINAL EVALUATION +NOCOUNT:cpx #$F9 + bne TREE +; +; DETERMINE IF THE KING CAN BE +; TAKEN, USED BY CHKCHK +; + lda BK ; IS KING + cmp SQUARE ; IN CHECK? + bne RETJ ; SET incHEK=0 + lda #$00 ; IF IT IS + sta incHEK +RETJ: rts +; +; IF A PIECE HAS BEEN CAPTURED BY +; A TRIAL MOVE, GENERATE REPLIES & +; EVALUATE THE EXCHANGE GAIN/LOSS +; +TREE: bvc RETJ ; NO CAP + ldy #$07 ; (PIECES) + lda SQUARE +LOOPX: cmp BK,Y + beq FOUNX + dey + beq RETJ ; (KING) + bpl LOOPX ; SAVE +FOUNX: lda POINTS,Y ; BEST CAP + cmp BCAP0,X ; AT THIS + bcc NOMAX ; LEVEL + sta BCAP0,X +NOMAX: dec STATE + lda #$FB ; IF STATE=FB + cmp STATE ; TIME TO TURN + beq UPTREE ; AROUND + jsr GENRM ; GENERATE FURTHER +UPTREE: inc STATE ; CAPTURES + rts +; +; THE PLAYER'S MOVE IS INPUT +; +INPUT: cmp #$08 ; NOT A LEGAL + bcs ERROR ; SQUARE # + jsr DISMV +DISP: ldx #$1F +SEARCH: lda BOARD,X + cmp DIS2 + beq HERE ; DISPLAY + dex ; PIECE AT + bpl SEARCH ; FROM +HERE: stx DIS1 ; SQUARE + stx PIECE +ERROR: jmp CHESS +; +; GENERATE ALL MOVES FOR ONE +; SIDE, CALL JANUS AFTER EACH +; ONE FOR NEXT STE? +; +; +GNMZ: ldx #$10 ; CLEAR +GNMX: lda #$00 ; COUNTERS +CLEAR: sta COUNT,X + dex + bpl CLEAR +; +GNM: lda #$10 ; SET UP + sta PIECE ; PIECE +NEWP: dec PIECE ; NEW PIECE + bpl NEX ; ALL DONE? + rts ; #NAME? +; +NEX: jsr RESET ; READY + ldy PIECE ; GET PIECE + ldx #$08 + stx MOVEN ; COMMON staRT + cpy #$08 ; WHAT IS IT? + bpl PAWN ; PAWN + cpy #$06 + bpl KNIGHT ; KNIGHT + cpy #$04 + bpl BISHOP ; BISHOP + cpy #$01 + beq QUEEN ; QUEEN + bpl ROOK ; ROOK +; +KING: jsr SNGMV ; MUST BE KING! + bne KING ; MOVES + beq NEWP ; 8 TO 1 +QUEEN: jsr LINE + bne QUEEN ; MOVES + beq NEWP ; 8 TO 1 +; +ROOK: ldx #$04 + stx MOVEN ; MOVES +AGNR: jsr LINE ; 4 TO 1 + bne AGNR + beq NEWP +; +BISHOP: jsr LINE + lda MOVEN ; MOVES + cmp #$04 ; 8 TO 5 + bne BISHOP + beq NEWP +; +KNIGHT: ldx #$10 + stx MOVEN ; MOVES +AGNN: jsr SNGMV ; 16 TO 9 + lda MOVEN + cmp #$08 + bne AGNN + beq NEWP +; +PAWN: ldx #$06 + stx MOVEN +P1: jsr CMOVE ; RIGHT CAP? + bvc P2 + bmi P2 + jsr JANUS ; YES +P2: jsr RESET + dec MOVEN ; LEFT CAP? + lda MOVEN + cmp #$05 + beq P1 +P3: jsr CMOVE ; AHEAD + bvs NEWP ; ILLEGAL + bmi NEWP + jsr JANUS + lda SQUARE ; GETS TO + and #$F0 ; 3RD RANK? + cmp #$20 + beq P3 ; DO DOUBLE + jmp NEWP +; +; CALCULATE SINGLE STEP MOVES +; FOR K,N +; +SNGMV: jsr CMOVE ; CALC MOVE + bmi ILL1 ; -IF LEGAL + jsr JANUS ; -EVALUATE +ILL1: jsr RESET + dec MOVEN + rts +; +; CALCULATE ALL MOVES DOWN A +; STRAIGHT LINE FOR Q,B,R +; +LINE: jsr CMOVE ; CALC MOVE + bcc OVL ; NO CHK + bvc LINE ; NOCAP +OVL: bmi ILL ; RETURN + php + jsr JANUS ; EVALUATE POSN + plp + bvc LINE ; NOT A CAP +ILL: jsr RESET ; LINE STOPPED + dec MOVEN ; NEXT DIR + rts +; +; EXCHANGE SIDES FOR REPLY +; ANALYSIS +; +REVERSE:ldx #$0F +ETC: sec + ldy BK,X ; SUBTRACT + lda #$77 ; POSITION + sbc BOARD,X ; FROM 77 + sta BK,X + sty BOARD,X ; and + sec + lda #$77 ; EXCHANGE + sbc BOARD,X ; PIECES + sta BOARD,X + dex + bpl ETC + rts +; +; CMOVE CALCULATES THE TO SQUARE +; USING SQUARE and THE MOVE +; TABLE FLAGS SET AS FOLLOWS: +; N#NAME? MOVE +; V#NAME? (LEGAL UNLESS IN CR) +; C#NAME? BECAUSE OF CHECK +; [MY &THANKS TO JIM BUTTERFIELD +; WHO WROTE THIS MORE EFFICIENT +; VERSION OF CMOVE) +; +CMOVE: lda SQUARE ; GET SQUARE + ldx MOVEN ; MOVE POINTER + clc + adc MOVEX,X ; MOVE LIST + sta SQUARE ; NEW POS'N + and #$88 + bne ILLEGAL ; OFF BOARD + lda SQUARE +; + ldx #$20 +LOOP: dex ; IS TO + bmi NO ; SQUARE + cmp BOARD,X ; OCCUPIED? + bne LOOP +; + cpx #$10 ; BY SELF? + bmi ILLEGAL +; + lda #$7F ; MUST BE CAP! + adc #$01 ; SET V FLAG + bvs SPX ; (jmp) +; +NO: clv ; NO CAPTURE +; +SPX: lda STATE ; SHOULD WE + bmi RETL ; DO THE + cmp #$08 ; CHECK CHECK? + bpl RETL +; +; CHKCHK REVERSES SIDES +; and LOOKS FOR A KING +; CAPTURE TO INDICATE +; ILLEGAL MOVE BECAUSE OF +; CHECK SincE THIS IS +; TIME CONSUMING, IT IS NOT +; ALWAYS DONE +; +CHKCHK: pha ; STATE #392 + php + lda #$F9 + sta STATE ; GENERATE + sta incHEK ; ALL REPLY + jsr MOVE ; MOVES TO + jsr REVERSE ; SEE IF KING + jsr GNM ; IS IN + jsr RUM ; CHECK + plp + pla + sta STATE + lda incHEK + bmi RETL ; NO - SAFE + sec ; YES - IN CHK + lda #$FF + rts +; +RETL: clc ; LEGAL + lda #$00 ; RETURN + rts +; +ILLEGAL:lda #$FF + clc ; ILLEGAL + clv ; RETURN + rts +; +; REPLACE PIECE ON CORRECT SQUARE +; +RESET: ldx PIECE ; GET LOGAT + lda BOARD,X ; FOR PIECE + sta SQUARE ; FROM BOARD + rts +; +; +; +GENRM: jsr MOVE ; MAKE MOVE +GENR2: jsr REVERSE ; REVERSE BOARD + jsr GNM ; GENERATE MOVES +RUM: jsr REVERSE ; REVERSE BACK +; +; ROUTINE TO UNMAKE A MOVE MADE BY +; MOVE +; +UMOVE: tsx ; UNMAKE MOVE + stx SP1 + ldx SP2 ; EXCHANGE + txs ; STACKS + pla ; MOVEN + sta MOVEN + pla ; CAPTURED + sta PIECE ; PIECE + tax + pla ; FROM SQUARE + sta BOARD,X + pla ; PIECE + tax + pla ; TO SOUARE + sta SQUARE + sta BOARD,X + jmp STRV +; +; THIS ROUTINE MOVES PIECE +; TO SQUARE, PARAMETERS +; ARE SAVED IN A staCK TO UNMAKE +; THE MOVE LATER +; +MOVE: tsx + stx SP1 ; SWITCH + ldx SP2 ; STACKS + txs + lda SQUARE + pha ; TO SQUARE + tay + ldx #$1F +CHECK: cmp BOARD,X ; CHECK FOR + beq TAKE ; CAPTURE + dex + bpl CHECK +TAKE: lda #$CC + sta BOARD,X + txa ; CAPTURED + pha ; PIECE + ldx PIECE + lda BOARD,X + sty BOARD,X ; FROM + pha ; SQUARE + txa + pha ; PIECE + lda MOVEN + pha ; MOVEN +STRV: tsx + stx SP2 ; SWITCH + ldx SP1 ; STACKS + txs ; BACK + rts +; +; CONTINUATION OF SUB STRATGY +; -CHECKS FOR CHECK OR CHECKMATE +; and ASSIGNS VALUE TO MOVE +; +CKMATE: ldy BMAXC ; CAN BLK CAP + cpx POINTS ; MY KING? + bne NOCHEK + lda #$00 ; GULP! + beq RETV ; DUMB MOVE! +; +NOCHEK: ldx BMOB ; IS BLACK + bne RETV ; UNABLE TO + ldx WMAXP ; MOVE and + bne RETV ; KING IN CH? + lda #$FF ; YES! MATE +; +RETV: ldx #$04 ; RESTORE + 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: cmp BESTV ; IS THIS BEST + bcc RETP ; MOVE SO FAR? + beq RETP + sta BESTV ; YES! + lda PIECE ; SAVE IT + sta BESTP + lda SQUARE + sta BESTM ; FLASH DISPLAY +RETP: lda #'.' ; print ... instead of flashing disp + jmp syschout ; print . and return +; +; MAIN PROGRAM TO PLAY CHESS +; PLAY FROM OPENING OR THINK +; +GO: ldx OMOVE ; OPENING? + bmi NOOPEN ; -NO *ADD CHANGE FROM bpl + lda DIS3 ; -YES WAS + cmp OPNING,X ; OPPONENT'S + bne END ; MOVE OK? + dex + lda OPNING,X ; GET NEXT + sta DIS1 ; CANNED + dex ; OPENING MOVE + lda OPNING,X + sta DIS3 ; DISPLAY IT + dex + stx OMOVE ; MOVE IT + bne MV2 ; (jmp) +; +END: lda #$FF ; *ADD - STOP CANNED MOVES + sta OMOVE ; FLAG OPENING +NOOPEN: ldx #$0C ; FINISHED + stx STATE ; STATE=C + stx BESTV ; CLEAR BESTV + ldx #$14 ; GENERATE P + jsr GNMX ; MOVES +; + ldx #$04 ; STATE=4 + stx STATE ; GENERATE and + jsr GNMZ ; TEST AVAILABLE +; +; MOVES +; + ldx BESTV ; GET BEST MOVE + cpx #$0F ; IF NONE + bcc MATE ; OH OH! +; +MV2: ldx BESTP ; MOVE + lda BOARD,X ; THE + sta BESTV ; BEST + stx PIECE ; MOVE + lda BESTM + sta SQUARE ; and DISPLAY + jsr MOVE ; IT + jmp CHESS +; +MATE: lda #$FF ; RESIGN + rts ; OR staLEMATE +; +; SUBROUTINE TO ENTER THE +; PLAYER'S MOVE +; +DISMV: ldx #$04 ; ROTATE +Drol: asl DIS3 ; KEY + rol DIS2 ; INTO + dex ; DISPLAY + bne Drol ; + ora DIS3 + sta DIS3 + sta SQUARE + rts +; +; THE FOLLOWING SUBROUTINE ASSIGNS +; A VALUE TO THE MOVE UNDER +; CONSIDERATION and RETURNS IT IN +; THE ACCUMULATOR +; + +STRATGY:clc + lda #$80 + adc WMOB ; PARAMETERS + adc WMAXC ; WITH WHEIGHT + adc WCC ; OF O25 + adc WCAP1 + adc WCAP2 + sec + sbc PMAXC + sbc PCC + sbc BCAP0 + sbc BCAP1 + sbc BCAP2 + sbc PMOB + sbc BMOB + bcs POS ; UNDERFLOW + lda #$00 ; PREVENTION +POS: lsr + clc ; ************** + adc #$40 + adc WMAXC ; PARAMETERS + adc WCC ; WITH WEIGHT + sec ; OF 05 + sbc BMAXC + lsr ; ************** + clc + adc #$90 + adc WCAP0 ; PARAMETERS + adc WCAP0 ; WITH WEIGHT + adc WCAP0 ; OF 10 + adc WCAP0 + adc WCAP1 + sec ; [UNDER OR OVER- + sbc BMAXC ; FLOW MAY OCCUR + sbc BMAXC ; FROM THIS + sbc BMCC ; secTION] + sbc BMCC + sbc BCAP1 + ldx SQUARE ; *************** + cpx #$33 + beq POSN ; POSITION + cpx #$34 ; BONUS FOR + beq POSN ; MOVE TO + cpx #$22 ; CENTRE + beq POSN ; OR + cpx #$25 ; OUT OF + beq POSN ; BACK RANK + ldx PIECE + beq NOPOSN + ldy BOARD,X + cpy #$10 + bpl NOPOSN +POSN: clc + adc #$02 +NOPOSN: jmp CKMATE ; CONTINUE + + +;----------------------------------------------------------------- +; The following routines were added to allow text-based board +; DISPLAY over a standard RS-232 port. +; +POUT: lda PAINT + bne POUT0 + rts ; return if PAINT flag = 0 +POUT0: jsr POUT9 ; print CRLF + jsr POUT13 ; print copyright + jsr POUT10 ; print column labels + ldy #$00 ; init board location + jsr POUT5 ; print board horz edge +POUT1: lda #'|' ; print vert edge + jsr syschout ; PRINT ONE ASCII CHR - SPACE + ldx #$1F +POUT2: tya ; scan the pieces for a location match + cmp BOARD,X ; match found? + beq POUT4 ; yes; print the piece's color and type + dex ; no + bpl POUT2 ; if not the last piece, try again + tya ; empty square + and #$01 ; odd or even column? + sta temp ; save it + tya ; is the row odd or even + lsr ; shift column right 4 spaces + lsr ; + lsr ; + lsr ; + and #$01 ; strip LSB + clc ; + adc temp ; combine row & col to determine square color + and #$01 ; is board square white or blk? + bne POUT25 ; white, print space + lda #'*' ; black, print * + + .byte $2c ; used to skip over lda #$20 + ;jmp POUT25A + +POUT25: lda #$20 ; ASCII space +POUT25A:jsr syschout ; PRINT ONE ASCII CHR - SPACE + jsr syschout ; PRINT ONE ASCII CHR - SPACE +POUT3: iny ; + tya ; get row number + and #$08 ; have we completed the row? + beq POUT1 ; no, do next column + lda #'|' ; yes, put the right edge on + jsr syschout ; PRINT ONE ASCII CHR - | + jsr POUT12 ; print row number + jsr POUT9 ; print CRLF + jsr POUT5 ; print bottom edge of board + clc ; + tya ; + adc #$08 ; point y to beginning of next row + tay ; + cpy #$80 ; was that the last row? + beq POUT8 ; yes, print the LED values + bne POUT1 ; no, do new row + +POUT4: lda REV ; print piece's color & type + beq POUT41 ; + lda cpl+16,X ; + bne POUT42 ; +POUT41: lda cpl,x ; +POUT42: jsr syschout ; + lda cph,x ; + jsr syschout ; + bne POUT3 ; branch always + +POUT5: txa ; print "-----...-----" + pha + ldx #$19 + lda #'-' +POUT6: jsr syschout ; PRINT ONE ASCII CHR - "-" + dex + bne POUT6 + pla + tax + jsr POUT9 + rts + +POUT8: jsr POUT10 ; + lda BESTP + jsr syshexout ; PRINT 1 BYTE AS 2 HEX CHRS + lda #$20 + jsr syschout ; PRINT ONE ASCII CHR - SPACE + lda BESTV + jsr syshexout ; PRINT 1 BYTE AS 2 HEX CHRS + lda #$20 + jsr syschout ; PRINT ONE ASCII CHR - SPACE + lda DIS3 + jsr syshexout ; PRINT 1 BYTE AS 2 HEX CHRS + +POUT9: lda #$0D + jsr syschout ; PRINT ONE ASCII CHR - CR + lda #$0A + jsr syschout ; PRINT ONE ASCII CHR - LF + rts + +POUT10: ldx #$00 ; print the column labels +POUT11: lda #$20 ; 00 01 02 03 ... 07 + jsr syschout + txa + jsr syshexout + inx + cpx #$08 + bne POUT11 + beq POUT9 +POUT12: tya + and #$70 + jsr syshexout + rts + +; print banner only once, preserve registers A, X, Y +POUT13: stx tmp_zpgPt + sta tmp_zpgPt+1 + sty tmp_zpgPt+2 + lda PRNBANN + beq NOPRNBANN + lda #banner + sta mos_StrPtr+1 + jsr mos_CallPuts +NOPRNBANN: + lda #$00 + sta PRNBANN + ldx tmp_zpgPt + lda tmp_zpgPt+1 + ldy tmp_zpgPt+2 + rts + +; ldx #$00 ; Print the copyright banner +;POUT14: lda banner,x +; beq POUT15 +; jsr syschout +; inx +; bne POUT14 +;POUT15: rts + +KIN: lda #'?' + jsr syschout ; PRINT ONE ASCII CHR - ? + jsr syskin ; GET A KEYSTROKE FROM SYSTEM + jsr syschout ; echo entered character + and #$4F ; MASK 0-7, and ALpha'S + rts +; +; 6551 I/O Support Routines +; +; +;Init_6551 lda #$1F ; 19.2K/8/1 +; sta ACIActl ; control reg +; lda #$0B ; N parity/echo off/rx int off/ dtr active low +; sta ACIAcmd ; command reg +; rts ; done +; +; input chr from ACIA1 (waiting) +; +syskin: + jsr mos_CallGetCh + rts + + ;lda ACIAsta ; Serial port status + ;and #$08 ; is recvr full + ;beq syskin ; no char to get + ;lda ACIAdat ; get chr + ;rts ; +; +; output to OutPut Port +; +syschout: ; MKHBCOS: must preserve X, Y and A + stx tmp_zpgPt + sta tmp_zpgPt+1 + ;sty tmp_zpgPt+2 + jsr mos_CallPutCh + ldx tmp_zpgPt + lda tmp_zpgPt+1 + ;ldy tmp_zpgPt+2 + rts +; pha ; save registers +;ACIA_Out1 lda ACIAsta ; serial port status +; and #$10 ; is tx buffer empty +; beq ACIA_Out1 ; no +; pla ; get chr +; sta ACIAdat ; put character to Port +; rts ; done + +syshexout: pha ; prints AA hex digits + lsr ; MOVE UPPER NIBBLE TO LOWER + lsr ; + lsr ; + lsr ; + jsr PrintDig ; + pla ; +PrintDig: + sty tmp_zpgPt+2 + and #$0F ; + tay ; + lda Hexdigdata,Y ; + ldy tmp_zpgPt+2 ; + jmp syschout ; + +Hexdigdata: .byte "0123456789ABCDEF" +banner: .byte "MicroChess (c) 1996-2002 Peter Jennings, peterj@benlo.com" + .byte $0d, $0a, $00 +cpl: .byte "WWWWWWWWWWWWWWWWBBBBBBBBBBBBBBBBWWWWWWWWWWWWWWWW" +cph: .byte "KQCCBBRRPPPPPPPPKQCCBBRRPPPPPPPP" + .byte $00 +; +; end of added code +; +; BLOCK DATA + +.segment "DATA" + + .ORG $0A20 + +SETW: .byte $03, $04, $00, $07, $02, $05, $01, $06 + .byte $10, $17, $11, $16, $12, $15, $14, $13 + .byte $73, $74, $70, $77, $72, $75, $71, $76 + .byte $60, $67, $61, $66, $62, $65, $64, $63 + +MOVEX: .byte $00, $F0, $FF, $01, $10, $11, $0F, $EF, $F1 + .byte $DF, $E1, $EE, $F2, $12, $0E, $1F, $21 + +POINTS: .byte $0B, $0A, $06, $06, $04, $04, $04, $04 + .byte $02, $02, $02, $02, $02, $02, $02, $02 + +OPNING: .byte $99, $25, $0B, $25, $01, $00, $33, $25 + .byte $07, $36, $34, $0D, $34, $34, $0E, $52 + .byte $25, $0D, $45, $35, $04, $55, $22, $06 + .byte $43, $33, $0F, $CC + +.segment "KERN" + + .ORG $FE00 + +CHRIN: lda $E000 + rts + +CHROUT: sta $E000 + rts + +; this function was shamelessly ripped :-) from M.O.S. code (c) by Scott Chidester + +STROUT: + ldy #0 ; Non-indexed variant starts at zero, of course + lda mos_StrPtr+1 ; Save StrPtr so it isn't modified + pha +PutsLoop: + lda (mos_StrPtr),y ; Get the next char in the string + beq PutsDone ; Zero means end of string + jsr CHROUT ; Otherwise put the char + + ; Update string pointer + iny ; increment StrPtr-lo + bne PutsLoop ; No rollover? Loop back for next character + inc mos_StrPtr+1 ; StrPtr-lo rolled over--carry hi byte + jmp PutsLoop ; Now loop back + +PutsDone: + pla + sta mos_StrPtr+1 ; Restore StrPtr + rts + +.segment "VECT" + + .ORG $FFED + + jmp CHRIN + jmp CHROUT + jmp STROUT + +; +; +; end of file +; +>>>>>>> origin/master