;BOTHKILL by Marian Cascaval ; ' ;Status of Players Fires. STP1F1 EQU #5B70 STP1F2 EQU #5B71 STP1F3 EQU #5B72 STP1F4 EQU #5B7F STP1F5 EQU #5B80 STP2F1 EQU #5B89 STP2F2 EQU #5B8A STP2F3 EQU #5B8B STP2F4 EQU #5B8C STP2F5 EQU #5B8D INTCTR EQU #D6D7 ORG #D6D8 ;Set interrupt table DI IM2 LD HL,#D500 ;Table begins at 54528. LD A,#E1 LD B,0 FILTBL LD (HL),A INC HL DJNZ FILTBL LD (HL),A LD A,#D5 LD I,A ;Prepare Game XOR A LD (INTCTR),A LD A,#1F ;Set border to purple: LD (#5C48),A ;BORDCR = #1F. LD HL,#4000 ;Clear screen. LD DE,#1800 ; CLSCR1 XOR A ; LD (HL),A ; INC HL ; DEC DE ; LD A,D ; OR E ; JR NZ,CLSCR1 ; LD HL,#5800 ;Clear attributes and LD DE,#0300 ;set them to black. CLRATR LD A,#46 ; LD (HL),A ; INC HL ; DEC DE ; LD A,D ; OR E ; JR NZ,CLRATR ; CALL PUPTXT ;Print upper text. CALL PLOTXT ;Print lower text. LD A,#00 ;Set Game status to Begin: LD (#5BA2),A ;#5BA2 = 0. LD A,#03 ;Set no. of lives = 3 LD (#5BA4),A ;for P1 and LD (#5BA5),A ;for P2. ;'CONTINUE' Game CTGAME LD SP,#9C40 ;Set the Stack Pointer. LD A,#01 ;Color border blue. OUT (#FE),A ; LD HL,#5820 ;Clear playing area LD DE,#02C0 ;except the 4 CLSCR2 LD A,#46 ;screen corner attributes. LD (HL),A ; INC HL ; DEC DE ; LD A,D ; OR E ; JR NZ,CLSCR2 ; LD A,#46 ;Clear the following attributes: LD (#581F),A ;upper right corner attribute, LD (#5AE0),A ;lower left corner attribute. LD A,#50 ;Set bright red the attributes: LD (#5800),A ;P1's upper square, LD (#5840),A ;P1's lower square and LD (#5ADF),A ;P2's middle square. LD A,#70 ;Set bright yellow the attributes: LD (#5820),A ;P1's middle square, LD (#5ABF),A ;P2's upper square and LD (#5AFF),A ;P2's lower square. LD A,#00 ;Disable FIREs; 5 Fires/Player.  LD (STP1F1),A ;P1F1 off. LD (STP1F2),A ;P1F2 off. LD (STP1F3),A ;P1F3 off. LD (STP1F4),A ;P1F4 off. LD (STP1F5),A ;P1F5 off. LD (STP2F1),A ;P2F1 off. LD (STP2F2),A ;P2F2 off. LD (STP2F3),A ;P2F3 off. LD (STP2F4),A ;P2F4 off. LD (STP2F5),A ;P2F5 off. ;Start Game (BEGIN/CONTINUE) CALL BCGAME ;Begin/Continue Game. LD BC,#5820 ;BC holds P1 coordinates. LD DE,#5ADF ;DE holds P2 coordinates. EXX ;Saves BC & DE values. EI ;Scan Fire keys SCFRKY LD BC,#FEFE ;Scan 'Caps Shift' key IN A,(C) ;which is P1 Fire key. RRA ; CALL NC,P1FPRS ;P1 Fire key pressed. LD BC,#7FFE ;Scan 'Space' key. IN A,(C) ;which is P2 Fire key. RRA ; CALL NC,P2FPRS ;P2 Fire key pressed. LD A,#01 ;Color border. OUT (#FE),A ; LD DE,#2710 ;'Delay' routine. DELAY1 DEC DE ; LD A,D ; OR E ; JR NZ,DELAY1 ; JR SCFRKY ;Jump to scan Fire keys. ;Move Player1 up MVP1UP EXX ;Save BC & DE. LD A,B ;Check if middle sqaure XOR #58 ;has reached max position JR NZ,P1UP ;i.e. #5820. LD A,C ;If max position reached then XOR #20 ;don't move P1 and exit. JR Z,NOP1UP P1UP LD H,B ;Move P1 up. LD L,C ; LD BC,#0020 ; ADD HL,BC ; LD A,#00 ; LD (HL),A ; OR A ; SBC HL,BC ; LD A,#50 ; LD (HL),A ; OR A ; SBC HL,BC ; OR A ; SBC HL,BC ; LD (HL),A ; ADD HL,BC ; LD A,#70 ; LD (HL),A ; LD B,H ; LD C,L ; NOP1UP EXX ;Restore BC & DE before RET ;RETurn. ;Move Player2 up MVP2UP EXX ;Move P2 up; Save BC & DE. LD A,D ;Check if middle sqaure XOR #58 ;has reached max position JR NZ,P2UP ;i.e. #583F. LD A,E ;If max position reached then XOR #3F ;don't move P2 and exit. JR Z,NOP2UP P2UP LD H,D ;Move P2 up. LD L,E ; LD DE,#0020 ; ADD HL,DE ; LD A,#00 ; LD (HL),A ; OR A ; SBC HL,DE ; LD A,#70 ; LD (HL),A ; OR A ; SBC HL,DE ; OR A ; SBC HL,DE ; LD (HL),A ; ADD HL,DE ; LD A,#50 ; LD (HL),A ; LD D,H ; LD E,L ; NOP2UP EXX ;Restore BC & DE before RET ;RETurn. ;Move Player1 down MVP1DN EXX ;Move P1 down; Save BC & DE. LD A,B ;Check if middle sqaure XOR #5A ;has reached max position JR NZ,P1DN ;i.e. #5AC0. LD A,C ;If max position reached then XOR #C0 ;don't move P1 and exit. JR Z,NOP1DN P1DN LD H,B ;Move P1 down. LD L,C ; LD BC,#0020 ; OR A ; SBC HL,BC ; LD A,#00 ; LD (HL),A ; ADD HL,BC ; LD A,#50 ; LD (HL),A ; ADD HL,BC ; ADD HL,BC ; LD (HL),A ; OR A ; SBC HL,BC ; LD A,#70 ; LD (HL),A ; LD B,H ; LD C,L ; NOP1DN EXX ;Restore BC & DE before RET ;RETurn. ;Move Player2 down MVP2DN EXX ;Move P2 down; Save BC & DE. LD A,D ;Check if middle sqaure XOR #5A ;has reached max position JR NZ,P2DN ;i.e. #5ADF. LD A,E ;If max position reached then XOR #DF ;don't move P2 and exit. JR Z,NOP2DN P2DN LD H,D ;Move P2 down. LD L,E ; LD DE,#0020 ; OR A ; SBC HL,DE ; LD A,#00 ; LD (HL),A ; ADD HL,DE ; LD A,#70 ; LD (HL),A ; ADD HL,DE ; ADD HL,DE ; LD (HL),A ; OR A ; SBC HL,DE ; LD A,#50 ; LD (HL),A ; LD D,H ; LD E,L ; NOP2DN EXX ;Restore BC & DE before RET ;RETurn. ;Player1 Fire key pressed P1FPRS LD A,(STP1F1) ;Test P1F1 status, CP #00 ;if P1F1 slot free then JR Z,LNP1F1 ;P1F1 launch. LD A,(STP1F2) ;Test P1F2 status, CP #00 ;if P1F2 slot free then JR Z,LNP1F2 ;P1F2 launch. LD A,(STP1F3) ;Test P1F3 status, CP #00 ;if P1F3 slot free then JP Z,LNP1F3 ;P1F3 launch. LD A,(STP1F4) ;Test P1F4 status, CP #00 ;if P1F4 slot free then JP Z,LNP1F4 ;P1F4 launch. LD A,(STP1F5) ;Test P1F5 status, CP #00 ;if P1F5 slot free then JP Z,LNP1F5 ;P1F5 launch. RET ;RET from Test P1F. LNP1F1 CALL HITSND ;Fire sound P1F1. EXX LD H,B ;Move P1F1 one position LD L,C ;after the P1 position, INC HL ;i.e. BC+1. LD A,#70 ; LD (HL),A ; LD89B CALL LDA12 LD A,(STP1F1) CP #01 JR Z,LD8B4 PUSH HL LD HL,#0000 ADD HL,BC PUSH BC LD BC,#0020 ADD HL,BC LD (#5B79),HL POP BC POP HL LD8B4 PUSH BC LD BC,(#5B79) LD A,H XOR B JR NZ,LD8CB LD A,L XOR C JR NZ,LD8CB POP BC LD A,#00 LD (STP1F1),A DEC HL LD (HL),A EXX RET LD8CB POP BC LD A,#00 DEC HL LD (HL),A INC HL LD A,#70 LD (HL),A LD (#5B73),HL LD A,#01 LD (STP1F1),A EXX RET LNP1F2 CALL HITSND ;Fire sound P1F2. EXX LD H,B LD L,C INC HL LD A,#70 LD (HL),A LD8E8 CALL LDA12 LD A,(STP1F2) CP #01 JR Z,LD901 PUSH HL LD HL,#0000 ADD HL,BC PUSH BC LD BC,#0020 ADD HL,BC LD (#5B7B),HL POP BC POP HL LD901 PUSH BC LD BC,(#5B7B) LD A,H XOR B JR NZ,LD918 LD A,L XOR C JR NZ,LD918 POP BC LD A,#00 LD (STP1F2),A DEC HL LD (HL),A EXX RET LD918 POP BC LD A,#00 DEC HL LD (HL),A INC HL LD A,#70 LD (HL),A LD (#5B75),HL LD A,#01 LD (STP1F2),A EXX RET LNP1F3 CALL HITSND ;Fire sound P1F3. EXX LD H,B LD L,C INC HL LD A,#70 LD (HL),A LD935 CALL LDA12 LD A,(STP1F3) CP #01 JR Z,LD94E PUSH HL LD HL,#0000 ADD HL,BC PUSH BC LD BC,#0020 ADD HL,BC LD (#5B7D),HL POP BC POP HL LD94E PUSH BC LD BC,(#5B7D) LD A,H XOR B JR NZ,LD965 LD A,L XOR C JR NZ,LD965 POP BC LD A,#00 LD (STP1F3),A DEC HL LD (HL),A EXX RET LD965 POP BC LD A,#00 DEC HL LD (HL),A INC HL LD A,#70 LD (HL),A LD (#5B77),HL LD A,#01 LD (STP1F3),A EXX RET LNP1F4 CALL HITSND ;Fire sound P1F4. EXX LD H,B LD L,C INC HL LD A,#70 LD (HL),A LD982 CALL LDA12 LD A,(STP1F4) CP #01 JR Z,LD99B PUSH HL LD HL,#0000 ADD HL,BC PUSH BC LD BC,#0020 ADD HL,BC LD (#5B85),HL POP BC POP HL LD99B PUSH BC LD BC,(#5B85) LD A,H XOR B JR NZ,LD9B2 LD A,L XOR C JR NZ,LD9B2 POP BC LD A,#00 LD (STP1F4),A DEC HL LD (HL),A EXX RET LD9B2 POP BC LD A,#00 DEC HL LD (HL),A INC HL LD A,#70 LD (HL),A LD (#5B81),HL LD A,#01 LD (STP1F4),A EXX RET LNP1F5 CALL HITSND ;Fire sound P1F5. EXX LD H,B LD L,C INC HL LD A,#70 LD (HL),A LD9CF CALL LDA12 LD A,(STP1F5) CP #01 JR Z,LD9E8 PUSH HL LD HL,#0000 ADD HL,BC PUSH BC LD BC,#0020 ADD HL,BC LD (#5B87),HL POP BC POP HL LD9E8 PUSH BC LD BC,(#5B87) LD A,H XOR B JR NZ,LD9FF LD A,L XOR C JR NZ,LD9FF POP BC LD A,#00 LD (STP1F5),A DEC HL LD (HL),A EXX RET LD9FF POP BC LD A,#00 DEC HL LD (HL),A INC HL LD A,#70 LD (HL),A LD (#5B83),HL LD A,#01 LD (STP1F5),A EXX RET LDA12 LD A,#01 LD (#5B06),A PUSH DE LDA18 PUSH HL LD HL,#0000 ADD HL,DE LD DE,#0020 ADD HL,DE  LD D,H LD E,L POP HL CALL LDA64 JP C,LDA86 PUSH HL LD HL,#0000 ADD HL,DE LD DE,#0020 OR A SBC HL,DE OR A SBC HL,DE LD D,H LD E,L POP HL CALL LDA64 JP C,LDA86 PUSH HL LD HL,#0000 ADD HL,DE LD DE,#0020 ADD HL,DE LD D,H LD E,L POP HL CALL LDA64 JP C,LDA86 LD A,(#5B06) CP #01 JR Z,LDA5C POP DE RET LDA5C INC HL LD A,#00 LD (#5B06),A JR LDA18 LDA64 LD A,H XOR D OR A RET NZ LD A,L XOR E OR A RET NZ SCF RET HITSND LD HL,#0300 ;Fire sound routine. LDA74 LD DE,#0001 ; PUSH HL ; CALL SNDRTN ; POP HL ; LD DE,#0010 ; AND A ; SBC HL,DE ; JR NZ,LDA74 ; RET ; LDA86 POP DE ;Flashing Player 2. LD HL,#0000 ADD HL,DE LD DE,#0020 ADD HL,DE LD D,H LD E,L LD A,(DE) OR #80 ;Set Flash attribute. LD (DE),A LD HL,#0000 ADD HL,DE LD DE,#0020 OR A ;Set Carry Flag=0. SBC HL,DE OR A ;Set Carry Flag=0. SBC HL,DE LD D,H LD E,L LD A,(DE) OR #80 ;Set Flash attribute. LD (DE),A LD HL,#0000 ADD HL,DE LD DE,#0020 ADD HL,DE LD D,H LD E,L LD A,(DE) OR #80 ;Set Flash attribute. LD (DE),A CALL LDF08 CALL LDB1B ;Call hit sound ??? LDABC LD DE,#FFFF LDABF DEC DE LD A,D OR E JR NZ,LDABF CALL LE0EA JP CTGAME ;Move Player1 FIREs. MVP1F LD A,(STP1F1) ;Test PLAYER1's CP #01 ;all 5 FIREs status. CALL Z,LDAF3 ;If = 0 then skip to check LD A,(STP1F2) ;next FIRE or RET if CP #01 ;FIRE 5 reached. CALL Z,LDAFB ;If = 1 then move FIRE LD A,(STP1F3) ;one position and check CP #01 ;next FIRE or RET if CALL Z,LDB03 ;FIRE 5 reached. LD A,(STP1F4) ;Check P1F4 status. CP #01 ; CALL Z,LDB0B ; LD A,(STP1F5) ;Check P1F5 status. CP #01 ; CALL Z,LDB13 ; RET ;Finish testing P1F status. LDAF3 EXX LD HL,(#5B73) ;Load position of P1F1. CALL LD89B RET LDAFB EXX LD HL,(#5B75) ;Load position of P1F2. CALL LD8E8 RET LDB03 EXX LD HL,(#5B77) ;Load position of P1F3. CALL LD935 RET LDB0B EXX LD HL,(#5B81) ;Load position of P1F4. CALL LD982 RET LDB13 EXX LD HL,(#5B83) ;Load position of P1F5. CALL LD9CF RET LDB1B LD BC,#FA04 ;Play hit sound. LD HL,#0200 LD DE,#000F ;Hit sound routine. LDB24 PUSH HL PUSH DE PUSH BC CALL SNDRTN ;Call #03B6 instead of #03B5 in POP BC ;order to skip the 'DI' instruction POP DE ;at the start of ROM sound routine; POP HL ;In this way interrupts can be LD A,L ;serviced while playing sound. SUB C LD L,A DJNZ LDB24 RET ;Player 2 Fire key pressed P2FPRS LD A,(STP2F1) ;Test P2F1 status, CP #00 ;if P2F1 slot free then JR Z,LDB5A ;P2F1 launch. LD A,(STP2F2) ;Test P2F2 status, CP #00 ;if P2F2 slot free then JR Z,LDBA9 ;P2F2 launch. LD A,(STP2F3) ;Test P2F3 status, CP #00 ;if P2F3 slot free then JP Z,LDBF8 ;P2F3 launch. LD A,(STP2F4) ;Test P2F4 status, CP #00 ;if P2F4 slot free then JP Z,LDC47 ;P2F4 launch. LD A,(STP2F5) ;Test P2F5 status, CP #00 ;if P2F5 slot free then JP Z,LDC96 ;P2F5 launch. RET ;RET from Test P2F. LDB5A CALL HITSND ;Fire sound P2F1. EXX LD H,D LD L,E DEC HL LD A,#50 LD (HL),A LDB64 CALL LDCE5 LD A,(STP2F1) CP #01 JR Z,LDB7F PUSH HL LD HL,#0000 ADD HL,DE PUSH DE LD DE,#0020 OR A SBC HL,DE LD (#5B98),HL POP DE POP HL LDB7F PUSH DE LD DE,(#5B98) LD A,H XOR D JR NZ,LDB96 LD A,L XOR E JR NZ,LDB96 POP DE LD A,#00 LD (STP2F1),A INC HL LD (HL),A EXX RET LDB96 POP DE LD A,#00 INC HL LD (HL),A DEC HL LD A,#50 LD (HL),A LD (#5B8E),HL LD A,#01 LD (STP2F1),A EXX RET LDBA9 CALL HITSND ;Fire sound P2F2. EXX LD H,D LD L,E DEC HL LD A,#50 LD (HL),A LDBB3 CALL LDCE5 LD A,(STP2F2) CP #01 JR Z,LDBCE PUSH HL LD HL,#0000 ADD HL,DE PUSH DE LD DE,#0020 OR A SBC HL,DE LD (#5B9A),HL POP DE POP HL LDBCE PUSH DE LD DE,(#5B9A) LD A,H XOR D JR NZ,LDBE5 LD A,L XOR E JR NZ,LDBE5 POP DE LD A,#00 LD (STP2F2),A INC HL LD (HL),A EXX RET LDBE5 POP DE LD A,#00 INC HL LD (HL),A DEC HL LD A,#50 LD (HL),A LD (#5B90),HL LD A,#01 LD (STP2F2),A EXX RET LDBF8 CALL HITSND ;Fire sound P2F3. EXX LD H,D LD L,E DEC HL LD A,#50 LD (HL),A LDC02 CALL LDCE5 LD A,(STP2F3) CP #01 JR Z,LDC1D PUSH HL LD HL,#0000 ADD HL,DE PUSH DE LD DE,#0020 OR A SBC HL,DE LD (#5B9C),HL POP DE POP HL LDC1D PUSH DE LD DE,(#5B9C) LD A,H XOR D JR NZ,LDC34 LD A,L XOR E JR NZ,LDC34 POP DE LD A,#00 LD (STP2F3),A INC HL LD (HL),A EXX RET LDC34 POP DE LD A,#00 INC HL LD (HL),A DEC HL LD A,#50 LD (HL),A LD (#5B92),HL LD A,#01 LD (STP2F3),A EXX RET LDC47 CALL HITSND ;Fire sound P2F4. EXX LD H,D LD L,E DEC HL LD A,#50 LD (HL),A LDC51 CALL LDCE5 LD A,(STP2F4) CP #01 JR Z,LDC6C PUSH HL LD HL,#0000 ADD HL,DE PUSH DE LD DE,#0020 OR A SBC HL,DE LD (#5B9E),HL POP DE POP HL LDC6C PUSH DE LD DE,(#5B9E) LD A,H XOR D JR NZ,LDC83 LD A,L XOR E JR NZ,LDC83 POP DE LD A,#00 LD (STP2F4),A INC HL LD (HL),A EXX RET LDC83 POP DE LD A,#00 INC HL LD (HL),A DEC HL LD A,#50 LD (HL),A LD (#5B94),HL LD A,#01 LD (STP2F4),A EXX RET LDC96 CALL HITSND ;Fire sound P2F5. EXX LD H,D LD L,E DEC HL LD A,#50 LD (HL),A LDCA0 CALL LDCE5 LD A,(STP2F5) CP #01 JR Z,LDCBB PUSH HL LD HL,#0000 ADD HL,DE PUSH DE LD DE,#0020 OR A SBC HL,DE LD (#5BA0),HL POP DE POP HL LDCBB PUSH DE LD DE,(#5BA0) LD A,H XOR D JR NZ,LDCD2 LD A,L XOR E JR NZ,LDCD2 POP DE LD A,#00 LD (STP2F5),A INC HL LD (HL),A EXX RET LDCD2 POP DE LD A,#00 INC HL LD (HL),A DEC HL LD A,#50 LD (HL),A LD (#5B96),HL LD A,#01 LD (STP2F5),A EXX RET LDCE5 LD A,#01 LD (#5B07),A PUSH BC LDCEB PUSH HL LD HL,#0000 ADD HL,BC LD BC,#0020 ADD HL,BC LD B,H LD C,L POP HL CALL LDD37 JP C,LDD41 PUSH HL LD HL,#0000 ADD HL,BC LD BC,#0020 OR A SBC HL,BC OR A SBC HL,BC LD B,H LD C,L POP HL CALL LDD37 JP C,LDD41 PUSH HL LD HL,#0000 ADD HL,BC LD BC,#0020 ADD HL,BC LD B,H LD C,L POP HL CALL LDD37 JP C,LDD41 LD A,(#5B07) CP #01 JR Z,LDD2F POP BC RET LDD2F DEC HL LD A,#00 LD (#5B07),A JR LDCEB LDD37 LD A,H XOR B OR A RET NZ LD A,L XOR C OR A RET NZ SCF RET LDD41 POP BC ;Flashing Player 1. LD HL,#0000 ADD HL,BC LD BC,#0020 ADD HL,BC LD B,H LD C,L LD A,(BC) OR #80 LD (BC),A LD HL,#0000 ADD HL,BC LD BC,#0020 OR A SBC HL,BC OR A SBC HL,BC LD B,H LD C,L LD A,(BC) OR #80 LD (BC),A LD HL,#0000 ADD HL,BC LD BC,#0020 ADD HL,BC LD B,H LD C,L LD A,(BC) OR #80 LD (BC),A EXX CALL LDFA0 CALL LDB1B JP LDABC ;Move Player2 FIREs. MVP2F LD A,(STP2F1) ;Test PLAYER2's CP #01 ;all 5 FIREs status. CALL Z,LDDA4 ;If = 0 then skip to check LD A,(STP2F2) ;next FIRE or RET if CP #01 ;FIRE 5 reached. CALL Z,LDDAC ;If = 1 then move FIRE LD A,(STP2F3) ;one position and check CP #01 ;next FIRE or RET if CALL Z,LDDB4 ;FIRE 5 reached. LD A,(STP2F4) ;Check P2F4 status. CP #01 ; CALL Z,LDDBC ; LD A,(STP2F5) ;Check P2F5 status. CP #01 ; CALL Z,LDDC4 ; RET ;Finish testing P2F status. LDDA4 EXX LD HL,(#5B8E) ;Load position of P2F1. CALL LDB64 ;Move P2F1. RET LDDAC EXX LD HL,(#5B90) ;Load position of P2F2. CALL LDBB3 ;Move P2F2. RET LDDB4 EXX LD HL,(#5B92) ;Load position of P2F3. CALL LDC02 ;Move P2F3. RET LDDBC EXX LD HL,(#5B94) ;Load position of P2F4. CALL LDC51 ;Move P2F4. RET LDDC4 EXX LD HL,(#5B96) ;Load position of P2F5. CALL LDCA0 ;Move P2F5. RET PUPTXT LD HL,LDDEC ;Print upper text. LD B,#02 ;Page 176, section 5.5.2. LDDD1 PUSH BC ;Print 2 times: LD B,(HL) ;1 time bright green and INC HL ;1 time bright blue. CALL LDDDB ; POP BC ; DJNZ LDDD1 ; RET ;RET from Print upper text. LDDDB PUSH HL PUSH BC LD A,#02 ;Select channel 2. CALL #1601 ;Select screen. POP BC POP HL LDDE4 LD A,(HL) ;Load character to be printed. SUB #64 ;Decode character. RST #10 ;Character print routine. INC HL DJNZ LDDE4 RET ;Print upper text - end. ;DEFB upper text - begin. LDDEC DEFB #14,#7A,#64,#65,#74,#68,#75,#64,#B4,#B6 DEFB #B3,#AB,#B6,#A5,#B1,#B1,#A9,#A8,#84,#A6 DEFB #BD,#16,#7A,#64,#74,#74,#69,#75,#64,#B1 DEFB #A5,#B6,#AD,#A5,#B2,#84,#A7,#A5,#B7,#A7 DEFB #A5,#BA,#A5,#B0 ;DEFB upper text - end. PLOTXT LD A,#44 ;Prin lower text. LD B,#18 ; LD HL,#5AE3 ; LDE1F LD (HL),A ; INC HL ; DJNZ LDE1F ; LD A,#43 ; LD (#5AEA),A ; LD (#5AFB),A ; LD A,#46 ; LD (#5AEB),A ; LD A,#42 ; LD (#5AFC),A ; LD HL,#5AED ; LD A,#4F ; LD B,#06 ; LDE3C LD (HL),A ; INC HL ; DJNZ LDE3C ; LD HL,LDE6C ; LD DE,#51E3 ; PUSH HL ; PUSH DE ; LDE48 POP DE ;Is really necessary? POP HL ;Is really necessary? PUSH HL ;Is really necessary? PUSH DE ;Is really necessary? LD BC,#001A ; LDIR ; LDE51 POP DE ; POP HL ; LD BC,#001A ; ADD HL,BC ; EX DE,HL ; LD BC,#0100 ; ADD HL,BC ; EX DE,HL ; PUSH HL ; PUSH DE ; LD A,D ; XOR #57 ; JR NZ,LDE48 ; LD A,E ; XOR #E3 ; JR NZ,LDE48 ; POP DE ; POP HL ; LDE6B RET ;Prin lower text. LDE6C ;DEFB upper lower - begin. DEFB #7C,#60,#3C,#C2,#7E,#7C,#1C,#18,#3C,#00 DEFB #01,#C6,#75,#12,#A2,#00,#00,#7C,#60,#3C DEFB #C2,#7E,#7C,#3C,#18,#3C,#63,#60,#63,#64 DEFB #60,#63,#2C,#18,#43,#00,#61,#29,#25,#14 DEFB #A2,#06,#00,#63,#60,#63,#64,#60,#63,#43 DEFB #18,#43,#63,#60,#63,#38,#7C,#63,#0C,#00 DEFB #04,#00,#91,#C9,#27,#18,#A2,#09,#00,#63 DEFB #60,#63,#38,#7C,#63,#03,#00,#04,#7C,#60 DEFB #7F,#18,#60,#7C,#0C,#00,#03,#00,#91,#29 DEFB #27,#18,#A2,#09,#00,#7C,#60,#7F,#18,#60 DEFB #7C,#3C,#00,#03,#60,#60,#63,#18,#60,#64 DEFB #0C,#18,#43,#00,#61,#29,#25,#14,#A2,#06 DEFB #00,#60,#60,#63,#18,#60,#64,#60,#18,#43 DEFB #60,#7E,#63,#18,#7E,#62,#3E,#18,#3C,#00 DEFB #01,#C6,#25,#12,#BB,#80,#00,#60,#7E,#63 DEFB #18,#7E,#62,#7E,#18,#3C ;DEFB lower text - end. LDF08 LD A,(#5BA4) DEC A LD (#5BA4),A JR Z,LDF46 CP #02 JR Z,LDF2B LD HL,LE0DE LD DE,#51FC LD B,#06 LDF1D LD A,(HL) LD (DE),A LDF1F INC HL LDF20 PUSH HL LDF21 EX DE,HL LD DE,#0100 ADD HL,DE EX DE,HL POP HL DJNZ LDF1D RET LDF2B LD HL,LE0E4 LD DE,#51FC LDF31 LD B,#06 LDF33 LD A,(HL) LD (DE),A INC HL PUSH HL EX DE,HL LD DE,#0100 ADD HL,DE EX DE,HL POP HL DJNZ LDF33 LD A,#01 LD (#5BA2),A RET LDF46 LD HL,LE0D8 LD DE,#51FC LD B,#06 LDF4E LD A,(HL) LD (DE),A INC HL PUSH HL EX DE,HL LD DE,#0100 ADD HL,DE EX DE,HL POP HL DJNZ LDF4E LD HL,LDF84 LD B,#01 LDF60 PUSH BC LD B,(HL) INC HL CALL LDF72 POP BC LD DE,#FFFF LDF6A DEC DE LD A,D OR E JR NZ,LDF6A DJNZ LDF60 LDF71 RET LDF72 PUSH HL PUSH BC LD A,#02 CALL #1601 POP BC POP HL LDF7B LD A,(HL) SUB #64 RST #10 INC HL DJNZ LDF7B LDF82 JR LDF9A LDF84 ;DEFB - start. DEFB #15,#7A,#6F,#6E,#74,#6B,#75,#64 DEFB #77,#65,#B4,#B0,#A5,#BD,#A9,#B6 DEFB #95,#84,#BB,#AD,#B2,#B7 ;DEFB - end. LDF9A LD A,#00 LD (#5BA2),A RET LDFA0 LD A,(#5BA5) DEC A LD (#5BA5),A JR Z,LDFDE CP #02 JR Z,LDFC3 LD HL,LE0DE LD DE,#51EB LD B,#06 LDFB5 LD A,(HL) LD (DE),A INC HL PUSH HL EX DE,HL LD DE,#0100 ADD HL,DE EX DE,HL POP HL DJNZ LDFB5 RET LDFC3 LD HL,LE0E4 LD DE,#51EB LD B,#06 LDFCB LD A,(HL) LD (DE),A INC HL PUSH HL EX DE,HL LD DE,#0100 ADD HL,DE EX DE,HL POP HL DJNZ LDFCB LD A,#01 LD (#5BA2),A RET LDFDE LD HL,LE0D8 LD DE,#51EB LD B,#06 LDFE6 LD A,(HL) LD (DE),A INC HL PUSH HL EX DE,HL LD DE,#0100 ADD HL,DE EX DE,HL POP HL DJNZ LDFE6 LD HL,LE01C LD B,#01 LDFF8 PUSH BC LD B,(HL) INC HL CALL LE00A LDFFE POP BC LD DE,#FFFF LE002 DEC DE LD A,D OR E JR NZ,LE002 DJNZ LDFF8 RET LE00A PUSH HL PUSH BC LD A,#02 CALL #1601 POP BC POP HL LE013 LD A,(HL) SUB #64 RST #10 INC HL DJNZ LE013 JR LE032 LE01C ;DEFB - start. DEFB #15,#7A,#6F,#6E,#74,#6B,#75,#64 DEFB #77,#65,#B4,#B0,#A5,#BD,#A9,#B6 DEFB #96,#84,#BB,#AD,#B2,#B7 ;DEFB - end. LE032 LD A,#00 LD (#5BA2),A RET ;Test Game status to Begin/Continue Game BCGAME LD A,(#5BA2) ;Test Game status. CP #00 ;If 0 then Game is to begin. JR Z,LE089 ;Jump to begin Game. LD HL,LE067 LD B,#02 LE044 PUSH BC LD B,(HL) INC HL CALL LE056 ;Print ‚CONTINUE' message. POP BC LD DE,#FFFF ;Dealy for the LE04E DEC DE ;'CONTINUE' message. LD A,D ; OR E ; JR NZ,LE04E ; DJNZ LE044 RET LE056 PUSH HL ;Print ‚CONTINUE' message. PUSH BC ; LD A,#02 ; CALL #1601 ; POP BC ; POP HL ; LE05F LD A,(HL) ; SUB #64 ; RST #10 ; INC HL ; DJNZ LE05F ; RET ;Finish printing message. LE067 ;DEFB - start. DEFB #11,#7A,#6F,#70,#74,#6B,#75,#64 DEFB #77,#65,#A7,#B3,#B2,#B8,#AD,#B2 DEFB #B9,#A9,#0F,#7A,#6F,#70,#75,#64 DEFB #77,#65,#84,#84,#84,#84,#84,#84 DEFB #84,#84 ;DEFB - end. LE089 LD A,#03 ;Begin new Game and LD (#5BA4),A ;set no. of lives = 3 LD (#5BA5),A ;for P1 and P2. CALL PLOTXT LD HL,LE0BC ;Load address of DEFB. LD B,#02 LE099 PUSH BC LD B,(HL) INC HL CALL LE0AB ;Print ‚BEGIN' message. POP BC LD DE,#FFFF ;Dealy for the LE0A3 DEC DE ;'BEGIN' message. LD A,D ; OR E ; JR NZ,LE0A3 ; DJNZ LE099 RET LE0AB PUSH HL ;Print ‚BEGIN' message. PUSH BC ; LD A,#02 ; CALL #1601 ; POP BC ; POP HL ; LE0B4 LD A,(HL) ; SUB #64 ; RST #10 ; INC HL ; DJNZ LE0B4 ; RET ;Finish printing message. LE0BC ;DEFB - start. DEFB #0E,#7A,#6F,#71,#74,#6B,#75,#64 DEFB #77,#65,#A6,#A9,#AB,#AD,#B2,#0C DEFB #7A,#6F,#71,#75,#64,#77,#65,#84 DEFB #84,#84,#84,#84 LE0D8 DEFB #3C,#67,#6B,#73,#63,#3C LE0DE DEFB #1C,#2C,#0C,#0C,#0C,#3E LE0E4 DEFB #3C,#43,#03,#3C,#60,#7E ;DEFB - end. LE0EA LD HL,LE10A LD B,#01 LE0EF PUSH BC LD B,(HL) INC HL CALL LE0F9 POP BC DJNZ LE0EF RET LE0F9 PUSH HL PUSH BC LD A,#02 CALL #1601 POP BC POP HL LE102 LD A,(HL) SUB A,#64 RST #10 INC HL DJNZ LE102 RET LE10A DEFB #13,#7A,#6F,#6E,#75,#64,#77,#65 DEFB #84,#84,#84,#84,#84,#84,#84,#84 DEFB #84,#84,#84,#84 ;Same as ROM sound routine at address #03B5 ;except the DI and EI instructions ;in order to skip the 'DI' instruction. ;In this way interrupts can be ;serviced while playing sound. SNDRTN LD A,L SRL L SRL L CPL AND #03 LD C,A LD B,#00 LD IX,SRL1 ADD IX,BC LD A,(#5C48) AND #38 RRCA RRCA RRCA OR #08 SRL1 NOP NOP NOP INC B INC C SRL2 DEC C JR NZ,SRL2 LD C,#3F DEC B JP NZ,SRL2 XOR #10 OUT (#FE),A LD B,H LD C,A BIT 4,A JR NZ,SRL3 LD A,D OR E JR Z,SRL4 LD A,C LD C,L DEC DE JP (IX) SRL3 LD C,L INC C JP (IX) SRL4 RET ;Interrupt routine ORG #E1E1 INTRTN PUSH AF ;Save registers. PUSH BC PUSH DE PUSH HL LD A,(INTCTR) XOR 1 LD (INTCTR),A JR Z,SCNKEY CALL MVP1F ;Move P1 FIREs. CALL MVP2F ;Move P2 FIREs. JR NOSCAN SCNKEY LD BC,#FBFE ;Scan P1 Up key IN A,(C) ;which is 'Q' key. RRA ; CALL NC,MVP1UP ; LD BC,#EFFE ;Scan P2 Up key IN A,(C) ;which is '0' key. RRA ; CALL NC,MVP2UP ; LD BC,#FDFE ;Scan P1 Down key IN A,(C) ;which is 'S' key. RRA ; RRA ; CALL NC,MVP1DN ; LD BC,#DFFE ;Scan P2 Down key IN A,(C) ;which is 'O' key. RRA ; RRA ; CALL NC,MVP2DN ; NOSCAN POP HL ;Restore registers. POP DE POP BC POP AF EI RETI END