[Return to Main Page]

MicroChess by Peter Jennings, modified by Daryl Rictor.
[Up to Source Code Repository]

MicroChess is a very famous game written by Peter Jennings in 1976. It was originally written for the MOS Technology KIM-1 but is easily ported and was used on other systems like the Rockwell AIM-65.

UCHESS.PDF (884k) - The original version can be downloaded here in Portable Document Format. It was provided by Cameron Kaiser's Secret Weapons of Commodore website. The original author, Peter Jennings, has given 6502.org permission to post it here.

UCHESS2.TXT (21k) - Daryl Rictor has adapted the program for use on computers with a 6551-based serial port, which is shown in the screenshot above. This new version may be downloaded here and is also presented below.

    ;***********************************************************************
    ;
    ;  MicroChess (c) 1996-2002 Peter Jennings, peterj@benlo.com
    ;
    ;***********************************************************************
    ; 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!
    ;
    ; modified by Daryl Rictor to work over a serial terminal connection, August 2002.
    ;
    ; 6551 I/O Port Addresses
    ;
    ACIADat	= 	$7F70
    ACIASta	=	$7F71
    ACIACmd	=	$7F72
    ACIACtl	=	$7F73
    ;
    ; page zero variables
    ;
    BOARD   =	$50
    BK      =	$60
    PIECE   =	$B0
    SQUARE  =	$B1
    SP2     =	$B2
    SP1     =	$B3
    INCHEK  =	$B4
    STATE   =	$B5
    MOVEN   =	$B6
    REV	=       $B7
    OMOVE   =	$DC
    WCAP0   =	$DD
    COUNT   =	$DE
    BCAP2   =	$DE
    WCAP2   =	$DF
    BCAP1   =	$E0
    WCAP1   =	$E1
    BCAP0   =	$E2
    MOB     =	$E3
    MAXC    =	$E4
    CC      =	$E5
    PCAP    =	$E6
    BMOB    =	$E3
    BMAXC   =	$E4
    BMCC    =	$E5 		; was BCC (TASS doesn't like it as a label)
    BMAXP   =	$E6
    XMAXC   =	$E8
    WMOB    =	$EB
    WMAXC   =	$EC
    WCC     =	$ED
    WMAXP   =	$EE
    PMOB    =	$EF
    PMAXC   =	$F0
    PCC     =	$F1
    PCP     =	$F2
    OLDKY   =	$F3
    BESTP   =	$FB
    BESTV   =	$FA
    BESTM   =	$F9
    DIS1    =	$FB
    DIS2    =	$FA
    DIS3    =	$F9
    temp    =       $FC
    ;
    ;
    ;
    		*=$1000			; load into RAM @ $1000-$15FF

    		LDA     #$00		; REVERSE TOGGLE
    		STA     REV
                    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	OLDKY		; KEY IN ACC  *** no need to debounce
    ;		BEQ	OUT		; (DEBOUNCE)
    ;		STA	OLDKY
    ;
    		CMP	#$43		; [C]
    		BNE	NOSET		; SET UP
    		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
    		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
    		JSR	GO
    CLDSP		STA	DIS1          	; DISPLAY
    		STA	DIS2         	; ACROSS
    		STA	DIS3          	; DISPLAY
    		BNE	CHESS
    ;
    NOGO		CMP	#$0D            ; [Enter]
    		BNE	NOMV          	; MOVE MAN
    		JSR	MOVE          	; AS ENTERED
    		JMP	DISP
    NOMV		CMP     #$41		; [Q] ***Added to allow game exit***
    		BEQ     DONE		; quit the game, exit back to system.
    		JMP	INPUT		; process move
    DONE		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        	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
    POUT25		LDA   	#$20		; ASCII space
    		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   	$FB
    		JSR   	syshexout	; PRINT 1 BYTE AS 2 HEX CHRS
            	LDA   	#$20
    		JSR   	syschout	; PRINT ONE ASCII CHR - SPACE
            	LDA   	$FA
    		JSR   	syshexout	; PRINT 1 BYTE AS 2 HEX CHRS
            	LDA   	#$20
    		JSR   	syschout	; PRINT ONE ASCII CHR - SPACE
            	LDA   	$F9
    		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

    Pout13		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
                	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         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       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       PHY                     ;  prints A hex nibble (low 4 bits)
                   AND   #$0F              ;
                   TAY                     ;
                   LDA   Hexdigdata,Y      ;
                   PLY                     ;
                   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
    		*= $1580
    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

    ;
    ;
    ; end of file

Last page update: October 21, 2002.