OK240.2-Firmware/JumpingJack/jack.asm

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