mirror of
https://github.com/romychs/OK240.2-Firmware.git
synced 2026-04-21 10:53:18 +03:00
3651 lines
72 KiB
NASM
3651 lines
72 KiB
NASM
; ===================================================
|
|
; Ocean-240.2 computer
|
|
; Jumping Jack Game
|
|
;
|
|
; Disassembled by Romych 2025-03-25
|
|
; Patched for Monitor R8
|
|
; ===================================================
|
|
DEVICE NOSLOT64K
|
|
SLDOPT COMMENT WPMEM, ASSERTION, LOGPOINT
|
|
|
|
INCLUDE "ok240/equates.inc"
|
|
|
|
OUTPUT jack.com
|
|
|
|
; Monitor entry points
|
|
; --------------------------------------------------
|
|
mon_con_status EQU 0xE006
|
|
mon_con_in EQU 0xE009
|
|
|
|
; Monitor variables
|
|
; --------------------------------------------------
|
|
; R8
|
|
cursor_pos EQU 0xbfe1
|
|
curr_color EQU 0xbfe3
|
|
|
|
; R5
|
|
;cursor_pos EQU 0xbfed
|
|
;curr_color EQU 0xbfef
|
|
|
|
|
|
; BDOS Entries
|
|
; --------------------------------------------------
|
|
WARM_BOOT EQU 0x0000 ; Jump warm_boot (Restart)
|
|
BDOS_ENTER EQU 0x0005 ; Jump bdos (CALL 5 to make CP/M requests)
|
|
|
|
; BDOS Functions
|
|
C_WRITESTR EQU 9 ; Output string
|
|
|
|
; IO Ports
|
|
; --------------------------------------------------
|
|
SYS_DD17PB EQU 0xC1 ; Port B - [ROM14,13][REST][ENROM-][A18,17,16][32k]
|
|
VID_DD67PB EQU 0xE1 ; Port B - [VSU,C/M,FL3..1,COL3..1]
|
|
DD67PC EQU 0xE2 ; Port C - [USER3..1,STB-LP,BELL,TAPE3..1]
|
|
|
|
|
|
; Jumping jack constants
|
|
; --------------------------------------------------
|
|
arr_len EQU 0x20
|
|
stack EQU 0xbfc0
|
|
|
|
|
|
ORG 0x100
|
|
; --------------------------------------------------
|
|
; JAMPING JACK Entry point
|
|
; --------------------------------------------------
|
|
NOP
|
|
NOP
|
|
NOP
|
|
JP j_start
|
|
|
|
init_levels:
|
|
LD HL, arr_len
|
|
LD DE, j_arr_src1
|
|
LD BC, j_arr_src2
|
|
SCF
|
|
CCF
|
|
PUSH AF
|
|
rol_32_l1:
|
|
POP AF
|
|
LD A, (DE)
|
|
RLA
|
|
LD (BC), A
|
|
PUSH AF
|
|
INC DE
|
|
INC BC
|
|
DEC HL
|
|
LD A, L
|
|
OR H
|
|
JP NZ, rol_32_l1
|
|
POP AF
|
|
LD HL, arr_len
|
|
LD DE, j_arr_src10
|
|
LD BC, j_arr_src11
|
|
SCF
|
|
CCF
|
|
PUSH AF
|
|
rol_32_l2:
|
|
POP AF
|
|
LD A, (DE)
|
|
RLA
|
|
LD (BC), A
|
|
PUSH AF
|
|
INC DE
|
|
INC BC
|
|
DEC HL
|
|
LD A, L
|
|
OR H
|
|
JP NZ, rol_32_l2
|
|
POP AF
|
|
LD HL, arr_len
|
|
LD DE, j_arr_src2
|
|
LD BC, j_arr_src3
|
|
SCF
|
|
CCF
|
|
PUSH AF
|
|
rol_32_l3:
|
|
POP AF
|
|
LD A, (DE)
|
|
RLA
|
|
LD (BC), A
|
|
PUSH AF
|
|
INC DE
|
|
INC BC
|
|
DEC HL
|
|
LD A, L
|
|
OR H
|
|
JP NZ, rol_32_l3
|
|
POP AF
|
|
LD HL, arr_len
|
|
LD DE, j_arr_src11
|
|
LD BC, j_arr_src12
|
|
SCF
|
|
CCF
|
|
PUSH AF
|
|
rol_32_l4:
|
|
POP AF
|
|
LD A, (DE)
|
|
RLA
|
|
LD (BC), A
|
|
PUSH AF
|
|
INC DE
|
|
INC BC
|
|
DEC HL
|
|
LD A, L
|
|
OR H
|
|
JP NZ, rol_32_l4
|
|
POP AF
|
|
LD HL, arr_len
|
|
LD DE, j_arr_src3
|
|
LD BC, j_arr_src4
|
|
SCF
|
|
CCF
|
|
PUSH AF
|
|
rol_32_l5:
|
|
POP AF
|
|
LD A, (DE)
|
|
RLA
|
|
LD (BC), A
|
|
PUSH AF
|
|
INC DE
|
|
INC BC
|
|
DEC HL
|
|
LD A, L
|
|
OR H
|
|
JP NZ, rol_32_l5
|
|
POP AF
|
|
LD HL, arr_len
|
|
LD DE, j_arr_src12
|
|
LD BC, j_arr_src13
|
|
SCF
|
|
CCF
|
|
PUSH AF
|
|
rol_32_l6:
|
|
POP AF
|
|
LD A, (DE)
|
|
RLA
|
|
LD (BC), A
|
|
PUSH AF
|
|
INC DE
|
|
INC BC
|
|
DEC HL
|
|
LD A, L
|
|
OR H
|
|
JP NZ, rol_32_l6
|
|
POP AF
|
|
LD HL, arr_len
|
|
LD DE, j_arr_src4
|
|
LD BC, j_arr_src5
|
|
SCF
|
|
CCF
|
|
PUSH AF
|
|
rol_32_l7:
|
|
POP AF
|
|
LD A, (DE)
|
|
RLA
|
|
LD (BC), A
|
|
PUSH AF
|
|
INC DE
|
|
INC BC
|
|
DEC HL
|
|
LD A, L
|
|
OR H
|
|
JP NZ, rol_32_l7
|
|
POP AF
|
|
LD HL, arr_len
|
|
LD DE, j_arr_src13
|
|
LD BC, j_arr_src14
|
|
SCF
|
|
CCF
|
|
PUSH AF
|
|
rol_32_l8:
|
|
POP AF
|
|
LD A, (DE)
|
|
RLA
|
|
LD (BC), A
|
|
PUSH AF
|
|
INC DE
|
|
INC BC
|
|
DEC HL
|
|
LD A, L
|
|
OR H
|
|
JP NZ, rol_32_l8
|
|
POP AF
|
|
LD HL, arr_len
|
|
LD DE, j_arr_src5
|
|
LD BC, j_arr_src6
|
|
SCF
|
|
CCF
|
|
PUSH AF
|
|
rol_32_l9:
|
|
POP AF
|
|
LD A, (DE)
|
|
RLA
|
|
LD (BC), A
|
|
PUSH AF
|
|
INC DE
|
|
INC BC
|
|
DEC HL
|
|
LD A, L
|
|
OR H
|
|
JP NZ, rol_32_l9
|
|
POP AF
|
|
LD HL, arr_len
|
|
LD DE, j_arr_src14
|
|
LD BC, j_arr_src15
|
|
SCF
|
|
CCF
|
|
PUSH AF
|
|
rol_32_l10:
|
|
POP AF
|
|
LD A, (DE)
|
|
RLA
|
|
LD (BC), A
|
|
PUSH AF
|
|
INC DE
|
|
INC BC
|
|
DEC HL
|
|
LD A, L
|
|
OR H
|
|
JP NZ, rol_32_l10
|
|
POP AF
|
|
LD HL, arr_len
|
|
LD DE, j_arr_src6
|
|
LD BC, j_arr_src7
|
|
SCF
|
|
CCF
|
|
PUSH AF
|
|
rol_32_l11:
|
|
POP AF
|
|
LD A, (DE)
|
|
RLA
|
|
LD (BC), A
|
|
PUSH AF
|
|
INC DE
|
|
INC BC
|
|
DEC HL
|
|
LD A, L
|
|
OR H
|
|
JP NZ, rol_32_l11
|
|
POP AF
|
|
LD HL, arr_len
|
|
LD DE, j_arr_src15
|
|
LD BC, j_arr_src16
|
|
SCF
|
|
CCF
|
|
PUSH AF
|
|
rol_32_l12:
|
|
POP AF
|
|
LD A, (DE)
|
|
RLA
|
|
LD (BC), A
|
|
PUSH AF
|
|
INC DE
|
|
INC BC
|
|
DEC HL
|
|
LD A, L
|
|
OR H
|
|
JP NZ, rol_32_l12
|
|
POP AF
|
|
LD HL, arr_len
|
|
LD DE, j_arr_src7
|
|
LD BC, j_arr_src8
|
|
SCF
|
|
CCF
|
|
PUSH AF
|
|
rol_32_l13:
|
|
POP AF
|
|
LD A, (DE)
|
|
RLA
|
|
LD (BC), A
|
|
PUSH AF
|
|
INC DE
|
|
INC BC
|
|
DEC HL
|
|
LD A, L
|
|
OR H
|
|
JP NZ, rol_32_l13
|
|
POP AF
|
|
LD HL, arr_len
|
|
LD DE, j_arr_src16
|
|
LD BC, j_arr_src17
|
|
SCF
|
|
CCF
|
|
PUSH AF
|
|
rol_32_l14:
|
|
POP AF
|
|
LD A, (DE)
|
|
RLA
|
|
LD (BC), A
|
|
PUSH AF
|
|
INC DE
|
|
INC BC
|
|
DEC HL
|
|
LD A, L
|
|
OR H
|
|
JP NZ, rol_32_l14
|
|
POP AF
|
|
LD HL, arr_len
|
|
LD DE, j_arr_src8
|
|
LD BC, j_arr_src9
|
|
SCF
|
|
CCF
|
|
PUSH AF
|
|
rol_32_l15:
|
|
POP AF
|
|
LD A, (DE)
|
|
RLA
|
|
LD (BC), A
|
|
PUSH AF
|
|
INC DE
|
|
INC BC
|
|
DEC HL
|
|
LD A, L
|
|
OR H
|
|
JP NZ, rol_32_l15
|
|
POP AF
|
|
LD HL, arr_len
|
|
LD DE, j_arr_src17
|
|
LD BC, j_arr_src18
|
|
SCF
|
|
CCF
|
|
PUSH AF
|
|
rol_32_l16:
|
|
POP AF
|
|
LD A, (DE)
|
|
RLA
|
|
LD (BC), A
|
|
PUSH AF
|
|
INC DE
|
|
INC BC
|
|
DEC HL
|
|
LD A, L
|
|
OR H
|
|
JP NZ, rol_32_l16
|
|
POP AF
|
|
|
|
on_vram_acc:
|
|
LD A, 0x10
|
|
OUT (SYS_DD17PB), A ; Turn off ROM VideoRAM @ 0xC000
|
|
|
|
wait_game_start:
|
|
LD HL, (random_w) ;= 0x13C6
|
|
LD C, 16
|
|
.i_rnd0:
|
|
LD A, H
|
|
ADD HL, HL
|
|
AND 0x60
|
|
JP PE, .i_rnd1
|
|
INC HL
|
|
.i_rnd1:
|
|
DEC C
|
|
JP NZ, .i_rnd0
|
|
LD (random_w), HL ; 0x13C6
|
|
|
|
LD HL, (monstr_pos) ; 0x27AC
|
|
LD C, 16
|
|
|
|
.i_rnd_m0:
|
|
LD A, H
|
|
ADD HL, HL
|
|
AND 0x60
|
|
JP PE, i_rnd_m1
|
|
INC HL
|
|
i_rnd_m1:
|
|
DEC C
|
|
JP NZ, .i_rnd_m
|
|
LD (monstr_pos), HL ; 0x27AC
|
|
|
|
NOP
|
|
XOR A
|
|
OUT (SYS_DD17PB), A ; Turn on ROM, disable VRAM
|
|
CALL mon_con_in ; undefined mon_con_in()
|
|
CP CTRL_C
|
|
JP Z, exit_to_cpm
|
|
CP ASCII_SP
|
|
JP Z, game_start_ent
|
|
CP ASCII_CR
|
|
JP Z, game_start_ent
|
|
NOP
|
|
JP wait_game_start
|
|
NOP
|
|
NOP
|
|
NOP
|
|
NOP
|
|
|
|
game_start_ent:
|
|
LD A, 0x10
|
|
OUT (SYS_DD17PB), A ; VideoRAM @ 0xC000 no ROM
|
|
NOP
|
|
NOP
|
|
NOP
|
|
CALL clear_screen
|
|
LD D, 0x20
|
|
LD A, (game_line) ;= 0x20
|
|
LD HL, first_lvl0_addr
|
|
LD (j_addr_1), HL ;= 0x133D
|
|
LD HL, first_lvl1_addr
|
|
LD (j_addr_2), HL ;= 0x13FD
|
|
LAB_ram_030b:
|
|
PUSH AF
|
|
LD HL, (random_w) ;= 0x13C6
|
|
LD C, 0x10
|
|
LAB_ram_0311:
|
|
LD A, H
|
|
ADD HL, HL
|
|
AND 0x60
|
|
JP PE, LAB_ram_0319
|
|
INC HL
|
|
LAB_ram_0319:
|
|
DEC C
|
|
JP NZ, LAB_ram_0311
|
|
LD (random_w), HL ;= 0x13C6
|
|
LD B, H
|
|
POP AF
|
|
CP B
|
|
JP NC, LAB_ram_043d
|
|
CALL j_fill_6_zero_1
|
|
LAB_ram_0329:
|
|
LD B, L
|
|
CP B
|
|
JP NC, LAB_ram_0460
|
|
CALL j_fill_6_zero_2
|
|
LAB_ram_0331:
|
|
DEC D
|
|
JP NZ, LAB_ram_030b
|
|
LD A, 0x10
|
|
OUT (SYS_DD17PB), A ; VideoRAM @0xC000 no ROM
|
|
CALL clear_screen
|
|
PUSH AF
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH HL
|
|
LD HL, (j_addr_75) ;= 0xC0D8
|
|
LD BC, j_arr_src_00
|
|
LD DE, lvl_plane_0
|
|
LD A, 0x1
|
|
LAB_ram_034b:
|
|
PUSH AF
|
|
LD A, 0x20
|
|
j_draw_btm_line:
|
|
PUSH AF
|
|
LD A, (BC)
|
|
LD (HL), A ;= db
|
|
LD A, (DE)
|
|
INC H
|
|
LD (HL), A ;= db
|
|
INC H
|
|
INC BC
|
|
INC DE
|
|
POP AF
|
|
DEC A
|
|
JP NZ, j_draw_btm_line
|
|
LD A, H
|
|
SUB 0x20
|
|
SUB 0x20
|
|
LD H, A
|
|
INC L
|
|
POP AF
|
|
DEC A
|
|
JP NZ, LAB_ram_034b
|
|
POP HL
|
|
POP DE
|
|
POP BC
|
|
POP AF
|
|
LD HL, 0xc0dc ;= db
|
|
LD (j_player_addr), HL ;= 0xC0C8
|
|
|
|
; Lifes at start
|
|
LD A, 10
|
|
j_draw_nxt_life:
|
|
LD (j_lifes_param), A ;= 0x1
|
|
CALL draw_scene
|
|
LD HL, (j_player_addr) ;= 0xC0C8
|
|
INC H
|
|
INC H
|
|
LD (j_player_addr), HL ;= 0xC0C8
|
|
LD A, (j_lifes_param) ;= 0x1
|
|
DEC A
|
|
JP NZ, j_draw_nxt_life
|
|
DEC H
|
|
DEC H
|
|
LD (j_last_live_addr), HL ;= 0xD2DC
|
|
LD HL, 0xc0c8 ;= db
|
|
LD (j_player_addr), HL ;= 0xC0C8
|
|
|
|
; --------------------------------------------------
|
|
; Draw treashure chest
|
|
; --------------------------------------------------
|
|
PUSH AF
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH HL
|
|
LD HL, (j_chest_addr) ;= 0xC400
|
|
LD BC, j_chest_c0 ; treashure chest color bit 0
|
|
LD DE, j_chest_c1 ; treashure chest color bit 1
|
|
LD A, 24
|
|
j_treasure_chest:
|
|
PUSH AF
|
|
LD A, 3
|
|
LAB_ram_03a6:
|
|
PUSH AF
|
|
LD A, (BC)
|
|
LD (HL), A ;= db
|
|
LD A, (DE)
|
|
INC H
|
|
LD (HL), A ;= db
|
|
INC H
|
|
INC BC
|
|
INC DE
|
|
POP AF
|
|
DEC A
|
|
JP NZ, LAB_ram_03a6
|
|
LD A, H
|
|
SUB 0x3
|
|
SUB 0x3
|
|
LD H, A
|
|
INC L
|
|
POP AF
|
|
DEC A
|
|
JP NZ, j_treasure_chest
|
|
POP HL
|
|
POP DE
|
|
POP BC
|
|
POP AF
|
|
|
|
draw_game_scene:
|
|
CALL draw_levl_lines
|
|
CALL draw_levl_lines
|
|
CALL handle_monster
|
|
CALL player_monstr_hit
|
|
|
|
; Draw "fire" if active
|
|
LD A, (is_fire)
|
|
OR A
|
|
CALL NZ, handle_fire
|
|
|
|
PUSH BC
|
|
; Disable VRAM access
|
|
XOR A
|
|
OUT (SYS_DD17PB), A
|
|
; Get Console status
|
|
CALL mon_con_status
|
|
OR A ; A = 0 - not keys, 0xFF - key pressed
|
|
JP NZ, .is_key
|
|
LD A, 0xff
|
|
JP .no_key
|
|
.is_key:
|
|
; Read Key
|
|
CALL mon_con_in
|
|
.no_key:
|
|
LD B, A ; save key
|
|
|
|
; VideoRAM @0xC000
|
|
LD A, 0x10
|
|
OUT (SYS_DD17PB), A
|
|
|
|
LD A, B
|
|
POP BC
|
|
CP KEY_LEFT
|
|
JP Z, handle_left_key
|
|
|
|
CP KEY_RIGHT
|
|
JP Z, handle_right_key
|
|
|
|
CP KEY_UP
|
|
JP Z, j_key_up
|
|
|
|
CP ASCII_SP
|
|
JP Z, handle_fire_key
|
|
|
|
CP 'C'
|
|
JP Z, handle_color_key
|
|
|
|
CP CTRL_C
|
|
JP Z, exit_to_cpm
|
|
NOP
|
|
|
|
after_switch_keys:
|
|
LD HL, (j_player_addr) ;= 0xC0C8
|
|
LD A, H
|
|
CP 0xbe
|
|
JP Z, draw_game_scene
|
|
CP 0xfe
|
|
JP Z, draw_game_scene
|
|
CALL draw_scene
|
|
|
|
CALL player_on_floor
|
|
JP draw_game_scene
|
|
|
|
; --------------------------------------------------
|
|
; Change palette [COL3:1]
|
|
; --------------------------------------------------
|
|
handle_color_key:
|
|
LD A, (save_vmode) ;= 0x62 at start
|
|
INC A
|
|
CP 0x67 ; COL3:1 == 111b ?
|
|
JP Z, .set_col000
|
|
.set_color_mode:
|
|
LD (save_vmode), A
|
|
OUT (VID_DD67PB), A ; [VSU, C/M, FL3:1, COL3:1]
|
|
JP after_switch_keys
|
|
|
|
.set_col000:
|
|
LD A, 0x60
|
|
JP .set_color_mode
|
|
|
|
LAB_ram_043d:
|
|
PUSH HL
|
|
PUSH DE
|
|
PUSH BC
|
|
PUSH AF
|
|
LD C, 0x3
|
|
LD HL, (j_addr_1) ;= 0x133D
|
|
LAB_ram_0446:
|
|
LD (HL), 0xff
|
|
INC HL
|
|
DEC C
|
|
JP NZ, LAB_ram_0446
|
|
LD C, 0x3
|
|
LAB_ram_044f:
|
|
LD (HL), 0x00
|
|
INC HL
|
|
DEC C
|
|
JP NZ, LAB_ram_044f
|
|
LD (j_addr_1), HL ;= 0x133D
|
|
POP AF
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
JP LAB_ram_0329
|
|
LAB_ram_0460:
|
|
PUSH HL
|
|
PUSH DE
|
|
PUSH BC
|
|
PUSH AF
|
|
LD C, 0x3
|
|
LD HL, (j_addr_2) ;= 0x13FD
|
|
LAB_ram_0469:
|
|
LD (HL), 0xff
|
|
INC HL
|
|
DEC C
|
|
JP NZ, LAB_ram_0469
|
|
LD C, 0x3
|
|
LAB_ram_0472:
|
|
LD (HL), 0x00
|
|
INC HL
|
|
DEC C
|
|
JP NZ, LAB_ram_0472
|
|
LD (j_addr_2), HL ;= 0x13FD
|
|
POP AF
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
JP LAB_ram_0331
|
|
|
|
; --------------------------------------------------
|
|
; Fill 6 bytes by zero
|
|
; Inp: j_addr_1 -> buffer
|
|
; --------------------------------------------------
|
|
j_fill_6_zero_1:
|
|
PUSH HL
|
|
PUSH DE
|
|
PUSH BC
|
|
PUSH AF
|
|
LD C, 6
|
|
LD HL, (j_addr_1) ;= 0x133D
|
|
.fill_next:
|
|
LD (HL), 0x00
|
|
INC HL
|
|
DEC C
|
|
JP NZ, .fill_next
|
|
LD (j_addr_1), HL ;= 0x133D
|
|
POP AF
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
RET
|
|
|
|
; --------------------------------------------------
|
|
; Fill 6 bytes by zero
|
|
; Inp: j_addr_2 -> buffer
|
|
; --------------------------------------------------
|
|
j_fill_6_zero_2:
|
|
PUSH HL
|
|
PUSH DE
|
|
PUSH BC
|
|
PUSH AF
|
|
LD C, 6
|
|
LD HL, (j_addr_2) ;= 0x13FD
|
|
.fill_next:
|
|
LD (HL), 0x00
|
|
INC HL
|
|
DEC C
|
|
JP NZ, .fill_next
|
|
LD (j_addr_2), HL ;= 0x13FD
|
|
POP AF
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
RET
|
|
|
|
; --------------------------------------------------
|
|
; Draw horisontal moved level lines
|
|
; --------------------------------------------------
|
|
draw_levl_lines:
|
|
LD D, full_lvl_size
|
|
LD HL, last_lvl0_addr ;= 0xBF
|
|
dll_prev_hl_d:
|
|
LD A, (HL) ;= 0xBF
|
|
CP 0
|
|
JP Z, dll_lshift_skip_0
|
|
LD B, A
|
|
RLCA ; cf<-[7:0]<-[7]
|
|
AND 0xfe ; simple left shift
|
|
LD (HL), A
|
|
LD A, B
|
|
RLCA
|
|
AND 0x1
|
|
INC HL
|
|
LD B, (HL) ;= 0xBF
|
|
OR B
|
|
LD (HL), A ;= 0xBF
|
|
DEC HL
|
|
DEC HL
|
|
DEC D
|
|
JP NZ, dll_prev_hl_d
|
|
dll_lshift_complete:
|
|
LD A, (last_lvl0_addr) ;= 0xBF
|
|
LD (first_lvl0_addr), A
|
|
LD D, full_lvl_size
|
|
LD HL, first_lvl1_addr
|
|
dll_rshift:
|
|
LD A, (HL)
|
|
CP 0
|
|
JP Z, dll_rshift_skip_0
|
|
LD B, A
|
|
RRCA ; simple shift right
|
|
AND 0x7f ; [0] -> [7:0] -> C
|
|
LD (HL), A
|
|
LD A, B
|
|
RRCA
|
|
AND 0x80
|
|
DEC HL
|
|
LD B, (HL) ;= 0xBF
|
|
OR B
|
|
LD (HL), A ;= 0xBF
|
|
INC HL
|
|
INC HL
|
|
DEC D
|
|
JP NZ, dll_rshift
|
|
dll_rshift_complete:
|
|
LD A, (first_lvl1_addr)
|
|
LD (last_lvl1_addr), A ;= 0x3
|
|
LD A, full_lvl_size
|
|
LD (lvl_mrg_ctr), A
|
|
LD BC, first_lvl0_addr
|
|
LD DE, lvl_merged_0
|
|
LD HL, first_lvl1_addr
|
|
dll_merg_next:
|
|
LD A, (BC)
|
|
OR (HL)
|
|
CPL
|
|
LD (DE), A
|
|
INC BC
|
|
INC DE
|
|
INC HL
|
|
LD A, (lvl_mrg_ctr)
|
|
DEC A
|
|
LD (lvl_mrg_ctr), A
|
|
OR A
|
|
JP NZ, dll_merg_next
|
|
LD HL, 0xc018 ; draw level line
|
|
LD (j_lvl_draw_addr), HL ;= 0xC0B8
|
|
PUSH AF
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH HL
|
|
LD HL, (j_lvl_draw_addr) ;= 0xC0B8
|
|
LD BC, lvl_merged_0
|
|
LD DE, lvl_plane_0
|
|
LD A, 1
|
|
lvl_ln0_col_nxt:
|
|
PUSH AF
|
|
LD A, 32
|
|
lvl_ln0_row_nxt:
|
|
PUSH AF
|
|
LD A, (BC)
|
|
LD (HL), A ;= db
|
|
LD A, (DE)
|
|
INC H
|
|
LD (HL), A ;= db
|
|
INC H
|
|
INC BC
|
|
INC DE
|
|
POP AF
|
|
DEC A
|
|
JP NZ, lvl_ln0_row_nxt
|
|
LD A, H
|
|
SUB 0x20
|
|
SUB 0x20
|
|
LD H, A
|
|
INC L
|
|
POP AF
|
|
DEC A
|
|
JP NZ, lvl_ln0_col_nxt
|
|
POP HL
|
|
POP DE
|
|
POP BC
|
|
POP AF
|
|
CALL calc_nxt_line_addr
|
|
PUSH AF
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH HL
|
|
LD HL, (j_lvl_draw_addr) ;= 0xC0B8
|
|
LD BC, lvl_merged_1
|
|
LD DE, lvl_plane_0
|
|
LD A, 0x1
|
|
lvl_ln1_col_nxt:
|
|
PUSH AF
|
|
LD A, 0x20
|
|
lvl_ln1_row_nxt:
|
|
PUSH AF
|
|
LD A, (BC)
|
|
LD (HL), A ;= db
|
|
LD A, (DE)
|
|
INC H
|
|
LD (HL), A ;= db
|
|
INC H
|
|
INC BC
|
|
INC DE
|
|
POP AF
|
|
DEC A
|
|
JP NZ, lvl_ln1_row_nxt
|
|
LD A, H
|
|
SUB 0x20
|
|
SUB 0x20
|
|
LD H, A
|
|
INC L
|
|
POP AF
|
|
DEC A
|
|
JP NZ, lvl_ln1_col_nxt
|
|
POP HL
|
|
POP DE
|
|
POP BC
|
|
POP AF
|
|
CALL calc_nxt_line_addr
|
|
PUSH AF
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH HL
|
|
LD HL, (j_lvl_draw_addr) ;= 0xC0B8
|
|
LD BC, lvl_merged_2
|
|
LD DE, lvl_plane_0
|
|
LD A, 0x1
|
|
lvl_ln2_col_nxt:
|
|
PUSH AF
|
|
LD A, 0x20
|
|
lvl_ln2_row_nxt:
|
|
PUSH AF
|
|
LD A, (BC)
|
|
LD (HL), A ;= db
|
|
LD A, (DE)
|
|
INC H
|
|
LD (HL), A ;= db
|
|
INC H
|
|
INC BC
|
|
INC DE
|
|
POP AF
|
|
DEC A
|
|
JP NZ, lvl_ln2_row_nxt
|
|
LD A, H
|
|
SUB 0x20
|
|
SUB 0x20
|
|
LD H, A
|
|
INC L
|
|
POP AF
|
|
DEC A
|
|
JP NZ, lvl_ln2_col_nxt
|
|
POP HL
|
|
POP DE
|
|
POP BC
|
|
POP AF
|
|
CALL calc_nxt_line_addr
|
|
PUSH AF
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH HL
|
|
LD HL, (j_lvl_draw_addr) ;= 0xC0B8
|
|
LD BC, lvl_merged_3
|
|
LD DE, lvl_plane_0
|
|
LD A, 0x1
|
|
lvl_ln3_col_nxt:
|
|
PUSH AF
|
|
LD A, 0x20
|
|
lvl_ln3_row_nxt:
|
|
PUSH AF
|
|
LD A, (BC)
|
|
LD (HL), A ;= db
|
|
LD A, (DE)
|
|
INC H
|
|
LD (HL), A ;= db
|
|
INC H
|
|
INC BC
|
|
INC DE
|
|
POP AF
|
|
DEC A
|
|
JP NZ, lvl_ln3_row_nxt
|
|
LD A, H
|
|
SUB 0x20
|
|
SUB 0x20
|
|
LD H, A
|
|
INC L
|
|
POP AF
|
|
DEC A
|
|
JP NZ, lvl_ln3_col_nxt
|
|
POP HL
|
|
POP DE
|
|
POP BC
|
|
POP AF
|
|
CALL calc_nxt_line_addr
|
|
PUSH AF
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH HL
|
|
LD HL, (j_lvl_draw_addr) ;= 0xC0B8
|
|
LD BC, lvl_merged_4
|
|
LD DE, lvl_plane_0
|
|
LD A, 0x1
|
|
lvl_ln4_col_nxt:
|
|
PUSH AF
|
|
LD A, 0x20
|
|
lvl_ln4_row_nxt:
|
|
PUSH AF
|
|
LD A, (BC)
|
|
LD (HL), A ;= db
|
|
LD A, (DE)
|
|
INC H
|
|
LD (HL), A ;= db
|
|
INC H
|
|
INC BC
|
|
INC DE
|
|
POP AF
|
|
DEC A
|
|
JP NZ, lvl_ln4_row_nxt
|
|
LD A, H
|
|
SUB 0x20
|
|
SUB 0x20
|
|
LD H, A
|
|
INC L
|
|
POP AF
|
|
DEC A
|
|
JP NZ, lvl_ln4_col_nxt
|
|
POP HL
|
|
POP DE
|
|
POP BC
|
|
POP AF
|
|
CALL calc_nxt_line_addr
|
|
PUSH AF
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH HL
|
|
LD HL, (j_lvl_draw_addr) ;= 0xC0B8
|
|
LD BC, lvl_merged_5
|
|
LD DE, lvl_plane_0
|
|
LD A, 1
|
|
lvl_ln5_col_nxt:
|
|
PUSH AF
|
|
LD A, 32
|
|
lvl_ln5_row_nxt:
|
|
PUSH AF
|
|
LD A, (BC)
|
|
LD (HL), A ;= db
|
|
LD A, (DE)
|
|
INC H
|
|
LD (HL), A ;= db
|
|
INC H
|
|
INC BC
|
|
INC DE
|
|
POP AF
|
|
DEC A
|
|
JP NZ, lvl_ln5_row_nxt
|
|
LD A, H
|
|
SUB 0x20
|
|
SUB 0x20
|
|
LD H, A
|
|
INC L
|
|
POP AF
|
|
DEC A
|
|
JP NZ, lvl_ln5_col_nxt
|
|
POP HL
|
|
POP DE
|
|
POP BC
|
|
POP AF
|
|
RET
|
|
calc_nxt_line_addr:
|
|
LD HL, (j_lvl_draw_addr) ;= 0xC0B8
|
|
LD A, L
|
|
ADD A, 0x20
|
|
LD L, A
|
|
LD (j_lvl_draw_addr), HL ;= 0xC0B8
|
|
RET
|
|
dll_lshift_skip_0:
|
|
DEC HL
|
|
DEC D
|
|
JP NZ, dll_prev_hl_d
|
|
JP dll_lshift_complete
|
|
dll_rshift_skip_0:
|
|
INC HL
|
|
DEC D
|
|
JP NZ, dll_rshift
|
|
JP dll_rshift_complete
|
|
|
|
; --------------------------------------------------
|
|
; Handle player movement to left
|
|
; --------------------------------------------------
|
|
handle_left_key:
|
|
PUSH AF
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH HL
|
|
LD DE, j_player_tlt_c0
|
|
LD HL, j_player_tlt_c1
|
|
LD A, (player_turn_frame)
|
|
OR A
|
|
JP Z, LAB_ram_0688
|
|
LD BC, 0x20
|
|
calc_lt_fr_addr:
|
|
ADD HL, BC
|
|
EX DE, HL
|
|
ADD HL, BC
|
|
EX DE, HL
|
|
DEC A
|
|
JP NZ, calc_lt_fr_addr
|
|
LAB_ram_0688:
|
|
LD (player_frame_addr0), HL ;= 0xCFD
|
|
PUSH HL
|
|
POP BC
|
|
EX DE, HL
|
|
LD (player_frame_addr1), HL ;= 0xE1D
|
|
EX DE, HL
|
|
LD HL, (j_player_addr) ;= 0xC0C8
|
|
LD A, 0x10
|
|
kl_next_col:
|
|
PUSH AF
|
|
LD A, 0x2
|
|
kl_next_row:
|
|
PUSH AF
|
|
LD A, H
|
|
CP 0xc0
|
|
JP C, LAB_ram_06d1
|
|
LD A, (BC)
|
|
LD (HL), A ;= db
|
|
LD A, (DE)
|
|
INC H
|
|
LD (HL), A ;= db
|
|
LD A, H
|
|
CP 0xff
|
|
JP Z, LAB_ram_06c3
|
|
LAB_ram_06ac:
|
|
INC H
|
|
INC BC
|
|
INC DE
|
|
POP AF
|
|
DEC A
|
|
JP NZ, kl_next_row
|
|
LD A, H
|
|
SUB 0x2
|
|
SUB 0x2
|
|
LD H, A
|
|
LAB_ram_06ba:
|
|
INC L
|
|
POP AF
|
|
DEC A
|
|
JP NZ, kl_next_col
|
|
JP LAB_ram_06d5
|
|
LAB_ram_06c3:
|
|
POP AF
|
|
LAB_ram_06c4:
|
|
INC BC
|
|
INC DE
|
|
DEC A
|
|
JP NZ, LAB_ram_06c4
|
|
LD A, (j_player_addr+1)
|
|
LD H, A
|
|
JP LAB_ram_06ba
|
|
LAB_ram_06d1:
|
|
INC H
|
|
JP LAB_ram_06ac
|
|
LAB_ram_06d5:
|
|
POP HL
|
|
POP DE
|
|
POP BC
|
|
POP AF
|
|
LD A, (player_turn_frame)
|
|
OR A
|
|
JP Z, LAB_ram_06f8
|
|
DEC A
|
|
LAB_ram_06e1:
|
|
LD (player_turn_frame), A
|
|
LD HL, (j_player_addr) ;= 0xC0C8
|
|
LD A, H
|
|
CP 0xbe
|
|
JP Z, draw_game_scene
|
|
CP 0xfe
|
|
JP Z, draw_game_scene
|
|
CALL player_on_floor
|
|
JP draw_game_scene
|
|
LAB_ram_06f8:
|
|
LD HL, (j_player_addr) ;= 0xC0C8
|
|
LD A, H
|
|
CP 0xca
|
|
JP Z, l_key_ca
|
|
LAB_ram_0701:
|
|
CP 0xbe
|
|
JP Z, l_key_be
|
|
DEC H
|
|
DEC H
|
|
LD (j_player_addr), HL ;= 0xC0C8
|
|
LAB_ram_070b:
|
|
LD A, 0x3
|
|
JP LAB_ram_06e1
|
|
l_key_be:
|
|
LD H, 0xfe
|
|
LD (j_player_addr), HL ;= 0xC0C8
|
|
JP LAB_ram_070b
|
|
|
|
; --------------------------------------------------
|
|
; Handle player movement to right
|
|
; --------------------------------------------------
|
|
handle_right_key:
|
|
PUSH AF
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH HL
|
|
LD DE, j_player_trt_c0
|
|
LD HL, j_player_trt_c1
|
|
LD A, (player_turn_frame)
|
|
OR A
|
|
JP Z, LAB_ram_0734
|
|
LD BC, 0x20
|
|
calc_rt_fr_addr:
|
|
ADD HL, BC
|
|
EX DE, HL
|
|
ADD HL, BC
|
|
EX DE, HL
|
|
DEC A
|
|
JP NZ, calc_rt_fr_addr
|
|
|
|
LAB_ram_0734:
|
|
LD (player_frame_addr0), HL ;= 0xCFD
|
|
PUSH HL
|
|
POP BC
|
|
EX DE, HL
|
|
LD (player_frame_addr1), HL ;= 0xE1D
|
|
EX DE, HL
|
|
LD HL, (j_player_addr) ;= 0xC0C8
|
|
|
|
LD A, 16
|
|
kr_next_col:
|
|
PUSH AF
|
|
LD A, 2
|
|
kr_next_row:
|
|
PUSH AF
|
|
LD A, H
|
|
CP 0xc0
|
|
JP C, kr_coll_left
|
|
LD A, (BC)
|
|
LD (HL), A ;= db
|
|
LD A, (DE)
|
|
INC H
|
|
LD (HL), A ;= db
|
|
LD A, H
|
|
CP 0xff
|
|
JP Z, kr_coll_right
|
|
|
|
kr_cont_left:
|
|
INC H
|
|
INC BC
|
|
INC DE
|
|
POP AF
|
|
DEC A
|
|
JP NZ, kr_next_row
|
|
LD A, H
|
|
SUB 0x2
|
|
SUB 0x2
|
|
LD H, A
|
|
kr_cont_right:
|
|
INC L
|
|
POP AF
|
|
DEC A
|
|
JP NZ, kr_next_col
|
|
JP LAB_ram_0781
|
|
|
|
kr_coll_right:
|
|
POP AF
|
|
LAB_ram_0770:
|
|
INC BC
|
|
INC DE
|
|
DEC A
|
|
JP NZ, LAB_ram_0770
|
|
LD A, (j_player_addr+1)
|
|
LD H, A
|
|
JP kr_cont_right
|
|
|
|
kr_coll_left:
|
|
INC H
|
|
JP kr_cont_left
|
|
|
|
LAB_ram_0781:
|
|
POP HL
|
|
POP DE
|
|
POP BC
|
|
POP AF
|
|
CALL player_monstr_hit
|
|
LD A, (player_turn_frame)
|
|
CP 3
|
|
JP Z, kr_last_frame
|
|
; next frame
|
|
INC A
|
|
LAB_ram_0791:
|
|
LD (player_turn_frame), A
|
|
LD HL, (j_player_addr) ;= 0xC0C8
|
|
LD A, H
|
|
CP 0xfe
|
|
JP Z, draw_game_scene
|
|
CP 0xbe
|
|
JP Z, draw_game_scene
|
|
CALL player_on_floor
|
|
JP draw_game_scene
|
|
kr_last_frame:
|
|
LD HL, (j_player_addr) ;= 0xC0C8
|
|
LD A, H
|
|
CP 0xc0
|
|
JP Z, LAB_ram_0a4e
|
|
LAB_ram_07b1:
|
|
CP 0xfe
|
|
JP Z, LAB_ram_07c2
|
|
INC H
|
|
INC H
|
|
LD (j_player_addr), HL ;= 0xC0C8
|
|
CALL player_monstr_hit
|
|
|
|
LAB_ram_07be:
|
|
XOR A
|
|
JP LAB_ram_0791
|
|
|
|
LAB_ram_07c2:
|
|
LD H, 0xbe
|
|
LD (j_player_addr), HL ;= 0xC0C8
|
|
JP LAB_ram_07be
|
|
|
|
|
|
; --------------------------------------------------
|
|
; Handle player movement jump up
|
|
; --------------------------------------------------
|
|
j_key_up:
|
|
LD HL, (j_player_addr) ;= 0xC0C8
|
|
LD A, L
|
|
CP 8
|
|
JP Z, draw_game_scene
|
|
CALL erase_player
|
|
LD HL, (j_player_addr) ; Move player coord Up
|
|
LD A, L
|
|
SUB 15 ; y-=15
|
|
LD L, A
|
|
LD (j_player_addr), HL
|
|
CALL draw_scene
|
|
|
|
; --------------------------------------------------
|
|
; Play Jump Sound
|
|
; --------------------------------------------------
|
|
PUSH BC
|
|
LD BC, 50
|
|
j_bell:
|
|
LD A, 0xf
|
|
OUT (DD67PC), A ;[USER3..1, STB-LP, BELL, TAPE3..1]
|
|
PUSH HL
|
|
PUSH DE
|
|
PUSH BC
|
|
PUSH AF
|
|
LD DE, 10
|
|
j_buzz_delay1:
|
|
DEC DE
|
|
LD A, D
|
|
OR E
|
|
JP NZ, j_buzz_delay1
|
|
POP AF
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
LD A, 0
|
|
OUT (DD67PC), A ;[USER3..1, STB-LP, BELL, TAPE3..1]
|
|
PUSH HL
|
|
PUSH DE
|
|
PUSH BC
|
|
PUSH AF
|
|
LD DE, 10
|
|
j_buzz_delay2:
|
|
DEC DE
|
|
LD A, D
|
|
OR E
|
|
JP NZ, j_buzz_delay2
|
|
POP AF
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
DEC BC
|
|
LD A, C
|
|
OR B
|
|
JP NZ, j_bell
|
|
POP BC
|
|
LD HL, (j_player_addr) ;= 0xC0C8
|
|
DEC L
|
|
LD A, (player_turn_frame)
|
|
CP 2
|
|
JP NC, jmp_next_frame
|
|
|
|
; Check collision
|
|
LAB_ram_0824:
|
|
LD A, (HL) ;= db
|
|
OR A
|
|
JP NZ, jump_collision
|
|
DEC L
|
|
INC H
|
|
LD A, (HL) ;= db
|
|
OR A
|
|
JP NZ, jump_collision
|
|
CALL erase_player
|
|
; no collision, move player up 32px (17+15)
|
|
LD HL, (j_player_addr) ;= 0xC0C8
|
|
LD A, L
|
|
SUB 17
|
|
LD L, A
|
|
LD (j_player_addr), HL ;= 0xC0C8
|
|
CALL draw_scene
|
|
JP draw_game_scene
|
|
|
|
jump_collision:
|
|
CALL erase_player
|
|
; move player back down
|
|
LD HL, (j_player_addr) ;= 0xC0C8
|
|
LD A, L
|
|
ADD A, 15
|
|
LD L, A
|
|
LD (j_player_addr), HL ;= 0xC0C8
|
|
CALL draw_scene
|
|
CALL draw_death
|
|
CALL player_on_floor
|
|
JP draw_game_scene
|
|
|
|
; --------------------------------------------------
|
|
; Player on floor?
|
|
; --------------------------------------------------
|
|
player_on_floor:
|
|
; calc player floor addr
|
|
LD HL, (j_player_addr) ;= 0xC0C8
|
|
LD A, L
|
|
ADD A, 16
|
|
LD L, A
|
|
; hl - floor
|
|
LD A, (player_turn_frame)
|
|
CP 2
|
|
JP NC, .floor_at_rt ; animation death
|
|
.chk_floor:
|
|
LD A, (HL)
|
|
OR A
|
|
JP Z, no_floor
|
|
RET
|
|
|
|
.floor_at_rt:
|
|
INC H
|
|
INC H
|
|
JP .chk_floor
|
|
|
|
; --------------------------------------------------
|
|
; No floor under foots, fall down
|
|
; --------------------------------------------------
|
|
no_floor:
|
|
; move player down
|
|
CALL erase_player
|
|
LD HL, (j_player_addr)
|
|
LD A, L
|
|
ADD A, 16
|
|
LD L, A
|
|
LD (j_player_addr), HL
|
|
; redraw player
|
|
CALL draw_scene
|
|
; and recheck floor again
|
|
LD HL, (j_player_addr)
|
|
LD A, L
|
|
ADD A, 16
|
|
LD L, A
|
|
LD A, (HL) ;= db
|
|
OR A
|
|
JP Z, no_floor
|
|
|
|
draw_death:
|
|
PUSH AF
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH HL
|
|
LD HL, (j_player_addr) ;= 0xC0C8
|
|
LD BC, j_play_death_c0
|
|
LD DE, j_play_death_c1
|
|
LD A, 16
|
|
dd_next_col:
|
|
PUSH AF
|
|
LD A, 2
|
|
dd_next_row:
|
|
PUSH AF
|
|
LD A, (BC)
|
|
LD (HL), A ;= db
|
|
LD A, (DE)
|
|
INC H
|
|
LD (HL), A ;= db
|
|
INC H
|
|
INC BC
|
|
INC DE
|
|
POP AF
|
|
DEC A
|
|
JP NZ, dd_next_row
|
|
LD A, H
|
|
SUB 0x2
|
|
SUB 0x2
|
|
LD H, A
|
|
INC L
|
|
POP AF
|
|
DEC A
|
|
JP NZ, dd_next_col
|
|
POP HL
|
|
POP DE
|
|
POP BC
|
|
POP AF
|
|
PUSH BC
|
|
; make death sound
|
|
LD BC, 0x32
|
|
dp_nxt_beep:
|
|
LD A, 0xf
|
|
OUT (DD67PC), A ; Bell+Tape
|
|
PUSH HL
|
|
PUSH DE
|
|
PUSH BC
|
|
PUSH AF
|
|
LD DE, 10
|
|
dp_dly_nxt1:
|
|
DEC DE
|
|
LD A, D
|
|
OR E
|
|
JP NZ, dp_dly_nxt1
|
|
POP AF
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
LD A, 0
|
|
OUT (DD67PC), A ; Bell+Tape
|
|
PUSH HL
|
|
PUSH DE
|
|
PUSH BC
|
|
PUSH AF
|
|
LD DE, 10
|
|
dp_dly_nxt2:
|
|
DEC DE
|
|
LD A, D
|
|
OR E
|
|
JP NZ, dp_dly_nxt2
|
|
POP AF
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
DEC BC
|
|
LD A, C
|
|
OR B
|
|
JP NZ, dp_nxt_beep
|
|
POP BC
|
|
LD HL, (j_player_addr) ;= 0xC0C8
|
|
LD A, L
|
|
CP 0xc8
|
|
JP Z, draw_grave_cross
|
|
|
|
check_floor_down:
|
|
LD A, 16
|
|
pl_next_frame:
|
|
LD (skip_frames), A
|
|
CALL draw_levl_lines
|
|
CALL draw_levl_lines
|
|
CALL handle_monster
|
|
CALL player_monstr_hit
|
|
|
|
LD A, (is_fire)
|
|
OR A
|
|
CALL NZ, handle_fire
|
|
|
|
LD HL, (j_player_addr)
|
|
LD A, L
|
|
ADD A, 16
|
|
LD L, A
|
|
LD A, (HL) ;= db
|
|
OR A
|
|
JP Z, no_floor
|
|
LD A, (skip_frames) ;= 0x1
|
|
DEC A
|
|
JP NZ, pl_next_frame
|
|
RET
|
|
|
|
; --------------------------------------------------
|
|
; Draw level and monster
|
|
; --------------------------------------------------
|
|
draw_scene:
|
|
LD A, (player_turn_frame)
|
|
LD B, A
|
|
ADD A, B
|
|
LD (player_tf2), A
|
|
PUSH AF
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH HL
|
|
LD DE, j_arr_src10
|
|
LD HL, j_arr_src1
|
|
LD A, (player_tf2)
|
|
OR A
|
|
JP Z, jd_frame_0
|
|
LD BC, 0x20
|
|
LAB_ram_0948:
|
|
ADD HL, BC
|
|
EX DE, HL
|
|
ADD HL, BC
|
|
EX DE, HL
|
|
DEC A
|
|
JP NZ, LAB_ram_0948
|
|
jd_frame_0:
|
|
LD (player_frame_addr0), HL ;= 0xCFD
|
|
PUSH HL
|
|
POP BC
|
|
EX DE, HL
|
|
LD (player_frame_addr1), HL ;= 0xE1D
|
|
EX DE, HL
|
|
LD HL, (j_player_addr) ;= 0xC0C8
|
|
LD A, 16
|
|
j_draw_pl_nxt_col:
|
|
PUSH AF
|
|
LD A, 2
|
|
j_draw_pl_nxt_row:
|
|
PUSH AF
|
|
LD A, H
|
|
CP 0xc0
|
|
JP C, LAB_ram_0999
|
|
LD A, (BC)
|
|
LD (HL), A ;= db
|
|
LD A, (DE)
|
|
INC H
|
|
LD (HL), A ;= db
|
|
LD A, H
|
|
CP 0xff
|
|
JP Z, LAB_ram_098b
|
|
LAB_ram_0974:
|
|
INC H
|
|
INC BC
|
|
INC DE
|
|
POP AF
|
|
DEC A
|
|
JP NZ, j_draw_pl_nxt_row
|
|
LD A, H
|
|
SUB 0x2
|
|
SUB 0x2
|
|
LD H, A
|
|
LAB_ram_0982:
|
|
INC L
|
|
POP AF
|
|
DEC A
|
|
JP NZ, j_draw_pl_nxt_col
|
|
JP LAB_ram_099d
|
|
LAB_ram_098b:
|
|
POP AF
|
|
LAB_ram_098c:
|
|
INC BC
|
|
INC DE
|
|
DEC A
|
|
JP NZ, LAB_ram_098c
|
|
LD A, (j_player_addr+1)
|
|
LD H, A
|
|
JP LAB_ram_0982
|
|
LAB_ram_0999:
|
|
INC H
|
|
JP LAB_ram_0974
|
|
LAB_ram_099d:
|
|
POP HL
|
|
POP DE
|
|
POP BC
|
|
POP AF
|
|
CALL draw_levl_lines
|
|
CALL draw_levl_lines
|
|
CALL handle_monster
|
|
CALL player_monstr_hit
|
|
LD A, (is_fire)
|
|
OR A
|
|
CALL NZ, handle_fire
|
|
RET
|
|
jmp_next_frame:
|
|
INC H
|
|
INC H
|
|
JP LAB_ram_0824
|
|
|
|
; --------------------------------------------------
|
|
; Erase player from scene
|
|
; --------------------------------------------------
|
|
erase_player:
|
|
PUSH AF
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH HL
|
|
LD HL, (j_player_addr)
|
|
LD BC, j_player_era_c0
|
|
LD DE, j_player_era_c1
|
|
LD A, 16
|
|
.ep_next_col:
|
|
PUSH AF
|
|
LD A, 2
|
|
.ep_next_row:
|
|
PUSH AF
|
|
LD A, (BC)
|
|
LD (HL), A ;= db
|
|
LD A, (DE)
|
|
INC H
|
|
LD (HL), A ;= db
|
|
INC H
|
|
INC BC
|
|
INC DE
|
|
POP AF
|
|
DEC A
|
|
JP NZ, .ep_next_row
|
|
LD A, H
|
|
SUB 0x2
|
|
SUB 0x2
|
|
LD H, A
|
|
INC L
|
|
POP AF
|
|
DEC A
|
|
JP NZ, .ep_next_col
|
|
POP HL
|
|
POP DE
|
|
POP BC
|
|
POP AF
|
|
RET
|
|
|
|
draw_grave_cross:
|
|
PUSH AF
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH HL
|
|
LD HL, (j_last_live_addr) ;= 0xD2DC
|
|
LD BC, j_gravecross_c0
|
|
LD DE, j_gravecross_c1
|
|
LD A, 16
|
|
dgc_next_col:
|
|
PUSH AF
|
|
LD A, 1
|
|
dgc_next_row:
|
|
PUSH AF
|
|
LD A, (BC)
|
|
LD (HL), A
|
|
LD A, (DE)
|
|
INC H
|
|
LD (HL), A
|
|
INC H
|
|
INC BC
|
|
INC DE
|
|
POP AF
|
|
DEC A
|
|
JP NZ, dgc_next_row
|
|
LD A, H
|
|
SUB 0x1
|
|
SUB 0x1
|
|
LD H, A
|
|
INC L
|
|
POP AF
|
|
DEC A
|
|
JP NZ, dgc_next_col
|
|
POP HL
|
|
POP DE
|
|
POP BC
|
|
POP AF
|
|
LD HL, (j_last_live_addr) ;= 0xD2DC
|
|
LD A, H
|
|
CP 0xc0
|
|
JP Z, is_lost_life
|
|
DEC H
|
|
DEC H
|
|
LD (j_last_live_addr), HL ;= 0xD2DC
|
|
JP check_floor_down
|
|
|
|
is_lost_life:
|
|
CALL out_game_over
|
|
|
|
f_init_game:
|
|
LD A, 1
|
|
LD (j_monster_off), A
|
|
XOR A
|
|
LD (player_turn_frame), A
|
|
LD (is_fire), A
|
|
LD HL, 0xc0c8 ;= db
|
|
LD (j_player_addr), HL ;= 0xC0C8
|
|
JP on_vram_acc
|
|
|
|
l_key_ca:
|
|
LD A, L
|
|
CP 0x8
|
|
JP Z, LAB_ram_0a58
|
|
LD A, H
|
|
JP LAB_ram_0701
|
|
LAB_ram_0a4e:
|
|
LD A, L
|
|
CP 0x8
|
|
JP Z, LAB_ram_0a58
|
|
LD A, H
|
|
JP LAB_ram_07b1
|
|
LAB_ram_0a58:
|
|
PUSH BC
|
|
LD BC, 250
|
|
j_bell1:
|
|
LD A, 0xf
|
|
OUT (DD67PC), A ; Bell+Tape
|
|
PUSH HL
|
|
PUSH DE
|
|
PUSH BC
|
|
PUSH AF
|
|
LD DE, 0x14
|
|
j_bell1_delay1:
|
|
DEC DE
|
|
LD A, D
|
|
OR E
|
|
JP NZ, j_bell1_delay1
|
|
POP AF
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
LD A, 0x00
|
|
OUT (DD67PC), A ; Bell+Tape
|
|
PUSH HL
|
|
PUSH DE
|
|
PUSH BC
|
|
PUSH AF
|
|
LD DE, 0x14
|
|
j_bell1_delay2:
|
|
DEC DE
|
|
LD A, D
|
|
OR E
|
|
JP NZ, j_bell1_delay2
|
|
POP AF
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
DEC BC
|
|
LD A, C
|
|
OR B
|
|
JP NZ, j_bell1
|
|
POP BC
|
|
|
|
LD A, (game_line) ;= 0x20
|
|
CP 80
|
|
JP Z, final_sound
|
|
|
|
CALL draw_happy_end
|
|
CALL clear_screen
|
|
|
|
LD A, 0
|
|
OUT (SYS_DD17PB), A ; vram off, rom on
|
|
|
|
; Out message, Wait for key
|
|
LD HL, (curr_color)
|
|
PUSH HL
|
|
LD A, 0
|
|
LD L, A
|
|
CPL
|
|
LD H, A
|
|
LD (curr_color), HL
|
|
LD HL, 0x0870
|
|
LD (cursor_pos), HL
|
|
LD DE, j_msg_pres_key ;= '\r'
|
|
LD C, C_WRITESTR
|
|
CALL BDOS_ENTER
|
|
POP HL
|
|
|
|
; Repeat again !!!
|
|
LD (curr_color), HL
|
|
LD HL, (curr_color)
|
|
PUSH HL
|
|
LD A, 0
|
|
LD L, A
|
|
CPL
|
|
LD H, A
|
|
LD (curr_color), HL
|
|
LD HL, 0x870
|
|
LD (cursor_pos), HL
|
|
LD DE, j_msg_pres_key ;= '\r'
|
|
LD C, C_WRITESTR
|
|
CALL BDOS_ENTER
|
|
POP HL
|
|
|
|
LD (curr_color), HL
|
|
LD A, 0x10
|
|
OUT (SYS_DD17PB), A ; vram @ c000
|
|
|
|
; Init to default values
|
|
XOR A
|
|
LD (player_turn_frame), A
|
|
LD A, (monstr_per) ;= 0x15
|
|
ADD A, 5
|
|
LD (monstr_per), A ;= 0x15
|
|
|
|
LD A, 1
|
|
LD (j_monster_off), A
|
|
LD A, (game_line) ;= 0x20
|
|
ADD A, 0x10
|
|
LD (game_line), A ;= 0x20
|
|
JP on_vram_acc
|
|
|
|
; --------------------------------------------------
|
|
; Play final sound for winner
|
|
; --------------------------------------------------
|
|
final_sound:
|
|
PUSH BC
|
|
LD BC, 250
|
|
|
|
.fm_next_note:
|
|
LD A, 0xf
|
|
OUT (DD67PC), A ; "1" bell + tape
|
|
PUSH HL
|
|
PUSH DE
|
|
PUSH BC
|
|
PUSH AF
|
|
|
|
LD DE, 40
|
|
.fm_delay1:
|
|
DEC DE
|
|
LD A, D
|
|
OR E
|
|
JP NZ, .fm_delay1
|
|
|
|
POP AF
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
LD A, 0x00
|
|
OUT (DD67PC), A ; "0" bell + tape
|
|
PUSH HL
|
|
PUSH DE
|
|
PUSH BC
|
|
PUSH AF
|
|
|
|
LD DE, 40
|
|
.fm_delay2:
|
|
DEC DE
|
|
LD A, D
|
|
OR E
|
|
JP NZ, .fm_delay2
|
|
|
|
POP AF
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
DEC BC
|
|
LD A, C
|
|
OR B
|
|
JP NZ, .fm_next_note
|
|
POP BC
|
|
|
|
; --------------------------------------------------
|
|
; Display final message for winner
|
|
; --------------------------------------------------
|
|
final_messages:
|
|
|
|
CALL clear_screen
|
|
; close VRAM access
|
|
LD A, 0x00
|
|
OUT (SYS_DD17PB), A
|
|
|
|
; End Message 1
|
|
LD HL, (curr_color)
|
|
PUSH HL
|
|
LD A, 0x00
|
|
LD L, A
|
|
CPL
|
|
LD H, A
|
|
LD (curr_color), HL
|
|
LD HL, 0x80
|
|
LD (cursor_pos), HL
|
|
LD DE, j_msg_fin1
|
|
LD C, C_WRITESTR
|
|
CALL BDOS_ENTER
|
|
POP HL
|
|
|
|
; End Message 2
|
|
LD (curr_color), HL
|
|
LD HL, (curr_color)
|
|
PUSH HL
|
|
LD A, 0x00
|
|
LD L, A
|
|
CPL
|
|
LD H, A
|
|
LD (curr_color), HL
|
|
LD HL, 0xA0
|
|
LD (cursor_pos), HL
|
|
LD DE, j_msg_fin2
|
|
LD C, C_WRITESTR
|
|
CALL BDOS_ENTER
|
|
POP HL
|
|
|
|
; End Message 3
|
|
LD (curr_color), HL
|
|
LD HL, (curr_color)
|
|
PUSH HL
|
|
LD A, 0
|
|
LD L, A
|
|
CPL
|
|
LD H, A
|
|
LD (curr_color), HL
|
|
LD HL, 0xC0
|
|
LD (cursor_pos), HL
|
|
LD DE, j_msg_fin3 ;= 0xda
|
|
LD C, C_WRITESTR
|
|
CALL BDOS_ENTER
|
|
POP HL
|
|
|
|
; End Message 4
|
|
LD (curr_color), HL
|
|
LD HL, (curr_color)
|
|
PUSH HL
|
|
LD A, 0x00
|
|
LD L, A
|
|
CPL
|
|
LD H, A
|
|
LD (curr_color), HL
|
|
LD HL, 208
|
|
LD (cursor_pos), HL
|
|
LD DE, j_msg_fin4 ;= 0xD0
|
|
LD C, C_WRITESTR
|
|
CALL BDOS_ENTER
|
|
POP HL
|
|
|
|
; End Message, Wait key
|
|
LD (curr_color), HL
|
|
LD HL, (curr_color)
|
|
PUSH HL
|
|
LD A, 0xff
|
|
LD L, A
|
|
CPL
|
|
LD H, A
|
|
LD (curr_color), HL
|
|
LD HL, 0x8e0
|
|
LD (cursor_pos), HL
|
|
LD DE, j_msg_pres_key ;= '\r'
|
|
LD C, C_WRITESTR
|
|
CALL BDOS_ENTER
|
|
POP HL
|
|
|
|
LD (curr_color), HL
|
|
LD A, 16
|
|
LD (game_line), A ;= 0x20
|
|
LD A, 32
|
|
LD (monstr_per), A ;= 0x15
|
|
|
|
JP f_init_game
|
|
|
|
clear_screen: ; Make screen green
|
|
PUSH HL
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH AF
|
|
LD A, (save_vmode) ;= 0x62
|
|
OUT (VID_DD67PB), A
|
|
LD HL, 0xc000
|
|
LD D, 0x20
|
|
LD A, (BYTE_ram_0cbc)
|
|
AND 0x3
|
|
CP 0x00
|
|
JP Z, LAB_ram_0c14
|
|
CP 0x1
|
|
JP Z, LAB_ram_0c1b
|
|
CP 0x2
|
|
JP Z, LAB_ram_0c22
|
|
LD B, 0xff
|
|
LD C, 0xff
|
|
LAB_ram_0c00:
|
|
LD E, 0xff
|
|
j_mv_nx_note:
|
|
LD (HL), B ;= db
|
|
INC H
|
|
LD (HL), C ;= db
|
|
DEC H
|
|
INC HL
|
|
DEC E
|
|
JP NZ, j_mv_nx_note
|
|
INC HL
|
|
INC H
|
|
DEC D
|
|
JP NZ, LAB_ram_0c00
|
|
JP LAB_ram_0c29
|
|
LAB_ram_0c14:
|
|
LD C, 0x00
|
|
LD B, 0x00
|
|
JP LAB_ram_0c00
|
|
LAB_ram_0c1b:
|
|
LD B, 0x00
|
|
LD C, 0xff
|
|
JP LAB_ram_0c00
|
|
LAB_ram_0c22:
|
|
LD B, 0xff
|
|
LD C, 0x00
|
|
JP LAB_ram_0c00
|
|
LAB_ram_0c29:
|
|
POP AF
|
|
POP DE
|
|
POP BC
|
|
POP HL
|
|
RET
|
|
|
|
include "jack_data.inc"
|
|
|
|
; --------------------------------------------------
|
|
; Variables
|
|
; --------------------------------------------------
|
|
|
|
j_addr_1:
|
|
dw first_lvl1_addr
|
|
j_addr_2:
|
|
dw lvl_merged_0
|
|
player_frame_addr0:
|
|
dw j_arr_src1
|
|
player_frame_addr1:
|
|
dw j_arr_src10
|
|
j_last_live_addr:
|
|
dw 0xD2DC
|
|
|
|
; --------------------------------------------------
|
|
;
|
|
; Application entry point
|
|
;
|
|
; --------------------------------------------------
|
|
|
|
j_start:
|
|
LD A, 0x00
|
|
OUT (SYS_DD17PB), A ; close VRAM
|
|
LD HL, (curr_color)
|
|
PUSH HL
|
|
LD A, 0x00
|
|
LD L, A
|
|
CPL
|
|
LD H, A
|
|
LD (curr_color), HL
|
|
LD HL, 0x00
|
|
LD (cursor_pos), HL
|
|
LD DE, j_set_vmode ; = 0x1B
|
|
LD C, C_WRITESTR ; 9
|
|
CALL BDOS_ENTER
|
|
POP HL
|
|
LD (curr_color), HL
|
|
LD (saved_color), HL
|
|
PUSH HL
|
|
LD A, 0x00
|
|
LD L, A
|
|
CPL
|
|
LD H, A
|
|
LD (curr_color), HL
|
|
LD HL, 0x90
|
|
LD (cursor_pos), HL
|
|
LD DE, j_msg_verion ; "ВЕРСИЯ 1.0"
|
|
LD C, C_WRITESTR
|
|
CALL BDOS_ENTER
|
|
POP HL
|
|
LD (curr_color), HL
|
|
LD HL, (curr_color)
|
|
PUSH HL
|
|
LD A, 0x00
|
|
LD L, A
|
|
CPL
|
|
LD H, A
|
|
LD (curr_color), HL
|
|
LD HL, 0xa0
|
|
LD (cursor_pos), HL
|
|
LD DE, j_spaces_35 ;
|
|
LD C, C_WRITESTR
|
|
CALL BDOS_ENTER
|
|
POP HL
|
|
LD (curr_color), HL
|
|
LD HL, (curr_color)
|
|
PUSH HL
|
|
LD A, 0x00
|
|
LD L, A
|
|
CPL
|
|
LD H, A
|
|
LD (curr_color), HL
|
|
LD HL, 0xb0
|
|
LD (cursor_pos), HL
|
|
LD DE, j_msg_instr1 ; Выстрел-клавиша "пробел", цвет "Ц"
|
|
LD C, C_WRITESTR
|
|
CALL BDOS_ENTER
|
|
POP HL
|
|
LD (curr_color), HL
|
|
LD HL, (curr_color)
|
|
PUSH HL
|
|
LD A, 0x00
|
|
LD L, A
|
|
CPL
|
|
LD H, A
|
|
LD (curr_color), HL
|
|
LD HL, 0x2c0
|
|
LD (cursor_pos), HL
|
|
LD DE, j_msg_anykey ; Нажмите любую клавишу
|
|
LD C, C_WRITESTR
|
|
CALL BDOS_ENTER
|
|
POP HL
|
|
LD (curr_color), HL
|
|
LD A, 0x10
|
|
OUT (SYS_DD17PB), A
|
|
LD HL, 0xca18
|
|
LD B, 0x3
|
|
CALL j_draw_rv
|
|
LD HL, 0xce20
|
|
LD B, 0x3
|
|
CALL j_draw_rv
|
|
LD HL, 0xd220
|
|
LD B, 0x3
|
|
CALL j_draw_rv
|
|
LD HL, 0xd618
|
|
LD B, 0x4
|
|
CALL j_draw_rv
|
|
LD HL, 0xde18
|
|
LD B, 0x4
|
|
CALL j_draw_rv
|
|
LD HL, 0xe218
|
|
LD B, 0x4
|
|
CALL j_draw_rv
|
|
LD HL, 0xe618
|
|
LD B, 0x3
|
|
CALL j_draw_rv
|
|
LD HL, 0xea08
|
|
LD B, 0x1
|
|
CALL j_draw_rv
|
|
LD HL, 0xea18
|
|
LD B, 0x4
|
|
CALL j_draw_rv
|
|
LD HL, 0xee18
|
|
LD B, 0x4
|
|
CALL j_draw_rv
|
|
LD HL, 0xf418
|
|
LD B, 0x4
|
|
CALL j_draw_rv
|
|
LD HL, 0xf818
|
|
LD B, 0x3
|
|
CALL j_draw_rv
|
|
LD HL, 0xfc28
|
|
LD B, 0x2
|
|
CALL j_draw_rv
|
|
LD HL, 0xd648
|
|
LD B, 0x5
|
|
CALL j_draw_rv
|
|
LD HL, 0xda58
|
|
LD B, 0x4
|
|
CALL j_draw_rv
|
|
LD HL, 0xe258
|
|
LD B, 0x4
|
|
CALL j_draw_rv
|
|
LD HL, 0xe650
|
|
LD B, 0x4
|
|
CALL j_draw_rv
|
|
LD HL, 0xee50
|
|
LD B, 0x1
|
|
CALL j_draw_rv
|
|
LD HL, 0xee68
|
|
LD B, 0x1
|
|
CALL j_draw_rv
|
|
LD HL, 0xf248
|
|
LD B, 0x6
|
|
CALL j_draw_rv
|
|
LD HL, 0xf458
|
|
LD B, 0x1
|
|
CALL j_draw_rv
|
|
LD HL, 0xf658
|
|
LD B, 0x2
|
|
CALL j_draw_rv
|
|
LD HL, 0xf850
|
|
LD B, 0x1
|
|
CALL j_draw_rv
|
|
LD HL, 0xfa48
|
|
LD B, 0x1
|
|
CALL j_draw_rv
|
|
LD HL, 0xf868
|
|
LD B, 0x1
|
|
CALL j_draw_rv
|
|
LD HL, 0xfa70
|
|
LD B, 0x1
|
|
CALL j_draw_rv
|
|
LD HL, 0xc618
|
|
LD B, 0x2
|
|
CALL j_draw_rh
|
|
LD HL, 0xc630
|
|
LD B, 0x2
|
|
CALL j_draw_rh
|
|
LD HL, 0xd018
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xd028
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xd820
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xda28
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xdc20
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xe418
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xe428
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xf020
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xf228
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xfa18
|
|
LD B, 0x2
|
|
CALL j_draw_rh
|
|
LD HL, 0xfa30
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xce48
|
|
LD B, 0x4
|
|
CALL j_draw_rh
|
|
LD HL, 0xce68
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xd070
|
|
LD B, 0x3
|
|
CALL j_draw_rh
|
|
LD HL, 0xde48
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xdc50
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xe050
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xdc60
|
|
LD B, 0x3
|
|
CALL j_draw_rh
|
|
LD HL, 0xe848
|
|
LD B, 0x3
|
|
CALL j_draw_rh
|
|
LD HL, 0xe870
|
|
LD B, 0x3
|
|
CALL j_draw_rh
|
|
JP init_levels
|
|
|
|
; --------------------------------------------------
|
|
; Draw vertical rectangles 8x8
|
|
; Inp: HL - pos
|
|
; B - count
|
|
; --------------------------------------------------
|
|
j_draw_rv:
|
|
CALL j_draw_sqare
|
|
LD A, L
|
|
ADD A, 8 ; next, 8 lines down
|
|
LD L, A
|
|
DEC B
|
|
JP NZ, j_draw_rv
|
|
RET
|
|
|
|
; --------------------------------------------------
|
|
; Draw horisontal rectangles 8x8
|
|
; Inp: HL - pos
|
|
; B - count
|
|
; --------------------------------------------------
|
|
j_draw_rh:
|
|
CALL j_draw_sqare
|
|
INC H ; next, 8 column right
|
|
INC H
|
|
DEC B
|
|
JP NZ, j_draw_rh
|
|
RET
|
|
|
|
; --------------------------------------------------
|
|
; Draw single rectangle 8x8
|
|
; Inp: HL - pos
|
|
; --------------------------------------------------
|
|
j_draw_sqare:
|
|
LD (square_addr), HL
|
|
PUSH AF
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH HL
|
|
LD HL, (square_addr)
|
|
LD BC, img_square_c0 ;= 0xFF
|
|
LD DE, img_square_c1
|
|
|
|
LD A, 8
|
|
.dsq_next_row:
|
|
PUSH AF
|
|
|
|
LD A, 1
|
|
.dsq_next_col:
|
|
PUSH AF
|
|
LD A, (BC) ;= 0xFF
|
|
LD (HL), A
|
|
LD A, (DE)
|
|
INC H
|
|
LD (HL), A
|
|
INC H
|
|
INC BC
|
|
INC DE
|
|
POP AF
|
|
DEC A
|
|
JP NZ, .dsq_next_col
|
|
LD A, H
|
|
SUB 1
|
|
SUB 1
|
|
LD H, A
|
|
INC L
|
|
POP AF
|
|
DEC A
|
|
JP NZ, .dsq_next_row
|
|
POP HL
|
|
POP DE
|
|
POP BC
|
|
POP AF
|
|
RET
|
|
|
|
db 0x60
|
|
db 0x00
|
|
|
|
j_set_vmode:
|
|
db ASCII_ESC, '64$' ; Set mode 40x25
|
|
|
|
j_msg_verion:
|
|
db ASCII_ESC, '43', 9 ; Set color
|
|
db ASCII_ESC, '71' ; Set charset RUS
|
|
db "WERSIQ 1.0"
|
|
db " "
|
|
db ASCII_CR, ASCII_LF, ' '
|
|
|
|
j_spaces_35:
|
|
ds 35, ' '
|
|
db '$'
|
|
|
|
j_msg_instr1:
|
|
db ASCII_CR, ASCII_LF, ASCII_CR
|
|
db 'wystrel-klawi{a "probel",cwet - "c"$'
|
|
|
|
j_msg_anykey:
|
|
db ASCII_CR, ASCII_LF, ASCII_LF, ASCII_LF, ASCII_LF
|
|
db 'nAVMITE L@BU@ KLAWI[U $'
|
|
db ' $'
|
|
|
|
img_square_c0:
|
|
ds 8, 0xff
|
|
|
|
img_square_c1:
|
|
ds 8, 0
|
|
|
|
ds 33, 0
|
|
db 0x90
|
|
db 0xc0
|
|
|
|
square_addr:
|
|
dw 0xEC70
|
|
|
|
; --------------------------------------------------
|
|
; Move and draw monster
|
|
; --------------------------------------------------
|
|
handle_monster:
|
|
; draw at every 4th call
|
|
LD A, (monster_int) ; default = 4
|
|
DEC A
|
|
LD (monster_int), A
|
|
OR A
|
|
RET NZ
|
|
;
|
|
LD A, 4
|
|
LD (monster_int), A ; interval=4
|
|
;
|
|
LD A, (j_monster_off)
|
|
OR A
|
|
JP Z, draw_monster
|
|
LD HL, (monstr_pos) ;= 0x27AC
|
|
LD C, 16
|
|
LAB_ram_180f:
|
|
LD A, H
|
|
ADD HL, HL
|
|
AND 0x60
|
|
JP PE, LAB_ram_1817
|
|
INC HL
|
|
LAB_ram_1817:
|
|
DEC C
|
|
JP NZ, LAB_ram_180f
|
|
LD (monstr_pos), HL ;= 0x27AC
|
|
LD A, (monstr_per) ;= 0x15
|
|
CP H
|
|
JP NC, monstr_reset
|
|
RET
|
|
|
|
monstr_reset:
|
|
LD HL, 0xfe08
|
|
LD (monstr_addr), HL ;= 0xE268
|
|
.next:
|
|
LD HL, (monstr_addr) ;= 0xE268
|
|
LD A, 0x20
|
|
ADD A, L
|
|
LD L, A
|
|
LD (monstr_addr), HL ;= 0xE268
|
|
LD A, (monstr_var1) ;= 0xCC
|
|
ADD A, 0x33
|
|
LD (monstr_var1), A ;= 0xCC
|
|
LD B, A
|
|
LD HL, (monstr_pos) ;= 0x27AC
|
|
LD A, L
|
|
CP B
|
|
JP NC, .next
|
|
XOR A
|
|
LD (j_monster_off), A
|
|
|
|
; --------------------------------------------------
|
|
draw_monster:
|
|
PUSH AF
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH HL
|
|
LD DE, monstr_img_c0
|
|
LD HL, monstr_img_c1
|
|
LD A, (monstr_rt) ;= 0x1
|
|
OR A
|
|
JP Z, monstr_0
|
|
LD BC, 0x60
|
|
monstr_no_nxt:
|
|
ADD HL, BC
|
|
EX DE, HL
|
|
ADD HL, BC
|
|
EX DE, HL
|
|
DEC A
|
|
JP NZ, monstr_no_nxt
|
|
monstr_0:
|
|
LD (monstr_src0), HL ;= 0x18FB
|
|
PUSH HL
|
|
POP BC
|
|
EX DE, HL
|
|
LD (monstr_src1), HL ;= 0x19BB
|
|
EX DE, HL
|
|
LD HL, (monstr_addr) ;= 0xE268
|
|
LD A, 16
|
|
dm_next_col:
|
|
PUSH AF
|
|
LD A, 6
|
|
dm_next_row:
|
|
PUSH AF
|
|
LD A, H
|
|
CP 0xc0
|
|
JP C, dm_at_left
|
|
LD A, (BC) ;= 0xe0
|
|
LD (HL), A
|
|
LD A, (DE)
|
|
INC H
|
|
LD (HL), A
|
|
LD A, H
|
|
CP 0xff
|
|
JP Z, dm_at_right
|
|
dm_ret_left:
|
|
INC H
|
|
INC BC
|
|
INC DE
|
|
POP AF
|
|
DEC A
|
|
JP NZ, dm_next_row
|
|
LD A, H
|
|
SUB 6
|
|
SUB 6
|
|
LD H, A
|
|
dm_ret_right:
|
|
INC L
|
|
POP AF
|
|
DEC A
|
|
JP NZ, dm_next_col
|
|
JP LAB_ram_18b4
|
|
dm_at_right:
|
|
POP AF
|
|
LAB_ram_18a3:
|
|
INC BC
|
|
INC DE
|
|
DEC A
|
|
JP NZ, LAB_ram_18a3
|
|
LD A, (monstr_addr+1)
|
|
LD H, A
|
|
JP dm_ret_right
|
|
dm_at_left:
|
|
INC H
|
|
JP dm_ret_left
|
|
LAB_ram_18b4:
|
|
POP HL
|
|
POP DE
|
|
POP BC
|
|
POP AF
|
|
LD A, (monstr_rt) ;= 0x1
|
|
OR A
|
|
JP Z, LAB_ram_18d2
|
|
XOR A
|
|
LAB_ram_18c0:
|
|
LD (monstr_rt), A ;= 0x1
|
|
LD HL, (monstr_addr) ;= 0xE268
|
|
LD A, H
|
|
CP 0xb4
|
|
JP Z, SUB_ram_18d7
|
|
DEC H
|
|
DEC H
|
|
LD (monstr_addr), HL ;= 0xE268
|
|
RET
|
|
LAB_ram_18d2:
|
|
LD A, 0x1
|
|
JP LAB_ram_18c0
|
|
SUB_ram_18d7:
|
|
XOR A
|
|
LD (monstr_var1), A ;= 0xCC
|
|
LD A, 0x1
|
|
LD (j_monster_off), A
|
|
RET
|
|
|
|
; --------------------------------------------------
|
|
; Monster hit player?
|
|
; --------------------------------------------------
|
|
player_monstr_hit:
|
|
LD HL, (j_player_addr)
|
|
INC H
|
|
INC H
|
|
LD B, H
|
|
LD D, L
|
|
LD HL, (monstr_addr)
|
|
LD A, H
|
|
CP B
|
|
JP Z, .chl_lo_addr
|
|
RET
|
|
.chl_lo_addr:
|
|
LD A, L
|
|
CP D
|
|
JP Z, is_lost_life
|
|
RET
|
|
|
|
monstr_per:
|
|
db 21
|
|
|
|
monster_int:
|
|
db 4
|
|
|
|
monstr_var1:
|
|
db 204
|
|
|
|
monstr_rt:
|
|
db 1
|
|
|
|
monstr_img_c1:
|
|
; col: 0
|
|
db 0x00, 0xFC, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xfe
|
|
db 0xFF, 0x03, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x07
|
|
; col: 1
|
|
db 0x00, 0x00, 0xf0, 0xFF, 0xFF, 0x0f, 0x00, 0x00
|
|
db 0xf0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xc8, 0xFF
|
|
; col: 2
|
|
db 0xFF, 0xFF, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF
|
|
db 0x01, 0x00, 0xEE, 0xFF, 0xFF, 0xFF, 0x03, 0x00
|
|
; col: 3
|
|
db 0xf6, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x7B, 0xfe
|
|
db 0xFF, 0xFF, 0x0f, 0x00, 0x3D, 0x38, 0x00, 0xFF
|
|
; col: 4
|
|
db 0x0f, 0x00, 0x1E, 0x38, 0x00, 0xF8, 0x0f, 0x00
|
|
db 0x00, 0x38, 0x00, 0xF8, 0x1D, 0x00, 0x00, 0x38
|
|
; col: 5
|
|
db 0x00, 0xF8, 0x18, 0x00, 0x00, 0x38, 0x00, 0x3C
|
|
db 0xF8, 0x00, 0x00, 0x1E, 0x00, 0x3F, 0x00, 0x00
|
|
|
|
; col: 6
|
|
db 0xe0, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xfe, 0xFF
|
|
db 0xFF, 0x30, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0x0F
|
|
; col: 7
|
|
db 0x00, 0x00, 0xc0, 0xFF, 0xFF, 0x3F, 0x00, 0x00
|
|
db 0xe0, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xf0, 0xFF
|
|
; col: 8
|
|
db 0xFF, 0xFF, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF
|
|
db 0x01, 0x00, 0x7E, 0xfe, 0xFF, 0xFF, 0x1F, 0x00
|
|
; col: 9
|
|
db 0x00, 0xfe, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xfe
|
|
db 0x01, 0xFF, 0x37, 0x00, 0x00, 0xEF, 0x01, 0xFF
|
|
; col: 10
|
|
db 0x67, 0x00, 0x80, 0xC7, 0x01, 0xFC, 0x0f, 0x00
|
|
db 0x80, 0xc3, 0x01, 0x38, 0x1F, 0x00, 0xc0, 0x81
|
|
; col: 11
|
|
db 0x03, 0x38, 0x1C, 0x00, 0xe0, 0x81, 0x03, 0x1E
|
|
db 0x1C, 0x00, 0xf0, 0x80, 0x03, 0x0f, 0x1E, 0x00
|
|
|
|
monstr_img_c0:
|
|
ds 96, 0
|
|
ds 96, 0
|
|
|
|
monstr_pos:
|
|
dw 0x27AC
|
|
|
|
monstr_addr:
|
|
dw 0xE268
|
|
monstr_src0:
|
|
dw 0x18FB
|
|
monstr_src1:
|
|
dw 0x19BB
|
|
|
|
; --------------------------------------------------
|
|
; Handle "Fire" key
|
|
; --------------------------------------------------
|
|
handle_fire_key:
|
|
LD HL, (j_player_addr) ;= 0xC0C8
|
|
LD A, H
|
|
CP 0xfe
|
|
JP NC, draw_game_scene
|
|
LD A, (is_fire)
|
|
OR A
|
|
JP NZ, draw_game_scene
|
|
LD A, 1
|
|
LD (is_fire), A
|
|
PUSH AF
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH HL
|
|
|
|
; player fire animation
|
|
LD HL, (j_player_addr) ;= 0xC0C8
|
|
LD BC, j_player_firer_c0
|
|
LD DE, j_player_firer_c1
|
|
|
|
LD A, 16 ; 16 rows
|
|
.hf_next_col:
|
|
PUSH AF
|
|
LD A, 2 ; 2col=16px
|
|
.hl_next_row:
|
|
PUSH AF
|
|
LD A, (BC)
|
|
LD (HL), A
|
|
LD A, (DE)
|
|
INC H
|
|
LD (HL), A
|
|
INC H
|
|
INC BC
|
|
INC DE
|
|
POP AF
|
|
DEC A
|
|
JP NZ, .hl_next_row
|
|
LD A, H
|
|
SUB 0x2
|
|
SUB 0x2
|
|
LD H, A
|
|
INC L
|
|
POP AF
|
|
DEC A
|
|
JP NZ, .hf_next_col
|
|
|
|
POP HL
|
|
POP DE
|
|
POP BC
|
|
POP AF
|
|
PUSH HL
|
|
PUSH DE
|
|
PUSH BC
|
|
PUSH AF
|
|
LD A, 0x00
|
|
OUT (SYS_DD17PB), A ; vram off, rom on
|
|
|
|
; --------------------------------------------------
|
|
; Sound for fire (10 pulses)
|
|
; --------------------------------------------------
|
|
LD HL, 0xc100 ; 49408
|
|
LD DE, 10
|
|
.fire_snd_nxt:
|
|
LD A, 0xf
|
|
OUT (DD67PC), A ; "1" bell + tape
|
|
CALL delay_hl
|
|
XOR A
|
|
OUT (DD67PC), A ; "0" bell + tape
|
|
CALL delay_hl
|
|
DEC DE
|
|
LD A, E
|
|
OR D
|
|
JP NZ, .fire_snd_nxt
|
|
|
|
LD A, 0x10
|
|
OUT (SYS_DD17PB), A ; vram @ 0xc000
|
|
POP AF
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
JP fire_continue
|
|
|
|
; --------------------------------------------------
|
|
; Small delay
|
|
; Inp: HL->delay
|
|
; Out: HL = HL+1
|
|
; --------------------------------------------------
|
|
delay_hl:
|
|
LD A, (HL)
|
|
.next_hl:
|
|
DEC A
|
|
JP NZ, .next_hl
|
|
INC HL
|
|
RET
|
|
|
|
; --------------------------------------------------
|
|
fire_continue:
|
|
NOP
|
|
LD A, 6
|
|
LD (j_fire_ctr), A
|
|
XOR A
|
|
LD (j_var8_7c), A
|
|
LD (j_fire_frame), A
|
|
JP draw_game_scene
|
|
|
|
handle_fire:
|
|
; firectr--
|
|
LD A, (j_fire_ctr) ;= 0x6
|
|
DEC A
|
|
LD (j_fire_ctr), A ;= 0x6
|
|
OR A
|
|
JP Z, j_fire_complete
|
|
|
|
LD A, (j_var8_7c)
|
|
OR A
|
|
JP Z, LAB_ram_1b71
|
|
|
|
draw_fire:
|
|
LD A, (j_fire_frame)
|
|
OR A
|
|
JP Z, draw_fire2
|
|
; draw fire
|
|
PUSH AF
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH HL
|
|
LD HL, (j_fire_pos) ;= 0x4F
|
|
LD BC, j_fire_c0
|
|
LD DE, j_fire_c1
|
|
LD A, 1
|
|
.next_col:
|
|
PUSH AF
|
|
LD A, 2
|
|
.next_row:
|
|
PUSH AF
|
|
LD A, (BC) ;= 0xFF
|
|
LD (HL), A ;= db
|
|
LD A, (DE) ;= 0xFF
|
|
INC H
|
|
LD (HL), A
|
|
INC H
|
|
INC BC
|
|
INC DE
|
|
POP AF
|
|
DEC A
|
|
JP NZ, .next_row
|
|
LD A, H
|
|
SUB 0x2
|
|
SUB 0x2
|
|
LD H, A
|
|
INC L
|
|
POP AF
|
|
DEC A
|
|
JP NZ, .next_col
|
|
POP HL
|
|
POP DE
|
|
POP BC
|
|
POP AF
|
|
XOR A
|
|
LD (j_fire_frame), A
|
|
CALL SUB_ram_1bbf
|
|
LD HL, (j_fire_pos) ;= 0x4F
|
|
LD A, 0x4
|
|
CP 0xfc
|
|
JP Z, j_fire_complete
|
|
INC H
|
|
INC H
|
|
LD (j_fire_pos), HL ;= 0x4F
|
|
CALL player_on_floor
|
|
draw_fire_end:
|
|
CALL SUB_ram_1bbf
|
|
RET
|
|
|
|
LAB_ram_1b71:
|
|
LD HL, (j_player_addr) ;= 0xC0C8
|
|
LD A, H
|
|
ADD A, 0x4
|
|
LD H, A
|
|
LD A, L
|
|
ADD A, 0x7
|
|
LD L, A
|
|
LD (j_fire_pos), HL ;= 0x4F
|
|
LD A, 0x1
|
|
LD (j_var8_7c), A
|
|
JP draw_fire
|
|
draw_fire2:
|
|
PUSH AF
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH HL
|
|
LD HL, (j_fire_pos) ;= 0x4F
|
|
LD BC, j_fire2_c0 ;= 0xFF
|
|
LD DE, j_fire2_c1 ;= 0xFF
|
|
LD A, 1
|
|
.next_col2:
|
|
PUSH AF
|
|
LD A, 2
|
|
.next_row2:
|
|
PUSH AF
|
|
LD A, (BC) ;= 0xFF
|
|
LD (HL), A
|
|
LD A, (DE) ;= 0xFF
|
|
INC H
|
|
LD (HL), A
|
|
INC H
|
|
INC BC
|
|
INC DE
|
|
POP AF
|
|
DEC A
|
|
JP NZ, .next_row2
|
|
LD A, H
|
|
SUB 0x2
|
|
SUB 0x2
|
|
LD H, A
|
|
INC L
|
|
POP AF
|
|
DEC A
|
|
JP NZ, .next_col2
|
|
POP HL
|
|
POP DE
|
|
POP BC
|
|
POP AF
|
|
; draw fire2
|
|
LD A, 1
|
|
LD (j_fire_frame), A
|
|
JP draw_fire_end
|
|
SUB_ram_1bbf:
|
|
LD HL, (j_fire_pos) ; = 0x4F
|
|
EX DE, HL
|
|
LD HL, (monstr_addr) ;= 0xE268
|
|
LD A, H
|
|
CP D
|
|
JP Z, LAB_ram_1bcc
|
|
RET
|
|
LAB_ram_1bcc:
|
|
LD A, L
|
|
ADD A, 0x7
|
|
CP E
|
|
JP Z, LAB_ram_1c11
|
|
RET
|
|
j_fire_complete:
|
|
PUSH AF
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH HL
|
|
LD HL, (j_fire_pos) ; = 0x4F
|
|
LD BC, j_player_era_c0
|
|
LD DE, j_player_era_c1
|
|
LD A, 0x1
|
|
LAB_ram_1be3:
|
|
PUSH AF
|
|
LD A, 0x2
|
|
LAB_ram_1be6:
|
|
PUSH AF
|
|
LD A, (BC)
|
|
LD (HL), A
|
|
LD A, (DE)
|
|
INC H
|
|
LD (HL), A
|
|
INC H
|
|
INC BC
|
|
INC DE
|
|
POP AF
|
|
DEC A
|
|
JP NZ, LAB_ram_1be6
|
|
LD A, H
|
|
SUB 0x2
|
|
SUB 0x2
|
|
LD H, A
|
|
INC L
|
|
POP AF
|
|
DEC A
|
|
JP NZ, LAB_ram_1be3
|
|
POP HL
|
|
POP DE
|
|
POP BC
|
|
POP AF
|
|
XOR A
|
|
LD (is_fire), A
|
|
LD (j_var8_7c), A
|
|
LD A, 0x6
|
|
LD (j_fire_ctr), A ; = 0x6
|
|
RET
|
|
LAB_ram_1c11:
|
|
PUSH BC
|
|
LD BC, 300
|
|
LAB_ram_1c15:
|
|
LD A, 0xf
|
|
OUT (DD67PC), A ; bell + tape
|
|
PUSH HL
|
|
PUSH DE
|
|
PUSH BC
|
|
PUSH AF
|
|
LD DE, 0x5
|
|
j_mini_dly_snd:
|
|
DEC DE
|
|
LD A, D
|
|
OR E
|
|
JP NZ, j_mini_dly_snd
|
|
POP AF
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
LD A, 0x00
|
|
OUT (DD67PC), A ; bell + tape
|
|
PUSH HL
|
|
PUSH DE
|
|
PUSH BC
|
|
PUSH AF
|
|
LD DE, 0x5
|
|
LAB_ram_1c35:
|
|
DEC DE
|
|
LD A, D
|
|
OR E
|
|
JP NZ, LAB_ram_1c35
|
|
POP AF
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
DEC BC
|
|
LD A, C
|
|
OR B
|
|
JP NZ, LAB_ram_1c15
|
|
POP BC
|
|
PUSH AF
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH HL
|
|
LD HL, (monstr_addr) ; = 0xE268
|
|
LD BC, BYTE_ARRAY_ram_1dc6
|
|
LD DE, BYTE_ARRAY_ram_1e26
|
|
LD A, 0x10
|
|
LAB_ram_1c55:
|
|
PUSH AF
|
|
LD A, 0x6
|
|
LAB_ram_1c58:
|
|
PUSH AF
|
|
LD A, (BC)
|
|
LD (HL), A
|
|
LD A, (DE)
|
|
INC H
|
|
LD (HL), A
|
|
INC H
|
|
INC BC
|
|
INC DE
|
|
POP AF
|
|
DEC A
|
|
JP NZ, LAB_ram_1c58
|
|
LD A, H
|
|
SUB 0x6
|
|
SUB 0x6
|
|
LD H, A
|
|
INC L
|
|
POP AF
|
|
DEC A
|
|
JP NZ, LAB_ram_1c55
|
|
POP HL
|
|
POP DE
|
|
POP BC
|
|
POP AF
|
|
CALL j_fire_complete
|
|
CALL draw_levl_lines
|
|
CALL draw_levl_lines
|
|
CALL player_on_floor
|
|
PUSH BC
|
|
LD BC, 0x96
|
|
LAB_ram_1c86:
|
|
LD A, 0xf
|
|
OUT (DD67PC), A
|
|
PUSH HL
|
|
PUSH DE
|
|
PUSH BC
|
|
PUSH AF
|
|
LD DE, 0xa
|
|
LAB_ram_1c91:
|
|
DEC DE
|
|
LD A, D
|
|
OR E
|
|
JP NZ, LAB_ram_1c91
|
|
POP AF
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
LD A, 0x00
|
|
OUT (DD67PC), A
|
|
PUSH HL
|
|
PUSH DE
|
|
PUSH BC
|
|
PUSH AF
|
|
LD DE, 0xa
|
|
LAB_ram_1ca6:
|
|
DEC DE
|
|
LD A, D
|
|
OR E
|
|
JP NZ, LAB_ram_1ca6
|
|
POP AF
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
DEC BC
|
|
LD A, C
|
|
OR B
|
|
JP NZ, LAB_ram_1c86
|
|
POP BC
|
|
PUSH AF
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH HL
|
|
LD HL, (monstr_addr) ; = 0xE268
|
|
LD BC, BYTE_ARRAY_ram_1e86
|
|
LD DE, BYTE_ARRAY_ram_1ed6
|
|
LD A, 0x10
|
|
LAB_ram_1cc6:
|
|
PUSH AF
|
|
LD A, 0x5
|
|
LAB_ram_1cc9:
|
|
PUSH AF
|
|
LD A, (BC)
|
|
LD (HL), A
|
|
LD A, (DE)
|
|
INC H
|
|
LD (HL), A
|
|
INC H
|
|
INC BC
|
|
INC DE
|
|
POP AF
|
|
DEC A
|
|
JP NZ, LAB_ram_1cc9
|
|
LD A, H
|
|
SUB 0x5
|
|
SUB 0x5
|
|
LD H, A
|
|
INC L
|
|
POP AF
|
|
DEC A
|
|
JP NZ, LAB_ram_1cc6
|
|
POP HL
|
|
POP DE
|
|
POP BC
|
|
POP AF
|
|
CALL draw_levl_lines
|
|
CALL draw_levl_lines
|
|
CALL player_on_floor
|
|
CALL SUB_ram_1d02
|
|
CALL SUB_ram_1d02
|
|
CALL SUB_ram_1d02
|
|
CALL SUB_ram_1d02
|
|
CALL SUB_ram_1d3d
|
|
JP SUB_ram_18d7
|
|
SUB_ram_1d02:
|
|
PUSH AF
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH HL
|
|
LD HL, (monstr_addr) ; = 0xE268
|
|
LD BC, j_player_era_c0
|
|
LD DE, j_player_era_c1
|
|
LD A, 0x10
|
|
LAB_ram_1d11:
|
|
PUSH AF
|
|
LD A, 0x2
|
|
LAB_ram_1d14:
|
|
PUSH AF
|
|
LD A, (BC)
|
|
LD (HL), A
|
|
LD A, (DE)
|
|
INC H
|
|
LD (HL), A
|
|
INC H
|
|
INC BC
|
|
INC DE
|
|
POP AF
|
|
DEC A
|
|
JP NZ, LAB_ram_1d14
|
|
LD A, H
|
|
SUB 0x2
|
|
SUB 0x2
|
|
LD H, A
|
|
INC L
|
|
POP AF
|
|
DEC A
|
|
JP NZ, LAB_ram_1d11
|
|
POP HL
|
|
POP DE
|
|
POP BC
|
|
POP AF
|
|
LD HL, (monstr_addr) ; = 0xE268
|
|
LD A, H
|
|
ADD A, 0x4
|
|
LD H, A
|
|
LD (monstr_addr), HL ; = 0xE268
|
|
RET
|
|
SUB_ram_1d3d:
|
|
LD HL, (j_last_live_addr) ; = 0xD2DC
|
|
LD A, H
|
|
CP 0xfe
|
|
RET Z
|
|
INC H
|
|
INC H
|
|
LD (j_last_live_addr), HL ; = 0xD2DC
|
|
PUSH AF
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH HL
|
|
LD HL, (j_last_live_addr) ; = 0xD2DC
|
|
LD BC, BYTE_ARRAY_ram_1f26
|
|
LD DE, BYTE_ARRAY_ram_1f36
|
|
LD A, 0x10
|
|
LAB_ram_1d58:
|
|
PUSH AF
|
|
LD A, 0x1
|
|
LAB_ram_1d5b:
|
|
PUSH AF
|
|
LD A, (BC)
|
|
LD (HL), A
|
|
LD A, (DE)
|
|
INC H
|
|
LD (HL), A ; = 0xFF
|
|
INC H
|
|
INC BC
|
|
INC DE
|
|
POP AF
|
|
DEC A
|
|
JP NZ, LAB_ram_1d5b
|
|
LD A, H
|
|
SUB 0x1
|
|
SUB 0x1
|
|
LD H, A
|
|
INC L
|
|
POP AF
|
|
DEC A
|
|
JP NZ, LAB_ram_1d58
|
|
POP HL
|
|
POP DE
|
|
POP BC
|
|
POP AF
|
|
RET
|
|
|
|
is_fire:
|
|
db 0
|
|
j_fire_ctr:
|
|
db 0x6
|
|
j_var8_7c:
|
|
db 0x00
|
|
j_fire_frame:
|
|
db 0
|
|
|
|
; Fire sign 1x16 pix
|
|
j_fire2_c0:
|
|
; color plane 0
|
|
db 0xFF, 0x00
|
|
j_fire2_c1:
|
|
; color plane 1
|
|
db 0xFF, 0x00
|
|
|
|
; Fire sign 1x16 pix
|
|
j_fire_c0:
|
|
; color plane 0
|
|
db 0x00, 0xFF
|
|
j_fire_c1:
|
|
; color plane 1
|
|
db 0x00, 0xFF
|
|
|
|
; Player fire r 16x16pix
|
|
; color plane 0
|
|
j_player_firer_c0:
|
|
; Col: 0
|
|
db 0xc0, 0x01, 0xe0, 0x03, 0xD0, 0x06, 0x90, 0x0C
|
|
db 0xa0, 0x03, 0xc0, 0x03, 0x80, 0x01, 0x80, 0x0f
|
|
; Col: 1
|
|
db 0x80, 0x07, 0x80, 0x03, 0x00, 0x01, 0x00, 0x01
|
|
db 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x03
|
|
; color plane 1
|
|
j_player_firer_c1:
|
|
; Col: 0
|
|
db 0xc0, 0x01, 0xe0, 0x03, 0xD0, 0x06, 0x90, 0x0C
|
|
db 0xa0, 0x03, 0xc0, 0x03, 0x80, 0x01, 0x80, 0x0f
|
|
; Col: 1
|
|
db 0x80, 0x07, 0x80, 0x03, 0x00, 0x01, 0x00, 0x01
|
|
db 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x03
|
|
|
|
BYTE_ARRAY_ram_1dc6:
|
|
ds 32, 0
|
|
ds 32, 0
|
|
ds 32, 0
|
|
BYTE_ARRAY_ram_1e26:
|
|
; DS 32
|
|
db 0x00, 0x6C, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x6D
|
|
db 0x0C, 0x00, 0x00, 0x00, 0x60, 0x01, 0x6C, 0x1B
|
|
db 0x00, 0x00, 0x6C, 0xB0, 0x61, 0x1B, 0x00, 0x00
|
|
db 0x00, 0x86, 0x0d, 0x00, 0x00, 0x00, 0xda, 0x26
|
|
; DS 32
|
|
db 0x6C, 0x6B, 0x00, 0x00, 0x1A, 0xa0, 0x01, 0x6B
|
|
db 0x03, 0x00, 0xc0, 0x2C, 0x6C, 0x00, 0x03, 0x00
|
|
db 0xD9, 0x80, 0x81, 0x5B, 0x03, 0x00, 0x00, 0x3A
|
|
db 0x0C, 0x58, 0x00, 0x00, 0x00, 0x02, 0x00, 0x40
|
|
; DS 32
|
|
db 0x0b, 0x00, 0x00, 0x0C, 0x00, 0x3C, 0x08, 0x00
|
|
db 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0C
|
|
db 0x00, 0x0e, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00
|
|
db 0x00, 0x00, 0x00, 0x0e, 0x00, 0xf0, 0x00, 0x00
|
|
|
|
BYTE_ARRAY_ram_1e86:
|
|
; DS 32
|
|
db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06
|
|
db 0x00, 0x00, 0x00, 0x43, 0xc0, 0x00, 0x00, 0x00
|
|
db 0x10, 0xc1, 0x16, 0x00, 0x30, 0x10, 0x0d, 0x10
|
|
db 0x00, 0x30, 0x43, 0x6C, 0x00, 0x00, 0x00, 0x10
|
|
; DS 32
|
|
db 0x60, 0x06, 0x00, 0x00, 0x11, 0x08, 0x36, 0x00
|
|
db 0x00, 0xc1, 0x0C, 0x20, 0x00, 0x00, 0x00, 0x00
|
|
db 0x00, 0x00, 0x00, 0x20, 0x06, 0x04, 0x00, 0x00
|
|
db 0x0C, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00
|
|
|
|
ds 16, 0
|
|
|
|
BYTE_ARRAY_ram_1ed6:
|
|
ds 16, 0
|
|
ds 32, 0
|
|
ds 32, 0
|
|
|
|
BYTE_ARRAY_ram_1f26:
|
|
;db[16]
|
|
db 0x18, 0x3C, 0x42, 0x66, 0x5A, 0x3C, 0x18, 0x3C
|
|
db 0x5A, 0xA5, 0x24, 0x24, 0x42, 0x42, 0x42, 0xc3
|
|
BYTE_ARRAY_ram_1f36:
|
|
;db[16]
|
|
db 0x18, 0x3C, 0x42, 0x66, 0x5A, 0x3C, 0x18, 0x3C
|
|
db 0x5A, 0xA5, 0x24, 0x24, 0x42, 0x42, 0x42, 0xc3
|
|
|
|
j_fire_pos:
|
|
dw 0xE44F
|
|
|
|
; --------------------------------------------------
|
|
; Draw Big Jumping Jack and play sound
|
|
; --------------------------------------------------
|
|
draw_happy_end:
|
|
CALL clear_screen
|
|
LD HL, 0xde70
|
|
LD B, 0x2
|
|
CALL j_draw_rh
|
|
LD HL, 0xdc78
|
|
LD B, 0x4
|
|
CALL j_draw_rh
|
|
LD HL, 0xda80
|
|
LD B, 0x6
|
|
CALL j_draw_rh
|
|
LD HL, 0xde88
|
|
LD B, 0x2
|
|
CALL j_draw_rh
|
|
LD HL, 0xda88
|
|
LD B, 0x2
|
|
CALL j_draw_rv
|
|
LD HL, 0xe488
|
|
LD B, 0x2
|
|
CALL j_draw_rv
|
|
LD HL, 0xdc98
|
|
LD B, 0x4
|
|
CALL j_draw_rh
|
|
LD HL, 0xdea0
|
|
LD B, 0x4
|
|
CALL j_draw_rv
|
|
LD HL, 0xe0a0
|
|
LD B, 0x4
|
|
CALL j_draw_rv
|
|
LD HL, 0xdca8
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xe2a8
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xdab0
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xe4b0
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xd8b8
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xe6b8
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xd6c0
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xe8c0
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xdcc0
|
|
LD B, 0x3
|
|
CALL j_draw_rv
|
|
LD HL, 0xe2c0
|
|
LD B, 0x3
|
|
CALL j_draw_rv
|
|
LD HL, 0xdad8
|
|
LD B, 0x3
|
|
CALL j_draw_rv
|
|
LD HL, 0xe4d8
|
|
LD B, 0x3
|
|
CALL j_draw_rv
|
|
LD HL, 0xd8e8
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xe6e8
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
PUSH BC
|
|
LD BC, 0x64
|
|
j_nxt_snd_per:
|
|
LD A, 0xf
|
|
OUT (DD67PC), A ; bell + tape
|
|
PUSH HL
|
|
PUSH DE
|
|
PUSH BC
|
|
PUSH AF
|
|
LD DE, 150
|
|
j_mini_dly_snd2:
|
|
DEC DE
|
|
LD A, D
|
|
OR E
|
|
JP NZ, j_mini_dly_snd2
|
|
POP AF
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
LD A, 0x00
|
|
OUT (DD67PC), A ; bell + tape
|
|
PUSH HL
|
|
PUSH DE
|
|
PUSH BC
|
|
PUSH AF
|
|
LD DE, 150
|
|
j_mini_dly_snd3:
|
|
DEC DE
|
|
LD A, D
|
|
OR E
|
|
JP NZ, j_mini_dly_snd3
|
|
POP AF
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
DEC BC
|
|
LD A, C
|
|
OR B
|
|
JP NZ, j_nxt_snd_per
|
|
POP BC
|
|
CALL clear_screen
|
|
LD HL, 0xde38
|
|
LD B, 0x2
|
|
CALL j_draw_rh
|
|
LD HL, 0xdc40
|
|
LD B, 0x4
|
|
CALL j_draw_rh
|
|
LD HL, 0xda48
|
|
LD B, 0x6
|
|
CALL j_draw_rh
|
|
LD HL, 0xde50
|
|
LD B, 0x2
|
|
CALL j_draw_rh
|
|
LD HL, 0xda50
|
|
LD B, 0x2
|
|
CALL j_draw_rv
|
|
LD HL, 0xe450
|
|
LD B, 0x2
|
|
CALL j_draw_rv
|
|
LD HL, 0xdc60
|
|
LD B, 0x4
|
|
CALL j_draw_rh
|
|
LD HL, 0xd460
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xea60
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xd668
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xe868
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xd870
|
|
LD B, 0x3
|
|
CALL j_draw_rh
|
|
LD HL, 0xe270
|
|
LD B, 0x3
|
|
CALL j_draw_rh
|
|
LD HL, 0xde68
|
|
LD B, 0x4
|
|
CALL j_draw_rv
|
|
LD HL, 0xe068
|
|
LD B, 0x4
|
|
CALL j_draw_rv
|
|
LD HL, 0xd888
|
|
LD B, 0x3
|
|
CALL j_draw_rh
|
|
LD HL, 0xe288
|
|
LD B, 0x3
|
|
CALL j_draw_rh
|
|
LD HL, 0xd690
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xe890
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xd498
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xea98
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xd098
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xee98
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xd2a0
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xeca0
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
PUSH BC
|
|
LD BC, 150
|
|
j_nxt_snd_per1:
|
|
LD A, 0xf
|
|
OUT (DD67PC), A ; bell + tape
|
|
PUSH HL
|
|
PUSH DE
|
|
PUSH BC
|
|
PUSH AF
|
|
LD DE, 100
|
|
j_mini_dly_snd4:
|
|
DEC DE
|
|
LD A, D
|
|
OR E
|
|
JP NZ, j_mini_dly_snd4
|
|
POP AF
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
LD A, 0x00
|
|
OUT (DD67PC), A ; bell + tape
|
|
PUSH HL
|
|
PUSH DE
|
|
PUSH BC
|
|
PUSH AF
|
|
LD DE, 100
|
|
j_mini_dly_snd5:
|
|
DEC DE
|
|
LD A, D
|
|
OR E
|
|
JP NZ, j_mini_dly_snd5
|
|
POP AF
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
DEC BC
|
|
LD A, C
|
|
OR B
|
|
JP NZ, j_nxt_snd_per1
|
|
POP BC
|
|
LD A, (j_snd_21ee) ;= 0x3
|
|
DEC A
|
|
LD (j_snd_21ee), A ;= 0x3
|
|
OR A
|
|
JP NZ, draw_happy_end
|
|
LD A, 3
|
|
LD (j_snd_21ee), A ;= 0x3
|
|
RET
|
|
|
|
; --------------------------------------------------
|
|
; Out big grave cross
|
|
; and messages
|
|
; --------------------------------------------------
|
|
out_game_over:
|
|
CALL clear_screen
|
|
LD HL, 0xe038
|
|
LD B, 0x9
|
|
CALL j_draw_rv
|
|
LD HL, 0xdc48
|
|
LD B, 0x5
|
|
CALL j_draw_rh
|
|
LD HL, 0xe258
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xde60
|
|
LD B, 0x1
|
|
CALL j_draw_rh
|
|
LD HL, 0xde80
|
|
LD B, 0x3
|
|
CALL j_draw_rh
|
|
LD HL, 0xdc88
|
|
LD B, 0x5
|
|
CALL j_draw_rh
|
|
LD HL, 0xda90
|
|
LD B, 0x7
|
|
CALL j_draw_rh
|
|
LD A, 0x00
|
|
OUT (SYS_DD17PB), A
|
|
LD HL, (curr_color)
|
|
PUSH HL
|
|
LD A, 0x00
|
|
LD L, A
|
|
CPL
|
|
LD H, A
|
|
LD (curr_color), HL
|
|
LD HL, 0xaa8
|
|
LD (cursor_pos), HL
|
|
LD DE, j_msg_game_over1
|
|
LD C, C_WRITESTR
|
|
CALL BDOS_ENTER
|
|
POP HL
|
|
LD (curr_color), HL
|
|
LD HL, (curr_color)
|
|
PUSH HL
|
|
LD A, 0x00
|
|
LD L, A
|
|
CPL
|
|
LD H, A
|
|
LD (curr_color), HL
|
|
LD HL, 0x2b8
|
|
LD (cursor_pos), HL
|
|
LD DE, j_msg_game_over2 ;= 0x0d
|
|
LD C, C_WRITESTR
|
|
CALL BDOS_ENTER
|
|
POP HL
|
|
LD (curr_color), HL
|
|
LD HL, (curr_color)
|
|
PUSH HL
|
|
LD A, 0x00
|
|
LD L, A
|
|
CPL
|
|
LD H, A
|
|
LD (curr_color), HL
|
|
LD HL, 0x2c8
|
|
LD (cursor_pos), HL
|
|
LD DE, j_msg_game_over3 ;= 0x20
|
|
LD C, C_WRITESTR
|
|
CALL BDOS_ENTER
|
|
POP HL
|
|
LD (curr_color), HL
|
|
|
|
j_wait_for_key:
|
|
CALL mon_con_status
|
|
OR A
|
|
JP Z, j_wait_for_key
|
|
LD A, 0x10
|
|
OUT (SYS_DD17PB), A ; vram @ 0xc000
|
|
RET
|
|
|
|
j_snd_21ee:
|
|
db 3
|
|
|
|
j_msg_game_over1:
|
|
db 0x20, 0x0C, 0x09, 0xE4, 0xEF, 0xf0, 0xF2, 0xF9
|
|
db 0xE7, 0xe1, 0xEC, 0xF3, 0xF1, '$'
|
|
|
|
j_msg_game_over2:
|
|
db 0x0d, 0x0A, 0x20, 0xe5, 0xF3, 0xEC, 0xe9, 0xa0
|
|
db 0xE8, 0xEF, 0xF4, 0xe9, 0xF4, 0xe5, 0xa0, 0xe5
|
|
db 0xFD, 0xe5, 0x2C, 0xEE, 0xe1, 0xf6, 0xED, 0xe9
|
|
db 0xF4, 0xe5, 0xa0, 0xEC, 0xe0, 0xE2, 0xF5, 0xe0
|
|
db '$'
|
|
|
|
j_msg_game_over3:
|
|
db 0x20, 0xeb, 0xEC, 0xe1, 0xF7, 0xe9, 0xFB, 0xF5
|
|
db 0x0D, 0x0A, 0x22, 0xF3, 0xE2, 0xF2, 0xEF, 0xF3
|
|
db 0x22, 0x2D, 0xC4, 0xCC, 0xd1, 0xa0, 0xd7, 0xD9
|
|
db 0xc8, 0xcf, 0xC4, 0xc1, '$'
|
|
|
|
db 0x00, 0x00, 0x00, 0x00, 0x00
|
|
|
|
; --------------------------------------------------
|
|
;
|
|
; --------------------------------------------------
|
|
exit_to_cpm:
|
|
LD A, 0
|
|
OUT (SYS_DD17PB), A ; ROM on, Vram off
|
|
|
|
LD HL,(saved_color)
|
|
LD (curr_color), HL
|
|
|
|
LD DE, reset_vmode
|
|
LD C, C_WRITESTR
|
|
CALL BDOS_ENTER
|
|
|
|
JP WARM_BOOT ; return CP/M
|
|
|
|
saved_color:
|
|
dw 0
|
|
|
|
reset_vmode:
|
|
db ASCII_ESC, "70" ; Set LAT Charset
|
|
db ASCII_ESC, "60" ; Set mode 40x25 with cursor
|
|
db ASCII_US, ASCII_FF, "$" ; Clear screen, home cursor
|
|
|
|
j_fill_11:
|
|
ds 690, 0
|
|
j_end_of_file:
|
|
; garbage cleaned
|