890 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			890 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
;***********************************************************************
 | 
						|
;
 | 
						|
;  Kim-1 MicroChess (c) 1976-2005 Peter Jennings, www.benlo.com 
 | 
						|
;
 | 
						|
;***********************************************************************
 | 
						|
 | 
						|
; All rights reserved.
 | 
						|
 | 
						|
; Redistribution and use in source and binary forms, with or without
 | 
						|
; modification, are permitted provided that the following conditions
 | 
						|
; are met:
 | 
						|
; 1. Redistributions of source code must retain the above copyright
 | 
						|
;    notice, this list of conditions and the following disclaimer.
 | 
						|
; 2. Redistributions in binary form must reproduce the above copyright
 | 
						|
;    notice, this list of conditions and the following disclaimer in the
 | 
						|
;    documentation and/or other materials provided with the distribution.
 | 
						|
; 3. The name of the author may not be used to endorse or promote products
 | 
						|
;    derived from this software without specific prior written permission.
 | 
						|
 | 
						|
; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR
 | 
						|
; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
						|
; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 | 
						|
; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 | 
						|
; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 | 
						|
; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
						|
; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
						|
; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
						|
; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 | 
						|
; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
						|
 | 
						|
;
 | 
						|
; modified by Daryl Rictor to work over a 
 | 
						|
; serial terminal connection, August 2002.
 | 
						|
;
 | 
						|
; Updated with corrections to earlier OCR errors by Bill Forster, August 2005.
 | 
						|
;
 | 
						|
   cpu 65c02
 | 
						|
   page 0,132
 | 
						|
;
 | 
						|
; 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	GNM          	; 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 STEP
 | 
						|
;		
 | 
						|
;
 | 
						|
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			;    -YES
 | 
						|
;		
 | 
						|
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 - ILLEGAL MOVE
 | 
						|
;       V - CAPTURE (LEGAL UNLESS IN CH)
 | 
						|
;       C - ILLEGAL 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
 | 
						|
		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	        LDX	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 WEIGHT
 | 
						|
		ADC	WCC          	; OF 0.25
 | 
						|
		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 0.5
 | 
						|
		SBC	BMAXC
 | 
						|
		LSR			; **************
 | 
						|
		CLC	
 | 
						|
		ADC	#$90
 | 
						|
		ADC	WCAP0       	; PARAMETERS
 | 
						|
		ADC	WCAP0       	; WITH WEIGHT
 | 
						|
		ADC	WCAP0       	; OF 1.0
 | 
						|
		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?
 | 
						|
		beq	pout25 		; white, print space
 | 
						|
		lda   	#"*"		; black, print *
 | 
						|
		db	$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 "-----...-----<crlf>"
 | 
						|
		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 <CRLF>
 | 
						|
		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       AND   #$0F              ;  prints A hex nibble (low 4 bits)
 | 
						|
               PHY
 | 
						|
               TAY                     ;
 | 
						|
               LDA   Hexdigdata,Y      ;
 | 
						|
               PLY
 | 
						|
               jmp   syschout          ;
 | 
						|
 | 
						|
Hexdigdata	asc	"0123456789ABCDEF"
 | 
						|
banner		asc	"MicroChess (c) 1996-2005 Peter Jennings, www.benlo.com"
 | 
						|
		db	$0d, $0a, $00
 | 
						|
cpl		asc	"WWWWWWWWWWWWWWWWBBBBBBBBBBBBBBBBWWWWWWWWWWWWWWWW"
 | 
						|
cph		asc	"KQRRBBNNPPPPPPPPKQRRBBNNPPPPPPPP"
 | 
						|
		db	$00
 | 
						|
;
 | 
						|
; end of added code
 | 
						|
;
 | 
						|
; BLOCK DATA
 | 
						|
		*= $1580
 | 
						|
SETW		db 	$03, $04, $00, $07, $02, $05, $01, $06
 | 
						|
        	db 	$10, $17, $11, $16, $12, $15, $14, $13
 | 
						|
        	db 	$73, $74, $70, $77, $72, $75, $71, $76
 | 
						|
	 	db	$60, $67, $61, $66, $62, $65, $64, $63
 | 
						|
 | 
						|
MOVEX   	db 	$00, $F0, $FF, $01, $10, $11, $0F, $EF, $F1
 | 
						|
		db	$DF, $E1, $EE, $F2, $12, $0E, $1F, $21
 | 
						|
 | 
						|
POINTS  	db 	$0B, $0A, $06, $06, $04, $04, $04, $04
 | 
						|
		db 	$02, $02, $02, $02, $02, $02, $02, $02
 | 
						|
 | 
						|
OPNING  	db 	$99, $25, $0B, $25, $01, $00, $33, $25
 | 
						|
		db	$07, $36, $34, $0D, $34, $34, $0E, $52
 | 
						|
        	db 	$25, $0D, $45, $35, $04, $55, $22, $06
 | 
						|
		db	$43, $33, $0F, $CC
 | 
						|
 | 
						|
;
 | 
						|
;
 | 
						|
; end of file
 | 
						|
;
 |