* * Swashbuckler * (c) Stephenson * (s) 2018, Brutal Deluxe Software * * This is the $0800..$1FFF area * Called from T3 & T4 by previous stage * A lot of unused areas here! * mx %11 org $0800 lst off dsk swashbuckler *---------------------------- * Zero page * $4E: random value * $E3: bit 7 - 0: HGR1, 1: HGR2 * bit 6 - 0: left, 1: right (direction of player) * $E9: * $EB: sprite index * $EC: which HGR page is active * bit 7 - 0: HGR1, 1: HGR2 * $ED: X-position (in bytes) of the player * $F9: X start * $FA: ?offset * $FB: sprite width in bytes * $FC: Y start * $FD: Y end * $FE: key pressed zpRANDOM = $4E zpHPLAYER = $E3 zpHGRACTIVE = $EC zpXPLAYER = $ED zpXSCREEN = $F9 zpSPRWIDTH = $FB zpYBEGIN = $FC zpYEND = $FD zpKEY = $FE *---------------------------- KBD EQU $C000 KBDSTROBE EQU $C010 SPKR EQU $C030 TXTCLR EQU $C050 TXTSET EQU $C051 MIXCLR EQU $C052 TXTPAGE1 EQU $C054 TXTPAGE2 EQU $C055 HIRES EQU $C057 VTAB EQU $FC22 HOME EQU $FC58 WAIT EQU $FCA8 CROUT EQU $FD8E COUT EQU $FDED *---------------------------- ptrLINEH HEX 0004080C1014181C0004080C1014181C HEX 0105090D1115191D0105090D1115191D HEX 02060A0E12161A1E02060A0E12161A1E HEX 03070B0F13171B1F03070B0F13171B1F HEX 0004080C1014181C0004080C1014181C HEX 0105090D1115191D0105090D1115191D HEX 02060A0E12161A1E02060A0E12161A1E HEX 03070B0F13171B1F03070B0F13171B1F HEX 0004080C1014181C0004080C1014181C HEX 0105090D1115191D0105090D1115191D HEX 02060A0E12161A1E02060A0E12161A1E HEX 03070B0F13171B1F03070B0F13171B1F *---------- saveX DB $FF ; save X saveY DB $FF ; save Y sprWIDTH DB $00 ; width of a sprite in bytes pageHGR DB $40 ; 20 or 40: HGR page charFONT DB $33 ; this is the char index we have to print *--- X of sprites on screen L08D0 DB $1D ; player L08D1 DB $02 ; foe 1 L08D2 DB $1E ; foe 2 L08D3 DB $00 ; foe 3 L08D4 DB $09 ; foe 4 L08D7 DB $0B L08D8 DB $10 L08D9 DB $0C L08DA DB $12 L08DE DB $12 *---------- ptrLINEL HEX 00000000000000008080808080808080 HEX 00000000000000008080808080808080 HEX 00000000000000008080808080808080 HEX 00000000000000008080808080808080 HEX 2828282828282828A8A8A8A8A8A8A8A8 HEX 2828282828282828A8A8A8A8A8A8A8A8 HEX 2828282828282828A8A8A8A8A8A8A8A8 HEX 2828282828282828A8A8A8A8A8A8A8A8 HEX 5050505050505050D0D0D0D0D0D0D0D0 HEX 5050505050505050D0D0D0D0D0D0D0D0 HEX 5050505050505050D0D0D0D0D0D0D0D0 HEX 5050505050505050D0D0D0D0D0D0D0D0 *---------- theSCORE HEX 1A00 ; score theLIVES DB $03 ; lives L09C3 DB $80 L09C4 DB $C0 L09C5 DB $0C L09C7 DB $00 L09C8 DB $D2 L09C9 DB $01 L09CA DB $00 L09CB DB $00 L09CD DB $80 L09CE DB $00 L09CF DB $00 L09D0 DB $00 L09D1 DB $19 L09D2 DB $1F L09D3 DB $21 L09D4 DB $FE ; index of sprite 5 L09D5 DB $0E L09D6 DB $C0 L09D7 DB $35 L09D8 DB $19 L09D9 DB $06 L09DA DB $00 L09DB DB $84 saveHPLAYER DB $C0 L09DD DB $0C fgPLAY DB $FF ; true: game on, false: game over L09DF DB $00 *---------- drawSPRITE1 LDA #$20 ; draw HGR1 STA pageHGR bne L0A0D drawSPRITE2 LDA #$40 ; draw HGR2 STA pageHGR L0A0D STX saveX STY saveY LDY zpYBEGIN ; from line Y L0A15 LDA ptrLINEH,Y CLC ADC pageHGR STA L0A35+2 STA L0A38+2 LDA ptrLINEL,Y STA L0A35+1 STA L0A38+1 LDA zpSPRWIDTH STA sprWIDTH LDX zpXSCREEN L0A32 LDA $6CD7 L0A35 ORA $5DA8,X L0A38 STA $5DA8,X INC L0A32+1 BNE L0A43 INC L0A32+2 L0A43 INX DEC sprWIDTH BNE L0A32 INY CPY zpYEND ; to end line BNE L0A15 LDX saveX LDY saveY RTS *---------- Draw a sprite on screen drawSPRITE STA $EB ; sprite index ASL TAY LDA tblSPRITES,Y STA L0A71+1 ; get the pointer to its structure CLC ADC #$04 STA L0A32+1 ; and to its data INY LDA tblSPRITES,Y STA L0A71+2 STA L0A32+2 LDY #$03 ; copy its structure L0A71 LDA $6C5B,Y STA |$00FA,Y DEY BPL L0A71 SEC LDA zpXSCREEN ; offset on screen SBC $FA ; width in bytes STA zpXSCREEN ; save it BIT zpHPLAYER ; which HGR page? BPL L0A8B jmp drawSPRITE2 L0A8B jmp drawSPRITE1 *---------- L0A8F STA $EF ; save sprite JSR L0B43 BIT zpHGRACTIVE ; which page is active? BMI L0AB3 ; page 2, so draw on page 1 LDA #$80 ; we're on page 1 ORA zpHGRACTIVE ; next is page 2 STA zpHGRACTIVE LDA TXTPAGE1 ; show HGR1 LDA #$80 ; draw on HGR2 ORA zpHPLAYER STA zpHPLAYER JSR clearHGR2 ; clear HGR2 JSR L0ACC ; redraw sprites LDA TXTPAGE2 ; and show the page rts L0AB3 LDA zpHGRACTIVE ; we're on page 2 AND #$7F ; next is page 1 STA zpHGRACTIVE LDA TXTPAGE2 ; show HGR2 LDA zpHPLAYER ; draw on HGR1 AND #$7F STA zpHPLAYER JSR clearHGR1 ; clear HGR1 JSR L0ACC ; redraw sprites LDA TXTPAGE1 ; and show the page L0ACB RTS *---------- Draw all sprites? L0ACC JSR L0C0C JSR L1000 ; draw sprite 1 JSR L1013 ; draw sprite 2 JSR L1026 ; draw sprite 3 JSR L1039 ; draw sprite 4 jmp L104C ; draw sprite 5 *---------- Init game initALL LDA #$03 STA theLIVES LDA #$00 STA theSCORE STA theSCORE+1 STA L09CB STA L09DF STA L09C5 STA L09D5 STA L09C4 STA L09D6 STA L08D1 STA L08D3 STA |$00E9 STA L09CD STA L09CE STA L09CF STA L09D0 LDA #$1F STA L08D0 STA L08D2 LDA #$FF STA L09C3 LDA TXTCLR LDA MIXCLR LDA HIRES LDA TXTPAGE1 LDA #$40 ; player looks right STA zpHPLAYER LDA #$08 ; sprite for player STA $E8 LDA #$11 ; x-offset for player STA zpXPLAYER LDA #$1F STA L09D2 LDA #$21 STA L09D3 RTS *---------- Check x-position of player L0B43 LDA #$04 CMP zpXPLAYER BCC L0B4F LDA #$05 STA zpXPLAYER BNE L0B59 L0B4F LDA #$1C CMP zpXPLAYER BCS L0B59 LDA #$1C STA zpXPLAYER L0B59 SEC LDA L08D0 SBC zpXPLAYER STA L08D7 SEC LDA zpXPLAYER SBC L08D1 STA L08D8 SEC LDA L08D2 SBC zpXPLAYER STA L08D9 SEC LDA zpXPLAYER SBC L08D3 STA L08DA LDA #$02 CMP L08D7 BCC L0B90 INC L08D0 LDA L08D0 CMP #$1E BCC L0B90 DEC zpXPLAYER L0B90 LDA L08D0 CMP #$07 BCS L0B9F LDA #$07 STA L08D0 JMP L0BAB L0B9F LDA L08D0 CMP #$1E BCC L0BAB LDA #$1E STA L08D0 L0BAB LDA #$02 CMP L08D8 BCC L0BB9 DEC L08D1 BNE L0BB9 INC zpXPLAYER L0BB9 LDA L08D1 BMI L0BC2 CMP #$01 BCS L0BC5 L0BC2 INC L08D1 L0BC5 LDA L08D1 BMI L0BC2 JMP L0BD1 L0BD1 LDA #$02 CMP L08D9 BCC L0BE4 INC L08D2 LDA L08D2 CMP #$1E BCC L0BE4 DEC zpXPLAYER L0BE4 LDA L08D2 CMP #$07 BCS L0BF3 LDA #$07 STA L08D2 JMP L0BFF L0BF3 LDA L08D2 CMP #$1E BCC L0BFF LDA #$1E STA L08D2 L0BFF LDA L08D3 CMP #$21 BCC L0C0B LDA #$21 STA L08D3 L0C0B RTS L0C0C LDA zpXPLAYER STA zpXSCREEN LDA $E8 jmp drawSPRITE *---------- Handle keypress doKEYPRESS BIT KBD BPL L0C69 L0C1B LDA KBD STA zpKEY LDA #$00 STA KBDSTROBE STA L09CB LDA zpKEY CMP #"S" ; Switch direction BNE L0C4A BIT zpHPLAYER ; bit 6? BVC L0C3D ; is left turned? LDA zpHPLAYER ; no, turned right AND #$BF ; %1011_1111 STA zpHPLAYER ; now looks left LDA #$01 ; sprite 1 JMP L0C45 L0C3D LDA zpHPLAYER ; force bit 6 ORA #$40 ; now looks right STA zpHPLAYER LDA #$08 ; sprite 8 L0C45 STA $E8 JSR L0A8F ; draw next frame * BUG: keyboard value is not restored lda zpKEY L0C4A CMP #$C1 ; A BEQ L0CAE CMP #$C4 ; D BEQ L0C7C CMP #$C9 ; I BEQ L0C72 CMP #$CA ; J BEQ L0C75 CMP #$CB ; K BEQ L0C78 CMP #$CC ; L BEQ L0C6C CMP #$CD ; M BEQ L0C6F L0C66 JSR L0A8F L0C69 INC zpRANDOM ; randomize RTS L0C6C JMP L0D16 L0C6F JMP L0D45 L0C72 JMP L0CE0 L0C75 JMP L0CF2 L0C78 JMP L0D04 L0C7C BIT zpHPLAYER ; bit 6? BVC L0C97 ; player looks left? LDA #$09 ; right STA $E8 JSR L0A8F INC zpXPLAYER LDA #$0D STA $E8 JSR L0A8F LDA #$08 STA $E8 JMP L0C66 L0C97 LDA #$07 ; left STA $E8 JSR L0A8F INC zpXPLAYER LDA #$06 STA $E8 JSR L0A8F LDA #$01 STA $E8 JMP L0C66 *--- A - Move player to the left L0CAE BIT zpHPLAYER ; bit 6? BVC L0CC9 ; not set LDA #$0D STA $E8 JSR L0A8F ; au repos DEC zpXPLAYER ; x-- LDA #$09 STA $E8 JSR L0A8F ; LDA #$08 STA $E8 JMP L0C66 L0CC9 LDA #$06 STA $E8 JSR L0A8F DEC zpXPLAYER LDA #$07 STA $E8 JSR L0A8F LDA #$01 STA $E8 JMP L0C66 L0CE0 BIT zpHPLAYER ; bit 6? BVC L0CEB ; not set LDA #$0E STA $E8 JMP L0C66 L0CEB LDA #$02 STA $E8 JMP L0C66 L0CF2 BIT zpHPLAYER BVC L0CFD LDA #$0C STA $E8 JMP L0C66 L0CFD LDA #$03 STA $E8 JMP L0C66 L0D04 BIT zpHPLAYER BVC L0D0F LDA #$08 STA $E8 JMP L0C66 L0D0F LDA #$01 STA $E8 JMP L0C66 *---------- L0D16 LDA L09C3 BNE L0D25 LDY #$5A STY $50 JSR L0303 ; beep JMP L0CF2 L0D25 BIT zpHPLAYER BVC L0D37 LDA #$09 STA $E8 JSR L0A8F LDA #$0A STA $E8 JMP L0C66 L0D37 LDA #$07 STA $E8 JSR L0A8F LDA #$04 STA $E8 JMP L0C66 L0D45 BIT zpHPLAYER BVC L0D50 LDA #$0B STA $E8 JMP L0C66 L0D50 LDA #$05 STA $E8 JMP L0C66 *---------- Clear HGR1 clearHGR1 LDA #$00 LDX #$27 L0E04 STA $2028,X STA $2428,X STA $2828,X STA $2C28,X STA $3028,X STA $3428,X STA $3828,X STA $3C28,X STA $20A8,X STA $24A8,X STA $28A8,X STA $2CA8,X STA $30A8,X STA $34A8,X STA $38A8,X STA $3CA8,X STA $2128,X STA $2528,X STA $2928,X STA $2D28,X STA $3128,X STA $3528,X STA $3928,X STA $3D28,X STA $21A8,X STA $25A8,X STA $29A8,X STA $2DA8,X STA $31A8,X STA $35A8,X STA $39A8,X STA $3DA8,X STA $2228,X STA $2628,X STA $2A28,X STA $2E28,X STA $3228,X STA $3628,X STA $3A28,X STA $3E28,X STA $22A8,X STA $26A8,X STA $2AA8,X STA $2EA8,X STA $32A8,X STA $36A8,X STA $3AA8,X STA $3EA8,X STA $2328,X STA $2728,X STA $2B28,X STA $2F28,X STA $3328,X STA $3728,X STA $3B28,X STA $3F28,X STA $23A8,X STA $27A8,X STA $2BA8,X STA $2FA8,X STA $33A8,X STA $37A8,X STA $3BA8,X STA $3FA8,X DEX BPL L0EC8 RTS L0EC8 JMP L0E04 *---------- Clear HGR2 clearHGR2 LDA #$00 LDX #$27 L0F04 STA $4028,X STA $4428,X STA $4828,X STA $4C28,X STA $5028,X STA $5428,X STA $5828,X STA $5C28,X STA $40A8,X STA $44A8,X STA $48A8,X STA $4CA8,X STA $50A8,X STA $54A8,X STA $58A8,X STA $5CA8,X STA $4128,X STA $4528,X STA $4928,X STA $4D28,X STA $5128,X STA $5528,X STA $5928,X STA $5D28,X STA $41A8,X STA $45A8,X STA $49A8,X STA $4DA8,X STA $51A8,X STA $55A8,X STA $59A8,X STA $5DA8,X STA $4228,X STA $4628,X STA $4A28,X STA $4E28,X STA $5228,X STA $5628,X STA $5A28,X STA $5E28,X STA $42A8,X STA $46A8,X STA $4AA8,X STA $4EA8,X STA $52A8,X STA $56A8,X STA $5AA8,X STA $5EA8,X STA $4328,X STA $4728,X STA $4B28,X STA $4F28,X STA $5328,X STA $5728,X STA $5B28,X STA $5F28,X STA $43A8,X STA $47A8,X STA $4BA8,X STA $4FA8,X STA $53A8,X STA $57A8,X STA $5BA8,X STA $5FA8,X DEX BPL L0FC8 RTS L0FC8 JMP L0F04 *---------- Draw all sprites L1000 LDA L08D0 L1003 STA zpXSCREEN LDA L08DE BIT |$00E9 BMI L100F LDA #$10 L100F jmp drawSPRITE L1013 LDA L08D1 STA zpXSCREEN LDA L09D1 BIT L09CD BMI L1022 LDA #$10 L1022 jmp drawSPRITE L1026 LDA L08D2 STA zpXSCREEN LDA L09D2 BIT L09CE BMI L1035 LDA #$10 L1035 jmp drawSPRITE L1039 LDA L08D3 STA zpXSCREEN LDA L09D3 BIT L09CF BMI L1048 LDA #$10 L1048 jmp drawSPRITE L104C LDA L08D4 STA zpXSCREEN LDA L09D4 BIT L09D0 BMI L105B LDA #$10 L105B jmp drawSPRITE *---------- L105F BIT |$00E9 BPL L10E1 BVC L106E LDA #$17 STA L08DE JMP L10E1 L106E JMP L15DA L1071 BIT L09C4 BMI L10AB LDA L09C5 CMP #$05 BCS L1091 LDY zpRANDOM LDA L1D00,Y CMP #$30 BCS L10AE L1086 LDA #$80 ORA L09C4 STA L09C4 JMP L10A1 L1091 LDY zpRANDOM LDA L1D00,Y CMP #$20 BCC L10AE CMP #$40 BCC L1086 JMP L10AE L10A1 BIT |$00E9 BPL L10E1 BIT L09C4 BPL L10AE L10AB JMP L1209 L10AE LDY zpRANDOM LDA L1D00,Y STA $EB ; sprite AND #$07 TAY LDA L1E00,Y STA L08DE LDA $EB CMP #$E6 BCS L10CB CMP #$64 BCC L10D6 JMP L10DE L10CB INC L08D0 LDA #$11 STA L08DE JMP L10DE L10D6 DEC L08D0 LDA #$11 STA L08DE L10DE jmp L0A8F L10E1 RTS *---------- L10E2 BIT zpHPLAYER BVC L10F9 JSR L165D LDA $E8 CMP #$0A BEQ L10FF CMP #$0C BEQ L10F6 rts ; JMP L1208 L10F6 JMP L1167 L10F9 JSR L1680 JMP L138B L10FF BIT |$00E9 BPL L114C BVS L114C LDA L08D7 CMP #$0D BCS L114C LDA L08DE CMP #$11 BEQ L1164 LDA #$09 CMP L08D7 BCC L114C L111B LDA #$16 STA L08DE INC L09C5 JSR L0A8F JSR L11C7 JSR L11D1 JSR L11F1 ; check next level LDA #$17 STA L08DE LDA #$0E STA $E8 JSR L0A8F LDA |$00E9 ORA #$40 STA |$00E9 JSR L11FE JSR L11E1 jmp L114F L114C rts ; JMP L1208 L114F NOP NOP NOP NOP LDA theSCORE CMP #$17 BNE L115D INC theLIVES ; new lives L115D jmp L1854 L1164 JMP L1186 L1167 BIT |$00E9 BPL L114C BVS L114C LDA L08D7 CMP #$0A BCS L114C LDA L08DE CMP #$11 BEQ L1186 LDA #$05 CMP L08D7 BCC L114C JMP L111B L1186 LDX #$3C STX $50 JSR L0303 INC zpRANDOM INC L09CB INC L08D0 LDA L09CB CMP #$01 BEQ L11C4 LDA #$08 CMP L09C5 BCS L11C4 DEC L08D0 JSR L1261 JSR L0A8F L11AC BIT KBD BMI L11C1 JSR L143B INC zpRANDOM BNE L11AC DEC L08D0 JSR L1261 JSR L0A8F L11C1 JMP L0C1B L11C4 rts ; JMP L1208 *---------- Ennemy is killed L11C7 LDA #$96 STA $50 LDX #$64 jmp L0303 *---------- Wait L11D1 LDA #$05 STA L09CA L11D6 LDA #$FF JSR WAIT DEC L09CA BNE L11D6 RTS *---------- Wait L11E1 LDA #$02 STA L09CA L11E6 LDA #$FF JSR WAIT DEC L09CA BNE L11E6 RTS L11F1 CLC INC theSCORE BCC L11FA INC theSCORE+1 L11FA JMP L1B76 ; next level *---------- Play sound L11FE LDA #$1E STA $50 LDY #$1E jmp L0303 L1209 BIT L09C4 BVS L121E LDA #$40 ORA L09C4 STA L09C4 JSR L1252 LDA #$08 STA L09C9 L121E DEC L09C9 BNE L122E LDA #$BF AND L09C4 STA L09C4 JMP L10AE L122E LDY L09C7 LDA L1E80,Y STA L09C8 AND #$1F STA L08DE BIT L09C8 BPL L124C BVC L1249 DEC L08D0 JMP L124C L1249 INC L08D0 L124C DEC L09C7 JMP L10DE L1252 LDY zpRANDOM LDA L1D00,Y AND #$07 TAY LDA L1E40,Y STA L09C7 RTS *---------- L1261 BIT |$00E9 BPL L1280 BVS L1280 LDA L08DE CMP #$11 BNE L1272 JMP L1281 L1272 CMP #$13 BNE L1279 JMP L12D6 ; is player hit? L1279 CMP #$14 BNE L1280 JMP L131D L1280 RTS L1281 LDA L08D7 CMP #$04 BCC L12D0 CMP #$06 BCS L129A LDA $E8 CMP #$0A BEQ L12D0 ; I'm hit! CMP #$08 BEQ L12D3 CMP #$0C BEQ L12D3 L129A LDA L08D7 CMP #$07 BCS L12AF LDA $E8 CMP #$08 BEQ L12D3 CMP #$0A BEQ L12D3 CMP #$0C BEQ L12D3 L12AF LDA L08D7 CMP #$0A BCS L12C0 LDA $E8 CMP #$0A BEQ L1333 CMP #$0C BEQ L1333 L12C0 LDA L08D7 CMP #$0E BCS L1280 LDA $E8 CMP #$0A BNE L1280 JMP L1333 L12D0 JMP playerHIT ; player is hit! L12D3 JMP L1333 L12D6 LDA L08D7 CMP #$03 BCS L12E6 LDA $E8 CMP #$0E BEQ L12E6 JMP playerHIT ; player is hit! L12E6 LDA L08D7 CMP #$04 BCS L12FA LDA $E8 CMP #$08 BCS L12FA CMP #$04 BEQ L12FA JMP playerHIT L12FA LDA L08D7 CMP #$05 BCS L130A LDA $E8 CMP #$0E BNE L130A JMP L1333 L130A LDA L08D7 CMP #$06 BCS L131A LDA $E8 CMP #$0A BNE L131A JMP playerHIT L131A JMP L1280 L131D LDA L08D7 CMP #$05 BCS L1330 LDA #$00 STA L09C3 LDX #$5A STX $50 JSR L0303 L1330 JMP L1280 L1333 LDX #$3C STX $50 JSR L0303 INC L08D0 JMP L1280 *---------- Player is hit playerHIT LDA #$0F ; show sprite HIT STA $E8 JSR L0A8F JSR L1381 ; play sound JSR L11D1 ; wait LDA #$00 ; show sprite DEAD STA $E8 STA L09DF JSR L0A8F JSR L11FE ; play sound LDA #$80 STA L09C3 JSR L11E1 ; wait JSR L136B ; go die JSR showALL JMP L180D L136B DEC theLIVES ; lives-- BEQ L1374 NOP NOP NOP RTS L1374 LDX #$FF ; i'm dead STX $50 JSR L0303 LDA #$00 ; game over STA fgPLAY RTS L1381 LDA #$28 ; ouch sound STA $50 LDX #$C8 JSR L0303 RTS L138B BIT L09CD BPL L13FC BVS L13FC LDA $E8 CMP #$04 BNE L13A9 LDA L08D8 CMP #$09 BCS L13A2 JMP L1402 L13A2 CMP #$0C BCS L13FC JMP L13BB L13A9 CMP #$03 BNE L13FC LDA L08D8 CMP #$06 BCS L13B7 JMP L1402 L13B7 CMP #$07 BCS L1433 L13BB LDX #$3C STX $50 JSR L0303 INC zpRANDOM INC L09CB DEC L08D1 LDA L09CB CMP #$01 BEQ L13FF LDA #$08 CMP L09C5 BCS L13FF INC L08D1 JSR L14E4 JSR L0A8F L13E1 BIT KBD BMI L13F6 JSR L143B INC zpRANDOM BNE L13E1 INC L08D1 JSR L14E4 JSR L0A8F L13F6 JMP L0C1B JMP L1437 L13FC JMP L1433 L13FF JMP L1433 L1402 LDA #$1D STA L09D1 INC L09D5 JSR L0A8F JSR L11C7 JSR L11D1 JSR L11F1 ; check next level LDA #$1E STA L09D1 LDA #$02 STA $E8 JSR L0A8F LDA L09CD ORA #$40 STA L09CD JSR L11FE JSR L11E1 jmp L114F L1433 RTS L1437 NOP NOP NOP RTS L143B JSR L1454 JSR L14E4 JSR L14A5 JSR L1537 NOP NOP NOP JSR L154A JSR L14E0 jmp L157B *---------- L1454 BIT L09CD BPL L14A4 BVC L1463 LDA #$1E STA L09D1 JMP L14A4 L1463 JMP L161C L1466 BIT L09D6 BPL L146E JMP L157F L146E LDY zpRANDOM LDA L1D00,Y STA $EB AND #$07 ORA #$08 TAY LDA L1E00,Y STA L09D1 LDA $EB CMP #$5A BCS L148D LDA #$80 STA L09D6 LDA $EB L148D CMP #$E6 BCS L1498 CMP #$50 BCS L149E JMP L14A1 L1498 INC L08D1 JMP L14A1 L149E DEC L08D1 L14A1 jmp L0A8F L14A4 RTS *---------- L14A5 BIT L09CE BPL L14C1 LDA L09D2 CMP #$1F BEQ L14B9 LDA #$1F STA L09D2 JMP L14C1 L14B9 LDA #$20 STA L09D2 DEC L08D2 L14C1 RTS L14C2 BIT L09CF BPL L14DE LDA L09D3 CMP #$21 BEQ L14D6 LDA #$21 STA L09D3 JMP L14DE L14D6 LDA #$22 STA L09D3 INC L08D3 L14DE RTS L14E0 NOP NOP NOP RTS *---------- L14E4 BIT L09CD BPL L1519 BVS L1519 LDA L09D1 CMP #$1B BNE L14F5 JMP L151A L14F5 CMP #$1C BEQ L1524 LDA L08D8 CMP #$04 BCC L1534 L1500 CMP #$09 ; difficulty? BCS L1519 LDA $E8 CMP #$08 BCS L1519 CMP #$02 BEQ L1519 CMP #$05 BEQ L1519 L1512 LDX #$3C STX $50 jmp L0303 L1519 RTS L151A LDA L08D8 CMP #$05 BCC L1534 JMP L1519 L1524 LDA L08D8 CMP #$05 BCS L1519 LDA $E8 CMP #$05 BEQ L1512 JMP L1534 L1534 JMP playerHIT *---------- L1537 BIT L09CE BPL L1546 LDA #$05 CMP L08D9 BCC L1546 JMP playerHIT L1546 RTS *---------- L154A BIT L09CF BPL L1577 LDA #$04 CMP L08DA BCC L1577 LDA #$00 STA L09C3 LDX #$5A STX $50 JSR L0303 LDA #$00 STA L09CF STA L08D3 INC L09DF LDA L09DF CMP #$04 BCC L1577 JMP playerHIT L1577 RTS L157B NOP NOP NOP RTS L157F NOP NOP NOP BIT L09D6 BVS L1597 LDA #$40 ORA L09D6 STA L09D6 JSR L15CB LDA #$08 STA L09D9 L1597 DEC L09D9 BNE L15A7 LDA #$BF AND L09D6 STA L09D6 JMP L146E L15A7 LDY L09D7 LDA L1E80,Y STA L09D8 AND #$1F STA L09D1 BIT L09D8 BPL L15C5 BVC L15C2 INC L08D1 JMP L15C5 L15C2 DEC L08D1 L15C5 DEC L09D7 JMP L14A1 L15CB LDY zpRANDOM LDA L1D00,Y AND #$07 TAY LDA L1E48,Y STA L09D7 RTS L15DA BIT L09DA BMI L1606 LDA L09C5 CMP #$20 BCS L1615 CMP #$0C BCS L15FE CMP #$02 BCS L15F6 LDA #$86 STA L09DA JMP L1618 L15F6 LDA #$84 STA L09DA JMP L1618 L15FE LDA #$82 STA L09DA JMP L1618 L1606 DEC L09DA LDA #$80 CMP L09DA BNE L1618 LDA #$00 STA L09DA L1615 JMP L1071 L1618 JMP L10DE L161C BIT L09DB BMI L1648 LDA L09D5 CMP #$19 BCS L1657 CMP #$08 BCS L1638 CMP #$02 BCS L1640 LDA #$86 STA L09DB JMP L165A L1638 LDA #$84 STA L09DB JMP L165A L1640 LDA #$82 STA L09DB JMP L165A L1648 DEC L09DB LDA #$80 CMP L09DB BNE L165A LDA #$00 STA L09DB L1657 JMP L1466 L165A JMP L14A1 L165D BIT L09CE BPL L167F LDA $E8 CMP #$0B BNE L167F LDA #$06 CMP L08D9 BCC L167F JSR L11C7 JSR L11F1 ; check next level LDA #$00 STA L09CE LDA #$23 STA L08D2 L167F RTS L1680 BIT L09CF BPL L169D LDA $E8 CMP #$05 BNE L169D LDA #$05 CMP L08DA BCC L169D JSR L11C7 LDA #$00 STA L09CF STA L08D3 L169D RTS *---------- Pointer to sprites * The first 4 bytes are copied to $FA..$FD tblSPRITES DA $7B06 ; 00 player is dead DA $6000 ; 01 player left DA $6184 ; 02 " DA $6348 ; 03 " DA $655B ; 04 " DA $67CF ; 05 " DA $6953 ; 06 " DA $6AD7 ; 07 " DA $6C5B ; 08 player right DA $6DEE ; 09 " DA $6F72 ; 0A " DA $7246 ; 0B " DA $73CA ; 0C " DA $763E ; 0D " DA $77BE ; 0E " DA $7982 ; 0F " is wounded DA $7C10 ; 10 empty DA $8000 ; 11 foe right DA $81E4 ; 12 " DA $8418 ; 13 " DA $864C ; 14 " DA $8830 ; 15 " DA $8A14 ; 16 " DA $8C48 ; 17 " is dead DA $8D3D ; 18 foe left DA $8F0E ; 19 " DA $90DF ; 1A " DA $92B0 ; 1B " DA $9480 ; 1C " DA $9666 ; 1D " DA $97DB ; 1E " is dead DA $9858 ; 1F animal right DA $98EC ; 20 " DA $9980 ; 21 animal left DA $9A14 ; 22 " DA $9AA8 ; The rest is... nothing *---------- playGAME JSR initALL ; init all LDA #$FF STA fgPLAY ; game is active LDA #$80 STA |$00E9 L180D LDA #$00 STA L08D1 STA L09CE STA L09CF STA L08D3 LDA #$20 STA L08D0 STA L08D2 LDA #$10 ; x-pos of player STA zpXPLAYER *--- The main game loop L1827 JSR doKEYPRESS JSR L105F JSR L19D5 JSR L1454 ; JSR L14A5 ; JSR L14C2 ; JSR L10E2 ; JSR L1261 ; JSR L14E4 ; JSR L1537 ; JSR L154A ; LDA fgPLAY ; am I dead BNE L1827 ; for real? RTS ; yes! *---------- L1854 NOP LDA theSCORE+1 BEQ L185D JMP L18C8 L185D LDA theSCORE CMP #$02 BCS L188A AND #$01 BEQ L1878 LDA #$00 STA L08D1 STA |$00E9 LDA #$80 STA L09CD JMP L18C3 L1878 LDA #$20 STA L08D0 LDA #$00 STA L09CD LDA #$80 STA |$00E9 JMP L18C3 L188A BIT |$00E9 BPL L1891 BVC L18C4 L1891 BIT L09CD BPL L1898 BVC L18C4 L1898 LDA #$80 STA |$00E9 STA L09CD JMP L1A78 *---------- L18B3 LDA #$00 STA L08D1 LDA #$20 STA L08D0 JMP L18C3 JMP L18C8 L18C3 NOP L18C4 jmp L0A8F L18C8 LDA #$3C STA L09DD jmp L1A04 *---------- Calculate offset of font char calcFOFFSET STX saveX STY saveY LDA #theFONT STA L1939+2 LDX #$20 ; space L18EC CPX charFONT ; the char BEQ L1904 INX CLC LDA #$08 ; offset+8 ADC L1939+1 STA L1939+1 BCC L1900 INC L1939+2 L1900 CPX #$7E ; last char BNE L18EC L1904 LDX saveX LDY saveY RTS *---------- Draw a char printCHAR1 LDA #$20 ; on HGR1 STA pageHGR bne L1918 printCHAR2 LDA #$40 ; or HGR2 STA pageHGR *---------- Draw a char on screen L1918 STX saveX STY saveY LDY zpYBEGIN ; Y start CLC LDA #$08 ADC zpYBEGIN STA zpYEND ; Y end LDX zpXSCREEN L1929 LDA ptrLINEH,Y CLC ADC pageHGR STA L193C+2 LDA ptrLINEL,Y STA L193C+1 L1939 LDA theFONT L193C STA $5E50,X INC L1939+1 BNE L1947 INC L1939+2 L1947 INY CPY zpYEND ; the end? BNE L1929 LDX saveX ; restore LDY saveY RTS *---------- Print C string printCSTR STA L195B+1 STY L195B+2 LDX #$00 L195B LDA |$009F,X ; get a char BEQ L1988 STA charFONT ; the char JSR calcFOFFSET ; calc offset in font BIT zpHPLAYER ; which page to draw? BPL L1970 JSR printCHAR2 ; HGR2 JMP L1973 L1970 JSR printCHAR1 ; HGR1 L1973 INC zpXSCREEN ; next X LDA zpXSCREEN CMP #$28 BNE L1985 LDA #$00 ; next Y STA zpXSCREEN LDA #$08 ADC zpYBEGIN STA zpYBEGIN L1985 INX BNE L195B L1988 RTS *---------- Show score and lives showALL LDA zpHPLAYER STA saveHPLAYER AND #$7F STA zpHPLAYER JSR showSCORE JSR showLIVES LDA zpHPLAYER ORA #$80 STA zpHPLAYER JSR showSCORE JSR showLIVES LDA saveHPLAYER STA zpHPLAYER RTS *---------- showSCORE LDA #$0E STA zpXSCREEN LDA #$A0 STA zpYBEGIN LDA theSCORE STA $9F LDA theSCORE+1 STA $9E LDA #$90 STA $9D LDA #$00 STA $A0 STA $A1 STA $A2 JSR $ED34 ; convert fac jmp printCSTR ; print score *---------- L19CF JMP L1A68 L19D2 JMP L1A6E *---------- L19D5 LDA L09C5 CMP #$05 BEQ L19CF CMP #$0D BEQ L19CF CMP #$16 BEQ L19CF LDA L09D5 CMP #$06 BEQ L19D2 CMP #$0B BEQ L19D2 CMP #$13 BEQ L19D2 CMP #$17 BEQ L19D2 LDA theSCORE CMP #$13 BCC L1A47 AND #$01 BNE L1A47 LDA #$0C L1A04 STA L09DD LDY zpRANDOM LDA L1D00,Y CMP L09DD BNE L1A14 JMP L1A22 L1A14 CMP #$27 BNE L1A1B JMP L1A36 L1A1B CMP #$54 BNE L1A47 JMP L1A36 L1A22 LDA #$80 STA L09CE LDA #$21 STA L08D2 LDX #$6E STX $50 JSR L0303 JMP L1A47 L1A36 LDA #$80 STA L09CF LDA #$00 STA L08D3 LDX #$B4 STX $50 JSR L0303 L1A47 RTS *---------- showLIVES CLC LDA theLIVES BPL L1A50 LDA #$00 L1A50 ADC #$30 STA $9F LDA #$22 STA zpXSCREEN LDA #$A0 STA zpYBEGIN LDA #$00 STA $A0 LDA #$9F LDY #$00 jmp printCSTR ; print lives L1A68 INC L09C5 JMP L1A36 L1A6E INC L09D5 JMP L1A22 *---------- L1A78 LDA L09C5 CMP #$05 BCC L1AB9 CMP #$08 BCC L1A92 CMP #$0C BCC L1A98 CMP #$10 BCC L1A9E CMP #$14 BCC L1AA4 JMP L1AAA L1A92 INC L08D0 DEC L08D1 L1A98 INC L08D0 DEC L08D1 L1A9E INC L08D0 DEC L08D1 L1AA4 INC L08D0 DEC L08D1 L1AAA INC L08D0 DEC L08D1 INC L08D0 DEC L08D1 JMP L1ABC L1AB9 JMP L18B3 L1ABC JSR L0B43 JMP L18C3 *---------- Entry point L1B00 LDA #$00 STA L0328 STA L031E ; S0 LDA #$03 STA L031D ; T3 LDA #$08 STA L0328+1 ; $0800..$0FFF LDA #$07 STA L031F ; until S7 L1B17 JSR L033D ; read TS INC L031E INC L0328+1 LDA L031E CMP L031F BNE L1B17 JSR L033D ; read T3/S7 LDA #$09 ; Load T9-A LDX #$00 ; $6000..$7FFF LDY #$60 JSR L0366 *---------- Main loop L1B34 LDA #$0F ; Load TF-10 LDX #$00 ; $8000..$8FFF LDY #$80 JSR L0366 LDA #$15 ; Load T15-16 LDX #$00 ; $2000..$3FFF LDY #$20 JSR L0366 JSR L1CAC ; clear text line 23 L1B49 BIT KBD BPL L1B49 LDA #$00 STA KBDSTROBE JSR L1CB7 ; show score JSR playGAME ; play * if we're back here, the player is dead JSR HOME ; clear text LDA #$03 ; Load T3/SC STA L031D ; $4000..$40FF LDA #$0C STA L031E LDA #L4000 STA L0328+1 JSR L033D JMP L4000 ; and jump *---------- L1B76 LDA theSCORE CMP #$15 ; harder, new foes BEQ L1B9C CMP #$21 ; new image, new foes BEQ L1BA6 CMP #$2B ; new foes BEQ L1BB0 CMP #$36 ; new image, new foes BEQ L1BB5 CMP #$3E ; new foes BEQ L1BBF CMP #$4A ; new foes BEQ L1BC4 CMP #$53 ; new foes BEQ L1BC9 CMP #$62 ; new foes BEQ L1BCE JMP showALL L1B9C LDA #$09 STA L1500+1 ; more difficult LDA #$0B JMP loadSPRFOE L1BA6 LDA #$13 JSR loadIMAGE LDA #$1F JMP loadSPRFOE L1BB0 LDA #$1B JMP loadSPRFOE L1BB5 LDA #$05 JSR loadIMAGE LDA #$0B JMP loadSPRFOE L1BBF LDA #$17 JMP loadSPRFOE L1BC4 LDA #$21 JMP loadSPRFOE L1BC9 LDA #$19 JMP loadSPRFOE L1BCE LDA #$0D JMP loadSPRFOE *---------- Load foe sprite data loadSPRFOE LDX #$00 LDY #$80 JSR L0366 JMP L180D *---------- Load new background image loadIMAGE STA TXTPAGE2 LDX #$00 LDY #$20 JSR L0366 JSR blitHGR jmp showALL *---------- Copy HGR1 onto HGR2 blitHGR CLC L1C81 LDX #$00 L1C83 LDA $2000,X L1C86 STA $4000,X INX BNE L1C83 INC L1C83+2 INC L1C86+2 LDA L1C83+2 CMP #$40 BNE L1C81 LDA #$20 STA L1C83+2 LDA #$40 STA L1C86+2 LDA #$00 STA L1C83+1 STA L1C86+1 RTS *---------- Clear last line of text L1CAC LDX #$27 LDA #$A0 L1CB0 STA $07D0,X DEX BPL L1CB0 RTS *---------- Init game L1CB7 LDA #$00 ; Max score is 3 STA theSCORE STA theSCORE+1 LDA #$03 STA theLIVES JSR showALL ; show it JSR blitHGR ; copy HGR LDA #$05 STA L1500+1 ; difficulty RTS *---------- Table to sprite index L1D00 DB $41 DB $2B DB $9A DB $A1 DB $43 DB $37 DB $F7 DB $86 DB $3A DB $5E DB $C8 DB $A5 DB $8E DB $A2 DB $C1 DB $1C DB $B9 DB $14 DB $33 DB $BF DB $A9 DB $75 DB $13 DB $72 DB $42 DB $1D DB $C7 DB $CF DB $C4 DB $3D DB $95 DB $27 DB $80 DB $84 DB $F2 DB $CE DB $99 DB $A6 DB $FB DB $7C DB $2A DB $CA DB $AF DB $16 DB $FA DB $AD DB $40 DB $4E DB $35 DB $68 DB $E2 DB $46 DB $AC DB $07 DB $23 DB $02 DB $6E DB $B6 DB $F3 DB $85 DB $63 DB $0A DB $52 DB $D0 DB $9D DB $74 DB $C2 DB $DA DB $2D DB $71 DB $0B DB $88 DB $D9 DB $9C DB $8C DB $20 DB $67 DB $83 DB $79 DB $2C DB $5B DB $B3 DB $4C DB $62 DB $DD DB $F4 DB $6D DB $87 DB $59 DB $C5 DB $F1 DB $F5 DB $81 DB $7F DB $3B DB $C9 DB $66 DB $BC DB $12 DB $57 DB $10 DB $53 DB $E8 DB $09 DB $AA DB $21 DB $49 DB $C0 DB $8B DB $2E DB $9E DB $6B DB $45 DB $A3 DB $82 DB $00 DB $6F DB $C6 DB $6A DB $AB DB $03 DB $15 DB $58 DB $06 DB $08 DB $E4 DB $DC DB $78 DB $ED DB $D5 DB $FE DB $9F DB $A7 DB $0E DB $FC DB $BD DB $FF DB $0C DB $B0 DB $B7 DB $4D DB $D6 DB $0D DB $D8 DB $B2 DB $32 DB $EF DB $DE DB $5F DB $F8 DB $69 DB $7D DB $7B DB $BA DB $B4 DB $6C DB $48 DB $92 DB $EC DB $E9 DB $BE DB $28 DB $E7 DB $FD DB $17 DB $7A DB $11 DB $8A DB $56 DB $22 DB $04 DB $C3 DB $8D DB $34 DB $F6 DB $2F DB $01 DB $26 DB $29 DB $24 DB $7E DB $30 DB $5A DB $76 DB $EB DB $E1 DB $60 DB $61 DB $96 DB $3F DB $4B DB $77 DB $B1 DB $F9 DB $D4 DB $E6 DB $D1 DB $90 DB $3C DB $94 DB $97 DB $E3 DB $93 DB $50 DB $05 DB $5C DB $89 DB $EE DB $DF DB $51 DB $73 DB $D3 DB $36 DB $1F DB $D2 DB $39 DB $F0 DB $E0 DB $B8 DB $25 DB $BB DB $8F DB $B5 DB $DB DB $0F DB $38 DB $D7 DB $3E DB $4A DB $64 DB $CB DB $91 DB $A8 DB $55 DB $54 DB $CC DB $A4 DB $65 DB $1E DB $4F DB $1A DB $5D DB $47 DB $A0 DB $1B DB $9B DB $98 DB $CD DB $31 DB $E5 DB $70 DB $18 DB $AE DB $EA DB $44 DB $00 *---------- L1E00 DB $11 DB $12 DB $13 DB $14 DB $15 DB $11 DB $12 DB $11 DB $18 DB $19 DB $1A DB $1B DB $18 DB $1A DB $19 DB $1B DB $1F DB $1E DB $1F DB $1E DB $1F DB $1E DB $1F DB $1E DB $1D DB $1E DB $1F DB $1E DB $1F DB $1E DB $1F DB $1E DB $1F DB $1D DB $1F DB $B5 DB $00 DB $85 DB $00 DB $B5 DB $01 DB $85 DB $01 DB $4C DB $91 DB $1D DB $A5 DB $00 DB $95 DB $00 DB $A5 DB $01 DB $95 DB $01 DB $4C DB $91 DB $1D DB $A5 DB $00 DB $81 DB $00 DB $A0 DB $00 DB $84 L1E40 DB $07 ; 00-2F DB $0F DB $17 DB $1F DB $27 DB $2F DB $07 DB $1F L1E48 DB $37 ; 37-5F DB $3F DB $47 DB $4F DB $57 DB $5F DB $37 DB $3F *--- L1E80 DB $D3 ; The table DB $D2 ; ends at $1E80+$5F DB $D1 ; ...$1EDF DB $D1 DB $D2 DB $D1 DB $D1 DB $D1 DB $93 DB $94 DB $93 DB $92 DB $91 DB $91 DB $91 DB $91 DB $11 DB $D1 DB $D1 DB $D1 DB $92 DB $94 DB $93 DB $91 DB $11 DB $D1 DB $D1 DB $D1 DB $D1 DB $D1 DB $D1 DB $12 DB $D2 DB $D1 DB $D2 DB $D1 DB $D2 DB $D1 DB $D2 DB $D1 DB $D1 DB $D1 DB $92 DB $91 DB $91 DB $D1 DB $D2 DB $D1 DB $19 DB $18 DB $DA DB $19 DB $18 DB $DA DB $19 DB $DB DB $98 DB $18 DB $19 DB $9A DB $DB DB $DB DB $DB DB $DB DB $DA DB $18 DB $DA DB $19 DB $18 DB $18 DB $DB DB $DB DB $18 DB $D8 DB $1A DB $19 DB $D8 DB $DB DB $19 DB $DB DB $DB DB $DB DB $DB DB $DB DB $DB DB $D8 DB $1A DB $19 DB $9B DB $1C DB $9B DB $19 DB $1A DB $18 DB $99 DB $18 DB $01 DB $F5 DB $01 DB $99 DB $01 DB $00 DB $98 DB $69 DB $00 DB $85 DB $1D DB $4C DB $91 DB $1D DB $A5 DB $00 DB $75 DB $00 DB $85 DB $00 DB $A5 DB $01 DB $75 DB $01 DB $A0 DB $00 DB $99 DB $01 DB $00 DB $98 DB $69 DB $7F *---------- The font theFONT DB $00 DB $00 DB $00 DB $00 DB $00 DB $00 DB $00 DB $00 DB $08 DB $08 DB $08 DB $08 DB $08 DB $00 DB $08 DB $00 DB $14 DB $14 DB $14 DB $00 DB $00 DB $00 DB $00 DB $00 DB $28 DB $94 DB $7E DB $14 DB $BF DB $8A DB $0A DB $00 DB $08 DB $3C DB $0A DB $1C DB $28 DB $1E DB $08 DB $00 DB $06 DB $26 DB $10 DB $08 DB $04 DB $32 DB $30 DB $00 DB $04 DB $0A DB $0A DB $04 DB $2A DB $12 DB $2C DB $00 DB $08 DB $08 DB $08 DB $00 DB $00 DB $00 DB $00 DB $00 DB $08 DB $04 DB $02 DB $02 DB $02 DB $04 DB $08 DB $00 DB $08 DB $10 DB $20 DB $20 DB $20 DB $10 DB $08 DB $00 DB $08 DB $2A DB $1C DB $08 DB $1C DB $2A DB $08 DB $00 DB $00 DB $08 DB $08 DB $3E DB $08 DB $08 DB $00 DB $00 DB $00 DB $00 DB $00 DB $00 DB $00 DB $8C DB $88 DB $84 DB $00 DB $00 DB $00 DB $3E DB $00 DB $00 DB $00 DB $00 DB $00 DB $00 DB $00 DB $00 DB $00 DB $00 DB $8C DB $00 DB $00 DB $20 DB $10 DB $08 DB $04 DB $02 DB $00 DB $00 DB $8C DB $92 DB $22 DB $22 DB $22 DB $92 DB $8C DB $00 DB $08 DB $0C DB $08 DB $08 DB $08 DB $08 DB $1C DB $00 DB $1C DB $22 DB $20 DB $10 DB $84 DB $82 DB $3E DB $00 DB $3E DB $90 DB $10 DB $18 DB $20 DB $22 DB $1C DB $00 DB $10 DB $18 DB $14 DB $12 DB $3E DB $10 DB $10 DB $00 DB $3E DB $02 DB $1E DB $20 DB $20 DB $22 DB $1C DB $00 DB $18 DB $04 DB $82 DB $1E DB $22 DB $22 DB $1C DB $00 DB $3E DB $90 DB $10 DB $88 DB $08 DB $84 DB $04 DB $00 DB $1C DB $22 DB $22 DB $1C DB $22 DB $22 DB $1C DB $00 DB $1C DB $22 DB $22 DB $3C DB $90 DB $10 DB $0C DB $00 DB $00 DB $00 DB $8C DB $00 DB $00 DB $8C DB $00 DB $00 DB $00 DB $00 DB $8C DB $00 DB $00 DB $8C DB $88 DB $84 DB $10 DB $08 DB $04 DB $02 DB $04 DB $08 DB $10 DB $00 DB $00 DB $00 DB $3E DB $00 DB $3E DB $00 DB $00 DB $00 DB $04 DB $08 DB $10 DB $20 DB $10 DB $08 DB $04 DB $00 DB $1C DB $22 DB $90 DB $88 DB $08 DB $00 DB $08 DB $00 *---------------------------- put SB.0300 put SB.4000 *---------- End of code