; CHECKMATE CART
; CHECKMATE SOURCE - FROM THE ASTROCADE NUTTING MANUAL
; This version of Checkmate has been modified to run as 
; a cartridge (area $2000)
; Ver. 1.0 - 4-2-2003
; Retyped and modified to run as a cart by Adam Trionfo
INCLUDE "HVGLIB.H" ; zmac -i -m -o checkcrt.bin -x checkcrt.lst checkcrt.asm
        ;*****************************
        ;* H V G   C H E C K M A T E *
        ;*****************************
        ;
        ;
        ; M A C R O S
        ;
DEF4X   MACRO A4X, B4X, C4X, D4X
        DB   A4X 
        DB   B4X 
        DB   C4X 
        DB   D4X 
        ENDM 
WRECK   MACRO
        DW   (9 SHL 8)+32
        DB   0000B
        ENDM
        ;
        ;
        ; E Q U A T E S
        ;
OLDWAY  EQU 1-NWHDWR      ;1=DO OLD WAY 0=DO NEW WAY
NEWWAY  EQU 1-OLDWAY      ;OPPOSITE OF OLDWAY
        ; VARIOUS 'EQU'S
RLMOVE  EQU  1100B        ;RIGHT AND LEFT MOVES
UDMOVE  EQU  0011B        ;UP AND DOWN MOVES
NOBIT   EQU  2            ;# OF GAME BITS
NPBIT   EQU  3            ;# PLAYERS BIT
ANIMAX  EQU  3            ;MAX # TICKS PER ANIMATION FRAM
XMAX    EQU  (BYTEPL-2)*4 ;MAX X COORD - CHANGED TO MATCH ROOM
YLINES  EQU  21           ;# VERT BLOCKS
LOWY    EQU  11           ;LOWEST Y COORD
YMAX    EQU  ((YLINES-1)*4)+LOWY ;MAX Y COORD
LOWX    EQU  0            ;LOWEST X COORD
AMOVE   EQU  8H           ;AN ARBITRARY MOVE
MUSVOL  EQU  09H          ;MUSIC VOLUME
TDOPT   EQU  100100B      ;TIME DISPLAY OPTIONS
CDOPT   EQU  01000100B    ;COUNT DOWN OPT
WRITOR  EQU  010000B      ;WRITE WITH MAGIC OR
        ; PLAYER PACKER OFFSETS
LASTSW  EQU  0            ;LAST SWITCH SETTING
LASTMV  EQU  1            ;LAST ACTUAL MOVE
CURSW   EQU  2            ;CURRENT SWITCH SETTING
AROT    EQU  3            ;ARROW ROTATION SETTING
ARRX    EQU  4            ;ARROW X COORD
ARRY    EQU  5            ;ARROW Y COORD
PSTAT   EQU  6            ;PLAYER STATUS
        ; PLAYER STATUS MASKS
ACTIVE  EQU  $80
HUMAN   EQU  $40
ACTBIT  EQU  7            ;1=ACTIVE 0=DEAD
HUMBIT  EQU  6            ;1=HUMAN 0=COMPUTER
        ;SCREEN TABS
XTAB1   EQU  ((BYTEPL/4)*4)
XTAB2   EQU  XTAB1*2
XTAB3   EQU  XTAB1*3
YTAB    EQU  (((YLINES-1)/4)*4)
YTAB1   EQU  YTAB+LOWY
YTAB2   EQU  (2*YTAB)+LOWY
YTAB3   EQU  (3*YTAB)+LOWY
        ;OFFSETS FOR EACH PLAYERS ROM DATA
;NOTE0   EQU  0            ;EACH DIRECTIONS NOTES
;NOTE1   EQU  1 ; THESE FOUR LINES COMMENTED OUT BECAUSE
;NOTE2   EQU  2 ; THEY INTERFERE WITH BALLYEQU.H AND ARE
;NOTE3   EQU  3 ; NOT USED ANYWAY- ADAM, 2-16-2002
PPATL   EQU  4            ;PLAYER PAT ADDR LOW
PPATH   EQU  5            ;PLAYER PAT ADDR HIGH
PCDOP   EQU  6            ;PLAYER CHAR DISP OPT
PSPOSX  EQU  7            ;X COORD OF PLAYER SCORE
PSPOSY  EQU  8            ;Y COORD OF PLAYER SCORE
PSDOP   EQU  9            ;PLAYER SCORE DISP OPT
        ;MORE EQU'S
FORCEM  EQU  $F6          ;VAL TO FORCE RANDOM MOVE
WIDTH   EQU  $4           ;# PIXELS WIDE OF PLAYER PAT
HEIGHT  EQU  $4           ;# PIXELS HIGH OF PLAYER PAT
ALLBYT  EQU  (YLINES*4)*BYTEPL ;ALL BYTES ON SCREEN  
STARTS  EQU  (LOWY*BYTEPL)+NORMEM ; LOWEST ADDR OF PLAY FI
PATXSZ  EQU  1            ;#BYTES WIDE OF PLAYER PATTERN
PATYSZ  EQU  4            ;#BYTES HIGH OF PLAYER PATTERN
PATDIM  EQU  (PATXSZ SHL 8) OR PATYSZ ;PATTERNS DIMENSIONS
JUSJOY  EQU  $F           ;ONLY JOY STICK BITS
CBLEN   EQU  8            ;COLOR BLOCK LENGTH
SBLEN   EQU  8            ;SOUND BLOCK LENGTH
WPONOF  EQU  0
WPOPT   EQU  1
WPPAL   EQU  2
WPPAH   EQU  3
WPXSIZ  EQU  5
WPYSIZ  EQU  4
        ;
        ;
        ;
;       ORG  NORMEM+0F96H ;SHOULD BE EQUAL TO RSTART
        ;UNCLEARED RAM - THESE ARE NOW EQUS, NOT DEFS
UNCRAM  EQU  $4F96
CURSCR  EQU  $4F96           ;ALL CURRENT SCORES
        ;CLEARED
CNOPL   EQU  $4FA2           ;CURRENT # PLAYERS
PLIX    EQU  $4FA3           ;WHO IS CURRENT PLAYER
CNOHUM  EQU  $4FA4           ;CURRENT # HUMANS
TARRX   EQU  $4FA5           ;TEMP ARROW X COORD
TARRY   EQU  $4FA6           ;TEMP ARROW X COORD
RMASK   EQU  $4FA7           ;ROTATE MASK
PPACKS:                      ;START OF PLAYER PACKETS
PLAY0   EQU  $4FA8
PLAY1   EQU  $4FAF
PLAY2   EQU  $4FB6
PLAY3   EQU  $4FBD
ENDRAM  EQU  $4FC4
RSTART  EQU  BEGRAM-(ENDRAM-UNCRAM)+1 ; SHOULD BE RAM STA

        ORG   FIRSTC      ; FIRST BYTE OF CARTRIDGE

  ; ALL CARTRIDGES THAT USE THE MENU MUST HAVE $55 AS THE
  ; FIRST BYTE, SEE BALLY ROM SOURCE $0CDE FOR CHECK OF
  ; THIS BYTE.
  
        DB    $55         ; BALLY SYSTEM SENTINEL
  
  ; O.S. MENU DATA STRUCTURE
  
        DW    MENUST      ; NEXT MENU LINK
        DW    CHKSTR      ; 'CHECKMATE' MENU TEXT
        DW    ONETIM      ; JUMP HERE IF ITEM SELECTED
  
  ; START OF DOGPATCH MAIN PROGRAM


ONETIM:
        ;ONE TIME ONLY HOUSEKEEPING
        LD   SP,UNCRAM
        SYSSUK GETPAR
        DW   NOGAME
        DB   $82
        DW   CT7
        SYSSUK GETPAR
        DW   NOPLAY
        DB   1
        DW   NUMPLY
        SYSSUK FILL
        DW   CURSCR
        DW   12
        DB   0
FIREIT: 
        ;REENTRY POINT FROM END OF GAME
        DI
        LD   SP,UNCRAM
        SYSTEM INTPC
        ;OUPUT COLOR BLOCK
        DO   COLSET
        DW   CBLOCK
        DO   EMUSIC
        ; CLEAR JOYSTICKS
        DO   FILL
        DW   OSW0
        DW   4
        DB   0
        ;CLEAR ALL RAM DATA
        DO   FILL
        DW   CNOPL
        DW   (PLAY3+PSTAT)-CNOPL+1
        DB   0
        DO   SETOUT
        DB   ((YLINES*4)+LOWY)*2  ; VER BLK
        DB   67H+0         ; HOR COL BND
        DB   08H           ; INTER MODE
        ; CLEAR SCORE BLOCKS
        DO   RECTAN
        DW   0
        DW   (11 SHL 8)+160
        DB   01010101B
        DO   RECTAN
        DW   $007A
        ; WRECK - CHANGED TO MATCH ROM
        DW   $091E
        DB   0000B 
        DO   RECTAN
        DW   $0057
        ; WRECK - CHANGED TO MATCH ROM
        DW   $091D
        DB   0000B 
        DO   RECTAN
        DW   $002B
        ; WRECK - CHANGED TO MATCH ROM
        DW   $091D
        DB   0000B 
        DO   RECTAN
        DW   $0004
        ; WRECK - CHANGED TO MATCH ROM
        DW   $0921
        DB   0000B 
        DO   ACTINT
        EXIT
        ; INITIALIZE STARTING ADDRESS OF ARROWS
        LD   HL,(YTAB2 SHL 8)+XTAB1
        LD   (PLAY0+ARRX),HL
        LD   HL,(YTAB2 SHL 8)+XTAB3
        LD   (PLAY1+ARRX),HL
        LD   HL,(YTAB1 SHL 8)+XTAB2
        LD   (PLAY2+ARRX),HL
        LD   HL,(YTAB3 SHL 8)+XTAB2
        LD   (PLAY3+ARRX),HL
        ; CLEAR FIELD
        CALL CLEARF
        ; DISPLAY # GAMES
        LD   IX,FNTSML
        SYSSUK DISNUM
        DB   76
        DB   2
        DB   TDOPT
        DB   42H
        DW   CT7
DONTD:
        ; GET # HUMANS
        LD   A,(NUMPLY)
        CP   5
        JR   C,$+(GOTNPL-$)
        LD   A,4
GOTNPL:
        LD   (CNOHUM),A
        ; GET # PLAYERS
        ;  IF HUMANS=1 OR 0 OR > 4 THEN PLAYERS=4 ELSE PLA
        CP   2
        JR   C,$+(FPLAY-$)
        CP   5
        JR   C,$+(ALLHUM-$)
FPLAY:  LD   A,4
ALLHUM: LD   (CNOPL),A
        ; INITIALIZE THE PLAYER PACKETS
        ; B=CURR # HUMANS
        ; C=CURR # PLAYERS
        ; D=THIS PLAYER #
INTIPP: LD   A,(CNOHUM)
        LD   B,A
        LD   A,(CNOPL)
        LD   C,A
        LD   D,0
GTPLIX: LD   A,D
        CALL LDPLIX
        PUSH BC
        PUSH DE
        LD   A,D
        ADD  A,$31        ;SETUP ASCII LITERAL
        LD   E,(IX+ARRX)
        LD   D,(IX+ARRY)  ;??? IS THIS RIGHT?
        DEC  E
        DEC  E
        LD   C,(IY+PCDOP)
        SYSTEM CHRDIS     ;DISPLAY PATTERN # ON FIELD
        LD   E,(IY+PSPOSX)
        LD   D,(IY+PSPOSY)
        PUSH DE
        SYSTEM CHRDIS     ;DISPLAY# ON SCORE BLOCK
        POP  DE
        LD   A,E
        ADD  A,6
        LD   E,A 
        INC  D
        INC  D
        LD   BC,(PATYSZ SHL 8) + PATXSZ
        LD   H,(IY+PPATH)
        LD   L,(IY+PPATL)
        LD   A,00010000B
        SYSTEM WRIT ;WRIT PLAYER PAT IN SCORE BLOCK
        POP  DE
        PUSH DE
        PUSH IX
        LD   A,D
        LD   B,0
        LD   C,D
        LD   HL,CURSCR
        ADD  HL,BC
        ADD  HL,BC
        ADD  HL,BC
        CALL DISPSC       ; DISPLAY SCORES
        POP  IX
        POP  DE
        POP  BC
        XOR  A
        OR   B
        JR   Z,$+(NOTHUM-$)
        LD   A,ACTIVE+HUMAN
        LD   (IX+PSTAT),A
        DEC  B
        JR   $+(CKNOPL-$)
CKSUM3: DB   0
NOTHUM: LD   A,ACTIVE
        LD   (IX+PSTAT),A
CKNOPL: INC  D
        DEC  C
        XOR  A
        OR   C
        JR   NZ,$+(GTPLIX-$)
        LD   A,3
CDOWNL:
        PUSH AF
        SYSSUK PAWS
        DB   5
        LD   (PLIX),A
        CALL UPMUZK       ; MAKE SOUND FOR COUNTDOWN
        POP  AF
        PUSH AF
        ADD  A,30H
        XYRELL DE,(XTAB2-4),(YTAB2-4)
        LD   C,CDOPT
        SYSTEM CHRDIS   ; DISPLAY COUNTDOWN #
        SYSSUK PAWS
        DB   40
        SYSTEM EMUSIC
        POP  AF
        DEC  A
        JR   NZ,$+(CDOWNL-$)
        CALL CLEARF
        ; INT TICK COUNT
        CALL TICKIT
        XOR  A
        LD   (CNT),A
LOOPY:
        SYSSUK SENTRY
        DW   ALKEYS
        SYSSUK DOIT
        DW   THETBL
        JR   $+(LOOPY-$)
THETBL: RC   SCT0,ACTION,0
        RC   SJ0,MOVJOY,0
        RC   SJ1,MOVJOY,0
        RC   SJ2,MOVJOY,0
        RC   SJ3,MOVJOY,0
        RC   SKYD,CALPIZ,ENDX
        RET     NZ         ; THIS LINE IS NOT IN THE
                           ; NUTTING MANUAL-- IT'S
                           ; ADDED TO MATCH THE
                           ; ACTUAL ROM.
ACTION: 
        CALL TICKIT
        ; INCREMENT THE CURRENT PLAYER INDEX BY 1 UNTIL
        ; AN ACTIVE PLAYER IS FOUND THEN UPDATE HIM
INCIX:  LD   A,(PLIX)
        INC  A
        AND  03H
        LD   (PLIX),A     ; CURR PLAYER IX<-CURR PL IX+1 M
        CALL LDPLIX
        BIT  ACTBIT,(IX+PSTAT) ; TEST FOR ACTIVE PLAYER
        JR   Z,$+(INCIX-$)
        JP   MOVEIT            ; THE MAJOR EVENT
MOVJOY:
        SUB  SJ0               ; TAKE OFF WHATEVER
        SRL  A                 ; DIVIDE BY 2
        JP   STALL
CALPIZ:
        CALL TICKIT
        SYSTEM PIZBRK
        RET
UPMUZK: LD   A,(PLIX)
        CALL LDPLIY
        LD   A,(IX+AROT)
        LD   B,3
TSTBIT:
        RRCA
        JR   C,$+(GOTBIT-$)
        DJNZ $+(TSTBIT-$)
GOTBIT:
        LD   C,B
        LD   B,0
        ADD  IY,BC
        LD   A,(IY+0)
        OUT  (TONEC),A
        LD   A,MUSVOL
        OUT  (VOLC),A
        LD   A,OA4
        OUT  (TONMO),A
        RET
CLEARF:
        ; CLEAR FIELD
        SYSSUK FILL
        DW   STARTS
        DW   ALLBYT
        DB   0
        RET
MOVEIT: 
        ; THIS ROUTINE UPDATES A PLAYER'S POSITION
        ; INPUT PARAS ARE: IX=POINTER TO PLAYERS PACKET
        ; DURING ROUTINE B=CURRENT SWITCH C=LAST SWITCH
        LD   C,(IX+LASTSW)
        LD   B,(IX+CURSW)
        BIT  HUMBIT,(IX+PSTAT)
        JR   NZ,$+(NOCUR-$)   ; IF NOT HUMAN
ZSW:    XOR  A            ;  CLEAR A
        LD   B,A          ; CLEAR CURRENT SWITCH
        LD   C,A          ; CLEAR LAST SWITCH ENDIF
NOCUR:  LD   A,B          ; IF CURR SW = 0
        OR   A
        JR   NZ,$+(RANTST-$)
        LD   B,C           ; THEN CURR SW<-LAST SW ENDIF
RANTST: LD   (IX+LASTSW),B ; SAVE LAST SW
        LD   A,B           ; IF CURR SW=0
        OR   A
        JR   NZ,$+(GOTSW-$)
        LD   C,0           ; LAST SW<-0
        CALL RANMOV        ; GET RANDOM MOVE ENDIF
GOTSW:
        LD   A,(IX+LASTMV) ; GET LAST MOVE
        CALL MOVTST
        JR   Z,$+(GOTMOV-$)
                           ; ANY MOVE AND CURR SW
        CALL MOVANY
        JR   Z,$+(GOTMOV-$)
        LD   B,C           ; TRY LAST SW
                           ; ANY MOVE
        CALL MOVANY
        JR   Z,$+(GOTMOV-$)
        LD   B,(IX+LASTMV)  ; TRY LAST MOVE
                            ; ANY MOVE
        CALL MOVANY
        JR   NZ,$+(CRASH-$)
GOTMOV:
        ; A LEGIT MOVE HAS BEEN FOUND SO UPDATE THE GUY
        LD   (IX+LASTMV),A ; SAVE ACTUAL MOVE FOR LATER
        LD   (IX+AROT),A  ;ARROW ROTATION AMOUNT<- THE MOV
        LD   D,(IX+ARRY)
        LD   E,(IX+ARRX)
        CALL ERASE
        LD   H,(IY+PPATH)
        LD   L,(IY+PPATL)
        LD   BC,(PATYSZ SHL 8) + PATXSZ
        LD   A,WRITOR
        SYSTEM WRIT       ; WRITE PLAYER PATTERN OVER ARRO
        LD   A,(TARRX)
        LD   (IX+ARRX),A  ;SAVE NEW ARROW X
        LD   A,(TARRY)
        LD   (IX+ARRY),A  ;SAVE NEW ARROW Y
        CALL ANIARR       ;ANIMATE THE ARROW
        JP   UPMUZK
ERASE:
        PUSH DE
        SYSSUK RELAB1
        DB   0
        EX   DE,HL
        LD   B,0
        LD   DE,[(PATYSZ SHL 8) + PATXSZ]
        SYSTEM BLANK
        POP  DE
        RET
CRASH:
        ; A PLAYER HAS CRASHED.  DESTROY HIS ARROW AND
        ; ELIMINATE HIM FROM THE GAME.
        LD   BC,EXPATS
        LD   DE,EXCOLS    ;DE<-EXPLODE COLOR TABLE ADDR
        LD   A,5
        LD   HL,EXPSND
EXLOOP: PUSH AF           ;PUSH LOOP COUNT
        PUSH BC           ;PUSH EXT PAT ADDRESS
        PUSH DE           ;PUSH EXPLODE COLOR TABLE ADDR
        PUSH HL           ;PUSH EXPLODE SOUND ADDRESS
        LD   A,(DE)       ;A<-EXPLODE COLOR
        OUT  (COL0L),A     ; CHANGED TO MATCH ROM
        PUSH BC
        LD   D,(IX+ARRY)
        LD   E,(IX+ARRX)
        CALL ERASE
        POP  HL            ;PATTERN ADDRESS
        LD   A,WRITOR
        LD   BC,(PATYSZ SHL 8) + PATXSZ
        SYSTEM WRIT        ;WRIT EXPLOSION
        SYSSUK PAWS
        DB   7
        POP  HL            ;GET EXPLODE SOUND ADDR
        LD   BC,(SBLEN SHL 8) + SNDBX
        OTIR
        POP  DE
        POP  BC
        POP  AF
        DEC  A
        JR   Z,$+(EXPFIN-$)    ;LOOP COUNT EXPIRED
        INC  DE            ;INC TO NEXT COLOR
        INC  BC            ;BUMP UP TO NEXT PAT ADDR
        INC  BC
        INC  BC
        INC  BC
        JR   $+(EXLOOP-$)
EXPFIN:
        LD   D,(IY+PPATH)
        LD   E,(IY+PPATL)  ;DE<-PLAYER PAT ADDR
        LD   IY,0
        ADD  IY,DE         ;IY<-PLAYER PAT ADDR
        LD   DE,4 SHL 8 + 0  ;D<-LOOP COUNT
STOMP:  LD   A,(IY+0)      ;A<-BYTE OF PLAYER PATTERN
        LD   HL,STARTS
        LD   BC,ALLBYT
STLOOP: CPIR
        JR   NZ,$+(RESTOM-$)
        INC  BC
        DEC  HL
        LD   (HL),E
        JR   $+(STLOOP-$)
RESTOM: INC  IY
        DEC  D
        JR   NZ,$+(STOMP-$)
        BIT  HUMBIT,(IX+PSTAT) ;
        JR   Z,$+(KILLST-$)    ;IF HUMAN
        LD   HL,CNOHUM
        DEC  (HL)          ;DEC CURRENT # HUMANS END IF
KILLST: RES  ACTBIT,(IX+PSTAT) ;KILL STATUS
        ; INC ALL ACTIVE PLAYERS SCORES
        LD   C,4
BUMPEM:
        DEC  C
        LD   A,C
        CALL LDPLIX
        BIT  ACTBIT,(IX+PSTAT)
        JR   Z,$+(BUMPCK-$)
        LD   B,0
        PUSH BC
        LD   A,C
        LD   HL,CURSCR
        ADD  HL,BC
        ADD  HL,BC
        ADD  HL,BC
        SCF
        CALL DISPSC
        POP  BC
        SYSTEM INCSCR
        LD   A,C
        PUSH BC
        OR   A
        CALL DISPSC
        POP  BC
BUMPCK:
        SYSSUK PAWS
        DB   30
        LD   A,C
        OR   A
        JR   NZ,$+(BUMPEM-$)
        ;DEC CURR # PLAYERS
        ;IF CURR # PLAYERS LEQ  GO TO END OF GAME
        LD   HL,CNOPL 
        DEC  (HL)
        DEC  (HL)
        JR   Z,$+(ENDCHK-$)
        INC  (HL)
        RET
ENDCHK:
        LD   A,(CT7)
        DEC  A
        DAA
        LD   (CT7),A
        JP   NZ,FIREIT
        SYSTEM QUIT
DISPSC:
        ;DISPLAY SCORE
        ;A=PLAYER #
        ;HL->LAST BYTE OF SCORE
        LD   C,(IY+PSDOP)
        JR   NC,$+(NOTXOR-$)
        RES  MROR,C
        SET  MRXOR,C
NOTXOR:
        LD   E,(IY+PSPOSX)
        LD   D,(IY+PSPOSY)
        LD   A,12
        ADD  A,E
        LD   E,A
        INC  D
        LD   B,$43
        LD   IX,FNTSML
        SYSTEM DISNUM
        RET
ANIARR:
        ;ANIMATE THE ARROW
        ;INPUT AND OUTPUT IS IX WHO STAYS THE SAME
        ;DESTROYS ALL OTHER REGISTERS
        BIT  ACTBIT,(IX+PSTAT)
        RET  Z             ;EXIT IF NOT ACTIVE
        LD   A,(IX+AROT)
        CALL GETROT        ;HL<-ARROW PAT ADDR
        LD   D,(IX+ARRY)
        LD   E,(IX+ARRX)
        PUSH HL
        CALL ERASE
        POP  HL
        LD   BC,(PATYSZ SHL 8) + PATXSZ
        LD   A,WRITOR
        SYSTEM WRIT
        RET
STALL: 
        ;THIS ROUTINE TAKES CARE OF ARROW ANIMATION
        ;AND SHOWING A PLAYER HIS CURRENT JOYSTICK POSIT
        ;A=WHICH PLAYER
        ;B=JOYSTICK BITS
        CALL LDPLIX        ;IX<-ADDR OF PLAYER PACKET
        XOR  A
        OR   B
        JR   NZ,$+(STORIT-$)
        LD   A,(IX+CURSW)
STORIT: LD   (IX+CURSW),A
        XOR  (IX+LASTMV)   ;A<-DIFFERENCE FROM LAST MOVE
        JR   Z,$+(GETLM-$) ;IF DIFFERENCE=0 USE LAST MOVE
        XOR  RLMOVE
        JR   Z,$+(GETLM-$)
        XOR  RLMOVE
        XOR  UDMOVE
        JR   Z,$+(GETLM-$)
        XOR  UDMOVE
HUMCHK: BIT  HUMBIT,(IX+PSTAT)
        JR   NZ,$+(GOTIT-$)    ;IF HUMAN WE'VE GOT IT
GETLM   LD   A,(IX+LASTMV) ;GET LAST MOVE
GOTIT:  LD   (IX+AROT),A   ;STORE ARROW ROTATION
        JR   $+(ANIARR-$)
TICKIT:
        ;TICK COUNT<-(8-CURR # PLAYERS)
        LD   A,(CNOHUM)
        OR   A
        LD   A,2
        JR   Z,$+(STICK-$)
        LD   HL,CNOPL
        LD   A,8
        SUB  (HL)
STICK:  LD   (CT0),A
        RET
LDPLIX:
LDPLIY:
        ;LOAD IY WITH POINTER TO CURR PLAYER ROM DATA
        ;LOAD IX WITH A POINTER TO CURRENT PLAYER PACKET
        ;A=PLAYER# MUST BE GEQ 0 $ LEQ 3
        PUSH DE
        PUSH HL
        SYSSUK INDEXW
        DW   ROMTBL
        PUSH DE
        POP  IY
        SYSSUK INDEXW
        DW   RAMTBL
        PUSH DE
        POP  IX
        POP  HL
        POP  DE
        RET
ROMTBL: DW   PLROM0
        DW   PLROM1
        DW   PLROM2
        DW   PLROM3
RAMTBL: DW   PLAY0
        DW   PLAY1
        DW   PLAY2
        DW   PLAY3
RANMOV:
        ;GENERATE A RANDOM MOVE FOR THE PLAYER PACKET POI
        ;INPUT AND OUTPUT:
        ;B=CURRENT SWITCH C=LAST SWITCH
        SYSSUK(RANGED)
        DB   32
        OR   A             ;TIME TO CHANGE DIRECTION?
        JR   Z,$+(NEWMOV-$)
        LD   B,(IX+LASTMV) ;USE LAST MOVE
        LD   A,B
        CALL MOVTST
        RET  Z             ;LAST MOVE IS GOOD ENOUGH
NEWMOV: SYSSUK RANGED
        DB   4
        LD   B,A
        INC  B
        LD   A,$80
SHFTIT: RLCA
        DJNZ $+(SHFTIT-$)
        LD   B,A
RANFIN: LD   A,$8
        CALL MOVTST
        JR   NZ,$+(ANYMOV-$)
        LD   B,A
        RET
ANYMOV: LD   B,$F          ;TRY ALL MOVES
        LD   A,$8
        CALL MOVTST
        LD   B,A
        RET
MOVANY:
        LD   A,AMOVE
MOVTST:
        ;TEST THE NEW MOVE FOR VALIDITY
        ;THE INPUTS AND OUTPUTS:
        ;B=A SET ??? MOVES TO BE TESTED (IS UNCHANGED)
        ;C=UNCHANGED
        ;A=FIRST MOVE TO TEST,VALUE OF GOOD MOVE ON OUTPU
        ;DE,HL=RETURNED UNCHANGED
        ;D=# ROTATES
        ;Z FLAG=Z IF GOOD MOVE FOUND(A CONTAINS FIRST GOO
        ;Z FLAG=??? IF NO GOOD MOVES FOUND(IN B)
        PUSH DE
        LD   D,8           ;INIT # ROTATES
ROTMSK: RRCA               ;ROTATE TO NEXT MOVE
        LD   E,A
        AND  B
        CALL CHKMOV        ;CHECK MOVE
        LD   A,E
        JR   Z,$+(MOVEXT-$) ;FOUND ONE
        DEC  D             ;DEC # ROTATES
        JR   NZ,$+(ROTMSK-$)
        SCF                ;NO GOOD MOVES
        RL   D             ;SET Z FLAG=NZ
MOVEXT: POP  DE
        RET
CHKMOV: 
        ;CHECK THE MOVE IN A FOR BEING UNOCCUPIED
        ;INPUT AND OUTPUT:
        ;A=UP, DOWN, RIGHT OR LEFT BIT(RETURN UNCHANGED)
        ;Z FLAG=Z IF MOVE IN A IS TO AN EMPTY POSITION
        ;Z FLAG=NZ IF MOVE IN A IS BAD
        ;BC,DE,HL RETURNED UNTOUCHED
        ;IX=POINTER TO CURRENT PLAYER PACKET
        ;LOCAL TO THIS ROUTINE:
        ;   D=TEMP X COORD OF ARROW
        ;   E=TEMP Y COORD OF ARROW
        PUSH BC
        PUSH DE
        PUSH HL
        PUSH AF
        LD   D,(IX+ARRX)   ;GET X COORD OF ARROW
        LD   E,(IX+ARRY)   ;GET Y COORD OF ARROW
TLEFT:  BIT  CHLEFT,A
        JR   Z,$+(TRIGHT-$)
        LD   A,D           ;GET A LEFT MOVE
        CP   LOWX
        JR   Z,$+(BADMOV-$) ;ALREADY AT LOWEST X
        SUB  WIDTH         ;DEC TEMP X BY 1 POSITION
        LD   D,A
        JR   $+(LOOKSQ-$)
TRIGHT: BIT  CHRIGH,A
        JR   Z,$+(TUP-$)
        LD   A,D           ;GOT A RIGHT MOVE
        CP   XMAX
        JR   NC,$+(BADMOV-$)   ;ALREADY GEQ MAX X
        ADD  A,WIDTH
        LD   D,A
        JR   $+(LOOKSQ-$)
TUP:    BIT  CHUP,A
        JR   Z,$+(TDOWN-$)
        LD   A,E           ;GOT AN UP MOVE
        CP   LOWY
        JR   Z,$+(BADMOV-$) ;ALREADY AT LOWEST Y
        SUB  HEIGHT        ;DEC TEMP Y BY 1 POSITION
        LD   E,A
        JR   $+(LOOKSQ-$)
TDOWN:  BIT  CHDOWN,A
        JR   Z,$+(BADMOV-$)
        LD   A,E           ;GOT A DOWN MOVE
        CP   YMAX
        JR   Z,$+(BADMOV-$)  ;ALREADY AT HIGHEST Y
        ADD  A,HEIGHT      ;INC TEMP Y BY 1 POSITION
        LD   E,A
        JR   $+(LOOKSQ-$)
BADMOV: POP  AF
        SCF
        RL   D             ;SET ??? FLAG = NZ
        JR   $+(MOVEND-$)
LOOKSQ:
        ;SEE IF THE NEW SQUARE IS OCCUPIED
        PUSH DE
        PUSH DE
        POP  BC
        LD   D,C           ;REVERSE X,Y FOR SYSTEM
        LD   E,B
        SYSSUK RELAB1
        DB   0
        POP  HL
        EX   DE,HL
        LD   A,(HL)
        OR   A             ;TEST SQUARE
        JR   NZ,$+(BADMOV-$)
        LD   BC,BYTEPL
        ADD  HL,BC
        LD   A,(HL)
        OR   A
        JR   NZ,$+(BADMOV-$)
        LD   A,D
        LD   (TARRX),A     ;STORE TEMP ARROW X COORD
        LD   A,E
        LD   (TARRY),A     ;STORE TEMP ARROW Y COORD
        POP  AF
        LD   D,0
        SRL  D             ;SET Z FLAG=Z
MOVEND: POP  HL
        POP  DE
        POP  BC
        RET
GETROT:
        ;HL<-BASE ADDR OF ROTATED PATTERN
        ;A<-DIRECTION OF ROTATION
        ;IF A HAS MORE THAN 1 BIT SET THEN ONLY ONE IS US
        LD   HL,AUP
        BIT  CHUP,A
        RET  NZ
        LD   HL,ADOWN
        BIT  CHDOWN,A
        RET  NZ
        LD   HL,ARIGHT
        BIT  CHRIGH,A
        RET  NZ
        LD   HL,ALEFT
        RET
        ;START OF ROM DATA FOR EACH PLAYER.
        ;CONTAINS 4 PLAYER NOTES, PLAYER PATTERN ADDR
        ; , PLAYER CHAR DISP OPT
        ;PLAYER SCORE DISP OPT
        ;AND PLAYER SCORE POSITION
PLROM0:
PNOTE0: DB   G0,GS0,A0,AS0
PPADR0: DW   PPAT0
PCDOP0: DB   011000B
PSPOS0: DB   12            ; CHANGED TO MATCH ROM 
        DB   1
PSDOP0: DB   011000B
PLROM1:
PNOTE1: DB   B0,C1,CS1,D1
PPADR1: DW   PPAT1
PCDOP1: DB   011100B
PSPOS1: DB   125           ; CHANGED TO MATCH ROM 
        DB   1
PSDOP1: DB   011100B
PLROM2:
PNOTE2: DB   DS1,E1,F1,FS1
PPADR2: DW   PPAT2
PCDOP2: DB   011100B
PSPOS2: DW   45 + (1 SHL 8)
PSDOP2: DB   011100B
PLROM3:
PNOTE3: DB   G1,GS1,A1,AS1
PPADR3: DW   PPAT3
PCDOP3: DB   011000B
PSPOS3: DW   $0159         ; CHANGED TO MATCH ROM 
PSDOP3: DB   011000B
        ;EXPLOSION PATTERNS
EXPATS:
EXPAT1: DB   0,00010100B,00010100B,0
EXPAT2: DB   0,01000101B,01010001B,0
EXPAT3: DB   00000101B,01000000B,00000001B,01010000B
EXPAT4: DB   00010001B,01000000B,00000001B,01000100B
EXPAT5: DB   0,0,0,0
        ;EXPLOSION COLORS
EXCOLS:
        DB   7
        DB   3
        DB   7
        DB   3
        DB   $87           ; CHANGED TO MATCH ROM 
        ;COUNT DOWN DISPLAY PACKET
CDCOLR: DW   0100B + (0 SHL 8)
        ;TIMER DISPLAY PACKET
TDPACK: DW   0001B + (10000000B SHL 8)
        ;ARROW ANIMATION PATTERNS FOR EACH ROTATION
AUP:
        DB   00010100B,01010101B,01000001B,0
ARIGHT:
        DB   00010100B,00000101B,00000101B,00010100B
ADOWN:
        DB   0,01000001B,01010101B,00010100B
ALEFT:
        DB   00010100B,01010000B,01010000B,00010100B
        ;PLAYER PATTERNS
PPAT0:  DB   00001000B,10101000B,00101010B,00100000B
PPAT1:  DB   11111111B,11000011B,11000011B,11111111B
PPAT2:  DB   00001100B,11111100B,00111111B,00110000B
PPAT3:  DB   10101010B,10000010B,10000010B,10101010B
        ;COLOR BOCK
CBLOCK:
        DB   $B3           ; CHANGED TO MATCH ROM
        DB   $62           ; CHANGED TO MATCH ROM 
        DB   $F8
        DB   $87           ; CHANGED TO MATCH ROM 
        DB   $F8           ; CHANGED TO MATCH ROM 
        DB   $F8           ; CHANGED TO MATCH ROM 
        DB   $F8
        DB   $F8           ; CHANGED TO MATCH ROM 

        ;EXPLOSION SOUNDS
EXPSND: DB $EF,$FF,$3F,$00,$FF,$FD,$F5,$F5
        DB $8F,$EE,$3E,$00,$FF,$FD,$F5,$F5
        DB $4E,$88,$38,$00,$FF,$FD,$F5,$F5
        DB $48,$44,$34,$00,$FF,$FD,$F5,$F5
        DB 0,0,0,0,0,0,0,0

        ; CHECKMATE MENU TEXT
CHKSTR  DB    'C','H','E','C','K','M','A','T','E'
        DB    $00

        ;END OF CHECKMATE PROGRAM
