748 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
			
		
		
	
	
			748 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
;***********************************************************************
 | 
						|
;
 | 
						|
;  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.
 | 
						|
;
 | 
						|
; Adapted for Gigatron TTL by Marcel van Kervinck, July 2019
 | 
						|
;  DONE Adapt ZP and place stacks
 | 
						|
;  DONE Change default to blitz or super blitz
 | 
						|
;
 | 
						|
  ; 02F2 018B
 | 
						|
LEVEL = $00FF   ; Super Blitz   3 seconds
 | 
						|
;LEVEL = $00FB   ; Blitz         10 seconds
 | 
						|
;LEVEL = $08FB   ; Normal        100 seconds
 | 
						|
 | 
						|
;
 | 
						|
;
 | 
						|
; page zero variables
 | 
						|
;
 | 
						|
                    ; (marcelk) Original has code at 0.4F        80 bytes
 | 
						|
                    ;           Gigatron 00.2F System
 | 
						|
                    ;           Gigatron 30.3F Wozmon and KBD/DSP
 | 
						|
BOARD   =       $50 ; (marcelk) 50.5F computer pieces            16 bytes
 | 
						|
BK      =       $60 ; (marcelk) 60.6F opponent pieces.           16 bytes
 | 
						|
                    ; (marcelk) 70.AF original SETW,MOVEX,POINTS 16+1+47 bytes
 | 
						|
 | 
						|
PIECE   = $70;  $B0
 | 
						|
SQUARE  = $F3;  $B1
 | 
						|
                    ; Original has code at 100.1AE
 | 
						|
SP2     = $F4;  $B2 ; Initially C8, so at most 26 bytes -> 81.9F = 31 bytes
 | 
						|
SP1     = $F5;  $B3 ; Initially FF, so at most 55 bytes -> A0.DB = 60 bytes
 | 
						|
INCHEK  = $F6;  $B4
 | 
						|
STATE   = $F7;  $B5
 | 
						|
MOVEN   = $F8;  $B6
 | 
						|
                    ; (marcelk) B7.BF Not used in original        9 bytes
 | 
						|
                    ; (marcelk) C0.DB Original openings          28 bytes
 | 
						|
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 ; (marcelk) No need to debounce              1 byte
 | 
						|
                    ; (marcelk) F4.F8 Not used in original       5 bytes
 | 
						|
BESTP   =       $FB
 | 
						|
BESTV   =       $FA
 | 
						|
BESTM   =       $F9
 | 
						|
DIS1    =       $FB
 | 
						|
DIS2    =       $FA
 | 
						|
DIS3    =       $F9
 | 
						|
 | 
						|
 | 
						|
;
 | 
						|
; page one usage
 | 
						|
;
 | 
						|
 | 
						|
 | 
						|
 | 
						|
;
 | 
						|
;
 | 
						|
;
 | 
						|
                *=$0220 ; 200.27f is wozmon input buffer
 | 
						|
 | 
						|
CHESS           CLD                     ; INITIALIZE
 | 
						|
                LDX     #$DB ;was #$FF  ; TWO STACKS
 | 
						|
                TXS
 | 
						|
                LDX     #$9F ;was #$C8
 | 
						|
                STX     SP2
 | 
						|
;
 | 
						|
;       ROUTINES TO LIGHT LED
 | 
						|
;       DISPLAY AND GET KEY
 | 
						|
;       FROM KEYBOARD
 | 
						|
;
 | 
						|
OUT
 | 
						|
                ; Start Gigatron/Apple1 I/O
 | 
						|
                lda     #13+128         ; CR
 | 
						|
                brk
 | 
						|
                ldx     #2              ; Print KIM leds
 | 
						|
next            lda     DIS3,X
 | 
						|
                jsr     $FFDC           ; PRBYTE (WozMon)
 | 
						|
                dex
 | 
						|
                bpl     next
 | 
						|
                lda     #" "+128        ; Space
 | 
						|
                brk
 | 
						|
                lda     #"?"+128        ; Prompt
 | 
						|
                brk
 | 
						|
                lda #0                  ; Input from system
 | 
						|
                brk
 | 
						|
                pha
 | 
						|
                ora     #128
 | 
						|
                brk                     ; Echo
 | 
						|
                pla
 | 
						|
                AND     #$4F            ; MASK 0-7, AND ALPHA'S
 | 
						|
                ; End Gigatron/Apple1 I/O
 | 
						|
 | 
						|
                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
 | 
						|
                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     $FF1F           ; *** MUST set this to YOUR OS starting address [Gigatron] RESET->GETLINE (Apple1)
 | 
						|
;
 | 
						|
;       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     #<LEVEL         ; 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     #>LEVEL         ; 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     #"."+128        ; print ... instead of flashing disp
 | 
						|
                brk
 | 
						|
                rts
 | 
						|
;
 | 
						|
;       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
 | 
						|
 | 
						|
; BLOCK DATA
 | 
						|
 | 
						|
*=$7A0 ; Tables fit nicely in Gigatron screen memory
 | 
						|
 | 
						|
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   $63 ; is SETW[31]
 | 
						|
                .byte   $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
 | 
						|
;
 | 
						|
 |