; da65 V2.15 - Git 104f898 ; Created: 2016-09-18 21:40:43 ; Input file: jumpmanjr.rom ; Page: 1 .setcpu "6502" ; ---------------------------------------------------------------------------- L0000 := $0000 dm_ypos := $0054 ; see draw_map and level_maps.txt dm_xpos := $0055 ; see draw_map and level_maps.txt SAVMSC := $0058 ; OS's idea of the start of screen memory [redundant to set here?] jiffy_timer_3_hi:= $00A2 ; gets incremented every time 3_lo wraps around to zero zp_temp2 := $00AE ; used for (zp,y) addressing, also 2 temps for scores_screen bomb_idx := $00B2 ; bomb that was just picked up (times 2, suitable for index into a table of words) blistptr := $00B4 ; bomb_pickup: points to current level's bomblist bombloc := $00B6 ; bomb_pickup: position of the bomb Jumpman just touched, on 8x8 coarse grid zp_temp3 := $00B7 zp_temp4 := $00B8 ; number of players, used by ask_num_players and option_key_handler. used as a temp elsewhere. zp_temp5 := $00B9 ; among other things, used for jumpman's dance on title screen zp_temp6 := $00BA ; used for audio freq counter in materialize_jumpman. also used when setting number of players and player speeds. sa_tmp_1 := $00BD ; used by calc_screen_addr dm_count := $00BE ; graphics object definition is this long dm_length := $00BF ; see draw_map and level_maps.txt dm_progctr := $00C0 ; see draw_map and level_maps.txt dm_objptr := $00C2 ; see draw_map and level_maps.txt dm_screen_addr := $00C4 ; points to byte to write gfx data to dm_x_with_offset:= $00C6 ; graphics object X offset, plus dm_xpos dm_y_with_offset:= $00C7 ; graphics object Y offset, plus dm_xpos sa_tmp_2 := $00C8 ; used by calc_screen_addr dm_delta_x := $00C9 ; see draw_map and level_maps.txt dm_delta_y := $00CA ; see draw_map and level_maps.txt zp_temp1 := $00CB ; used for (zp,y) addressing, also for checking console keys in vblank_imm_isr tmp_sprite := $00CD ; ZP pointer to player/missile data (e.g. jumpman's 10-byte animation frames) tmp_sprite_height:= $00CF ; length of data pointed to by tmp_sprite num_in := $00D0 ; print_number input. 3-byte number (LSB first as usual) to be printed num_out := $00D3 ; area of (screen) memory where print_number stores its output num_color := $00D5 ; print_number adds this to numeric screencode output. normally 0, set to $80 on the end-of-game screen. demo_map_ptr := $00E0 ; points to level_desc of each map in turn, during the 'show all levels' demo demo_name_offset:= $00E2 ; offset from level_names to the name of each level in turn, during the 'show all levels' demo VDSLST := $0200 VKEYBD := $0208 ; === page 2 OS equates VKEYBD_hi := $0209 SDMCTL := $022F GPRIOR := $026F PCOLR0 := $02C0 PCOLR1 := $02C1 PCOLR2 := $02C2 PCOLR3 := $02C3 COLOR0 := $02C4 COLOR1 := $02C5 COLOR2 := $02C6 COLOR3 := $02C7 COLOR4 := $02C8 CHBAS := $02F4 page6_vectors_minus_one:= $05FF ; 1-indexed page6_vectors := $0600 ; initialized with page6_initial_vectors jiffy_timer_3_lo:= $0619 ; gets incremented every frame jiffy_timer_1 := $061A ; gets incremented every frame jiffy_timer_2 := $061B ; gets incremented every frame odd_frame_flag := $061C ; a 1-bit frame counter (toggles every frame). possibly unused. speed_jiffy_timer:= $061E ; counts 0..initial_speed start_falling_flag:= $0621 ; reset to 0 every frame, set to 1 when starting to fall falling_flag := $0623 ; 0 = ok, 1 = falling, 2 = on ground. current_speed := $0624 ; can be modified, e.g. set to $08 when being electrocuted initial_speed := $0625 ; current user's chosen speed, set at game start bonus_jiffy_timer:= $0626 ; gets incremented every frame when playing a level, bonus-=100 when this wraps around to 0 playing_level := $0627 ; 0 = not playing, non-0 = playing rot_color := $062A ; see comment at rotating_colors snd_lock := $062F ; lets other code know cue_sfx is still running? not 100% sure player_delta_x := $0630 ; amount to move jumpman this frame (1 or $FF aka -1) player_delta_y := $0631 ; amount to move jumpman this frame (1 or $FF aka -1) joystick_disabled:= $0632 ; nonzero = jumpman can't move (title screen or materialization, etc) joystick_state := $0633 ; last PORTA read (bottom 4 bits), or 0 if joystick_disabled trigger_disabled:= $0634 ; nonzero = jumpman can't jump (he's already jumping, or title screen or materialization, etc) trigger_state := $0635 ; last TRIG0 read (0 = pressed) snd_ptr := $063C snd_slot_priority:= $063E ; priority of this sfx snd_slot_timer := $063F snd_slot_duration:= $0646 snd_slot_audc := $0647 snd_slot_curpos := $064E ; address we've got to so far, playing this sfx snd_priority_tmp:= $0661 ; ?? num_tmp := $0665 ; temp used by print_number player_enabled := $0668 ; 1 = draw this player, 0 = no. actually $0669 thru $066e player_height := $0677 ; actually $0677 thru $067b player_new_x := $067C ; HPOSxx, 1-indexed, $067d thru $0681 are p5, p3..p0 player_x_pos := $067E ; stored in HPOSP0 player_y_pos := $0683 ; $C6 is the bottom of the level (where you end up when you die) player_new_y := $0686 ; $0687 thru $069b player_x := $068B ; HPOSxx, $068c thru $06c0 player_y := $0695 ; vertical positions, actually $0696 thru $069a bullet_x_pos := $069B ; 4 bytes, meaning we can never have >4 bullets on screen at once (makes sense, GTIA only has 4 missiles) bullet_y_pos_minus_one:= $069E bullet_y_pos := $069F ; another 4 bytes dlist_shadow_lo := $06AC ; stored in DLISTL if dlist_shadow_hi nonzero dlist_shadow_hi := $06AD ; stored in DLISTH if nonzero dli_vec_shadow_lo:= $06AE ; stored in VDSLST if dli_vec_shadow_hi nonzero dli_vec_shadow_hi:= $06AF ; stored in VDSLST if nonzero sav_m0pf := $06B0 ; Missile 0 to playfield collision. sav_m1pf := $06B1 ; Missile 1 to playfield collision. sav_m2pf := $06B2 ; Missile 2 to playfield collision. sav_m3pf := $06B3 ; Missile 3 to playfield collision. sav_p0pf := $06B4 ; Player 0 to playfield collision. sav_p1pf := $06B5 ; Player 1 to playfield collision. sav_p2pf := $06B6 ; Player 2 to playfield collision. sav_p3pf := $06B7 ; Player 3 to playfield collision. sav_m0pl := $06B8 ; Missile 0 to player collision. sav_m1pl := $06B9 ; Missile 1 to player collision. sav_m2pl := $06BA ; Missile 2 to player collision. sav_m3pl := $06BB ; Missile 3 to player collision. sav_p0pl := $06BC ; Player 0 to player collision. sav_p1pl := $06BD ; Player 1 to player collision. sav_p2pl := $06BE ; Player 2 to player collision. sav_p3pl := $06BF ; Player 3 to player collision. option_key_vec := $06C0 ; vblank_imm_isr jumps thru here if option key pressed select_key_vec := $06C2 ; vblank_imm_isr jumps thru here if select key pressed start_key_vec := $06C4 ; vblank_imm_isr jumps thru here if start key pressed option_key_enabled:= $06C6 ; non-zero = jump through start_key_vec if start key pressed (checked by vblank_imm_isr) select_key_enabled:= $06C7 ; non-zero = jump through start_key_vec if start key pressed (checked by vblank_imm_isr) start_key_enabled:= $06C8 ; non-zero = jump through start_key_vec if start key pressed (checked by vblank_imm_isr) L06DF := $06DF L06E0 := $06E0 L06E3 := $06E3 L06E6 := $06E6 jump_frame := $06EB ; 0 if not jumping, or frames since start of jump (range 1 to 21) randomizer_mode := $06F3 ; only after beating levels 1-12 in order users_still_alive:= $06F4 ; I *think* that's what this is for. level := $06F6 speed_value := $06F9 ; decoded speed (1-8) current_user := $06FE ; this ranges 1-4, not 0-3 number_of_users := $06FF ; number of players selected at start of game. also this is score-1, if you see it being 1-indexed with X reg score := $0700 ; aka work_user, 11 bytes next_extra_life := $0703 ; initialized to $4c,$1d (aka 7500), 7500 is added whenever an extra life is given lives := $070A struct_user_1 := $070B ; 11 bytes struct_user_2 := $0716 ; 11 bytes struct_user_3 := $0721 ; 11 bytes struct_user_4 := $072C ; 11 bytes bullet_flags := $0756 ; 4 bytes, 0 = bullet slot not in use, non-0 = bullet active bullet_x_delta := $075A ; 4 bytes bullet_y_delta := $075E ; 4 bytes work_level_desc := $0780 ; first 2 bytes are level number in screencodes work_level_sub0 := $0782 ; a subroutine work_level_sub1 := $0784 ; a subroutine work_level_sub2 := $0786 ; a subroutine work_level_sub3 := $0788 ; a subroutine work_level_num_bombs:= $078A ; number of bombs to pick up on this level work_level_bullet_max:= $078B ; 0 = no bullets, range 0-4. work_level_y_start:= $078C ; jumpman starting Y position work_level_x_start:= $078D ; jumpman starting X position work_level_fudge_x:= $078E ; fudge factor for bomb locations, always $00 work_level_fudge_y:= $078F ; fudge factor for bomb locations, always $06 work_level_points_per_bomb:= $0790 ; points awarded per bomb pickup (always $64 aka 100) work_level_time_bonus:= $0791 ; amount of time bonus at start of level work_level_offs_19:= $0793 ; always $00 work_level_unkn_table0:= $0794 ; pointer to ROM table or $06xx work_level_map := $0796 ; used to draw the level initially (see also map_changes) work_level_map_bombs:= $0798 ; start of bombs in map data (which must come last!) work_level_bomblist:= $079A ; addr of list of bombs, indexed by player position on coarse 8x8 grid. 2 bytes each, 1st is coarse-grid position, 2nd is: hi 4 bits = change_map index, lo 4 = indirect sub (unused). terminated by $FF. work_level_map_changes:= $079C ; address of list of addresses of map data, used for changing the map when certain bombs are picked up work_level_indirect_subs:= $079E ; pointer to list of indirect subs, always $0000 in this game work_level_sub_bomb:= $07A0 ; called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine work_level_init := $07A2 ; called at start of level, $06E6 for some levels, or else a ROM subroutine work_level_sub6 := $07A4 ; always $9740 aka game_main_loop work_level_sub_eol:= $07A6 ; called at end of level (all bombs picked up). $06E6 for all but level08 work_level_offs_40:= $07A8 ; all zeroes work_level_colpf3:= $07AE ; color for missiles (aka 5th player) work_level_colpf0:= $07AF ; color for girders and up-ropes work_level_colpf1:= $07B0 ; color for ladders and down-ropes work_level_colpf2:= $07B1 ; color for bombs work_level_offs_50:= $07B2 ; unknown work_level_offs_55:= $07B7 ; unknown, always $00 $00 $00 work_level_offs_58:= $07BA ; unknown, not a ROM address work_level_offs_60:= $07BC ; unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00 cur_level_desc := $07C0 ; first 2 bytes are level number in screencodes cur_level_sub0 := $07C2 ; a subroutine cur_level_sub1 := $07C4 ; a subroutine cur_level_sub2 := $07C6 ; a subroutine cur_level_sub3 := $07C8 ; a subroutine cur_level_num_bombs:= $07CA ; number of bombs to pick up on this level cur_level_bullet_max:= $07CB ; 0 = no bullets, range 0-4. cur_level_y_start:= $07CC ; jumpman starting Y position cur_level_x_start:= $07CD ; jumpman starting X position cur_level_fudge_x:= $07CE ; fudge factor for bomb locations, always $00 cur_level_fudge_y:= $07CF ; fudge factor for bomb locations, always $06 cur_level_points_per_bomb:= $07D0 ; points awarded per bomb pickup (always $64 aka 100) cur_level_time_bonus:= $07D1 ; amount of time bonus at start of level cur_level_offs_19:= $07D3 ; always $00 cur_level_unkn_table0:= $07D4 ; pointer to ROM table or $06xx cur_level_map := $07D6 ; used to draw the level initially (see also map_changes) cur_level_map_bombs:= $07D8 ; start of bombs in map data (which must come last!) cur_level_bomblist:= $07DA ; addr of list of bombs, indexed by player position on coarse 8x8 grid. 2 bytes each, 1st is coarse-grid position, 2nd is: hi 4 bits = change_map index, lo 4 = indirect sub (unused). terminated by $FF. cur_level_map_changes:= $07DC ; address of list of addresses of map data, used for changing the map when certain bombs are picked up cur_level_indirect_subs:= $07DE ; pointer to list of indirect subs, always $0000 in this game cur_level_sub_bomb:= $07E0 ; called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine cur_level_init := $07E2 ; called at start of level, $06E6 for some levels, or else a ROM subroutine cur_level_sub6 := $07E4 ; always $9740 aka game_main_loop cur_level_sub_eol:= $07E6 ; called at end of level (all bombs picked up). $06E6 for all but level08 cur_level_offs_40:= $07E8 ; all zeroes cur_level_colpf3:= $07EE ; color for missiles (aka 5th player) cur_level_colpf0:= $07EF ; color for girders and up-ropes cur_level_colpf1:= $07F0 ; color for ladders and down-ropes cur_level_colpf2:= $07F1 ; color for bombs cur_level_offs_50:= $07F2 ; unknown cur_level_offs_55:= $07F7 ; unknown, always $00 $00 $00 cur_level_offs_58:= $07FA ; unknown, not a ROM address cur_level_offs_60:= $07FC ; unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00 game_display_list:= $0881 ; display list for game board pm_memory := $2800 HPOSP0_minus_two:= $CFFE HPOSP3 := $D003 ; === GTIA equates HPOSM0 := $D004 HPOSM1 := $D005 HPOSM2 := $D006 HPOSM3 := $D007 SIZEP2 := $D00A SIZEP3 := $D00B SIZEM := $D00C TRIG0 := $D010 GRAFM := $D011 COLPM0 := $D012 COLPM1 := $D013 COLPF0 := $D016 COLPF1 := $D017 COLPF2 := $D018 COLPF3 := $D019 COLBK := $D01A PRIOR := $D01B GRACTL := $D01D HITCLR := $D01E CONSOL := $D01F AUDF1_minus_two := $D1FE ; AUDF/AUDC regs are indexed from here AUDC1_minus_two := $D1FF AUDF1 := $D200 ; === POKEY equates AUDC1 := $D201 AUDF2 := $D202 AUDC2 := $D203 AUDF3 := $D204 AUDC3 := $D205 AUDF4 := $D206 AUDC4 := $D207 AUDCTL := $D208 KBCODE := $D209 RANDOM := $D20A IRQEN := $D20E SKCTL := $D20F PORTA := $D300 DMACTL := $D400 ; === ANTIC equates DLISTL := $D402 DLISTH := $D403 HSCROL := $D404 PMBASE := $D407 CHBASE := $D409 WSYNC := $D40A NMIEN := $D40E SETVBV := $E45C XITVBV := $E462 ; ---------------------------------------------------------------------------- ; the entry point for parsing the level map and drawing graphics from it. see level_maps.txt. draw_map_jv: jmp draw_map ; 8000 4C 49 80 LI. ; ---------------------------------------------------------------------------- ; if cue_sfx not already in progress, setup to play sfx at (sfx_slot_priority, sfx_lock), priority A cue_sfx_lowprior_jv: jmp cue_sfx_lowprior ; 8003 4C 40 82 L@. ; ---------------------------------------------------------------------------- ; setup to play sfx cue_sfx_jv: jmp cue_sfx ; 8006 4C 55 82 LU. ; ---------------------------------------------------------------------------- ; convert the 3-byte integer stored at num_in to screen codes, store into memory pointed to by num_out print_number_jv: jmp print_number ; 8009 4C 00 86 L.. ; ---------------------------------------------------------------------------- ; should be called every time the score is updated, adds extra life every 7500 points check_extra_life_jv: jmp check_extra_life ; 800C 4C BC 8C L.. ; ---------------------------------------------------------------------------- ; print remaining bonus time print_bonus_jv: jmp print_bonus ; 800F 4C 7E 86 L~. ; ---------------------------------------------------------------------------- ; bottom 2 GR.1 lines on the game board update_status_window_jv: jmp update_status_window ; 8012 4C 94 86 L.. ; ---------------------------------------------------------------------------- ; for some reason there are 2 copies of the display list, at $0800 and $0881 setup_gameboard_dlist_jv: jmp setup_gameboard_dlist ; 8015 4C 00 9B L.. ; ---------------------------------------------------------------------------- ; setup to play whichever music is in A reg, using 5-byte sfx stuct cue_music_jv: jmp cue_music ; 8018 4C 92 8F L.. ; ---------------------------------------------------------------------------- ; called after level-intro music is finished playing enable_joystick_jv: jmp enable_joystick ; 801B 4C 75 87 Lu. ; ---------------------------------------------------------------------------- ; clear the gameboard screen memory (called before drawing a level, natch) clear_screen_mem_jv: jmp clear_screen_mem ; 801E 4C 14 87 L.. ; ---------------------------------------------------------------------------- ; bonus -= 100; decrement_time_bonus_jv: jmp decrement_time_bonus ; 8021 4C CE 8D L.. ; ---------------------------------------------------------------------------- init_struct_users_jv: jmp init_struct_users ; 8024 4C 5C 9A L\. ; ---------------------------------------------------------------------------- ; used in multiplayer games, also called in single player (?) next_player_jv: jmp next_player ; 8027 4C AA 9A L.. ; ---------------------------------------------------------------------------- ; calls draw_map, plays level intro music, shows level name draw_level_jv: jmp draw_level ; 802A 4C 00 BA L.. ; ---------------------------------------------------------------------------- level_finished_jv: jmp level_finished ; 802D 4C 00 8E L.. ; ---------------------------------------------------------------------------- ; just lost your last life crumble_gameboard_jv: jmp crumble_gameboard ; 8030 4C 00 8D L.. ; ---------------------------------------------------------------------------- ; check whether Jumpman just touched a bomb (RTS if not) check_bomb_coll_jv: jmp check_bomb_coll ; 8033 4C A0 87 L.. ; ---------------------------------------------------------------------------- ; various levels use this as their init, or use an init that calls this special_init_jv: jmp special_init ; 8036 4C 23 8B L#. ; ---------------------------------------------------------------------------- ; special_init that doesn't clear memory. unused vector? special_init_2_jv: jmp special_init_2 ; 8039 4C 2D 8B L-. ; ---------------------------------------------------------------------------- ; show blank screen with empty display list setup_blank_dlist_jv: jmp setup_blank_dlist ; 803C 4C E0 8A L.. ; ---------------------------------------------------------------------------- ; 3 unused jump vectors, all pointed to the same RTS unused_vecs: jmp unused_vec_rts ; 803F 4C 48 80 LH. ; ---------------------------------------------------------------------------- jmp unused_vec_rts ; 8042 4C 48 80 LH. ; ---------------------------------------------------------------------------- jmp unused_vec_rts ; 8045 4C 48 80 LH. ; ---------------------------------------------------------------------------- ; unused jump vectors point here unused_vec_rts: rts ; 8048 60 ` ; ---------------------------------------------------------------------------- ; the entry point for parsing the level map and drawing graphics from it. see level_maps.txt. caller must set $C0/$C1 to the address of the map data. modders beware: bogus map data can & will cause infinite loops. draw_map: ldy #$00 ; 8049 A0 00 .. ; $C0/$C1 points to $A300 (level01_desc) on the first call dm_get_opcode: lda (dm_progctr),y ; 804B B1 C0 .. ; map opcodes: $FC = jump, $FF = end, $FD = set drawing direction, $FE = select graphics object dm_switch_opcode: cmp #$FC ; 804D C9 FC .. bcc dm_draw_gfx ; 804F 90 3F .? beq dm_jump ; 8051 F0 09 .. cmp #$FD ; 8053 C9 FD .. beq dm_delta ; 8055 F0 14 .. cmp #$FE ; 8057 C9 FE .. beq dm_obj ; 8059 F0 28 .( ; handle gfx_end opcode dm_fallthru: rts ; 805B 60 ` ; ---------------------------------------------------------------------------- ; handle gfx_jump opcode dm_jump:iny ; 805C C8 . lda (dm_progctr),y ; 805D B1 C0 .. pha ; 805F 48 H iny ; 8060 C8 . lda (dm_progctr),y ; 8061 B1 C0 .. sta dm_progctr+1 ; 8063 85 C1 .. pla ; 8065 68 h sta dm_progctr ; 8066 85 C0 .. jmp draw_map ; 8068 4C 49 80 LI. ; ---------------------------------------------------------------------------- ; handle gfx_delta opcode dm_delta: iny ; 806B C8 . lda (dm_progctr),y ; 806C B1 C0 .. sta dm_delta_x ; 806E 85 C9 .. iny ; 8070 C8 . lda (dm_progctr),y ; 8071 B1 C0 .. sta dm_delta_y ; 8073 85 CA .. ; all the other opcode handlers jump here dm_next_opcode: lda dm_progctr ; 8075 A5 C0 .. clc ; 8077 18 . adc #$03 ; 8078 69 03 i. sta dm_progctr ; 807A 85 C0 .. bcc draw_map ; 807C 90 CB .. inc dm_progctr+1 ; 807E E6 C1 .. jmp draw_map ; 8080 4C 49 80 LI. ; ---------------------------------------------------------------------------- ; handle gfx_object opcode dm_obj: iny ; 8083 C8 . lda (dm_progctr),y ; 8084 B1 C0 .. sta dm_objptr ; 8086 85 C2 .. iny ; 8088 C8 . lda (dm_progctr),y ; 8089 B1 C0 .. sta dm_objptr+1 ; 808B 85 C3 .. jmp dm_next_opcode ; 808D 4C 75 80 Lu. ; ---------------------------------------------------------------------------- ; handle gfx_draw opcode dm_draw_gfx: sta dm_xpos ; 8090 85 55 .U iny ; 8092 C8 . lda (dm_progctr),y ; 8093 B1 C0 .. sta dm_ypos ; 8095 85 54 .T iny ; 8097 C8 . lda (dm_progctr),y ; 8098 B1 C0 .. sta dm_length ; 809A 85 BF .. ; loop 'dm_length' times dm_draw_loop: jsr dm_draw_obj ; 809C 20 B4 80 .. dec dm_length ; 809F C6 BF .. beq dm_next_opcode ; 80A1 F0 D2 .. lda dm_delta_x ; 80A3 A5 C9 .. clc ; 80A5 18 . adc dm_xpos ; 80A6 65 55 eU sta dm_xpos ; 80A8 85 55 .U lda dm_delta_y ; 80AA A5 CA .. clc ; 80AC 18 . adc dm_ypos ; 80AD 65 54 eT sta dm_ypos ; 80AF 85 54 .T jmp dm_draw_loop ; 80B1 4C 9C 80 L.. ; ---------------------------------------------------------------------------- ; draw current object at current x/y position dm_draw_obj: ldy #$00 ; 80B4 A0 00 .. ; object definition ends with $FF dm_draw_obj_loop: lda (dm_objptr),y ; 80B6 B1 C2 .. cmp #$FF ; 80B8 C9 FF .. bne dm_obj_to_screen ; 80BA D0 01 .. rts ; 80BC 60 ` ; ---------------------------------------------------------------------------- ; actually write the object's pixels to screen memory. quite hairy. dm_obj_to_screen: sta dm_count ; 80BD 85 BE .. iny ; 80BF C8 . clc ; 80C0 18 . lda (dm_objptr),y ; 80C1 B1 C2 .. adc dm_xpos ; 80C3 65 55 eU sta dm_x_with_offset ; 80C5 85 C6 .. iny ; 80C7 C8 . clc ; 80C8 18 . lda (dm_objptr),y ; 80C9 B1 C2 .. adc dm_ypos ; 80CB 65 54 eT sta dm_y_with_offset ; 80CD 85 C7 .. iny ; 80CF C8 . ; calculate 40 * dm_y_with_offset + dm_x_with_offset + screen mem address, store in dm_screen_addr calc_screen_addr: lda #$28 ; 80D0 A9 28 .( sta sa_tmp_1 ; 80D2 85 BD .. lda #$00 ; 80D4 A9 00 .. sta dm_screen_addr ; 80D6 85 C4 .. ldx #$08 ; 80D8 A2 08 .. mul40_loop: lsr sa_tmp_1 ; 80DA 46 BD F. bcc mul40_no_add ; 80DC 90 03 .. clc ; 80DE 18 . adc dm_y_with_offset ; 80DF 65 C7 e. mul40_no_add: ror a ; 80E1 6A j ror dm_screen_addr ; 80E2 66 C4 f. dex ; 80E4 CA . bne mul40_loop ; 80E5 D0 F3 .. clc ; 80E7 18 . adc SAVMSC+1 ; 80E8 65 59 eY sta dm_screen_addr+1 ; 80EA 85 C5 .. lda dm_x_with_offset ; 80EC A5 C6 .. lsr a ; 80EE 4A J ror sa_tmp_2 ; 80EF 66 C8 f. lsr a ; 80F1 4A J ror sa_tmp_2 ; 80F2 66 C8 f. clc ; 80F4 18 . adc dm_screen_addr ; 80F5 65 C4 e. sta dm_screen_addr ; 80F7 85 C4 .. bcc sa_hi_ok_1 ; 80F9 90 02 .. inc dm_screen_addr+1 ; 80FB E6 C5 .. sa_hi_ok_1: asl sa_tmp_2 ; 80FD 06 C8 .. rol a ; 80FF 2A * asl sa_tmp_2 ; 8100 06 C8 .. rol a ; 8102 2A * and #$03 ; 8103 29 03 ). sta sa_tmp_2 ; 8105 85 C8 .. calc_pixels: lda (dm_objptr),y ; 8107 B1 C2 .. sta sa_tmp_1 ; 8109 85 BD .. lda sa_tmp_2 ; 810B A5 C8 .. lsr sa_tmp_1 ; 810D 46 BD F. rol a ; 810F 2A * lsr sa_tmp_1 ; 8110 46 BD F. rol a ; 8112 2A * sta sa_tmp_1 ; 8113 85 BD .. iny ; 8115 C8 . tya ; 8116 98 . pha ; 8117 48 H ldy #$00 ; 8118 A0 00 .. ldx sa_tmp_2 ; 811A A6 C8 .. lda (dm_screen_addr),y ; 811C B1 C4 .. and gr7_and_masks,x ; 811E 3D 53 81 =S. ldx sa_tmp_1 ; 8121 A6 BD .. ora gr7_or_masks,x ; 8123 1D 43 81 .C. sta (dm_screen_addr),y ; 8126 91 C4 .. pla ; 8128 68 h tay ; 8129 A8 . inc sa_tmp_2 ; 812A E6 C8 .. lda sa_tmp_2 ; 812C A5 C8 .. cmp #$04 ; 812E C9 04 .. bcc sa_hi_ok_2 ; 8130 90 0A .. lda #$00 ; 8132 A9 00 .. sta sa_tmp_2 ; 8134 85 C8 .. inc dm_screen_addr ; 8136 E6 C4 .. bne sa_hi_ok_2 ; 8138 D0 02 .. inc dm_screen_addr+1 ; 813A E6 C5 .. sa_hi_ok_2: dec dm_count ; 813C C6 BE .. bne calc_pixels ; 813E D0 C7 .. jmp dm_draw_obj_loop ; 8140 4C B6 80 L.. ; ---------------------------------------------------------------------------- gr7_or_masks: .byte $00,$80,$40,$C0,$00,$20,$10,$30 ; 8143 00 80 40 C0 00 20 10 30 ..@.. .0 .byte $00,$08,$04,$0C,$00,$02,$01,$03 ; 814B 00 08 04 0C 00 02 01 03 ........ gr7_and_masks: .byte $3F,$CF,$F3,$FC ; 8153 3F CF F3 FC ?... ; ---------------------------------------------------------------------------- ; we have 4 slots (because POKEY has 4 voices), X counts down by 2 from 10 to 2 (at 0, the loop exits) snd_player_entry: ldx #$0A ; 8157 A2 0A .. lda snd_lock ; 8159 AD 2F 06 ./. beq next_snd_slot ; 815C F0 01 .. snd_exit: rts ; 815E 60 ` ; ---------------------------------------------------------------------------- next_snd_slot: dex ; 815F CA . dex ; 8160 CA . beq snd_exit ; 8161 F0 FB .. lda snd_slot_priority,x ; 8163 BD 3E 06 .>. beq next_snd_slot ; 8166 F0 F7 .. ; skip it, if slot is inactive is_slot_active: lda snd_slot_timer,x ; 8168 BD 3F 06 .?. beq snd_next_note ; 816B F0 10 .. dec snd_slot_timer,x ; 816D DE 3F 06 .?. cmp snd_slot_duration,x ; 8170 DD 46 06 .F. bne next_snd_slot ; 8173 D0 EA .. lda #$00 ; 8175 A9 00 .. sta AUDC1_minus_two,x ; 8177 9D FF D1 ... jmp next_snd_slot ; 817A 4C 5F 81 L_. ; ---------------------------------------------------------------------------- snd_next_note: lda snd_slot_curpos,x ; 817D BD 4E 06 .N. sta zp_temp1 ; 8180 85 CB .. lda snd_slot_curpos+1,x ; 8182 BD 4F 06 .O. sta zp_temp1+1 ; 8185 85 CC .. ldy #$00 ; 8187 A0 00 .. lda (zp_temp1),y ; 8189 B1 CB .. cmp #$04 ; 818B C9 04 .. bcs snd_play_note ; 818D B0 77 .w cmp #$01 ; 818F C9 01 .. beq snd_set_audc ; 8191 F0 1B .. cmp #$02 ; 8193 C9 02 .. beq snd_jump_opcode ; 8195 F0 31 .1 cmp #$03 ; 8197 C9 03 .. beq snd_play_rest ; 8199 F0 03 .. jmp snd_finished ; 819B 4C 26 82 L&. ; ---------------------------------------------------------------------------- ; y==0 on entry snd_play_rest: tya ; 819E 98 . sta AUDC1_minus_two,x ; 819F 9D FF D1 ... iny ; 81A2 C8 . lda (zp_temp1),y ; 81A3 B1 CB .. sta snd_slot_timer,x ; 81A5 9D 3F 06 .?. jsr inc_snd_pos ; 81A8 20 31 82 1. jmp is_slot_active ; 81AB 4C 68 81 Lh. ; ---------------------------------------------------------------------------- ; y==0 on entry snd_set_audc: iny ; 81AE C8 . lda (zp_temp1),y ; 81AF B1 CB .. sta snd_slot_audc,x ; 81B1 9D 47 06 .G. iny ; 81B4 C8 . lda (zp_temp1),y ; 81B5 B1 CB .. sta snd_slot_duration,x ; 81B7 9D 46 06 .F. jsr inc_snd_pos ; 81BA 20 31 82 1. inc snd_slot_curpos,x ; 81BD FE 4E 06 .N. bne is_slot_active ; 81C0 D0 A6 .. inc snd_slot_curpos+1,x ; 81C2 FE 4F 06 .O. jmp is_slot_active ; 81C5 4C 68 81 Lh. ; ---------------------------------------------------------------------------- ; I *think* this jumps to a different sfx address... snd_jump_opcode: iny ; 81C8 C8 . lda (zp_temp1),y ; 81C9 B1 CB .. sta snd_slot_curpos,x ; 81CB 9D 4E 06 .N. iny ; 81CE C8 . lda (zp_temp1),y ; 81CF B1 CB .. sta snd_slot_curpos+1,x ; 81D1 9D 4F 06 .O. iny ; 81D4 C8 . lda $065E,x ; 81D5 BD 5E 06 .^. beq L81EE ; 81D8 F0 14 .. dec $065E,x ; 81DA DE 5E 06 .^. bne snd_next_note ; 81DD D0 9E .. lda $0656,x ; 81DF BD 56 06 .V. sta snd_slot_curpos,x ; 81E2 9D 4E 06 .N. lda $0657,x ; 81E5 BD 57 06 .W. sta snd_slot_curpos+1,x ; 81E8 9D 4F 06 .O. jmp snd_next_note ; 81EB 4C 7D 81 L}. ; ---------------------------------------------------------------------------- L81EE: nop ; 81EE EA . lda (zp_temp1),y ; 81EF B1 CB .. sta $065E,x ; 81F1 9D 5E 06 .^. lda zp_temp1 ; 81F4 A5 CB .. clc ; 81F6 18 . adc #$04 ; 81F7 69 04 i. sta $0656,x ; 81F9 9D 56 06 .V. lda zp_temp1+1 ; 81FC A5 CC .. adc #$00 ; 81FE 69 00 i. sta $0657,x ; 8200 9D 57 06 .W. jmp snd_next_note ; 8203 4C 7D 81 L}. ; ---------------------------------------------------------------------------- ; y==0, a>=4 on entry snd_play_note: sta AUDF1_minus_two,x ; 8206 9D FE D1 ... iny ; 8209 C8 . lda (zp_temp1),y ; 820A B1 CB .. sta snd_slot_timer,x ; 820C 9D 3F 06 .?. lda snd_slot_audc,x ; 820F BD 47 06 .G. sta AUDC1_minus_two,x ; 8212 9D FF D1 ... clc ; 8215 18 . lda snd_slot_curpos,x ; 8216 BD 4E 06 .N. adc #$02 ; 8219 69 02 i. sta snd_slot_curpos,x ; 821B 9D 4E 06 .N. bcc cpos_hi_ok ; 821E 90 03 .. inc snd_slot_curpos+1,x ; 8220 FE 4F 06 .O. cpos_hi_ok: jmp is_slot_active ; 8223 4C 68 81 Lh. ; ---------------------------------------------------------------------------- ; done playing this sfx, free up the slot, X-indexed snd_finished: lda #$00 ; 8226 A9 00 .. sta snd_slot_priority,x ; 8228 9D 3E 06 .>. sta AUDC1_minus_two,x ; 822B 9D FF D1 ... jmp next_snd_slot ; 822E 4C 5F 81 L_. ; ---------------------------------------------------------------------------- ; point to next byte in current sfx slot indexed by X inc_snd_pos: clc ; 8231 18 . lda snd_slot_curpos,x ; 8232 BD 4E 06 .N. adc #$02 ; 8235 69 02 i. sta snd_slot_curpos,x ; 8237 9D 4E 06 .N. bcc inc_done ; 823A 90 03 .. inc snd_slot_curpos+1,x ; 823C FE 4F 06 .O. inc_done: rts ; 823F 60 ` ; ---------------------------------------------------------------------------- ; if cue_sfx not already in progress, setup to play sfx at (sfx_slot_priority, sfx_lock), priority A cue_sfx_lowprior: pha ; 8240 48 H lda snd_ptr+1 ; 8241 AD 3D 06 .=. cue_ok: beq lp_ok ; 8244 F0 02 .. pla ; 8246 68 h rts ; 8247 60 ` ; ---------------------------------------------------------------------------- ; copy to sfx_ptr, fall thru to cue_sfx lp_ok: lda snd_slot_priority ; 8248 AD 3E 06 .>. sta snd_ptr ; 824B 8D 3C 06 .<. lda snd_slot_timer ; 824E AD 3F 06 .?. sta snd_ptr+1 ; 8251 8D 3D 06 .=. pla ; 8254 68 h ; setup to play sfx at *sfx_ptr, priority in A cue_sfx:sta snd_priority_tmp ; 8255 8D 61 06 .a. inc snd_lock ; 8258 EE 2F 06 ./. ldx #$0A ; 825B A2 0A .. next_slot: dex ; 825D CA . dex ; 825E CA . beq bump_slot ; 825F F0 20 . lda snd_slot_priority,x ; 8261 BD 3E 06 .>. bne next_slot ; 8264 D0 F7 .. ; found a free slot, use it load_slot: lda snd_ptr ; 8266 AD 3C 06 .<. sta snd_slot_curpos,x ; 8269 9D 4E 06 .N. lda snd_ptr+1 ; 826C AD 3D 06 .=. sta snd_slot_curpos+1,x ; 826F 9D 4F 06 .O. lda snd_priority_tmp ; 8272 AD 61 06 .a. sta snd_slot_priority,x ; 8275 9D 3E 06 .>. cue_done: lda #$00 ; 8278 A9 00 .. sta snd_ptr+1 ; 827A 8D 3D 06 .=. dec snd_lock ; 827D CE 2F 06 ./. rts ; 8280 60 ` ; ---------------------------------------------------------------------------- ; couldn't find a free slot, look for a used slot with lower priority than this sfx has bump_slot: ldx #$0A ; 8281 A2 0A .. ; until we find one, or ran out of slots to look at bump_try_next: dex ; 8283 CA . dex ; 8284 CA . ; branch to cue_done (give up) if all slots are in use with higher priority than this sfx (which means it won't be heard) bump_fail: beq cue_done ; 8285 F0 F1 .. lda snd_slot_priority,x ; 8287 BD 3E 06 .>. cmp snd_priority_tmp ; 828A CD 61 06 .a. bcc load_slot ; 828D 90 D7 .. jmp bump_try_next ; 828F 4C 83 82 L.. ; ---------------------------------------------------------------------------- .byte $82 ; 8292 82 . position_missiles: ldx #$05 ; 8293 A2 05 .. pm_next:dex ; 8295 CA . beq missiles_done ; 8296 F0 45 .E lda $069A,x ; 8298 BD 9A 06 ... cmp bullet_y_pos+3,x ; 829B DD A2 06 ... beq skip_pos ; 829E F0 06 .. sta bullet_y_pos+3,x ; 82A0 9D A2 06 ... sta HPOSP3,x ; 82A3 9D 03 D0 ... skip_pos: lda $06A6,x ; 82A6 BD A6 06 ... cmp bullet_y_pos_minus_one,x ; 82A9 DD 9E 06 ... beq pm_next ; 82AC F0 E7 .. tay ; 82AE A8 . lda $2B00,y ; 82AF B9 00 2B ..+ and missiles_and_masks_minus_one,x ; 82B2 3D DF 82 =.. sta $2B00,y ; 82B5 99 00 2B ..+ lda $2B01,y ; 82B8 B9 01 2B ..+ and missiles_and_masks_minus_one,x ; 82BB 3D DF 82 =.. sta $2B01,y ; 82BE 99 01 2B ..+ lda bullet_y_pos_minus_one,x ; 82C1 BD 9E 06 ... sta $06A6,x ; 82C4 9D A6 06 ... tay ; 82C7 A8 . lda $2B00,y ; 82C8 B9 00 2B ..+ ora missiles_or_masks_minus_one,x ; 82CB 1D E3 82 ... sta $2B00,y ; 82CE 99 00 2B ..+ lda $2B01,y ; 82D1 B9 01 2B ..+ ora missiles_or_masks_minus_one,x ; 82D4 1D E3 82 ... sta $2B01,y ; 82D7 99 01 2B ..+ jmp pm_next ; 82DA 4C 95 82 L.. ; ---------------------------------------------------------------------------- missiles_done: missiles_and_masks_minus_one:= * + 2 jmp position_players ; 82DD 4C E9 82 L.. ; ---------------------------------------------------------------------------- missiles_and_masks: .byte $FC,$F3,$CF ; 82E0 FC F3 CF ... missiles_or_masks_minus_one: .byte $3F ; 82E3 3F ? missiles_or_masks: .byte $03,$0C,$30,$C0 ; 82E4 03 0C 30 C0 ..0. ; ---------------------------------------------------------------------------- position_done: rts ; 82E8 60 ` ; ---------------------------------------------------------------------------- ; X counts down 5..1 (starts at 6, immediately decremented, and loop is done with 0). zp_temp1 is ZP pointer to the current player or missile being written to ($2f00..$2b00, or p3/p2/p1/p0/missiles). position_players: lda #$00 ; 82E9 A9 00 .. sta zp_temp1 ; 82EB 85 CB .. lda #$30 ; 82ED A9 30 .0 sta zp_temp1+1 ; 82EF 85 CC .. ldx #$06 ; 82F1 A2 06 .. next_plr: dec zp_temp1+1 ; 82F3 C6 CC .. dex ; 82F5 CA . beq position_done ; 82F6 F0 F0 .. lda player_enabled,x ; 82F8 BD 68 06 .h. beq next_plr ; 82FB F0 F6 .. lda player_new_x,x ; 82FD BD 7C 06 .|. cmp player_x,x ; 8300 DD 8B 06 ... beq position_pm_vert ; 8303 F0 1D .. sta player_x,x ; 8305 9D 8B 06 ... sta HPOSP0_minus_two,x ; 8308 9D FE CF ... cpx #$01 ; 830B E0 01 .. bne position_pm_vert ; 830D D0 13 .. tay ; 830F A8 . ; position the 4 missiles side-by-side position_player_5: sty HPOSM3 ; 8310 8C 07 D0 ... iny ; 8313 C8 . iny ; 8314 C8 . sty HPOSM2 ; 8315 8C 06 D0 ... iny ; 8318 C8 . iny ; 8319 C8 . sty HPOSM1 ; 831A 8C 05 D0 ... iny ; 831D C8 . iny ; 831E C8 . sty HPOSM0 ; 831F 8C 04 D0 ... position_pm_vert: lda $0690,x ; 8322 BD 90 06 ... cmp $0681,x ; 8325 DD 81 06 ... bne skip_vert ; 8328 D0 0E .. lda player_new_y,x ; 832A BD 86 06 ... cmp player_y,x ; 832D DD 95 06 ... beq next_plr ; 8330 F0 C1 .. sta player_y,x ; 8332 9D 95 06 ... lda $0690,x ; 8335 BD 90 06 ... skip_vert: sta zp_temp1 ; 8338 85 CB .. lda player_height,x ; 833A BD 77 06 .w. sta tmp_sprite_height ; 833D 85 CF .. lda #$00 ; 833F A9 00 .. tay ; 8341 A8 . ; write zeroes to unused portion of this player/missile clear_pm: sta (zp_temp1),y ; 8342 91 CB .. iny ; 8344 C8 . cpy tmp_sprite_height ; 8345 C4 CF .. bne clear_pm ; 8347 D0 F9 .. lda $0681,x ; 8349 BD 81 06 ... sta $0690,x ; 834C 9D 90 06 ... sta zp_temp1 ; 834F 85 CB .. lda $066D,x ; 8351 BD 6D 06 .m. sta tmp_sprite ; 8354 85 CD .. lda $0672,x ; 8356 BD 72 06 .r. sta tmp_sprite+1 ; 8359 85 CE .. ldy player_new_y,x ; 835B BC 86 06 ... clc ; 835E 18 . ; adjust pointer if Y wraps around adj_ptr:dey ; 835F 88 . beq copy_pm_data ; 8360 F0 0E .. lda tmp_sprite_height ; 8362 A5 CF .. adc tmp_sprite ; 8364 65 CD e. sta tmp_sprite ; 8366 85 CD .. bcc adj_ptr ; 8368 90 F5 .. inc tmp_sprite+1 ; 836A E6 CE .. clc ; 836C 18 . jmp adj_ptr ; 836D 4C 5F 83 L_. ; ---------------------------------------------------------------------------- ; write to P/M memory copy_pm_data: lda (tmp_sprite),y ; 8370 B1 CD .. sta (zp_temp1),y ; 8372 91 CB .. iny ; 8374 C8 . dec tmp_sprite_height ; 8375 C6 CF .. bne copy_pm_data ; 8377 D0 F7 .. jmp next_plr ; 8379 4C F3 82 L.. ; ---------------------------------------------------------------------------- init_hardware: ldx #$18 ; 837C A2 18 .. init_page6_loop: lda page6_initial_vectors_minus_one,x; 837E BD DD 85 ... sta page6_vectors_minus_one,x ; 8381 9D FF 05 ... dex ; 8384 CA . bne init_page6_loop ; 8385 D0 F7 .. stx AUDCTL ; 8387 8E 08 D2 ... lda #$28 ; 838A A9 28 .( sta PMBASE ; 838C 8D 07 D4 ... ; std playfield, enable players + missiles, single-line p/m res, DMA enabled set_dma_ctl: lda #$3E ; 838F A9 3E .> sta SDMCTL ; 8391 8D 2F 02 ./. sta DMACTL ; 8394 8D 00 D4 ... lda #$11 ; 8397 A9 11 .. ; priority $11: pl0-3, pf0-3, bak (and enable 5th player from the missiles) init_set_prior: sta GPRIOR ; 8399 8D 6F 02 .o. sta PRIOR ; 839C 8D 1B D0 ... lda #$03 ; 839F A9 03 .. sta SKCTL ; 83A1 8D 0F D2 ... sta GRACTL ; 83A4 8D 1D D0 ... lda #$09 ; 83A7 A9 09 .. sta current_speed ; 83A9 8D 24 06 .$. lda #$4C ; 83AC A9 4C .L sta L06E0 ; 83AE 8D E0 06 ... lda #$20 ; 83B1 A9 20 . sta L06E3 ; 83B3 8D E3 06 ... ; store an RTS at $06E6, which will get JSR'ed to by unused level subroutines store_rts: lda #$60 ; 83B6 A9 60 .` sta L06E6 ; 83B8 8D E6 06 ... ; use character set at $9e00 aka charset set_char_base: lda #$9E ; 83BB A9 9E .. sta CHBAS ; 83BD 8D F4 02 ... sta CHBASE ; 83C0 8D 09 D4 ... lda #$9D ; 83C3 A9 9D .. sta $0674 ; 83C5 8D 74 06 .t. sta $0675 ; 83C8 8D 75 06 .u. lda #$E8 ; 83CB A9 E8 .. sta $0670 ; 83CD 8D 70 06 .p. sta $066A ; 83D0 8D 6A 06 .j. sta $066B ; 83D3 8D 6B 06 .k. lda #$0A ; 83D6 A9 0A .. sta $0679 ; 83D8 8D 79 06 .y. inc $067A ; 83DB EE 7A 06 .z. lda #$00 ; 83DE A9 00 .. sta VKEYBD ; 83E0 8D 08 02 ... sta SAVMSC ; 83E3 85 58 .X sta num_color ; 83E5 85 D5 .. lda #$30 ; 83E7 A9 30 .0 ; tell OS that screen memory starts at $3000 set_savmsc: sta SAVMSC+1 ; 83E9 85 59 .Y lda #$9C ; 83EB A9 9C .. ; VKEYBD now points to $9c00 aka keyboard_isr set_vkeybd: sta VKEYBD_hi ; 83ED 8D 09 02 ... ; stub => map_draw_1_blank-1 copy_blank_1_map: ldx #$07 ; 83F0 A2 07 .. cb1_loop: lda stub,x ; 83F2 BD 05 84 ... sta $06D8,x ; 83F5 9D D8 06 ... dex ; 83F8 CA . bne cb1_loop ; 83F9 D0 F7 .. ldy #$0D ; 83FB A0 0D .. ldx #$84 ; 83FD A2 84 .. lda #$06 ; 83FF A9 06 .. ; VVBLKI now points to $840d aka vblank_imm_isr set_vvblki: jsr SETVBV ; 8401 20 5C E4 \. cld ; 8404 D8 . ; just an RTS stub: rts ; 8405 60 ` ; ---------------------------------------------------------------------------- ; copied to $06d9 by code at copy_blank_1_map, possibly so it can be modified map_draw_1_blank: .byte $FE,$49,$9C,$00,$00,$01,$FF ; 8406 FE 49 9C 00 00 01 FF .I..... ; ---------------------------------------------------------------------------- ; service immediate vblank interrupt vblank_imm_isr: ldx #$09 ; 840D A2 09 .. ; update color regs from shadow regs (X ranges 1 to 9, GRAFM+1 is COLPM0, $2bf+1 is PCOLR0) update_color_regs: lda $02BF,x ; 840F BD BF 02 ... sta GRAFM,x ; 8412 9D 11 D0 ... dex ; 8415 CA . bne update_color_regs ; 8416 D0 F7 .. inc jiffy_timer_3_lo ; 8418 EE 19 06 ... bne no_wrap ; 841B D0 02 .. inc jiffy_timer_3_hi ; 841D E6 A2 .. no_wrap:inc jiffy_timer_1 ; 841F EE 1A 06 ... inc jiffy_timer_2 ; 8422 EE 1B 06 ... inc odd_frame_flag ; 8425 EE 1C 06 ... lda odd_frame_flag ; 8428 AD 1C 06 ... and #$01 ; 842B 29 01 ). sta odd_frame_flag ; 842D 8D 1C 06 ... lda #$00 ; 8430 A9 00 .. sta start_falling_flag ; 8432 8D 21 06 .!. sta $0622 ; 8435 8D 22 06 .". sta $06FD ; 8438 8D FD 06 ... inc $061D ; 843B EE 1D 06 ... inc speed_jiffy_timer ; 843E EE 1E 06 ... lda current_speed ; 8441 AD 24 06 .$. cmp #$09 ; 8444 C9 09 .. bcs check_time_bonus ; 8446 B0 36 .6 lda $061D ; 8448 AD 1D 06 ... cmp current_speed ; 844B CD 24 06 .$. bcc check_speed_timer ; 844E 90 1E .. lda #$00 ; 8450 A9 00 .. sta $061D ; 8452 8D 1D 06 ... inc start_falling_flag ; 8455 EE 21 06 .!. inc $061F ; 8458 EE 1F 06 ... inc $0620 ; 845B EE 20 06 . . lda $061F ; 845E AD 1F 06 ... and #$01 ; 8461 29 01 ). sta $061F ; 8463 8D 1F 06 ... lda $0620 ; 8466 AD 20 06 . . and #$03 ; 8469 29 03 ). sta $0620 ; 846B 8D 20 06 . . check_speed_timer: lda speed_jiffy_timer ; 846E AD 1E 06 ... cmp initial_speed ; 8471 CD 25 06 .%. bcc check_time_bonus ; 8474 90 08 .. lda #$00 ; 8476 A9 00 .. sta speed_jiffy_timer ; 8478 8D 1E 06 ... inc $0622 ; 847B EE 22 06 .". check_time_bonus: lda playing_level ; 847E AD 27 06 .'. beq no_dec_bonus ; 8481 F0 08 .. inc bonus_jiffy_timer ; 8483 EE 26 06 .&. bne no_dec_bonus ; 8486 D0 03 .. jsr decrement_time_bonus_jv ; 8488 20 21 80 !. no_dec_bonus: lda jiffy_timer_3_lo ; 848B AD 19 06 ... and #$07 ; 848E 29 07 ). bne check_joystick_enabled ; 8490 D0 12 .. inc $0628 ; 8492 EE 28 06 .(. lda $0628 ; 8495 AD 28 06 .(. and #$07 ; 8498 29 07 ). sta $0628 ; 849A 8D 28 06 .(. tax ; 849D AA . lda rotating_colors,x ; 849E BD B6 85 ... sta rot_color ; 84A1 8D 2A 06 .*. ; read the joystick if not disabled check_joystick_enabled: lda joystick_disabled ; 84A4 AD 32 06 .2. beq read_joystick ; 84A7 F0 03 .. jmp store_joystick_state ; 84A9 4C B1 84 L.. ; ---------------------------------------------------------------------------- ; always joystick #1 (all players use the same joystick and pass it around) read_joystick: lda PORTA ; 84AC AD 00 D3 ... and #$0F ; 84AF 29 0F ). ; store bottom 4 bits of PORTA, or 0 if joystick_disabled store_joystick_state: sta joystick_state ; 84B1 8D 33 06 .3. asl a ; 84B4 0A . tax ; 84B5 AA . lda movement_direction_table,x ; 84B6 BD BE 85 ... sta player_delta_x ; 84B9 8D 30 06 .0. lda movement_direction_table+1,x ; 84BC BD BF 85 ... sta player_delta_y ; 84BF 8D 31 06 .1. lda trigger_disabled ; 84C2 AD 34 06 .4. beq read_trigger ; 84C5 F0 0C .. cmp #$01 ; 84C7 C9 01 .. beq fake_read_trigger ; 84C9 F0 02 .. lda #$00 ; 84CB A9 00 .. ; ?? fake_read_trigger: sta trigger_state ; 84CD 8D 35 06 .5. jmp copy_level_vecs ; 84D0 4C D9 84 L.. ; ---------------------------------------------------------------------------- ; always joystick #1 read_trigger: lda TRIG0 ; 84D3 AD 10 D0 ... sta trigger_state ; 84D6 8D 35 06 .5. ; copy work_level vectors to page 6 copy_level_vecs: ldx #$08 ; 84D9 A2 08 .. next_vec: lda work_level_desc+1,x ; 84DB BD 81 07 ... beq skip_vec ; 84DE F0 0E .. sta page6_vectors+3,x ; 84E0 9D 03 06 ... lda work_level_desc,x ; 84E3 BD 80 07 ... sta page6_vectors+2,x ; 84E6 9D 02 06 ... lda #$00 ; 84E9 A9 00 .. sta work_level_desc+1,x ; 84EB 9D 81 07 ... skip_vec: dex ; 84EE CA . dex ; 84EF CA . bne next_vec ; 84F0 D0 E9 .. lda $0640 ; 84F2 AD 40 06 .@. ora $0642 ; 84F5 0D 42 06 .B. ora $0644 ; 84F8 0D 44 06 .D. ora snd_slot_duration ; 84FB 0D 46 06 .F. sta $0663 ; 84FE 8D 63 06 .c. ldx #$10 ; 8501 A2 10 .. ; save contents of GTIA collision regs (X ranges 1 to $10, dli_vec_shadow_hi should read collision_save-1) save_collisions: lda $CFFF,x ; 8503 BD FF CF ... sta dli_vec_shadow_hi,x ; 8506 9D AF 06 ... dex ; 8509 CA . bne save_collisions ; 850A D0 F7 .. inx ; 850C E8 . clear_collisions: stx HITCLR ; 850D 8E 1E D0 ... ; update display list, if there's a new one in the shadow reg update_dlist: lda dlist_shadow_hi ; 8510 AD AD 06 ... beq update_dli_vector ; 8513 F0 0E .. sta DLISTH ; 8515 8D 03 D4 ... lda dlist_shadow_lo ; 8518 AD AC 06 ... sta DLISTL ; 851B 8D 02 D4 ... ; clear the shadow now that we've updated the HW clear_dlist_shadow: lda #$00 ; 851E A9 00 .. sta dlist_shadow_hi ; 8520 8D AD 06 ... ; update DLI vector, if there's a new one in the shadow reg update_dli_vector: lda dli_vec_shadow_hi ; 8523 AD AF 06 ... beq skip_dli ; 8526 F0 13 .. sta VDSLST+1 ; 8528 8D 01 02 ... lda dli_vec_shadow_lo ; 852B AD AE 06 ... sta VDSLST ; 852E 8D 00 02 ... ; clear the shadow now that we've updated the HW clear_dli_shadow: lda #$00 ; 8531 A9 00 .. sta dli_vec_shadow_hi ; 8533 8D AF 06 ... ; enable DLI now that we've set up the vector enable_dli: lda #$C0 ; 8536 A9 C0 .. sta NMIEN ; 8538 8D 0E D4 ... skip_dli: lda $06FC ; 853B AD FC 06 ... cmp $0888 ; 853E CD 88 08 ... bcc L8551 ; 8541 90 0E .. inc $06FD ; 8543 EE FD 06 ... inc $06FB ; 8546 EE FB 06 ... lda #$00 ; 8549 A9 00 .. sta $06FC ; 854B 8D FC 06 ... jmp enable_keyboard_irq ; 854E 4C 54 85 LT. ; ---------------------------------------------------------------------------- L8551: inc $06FC ; 8551 EE FC 06 ... ; $C0 = regular keypress, break keypress enable_keyboard_irq: lda #$C0 ; 8554 A9 C0 .. sta IRQEN ; 8556 8D 0E D2 ... cli ; 8559 58 X ; 8 = silent (0 would be a click) silence_console_speaker: lda #$08 ; 855A A9 08 .. sta CONSOL ; 855C 8D 1F D0 ... ldx #$FF ; 855F A2 FF .. ; carry set = not pressed, clear = pressed check_start_key: lda CONSOL ; 8561 AD 1F D0 ... sta zp_temp1 ; 8564 85 CB .. lsr zp_temp1 ; 8566 46 CB F. bcs check_select_key ; 8568 B0 09 .. lda start_key_enabled ; 856A AD C8 06 ... beq check_select_key ; 856D F0 04 .. txs ; 856F 9A . jmp (start_key_vec) ; 8570 6C C4 06 l.. ; ---------------------------------------------------------------------------- ; carry set = not pressed, clear = pressed check_select_key: lsr zp_temp1 ; 8573 46 CB F. bcs check_option_key ; 8575 B0 09 .. lda select_key_enabled ; 8577 AD C7 06 ... beq check_option_key ; 857A F0 04 .. txs ; 857C 9A . jmp (select_key_vec) ; 857D 6C C2 06 l.. ; ---------------------------------------------------------------------------- ; carry set = not pressed, clear = pressed check_option_key: lsr zp_temp1 ; 8580 46 CB F. bcs no_consol_pressed ; 8582 B0 09 .. lda option_key_enabled ; 8584 AD C6 06 ... beq no_consol_pressed ; 8587 F0 04 .. txs ; 8589 9A . jmp (option_key_vec) ; 858A 6C C0 06 l.. ; ---------------------------------------------------------------------------- ; this probably is what rotates the PLAYER SPEED prompt colors. not sure what it's doing with the page 6 vectors. no_consol_pressed: ldx $0618 ; 858D AE 18 06 ... cpx #$18 ; 8590 E0 18 .. bne L859C ; 8592 D0 08 .. lda #$00 ; 8594 A9 00 .. sta $0618 ; 8596 8D 18 06 ... jmp XITVBV ; 8599 4C 62 E4 Lb. ; ---------------------------------------------------------------------------- L859C: inc $0618 ; 859C EE 18 06 ... inc $0618 ; 859F EE 18 06 ... lda page6_vectors+1,x ; 85A2 BD 01 06 ... beq no_consol_pressed ; 85A5 F0 E6 .. sta $06E5 ; 85A7 8D E5 06 ... lda page6_vectors,x ; 85AA BD 00 06 ... sta $06E4 ; 85AD 8D E4 06 ... jsr L06E3 ; 85B0 20 E3 06 .. jmp no_consol_pressed ; 85B3 4C 8D 85 L.. ; ---------------------------------------------------------------------------- ; used for color-shifting objects like electrocution, walls, and the bonus counter. every frame, the next one of these is stored in rot_color. rotating_colors: .byte $1A,$96,$28,$66,$C6,$56,$0E,$F6 ; 85B6 1A 96 28 66 C6 56 0E F6 ..(f.V.. ; ---------------------------------------------------------------------------- ; X/Y movement, indexed by joystick_state << 1, each entry is XXYY, $FF is -1 movement_direction_table: .word $0000,$0000,$0000,$0000 ; 85BE 00 00 00 00 00 00 00 00 ........ .word $0000,$0101,$FF01,$0001 ; 85C6 00 00 01 01 01 FF 01 00 ........ .word $0000,$01FF,$FFFF,$00FF ; 85CE 00 00 FF 01 FF FF FF 00 ........ .word $0000,$0100,$FF00 ; 85D6 00 00 00 01 00 FF ...... .byte $00 ; 85DC 00 . ; 1-indexed page6_initial_vectors_minus_one: .byte $00 ; 85DD 00 . ; copied into page 6 by init_hardware page6_initial_vectors: .addr check_consol ; 85DE C8 88 .. .addr stub ; 85E0 05 84 .. .addr stub ; 85E2 05 84 .. .addr stub ; 85E4 05 84 .. .addr stub ; 85E6 05 84 .. .addr stub ; 85E8 05 84 .. .addr stub ; 85EA 05 84 .. .addr check_falling_1 ; 85EC 00 98 .. .addr position_missiles ; 85EE 93 82 .. .addr bullet_logic ; 85F0 69 8E i. .addr check_falling_2 ; 85F2 00 89 .. .addr snd_player_entry ; 85F4 57 81 W. ; ---------------------------------------------------------------------------- zero_filler_85f6: .byte $00,$00,$00,$00,$00,$00,$00,$00 ; 85F6 00 00 00 00 00 00 00 00 ........ .byte $00,$00 ; 85FE 00 00 .. ; ---------------------------------------------------------------------------- ; convert the 3-byte integer stored at num_in to screen codes, store into memory pointed to by num_out. num_in is modified. print_number: ldx #$00 ; 8600 A2 00 .. ldy #$00 ; 8602 A0 00 .. stx num_tmp ; 8604 8E 65 06 .e. ; starts at 0, gets added to next_digit: lda #$10 ; 8607 A9 10 .. clc ; 8609 18 . adc num_color ; 860A 65 D5 e. sta (num_out),y ; 860C 91 D3 .. L860E: sec ; 860E 38 8 lda num_in ; 860F A5 D0 .. sbc pnum_subtractors,x ; 8611 FD 02 87 ... sta num_in ; 8614 85 D0 .. lda num_in+1 ; 8616 A5 D1 .. sbc pnum_subtractors+1,x ; 8618 FD 03 87 ... sta num_in+1 ; 861B 85 D1 .. lda num_in+2 ; 861D A5 D2 .. sbc pnum_subtractors+2,x ; 861F FD 04 87 ... sta num_in+2 ; 8622 85 D2 .. bcc L8633 ; 8624 90 0D .. lda (num_out),y ; 8626 B1 D3 .. clc ; 8628 18 . adc #$01 ; 8629 69 01 i. sta (num_out),y ; 862B 91 D3 .. sta num_tmp ; 862D 8D 65 06 .e. jmp L860E ; 8630 4C 0E 86 L.. ; ---------------------------------------------------------------------------- L8633: clc ; 8633 18 . lda pnum_subtractors,x ; 8634 BD 02 87 ... adc num_in ; 8637 65 D0 e. sta num_in ; 8639 85 D0 .. lda pnum_subtractors+1,x ; 863B BD 03 87 ... adc num_in+1 ; 863E 65 D1 e. sta num_in+1 ; 8640 85 D1 .. lda pnum_subtractors+2,x ; 8642 BD 04 87 ... adc num_in+2 ; 8645 65 D2 e. sta num_in+2 ; 8647 85 D2 .. lda num_tmp ; 8649 AD 65 06 .e. bne L865C ; 864C D0 0E .. lda (num_out),y ; 864E B1 D3 .. and #$0F ; 8650 29 0F ). bne L865C ; 8652 D0 08 .. cpy #$05 ; 8654 C0 05 .. beq pnum_done ; 8656 F0 0F .. lda #$00 ; 8658 A9 00 .. sta (num_out),y ; 865A 91 D3 .. L865C: cpx #$0F ; 865C E0 0F .. beq pnum_done ; 865E F0 07 .. inx ; 8660 E8 . inx ; 8661 E8 . inx ; 8662 E8 . iny ; 8663 C8 . jmp next_digit ; 8664 4C 07 86 L.. ; ---------------------------------------------------------------------------- pnum_done: rts ; 8667 60 ` ; ---------------------------------------------------------------------------- print_score: lda #$F5 ; 8668 A9 F5 .. sta num_out ; 866A 85 D3 .. lda #$3D ; 866C A9 3D .= sta num_out+1 ; 866E 85 D4 .. ldx #$03 ; 8670 A2 03 .. ; number_of_users should be score-1 here. ps_loop:lda number_of_users,x ; 8672 BD FF 06 ... sta tmp_sprite_height,x ; 8675 95 CF .. dex ; 8677 CA . bne ps_loop ; 8678 D0 F8 .. jsr print_number ; 867A 20 00 86 .. rts ; 867D 60 ` ; ---------------------------------------------------------------------------- ; print remaining bonus time; work_level_points_per_bomb should read work_level_time_bonus-1 print_bonus: lda #$09 ; 867E A9 09 .. sta num_out ; 8680 85 D3 .. lda #$3E ; 8682 A9 3E .> sta num_out+1 ; 8684 85 D4 .. ldx #$03 ; 8686 A2 03 .. pb_loop:lda work_level_points_per_bomb,x ; 8688 BD 90 07 ... sta tmp_sprite_height,x ; 868B 95 CF .. dex ; 868D CA . bne pb_loop ; 868E D0 F8 .. jsr print_number ; 8690 20 00 86 .. rts ; 8693 60 ` ; ---------------------------------------------------------------------------- ; bottom 2 GR.1 lines on the game board update_status_window: lda #$00 ; 8694 A9 00 .. sta HSCROL ; 8696 8D 04 D4 ... ldx #$28 ; 8699 A2 28 .( L869B: lda L86D9,x ; 869B BD D9 86 ... sec ; 869E 38 8 sbc #$20 ; 869F E9 20 . sta $3DE7,x ; 86A1 9D E7 3D ..= dex ; 86A4 CA . bne L869B ; 86A5 D0 F4 .. ; 1 to 4 show_current_player: lda current_user ; 86A7 AD FE 06 ... ora #$10 ; 86AA 09 10 .. sta $3DE9 ; 86AC 8D E9 3D ..= lda work_level_desc ; 86AF AD 80 07 ... sta $3DED ; 86B2 8D ED 3D ..= lda work_level_desc+1 ; 86B5 AD 81 07 ... sta $3DEE ; 86B8 8D EE 3D ..= ; up to 6 jumpmen, and a + if lives > 6. char $C1 = jumpman icon, $CB = plus sign show_lives_icons: ldy #$00 ; 86BB A0 00 .. lda #$C1 ; 86BD A9 C1 .. L86BF: cpy #$07 ; 86BF C0 07 .. bcs L86CE ; 86C1 B0 0B .. cpy lives ; 86C3 CC 0A 07 ... beq L86D3 ; 86C6 F0 0B .. sta $3DFD,y ; 86C8 99 FD 3D ..= iny ; 86CB C8 . bne L86BF ; 86CC D0 F1 .. L86CE: lda #$CB ; 86CE A9 CB .. sta $3DFC,y ; 86D0 99 FC 3D ..= L86D3: jsr print_score ; 86D3 20 68 86 h. jsr print_bonus ; 86D6 20 7E 86 ~. L86D9: rts ; 86D9 60 ` ; ---------------------------------------------------------------------------- ; 40 bytes, or 2 GR.1 lines of screen codes status_window_contents: .byte $20,$30,$20,$8C,$7D,$30,$30,$20 ; 86DA 20 30 20 8C 7D 30 30 20 0 .}00 .byte $D3,$C3,$CF,$D2,$C5,$20,$20,$20 ; 86E2 D3 C3 CF D2 C5 20 20 20 ..... .byte $20,$20,$20,$20,$20,$20,$20,$20 ; 86EA 20 20 20 20 20 20 20 20 .byte $20,$20,$20,$20,$C2,$CF,$CE,$D5 ; 86F2 20 20 20 20 C2 CF CE D5 .... .byte $D3,$20,$20,$20,$20,$20,$20,$20 ; 86FA D3 20 20 20 20 20 20 20 . ; 3 bytes per table entry pnum_subtractors: .byte $A0,$86,$01,$10,$27,$00,$E8,$03 ; 8702 A0 86 01 10 27 00 E8 03 ....'... .byte $00,$64,$00,$00,$0A,$00,$00,$01 ; 870A 00 64 00 00 0A 00 00 01 .d...... .byte $00,$00 ; 8712 00 00 .. ; ---------------------------------------------------------------------------- ; clear the gameboard screen memory (called before drawing a level, natch) clear_screen_mem: ldx #$10 ; 8714 A2 10 .. lda SAVMSC+1 ; 8716 A5 59 .Y sta zp_temp2+1 ; 8718 85 AF .. lda #$00 ; 871A A9 00 .. sta zp_temp2 ; 871C 85 AE .. tay ; 871E A8 . csm_loop: sta (zp_temp2),y ; 871F 91 AE .. iny ; 8721 C8 . bne csm_loop ; 8722 D0 FB .. inc zp_temp2+1 ; 8724 E6 AF .. dex ; 8726 CA . bne csm_loop ; 8727 D0 F6 .. rts ; 8729 60 ` ; ---------------------------------------------------------------------------- ; misc stuff, called from enable_joystick prepare_level: lda #$09 ; 872A A9 09 .. sta current_speed ; 872C 8D 24 06 .$. ldx #$05 ; 872F A2 05 .. lda #$00 ; 8731 A9 00 .. sta playing_level ; 8733 8D 27 06 .'. L8736: sta $0681,x ; 8736 9D 81 06 ... sta player_enabled,x ; 8739 9D 68 06 .h. sta $069A,x ; 873C 9D 9A 06 ... jsr hide_player ; 873F 20 B8 8D .. dex ; 8742 CA . bne L8736 ; 8743 D0 F1 .. lda #$2B ; 8745 A9 2B .+ sta zp_temp4 ; 8747 85 B8 .. lda #$00 ; 8749 A9 00 .. sta zp_temp3 ; 874B 85 B7 .. tay ; 874D A8 . ldx #$05 ; 874E A2 05 .. L8750: sta (zp_temp3),y ; 8750 91 B7 .. iny ; 8752 C8 . bne L8750 ; 8753 D0 FB .. inc zp_temp4 ; 8755 E6 B8 .. dex ; 8757 CA . bne L8750 ; 8758 D0 F6 .. rts ; 875A 60 ` ; ---------------------------------------------------------------------------- ; set all AUDFx to 0 silence_audio: ldx #$00 ; 875B A2 00 .. lda #$00 ; 875D A9 00 .. sa_loop:sta $0640,x ; 875F 9D 40 06 .@. sta $0641,x ; 8762 9D 41 06 .A. sta $0660,x ; 8765 9D 60 06 .`. sta AUDF1,x ; 8768 9D 00 D2 ... jsr store_audc ; 876B 20 C6 8D .. inx ; 876E E8 . inx ; 876F E8 . cpx #$08 ; 8770 E0 08 .. bne sa_loop ; 8772 D0 EB .. rts ; 8774 60 ` ; ---------------------------------------------------------------------------- ; called after level-intro music is finished playing enable_joystick: ldx #$08 ; 8775 A2 08 .. ej_loop:lda #$E6 ; 8777 A9 E6 .. sta work_level_desc,x ; 8779 9D 80 07 ... lda #$06 ; 877C A9 06 .. sta work_level_desc+1,x ; 877E 9D 81 07 ... dex ; 8781 CA . dex ; 8782 CA . bne ej_loop ; 8783 D0 F2 .. stx joystick_disabled ; 8785 8E 32 06 .2. stx snd_lock ; 8788 8E 2F 06 ./. stx work_level_bullet_max ; 878B 8E 8B 07 ... jsr prepare_level ; 878E 20 2A 87 *. jsr silence_audio ; 8791 20 5B 87 [. lda #$30 ; 8794 A9 30 .0 sta SAVMSC+1 ; 8796 85 59 .Y ; priority $11: pl0-3, pf0-3, bak (and enable 5th player from the missiles) [redundant? init_set_prior sets this, nothing appears to change it] set_prior: lda #$11 ; 8798 A9 11 .. sta PRIOR ; 879A 8D 1B D0 ... jmp clear_pm_mem ; 879D 4C A8 88 L.. ; ---------------------------------------------------------------------------- ; check whether Jumpman just touched a bomb (RTS if not) check_bomb_coll: lda sav_p0pf ; 87A0 AD B4 06 ... and #$04 ; 87A3 29 04 ). bne bomb_pickup ; 87A5 D0 01 .. rts ; 87A7 60 ` ; ---------------------------------------------------------------------------- ; Jumpman just touched a bomb, award points, play sfx_bomb_pickup, make the bomb disappear, etc. bomb_pickup: lda player_x_pos ; 87A8 AD 7E 06 .~. clc ; 87AB 18 . adc work_level_fudge_x ; 87AC 6D 8E 07 m.. and #$E0 ; 87AF 29 E0 ). sta bombloc ; 87B1 85 B6 .. clc ; 87B3 18 . lda player_y_pos ; 87B4 AD 83 06 ... adc work_level_fudge_y ; 87B7 6D 8F 07 m.. and #$E0 ; 87BA 29 E0 ). lsr a ; 87BC 4A J lsr a ; 87BD 4A J lsr a ; 87BE 4A J lsr a ; 87BF 4A J ora bombloc ; 87C0 05 B6 .. sta bombloc ; 87C2 85 B6 .. ; screen X range approx $32 to $C6, Y $18 to $C0, meaning the coarse grid visible screen range is X 1-6, Y 0-6 coarse_grid: lda work_level_bomblist ; 87C4 AD 9A 07 ... sta blistptr ; 87C7 85 B4 .. lda work_level_bomblist+1 ; 87C9 AD 9B 07 ... sta blistptr+1 ; 87CC 85 B5 .. ldy #$00 ; 87CE A0 00 .. ; set Y to the index of the current bomb (or rts if we can't find it) search_bomblist: lda (blistptr),y ; 87D0 B1 B4 .. cmp #$FF ; 87D2 C9 FF .. bne bl_ok ; 87D4 D0 01 .. rts ; 87D6 60 ` ; ---------------------------------------------------------------------------- bl_ok: cmp bombloc ; 87D7 C5 B6 .. beq bomb_found ; 87D9 F0 05 .. iny ; 87DB C8 . iny ; 87DC C8 . jmp search_bomblist ; 87DD 4C D0 87 L.. ; ---------------------------------------------------------------------------- bomb_found: lda work_level_map_bombs ; 87E0 AD 98 07 ... sta $B0 ; 87E3 85 B0 .. lda work_level_map_bombs+1 ; 87E5 AD 99 07 ... sta $B1 ; 87E8 85 B1 .. ; multiply Y by 1.5 (only works because Y will always be even at this point) mul_y: tya ; 87EA 98 . sta bomb_idx ; 87EB 85 B2 .. lsr a ; 87ED 4A J clc ; 87EE 18 . adc bomb_idx ; 87EF 65 B2 e. tay ; 87F1 A8 . ; store actual bomb coordinates (not the coarse ones) for bomb subs to use store_bomb_coords: lda ($B0),y ; 87F2 B1 B0 .. sta $06DC ; 87F4 8D DC 06 ... iny ; 87F7 C8 . lda ($B0),y ; 87F8 B1 B0 .. sta $06DD ; 87FA 8D DD 06 ... lda #$92 ; 87FD A9 92 .. sta snd_ptr ; 87FF 8D 3C 06 .<. lda #$88 ; 8802 A9 88 .. sta snd_ptr+1 ; 8804 8D 3D 06 .=. lda #$08 ; 8807 A9 08 .. jsr cue_sfx_jv ; 8809 20 06 80 .. ldy bomb_idx ; 880C A4 B2 .. iny ; 880E C8 . lda (blistptr),y ; 880F B1 B4 .. beq call_bomb_sub ; 8811 F0 43 .C and #$F0 ; 8813 29 F0 ). beq check_ind_sub ; 8815 F0 1A .. lsr a ; 8817 4A J lsr a ; 8818 4A J lsr a ; 8819 4A J tay ; 881A A8 . ; some bombs redraw parts of the level (e.g. disappearing platforms on level01) change_map: lda work_level_map_changes ; 881B AD 9C 07 ... sta $B0 ; 881E 85 B0 .. lda work_level_map_changes+1 ; 8820 AD 9D 07 ... sta $B1 ; 8823 85 B1 .. lda ($B0),y ; 8825 B1 B0 .. sta dm_progctr ; 8827 85 C0 .. iny ; 8829 C8 . lda ($B0),y ; 882A B1 B0 .. sta dm_progctr+1 ; 882C 85 C1 .. jsr draw_map_jv ; 882E 20 00 80 .. ; see if this bomb calls an indirect sub (none of them do in this game, this is useless code) check_ind_sub: ldy bomb_idx ; 8831 A4 B2 .. iny ; 8833 C8 . lda (blistptr),y ; 8834 B1 B4 .. beq call_bomb_sub ; 8836 F0 1E .. and #$0F ; 8838 29 0F ). beq call_bomb_sub ; 883A F0 1A .. asl a ; 883C 0A . tay ; 883D A8 . ; this would call a subroutine via pointer-to-pointer, but I'm almost 100% certain it's never used (maybe a holdover from original Jumpman?) call_bomb_indirect_sub: lda work_level_indirect_subs ; 883E AD 9E 07 ... sta $B0 ; 8841 85 B0 .. lda work_level_indirect_subs+1 ; 8843 AD 9F 07 ... sta $B1 ; 8846 85 B1 .. lda ($B0),y ; 8848 B1 B0 .. sta $06E4 ; 884A 8D E4 06 ... iny ; 884D C8 . lda ($B0),y ; 884E B1 B0 .. sta $06E5 ; 8850 8D E5 06 ... jsr L06E3 ; 8853 20 E3 06 .. ; call bomb pickup subroutine for this level (which might just do an RTS if there's no special action) call_bomb_sub: lda work_level_sub_bomb ; 8856 AD A0 07 ... sta $06E4 ; 8859 8D E4 06 ... lda work_level_sub_bomb+1 ; 885C AD A1 07 ... sta $06E5 ; 885F 8D E5 06 ... jsr L06E3 ; 8862 20 E3 06 .. ; add points to score for picking up bomb (theoretically different on every level, but really $64 aka 100 for all of them) bomb_add_points: clc ; 8865 18 . lda score ; 8866 AD 00 07 ... adc work_level_points_per_bomb ; 8869 6D 90 07 m.. sta score ; 886C 8D 00 07 ... bcc erase_bomb ; 886F 90 08 .. inc score+1 ; 8871 EE 01 07 ... bne erase_bomb ; 8874 D0 03 .. inc score+2 ; 8876 EE 02 07 ... ; make the bomb disappear by drawing sh_blank in its location erase_bomb: lda #$D9 ; 8879 A9 D9 .. sta dm_progctr ; 887B 85 C0 .. lda #$06 ; 887D A9 06 .. sta dm_progctr+1 ; 887F 85 C1 .. jsr draw_map_jv ; 8881 20 00 80 .. jsr check_extra_life_jv ; 8884 20 0C 80 .. dec work_level_num_bombs ; 8887 CE 8A 07 ... ; wait for bomb to really disappear wait_bomb: lda sav_p0pf ; 888A AD B4 06 ... and #$04 ; 888D 29 04 ). bne wait_bomb ; 888F D0 F9 .. rts ; 8891 60 ` ; ---------------------------------------------------------------------------- ; played when a bomb is picked up sfx_bomb_pickup: .byte $01,$A6,$00,$1E,$03,$28,$03,$1E ; 8892 01 A6 00 1E 03 28 03 1E .....(.. .byte $03,$28,$03,$1E,$03,$28,$03,$1E ; 889A 03 28 03 1E 03 28 03 1E .(...(.. .byte $03,$28,$03,$00,$00,$00 ; 88A2 03 28 03 00 00 00 .(.... ; ---------------------------------------------------------------------------- ; clear P/M memory, called from enable_joystick clear_pm_mem: ldx #$00 ; 88A8 A2 00 .. txa ; 88AA 8A . clr_loop: sta $2B00,x ; 88AB 9D 00 2B ..+ sta $2C00,x ; 88AE 9D 00 2C .., sta $2D00,x ; 88B1 9D 00 2D ..- sta $2E00,x ; 88B4 9D 00 2E ... sta $2F00,x ; 88B7 9D 00 2F ../ dex ; 88BA CA . bne clr_loop ; 88BB D0 EE .. rts ; 88BD 60 ` ; ---------------------------------------------------------------------------- zero_filler_88be: .byte $00,$00,$00,$00,$00,$00,$00,$00 ; 88BE 00 00 00 00 00 00 00 00 ........ .byte $00,$00 ; 88C6 00 00 .. ; ---------------------------------------------------------------------------- check_consol: lda player_delta_x ; 88C8 AD 30 06 .0. ora player_delta_y ; 88CB 0D 31 06 .1. bne L88DC ; 88CE D0 0C .. lda CONSOL ; 88D0 AD 1F D0 ... and #$07 ; 88D3 29 07 ). cmp #$07 ; 88D5 C9 07 .. bne L88DC ; 88D7 D0 03 .. jmp L88E0 ; 88D9 4C E0 88 L.. ; ---------------------------------------------------------------------------- L88DC: lda #$00 ; 88DC A9 00 .. sta jiffy_timer_3_hi ; 88DE 85 A2 .. L88E0: lda $A0 ; 88E0 A5 A0 .. bne L88E7 ; 88E2 D0 03 .. sta jiffy_timer_3_hi ; 88E4 85 A2 .. L88E6: rts ; 88E6 60 ` ; ---------------------------------------------------------------------------- L88E7: lda jiffy_timer_3_hi ; 88E7 A5 A2 .. cmp #$28 ; 88E9 C9 28 .( bcc L88E6 ; 88EB 90 F9 .. lda #$00 ; 88ED A9 00 .. sta $A0 ; 88EF 85 A0 .. sta jiffy_timer_3_hi ; 88F1 85 A2 .. ldx #$FF ; 88F3 A2 FF .. txs ; 88F5 9A . jmp init_game ; 88F6 4C 00 90 L.. ; ---------------------------------------------------------------------------- zero_filler_88f9: .byte $00,$00,$00,$00,$00,$00,$00 ; 88F9 00 00 00 00 00 00 00 ....... ; ---------------------------------------------------------------------------- ; called via vector in page 6 check_falling_2: lda start_falling_flag ; 8900 AD 21 06 .!. beq L890F ; 8903 F0 0A .. lda falling_flag ; 8905 AD 23 06 .#. cmp #$01 ; 8908 C9 01 .. beq L8910 ; 890A F0 04 .. jmp L89F3 ; 890C 4C F3 89 L.. ; ---------------------------------------------------------------------------- L890F: rts ; 890F 60 ` ; ---------------------------------------------------------------------------- L8910: lda $06EE ; 8910 AD EE 06 ... bne L8945 ; 8913 D0 30 .0 inc $06EE ; 8915 EE EE 06 ... lda #$02 ; 8918 A9 02 .. sta current_speed ; 891A 8D 24 06 .$. sta $067F ; 891D 8D 7F 06 ... lda #$00 ; 8920 A9 00 .. sta playing_level ; 8922 8D 27 06 .'. sta $06E9 ; 8925 8D E9 06 ... sta $06EA ; 8928 8D EA 06 ... lda RANDOM ; 892B AD 0A D2 ... and #$0F ; 892E 29 0F ). sta $0688 ; 8930 8D 88 06 ... inc $0688 ; 8933 EE 88 06 ... play_sfx_death: lda #$60 ; 8936 A9 60 .` sta snd_slot_priority ; 8938 8D 3E 06 .>. lda #$8A ; 893B A9 8A .. sta snd_slot_timer ; 893D 8D 3F 06 .?. lda #$07 ; 8940 A9 07 .. jsr cue_sfx_lowprior_jv ; 8942 20 03 80 .. L8945: lda player_y_pos ; 8945 AD 83 06 ... cmp #$C6 ; 8948 C9 C6 .. bcc L895D ; 894A 90 11 .. lda #$00 ; 894C A9 00 .. sta AUDF1 ; 894E 8D 00 D2 ... sta AUDC1 ; 8951 8D 01 D2 ... sta $06EF ; 8954 8D EF 06 ... inc falling_flag ; 8957 EE 23 06 .#. jmp L89F3 ; 895A 4C F3 89 L.. ; ---------------------------------------------------------------------------- L895D: lda #$70 ; 895D A9 70 .p sta $0801 ; 895F 8D 01 08 ... sta game_display_list ; 8962 8D 81 08 ... lda $06EA ; 8965 AD EA 06 ... bne L89A9 ; 8968 D0 3F .? L896A: inc player_y_pos ; 896A EE 83 06 ... inc player_y_pos ; 896D EE 83 06 ... lda player_y_pos ; 8970 AD 83 06 ... sta AUDF1 ; 8973 8D 00 D2 ... lda #$A3 ; 8976 A9 A3 .. sta AUDC1 ; 8978 8D 01 D2 ... lda sav_p0pf ; 897B AD B4 06 ... and #$01 ; 897E 29 01 ). bne falling_bounce ; 8980 D0 01 .. rts ; 8982 60 ` ; ---------------------------------------------------------------------------- ; this looks like it hurts... falling_bounce: lda RANDOM ; 8983 AD 0A D2 ... and #$03 ; 8986 29 03 ). beq falling_bounce ; 8988 F0 F9 .. sta $06E9 ; 898A 8D E9 06 ... lda #$00 ; 898D A9 00 .. sta $06EA ; 898F 8D EA 06 ... lda #$50 ; 8992 A9 50 .P sta $0801 ; 8994 8D 01 08 ... sta game_display_list ; 8997 8D 81 08 ... play_sfx_bounce_1: lda #$4B ; 899A A9 4B .K sta snd_slot_priority ; 899C 8D 3E 06 .>. lda #$8A ; 899F A9 8A .. sta snd_slot_timer ; 89A1 8D 3F 06 .?. lda #$04 ; 89A4 A9 04 .. jsr cue_sfx_lowprior_jv ; 89A6 20 03 80 .. L89A9: ldx $06EA ; 89A9 AE EA 06 ... cpx #$09 ; 89AC E0 09 .. bne L89B8 ; 89AE D0 08 .. lda #$00 ; 89B0 A9 00 .. sta $06EA ; 89B2 8D EA 06 ... jmp L896A ; 89B5 4C 6A 89 Lj. ; ---------------------------------------------------------------------------- L89B8: ldy falling_table_1,x ; 89B8 BC 39 8A .9. lda $06E9 ; 89BB AD E9 06 ... cmp #$01 ; 89BE C9 01 .. beq L89D1 ; 89C0 F0 0F .. ldy #$00 ; 89C2 A0 00 .. cmp #$02 ; 89C4 C9 02 .. beq L89D1 ; 89C6 F0 09 .. lda falling_table_1,x ; 89C8 BD 39 8A .9. eor #$FF ; 89CB 49 FF I. clc ; 89CD 18 . adc #$01 ; 89CE 69 01 i. tay ; 89D0 A8 . L89D1: clc ; 89D1 18 . tya ; 89D2 98 . adc player_x_pos ; 89D3 6D 7E 06 m~. sta player_x_pos ; 89D6 8D 7E 06 .~. lda falling_table_2,x ; 89D9 BD 42 8A .B. clc ; 89DC 18 . adc player_y_pos ; 89DD 6D 83 06 m.. sta player_y_pos ; 89E0 8D 83 06 ... sta AUDF1 ; 89E3 8D 00 D2 ... inc $06EA ; 89E6 EE EA 06 ... clc ; 89E9 18 . lda $0620 ; 89EA AD 20 06 . . adc #$12 ; 89ED 69 12 i. sta $0688 ; 89EF 8D 88 06 ... rts ; 89F2 60 ` ; ---------------------------------------------------------------------------- L89F3: lda falling_flag ; 89F3 AD 23 06 .#. cmp #$02 ; 89F6 C9 02 .. beq L89FB ; 89F8 F0 01 .. rts ; 89FA 60 ` ; ---------------------------------------------------------------------------- L89FB: lda $06EF ; 89FB AD EF 06 ... bne L8A16 ; 89FE D0 16 .. sta jiffy_timer_2 ; 8A00 8D 1B 06 ... inc $06EF ; 8A03 EE EF 06 ... lda #$00 ; 8A06 A9 00 .. jsr cue_music_jv ; 8A08 20 18 80 .. lda #$04 ; 8A0B A9 04 .. sta current_speed ; 8A0D 8D 24 06 .$. lda #$16 ; 8A10 A9 16 .. sta $0688 ; 8A12 8D 88 06 ... rts ; 8A15 60 ` ; ---------------------------------------------------------------------------- L8A16: lda $0663 ; 8A16 AD 63 06 .c. beq L8A25 ; 8A19 F0 0A .. lda #$16 ; 8A1B A9 16 .. clc ; 8A1D 18 . adc $061F ; 8A1E 6D 1F 06 m.. sta $0688 ; 8A21 8D 88 06 ... rts ; 8A24 60 ` ; ---------------------------------------------------------------------------- L8A25: lda #$09 ; 8A25 A9 09 .. sta current_speed ; 8A27 8D 24 06 .$. lda #$00 ; 8A2A A9 00 .. sta falling_flag ; 8A2C 8D 23 06 .#. sta player_x_pos ; 8A2F 8D 7E 06 .~. dec lives ; 8A32 CE 0A 07 ... sta $06EE ; 8A35 8D EE 06 ... rts ; 8A38 60 ` ; ---------------------------------------------------------------------------- falling_table_1: .byte $02,$02,$02,$02,$02,$02,$00,$00 ; 8A39 02 02 02 02 02 02 00 00 ........ .byte $00 ; 8A41 00 . falling_table_2: .byte $FE,$FE,$00,$00,$02,$02,$02,$02 ; 8A42 FE FE 00 00 02 02 02 02 ........ .byte $02 ; 8A4A 02 . ; used when jumpman is falling? sfx_bounce_1: .byte $01,$8E,$00,$30,$01,$01,$8B,$00 ; 8A4B 01 8E 00 30 01 01 8B 00 ...0.... .byte $40,$01,$01,$88,$00,$50,$01,$01 ; 8A53 40 01 01 88 00 50 01 01 @....P.. .byte $85,$00,$60,$01,$00 ; 8A5B 85 00 60 01 00 ..`.. ; jumpman hit by bullet or started falling sfx_death: .byte $01,$C8,$00,$0A,$02,$FA,$02,$14 ; 8A60 01 C8 00 0A 02 FA 02 14 ........ .byte $02,$F0,$02,$1E,$02,$E8,$02,$28 ; 8A68 02 F0 02 1E 02 E8 02 28 .......( .byte $02,$DC,$02,$32,$02,$D2,$02,$3C ; 8A70 02 DC 02 32 02 D2 02 3C ...2...< .byte $02,$C8,$02,$00,$00,$00,$00,$00 ; 8A78 02 C8 02 00 00 00 00 00 ........ ; ---------------------------------------------------------------------------- play_sfx_climb: lda $061F ; 8A80 AD 1F 06 ... bne L8A94 ; 8A83 D0 0F .. lda #$97 ; 8A85 A9 97 .. sta snd_slot_priority ; 8A87 8D 3E 06 .>. lda #$8A ; 8A8A A9 8A .. sta snd_slot_timer ; 8A8C 8D 3F 06 .?. lda #$02 ; 8A8F A9 02 .. jsr cue_sfx_lowprior_jv ; 8A91 20 03 80 .. L8A94: jmp L9925 ; 8A94 4C 25 99 L%. ; ---------------------------------------------------------------------------- ; climbing up/down a ladder (not ropes) sfx_climb: .byte $01,$81,$00,$04,$01,$00,$00,$00 ; 8A97 01 81 00 04 01 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; 8A9F 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; 8AA7 00 00 00 00 00 00 00 00 ........ .byte $00 ; 8AAF 00 . sfx_option_pressed: .byte $01,$A4,$00,$3C,$02,$00,$00,$00 ; 8AB0 01 A4 00 3C 02 00 00 00 ...<.... .byte $00,$00,$00,$00,$00,$00,$00,$00 ; 8AB8 00 00 00 00 00 00 00 00 ........ ; ---------------------------------------------------------------------------- cart_entry_point: ldx #$00 ; 8AC0 A2 00 .. lda #$00 ; 8AC2 A9 00 .. ; clear pages 6 and 7 init_loop: sta page6_vectors,x ; 8AC4 9D 00 06 ... sta score,x ; 8AC7 9D 00 07 ... inx ; 8ACA E8 . bne init_loop ; 8ACB D0 F7 .. jsr init_hardware ; 8ACD 20 7C 83 |. lda #$DD ; 8AD0 A9 DD .. sta dlist_shadow_lo ; 8AD2 8D AC 06 ... lda #$8A ; 8AD5 A9 8A .. sta dlist_shadow_hi ; 8AD7 8D AD 06 ... jmp init_game ; 8ADA 4C 00 90 L.. ; ---------------------------------------------------------------------------- ; yet another jump-to-itself empty display list blank_dlist_8add: .byte $41,$DD,$8A ; 8ADD 41 DD 8A A.. ; ---------------------------------------------------------------------------- ; show blank screen with empty display list setup_blank_dlist: lda #$EB ; 8AE0 A9 EB .. sta dlist_shadow_lo ; 8AE2 8D AC 06 ... lda #$8A ; 8AE5 A9 8A .. sta dlist_shadow_hi ; 8AE7 8D AD 06 ... rts ; 8AEA 60 ` ; ---------------------------------------------------------------------------- ; another jump-to-itself empty display list blank_dlist_8aeb: .byte $41,$EB,$8A ; 8AEB 41 EB 8A A.. zero_filler_8aee: .byte $00,$00,$00,$00,$00,$00,$00,$00 ; 8AEE 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; 8AF6 00 00 00 00 00 00 00 00 ........ ; ---------------------------------------------------------------------------- cart_start_stub: clc ; 8AFE 18 . rts ; 8AFF 60 ` ; ---------------------------------------------------------------------------- zero_filler_8b00: .byte $00,$00,$00,$00,$00,$00,$00,$00 ; 8B00 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; 8B08 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; 8B10 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; 8B18 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00 ; 8B20 00 00 00 ... ; ---------------------------------------------------------------------------- ; various levels use this as their init, or use an init that calls this special_init: ldx #$20 ; 8B23 A2 20 . lda #$00 ; 8B25 A9 00 .. ; clear memory from $0760 to $077f si_clear: sta bullet_y_delta+1,x ; 8B27 9D 5F 07 ._. dex ; 8B2A CA . bne si_clear ; 8B2B D0 FA .. ; special_init that doesn't clear memory. does anything use this entry point? special_init_2: lda work_level_unkn_table0 ; 8B2D AD 94 07 ... sta $AC ; 8B30 85 AC .. lda work_level_unkn_table0+1 ; 8B32 AD 95 07 ... sta $AD ; 8B35 85 AD .. ldy #$00 ; 8B37 A0 00 .. si_loop:lda ($AC),y ; 8B39 B1 AC .. cmp #$FF ; 8B3B C9 FF .. beq si_done ; 8B3D F0 3B .; tax ; 8B3F AA . iny ; 8B40 C8 . lda ($AC),y ; 8B41 B1 AC .. sta $066E,x ; 8B43 9D 6E 06 .n. iny ; 8B46 C8 . lda ($AC),y ; 8B47 B1 AC .. sta $0673,x ; 8B49 9D 73 06 .s. iny ; 8B4C C8 . lda ($AC),y ; 8B4D B1 AC .. sta $0678,x ; 8B4F 9D 78 06 .x. iny ; 8B52 C8 . lda ($AC),y ; 8B53 B1 AC .. sta $067D,x ; 8B55 9D 7D 06 .}. iny ; 8B58 C8 . lda ($AC),y ; 8B59 B1 AC .. sta $0682,x ; 8B5B 9D 82 06 ... iny ; 8B5E C8 . lda ($AC),y ; 8B5F B1 AC .. sta $0687,x ; 8B61 9D 87 06 ... iny ; 8B64 C8 . tya ; 8B65 98 . pha ; 8B66 48 H lda ($AC),y ; 8B67 B1 AC .. ldy pcolor0_table,x ; 8B69 BC 7B 8B .{. sta PCOLR0,y ; 8B6C 99 C0 02 ... pla ; 8B6F 68 h tay ; 8B70 A8 . iny ; 8B71 C8 . lda #$00 ; 8B72 A9 00 .. sta $0696,x ; 8B74 9D 96 06 ... jmp si_loop ; 8B77 4C 39 8B L9. ; ---------------------------------------------------------------------------- si_done:rts ; 8B7A 60 ` ; ---------------------------------------------------------------------------- pcolor0_table: .byte $07,$00,$01,$02,$03 ; 8B7B 07 00 01 02 03 ..... ; ---------------------------------------------------------------------------- ; show scores, called at end of game, also called after beating level 12 (after WELL DONE). $40 in NMIEN = disable DLI, enable VBI scores_screen: lda #$40 ; 8B80 A9 40 .@ sta NMIEN ; 8B82 8D 0E D4 ... lda #$82 ; 8B85 A9 82 .. sta dlist_shadow_lo ; 8B87 8D AC 06 ... lda #$8C ; 8B8A A9 8C .. sta dlist_shadow_hi ; 8B8C 8D AD 06 ... ldx #$06 ; 8B8F A2 06 .. smsg_loop: lda scores_msg,x ; 8B91 BD 7B 8C .{. sta $3006,x ; 8B94 9D 06 30 ..0 dex ; 8B97 CA . bne smsg_loop ; 8B98 D0 F7 .. ldx current_user ; 8B9A AE FE 06 ... ldy struct_user_lives_offsets_minus_one,x; 8B9D BC 88 8C ... ldx #$03 ; 8BA0 A2 03 .. lda lives ; 8BA2 AD 0A 07 ... sta $0713,y ; 8BA5 99 13 07 ... ; number_of_users should be score-1 here. ss_loop:lda number_of_users,x ; 8BA8 BD FF 06 ... sta struct_user_1,y ; 8BAB 99 0B 07 ... dey ; 8BAE 88 . dex ; 8BAF CA . bne ss_loop ; 8BB0 D0 F6 .. lda #$00 ; 8BB2 A9 00 .. sta $AA ; 8BB4 85 AA .. sta $AB ; 8BB6 85 AB .. tay ; 8BB8 A8 . lda users_still_alive ; 8BB9 AD F4 06 ... sta zp_temp2 ; 8BBC 85 AE .. inc zp_temp2 ; 8BBE E6 AE .. ; shows PLAYER (backwards loop) show_reyalp_msg: ldx #$14 ; 8BC0 A2 14 .. reyalp_msg_loop: lda reyalp_msg_minus_one,x ; 8BC2 BD 67 8C .g. sta $3028,y ; 8BC5 99 28 30 .(0 ; replace 10th char with the ASCII player (user) number check_10th: cpx #$0A ; 8BC8 E0 0A .. bne continue_loop ; 8BCA D0 09 .. inc $AA ; 8BCC E6 AA .. lda $AA ; 8BCE A5 AA .. ora #$10 ; 8BD0 09 10 .. sta $3028,y ; 8BD2 99 28 30 .(0 continue_loop: iny ; 8BD5 C8 . dex ; 8BD6 CA . bne reyalp_msg_loop ; 8BD7 D0 E9 .. sty $AD ; 8BD9 84 AD .. ldx $AA ; 8BDB A6 AA .. ldy struct_user_lives_offsets_minus_one,x; 8BDD BC 88 8C ... lda #$00 ; 8BE0 A9 00 .. ; $AF is the character to show after the score (space for alive, cross for dead) store_space: sta zp_temp2+1 ; 8BE2 85 AF .. lda $0713,y ; 8BE4 B9 13 07 ... cmp #$FF ; 8BE7 C9 FF .. ; user still has lives left? check_alive: bne no_cross ; 8BE9 D0 04 .. ; no, show a cross instead of a space not_alive: lda #$5E ; 8BEB A9 5E .^ sta zp_temp2+1 ; 8BED 85 AF .. no_cross: lda L8C84,x ; 8BEF BD 84 8C ... sta num_out ; 8BF2 85 D3 .. lda #$30 ; 8BF4 A9 30 .0 sta num_out+1 ; 8BF6 85 D4 .. ldx #$03 ; 8BF8 A2 03 .. L8BFA: lda struct_user_1,y ; 8BFA B9 0B 07 ... sta tmp_sprite_height,x ; 8BFD 95 CF .. dey ; 8BFF 88 . dex ; 8C00 CA . bne L8BFA ; 8C01 D0 F7 .. jsr print_number_jv ; 8C03 20 09 80 .. lda zp_temp2+1 ; 8C06 A5 AF .. iny ; 8C08 C8 . sta (num_out),y ; 8C09 91 D3 .. ldy $AD ; 8C0B A4 AD .. dec zp_temp2 ; 8C0D C6 AE .. bne show_reyalp_msg ; 8C0F D0 AF .. lda #$96 ; 8C11 A9 96 .. sta COLOR3 ; 8C13 8D C7 02 ... lda #$C6 ; 8C16 A9 C6 .. sta COLOR0 ; 8C18 8D C4 02 ... lda #$08 ; 8C1B A9 08 .. sta COLOR1 ; 8C1D 8D C5 02 ... lda #$52 ; 8C20 A9 52 .R ; set dlist shadow to scores_screen_dlist show_scores_screen: sta dlist_shadow_lo ; 8C22 8D AC 06 ... lda #$8C ; 8C25 A9 8C .. sta dlist_shadow_hi ; 8C27 8D AD 06 ... lda #$8D ; 8C2A A9 8D .. sta dli_vec_shadow_lo ; 8C2C 8D AE 06 ... lda #$8C ; 8C2F A9 8C .. ; dli = score_screen_dli_sr set_score_screen_dli: sta dli_vec_shadow_hi ; 8C31 8D AF 06 ... lda #$02 ; 8C34 A9 02 .. jsr cue_music_jv ; 8C36 20 18 80 .. ; I *think* we're waiting for the music to finish playing... what_are_we_waiting_for: lda $0640 ; 8C39 AD 40 06 .@. ora $0642 ; 8C3C 0D 42 06 .B. ora $0644 ; 8C3F 0D 44 06 .D. ora snd_slot_duration ; 8C42 0D 46 06 .F. bne what_are_we_waiting_for ; 8C45 D0 F2 .. sta jiffy_timer_1 ; 8C47 8D 1A 06 ... ; wait 192 jiffies: 3.2 sec (ntsc), 3.84 sec (pal) wait_3_sec: lda jiffy_timer_1 ; 8C4A AD 1A 06 ... cmp #$C0 ; 8C4D C9 C0 .. bne wait_3_sec ; 8C4F D0 F9 .. rts ; 8C51 60 ` ; ---------------------------------------------------------------------------- ; a GR.2-ish DL, with DLIs, screen mem at $3000, for player scores screen scores_screen_dlist: .byte $70,$70,$70,$30,$70,$70,$70,$70 ; 8C52 70 70 70 30 70 70 70 70 ppp0pppp .byte $47,$00,$30,$87,$87,$10,$87,$10 ; 8C5A 47 00 30 87 87 10 87 10 G.0..... .byte $87,$10,$07,$41,$52 ; 8C62 87 10 07 41 52 ...AR reyalp_msg_minus_one: .byte $8C ; 8C67 8C . ; PLAYER spelled backwards: ' 0 # REYALP ' reyalp_msg: .byte $80,$80,$10,$80,$80,$80,$80,$80 ; 8C68 80 80 10 80 80 80 80 80 ........ .byte $80,$80,$03,$80,$32,$25,$39,$21 ; 8C70 80 80 03 80 32 25 39 21 ....2%9! .byte $2C,$30,$80 ; 8C78 2C 30 80 ,0. ; ' SCORES' in color 3 scores_msg: .byte $80,$F3,$E3,$EF,$F2,$E5,$F3 ; 8C7B 80 F3 E3 EF F2 E5 F3 ....... ; looks like an empty jump-to-itself dlist blank_dlist_8c82: .byte $41,$82 ; 8C82 41 82 A. L8C84: .byte $8C ; 8C84 8C . ; offsets into screen memory, column 12, rows 2 3 4 5, used by code at $8BEF, loaded in $d3, hi byte in $d4 is $30 score_offsets: .byte $34,$48,$5C ; 8C85 34 48 5C 4H\ struct_user_lives_offsets_minus_one: .byte $70 ; 8C88 70 p ; lookup table, offset from $713 to lives for indexed user struct_user_lives_offsets: .byte $02,$0D,$18,$23 ; 8C89 02 0D 18 23 ...# ; ---------------------------------------------------------------------------- ; used by score screen score_screen_dli_sr: pha ; 8C8D 48 H lda current_user ; 8C8E AD FE 06 ... sec ; 8C91 38 8 sbc #$01 ; 8C92 E9 01 .. sta WSYNC ; 8C94 8D 0A D4 ... cmp $AB ; 8C97 C5 AB .. bne L8CA4 ; 8C99 D0 09 .. lda rot_color ; 8C9B AD 2A 06 .*. sta COLPF0 ; 8C9E 8D 16 D0 ... jmp L8CAA ; 8CA1 4C AA 8C L.. ; ---------------------------------------------------------------------------- L8CA4: lda COLOR0 ; 8CA4 AD C4 02 ... sta COLPF0 ; 8CA7 8D 16 D0 ... L8CAA: inc $AB ; 8CAA E6 AB .. lda $AB ; 8CAC A5 AB .. and #$03 ; 8CAE 29 03 ). sta $AB ; 8CB0 85 AB .. pla ; 8CB2 68 h rti ; 8CB3 40 @ ; ---------------------------------------------------------------------------- zero_filler_8cb4: .byte $00,$00,$00,$00,$00,$00,$00,$00 ; 8CB4 00 00 00 00 00 00 00 00 ........ ; ---------------------------------------------------------------------------- ; should be called every time the score is updated, adds extra life every 7500 points. notice the score and threshold are both 3 bytes, and we compare from high byte to low. check_extra_life: ldx #$03 ; 8CBC A2 03 .. ; number_of_users should be score-1 here. score+2 should be next_extra_life-1 also. chk_next_byte: lda number_of_users,x ; 8CBE BD FF 06 ... cmp score+2,x ; 8CC1 DD 02 07 ... bcc chk_done ; 8CC4 90 34 .4 beq score_byte_ge ; 8CC6 F0 03 .. jmp add_extra_life ; 8CC8 4C CE 8C L.. ; ---------------------------------------------------------------------------- ; if it's greater or equal and X!=0, keep looping score_byte_ge: dex ; 8CCB CA . bne chk_next_byte ; 8CCC D0 F0 .. ; first, calculate & store the next 7500-point target add_extra_life: ldx #$00 ; 8CCE A2 00 .. clc ; 8CD0 18 . add_next_byte: lda extra_life_points,x ; 8CD1 BD FD 8C ... adc next_extra_life,x ; 8CD4 7D 03 07 }.. sta next_extra_life,x ; 8CD7 9D 03 07 ... inx ; 8CDA E8 . ; we have to preserve the carry flag! save_flags: php ; 8CDB 08 . cpx #$03 ; 8CDC E0 03 .. beq inc_lives ; 8CDE F0 04 .. plp ; 8CE0 28 ( jmp add_next_byte ; 8CE1 4C D1 8C L.. ; ---------------------------------------------------------------------------- ; add 1 life, play sfx_extra_life inc_lives: plp ; 8CE4 28 ( inc lives ; 8CE5 EE 0A 07 ... lda #$79 ; 8CE8 A9 79 .y sta snd_ptr ; 8CEA 8D 3C 06 .<. lda #$BE ; 8CED A9 BE .. sta snd_ptr+1 ; 8CEF 8D 3D 06 .=. lda #$0C ; 8CF2 A9 0C .. jsr cue_sfx_jv ; 8CF4 20 06 80 .. jsr show_lives_icons ; 8CF7 20 BB 86 .. chk_done: jmp score_mod_1m ; 8CFA 4C C0 B7 L.. ; ---------------------------------------------------------------------------- ; 3 bytes, value 7500 decimal, give an extra life after this many points. not copied to RAM, meaning no level can change this. extra_life_points: .byte $4C,$1D,$00 ; 8CFD 4C 1D 00 L.. ; ---------------------------------------------------------------------------- ; just lost your last life crumble_gameboard: jsr enable_joystick_jv ; 8D00 20 1B 80 .. lda #$86 ; 8D03 A9 86 .. ; $86 = distortion 8, volume 6 cgb_audc: sta AUDC1 ; 8D05 8D 01 D2 ... ; store random N-blank-lines instruction at head of display list shake_screen: lda RANDOM ; 8D08 AD 0A D2 ... and #$70 ; 8D0B 29 70 )p sta $0801 ; 8D0D 8D 01 08 ... sta game_display_list ; 8D10 8D 81 08 ... lda RANDOM ; 8D13 AD 0A D2 ... ; random frequency crumble_sound: sta AUDF1 ; 8D16 8D 00 D2 ... ; get random number 0 to 12 rand_0c:lda RANDOM ; 8D19 AD 0A D2 ... and #$1F ; 8D1C 29 1F ). cmp #$0D ; 8D1E C9 0D .. bcs rand_0c ; 8D20 B0 F7 .. sta $AA ; 8D22 85 AA .. asl a ; 8D24 0A . clc ; 8D25 18 . adc $AA ; 8D26 65 AA e. sta $AA ; 8D28 85 AA .. jsr L8D60 ; 8D2A 20 60 8D `. inc $AA ; 8D2D E6 AA .. lda $AA ; 8D2F A5 AA .. pha ; 8D31 48 H jsr L8D60 ; 8D32 20 60 8D `. pla ; 8D35 68 h jsr L8D60 ; 8D36 20 60 8D `. inc $AA ; 8D39 E6 AA .. lda $AA ; 8D3B A5 AA .. jsr L8D60 ; 8D3D 20 60 8D `. ldy #$00 ; 8D40 A0 00 .. tya ; 8D42 98 . L8D43: ora $3370,y ; 8D43 19 70 33 .p3 ora $3398,y ; 8D46 19 98 33 ..3 iny ; 8D49 C8 . cpy #$28 ; 8D4A C0 28 .( bne L8D43 ; 8D4C D0 F5 .. cmp #$00 ; 8D4E C9 00 .. bne shake_screen ; 8D50 D0 B6 .. ; well_done_screen jumps here via work_level_sub1 well_done_scores: lda #$00 ; 8D52 A9 00 .. sta AUDF1 ; 8D54 8D 00 D2 ... sta AUDC1 ; 8D57 8D 01 D2 ... jsr scores_screen ; 8D5A 20 80 8B .. jmp afterlife ; 8D5D 4C 00 96 L.. ; ---------------------------------------------------------------------------- L8D60: clc ; 8D60 18 . adc #$70 ; 8D61 69 70 ip sta $AC ; 8D63 85 AC .. adc #$28 ; 8D65 69 28 i( sta zp_temp2 ; 8D67 85 AE .. lda #$3D ; 8D69 A9 3D .= sta $AD ; 8D6B 85 AD .. sta zp_temp2+1 ; 8D6D 85 AF .. lda #$57 ; 8D6F A9 57 .W sta $AB ; 8D71 85 AB .. ldy #$00 ; 8D73 A0 00 .. L8D75: lda ($AC),y ; 8D75 B1 AC .. sta (zp_temp2),y ; 8D77 91 AE .. sec ; 8D79 38 8 lda $AC ; 8D7A A5 AC .. sbc #$28 ; 8D7C E9 28 .( sta $AC ; 8D7E 85 AC .. bcs L8D84 ; 8D80 B0 02 .. dec $AD ; 8D82 C6 AD .. L8D84: sec ; 8D84 38 8 lda zp_temp2 ; 8D85 A5 AE .. sbc #$28 ; 8D87 E9 28 .( sta zp_temp2 ; 8D89 85 AE .. bcs L8D8F ; 8D8B B0 02 .. dec zp_temp2+1 ; 8D8D C6 AF .. L8D8F: dec $AB ; 8D8F C6 AB .. bne L8D75 ; 8D91 D0 E2 .. tya ; 8D93 98 . sta (zp_temp2),y ; 8D94 91 AE .. rts ; 8D96 60 ` ; ---------------------------------------------------------------------------- zero_filler_8d97: .byte $00,$00,$00,$00,$00,$00,$00,$00 ; 8D97 00 00 00 00 00 00 00 00 ........ .byte $00 ; 8D9F 00 . ; ---------------------------------------------------------------------------- L8DA0: lda level ; 8DA0 AD F6 06 ... cmp #$0B ; 8DA3 C9 0B .. beq L8DAA ; 8DA5 F0 03 .. jmp afterlife ; 8DA7 4C 00 96 L.. ; ---------------------------------------------------------------------------- L8DAA: jsr well_done_screen ; 8DAA 20 00 BC .. lda #$04 ; 8DAD A9 04 .. sta $0688 ; 8DAF 8D 88 06 ... jsr scores_screen ; 8DB2 20 80 8B .. jmp afterlife ; 8DB5 4C 00 96 L.. ; ---------------------------------------------------------------------------- ; move player selected by X reg minus one off the left edge of the screen hide_player: lda #$02 ; 8DB8 A9 02 .. sta HPOSM3,x ; 8DBA 9D 07 D0 ... sta player_new_x,x ; 8DBD 9D 7C 06 .|. lda #$00 ; 8DC0 A9 00 .. sta $06EA,x ; 8DC2 9D EA 06 ... rts ; 8DC5 60 ` ; ---------------------------------------------------------------------------- ; store A to AUDCx (and its ?shadow?) store_audc: sta AUDC1,x ; 8DC6 9D 01 D2 ... sta $0649,x ; 8DC9 9D 49 06 .I. rts ; 8DCC 60 ` ; ---------------------------------------------------------------------------- zero_filler_8dcd: .byte $00 ; 8DCD 00 . ; ---------------------------------------------------------------------------- ; bonus -= 100, play sfx_bonus_tick decrement_time_bonus: lda work_level_time_bonus ; 8DCE AD 91 07 ... ora work_level_time_bonus+1 ; 8DD1 0D 92 07 ... ora work_level_offs_19 ; 8DD4 0D 93 07 ... ; don't decrement if bonus == 0 check_bonus_0: beq dec_done ; 8DD7 F0 20 . lda work_level_time_bonus ; 8DD9 AD 91 07 ... sec ; 8DDC 38 8 sbc #$64 ; 8DDD E9 64 .d sta work_level_time_bonus ; 8DDF 8D 91 07 ... bcs bonus_lt_256 ; 8DE2 B0 03 .. dec work_level_time_bonus+1 ; 8DE4 CE 92 07 ... bonus_lt_256: jsr print_bonus_jv ; 8DE7 20 0F 80 .. lda #$FA ; 8DEA A9 FA .. sta snd_slot_priority ; 8DEC 8D 3E 06 .>. lda #$8D ; 8DEF A9 8D .. sta snd_slot_timer ; 8DF1 8D 3F 06 .?. lda #$07 ; 8DF4 A9 07 .. jsr cue_sfx_lowprior_jv ; 8DF6 20 03 80 .. dec_done: rts ; 8DF9 60 ` ; ---------------------------------------------------------------------------- ; played when bonus timer is decremented sfx_bonus_tick: .byte $01,$A5,$00,$18,$03,$00 ; 8DFA 01 A5 00 18 03 00 ...... ; ---------------------------------------------------------------------------- level_finished: lda #$09 ; 8E00 A9 09 .. sta current_speed ; 8E02 8D 24 06 .$. sta $067F ; 8E05 8D 7F 06 ... lda #$80 ; 8E08 A9 80 .. sta num_color ; 8E0A 85 D5 .. jsr print_bonus_jv ; 8E0C 20 0F 80 .. ; score += time_bonus; add_time_bonus: clc ; 8E0F 18 . lda work_level_time_bonus ; 8E10 AD 91 07 ... adc score ; 8E13 6D 00 07 m.. sta score ; 8E16 8D 00 07 ... lda work_level_time_bonus+1 ; 8E19 AD 92 07 ... adc score+1 ; 8E1C 6D 01 07 m.. sta score+1 ; 8E1F 8D 01 07 ... bcc lt_64k ; 8E22 90 03 .. inc score+2 ; 8E24 EE 02 07 ... lt_64k: lda #$00 ; 8E27 A9 00 .. sta AUDF1 ; 8E29 8D 00 D2 ... sta num_color ; 8E2C 85 D5 .. sta AUDC1 ; 8E2E 8D 01 D2 ... sta jiffy_timer_1 ; 8E31 8D 1A 06 ... sta playing_level ; 8E34 8D 27 06 .'. jsr check_extra_life_jv ; 8E37 20 0C 80 .. ; 533ms ntsc, 640ms pal wait_32_jiffies: lda jiffy_timer_1 ; 8E3A AD 1A 06 ... cmp #$20 ; 8E3D C9 20 . bne wait_32_jiffies ; 8E3F D0 F9 .. ; pick random sound effect between 4 and 7 pick_random_music: lda RANDOM ; 8E41 AD 0A D2 ... and #$03 ; 8E44 29 03 ). clc ; 8E46 18 . adc #$04 ; 8E47 69 04 i. jsr cue_music_jv ; 8E49 20 18 80 .. L8E4C: lda $0640 ; 8E4C AD 40 06 .@. ora $0642 ; 8E4F 0D 42 06 .B. ora $0644 ; 8E52 0D 44 06 .D. ora snd_slot_duration ; 8E55 0D 46 06 .F. bne L8E4C ; 8E58 D0 F2 .. sta jiffy_timer_1 ; 8E5A 8D 1A 06 ... L8E5D: lda jiffy_timer_1 ; 8E5D AD 1A 06 ... cmp #$40 ; 8E60 C9 40 .@ bne L8E5D ; 8E62 D0 F9 .. jmp end_of_level_bonus ; 8E64 4C 00 B8 L.. ; ---------------------------------------------------------------------------- zero_filler_8e67: .byte $00,$00 ; 8E67 00 00 .. ; ---------------------------------------------------------------------------- ; not sure what $0622, $0623 are for yet bullet_logic: lda $0622 ; 8E69 AD 22 06 .". beq no_bullet ; 8E6C F0 07 .. lda falling_flag ; 8E6E AD 23 06 .#. cmp #$02 ; 8E71 C9 02 .. bne want_bullet ; 8E73 D0 01 .. no_bullet: rts ; 8E75 60 ` ; ---------------------------------------------------------------------------- ; create a bullet unless there are already max_bullets of them want_bullet: ldx #$FF ; 8E76 A2 FF .. next_bullet_slot: inx ; 8E78 E8 . cpx work_level_bullet_max ; 8E79 EC 8B 07 ... beq no_bullet ; 8E7C F0 F7 .. lda bullet_flags,x ; 8E7E BD 56 07 .V. bne fire_when_ready ; 8E81 D0 36 .6 inc bullet_flags,x ; 8E83 FE 56 07 .V. ; A = rand() % 3 + 1; // bullets only come from left, right, or top (never bottom) rand_1_to_3: lda RANDOM ; 8E86 AD 0A D2 ... and #$03 ; 8E89 29 03 ). beq rand_1_to_3 ; 8E8B F0 F9 .. tay ; 8E8D A8 . lda RANDOM ; 8E8E AD 0A D2 ... sta bullet_x_pos,x ; 8E91 9D 9B 06 ... sta bullet_y_pos,x ; 8E94 9D 9F 06 ... lda bullet_table_minus_one,y ; 8E97 B9 42 8F .B. beq L8E9F ; 8E9A F0 03 .. sta bullet_x_pos,x ; 8E9C 9D 9B 06 ... L8E9F: lda L8F45,y ; 8E9F B9 45 8F .E. beq set_bullet_dir ; 8EA2 F0 03 .. sta bullet_y_pos,x ; 8EA4 9D 9F 06 ... ; initial direction (before it fires) set_bullet_dir: lda RANDOM ; 8EA7 AD 0A D2 ... and #$03 ; 8EAA 29 03 ). tay ; 8EAC A8 . lda L8F49,y ; 8EAD B9 49 8F .I. sta bullet_x_delta,x ; 8EB0 9D 5A 07 .Z. lda L8F4D,y ; 8EB3 B9 4D 8F .M. sta bullet_y_delta,x ; 8EB6 9D 5E 07 .^. ; fire at player if lined up with him, otherwise don't. either way we end up at move_bullet fire_when_ready: cmp #$02 ; 8EB9 C9 02 .. beq move_bullet ; 8EBB F0 54 .T lda bullet_x_pos,x ; 8EBD BD 9B 06 ... sec ; 8EC0 38 8 ; aim at center of body mass! sbc3: sbc #$03 ; 8EC1 E9 03 .. cmp player_x_pos ; 8EC3 CD 7E 06 .~. beq aim_bullet_y ; 8EC6 F0 0E .. lda bullet_y_pos,x ; 8EC8 BD 9F 06 ... sec ; 8ECB 38 8 sbc #$04 ; 8ECC E9 04 .. cmp player_y_pos ; 8ECE CD 83 06 ... beq aim_bullet_x ; 8ED1 F0 11 .. jmp move_bullet ; 8ED3 4C 11 8F L.. ; ---------------------------------------------------------------------------- ; take aim! aim_bullet_y: ldy #$00 ; 8ED6 A0 00 .. lda bullet_y_pos,x ; 8ED8 BD 9F 06 ... cmp player_y_pos ; 8EDB CD 83 06 ... bcs fire_bullet ; 8EDE B0 0F .. iny ; 8EE0 C8 . jmp fire_bullet ; 8EE1 4C EF 8E L.. ; ---------------------------------------------------------------------------- ; take aim! aim_bullet_x: ldy #$02 ; 8EE4 A0 02 .. lda bullet_x_pos,x ; 8EE6 BD 9B 06 ... cmp player_x_pos ; 8EE9 CD 7E 06 .~. bcs fire_bullet ; 8EEC B0 01 .. iny ; 8EEE C8 . ; fire! Y reg indexes table of directions fire_bullet: lda L8F51,y ; 8EEF B9 51 8F .Q. sta bullet_x_delta,x ; 8EF2 9D 5A 07 .Z. lda L8F55,y ; 8EF5 B9 55 8F .U. sta bullet_y_delta,x ; 8EF8 9D 5E 07 .^. ; let player hear report play_sfx_bullet: lda #$59 ; 8EFB A9 59 .Y sta snd_slot_priority ; 8EFD 8D 3E 06 .>. lda #$8F ; 8F00 A9 8F .. sta snd_slot_timer ; 8F02 8D 3F 06 .?. txa ; 8F05 8A . pha ; 8F06 48 H lda #$02 ; 8F07 A9 02 .. jsr cue_sfx_lowprior_jv ; 8F09 20 03 80 .. pla ; 8F0C 68 h tax ; 8F0D AA . inc bullet_flags,x ; 8F0E FE 56 07 .V. move_bullet: lda bullet_x_pos,x ; 8F11 BD 9B 06 ... clc ; 8F14 18 . adc bullet_x_delta,x ; 8F15 7D 5A 07 }Z. cmp #$03 ; 8F18 C9 03 .. bcc code_8f38 ; 8F1A 90 1C .. cmp #$FD ; 8F1C C9 FD .. bcs code_8f38 ; 8F1E B0 18 .. sta bullet_x_pos,x ; 8F20 9D 9B 06 ... lda bullet_y_pos,x ; 8F23 BD 9F 06 ... clc ; 8F26 18 . adc bullet_y_delta,x ; 8F27 7D 5E 07 }^. cmp #$03 ; 8F2A C9 03 .. bcc code_8f38 ; 8F2C 90 0A .. cmp #$CE ; 8F2E C9 CE .. bcs code_8f38 ; 8F30 B0 06 .. sta bullet_y_pos,x ; 8F32 9D 9F 06 ... jmp next_bullet_slot ; 8F35 4C 78 8E Lx. ; ---------------------------------------------------------------------------- code_8f38: lda #$00 ; 8F38 A9 00 .. sta bullet_flags,x ; 8F3A 9D 56 07 .V. sta bullet_x_pos,x ; 8F3D 9D 9B 06 ... bullet_table_minus_one:= * + 2 ; 1-indexed jmp next_bullet_slot ; 8F40 4C 78 8E Lx. ; ---------------------------------------------------------------------------- ; used by bullet_logic bullet_table: .byte $04,$FC ; 8F43 04 FC .. L8F45: .byte $00,$00,$00,$04 ; 8F45 00 00 00 04 .... L8F49: .byte $FF,$00,$01,$00 ; 8F49 FF 00 01 00 .... L8F4D: .byte $00,$FF,$00,$01 ; 8F4D 00 FF 00 01 .... L8F51: .byte $00,$00,$FD,$03 ; 8F51 00 00 FD 03 .... L8F55: .byte $FD,$03,$00,$00 ; 8F55 FD 03 00 00 .... ; bang! sfx_bullet: .byte $01,$8E,$00,$14,$02,$01,$8B,$00 ; 8F59 01 8E 00 14 02 01 8B 00 ........ .byte $14,$03,$01,$88,$00,$14,$05,$01 ; 8F61 14 03 01 88 00 14 05 01 ........ .byte $85,$00,$14,$07,$01,$82,$00,$14 ; 8F69 85 00 14 07 01 82 00 14 ........ .byte $09,$00 ; 8F71 09 00 .. ; ---------------------------------------------------------------------------- ; did any missile hit a player, or did players 2 or 3 hit a player... check_pl_coll: lda sav_p2pl ; 8F73 AD BE 06 ... ; skip player 2 to player collisions, called with A=0, used by level 11 check_pl_coll_no_p2: ora sav_p3pl ; 8F76 0D BF 06 ... ; skip player 2 and 3 to player collisions, called with A=0, used by levels 3 and 10 check_pl_coll_no_pl: ora sav_m0pl ; 8F79 0D B8 06 ... ora sav_m1pl ; 8F7C 0D B9 06 ... ora sav_m2pl ; 8F7F 0D BA 06 ... ora sav_m3pl ; 8F82 0D BB 06 ... and #$01 ; 8F85 29 01 ). beq L8F91 ; 8F87 F0 08 .. lda falling_flag ; 8F89 AD 23 06 .#. bne L8F91 ; 8F8C D0 03 .. inc falling_flag ; 8F8E EE 23 06 .#. L8F91: rts ; 8F91 60 ` ; ---------------------------------------------------------------------------- ; setup to play whichever music is in A reg, using 5-byte sfx stuct (a music is a pair of sfx played simultaneously) cue_music: sta $D6 ; 8F92 85 D6 .. asl a ; 8F94 0A . asl a ; 8F95 0A . clc ; 8F96 18 . adc $D6 ; 8F97 65 D6 e. sta $D6 ; 8F99 85 D6 .. ; y = a * 5; // offset into mus_struct_table set_y: tay ; 8F9B A8 . lda mus00_addr1,y ; 8F9C B9 C3 8F ... sta snd_ptr ; 8F9F 8D 3C 06 .<. lda mus00_addr1+1,y ; 8FA2 B9 C4 8F ... sta snd_ptr+1 ; 8FA5 8D 3D 06 .=. lda mus00_priority,y ; 8FA8 B9 C7 8F ... jsr cue_sfx_jv ; 8FAB 20 06 80 .. ldy $D6 ; 8FAE A4 D6 .. lda mus00_addr2,y ; 8FB0 B9 C5 8F ... sta snd_ptr ; 8FB3 8D 3C 06 .<. lda mus00_addr2+1,y ; 8FB6 B9 C6 8F ... sta snd_ptr+1 ; 8FB9 8D 3D 06 .=. lda mus00_priority,y ; 8FBC B9 C7 8F ... jsr cue_sfx_jv ; 8FBF 20 06 80 .. rts ; 8FC2 60 ` ; ---------------------------------------------------------------------------- ; aka mus_struct_table, 5 bytes per entry mus00_addr1: .addr sfx13 ; 8FC3 D0 BF .. mus00_addr2: .addr sfx14 ; 8FC5 EA BF .. ; ---------------------------------------------------------------------------- mus00_priority: .byte $10 ; 8FC7 10 . ; ---------------------------------------------------------------------------- mus01_addr1: .addr sfx_jump ; 8FC8 BE BF .. mus01_addr2: .addr empty_music_entry ; 8FCA FF 8F .. ; ---------------------------------------------------------------------------- mus01_priority: .byte $07 ; 8FCC 07 . ; ---------------------------------------------------------------------------- ; end of game tune mus02_addr1: .addr sfx02 ; 8FCD 8D BE .. mus02_addr2: .addr sfx03 ; 8FCF AF BE .. ; ---------------------------------------------------------------------------- mus02_priority: .byte $10 ; 8FD1 10 . ; ---------------------------------------------------------------------------- mus03_addr1: .addr sfx01 ; 8FD2 25 BE %. mus03_addr2: .addr sfx00 ; 8FD4 F2 BD .. ; ---------------------------------------------------------------------------- mus03_priority: .byte $10 ; 8FD6 10 . ; ---------------------------------------------------------------------------- mus04_addr1: .addr sfx04 ; 8FD7 D5 BE .. mus04_addr2: .addr sfx05 ; 8FD9 ED BE .. ; ---------------------------------------------------------------------------- mus04_priority: .byte $10 ; 8FDB 10 . ; ---------------------------------------------------------------------------- mus05_addr1: .addr sfx06 ; 8FDC 14 BF .. mus05_addr2: .addr sfx07 ; 8FDE 30 BF 0. ; ---------------------------------------------------------------------------- mus05_priority: .byte $10 ; 8FE0 10 . ; ---------------------------------------------------------------------------- mus06_addr1: .addr sfx08 ; 8FE1 4A BF J. mus06_addr2: .addr sfx09 ; 8FE3 60 BF `. ; ---------------------------------------------------------------------------- mus06_priority: .byte $10 ; 8FE5 10 . ; ---------------------------------------------------------------------------- mus07_addr1: .addr sfx10 ; 8FE6 84 BF .. mus07_addr2: .addr sfx11 ; 8FE8 A6 BF .. ; ---------------------------------------------------------------------------- mus07_priority: .byte $10 ; 8FEA 10 . ; ---------------------------------------------------------------------------- ; tune that plays while level is being drawn mus08_addr1: .addr sfx15 ; 8FEB BC BA .. mus08_addr2: .addr sfx16 ; 8FED EA BA .. ; ---------------------------------------------------------------------------- mus08_priority: .byte $10 ; 8FEF 10 . ; ---------------------------------------------------------------------------- mus09_addr1: .addr empty_music_entry ; 8FF0 FF 8F .. mus09_addr2: .addr empty_music_entry ; 8FF2 FF 8F .. ; ---------------------------------------------------------------------------- mus09_priority: .byte $01 ; 8FF4 01 . ; ---------------------------------------------------------------------------- mus10_addr1: .addr empty_music_entry ; 8FF5 FF 8F .. mus10_addr2: .addr empty_music_entry ; 8FF7 FF 8F .. ; ---------------------------------------------------------------------------- mus10_priority: .byte $01 ; 8FF9 01 . ; ---------------------------------------------------------------------------- mus11_addr1: .addr empty_music_entry ; 8FFA FF 8F .. mus11_addr2: .addr empty_music_entry ; 8FFC FF 8F .. ; ---------------------------------------------------------------------------- mus11_priority: .byte $01 ; 8FFE 01 . ; empty music table entries point here empty_music_entry: .byte $00 ; 8FFF 00 . ; ---------------------------------------------------------------------------- ; called from cart_entry_point routine init_game: lda #$00 ; 9000 A9 00 .. sta option_key_enabled ; 9002 8D C6 06 ... sta start_key_enabled ; 9005 8D C8 06 ... nop ; 9008 EA . nop ; 9009 EA . nop ; 900A EA . nop ; 900B EA . ; this entry point doesn't disable start/option keys reinit_game: jsr enable_joystick_jv ; 900C 20 1B 80 .. lda #$00 ; 900F A9 00 .. sta $A0 ; 9011 85 A0 .. sta select_key_vec ; 9013 8D C2 06 ... lda #$94 ; 9016 A9 94 .. sta select_key_vec+1 ; 9018 8D C3 06 ... ; set select key vector to ask_num_players at $9400, enable select key setup_select_key_vec: sta select_key_enabled ; 901B 8D C7 06 ... ldx #$08 ; 901E A2 08 .. lda #$FF ; 9020 A9 FF .. ; seems to try to write $FF bytes to ROM that already contains $FF's (it's the solid block character in the font). possibly left over from early development before conversion to cartridge. try_to_write_rom: sta block_char_minus_one,x ; 9022 9D 0F 9E ... dex ; 9025 CA . bne try_to_write_rom ; 9026 D0 FA .. ldx #$C0 ; 9028 A2 C0 .. copy_title_screen: lda title_screen_data_minus_one,x ; 902A BD CE 91 ... sta $2FFF,x ; 902D 9D FF 2F ../ dex ; 9030 CA . bne copy_title_screen ; 9031 D0 F7 .. lda #$46 ; 9033 A9 46 .F sta COLOR1 ; 9035 8D C5 02 ... lda #$C4 ; 9038 A9 C4 .. sta COLOR2 ; 903A 8D C6 02 ... lda #$00 ; 903D A9 00 .. sta $9C ; 903F 85 9C .. sta $9D ; 9041 85 9D .. sta COLOR3 ; 9043 8D C7 02 ... lda #$B3 ; 9046 A9 B3 .. sta dlist_shadow_lo ; 9048 8D AC 06 ... lda #$91 ; 904B A9 91 .. sta dlist_shadow_hi ; 904D 8D AD 06 ... lda #$00 ; 9050 A9 00 .. sta HSCROL ; 9052 8D 04 D4 ... lda #$A5 ; 9055 A9 A5 .. sta AUDC1 ; 9057 8D 01 D2 ... lda #$ED ; 905A A9 ED .. sta dli_vec_shadow_lo ; 905C 8D AE 06 ... ; set work_level_sub0 to fade_in_letters ts_setup_sub0: lda #$92 ; 905F A9 92 .. sta dli_vec_shadow_hi ; 9061 8D AF 06 ... lda #$3C ; 9064 A9 3C .< sta work_level_sub0 ; 9066 8D 82 07 ... lda #$91 ; 9069 A9 91 .. sta work_level_sub0+1 ; 906B 8D 83 07 ... ; fade_in_letters increments $9c after every letter, $0e means they're all done (since there are 14 of them and we start counting at zero) wait_letters_done: lda $9C ; 906E A5 9C .. cmp #$0E ; 9070 C9 0E .. bne wait_letters_done ; 9072 D0 FA .. lda #$E6 ; 9074 A9 E6 .. sta work_level_sub0 ; 9076 8D 82 07 ... lda #$06 ; 9079 A9 06 .. sta work_level_sub0+1 ; 907B 8D 83 07 ... lda #$00 ; 907E A9 00 .. sta snd_ptr ; 9080 8D 3C 06 .<. lda #$93 ; 9083 A9 93 .. sta snd_ptr+1 ; 9085 8D 3D 06 .=. jsr cue_sfx_jv ; 9088 20 06 80 .. lda #$51 ; 908B A9 51 .Q sta snd_ptr ; 908D 8D 3C 06 .<. lda #$93 ; 9090 A9 93 .. sta snd_ptr+1 ; 9092 8D 3D 06 .=. jsr cue_sfx_jv ; 9095 20 06 80 .. lda #$9C ; 9098 A9 9C .. sta snd_ptr ; 909A 8D 3C 06 .<. lda #$93 ; 909D A9 93 .. sta snd_ptr+1 ; 909F 8D 3D 06 .=. jsr cue_sfx_jv ; 90A2 20 06 80 .. lda #$D7 ; 90A5 A9 D7 .. sta snd_ptr ; 90A7 8D 3C 06 .<. lda #$93 ; 90AA A9 93 .. sta snd_ptr+1 ; 90AC 8D 3D 06 .=. jsr cue_sfx_jv ; 90AF 20 06 80 .. lda #$00 ; 90B2 A9 00 .. sta $9C ; 90B4 85 9C .. sta $9D ; 90B6 85 9D .. lda #$07 ; 90B8 A9 07 .. sta zp_temp5 ; 90BA 85 B9 .. ; set _sub0 to title_dancing start_dancing: lda #$72 ; 90BC A9 72 .r sta work_level_sub0 ; 90BE 8D 82 07 ... lda #$91 ; 90C1 A9 91 .. sta work_level_sub0+1 ; 90C3 8D 83 07 ... ldx #$FF ; 90C6 A2 FF .. ; lot going on here, not understood yet funky_init_loop: inx ; 90C8 E8 . cpx #$02 ; 90C9 E0 02 .. beq funky_init_loop ; 90CB F0 FB .. cpx #$05 ; 90CD E0 05 .. beq L910A ; 90CF F0 39 .9 ldy L92A3,x ; 90D1 BC A3 92 ... L90D4: lda $0649,y ; 90D4 B9 49 06 .I. and #$0F ; 90D7 29 0F ). beq L90D4 ; 90D9 F0 F9 .. lda #$00 ; 90DB A9 00 .. sta $066E,x ; 90DD 9D 6E 06 .n. lda #$9D ; 90E0 A9 9D .. sta $0673,x ; 90E2 9D 73 06 .s. lda #$0A ; 90E5 A9 0A .. sta $0678,x ; 90E7 9D 78 06 .x. lda #$01 ; 90EA A9 01 .. sta $0687,x ; 90EC 9D 87 06 ... lda #$5C ; 90EF A9 5C .\ sta $0682,x ; 90F1 9D 82 06 ... lda L929E,x ; 90F4 BD 9E 92 ... sta $067D,x ; 90F7 9D 7D 06 .}. sta $0669,x ; 90FA 9D 69 06 .i. ldy L92E8,x ; 90FD BC E8 92 ... lda #$0F ; 9100 A9 0F .. sta PCOLR0,y ; 9102 99 C0 02 ... inc $9C ; 9105 E6 9C .. jmp funky_init_loop ; 9107 4C C8 90 L.. ; ---------------------------------------------------------------------------- L910A: lda $9D ; 910A A5 9D .. cmp #$1D ; 910C C9 1D .. beq try_to_write_rom_again ; 910E F0 16 .. cmp #$20 ; 9110 C9 20 . bcc L910A ; 9112 90 F6 .. ; set work_level_sub0 to $06e6 (just an RTS) ts_clear_sub0: lda #$E6 ; 9114 A9 E6 .. sta work_level_sub0 ; 9116 8D 82 07 ... lda #$06 ; 9119 A9 06 .. sta work_level_sub0+1 ; 911B 8D 83 07 ... lda #$08 ; 911E A9 08 .. sta COLOR0 ; 9120 8D C4 02 ... jmp demo_mode ; 9123 4C 6B B9 Lk. ; ---------------------------------------------------------------------------- ; see comment at try_to_write_rom. this writes something else to the block character in the font, which causes the graphics corruption on cracked disk versions. it doesn't seem to actually hurt anything though. try_to_write_rom_again: ldx #$08 ; 9126 A2 08 .. L9128: lda replacement_block_char_minus_one,x; 9128 BD 33 91 .3. sta block_char_minus_one,x ; 912B 9D 0F 9E ... dex ; 912E CA . bne L9128 ; 912F D0 F7 .. replacement_block_char_minus_one:= * + 2 ; 1-indexed... jmp L910A ; 9131 4C 0A 91 L.. ; ---------------------------------------------------------------------------- replacement_block_char: .byte $BF,$BF,$CF,$EF,$E7,$DB,$D9,$BF ; 9134 BF BF CF EF E7 DB D9 BF ........ ; ---------------------------------------------------------------------------- ; rotate colors and play the descending tone as each letter appears on the title screen. called once per frame, uses $9c to keep track of letter. caller stops this routine being called when $9c holds $0e (meaning the last letter is done). fade_in_letters: lda rot_color ; 913C AD 2A 06 .*. sta COLOR0 ; 913F 8D C4 02 ... ldy $9C ; 9142 A4 9C .. ; don't 'fade-in' the space in the title (offset 7) skip_space: cpy #$07 ; 9144 C0 07 .. beq turn_letter_white ; 9146 F0 1C .. clc ; 9148 18 . lda $9D ; 9149 A5 9D .. adc #$04 ; 914B 69 04 i. sta $9D ; 914D 85 9D .. beq turn_letter_white ; 914F F0 13 .. sta AUDF1 ; 9151 8D 00 D2 ... ; the luminance stays the same rotate_hue: lsr a ; 9154 4A J lsr a ; 9155 4A J lsr a ; 9156 4A J lsr a ; 9157 4A J ora #$60 ; 9158 09 60 .` sta COLOR3 ; 915A 8D C7 02 ... lda title_letters,y ; 915D B9 8F 92 ... ; $3000 is screen memory, at this point show_letter: sta $3045,y ; 9160 99 45 30 .E0 rts ; 9163 60 ` ; ---------------------------------------------------------------------------- ; clear the high 2 bits on the letter, in screen memory turn_letter_white: lda $3045,y ; 9164 B9 45 30 .E0 and #$3F ; 9167 29 3F )? sta $3045,y ; 9169 99 45 30 .E0 inc $9C ; 916C E6 9C .. iny ; 916E C8 . jmp rotate_hue ; 916F 4C 54 91 LT. ; ---------------------------------------------------------------------------- ; make jumpmen dance on title screen, called once/frame title_dancing: lda rot_color ; 9172 AD 2A 06 .*. sta COLOR0 ; 9175 8D C4 02 ... lda $9C ; 9178 A5 9C .. cmp #$04 ; 917A C9 04 .. beq L917F ; 917C F0 01 .. L917E: rts ; 917E 60 ` ; ---------------------------------------------------------------------------- L917F: lda $0649 ; 917F AD 49 06 .I. and #$0F ; 9182 29 0F ). bne L917E ; 9184 D0 F8 .. inc zp_temp5 ; 9186 E6 B9 .. lda zp_temp5 ; 9188 A5 B9 .. and #$0F ; 918A 29 0F ). sta zp_temp5 ; 918C 85 B9 .. bne L917E ; 918E D0 EE .. ldx $9D ; 9190 A6 9D .. ldy #$FF ; 9192 A0 FF .. L9194: iny ; 9194 C8 . cpy #$02 ; 9195 C0 02 .. beq L9194 ; 9197 F0 FB .. cpy #$05 ; 9199 C0 05 .. beq L91B0 ; 919B F0 13 .. lda L92C8,x ; 919D BD C8 92 ... sta $0687,y ; 91A0 99 87 06 ... clc ; 91A3 18 . lda L92A8,x ; 91A4 BD A8 92 ... adc $067D,y ; 91A7 79 7D 06 y}. sta $067D,y ; 91AA 99 7D 06 .}. jmp L9194 ; 91AD 4C 94 91 L.. ; ---------------------------------------------------------------------------- L91B0: inc $9D ; 91B0 E6 9D .. rts ; 91B2 60 ` ; ---------------------------------------------------------------------------- ; display list for title screen title_display_list: .byte $70,$70,$70,$47,$00,$30,$06,$60 ; 91B3 70 70 70 47 00 30 06 60 pppG.0.` .byte $60,$70,$70,$70,$70,$17,$17,$97 ; 91BB 60 70 70 70 70 17 17 97 `pppp... .byte $70,$70,$70,$70,$70,$70,$70,$02 ; 91C3 70 70 70 70 70 70 70 02 ppppppp. .byte $02,$41,$B3 ; 91CB 02 41 B3 .A. title_screen_data_minus_one: .byte $91 ; 91CE 91 . ; title screen data title_screen_data: .byte $00,$00,$00,$00,$00,$00,$00,$00 ; 91CF 00 00 00 00 00 00 00 00 ........ .byte $65,$70,$79,$78,$00,$00,$00,$00 ; 91D7 65 70 79 78 00 00 00 00 epyx.... .byte $00,$00,$00,$00,$00,$00,$00,$00 ; 91DF 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$70,$72,$65,$73,$65,$6E ; 91E7 00 00 70 72 65 73 65 6E ..presen .byte $74,$73,$00,$00,$00,$00,$00,$00 ; 91EF 74 73 00 00 00 00 00 00 ts...... .byte $00,$00,$00,$82,$82,$82,$82,$82 ; 91F7 00 00 00 82 82 82 82 82 ........ .byte $82,$82,$82,$82,$82,$82,$82,$82 ; 91FF 82 82 82 82 82 82 82 82 ........ .byte $82,$82,$82,$82,$82,$00,$00,$00 ; 9207 82 82 82 82 82 00 00 00 ........ .byte $00,$00,$00,$82,$00,$00,$00,$00 ; 920F 00 00 00 82 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; 9217 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$82,$00,$00,$00 ; 921F 00 00 00 00 82 00 00 00 ........ .byte $00,$00,$00,$82,$82,$82,$82,$82 ; 9227 00 00 00 82 82 82 82 82 ........ .byte $82,$82,$82,$82,$82,$82,$82,$82 ; 922F 82 82 82 82 82 82 82 82 ........ .byte $82,$82,$82,$82,$82,$00,$00,$00 ; 9237 82 82 82 82 82 00 00 00 ........ .byte $40,$40,$40,$40,$40,$40,$40,$40 ; 923F 40 40 40 40 40 40 40 40 @@@@@@@@ .byte $40,$40,$40,$40,$48,$63,$49,$40 ; 9247 40 40 40 40 48 63 49 40 @@@@HcI@ .byte $51,$59,$58,$53,$40,$62,$79,$40 ; 924F 51 59 58 53 40 62 79 40 QYXS@by@ .byte $65,$70,$79,$78,$40,$40,$40,$40 ; 9257 65 70 79 78 40 40 40 40 epyx@@@@ .byte $40,$40,$40,$40,$40,$40,$40,$40 ; 925F 40 40 40 40 40 40 40 40 @@@@@@@@ .byte $40,$40,$40,$40,$40,$40,$40,$40 ; 9267 40 40 40 40 40 40 40 40 @@@@@@@@ .byte $63,$72,$65,$61,$74,$65,$64,$40 ; 926F 63 72 65 61 74 65 64 40 created@ .byte $62,$79,$5A,$40,$72,$61,$6E,$64 ; 9277 62 79 5A 40 72 61 6E 64 byZ@rand .byte $79,$40,$67,$6C,$6F,$76,$65,$72 ; 927F 79 40 67 6C 6F 76 65 72 y@glover .byte $40,$40,$40,$40,$40,$40,$40,$40 ; 9287 40 40 40 40 40 40 40 40 @@@@@@@@ ; JUMPMAN JUNIOR in screen codes with high bit set title_letters: .byte $EA,$F5,$ED,$F0,$ED,$E1,$EE,$00 ; 928F EA F5 ED F0 ED E1 EE 00 ........ .byte $EA,$F5,$EE,$E9,$EF,$F2,$00 ; 9297 EA F5 EE E9 EF F2 00 ....... L929E: .byte $6A,$76,$00,$82,$8E ; 929E 6A 76 00 82 8E jv... L92A3: .byte $00,$02,$00,$04,$06 ; 92A3 00 02 00 04 06 ..... L92A8: .byte $02,$02,$FE,$FE,$FE,$FE,$02,$02 ; 92A8 02 02 FE FE FE FE 02 02 ........ .byte $02,$02,$02,$02,$FE,$FE,$FE,$FE ; 92B0 02 02 02 02 FE FE FE FE ........ .byte $FE,$FE,$FE,$FE,$02,$02,$02,$02 ; 92B8 FE FE FE FE 02 02 02 02 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; 92C0 00 00 00 00 00 00 00 00 ........ L92C8: .byte $08,$09,$08,$09,$0C,$0D,$0C,$0D ; 92C8 08 09 08 09 0C 0D 0C 0D ........ .byte $08,$06,$09,$06,$08,$10,$09,$10 ; 92D0 08 06 09 06 08 10 09 10 ........ .byte $0C,$06,$0D,$06,$0C,$11,$0D,$11 ; 92D8 0C 06 0D 06 0C 11 0D 11 ........ .byte $12,$13,$14,$15,$04,$04,$04,$04 ; 92E0 12 13 14 15 04 04 04 04 ........ L92E8: .byte $07,$00,$00,$02,$03,$48,$A9,$94 ; 92E8 07 00 00 02 03 48 A9 94 .....H.. .byte $8D,$0A,$D4,$8D,$18,$D0,$A9,$CA ; 92F0 8D 0A D4 8D 18 D0 A9 CA ........ .byte $8D,$17,$D0,$68,$40,$00,$00,$00 ; 92F8 8D 17 D0 68 40 00 00 00 ...h@... ; title screen music. only use of 4-part harmony in the game, this and _v1 _v2 _v3. sfx_title_v0: .byte $01,$A0,$02,$0A,$80,$01,$A5,$02 ; 9300 01 A0 02 0A 80 01 A5 02 ........ .byte $3C,$20,$79,$20,$51,$20,$5B,$08 ; 9308 3C 20 79 20 51 20 5B 08 < y Q [. .byte $60,$08,$6C,$08,$5B,$08,$60,$10 ; 9310 60 08 6C 08 5B 08 60 10 `.l.[.`. .byte $79,$10,$5B,$08,$60,$08,$6C,$08 ; 9318 79 10 5B 08 60 08 6C 08 y.[.`.l. .byte $5B,$08,$60,$10,$79,$10,$79,$20 ; 9320 5B 08 60 10 79 10 79 20 [.`.y.y .byte $79,$20,$79,$08,$6C,$08,$60,$08 ; 9328 79 20 79 08 6C 08 60 08 y y.l.`. .byte $51,$08,$3C,$20,$3C,$08,$51,$08 ; 9330 51 08 3C 20 3C 08 51 08 Q.< <.Q. .byte $60,$08,$51,$08,$79,$20,$79,$08 ; 9338 60 08 51 08 79 20 79 08 `.Q.y y. .byte $6C,$08,$60,$08,$5B,$08,$51,$08 ; 9340 6C 08 60 08 5B 08 51 08 l.`.[.Q. .byte $48,$08,$40,$08,$51,$08,$3C,$40 ; 9348 48 08 40 08 51 08 3C 40 H.@.Q.<@ .byte $00 ; 9350 00 . sfx_title_v1: .byte $01,$A0,$02,$0A,$60,$01,$A3,$02 ; 9351 01 A0 02 0A 60 01 A3 02 ....`... .byte $51,$40,$79,$10,$A2,$10,$79,$10 ; 9359 51 40 79 10 A2 10 79 10 Q@y...y. .byte $6C,$10,$79,$08,$A2,$08,$F3,$10 ; 9361 6C 10 79 08 A2 08 F3 10 l.y..... .byte $F3,$20,$79,$08,$A2,$08,$F3,$10 ; 9369 F3 20 79 08 A2 08 F3 10 . y..... .byte $A2,$10,$79,$10,$A2,$20,$F3,$20 ; 9371 A2 10 79 10 A2 20 F3 20 ..y.. . .byte $79,$10,$A2,$10,$79,$10,$A2,$10 ; 9379 79 10 A2 10 79 10 A2 10 y...y... .byte $79,$10,$A2,$10,$F3,$10,$F3,$10 ; 9381 79 10 A2 10 F3 10 F3 10 y....... .byte $F3,$08,$D9,$08,$C1,$08,$B6,$08 ; 9389 F3 08 D9 08 C1 08 B6 08 ........ .byte $A2,$08,$90,$08,$80,$08,$A2,$08 ; 9391 A2 08 90 08 80 08 A2 08 ........ .byte $79,$40,$00 ; 9399 79 40 00 y@. sfx_title_v2: .byte $01,$A0,$02,$0A,$40,$01,$A4,$02 ; 939C 01 A0 02 0A 40 01 A4 02 ....@... .byte $60,$60,$01,$A0,$02,$0A,$10,$01 ; 93A4 60 60 01 A0 02 0A 10 01 ``...... .byte $A3,$02,$F3,$20,$A2,$30,$A2,$10 ; 93AC A3 02 F3 20 A2 30 A2 10 ... .0.. .byte $C1,$10,$02,$A6,$93,$01,$01,$A0 ; 93B4 C1 10 02 A6 93 01 01 A0 ........ .byte $02,$0A,$10,$01,$A3,$02,$A2,$20 ; 93BC 02 0A 10 01 A3 02 A2 20 ....... .byte $A2,$20,$F3,$30,$01,$A0,$02,$0A ; 93C4 A2 20 F3 30 01 A0 02 0A . .0.... .byte $40,$01,$A4,$02,$79,$10,$A2,$10 ; 93CC 40 01 A4 02 79 10 A2 10 @...y... .byte $F3,$20,$00 ; 93D4 F3 20 00 . . sfx_title_v3: .byte $01,$A0,$02,$0A,$20,$01,$A4,$02 ; 93D7 01 A0 02 0A 20 01 A4 02 .... ... .byte $79,$78,$01,$A0,$02,$0A,$FF,$0A ; 93DF 79 78 01 A0 02 0A FF 0A yx...... .byte $FF,$0A,$40,$00,$00,$00,$00,$00 ; 93E7 FF 0A 40 00 00 00 00 00 ..@..... .byte $00,$00,$00,$00,$00,$00,$00,$00 ; 93EF 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; 93F7 00 00 00 00 00 00 00 00 ........ .byte $00 ; 93FF 00 . ; ---------------------------------------------------------------------------- ask_num_players: ldx #$FF ; 9400 A2 FF .. lda #$00 ; 9402 A9 00 .. sta select_key_enabled ; 9404 8D C7 06 ... sta level ; 9407 8D F6 06 ... dec level ; 940A CE F6 06 ... ; clear area where NUMBER OF PLAYERS? will be displayed anp_clear_loop: sta $37FF,x ; 940D 9D FF 37 ..7 dex ; 9410 CA . bne anp_clear_loop ; 9411 D0 FA .. jsr enable_joystick_jv ; 9413 20 1B 80 .. ldx #$2C ; 9416 A2 2C ., ; copy NUMBER OF PLAYERS to screen RAM anp_copy_loop: lda numplayers_screen_data_minus_one,x; 9418 BD 9A 95 ... sta $37FF,x ; 941B 9D FF 37 ..7 dex ; 941E CA . bne anp_copy_loop ; 941F D0 F7 .. ; X is now 0 anp_loop_done: stx zp_temp3 ; 9421 86 B7 .. stx zp_temp4 ; 9423 86 B8 .. stx randomizer_mode ; 9425 8E F3 06 ... stx COLOR4 ; 9428 8E C8 02 ... lda #$04 ; 942B A9 04 .. sta HSCROL ; 942D 8D 04 D4 ... sta $A0 ; 9430 85 A0 .. lda #$1A ; 9432 A9 1A .. sta COLOR3 ; 9434 8D C7 02 ... lda #$96 ; 9437 A9 96 .. sta COLOR2 ; 9439 8D C6 02 ... lda #$C6 ; 943C A9 C6 .. sta COLOR1 ; 943E 8D C5 02 ... jsr init_struct_users_jv ; 9441 20 24 80 $. ; set dlist shadow to point to numplayer_display_list setup_numplayer_dlist: lda #$5F ; 9444 A9 5F ._ sta dlist_shadow_lo ; 9446 8D AC 06 ... lda #$95 ; 9449 A9 95 .. sta dlist_shadow_hi ; 944B 8D AD 06 ... ; set dli vector to point to num_player_dli_service setup_numplayer_dli_sr: lda #$78 ; 944E A9 78 .x sta dli_vec_shadow_lo ; 9450 8D AE 06 ... lda #$95 ; 9453 A9 95 .. sta dli_vec_shadow_hi ; 9455 8D AF 06 ... ; we'll jump to $9489 aka option_key_handler when option key is pressed setup_option_key_vec: lda #$89 ; 9458 A9 89 .. sta option_key_vec ; 945A 8D C0 06 ... lda #$94 ; 945D A9 94 .. sta option_key_vec+1 ; 945F 8D C1 06 ... sta option_key_enabled ; 9462 8D C6 06 ... ; we'll jump to $94de aka get_player_speeds when start key is pressed setup_start_key_vec: lda #$DE ; 9465 A9 DE .. sta start_key_vec ; 9467 8D C4 06 ... lda #$94 ; 946A A9 94 .. sta start_key_vec+1 ; 946C 8D C5 06 ... ; play sfx_select_key at $95f1 play_select_key_sfx: lda #$F1 ; 946F A9 F1 .. sta snd_ptr ; 9471 8D 3C 06 .<. lda #$95 ; 9474 A9 95 .. sta snd_ptr+1 ; 9476 8D 3D 06 .=. jsr cue_sfx_jv ; 9479 20 06 80 .. ; wait for sound to finish playing wait_sfx: lda snd_slot_duration ; 947C AD 46 06 .F. bne wait_sfx ; 947F D0 FB .. lda #$01 ; 9481 A9 01 .. sta start_key_enabled ; 9483 8D C8 06 ... ; initialization done, everything's done in interrupts from here on out hang_main_thread: jmp hang_main_thread ; 9486 4C 86 94 L.. ; ---------------------------------------------------------------------------- ; called via option_key_vec when someone presses option option_key_handler: lda #$00 ; 9489 A9 00 .. sta option_key_enabled ; 948B 8D C6 06 ... lda zp_temp4 ; 948E A5 B8 .. clc ; 9490 18 . adc #$01 ; 9491 69 01 i. and #$03 ; 9493 29 03 ). sta zp_temp4 ; 9495 85 B8 .. tay ; 9497 A8 . lda number_names_0,y ; 9498 B9 DD 95 ... sta $381D ; 949B 8D 1D 38 ..8 lda number_names_1,y ; 949E B9 E1 95 ... sta $381E ; 94A1 8D 1E 38 ..8 lda number_names_2,y ; 94A4 B9 E5 95 ... sta $381F ; 94A7 8D 1F 38 ..8 lda number_names_3,y ; 94AA B9 E9 95 ... sta $3820 ; 94AD 8D 20 38 . 8 lda number_names_4,y ; 94B0 B9 ED 95 ... sta $3821 ; 94B3 8D 21 38 .!8 lda num_name_hscrol_table,y ; 94B6 B9 D9 95 ... sta HSCROL ; 94B9 8D 04 D4 ... play_opt_key_sfx: lda #$B0 ; 94BC A9 B0 .. sta snd_ptr ; 94BE 8D 3C 06 .<. lda #$8A ; 94C1 A9 8A .. sta snd_ptr+1 ; 94C3 8D 3D 06 .=. jsr cue_sfx_jv ; 94C6 20 06 80 .. lda #$00 ; 94C9 A9 00 .. sta jiffy_timer_1 ; 94CB 8D 1A 06 ... ; wait until it's done playing wait_opt_key_sfx: lda jiffy_timer_1 ; 94CE AD 1A 06 ... cmp #$08 ; 94D1 C9 08 .. bcc wait_opt_key_sfx ; 94D3 90 F9 .. sta option_key_enabled ; 94D5 8D C6 06 ... sta start_key_enabled ; 94D8 8D C8 06 ... jmp hang_main_thread ; 94DB 4C 86 94 L.. ; ---------------------------------------------------------------------------- ; loop up to 4 times, ask PLAYER #n SPEED? and wait for number key press get_player_speeds: lda zp_temp4 ; 94DE A5 B8 .. sta zp_temp5 ; 94E0 85 B9 .. sta number_of_users ; 94E2 8D FF 06 ... sta users_still_alive ; 94E5 8D F4 06 ... lda #$00 ; 94E8 A9 00 .. sta zp_temp4 ; 94EA 85 B8 .. ; disable start and option keys disable_start_opt: sta option_key_enabled ; 94EC 8D C6 06 ... sta start_key_enabled ; 94EF 8D C8 06 ... sta zp_temp6 ; 94F2 85 BA .. inc zp_temp5 ; 94F4 E6 B9 .. inc zp_temp6 ; 94F6 E6 BA .. tay ; 94F8 A8 . ; copy PLAYER #n SPEED? to screen RAM show_player_speed_prompt: ldx #$00 ; 94F9 A2 00 .. psprompt_loop: lda player_x_speed,x ; 94FB BD C5 95 ... sta $382C,y ; 94FE 99 2C 38 .,8 inx ; 9501 E8 . iny ; 9502 C8 . cpx #$14 ; 9503 E0 14 .. bne psprompt_loop ; 9505 D0 F4 .. lda zp_temp6 ; 9507 A5 BA .. sta current_user ; 9509 8D FE 06 ... ora #$90 ; 950C 09 90 .. inc zp_temp6 ; 950E E6 BA .. sta $3821,y ; 9510 99 21 38 .!8 dec zp_temp5 ; 9513 C6 B9 .. bne show_player_speed_prompt ; 9515 D0 E2 .. ; set select key vector to ask_num_players at $9400, enable select key setup_select_key_vec_again: lda #$00 ; 9517 A9 00 .. sta select_key_vec ; 9519 8D C2 06 ... lda #$94 ; 951C A9 94 .. sta select_key_vec+1 ; 951E 8D C3 06 ... sta select_key_enabled ; 9521 8D C7 06 ... dec zp_temp6 ; 9524 C6 BA .. ldy #$12 ; 9526 A0 12 .. ldx #$00 ; 9528 A2 00 .. ; initialize speed to -1 init_speed: lda #$FF ; 952A A9 FF .. sta speed_value ; 952C 8D F9 06 ... ; wait for keyboard IRQ handler to set a speed <= 8 wait_for_speed: lda speed_value ; 952F AD F9 06 ... cmp #$09 ; 9532 C9 09 .. bcs wait_for_speed ; 9534 B0 F9 .. sta $0714,x ; 9536 9D 14 07 ... pha ; 9539 48 H clc ; 953A 18 . ; 11-byte per-user struct? add_11_to_x: txa ; 953B 8A . adc #$0B ; 953C 69 0B i. tax ; 953E AA . pla ; 953F 68 h ; convert to ASCII digit speed_to_ascii: ora #$90 ; 9540 09 90 .. ; show it to the user display_speed: sta $382C,y ; 9542 99 2C 38 .,8 tya ; 9545 98 . clc ; 9546 18 . adc #$14 ; 9547 69 14 i. tay ; 9549 A8 . inc zp_temp4 ; 954A E6 B8 .. dec zp_temp6 ; 954C C6 BA .. bne init_speed ; 954E D0 DA .. inc number_of_users ; 9550 EE FF 06 ... lda number_of_users ; 9553 AD FF 06 ... sta current_user ; 9556 8D FE 06 ... inc current_user ; 9559 EE FE 06 ... jmp afterlife ; 955C 4C 00 96 L.. ; ---------------------------------------------------------------------------- ; display list for 'number of players' screen numplayer_display_list: .byte $70,$70,$70,$70,$47,$00,$38,$70 ; 955F 70 70 70 70 47 00 38 70 ppppG.8p .byte $70,$97,$70,$70,$87,$70,$70,$87 ; 9567 70 97 70 70 87 70 70 87 p.pp.pp. .byte $70,$70,$87,$70,$70,$07,$41,$5F ; 956F 70 70 87 70 70 07 41 5F pp.pp.A_ .byte $95 ; 9577 95 . ; ---------------------------------------------------------------------------- ; DLI service routine, changes COLPF2, address gets stored in $6ae/$6af by code at $944e num_players_dli_service: pha ; 9578 48 H lda zp_temp3 ; 9579 A5 B7 .. cmp zp_temp4 ; 957B C5 B8 .. sta WSYNC ; 957D 8D 0A D4 ... bne L9592 ; 9580 D0 10 .. lda rot_color ; 9582 AD 2A 06 .*. sta COLPF2 ; 9585 8D 18 D0 ... L9588: inc zp_temp3 ; 9588 E6 B7 .. lda zp_temp3 ; 958A A5 B7 .. and #$03 ; 958C 29 03 ). sta zp_temp3 ; 958E 85 B7 .. pla ; 9590 68 h rti ; 9591 40 @ ; ---------------------------------------------------------------------------- L9592: lda COLOR2 ; 9592 AD C6 02 ... sta COLPF2 ; 9595 8D 18 D0 ... numplayers_screen_data_minus_one:= * + 2 ; 1-indexed loop copies from here+1 jmp L9588 ; 9598 4C 88 95 L.. ; ---------------------------------------------------------------------------- ; 'number of players?', gets copied to $3800, see option_key_handler numplayers_screen_data: .byte $00,$6E,$75,$6D,$62,$65,$72,$00 ; 959B 00 6E 75 6D 62 65 72 00 .number. .byte $6F,$66,$00,$70,$6C,$61,$79,$65 ; 95A3 6F 66 00 70 6C 61 79 65 of.playe .byte $72,$73,$5F,$00,$00,$00,$00,$00 ; 95AB 72 73 5F 00 00 00 00 00 rs_..... .byte $00,$00,$00,$00,$00,$00,$EF,$EE ; 95B3 00 00 00 00 00 00 EF EE ........ .byte $E5,$00,$00,$00,$00,$00,$00,$00 ; 95BB E5 00 00 00 00 00 00 00 ........ .byte $00,$00 ; 95C3 00 00 .. ; ' PLAYER # SPEED? ' in PF2 color player_x_speed: .byte $00,$B0,$AC,$A1,$B9,$A5,$B2,$00 ; 95C5 00 B0 AC A1 B9 A5 B2 00 ........ .byte $83,$80,$80,$B3,$B0,$A5,$A5,$A4 ; 95CD 83 80 80 B3 B0 A5 A5 A4 ........ .byte $9F,$00,$00,$00 ; 95D5 9F 00 00 00 .... ; used for centering ONE TWO THREE FOUR, see option_key_handler num_name_hscrol_table: .byte $04,$04,$04,$00 ; 95D9 04 04 04 00 .... ; space space T space (names ONE TWO THREE FOUR) number_names_0: .byte $00,$00,$F4,$00 ; 95DD 00 00 F4 00 .... ; O T H F number_names_1: .byte $EF,$F4,$E8,$E6 ; 95E1 EF F4 E8 E6 .... ; N W R O number_names_2: .byte $EE,$F7,$F2,$EF ; 95E5 EE F7 F2 EF .... ; E O E U number_names_3: .byte $E5,$EF,$E5,$F5 ; 95E9 E5 EF E5 F5 .... ; space space E R number_names_4: .byte $00,$00,$E5,$F2 ; 95ED 00 00 E5 F2 .... ; played when select key pressed, 4 notes, descending sfx_select_key: .byte $01,$A4,$00,$1D,$08,$3C,$08,$79 ; 95F1 01 A4 00 1D 08 3C 08 79 .....<.y .byte $08,$F3,$08,$00 ; 95F9 08 F3 08 00 .... ; not sure what (if anything) reads this, it might be filler. it isn't valid 6502 code. unknown_95fd: .byte $3C,$02,$00 ; 95FD 3C 02 00 <.. ; ---------------------------------------------------------------------------- ; multiple code paths jump here. replay level, load next level, or go back to ask_num_players afterlife: jsr enable_joystick_jv ; 9600 20 1B 80 .. jsr next_player_jv ; 9603 20 27 80 '. lda $06F8 ; 9606 AD F8 06 ... beq L960E ; 9609 F0 03 .. jmp ask_num_players ; 960B 4C 00 94 L.. ; ---------------------------------------------------------------------------- L960E: lda $06F7 ; 960E AD F7 06 ... beq L9616 ; 9611 F0 03 .. jsr init_next_level ; 9613 20 E8 9B .. L9616: lda #$00 ; 9616 A9 00 .. sta bonus_jiffy_timer ; 9618 8D 26 06 .&. sta $06F5 ; 961B 8D F5 06 ... sta COLOR4 ; 961E 8D C8 02 ... jmp L9BD0 ; 9621 4C D0 9B L.. ; ---------------------------------------------------------------------------- ; only in multiplayer games show_get_ready_prompt: ldx current_user ; 9624 AE FE 06 ... lda color0_table_minus_one,x ; 9627 BD 27 97 .'. sta COLOR4 ; 962A 8D C8 02 ... sta COLOR0 ; 962D 8D C4 02 ... ldy #$14 ; 9630 A0 14 .. L9632: lda L9713,y ; 9632 B9 13 97 ... sta $0741,y ; 9635 99 41 07 .A. dey ; 9638 88 . bne L9632 ; 9639 D0 F7 .. lda current_user ; 963B AD FE 06 ... ora #$10 ; 963E 09 10 .. sta $074A ; 9640 8D 4A 07 .J. lda #$00 ; 9643 A9 00 .. sta zp_temp5 ; 9645 85 B9 .. sta jiffy_timer_2 ; 9647 8D 1B 06 ... ; 06ac/06ad gets address of get_ready_dlist (why not SDLSTL/H?) setup_get_ready_dl: lda #$2C ; 964A A9 2C ., sta dlist_shadow_lo ; 964C 8D AC 06 ... lda #$97 ; 964F A9 97 .. sta dlist_shadow_hi ; 9651 8D AD 06 ... lda #$E6 ; 9654 A9 E6 .. sta work_level_sub0 ; 9656 8D 82 07 ... lda #$96 ; 9659 A9 96 .. sta work_level_sub0+1 ; 965B 8D 83 07 ... jsr clear_screen_mem_jv ; 965E 20 1E 80 .. lda cur_level_map ; 9661 AD D6 07 ... sta dm_progctr ; 9664 85 C0 .. lda cur_level_map+1 ; 9666 AD D7 07 ... sta dm_progctr+1 ; 9669 85 C1 .. jsr draw_map_jv ; 966B 20 00 80 .. L966E: lda jiffy_timer_2 ; 966E AD 1B 06 ... cmp #$F2 ; 9671 C9 F2 .. bne L966E ; 9673 D0 F9 .. L9675: ldx #$00 ; 9675 A2 00 .. ; copy cur_level_desc to work_level_desc. done in between players, in a multiplayer game (so each player starts out with a fresh level) copy_work_level_desc: lda cur_level_desc,x ; 9677 BD C0 07 ... sta work_level_desc,x ; 967A 9D 80 07 ... inx ; 967D E8 . cpx #$40 ; 967E E0 40 .@ bne copy_work_level_desc ; 9680 D0 F5 .. ; call start subroutine for current level init_level: lda work_level_init ; 9682 AD A2 07 ... sta $06E1 ; 9685 8D E1 06 ... lda work_level_init+1 ; 9688 AD A3 07 ... sta $06E2 ; 968B 8D E2 06 ... jsr L06E0 ; 968E 20 E0 06 .. ; set color regs from level descriptor (COLOR4 always $00, black) set_level_colors: lda #$00 ; 9691 A9 00 .. sta COLOR4 ; 9693 8D C8 02 ... sta $06AB ; 9696 8D AB 06 ... lda work_level_colpf0 ; 9699 AD AF 07 ... sta COLOR0 ; 969C 8D C4 02 ... lda work_level_colpf1 ; 969F AD B0 07 ... sta COLOR1 ; 96A2 8D C5 02 ... lda work_level_colpf2 ; 96A5 AD B1 07 ... sta COLOR2 ; 96A8 8D C6 02 ... lda work_level_colpf3 ; 96AB AD AE 07 ... sta COLOR3 ; 96AE 8D C7 02 ... jsr setup_gameboard_dlist_jv ; 96B1 20 15 80 .. inc $06F5 ; 96B4 EE F5 06 ... jmp L9BDD ; 96B7 4C DD 9B L.. ; ---------------------------------------------------------------------------- ; maybe this should be check_level or init_level? enter_level: lda #$00 ; 96BA A9 00 .. tay ; 96BC A8 . sta $D7 ; 96BD 85 D7 .. sta $D8 ; 96BF 85 D8 .. inc level ; 96C1 EE F6 06 ... lda level ; 96C4 AD F6 06 ... cmp #$0C ; 96C7 C9 0C .. bne copy_level_desc ; 96C9 D0 03 .. jmp ask_num_players ; 96CB 4C 00 94 L.. ; ---------------------------------------------------------------------------- ; copy level descriptor from levelXX_desc at $A000+(level*$40) to cur_level_desc at $07c0-$07ff copy_level_desc: lsr a ; 96CE 4A J ror $D7 ; 96CF 66 D7 f. lsr a ; 96D1 4A J ror $D7 ; 96D2 66 D7 f. ora #$A0 ; 96D4 09 A0 .. sta $D8 ; 96D6 85 D8 .. sl_loop:lda ($D7),y ; 96D8 B1 D7 .. sta cur_level_desc,y ; 96DA 99 C0 07 ... iny ; 96DD C8 . cpy #$40 ; 96DE C0 40 .@ bne sl_loop ; 96E0 D0 F6 .. jsr draw_level_jv ; 96E2 20 2A 80 *. rts ; 96E5 60 ` ; ---------------------------------------------------------------------------- lda jiffy_timer_2 ; 96E6 AD 1B 06 ... cmp #$F0 ; 96E9 C9 F0 .. bcs L9709 ; 96EB B0 1C .. and #$1F ; 96ED 29 1F ). beq L96F2 ; 96EF F0 01 .. rts ; 96F1 60 ` ; ---------------------------------------------------------------------------- L96F2: lda COLOR0 ; 96F2 AD C4 02 ... cmp #$0F ; 96F5 C9 0F .. beq L96FF ; 96F7 F0 06 .. lda #$0F ; 96F9 A9 0F .. sta COLOR0 ; 96FB 8D C4 02 ... rts ; 96FE 60 ` ; ---------------------------------------------------------------------------- L96FF: ldx current_user ; 96FF AE FE 06 ... lda color0_table_minus_one,x ; 9702 BD 27 97 .'. sta COLOR0 ; 9705 8D C4 02 ... rts ; 9708 60 ` ; ---------------------------------------------------------------------------- L9709: lda #$E6 ; 9709 A9 E6 .. sta work_level_sub0 ; 970B 8D 82 07 ... lda #$06 ; 970E A9 06 .. sta work_level_sub0+1 ; 9710 8D 83 07 ... L9713: rts ; 9713 60 ` ; ---------------------------------------------------------------------------- ; PLAYER GET READY get_ready_msg: .byte $00,$30,$2C,$21,$39,$25,$32,$00 ; 9714 00 30 2C 21 39 25 32 00 .0,!9%2. .byte $00,$00,$27,$25,$34,$00,$32,$25 ; 971C 00 00 27 25 34 00 32 25 ..'%4.2% .byte $21,$24,$39 ; 9724 21 24 39 !$9 ; 1-indexed color0_table_minus_one: .byte $00 ; 9727 00 . ; background colors for GET READY screen (different for each player) color0_table: .byte $96,$24,$C6,$54 ; 9728 96 24 C6 54 .$.T ; 112 blank scanlines, then one GR.2 line, loaded from $0742 get_ready_dlist: .byte $70,$70,$70,$70,$70,$70,$70,$70 ; 972C 70 70 70 70 70 70 70 70 pppppppp .byte $70,$70,$70,$70,$70,$70,$47,$42 ; 9734 70 70 70 70 70 70 47 42 ppppppGB .byte $07,$41,$2C,$97 ; 973C 07 41 2C 97 .A,. ; ---------------------------------------------------------------------------- game_main_loop: jsr materialize_jumpman ; 9740 20 7B 97 {. L9743: jsr check_bomb_coll_jv ; 9743 20 33 80 3. lda work_level_num_bombs ; 9746 AD 8A 07 ... beq got_all_bombs ; 9749 F0 1B .. lda falling_flag ; 974B AD 23 06 .#. cmp #$02 ; 974E C9 02 .. bne L9743 ; 9750 D0 F1 .. L9752: lda falling_flag ; 9752 AD 23 06 .#. cmp #$02 ; 9755 C9 02 .. beq L9752 ; 9757 F0 F9 .. lda lives ; 9759 AD 0A 07 ... cmp #$FF ; 975C C9 FF .. bne game_main_loop ; 975E D0 E0 .. jsr call_eol_sub ; 9760 20 6C 97 l. jmp crumble_gameboard_jv ; 9763 4C 30 80 L0. ; ---------------------------------------------------------------------------- got_all_bombs: jsr call_eol_sub ; 9766 20 6C 97 l. jmp level_finished_jv ; 9769 4C 2D 80 L-. ; ---------------------------------------------------------------------------- call_eol_sub: lda work_level_sub_eol ; 976C AD A6 07 ... sta $06E4 ; 976F 8D E4 06 ... lda work_level_sub_eol+1 ; 9772 AD A7 07 ... sta $06E5 ; 9775 8D E5 06 ... jmp L06E3 ; 9778 4C E3 06 L.. ; ---------------------------------------------------------------------------- materialize_jumpman: jsr update_status_window_jv ; 977B 20 12 80 .. ldx #$04 ; 977E A2 04 .. lda #$00 ; 9780 A9 00 .. mj_clear_loop: sta $0755,x ; 9782 9D 55 07 .U. sta $069A,x ; 9785 9D 9A 06 ... sta $06EA,x ; 9788 9D EA 06 ... sta jump_frame,x ; 978B 9D EB 06 ... dex ; 978E CA . bne mj_clear_loop ; 978F D0 F1 .. sta $0697 ; 9791 8D 97 06 ... sta $0698 ; 9794 8D 98 06 ... sta PCOLR0 ; 9797 8D C0 02 ... sta zp_temp6 ; 979A 85 BA .. sta AUDF4 ; 979C 8D 06 D2 ... lda work_level_y_start ; 979F AD 8C 07 ... sta player_y_pos ; 97A2 8D 83 06 ... lda work_level_x_start ; 97A5 AD 8D 07 ... sta player_x_pos ; 97A8 8D 7E 06 .~. lda #$01 ; 97AB A9 01 .. sta $0688 ; 97AD 8D 88 06 ... lda #$A5 ; 97B0 A9 A5 .. sta AUDC4 ; 97B2 8D 07 D2 ... inc $066A ; 97B5 EE 6A 06 .j. inc $066B ; 97B8 EE 6B 06 .k. mj_set_freq_and_color: inc zp_temp6 ; 97BB E6 BA .. beq mj_done ; 97BD F0 1C .. lda zp_temp6 ; 97BF A5 BA .. sta AUDF4 ; 97C1 8D 06 D2 ... lsr a ; 97C4 4A J lsr a ; 97C5 4A J lsr a ; 97C6 4A J lsr a ; 97C7 4A J sta PCOLR0 ; 97C8 8D C0 02 ... ldx #$FF ; 97CB A2 FF .. mj_delay: dex ; 97CD CA . nop ; 97CE EA . nop ; 97CF EA . nop ; 97D0 EA . nop ; 97D1 EA . nop ; 97D2 EA . nop ; 97D3 EA . nop ; 97D4 EA . nop ; 97D5 EA . bne mj_delay ; 97D6 D0 F5 .. jmp mj_set_freq_and_color ; 97D8 4C BB 97 L.. ; ---------------------------------------------------------------------------- mj_done:lda #$00 ; 97DB A9 00 .. sta AUDF4 ; 97DD 8D 06 D2 ... sta AUDC4 ; 97E0 8D 07 D2 ... sta falling_flag ; 97E3 8D 23 06 .#. lda initial_speed ; 97E6 AD 25 06 .%. sta current_speed ; 97E9 8D 24 06 .$. inc playing_level ; 97EC EE 27 06 .'. rts ; 97EF 60 ` ; ---------------------------------------------------------------------------- zero_filler_97f0: .byte $00,$00,$00,$00,$00,$00,$00,$00 ; 97F0 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; 97F8 00 00 00 00 00 00 00 00 ........ ; ---------------------------------------------------------------------------- ; called via vector in page 6 check_falling_1: lda start_falling_flag ; 9800 AD 21 06 .!. bne L9806 ; 9803 D0 01 .. cf_done:rts ; 9805 60 ` ; ---------------------------------------------------------------------------- L9806: lda falling_flag ; 9806 AD 23 06 .#. bne cf_done ; 9809 D0 FA .. lda player_y_pos ; 980B AD 83 06 ... ; we're falling, have we hit the ground yet? check_ground: cmp #$C6 ; 980E C9 C6 .. bcs L982E ; 9810 B0 1C .. lda jump_frame ; 9812 AD EB 06 ... beq check_collisions_2 ; 9815 F0 03 .. jmp mid_jump ; 9817 4C A8 99 L.. ; ---------------------------------------------------------------------------- ; did player 0 or 1 hit the playfield... check_collisions_2: lda #$01 ; 981A A9 01 .. sta $0688 ; 981C 8D 88 06 ... lda $06ED ; 981F AD ED 06 ... beq check_collisions_3 ; 9822 F0 0E .. lda sav_p0pf ; 9824 AD B4 06 ... ora sav_p1pf ; 9827 0D B5 06 ... and #$03 ; 982A 29 03 ). bne check_collisions_3 ; 982C D0 04 .. L982E: inc falling_flag ; 982E EE 23 06 .#. rts ; 9831 60 ` ; ---------------------------------------------------------------------------- ; movement/jumping only allowed if player's touching the playfield check_collisions_3: lda #$00 ; 9832 A9 00 .. sta $06ED ; 9834 8D ED 06 ... lda sav_p0pf ; 9837 AD B4 06 ... ora sav_p1pf ; 983A 0D B5 06 ... and #$03 ; 983D 29 03 ). bne check_trigger_state ; 983F D0 0C .. inc $06ED ; 9841 EE ED 06 ... inc player_y_pos ; 9844 EE 83 06 ... inc player_y_pos ; 9847 EE 83 06 ... jmp L989F ; 984A 4C 9F 98 L.. ; ---------------------------------------------------------------------------- ; did user press the trigger? check_trigger_state: lda trigger_state ; 984D AD 35 06 .5. bne check_up_down ; 9850 D0 03 .. ; yes, jump to handler trig_jmp: jmp trigger_handler ; 9852 4C 85 99 L.. ; ---------------------------------------------------------------------------- ; did user move joystick up/down? check_up_down: lda joystick_state ; 9855 AD 33 06 .3. cmp #$0E ; 9858 C9 0E .. beq L9863 ; 985A F0 07 .. cmp #$0D ; 985C C9 0D .. beq L9863 ; 985E F0 03 .. ; no, jump over handler cud_jmp:jmp L9892 ; 9860 4C 92 98 L.. ; ---------------------------------------------------------------------------- L9863: lda sav_p0pf ; 9863 AD B4 06 ... ora sav_p1pf ; 9866 0D B5 06 ... and #$02 ; 9869 29 02 ). bne L9870 ; 986B D0 03 .. jmp L98D0 ; 986D 4C D0 98 L.. ; ---------------------------------------------------------------------------- L9870: jsr check_up_down_2 ; 9870 20 3B 99 ;. bcs L9878 ; 9873 B0 03 .. jmp L98D0 ; 9875 4C D0 98 L.. ; ---------------------------------------------------------------------------- L9878: sta player_x_pos ; 9878 8D 7E 06 .~. lda player_delta_y ; 987B AD 31 06 .1. asl a ; 987E 0A . clc ; 987F 18 . adc player_y_pos ; 9880 6D 83 06 m.. sta player_y_pos ; 9883 8D 83 06 ... lda $0620 ; 9886 AD 20 06 . . clc ; 9889 18 . adc #$04 ; 988A 69 04 i. sta $0688 ; 988C 8D 88 06 ... jmp play_sfx_climb ; 988F 4C 80 8A L.. ; ---------------------------------------------------------------------------- L9892: lda sav_p0pf ; 9892 AD B4 06 ... ora sav_p1pf ; 9895 0D B5 06 ... and #$01 ; 9898 29 01 ). bne L989F ; 989A D0 03 .. jmp L98D0 ; 989C 4C D0 98 L.. ; ---------------------------------------------------------------------------- L989F: lda player_delta_x ; 989F AD 30 06 .0. beq L98D0 ; 98A2 F0 2C ., asl a ; 98A4 0A . ldx #$08 ; 98A5 A2 08 .. cmp #$02 ; 98A7 C9 02 .. beq L98AD ; 98A9 F0 02 .. ldx #$0C ; 98AB A2 0C .. L98AD: clc ; 98AD 18 . adc player_x_pos ; 98AE 6D 7E 06 m~. sta player_x_pos ; 98B1 8D 7E 06 .~. txa ; 98B4 8A . clc ; 98B5 18 . adc $0620 ; 98B6 6D 20 06 m . sta $0688 ; 98B9 8D 88 06 ... lda $061F ; 98BC AD 1F 06 ... bne L98D0 ; 98BF D0 0F .. ; horizontal movement play_sfx_walk: lda #$73 ; 98C1 A9 73 .s sta snd_slot_priority ; 98C3 8D 3E 06 .>. lda #$BE ; 98C6 A9 BE .. sta snd_slot_timer ; 98C8 8D 3F 06 .?. lda #$01 ; 98CB A9 01 .. jsr cue_sfx_lowprior_jv ; 98CD 20 03 80 .. L98D0: lda sav_p0pf ; 98D0 AD B4 06 ... ora sav_p1pf ; 98D3 0D B5 06 ... and #$02 ; 98D6 29 02 ). beq L98F0 ; 98D8 F0 16 .. jsr L9971 ; 98DA 20 71 99 q. bcc L990F ; 98DD 90 30 .0 inc player_y_pos ; 98DF EE 83 06 ... inc player_y_pos ; 98E2 EE 83 06 ... lda $061F ; 98E5 AD 1F 06 ... ora #$02 ; 98E8 09 02 .. sta $0688 ; 98EA 8D 88 06 ... jmp L9925 ; 98ED 4C 25 99 L%. ; ---------------------------------------------------------------------------- L98F0: lda sav_p0pf ; 98F0 AD B4 06 ... and #$01 ; 98F3 29 01 ). beq L990F ; 98F5 F0 18 .. dec player_y_pos ; 98F7 CE 83 06 ... dec player_y_pos ; 98FA CE 83 06 ... lda $0688 ; 98FD AD 88 06 ... cmp #$01 ; 9900 C9 01 .. bne L990F ; 9902 D0 0B .. lda $061F ; 9904 AD 1F 06 ... ora #$02 ; 9907 09 02 .. sta $0688 ; 9909 8D 88 06 ... jmp L9925 ; 990C 4C 25 99 L%. ; ---------------------------------------------------------------------------- L990F: lda $0688 ; 990F AD 88 06 ... cmp #$01 ; 9912 C9 01 .. bne L9925 ; 9914 D0 0F .. lda sav_p0pf ; 9916 AD B4 06 ... ora sav_p1pf ; 9919 0D B5 06 ... and #$02 ; 991C 29 02 ). beq L9925 ; 991E F0 05 .. lda #$04 ; 9920 A9 04 .. sta $0688 ; 9922 8D 88 06 ... L9925: lda $0688 ; 9925 AD 88 06 ... sta $0689 ; 9928 8D 89 06 ... lda player_x_pos ; 992B AD 7E 06 .~. sta $067F ; 992E 8D 7F 06 ... lda player_y_pos ; 9931 AD 83 06 ... clc ; 9934 18 . adc #$0A ; 9935 69 0A i. sta $0684 ; 9937 8D 84 06 ... rts ; 993A 60 ` ; ---------------------------------------------------------------------------- ; did user move joystick up/down? check_up_down_2: lda joystick_state ; 993B AD 33 06 .3. cmp #$0D ; 993E C9 0D .. bne L9949 ; 9940 D0 07 .. lda player_y_pos ; 9942 AD 83 06 ... cmp #$C0 ; 9945 C9 C0 .. bcs L9967 ; 9947 B0 1E .. L9949: lda player_x_pos ; 9949 AD 7E 06 .~. sec ; 994C 38 8 sbc #$30 ; 994D E9 30 .0 sta zp_temp1 ; 994F 85 CB .. ldx #$08 ; 9951 A2 08 .. L9953: lda work_level_colpf2,x ; 9953 BD B1 07 ... clc ; 9956 18 . adc #$02 ; 9957 69 02 i. cmp zp_temp1 ; 9959 C5 CB .. bcc L9964 ; 995B 90 07 .. sec ; 995D 38 8 sbc #$05 ; 995E E9 05 .. cmp zp_temp1 ; 9960 C5 CB .. bcc L9969 ; 9962 90 05 .. L9964: dex ; 9964 CA . bne L9953 ; 9965 D0 EC .. L9967: clc ; 9967 18 . rts ; 9968 60 ` ; ---------------------------------------------------------------------------- L9969: lda work_level_colpf2,x ; 9969 BD B1 07 ... clc ; 996C 18 . adc #$30 ; 996D 69 30 i0 sec ; 996F 38 8 rts ; 9970 60 ` ; ---------------------------------------------------------------------------- L9971: lda player_x_pos ; 9971 AD 7E 06 .~. sec ; 9974 38 8 sbc #$30 ; 9975 E9 30 .0 ldx #$06 ; 9977 A2 06 .. L9979: cmp work_level_offs_55+2,x ; 9979 DD B9 07 ... beq L9983 ; 997C F0 05 .. dex ; 997E CA . bne L9979 ; 997F D0 F8 .. clc ; 9981 18 . rts ; 9982 60 ` ; ---------------------------------------------------------------------------- L9983: sec ; 9983 38 8 rts ; 9984 60 ` ; ---------------------------------------------------------------------------- ; handle trigger presses, maybe start a jump, if player is moving up, left, or right trigger_handler: ldx #$04 ; 9985 A2 04 .. lda joystick_state ; 9987 AD 33 06 .3. cmp #$0E ; 998A C9 0E .. beq start_jump ; 998C F0 12 .. ldx #$10 ; 998E A2 10 .. lda player_delta_x ; 9990 AD 30 06 .0. cmp #$01 ; 9993 C9 01 .. beq start_jump ; 9995 F0 09 .. ldx #$11 ; 9997 A2 11 .. cmp #$FF ; 9999 C9 FF .. beq start_jump ; 999B F0 03 .. jmp check_up_down ; 999D 4C 55 98 LU. ; ---------------------------------------------------------------------------- ; start jumping, play sfx_jump start_jump: stx $0688 ; 99A0 8E 88 06 ... lda #$01 ; 99A3 A9 01 .. jsr cue_music_jv ; 99A5 20 18 80 .. ; check & see if we're done jumping mid_jump: inc jump_frame ; 99A8 EE EB 06 ... lda jump_frame ; 99AB AD EB 06 ... ; $15 aka 21 frames? is_jump_done: cmp #$16 ; 99AE C9 16 .. bne continue_jump ; 99B0 D0 0B .. ; we hit a girder/rope/ladder in mid-jump, or else the jump finished without hitting anything(?). this does not (?) include the bottom of the level end_jump: lda #$00 ; 99B2 A9 00 .. sta jump_frame ; 99B4 8D EB 06 ... sta $06ED ; 99B7 8D ED 06 ... jmp check_collisions_2 ; 99BA 4C 1A 98 L.. ; ---------------------------------------------------------------------------- ; we're in mid-jump and didn't hit anything, keep going continue_jump: ldx jump_frame ; 99BD AE EB 06 ... lda jump_delta_x_table_minus_one,x ; 99C0 BD 1B 9A ... tay ; 99C3 A8 . lda $0688 ; 99C4 AD 88 06 ... cmp #$10 ; 99C7 C9 10 .. beq L99DD ; 99C9 F0 12 .. cmp #$11 ; 99CB C9 11 .. bne L99DB ; 99CD D0 0C .. tya ; 99CF 98 . sta zp_temp1+1 ; 99D0 85 CC .. lda #$00 ; 99D2 A9 00 .. sec ; 99D4 38 8 sbc zp_temp1+1 ; 99D5 E5 CC .. tay ; 99D7 A8 . jmp L99DD ; 99D8 4C DD 99 L.. ; ---------------------------------------------------------------------------- L99DB: ldy #$00 ; 99DB A0 00 .. L99DD: clc ; 99DD 18 . tya ; 99DE 98 . adc player_x_pos ; 99DF 6D 7E 06 m~. sta player_x_pos ; 99E2 8D 7E 06 .~. lda jump_delta_y_table_minus_one,x ; 99E5 BD 31 9A .1. clc ; 99E8 18 . adc player_y_pos ; 99E9 6D 83 06 m.. sta player_y_pos ; 99EC 8D 83 06 ... txa ; 99EF 8A . cmp #$08 ; 99F0 C9 08 .. bcs code_99f7 ; 99F2 B0 03 .. jmp L9925 ; 99F4 4C 25 99 L%. ; ---------------------------------------------------------------------------- code_99f7: lda sav_p0pf ; 99F7 AD B4 06 ... ora sav_p1pf ; 99FA 0D B5 06 ... lsr a ; 99FD 4A J bcs end_jump ; 99FE B0 B2 .. lsr a ; 9A00 4A J bcc L9A19 ; 9A01 90 16 .. lda $0688 ; 9A03 AD 88 06 ... cmp #$04 ; 9A06 C9 04 .. beq L9A19 ; 9A08 F0 0F .. jsr L9971 ; 9A0A 20 71 99 q. bcs end_jump ; 9A0D B0 A3 .. jsr check_up_down_2 ; 9A0F 20 3B 99 ;. bcc L9A19 ; 9A12 90 05 .. cmp player_x_pos ; 9A14 CD 7E 06 .~. beq end_jump ; 9A17 F0 99 .. L9A19: jump_delta_x_table_minus_one:= * + 2 ; 1-indexed... jmp L9925 ; 9A19 4C 25 99 L%. ; ---------------------------------------------------------------------------- ; used by continue_jump, the amount of X movement per frame of jumping (for either direction, left or right) jump_delta_x_table: .byte $02,$00,$02,$00,$02,$02,$02,$02 ; 9A1C 02 00 02 00 02 02 02 02 ........ .byte $02,$02,$02,$00,$02,$00,$02,$00 ; 9A24 02 02 02 00 02 00 02 00 ........ .byte $00,$02,$00,$00,$00 ; 9A2C 00 02 00 00 00 ..... ; 1-indexed... jump_delta_y_table_minus_one: .byte $02 ; 9A31 02 . ; used by continue_jump, amount of Y movement per frame ($FE is -2, or 2 scanlines up, $02 is 2 scanlines down) jump_delta_y_table: .byte $FE,$FE,$FE,$FE,$FE,$FE,$00,$00 ; 9A32 FE FE FE FE FE FE 00 00 ........ .byte $00,$02,$02,$02,$02,$02,$02,$02 ; 9A3A 00 02 02 02 02 02 02 02 ........ .byte $02,$02,$02,$02,$02,$00 ; 9A42 02 02 02 02 02 00 ...... zero_filler_9a48: .byte $00,$00,$00,$00,$00,$00,$00,$00 ; 9A48 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; 9A50 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00 ; 9A58 00 00 00 00 .... ; ---------------------------------------------------------------------------- ; work_user and struct_user_{1..4}, 11 * 5 (55 aka $37) bytes init_struct_users: ldy #$00 ; 9A5C A0 00 .. isu_next_su: ldx #$00 ; 9A5E A2 00 .. isu_next_byte: lda struct_users_init_contents,x ; 9A60 BD 71 9A .q. sta score,y ; 9A63 99 00 07 ... inx ; 9A66 E8 . iny ; 9A67 C8 . cpx #$0B ; 9A68 E0 0B .. bne isu_next_byte ; 9A6A D0 F4 .. cpy #$37 ; 9A6C C0 37 .7 bne isu_next_su ; 9A6E D0 EE .. rts ; 9A70 60 ` ; ---------------------------------------------------------------------------- ; work_user and struct_user_1 to _4 are initialized to this struct_users_init_contents: .byte $00,$00,$00,$4C,$1D,$00,$00,$00 ; 9A71 00 00 00 4C 1D 00 00 00 ...L.... .byte $00,$06,$03 ; 9A79 00 06 03 ... ; ---------------------------------------------------------------------------- ; multiply current player number by 11, return result in Y mul_player_11: ldx current_user ; 9A7C AE FE 06 ... lda #$00 ; 9A7F A9 00 .. clc ; 9A81 18 . add_11: dex ; 9A82 CA . beq return_y ; 9A83 F0 05 .. adc #$0B ; 9A85 69 0B i. jmp add_11 ; 9A87 4C 82 9A L.. ; ---------------------------------------------------------------------------- return_y: tay ; 9A8A A8 . rts ; 9A8B 60 ` ; ---------------------------------------------------------------------------- save_struct_user: ldx #$00 ; 9A8C A2 00 .. ssp_loop: lda score,x ; 9A8E BD 00 07 ... sta struct_user_1,y ; 9A91 99 0B 07 ... inx ; 9A94 E8 . iny ; 9A95 C8 . cpx #$0B ; 9A96 E0 0B .. bne ssp_loop ; 9A98 D0 F4 .. rts ; 9A9A 60 ` ; ---------------------------------------------------------------------------- load_struct_user: ldx #$00 ; 9A9B A2 00 .. lsp_loop: lda struct_user_1,y ; 9A9D B9 0B 07 ... sta score,x ; 9AA0 9D 00 07 ... inx ; 9AA3 E8 . iny ; 9AA4 C8 . cpx #$0B ; 9AA5 E0 0B .. bne lsp_loop ; 9AA7 D0 F4 .. rts ; 9AA9 60 ` ; ---------------------------------------------------------------------------- ; used in multiplayer games, also called in single player (?) next_player: jsr mul_player_11 ; 9AAA 20 7C 9A |. jsr save_struct_user ; 9AAD 20 8C 9A .. lda #$00 ; 9AB0 A9 00 .. sta $06F7 ; 9AB2 8D F7 06 ... sta $06F8 ; 9AB5 8D F8 06 ... ; wraparound to 1 if > total users next_user_num: inc current_user ; 9AB8 EE FE 06 ... lda number_of_users ; 9ABB AD FF 06 ... cmp current_user ; 9ABE CD FE 06 ... bcs look_for_alive ; 9AC1 B0 08 .. lda #$01 ; 9AC3 A9 01 .. sta current_user ; 9AC5 8D FE 06 ... sta $06F7 ; 9AC8 8D F7 06 ... look_for_alive: ldx users_still_alive ; 9ACB AE F4 06 ... inx ; 9ACE E8 . ldy mul_11_table_minus_one,x ; 9ACF BC FB 9A ... is_user_dead: lda $0715,y ; 9AD2 B9 15 07 ... cmp #$FF ; 9AD5 C9 FF .. bne check_lives ; 9AD7 D0 0C .. tya ; 9AD9 98 . sec ; 9ADA 38 8 sbc #$0B ; 9ADB E9 0B .. tay ; 9ADD A8 . dex ; 9ADE CA . bne is_user_dead ; 9ADF D0 F1 .. inc $06F8 ; 9AE1 EE F8 06 ... rts ; 9AE4 60 ` ; ---------------------------------------------------------------------------- ; if user hasn't been eliminated, but is out of lives, eliminate him check_lives: stx number_of_users ; 9AE5 8E FF 06 ... jsr mul_player_11 ; 9AE8 20 7C 9A |. jsr load_struct_user ; 9AEB 20 9B 9A .. lda lives ; 9AEE AD 0A 07 ... cmp #$FF ; 9AF1 C9 FF .. beq next_user_num ; 9AF3 F0 C3 .. ; found the next user that isn't dead user_alive: lda $0709 ; 9AF5 AD 09 07 ... sta initial_speed ; 9AF8 8D 25 06 .%. ; 1-indexed mul_11_table_minus_one: rts ; 9AFB 60 ` ; ---------------------------------------------------------------------------- mul_11_table: .byte $00,$0B,$16,$21 ; 9AFC 00 0B 16 21 ...! ; ---------------------------------------------------------------------------- ; for some reason there are 2 copies of the display list, at $0800 and $0881 setup_gameboard_dlist: ldx #$00 ; 9B00 A2 00 .. lda dlist_shadow_lo ; 9B02 AD AC 06 ... bne L9B09 ; 9B05 D0 02 .. ldx #$81 ; 9B07 A2 81 .. L9B09: lda #$70 ; 9B09 A9 70 .p stx $9F ; 9B0B 86 9F .. ldy #$03 ; 9B0D A0 03 .. sty $9D ; 9B0F 84 9D .. L9B11: sta $0800,x ; 9B11 9D 00 08 ... inx ; 9B14 E8 . dey ; 9B15 88 . bne L9B11 ; 9B16 D0 F9 .. ldy $06AB ; 9B18 AC AB 06 ... L9B1B: lda gameboard_dlist_data,y ; 9B1B B9 62 9B .b. sta $0800,x ; 9B1E 9D 00 08 ... iny ; 9B21 C8 . inx ; 9B22 E8 . dec $9D ; 9B23 C6 9D .. bne L9B1B ; 9B25 D0 F4 .. L9B27: lda gameboard_dlist_data,y ; 9B27 B9 62 9B .b. beq L9B3E ; 9B2A F0 12 .. sta $9D ; 9B2C 85 9D .. iny ; 9B2E C8 . lda gameboard_dlist_data,y ; 9B2F B9 62 9B .b. L9B32: sta $0800,x ; 9B32 9D 00 08 ... inx ; 9B35 E8 . dec $9D ; 9B36 C6 9D .. bne L9B32 ; 9B38 D0 F8 .. iny ; 9B3A C8 . jmp L9B27 ; 9B3B 4C 27 9B L'. ; ---------------------------------------------------------------------------- L9B3E: lda #$41 ; 9B3E A9 41 .A sta $0800,x ; 9B40 9D 00 08 ... inx ; 9B43 E8 . lda $9F ; 9B44 A5 9F .. sta $0800,x ; 9B46 9D 00 08 ... sta dlist_shadow_lo ; 9B49 8D AC 06 ... inx ; 9B4C E8 . lda #$08 ; 9B4D A9 08 .. sta $0800,x ; 9B4F 9D 00 08 ... sta dlist_shadow_hi ; 9B52 8D AD 06 ... lda L9B63,y ; 9B55 B9 63 9B .c. sta dli_vec_shadow_lo ; 9B58 8D AE 06 ... lda L9B64,y ; 9B5B B9 64 9B .d. sta dli_vec_shadow_hi ; 9B5E 8D AF 06 ... rts ; 9B61 60 ` ; ---------------------------------------------------------------------------- ; this isn't used as-is for a display list, see setup_gameboard_dlist gameboard_dlist_data: .byte $4D ; 9B62 4D M L9B63: .byte $00 ; 9B63 00 . L9B64: .byte $30,$56,$0D,$01,$8D,$01,$8D,$01 ; 9B64 30 56 0D 01 8D 01 8D 01 0V...... .byte $06,$01,$86,$00,$72,$9B ; 9B6C 06 01 86 00 72 9B ....r. ; ---------------------------------------------------------------------------- ; changes DLI vector to point to dli_chained_2 dli_chained_1: pha ; 9B72 48 H lda #$54 ; 9B73 A9 54 .T sta WSYNC ; 9B75 8D 0A D4 ... sta COLBK ; 9B78 8D 1A D0 ... lda #$87 ; 9B7B A9 87 .. sta VDSLST ; 9B7D 8D 00 02 ... lda #$9B ; 9B80 A9 9B .. sta VDSLST+1 ; 9B82 8D 01 02 ... pla ; 9B85 68 h rti ; 9B86 40 @ ; ---------------------------------------------------------------------------- ; changes DLI vector to point to dli_chained_3 dli_chained_2: pha ; 9B87 48 H lda #$00 ; 9B88 A9 00 .. sta WSYNC ; 9B8A 8D 0A D4 ... sta COLBK ; 9B8D 8D 1A D0 ... lda rot_color ; 9B90 AD 2A 06 .*. sta COLPF0 ; 9B93 8D 16 D0 ... lda #$28 ; 9B96 A9 28 .( sta COLPF1 ; 9B98 8D 17 D0 ... lda #$AA ; 9B9B A9 AA .. sta COLPF2 ; 9B9D 8D 18 D0 ... lda #$0F ; 9BA0 A9 0F .. sta COLPF3 ; 9BA2 8D 19 D0 ... lda #$B1 ; 9BA5 A9 B1 .. sta VDSLST ; 9BA7 8D 00 02 ... lda #$9B ; 9BAA A9 9B .. sta VDSLST+1 ; 9BAC 8D 01 02 ... pla ; 9BAF 68 h rti ; 9BB0 40 @ ; ---------------------------------------------------------------------------- ; changes DLI vector to point to dli_chained_1 dli_chained_3: pha ; 9BB1 48 H lda #$54 ; 9BB2 A9 54 .T sta WSYNC ; 9BB4 8D 0A D4 ... sta COLBK ; 9BB7 8D 1A D0 ... lda #$72 ; 9BBA A9 72 .r sta VDSLST ; 9BBC 8D 00 02 ... lda #$9B ; 9BBF A9 9B .. sta VDSLST+1 ; 9BC1 8D 01 02 ... pla ; 9BC4 68 h rti ; 9BC5 40 @ ; ---------------------------------------------------------------------------- ; filler, or leftover after a binary patch? random_9b: .byte $9B ; 9BC6 9B . ; ---------------------------------------------------------------------------- sta VDSLST+1 ; 9BC7 8D 01 02 ... pla ; 9BCA 68 h rti ; 9BCB 40 @ ; ---------------------------------------------------------------------------- zero_filler_9bcc: .byte $00,$00,$00,$00 ; 9BCC 00 00 00 00 .... ; ---------------------------------------------------------------------------- L9BD0: lda users_still_alive ; 9BD0 AD F4 06 ... cmp #$00 ; 9BD3 C9 00 .. beq L9BDA ; 9BD5 F0 03 .. jmp show_get_ready_prompt ; 9BD7 4C 24 96 L$. ; ---------------------------------------------------------------------------- L9BDA: jmp L9675 ; 9BDA 4C 75 96 Lu. ; ---------------------------------------------------------------------------- L9BDD: lda #$06 ; 9BDD A9 06 .. sta $085E ; 9BDF 8D 5E 08 .^. sta $08DF ; 9BE2 8D DF 08 ... jmp (work_level_sub6) ; 9BE5 6C A4 07 l.. ; ---------------------------------------------------------------------------- ; ... init_next_level: lda randomizer_mode ; 9BE8 AD F3 06 ... beq L9BFC ; 9BEB F0 0F .. ; only after beating levels 1-12 in order randomize_level: lda RANDOM ; 9BED AD 0A D2 ... and #$0F ; 9BF0 29 0F ). cmp #$0C ; 9BF2 C9 0C .. bcs randomize_level ; 9BF4 B0 F7 .. sta level ; 9BF6 8D F6 06 ... dec level ; 9BF9 CE F6 06 ... L9BFC: jmp enter_level ; 9BFC 4C BA 96 L.. ; ---------------------------------------------------------------------------- zero_filler_9bff: .byte $00 ; 9BFF 00 . ; ---------------------------------------------------------------------------- ; only use of keyboard is to enter player speed(s) before starting game keyboard_isr: txa ; 9C00 8A . pha ; 9C01 48 H ldx #$08 ; 9C02 A2 08 .. lda KBCODE ; 9C04 AD 09 D2 ... check_keycode: cmp keycode_table_minus_one,x ; 9C07 DD 18 9C ... beq store_speed_value ; 9C0A F0 07 .. dex ; 9C0C CA . bne check_keycode ; 9C0D D0 F8 .. keyboard_isr_exit: pla ; 9C0F 68 h tax ; 9C10 AA . pla ; 9C11 68 h rti ; 9C12 40 @ ; ---------------------------------------------------------------------------- store_speed_value: stx speed_value ; 9C13 8E F9 06 ... keycode_table_minus_one:= * + 2 jmp keyboard_isr_exit ; 9C16 4C 0F 9C L.. ; ---------------------------------------------------------------------------- keycode_table: .byte $1F,$1E,$1A,$18,$1D,$1B,$33,$35 ; 9C19 1F 1E 1A 18 1D 1B 33 35 ......35 ; definitions for level graphics objects aka shapes. (girder segment, ladder, rope, etc) level_gfx: .byte $00,$00,$00,$00,$00,$00,$00,$00 ; 9C21 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; 9C29 00 00 00 00 00 00 00 00 ........ .byte $00,$00 ; 9C31 00 00 .. ; 3 rows of pixels. 1st: 04 = 4 pixels wide, 00 00 = no X/Y offset, 01 01 01 01 = actual pixel data (4 color0 pixels). see level_maps.txt sh_girder: .byte $04,$00,$00,$01,$01,$01,$01,$04 ; 9C33 04 00 00 01 01 01 01 04 ........ .byte $00,$01,$01,$00,$01,$00,$04,$00 ; 9C3B 00 01 01 00 01 00 04 00 ........ .byte $02,$01,$01,$01,$01,$FF ; 9C43 02 01 01 01 01 FF ...... ; all the bombs on blackout are drawn as this sh_black_4x3: .byte $04,$00,$00,$00,$00,$00,$00,$04 ; 9C49 04 00 00 00 00 00 00 04 ........ .byte $00,$01,$00,$00,$00,$00,$04,$00 ; 9C51 00 01 00 00 00 00 04 00 ........ .byte $02,$00,$00,$00,$00,$FF ; 9C59 02 00 00 00 00 FF ...... sh_ladder: .byte $02,$00,$00,$02,$02,$02,$06,$00 ; 9C5F 02 00 00 02 02 02 06 00 ........ .byte $02,$02,$02,$00,$01,$02,$02,$02 ; 9C67 02 02 02 00 01 02 02 02 ........ .byte $06,$01,$02,$02,$08,$00,$02,$02 ; 9C6F 06 01 02 02 08 00 02 02 ........ .byte $02,$02,$02,$02,$02,$02,$02,$02 ; 9C77 02 02 02 02 02 02 02 02 ........ .byte $00,$03,$02,$02,$02,$06,$03,$02 ; 9C7F 00 03 02 02 02 06 03 02 ........ .byte $02,$FF ; 9C87 02 FF .. ; ladder in black pixels, used for erasing ladders sh_black_ladder: .byte $02,$00,$00,$00,$00,$02,$06,$00 ; 9C89 02 00 00 00 00 02 06 00 ........ .byte $00,$00,$02,$00,$01,$00,$00,$02 ; 9C91 00 00 02 00 01 00 00 02 ........ .byte $06,$01,$00,$00,$08,$00,$02,$00 ; 9C99 06 01 00 00 08 00 02 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$02 ; 9CA1 00 00 00 00 00 00 00 02 ........ .byte $00,$03,$00,$00,$02,$06,$03,$00 ; 9CA9 00 03 00 00 02 06 03 00 ........ .byte $00,$FF ; 9CB1 00 FF .. sh_bomb:.byte $04,$00,$00,$00,$03,$03,$00,$04 ; 9CB3 04 00 00 00 03 03 00 04 ........ .byte $00,$01,$03,$00,$00,$03,$04,$00 ; 9CBB 00 01 03 00 00 03 04 00 ........ .byte $02,$00,$03,$03,$00,$FF ; 9CC3 02 00 03 03 00 FF ...... sh_up_rope: .byte $01,$00,$00,$01,$01,$01,$01,$01 ; 9CC9 01 00 00 01 01 01 01 01 ........ .byte $01,$00,$02,$01,$01,$01,$03,$01 ; 9CD1 01 00 02 01 01 01 03 01 ........ .byte $FF ; 9CD9 FF . sh_down_rope: .byte $01,$00,$00,$02,$01,$00,$01,$02 ; 9CDA 01 00 00 02 01 00 01 02 ........ .byte $01,$01,$02,$02,$01,$01,$03,$02 ; 9CE2 01 01 02 02 01 01 03 02 ........ .byte $FF ; 9CEA FF . ; not sure where this is used, probably for erasing ropes sh_black_2x4: .byte $02,$00,$00,$00,$00,$02,$00,$01 ; 9CEB 02 00 00 00 00 02 00 01 ........ .byte $00,$00,$02,$00,$02,$00,$00,$02 ; 9CF3 00 00 02 00 02 00 00 02 ........ .byte $00,$03,$00,$00,$FF ; 9CFB 00 03 00 00 FF ..... ; jumpman's animation frames, 10 bytes per sprite sprite_table: .byte $18,$18,$3C,$5A,$3C,$18,$18,$18 ; 9D00 18 18 3C 5A 3C 18 18 18 ..# `.. .byte $3D,$5A,$98,$18,$3C,$24,$22,$33 ; 9D48 3D 5A 98 18 3C 24 22 33 =Z..<$"3 .byte $18,$10,$38,$5C,$38,$18,$3C,$24 ; 9D50 18 10 38 5C 38 18 3C 24 ..8\8.<$ .byte $44,$66,$18,$10,$3D,$5A,$98,$18 ; 9D58 44 66 18 10 3D 5A 98 18 Df..=Z.. .byte $3C,$24,$22,$33,$18,$10,$38,$5C ; 9D60 3C 24 22 33 18 10 38 5C <$"3..8\ .byte $38,$18,$3C,$24,$44,$66,$18,$08 ; 9D68 38 18 3C 24 44 66 18 08 8.<$Df.. .byte $BC,$5A,$19,$18,$3C,$24,$44,$CC ; 9D70 BC 5A 19 18 3C 24 44 CC .Z..<$D. .byte $18,$08,$1C,$3A,$1C,$18,$3C,$24 ; 9D78 18 08 1C 3A 1C 18 3C 24 ...:..<$ .byte $22,$66,$18,$08,$BC,$5A,$19,$18 ; 9D80 22 66 18 08 BC 5A 19 18 "f...Z.. .byte $3C,$24,$44,$CC,$18,$08,$1C,$3A ; 9D88 3C 24 44 CC 18 08 1C 3A <$D....: .byte $1C,$18,$3C,$24,$22,$66,$0C,$19 ; 9D90 1C 18 3C 24 22 66 0C 19 ..<$"f.. .byte $3E,$58,$58,$18,$3E,$42,$83,$00 ; 9D98 3E 58 58 18 3E 42 83 00 >XX.>B.. .byte $30,$98,$7C,$1A,$1A,$18,$7C,$42 ; 9DA0 30 98 7C 1A 1A 18 7C 42 0.|...|B .byte $C1,$00,$99,$5A,$3C,$18,$18,$99 ; 9DA8 C1 00 99 5A 3C 18 18 99 ...Z<... .byte $FF,$00,$00,$00,$86,$42,$22,$FE ; 9DB0 FF 00 00 00 86 42 22 FE .....B". .byte $FE,$22,$42,$86,$00,$00,$FF,$99 ; 9DB8 FE 22 42 86 00 00 FF 99 ."B..... .byte $18,$18,$3C,$5A,$99,$00,$00,$00 ; 9DC0 18 18 3C 5A 99 00 00 00 ..X." ; couple of places in the code try to write here block_char_minus_one: .byte $43,$FF,$FF,$FF,$FF,$FF,$FF,$FF ; 9E0F 43 FF FF FF FF FF FF FF C....... .byte $FF,$00,$66,$FF,$66,$66,$FF,$66 ; 9E17 FF 00 66 FF 66 66 FF 66 ..f.ff.f .byte $00,$18,$3E,$60,$3C,$06,$7C,$18 ; 9E1F 00 18 3E 60 3C 06 7C 18 ..>`<.|. .byte $00,$00,$7C,$82,$BA,$A2,$BA,$82 ; 9E27 00 00 7C 82 BA A2 BA 82 ..|..... .byte $7C,$1C,$36,$1C,$38,$6F,$66,$3B ; 9E2F 7C 1C 36 1C 38 6F 66 3B |.6.8of; .byte $00,$00,$30,$98,$7C,$1A,$78,$44 ; 9E37 00 00 30 98 7C 1A 78 44 ..0.|.xD .byte $C2,$00,$0E,$1C,$18,$18,$18,$1C ; 9E3F C2 00 0E 1C 18 18 18 1C ........ .byte $0E,$00,$70,$38,$18,$18,$18,$38 ; 9E47 0E 00 70 38 18 18 18 38 ..p8...8 .byte $70,$00,$00,$00,$00,$00,$00,$00 ; 9E4F 70 00 00 00 00 00 00 00 p....... .byte $7E,$00,$18,$18,$18,$7E,$18,$18 ; 9E57 7E 00 18 18 18 7E 18 18 ~....~.. .byte $18,$00,$00,$00,$00,$00,$18,$18 ; 9E5F 18 00 00 00 00 00 18 18 ........ .byte $30,$00,$00,$00,$00,$7E,$00,$00 ; 9E67 30 00 00 00 00 7E 00 00 0....~.. .byte $00,$00,$00,$00,$00,$00,$00,$18 ; 9E6F 00 00 00 00 00 00 00 18 ........ .byte $18,$00,$06,$0C,$18,$30,$60,$40 ; 9E77 18 00 06 0C 18 30 60 40 .....0`@ .byte $00,$00,$3C,$66,$66,$66,$66,$66 ; 9E7F 00 00 3C 66 66 66 66 66 ...f .byte $3C,$00,$00,$18,$18,$00,$18,$18 ; 9ECF 3C 00 00 18 18 00 18 18 <....... .byte $00,$00,$00,$18,$18,$00,$18,$18 ; 9ED7 00 00 00 18 18 00 18 18 ........ .byte $30,$06,$0C,$18,$30,$18,$0C,$06 ; 9EDF 30 06 0C 18 30 18 0C 06 0...0... .byte $00,$00,$00,$00,$7E,$00,$7E,$00 ; 9EE7 00 00 00 00 7E 00 7E 00 ....~.~. .byte $00,$00,$10,$7C,$10,$10,$10,$38 ; 9EEF 00 00 10 7C 10 10 10 38 ...|...8 .byte $7C,$00,$3C,$66,$66,$0C,$18,$00 ; 9EF7 7C 00 3C 66 66 0C 18 00 |. .byte $00,$00,$18,$3C,$66,$66,$7E,$66 ; 9F07 00 00 18 3C 66 66 7E 66 .... lda #$A5 ; A522 A9 A5 .. sta snd_slot_timer ; A524 8D 3F 06 .?. lda #$01 ; A527 A9 01 .. jsr cue_sfx_lowprior_jv ; A529 20 03 80 .. rts ; A52C 60 ` ; ---------------------------------------------------------------------------- sfx_electrocution: .byte $01,$81,$00,$0A,$02,$01,$81,$00 ; A52D 01 81 00 0A 02 01 81 00 ........ .byte $32,$02,$01,$81,$00,$1E,$02,$00 ; A535 32 02 01 81 00 1E 02 00 2....... ; ---------------------------------------------------------------------------- ; skip a couple of the collision regs, so we don't register a collision when Jumpman is being electrocuted level03_collisions: lda #$00 ; A53D A9 00 .. jmp check_pl_coll_no_pl ; A53F 4C 79 8F Ly. ; ---------------------------------------------------------------------------- ; dunno exactly how it's used yet, referenced by electrocution_bomb_pickup elec_bomb_table: .byte $0C ; A542 0C . LA543: .byte $05,$18,$09,$58,$05,$80,$15,$18 ; A543 05 18 09 58 05 80 15 18 ...X.... .byte $09,$28,$25,$4C,$1D,$80,$09,$18 ; A54B 09 28 25 4C 1D 80 09 18 .(%L.... .byte $15,$70,$25,$2C,$3C,$4C,$45,$0C ; A553 15 70 25 2C 3C 4C 45 0C .p%,. lda #$A9 ; A892 A9 A9 .. sta snd_slot_timer ; A894 8D 3F 06 .?. lda #$03 ; A897 A9 03 .. jsr cue_sfx_lowprior_jv ; A899 20 03 80 .. pla ; A89C 68 h tax ; A89D AA . LA89E: lda $0763,x ; A89E BD 63 07 .c. bne LA8C1 ; A8A1 D0 1E .. LA8A3: clc ; A8A3 18 . lda bullet_y_pos_minus_one,x ; A8A4 BD 9E 06 ... adc #$02 ; A8A7 69 02 i. cmp #$CE ; A8A9 C9 CE .. bcs LA8B3 ; A8AB B0 06 .. sta bullet_y_pos_minus_one,x ; A8AD 9D 9E 06 ... jmp LA845 ; A8B0 4C 45 A8 LE. ; ---------------------------------------------------------------------------- LA8B3: lda #$00 ; A8B3 A9 00 .. sta $069A,x ; A8B5 9D 9A 06 ... sta bullet_y_delta+1,x ; A8B8 9D 5F 07 ._. sta $0763,x ; A8BB 9D 63 07 .c. jmp LA845 ; A8BE 4C 45 A8 LE. ; ---------------------------------------------------------------------------- LA8C1: lda $0767,x ; A8C1 BD 67 07 .g. cmp #$08 ; A8C4 C9 08 .. bne LA8D4 ; A8C6 D0 0C .. lda #$00 ; A8C8 A9 00 .. sta $0763,x ; A8CA 9D 63 07 .c. cpx #$03 ; A8CD E0 03 .. bcc LA8A3 ; A8CF 90 D2 .. jmp LA865 ; A8D1 4C 65 A8 Le. ; ---------------------------------------------------------------------------- LA8D4: tay ; A8D4 A8 . clc ; A8D5 18 . lda bullet_y_pos_minus_one,x ; A8D6 BD 9E 06 ... adc hellstone_deltas_2,y ; A8D9 79 05 A9 y.. sta bullet_y_pos_minus_one,x ; A8DC 9D 9E 06 ... lda hellstone_deltas_1,y ; A8DF B9 FD A8 ... tay ; A8E2 A8 . beq LA8EF ; A8E3 F0 0A .. tay ; A8E5 A8 . lda $0763,x ; A8E6 BD 63 07 .c. cmp #$03 ; A8E9 C9 03 .. beq LA8EF ; A8EB F0 02 .. ldy #$FE ; A8ED A0 FE .. LA8EF: tya ; A8EF 98 . clc ; A8F0 18 . adc $069A,x ; A8F1 7D 9A 06 }.. sta $069A,x ; A8F4 9D 9A 06 ... inc $0767,x ; A8F7 FE 67 07 .g. jmp LA845 ; A8FA 4C 45 A8 LE. ; ---------------------------------------------------------------------------- ; dunno, look like movement deltas, referenced by hellstones_sub0 hellstone_deltas_1: .byte $00,$02,$02,$02,$02,$02,$02,$00 ; A8FD 00 02 02 02 02 02 02 00 ........ ; dunno, look like movement deltas, referenced by hellstones_sub0 hellstone_deltas_2: .byte $FE,$FE,$FE,$00,$00,$02,$02,$02 ; A905 FE FE FE 00 00 02 02 02 ........ sfx_hellstone: .byte $01,$83,$00,$0A,$03,$00,$00,$00 ; A90D 01 83 00 0A 03 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; A915 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00 ; A91D 00 00 00 ... l06_map:.byte $FE,$33,$9C,$FD,$04,$00,$04,$05 ; A920 FE 33 9C FD 04 00 04 05 .3...... .byte $04,$24,$05,$04,$44,$05,$06,$6C ; A928 04 24 05 04 44 05 06 6C .$..D..l .byte $05,$04,$8C,$05,$04,$30,$16,$04 ; A930 05 04 8C 05 04 30 16 04 .....0.. .byte $60,$16,$04,$04,$25,$09,$78,$25 ; A938 60 16 04 04 25 09 78 25 `...%.x% .byte $09,$04,$35,$09,$40,$35,$08,$78 ; A940 09 04 35 09 40 35 08 78 ..5.@5.x .byte $35,$09,$40,$45,$02,$58,$45,$02 ; A948 35 09 40 45 02 58 45 02 5.@E.XE. .byte $04,$55,$05,$28,$55,$06,$4C,$55 ; A950 04 55 05 28 55 06 4C 55 .U.(U.LU .byte $02,$60,$55,$06,$88,$55,$05,$FE ; A958 02 60 55 06 88 55 05 FE .`U..U.. .byte $5F,$9C,$FD,$00,$04,$04,$01,$09 ; A960 5F 9C FD 00 04 04 01 09 _....... .byte $94,$01,$09,$30,$19,$0F,$68,$19 ; A968 94 01 09 30 19 0F 68 19 ...0..h. .byte $0F,$FE,$B3,$9C ; A970 0F FE B3 9C .... l06_map_bombs: .byte $24,$02,$01,$44,$02,$01,$58,$02 ; A974 24 02 01 44 02 01 58 02 $..D..X. .byte $01,$78,$02,$01,$44,$12,$01,$58 ; A97C 01 78 02 01 44 12 01 58 .x..D..X .byte $12,$01,$24,$22,$01,$78,$22,$01 ; A984 12 01 24 22 01 78 22 01 ..$".x". .byte $40,$32,$01,$5C,$32,$01,$40,$42 ; A98C 40 32 01 5C 32 01 40 42 @2.\2.@B .byte $01,$5C,$42,$01,$04,$52,$01,$3C ; A994 01 5C 42 01 04 52 01 3C .\B..R.< .byte $52,$01,$60,$52,$01,$98,$52,$01 ; A99C 52 01 60 52 01 98 52 01 R.`R..R. .byte $FF ; A9A4 FF . l06_bombs: .byte $42,$00,$62,$00,$82,$00,$A2,$00 ; A9A5 42 00 62 00 82 00 A2 00 B.b..... .byte $64,$00,$84,$00,$46,$00,$A6,$00 ; A9AD 64 00 84 00 46 00 A6 00 d...F... .byte $68,$00,$88,$00,$6A,$00,$8A,$00 ; A9B5 68 00 88 00 6A 00 8A 00 h...j... .byte $2C,$00,$6C,$00,$8C,$00,$CC,$00 ; A9BD 2C 00 6C 00 8C 00 CC 00 ,.l..... l06_bombs_term: .byte $FF ; A9C5 FF . ; ---------------------------------------------------------------------------- walls_init: jsr special_init_jv ; A9C6 20 36 80 6. lda #$02 ; A9C9 A9 02 .. sta $0770 ; A9CB 8D 70 07 .p. sta $0772 ; A9CE 8D 72 07 .r. lda #$FE ; A9D1 A9 FE .. sta $0771 ; A9D3 8D 71 07 .q. sta $0773 ; A9D6 8D 73 07 .s. ldx #$05 ; A9D9 A2 05 .. lda #$00 ; A9DB A9 00 .. LA9DD: sta HPOSP3,x ; A9DD 9D 03 D0 ... dex ; A9E0 CA . bne LA9DD ; A9E1 D0 FA .. lda #$C0 ; A9E3 A9 C0 .. jsr LAA0C ; A9E5 20 0C AA .. lda #$C0 ; A9E8 A9 C0 .. jsr LAA0C ; A9EA 20 0C AA .. lda #$30 ; A9ED A9 30 .0 jsr LAA0C ; A9EF 20 0C AA .. lda #$30 ; A9F2 A9 30 .0 jsr LAA0C ; A9F4 20 0C AA .. lda #$0C ; A9F7 A9 0C .. jsr LAA0C ; A9F9 20 0C AA .. lda #$0C ; A9FC A9 0C .. jsr LAA0C ; A9FE 20 0C AA .. lda #$03 ; AA01 A9 03 .. jsr LAA0C ; AA03 20 0C AA .. lda #$03 ; AA06 A9 03 .. jsr LAA0C ; AA08 20 0C AA .. rts ; AA0B 60 ` ; ---------------------------------------------------------------------------- LAA0C: sta dm_progctr ; AA0C 85 C0 .. LAA0E: lda RANDOM ; AA0E AD 0A D2 ... cmp #$AC ; AA11 C9 AC .. bcs LAA0E ; AA13 B0 F9 .. tay ; AA15 A8 . ldx #$1E ; AA16 A2 1E .. LAA18: lda $2B00,y ; AA18 B9 00 2B ..+ ora dm_progctr ; AA1B 05 C0 .. sta $2B00,y ; AA1D 99 00 2B ..+ iny ; AA20 C8 . dex ; AA21 CA . bne LAA18 ; AA22 D0 F4 .. rts ; AA24 60 ` ; ---------------------------------------------------------------------------- LAA25: lda $076F ; AA25 AD 6F 07 .o. cmp #$04 ; AA28 C9 04 .. bne LAA2D ; AA2A D0 01 .. rts ; AA2C 60 ` ; ---------------------------------------------------------------------------- LAA2D: tax ; AA2D AA . inc $0774,x ; AA2E FE 74 07 .t. inc $076F ; AA31 EE 6F 07 .o. rts ; AA34 60 ` ; ---------------------------------------------------------------------------- walls_sub1: lda $0622 ; AA35 AD 22 06 .". bne LAA3B ; AA38 D0 01 .. walls_sub0: rts ; AA3A 60 ` ; ---------------------------------------------------------------------------- LAA3B: ldx #$05 ; AA3B A2 05 .. LAA3D: dex ; AA3D CA . beq walls_sub0 ; AA3E F0 FA .. lda $0773,x ; AA40 BD 73 07 .s. beq LAA3D ; AA43 F0 F8 .. lda $0777,x ; AA45 BD 77 07 .w. clc ; AA48 18 . adc $076F,x ; AA49 7D 6F 07 }o. sta $0777,x ; AA4C 9D 77 07 .w. sta HPOSP3,x ; AA4F 9D 03 D0 ... jmp LAA3D ; AA52 4C 3D AA L=. ; ---------------------------------------------------------------------------- walls_sub2: lda $0622 ; AA55 AD 22 06 .". beq walls_sub0 ; AA58 F0 E0 .. ldx #$05 ; AA5A A2 05 .. LAA5C: dex ; AA5C CA . beq walls_sub0 ; AA5D F0 DB .. lda sav_p3pf,x ; AA5F BD B7 06 ... and #$01 ; AA62 29 01 ). beq LAA5C ; AA64 F0 F6 .. lda player_x_pos ; AA66 AD 7E 06 .~. clc ; AA69 18 . adc $076F,x ; AA6A 7D 6F 07 }o. sta player_x_pos ; AA6D 8D 7E 06 .~. jmp LAA5C ; AA70 4C 5C AA L\. ; ---------------------------------------------------------------------------- ; toggles the center rope between up and down ropes walls_bomb_sub: inc $0764 ; AA73 EE 64 07 .d. lda $0764 ; AA76 AD 64 07 .d. and #$01 ; AA79 29 01 ). beq LAA82 ; AA7B F0 05 .. lda #$90 ; AA7D A9 90 .. jmp LAA84 ; AA7F 4C 84 AA L.. ; ---------------------------------------------------------------------------- LAA82: lda #$A6 ; AA82 A9 A6 .. LAA84: sta dm_progctr ; AA84 85 C0 .. lda #$AA ; AA86 A9 AA .. sta dm_progctr+1 ; AA88 85 C1 .. jsr draw_map_jv ; AA8A 20 00 80 .. jmp LAA25 ; AA8D 4C 25 AA L%. ; ---------------------------------------------------------------------------- ; map data for center down-rope, referenced by walls_bomb_sub walls_down_rope: .byte $FE,$EB,$9C,$FD,$00,$04,$50,$00 ; AA90 FE EB 9C FD 00 04 50 00 ......P. .byte $0C,$FE,$33,$9C,$4E,$05,$01,$FE ; AA98 0C FE 33 9C 4E 05 01 FE ..3.N... .byte $DA,$9C,$50,$00,$0C,$FF ; AAA0 DA 9C 50 00 0C FF ..P... ; map data for center up-rope, referenced walls_bomb_sub walls_up_rope: .byte $FE,$EB,$9C,$FD,$00,$04,$50,$00 ; AAA6 FE EB 9C FD 00 04 50 00 ......P. .byte $0C,$FE,$33,$9C,$4E,$05,$01,$FE ; AAAE 0C FE 33 9C 4E 05 01 FE ..3.N... .byte $C9,$9C,$50,$08,$0A,$FF ; AAB6 C9 9C 50 08 0A FF ..P... ; ---------------------------------------------------------------------------- walls_sub3: lda rot_color ; AABC AD 2A 06 .*. sta COLOR3 ; AABF 8D C7 02 ... rts ; AAC2 60 ` ; ---------------------------------------------------------------------------- brk ; AAC3 00 . sta COLOR3 ; AAC4 8D C7 02 ... rts ; AAC7 60 ` ; ---------------------------------------------------------------------------- ; non-map data, dunno what for. grouped with the level 5 stuff, but doesn't seem to be used by level 5 (as in, playing thru level 5 in the emu with breakpoint 'read>=aac8 read<=aacf' never causes a break!) data_aac8: .byte $00,$09,$40,$45,$02,$58,$45,$02 ; AAC8 00 09 40 45 02 58 45 02 ..@E.XE. ; level map data starts here l05_map:.byte $FE,$33,$9C,$FD,$04,$00,$04,$05 ; AAD0 FE 33 9C FD 04 00 04 05 .3...... .byte $02,$1A,$05,$0B,$50,$05,$07,$04 ; AAD8 02 1A 05 0B 50 05 07 04 ....P... .byte $25,$26,$7C,$33,$08,$20,$3B,$03 ; AAE0 25 26 7C 33 08 20 3B 03 %&|3. ;. .byte $40,$3B,$03,$60,$3B,$06,$04,$47 ; AAE8 40 3B 03 60 3B 06 04 47 @;.`;..G .byte $04,$20,$4B,$03,$40,$4B,$03,$60 ; AAF0 04 20 4B 03 40 4B 03 60 . K.@K.` .byte $4B,$03,$80,$4A,$03,$04,$55,$26 ; AAF8 4B 03 80 4A 03 04 55 26 K..J..U& .byte $FD,$04,$FF,$2C,$4A,$03,$4C,$4A ; AB00 FD 04 FF 2C 4A 03 4C 4A ...,J.LJ .byte $03,$6C,$4A,$03,$FD,$04,$01,$14 ; AB08 03 6C 4A 03 FD 04 01 14 .lJ..... .byte $48,$03,$38,$49,$02,$58,$49,$02 ; AB10 48 03 38 49 02 58 49 02 H.8I.XI. .byte $78,$49,$02,$FE,$5F,$9C,$FD,$00 ; AB18 78 49 02 FE 5F 9C FD 00 xI.._... .byte $04,$0C,$21,$0D,$84,$01,$09,$84 ; AB20 04 0C 21 0D 84 01 09 84 ..!..... .byte $2F,$06,$22,$01,$05,$FE,$C9,$9C ; AB28 2F 06 22 01 05 FE C9 9C /."..... .byte $3C,$08,$06,$35,$28,$04,$55,$28 ; AB30 3C 08 06 35 28 04 55 28 <..5(.U( .byte $04,$FE,$DA,$9C,$9A,$30,$08,$FE ; AB38 04 FE DA 9C 9A 30 08 FE .....0.. .byte $B3,$9C ; AB40 B3 9C .. l05_map_bombs: .byte $04,$02,$01,$44,$02,$01,$24,$16 ; AB42 04 02 01 44 02 01 24 16 ...D..$. .byte $01,$44,$22,$01,$64,$22,$01,$98 ; AB4A 01 44 22 01 64 22 01 98 .D".d".. .byte $22,$01,$24,$32,$01,$44,$32,$01 ; AB52 22 01 24 32 01 44 32 01 ".$2.D2. .byte $64,$32,$01,$24,$52,$01,$44,$52 ; AB5A 64 32 01 24 52 01 44 52 d2.$R.DR .byte $01,$64,$52,$01,$84,$52,$01,$98 ; AB62 01 64 52 01 84 52 01 98 .dR..R.. .byte $52,$01,$FF ; AB6A 52 01 FF R.. l05_bombs: .byte $22,$10,$62,$20,$44,$30,$66,$40 ; AB6D 22 10 62 20 44 30 66 40 ".b D0f@ .byte $86,$50,$C6,$60,$48,$70,$68,$80 ; AB75 86 50 C6 60 48 70 68 80 .P.`Hph. .byte $88,$90,$4C,$A0,$6C,$B0,$8C,$C0 ; AB7D 88 90 4C A0 6C B0 8C C0 ..L.l... .byte $AC,$00,$CC,$D0 ; AB85 AC 00 CC D0 .... l05_bombs_term: .byte $FF ; AB89 FF . l05_map_changes: .byte $00,$00,$A6,$AB,$B6,$AB,$C0,$AB ; AB8A 00 00 A6 AB B6 AB C0 AB ........ .byte $D3,$AB,$DD,$AB,$F0,$AB,$FA,$AB ; AB92 D3 AB DD AB F0 AB FA AB ........ .byte $04,$AC,$0E,$AC,$18,$AC,$22,$AC ; AB9A 04 AC 0E AC 18 AC 22 AC ......". .byte $2C,$AC,$36,$AC,$FE,$49,$9C,$FD ; ABA2 2C AC 36 AC FE 49 9C FD ,.6..I.. .byte $04,$00,$04,$05,$02,$FE,$33,$9C ; ABAA 04 00 04 05 02 FE 33 9C ......3. .byte $20,$22,$03,$FF,$FE,$49,$9C,$FD ; ABB2 20 22 03 FF FE 49 9C FD "...I.. .byte $04,$00,$3E,$05,$02,$FF,$FE,$89 ; ABBA 04 00 3E 05 02 FF FE 89 ..>..... .byte $9C,$FD,$00,$04,$22,$11,$01,$FE ; ABC2 9C FD 00 04 22 11 01 FE ...."... .byte $49,$9C,$FD,$04,$FF,$2C,$4A,$03 ; ABCA 49 9C FD 04 FF 2C 4A 03 I....,J. .byte $FF,$FE,$49,$9C,$FD,$04,$00,$44 ; ABD2 FF FE 49 9C FD 04 00 44 ..I....D .byte $25,$03,$FF,$FE,$33,$9C,$FD,$04 ; ABDA 25 03 FF FE 33 9C FD 04 %...3... .byte $00,$6C,$05,$04,$FE,$89,$9C,$FD ; ABE2 00 6C 05 04 FE 89 9C FD .l...... .byte $00,$04,$84,$11,$02,$FF,$FE,$49 ; ABEA 00 04 84 11 02 FF FE 49 .......I .byte $9C,$FD,$04,$00,$6C,$05,$04,$FF ; ABF2 9C FD 04 00 6C 05 04 FF ....l... .byte $FE,$49,$9C,$FD,$04,$00,$60,$4B ; ABFA FE 49 9C FD 04 00 60 4B .I....`K .byte $03,$FF,$FE,$49,$9C,$FD,$04,$00 ; AC02 03 FF FE 49 9C FD 04 00 ...I.... .byte $40,$4B,$03,$FF,$FE,$49,$9C,$FD ; AC0A 40 4B 03 FF FE 49 9C FD @K...I.. .byte $04,$00,$20,$4B,$03,$FF,$FE,$33 ; AC12 04 00 20 4B 03 FF FE 33 .. K...3 .byte $9C,$FD,$04,$00,$28,$52,$01,$FF ; AC1A 9C FD 04 00 28 52 01 FF ....(R.. .byte $FE,$33,$9C,$FD,$04,$00,$48,$52 ; AC22 FE 33 9C FD 04 00 48 52 .3....HR .byte $01,$FF,$FE,$49,$9C,$FD,$04,$00 ; AC2A 01 FF FE 49 9C FD 04 00 ...I.... .byte $54,$55,$09,$FF,$FE,$33,$9C,$FD ; AC32 54 55 09 FF FE 33 9C FD TU...3.. .byte $04,$00,$04,$08,$02,$FE,$5F,$9C ; AC3A 04 00 04 08 02 FE 5F 9C ......_. .byte $FD,$00,$04,$8E,$01,$09,$FF,$00 ; AC42 FD 00 04 8E 01 09 FF 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; AC4A 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; AC52 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00 ; AC5A 00 00 00 00 00 00 ...... l07_map:.byte $FE,$33,$9C,$FD,$04,$00,$3C,$05 ; AC60 FE 33 9C FD 04 00 3C 05 .3....<. .byte $0A,$04,$0C,$08,$7C,$0C,$08,$04 ; AC68 0A 04 0C 08 7C 0C 08 04 ....|... .byte $15,$08,$7C,$15,$08,$38,$16,$01 ; AC70 15 08 7C 15 08 38 16 01 ..|..8.. .byte $64,$16,$01,$2C,$2C,$04,$64,$2C ; AC78 64 16 01 2C 2C 04 64 2C d..,,.d, .byte $04,$2C,$3C,$04,$64,$3C,$04,$04 ; AC80 04 2C 3C 04 64 3C 04 04 .,<.d<.. .byte $55,$26,$FD,$04,$FF,$24,$0B,$06 ; AC88 55 26 FD 04 FF 24 0B 06 U&...$.. .byte $FD,$04,$01,$64,$06,$06,$FE,$5F ; AC90 FD 04 01 64 06 06 FE 5F ...d..._ .byte $9C,$FD,$00,$04,$0C,$01,$15,$4C ; AC98 9C FD 00 04 0C 01 15 4C .......L .byte $01,$15,$8C,$01,$15,$FE,$C9,$9C ; ACA0 01 15 8C 01 15 FE C9 9C ........ .byte $39,$19,$03,$65,$19,$03,$FE,$DA ; ACA8 39 19 03 65 19 03 FE DA 9..e.... .byte $9C,$1F,$12,$0F,$80,$12,$0F,$FE ; ACB0 9C 1F 12 0F 80 12 0F FE ........ .byte $B3,$9C ; ACB8 B3 9C .. l07_map_bombs: .byte $04,$02,$01,$3C,$02,$01,$60,$02 ; ACBA 04 02 01 3C 02 01 60 02 ...<..`. .byte $01,$98,$02,$01,$24,$22,$01,$78 ; ACC2 01 98 02 01 24 22 01 78 ....$".x .byte $22,$01,$24,$32,$01,$78,$32,$01 ; ACCA 22 01 24 32 01 78 32 01 ".$2.x2. .byte $24,$42,$01,$78,$42,$01,$04,$52 ; ACD2 24 42 01 78 42 01 04 52 $B.xB..R .byte $01,$3C,$52,$01,$60,$52,$01,$98 ; ACDA 01 3C 52 01 60 52 01 98 .. .byte $48,$AD,$58,$AD,$FE,$49,$9C,$FD ; AD12 48 AD 58 AD FE 49 9C FD H.X..I.. .byte $04,$FF,$24,$0B,$06,$FF,$FE,$49 ; AD1A 04 FF 24 0B 06 FF FE 49 ..$....I .byte $9C,$FD,$04,$01,$64,$06,$06,$FF ; AD22 9C FD 04 01 64 06 06 FF ....d... .byte $FE,$89,$9C,$FD,$00,$04,$4C,$21 ; AD2A FE 89 9C FD 00 04 4C 21 ......L! .byte $02,$FF,$FE,$89,$9C,$FD,$00,$04 ; AD32 02 FF FE 89 9C FD 00 04 ........ .byte $4C,$29,$02,$FF,$FE,$89,$9C,$FD ; AD3A 4C 29 02 FF FE 89 9C FD L)...... .byte $00,$04,$4C,$31,$02,$FF,$FE,$C9 ; AD42 00 04 4C 31 02 FF FE C9 ..L1.... .byte $9C,$FD,$00,$04,$9A,$18,$0E,$FE ; AD4A 9C FD 00 04 9A 18 0E FE ........ .byte $89,$9C,$0C,$31,$02,$FF,$FE,$C9 ; AD52 89 9C 0C 31 02 FF FE C9 ...1.... .byte $9C,$FD,$00,$04,$04,$18,$0E,$FE ; AD5A 9C FD 00 04 04 18 0E FE ........ .byte $89,$9C,$8C,$31,$02,$FF ; AD62 89 9C 8C 31 02 FF ...1.. ; ---------------------------------------------------------------------------- ; move bullets in ways that defy the laws of physics and common sense zigzag_sub0: lda $0622 ; AD68 AD 22 06 .". bne LAD6E ; AD6B D0 01 .. LAD6D: rts ; AD6D 60 ` ; ---------------------------------------------------------------------------- LAD6E: ldx #$FF ; AD6E A2 FF .. LAD70: inx ; AD70 E8 . cpx work_level_bullet_max ; AD71 EC 8B 07 ... beq LAD6D ; AD74 F0 F7 .. lda bullet_flags,x ; AD76 BD 56 07 .V. cmp #$02 ; AD79 C9 02 .. beq LAD8B ; AD7B F0 0E .. sta $076C,x ; AD7D 9D 6C 07 .l. lda #$00 ; AD80 A9 00 .. sta $0764,x ; AD82 9D 64 07 .d. sta $0768,x ; AD85 9D 68 07 .h. jmp LAD70 ; AD88 4C 70 AD Lp. ; ---------------------------------------------------------------------------- LAD8B: cmp $076C,x ; AD8B DD 6C 07 .l. beq LADA1 ; AD8E F0 11 .. sta $076C,x ; AD90 9D 6C 07 .l. lda bullet_x_delta,x ; AD93 BD 5A 07 .Z. beq LAD9E ; AD96 F0 06 .. inc $0768,x ; AD98 FE 68 07 .h. jmp LADA1 ; AD9B 4C A1 AD L.. ; ---------------------------------------------------------------------------- LAD9E: inc $0764,x ; AD9E FE 64 07 .d. LADA1: lda $0764,x ; ADA1 BD 64 07 .d. beq code_adb5 ; ADA4 F0 0F .. and #$0F ; ADA6 29 0F ). tay ; ADA8 A8 . lda zigzag_deltas,y ; ADA9 B9 C7 AD ... sta bullet_x_delta,x ; ADAC 9D 5A 07 .Z. inc $0764,x ; ADAF FE 64 07 .d. jmp LAD70 ; ADB2 4C 70 AD Lp. ; ---------------------------------------------------------------------------- code_adb5: lda $0768,x ; ADB5 BD 68 07 .h. and #$0F ; ADB8 29 0F ). tay ; ADBA A8 . lda zigzag_deltas,y ; ADBB B9 C7 AD ... sta bullet_y_delta,x ; ADBE 9D 5E 07 .^. code_adc1: inc $0768,x ; ADC1 FE 68 07 .h. jmp LAD70 ; ADC4 4C 70 AD Lp. ; ---------------------------------------------------------------------------- ; kind of a sine wave shape. used for either X or Y delta, depending on the direction the bullet is moving zigzag_deltas: .byte $00,$01,$02,$03,$04,$03,$02,$01 ; ADC7 00 01 02 03 04 03 02 01 ........ .byte $00,$FF,$FE,$FD,$FC,$FD,$FE,$FF ; ADCF 00 FF FE FD FC FD FE FF ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; ADD7 00 00 00 00 00 00 00 00 ........ .byte $00 ; ADDF 00 . l08_map:.byte $FE,$33,$9C,$FD,$04,$00,$04,$05 ; ADE0 FE 33 9C FD 04 00 04 05 .3...... .byte $02,$44,$05,$06,$94,$05,$02,$30 ; ADE8 02 44 05 06 94 05 02 30 .D.....0 .byte $0A,$02,$68,$0A,$02,$28,$21,$04 ; ADF0 0A 02 68 0A 02 28 21 04 ..h..(!. .byte $68,$21,$04,$04,$25,$06,$84,$25 ; ADF8 68 21 04 04 25 06 84 25 h!..%..% .byte $06,$04,$45,$10,$5C,$45,$10,$04 ; AE00 06 04 45 10 5C 45 10 04 ..E.\E.. .byte $55,$06,$2C,$55,$04,$64,$55,$04 ; AE08 55 06 2C 55 04 64 55 04 U.,U.dU. .byte $84,$55,$06,$FD,$04,$FF,$84,$09 ; AE10 84 55 06 FD 04 FF 84 09 .U...... .byte $04,$1C,$24,$03,$FD,$04,$01,$0C ; AE18 04 1C 24 03 FD 04 01 0C ..$..... .byte $06,$04,$78,$22,$03,$FE,$5F,$9C ; AE20 06 04 78 22 03 FE 5F 9C ..x".._. .byte $FD,$00,$04,$0C,$21,$09,$8C,$21 ; AE28 FD 00 04 0C 21 09 8C 21 ....!..! .byte $09,$30,$41,$05,$68,$41,$05,$FE ; AE30 09 30 41 05 68 41 05 FE .0A.hA.. .byte $C9,$9C,$34,$0C,$04,$6B,$0C,$04 ; AE38 C9 9C 34 0C 04 6B 0C 04 ..4..k.. .byte $FE,$DA,$9C,$44,$02,$10,$5A,$02 ; AE40 FE DA 9C 44 02 10 5A 02 ...D..Z. .byte $10,$FE,$B3,$9C ; AE48 10 FE B3 9C .... l08_map_bombs: .byte $04,$02,$01,$98,$02,$01,$04,$22 ; AE4C 04 02 01 98 02 01 04 22 ......." .byte $01,$98,$22,$01,$18,$34,$01,$84 ; AE54 01 98 22 01 18 34 01 84 .."..4.. .byte $34,$01,$04,$42,$01,$98,$42,$01 ; AE5C 34 01 04 42 01 98 42 01 4..B..B. .byte $04,$52,$01,$38,$52,$01,$64,$52 ; AE64 04 52 01 38 52 01 64 52 .R.8R.dR .byte $01,$98,$52,$01,$FF ; AE6C 01 98 52 01 FF ..R.. l08_bombs: .byte $22,$00,$C2,$00,$26,$00,$C6,$00 ; AE71 22 00 C2 00 26 00 C6 00 "...&... .byte $48,$00,$A8,$00,$2A,$00,$CA,$00 ; AE79 48 00 A8 00 2A 00 CA 00 H...*... .byte $2C,$00,$6C,$00,$8C,$00,$CC,$00 ; AE81 2C 00 6C 00 8C 00 CC 00 ,.l..... l08_bombs_term: .byte $FF ; AE89 FF . l08_unkn0: .byte $03,$00,$00,$01,$7C,$01,$01,$00 ; AE8A 03 00 00 01 7C 01 01 00 ....|... .byte $04,$0C,$AF,$10,$86,$00,$01,$0F ; AE92 04 0C AF 10 86 00 01 0F ........ .byte $FF ; AE9A FF . ; ---------------------------------------------------------------------------- spellbound_init: jsr special_init_jv ; AE9B 20 36 80 6. lda #$C0 ; AE9E A9 C0 .. sta $0770 ; AEA0 8D 70 07 .p. rts ; AEA3 60 ` ; ---------------------------------------------------------------------------- ; used by spellbound, dunno exactly how yet spellbound_table: .byte $18,$08,$38,$20,$00,$48,$30,$18 ; AEA4 18 08 38 20 00 48 30 18 ..8 .H0. .byte $28,$10,$10 ; AEAC 28 10 10 (.. ; letters for level08, spellbound (not ASCII or screencodes though) epyx_jumpman: .byte $40,$29,$21,$11,$19,$11,$09,$01 ; AEAF 40 29 21 11 19 11 09 01 @)!..... .byte $49,$41,$39,$19,$31 ; AEB7 49 41 39 19 31 IA9.1 ; player graphics for letters. each letter is 8x8 (8 bytes, 8px/byte), takes up the whole 8x8 cell (no blanks at edges like a normal font would have). no duplicate letters, so this spells 'JUMPANEYX ' (space at the end) letter_bitmap: .byte $03,$03,$03,$03,$03,$C3,$C3,$7E ; AEBC 03 03 03 03 03 C3 C3 7E .......~ .byte $C3,$C3,$C3,$C3,$C3,$C3,$C3,$7E ; AEC4 C3 C3 C3 C3 C3 C3 C3 7E .......~ .byte $C3,$C3,$E7,$FF,$DB,$C3,$C3,$C3 ; AECC C3 C3 E7 FF DB C3 C3 C3 ........ .byte $FE,$C3,$C3,$C3,$FE,$C0,$C0,$C0 ; AED4 FE C3 C3 C3 FE C0 C0 C0 ........ .byte $18,$3C,$66,$C3,$FF,$C3,$C3,$C3 ; AEDC 18 3C 66 C3 FF C3 C3 C3 ./ .byte $04,$FF,$FE,$49,$9C,$FD,$04,$00 ; B42C 04 FF FE 49 9C FD 04 00 ...I.... .byte $7C,$35,$04,$FF,$FE,$89,$9C,$FD ; B434 7C 35 04 FF FE 89 9C FD |5...... .byte $00,$04,$54,$3F,$04,$FF,$FE,$89 ; B43C 00 04 54 3F 04 FF FE 89 ..T?.... .byte $9C,$FD,$00,$04,$8C,$1D,$04,$FF ; B444 9C FD 00 04 8C 1D 04 FF ........ ; ---------------------------------------------------------------------------- hatch_bomb_sub: lda #$01 ; B44C A9 01 .. sta $0770 ; B44E 8D 70 07 .p. lda #$00 ; B451 A9 00 .. sta $0771 ; B453 8D 71 07 .q. rts ; B456 60 ` ; ---------------------------------------------------------------------------- hatch_sub0: lda falling_flag ; B457 AD 23 06 .#. cmp #$02 ; B45A C9 02 .. bne LB46A ; B45C D0 0C .. lda #$00 ; B45E A9 00 .. sta $0770 ; B460 8D 70 07 .p. sta $0771 ; B463 8D 71 07 .q. sta $0681 ; B466 8D 81 06 ... rts ; B469 60 ` ; ---------------------------------------------------------------------------- LB46A: lda $0622 ; B46A AD 22 06 .". bne LB470 ; B46D D0 01 .. LB46F: rts ; B46F 60 ` ; ---------------------------------------------------------------------------- LB470: lda $0770 ; B470 AD 70 07 .p. beq LB46F ; B473 F0 FA .. cmp #$09 ; B475 C9 09 .. beq LB49F ; B477 F0 26 .& sta $066C ; B479 8D 6C 06 .l. sta $068A ; B47C 8D 8A 06 ... inc $0770 ; B47F EE 70 07 .p. lda $06DC ; B482 AD DC 06 ... clc ; B485 18 . adc #$30 ; B486 69 30 i0 sta $0680 ; B488 8D 80 06 ... lda $06DD ; B48B AD DD 06 ... asl a ; B48E 0A . clc ; B48F 18 . adc #$20 ; B490 69 20 i sta $0685 ; B492 8D 85 06 ... lda $0770 ; B495 AD 70 07 .p. cmp #$09 ; B498 C9 09 .. bcc LB46F ; B49A 90 D3 .. inc $0771 ; B49C EE 71 07 .q. LB49F: lda $0771 ; B49F AD 71 07 .q. beq LB46F ; B4A2 F0 CB .. cmp #$05 ; B4A4 C9 05 .. beq LB4C1 ; B4A6 F0 19 .. clc ; B4A8 18 . adc #$04 ; B4A9 69 04 i. sta player_x ; B4AB 8D 8B 06 ... inc $0771 ; B4AE EE 71 07 .q. lda $0680 ; B4B1 AD 80 06 ... sta $0681 ; B4B4 8D 81 06 ... lda $0685 ; B4B7 AD 85 06 ... sta player_new_y ; B4BA 8D 86 06 ... sta $066D ; B4BD 8D 6D 06 .m. rts ; B4C0 60 ` ; ---------------------------------------------------------------------------- LB4C1: lda player_x ; B4C1 AD 8B 06 ... and #$03 ; B4C4 29 03 ). clc ; B4C6 18 . adc #$04 ; B4C7 69 04 i. sta player_x ; B4C9 8D 8B 06 ... inc player_x ; B4CC EE 8B 06 ... cmp #$07 ; B4CF C9 07 .. bne LB4E2 ; B4D1 D0 0F .. cue_woop_sound: lda #$64 ; B4D3 A9 64 .d sta snd_slot_priority ; B4D5 8D 3E 06 .>. lda #$B5 ; B4D8 A9 B5 .. sta snd_slot_timer ; B4DA 8D 3F 06 .?. lda #$03 ; B4DD A9 03 .. jsr cue_sfx_lowprior_jv ; B4DF 20 03 80 .. LB4E2: ldy #$01 ; B4E2 A0 01 .. lda $0681 ; B4E4 AD 81 06 ... cmp player_x_pos ; B4E7 CD 7E 06 .~. bcc LB4EE ; B4EA 90 02 .. ldy #$FF ; B4EC A0 FF .. LB4EE: sty $A0 ; B4EE 84 A0 .. clc ; B4F0 18 . adc $A0 ; B4F1 65 A0 e. sta $0681 ; B4F3 8D 81 06 ... ldy #$01 ; B4F6 A0 01 .. lda player_new_y ; B4F8 AD 86 06 ... cmp player_y_pos ; B4FB CD 83 06 ... bcc LB502 ; B4FE 90 02 .. ldy #$FF ; B500 A0 FF .. LB502: sty $A0 ; B502 84 A0 .. clc ; B504 18 . adc $A0 ; B505 65 A0 e. sta player_new_y ; B507 8D 86 06 ... rts ; B50A 60 ` ; ---------------------------------------------------------------------------- ; dunno what this is for yet hatch_table_b50b: .byte $03,$1C,$B5,$08,$00,$00,$01,$56 ; B50B 03 1C B5 08 00 00 01 56 .......V .byte $04,$1C,$B5,$08,$00,$00,$05,$1A ; B513 04 1C B5 08 00 00 05 1A ........ .byte $FF,$00,$00,$18,$18,$24,$24,$18 ; B51B FF 00 00 18 18 24 24 18 .....$$. .byte $18,$00,$00,$42,$42,$42,$24,$18 ; B523 18 00 00 42 42 42 24 18 ...BBB$. .byte $18,$00,$00,$00,$00,$66,$A5,$18 ; B52B 18 00 00 00 00 66 A5 18 .....f.. .byte $18,$00,$00,$00,$00,$00,$00,$3C ; B533 18 00 00 00 00 00 00 3C .......< .byte $DB,$00,$00,$24,$18,$18,$24,$00 ; B53B DB 00 00 24 18 18 24 00 ...$..$. .byte $00,$00,$08,$24,$58,$1A,$24,$10 ; B543 00 00 08 24 58 1A 24 10 ...$X.$. .byte $00,$81,$42,$24,$18,$18,$24,$42 ; B54B 00 81 42 24 18 18 24 42 ..B$..$B .byte $81,$04,$42,$A4,$18,$18,$25,$42 ; B553 81 04 42 A4 18 18 25 42 ..B...%B .byte $20,$00,$00,$18,$18,$24,$24,$18 ; B55B 20 00 00 18 18 24 24 18 ....$$. .byte $18 ; B563 18 . sfx_woop: .byte $01,$A2,$00,$F0,$01,$01,$A4,$00 ; B564 01 A2 00 F0 01 01 A4 00 ........ .byte $DC,$01,$01,$A6,$00,$C8,$02,$01 ; B56C DC 01 01 A6 00 C8 02 01 ........ .byte $A4,$DC,$01,$01,$A2,$F0,$01,$00 ; B574 A4 DC 01 01 A2 F0 01 00 ........ ; ---------------------------------------------------------------------------- hatch_sub3: lda #$00 ; B57C A9 00 .. jmp check_pl_coll_no_p2 ; B57E 4C 76 8F Lv. ; ---------------------------------------------------------------------------- hatch_sub1: lda rot_color ; B581 AD 2A 06 .*. sta PCOLR3 ; B584 8D C3 02 ... rts ; B587 60 ` ; ---------------------------------------------------------------------------- zero_filler_8588: .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B588 00 00 00 00 00 00 00 00 ........ l12_map:.byte $FE,$33,$9C,$FD,$04,$00,$04,$05 ; B590 FE 33 9C FD 04 00 04 05 .3...... .byte $08,$3C,$05,$0A,$7C,$05,$08,$04 ; B598 08 3C 05 0A 7C 05 08 04 .<..|... .byte $25,$26,$04,$43,$26,$04,$55,$06 ; B5A0 25 26 04 43 26 04 55 06 %&.C&.U. .byte $3C,$55,$0A,$84,$55,$06,$04,$43 ; B5A8 3C 55 0A 84 55 06 04 43 . .byte $4E,$B6,$FE,$49,$9C,$FD,$04,$00 ; B622 4E B6 FE 49 9C FD 04 00 N..I.... .byte $78,$43,$02,$FF,$FE,$49,$9C,$FD ; B62A 78 43 02 FF FE 49 9C FD xC...I.. .byte $04,$00,$3C,$25,$02,$FD,$04,$00 ; B632 04 00 3C 25 02 FD 04 00 ..<%.... .byte $1C,$25,$02,$FF,$FE,$49,$9C,$FD ; B63A 1C 25 02 FF FE 49 9C FD .%...I.. .byte $04,$00,$7C,$25,$02,$FD,$04,$00 ; B642 04 00 7C 25 02 FD 04 00 ..|%.... .byte $5C,$25,$02,$FF,$FE,$49,$9C,$FD ; B64A 5C 25 02 FF FE 49 9C FD \%...I.. .byte $04,$00,$5C,$43,$02,$FF ; B652 04 00 5C 43 02 FF ..\C.. l12_unkn0: .byte $00,$71,$B6,$08,$40,$02,$01,$08 ; B658 00 71 B6 08 40 02 01 08 .q..@... .byte $03,$71,$B6,$08,$14,$40,$02,$08 ; B660 03 71 B6 08 14 40 02 08 .q...@.. .byte $04,$71,$B6,$08,$00,$80,$03,$08 ; B668 04 71 B6 08 00 80 03 08 .q...... .byte $FF,$47,$EF,$3E,$1E,$1E,$0E,$02 ; B670 FF 47 EF 3E 1E 1E 0E 02 .G.>.... .byte $05,$40,$EE,$3F,$1E,$1C,$0C,$02 ; B678 05 40 EE 3F 1E 1C 0C 02 .@.?.... .byte $05,$40,$E0,$38,$1C,$1E,$0D,$02 ; B680 05 40 E0 38 1C 1E 0D 02 .@.8.... .byte $05,$40,$EE,$3F,$1E,$1C,$0C,$02 ; B688 05 40 EE 3F 1E 1C 0C 02 .@.?.... .byte $05 ; B690 05 . ; ---------------------------------------------------------------------------- hurr_sub0: lda start_falling_flag ; B691 AD 21 06 .!. bne falling_wind ; B694 D0 01 .. rts ; B696 60 ` ; ---------------------------------------------------------------------------- ; wind blows jumpman to the right when he's dying falling_wind: inc player_x_pos ; B697 EE 7E 06 .~. hurr_done: rts ; B69A 60 ` ; ---------------------------------------------------------------------------- hurr_sub1: lda current_speed ; B69B AD 24 06 .$. cmp #$09 ; B69E C9 09 .. bcs LB6A9 ; B6A0 B0 07 .. lda falling_flag ; B6A2 AD 23 06 .#. cmp #$02 ; B6A5 C9 02 .. bne LB6BA ; B6A7 D0 11 .. LB6A9: lda $0768 ; B6A9 AD 68 07 .h. bne hurr_done ; B6AC D0 EC .. inc $0768 ; B6AE EE 68 07 .h. lda #$00 ; B6B1 A9 00 .. sta AUDC1 ; B6B3 8D 01 D2 ... sta AUDF1 ; B6B6 8D 00 D2 ... rts ; B6B9 60 ` ; ---------------------------------------------------------------------------- LB6BA: lda $076F ; B6BA AD 6F 07 .o. bne LB6DC ; B6BD D0 1D .. lda #$81 ; B6BF A9 81 .. sta AUDC1 ; B6C1 8D 01 D2 ... sta $076C ; B6C4 8D 6C 07 .l. lda #$00 ; B6C7 A9 00 .. sta jiffy_timer_2 ; B6C9 8D 1B 06 ... lda #$04 ; B6CC A9 04 .. sta $076E ; B6CE 8D 6E 07 .n. sta $076F ; B6D1 8D 6F 07 .o. lda RANDOM ; B6D4 AD 0A D2 ... and #$3F ; B6D7 29 3F )? sta $076D ; B6D9 8D 6D 07 .m. LB6DC: lda #$10 ; B6DC A9 10 .. sta AUDF1 ; B6DE 8D 00 D2 ... lda jiffy_timer_2 ; B6E1 AD 1B 06 ... cmp $076D ; B6E4 CD 6D 07 .m. bne LB702 ; B6E7 D0 19 .. lda $076E ; B6E9 AD 6E 07 .n. beq LB6F7 ; B6EC F0 09 .. inc $076C ; B6EE EE 6C 07 .l. dec $076E ; B6F1 CE 6E 07 .n. jmp LB6FD ; B6F4 4C FD B6 L.. ; ---------------------------------------------------------------------------- LB6F7: dec $076C ; B6F7 CE 6C 07 .l. dec $076F ; B6FA CE 6F 07 .o. LB6FD: lda #$00 ; B6FD A9 00 .. sta jiffy_timer_2 ; B6FF 8D 1B 06 ... LB702: lda $076C ; B702 AD 6C 07 .l. sta AUDC1 ; B705 8D 01 D2 ... rts ; B708 60 ` ; ---------------------------------------------------------------------------- hurr_sub2: lda $06F5 ; B709 AD F5 06 ... cmp #$01 ; B70C C9 01 .. bne LB71C ; B70E D0 0C .. inc $0669 ; B710 EE 69 06 .i. inc $066C ; B713 EE 6C 06 .l. inc $066D ; B716 EE 6D 06 .m. inc $06F5 ; B719 EE F5 06 ... LB71C: lda $0622 ; B71C AD 22 06 .". bne LB722 ; B71F D0 01 .. LB721: rts ; B721 60 ` ; ---------------------------------------------------------------------------- LB722: ldx #$FF ; B722 A2 FF .. LB724: inx ; B724 E8 . cpx #$01 ; B725 E0 01 .. beq LB724 ; B727 F0 FB .. cpx #$02 ; B729 E0 02 .. beq LB724 ; B72B F0 F7 .. cpx #$05 ; B72D E0 05 .. beq LB721 ; B72F F0 F0 .. lda $076C ; B731 AD 6C 07 .l. and #$0F ; B734 29 0F ). tay ; B736 A8 . clc ; B737 18 . lda $067D,x ; B738 BD 7D 06 .}. adc wind_table_1,y ; B73B 79 6B B7 yk. sta $067D,x ; B73E 9D 7D 06 .}. clc ; B741 18 . lda $0682,x ; B742 BD 82 06 ... adc wind_table_2,y ; B745 79 71 B7 yq. cmp #$C6 ; B748 C9 C6 .. bcs LB75D ; B74A B0 11 .. sta $0682,x ; B74C 9D 82 06 ... lda $0687,x ; B74F BD 87 06 ... and #$03 ; B752 29 03 ). sta $0687,x ; B754 9D 87 06 ... inc $0687,x ; B757 FE 87 06 ... jmp LB724 ; B75A 4C 24 B7 L$. ; ---------------------------------------------------------------------------- LB75D: lda #$02 ; B75D A9 02 .. sta $067D,x ; B75F 9D 7D 06 .}. lda RANDOM ; B762 AD 0A D2 ... sta $0682,x ; B765 9D 82 06 ... jmp LB724 ; B768 4C 24 B7 L$. ; ---------------------------------------------------------------------------- ; used in level12 wind_table_1: .byte $01,$02,$03,$03,$03,$03 ; B76B 01 02 03 03 03 03 ...... wind_table_2: .byte $02,$01,$00,$00,$00,$00,$00,$00 ; B771 02 01 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B779 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B781 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B789 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B791 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B799 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B7A1 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B7A9 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B7B1 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00 ; B7B9 00 00 00 00 00 00 00 ....... ; ---------------------------------------------------------------------------- ; roll over the score if it's >= 1 million score_mod_1m: lda score+2 ; B7C0 AD 02 07 ... cmp #$0F ; B7C3 C9 0F .. bcc score_below_1m ; B7C5 90 27 .' lda score+1 ; B7C7 AD 01 07 ... cmp #$42 ; B7CA C9 42 .B bcc score_below_1m ; B7CC 90 20 . lda score ; B7CE AD 00 07 ... cmp #$40 ; B7D1 C9 40 .@ bcc score_below_1m ; B7D3 90 19 .. sec ; B7D5 38 8 lda score ; B7D6 AD 00 07 ... sbc #$40 ; B7D9 E9 40 .@ sta score ; B7DB 8D 00 07 ... lda score+1 ; B7DE AD 01 07 ... sbc #$42 ; B7E1 E9 42 .B sta score+1 ; B7E3 8D 01 07 ... lda score+2 ; B7E6 AD 02 07 ... sbc #$0F ; B7E9 E9 0F .. sta score+2 ; B7EB 8D 02 07 ... score_below_1m: jmp print_score ; B7EE 4C 68 86 Lh. ; ---------------------------------------------------------------------------- zero_filler_b7f1: .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B7F1 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00 ; B7F9 00 00 00 00 00 00 00 ....... ; ---------------------------------------------------------------------------- end_of_level_bonus: lda level ; B800 AD F6 06 ... asl a ; B803 0A . tay ; B804 A8 . lda mul_25_table,y ; B805 B9 A7 B8 ... sta $A4 ; B808 85 A4 .. lda mul_25_table+1,y ; B80A B9 A8 B8 ... sta $A5 ; B80D 85 A5 .. lda lives ; B80F AD 0A 07 ... sta $A6 ; B812 85 A6 .. inc $A6 ; B814 E6 A6 .. lda $A4 ; B816 A5 A4 .. sta num_in ; B818 85 D0 .. lda $A5 ; B81A A5 A5 .. sta num_in+1 ; B81C 85 D1 .. lda #$00 ; B81E A9 00 .. sta work_level_time_bonus ; B820 8D 91 07 ... sta num_in+2 ; B823 85 D2 .. sta work_level_time_bonus+1 ; B825 8D 92 07 ... lda #$E9 ; B828 A9 E9 .. sta num_out ; B82A 85 D3 .. lda #$3D ; B82C A9 3D .= sta num_out+1 ; B82E 85 D4 .. jsr print_number_jv ; B830 20 09 80 .. lda #$78 ; B833 A9 78 .x sta $3DE9 ; B835 8D E9 3D ..= jsr print_bonus_jv ; B838 20 0F 80 .. add_life_bonus: clc ; B83B 18 . lda score ; B83C AD 00 07 ... adc $A4 ; B83F 65 A4 e. sta score ; B841 8D 00 07 ... lda score+1 ; B844 AD 01 07 ... adc $A5 ; B847 65 A5 e. sta score+1 ; B849 8D 01 07 ... bcc el_hi_ok ; B84C 90 03 .. inc score+2 ; B84E EE 02 07 ... el_hi_ok: clc ; B851 18 . lda work_level_time_bonus ; B852 AD 91 07 ... adc $A4 ; B855 65 A4 e. sta work_level_time_bonus ; B857 8D 91 07 ... lda work_level_time_bonus+1 ; B85A AD 92 07 ... adc $A5 ; B85D 65 A5 e. sta work_level_time_bonus+1 ; B85F 8D 92 07 ... jsr check_extra_life_jv ; B862 20 0C 80 .. jsr print_bonus_jv ; B865 20 0F 80 .. ; play once per life play_life_bonus_sfx: lda #$96 ; B868 A9 96 .. sta snd_ptr ; B86A 8D 3C 06 .<. lda #$B8 ; B86D A9 B8 .. sta snd_ptr+1 ; B86F 8D 3D 06 .=. jsr cue_sfx_jv ; B872 20 06 80 .. ; wait for sfx to finish el_wait_sfx: lda snd_slot_duration ; B875 AD 46 06 .F. ora $0644 ; B878 0D 44 06 .D. bne el_wait_sfx ; B87B D0 F8 .. dec $A6 ; B87D C6 A6 .. bne add_life_bonus ; B87F D0 BA .. sta jiffy_timer_1 ; B881 8D 1A 06 ... ; wait approx 1/2 sec el_delay: lda jiffy_timer_1 ; B884 AD 1A 06 ... cmp #$20 ; B887 C9 20 . bne el_delay ; B889 D0 F9 .. lda randomizer_mode ; B88B AD F3 06 ... bne el_done ; B88E D0 03 .. jmp L8DA0 ; B890 4C A0 8D L.. ; ---------------------------------------------------------------------------- el_done:jmp afterlife ; B893 4C 00 96 L.. ; ---------------------------------------------------------------------------- ; played when adding bonus per life at end of level sfx_add_life_bonus: .byte $01,$E4,$00,$18,$02,$3C,$02,$79 ; B896 01 E4 00 18 02 3C 02 79 .....<.y .byte $02,$F3,$02,$01,$A0,$00,$0A,$14 ; B89E 02 F3 02 01 A0 00 0A 14 ........ .byte $00 ; B8A6 00 . ; ---------------------------------------------------------------------------- ; multiply by 25 mul_25_table: .word $0019,$0032,$004B,$0064 ; B8A7 19 00 32 00 4B 00 64 00 ..2.K.d. .word $007D,$0096,$00AF,$00C8 ; B8AF 7D 00 96 00 AF 00 C8 00 }....... .word $00E1,$00FA,$0113,$012C ; B8B7 E1 00 FA 00 13 01 2C 01 ......,. ; ---------------------------------------------------------------------------- zero_filler_b8bf: .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B8BF 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B8C7 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B8CF 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B8D7 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B8DF 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B8E7 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B8EF 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B8F7 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B8FF 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B907 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B90F 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B917 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B91F 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B927 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B92F 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B937 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B93F 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B947 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B94F 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B957 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; B95F 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00 ; B967 00 00 00 00 .... ; ---------------------------------------------------------------------------- ; display all the levels, happens if left idle at the title screen demo_mode: lda #$00 ; B96B A9 00 .. sta jiffy_timer_1 ; B96D 8D 1A 06 ... ; 96 jiffies, 1.6s ntsc, 1.92s pal demo_wait: lda jiffy_timer_1 ; B970 AD 1A 06 ... cmp #$60 ; B973 C9 60 .` bne demo_wait ; B975 D0 F9 .. lda #$00 ; B977 A9 00 .. sta demo_map_ptr ; B979 85 E0 .. lda #$00 ; B97B A9 00 .. sta $06AB ; B97D 8D AB 06 ... sta $067D ; B980 8D 7D 06 .}. sta $0681 ; B983 8D 81 06 ... sta player_x_pos ; B986 8D 7E 06 .~. sta $0680 ; B989 8D 80 06 ... lda #$A0 ; B98C A9 A0 .. sta demo_map_ptr+1 ; B98E 85 E1 .. lda #$00 ; B990 A9 00 .. sta demo_name_offset ; B992 85 E2 .. jsr clear_screen_mem_jv ; B994 20 1E 80 .. jsr setup_gameboard_dlist_jv ; B997 20 15 80 .. nop ; B99A EA . nop ; B99B EA . nop ; B99C EA . ; initially, demo_map_ptr points to $A000 (start of level descriptions), Y is $16, or offset to _map0 within level desc. demo_show_map: ldy #$16 ; B99D A0 16 .. lda (demo_map_ptr),y ; B99F B1 E0 .. sta dm_progctr ; B9A1 85 C0 .. iny ; B9A3 C8 . lda (demo_map_ptr),y ; B9A4 B1 E0 .. sta dm_progctr+1 ; B9A6 85 C1 .. ldy demo_name_offset ; B9A8 A4 E2 .. ldx #$00 ; B9AA A2 00 .. demo_show_name: lda level_names,y ; B9AC B9 00 BB ... sec ; B9AF 38 8 sbc #$20 ; B9B0 E9 20 . sta $3DE8,x ; B9B2 9D E8 3D ..= iny ; B9B5 C8 . inx ; B9B6 E8 . cpx #$14 ; B9B7 E0 14 .. bne demo_show_name ; B9B9 D0 F1 .. jsr demo_set_colors ; B9BB 20 EC B9 .. lda #$00 ; B9BE A9 00 .. sta jiffy_timer_1 ; B9C0 8D 1A 06 ... jsr draw_map_jv ; B9C3 20 00 80 .. ; approx 2/3 sec demo_wait_1: lda jiffy_timer_1 ; B9C6 AD 1A 06 ... cmp #$40 ; B9C9 C9 40 .@ bne demo_wait_1 ; B9CB D0 F9 .. jsr clear_screen_mem_jv ; B9CD 20 1E 80 .. clc ; B9D0 18 . lda demo_name_offset ; B9D1 A5 E2 .. adc #$14 ; B9D3 69 14 i. sta demo_name_offset ; B9D5 85 E2 .. cmp #$F0 ; B9D7 C9 F0 .. bne demo_next_map ; B9D9 D0 03 .. jmp reinit_game ; B9DB 4C 0C 90 L.. ; ---------------------------------------------------------------------------- demo_next_map: clc ; B9DE 18 . lda demo_map_ptr ; B9DF A5 E0 .. adc #$40 ; B9E1 69 40 i@ sta demo_map_ptr ; B9E3 85 E0 .. bcc demo_show_map ; B9E5 90 B6 .. inc demo_map_ptr+1 ; B9E7 E6 E1 .. jmp demo_show_map ; B9E9 4C 9D B9 L.. ; ---------------------------------------------------------------------------- ; demo_map_ptr points to levelXX_desc demo_set_colors: ldy #$2F ; B9EC A0 2F ./ lda (demo_map_ptr),y ; B9EE B1 E0 .. sta COLOR0 ; B9F0 8D C4 02 ... iny ; B9F3 C8 . lda (demo_map_ptr),y ; B9F4 B1 E0 .. sta COLOR1 ; B9F6 8D C5 02 ... iny ; B9F9 C8 . lda (demo_map_ptr),y ; B9FA B1 E0 .. sta COLOR2 ; B9FC 8D C6 02 ... rts ; B9FF 60 ` ; ---------------------------------------------------------------------------- ; calls draw_map, plays level intro music, shows level name draw_level: lda #$40 ; BA00 A9 40 .@ sta NMIEN ; BA02 8D 0E D4 ... lda #$00 ; BA05 A9 00 .. sta COLOR3 ; BA07 8D C7 02 ... sta COLOR0 ; BA0A 8D C4 02 ... sta COLOR1 ; BA0D 8D C5 02 ... sta COLOR2 ; BA10 8D C6 02 ... lda #$30 ; BA13 A9 30 .0 sta SAVMSC+1 ; BA15 85 59 .Y jsr clear_screen_mem_jv ; BA17 20 1E 80 .. lda cur_level_map ; BA1A AD D6 07 ... sta dm_progctr ; BA1D 85 C0 .. lda cur_level_map+1 ; BA1F AD D7 07 ... sta dm_progctr+1 ; BA22 85 C1 .. jsr draw_map_jv ; BA24 20 00 80 .. lda #$30 ; BA27 A9 30 .0 sta SAVMSC+1 ; BA29 85 59 .Y lda #$00 ; BA2B A9 00 .. sta $AA ; BA2D 85 AA .. sta $06AB ; BA2F 8D AB 06 ... sta COLOR4 ; BA32 8D C8 02 ... jsr setup_gameboard_dlist_jv ; BA35 20 15 80 .. lda level ; BA38 AD F6 06 ... tay ; BA3B A8 . lda level_name_hscrol_table,y ; BA3C B9 F0 BB ... sta HSCROL ; BA3F 8D 04 D4 ... lda #$16 ; BA42 A9 16 .. sta $085E ; BA44 8D 5E 08 .^. sta $08DF ; BA47 8D DF 08 ... lda level ; BA4A AD F6 06 ... pha ; BA4D 48 H asl a ; BA4E 0A . asl a ; BA4F 0A . asl a ; BA50 0A . asl a ; BA51 0A . sta dm_progctr ; BA52 85 C0 .. pla ; BA54 68 h asl a ; BA55 0A . asl a ; BA56 0A . clc ; BA57 18 . adc dm_progctr ; BA58 65 C0 e. tay ; BA5A A8 . ldx #$00 ; BA5B A2 00 .. ; copy level name into screen RAM show_level_name: lda level_names,y ; BA5D B9 00 BB ... sec ; BA60 38 8 sbc #$20 ; BA61 E9 20 . sta $3DEA,x ; BA63 9D EA 3D ..= inx ; BA66 E8 . iny ; BA67 C8 . cpx #$14 ; BA68 E0 14 .. bne show_level_name ; BA6A D0 F1 .. lda #$08 ; BA6C A9 08 .. jsr cue_music_jv ; BA6E 20 18 80 .. ; level is already drawn with all color regs set to black. for each color reg, wait 1 sec before turning it visible. this syncs up with the music because the music was written to sync with this actually sync_to_music: jsr wait_1_sec ; BA71 20 9E BA .. lda cur_level_colpf2 ; BA74 AD F1 07 ... sta COLOR2 ; BA77 8D C6 02 ... jsr wait_1_sec ; BA7A 20 9E BA .. lda cur_level_colpf1 ; BA7D AD F0 07 ... sta COLOR1 ; BA80 8D C5 02 ... jsr wait_1_sec ; BA83 20 9E BA .. lda cur_level_colpf0 ; BA86 AD EF 07 ... sta COLOR0 ; BA89 8D C4 02 ... jsr wait_1_sec ; BA8C 20 9E BA .. lda #$00 ; BA8F A9 00 .. jsr wait_1_sec ; BA91 20 9E BA .. jsr enable_joystick_jv ; BA94 20 1B 80 .. lda #$00 ; BA97 A9 00 .. tay ; BA99 A8 . jsr wait_1_sec ; BA9A 20 9E BA .. rts ; BA9D 60 ` ; ---------------------------------------------------------------------------- ; actually 64 jiffies, 1.067S ntsc, 1.28s pal wait_1_sec: lda #$00 ; BA9E A9 00 .. sta jiffy_timer_1 ; BAA0 8D 1A 06 ... keep_waiting: lda jiffy_timer_1 ; BAA3 AD 1A 06 ... cmp #$40 ; BAA6 C9 40 .@ bne keep_waiting ; BAA8 D0 F9 .. rts ; BAAA 60 ` ; ---------------------------------------------------------------------------- zero_filler_baab: .byte $00,$00,$00,$00,$00,$00,$00,$00 ; BAAB 00 00 00 00 00 00 00 00 ........ .byte $00,$00,$00,$00,$00,$00,$00,$00 ; BAB3 00 00 00 00 00 00 00 00 ........ .byte $00 ; BABB 00 . ; level intro music, melody sfx15: .byte $01,$A5,$02,$3C,$10,$2F,$10,$35 ; BABC 01 A5 02 3C 10 2F 10 35 ...<./.5 .byte $10,$2D,$10,$2F,$08,$2D,$08,$28 ; BAC4 10 2D 10 2F 08 2D 08 28 .-./.-.( .byte $08,$2F,$08,$35,$08,$2F,$08,$2D ; BACC 08 2F 08 35 08 2F 08 2D ./.5./.- .byte $08,$35,$08,$3C,$10,$2F,$10,$35 ; BAD4 08 35 08 3C 10 2F 10 35 .5.<./.5 .byte $10,$2D,$10,$28,$08,$2D,$08,$2F ; BADC 10 2D 10 28 08 2D 08 2F .-.(.-./ .byte $08,$35,$08,$3C,$10,$00 ; BAE4 08 35 08 3C 10 00 .5.<.. ; level intro music, bass sfx16: .byte $01,$A7,$02,$F3,$20,$A2,$20,$F3 ; BAEA 01 A7 02 F3 20 A2 20 F3 .... . . .byte $20,$A2,$20,$F3,$20,$A2,$20,$79 ; BAF2 20 A2 20 F3 20 A2 20 79 . . . y .byte $10,$A2,$10,$F3,$10,$00 ; BAFA 10 A2 10 F3 10 00 ...... level_names: .byte $20,$20,$20,$4E,$4F,$54,$48,$49 ; BB00 20 20 20 4E 4F 54 48 49 NOTHI .byte $4E,$47,$20,$54,$4F,$20,$49,$54 ; BB08 4E 47 20 54 4F 20 49 54 NG TO IT .byte $20,$20,$20,$20,$20,$20,$20,$45 ; BB10 20 20 20 20 20 20 20 45 E .byte $4C,$45,$43,$54,$52,$4F,$43,$55 ; BB18 4C 45 43 54 52 4F 43 55 LECTROCU .byte $54,$49,$4F,$4E,$20,$20,$20,$20 ; BB20 54 49 4F 4E 20 20 20 20 TION .byte $20,$20,$20,$20,$20,$44,$55,$4D ; BB28 20 20 20 20 20 44 55 4D DUM .byte $42,$57,$41,$49,$54,$45,$52,$20 ; BB30 42 57 41 49 54 45 52 20 BWAITER .byte $20,$20,$20,$20,$20,$20,$20,$20 ; BB38 20 20 20 20 20 20 20 20 .byte $20,$48,$45,$4C,$4C,$53,$54,$4F ; BB40 20 48 45 4C 4C 53 54 4F HELLSTO .byte $4E,$45,$53,$20,$20,$20,$20,$20 ; BB48 4E 45 53 20 20 20 20 20 NES .byte $20,$20,$46,$49,$47,$55,$52,$49 ; BB50 20 20 46 49 47 55 52 49 FIGURI .byte $54,$53,$20,$52,$45,$56,$45,$4E ; BB58 54 53 20 52 45 56 45 4E TS REVEN .byte $47,$45,$20,$20,$20,$20,$20,$20 ; BB60 47 45 20 20 20 20 20 20 GE .byte $20,$20,$20,$57,$41,$4C,$4C,$53 ; BB68 20 20 20 57 41 4C 4C 53 WALLS .byte $20,$20,$20,$20,$20,$20,$20,$20 ; BB70 20 20 20 20 20 20 20 20 .byte $20,$20,$20,$20,$20,$20,$5A,$49 ; BB78 20 20 20 20 20 20 5A 49 ZI .byte $47,$2D,$5A,$41,$47,$20,$20,$20 ; BB80 47 2D 5A 41 47 20 20 20 G-ZAG .byte $20,$20,$20,$20,$20,$20,$20,$20 ; BB88 20 20 20 20 20 20 20 20 .byte $20,$53,$50,$45,$4C,$4C,$42,$4F ; BB90 20 53 50 45 4C 4C 42 4F SPELLBO .byte $55,$4E,$44,$20,$20,$20,$20,$20 ; BB98 55 4E 44 20 20 20 20 20 UND .byte $20,$20,$20,$20,$20,$20,$42,$4C ; BBA0 20 20 20 20 20 20 42 4C BL .byte $41,$43,$4B,$4F,$55,$54,$20,$20 ; BBA8 41 43 4B 4F 55 54 20 20 ACKOUT .byte $20,$20,$20,$20,$48,$45,$52,$45 ; BBB0 20 20 20 20 48 45 52 45 HERE .byte $54,$48,$45,$52,$45,$45,$56,$45 ; BBB8 54 48 45 52 45 45 56 45 THEREEVE .byte $52,$59,$57,$48,$45,$52,$45,$20 ; BBC0 52 59 57 48 45 52 45 20 RYWHERE .byte $20,$20,$20,$20,$20,$48,$41,$54 ; BBC8 20 20 20 20 20 48 41 54 HAT .byte $43,$48,$4C,$49,$4E,$47,$53,$20 ; BBD0 43 48 4C 49 4E 47 53 20 CHLINGS .byte $20,$20,$20,$20,$20,$20,$20,$20 ; BBD8 20 20 20 20 20 20 20 20 .byte $20,$48,$55,$52,$52,$49,$43,$41 ; BBE0 20 48 55 52 52 49 43 41 HURRICA .byte $4E,$45,$20,$20,$20,$20,$20,$20 ; BBE8 4E 45 20 20 20 20 20 20 NE ; used for centering level name on gameboard level_name_hscrol_table: .byte $04,$04,$00,$00,$00,$04,$04,$00 ; BBF0 04 04 00 00 00 04 04 00 ........ .byte $00,$04,$00,$04,$00,$00,$00,$00 ; BBF8 00 04 00 04 00 00 00 00 ........ ; ---------------------------------------------------------------------------- ; the WELL DONE screen, when you beat all the levels. after this, the game plays random levels. well_done_screen: jsr setup_blank_dlist_jv ; BC00 20 3C 80 <. jsr enable_joystick_jv ; BC03 20 1B 80 .. jsr clear_screen_mem_jv ; BC06 20 1E 80 .. lda #$00 ; BC09 A9 00 .. sta $06AB ; BC0B 8D AB 06 ... jsr setup_gameboard_dlist_jv ; BC0E 20 15 80 .. ldy dlist_shadow_lo ; BC11 AC AC 06 ... lda #$41 ; BC14 A9 41 .A sta $080A,y ; BC16 99 0A 08 ... tya ; BC19 98 . sta $080B,y ; BC1A 99 0B 08 ... lda #$08 ; BC1D A9 08 .. sta $080C,y ; BC1F 99 0C 08 ... lda #$D9 ; BC22 A9 D9 .. sta dm_progctr ; BC24 85 C0 .. lda #$BC ; BC26 A9 BC .. sta dm_progctr+1 ; BC28 85 C1 .. jsr draw_map_jv ; BC2A 20 00 80 .. lda #$04 ; BC2D A9 04 .. sta $0688 ; BC2F 8D 88 06 ... sta $066A ; BC32 8D 6A 06 .j. lda #$7C ; BC35 A9 7C .| sta player_x_pos ; BC37 8D 7E 06 .~. lda #$20 ; BC3A A9 20 . sta player_y_pos ; BC3C 8D 83 06 ... ; load dli_service_2 address into dli shadow setup_dli_2: lda #$C7 ; BC3F A9 C7 .. sta dli_vec_shadow_lo ; BC41 8D AE 06 ... lda #$BD ; BC44 A9 BD .. sta dli_vec_shadow_hi ; BC46 8D AF 06 ... lda #$8D ; BC49 A9 8D .. sta $0809 ; BC4B 8D 09 08 ... sta $088A ; BC4E 8D 8A 08 ... ; wait until the dli has been set up (by vblank) wd_wait_dli: lda dli_vec_shadow_hi ; BC51 AD AF 06 ... bne wd_wait_dli ; BC54 D0 FB .. lda #$96 ; BC56 A9 96 .. sta COLOR0 ; BC58 8D C4 02 ... sta jiffy_timer_1 ; BC5B 8D 1A 06 ... ; wait 32 jiffies (approx 1/2 sec) wd_wait_32j: lda jiffy_timer_1 ; BC5E AD 1A 06 ... cmp #$20 ; BC61 C9 20 . bne wd_wait_32j ; BC63 D0 F9 .. lda #$03 ; BC65 A9 03 .. jsr cue_music_jv ; BC67 20 18 80 .. lda #$CD ; BC6A A9 CD .. sta work_level_sub0 ; BC6C 8D 82 07 ... lda #$BC ; BC6F A9 BC .. sta work_level_sub0+1 ; BC71 8D 83 07 ... lda #$05 ; BC74 A9 05 .. sta current_speed ; BC76 8D 24 06 .$. lda #$0D ; BC79 A9 0D .. sta joystick_disabled ; BC7B 8D 32 06 .2. lda #$00 ; BC7E A9 00 .. sta falling_flag ; BC80 8D 23 06 .#. lda #$52 ; BC83 A9 52 .R sta work_level_sub1 ; BC85 8D 84 07 ... lda #$BD ; BC88 A9 BD .. sta work_level_sub1+1 ; BC8A 8D 85 07 ... lda #$4C ; BC8D A9 4C .L sta work_level_offs_50+3 ; BC8F 8D B5 07 ... ; wait for score screen to finish (I think, anyway) wd_wait_scores: lda work_level_sub1 ; BC92 AD 84 07 ... cmp #$E6 ; BC95 C9 E6 .. bne wd_wait_scores ; BC97 D0 F9 .. lda #$00 ; BC99 A9 00 .. sta $06AB ; BC9B 8D AB 06 ... jsr setup_gameboard_dlist_jv ; BC9E 20 15 80 .. ldx #$0B ; BCA1 A2 0B .. ; wait 32 jiffies (approx 1/2 sec) print_total_score_msg: lda total_score_msg_minus_one,x ; BCA3 BD D1 BD ... sta $3DE8,x ; BCA6 9D E8 3D ..= dex ; BCA9 CA . bne print_total_score_msg ; BCAA D0 F7 .. lda #$3D ; BCAC A9 3D .= sta num_out+1 ; BCAE 85 D4 .. lda #$F5 ; BCB0 A9 F5 .. sta num_out ; BCB2 85 D3 .. ldx #$03 ; BCB4 A2 03 .. ; display current user's score, number_of_users should be score-1 here. wd_xxx: lda number_of_users,x ; BCB6 BD FF 06 ... sta tmp_sprite_height,x ; BCB9 95 CF .. dex ; BCBB CA . bne wd_xxx ; BCBC D0 F8 .. jsr print_number_jv ; BCBE 20 09 80 .. ; wait until music is done playing (not 100% sure though) wd_wait_music: lda $0663 ; BCC1 AD 63 06 .c. bne wd_wait_music ; BCC4 D0 FB .. lda level ; BCC6 AD F6 06 ... inc randomizer_mode ; BCC9 EE F3 06 ... rts ; BCCC 60 ` ; ---------------------------------------------------------------------------- ; used in work_level_sub0 slot during well_doneused in work_level_sub1 slot during well_done well_done_sub0: lda rot_color ; BCCD AD 2A 06 .*. sta COLOR2 ; BCD0 8D C6 02 ... lda #$02 ; BCD3 A9 02 .. sta sav_p0pf ; BCD5 8D B4 06 ... rts ; BCD8 60 ` ; ---------------------------------------------------------------------------- ; level map used for the WELL DONE screen, when you beat level 12 well_done_map: .byte $FE,$A0,$BD,$FD,$00,$04,$0C,$06 ; BCD9 FE A0 BD FD 00 04 0C 06 ........ .byte $07,$30,$06,$09,$54,$06,$09,$78 ; BCE1 07 30 06 09 54 06 09 78 .0..T..x .byte $06,$09,$0C,$30,$09,$30,$38,$05 ; BCE9 06 09 0C 30 09 30 38 05 ...0.08. .byte $54,$30,$09,$78,$30,$09,$FD,$04 ; BCF1 54 30 09 78 30 09 FD 04 T0.x0... .byte $04,$10,$22,$02,$20,$34,$01,$34 ; BCF9 04 10 22 02 20 34 01 34 ..". 4.4 .byte $4C,$01,$44,$34,$01,$58,$38,$05 ; BD01 4C 01 44 34 01 58 38 05 L.D4.X8. .byte $FD,$04,$FC,$1C,$26,$02,$20,$4C ; BD09 FD 04 FC 1C 26 02 20 4C ....&. L .byte $01,$34,$34,$01,$44,$4C,$01,$FD ; BD11 01 34 34 01 44 4C 01 FD .44.DL.. .byte $04,$00,$34,$06,$06,$34,$16,$06 ; BD19 04 00 34 06 06 34 16 06 ..4..4.. .byte $34,$26,$06,$54,$26,$07,$78,$26 ; BD21 34 26 06 54 26 07 78 26 4&.T&.x& .byte $07,$10,$30,$04,$0C,$50,$05,$38 ; BD29 07 10 30 04 0C 50 05 38 ..0..P.8 .byte $30,$03,$38,$50,$03,$7C,$30,$06 ; BD31 30 03 38 50 03 7C 30 06 0.8P.|0. .byte $7C,$40,$06,$7C,$50,$06,$FD,$00 ; BD39 7C 40 06 7C 50 06 FD 00 |@.|P... .byte $04,$24,$06,$07,$24,$38,$05,$48 ; BD41 04 24 06 07 24 38 05 48 .$..$8.H .byte $38,$05,$6C,$30,$09,$18,$1A,$03 ; BD49 38 05 6C 30 09 18 1A 03 8.l0.... .byte $FF ; BD51 FF . ; ---------------------------------------------------------------------------- ; used in work_level_sub1 slot during well_doneused in work_level_sub1 slot during well_done well_done_sub1: lda start_falling_flag ; BD52 AD 21 06 .!. bne wds1_cont ; BD55 D0 01 .. rts ; BD57 60 ` ; ---------------------------------------------------------------------------- ; we seem to be setting/clearing bit 7 in the display list, moving the line(s) where DLI(s) occur. wds1_cont: ldy dlist_shadow_lo ; BD58 AC AC 06 ... lda #$0D ; BD5B A9 0D .. sta $0809,y ; BD5D 99 09 08 ... lda #$8D ; BD60 A9 8D .. sta $080A,y ; BD62 99 0A 08 ... lda $080B,y ; BD65 B9 0B 08 ... sta $080C,y ; BD68 99 0C 08 ... lda #$41 ; BD6B A9 41 .A sta $080B,y ; BD6D 99 0B 08 ... lda #$08 ; BD70 A9 08 .. sta $080D,y ; BD72 99 0D 08 ... inc dlist_shadow_lo ; BD75 EE AC 06 ... cpy #$4E ; BD78 C0 4E .N beq wds1_finish ; BD7A F0 05 .. cpy #$CE ; BD7C C0 CE .. beq wds1_finish ; BD7E F0 01 .. rts ; BD80 60 ` ; ---------------------------------------------------------------------------- ; set things up for the next level? wds1_finish: lda #$E6 ; BD81 A9 E6 .. sta work_level_sub1 ; BD83 8D 84 07 ... lda #$06 ; BD86 A9 06 .. sta work_level_sub1+1 ; BD88 8D 85 07 ... lda #$09 ; BD8B A9 09 .. sta current_speed ; BD8D 8D 24 06 .$. lda #$C6 ; BD90 A9 C6 .. sta player_y_pos ; BD92 8D 83 06 ... lda #$00 ; BD95 A9 00 .. sta start_falling_flag ; BD97 8D 21 06 .!. lda #$01 ; BD9A A9 01 .. sta $0688 ; BD9C 8D 88 06 ... rts ; BD9F 60 ` ; ---------------------------------------------------------------------------- ; used to draw the large WELL DONE banner well_done_shape: .byte $04,$00,$00,$01,$01,$01,$01,$05 ; BDA0 04 00 00 01 01 01 01 05 ........ .byte $00,$01,$01,$01,$01,$01,$03,$05 ; BDA8 00 01 01 01 01 01 03 05 ........ .byte $00,$02,$01,$01,$01,$01,$03,$05 ; BDB0 00 02 01 01 01 01 03 05 ........ .byte $00,$03,$01,$01,$01,$01,$03,$04 ; BDB8 00 03 01 01 01 01 03 04 ........ .byte $01,$04,$03,$03,$03,$03,$FF ; BDC0 01 04 03 03 03 03 FF ....... ; ---------------------------------------------------------------------------- ; DLI service routine, changes COLBK, address gets stored in $6ae/$6af by code at $bc3c dli_service_2: pha ; BDC7 48 H lda #$C4 ; BDC8 A9 C4 .. sta WSYNC ; BDCA 8D 0A D4 ... sta COLBK ; BDCD 8D 1A D0 ... pla ; BDD0 68 h ; 1-indexed total_score_msg_minus_one: rti ; BDD1 40 @ ; ---------------------------------------------------------------------------- ; screen codes, displayed by well_done_screen total_score_msg: .byte $74,$6F,$74,$61,$6C,$00,$73,$63 ; BDD2 74 6F 74 61 6C 00 73 63 total.sc .byte $6F,$72,$65,$33,$00,$26,$29,$2C ; BDDA 6F 72 65 33 00 26 29 2C ore3.&), .byte $25,$33,$00,$00,$00,$00,$00,$00 ; BDE2 25 33 00 00 00 00 00 00 %3...... .byte $00,$00,$00,$00,$00,$00,$00,$00 ; BDEA 00 00 00 00 00 00 00 00 ........ sfx00: .byte $01,$A5,$02,$79,$08,$A2,$08,$79 ; BDF2 01 A5 02 79 08 A2 08 79 ...y...y .byte $08,$A2,$08,$C1,$10,$C1,$10,$F3 ; BDFA 08 A2 08 C1 10 C1 10 F3 ........ .byte $20,$F3,$20,$02,$F5,$BD,$02,$79 ; BE02 20 F3 20 02 F5 BD 02 79 . ....y .byte $08,$6C,$08,$60,$08,$5B,$08,$51 ; BE0A 08 6C 08 60 08 5B 08 51 .l.`.[.Q .byte $08,$5B,$08,$60,$08,$6C,$08,$79 ; BE12 08 5B 08 60 08 6C 08 79 .[.`.l.y .byte $10,$A2,$10,$F3,$20,$01,$A0,$00 ; BE1A 10 A2 10 F3 20 01 A0 00 .... ... .byte $0A,$80,$00 ; BE22 0A 80 00 ... sfx01: .byte $01,$A6,$02,$3C,$20,$51,$20,$48 ; BE25 01 A6 02 3C 20 51 20 48 ...< Q H .byte $08,$51,$08,$48,$08,$40,$08,$3C ; BE2D 08 51 08 48 08 40 08 3C .Q.H.@.< .byte $10,$3C,$20,$3C,$10,$51,$10,$51 ; BE35 10 3C 20 3C 10 51 10 51 .< <.Q.Q .byte $10,$48,$08,$51,$08,$48,$08,$40 ; BE3D 10 48 08 51 08 48 08 40 .H.Q.H.@ .byte $08,$3C,$20,$3C,$20,$51,$20,$48 ; BE45 08 3C 20 3C 20 51 20 48 .< < Q H .byte $08,$51,$08,$48,$08,$40,$08,$3C ; BE4D 08 51 08 48 08 40 08 3C .Q.H.@.< .byte $10,$3C,$10,$3C,$08,$35,$08,$2F ; BE55 10 3C 10 3C 08 35 08 2F .<.<.5./ .byte $08,$2D,$08,$28,$08,$2D,$08,$2F ; BE5D 08 2D 08 28 08 2D 08 2F .-.(.-./ .byte $08,$35,$08,$3C,$08,$51,$08,$60 ; BE65 08 35 08 3C 08 51 08 60 .5.<.Q.` .byte $08,$51,$08,$79,$20,$00 ; BE6D 08 51 08 79 20 00 .Q.y . ; horizontal movement sfx_walk: .byte $01,$81,$00,$32,$01,$00 ; BE73 01 81 00 32 01 00 ...2.. sfx_extra_life: .byte $01,$A8,$00,$05,$02,$0F,$02,$0A ; BE79 01 A8 00 05 02 0F 02 0A ........ .byte $02,$14,$02,$0F,$02,$19,$02,$14 ; BE81 02 14 02 0F 02 19 02 14 ........ .byte $02,$1E,$02,$00 ; BE89 02 1E 02 00 .... ; end of game tune, melody sfx02: .byte $01,$A5,$02,$3C,$10,$51,$10,$3C ; BE8D 01 A5 02 3C 10 51 10 3C ...<.Q.< .byte $10,$51,$10,$44,$08,$44,$08,$44 ; BE95 10 51 10 44 08 44 08 44 .Q.D.D.D .byte $08,$44,$08,$44,$10,$5B,$10,$4C ; BE9D 08 44 08 44 10 5B 10 4C .D.D.[.L .byte $10,$66,$10,$4C,$10,$66,$10,$51 ; BEA5 10 66 10 4C 10 66 10 51 .f.L.f.Q .byte $40,$00 ; BEAD 40 00 @. ; end of game tune, bass sfx03: .byte $01,$A4,$02,$79,$10,$A2,$10,$F3 ; BEAF 01 A4 02 79 10 A2 10 F3 ...y.... .byte $10,$79,$10,$88,$10,$B6,$10,$D9 ; BEB7 10 79 10 88 10 B6 10 D9 .y...... .byte $10,$88,$10,$99,$10,$CC,$10,$CC ; BEBF 10 88 10 99 10 CC 10 CC ........ .byte $10,$99,$10,$A2,$08,$99,$08,$A2 ; BEC7 10 99 10 A2 08 99 08 A2 ........ .byte $08,$99,$08,$A2,$20,$00 ; BECF 08 99 08 A2 20 00 .... . ; end level tune #1, bass sfx04: .byte $01,$A5,$02,$79,$14,$A2,$14,$79 ; BED5 01 A5 02 79 14 A2 14 79 ...y...y .byte $14,$A2,$14,$79,$14,$A2,$14,$F3 ; BEDD 14 A2 14 79 14 A2 14 F3 ...y.... .byte $14,$A2,$14,$02,$D8,$BE,$01,$00 ; BEE5 14 A2 14 02 D8 BE 01 00 ........ ; end level tune #1, melody sfx05: .byte $01,$A0,$00,$0A,$A0,$01,$A6,$02 ; BEED 01 A0 00 0A A0 01 A6 02 ........ .byte $51,$0A,$55,$0A,$51,$0A,$4C,$0A ; BEF5 51 0A 55 0A 51 0A 4C 0A Q.U.Q.L. .byte $51,$0A,$4C,$0A,$48,$0A,$4C,$0A ; BEFD 51 0A 4C 0A 48 0A 4C 0A Q.L.H.L. .byte $48,$0A,$44,$0A,$48,$0A,$44,$0A ; BF05 48 0A 44 0A 48 0A 44 0A H.D.H.D. .byte $3C,$0A,$51,$0A,$3C,$14,$00 ; BF0D 3C 0A 51 0A 3C 14 00 <.Q.<.. ; end level tune #2, melody sfx06: .byte $01,$A6,$02,$79,$20,$60,$14,$51 ; BF14 01 A6 02 79 20 60 14 51 ...y `.Q .byte $3C,$60,$0A,$5B,$14,$60,$08,$5B ; BF1C 3C 60 0A 5B 14 60 08 5B <`.[.`.[ .byte $14,$60,$08,$5B,$14,$51,$08,$60 ; BF24 14 60 08 5B 14 51 08 60 .`.[.Q.` .byte $14,$79,$20,$00 ; BF2C 14 79 20 00 .y . ; end level tune #2, bass sfx07: .byte $01,$A6,$02,$F3,$0A,$D9,$0A,$C1 ; BF30 01 A6 02 F3 0A D9 0A C1 ........ .byte $0A,$A2,$14,$79,$1E,$A2,$1E,$C1 ; BF38 0A A2 14 79 1E A2 1E C1 ...y.... .byte $0A,$B6,$50,$C1,$08,$A2,$14,$F3 ; BF40 0A B6 50 C1 08 A2 14 F3 ..P..... .byte $20,$00 ; BF48 20 00 . ; end level tune #3, bass sfx08: .byte $01,$A8,$02,$79,$30,$A2,$20,$79 ; BF4A 01 A8 02 79 30 A2 20 79 ...y0. y .byte $20,$51,$10,$A2,$30,$6C,$20,$A3 ; BF52 20 51 10 A2 30 6C 20 A3 Q..0l . .byte $20,$6C,$10,$79,$70,$00 ; BF5A 20 6C 10 79 70 00 l.yp. ; end level tune #3, melody sfx09: .byte $01,$A5,$02,$79,$10,$60,$10,$51 ; BF60 01 A5 02 79 10 60 10 51 ...y.`.Q .byte $10,$3C,$20,$35,$10,$3C,$10,$44 ; BF68 10 3C 20 35 10 3C 10 44 .< 5.<.D .byte $10,$40,$10,$51,$20,$5B,$20,$6C ; BF70 10 40 10 51 20 5B 20 6C .@.Q [ l .byte $20,$80,$10,$79,$10,$60,$10,$51 ; BF78 20 80 10 79 10 60 10 51 ..y.`.Q .byte $10,$3C,$40,$00 ; BF80 10 3C 40 00 .<@. ; end level tune #4, melody sfx10: .byte $01,$A5,$02,$3C,$20,$2D,$12,$32 ; BF84 01 A5 02 3C 20 2D 12 32 ...< -.2 .byte $20,$3C,$20,$4C,$08,$44,$14,$4C ; BF8C 20 3C 20 4C 08 44 14 4C < L.D.L .byte $09,$40,$20,$32,$20,$40,$09,$44 ; BF94 09 40 20 32 20 40 09 44 .@ 2 @.D .byte $09,$4C,$09,$5B,$09,$4C,$09,$5B ; BF9C 09 4C 09 5B 09 4C 09 5B .L.[.L.[ .byte $48,$00 ; BFA4 48 00 H. ; end level tune #4, bass sfx11: .byte $01,$A6,$02,$79,$20,$B6,$30,$99 ; BFA6 01 A6 02 79 20 B6 30 99 ...y .0. .byte $20,$88,$09,$99,$20,$E6,$30,$99 ; BFAE 20 88 09 99 20 E6 30 99 ... .0. .byte $20,$88,$09,$99,$20,$B6,$3A,$00 ; BFB6 20 88 09 99 20 B6 3A 00 ... .:. ; jumping sound sfx_jump: .byte $01,$A5,$00,$79,$04,$60,$04,$51 ; BFBE 01 A5 00 79 04 60 04 51 ...y.`.Q .byte $04,$3C,$04,$51,$04,$60,$04,$79 ; BFC6 04 3C 04 51 04 60 04 79 .<.Q.`.y .byte $04,$00 ; BFCE 04 00 .. ; funeral march melody sfx13: .byte $01,$A5,$01,$3C,$20,$3C,$10,$3C ; BFD0 01 A5 01 3C 20 3C 10 3C ...< <.< .byte $10,$3C,$20,$32,$10,$35,$10,$35 ; BFD8 10 3C 20 32 10 35 10 35 .< 2.5.5 .byte $10,$3C,$10,$3C,$10,$40,$10,$3C ; BFE0 10 3C 10 3C 10 40 10 3C .<.<.@.< .byte $40,$00 ; BFE8 40 00 @. ; funeral march bass sfx14: .byte $01,$A6,$00,$79,$10,$A2,$10,$02 ; BFEA 01 A6 00 79 10 A2 10 02 ...y.... .byte $ED,$BF ; BFF2 ED BF .. ; dunno yet (not code, don't look like audio) data_bff4: .byte $06,$F3,$10,$A2,$10,$00 ; BFF4 06 F3 10 A2 10 00 ...... ; ---------------------------------------------------------------------------- ; main entry point, note cartstart_left and cartstart_right point to the same address cartstart_left: .addr cart_entry_point ; BFFA C0 8A .. ; ---------------------------------------------------------------------------- ; 0 here means 'cartridge present' cartpresent_left: .byte $00 ; BFFC 00 . ; 4 here means init & start the cart, no disk boot, non-diagnostic cartoptions_left: .byte $04 ; BFFD 04 . ; ---------------------------------------------------------------------------- ; points to a CLC/RTS do-nothing routine (same as cartinit_right) cartinit_left: .addr cart_start_stub ; BFFE FE 8A ..