;z80 ;zx-spectrum ;assembler org 0x81FD jp start incbin "sprites.bin" start: di ld sp,0x9CFE ; ATTENTION! jp game_setup current_cavern: ; 0x8407 defb 0 d8408: defb 0,1,0,1,1,3,1,3,2,0,2,0,0,1,2,3 air_string: ; 0x8418 defs "AIR" zero_zone: defs "00000000000000000000" score_string: ; 0x842F defs "High Score 000000 Score 000000" game_string: defs "Game" ; 0x844F over_string: defs "Over" ; 0x8453 lives_left: ; 0x8457 defb 2 b8458: defb 0 kemp: defb 0 ;Kempston joystick flag demo: defb 0 ;Demo mode? b845B: defb 0 b845C: defb 1 cheat: defb 0 ;Cheat mode? defw 0x1F1F cheat_table: defw 0x1F0F defw 0x0F1F defw 0x1E1F defw 0x1F1B defw 0x1F1D defw 0x1F17 defw 0x1B1F defw 0x1F0F defw 0x1F1B defw 0x1F17 tune: incbin "tune.bin" ; 0x8474 unkn_0: incbin "unkn_0.bin" ; 0x8592 game_setup: xor a ld (current_cavern),a ld (kemp),a ld (demo),a ld (b845B),a ld (b8458),a ld a,2 ld (lives_left),a ld hl,b845C set 0,(hl) ld hl,0x4000 ld de,0x4001 ld bc,0x17FF ld (hl),0 ldir ; clears the screen ld hl,high_and_mid_bmp ld de,0x4000 ld bc,0x1000 ld a,0xC9 call decomp ; ldir ; show top 2 thirds of title bmp ld hl,0x483D ld de,0x8240 ; ATTENTION! ld c,0 call put_sprite ld de,0x5800 ld hl,attribs ld bc,0x0300 ld a,0xc9 call decomp ; show attribs ld bc,0x001F di xor a kemp_detect_loop: in e,(c) or e djnz kemp_detect_loop and 0x20 jr nz,no_kemp ld a,1 ld (kemp),a no_kemp: ; 8x8635 ld iy,tune call sub_92E7 jp nz,init_score xor a ld (0x80DC),a scroll_loop: ld a,(0x80DC) ld ix,scrolly_mess defb 0xDD add a,l defb 0xDD ld l,a ld a,0 defb 0xDD adc a,h defb 0xDD ld h,a ld de,0x5060 ld c,0x20 call put_string ld a,(0x80DC) and 6 rrca rrca rrca ld e,a ld d,0x82 ld hl,0x483D ld c,0 call put_sprite ld bc,0x64 delay_1: djnz delay_1 dec c jr nz,delay_1 ; insert call to game selection code ld bc,0xAFFE in a,(c) and 1 cp 1 jr nz,init_score ld a,(0x80DC) inc a cp 0xE0 ld (0x80DC),a jr nz,scroll_loop ld a,0x40 ld (demo),a init_score: ld hl,0x8425 ; ATTENTION! ld de,0x8426 ; ATTENTION! ld bc,9 ld (hl),0x30 ldir ; ld a,0x13 ; ld (current_cavern),a init_room: call 0xC000 ; init music ld hl,0x9B00 ld de,0x9B01 ld (hl),0x9C ld bc,0x100 ldir di ld a,0x9B ld i,a im 2 ld a,(music_on) or a jr z,load_level ei load_level: ld a,(current_cavern) ld b,a sla a ; 2 * a add a,b ; 3 * a ld e,a ld d,0 ld hl,room_map add hl,de push hl pop ix ld l,(ix+0) ld h,(ix+1) ld de,0x5E00 ld a,0 ld bc,0x0400 call decomp call sub_8A7B ld hl,0x5000 ld de,0x5001 ld bc,0x07FF ld (hl),0 ldir ; clear attr ld ix,0x8000 ld c,0x20 ld de,0x5000 call put_string ld ix,air_string ld c,3 ld de,0x5020 call put_string ld a,0x52 loc_86DD: ld h,a ld d,a ld l,0x24 ld e,0x25 ld b,a ld a,(0x80BC) sub 0x24 ld c,a ld a,b ld b,0 ld (hl),0xFF ldir inc a cp 0x56 jr nz,loc_86DD ld ix,score_string ld de,0x5060 ld c,0x20 call put_string ld a,(border) ld c,0xFE out (c),a ld a,(demo) or a jr z,loc_8714 ld a,0x40 ld (demo),a loc_8714: ld a,(lives_left) ld hl,0x50A0 or a ; 0 lives jr z,loc_8736 ld b,a live_sprite_loop: ld c,0 push hl push bc ld a,(b845B) rlca rlca rlca and 0x60 ld e,a ld d,0x82 call put_sprite ; paint the live "miners" pop bc pop hl inc hl inc hl djnz live_sprite_loop loc_8736: ld a,(cheat) cp 0x0A jr nz,loc_8745 ld de,sprite1 ld c,0 call put_sprite loc_8745: ld hl,0x5E00 ld de,0x5C00 ld bc,0x0200 ldir ld hl,0x7000 ld de,0x6000 ld bc,0x1000 ldir call sub_8D1A ld a,(demo) or a call z,sub_8AC1 ld a,(demo) or a call z,sub_9245 call sub_8DB5 call sub_9110 call sub_8F6E ld a,(current_cavern) cp 4 call z,eugene ld a,(current_cavern) cp 13 jp z,skylabs ld a,(current_cavern) cp 8 call nc,vertical_guards ld a,(current_cavern) cp 7 call z,kong ld a,(current_cavern) cp 11 call z,kong ld a,(current_cavern) cp 18 call z,solar_power loc_87A5: call sub_8FD0 loc_87A8: ld hl,0x6000 ld de,0x4000 ld bc,0x1000 ldir ; show screen ld a,(b8458) or a jr z,loc_87CE dec a ld (b8458),a rlca rlca rlca and 0x38 ld hl,0x5C00 ld de,0x5C01 ld bc,0x01FF ld (hl),a ldir loc_87CE: ld hl,0x5C00 ld de,0x5800 ld bc,0x0200 ldir ; show attr ld ix,0x8429 ; ATTENTION! ld de,0x507A ld c,6 call put_string ld ix,0x841F ; ATTENTION! ld de,0x506B ld c,6 call put_string inf_air_poke1: call sub_8A42 jp z,loc_8905 ld bc,0xFEFE in a,(c) ld e,a ld b,0x7F in a,(c) or e and 1 jp z,game_setup ld b,0xFD in a,(c) and 0x1F cp 0x1F jr z,loc_881B loc_8811: ld b,2 in a,(c) and 0x1F cp 0x1F jr z,loc_8811 loc_881B: ld a,(0x806B) cp 0xFF jp z,loc_8905 ld b,0xBF ld hl,b845C in a,(c) and 0x1F cp 0x1F jr z,loc_883A bit 0,(hl) jr nz,loc_883C ld a,(hl) xor 3 ld (hl),a jr loc_883C loc_883A: res 0,(hl) loc_883C: bit 1,(hl) jr nz,loc_8865 ; ld a,(b845B) ; inc a ; ld (b845B),a ; and 0x7E ; rrca ; ld e,a ; ld d,0 ; ld hl,unkn_0 ; add hl,de ; ld a,(border) ; ld e,(hl) ; ld bc,3 ;music_loop: ; out (0xFE),a ; beeper chune ; dec e ; jr nz,loc_8860 ; ld e,(hl) ; xor 0x18 ;loc_8860: ; djnz music_loop ; dec c ; jr nz,music_loop loc_8865: ld a,(demo) or a jr z,loc_888A dec a jp z,loc_8905 ld (demo),a ld bc,0xFE in a,(c) and 0x1F cp 0x1F jp nz,game_setup ld a,(kemp) or a jr z,loc_888A in a,(0x1F) or a jp nz,game_setup loc_888A: ld bc,0xEFFE in a,(c) bit 1,a jp nz,loc_88AE ; should be jr ld a,(cheat) cp 10 jp nz,loc_88AE ; should be jr ld b,0xF7 in a,(c) cpl and 0x1F cp 0x14 jp nc,loc_88AE ; should be jr ld (current_cavern),a jp init_room loc_88AE: ld a,(cheat) cp 10 jp z,loc_8714 rlca ld e,a ld d,0 ld ix,cheat_table add ix,de ld bc,0xFBFE in a,(c) and 0x1F cp (ix+0) jr z,loc_88DE cp 0x1F jp z,loc_8714 cp (ix+0xFE) jp z,loc_8714 xor a ld (cheat),a jp loc_8714 loc_88DE: ld b,0xDF in a,(c) and 0x1F cp (ix+1) jr z,loc_88FB cp 0x1F jp z,loc_8714 cp (ix+0xFF) jp z,loc_8714 xor a ld (cheat),a jp loc_8714 loc_88FB: ld a,(cheat) inc a ld (cheat),a jp loc_8714 loc_8905: ld a,(demo) or a jp nz,loc_9033 ld a,0x47 loc_890E: ld hl,0x5800 ld de,0x5801 ld bc,0x1FF ld (hl),a ldir ; clear attr ld e,a cpl and 7 rlca rlca rlca or 7 ld d,a ld c,e rrc c rrc c rrc c or 0x10 xor a loc_892E: out (0xFE),a xor 0x18 ld b,d loc_8933: djnz loc_8933 dec c jr nz,loc_892E ld a,e dec a cp 0x3F jr nz,loc_890E ld hl,lives_left ld a,(hl) or a jp z,loc_894A inf_lives_poke: dec (hl) ; poke here for infinite lives jp init_room loc_894A: ld hl,0x841F ; ATTENTION! ld de,0x8429 ; ATTENTION! ld b,6 loc_8952: ld a,(de) cp (hl) jp c,loc_8969 ; should be jr jp nz,loc_895E ; should be jr inc hl inc de djnz loc_8952 loc_895E: ld hl,0x8429 ; ATTENTION! ld de,0x841F ; ATTENTION! ld bc,6 ldir loc_8969: ld hl,0x4000 ld de,0x4001 ld bc,0x0FFF ld (hl),0 ldir ; clear top third xor a ld (0x80DC),a ld de,0x8240 ; ATTENTION! ld hl,0x488F ld c,0 call put_sprite ld de,sprite2 ld hl,0x48CF ld c,0 call put_sprite loc_8990: ld a,(0x80DC) ld c,a ld b,0x83 ; ATTENTION! ld a,(bc) or 0x0F ld l,a inc bc ld a,(bc) sub 0x20 ld h,a ld de,sprite1 ld c,0 call put_sprite ld a,(0x80DC) cpl ld e,a xor a ld bc,0x40 loc_89B0: out (0xFE),a xor 0x18 ld b,e loc_89B5: djnz loc_89B5 dec c jr nz,loc_89B0 ld hl,0x5800 ld de,0x5801 ld bc,0x01FF ld a,(0x80DC) and 0x0C rlca or 0x47 ld (hl),a ldir ld a,(0x80DC) add a,4 ld (0x80DC),a cp 0xC4 jr nz,loc_8990 ld ix,game_string ld c,4 ld de,0x40CA call put_string ld ix,over_string ld c,4 ld de,0x40D2 call put_string ld bc,0 ld d,6 loc_89F7: djnz loc_89F7 ld a,c and 0x07 or 0x40 ld (0x58CA),a inc a and 0x07 or 0x40 ld (0x58CB),a inc a and 7 or 0x40 ld (0x58CC),a inc a and 0x07 or 0x40 ld (0x58CD),a inc a and 0x07 or 0x40 ld (0x58D2),a inc a and 7 or 0x40 ld (0x58D3),a inc a and 0x07 or 0x40 ld (0x58D4),a inc a and 0x07 or 0x40 ld (0x58D5),a dec c jr nz,loc_89F7 dec d jr nz,loc_89F7 jp game_setup sub_8A42: ld a,(0x80BD) sub 4 ld (0x80BD),a cp 0xFC jr nz,loc_8A5B ld a,(0x80BC) cp 0x24 ret z dec a ld (0x80BC),a ld a,(0x80BD) loc_8A5B: and 0xE0 rlca rlca rlca ld e,0 or a jr z,loc_8A6C ld b,a loc_8A66: rrc e set 7,e djnz loc_8A66 loc_8A6C: ld a,(0x80BC) ld l,a ld h,0x52 ld b,4 loc_8A74: ld (hl),e inc h djnz loc_8A74 xor a inc a ret sub_8A7B: ld ix,0x5E00 ld a,0x70 ld (modif_code_1),a call loc_8A90 ld ix,0x5F00 ld a,0x78 ld (modif_code_1),a loc_8A90: ld c,0 loc_8A92: ld e,c ld a,(ix+0) ld hl,0x8020 ld bc,0x48 cpir ld c,e ld b,8 loc_8AA1: ld d,0 loc_8AA3: ld a,(hl) ld (de),a inc hl inc d djnz loc_8AA3 inc ix inc c jp nz,loc_8A92 ; should be jr ld a,(current_cavern) cp 19 ret nz ld hl,high_and_mid_bmp ld de,0x7000 ld bc,0x0800 ld a,0xC9 call decomp ret sub_8AC1: ld a,(0x806B) cp 1 jr nz,loc_8B16 ld a,(0x806E) res 0,a sub 8 ld hl,0x8068 add a,(hl) ld (hl),a call loc_8B88 ld a,(0x803B) cp (hl) jp z,loc_8BA8 inc hl cp (hl) jp z,loc_8BA8 ld a,(0x806E) inc a ld (0x806E),a sub 8 jp p,loc_8AF1 neg loc_8AF1: inc a rlca rlca rlca ld d,a ld c,0x20 ld a,(border) loc_8AFB: out (0xFE),a xor 0x18 ld b,d loc_8B00: djnz loc_8B00 dec c jr nz,loc_8AFB ld a,(0x806E) cp 0x12 jp z,loc_8B9C cp 0x10 jr z,loc_8B16 cp 0x0D jp nz,loc_8C8E loc_8B16: ld a,(0x8068) and 0x0F jr nz,loc_8B57 ld hl,(0x806C) ld de,0x40 add hl,de ld a,(0x8032) cp (hl) call z,sub_8BC0 ld a,(0x804D) cp (hl) jr z,loc_8B57 ld a,(0x8056) cp (hl) jr z,loc_8B57 inc hl ld a,(0x8032) cp (hl) call z,sub_8BC0 ld a,(0x804D) cp (hl) jr z,loc_8B57 ld a,(0x8056) cp (hl) jr z,loc_8B57 ld a,(0x8020) cp (hl) dec hl jp nz,loc_8BE3 cp (hl) jp nz,loc_8BE3 loc_8B57: ld a,(0x806B) cp 1 jp z,loc_8C8E ld hl,0x806A res 1,(hl) or a jp z,loc_8BA2 ; should be jr inc a ld (0x806B),a rlca rlca rlca rlca ld d,a ld c,0x20 ld a,(border) loc_8B76: out (0xFE),a xor 0x18 ld b,d loc_8B7B: djnz loc_8B7B dec c jr nz,loc_8B76 ld a,(0x8068) add a,8 ld (0x8068),a loc_8B88: and 0xF0 ld l,a xor a rl l adc a,0x5C ld h,a ld a,(0x806C) and 0x1F or l ld l,a ld (0x806C),hl ret loc_8B9C: ld a,6 ld (0x806B),a ret loc_8BA2: ld a,2 ld (0x806B),a ret loc_8BA8: ld a,(0x8068) add a,0x10 and 0xF0 ld (0x8068),a call loc_8B88 ld a,2 ld (0x806B),a ld hl,0x806A res 1,(hl) ret sub_8BC0: ld c,l ld a,h add a,0x1B or 7 ld b,a loc_8BC7: dec b ld a,(bc) inc b ld (bc),a dec b ld a,b and 7 jr nz,loc_8BC7 xor a ld (bc),a ld a,b add a,7 ld b,a ld a,(bc) or a ret nz ld a,(0x8020) inc h inc h ld (hl),a dec h dec h ret loc_8BE3: ld a,(0x806B) cp 0x0C jp nc,loc_8D11 ld e,0xFF xor a ld (0x806B),a ld a,(0x8044) cp (hl) jr z,loc_8BFB inc hl cp (hl) jr nz,loc_8C01 loc_8BFB: ld a,(0x806F) sub 3 ld e,a loc_8C01: ; determine if trainer is wanted push de ld bc,0xF7FE in a,(c) and 0x01 call z,trainer pop de ; till here ld bc,0xDFFE in a,(c) and 0x1F or 0x20 and e ld e,a ld bc,0xFBFE in a,(c) and 0x1F rlc a or 1 and e ld e,a ld b,0xE7 in a,(c) rrca or 0xF7 and e ld e,a ld b,0xEF in a,(c) or 0xFB and e ld e,a in a,(c) rrca or 0xFB and e ld e,a ld a,(kemp) or a jr z,loc_8C41 ld bc,0x1F in a,(c) and 3 cpl and e ld e,a loc_8C41: ld c,0 ld a,e and 0x2A cp 0x2A jr z,loc_8C4C ld c,4 loc_8C4C: ld a,e and 0x15 cp 0x15 jr z,loc_8C55 set 3,c loc_8C55: ld a,(0x806A) add a,c ld c,a ld b,0 ld hl,d8408 add hl,bc ld a,(hl) ld (0x806A),a ld bc,0x7EFE in a,(c) and 0x1F cp 0x1F jr nz,loc_8C86 ld b,0xEF in a,(c) bit 0,a jr z,loc_8C86 ld a,(kemp) or a jr z,loc_8C8E ld bc,0x1F in a,(c) bit 4,a jr z,loc_8C8E loc_8C86: xor a ld (0x806E),a inc a ld (0x806B),a loc_8C8E: ld a,(0x806A) and 2 ret z ld a,(0x806A) and 1 jp z,loc_8CD5 ; should be jr ld a,(0x8069) or a jr z,loc_8CA7 dec a ld (0x8069),a ret loc_8CA7: ld hl,(0x806C) dec hl ld de,0x20 add hl,de ld a,(0x803B) cp (hl) ret z ld a,(0x8068) and 0x0F jr z,loc_8CC4 ld a,(0x803B) add hl,de cp (hl) ret z or a sbc hl,de loc_8CC4: ld a,(0x803B) or a sbc hl,de cp (hl) ret z ld (0x806C),hl ld a,3 ld (0x8069),a ret loc_8CD5: ld a,(0x8069) cp 3 jr z,loc_8CE1 inc a ld (0x8069),a ret loc_8CE1: ld hl,(0x806C) inc hl inc hl ld de,0x20 ld a,(0x803B) add hl,de cp (hl) ret z ld a,(0x8068) and 0x0F jr z,loc_8CFF ld a,(0x803B) add hl,de cp (hl) ret z or a sbc hl,de loc_8CFF: ld a,(0x803B) or a sbc hl,de cp (hl) ret z dec hl ld (0x806C),hl xor a ld (0x8069),a ret loc_8D10: pop hl loc_8D11: pop hl loc_8D12: ld a,0xFF ld (0x806B),a jp 0x87A8 sub_8D1A: ld iy,0x80BE ld de,7 loc_8D21: ld a,(iy+0) cp 0xFF ret z or a jr z,loc_8D7A ld a,(0x80BD) and 4 rrca rrca rrca and (iy+0) jr nz,loc_8D7A ld a,(iy+4) cp 3 jr z,loc_8D4E cp 4 jr z,loc_8D65 jr nc,loc_8D49 inc (iy+4) jr loc_8D7A loc_8D49: dec (iy+4) jr loc_8D7A loc_8D4E: ld a,(iy+1) cp (iy+6) jr nz,loc_8D5C defb 0xFD,0x36,0x04,0x07 ; ld (iy+4),7 jr loc_8D7A loc_8D5C: defb 0xFD,0x36,0x04,0x00 ; ld (iy+4),0 inc (iy+1) jr loc_8D7A loc_8D65: ld a,(iy+1) cp (iy+5) jr nz,loc_8D73 defb 0xFD,0x36,0x04,0x00 ; ld (iy+4),0 jr loc_8D7A loc_8D73: defb 0xFD,0x36,0x04,0x07 ; ld (iy+4),7 dec (iy+1) loc_8D7A: add iy,de jr loc_8D21 solar_power: ld hl,0x5C17 ld de,0x20 loc_8D84: ld a,(0x8029) cp (hl) ret z ld a,(0x803B) cp (hl) ret z ld a,0x27 cp (hl) jr nz,loc_8DA3 exx inf_air_poke2: call sub_8A42 call sub_8A42 call sub_8A42 call sub_8A42 exx jr loc_8DB0 loc_8DA3: ld a,(0x8020) cp (hl) jr z,loc_8DB0 ld a,e xor 0xDF ld e,a ld a,d cpl ld d,a loc_8DB0: ld (hl),0x77 add hl,de jr loc_8D84 sub_8DB5: ld iy,0x80BE loc_8DB9: ld a,(iy+0) cp 0xFF ret z or a jr z,loc_8DFC ld de,0x1F ld l,(iy+1) ld h,(iy+2) and 0x7F ld (hl),a inc hl ld (hl),a add hl,de ld (hl),a inc hl ld (hl),a ld c,1 ld a,(iy+4) rrca rrca rrca ld e,a ld a,(current_cavern) cp 7 jr c,loc_8DEE cp 9 jr z,loc_8DEE cp 15 jr z,loc_8DEE set 7,e loc_8DEE: ld d,0x81 ld l,(iy+1) ld h,(iy+3) call put_sprite jp nz,loc_8D11 loc_8DFC: ld de,7 add iy,de jr loc_8DB9 eugene: ld a,(0x8074) or a jr z,loc_8E1A ld a,(0x80DB) or a jr z,loc_8E1A ld a,(0x80DC) dec a jr z,loc_8E27 ld (0x80DC),a jr loc_8E2F loc_8E1A: ld a,(0x80DC) inc a cp 0x58 jr z,loc_8E27 ld (0x80DC),a jr loc_8E2F loc_8E27: ld a,(0x80DB) xor 1 ld (0x80DB),a loc_8E2F: ld a,(0x80DC) and 0x7F rlca ld e,a ld d,0x83 ld a,(de) or 0x0F ld l,a inc de ld a,(de) ld h,a ld de,0x80E0 ld c,1 call put_sprite jp nz,loc_8D11 ld a,(0x80DC) and 0x78 rlca or 7 scf rl a ld l,a ld a,0 adc a,0x5C ld h,a ld a,(0x8074) or a ld a,7 jr nz,sub_8E6A ld a,(0x80BD) rrca rrca and 7 sub_8E6A: ld (hl),a ld a,(0x8020) and 0xF8 or (hl) ld (hl),a ld de,0x1F inc hl ld (hl),a add hl,de ld (hl),a inc hl ld (hl),a add hl,de ld (hl),a inc hl ld (hl),a ret skylabs: ld iy,0x80DD loc_8E84: ld a,(iy+0) cp 0xFF jp z,loc_87A5 ld a,(iy+2) cp (iy+6) jr nc,loc_8E9C add a,(iy+4) ld (iy+2),a jr loc_8EBA loc_8E9C: inc (iy+1) ld a,(iy+1) cp 8 jr nz,loc_8EBA ld a,(iy+5) ld (iy+2),a ld a,(iy+3) add a,8 and 0x1F ld (iy+3),a defb 0xFD,0x36,0x01,0x00 ; ld (iy+1),0 loc_8EBA: ld e,(iy+2) rlc e ld d,0x83 ld a,(de) add a,(iy+3) ld l,a inc de ld a,(de) ld h,a ld a,(iy+1) rrca rrca rrca ld e,a ld d,0x81 ld c,1 call put_sprite jp nz,loc_8D12 ld a,(iy+2) and 0x40 rlca rlca add a,0x5C ld h,a ld a,(iy+2) rlca rlca and 0xE0 or (iy+3) ld l,a ld a,(iy+0) call sub_8E6A ld de,7 add iy,de jr loc_8E84 vertical_guards: ld iy,0x80DD loc_8F00: ld a,(iy+0) cp 0xFF ret z inc (iy+1) defb 0xFD,0xCB,0x01,0x96 ; res 2,(iy+1) ld a,(iy+2) add a,(iy+4) cp (iy+5) jr c,loc_8F22 cp (iy+6) jr nc,loc_8F22 ld (iy+2),a jr loc_8F2A loc_8F22: ld a,(iy+4) neg ld (iy+4),a loc_8F2A: ld a,(iy+2) and 0x7F rlca ld e,a ld d,0x83 ld a,(de) or (iy+3) ld l,a inc de ld a,(de) ld h,a ld a,(iy+1) rrca rrca rrca ld e,a ld d,0x81 ld c,1 call put_sprite jp nz,loc_8D11 ld a,(iy+2) and 0x40 rlca rlca add a,0x5C ld h,a ld a,(iy+2) rlca rlca and 0xE0 or (iy+3) ld l,a ld a,(iy+0) call sub_8E6A ld de,7 add iy,de jr loc_8F00 sub_8F6E: xor a ld (0x8074),a ld iy,0x8075 loc_8F76: ld a,(iy+0) cp 0xFF jr z,loc_8FC5 or a jr z,loc_8FB9 ld e,(iy+1) ld d,(iy+2) ld a,(de) and 7 cp 7 jr nz,loc_8F99 ld hl,0x842C call sub_9109 defb 0xFD,0x36,0x00,0x00 ; ld (iy+0),0 jr loc_8FB9 loc_8F99: ld a,(iy+0) and 0xF8 or 3 ld b,a ld a,(iy+0) and 3 add a,b ld (iy+0),a ld (de),a ld (0x8074),a ld d,(iy+3) ld hl,0x80B4 ld b,8 call sub_92E0 loc_8FB9: inc iy inc iy inc iy inc iy inc iy jr loc_8F76 loc_8FC5: ld a,(0x8074) or a ret nz ld hl,0x808F set 7,(hl) ret sub_8FD0: ld hl,(0x80B0) ld a,(0x806C) cp l jr nz,loc_8FEA ld a,(0x806D) cp h jr nz,loc_8FEA ld a,(0x808F) bit 7,a jr z,loc_8FEA pop hl jp loc_9033 ; should be jr loc_8FEA: ld a,(0x808F) ld (hl),a inc hl ld (hl),a ld de,0x1F add hl,de ld (hl),a inc hl ld (hl),a ld de,0x8090 ld hl,(0x80B2) ld c,0 put_sprite: ld b,0x10 loc_9001: bit 0,c ld a,(de) jr z,loc_900A and (hl) ret nz ld a,(de) or (hl) loc_900A: ld (hl),a inc l inc de bit 0,c ld a,(de) jr z,loc_9016 and (hl) ret nz ld a,(de) or (hl) loc_9016: ld (hl),a dec l inc h inc de ld a,h and 7 jr nz,loc_902F ld a,h sub 8 ld h,a ld a,l add a,0x20 ld l,a and 0xE0 jr nz,loc_902F ld a,h add a,8 ld h,a loc_902F: djnz loc_9001 xor a ret loc_9033: ld a,(current_cavern) inc a cp 0x14 jr nz,loc_909C end_game: ld a,(demo) or a jp nz,loc_909B ; should be jr ld a,(cheat) cp 0x0A jr z,loc_909B ld c,0 ld de,0x8260 ; ATTENTION! ld hl,0x4053 call put_sprite ld de,sword_fish ld hl,0x40B3 call put_sprite ld hl,0x5853 ld de,0x1F ld (hl),0x2F inc hl ld (hl),0x2F add hl,de ld (hl),0x27 inc hl ld (hl),0x27 add hl,de inc hl add hl,de ld (hl),0x45 inc hl ld (hl),0x45 add hl,de ld (hl),0x46 inc hl ld (hl),0x47 add hl,de ld (hl),0 inc hl ld (hl),0 ld bc,0 ld d,0x32 xor a loc_9088: out (0xFE),a xor 0x18 ld e,a ld a,c add a,d add a,d add a,d ld b,a ld a,e loc_9093: djnz loc_9093 dec c jr nz,loc_9088 dec d jr nz,loc_9088 loc_909B: xor a loc_909C: ld (current_cavern),a ld a,0x3F loc_90A1: ld hl,0x5800 ld de,0x5801 ld bc,0x1FF ld (hl),a ldir ld bc,4 loc_90B0: djnz loc_90B0 dec c jr nz,loc_90B0 dec a jr nz,loc_90A1 ld a,(demo) or a jp nz,init_room loc_90BF: call sub_8A42 jp z,init_room ld hl,0x842E call sub_9109 ld ix,0x8429 ld c,6 ld de,0x507A call put_string ld c,4 ld a,(0x80BC) cpl and 0x3F rlc a ld d,a loc_90E2: ld a,0 out (0xFE),a ld b,d loc_90E7: djnz loc_90E7 ld a,0x18 out (0xFE),a ld b,d loc_90EE: djnz loc_90EE dec c jr nz,loc_90E2 jr loc_90BF loc_90F5: ld (hl),0x30 dec hl ld a,l cp 0x2A jr nz,sub_9109 ld a,8 ld (b8458),a ld a,(lives_left) inc a ld (lives_left),a sub_9109: ld a,(hl) cp 0x39 jr z,loc_90F5 inc (hl) ret sub_9110: ld hl,(0x8070) ld e,l ld d,h ld a,(0x8072) ld b,a ld a,(0x806F) or a jr nz,loc_9132 ld a,(hl) rlc a rlc a inc h inc h ld c,(hl) rrc c rrc c loc_912B: ld (de),a ld (hl),c inc l inc e djnz loc_912B ret loc_9132: ld a,(hl) rrc a rrc a inc h inc h ld c,(hl) rlc c rlc c jr loc_912B kong: ld hl,0x5C06 call sub_9226 ld a,(0x80DB) cp 2 ret z ld a,(0x7506) cp 0x10 jp z,loc_9204 ld a,(0x5F71) or a jr z,loc_9181 ld hl,0x7F71 loc_915D: ld a,(hl) or a jr nz,loc_9177 dec h ld a,h cp 0x77 jr nz,loc_915D ld a,(0x8020) ld (0x5F71),a ld (0x5F91),a ld a,0x72 ld (0x80CB),a jr loc_9181 loc_9177: ld (hl),0 ld l,0x91 ld a,h xor 7 ld h,a ld (hl),0 loc_9181: ld hl,0x5C12 call sub_9226 jr nz,loc_91A8 xor a ld (0x80DC),a inc a ld (0x80DB),a ld a,(0x8020) ld (0x5E4F),a ld (0x5E50),a ld hl,0x704F ld b,8 loc_919F: ld (hl),0 inc l ld (hl),0 dec l inc h djnz loc_919F loc_91A8: ld a,(0x80DB) or a jr z,loc_9204 ld a,(0x80DC) cp 0x64 jr z,loc_91FE add a,4 ld (0x80DC),a ld c,a ld d,0x10 ld a,(border) loc_91C0: out (0xFE),a xor 0x18 ld b,c loc_91C5: djnz loc_91C5 dec d jr nz,loc_91C0 ld a,c rlca ld e,a ld d,0x83 ld a,(de) or 0x0F ld l,a inc de ld a,(de) ld h,a ld d,0x81 ld a,(0x80BD) and 0x20 or 0x40 ld e,a ld c,0 call put_sprite ld hl,0x842C call sub_9109 ld a,(0x80DC) and 0x78 ld l,a ld h,0x17 add hl,hl add hl,hl ld a,l or 0x0F ld l,a ld a,6 jp sub_8E6A loc_91FE: ld a,2 ld (0x80DB),a ret loc_9204: ld a,(0x80BD) and 0x20 ld e,a ld d,0x81 ld hl,0x600F ld c,1 call put_sprite jp nz,loc_8D11 ld a,0x44 ld (0x5C2F),a ld (0x5C30),a ld (0x5C0F),a ld (0x5C10),a ret sub_9226: ld a,(0x806C) inc a and 0xFE cp l ret nz ld a,(0x806D) cp h ret nz ld a,(0x8065) ld h,0x75 cp (hl) ret nz ld (hl),8 inc h ld (hl),6 inc h ld (hl),6 xor a or a ret sub_9245: ld hl,(0x806C) ld de,0x1F ld c,0x0F call sub_926A inc hl call sub_926A add hl,de call sub_926A inc hl call sub_926A ld a,(0x8068) ld c,a add hl,de call sub_926A inc hl call sub_926A jr loc_928A sub_926A: ld a,(0x8020) cp (hl) jr nz,loc_927B ld a,c and 0x0F jr z,loc_927B ld a,(0x8020) or 7 ld (hl),a loc_927B: ld a,(0x804D) cp (hl) jp z,loc_8D10 ld a,(0x8056) cp (hl) jp z,loc_8D10 ret loc_928A: ld a,(0x8068) defb 0xDD ld h,0x83 defb 0xDD ld l,a ld a,(0x806A) and 1 rrca ld e,a ld a,(0x8069) and 3 rrca rrca rrca or e ld e,a ld d,0x82 ld b,0x10 ld a,(0x806C) and 0x1F ld c,a loc_92AD: ld a,(ix+0) ld h,(ix+1) or c ld l,a ld a,(de) or (hl) ld (hl),a inc hl inc de ld a,(de) or (hl) ld (hl),a inc ix inc ix inc de djnz loc_92AD ret put_string: ; hl source, de destination, c size ld a,(ix+0) call put_char inc ix inc e ld a,d sub 8 ld d,a dec c jr nz,put_string ret put_char: ld h,7 ld l,a set 7,l add hl,hl add hl,hl add hl,hl ld b,8 sub_92E0: ld a,(hl) ld (de),a inc hl inc d djnz sub_92E0 ret sub_92E7: ld a,(iy+0) cp 0xFF ret z ld c,a ld b,0 xor a ld d,(iy+1) ld a,d call sub_9336 ld (hl),0x50 ld e,(iy+2) ld a,e call sub_9336 ld (hl),0x28 loc_9303: out (0xFE),a dec d jr nz,loc_930D ld d,(iy+1) xor 0x18 loc_930D: dec e jr nz,loc_9315 ld e,(iy+2) xor 0x18 loc_9315: djnz loc_9303 dec c jr nz,loc_9303 call sub_9342 ret nz ld a,(iy+1) call sub_9336 ld (hl),0x38 ld a,(iy+2) call sub_9336 ld (hl),0x38 inc iy inc iy inc iy jr sub_92E7 sub_9336: sub 8 rrca rrca rrca cpl or 0xE0 ld l,a ld h,0x59 ret sub_9342: ld a,(kemp) or a jr z,loc_934D in a,(0x1F) bit 4,a ret nz loc_934D: ; insert call to game selection code ld bc,0xAFFE in a,(c) and 1 cp 1 ret sword_fish: incbin "b2e0.bin" sprite2: incbin "b6e0.bin" sprite1: incbin "bae0.bin" decomp: ; a=0xC9 (normal unpack) a=0x00 (cavern unpack) ld (decomp_fixde),a ld (decomp_fixhl),a ld a,(hl) inc hl ld (modif_code_2),a decomp_loop: ld a,(hl) call decomp_check jr z,decomp_decode decomp_moveone: ldi call decomp_fixde decomp_loopchk: ld a,b or c jr nz,decomp_loop ret decomp_decode: inc hl ld a,(hl) or a jr nz,decomp_ulz ld a,(modif_code_2) jr decomp_moveone decomp_ulz: push bc pop ix and 0x3f ld b,0 ld c,a push hl pop iy inc hl inc hl push hl push de push de pop hl ld e,(iy+0) ld d,(iy+1) push bc ld b,6 decomp_shloop: srl d rr e djnz decomp_shloop pop bc scf ccf sbc hl,de ld a,(decomp_fixde) or a jr nz,decomp_fixed ld a,h cp 0x7F call z,decomp_fixsrc cp 0x7E call z,decomp_fixsrc decomp_fixed: pop de decomp_lzloop: ldi call decomp_fixde call decomp_fixhl dec ix defb 0xDD ld a,h defb 0xDD or l jr nz,decomp_cont pop hl ret decomp_cont: ld a,b or c jr nz,decomp_lzloop pop hl push ix pop bc jr decomp_loopchk decomp_check: cp 0 ret decomp_fixsrc: sub 0x20 ld h,a ret decomp_fixde: nop ; changes to 0xC3 when not decompressing caverns push af ld a,d cp 0x60 jr nz,decomp_deok ld de,0x8000 decomp_deok: pop af ret decomp_fixhl: nop ; changes to 0xC3 when not decompressing caverns push af ld a,h cp 0x60 jr nz,decomp_hlok ld hl,0x8000 decomp_hlok: pop af ret twin_x: equ 4 twin_y: equ 2 twin_dx: equ 32-2*twin_x twin_dy: equ 7 twin_attr: equ 64+8*0+7 trainer_str1: defs "1 Infinite lives: NO " trainer_str2: defs "2 Infinite air: NO " trainer_str3: defs "3 Music: YES" trainer_str0: defs "4 Resume game" trainer: ld hl,0x5800+twin_y*32+twin_x ld b,twin_dy trainer_lp0: push bc push hl pop de inc de ld (hl),twin_attr ld bc,twin_dx-1 ldir ld de,32-twin_dx+1 add hl,de pop bc djnz trainer_lp0 ld b,twin_dy ld c,0 trainer_lp1: push bc ld a,c add a,twin_y call get_line_addr ld b,8 trainer_lp2: push bc push hl ld de,twin_x add hl,de ld d,0 ld a,c cp 0 jr nz,trainer_line_not0 ld a,b cp 8 jr nz,trainer_line_not0 ld d,0xFF jr trainer_transfer trainer_line_not0: ld a,c cp twin_dy-1 jr nz,trainer_transfer ld a,b cp 1 jr nz,trainer_transfer ld d,0xFF trainer_transfer: ld b,twin_dx trainer_transfer_loop: ld e,d ld a,b cp twin_dx jr nz,trainer_not_first ld a,e or 0x80 ld e,a trainer_not_first: ld a,b cp 1 jr nz,trainer_not_last ld a,e or 0x01 ld e,a trainer_not_last: ld (hl),e inc hl djnz trainer_transfer_loop pop hl inc h pop bc djnz trainer_lp2 pop bc inc c djnz trainer_lp1 trainer_repaint: ld a,twin_y+1 ld c,21 ; 0x15 ld ix,trainer_str1 call put_string_at_line ld a,twin_y+2 ld c,19 ; 0x13 ld ix,trainer_str2 call put_string_at_line ld a,twin_y+3 ld c,12 ld ix,trainer_str3 call put_string_at_line ld a,twin_y+twin_dy-2 ld c,13 ; 0x0D ld ix,trainer_str0 call put_string_at_line ld bc,0x7000 trainer_delay: dec bc ld a,b or c jr nz,trainer_delay trainer_check_loop: ld bc,0xF7FE in a,(c) ld b,a and 0x01 ld a,b jr nz,trainer_not1 ld hl,trainer_str1+18 call toggle jr c,trainer_inf_lives_yes trainer_inf_lives_no: ld hl,inf_lives_poke ld (hl),0x35 jr trainer_repaint trainer_inf_lives_yes: ld hl,inf_lives_poke ld (hl),0x00 jr trainer_repaint trainer_not1: and 0x02 ld a,b jr nz,trainer_not2 ld hl,trainer_str2+16 call toggle jr c,trainer_inf_air_yes trainer_inf_air_no: ld hl,inf_air_poke1 ld (hl),0xCD ld de,sub_8A42 inc hl ld (hl),e inc hl ld (hl),d ld hl,inf_air_poke2 ld b,4 trainer_inf_air_lp1: ld (hl),0xCD inc hl ld (hl),e inc hl ld (hl),d inc hl djnz trainer_inf_air_lp1 jr trainer_repaint trainer_inf_air_yes: ld hl,inf_air_poke1 ld (hl),0x3E inc hl ld (hl),0x01 inc hl ld (hl),0xB7 ld hl,inf_air_poke2 ld bc,11 push hl pop de inc de ld (hl),0 ldir jp trainer_repaint trainer_not2: and 0x04 ld a,b jr nz,trainer_not3 ld hl,trainer_str3+9 call toggle jr c,trainer_music_yes trainer_music_no: ld a,0 ld (music_on),a di jp trainer_repaint trainer_music_yes: ld a,1 ld (music_on),a ei jp trainer_repaint trainer_not3: and 0x08 jp nz,trainer_check_loop ret toggle: ld a,(hl) cp 0x4E jr nz,toggle_got_yes toggle_got_no: ld (hl),0x59 inc hl ld (hl),0x45 inc hl ld (hl),0x53 scf ret toggle_got_yes: ld (hl),0x4E inc hl ld (hl),0x4F inc hl ld (hl),0x20 scf ccf ret put_string_at_line: call get_line_addr ld de,twin_x+1 add hl,de ex de,hl call put_string ret get_line_addr: push af and 0x18 or 0x40 ld h,a pop af and 0x07 rrca rrca rrca ld l,a ret stuff_end0: defm 0x9C9C-stuff_end0 im2_handler: push af push bc push de push hl push ix push iy call 0xC006 pop iy pop ix pop hl pop de pop bc pop af ei ret music_on: defb 1 stuff_end1: defm 0x9D00-stuff_end1 high_and_mid_bmp: incbin "scrbmp.bin" scrolly_mess: incbin "data9D00.bin" attribs: incbin "attribs.bin" room_map: defw packed00 defb 0 defw packed01 defb 0 defw packed02 defb 0 defw packed03 defb 0 defw packed04 defb 0 defw packed05 defb 0 defw packed06 defb 0 defw packed07 defb 0 defw packed08 defb 0 defw packed09 defb 0 defw packed10 defb 0 defw packed11 defb 0 defw packed12 defb 0 defw packed13 defb 0 defw packed14 defb 0 defw packed15 defb 0 defw packed16 defb 0 defw packed17 defb 0 defw packed18 defb 0 defw packed19 defb 0 stuff_end2: defm 0xC000-stuff_end2 ay_module: incbin "ay.bin" packed00: incbin "packed00.bin" packed01: incbin "packed01.bin" packed02: incbin "packed02.bin" packed03: incbin "packed03.bin" packed04: incbin "packed04.bin" packed05: incbin "packed05.bin" packed06: incbin "packed06.bin" packed07: incbin "packed07.bin" packed08: incbin "packed08.bin" packed09: incbin "packed09.bin" packed10: incbin "packed10.bin" packed11: incbin "packed11.bin" packed12: incbin "packed12.bin" packed13: incbin "packed13.bin" packed14: incbin "packed14.bin" packed15: incbin "packed15.bin" packed16: incbin "packed16.bin" packed17: incbin "packed17.bin" packed18: incbin "packed18.bin" packed19: incbin "packed19.bin" im2_table: equ 0x9B00 modif_code_1: equ loc_8AA1+1 modif_code_2: equ decomp_check+1 high_attr: equ 0xFC00 border: equ 0x8073