; 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