; =================================================== ; 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