; da65 V2.15 - Git 104f898
; Created:    2016-09-13 04:49:17
; 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 and other sprites, seem to be 10 bytes per sprite
sprite_table:
        .byte   $18,$18,$3C,$5A,$3C,$18,$18,$18 ; 9D00 18 18 3C 5A 3C 18 18 18  ..<Z<...
        .byte   $18,$3C,$1C,$1A,$3C,$58,$38,$18 ; 9D08 18 3C 1C 1A 3C 58 38 18  .<..<X8.
        .byte   $3C,$24,$14,$14,$38,$58,$3C,$1A ; 9D10 3C 24 14 14 38 58 3C 1A  <$..8X<.
        .byte   $1C,$18,$3C,$24,$28,$28,$99,$5A ; 9D18 1C 18 3C 24 28 28 99 5A  ..<$((.Z
        .byte   $3C,$18,$18,$18,$3C,$24,$42,$C3 ; 9D20 3C 18 18 18 3C 24 42 C3  <...<$B.
        .byte   $19,$12,$3C,$58,$98,$18,$7C,$C4 ; 9D28 19 12 3C 58 98 18 7C C4  ..<X..|.
        .byte   $04,$06,$00,$18,$3C,$5A,$99,$18 ; 9D30 04 06 00 18 3C 5A 99 18  ....<Z..
        .byte   $3C,$24,$42,$C3,$98,$48,$3C,$1A ; 9D38 3C 24 42 C3 98 48 3C 1A  <$B..H<.
        .byte   $19,$18,$3E,$23,$20,$60,$18,$10 ; 9D40 19 18 3E 23 20 60 18 10  ..># `..
        .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  ..<Z....
        .byte   $61,$42,$44,$7F,$7F,$44,$42,$61 ; 9DC8 61 42 44 7F 7F 44 42 61  aBD..DBa
        .byte   $00,$00,$08,$22,$80,$01,$58,$18 ; 9DD0 00 00 08 22 80 01 58 18  ..."..X.
        .byte   $3C,$5A,$99,$FF,$10,$44,$01,$80 ; 9DD8 3C 5A 99 FF 10 44 01 80  <Z...D..
        .byte   $1A,$18,$3C,$5A,$99,$FF,$00,$00 ; 9DE0 1A 18 3C 5A 99 FF 00 00  ..<Z....
        .byte   $3C,$3C,$3C,$E7,$06,$C3,$60,$E3 ; 9DE8 3C 3C 3C E7 06 C3 60 E3  <<<...`.
        .byte   $76,$E3,$76,$CE,$67,$CE,$67,$83 ; 9DF0 76 E3 76 CE 67 CE 67 83  v.v.g.g.
        .byte   $C1,$00,$00,$00,$00,$00,$00,$00 ; 9DF8 C1 00 00 00 00 00 00 00  ........
; GR.1/2 font, 512 bytes
charset:.byte   $00,$00,$00,$00,$00,$00,$00,$00 ; 9E00 00 00 00 00 00 00 00 00  ........
        .byte   $00,$0C,$19,$3E,$58,$1E,$22     ; 9E08 00 0C 19 3E 58 1E 22     ...>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  ..<fffff
        .byte   $3C,$00,$18,$38,$18,$18,$18,$18 ; 9E87 3C 00 18 38 18 18 18 18  <..8....
        .byte   $7E,$00,$3C,$66,$06,$0C,$18,$30 ; 9E8F 7E 00 3C 66 06 0C 18 30  ~.<f...0
        .byte   $7E,$00,$3C,$66,$06,$1C,$06,$66 ; 9E97 7E 00 3C 66 06 1C 06 66  ~.<f...f
        .byte   $3C,$00,$0C,$1C,$3C,$6C,$7E,$0C ; 9E9F 3C 00 0C 1C 3C 6C 7E 0C  <...<l~.
        .byte   $0C,$00,$7E,$60,$60,$7C,$06,$06 ; 9EA7 0C 00 7E 60 60 7C 06 06  ..~``|..
        .byte   $7C,$00,$3C,$66,$60,$7C,$66,$66 ; 9EAF 7C 00 3C 66 60 7C 66 66  |.<f`|ff
        .byte   $3C,$00,$7E,$06,$0C,$18,$30,$30 ; 9EB7 3C 00 7E 06 0C 18 30 30  <.~...00
        .byte   $30,$00,$3C,$66,$66,$3C,$66,$66 ; 9EBF 30 00 3C 66 66 3C 66 66  0.<ff<ff
        .byte   $3C,$00,$3C,$66,$66,$3E,$06,$66 ; 9EC7 3C 00 3C 66 66 3E 06 66  <.<ff>.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  |.<ff...
        .byte   $18,$00,$3C,$66,$6E,$6E,$60,$3E ; 9EFF 18 00 3C 66 6E 6E 60 3E  ..<fnn`>
        .byte   $00,$00,$18,$3C,$66,$66,$7E,$66 ; 9F07 00 00 18 3C 66 66 7E 66  ...<ff~f
        .byte   $66,$00,$7C,$66,$66,$7C,$66,$66 ; 9F0F 66 00 7C 66 66 7C 66 66  f.|ff|ff
        .byte   $7C,$00,$3C,$66,$60,$60,$60,$66 ; 9F17 7C 00 3C 66 60 60 60 66  |.<f```f
        .byte   $3C,$00,$7C,$66,$66,$66,$66,$66 ; 9F1F 3C 00 7C 66 66 66 66 66  <.|fffff
        .byte   $7C,$00,$7E,$60,$60,$78,$60,$60 ; 9F27 7C 00 7E 60 60 78 60 60  |.~``x``
        .byte   $7E,$00,$7E,$60,$60,$78,$60,$60 ; 9F2F 7E 00 7E 60 60 78 60 60  ~.~``x``
        .byte   $60,$00,$3C,$66,$60,$60,$6E,$66 ; 9F37 60 00 3C 66 60 60 6E 66  `.<f``nf
        .byte   $3C,$00,$66,$66,$66,$7E,$66,$66 ; 9F3F 3C 00 66 66 66 7E 66 66  <.fff~ff
        .byte   $66,$00,$3C,$18,$18,$18,$18,$18 ; 9F47 66 00 3C 18 18 18 18 18  f.<.....
        .byte   $3C,$00,$06,$06,$06,$06,$66,$66 ; 9F4F 3C 00 06 06 06 06 66 66  <.....ff
        .byte   $3C,$00,$66,$6C,$78,$70,$78,$6C ; 9F57 3C 00 66 6C 78 70 78 6C  <.flxpxl
        .byte   $66,$00,$60,$60,$60,$60,$60,$60 ; 9F5F 66 00 60 60 60 60 60 60  f.``````
        .byte   $7E,$00,$63,$77,$7F,$6B,$63,$63 ; 9F67 7E 00 63 77 7F 6B 63 63  ~.cw.kcc
        .byte   $63,$00,$66,$66,$76,$7E,$6E,$66 ; 9F6F 63 00 66 66 76 7E 6E 66  c.ffv~nf
        .byte   $66,$00,$3C,$66,$66,$66,$66,$66 ; 9F77 66 00 3C 66 66 66 66 66  f.<fffff
        .byte   $3C,$00,$7C,$66,$66,$7C,$60,$60 ; 9F7F 3C 00 7C 66 66 7C 60 60  <.|ff|``
        .byte   $60,$00,$3C,$66,$66,$66,$66,$6C ; 9F87 60 00 3C 66 66 66 66 6C  `.<ffffl
        .byte   $36,$00,$7C,$66,$66,$7C,$6C,$66 ; 9F8F 36 00 7C 66 66 7C 6C 66  6.|ff|lf
        .byte   $66,$00,$3C,$66,$60,$3C,$06,$66 ; 9F97 66 00 3C 66 60 3C 06 66  f.<f`<.f
        .byte   $3C,$00,$7E,$18,$18,$18,$18,$18 ; 9F9F 3C 00 7E 18 18 18 18 18  <.~.....
        .byte   $18,$00,$66,$66,$66,$66,$66,$66 ; 9FA7 18 00 66 66 66 66 66 66  ..ffffff
        .byte   $3C,$00,$66,$66,$66,$66,$66,$3C ; 9FAF 3C 00 66 66 66 66 66 3C  <.fffff<
        .byte   $18,$00,$63,$63,$63,$6B,$7F,$77 ; 9FB7 18 00 63 63 63 6B 7F 77  ..ccck.w
        .byte   $63,$00,$66,$66,$3C,$3C,$3C,$66 ; 9FBF 63 00 66 66 3C 3C 3C 66  c.ff<<<f
        .byte   $66,$00,$66,$66,$66,$3C,$18,$18 ; 9FC7 66 00 66 66 66 3C 18 18  f.fff<..
        .byte   $18,$00,$7E,$06,$0C,$18,$30,$60 ; 9FCF 18 00 7E 06 0C 18 30 60  ..~...0`
        .byte   $7E,$00,$00,$00,$00,$00,$00,$00 ; 9FD7 7E 00 00 00 00 00 00 00  ~.......
        .byte   $00,$00,$00,$00,$00,$00,$00,$00 ; 9FDF 00 00 00 00 00 00 00 00  ........
        .byte   $00,$00,$00,$00,$00,$00,$00,$00 ; 9FE7 00 00 00 00 00 00 00 00  ........
        .byte   $00,$00,$00,$00,$00,$00,$00,$00 ; 9FEF 00 00 00 00 00 00 00 00  ........
        .byte   $00,$00,$00                     ; 9FF7 00 00 00                 ...
; ----------------------------------------------------------------------------
; main entry point, note cartstart_left and cartstart_right point to the same address
cartstart_right:
        .addr   cart_entry_point                ; 9FFA C0 8A                    ..
; ----------------------------------------------------------------------------
; 0 here means 'cartridge present'
cartpresent_right:
        .byte   $00                             ; 9FFC 00                       .
; 4 here means init & start the cart, no disk boot, non-diagnostic
cartoptions_right:
        .byte   $04                             ; 9FFD 04                       .
; ----------------------------------------------------------------------------
; points to a CLC/RTS do-nothing routine (same as cartinit_left)
cartinit_right:
        .addr   cart_start_stub                 ; 9FFE FE 8A                    ..
; ----------------------------------------------------------------------------
; 64-byte level descriptors, 12 of them (1 per level). Descriptor for Nothing To It. first 2 bytes are level number in screencodes
level01_desc:
        .byte   $10,$11                         ; A000 10 11                    ..
; ----------------------------------------------------------------------------
; a subroutine
level01_sub0:
        .addr   L0000                           ; A002 00 00                    ..
; a subroutine
level01_sub1:
        .addr   L0000                           ; A004 00 00                    ..
; a subroutine
level01_sub2:
        .addr   L0000                           ; A006 00 00                    ..
; a subroutine
level01_sub3:
        .addr   check_pl_coll                   ; A008 73 8F                    s.
; ----------------------------------------------------------------------------
; number of bombs to pick up on this level
level01_num_bombs:
        .byte   $0C                             ; A00A 0C                       .
; 0 = no bullets, range 0-4.
level01_bullet_max:
        .byte   $01                             ; A00B 01                       .
; jumpman starting Y position
level01_y_start:
        .byte   $A0                             ; A00C A0                       .
; jumpman starting X position
level01_x_start:
        .byte   $7C                             ; A00D 7C                       |
; fudge factor for bomb locations, always $00
level01_fudge_x:
        .byte   $00                             ; A00E 00                       .
; fudge factor for bomb locations, always $06
level01_fudge_y:
        .byte   $06                             ; A00F 06                       .
; points awarded per bomb pickup (always $64 aka 100)
level01_points_per_bomb:
        .byte   $64                             ; A010 64                       d
; ----------------------------------------------------------------------------
; amount of time bonus at start of level
level01_time_bonus:
        .word   $03E8                           ; A011 E8 03                    ..
; ----------------------------------------------------------------------------
; always $00
level01_offs_19:
        .byte   $00                             ; A013 00                       .
; ----------------------------------------------------------------------------
; pointer to ROM table or $06xx
level01_unkn_table0:
        .addr   L06DF                           ; A014 DF 06                    ..
; used to draw the level initially (see also map_changes)
level01_map:
        .addr   l01_map                         ; A016 00 A3                    ..
; start of bombs in map data (which must come last!)
level01_map_bombs:
        .addr   l01_map_bombs                   ; A018 66 A3                    f.
; 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.
level01_bomblist:
        .addr   l01_bombs                       ; A01A 8B A3                    ..
; address of list of addresses of map data, used for changing the map when certain bombs are picked up
level01_map_changes:
        .addr   l01_map_changes                 ; A01C A4 A3                    ..
; ----------------------------------------------------------------------------
; pointer to list of indirect subs, always $0000 in this game
level01_indirect_subs:
        .byte   $00,$00                         ; A01E 00 00                    ..
; ----------------------------------------------------------------------------
; called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine
level01_sub_bomb:
        .addr   L06E6                           ; A020 E6 06                    ..
; called at start of level, $06E6 for some levels, or else a ROM subroutine
level01_init:
        .addr   L06E6                           ; A022 E6 06                    ..
; always $9740 aka game_main_loop
level01_sub6:
        .addr   game_main_loop                  ; A024 40 97                    @.
; called at end of level (all bombs picked up). $06E6 for all but level08
level01_sub_eol:
        .addr   L06E6                           ; A026 E6 06                    ..
; ----------------------------------------------------------------------------
; all zeroes
level01_offs_40:
        .byte   $00,$00,$00,$00,$00,$00         ; A028 00 00 00 00 00 00        ......
; color for missiles (aka 5th player)
level01_colpf3:
        .byte   $CA                             ; A02E CA                       .
; color for girders and up-ropes
level01_colpf0:
        .byte   $96                             ; A02F 96                       .
; color for ladders and down-ropes
level01_colpf1:
        .byte   $18                             ; A030 18                       .
; color for bombs
level01_colpf2:
        .byte   $5A                             ; A031 5A                       Z
; unknown
level01_offs_50:
        .byte   $0C,$24,$4C,$74,$8C             ; A032 0C 24 4C 74 8C           .$Lt.
; unknown, always $00 $00 $00
level01_offs_55:
        .byte   $00,$00,$00                     ; A037 00 00 00                 ...
; unknown, not a ROM address
level01_offs_58:
        .byte   $1A,$7E                         ; A03A 1A 7E                    .~
; unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00
level01_offs_60:
        .byte   $00,$00,$00,$00                 ; A03C 00 00 00 00              ....
; Descriptor for Electrocution. first 2 bytes are level number in screencodes
level02_desc:
        .byte   $10,$12                         ; A040 10 12                    ..
; ----------------------------------------------------------------------------
; a subroutine
level02_sub0:
        .addr   electrocution_done              ; A042 DD A4                    ..
; a subroutine
level02_sub1:
        .addr   electrocute                     ; A044 09 A5                    ..
; a subroutine
level02_sub2:
        .addr   L0000                           ; A046 00 00                    ..
; a subroutine
level02_sub3:
        .addr   level03_collisions              ; A048 3D A5                    =.
; ----------------------------------------------------------------------------
; number of bombs to pick up on this level
level02_num_bombs:
        .byte   $10                             ; A04A 10                       .
; 0 = no bullets, range 0-4.
level02_bullet_max:
        .byte   $02                             ; A04B 02                       .
; jumpman starting Y position
level02_y_start:
        .byte   $20                             ; A04C 20                        
; jumpman starting X position
level02_x_start:
        .byte   $7C                             ; A04D 7C                       |
; fudge factor for bomb locations, always $00
level02_fudge_x:
        .byte   $00                             ; A04E 00                       .
; fudge factor for bomb locations, always $06
level02_fudge_y:
        .byte   $06                             ; A04F 06                       .
; points awarded per bomb pickup (always $64 aka 100)
level02_points_per_bomb:
        .byte   $64                             ; A050 64                       d
; ----------------------------------------------------------------------------
; amount of time bonus at start of level
level02_time_bonus:
        .word   $07D0                           ; A051 D0 07                    ..
; ----------------------------------------------------------------------------
; always $00
level02_offs_19:
        .byte   $00                             ; A053 00                       .
; ----------------------------------------------------------------------------
; pointer to ROM table or $06xx
level02_unkn_table0:
        .addr   LA5C2                           ; A054 C2 A5                    ..
; used to draw the level initially (see also map_changes)
level02_map:
        .addr   l02_map                         ; A056 E0 A3                    ..
; start of bombs in map data (which must come last!)
level02_map_bombs:
        .addr   l02_map_bombs                   ; A058 46 A4                    F.
; 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.
level02_bomblist:
        .addr   l02_bombs                       ; A05A 77 A4                    w.
; address of list of addresses of map data, used for changing the map when certain bombs are picked up
level02_map_changes:
        .addr   L0000                           ; A05C 00 00                    ..
; ----------------------------------------------------------------------------
; pointer to list of indirect subs, always $0000 in this game
level02_indirect_subs:
        .byte   $00,$00                         ; A05E 00 00                    ..
; ----------------------------------------------------------------------------
; called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine
level02_sub_bomb:
        .addr   electrocution_bomb_pickup       ; A060 98 A4                    ..
; called at start of level, $06E6 for some levels, or else a ROM subroutine
level02_init:
        .addr   special_init_jv                 ; A062 36 80                    6.
; always $9740 aka game_main_loop
level02_sub6:
        .addr   game_main_loop                  ; A064 40 97                    @.
; called at end of level (all bombs picked up). $06E6 for all but level08
level02_sub_eol:
        .addr   L06E6                           ; A066 E6 06                    ..
; ----------------------------------------------------------------------------
; all zeroes
level02_offs_40:
        .byte   $00,$00,$00,$00,$00,$00         ; A068 00 00 00 00 00 00        ......
; color for missiles (aka 5th player)
level02_colpf3:
        .byte   $6A                             ; A06E 6A                       j
; color for girders and up-ropes
level02_colpf0:
        .byte   $08                             ; A06F 08                       .
; color for ladders and down-ropes
level02_colpf1:
        .byte   $C6                             ; A070 C6                       .
; color for bombs
level02_colpf2:
        .byte   $1A                             ; A071 1A                       .
; unknown
level02_offs_50:
        .byte   $18,$4C,$80,$00,$00             ; A072 18 4C 80 00 00           .L...
; unknown, always $00 $00 $00
level02_offs_55:
        .byte   $00,$00,$00                     ; A077 00 00 00                 ...
; unknown, not a ROM address
level02_offs_58:
        .byte   $02,$94                         ; A07A 02 94                    ..
; unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00
level02_offs_60:
        .byte   $00,$00,$00,$00                 ; A07C 00 00 00 00              ....
; Descriptor for Dumbwaiter. first 2 bytes are level number in screencodes
level03_desc:
        .byte   $10,$13                         ; A080 10 13                    ..
; ----------------------------------------------------------------------------
; a subroutine
level03_sub0:
        .addr   dumbwaiter_sub0                 ; A082 BD A6                    ..
; a subroutine
level03_sub1:
        .addr   L0000                           ; A084 00 00                    ..
; a subroutine
level03_sub2:
        .addr   L0000                           ; A086 00 00                    ..
; a subroutine
level03_sub3:
        .addr   dumbwaiter_sub3                 ; A088 24 A7                    $.
; ----------------------------------------------------------------------------
; number of bombs to pick up on this level
level03_num_bombs:
        .byte   $0C                             ; A08A 0C                       .
; 0 = no bullets, range 0-4.
level03_bullet_max:
        .byte   $00                             ; A08B 00                       .
; jumpman starting Y position
level03_y_start:
        .byte   $40                             ; A08C 40                       @
; jumpman starting X position
level03_x_start:
        .byte   $B4                             ; A08D B4                       .
; fudge factor for bomb locations, always $00
level03_fudge_x:
        .byte   $00                             ; A08E 00                       .
; fudge factor for bomb locations, always $06
level03_fudge_y:
        .byte   $06                             ; A08F 06                       .
; points awarded per bomb pickup (always $64 aka 100)
level03_points_per_bomb:
        .byte   $64                             ; A090 64                       d
; ----------------------------------------------------------------------------
; amount of time bonus at start of level
level03_time_bonus:
        .word   $09C4                           ; A091 C4 09                    ..
; ----------------------------------------------------------------------------
; always $00
level03_offs_19:
        .byte   $00                             ; A093 00                       .
; ----------------------------------------------------------------------------
; pointer to ROM table or $06xx
level03_unkn_table0:
        .addr   l03_unkn                        ; A094 6D A6                    m.
; used to draw the level initially (see also map_changes)
level03_map:
        .addr   l03_map                         ; A096 F0 A5                    ..
; start of bombs in map data (which must come last!)
level03_map_bombs:
        .addr   l03_map_bombs                   ; A098 2F A6                    /.
; 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.
level03_bomblist:
        .addr   l03_bombs                       ; A09A 54 A6                    T.
; address of list of addresses of map data, used for changing the map when certain bombs are picked up
level03_map_changes:
        .addr   L0000                           ; A09C 00 00                    ..
; ----------------------------------------------------------------------------
; pointer to list of indirect subs, always $0000 in this game
level03_indirect_subs:
        .byte   $00,$00                         ; A09E 00 00                    ..
; ----------------------------------------------------------------------------
; called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine
level03_sub_bomb:
        .addr   L06E6                           ; A0A0 E6 06                    ..
; called at start of level, $06E6 for some levels, or else a ROM subroutine
level03_init:
        .addr   dumbwaiter_setup                ; A0A2 8C A6                    ..
; always $9740 aka game_main_loop
level03_sub6:
        .addr   game_main_loop                  ; A0A4 40 97                    @.
; called at end of level (all bombs picked up). $06E6 for all but level08
level03_sub_eol:
        .addr   L06E6                           ; A0A6 E6 06                    ..
; ----------------------------------------------------------------------------
; all zeroes
level03_offs_40:
        .byte   $00,$00,$00,$00,$00,$00         ; A0A8 00 00 00 00 00 00        ......
; color for missiles (aka 5th player)
level03_colpf3:
        .byte   $1A                             ; A0AE 1A                       .
; color for girders and up-ropes
level03_colpf0:
        .byte   $C6                             ; A0AF C6                       .
; color for ladders and down-ropes
level03_colpf1:
        .byte   $96                             ; A0B0 96                       .
; color for bombs
level03_colpf2:
        .byte   $1A                             ; A0B1 1A                       .
; unknown
level03_offs_50:
        .byte   $0C,$8C,$00,$00,$00             ; A0B2 0C 8C 00 00 00           .....
; unknown, always $00 $00 $00
level03_offs_55:
        .byte   $00,$00,$00                     ; A0B7 00 00 00                 ...
; unknown, not a ROM address
level03_offs_58:
        .byte   $00,$00                         ; A0BA 00 00                    ..
; unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00
level03_offs_60:
        .byte   $00,$00,$00,$00                 ; A0BC 00 00 00 00              ....
; Descriptor for Hellstones. first 2 bytes are level number in screencodes
level04_desc:
        .byte   $10,$14                         ; A0C0 10 14                    ..
; ----------------------------------------------------------------------------
; a subroutine
level04_sub0:
        .addr   hellstones_sub0                 ; A0C2 36 A8                    6.
; a subroutine
level04_sub1:
        .addr   L0000                           ; A0C4 00 00                    ..
; a subroutine
level04_sub2:
        .addr   L0000                           ; A0C6 00 00                    ..
; a subroutine
level04_sub3:
        .addr   hellstones_sub3                 ; A0C8 27 A8                    '.
; ----------------------------------------------------------------------------
; number of bombs to pick up on this level
level04_num_bombs:
        .byte   $10                             ; A0CA 10                       .
; 0 = no bullets, range 0-4.
level04_bullet_max:
        .byte   $00                             ; A0CB 00                       .
; jumpman starting Y position
level04_y_start:
        .byte   $C0                             ; A0CC C0                       .
; jumpman starting X position
level04_x_start:
        .byte   $7C                             ; A0CD 7C                       |
; fudge factor for bomb locations, always $00
level04_fudge_x:
        .byte   $00                             ; A0CE 00                       .
; fudge factor for bomb locations, always $06
level04_fudge_y:
        .byte   $06                             ; A0CF 06                       .
; points awarded per bomb pickup (always $64 aka 100)
level04_points_per_bomb:
        .byte   $64                             ; A0D0 64                       d
; ----------------------------------------------------------------------------
; amount of time bonus at start of level
level04_time_bonus:
        .word   $07D0                           ; A0D1 D0 07                    ..
; ----------------------------------------------------------------------------
; always $00
level04_offs_19:
        .byte   $00                             ; A0D3 00                       .
; ----------------------------------------------------------------------------
; pointer to ROM table or $06xx
level04_unkn_table0:
        .addr   L06DF                           ; A0D4 DF 06                    ..
; used to draw the level initially (see also map_changes)
level04_map:
        .addr   l04_map                         ; A0D6 90 A7                    ..
; start of bombs in map data (which must come last!)
level04_map_bombs:
        .addr   l04_map_bombs                   ; A0D8 D5 A7                    ..
; 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.
level04_bomblist:
        .addr   l04_bombs                       ; A0DA 06 A8                    ..
; address of list of addresses of map data, used for changing the map when certain bombs are picked up
level04_map_changes:
        .addr   L0000                           ; A0DC 00 00                    ..
; ----------------------------------------------------------------------------
; pointer to list of indirect subs, always $0000 in this game
level04_indirect_subs:
        .byte   $00,$00                         ; A0DE 00 00                    ..
; ----------------------------------------------------------------------------
; called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine
level04_sub_bomb:
        .addr   L06E6                           ; A0E0 E6 06                    ..
; called at start of level, $06E6 for some levels, or else a ROM subroutine
level04_init:
        .addr   special_init_jv                 ; A0E2 36 80                    6.
; always $9740 aka game_main_loop
level04_sub6:
        .addr   game_main_loop                  ; A0E4 40 97                    @.
; called at end of level (all bombs picked up). $06E6 for all but level08
level04_sub_eol:
        .addr   L06E6                           ; A0E6 E6 06                    ..
; ----------------------------------------------------------------------------
; all zeroes
level04_offs_40:
        .byte   $00,$00,$00,$00,$00,$00         ; A0E8 00 00 00 00 00 00        ......
; color for missiles (aka 5th player)
level04_colpf3:
        .byte   $CA                             ; A0EE CA                       .
; color for girders and up-ropes
level04_colpf0:
        .byte   $96                             ; A0EF 96                       .
; color for ladders and down-ropes
level04_colpf1:
        .byte   $18                             ; A0F0 18                       .
; color for bombs
level04_colpf2:
        .byte   $5A                             ; A0F1 5A                       Z
; unknown
level04_offs_50:
        .byte   $4C,$18,$2C,$80,$6C             ; A0F2 4C 18 2C 80 6C           L.,.l
; unknown, always $00 $00 $00
level04_offs_55:
        .byte   $00,$00,$00                     ; A0F7 00 00 00                 ...
; unknown, not a ROM address
level04_offs_58:
        .byte   $00,$00                         ; A0FA 00 00                    ..
; unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00
level04_offs_60:
        .byte   $00,$00,$00,$00                 ; A0FC 00 00 00 00              ....
; Descriptor for Figurits Revenge. first 2 bytes are level number in screencodes
level05_desc:
        .byte   $10,$15                         ; A100 10 15                    ..
; ----------------------------------------------------------------------------
; a subroutine
level05_sub0:
        .addr   L0000                           ; A102 00 00                    ..
; a subroutine
level05_sub1:
        .addr   L0000                           ; A104 00 00                    ..
; a subroutine
level05_sub2:
        .addr   L0000                           ; A106 00 00                    ..
; a subroutine
level05_sub3:
        .addr   check_pl_coll                   ; A108 73 8F                    s.
; ----------------------------------------------------------------------------
; number of bombs to pick up on this level
level05_num_bombs:
        .byte   $0E                             ; A10A 0E                       .
; 0 = no bullets, range 0-4.
level05_bullet_max:
        .byte   $02                             ; A10B 02                       .
; jumpman starting Y position
level05_y_start:
        .byte   $C0                             ; A10C C0                       .
; jumpman starting X position
level05_x_start:
        .byte   $34                             ; A10D 34                       4
; fudge factor for bomb locations, always $00
level05_fudge_x:
        .byte   $00                             ; A10E 00                       .
; fudge factor for bomb locations, always $06
level05_fudge_y:
        .byte   $06                             ; A10F 06                       .
; points awarded per bomb pickup (always $64 aka 100)
level05_points_per_bomb:
        .byte   $64                             ; A110 64                       d
; ----------------------------------------------------------------------------
; amount of time bonus at start of level
level05_time_bonus:
        .word   $07D0                           ; A111 D0 07                    ..
; ----------------------------------------------------------------------------
; always $00
level05_offs_19:
        .byte   $00                             ; A113 00                       .
; ----------------------------------------------------------------------------
; pointer to ROM table or $06xx
level05_unkn_table0:
        .addr   L06DF                           ; A114 DF 06                    ..
; used to draw the level initially (see also map_changes)
level05_map:
        .addr   l05_map                         ; A116 D0 AA                    ..
; start of bombs in map data (which must come last!)
level05_map_bombs:
        .addr   l05_map_bombs                   ; A118 42 AB                    B.
; 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.
level05_bomblist:
        .addr   l05_bombs                       ; A11A 6D AB                    m.
; address of list of addresses of map data, used for changing the map when certain bombs are picked up
level05_map_changes:
        .addr   l05_map_changes                 ; A11C 8A AB                    ..
; ----------------------------------------------------------------------------
; pointer to list of indirect subs, always $0000 in this game
level05_indirect_subs:
        .byte   $00,$00                         ; A11E 00 00                    ..
; ----------------------------------------------------------------------------
; called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine
level05_sub_bomb:
        .addr   L06E6                           ; A120 E6 06                    ..
; called at start of level, $06E6 for some levels, or else a ROM subroutine
level05_init:
        .addr   L06E6                           ; A122 E6 06                    ..
; always $9740 aka game_main_loop
level05_sub6:
        .addr   game_main_loop                  ; A124 40 97                    @.
; called at end of level (all bombs picked up). $06E6 for all but level08
level05_sub_eol:
        .addr   L06E6                           ; A126 E6 06                    ..
; ----------------------------------------------------------------------------
; all zeroes
level05_offs_40:
        .byte   $00,$00,$00,$00,$00,$00         ; A128 00 00 00 00 00 00        ......
; color for missiles (aka 5th player)
level05_colpf3:
        .byte   $6A                             ; A12E 6A                       j
; color for girders and up-ropes
level05_colpf0:
        .byte   $08                             ; A12F 08                       .
; color for ladders and down-ropes
level05_colpf1:
        .byte   $C6                             ; A130 C6                       .
; color for bombs
level05_colpf2:
        .byte   $1A                             ; A131 1A                       .
; unknown
level05_offs_50:
        .byte   $0C,$22,$84,$8E,$00             ; A132 0C 22 84 8E 00           ."...
; unknown, always $00 $00 $00
level05_offs_55:
        .byte   $00,$00,$00                     ; A137 00 00 00                 ...
; unknown, not a ROM address
level05_offs_58:
        .byte   $96,$00                         ; A13A 96 00                    ..
; unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00
level05_offs_60:
        .byte   $00,$00,$00,$00                 ; A13C 00 00 00 00              ....
; Descriptor for Walls. first 2 bytes are level number in screencodes
level06_desc:
        .byte   $10,$16                         ; A140 10 16                    ..
; ----------------------------------------------------------------------------
; a subroutine
level06_sub0:
        .addr   walls_sub0                      ; A142 3A AA                    :.
; a subroutine
level06_sub1:
        .addr   walls_sub1                      ; A144 35 AA                    5.
; a subroutine
level06_sub2:
        .addr   walls_sub2                      ; A146 55 AA                    U.
; a subroutine
level06_sub3:
        .addr   walls_sub3                      ; A148 BC AA                    ..
; ----------------------------------------------------------------------------
; number of bombs to pick up on this level
level06_num_bombs:
        .byte   $10                             ; A14A 10                       .
; 0 = no bullets, range 0-4.
level06_bullet_max:
        .byte   $00                             ; A14B 00                       .
; jumpman starting Y position
level06_y_start:
        .byte   $80                             ; A14C 80                       .
; jumpman starting X position
level06_x_start:
        .byte   $34                             ; A14D 34                       4
; fudge factor for bomb locations, always $00
level06_fudge_x:
        .byte   $00                             ; A14E 00                       .
; fudge factor for bomb locations, always $06
level06_fudge_y:
        .byte   $06                             ; A14F 06                       .
; points awarded per bomb pickup (always $64 aka 100)
level06_points_per_bomb:
        .byte   $64                             ; A150 64                       d
; ----------------------------------------------------------------------------
; amount of time bonus at start of level
level06_time_bonus:
        .word   $05DC                           ; A151 DC 05                    ..
; ----------------------------------------------------------------------------
; always $00
level06_offs_19:
        .byte   $00                             ; A153 00                       .
; ----------------------------------------------------------------------------
; pointer to ROM table or $06xx
level06_unkn_table0:
        .addr   L06DF                           ; A154 DF 06                    ..
; used to draw the level initially (see also map_changes)
level06_map:
        .addr   l06_map                         ; A156 20 A9                     .
; start of bombs in map data (which must come last!)
level06_map_bombs:
        .addr   l06_map_bombs                   ; A158 74 A9                    t.
; 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.
level06_bomblist:
        .addr   l06_bombs                       ; A15A A5 A9                    ..
; address of list of addresses of map data, used for changing the map when certain bombs are picked up
level06_map_changes:
        .addr   L0000                           ; A15C 00 00                    ..
; ----------------------------------------------------------------------------
; pointer to list of indirect subs, always $0000 in this game
level06_indirect_subs:
        .byte   $00,$00                         ; A15E 00 00                    ..
; ----------------------------------------------------------------------------
; called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine
level06_sub_bomb:
        .addr   walls_bomb_sub                  ; A160 73 AA                    s.
; called at start of level, $06E6 for some levels, or else a ROM subroutine
level06_init:
        .addr   walls_init                      ; A162 C6 A9                    ..
; always $9740 aka game_main_loop
level06_sub6:
        .addr   game_main_loop                  ; A164 40 97                    @.
; called at end of level (all bombs picked up). $06E6 for all but level08
level06_sub_eol:
        .addr   L06E6                           ; A166 E6 06                    ..
; ----------------------------------------------------------------------------
; all zeroes
level06_offs_40:
        .byte   $00,$00,$00,$00,$00,$00         ; A168 00 00 00 00 00 00        ......
; color for missiles (aka 5th player)
level06_colpf3:
        .byte   $56                             ; A16E 56                       V
; color for girders and up-ropes
level06_colpf0:
        .byte   $C6                             ; A16F C6                       .
; color for ladders and down-ropes
level06_colpf1:
        .byte   $96                             ; A170 96                       .
; color for bombs
level06_colpf2:
        .byte   $28                             ; A171 28                       (
; unknown
level06_offs_50:
        .byte   $04,$30,$68,$94,$00             ; A172 04 30 68 94 00           .0h..
; unknown, always $00 $00 $00
level06_offs_55:
        .byte   $00,$00,$00                     ; A177 00 00 00                 ...
; unknown, not a ROM address
level06_offs_58:
        .byte   $4C,$FF                         ; A17A 4C FF                    L.
; unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00
level06_offs_60:
        .byte   $FF,$FF,$FF,$FF                 ; A17C FF FF FF FF              ....
; Descriptor for Zig-Zag. first 2 bytes are level number in screencodes
level07_desc:
        .byte   $10,$17                         ; A180 10 17                    ..
; ----------------------------------------------------------------------------
; a subroutine
level07_sub0:
        .addr   zigzag_sub0                     ; A182 68 AD                    h.
; a subroutine
level07_sub1:
        .addr   L0000                           ; A184 00 00                    ..
; a subroutine
level07_sub2:
        .addr   L0000                           ; A186 00 00                    ..
; a subroutine
level07_sub3:
        .addr   check_pl_coll                   ; A188 73 8F                    s.
; ----------------------------------------------------------------------------
; number of bombs to pick up on this level
level07_num_bombs:
        .byte   $0E                             ; A18A 0E                       .
; 0 = no bullets, range 0-4.
level07_bullet_max:
        .byte   $03                             ; A18B 03                       .
; jumpman starting Y position
level07_y_start:
        .byte   $C0                             ; A18C C0                       .
; jumpman starting X position
level07_x_start:
        .byte   $7C                             ; A18D 7C                       |
; fudge factor for bomb locations, always $00
level07_fudge_x:
        .byte   $00                             ; A18E 00                       .
; fudge factor for bomb locations, always $06
level07_fudge_y:
        .byte   $06                             ; A18F 06                       .
; points awarded per bomb pickup (always $64 aka 100)
level07_points_per_bomb:
        .byte   $64                             ; A190 64                       d
; ----------------------------------------------------------------------------
; amount of time bonus at start of level
level07_time_bonus:
        .word   $05DC                           ; A191 DC 05                    ..
; ----------------------------------------------------------------------------
; always $00
level07_offs_19:
        .byte   $00                             ; A193 00                       .
; ----------------------------------------------------------------------------
; pointer to ROM table or $06xx
level07_unkn_table0:
        .addr   L06DF                           ; A194 DF 06                    ..
; used to draw the level initially (see also map_changes)
level07_map:
        .addr   l07_map                         ; A196 60 AC                    `.
; start of bombs in map data (which must come last!)
level07_map_bombs:
        .addr   l07_map_bombs                   ; A198 BA AC                    ..
; 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.
level07_bomblist:
        .addr   l07_bombs                       ; A19A E5 AC                    ..
; address of list of addresses of map data, used for changing the map when certain bombs are picked up
level07_map_changes:
        .addr   l07_map_changes                 ; A19C 02 AD                    ..
; ----------------------------------------------------------------------------
; pointer to list of indirect subs, always $0000 in this game
level07_indirect_subs:
        .byte   $00,$00                         ; A19E 00 00                    ..
; ----------------------------------------------------------------------------
; called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine
level07_sub_bomb:
        .addr   L06E6                           ; A1A0 E6 06                    ..
; called at start of level, $06E6 for some levels, or else a ROM subroutine
level07_init:
        .addr   special_init_jv                 ; A1A2 36 80                    6.
; always $9740 aka game_main_loop
level07_sub6:
        .addr   game_main_loop                  ; A1A4 40 97                    @.
; called at end of level (all bombs picked up). $06E6 for all but level08
level07_sub_eol:
        .addr   L06E6                           ; A1A6 E6 06                    ..
; ----------------------------------------------------------------------------
; all zeroes
level07_offs_40:
        .byte   $00,$00,$00,$00,$00,$00         ; A1A8 00 00 00 00 00 00        ......
; color for missiles (aka 5th player)
level07_colpf3:
        .byte   $CA                             ; A1AE CA                       .
; color for girders and up-ropes
level07_colpf0:
        .byte   $96                             ; A1AF 96                       .
; color for ladders and down-ropes
level07_colpf1:
        .byte   $18                             ; A1B0 18                       .
; color for bombs
level07_colpf2:
        .byte   $5A                             ; A1B1 5A                       Z
; unknown
level07_offs_50:
        .byte   $0C,$4C,$8C,$00,$00             ; A1B2 0C 4C 8C 00 00           .L...
; unknown, always $00 $00 $00
level07_offs_55:
        .byte   $00,$00,$00                     ; A1B7 00 00 00                 ...
; unknown, not a ROM address
level07_offs_58:
        .byte   $1C,$7E                         ; A1BA 1C 7E                    .~
; unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00
level07_offs_60:
        .byte   $00,$00,$00,$00                 ; A1BC 00 00 00 00              ....
; Descriptor for Spellbound. first 2 bytes are level number in screencodes
level08_desc:
        .byte   $10,$18                         ; A1C0 10 18                    ..
; ----------------------------------------------------------------------------
; a subroutine
level08_sub0:
        .addr   LAF1C                           ; A1C2 1C AF                    ..
; a subroutine
level08_sub1:
        .addr   L0000                           ; A1C4 00 00                    ..
; a subroutine
level08_sub2:
        .addr   L0000                           ; A1C6 00 00                    ..
; a subroutine
level08_sub3:
        .addr   check_pl_coll                   ; A1C8 73 8F                    s.
; ----------------------------------------------------------------------------
; number of bombs to pick up on this level
level08_num_bombs:
        .byte   $0C                             ; A1CA 0C                       .
; 0 = no bullets, range 0-4.
level08_bullet_max:
        .byte   $02                             ; A1CB 02                       .
; jumpman starting Y position
level08_y_start:
        .byte   $20                             ; A1CC 20                        
; jumpman starting X position
level08_x_start:
        .byte   $7C                             ; A1CD 7C                       |
; fudge factor for bomb locations, always $00
level08_fudge_x:
        .byte   $00                             ; A1CE 00                       .
; fudge factor for bomb locations, always $06
level08_fudge_y:
        .byte   $06                             ; A1CF 06                       .
; points awarded per bomb pickup (always $64 aka 100)
level08_points_per_bomb:
        .byte   $64                             ; A1D0 64                       d
; ----------------------------------------------------------------------------
; amount of time bonus at start of level
level08_time_bonus:
        .word   $05DC                           ; A1D1 DC 05                    ..
; ----------------------------------------------------------------------------
; always $00
level08_offs_19:
        .byte   $00                             ; A1D3 00                       .
; ----------------------------------------------------------------------------
; pointer to ROM table or $06xx
level08_unkn_table0:
        .addr   l08_unkn0                       ; A1D4 8A AE                    ..
; used to draw the level initially (see also map_changes)
level08_map:
        .addr   l08_map                         ; A1D6 E0 AD                    ..
; start of bombs in map data (which must come last!)
level08_map_bombs:
        .addr   l08_map_bombs                   ; A1D8 4C AE                    L.
; 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.
level08_bomblist:
        .addr   l08_bombs                       ; A1DA 71 AE                    q.
; address of list of addresses of map data, used for changing the map when certain bombs are picked up
level08_map_changes:
        .addr   L0000                           ; A1DC 00 00                    ..
; ----------------------------------------------------------------------------
; pointer to list of indirect subs, always $0000 in this game
level08_indirect_subs:
        .byte   $00,$00                         ; A1DE 00 00                    ..
; ----------------------------------------------------------------------------
; called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine
level08_sub_bomb:
        .addr   spellbound_bomb_sub             ; A1E0 23 AF                    #.
; called at start of level, $06E6 for some levels, or else a ROM subroutine
level08_init:
        .addr   spellbound_init                 ; A1E2 9B AE                    ..
; always $9740 aka game_main_loop
level08_sub6:
        .addr   game_main_loop                  ; A1E4 40 97                    @.
; called at end of level (all bombs picked up). $06E6 for all but level08
level08_sub_eol:
        .addr   spellbound_letters              ; A1E6 58 AF                    X.
; ----------------------------------------------------------------------------
; all zeroes
level08_offs_40:
        .byte   $00,$00,$00,$00,$00,$00         ; A1E8 00 00 00 00 00 00        ......
; color for missiles (aka 5th player)
level08_colpf3:
        .byte   $6A                             ; A1EE 6A                       j
; color for girders and up-ropes
level08_colpf0:
        .byte   $08                             ; A1EF 08                       .
; color for ladders and down-ropes
level08_colpf1:
        .byte   $C6                             ; A1F0 C6                       .
; color for bombs
level08_colpf2:
        .byte   $1A                             ; A1F1 1A                       .
; unknown
level08_offs_50:
        .byte   $0C,$30,$68,$8C,$00             ; A1F2 0C 30 68 8C 00           .0h..
; unknown, always $00 $00 $00
level08_offs_55:
        .byte   $00,$00,$00                     ; A1F7 00 00 00                 ...
; unknown, not a ROM address
level08_offs_58:
        .byte   $40,$56                         ; A1FA 40 56                    @V
; unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00
level08_offs_60:
        .byte   $00,$00,$00,$00                 ; A1FC 00 00 00 00              ....
; Descriptor for Blackout. first 2 bytes are level number in screencodes
level09_desc:
        .byte   $10,$19                         ; A200 10 19                    ..
; ----------------------------------------------------------------------------
; a subroutine
level09_sub0:
        .addr   blackout_sub0                   ; A202 40 B1                    @.
; a subroutine
level09_sub1:
        .addr   L0000                           ; A204 00 00                    ..
; a subroutine
level09_sub2:
        .addr   L0000                           ; A206 00 00                    ..
; a subroutine
level09_sub3:
        .addr   L0000                           ; A208 00 00                    ..
; ----------------------------------------------------------------------------
; number of bombs to pick up on this level
level09_num_bombs:
        .byte   $08                             ; A20A 08                       .
; 0 = no bullets, range 0-4.
level09_bullet_max:
        .byte   $00                             ; A20B 00                       .
; jumpman starting Y position
level09_y_start:
        .byte   $C0                             ; A20C C0                       .
; jumpman starting X position
level09_x_start:
        .byte   $9E                             ; A20D 9E                       .
; fudge factor for bomb locations, always $00
level09_fudge_x:
        .byte   $00                             ; A20E 00                       .
; fudge factor for bomb locations, always $06
level09_fudge_y:
        .byte   $06                             ; A20F 06                       .
; points awarded per bomb pickup (always $64 aka 100)
level09_points_per_bomb:
        .byte   $64                             ; A210 64                       d
; ----------------------------------------------------------------------------
; amount of time bonus at start of level
level09_time_bonus:
        .word   $07D0                           ; A211 D0 07                    ..
; ----------------------------------------------------------------------------
; always $00
level09_offs_19:
        .byte   $00                             ; A213 00                       .
; ----------------------------------------------------------------------------
; pointer to ROM table or $06xx
level09_unkn_table0:
        .addr   L06DF                           ; A214 DF 06                    ..
; used to draw the level initially (see also map_changes)
level09_map:
        .addr   l09_map                         ; A216 A2 B0                    ..
; start of bombs in map data (which must come last!)
level09_map_bombs:
        .addr   l09_map_bombs                   ; A218 72 B0                    r.
; 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.
level09_bomblist:
        .addr   l09_bombs                       ; A21A A3 B0                    ..
; address of list of addresses of map data, used for changing the map when certain bombs are picked up
level09_map_changes:
        .addr   L0000                           ; A21C 00 00                    ..
; ----------------------------------------------------------------------------
; pointer to list of indirect subs, always $0000 in this game
level09_indirect_subs:
        .byte   $00,$00                         ; A21E 00 00                    ..
; ----------------------------------------------------------------------------
; called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine
level09_sub_bomb:
        .addr   blackout_bomb_sub               ; A220 21 B1                    !.
; called at start of level, $06E6 for some levels, or else a ROM subroutine
level09_init:
        .addr   blackout_init                   ; A222 C4 B0                    ..
; always $9740 aka game_main_loop
level09_sub6:
        .addr   game_main_loop                  ; A224 40 97                    @.
; called at end of level (all bombs picked up). $06E6 for all but level08
level09_sub_eol:
        .addr   L06E6                           ; A226 E6 06                    ..
; ----------------------------------------------------------------------------
; all zeroes
level09_offs_40:
        .byte   $00,$00,$00,$00,$00,$00         ; A228 00 00 00 00 00 00        ......
; color for missiles (aka 5th player)
level09_colpf3:
        .byte   $1A                             ; A22E 1A                       .
; color for girders and up-ropes
level09_colpf0:
        .byte   $C6                             ; A22F C6                       .
; color for ladders and down-ropes
level09_colpf1:
        .byte   $96                             ; A230 96                       .
; color for bombs
level09_colpf2:
        .byte   $28                             ; A231 28                       (
; unknown
level09_offs_50:
        .byte   $0C,$3C,$00,$00,$8C             ; A232 0C 3C 00 00 8C           .<...
; unknown, always $00 $00 $00
level09_offs_55:
        .byte   $00,$00,$00                     ; A237 00 00 00                 ...
; unknown, not a ROM address
level09_offs_58:
        .byte   $80,$00                         ; A23A 80 00                    ..
; unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00
level09_offs_60:
        .byte   $00,$00,$00,$00                 ; A23C 00 00 00 00              ....
; Descriptor for HereThereEverywhere. first 2 bytes are level number in screencodes
level10_desc:
        .byte   $11,$10                         ; A240 11 10                    ..
; ----------------------------------------------------------------------------
; a subroutine
level10_sub0:
        .addr   herethere_sub0                  ; A242 7E B2                    ~.
; a subroutine
level10_sub1:
        .addr   L0000                           ; A244 00 00                    ..
; a subroutine
level10_sub2:
        .addr   L0000                           ; A246 00 00                    ..
; a subroutine
level10_sub3:
        .addr   herethere_sub3                  ; A248 E0 B2                    ..
; ----------------------------------------------------------------------------
; number of bombs to pick up on this level
level10_num_bombs:
        .byte   $0C                             ; A24A 0C                       .
; 0 = no bullets, range 0-4.
level10_bullet_max:
        .byte   $02                             ; A24B 02                       .
; jumpman starting Y position
level10_y_start:
        .byte   $C0                             ; A24C C0                       .
; jumpman starting X position
level10_x_start:
        .byte   $3C                             ; A24D 3C                       <
; fudge factor for bomb locations, always $00
level10_fudge_x:
        .byte   $00                             ; A24E 00                       .
; fudge factor for bomb locations, always $06
level10_fudge_y:
        .byte   $06                             ; A24F 06                       .
; points awarded per bomb pickup (always $64 aka 100)
level10_points_per_bomb:
        .byte   $64                             ; A250 64                       d
; ----------------------------------------------------------------------------
; amount of time bonus at start of level
level10_time_bonus:
        .word   $05DC                           ; A251 DC 05                    ..
; ----------------------------------------------------------------------------
; always $00
level10_offs_19:
        .byte   $00                             ; A253 00                       .
; ----------------------------------------------------------------------------
; pointer to ROM table or $06xx
level10_unkn_table0:
        .addr   l10_unkn0                       ; A254 75 B2                    u.
; used to draw the level initially (see also map_changes)
level10_map:
        .addr   l10_map                         ; A256 E0 B1                    ..
; start of bombs in map data (which must come last!)
level10_map_bombs:
        .addr   l10_map_bombs                   ; A258 37 B2                    7.
; 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.
level10_bomblist:
        .addr   l10_bombs                       ; A25A 5C B2                    \.
; address of list of addresses of map data, used for changing the map when certain bombs are picked up
level10_map_changes:
        .addr   L0000                           ; A25C 00 00                    ..
; ----------------------------------------------------------------------------
; pointer to list of indirect subs, always $0000 in this game
level10_indirect_subs:
        .byte   $00,$00                         ; A25E 00 00                    ..
; ----------------------------------------------------------------------------
; called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine
level10_sub_bomb:
        .addr   herethere_bomb_sub              ; A260 FD B2                    ..
; called at start of level, $06E6 for some levels, or else a ROM subroutine
level10_init:
        .addr   special_init_jv                 ; A262 36 80                    6.
; always $9740 aka game_main_loop
level10_sub6:
        .addr   game_main_loop                  ; A264 40 97                    @.
; called at end of level (all bombs picked up). $06E6 for all but level08
level10_sub_eol:
        .addr   L06E6                           ; A266 E6 06                    ..
; ----------------------------------------------------------------------------
; all zeroes
level10_offs_40:
        .byte   $00,$00,$00,$00,$00,$00         ; A268 00 00 00 00 00 00        ......
; color for missiles (aka 5th player)
level10_colpf3:
        .byte   $CA                             ; A26E CA                       .
; color for girders and up-ropes
level10_colpf0:
        .byte   $96                             ; A26F 96                       .
; color for ladders and down-ropes
level10_colpf1:
        .byte   $18                             ; A270 18                       .
; color for bombs
level10_colpf2:
        .byte   $5A                             ; A271 5A                       Z
; unknown
level10_offs_50:
        .byte   $0C,$40,$8C,$00,$00             ; A272 0C 40 8C 00 00           .@...
; unknown, always $00 $00 $00
level10_offs_55:
        .byte   $00,$00,$00                     ; A277 00 00 00                 ...
; unknown, not a ROM address
level10_offs_58:
        .byte   $62,$00                         ; A27A 62 00                    b.
; unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00
level10_offs_60:
        .byte   $00,$00,$00,$00                 ; A27C 00 00 00 00              ....
; Descriptor for Hatchlings. first 2 bytes are level number in screencodes
level11_desc:
        .byte   $11,$11                         ; A280 11 11                    ..
; ----------------------------------------------------------------------------
; a subroutine
level11_sub0:
        .addr   hatch_sub0                      ; A282 57 B4                    W.
; a subroutine
level11_sub1:
        .addr   hatch_sub1                      ; A284 81 B5                    ..
; a subroutine
level11_sub2:
        .addr   L0000                           ; A286 00 00                    ..
; a subroutine
level11_sub3:
        .addr   hatch_sub3                      ; A288 7C B5                    |.
; ----------------------------------------------------------------------------
; number of bombs to pick up on this level
level11_num_bombs:
        .byte   $0F                             ; A28A 0F                       .
; 0 = no bullets, range 0-4.
level11_bullet_max:
        .byte   $00                             ; A28B 00                       .
; jumpman starting Y position
level11_y_start:
        .byte   $B6                             ; A28C B6                       .
; jumpman starting X position
level11_x_start:
        .byte   $C4                             ; A28D C4                       .
; fudge factor for bomb locations, always $00
level11_fudge_x:
        .byte   $00                             ; A28E 00                       .
; fudge factor for bomb locations, always $06
level11_fudge_y:
        .byte   $06                             ; A28F 06                       .
; points awarded per bomb pickup (always $64 aka 100)
level11_points_per_bomb:
        .byte   $64                             ; A290 64                       d
; ----------------------------------------------------------------------------
; amount of time bonus at start of level
level11_time_bonus:
        .word   $03E8                           ; A291 E8 03                    ..
; ----------------------------------------------------------------------------
; always $00
level11_offs_19:
        .byte   $00                             ; A293 00                       .
; ----------------------------------------------------------------------------
; pointer to ROM table or $06xx
level11_unkn_table0:
        .addr   hatch_table_b50b                ; A294 0B B5                    ..
; used to draw the level initially (see also map_changes)
level11_map:
        .addr   l11_map                         ; A296 20 B3                     .
; start of bombs in map data (which must come last!)
level11_map_bombs:
        .addr   l11_map_bombs                   ; A298 8F B3                    ..
; 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.
level11_bomblist:
        .addr   l11_bombs                       ; A29A BD B3                    ..
; address of list of addresses of map data, used for changing the map when certain bombs are picked up
level11_map_changes:
        .addr   l11_map_changes                 ; A29C DC B3                    ..
; ----------------------------------------------------------------------------
; pointer to list of indirect subs, always $0000 in this game
level11_indirect_subs:
        .byte   $00,$00                         ; A29E 00 00                    ..
; ----------------------------------------------------------------------------
; called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine
level11_sub_bomb:
        .addr   hatch_bomb_sub                  ; A2A0 4C B4                    L.
; called at start of level, $06E6 for some levels, or else a ROM subroutine
level11_init:
        .addr   special_init_jv                 ; A2A2 36 80                    6.
; always $9740 aka game_main_loop
level11_sub6:
        .addr   game_main_loop                  ; A2A4 40 97                    @.
; called at end of level (all bombs picked up). $06E6 for all but level08
level11_sub_eol:
        .addr   L06E6                           ; A2A6 E6 06                    ..
; ----------------------------------------------------------------------------
; all zeroes
level11_offs_40:
        .byte   $00,$00,$00,$00,$00,$00         ; A2A8 00 00 00 00 00 00        ......
; color for missiles (aka 5th player)
level11_colpf3:
        .byte   $6A                             ; A2AE 6A                       j
; color for girders and up-ropes
level11_colpf0:
        .byte   $08                             ; A2AF 08                       .
; color for ladders and down-ropes
level11_colpf1:
        .byte   $C6                             ; A2B0 C6                       .
; color for bombs
level11_colpf2:
        .byte   $1A                             ; A2B1 1A                       .
; unknown
level11_offs_50:
        .byte   $0C,$30,$54,$8C,$00             ; A2B2 0C 30 54 8C 00           .0T..
; unknown, always $00 $00 $00
level11_offs_55:
        .byte   $00,$00,$00                     ; A2B7 00 00 00                 ...
; unknown, not a ROM address
level11_offs_58:
        .byte   $00,$66                         ; A2BA 00 66                    .f
; unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00
level11_offs_60:
        .byte   $00,$00,$00,$00                 ; A2BC 00 00 00 00              ....
; Descriptor for Hurricane. first 2 bytes are level number in screencodes
level12_desc:
        .byte   $11,$12                         ; A2C0 11 12                    ..
; ----------------------------------------------------------------------------
; a subroutine
level12_sub0:
        .addr   hurr_sub0                       ; A2C2 91 B6                    ..
; a subroutine
level12_sub1:
        .addr   hurr_sub1                       ; A2C4 9B B6                    ..
; a subroutine
level12_sub2:
        .addr   hurr_sub2                       ; A2C6 09 B7                    ..
; a subroutine
level12_sub3:
        .addr   check_pl_coll                   ; A2C8 73 8F                    s.
; ----------------------------------------------------------------------------
; number of bombs to pick up on this level
level12_num_bombs:
        .byte   $0E                             ; A2CA 0E                       .
; 0 = no bullets, range 0-4.
level12_bullet_max:
        .byte   $00                             ; A2CB 00                       .
; jumpman starting Y position
level12_y_start:
        .byte   $C0                             ; A2CC C0                       .
; jumpman starting X position
level12_x_start:
        .byte   $7C                             ; A2CD 7C                       |
; fudge factor for bomb locations, always $00
level12_fudge_x:
        .byte   $00                             ; A2CE 00                       .
; fudge factor for bomb locations, always $06
level12_fudge_y:
        .byte   $06                             ; A2CF 06                       .
; points awarded per bomb pickup (always $64 aka 100)
level12_points_per_bomb:
        .byte   $64                             ; A2D0 64                       d
; ----------------------------------------------------------------------------
; amount of time bonus at start of level
level12_time_bonus:
        .word   $09C4                           ; A2D1 C4 09                    ..
; ----------------------------------------------------------------------------
; always $00
level12_offs_19:
        .byte   $00                             ; A2D3 00                       .
; ----------------------------------------------------------------------------
; pointer to ROM table or $06xx
level12_unkn_table0:
        .addr   l12_unkn0                       ; A2D4 58 B6                    X.
; used to draw the level initially (see also map_changes)
level12_map:
        .addr   l12_map                         ; A2D6 90 B5                    ..
; start of bombs in map data (which must come last!)
level12_map_bombs:
        .addr   l12_map_bombs                   ; A2D8 D2 B5                    ..
; 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.
level12_bomblist:
        .addr   l12_bombs                       ; A2DA FD B5                    ..
; address of list of addresses of map data, used for changing the map when certain bombs are picked up
level12_map_changes:
        .addr   l12_map_changes                 ; A2DC 1A B6                    ..
; ----------------------------------------------------------------------------
; pointer to list of indirect subs, always $0000 in this game
level12_indirect_subs:
        .byte   $00,$00                         ; A2DE 00 00                    ..
; ----------------------------------------------------------------------------
; called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine
level12_sub_bomb:
        .addr   L06E6                           ; A2E0 E6 06                    ..
; called at start of level, $06E6 for some levels, or else a ROM subroutine
level12_init:
        .addr   special_init_jv                 ; A2E2 36 80                    6.
; always $9740 aka game_main_loop
level12_sub6:
        .addr   game_main_loop                  ; A2E4 40 97                    @.
; called at end of level (all bombs picked up). $06E6 for all but level08
level12_sub_eol:
        .addr   L06E6                           ; A2E6 E6 06                    ..
; ----------------------------------------------------------------------------
; all zeroes
level12_offs_40:
        .byte   $00,$00,$00,$00,$00,$00         ; A2E8 00 00 00 00 00 00        ......
; color for missiles (aka 5th player)
level12_colpf3:
        .byte   $08                             ; A2EE 08                       .
; color for girders and up-ropes
level12_colpf0:
        .byte   $C6                             ; A2EF C6                       .
; color for ladders and down-ropes
level12_colpf1:
        .byte   $96                             ; A2F0 96                       .
; color for bombs
level12_colpf2:
        .byte   $28                             ; A2F1 28                       (
; unknown
level12_offs_50:
        .byte   $0C,$2A,$4C,$6A,$8C             ; A2F2 0C 2A 4C 6A 8C           .*Lj.
; unknown, always $00 $00 $00
level12_offs_55:
        .byte   $00,$00,$00                     ; A2F7 00 00 00                 ...
; unknown, not a ROM address
level12_offs_58:
        .byte   $00,$00                         ; A2FA 00 00                    ..
; unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00
level12_offs_60:
        .byte   $00,$00,$00,$00                 ; A2FC 00 00 00 00              ....
; level map data starts here
l01_map:.byte   $FE,$33,$9C,$FD,$04,$00,$44,$05 ; A300 FE 33 9C FD 04 00 44 05  .3....D.
        .byte   $06,$04,$15,$0A,$74,$15,$0A,$24 ; A308 06 04 15 0A 74 15 0A 24  ....t..$
        .byte   $22,$02,$74,$22,$02,$24,$25,$16 ; A310 22 02 74 22 02 24 25 16  ".t".$%.
        .byte   $04,$45,$04,$44,$45,$06,$8C,$45 ; A318 04 45 04 44 45 06 8C 45  .E.DE..E
        .byte   $04,$04,$55,$08,$34,$55,$0E,$7C ; A320 04 04 55 08 34 55 0E 7C  ..U.4U.|
        .byte   $55,$08,$FD,$04,$FF,$34,$09,$04 ; A328 55 08 FD 04 FF 34 09 04  U....4..
        .byte   $5C,$44,$0A,$FD,$04,$01,$5C,$06 ; A330 5C 44 0A FD 04 01 5C 06  \D....\.
        .byte   $04,$1C,$3B,$0A,$FE,$5F,$9C,$FD ; A338 04 1C 3B 0A FE 5F 9C FD  ..;.._..
        .byte   $00,$04,$0C,$41,$05,$8C,$41,$05 ; A340 00 04 0C 41 05 8C 41 05  ...A..A.
        .byte   $24,$01,$05,$74,$01,$05,$4C,$01 ; A348 24 01 05 74 01 05 4C 01  $..t..L.
        .byte   $15,$FE,$C9,$9C,$06,$18,$0A,$99 ; A350 15 FE C9 9C 06 18 0A 99  ........
        .byte   $18,$0A,$FE,$DA,$9C,$1D,$38,$06 ; A358 18 0A FE DA 9C 1D 38 06  ......8.
        .byte   $81,$38,$06,$FE,$B3,$9C         ; A360 81 38 06 FE B3 9C        .8....
; gfx_draw instructions for bombs, used by bomb_pickup to get bomb coords. $ff terminated
l01_map_bombs:
        .byte   $04,$12,$01,$38,$02,$01,$64,$02 ; A366 04 12 01 38 02 01 64 02  ...8..d.
        .byte   $01,$98,$12,$01,$44,$22,$01,$58 ; A36E 01 98 12 01 44 22 01 58  ....D".X
        .byte   $22,$01,$04,$42,$01,$98,$42,$01 ; A376 22 01 04 42 01 98 42 01  "..B..B.
        .byte   $04,$52,$01,$38,$52,$01,$64,$52 ; A37E 04 52 01 38 52 01 64 52  .R.8R.dR
        .byte   $01,$98,$52,$01,$FF             ; A386 01 98 52 01 FF           ..R..
; 2 bytes per entry, terminated by $FF. 1st byte is coarse grid coords (top nybble = X, bottom = Y), 2nd byte is index into map_changes
l01_bombs:
        .byte   $24,$00,$62,$10,$82,$20,$C4,$00 ; A38B 24 00 62 10 82 20 C4 00  $.b.. ..
        .byte   $66,$30,$86,$40,$2A,$00,$CA,$00 ; A393 66 30 86 40 2A 00 CA 00  f0.@*...
        .byte   $2C,$00,$6C,$00,$8C,$00,$CC,$00 ; A39B 2C 00 6C 00 8C 00 CC 00  ,.l.....
; terminator for l01_bombs
l01_bombs_term:
        .byte   $FF                             ; A3A3 FF                       .
; ----------------------------------------------------------------------------
; 0000 = no change
l01_map_changes:
        .addr   L0000                           ; A3A4 00 00                    ..
        .addr   l01_map_change_0                ; A3A6 AE A3                    ..
        .addr   l01_map_change_1                ; A3A8 B8 A3                    ..
        .addr   l01_map_change_2                ; A3AA C2 A3                    ..
        .addr   l01_map_change_3                ; A3AC CC A3                    ..
; ----------------------------------------------------------------------------
l01_map_change_0:
        .byte   $FE,$49,$9C,$FD,$04,$01,$64,$08 ; A3AE FE 49 9C FD 04 01 64 08  .I....d.
        .byte   $02,$FF                         ; A3B6 02 FF                    ..
l01_map_change_1:
        .byte   $FE,$49,$9C,$FD,$04,$FF,$34,$09 ; A3B8 FE 49 9C FD 04 FF 34 09  .I....4.
        .byte   $02,$FF                         ; A3C0 02 FF                    ..
l01_map_change_2:
        .byte   $FE,$49,$9C,$FD,$04,$00,$2C,$25 ; A3C2 FE 49 9C FD 04 00 2C 25  .I....,%
        .byte   $05,$FF                         ; A3CA 05 FF                    ..
l01_map_change_3:
        .byte   $FE,$49,$9C,$FD,$04,$00,$60,$25 ; A3CC FE 49 9C FD 04 00 60 25  .I....`%
        .byte   $05,$FF                         ; A3D4 05 FF                    ..
zero_filler_a3d6:
        .byte   $00,$00,$00,$00,$00,$00,$00,$00 ; A3D6 00 00 00 00 00 00 00 00  ........
        .byte   $00,$00                         ; A3DE 00 00                    ..
; level map data starts here
l02_map:.byte   $FE,$33,$9C,$FD,$04,$00,$04,$05 ; A3E0 FE 33 9C FD 04 00 04 05  .3......
        .byte   $08,$34,$05,$0E,$7C,$05,$08,$14 ; A3E8 08 34 05 0E 7C 05 08 14  .4..|...
        .byte   $15,$04,$34,$15,$04,$5C,$15,$04 ; A3F0 15 04 34 15 04 5C 15 04  ..4..\..
        .byte   $7C,$15,$04,$04,$25,$10,$5C,$25 ; A3F8 7C 15 04 04 25 10 5C 25  |...%.\%
        .byte   $10,$20,$3C,$07,$64,$3C,$07,$04 ; A400 10 20 3C 07 64 3C 07 04  . <.d<..
        .byte   $55,$09,$38,$55,$0C,$78,$55,$09 ; A408 55 09 38 55 0C 78 55 09  U.8U.xU.
        .byte   $FD,$04,$FF,$04,$19,$04,$80,$3B ; A410 FD 04 FF 04 19 04 80 3B  .......;
        .byte   $07,$FD,$04,$01,$8C,$16,$04,$04 ; A418 07 FD 04 01 8C 16 04 04  ........
        .byte   $35,$07,$FE,$5F,$9C,$FD,$00,$04 ; A420 35 07 FE 5F 9C FD 00 04  5.._....
        .byte   $18,$01,$05,$4C,$01,$15,$80,$01 ; A428 18 01 05 4C 01 15 80 01  ...L....
        .byte   $05,$FE,$C9,$9C,$19,$3C,$05,$85 ; A430 05 FE C9 9C 19 3C 05 85  .....<..
        .byte   $3C,$05,$FE,$DA,$9C,$05,$30,$08 ; A438 3C 05 FE DA 9C 05 30 08  <.....0.
        .byte   $99,$30,$08,$FE,$B3,$9C         ; A440 99 30 08 FE B3 9C        .0....
l02_map_bombs:
        .byte   $04,$02,$01,$38,$02,$01,$64,$02 ; A446 04 02 01 38 02 01 64 02  ...8..d.
        .byte   $01,$98,$02,$01,$04,$12,$01,$38 ; A44E 01 98 02 01 04 12 01 38  .......8
        .byte   $12,$01,$64,$12,$01,$98,$12,$01 ; A456 12 01 64 12 01 98 12 01  ..d.....
        .byte   $20,$22,$01,$7C,$22,$01,$38,$32 ; A45E 20 22 01 7C 22 01 38 32   ".|".82
        .byte   $01,$64,$32,$01,$04,$52,$01,$38 ; A466 01 64 32 01 04 52 01 38  .d2..R.8
        .byte   $52,$01,$64,$52,$01,$98,$52,$01 ; A46E 52 01 64 52 01 98 52 01  R.dR..R.
        .byte   $FF                             ; A476 FF                       .
l02_bombs:
        .byte   $22,$00,$62,$00,$82,$00,$C2,$00 ; A477 22 00 62 00 82 00 C2 00  ".b.....
        .byte   $24,$00,$64,$00,$84,$00,$C4,$00 ; A47F 24 00 64 00 84 00 C4 00  $.d.....
        .byte   $46,$00,$A6,$00,$68,$00,$88,$00 ; A487 46 00 A6 00 68 00 88 00  F...h...
        .byte   $2C,$00,$6C,$00,$8C,$00,$CC,$00 ; A48F 2C 00 6C 00 8C 00 CC 00  ,.l.....
l02_bombs_term:
        .byte   $FF                             ; A497 FF                       .
; ----------------------------------------------------------------------------
; not sure what this actually does
electrocution_bomb_pickup:
        ldy     bomb_idx                        ; A498 A4 B2                    ..
        lda     elec_bomb_table,y               ; A49A B9 42 A5                 .B.
        clc                                     ; A49D 18                       .
        adc     #$30                            ; A49E 69 30                    i0
        sta     $0680                           ; A4A0 8D 80 06                 ...
        lda     LA543,y                         ; A4A3 B9 43 A5                 .C.
        asl     a                               ; A4A6 0A                       .
        adc     #$20                            ; A4A7 69 20                    i 
        sta     $0685                           ; A4A9 8D 85 06                 ...
        lda     LA582,y                         ; A4AC B9 82 A5                 ...
        sta     $068A                           ; A4AF 8D 8A 06                 ...
        lda     LA583,y                         ; A4B2 B9 83 A5                 ...
        sta     PCOLR2                          ; A4B5 8D C2 02                 ...
        lda     LA562,y                         ; A4B8 B9 62 A5                 .b.
        clc                                     ; A4BB 18                       .
        adc     #$30                            ; A4BC 69 30                    i0
        sta     $0681                           ; A4BE 8D 81 06                 ...
        lda     LA563,y                         ; A4C1 B9 63 A5                 .c.
        asl     a                               ; A4C4 0A                       .
        adc     #$20                            ; A4C5 69 20                    i 
        sta     player_new_y                    ; A4C7 8D 86 06                 ...
        lda     LA5A2,y                         ; A4CA B9 A2 A5                 ...
        sta     player_x                        ; A4CD 8D 8B 06                 ...
        lda     LA5A3,y                         ; A4D0 B9 A3 A5                 ...
        sta     PCOLR3                          ; A4D3 8D C3 02                 ...
        sta     $066C                           ; A4D6 8D 6C 06                 .l.
        sta     $066D                           ; A4D9 8D 6D 06                 .m.
        rts                                     ; A4DC 60                       `

; ----------------------------------------------------------------------------
; turn off electrocution effect (?)
electrocution_done:
        lda     falling_flag                    ; A4DD AD 23 06                 .#.
        bne     LA4FF                           ; A4E0 D0 1D                    ..
        lda     start_falling_flag              ; A4E2 AD 21 06                 .!.
        bne     LA4E8                           ; A4E5 D0 01                    ..
        rts                                     ; A4E7 60                       `

; ----------------------------------------------------------------------------
LA4E8:  ldx     #$01                            ; A4E8 A2 01                    ..
        lda     sav_p2pl                        ; A4EA AD BE 06                 ...
        and     #$03                            ; A4ED 29 03                    ).
        bne     LA505                           ; A4EF D0 14                    ..
        inx                                     ; A4F1 E8                       .
        lda     sav_p3pl                        ; A4F2 AD BF 06                 ...
        and     #$03                            ; A4F5 29 03                    ).
        bne     LA505                           ; A4F7 D0 0C                    ..
        lda     initial_speed                   ; A4F9 AD 25 06                 .%.
        sta     current_speed                   ; A4FC 8D 24 06                 .$.
LA4FF:  lda     #$00                            ; A4FF A9 00                    ..
        sta     $0770                           ; A501 8D 70 07                 .p.
        rts                                     ; A504 60                       `

; ----------------------------------------------------------------------------
LA505:  stx     $0770                           ; A505 8E 70 07                 .p.
        rts                                     ; A508 60                       `

; ----------------------------------------------------------------------------
; electrocution effect
electrocute:
        ldx     $0770                           ; A509 AE 70 07                 .p.
        bne     LA50F                           ; A50C D0 01                    ..
        rts                                     ; A50E 60                       `

; ----------------------------------------------------------------------------
LA50F:  lda     RANDOM                          ; A50F AD 0A D2                 ...
        sta     COLPM1,x                        ; A512 9D 13 D0                 ...
        sta     COLPM0                          ; A515 8D 12 D0                 ...
        lda     #$08                            ; A518 A9 08                    ..
        sta     current_speed                   ; A51A 8D 24 06                 .$.
        lda     #$2D                            ; A51D A9 2D                    .-
        sta     snd_slot_priority               ; A51F 8D 3E 06                 .>.
        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%,<LE.
        .byte   $55,$20,$55,$4C,$4D,$8C,$55     ; A55B 55 20 55 4C 4D 8C 55     U ULM.U
LA562:  .byte   $18                             ; A562 18                       .
LA563:  .byte   $15,$40,$05,$80,$09,$8C,$05,$18 ; A563 15 40 05 80 09 8C 05 18  .@......
        .byte   $09,$4C,$0D,$70,$25,$80,$09,$28 ; A56B 09 4C 0D 70 25 80 09 28  .L.p%..(
        .byte   $25,$80,$15,$4C,$35,$6C,$3C,$0C ; A573 25 80 15 4C 35 6C 3C 0C  %..L5l<.
        .byte   $55,$4C,$4D,$78,$55,$8C,$55     ; A57B 55 4C 4D 78 55 8C 55     ULMxU.U
LA582:  .byte   $01                             ; A582 01                       .
LA583:  .byte   $08,$02,$C6,$01,$08,$01,$08,$02 ; A583 08 02 C6 01 08 01 08 02  ........
        .byte   $C6,$01,$08,$02,$C6,$02,$C6,$01 ; A58B C6 01 08 02 C6 02 C6 01  ........
        .byte   $08,$01,$08,$01,$08,$02,$C6,$01 ; A593 08 01 08 01 08 02 C6 01  ........
        .byte   $08,$01,$08,$02,$C6,$01,$08     ; A59B 08 01 08 02 C6 01 08     .......
LA5A2:  .byte   $01                             ; A5A2 01                       .
LA5A3:  .byte   $08,$01,$08,$02,$C6,$01,$08,$02 ; A5A3 08 01 08 02 C6 01 08 02  ........
        .byte   $C6,$02,$C6,$01,$08,$02,$C6,$01 ; A5AB C6 02 C6 01 08 02 C6 01  ........
        .byte   $08,$01,$08,$02,$C6,$01,$08,$01 ; A5B3 08 01 08 02 C6 01 08 01  ........
        .byte   $08,$02,$C6,$01,$08,$01,$08     ; A5BB 08 02 C6 01 08 01 08     .......
LA5C2:  .byte   $03,$D3,$A5,$08,$00,$00,$01,$00 ; A5C2 03 D3 A5 08 00 00 01 00  ........
        .byte   $04,$D3,$A5,$08,$00,$00,$01,$00 ; A5CA 04 D3 A5 08 00 00 01 00  ........
        .byte   $FF,$FF,$FF,$AA,$AA,$FF,$FF,$00 ; A5D2 FF FF FF AA AA FF FF 00  ........
        .byte   $00,$C3,$C3,$C3,$C3,$FF,$FF,$C3 ; A5DA 00 C3 C3 C3 C3 FF FF C3  ........
        .byte   $C3,$00,$00,$00,$00,$00,$00,$00 ; A5E2 C3 00 00 00 00 00 00 00  ........
        .byte   $00,$00,$00,$00,$00,$00         ; A5EA 00 00 00 00 00 00        ......
; level map data starts here
l03_map:.byte   $FE,$33,$9C,$FD,$04,$00,$04,$05 ; A5F0 FE 33 9C FD 04 00 04 05  .3......
        .byte   $06,$84,$05,$06,$04,$15,$06,$84 ; A5F8 06 84 05 06 04 15 06 84  ........
        .byte   $15,$06,$04,$25,$0C,$6C,$25,$0C ; A600 15 06 04 25 0C 6C 25 0C  ...%.l%.
        .byte   $04,$35,$0C,$6C,$35,$0C,$04,$45 ; A608 04 35 0C 6C 35 0C 04 45  .5.l5..E
        .byte   $04,$24,$45,$04,$6C,$45,$04,$8C ; A610 04 24 45 04 6C 45 04 8C  .$E.lE..
        .byte   $45,$04,$04,$55,$06,$84,$55,$06 ; A618 45 04 04 55 06 84 55 06  E..U..U.
        .byte   $FE,$5F,$9C,$FD,$00,$04,$0C,$01 ; A620 FE 5F 9C FD 00 04 0C 01  ._......
        .byte   $05,$8C,$01,$05,$FE,$B3,$9C     ; A628 05 8C 01 05 FE B3 9C     .......
l03_map_bombs:
        .byte   $04,$02,$01,$04,$12,$01,$04,$22 ; A62F 04 02 01 04 12 01 04 22  ......."
        .byte   $01,$04,$32,$01,$04,$42,$01,$04 ; A637 01 04 32 01 04 42 01 04  ..2..B..
        .byte   $52,$01,$98,$02,$01,$98,$12,$01 ; A63F 52 01 98 02 01 98 12 01  R.......
        .byte   $98,$22,$01,$98,$32,$01,$98,$42 ; A647 98 22 01 98 32 01 98 42  ."..2..B
        .byte   $01,$98,$52,$01,$FF             ; A64F 01 98 52 01 FF           ..R..
l03_bombs:
        .byte   $22,$00,$24,$00,$26,$00,$28,$00 ; A654 22 00 24 00 26 00 28 00  ".$.&.(.
        .byte   $2A,$00,$2C,$00,$C2,$00,$C4,$00 ; A65C 2A 00 2C 00 C2 00 C4 00  *.,.....
        .byte   $C6,$00,$C8,$00,$CA,$00,$CC,$00 ; A664 C6 00 C8 00 CA 00 CC 00  ........
l03_bombs_term:
        .byte   $FF                             ; A66C FF                       .
l03_unkn:
        .byte   $00,$00,$00,$01,$7A,$01,$01,$66 ; A66D 00 00 00 01 7A 01 01 66  ....z..f
        .byte   $03,$86,$A6,$06,$4C,$4A,$01,$66 ; A675 03 86 A6 06 4C 4A 01 66  ....LJ.f
        .byte   $04,$86,$A6,$06,$A4,$CA,$01,$66 ; A67D 04 86 A6 06 A4 CA 01 66  .......f
; horizontally moving platforms from level03
dw_platform_sprite:
        .byte   $FF,$FF,$FF,$AA,$55,$FF,$FF     ; A685 FF FF FF AA 55 FF FF     ....U..
; ----------------------------------------------------------------------------
; gets called at start of level
dumbwaiter_setup:
        jsr     special_init_jv                 ; A68C 20 36 80                  6.
        lda     #$06                            ; A68F A9 06                    ..
        sta     bullet_y_delta+2                ; A691 8D 60 07                 .`.
        ldy     #$2A                            ; A694 A0 2A                    .*
LA696:  ldx     #$06                            ; A696 A2 06                    ..
LA698:  lda     LA781,x                         ; A698 BD 81 A7                 ...
        sta     $2B00,y                         ; A69B 99 00 2B                 ..+
        iny                                     ; A69E C8                       .
        dex                                     ; A69F CA                       .
        bne     LA698                           ; A6A0 D0 F6                    ..
        tya                                     ; A6A2 98                       .
        clc                                     ; A6A3 18                       .
        adc     #$1A                            ; A6A4 69 1A                    i.
        tay                                     ; A6A6 A8                       .
        dec     bullet_y_delta+2                ; A6A7 CE 60 07                 .`.
        bne     LA696                           ; A6AA D0 EA                    ..
        lda     #$FF                            ; A6AC A9 FF                    ..
        sta     SIZEM                           ; A6AE 8D 0C D0                 ...
        stx     $068C                           ; A6B1 8E 8C 06                 ...
        lda     #$01                            ; A6B4 A9 01                    ..
        sta     SIZEP2                          ; A6B6 8D 0A D0                 ...
        sta     SIZEP3                          ; A6B9 8D 0B D0                 ...
LA6BC:  rts                                     ; A6BC 60                       `

; ----------------------------------------------------------------------------
; gets called every frame
dumbwaiter_sub0:
        lda     $06F5                           ; A6BD AD F5 06                 ...
        beq     LA6BC                           ; A6C0 F0 FA                    ..
        cmp     #$01                            ; A6C2 C9 01                    ..
        bne     LA6DC                           ; A6C4 D0 16                    ..
        inc     $06F5                           ; A6C6 EE F5 06                 ...
        inc     $0669                           ; A6C9 EE 69 06                 .i.
        inc     $066C                           ; A6CC EE 6C 06                 .l.
        inc     $066D                           ; A6CF EE 6D 06                 .m.
        lda     #$01                            ; A6D2 A9 01                    ..
        sta     $0770                           ; A6D4 8D 70 07                 .p.
        lda     #$FF                            ; A6D7 A9 FF                    ..
        sta     $0771                           ; A6D9 8D 71 07                 .q.
LA6DC:  lda     falling_flag                    ; A6DC AD 23 06                 .#.
        cmp     #$02                            ; A6DF C9 02                    ..
        beq     LA6BC                           ; A6E1 F0 D9                    ..
        lda     $0622                           ; A6E3 AD 22 06                 .".
        beq     LA6BC                           ; A6E6 F0 D4                    ..
        ldx     #$02                            ; A6E8 A2 02                    ..
LA6EA:  inx                                     ; A6EA E8                       .
        cpx     #$05                            ; A6EB E0 05                    ..
        beq     LA70F                           ; A6ED F0 20                    . 
        clc                                     ; A6EF 18                       .
        lda     $067D,x                         ; A6F0 BD 7D 06                 .}.
        adc     $076D,x                         ; A6F3 7D 6D 07                 }m.
        sta     $067D,x                         ; A6F6 9D 7D 06                 .}.
        cmp     #$4B                            ; A6F9 C9 4B                    .K
        beq     LA701                           ; A6FB F0 04                    ..
        cmp     #$A4                            ; A6FD C9 A4                    ..
        bne     LA6EA                           ; A6FF D0 E9                    ..
LA701:  lda     $076D,x                         ; A701 BD 6D 07                 .m.
        eor     #$FF                            ; A704 49 FF                    I.
        sta     $076D,x                         ; A706 9D 6D 07                 .m.
        inc     $076D,x                         ; A709 FE 6D 07                 .m.
        jmp     LA6EA                           ; A70C 4C EA A6                 L..

; ----------------------------------------------------------------------------
LA70F:  lda     $2BCF                           ; A70F AD CF 2B                 ..+
        sta     $2B0E                           ; A712 8D 0E 2B                 ..+
        ldy     #$CF                            ; A715 A0 CF                    ..
        ldx     #$CE                            ; A717 A2 CE                    ..
LA719:  lda     $2B00,x                         ; A719 BD 00 2B                 ..+
        sta     $2B00,y                         ; A71C 99 00 2B                 ..+
        dex                                     ; A71F CA                       .
        dey                                     ; A720 88                       .
        bne     LA719                           ; A721 D0 F6                    ..
        rts                                     ; A723 60                       `

; ----------------------------------------------------------------------------
; gets called every frame
dumbwaiter_sub3:
        lda     falling_flag                    ; A724 AD 23 06                 .#.
        cmp     #$02                            ; A727 C9 02                    ..
        beq     LA778                           ; A729 F0 4D                    .M
        lda     $0622                           ; A72B AD 22 06                 .".
        beq     LA778                           ; A72E F0 48                    .H
        lda     $0778                           ; A730 AD 78 07                 .x.
        beq     LA73D                           ; A733 F0 08                    ..
        lda     #$00                            ; A735 A9 00                    ..
        sta     $06ED                           ; A737 8D ED 06                 ...
        sta     $0778                           ; A73A 8D 78 07                 .x.
LA73D:  lda     sav_m0pl                        ; A73D AD B8 06                 ...
        ora     sav_m1pl                        ; A740 0D B9 06                 ...
        ora     sav_m2pl                        ; A743 0D BA 06                 ...
        ora     sav_m3pl                        ; A746 0D BB 06                 ...
        tax                                     ; A749 AA                       .
        ora     sav_p2pl                        ; A74A 0D BE 06                 ...
        ora     sav_p3pl                        ; A74D 0D BF 06                 ...
        tay                                     ; A750 A8                       .
        and     #$01                            ; A751 29 01                    ).
        beq     LA760                           ; A753 F0 0B                    ..
        lda     sav_p0pf                        ; A755 AD B4 06                 ...
        ora     #$01                            ; A758 09 01                    ..
        sta     sav_p0pf                        ; A75A 8D B4 06                 ...
        inc     player_y_pos                    ; A75D EE 83 06                 ...
LA760:  tya                                     ; A760 98                       .
        and     #$02                            ; A761 29 02                    ).
        beq     LA779                           ; A763 F0 14                    ..
        lda     sav_p1pf                        ; A765 AD B5 06                 ...
        ora     #$01                            ; A768 09 01                    ..
        sta     sav_p1pf                        ; A76A 8D B5 06                 ...
        txa                                     ; A76D 8A                       .
        and     #$02                            ; A76E 29 02                    ).
        beq     LA778                           ; A770 F0 06                    ..
        inc     player_y_pos                    ; A772 EE 83 06                 ...
        sta     $0778                           ; A775 8D 78 07                 .x.
LA778:  rts                                     ; A778 60                       `

; ----------------------------------------------------------------------------
LA779:  lda     player_y_pos                    ; A779 AD 83 06                 ...
        and     #$FE                            ; A77C 29 FE                    ).
        sta     player_y_pos                    ; A77E 8D 83 06                 ...
LA781:  rts                                     ; A781 60                       `

; ----------------------------------------------------------------------------
; the dumbwaiters from level03. stored upside-down. trailing 00's might just be filler.
dumbwaiter_sprite:
        .byte   $18,$3C,$7E,$FF,$FF,$FF,$00,$00 ; A782 18 3C 7E FF FF FF 00 00  .<~.....
        .byte   $00,$00,$00,$00,$00,$00         ; A78A 00 00 00 00 00 00        ......
; level map data starts here
l04_map:.byte   $FE,$33,$9C,$FD,$04,$00,$40,$05 ; A790 FE 33 9C FD 04 00 40 05  .3....@.
        .byte   $08,$18,$15,$0A,$04,$25,$14,$18 ; A798 08 18 15 0A 04 25 14 18  .....%..
        .byte   $35,$0A,$2C,$45,$0A,$04,$55,$0F ; A7A0 35 0A 2C 45 0A 04 55 0F  5.,E..U.
        .byte   $60,$55,$0F,$4C,$15,$0F,$60,$25 ; A7A8 60 55 0F 4C 15 0F 60 25  `U.L..`%
        .byte   $0F,$4C,$35,$0F,$60,$45,$05,$FE ; A7B0 0F 4C 35 0F 60 45 05 FE  .L5.`E..
        .byte   $5F,$9C,$FD,$00,$04,$4C,$01,$05 ; A7B8 5F 9C FD 00 04 4C 01 05  _....L..
        .byte   $4C,$21,$05,$4C,$41,$05,$18,$11 ; A7C0 4C 21 05 4C 41 05 18 11  L!.LA...
        .byte   $05,$80,$11,$05,$2C,$31,$05,$6C ; A7C8 05 80 11 05 2C 31 05 6C  ....,1.l
        .byte   $31,$05,$FE,$B3,$9C             ; A7D0 31 05 FE B3 9C           1....
l04_map_bombs:
        .byte   $40,$02,$01,$5C,$02,$01,$24,$12 ; A7D5 40 02 01 5C 02 01 24 12  @..\..$.
        .byte   $01,$3C,$12,$01,$60,$12,$01,$78 ; A7DD 01 3C 12 01 60 12 01 78  .<..`..x
        .byte   $12,$01,$04,$22,$01,$3C,$22,$01 ; A7E5 12 01 04 22 01 3C 22 01  ...".<".
        .byte   $60,$22,$01,$98,$22,$01,$18,$32 ; A7ED 60 22 01 98 22 01 18 32  `".."..2
        .byte   $01,$84,$32,$01,$3C,$42,$01,$60 ; A7F5 01 84 32 01 3C 42 01 60  ..2.<B.`
        .byte   $42,$01,$04,$52,$01,$98,$52,$01 ; A7FD 42 01 04 52 01 98 52 01  B..R..R.
        .byte   $FF                             ; A805 FF                       .
l04_bombs:
        .byte   $62,$00,$82,$00,$44,$00,$64,$00 ; A806 62 00 82 00 44 00 64 00  b...D.d.
        .byte   $84,$00,$A4,$00,$26,$00,$66,$00 ; A80E 84 00 A4 00 26 00 66 00  ....&.f.
        .byte   $86,$00,$C6,$00,$48,$00,$A8,$00 ; A816 86 00 C6 00 48 00 A8 00  ....H...
        .byte   $6A,$00,$8A,$00,$2C,$00,$CC,$00 ; A81E 6A 00 8A 00 2C 00 CC 00  j...,...
l04_bombs_term:
        .byte   $FF                             ; A826 FF                       .
; ----------------------------------------------------------------------------
hellstones_sub3:
        lda     jiffy_timer_3_lo                ; A827 AD 19 06                 ...
        asl     a                               ; A82A 0A                       .
        asl     a                               ; A82B 0A                       .
        asl     a                               ; A82C 0A                       .
        asl     a                               ; A82D 0A                       .
        ora     #$08                            ; A82E 09 08                    ..
        sta     COLOR3                          ; A830 8D C7 02                 ...
        jmp     check_pl_coll                   ; A833 4C 73 8F                 Ls.

; ----------------------------------------------------------------------------
hellstones_sub0:
        lda     falling_flag                    ; A836 AD 23 06                 .#.
        cmp     #$02                            ; A839 C9 02                    ..
        beq     LA842                           ; A83B F0 05                    ..
        lda     $0622                           ; A83D AD 22 06                 .".
        bne     LA843                           ; A840 D0 01                    ..
LA842:  rts                                     ; A842 60                       `

; ----------------------------------------------------------------------------
LA843:  ldx     #$05                            ; A843 A2 05                    ..
LA845:  dex                                     ; A845 CA                       .
        beq     LA842                           ; A846 F0 FA                    ..
        lda     bullet_y_delta+1,x              ; A848 BD 5F 07                 ._.
        bne     LA865                           ; A84B D0 18                    ..
        lda     RANDOM                          ; A84D AD 0A D2                 ...
        and     #$1F                            ; A850 29 1F                    ).
        bne     LA845                           ; A852 D0 F1                    ..
        inc     bullet_y_delta+1,x              ; A854 FE 5F 07                 ._.
        lda     #$00                            ; A857 A9 00                    ..
        sta     bullet_y_pos_minus_one,x        ; A859 9D 9E 06                 ...
        lda     player_x_pos                    ; A85C AD 7E 06                 .~.
        clc                                     ; A85F 18                       .
        adc     #$03                            ; A860 69 03                    i.
        sta     $069A,x                         ; A862 9D 9A 06                 ...
LA865:  lda     $0763,x                         ; A865 BD 63 07                 .c.
        bne     LA89E                           ; A868 D0 34                    .4
        lda     dli_vec_shadow_hi,x             ; A86A BD AF 06                 ...
        and     #$01                            ; A86D 29 01                    ).
        beq     LA89E                           ; A86F F0 2D                    .-
        lda     player_x_pos                    ; A871 AD 7E 06                 .~.
        clc                                     ; A874 18                       .
        adc     #$03                            ; A875 69 03                    i.
        ldy     #$01                            ; A877 A0 01                    ..
        cmp     $069A,x                         ; A879 DD 9A 06                 ...
        beq     LA882                           ; A87C F0 04                    ..
        iny                                     ; A87E C8                       .
        bcc     LA882                           ; A87F 90 01                    ..
        iny                                     ; A881 C8                       .
LA882:  tya                                     ; A882 98                       .
        sta     $0763,x                         ; A883 9D 63 07                 .c.
        lda     #$00                            ; A886 A9 00                    ..
        sta     $0767,x                         ; A888 9D 67 07                 .g.
        txa                                     ; A88B 8A                       .
        pha                                     ; A88C 48                       H
play_hellstone_sfx:
        lda     #$0D                            ; A88D A9 0D                    ..
        sta     snd_slot_priority               ; A88F 8D 3E 06                 .>.
        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  .<R.`R..
        .byte   $52,$01,$FF                     ; ACE2 52 01 FF                 R..
l07_bombs:
        .byte   $22,$10,$62,$20,$82,$30,$C2,$40 ; ACE5 22 10 62 20 82 30 C2 40  ".b .0.@
        .byte   $46,$50,$A6,$50,$48,$60,$A8,$60 ; ACED 46 50 A6 50 48 60 A8 60  FP.PH`.`
        .byte   $4A,$70,$AA,$70,$2C,$80,$6C,$00 ; ACF5 4A 70 AA 70 2C 80 6C 00  Jp.p,.l.
        .byte   $8C,$00,$CC,$90                 ; ACFD 8C 00 CC 90              ....
l07_bombs_term:
        .byte   $FF                             ; AD01 FF                       .
l07_map_changes:
        .byte   $00,$00,$16,$AD,$16,$AD,$20,$AD ; AD02 00 00 16 AD 16 AD 20 AD  ...... .
        .byte   $20,$AD,$2A,$AD,$34,$AD,$3E,$AD ; AD0A 20 AD 2A AD 34 AD 3E AD   .*.4.>.
        .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  .<f.....
        .byte   $C3,$C3,$E3,$F3,$DB,$CF,$C7,$C3 ; AEE4 C3 C3 E3 F3 DB CF C7 C3  ........
        .byte   $FF,$C0,$C0,$C0,$F8,$C0,$C0,$FF ; AEEC FF C0 C0 C0 F8 C0 C0 FF  ........
        .byte   $C3,$66,$3C,$18,$18,$18,$18,$18 ; AEF4 C3 66 3C 18 18 18 18 18  .f<.....
        .byte   $C3,$C3,$66,$3C,$3C,$66,$C3,$C3 ; AEFC C3 C3 66 3C 3C 66 C3 C3  ..f<<f..
        .byte   $00,$00,$00,$00,$00,$00,$00,$00 ; AF04 00 00 00 00 00 00 00 00  ........
; the little 250 that gets displayed at end of level, for each letter
bonus_250:
        .byte   $40,$A0,$20,$40,$E0,$00,$38,$20 ; AF0C 40 A0 20 40 E0 00 38 20  @. @..8 
        .byte   $30,$08,$30,$04,$0A,$0A,$0A,$04 ; AF14 30 08 30 04 0A 0A 0A 04  0.0.....
; ----------------------------------------------------------------------------
LAF1C:  lda     rot_color                       ; AF1C AD 2A 06                 .*.
        sta     PCOLR2                          ; AF1F 8D C2 02                 ...
        rts                                     ; AF22 60                       `

; ----------------------------------------------------------------------------
spellbound_bomb_sub:
        lda     bomb_idx                        ; AF23 A5 B2                    ..
        lsr     a                               ; AF25 4A                       J
        tax                                     ; AF26 AA                       .
        ldy     spellbound_table,x              ; AF27 BC A4 AE                 ...
        iny                                     ; AF2A C8                       .
        ldx     $0771                           ; AF2B AE 71 07                 .q.
        tya                                     ; AF2E 98                       .
        sta     $0773,x                         ; AF2F 9D 73 07                 .s.
        dey                                     ; AF32 88                       .
        ldx     $0770                           ; AF33 AE 70 07                 .p.
        lda     #$08                            ; AF36 A9 08                    ..
        sta     $0772                           ; AF38 8D 72 07                 .r.
LAF3B:  lda     letter_bitmap,y                 ; AF3B B9 BC AE                 ...
        sta     $2E00,x                         ; AF3E 9D 00 2E                 ...
        inx                                     ; AF41 E8                       .
        iny                                     ; AF42 C8                       .
        dec     $0772                           ; AF43 CE 72 07                 .r.
        bne     LAF3B                           ; AF46 D0 F3                    ..
        inc     $0771                           ; AF48 EE 71 07                 .q.
        sec                                     ; AF4B 38                       8
        lda     $0770                           ; AF4C AD 70 07                 .p.
        sbc     #$0A                            ; AF4F E9 0A                    ..
        sta     $0770                           ; AF51 8D 70 07                 .p.
        inc     $066C                           ; AF54 EE 6C 06                 .l.
        rts                                     ; AF57 60                       `

; ----------------------------------------------------------------------------
; called at end of Spellbound, adds up letter bonus
spellbound_letters:
        lda     work_level_num_bombs            ; AF58 AD 8A 07                 ...
        beq     spellbound_got_all              ; AF5B F0 01                    ..
        rts                                     ; AF5D 60                       `

; ----------------------------------------------------------------------------
; got all the bombs
spellbound_got_all:
        lda     #$09                            ; AF5E A9 09                    ..
        sta     current_speed                   ; AF60 8D 24 06                 .$.
        lda     #$00                            ; AF63 A9 00                    ..
        sta     playing_level                   ; AF65 8D 27 06                 .'.
        ldx     #$0C                            ; AF68 A2 0C                    ..
        stx     $066D                           ; AF6A 8E 6D 06                 .m.
ltr_loop:
        lda     $0770                           ; AF6D AD 70 07                 .p.
        clc                                     ; AF70 18                       .
        adc     #$0A                            ; AF71 69 0A                    i.
        sta     $0770                           ; AF73 8D 70 07                 .p.
        lda     $0772,x                         ; AF76 BD 72 07                 .r.
        cmp     epyx_jumpman,x                  ; AF79 DD AF AE                 ...
        beq     bonus_250_pts                   ; AF7C F0 18                    ..
        lda     #$00                            ; AF7E A9 00                    ..
        sta     $0681                           ; AF80 8D 81 06                 ...
        jmp     ltr_skip                        ; AF83 4C 92 AF                 L..

; ----------------------------------------------------------------------------
; wait approx 1/3 second so user can see what happened
ltr_delay:
        lda     #$00                            ; AF86 A9 00                    ..
        sta     jiffy_timer_1                   ; AF88 8D 1A 06                 ...
ltr_wait:
        lda     jiffy_timer_1                   ; AF8B AD 1A 06                 ...
        cmp     #$20                            ; AF8E C9 20                    . 
        bne     ltr_wait                        ; AF90 D0 F9                    ..
ltr_skip:
        dex                                     ; AF92 CA                       .
        bne     ltr_loop                        ; AF93 D0 D8                    ..
        rts                                     ; AF95 60                       `

; ----------------------------------------------------------------------------
; per letter
bonus_250_pts:
        lda     $0770                           ; AF96 AD 70 07                 .p.
        sta     player_new_y                    ; AF99 8D 86 06                 ...
        lda     #$86                            ; AF9C A9 86                    ..
        sta     $0681                           ; AF9E 8D 81 06                 ...
        clc                                     ; AFA1 18                       .
        lda     score                           ; AFA2 AD 00 07                 ...
        adc     #$FA                            ; AFA5 69 FA                    i.
        sta     score                           ; AFA7 8D 00 07                 ...
        bcc     b250_hi_ok                      ; AFAA 90 08                    ..
        inc     score+1                         ; AFAC EE 01 07                 ...
        bne     b250_hi_ok                      ; AFAF D0 03                    ..
        inc     score+2                         ; AFB1 EE 02 07                 ...
b250_hi_ok:
        txa                                     ; AFB4 8A                       .
        pha                                     ; AFB5 48                       H
        jsr     check_extra_life_jv             ; AFB6 20 0C 80                  ..
; play sfx_letter_bonus
cue_letter_sfx:
        lda     #$CB                            ; AFB9 A9 CB                    ..
        sta     snd_ptr                         ; AFBB 8D 3C 06                 .<.
        lda     #$AF                            ; AFBE A9 AF                    ..
        sta     snd_ptr+1                       ; AFC0 8D 3D 06                 .=.
        jsr     cue_sfx_jv                      ; AFC3 20 06 80                  ..
        pla                                     ; AFC6 68                       h
        tax                                     ; AFC7 AA                       .
        jmp     ltr_delay                       ; AFC8 4C 86 AF                 L..

; ----------------------------------------------------------------------------
; played once per correct letter at end of level08 (spellbound). trailing 00's are filler.
sfx_letter_bonus:
        .byte   $01,$A5,$00,$18,$04,$F3,$04,$00 ; AFCB 01 A5 00 18 04 F3 04 00  ........
        .byte   $00,$00,$00,$00,$00,$00,$00,$00 ; AFD3 00 00 00 00 00 00 00 00  ........
        .byte   $00,$00,$00,$00,$00,$00,$00,$00 ; AFDB 00 00 00 00 00 00 00 00  ........
        .byte   $00,$00,$00,$00,$00,$00,$00,$00 ; AFE3 00 00 00 00 00 00 00 00  ........
        .byte   $00,$00,$00,$00,$00,$00,$00,$00 ; AFEB 00 00 00 00 00 00 00 00  ........
        .byte   $00,$00,$00,$00,$00,$00,$00,$00 ; AFF3 00 00 00 00 00 00 00 00  ........
        .byte   $00,$00,$00,$00,$00             ; AFFB 00 00 00 00 00           .....
; blackout doesn't draw the map initially
l09_real_map:
        .byte   $FE,$33,$9C,$FD,$04,$00,$04,$07 ; B000 FE 33 9C FD 04 00 04 07  .3......
        .byte   $06,$24,$07,$02,$6C,$05,$04,$8C ; B008 06 24 07 02 6C 05 04 8C  .$..l...
        .byte   $05,$04,$28,$18,$04,$48,$15,$06 ; B010 05 04 28 18 04 48 15 06  ..(..H..
        .byte   $7C,$15,$04,$20,$25,$07,$68,$25 ; B018 7C 15 04 20 25 07 68 25  |.. %.h%
        .byte   $04,$04,$3B,$05,$28,$3B,$01,$34 ; B020 04 04 3B 05 28 3B 01 34  ..;.(;.4
        .byte   $3B,$04,$5C,$45,$08,$8C,$4B,$02 ; B028 3B 04 5C 45 08 8C 4B 02  ;.\E..K.
        .byte   $04,$55,$06,$38,$4D,$04,$04,$55 ; B030 04 55 06 38 4D 04 04 55  .U.8M..U
        .byte   $06,$54,$55,$12,$FD,$04,$FF,$58 ; B038 06 54 55 12 FD 04 FF 58  .TU....X
        .byte   $0A,$05,$1C,$54,$07,$FD,$04,$01 ; B040 0A 05 1C 54 07 FD 04 01  ...T....
        .byte   $2C,$08,$06,$3C,$26,$04,$FE,$5F ; B048 2C 08 06 3C 26 04 FE 5F  ,..<&.._
        .byte   $9C,$FD,$00,$04,$0C,$03,$0E,$3C ; B050 9C FD 00 04 0C 03 0E 3C  .......<
        .byte   $37,$05,$8C,$35,$05,$FE,$C9,$9C ; B058 37 05 8C 35 05 FE C9 9C  7..5....
        .byte   $1A,$0A,$06,$5E,$18,$09,$9A,$08 ; B060 1A 0A 06 5E 18 09 9A 08  ...^....
        .byte   $0B,$FE,$DA,$9C,$83,$04,$13,$FE ; B068 0B FE DA 9C 83 04 13 FE  ........
        .byte   $49,$9C                         ; B070 49 9C                    I.
l09_map_bombs:
        .byte   $04,$02,$01,$24,$02,$01,$44,$02 ; B072 04 02 01 24 02 01 44 02  ...$..D.
        .byte   $01,$78,$02,$01,$98,$02,$01,$3C ; B07A 01 78 02 01 98 02 01 3C  .x.....<
        .byte   $12,$01,$5C,$12,$01,$7C,$12,$01 ; B082 12 01 5C 12 01 7C 12 01  ..\..|..
        .byte   $24,$22,$01,$78,$22,$01,$04,$38 ; B08A 24 22 01 78 22 01 04 38  $".x"..8
        .byte   $01,$1C,$46,$01,$78,$42,$01,$04 ; B092 01 1C 46 01 78 42 01 04  ..F.xB..
        .byte   $52,$01,$58,$52,$01,$98,$52,$01 ; B09A 52 01 58 52 01 98 52 01  R.XR..R.
; blackout doesn't draw the map initially
l09_map:.byte   $FF                             ; B0A2 FF                       .
l09_bombs:
        .byte   $22,$00,$42,$00,$62,$00,$A2,$00 ; B0A3 22 00 42 00 62 00 A2 00  ".B.b...
        .byte   $C2,$00,$64,$00,$84,$00,$A4,$00 ; B0AB C2 00 64 00 84 00 A4 00  ..d.....
        .byte   $46,$00,$A6,$00,$28,$00,$4A,$00 ; B0B3 46 00 A6 00 28 00 4A 00  F...(.J.
        .byte   $AA,$00,$2C,$00,$8C,$00,$CC,$00 ; B0BB AA 00 2C 00 8C 00 CC 00  ..,.....
l09_bombs_term:
        .byte   $FF                             ; B0C3 FF                       .
; ----------------------------------------------------------------------------
; sets screen memory to $1000 and draws l09_real_map there. bombs are handled specially as they're blanks in the map.
blackout_init:
        jsr     special_init_jv                 ; B0C4 20 36 80                  6.
        lda     #$10                            ; B0C7 A9 10                    ..
        sta     SAVMSC+1                        ; B0C9 85 59                    .Y
        jsr     clear_screen_mem_jv             ; B0CB 20 1E 80                  ..
        lda     #$00                            ; B0CE A9 00                    ..
        sta     dm_progctr                      ; B0D0 85 C0                    ..
        lda     #$B0                            ; B0D2 A9 B0                    ..
        sta     dm_progctr+1                    ; B0D4 85 C1                    ..
        jsr     draw_map_jv                     ; B0D6 20 00 80                  ..
        ldx     #$07                            ; B0D9 A2 07                    ..
LB0DB:  lda     map_one_bomb_minus_one,x        ; B0DB BD 19 B1                 ...
        sta     $08FF,x                         ; B0DE 9D FF 08                 ...
        dex                                     ; B0E1 CA                       .
        bne     LB0DB                           ; B0E2 D0 F7                    ..
        lda     #$08                            ; B0E4 A9 08                    ..
        sta     $AA                             ; B0E6 85 AA                    ..
LB0E8:  lda     RANDOM                          ; B0E8 AD 0A D2                 ...
        and     #$0F                            ; B0EB 29 0F                    ).
        sta     $AB                             ; B0ED 85 AB                    ..
        tax                                     ; B0EF AA                       .
        lda     $0770,x                         ; B0F0 BD 70 07                 .p.
        bne     LB0E8                           ; B0F3 D0 F3                    ..
        inc     $0770,x                         ; B0F5 FE 70 07                 .p.
        txa                                     ; B0F8 8A                       .
        asl     a                               ; B0F9 0A                       .
        clc                                     ; B0FA 18                       .
        adc     $AB                             ; B0FB 65 AB                    e.
        tay                                     ; B0FD A8                       .
        lda     l09_map_bombs,y                 ; B0FE B9 72 B0                 .r.
        sta     $0903                           ; B101 8D 03 09                 ...
        lda     l09_map_bombs+1,y               ; B104 B9 73 B0                 .s.
        sta     $0904                           ; B107 8D 04 09                 ...
        lda     #$00                            ; B10A A9 00                    ..
        sta     dm_progctr                      ; B10C 85 C0                    ..
        lda     #$09                            ; B10E A9 09                    ..
        sta     dm_progctr+1                    ; B110 85 C1                    ..
        jsr     draw_map_jv                     ; B112 20 00 80                  ..
        dec     $AA                             ; B115 C6 AA                    ..
        bne     LB0E8                           ; B117 D0 CF                    ..
; 1-indexed
map_one_bomb_minus_one:
        rts                                     ; B119 60                       `

; ----------------------------------------------------------------------------
; used by blackout, copied to RAM and modified ($00's replaced with actual X and Y coords of bomb)
map_one_bomb:
        .byte   $FE,$B3,$9C,$00,$00,$01,$FF     ; B11A FE B3 9C 00 00 01 FF     .......
; ----------------------------------------------------------------------------
; make sure the user sees the bomb he's just picked up (?). at least 1 pixel of it already has to be visible, for collision detection to work.
blackout_bomb_sub:
        lda     #$10                            ; B121 A9 10                    ..
        sta     SAVMSC+1                        ; B123 85 59                    .Y
        lda     #$D9                            ; B125 A9 D9                    ..
        sta     dm_progctr                      ; B127 85 C0                    ..
        lda     #$06                            ; B129 A9 06                    ..
        sta     dm_progctr+1                    ; B12B 85 C1                    ..
        jsr     draw_map_jv                     ; B12D 20 00 80                  ..
        lda     #$30                            ; B130 A9 30                    .0
        sta     SAVMSC+1                        ; B132 85 59                    .Y
        lda     #$D9                            ; B134 A9 D9                    ..
        sta     dm_progctr                      ; B136 85 C0                    ..
        jsr     draw_map_jv                     ; B138 20 00 80                  ..
        lda     #$D9                            ; B13B A9 D9                    ..
        sta     dm_progctr                      ; B13D 85 C0                    ..
        rts                                     ; B13F 60                       `

; ----------------------------------------------------------------------------
; copies pixels from rendered real map at $1000 to visible screen memory at $3000, centered around jumpman's location
blackout_sub0:
        lda     start_falling_flag              ; B140 AD 21 06                 .!.
        bne     LB146                           ; B143 D0 01                    ..
LB145:  rts                                     ; B145 60                       `

; ----------------------------------------------------------------------------
LB146:  lda     player_x_pos                    ; B146 AD 7E 06                 .~.
        cmp     #$34                            ; B149 C9 34                    .4
        bcc     LB145                           ; B14B 90 F8                    ..
        cmp     #$C9                            ; B14D C9 C9                    ..
        bcs     LB145                           ; B14F B0 F4                    ..
        lda     #$0B                            ; B151 A9 0B                    ..
        sta     $97                             ; B153 85 97                    ..
        lda     player_x_pos                    ; B155 AD 7E 06                 .~.
        sec                                     ; B158 38                       8
        sbc     #$33                            ; B159 E9 33                    .3
        lsr     a                               ; B15B 4A                       J
        lsr     a                               ; B15C 4A                       J
        sta     $91                             ; B15D 85 91                    ..
        lda     player_y_pos                    ; B15F AD 83 06                 ...
        cmp     #$C3                            ; B162 C9 C3                    ..
        bcs     LB145                           ; B164 B0 DF                    ..
        jsr     LB1D2                           ; B166 20 D2 B1                  ..
        sec                                     ; B169 38                       8
        sbc     #$26                            ; B16A E9 26                    .&
        lsr     a                               ; B16C 4A                       J
        sta     $92                             ; B16D 85 92                    ..
        lda     #$28                            ; B16F A9 28                    .(
        sta     $90                             ; B171 85 90                    ..
        lda     #$00                            ; B173 A9 00                    ..
        sta     $93                             ; B175 85 93                    ..
        ldx     #$08                            ; B177 A2 08                    ..
LB179:  lsr     $90                             ; B179 46 90                    F.
        bcc     LB180                           ; B17B 90 03                    ..
        clc                                     ; B17D 18                       .
        adc     $92                             ; B17E 65 92                    e.
LB180:  ror     a                               ; B180 6A                       j
        ror     $93                             ; B181 66 93                    f.
        dex                                     ; B183 CA                       .
        bne     LB179                           ; B184 D0 F3                    ..
        sta     $94                             ; B186 85 94                    ..
        clc                                     ; B188 18                       .
        lda     $93                             ; B189 A5 93                    ..
        adc     $91                             ; B18B 65 91                    e.
        sta     $93                             ; B18D 85 93                    ..
        sta     $95                             ; B18F 85 95                    ..
        lda     $94                             ; B191 A5 94                    ..
        adc     #$10                            ; B193 69 10                    i.
        sta     $94                             ; B195 85 94                    ..
        clc                                     ; B197 18                       .
        lda     $94                             ; B198 A5 94                    ..
        adc     #$20                            ; B19A 69 20                    i 
        sta     $96                             ; B19C 85 96                    ..
LB19E:  ldx     #$04                            ; B19E A2 04                    ..
        ldy     #$00                            ; B1A0 A0 00                    ..
LB1A2:  lda     ($93),y                         ; B1A2 B1 93                    ..
        sta     ($95),y                         ; B1A4 91 95                    ..
        iny                                     ; B1A6 C8                       .
        dex                                     ; B1A7 CA                       .
        bne     LB1A2                           ; B1A8 D0 F8                    ..
        clc                                     ; B1AA 18                       .
        lda     $93                             ; B1AB A5 93                    ..
        adc     #$28                            ; B1AD 69 28                    i(
        sta     $93                             ; B1AF 85 93                    ..
        bcc     LB1B5                           ; B1B1 90 02                    ..
        inc     $94                             ; B1B3 E6 94                    ..
LB1B5:  clc                                     ; B1B5 18                       .
        lda     $95                             ; B1B6 A5 95                    ..
        adc     #$28                            ; B1B8 69 28                    i(
        sta     $95                             ; B1BA 85 95                    ..
        bcc     LB1C0                           ; B1BC 90 02                    ..
        inc     $96                             ; B1BE E6 96                    ..
LB1C0:  lda     $93                             ; B1C0 A5 93                    ..
        cmp     #$C0                            ; B1C2 C9 C0                    ..
        bne     LB1CD                           ; B1C4 D0 07                    ..
        lda     $94                             ; B1C6 A5 94                    ..
        cmp     #$1D                            ; B1C8 C9 1D                    ..
        bne     LB1CD                           ; B1CA D0 01                    ..
        rts                                     ; B1CC 60                       `

; ----------------------------------------------------------------------------
LB1CD:  dec     $97                             ; B1CD C6 97                    ..
        bne     LB19E                           ; B1CF D0 CD                    ..
        rts                                     ; B1D1 60                       `

; ----------------------------------------------------------------------------
LB1D2:  cmp     #$26                            ; B1D2 C9 26                    .&
        bcs     LB1DE                           ; B1D4 B0 08                    ..
        clc                                     ; B1D6 18                       .
        adc     #$02                            ; B1D7 69 02                    i.
        dec     $97                             ; B1D9 C6 97                    ..
        jmp     LB1D2                           ; B1DB 4C D2 B1                 L..

; ----------------------------------------------------------------------------
LB1DE:  rts                                     ; B1DE 60                       `

; ----------------------------------------------------------------------------
zero_filler_b1df:
        .byte   $00                             ; B1DF 00                       .
l10_map:.byte   $FE,$33,$9C,$FD,$04,$00,$04,$05 ; B1E0 FE 33 9C FD 04 00 04 05  .3......
        .byte   $06,$38,$05,$08,$7C,$05,$06,$24 ; B1E8 06 38 05 08 7C 05 06 24  .8..|..$
        .byte   $15,$06,$64,$15,$0E,$04,$2D,$06 ; B1F0 15 06 64 15 0E 04 2D 06  ..d...-.
        .byte   $38,$35,$0C,$04,$45,$06,$30,$45 ; B1F8 38 35 0C 04 45 06 30 45  85..E.0E
        .byte   $08,$88,$3C,$05,$04,$55,$08,$38 ; B200 08 88 3C 05 04 55 08 38  ..<..U.8
        .byte   $55,$06,$68,$55,$0D,$FD,$04,$01 ; B208 55 06 68 55 0D FD 04 01  U.hU....
        .byte   $1C,$2E,$07,$FD,$04,$FF,$64,$45 ; B210 1C 2E 07 FD 04 FF 64 45  ......dE
        .byte   $09,$FE,$5F,$9C,$FD,$00,$04,$0C ; B218 09 FE 5F 9C FD 00 04 0C  .._.....
        .byte   $01,$0B,$0C,$41,$05,$40,$01,$05 ; B220 01 0B 0C 41 05 40 01 05  ...A.@..
        .byte   $40,$31,$05,$8C,$01,$15,$FE,$DA ; B228 40 31 05 8C 01 15 FE DA  @1......
        .byte   $9C,$66,$30,$04,$FE,$B3,$9C     ; B230 9C 66 30 04 FE B3 9C     .f0....
l10_map_bombs:
        .byte   $04,$02,$01,$38,$02,$01,$7C,$02 ; B237 04 02 01 38 02 01 7C 02  ...8..|.
        .byte   $01,$38,$12,$01,$64,$12,$01,$98 ; B23F 01 38 12 01 64 12 01 98  .8..d...
        .byte   $12,$01,$04,$22,$01,$98,$39,$01 ; B247 12 01 04 22 01 98 39 01  ..."..9.
        .byte   $58,$47,$01,$04,$52,$01,$38,$52 ; B24F 58 47 01 04 52 01 38 52  XG..R.8R
        .byte   $01,$98,$52,$01,$FF             ; B257 01 98 52 01 FF           ..R..
l10_bombs:
        .byte   $22,$00,$62,$00,$A2,$00,$64,$00 ; B25C 22 00 62 00 A2 00 64 00  ".b...d.
        .byte   $84,$00,$C4,$00,$26,$00,$C8,$00 ; B264 84 00 C4 00 26 00 C8 00  ....&...
        .byte   $8A,$00,$2C,$00,$6C,$00,$CC,$00 ; B26C 8A 00 2C 00 6C 00 CC 00  ..,.l...
l10_bombs_term:
        .byte   $FF                             ; B274 FF                       .
l10_unkn0:
        .byte   $03,$A8,$B2,$0A,$A4,$20,$01,$56 ; B275 03 A8 B2 0A A4 20 01 56  ..... .V
        .byte   $FF                             ; B27D FF                       .
; ----------------------------------------------------------------------------
herethere_sub0:
        lda     $06F5                           ; B27E AD F5 06                 ...
        sta     $066C                           ; B281 8D 6C 06                 .l.
        bne     LB287                           ; B284 D0 01                    ..
        rts                                     ; B286 60                       `

; ----------------------------------------------------------------------------
LB287:  inc     bullet_y_delta+2                ; B287 EE 60 07                 .`.
        lda     bullet_y_delta+2                ; B28A AD 60 07                 .`.
        and     #$7F                            ; B28D 29 7F                    ).
        beq     LB292                           ; B28F F0 01                    ..
        rts                                     ; B291 60                       `

; ----------------------------------------------------------------------------
LB292:  inc     bullet_y_delta+3                ; B292 EE 61 07                 .a.
        lda     bullet_y_delta+3                ; B295 AD 61 07                 .a.
        and     #$07                            ; B298 29 07                    ).
        tax                                     ; B29A AA                       .
        lda     portal_x,x                      ; B29B BD D0 B2                 ...
        sta     $0680                           ; B29E 8D 80 06                 ...
        lda     portal_y,x                      ; B2A1 BD D8 B2                 ...
        sta     $0685                           ; B2A4 8D 85 06                 ...
        rts                                     ; B2A7 60                       `

; ----------------------------------------------------------------------------
; portal animation frames
herethere_sprite0:
        .byte   $00,$00,$00,$18,$18,$18,$18,$00 ; B2A8 00 00 00 18 18 18 18 00  ........
        .byte   $00,$00                         ; B2B0 00 00                    ..
herethere_sprite1:
        .byte   $00,$00,$3C,$24,$24,$24,$24,$3C ; B2B2 00 00 3C 24 24 24 24 3C  ..<$$$$<
        .byte   $00,$00                         ; B2BA 00 00                    ..
herethere_sprite2:
        .byte   $00,$7E,$42,$42,$42,$42,$42,$42 ; B2BC 00 7E 42 42 42 42 42 42  .~BBBBBB
        .byte   $7E,$00                         ; B2C4 7E 00                    ~.
herethere_sprite3:
        .byte   $FF,$81,$81,$81,$81,$81,$81,$81 ; B2C6 FF 81 81 81 81 81 81 81  ........
        .byte   $81,$FF                         ; B2CE 81 FF                    ..
; herethere portal X positions
portal_x:
        .byte   $A4,$4C,$52,$70,$86,$86,$A4,$82 ; B2D0 A4 4C 52 70 86 86 A4 82  .LRp....
; herethere portal Y positions
portal_y:
        .byte   $20,$20,$98,$C0,$B4,$80,$68,$40 ; B2D8 20 20 98 C0 B4 80 68 40    ....h@
; ----------------------------------------------------------------------------
herethere_sub3:
        lda     jiffy_timer_3_lo                ; B2E0 AD 19 06                 ...
        and     #$0F                            ; B2E3 29 0F                    ).
        bne     LB2F2                           ; B2E5 D0 0B                    ..
        lda     $068A                           ; B2E7 AD 8A 06                 ...
        and     #$03                            ; B2EA 29 03                    ).
        sta     $068A                           ; B2EC 8D 8A 06                 ...
        inc     $068A                           ; B2EF EE 8A 06                 ...
LB2F2:  lda     rot_color                       ; B2F2 AD 2A 06                 .*.
        sta     PCOLR2                          ; B2F5 8D C2 02                 ...
        lda     #$00                            ; B2F8 A9 00                    ..
        jmp     check_pl_coll_no_pl             ; B2FA 4C 79 8F                 Ly.

; ----------------------------------------------------------------------------
herethere_bomb_sub:
        lda     $0680                           ; B2FD AD 80 06                 ...
        sta     player_x_pos                    ; B300 8D 7E 06                 .~.
        lda     $0685                           ; B303 AD 85 06                 ...
        sta     player_y_pos                    ; B306 8D 83 06                 ...
        lda     #$19                            ; B309 A9 19                    ..
        sta     snd_ptr                         ; B30B 8D 3C 06                 .<.
        lda     #$B3                            ; B30E A9 B3                    ..
        sta     snd_ptr+1                       ; B310 8D 3D 06                 .=.
        lda     #$07                            ; B313 A9 07                    ..
        jsr     cue_sfx_jv                      ; B315 20 06 80                  ..
        rts                                     ; B318 60                       `

; ----------------------------------------------------------------------------
; referenced by herethere_bomb_sub
sxf_teleport:
        .byte   $01,$86,$00,$0A,$20,$00,$00     ; B319 01 86 00 0A 20 00 00     .... ..
l11_map:.byte   $FE,$33,$9C,$FD,$04,$00,$04,$05 ; B320 FE 33 9C FD 04 00 04 05  .3......
        .byte   $08,$2C,$07,$15,$84,$05,$06,$1C ; B328 08 2C 07 15 84 05 06 1C  .,......
        .byte   $15,$03,$48,$15,$0D,$04,$25,$07 ; B330 15 03 48 15 0D 04 25 07  ..H...%.
        .byte   $30,$2F,$0D,$04,$35,$06,$74,$35 ; B338 30 2F 0D 04 35 06 74 35  0/..5.t5
        .byte   $0A,$04,$45,$06,$04,$55,$06,$28 ; B340 0A 04 45 06 04 55 06 28  ..E..U.(
        .byte   $55,$06,$4C,$55,$06,$84,$50,$06 ; B348 55 06 4C 55 06 84 50 06  U.LU..P.
        .byte   $FD,$04,$FF,$1C,$34,$05,$70,$55 ; B350 FD 04 FF 1C 34 05 70 55  ....4.pU
        .byte   $05,$80,$06,$02,$FD,$04,$01,$24 ; B358 05 80 06 02 FD 04 01 24  .......$
        .byte   $06,$02,$FE,$5F,$9C,$FD,$00,$04 ; B360 06 02 FE 5F 9C FD 00 04  ..._....
        .byte   $0C,$01,$09,$0C,$41,$05,$30,$03 ; B368 0C 01 09 0C 41 05 30 03  ....A.0.
        .byte   $0B,$54,$2B,$0A,$8C,$01,$0D,$FE ; B370 0B 54 2B 0A 8C 01 0D FE  .T+.....
        .byte   $C9,$9C,$04,$38,$02,$1A,$38,$02 ; B378 C9 9C 04 38 02 1A 38 02  ...8..8.
        .byte   $33,$32,$07,$74,$38,$05,$FE,$DA ; B380 33 32 07 74 38 05 FE DA  32.t8...
        .byte   $9C,$6A,$12,$0F,$FE,$B3,$9C     ; B388 9C 6A 12 0F FE B3 9C     .j.....
l11_map_bombs:
        .byte   $04,$02,$01,$3A,$02,$01,$5A,$02 ; B38F 04 02 01 3A 02 01 5A 02  ...:..Z.
        .byte   $01,$7A,$02,$01,$98,$02,$01,$20 ; B397 01 7A 02 01 98 02 01 20  .z..... 
        .byte   $12,$01,$5A,$12,$01,$04,$22,$01 ; B39F 12 01 5A 12 01 04 22 01  ..Z...".
        .byte   $3A,$22,$01,$04,$32,$01,$78,$32 ; B3A7 3A 22 01 04 32 01 78 32  :"..2.x2
        .byte   $01,$98,$32,$01,$04,$52,$01,$38 ; B3AF 01 98 32 01 04 52 01 38  ..2..R.8
        .byte   $52,$01,$60,$52,$01,$FF         ; B3B7 52 01 60 52 01 FF        R.`R..
l11_bombs:
        .byte   $22,$10,$62,$20,$82,$30,$A2,$40 ; B3BD 22 10 62 20 82 30 A2 40  ".b .0.@
        .byte   $C2,$50,$44,$60,$84,$70,$26,$80 ; B3C5 C2 50 44 60 84 70 26 80  .PD`.p&.
        .byte   $66,$90,$28,$A0,$A8,$B0,$C8,$C0 ; B3CD 66 90 28 A0 A8 B0 C8 C0  f.(.....
        .byte   $2C,$D0,$6C,$E0,$8C,$F0         ; B3D5 2C D0 6C E0 8C F0        ,.l...
l11_bombs_term:
        .byte   $FF                             ; B3DB FF                       .
l11_map_changes:
        .byte   $00,$00,$FC,$B3,$06,$B4,$10,$B4 ; B3DC 00 00 FC B3 06 B4 10 B4  ........
        .byte   $06,$B4,$10,$B4,$1A,$B4,$24,$B4 ; B3E4 06 B4 10 B4 1A B4 24 B4  ......$.
        .byte   $2E,$B4,$38,$B4,$2E,$B4,$38,$B4 ; B3EC 2E B4 38 B4 2E B4 38 B4  ..8...8.
        .byte   $FC,$B3,$24,$B4,$1A,$B4,$42,$B4 ; B3F4 FC B3 24 B4 1A B4 42 B4  ..$...B.
        .byte   $FE,$49,$9C,$FD,$04,$00,$48,$15 ; B3FC FE 49 9C FD 04 00 48 15  .I....H.
        .byte   $03,$FF,$FE,$49,$9C,$FD,$04,$00 ; B404 03 FF FE 49 9C FD 04 00  ...I....
        .byte   $46,$07,$03,$FF,$FE,$49,$9C,$FD ; B40C 46 07 03 FF FE 49 9C FD  F....I..
        .byte   $04,$00,$6A,$07,$03,$FF,$FE,$49 ; B414 04 00 6A 07 03 FF FE 49  ..j....I
        .byte   $9C,$FD,$04,$00,$0A,$35,$03,$FF ; B41C 9C FD 04 00 0A 35 03 FF  .....5..
        .byte   $FE,$49,$9C,$FD,$04,$00,$3E,$2F ; B424 FE 49 9C FD 04 00 3E 2F  .I....>/
        .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  <U..U..C
        .byte   $06,$FE,$5F,$9C,$FD,$00,$04,$0C ; B5B0 06 FE 5F 9C FD 00 04 0C  .._.....
        .byte   $01,$09,$4C,$01,$09,$8C,$01,$09 ; B5B8 01 09 4C 01 09 8C 01 09  ..L.....
        .byte   $2A,$1F,$09,$6A,$1F,$09,$0C,$3F ; B5C0 2A 1F 09 6A 1F 09 0C 3F  *..j...?
        .byte   $05,$4C,$3F,$05,$8C,$3F,$05,$FE ; B5C8 05 4C 3F 05 8C 3F 05 FE  .L?..?..
        .byte   $B3,$9C                         ; B5D0 B3 9C                    ..
l12_map_bombs:
        .byte   $04,$02,$01,$20,$02,$01,$3C,$02 ; B5D2 04 02 01 20 02 01 3C 02  ... ..<.
        .byte   $01,$60,$02,$01,$7C,$02,$01,$98 ; B5DA 01 60 02 01 7C 02 01 98  .`..|...
        .byte   $02,$01,$04,$22,$01,$98,$22,$01 ; B5E2 02 01 04 22 01 98 22 01  ..."..".
        .byte   $3C,$36,$01,$60,$36,$01,$04,$52 ; B5EA 3C 36 01 60 36 01 04 52  <6.`6..R
        .byte   $01,$3C,$52,$01,$60,$52,$01,$98 ; B5F2 01 3C 52 01 60 52 01 98  .<R.`R..
        .byte   $52,$01,$FF                     ; B5FA 52 01 FF                 R..
l12_bombs:
        .byte   $22,$10,$42,$20,$62,$00,$82,$00 ; B5FD 22 10 42 20 62 00 82 00  ".B b...
        .byte   $A2,$30,$C2,$40,$26,$00,$C6,$00 ; B605 A2 30 C2 40 26 00 C6 00  .0.@&...
        .byte   $68,$00,$88,$00,$2C,$00,$6C,$00 ; B60D 68 00 88 00 2C 00 6C 00  h...,.l.
        .byte   $8C,$00,$CC,$00                 ; B615 8C 00 CC 00              ....
l12_bombs_term:
        .byte   $FF                             ; B619 FF                       .
l12_map_changes:
        .byte   $00,$00,$24,$B6,$2E,$B6,$3E,$B6 ; B61A 00 00 24 B6 2E B6 3E B6  ..$...>.
        .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,$06,$F3,$10,$A2,$10,$00 ; BFF2 ED BF 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                    ..