### GENERATED FILE, do not edit, edit main.info and mklevelinfo.pl instead # da65 info file for jumpman junior ROM. GLOBAL { OUTPUTNAME "jumpmanjr.dasm"; INPUTNAME "jumpmanjr.rom"; STARTADDR $8000; CPU "6502"; COMMENTS 4; }; label { name "VKEYBD"; addr $0208; comment "=== page 2 OS equates"; }; label { name "VKEYBD_hi"; addr $0209; }; label { name "SDMCTL"; addr $022f; }; label { name "GPRIOR"; addr $026f; }; label { name "PCOLR0"; addr $02c0; }; label { name "PCOLR1"; addr $02c1; }; label { name "PCOLR2"; addr $02c2; }; label { name "PCOLR3"; addr $02c3; }; label { name "COLOR0"; addr $02c4; }; label { name "COLOR1"; addr $02c5; }; label { name "COLOR2"; addr $02c6; }; label { name "COLOR3"; addr $02c7; }; label { name "COLOR4"; addr $02c8; }; label { name "CHBAS"; addr $02f4; }; label { name "HPOSP3"; addr $d003; comment "=== GTIA equates"; }; label { name "HPOSM0"; addr $d004; }; label { name "HPOSM1"; addr $d005; }; label { name "HPOSM2"; addr $d006; }; label { name "HPOSM3"; addr $d007; }; label { name "SIZEP2"; addr $d00a; }; label { name "SIZEP3"; addr $d00b; }; label { name "SIZEM"; addr $d00c; }; label { name "TRIG0"; addr $d010; }; label { name "GRAFM"; addr $d011; }; label { name "COLPM0"; addr $d012; }; label { name "COLPM1"; addr $d013; }; label { name "COLPF0"; addr $d016; }; label { name "COLPF1"; addr $d017; }; label { name "COLPF2"; addr $d018; }; label { name "COLPF3"; addr $d019; }; label { name "COLBK"; addr $d01a; }; label { name "PRIOR"; addr $d01b; }; label { name "GRACTL"; addr $d01d; }; label { name "HITCLR"; addr $d01e; }; label { name "CONSOL"; addr $d01f; }; label { name "AUDF1_minus_two"; addr $d1fe; comment "AUDF/AUDC regs are indexed from here"; }; label { name "AUDC1_minus_two"; addr $d1ff; }; label { name "AUDF1"; addr $d200; comment "=== POKEY equates"; }; label { name "AUDC1"; addr $d201; }; label { name "AUDF2"; addr $d202; }; label { name "AUDC2"; addr $d203; }; label { name "AUDF3"; addr $d204; }; label { name "AUDC3"; addr $d205; }; label { name "AUDF4"; addr $d206; }; label { name "AUDC4"; addr $d207; }; label { name "AUDCTL"; addr $d208; }; label { name "KBCODE"; addr $d209; }; label { name "RANDOM"; addr $d20a; }; label { name "IRQEN"; addr $d20e; }; label { name "SKCTL"; addr $d20f; }; label { name "PORTA"; addr $d300; }; label { name "DMACTL"; addr $d400; comment "=== ANTIC equates"; }; label { name "DLISTL"; addr $d402; }; label { name "DLISTH"; addr $d403; }; label { name "HSCROL"; addr $d404; }; label { name "PMBASE"; addr $d407; }; label { name "CHBASE"; addr $d409; }; label { name "WSYNC"; addr $d40a; }; label { name "NMIEN"; addr $d40e; }; label { name "SETVBV"; addr $e45c; }; label { name "XITVBV"; addr $e462; }; label { name "zero_filler_9a48"; addr $9a48; }; range { name "zero_filler_8588"; start $B588; end $B58f; type bytetable; }; range { name "zero_filler_85f6"; start $85f6; end $85ff; type bytetable; }; range { name "zero_filler_88be"; start $88BE; end $88C7; type bytetable; }; range { name "zero_filler_88f9"; start $88F9; end $88FF; type bytetable; }; range { name "zero_filler_8aee"; start $8aee; end $8afd; type bytetable; }; range { name "zero_filler_8b00"; start $8b00; end $8b22; type bytetable; }; range { name "zero_filler_8cb4"; start $8cb4; end $8cbb; type bytetable; }; range { name "zero_filler_8d97"; start $8D97; end $8D9F; type bytetable; }; range { name "zero_filler_8dcd"; start $8dcd; end $8dcd; type bytetable; }; range { name "zero_filler_8e67"; start $8e67; end $8e68; type bytetable; }; range { name "zero_filler_97f0"; start $97F0; end $97FF; type bytetable; }; range { name "zero_filler_9bcc"; start $9bcc; end $9bcf; type bytetable; }; range { name "zero_filler_9bff"; start $9bff; end $9bff; type bytetable; }; range { name "zero_filler_a3d6"; start $a3d6; end $a3df; type bytetable; }; range { name "zero_filler_b1df"; start $b1df; end $b1df; type bytetable; }; range { name "zero_filler_b7f1"; start $B7F1; end $B7FF; type bytetable; }; range { name "zero_filler_b8bf"; start $b8bf; end $b96a; type bytetable; }; range { name "zero_filler_baab"; start $baab; end $babb; type bytetable; }; label { name "cart_start_stub"; addr $8AFE; }; label { name "cart_entry_point"; addr $8ac0; }; label { name "check_keycode"; addr $9C07; }; label { name "store_speed_value"; addr $9C13; }; label { name "keyboard_isr_exit"; addr $9C0F; }; label { name "check_consol"; addr $88C8; }; label { name "ask_num_players"; addr $9400; }; label { name "sl_loop"; addr $96D8; }; label { name "materialize_jumpman"; addr $977B; }; label { name "mj_clear_loop"; addr $9782; }; label { name "mj_set_freq_and_color"; addr $97BB; }; label { name "mj_delay"; addr $97CD; }; label { name "mj_done"; addr $97DB; }; label { name "game_main_loop"; addr $9740; }; range { name "random_9b"; start $9BC6; end $9BC6; type bytetable; comment "filler, or leftover after a binary patch?"; }; label { name "copy_work_level_desc"; addr $9677; comment "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)"; }; label { name "randomize_level"; addr $9BED; comment "only after beating levels 1-12 in order"; }; label { name "enter_level"; addr $96BA; comment "maybe this should be check_level or init_level?"; }; label { name "copy_level_desc"; addr $96CE; comment "copy level descriptor from levelXX_desc at $A000+(level*$40) to cur_level_desc at $07c0-$07ff"; }; label { name "randomizer_mode"; addr $06F3; comment "only after beating levels 1-12 in order"; }; label { name "init_loop"; addr $8ac4; comment "clear pages 6 and 7"; }; label { name "set_vkeybd"; addr $83ED; comment "VKEYBD now points to $9c00 aka keyboard_isr"; }; label { name "set_vvblki"; addr $8401; comment "VVBLKI now points to $840d aka vblank_imm_isr"; }; label { name "vblank_imm_isr"; addr $840d; comment "service immediate vblank interrupt"; }; label { name "dli_chained_1"; addr $9B72; comment "changes DLI vector to point to dli_chained_2"; }; label { name "dli_chained_2"; addr $9B87; comment "changes DLI vector to point to dli_chained_3"; }; label { name "dli_chained_3"; addr $9BB1; comment "changes DLI vector to point to dli_chained_1"; }; label { name "update_color_regs"; addr $840F; comment "update color regs from shadow regs (X ranges 1 to 9, GRAFM+1 is COLPM0, $2bf+1 is PCOLR0)"; }; label { name "save_flags"; addr $8CDB; comment "we have to preserve the carry flag!"; }; label { name "check_extra_life"; addr $8CBC; comment "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."; }; label { name "check_extra_life_jv"; addr $800C; comment "should be called every time the score is updated, adds extra life every 7500 points"; }; label { name "score_mod_1m"; addr $B7C0; comment "roll over the score if it's >= 1 million"; }; label { name "score_below_1m"; addr $B7EE; }; label { name "spellbound_letters"; addr $AF58; comment "called at end of Spellbound, adds up letter bonus"; }; label { name "spellbound_got_all"; addr $AF5E; comment "got all the bombs"; }; label { name "bonus_250_pts"; addr $AF96; comment "per letter"; }; label { name "b250_hi_ok"; addr $AFB4; }; label { name "ltr_loop"; addr $AF6D; }; label { name "ltr_delay"; addr $AF86; comment "wait approx 1/3 second so user can see what happened"; }; label { name "ltr_wait"; addr $AF8B; }; label { name "ltr_skip"; addr $AF92; }; label { name "init_level"; addr $9682; comment "call start subroutine for current level"; }; label { name "set_level_colors"; addr $9691; comment "set color regs from level descriptor (COLOR4 always $00, black)"; }; label { name "jump_frame"; addr $06EB; comment "0 if not jumping, or frames since start of jump (range 1 to 21)"; }; range { name "code_99f7"; start $99F7; end $9A1B; type code; }; range { name "map_draw_1_blank"; start $8406; end $840c; type bytetable; comment "copied to $06d9 by code at copy_blank_1_map, possibly so it can be modified"; }; label { name "copy_blank_1_map"; addr $83F0; comment "stub => map_draw_1_blank-1"; }; range { name "jump_delta_x_table"; start $9a1c; end $9A5B; type bytetable; comment "used by continue_jump, the amount of X movement per frame of jumping (for either direction, left or right)"; }; label { name "jump_delta_y_table"; addr $9A32; comment "used by continue_jump, amount of Y movement per frame ($FE is -2, or 2 scanlines up, $02 is 2 scanlines down)"; }; label { name "jump_delta_x_table_minus_one"; addr $9A1B; comment "1-indexed..."; }; label { name "jump_delta_y_table_minus_one"; addr $9A31; comment "1-indexed..."; }; label { name "is_jump_done"; addr $99AE; comment "$15 aka 21 frames?"; }; range { name "gameboard_dlist_data"; start $9B62; end $9b71; type bytetable; comment "this isn't used as-is for a display list, see setup_gameboard_dlist"; }; RANGE { NAME "cartstart_left"; START $BFFA; END $BFFB ; TYPE AddrTable; comment "main entry point, note cartstart_left and cartstart_right point to the same address"; }; RANGE { NAME "cartstart_right"; START $9FFA; END $9FFB ; TYPE AddrTable; comment "main entry point, note cartstart_left and cartstart_right point to the same address"; }; RANGE { NAME "cartinit_left"; START $BFFE; END $BFFF ; TYPE AddrTable; comment "points to a CLC/RTS do-nothing routine (same as cartinit_right)"; }; RANGE { NAME "cartinit_right"; START $9FFE; END $9FFF ; TYPE AddrTable; comment "points to a CLC/RTS do-nothing routine (same as cartinit_left)"; }; range { name "cartpresent_left"; start $bffc; end $bffc; type bytetable; comment "0 here means 'cartridge present'"; }; range { name "cartpresent_right"; start $9ffc; end $9ffc; type bytetable; comment "0 here means 'cartridge present'"; }; range { name "cartoptions_left"; start $bffd; end $bffd; type bytetable; comment "4 here means init & start the cart, no disk boot, non-diagnostic"; }; range { name "cartoptions_right"; start $9ffd; end $9ffd; type bytetable; comment "4 here means init & start the cart, no disk boot, non-diagnostic"; }; label { name "VDSLST"; addr $0200; size 2; }; label { name "demo_map_ptr"; addr $00e0; size 2; comment "points to level_desc of each map in turn, during the 'show all levels' demo"; }; label { name "demo_name_offset"; addr $00e2; size 1; comment "offset from level_names to the name of each level in turn, during the 'show all levels' demo"; }; label { name "player_x_speed"; addr $95C5; size 20; comment "' PLAYER # SPEED? ' in PF2 color"; }; label { name "num_name_hscrol_table"; addr $95D9; size 4; comment "used for centering ONE TWO THREE FOUR, see option_key_handler"; }; label { name "number_names_0"; addr $95dd; size 4; comment "space space T space (names ONE TWO THREE FOUR)"; }; label { name "number_names_1"; addr $95e1; size 4; comment "O T H F"; }; label { name "number_names_2"; addr $95e5; size 4; comment "N W R O"; }; label { name "number_names_3"; addr $95e9; size 4; comment "E O E U"; }; label { name "number_names_4"; addr $95ed; size 4; comment "space space E R"; }; label { name "sfx_select_key"; addr $95f1; comment "played when select key pressed, 4 notes, descending"; }; label { name "unknown_95fd"; addr $95fd; comment "not sure what (if anything) reads this, it might be filler. it isn't valid 6502 code."; }; label { name "set_dma_ctl"; addr $838F; comment "std playfield, enable players + missiles, single-line p/m res, DMA enabled"; }; range { name "level_names"; start $BB00; end $bbef; type bytetable; }; range { name "pm_memory"; start $2800; end $2fff; type bytetable; }; range { name "missiles_and_masks"; start $82e0; end $82E7; type bytetable; }; label { name "missiles_and_masks_minus_one"; addr $82df; }; label { name "missiles_or_masks"; addr $82e4; }; label { name "missiles_or_masks_minus_one"; addr $82e3; }; range { name "missiles_done"; start $82DD; end $82df; type code; }; range { name "position_missiles"; start $8293; end $82DA; type code; }; label { name "pm_next"; addr $8295; }; label { name "skip_pos"; addr $82A6; }; label { name "next_plr"; addr $82F3; }; label { name "skip_vert"; addr $8338; }; label { name "cb1_loop"; addr $83F2; }; label { name "check_speed_timer"; addr $846E; }; label { name "check_time_bonus"; addr $847E; }; label { name "copy_level_vecs"; addr $84D9; comment "copy work_level vectors to page 6"; }; label { name "next_vec"; addr $84DB; }; label { name "skip_vec"; addr $84EE; }; label { name "skip_dli"; addr $853B; }; label { name "no_consol_pressed"; addr $858D; comment "this probably is what rotates the PLAYER SPEED prompt colors. not sure what it's doing with the page 6 vectors."; }; range { name "charset"; start $9e00; end $9ff9; type bytetable; comment "GR.1/2 font, 512 bytes"; }; range { name "game_display_list"; start $0881; end $08e3; type bytetable; comment "display list for game board"; }; range { name "title_display_list"; start $91B3; end $91ce; type bytetable; comment "display list for title screen"; }; range { name "numplayer_display_list"; start $955f; end $9577; type bytetable; comment "display list for 'number of players' screen"; }; label { name "setup_numplayer_dlist"; addr $9444; comment "set dlist shadow to point to numplayer_display_list"; }; label { name "setup_numplayer_dli_sr"; addr $944e; comment "set dli vector to point to num_player_dli_service"; }; label { name "anp_loop_done"; addr $9421; comment "X is now 0"; }; label { name "anp_clear_loop"; addr $940D; comment "clear area where NUMBER OF PLAYERS? will be displayed"; }; label { name "anp_copy_loop"; addr $9418; comment "copy NUMBER OF PLAYERS to screen RAM"; }; label { name "save_collisions"; addr $8503; comment "save contents of GTIA collision regs (X ranges 1 to $10, dli_vec_shadow_hi should read collision_save-1)"; }; label { name "check_pl_coll"; addr $8F73; size 1; comment "did any missile hit a player, or did players 2 or 3 hit a player..."; }; label { name "check_pl_coll_no_p2"; addr $8F76; size 1; comment "skip player 2 to player collisions, called with A=0, used by level 11"; }; label { name "check_pl_coll_no_pl"; addr $8F79; size 1; comment "skip player 2 and 3 to player collisions, called with A=0, used by levels 3 and 10"; }; label { name "check_collisions_2"; addr $981A; size 1; comment "did player 0 or 1 hit the playfield..."; }; label { name "check_collisions_3"; addr $9832; size 1; comment "movement/jumping only allowed if player's touching the playfield"; }; label { name "special_init"; addr $8B23; comment "various levels use this as their init, or use an init that calls this"; }; label { name "special_init_jv"; addr $8036; comment "various levels use this as their init, or use an init that calls this"; }; label { name "si_clear"; addr $8B27; comment "clear memory from $0760 to $077f"; }; label { name "si_done"; addr $8B7A; }; label { name "si_loop"; addr $8B39; }; label { name "special_init_2"; addr $8B2D; comment "special_init that doesn't clear memory. does anything use this entry point?"; }; label { name "special_init_2_jv"; addr $8039; comment "special_init that doesn't clear memory. unused vector?"; }; label { name "next_player"; addr $9AAA; comment "used in multiplayer games, also called in single player (?)"; }; label { name "next_player_jv"; addr $8027; comment "used in multiplayer games, also called in single player (?)"; }; label { name "mul_player_11"; addr $9A7C; comment "multiply current player number by 11, return result in Y"; }; label { name "add_11"; addr $9A82; }; label { name "return_y"; addr $9A8A; }; label { name "save_struct_user"; addr $9A8C; }; label { name "setup_blank_dlist"; addr $8AE0; comment "show blank screen with empty display list"; }; label { name "setup_blank_dlist_jv"; addr $803C; comment "show blank screen with empty display list"; }; label { name "draw_level"; addr $BA00; comment "calls draw_map, plays level intro music, shows level name"; }; label { name "draw_level_jv"; addr $802A; comment "calls draw_map, plays level intro music, shows level name"; }; label { name "mid_jump"; addr $99A8; size 1; comment "check & see if we're done jumping"; }; label { name "continue_jump"; addr $99BD; size 1; comment "we're in mid-jump and didn't hit anything, keep going"; }; label { name "end_jump"; addr $99B2; size 1; comment "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"; }; #label { name "collision_save"; addr $06B0; size 16; comment "save_collisions copies GTIA collision regs $D000-$d00f here"; }; label { name "sav_m0pf"; addr $06b0; comment "Missile 0 to playfield collision."; }; label { name "sav_m1pf"; addr $06b1; comment "Missile 1 to playfield collision."; }; label { name "sav_m2pf"; addr $06b2; comment "Missile 2 to playfield collision."; }; label { name "sav_m3pf"; addr $06b3; comment "Missile 3 to playfield collision."; }; label { name "sav_p0pf"; addr $06b4; comment "Player 0 to playfield collision."; }; label { name "sav_p1pf"; addr $06b5; comment "Player 1 to playfield collision."; }; label { name "sav_p2pf"; addr $06b6; comment "Player 2 to playfield collision."; }; label { name "sav_p3pf"; addr $06b7; comment "Player 3 to playfield collision."; }; label { name "sav_m0pl"; addr $06b8; comment "Missile 0 to player collision."; }; label { name "sav_m1pl"; addr $06b9; comment "Missile 1 to player collision."; }; label { name "sav_m2pl"; addr $06ba; comment "Missile 2 to player collision."; }; label { name "sav_m3pl"; addr $06bb; comment "Missile 3 to player collision."; }; label { name "sav_p0pl"; addr $06bc; comment "Player 0 to player collision."; }; label { name "sav_p1pl"; addr $06bd; comment "Player 1 to player collision."; }; label { name "sav_p2pl"; addr $06be; comment "Player 2 to player collision."; }; label { name "sav_p3pl"; addr $06bf; comment "Player 3 to player collision."; }; label { name "init_next_level"; addr $9BE8; size 1; comment "..."; }; label { name "show_get_ready_prompt"; addr $9624; size 1; comment "only in multiplayer games"; }; label { name "check_bomb_coll"; addr $87A0; size 1; comment "check whether Jumpman just touched a bomb (RTS if not)"; }; label { name "check_bomb_coll_jv"; addr $8033; size 1; comment "check whether Jumpman just touched a bomb (RTS if not)"; }; label { name "bomb_pickup"; addr $87A8; size 1; comment "Jumpman just touched a bomb, award points, play sfx_bomb_pickup, make the bomb disappear, etc."; }; label { name "coarse_grid"; addr $87C4; size 1; comment "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"; }; label { name "erase_bomb"; addr $8879; size 1; comment "make the bomb disappear by drawing sh_blank in its location"; }; label { name "wait_bomb"; addr $888A; size 1; comment "wait for bomb to really disappear"; }; label { name "bomb_add_points"; addr $8865; size 1; comment "add points to score for picking up bomb (theoretically different on every level, but really $64 aka 100 for all of them)"; }; label { name "call_bomb_sub"; addr $8856; size 1; comment "call bomb pickup subroutine for this level (which might just do an RTS if there's no special action)"; }; label { name "call_bomb_indirect_sub"; addr $883E; size 1; comment "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?)"; }; label { name "search_bomblist"; addr $87D0; size 1; comment "set Y to the index of the current bomb (or rts if we can't find it)"; }; label { name "bl_ok"; addr $87D7; size 1; }; label { name "bomb_found"; addr $87E0; size 1; }; label { name "bombloc"; addr $B6; size 1; comment "bomb_pickup: position of the bomb Jumpman just touched, on 8x8 coarse grid"; }; label { name "mul_y"; addr $87EA; size 1; comment "multiply Y by 1.5 (only works because Y will always be even at this point)"; }; label { name "store_bomb_coords"; addr $87F2; size 1; comment "store actual bomb coordinates (not the coarse ones) for bomb subs to use"; }; label { name "change_map"; addr $881B; size 1; comment "some bombs redraw parts of the level (e.g. disappearing platforms on level01)"; }; label { name "check_ind_sub"; addr $8831; size 1; comment "see if this bomb calls an indirect sub (none of them do in this game, this is useless code)"; }; label { name "blistptr"; addr $B4; size 2; comment "bomb_pickup: points to current level's bomblist"; }; range { name "gr7_or_masks"; start $8143; end $8152; type bytetable; }; range { name "gr7_and_masks"; start $8153; end $8156; type bytetable; }; range { name "sfx_bomb_pickup"; start $8892; end $88A7; type bytetable; comment "played when a bomb is picked up"; }; range { name "sfx_bonus_tick"; start $8DFA; end $8DFF; type bytetable; comment "played when bonus timer is decremented"; }; range { name "bullet_table"; start $8F43; end $8f72; type bytetable; comment "used by bullet_logic"; }; label { name "sfx_bullet"; addr $8f59; size 1; comment "bang!"; }; label { name "play_sfx_bullet"; addr $8EFB; size 1; comment "let player hear report"; }; label { name "set_bullet_dir"; addr $8EA7; size 1; comment "initial direction (before it fires)"; }; label { name "fire_bullet"; addr $8EEF; size 1; comment "fire! Y reg indexes table of directions"; }; label { name "player_y_pos"; addr $0683; size 1; comment "$C6 is the bottom of the level (where you end up when you die)"; }; label { name "player_x_pos"; addr $067E; size 1; comment "stored in HPOSP0"; }; label { name "bullet_x_pos"; addr $069B; size 1; comment "4 bytes, meaning we can never have >4 bullets on screen at once (makes sense, GTIA only has 4 missiles)"; }; label { name "bullet_y_pos_minus_one"; addr $069E; }; label { name "bullet_y_pos"; addr $069F; size 4; comment "another 4 bytes"; }; label { name "bullet_flags"; addr $0756; size 4; comment "4 bytes, 0 = bullet slot not in use, non-0 = bullet active"; }; label { name "bullet_x_delta"; addr $075A; size 4; comment "4 bytes"; }; label { name "bullet_y_delta"; addr $075E; size 4; comment "4 bytes"; }; label { name "fire_when_ready"; addr $8EB9; size 1; comment "fire at player if lined up with him, otherwise don't. either way we end up at move_bullet"; }; label { name "sbc3"; addr $8EC1; size 1; comment "aim at center of body mass!"; }; label { name "move_bullet"; addr $8F11; size 1; }; label { name "aim_bullet_y"; addr $8ED6; size 1; comment "take aim!"; }; label { name "aim_bullet_x"; addr $8EE4; size 1; comment "take aim!"; }; range { name "mus00_addr1"; start $8fc3; end $8fc4; type addrtable; comment "aka mus_struct_table, 5 bytes per entry"; }; range { name "mus00_addr2"; start $8fc5; end $8fc6; type addrtable; }; range { name "mus00_priority"; start $8fc7; end $8fc7; type bytetable; }; range { name "mus01_addr1"; start $8fc8; end $8fc9; type addrtable; }; range { name "mus01_addr2"; start $8fca; end $8fcb; type addrtable; }; range { name "mus01_priority"; start $8fcc; end $8fcc; type bytetable; }; range { name "mus02_addr1"; start $8fcd; end $8fce; type addrtable; comment "end of game tune"; }; range { name "mus02_addr2"; start $8fcf; end $8fd0; type addrtable; }; range { name "mus02_priority"; start $8fd1; end $8fd1; type bytetable; }; range { name "mus03_addr1"; start $8fd2; end $8fd3; type addrtable; }; range { name "mus03_addr2"; start $8fd4; end $8fd5; type addrtable; }; range { name "mus03_priority"; start $8fd6; end $8fd6; type bytetable; }; range { name "mus04_addr1"; start $8fd7; end $8fd8; type addrtable; }; range { name "mus04_addr2"; start $8fd9; end $8fda; type addrtable; }; range { name "mus04_priority"; start $8fdb; end $8fdb; type bytetable; }; range { name "mus05_addr1"; start $8fdc; end $8fdd; type addrtable; }; range { name "mus05_addr2"; start $8fde; end $8fdf; type addrtable; }; range { name "mus05_priority"; start $8fe0; end $8fe0; type bytetable; }; range { name "mus06_addr1"; start $8fe1; end $8fe2; type addrtable; }; range { name "mus06_addr2"; start $8fe3; end $8fe4; type addrtable; }; range { name "mus06_priority"; start $8fe5; end $8fe5; type bytetable; }; range { name "mus07_addr1"; start $8fe6; end $8fe7; type addrtable; }; range { name "mus07_addr2"; start $8fe8; end $8fe9; type addrtable; }; range { name "mus07_priority"; start $8fea; end $8fea; type bytetable; }; range { name "mus08_addr1"; start $8feb; end $8fec; type addrtable; comment "tune that plays while level is being drawn"; }; range { name "mus08_addr2"; start $8fed; end $8fee; type addrtable; }; range { name "mus08_priority"; start $8fef; end $8fef; type bytetable; }; range { name "mus09_addr1"; start $8ff0; end $8ff1; type addrtable; }; range { name "mus09_addr2"; start $8ff2; end $8ff3; type addrtable; }; range { name "mus09_priority"; start $8ff4; end $8ff4; type bytetable; }; range { name "mus10_addr1"; start $8ff5; end $8ff6; type addrtable; }; range { name "mus10_addr2"; start $8ff7; end $8ff8; type addrtable; }; range { name "mus10_priority"; start $8ff9; end $8ff9; type bytetable; }; range { name "mus11_addr1"; start $8ffa; end $8ffb; type addrtable; }; range { name "mus11_addr2"; start $8ffc; end $8ffd; type addrtable; }; range { name "mus11_priority"; start $8ffe; end $8ffe; type bytetable; }; range { name "empty_music_entry"; start $8fff; end $8fff; type bytetable; comment "empty music table entries point here"; }; label { name "snd_priority_tmp"; addr $0661; comment "??"; }; label { name "snd_slot_curpos"; addr $064E; size 2; comment "address we've got to so far, playing this sfx"; }; label { name "snd_slot_priority"; addr $063E; size 1; comment "priority of this sfx"; }; label { name "snd_lock"; addr $062F; size 1; comment "lets other code know cue_sfx is still running? not 100% sure"; }; label { name "inc_snd_pos"; addr $8231; size 1; comment "point to next byte in current sfx slot indexed by X"; }; label { name "snd_finished"; addr $8226; size 1; comment "done playing this sfx, free up the slot, X-indexed"; }; label { name "snd_next_note"; addr $817D; size 1; }; label { name "snd_player_entry"; addr $8157; size 1; comment "we have 4 slots (because POKEY has 4 voices), X counts down by 2 from 10 to 2 (at 0, the loop exits)"; }; label { name "next_snd_slot"; addr $815F; size 1; }; label { name "snd_exit"; addr $815E; size 1; }; label { name "is_slot_active"; addr $8168; size 1; comment "skip it, if slot is inactive"; }; label { name "cpos_hi_ok"; addr $8223; }; label { name "lp_ok"; addr $8248; comment "copy to sfx_ptr, fall thru to cue_sfx"; }; label { name "next_slot"; addr $825D; }; label { name "load_slot"; addr $8266; comment "found a free slot, use it"; }; label { name "bump_slot"; addr $8281; comment "couldn't find a free slot, look for a used slot with lower priority than this sfx has"; }; label { name "bump_try_next"; addr $8283; comment "until we find one, or ran out of slots to look at"; }; label { name "bump_fail"; addr $8285; comment "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)"; }; label { name "snd_slot_timer"; addr $063F; size 1; }; label { name "snd_slot_duration"; addr $0646; size 1; }; label { name "snd_play_note"; addr $8206; size 1; comment "y==0, a>=4 on entry"; }; label { name "snd_play_rest"; addr $819E; size 1; comment "y==0 on entry"; }; label { name "snd_set_audc"; addr $81AE; size 1; comment "y==0 on entry"; }; label { name "snd_jump_opcode"; addr $81C8; size 1; comment "I *think* this jumps to a different sfx address..."; }; label { name "snd_slot_audc"; addr $0647; size 1; }; range { name "sfx00"; start $BDF2; end $BE24; type bytetable; }; range { name "sfx01"; start $BE25; end $BE78; type bytetable; }; label { name "sfx_walk"; addr $be73; comment "horizontal movement"; }; label { name "play_sfx_walk"; addr $98C1; comment "horizontal movement"; }; range { name "sfx_extra_life"; start $BE79; end $BE8C; type bytetable; }; range { name "sfx02"; start $BE8D; end $BEAE; type bytetable; comment "end of game tune, melody"; }; range { name "sfx03"; start $BEAF; end $BED4; type bytetable; comment "end of game tune, bass"; }; range { name "sfx04"; start $BED5; end $BEEC; type bytetable; comment "end level tune #1, bass"; }; range { name "sfx05"; start $BEED; end $BF13; type bytetable; comment "end level tune #1, melody"; }; range { name "sfx06"; start $BF14; end $BF2F; type bytetable; comment "end level tune #2, melody"; }; range { name "sfx07"; start $BF30; end $BF49; type bytetable; comment "end level tune #2, bass"; }; range { name "sfx08"; start $BF4A; end $BF5F; type bytetable; comment "end level tune #3, bass"; }; range { name "sfx09"; start $BF60; end $BF83; type bytetable; comment "end level tune #3, melody"; }; range { name "sfx10"; start $BF84; end $BFA5; type bytetable; comment "end level tune #4, melody"; }; range { name "sfx11"; start $BFA6; end $BFBD; type bytetable; comment "end level tune #4, bass"; }; range { name "sfx_jump"; start $BFBE; end $BFCF; type bytetable; comment "jumping sound"; }; range { name "sfx13"; start $BFD0; end $BFE9; type bytetable; comment "funeral march melody"; }; range { name "sfx14"; start $BFEA; end $BFF3; type bytetable; comment "funeral march bass"; }; range { name "data_bff4"; start $BFF4; end $BFF9; type bytetable; comment "dunno yet (not code, don't look like audio)"; }; range { name "sfx15"; start $BABC; end $BAE9; type bytetable; comment "level intro music, melody"; }; range { name "sfx16"; start $BAEA; end $BAFF; type bytetable; comment "level intro music, bass"; }; range { name "code_8f38"; start $8F38; end $8F42; type code; }; range { name "try_to_write_rom_again"; start $9126; end $9133; type code; comment "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."; }; range { name "code_adb5"; start $ADB5; end $adc0; type code; }; range { name "code_adc1"; start $adc1; end $adc3; type code; }; label { name "replacement_block_char_minus_one"; addr $9133; comment "1-indexed..."; }; range { name "replacement_block_char"; start $9134; end $913b; type bytetable; }; label { name "fade_in_letters"; addr $913c; comment "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)."; }; label { name "ts_setup_sub0"; addr $905f; comment "set work_level_sub0 to fade_in_letters"; }; label { name "ts_clear_sub0"; addr $9114; comment "set work_level_sub0 to $06e6 (just an RTS)"; }; label { name "demo_mode"; addr $B96B; comment "display all the levels, happens if left idle at the title screen"; }; label { name "show_letter"; addr $9160; comment "$3000 is screen memory, at this point"; }; label { name "title_letters"; addr $928F; comment "JUMPMAN JUNIOR in screen codes with high bit set"; }; label { name "is_user_dead"; addr $9AD2; }; label { name "check_lives"; addr $9AE5; comment "if user hasn't been eliminated, but is out of lives, eliminate him"; }; label { name "user_alive"; addr $9AF5; comment "found the next user that isn't dead"; }; label { name "load_struct_user"; addr $9A9B; }; label { name "lsp_loop"; addr $9A9D; }; label { name "ssp_loop"; addr $9A8E; }; label { name "look_for_alive"; addr $9ACB; }; label { name "next_user_num"; addr $9AB8; comment "wraparound to 1 if > total users"; }; label { name "mul_11_table_minus_one"; addr $9afb; comment "1-indexed"; }; range { name "mul_11_table"; start $9AFC; end $9aff; type bytetable; }; range { name "num_players_dli_service"; start $9578; end $959a; type code; comment "DLI service routine, changes COLPF2, address gets stored in $6ae/$6af by code at $944e"; }; range { name "dli_service_2"; start $bdc7; end $bdd1; type code; comment "DLI service routine, changes COLBK, address gets stored in $6ae/$6af by code at $bc3c"; }; label { name "numplayers_screen_data_minus_one"; addr $959a; comment "1-indexed loop copies from here+1"; }; range { name "numplayers_screen_data"; start $959b; end $95ff; type bytetable; comment "'number of players?', gets copied to $3800, see option_key_handler"; }; range { name "sfx_add_life_bonus"; start $b896; end $b8a6; type bytetable; comment "played when adding bonus per life at end of level"; }; range { name "mul_25_table"; start $b8a7; end $b8be; type wordtable; comment "multiply by 25"; }; range { name "falling_table_1"; start $8a39; end $8a7f; type bytetable; }; label { name "falling_table_2"; addr $8A42; }; label { name "play_sfx_death"; addr $8936; }; range { name "status_window_contents"; start $86da; end $8713; type bytetable; comment "40 bytes, or 2 GR.1 lines of screen codes"; }; label { name "pnum_subtractors"; addr $8702; size 18; comment "3 bytes per table entry"; }; range { name "level_name_hscrol_table"; start $BBF0; end $BBff; type bytetable; comment "used for centering level name on gameboard"; }; range { name "well_done_map"; start $bcd9; end $bd51; type bytetable; comment "level map used for the WELL DONE screen, when you beat level 12"; }; label { name "well_done_scores"; addr $8D52; comment "well_done_screen jumps here via work_level_sub1"; }; label { name "wd_wait_scores"; addr $BC92; comment "wait for score screen to finish (I think, anyway)"; }; label { name "wd_xxx"; addr $BCB6; comment "display current user's score, number_of_users should be score-1 here."; }; label { name "wd_wait_dli"; addr $BC51; comment "wait until the dli has been set up (by vblank)"; }; label { name "wd_wait_32j"; addr $BC5E; comment "wait 32 jiffies (approx 1/2 sec)"; }; label { name "wd_wait_music"; addr $BCC1; comment "wait until music is done playing (not 100% sure though)"; }; label { name "print_total_score_msg"; addr $BCA3; comment "wait 32 jiffies (approx 1/2 sec)"; }; range { name "well_done_shape"; start $bda0; end $bdc6; type bytetable; comment "used to draw the large WELL DONE banner"; }; label { name "total_score_msg_minus_one"; addr $bdd1; comment "1-indexed"; }; label { name "dumbwaiter_sub0"; addr $A6BD; comment "gets called every frame"; }; label { name "dumbwaiter_sub3"; addr $A724; comment "gets called every frame"; }; label { name "dumbwaiter_setup"; addr $A68C; comment "gets called at start of level"; }; label { name "hellstones_sub0"; addr $A836; }; label { name "hellstones_sub3"; addr $A827; }; label { name "play_hellstone_sfx"; addr $A88D; }; label { name "sfx_hellstone"; addr $a90d; }; range { name "total_score_msg"; start $bdd2; end $bdf1; type bytetable; comment "screen codes, displayed by well_done_screen"; }; #range { name "data_b590"; start $B590; end $B690; type bytetable; }; range { name "wind_table_1"; start $B76B; end $b7bf; type bytetable; comment "used in level12"; }; label { name "wind_table_2"; addr $b771; }; label { name "electrocution_bomb_pickup"; addr $A498; comment "not sure what this actually does"; }; label { name "electrocution_done"; addr $A4DD; comment "turn off electrocution effect (?)"; }; label { name "electrocute"; addr $A509; comment "electrocution effect"; }; label { name "level03_collisions"; addr $A53D; comment "skip a couple of the collision regs, so we don't register a collision when Jumpman is being electrocuted"; }; label { name "start_jump"; addr $99A0; comment "start jumping, play sfx_jump"; }; range { name "l01_map"; start $A300; end $a365; type bytetable; comment "level map data starts here"; }; range { name "l01_map_bombs"; start $A366; end $A38A; type bytetable; comment "gfx_draw instructions for bombs, used by bomb_pickup to get bomb coords. $ff terminated"; }; range { name "l01_bombs"; start $A38B; end $a3a2; type bytetable; comment "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"; }; range { name "l01_bombs_term"; start $a3a3; end $a3a3; type bytetable; comment "terminator for l01_bombs"; }; range { name "l01_map_changes"; start $A3A4; end $a3ad; type addrtable; comment "0000 = no change"; }; range { name "l01_map_change_0"; start $A3AE; end $a3d5; type bytetable; }; label { name "l01_map_change_1"; addr $a3b8; }; label { name "l01_map_change_2"; addr $a3c2; }; label { name "l01_map_change_3"; addr $a3cc; }; range { name "l02_map"; start $A3e0; end $a445; type bytetable; comment "level map data starts here"; }; range { name "l02_map_bombs"; start $A446; end $a476; type bytetable; }; range { name "l02_bombs"; start $A477; end $a496; type bytetable; }; range { name "l02_bombs_term"; start $A497; end $a497; type bytetable; }; range { name "elec_bomb_table"; start $A542; end $A5EF; type bytetable; comment "dunno exactly how it's used yet, referenced by electrocution_bomb_pickup"; }; range { name "l03_map"; start $A5F0; end $a62e; type bytetable; comment "level map data starts here"; }; range { name "l03_map_bombs"; start $a62f; end $a653; type bytetable; }; range { name "l03_bombs"; start $a654; end $a66b; type bytetable; }; range { name "l03_bombs_term"; start $a66c; end $a66c; type bytetable; }; range { name "l03_unkn"; start $a66d; end $a684; type bytetable; }; range { name "sfx_electrocution"; start $A52D; end $A53C; type bytetable; }; range { name "dumbwaiter_sprite"; start $a782; end $a78f; type bytetable; comment "the dumbwaiters from level03. stored upside-down. trailing 00's might just be filler."; }; range { name "dw_platform_sprite"; start $A685; end $a68b; type bytetable; comment "horizontally moving platforms from level03"; }; range { name "l04_map"; start $a790; end $a7d4; type bytetable; comment "level map data starts here"; }; range { name "l04_map_bombs"; start $a7d5; end $a805; type bytetable; }; range { name "l04_bombs"; start $a806; end $a825; type bytetable; }; range { name "l04_bombs_term"; start $a826; end $a826; type bytetable; }; range { name "l05_map"; start $aad0; end $ab41; type bytetable; comment "level map data starts here"; }; range { name "l05_map_bombs"; start $ab42; end $ab6c; type bytetable; }; range { name "l05_bombs"; start $ab6d; end $ab88; type bytetable; }; range { name "l05_bombs_term"; start $ab89; end $ab89; type bytetable; }; range { name "l05_map_changes"; start $ab8a; end $ac5f; type bytetable; }; range { name "hellstone_deltas_1"; start $a8fd; end $a91f; type bytetable; comment "dunno, look like movement deltas, referenced by hellstones_sub0"; }; label { name "hellstone_deltas_2"; addr $a905; size 8; comment "dunno, look like movement deltas, referenced by hellstones_sub0"; }; range { name "l06_map"; start $a920; end $a973; type bytetable; }; range { name "l06_map_bombs"; start $a974; end $a9a4; type bytetable; }; range { name "l06_bombs"; start $a9a5; end $a9c4; type bytetable; }; range { name "l06_bombs_term"; start $a9c5; end $a9c5; type bytetable; }; label { name "walls_bomb_sub"; addr $AA73; comment "toggles the center rope between up and down ropes"; }; label { name "walls_init"; addr $A9C6; }; label { name "walls_sub0"; addr $AA3A; }; label { name "walls_sub1"; addr $AA35; }; label { name "walls_sub2"; addr $AA55; }; label { name "walls_sub3"; addr $AABC; }; range { name "l07_map"; start $ac60; end $acb9; type bytetable; }; range { name "l07_map_bombs"; start $acba; end $ace4; type bytetable; }; range { name "l07_bombs"; start $ace5; end $ad00; type bytetable; }; range { name "l07_bombs_term"; start $ad01; end $ad01; type bytetable; }; range { name "l07_map_changes"; start $ad02; end $ad67; type bytetable; }; range { name "zigzag_deltas"; start $adc7; end $addf; type bytetable; comment "kind of a sine wave shape. used for either X or Y delta, depending on the direction the bullet is moving"; }; range { name "l08_map"; start $ade0; end $ae4b; type bytetable; }; range { name "l08_map_bombs"; start $ae4c; end $ae70; type bytetable; }; range { name "l08_bombs"; start $ae71; end $ae88; type bytetable; }; range { name "l08_bombs_term"; start $ae89; end $ae89; type bytetable; }; range { name "l08_unkn0"; start $ae8a; end $ae9a; type bytetable; }; label { name "spellbound_bomb_sub"; addr $AF23; }; label { name "spellbound_init"; addr $AE9B; }; range { name "l09_real_map"; start $b000; end $b0a2; type bytetable; comment "blackout doesn't draw the map initially"; }; #range { name "l09_map"; start $b0a2; end $b0a2; type bytetable; comment "blackout doesn't draw the map initially"; }; #range { name "l09_map_bombs"; start $b072; end $b0a2; type bytetable; }; label { name "l09_map_bombs"; addr $b072; size $21; }; range { name "l09_bombs"; start $b0a3; end $b0c2; type bytetable; }; range { name "l09_bombs_term"; start $b0c3; end $b0c3; type bytetable; }; label { name "l09_map"; addr $b0a2; comment "blackout doesn't draw the map initially"; }; label { name "blackout_bomb_sub"; addr $B121; comment "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."; }; label { name "blackout_init"; addr $B0C4; comment "sets screen memory to $1000 and draws l09_real_map there. bombs are handled specially as they're blanks in the map."; }; label { name "blackout_sub0"; addr $B140; comment "copies pixels from rendered real map at $1000 to visible screen memory at $3000, centered around jumpman's location"; }; label { name "herethere_sub0"; addr $B27E; }; label { name "herethere_sub3"; addr $B2E0; }; range { name "l10_map"; start $B1E0; end $b236; type bytetable; }; range { name "l10_map_bombs"; start $b237; end $b25b; type bytetable; }; range { name "l10_bombs"; start $b25c; end $b273; type bytetable; }; range { name "l10_bombs_term"; start $b274; end $b274; type bytetable; }; range { name "l10_unkn0"; start $b275; end $b27d; type bytetable; }; label { name "herethere_bomb_sub"; addr $B2FD; }; label { name "hatch_sub0"; addr $B457; }; label { name "hatch_sub1"; addr $B581; }; label { name "hatch_sub3"; addr $B57C; }; range { name "l11_map"; start $B320; end $b38e; type bytetable; }; range { name "l11_map_bombs"; start $B38F; end $B3BC; type bytetable; }; range { name "l11_bombs"; start $B3BD; end $b3da; type bytetable; }; range { name "l11_bombs_term"; start $b3db; end $b3db; type bytetable; }; range { name "l11_map_changes"; start $B3DC; end $b44b; type bytetable; }; label { name "hatch_bomb_sub"; addr $B44C; }; label { name "hurr_sub0"; addr $b691; }; label { name "falling_wind"; addr $B697; comment "wind blows jumpman to the right when he's dying"; }; label { name "hurr_done"; addr $B69A; }; label { name "hurr_sub1"; addr $b69b; }; label { name "hurr_sub2"; addr $B709; }; range { name "l12_map"; start $b590; end $b5d1; type bytetable; }; range { name "l12_map_bombs"; start $b5d2; end $b5fc; type bytetable; }; range { name "l12_bombs"; start $b5fd; end $b618; type bytetable; }; range { name "l12_bombs_term"; start $b619; end $b619; type bytetable; }; range { name "l12_map_changes"; start $b61a; end $b657; type bytetable; }; range { name "l12_unkn0"; start $b658; end $b690; type bytetable; }; range { name "walls_down_rope"; start $aa90; end $aabb; type bytetable; comment "map data for center down-rope, referenced by walls_bomb_sub"; }; range { name "data_aac8"; start $aac8; end $aacf; type bytetable; comment "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!)"; }; label { name "walls_up_rope"; addr $aaa6; comment "map data for center up-rope, referenced walls_bomb_sub"; }; range { name "spellbound_table"; start $aea4; end $af0b; type bytetable; comment "used by spellbound, dunno exactly how yet"; }; label { name "epyx_jumpman"; addr $AEAF; comment "letters for level08, spellbound (not ASCII or screencodes though)"; }; label { name "letter_bitmap"; addr $AEBC; comment "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)"; }; range { name "bonus_250"; start $AF0C; end $AF1B; type bytetable; comment "the little 250 that gets displayed at end of level, for each letter"; }; range { name "sfx_letter_bonus"; start $AFCB; end $afff; type bytetable; comment "played once per correct letter at end of level08 (spellbound). trailing 00's are filler."; }; label { name "cue_letter_sfx"; addr $AFB9; comment "play sfx_letter_bonus"; }; label { name "stub"; addr $8405; comment "just an RTS"; }; range { name "rotating_colors"; start $85b6; end $85bd; type bytetable; comment "used for color-shifting objects like electrocution, walls, and the bonus counter. every frame, the next one of these is stored in rot_color."; }; label { name "rot_color"; addr $062A; comment "see comment at rotating_colors"; }; label { name "page6_vectors_minus_one"; addr $05ff; comment "1-indexed"; }; label { name "page6_initial_vectors_minus_one"; addr $85dd; comment "1-indexed"; }; range { name "page6_initial_vectors"; start $85de; end $85f5; type addrtable; comment "copied into page 6 by init_hardware"; }; label { name "page6_vectors"; addr $0600; size 24; comment "initialized with page6_initial_vectors"; }; label { name "zigzag_sub0"; addr $AD68; comment "move bullets in ways that defy the laws of physics and common sense"; }; label { name "no_bullet"; addr $8E75; }; label { name "want_bullet"; addr $8E76; comment "create a bullet unless there are already max_bullets of them"; }; label { name "next_bullet_slot"; addr $8E78; }; range { name "movement_direction_table"; start $85be; end $85dd; type wordtable; comment "X/Y movement, indexed by joystick_state << 1, each entry is XXYY, $FF is -1"; }; range { name "get_ready_msg"; start $9714; end $9726; type bytetable; comment "PLAYER GET READY"; }; range { name "pcolor0_table"; start $8B7B; end $8b7f; type bytetable; }; range { name "color0_table"; start $9728; end $972b; type bytetable; comment "background colors for GET READY screen (different for each player)"; }; range { name "color0_table_minus_one"; start $9727; end $9727; type bytetable; comment "1-indexed"; }; range { name "level_gfx"; start $9C21; end $9cff; type bytetable; comment "definitions for level graphics objects aka shapes. (girder segment, ladder, rope, etc)"; }; label { name "sh_girder"; addr $9C33; comment "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"; }; label { name "sh_black_4x3"; addr $9C49; comment "all the bombs on blackout are drawn as this"; }; label { name "sh_ladder"; addr $9C5F; }; label { name "sh_black_ladder"; addr $9c89; comment "ladder in black pixels, used for erasing ladders"; }; label { name "sh_bomb"; addr $9cb3; }; label { name "sh_up_rope"; addr $9cc9; }; label { name "sh_down_rope"; addr $9cda; }; label { name "sh_black_2x4"; addr $9ceb; comment "not sure where this is used, probably for erasing ropes"; }; range { name "sprite_table"; start $9d00; end $9de5; type bytetable; comment "jumpman's animation frames, 10 bytes per sprite"; }; range { name "feet_table"; start $9de6; end $9dff; type bytetable; comment "jumpman's 'invisible shadow', extends below his feet, in black. Not sure all these bytes are used for this purpose though."; }; range { name "sxf_teleport"; start $b319; end $b31f; type bytetable; comment "referenced by herethere_bomb_sub"; }; range { name "herethere_sprite0"; start $b2a8; end $B2b1; type bytetable; comment "portal animation frames"; }; range { name "herethere_sprite1"; start $b2b2; end $b2bb; type bytetable; }; range { name "herethere_sprite2"; start $b2bc; end $b2c5; type bytetable; }; range { name "herethere_sprite3"; start $b2c6; end $B2cf; type bytetable; }; range { name "portal_x"; start $B2D0; end $B2d7; type bytetable; comment "herethere portal X positions"; }; range { name "portal_y"; start $B2D8; end $B2df; type bytetable; comment "herethere portal Y positions"; }; range { name "hatch_table_b50b"; start $b50b; end $B57b; type bytetable; comment "dunno what this is for yet"; }; range { name "scores_screen_dlist"; start $8C52; end $8C67; type bytetable; comment "a GR.2-ish DL, with DLIs, screen mem at $3000, for player scores screen"; }; label { name "reyalp_msg_minus_one"; addr $8c67; }; label { name "show_reyalp_msg"; addr $8BC0; comment "shows PLAYER (backwards loop)"; }; label { name "reyalp_msg_loop"; addr $8BC2; }; label { name "check_10th"; addr $8BC8; comment "replace 10th char with the ASCII player (user) number"; }; label { name "continue_loop"; addr $8BD5; }; label { name "check_alive"; addr $8BE9; comment "user still has lives left?"; }; label { name "no_cross"; addr $8BEF; }; label { name "what_are_we_waiting_for"; addr $8C39; comment "I *think* we're waiting for the music to finish playing..."; }; label { name "check_falling_1"; addr $9800; comment "called via vector in page 6"; }; label { name "check_falling_2"; addr $8900; comment "called via vector in page 6"; }; label { name "bullet_logic"; addr $8E69; comment "not sure what $0622, $0623 are for yet"; }; label { name "rand_1_to_3"; addr $8E86; comment "A = rand() % 3 + 1; // bullets only come from left, right, or top (never bottom)"; }; label { name "bullet_table_minus_one"; addr $8F42; comment "1-indexed"; }; label { name "start_falling_flag"; addr $0621; comment "reset to 0 every frame, set to 1 when starting to fall"; }; label { name "check_ground"; addr $980E; comment "we're falling, have we hit the ground yet?"; }; label { name "cf_done"; addr $9805; }; label { name "falling_flag"; addr $0623; comment "0 = ok, 1 = falling, 2 = on ground."; }; label { name "jiffy_timer_1"; addr $061A; comment "gets incremented every frame"; }; label { name "jiffy_timer_2"; addr $061B; comment "gets incremented every frame"; }; label { name "jiffy_timer_3_lo"; addr $0619; comment "gets incremented every frame"; }; label { name "jiffy_timer_3_hi"; addr $A2; comment "gets incremented every time 3_lo wraps around to zero"; }; label { name "no_wrap"; addr $841F; }; label { name "sfx_title_v0"; addr $9300; comment "title screen music. only use of 4-part harmony in the game, this and _v1 _v2 _v3."; }; label { name "sfx_title_v1"; addr $9351; }; label { name "sfx_title_v2"; addr $939C; }; label { name "sfx_title_v3"; addr $93D7; }; label { name "skip_space"; addr $9144; comment "don't 'fade-in' the space in the title (offset 7)"; }; label { name "rotate_hue"; addr $9154; comment "the luminance stays the same"; }; label { name "turn_letter_white"; addr $9164; comment "clear the high 2 bits on the letter, in screen memory"; }; label { name "title_dancing"; addr $9172; comment "make jumpmen dance on title screen, called once/frame"; }; label { name "start_dancing"; addr $90BC; comment "set _sub0 to title_dancing"; }; label { name "odd_frame_flag"; addr $061C; comment "a 1-bit frame counter (toggles every frame). possibly unused."; }; label { name "bonus_jiffy_timer"; addr $0626; comment "gets incremented every frame when playing a level, bonus-=100 when this wraps around to 0"; }; label { name "speed_jiffy_timer"; addr $061E; comment "counts 0..initial_speed"; }; label { name "playing_level"; addr $0627; comment "0 = not playing, non-0 = playing"; }; label { name "no_dec_bonus"; addr $848B; }; label { name "add_time_bonus"; addr $8E0F; comment "score += time_bonus;"; }; label { name "lt_64k"; addr $8E27; }; label { name "wait_32_jiffies"; addr $8E3A; comment "533ms ntsc, 640ms pal"; }; label { name "pick_random_music"; addr $8E41; comment "pick random sound effect between 4 and 7"; }; label { name "cue_music"; addr $8F92; comment "setup to play whichever music is in A reg, using 5-byte sfx stuct (a music is a pair of sfx played simultaneously)"; }; label { name "cue_music_jv"; addr $8018; comment "setup to play whichever music is in A reg, using 5-byte sfx stuct"; }; label { name "cue_sfx_jv"; addr $8006; comment "setup to play sfx"; }; label { name "cue_sfx"; addr $8255; comment "setup to play sfx at *sfx_ptr, priority in A"; }; label { name "cue_sfx_lowprior"; addr $8240; comment "if cue_sfx not already in progress, setup to play sfx at (sfx_slot_priority, sfx_lock), priority A"; }; label { name "cue_sfx_lowprior_jv"; addr $8003; comment "if cue_sfx not already in progress, setup to play sfx at (sfx_slot_priority, sfx_lock), priority A"; }; label { name "snd_ptr"; addr $063C; size 2; }; label { name "cue_ok"; addr $8244; size 1; }; label { name "cue_done"; addr $8278; size 1; }; label { name "inc_done"; addr $823F; size 1; }; label { name "wait_3_sec"; addr $8C4A; comment "wait 192 jiffies: 3.2 sec (ntsc), 3.84 sec (pal)"; }; label { name "not_alive"; addr $8BEB; comment "no, show a cross instead of a space"; }; label { name "store_space"; addr $8BE2; comment "$AF is the character to show after the score (space for alive, cross for dead)"; }; range { name "reyalp_msg"; start $8C68; end $8C7a; type bytetable; comment "PLAYER spelled backwards: ' 0 # REYALP '"; }; range { name "scores_msg"; start $8C7b; end $8C81; type bytetable; comment "' SCORES' in color 3"; }; range { name "blank_dlist_8add"; start $8ADD; end $8adf; type bytetable; comment "yet another jump-to-itself empty display list"; }; range { name "blank_dlist_8aeb"; start $8AEB; end $8aed; type bytetable; comment "another jump-to-itself empty display list"; }; range { name "blank_dlist_8c82"; start $8C82; end $8C84; type bytetable; comment "looks like an empty jump-to-itself dlist"; }; label { name "init_game"; addr $9000; comment "called from cart_entry_point routine"; }; label { name "reinit_game"; addr $900C; comment "this entry point doesn't disable start/option keys"; }; label { name "try_to_write_rom"; addr $9022; comment "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."; }; label { name "setup_select_key_vec"; addr $901b; comment "set select key vector to ask_num_players at $9400, enable select key"; }; label { name "setup_select_key_vec_again"; addr $9517; comment "set select key vector to ask_num_players at $9400, enable select key"; }; label { name "disable_start_opt"; addr $94EC; comment "disable start and option keys"; }; label { name "init_speed"; addr $952a; comment "initialize speed to -1"; }; label { name "wait_for_speed"; addr $952F; comment "wait for keyboard IRQ handler to set a speed <= 8"; }; label { name "speed_to_ascii"; addr $9540; comment "convert to ASCII digit"; }; label { name "add_11_to_x"; addr $953B; comment "11-byte per-user struct?"; }; label { name "struct_user_lives_offsets_minus_one"; addr $8C88; }; label { name "struct_user_lives_offsets"; addr $8C89; comment "lookup table, offset from $713 to lives for indexed user"; }; label { name "show_scores_screen"; addr $8C22; comment "set dlist shadow to scores_screen_dlist"; }; label { name "display_speed"; addr $9542; comment "show it to the user"; }; label { name "speed_value"; addr $06F9; comment "decoded speed (1-8)"; }; label { name "show_player_speed_prompt"; addr $94F9; comment "copy PLAYER #n SPEED? to screen RAM"; }; label { name "psprompt_loop"; addr $94fb; }; range { name "get_ready_dlist"; start $972c; end $973f; type bytetable; comment "112 blank scanlines, then one GR.2 line, loaded from $0742"; }; range { name "score_offsets"; start $8C85; end $8c8c; type bytetable; comment "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"; }; label { name "score_screen_dli_sr"; addr $8C8D; comment "used by score screen"; }; label { name "set_score_screen_dli"; addr $8C31; comment "dli = score_screen_dli_sr"; }; range { name "title_screen_data"; start $91cf; end $93ff; type bytetable; comment "title screen data"; }; label { name "title_screen_data_minus_one"; addr $91ce; }; label { name "copy_title_screen"; addr $902A; }; label { name "wait_letters_done"; addr $906E; comment "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)"; }; label { name "funky_init_loop"; addr $90C8; comment "lot going on here, not understood yet"; }; label { name "scores_screen"; addr $8B80; comment "show scores, called at end of game, also called after beating level 12 (after WELL DONE). $40 in NMIEN = disable DLI, enable VBI"; }; label { name "ss_loop"; addr $8BA8; comment "number_of_users should be score-1 here."; }; label { name "smsg_loop"; addr $8B91; }; label { name "read_joystick"; addr $84AC; comment "always joystick #1 (all players use the same joystick and pass it around)"; }; label { name "check_joystick_enabled"; addr $84A4; comment "read the joystick if not disabled"; }; label { name "fake_read_trigger"; addr $84CD; comment "??"; }; label { name "read_trigger"; addr $84D3; comment "always joystick #1"; }; label { name "store_joystick_state"; addr $84B1; comment "store bottom 4 bits of PORTA, or 0 if joystick_disabled"; }; label { name "clear_collisions"; addr $850D; }; label { name "update_dlist"; addr $8510; comment "update display list, if there's a new one in the shadow reg"; }; label { name "update_dli_vector"; addr $8523; comment "update DLI vector, if there's a new one in the shadow reg"; }; label { name "setup_get_ready_dl"; addr $964A; comment "06ac/06ad gets address of get_ready_dlist (why not SDLSTL/H?)"; }; label { name "end_of_level_bonus"; addr $B800; }; label { name "keycode_table_minus_one"; addr $9c18; }; range { name "keyboard_isr"; start $9C00; end $9c18; type code; comment "only use of keyboard is to enter player speed(s) before starting game"; }; range { name "keycode_table"; start $9C19; end $9c20; type bytetable; }; #label { name "mul_25_table"; addr $B8A7; size 2; }; label { name "init_hardware"; addr $837c; }; label { name "init_page6_loop"; addr $837e; }; # these are so far only for player 1 label { name "users_still_alive"; addr $06f4; size 1; comment "I *think* that's what this is for."; }; label { name "number_of_users"; addr $06ff; size 1; comment "number of players selected at start of game. also this is score-1, if you see it being 1-indexed with X reg"; }; label { name "level"; addr $06f6; size 1; }; # this stuff is also going to be called work_user (an 11-byte struct) label { name "score"; addr $0700; size 3; comment "aka work_user, 11 bytes"; }; label { name "next_extra_life"; addr $0703; size 3; comment "initialized to $4c,$1d (aka 7500), 7500 is added whenever an extra life is given"; }; label { name "lives"; addr $070a; size 1; }; label { name "struct_user_1"; addr $070b; comment "11 bytes"; }; label { name "struct_user_2"; addr $0716; comment "11 bytes"; }; label { name "struct_user_3"; addr $0721; comment "11 bytes"; }; label { name "struct_user_4"; addr $072c; comment "11 bytes"; }; label { name "current_user"; addr $06fe; size 1; comment "this ranges 1-4, not 0-3"; }; label { name "current_speed"; addr $0624; size 1; comment "can be modified, e.g. set to $08 when being electrocuted"; }; label { name "initial_speed"; addr $0625; size 1; comment "current user's chosen speed, set at game start"; }; label { name "setup_dli_2"; addr $bc3f; size 1; comment "load dli_service_2 address into dli shadow"; }; label { name "silence_audio"; addr $875B; size 1; comment "set all AUDFx to 0"; }; label { name "sa_loop"; addr $875F; size 1; }; label { name "store_audc"; addr $8DC6; size 1; comment "store A to AUDCx (and its ?shadow?)"; }; label { name "set_prior"; addr $8798; size 1; comment "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]"; }; label { name "SAVMSC"; addr $58; size 2; comment "OS's idea of the start of screen memory [redundant to set here?]"; }; label { name "set_char_base"; addr $83BB; size 1; comment "use character set at $9e00 aka charset"; }; label { name "set_savmsc"; addr $83E9; size 1; comment "tell OS that screen memory starts at $3000"; }; label { name "position_player_5"; addr $8310; size 1; comment "position the 4 missiles side-by-side"; }; label { name "init_set_prior"; addr $8399; size 1; comment "priority $11: pl0-3, pf0-3, bak (and enable 5th player from the missiles)"; }; label { name "joystick_disabled"; addr $0632; size 1; comment "nonzero = jumpman can't move (title screen or materialization, etc)"; }; label { name "joystick_state"; addr $0633; size 1; comment "last PORTA read (bottom 4 bits), or 0 if joystick_disabled"; }; label { name "trigger_disabled"; addr $0634; size 1; comment "nonzero = jumpman can't jump (he's already jumping, or title screen or materialization, etc)"; }; label { name "trigger_state"; addr $0635; size 1; comment "last TRIG0 read (0 = pressed)"; }; label { name "check_trigger_state"; addr $984D; size 1; comment "did user press the trigger?"; }; label { name "trig_jmp"; addr $9852; size 1; comment "yes, jump to handler"; }; label { name "check_up_down"; addr $9855; size 1; comment "did user move joystick up/down?"; }; label { name "check_up_down_2"; addr $993B; size 1; comment "did user move joystick up/down?"; }; label { name "trigger_handler"; addr $9985; size 1; comment "handle trigger presses, maybe start a jump, if player is moving up, left, or right"; }; label { name "cud_jmp"; addr $9860; size 1; comment "no, jump over handler"; }; label { name "player_delta_x"; addr $0630; size 1; comment "amount to move jumpman this frame (1 or $FF aka -1)"; }; label { name "player_delta_y"; addr $0631; size 1; comment "amount to move jumpman this frame (1 or $FF aka -1)"; }; label { name "dli_vec_shadow_hi"; addr $06AF; size 1; comment "stored in VDSLST if nonzero"; }; label { name "dli_vec_shadow_lo"; addr $06ae; size 1; comment "stored in VDSLST if dli_vec_shadow_hi nonzero"; }; label { name "dlist_shadow_hi"; addr $06AD; size 1; comment "stored in DLISTH if nonzero"; }; label { name "dlist_shadow_lo"; addr $06ac; size 1; comment "stored in DLISTL if dlist_shadow_hi nonzero"; }; label { name "clear_dlist_shadow"; addr $851E; size 1; comment "clear the shadow now that we've updated the HW"; }; label { name "clear_dli_shadow"; addr $8531; size 1; comment "clear the shadow now that we've updated the HW"; }; label { name "enable_dli"; addr $8536; size 1; comment "enable DLI now that we've set up the vector"; }; label { name "enable_keyboard_irq"; addr $8554; size 1; comment "$C0 = regular keypress, break keypress"; }; label { name "silence_console_speaker"; addr $855A; size 1; comment "8 = silent (0 would be a click)"; }; label { name "check_start_key"; addr $8561; size 1; comment "carry set = not pressed, clear = pressed"; }; label { name "check_select_key"; addr $8573; size 1; comment "carry set = not pressed, clear = pressed"; }; label { name "check_option_key"; addr $8580; size 1; comment "carry set = not pressed, clear = pressed"; }; label { name "setup_start_key_vec"; addr $9465; size 1; comment "we'll jump to $94de aka get_player_speeds when start key is pressed"; }; label { name "get_player_speeds"; addr $94de; size 1; comment "loop up to 4 times, ask PLAYER #n SPEED? and wait for number key press"; }; label { name "setup_option_key_vec"; addr $9458; size 1; comment "we'll jump to $9489 aka option_key_handler when option key is pressed"; }; label { name "start_key_vec"; addr $06c4; size 2; comment "vblank_imm_isr jumps thru here if start key pressed"; }; label { name "select_key_vec"; addr $06c2; size 2; comment "vblank_imm_isr jumps thru here if select key pressed"; }; label { name "option_key_vec"; addr $06c0; size 2; comment "vblank_imm_isr jumps thru here if option key pressed"; }; label { name "start_key_enabled"; addr $06C8; size 1; comment "non-zero = jump through start_key_vec if start key pressed (checked by vblank_imm_isr)"; }; label { name "select_key_enabled"; addr $06C7; size 1; comment "non-zero = jump through start_key_vec if start key pressed (checked by vblank_imm_isr)"; }; label { name "option_key_enabled"; addr $06C6; size 1; comment "non-zero = jump through start_key_vec if start key pressed (checked by vblank_imm_isr)"; }; label { name "zp_temp1"; addr $cb; size 2; comment "used for (zp,y) addressing, also for checking console keys in vblank_imm_isr"; }; label { name "zp_temp2"; addr $ae; size 2; comment "used for (zp,y) addressing, also 2 temps for scores_screen"; }; label { name "zp_temp3"; addr $B7; size 1; }; label { name "zp_temp4"; addr $B8; size 1; comment "number of players, used by ask_num_players and option_key_handler. used as a temp elsewhere."; }; label { name "zp_temp5"; addr $B9; size 1; comment "among other things, used for jumpman's dance on title screen"; }; label { name "zp_temp6"; addr $BA; size 1; comment "used for audio freq counter in materialize_jumpman. also used when setting number of players and player speeds."; }; label { name "hang_main_thread"; addr $9486; size 1; comment "initialization done, everything's done in interrupts from here on out"; }; label { name "option_key_handler"; addr $9489; size 1; comment "called via option_key_vec when someone presses option"; }; label { name "level_finished"; addr $8E00; size 1; }; label { name "level_finished_jv"; addr $802D; size 1; }; label { name "decrement_time_bonus"; addr $8DCE; size 1; comment "bonus -= 100, play sfx_bonus_tick"; }; label { name "decrement_time_bonus_jv"; addr $8021; size 1; comment "bonus -= 100;"; }; label { name "check_bonus_0"; addr $8DD7; size 1; comment "don't decrement if bonus == 0"; }; label { name "dec_done"; addr $8DF9; size 1; }; label { name "bonus_lt_256"; addr $8DE7; size 1; }; label { name "set_y"; addr $8F9B; size 1; comment "y = a * 5; // offset into mus_struct_table"; }; label { name "show_level_name"; addr $BA5D; size 1; comment "copy level name into screen RAM"; }; label { name "sync_to_music"; addr $BA71; size 1; comment "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"; }; label { name "wait_1_sec"; addr $BA9E; size 1; comment "actually 64 jiffies, 1.067S ntsc, 1.28s pal"; }; label { name "demo_wait"; addr $B970; size 1; comment "96 jiffies, 1.6s ntsc, 1.92s pal"; }; label { name "demo_show_map"; addr $B99D; size 1; comment "initially, demo_map_ptr points to $A000 (start of level descriptions), Y is $16, or offset to _map0 within level desc."; }; label { name "demo_show_name"; addr $B9AC; }; label { name "demo_next_map"; addr $B9DE; }; label { name "demo_set_colors"; addr $B9EC; comment "demo_map_ptr points to levelXX_desc"; }; label { name "demo_wait_1"; addr $B9C6; comment "approx 2/3 sec"; }; label { name "keep_waiting"; addr $BAA3; size 1; }; label { name "enable_joystick"; addr $8775; size 1; comment "called after level-intro music is finished playing"; }; label { name "enable_joystick_jv"; addr $801B; size 1; comment "called after level-intro music is finished playing"; }; label { name "ej_loop"; addr $8777; size 1; }; label { name "hide_player"; addr $8DB8; size 1; comment "move player selected by X reg minus one off the left edge of the screen"; }; label { name "play_select_key_sfx"; addr $946F; size 1; comment "play sfx_select_key at $95f1"; }; label { name "wait_sfx"; addr $947C; size 1; comment "wait for sound to finish playing"; }; label { name "play_life_bonus_sfx"; addr $B868; size 1; comment "play once per life"; }; label { name "el_hi_ok"; addr $B851; }; label { name "el_wait_sfx"; addr $B875; comment "wait for sfx to finish"; }; label { name "el_delay"; addr $B884; comment "wait approx 1/2 sec"; }; label { name "el_done"; addr $B893; }; label { name "add_life_bonus"; addr $B83B; size 1; }; label { name "sfx_option_pressed"; addr $8ab0; size 1; }; label { name "play_opt_key_sfx"; addr $94BC; size 1; }; label { name "wait_opt_key_sfx"; addr $94CE; size 1; comment "wait until it's done playing"; }; label { name "map_one_bomb_minus_one"; addr $b119; comment "1-indexed"; }; range { name "map_one_bomb"; start $B11A; end $b120; type bytetable; comment "used by blackout, copied to RAM and modified ($00's replaced with actual X and Y coords of bomb)"; }; label { name "block_char_minus_one"; addr $9e0f; size 1; comment "couple of places in the code try to write here"; }; label { name "position_players"; addr $82E9; size 1; comment "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)."; }; label { name "HPOSP0_minus_two"; addr $CFFE; size 1; }; label { name "position_pm_vert"; addr $8322; size 1; }; label { name "clear_pm"; addr $8342; size 1; comment "write zeroes to unused portion of this player/missile"; }; label { name "position_done"; addr $82E8; size 1; }; label { name "clear_pm_mem"; addr $88A8; size 1; comment "clear P/M memory, called from enable_joystick"; }; label { name "clr_loop"; addr $88AB; size 1; }; label { name "prepare_level"; addr $872A; size 1; comment "misc stuff, called from enable_joystick"; }; label { name "clear_screen_mem"; addr $8714; size 1; comment "clear the gameboard screen memory (called before drawing a level, natch)"; }; label { name "clear_screen_mem_jv"; addr $801E; size 1; comment "clear the gameboard screen memory (called before drawing a level, natch)"; }; label { name "csm_loop"; addr $871F; size 1; }; label { name "dm_obj_to_screen"; addr $80BD; size 1; comment "actually write the object's pixels to screen memory. quite hairy."; }; label { name "unused_vecs"; addr $803F; size 1; comment "3 unused jump vectors, all pointed to the same RTS"; }; label { name "unused_vec_rts"; addr $8048; size 1; comment "unused jump vectors point here"; }; label { name "sfx_bounce_1"; addr $8A4B; size 1; comment "used when jumpman is falling?"; }; range { name "sfx_climb"; start $8a97; end $8abf; type bytetable; comment "climbing up/down a ladder (not ropes)"; }; label { name "sfx_death"; addr $8a60; comment "jumpman hit by bullet or started falling"; }; label { name "play_sfx_climb"; addr $8A80; }; label { name "play_sfx_bounce_1"; addr $899A; }; label { name "falling_bounce"; addr $8983; comment "this looks like it hurts..."; }; label { name "afterlife"; addr $9600; comment "multiple code paths jump here. replay level, load next level, or go back to ask_num_players"; }; range { name "well_done_sub0"; start $bccd; end $bcd8; type code; comment "used in work_level_sub0 slot during well_doneused in work_level_sub1 slot during well_done"; }; label { name "well_done_sub1"; addr $BD52; comment "used in work_level_sub1 slot during well_doneused in work_level_sub1 slot during well_done"; }; label { name "wds1_cont"; addr $BD58; comment "we seem to be setting/clearing bit 7 in the display list, moving the line(s) where DLI(s) occur."; }; label { name "wds1_finish"; addr $BD81; comment "set things up for the next level?"; }; label { name "crumble_gameboard"; addr $8D00; comment "just lost your last life"; }; label { name "crumble_gameboard_jv"; addr $8030; comment "just lost your last life"; }; label { name "cgb_audc"; addr $8D05; comment "$86 = distortion 8, volume 6"; }; label { name "shake_screen"; addr $8D08; comment "store random N-blank-lines instruction at head of display list"; }; label { name "crumble_sound"; addr $8D16; comment "random frequency"; }; label { name "rand_0c"; addr $8D19; comment "get random number 0 to 12"; }; label { name "init_struct_users"; addr $9A5C; comment "work_user and struct_user_{1..4}, 11 * 5 (55 aka $37) bytes"; }; label { name "init_struct_users_jv"; addr $8024; }; label { name "isu_next_su"; addr $9A5E; }; label { name "isu_next_byte"; addr $9A60; }; range { name "struct_users_init_contents"; start $9A71; end $9a7b; type bytetable; comment "work_user and struct_user_1 to _4 are initialized to this"; }; range { name "extra_life_points"; start $8CFD; end $8CFF; type bytetable; comment "3 bytes, value 7500 decimal, give an extra life after this many points. not copied to RAM, meaning no level can change this."; }; label { name "chk_next_byte"; addr $8CBE; comment "number_of_users should be score-1 here. score+2 should be next_extra_life-1 also."; }; label { name "chk_done"; addr $8CFA; }; label { name "add_extra_life"; addr $8CCE; comment "first, calculate & store the next 7500-point target"; }; label { name "add_next_byte"; addr $8CD1; }; label { name "score_byte_ge"; addr $8CCB; comment "if it's greater or equal and X!=0, keep looping"; }; label { name "inc_lives"; addr $8CE4; comment "add 1 life, play sfx_extra_life"; }; label { name "show_lives_icons"; addr $86BB; comment "up to 6 jumpmen, and a + if lives > 6. char $C1 = jumpman icon, $CB = plus sign"; }; label { name "show_current_player"; addr $86A7; comment "1 to 4"; }; label { name "update_status_window"; addr $8694; comment "bottom 2 GR.1 lines on the game board"; }; label { name "update_status_window_jv"; addr $8012; comment "bottom 2 GR.1 lines on the game board"; }; label { name "setup_gameboard_dlist"; addr $9B00; comment "for some reason there are 2 copies of the display list, at $0800 and $0881"; }; label { name "setup_gameboard_dlist_jv"; addr $8015; comment "for some reason there are 2 copies of the display list, at $0800 and $0881"; }; label { name "print_number"; addr $8600; comment "convert the 3-byte integer stored at num_in to screen codes, store into memory pointed to by num_out. num_in is modified."; }; label { name "print_number_jv"; addr $8009; comment "convert the 3-byte integer stored at num_in to screen codes, store into memory pointed to by num_out"; }; label { name "num_tmp"; addr $0665; size 1; comment "temp used by print_number"; }; label { name "num_in"; addr $D0; size 3; comment "print_number input. 3-byte number (LSB first as usual) to be printed"; }; label { name "num_out"; addr $D3; size 2; comment "area of (screen) memory where print_number stores its output"; }; label { name "num_color"; addr $D5; size 1; comment "print_number adds this to numeric screencode output. normally 0, set to $80 on the end-of-game screen."; }; label { name "bomb_idx"; addr $B2; size 1; comment "bomb that was just picked up (times 2, suitable for index into a table of words)"; }; label { name "print_bonus"; addr $867E; comment "print remaining bonus time; work_level_points_per_bomb should read work_level_time_bonus-1"; }; label { name "print_bonus_jv"; addr $800F; comment "print remaining bonus time"; }; label { name "pnum_done"; addr $8667; }; label { name "next_digit"; addr $8607; comment "starts at 0, gets added to"; }; label { name "print_score"; addr $8668; }; label { name "ps_loop"; addr $8672; comment "number_of_users should be score-1 here."; }; label { name "pb_loop"; addr $8688; }; label { name "draw_map"; addr $8049; comment "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."; }; label { name "draw_map_jv"; addr $8000; comment "the entry point for parsing the level map and drawing graphics from it. see level_maps.txt."; }; label { name "dm_get_opcode"; addr $804B; comment "$C0/$C1 points to $A300 (level01_desc) on the first call"; }; label { name "dm_switch_opcode"; addr $804D; comment "map opcodes: $FC = jump, $FF = end, $FD = set drawing direction, $FE = select graphics object"; }; label { name "dm_draw_gfx"; addr $8090; comment "handle gfx_draw opcode"; }; label { name "dm_jump"; addr $805C; comment "handle gfx_jump opcode"; }; label { name "dm_delta"; addr $806B; comment "handle gfx_delta opcode"; }; label { name "dm_obj"; addr $8083; comment "handle gfx_object opcode"; }; label { name "dm_fallthru"; addr $805B; comment "handle gfx_end opcode"; }; label { name "dm_next_opcode"; addr $8075; comment "all the other opcode handlers jump here"; }; label { name "dm_progctr"; addr $C0; size 2; comment "see draw_map and level_maps.txt"; }; label { name "dm_delta_x"; addr $C9; size 1; comment "see draw_map and level_maps.txt"; }; label { name "dm_delta_y"; addr $CA; size 1; comment "see draw_map and level_maps.txt"; }; label { name "dm_objptr"; addr $C2; size 2; comment "see draw_map and level_maps.txt"; }; label { name "dm_xpos"; addr $55; size 1; comment "see draw_map and level_maps.txt"; }; label { name "dm_ypos"; addr $54; size 1; comment "see draw_map and level_maps.txt"; }; label { name "dm_length"; addr $BF; size 1; comment "see draw_map and level_maps.txt"; }; label { name "dm_draw_loop"; addr $809C; size 1; comment "loop 'dm_length' times"; }; label { name "dm_draw_obj"; addr $80B4; size 1; comment "draw current object at current x/y position"; }; label { name "dm_draw_obj_loop"; addr $80B6; size 1; comment "object definition ends with $FF"; }; label { name "dm_count"; addr $BE; size 1; comment "graphics object definition is this long"; }; label { name "dm_x_with_offset"; addr $C6; size 1; comment "graphics object X offset, plus dm_xpos"; }; label { name "dm_y_with_offset"; addr $C7; size 1; comment "graphics object Y offset, plus dm_xpos"; }; label { name "dm_screen_addr"; addr $C4; size 2; comment "points to byte to write gfx data to"; }; label { name "calc_screen_addr"; addr $80D0; size 1; comment "calculate 40 * dm_y_with_offset + dm_x_with_offset + screen mem address, store in dm_screen_addr"; }; label { name "sa_hi_ok_1"; addr $80FD; size 1; }; label { name "mul40_loop"; addr $80DA; size 1; }; label { name "mul40_no_add"; addr $80E1; size 1; }; label { name "calc_pixels"; addr $8107; size 1; }; label { name "sa_hi_ok_2"; addr $813C; size 1; }; label { name "sa_tmp_1"; addr $BD; size 1; comment "used by calc_screen_addr"; }; label { name "sa_tmp_2"; addr $C8; size 1; comment "used by calc_screen_addr"; }; label { name "store_rts"; addr $83B6; comment "store an RTS at $06E6, which will get JSR'ed to by unused level subroutines"; }; label { name "well_done_screen"; addr $BC00; comment "the WELL DONE screen, when you beat all the levels. after this, the game plays random levels."; }; label { name "cue_woop_sound"; addr $B4D3; }; label { name "sfx_woop"; addr $B564; }; label { name "got_all_bombs"; addr $9766; }; label { name "call_eol_sub"; addr $976C; }; label { name "player_new_x"; addr $067C; comment "HPOSxx, 1-indexed, $067d thru $0681 are p5, p3..p0"; }; label { name "player_x"; addr $068B; comment "HPOSxx, $068c thru $06c0"; }; label { name "player_new_y"; addr $0686; comment "$0687 thru $069b"; }; label { name "player_y"; addr $0695; comment "vertical positions, actually $0696 thru $069a"; }; label { name "player_height"; addr $0677; comment "actually $0677 thru $067b"; }; label { name "player_enabled"; addr $0668; comment "1 = draw this player, 0 = no. actually $0669 thru $066e"; }; label { name "tmp_sprite"; addr $CD; size 2; comment "ZP pointer to player/missile data (e.g. jumpman's 10-byte animation frames)"; }; label { name "tmp_sprite_height"; addr $CF; size 1; comment "length of data pointed to by tmp_sprite"; }; label { name "copy_pm_data"; addr $8370; comment "write to P/M memory"; }; label { name "adj_ptr"; addr $835F; comment "adjust pointer if Y wraps around"; }; # end of main.info, everything below here is generated by mklevelinfo.pl label { name "work_level_desc"; addr $0780; size 2; comment "first 2 bytes are level number in screencodes"; }; label { name "work_level_sub0"; addr $0782; size 2; comment "a subroutine"; }; label { name "work_level_sub1"; addr $0784; size 2; comment "a subroutine"; }; label { name "work_level_sub2"; addr $0786; size 2; comment "a subroutine"; }; label { name "work_level_sub3"; addr $0788; size 2; comment "a subroutine"; }; label { name "work_level_num_bombs"; addr $078a; size 1; comment "number of bombs to pick up on this level"; }; label { name "work_level_bullet_max"; addr $078b; size 1; comment "0 = no bullets, range 0-4."; }; label { name "work_level_y_start"; addr $078c; size 1; comment "jumpman starting Y position"; }; label { name "work_level_x_start"; addr $078d; size 1; comment "jumpman starting X position"; }; label { name "work_level_fudge_x"; addr $078e; size 1; comment "fudge factor for bomb locations, always $00"; }; label { name "work_level_fudge_y"; addr $078f; size 1; comment "fudge factor for bomb locations, always $06"; }; label { name "work_level_points_per_bomb"; addr $0790; size 1; comment "points awarded per bomb pickup (always $64 aka 100)"; }; label { name "work_level_time_bonus"; addr $0791; size 2; comment "amount of time bonus at start of level"; }; label { name "work_level_offs_19"; addr $0793; size 1; comment "always $00"; }; label { name "work_level_unkn_table0"; addr $0794; size 2; comment "pointer to ROM table or $06xx"; }; label { name "work_level_map"; addr $0796; size 2; comment "used to draw the level initially (see also map_changes)"; }; label { name "work_level_map_bombs"; addr $0798; size 2; comment "start of bombs in map data (which must come last!)"; }; label { name "work_level_bomblist"; addr $079a; size 2; comment "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."; }; label { name "work_level_map_changes"; addr $079c; size 2; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; }; label { name "work_level_indirect_subs"; addr $079e; size 2; comment "pointer to list of indirect subs, always $0000 in this game"; }; label { name "work_level_sub_bomb"; addr $07a0; size 2; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; }; label { name "work_level_init"; addr $07a2; size 2; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; }; label { name "work_level_sub6"; addr $07a4; size 2; comment "always $9740 aka game_main_loop"; }; label { name "work_level_sub_eol"; addr $07a6; size 2; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; }; label { name "work_level_offs_40"; addr $07a8; size 6; comment "all zeroes"; }; label { name "work_level_colpf3"; addr $07ae; size 1; comment "color for missiles (aka 5th player)"; }; label { name "work_level_colpf0"; addr $07af; size 1; comment "color for girders and up-ropes"; }; label { name "work_level_colpf1"; addr $07b0; size 1; comment "color for ladders and down-ropes"; }; label { name "work_level_colpf2"; addr $07b1; size 1; comment "color for bombs"; }; label { name "work_level_offs_50"; addr $07b2; size 5; comment "unknown"; }; label { name "work_level_offs_55"; addr $07b7; size 3; comment "unknown, always $00 $00 $00"; }; label { name "work_level_offs_58"; addr $07ba; size 2; comment "unknown, not a ROM address"; }; label { name "work_level_offs_60"; addr $07bc; size 4; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; }; label { name "cur_level_desc"; addr $07c0; size 2; comment "first 2 bytes are level number in screencodes"; }; label { name "cur_level_sub0"; addr $07c2; size 2; comment "a subroutine"; }; label { name "cur_level_sub1"; addr $07c4; size 2; comment "a subroutine"; }; label { name "cur_level_sub2"; addr $07c6; size 2; comment "a subroutine"; }; label { name "cur_level_sub3"; addr $07c8; size 2; comment "a subroutine"; }; label { name "cur_level_num_bombs"; addr $07ca; size 1; comment "number of bombs to pick up on this level"; }; label { name "cur_level_bullet_max"; addr $07cb; size 1; comment "0 = no bullets, range 0-4."; }; label { name "cur_level_y_start"; addr $07cc; size 1; comment "jumpman starting Y position"; }; label { name "cur_level_x_start"; addr $07cd; size 1; comment "jumpman starting X position"; }; label { name "cur_level_fudge_x"; addr $07ce; size 1; comment "fudge factor for bomb locations, always $00"; }; label { name "cur_level_fudge_y"; addr $07cf; size 1; comment "fudge factor for bomb locations, always $06"; }; label { name "cur_level_points_per_bomb"; addr $07d0; size 1; comment "points awarded per bomb pickup (always $64 aka 100)"; }; label { name "cur_level_time_bonus"; addr $07d1; size 2; comment "amount of time bonus at start of level"; }; label { name "cur_level_offs_19"; addr $07d3; size 1; comment "always $00"; }; label { name "cur_level_unkn_table0"; addr $07d4; size 2; comment "pointer to ROM table or $06xx"; }; label { name "cur_level_map"; addr $07d6; size 2; comment "used to draw the level initially (see also map_changes)"; }; label { name "cur_level_map_bombs"; addr $07d8; size 2; comment "start of bombs in map data (which must come last!)"; }; label { name "cur_level_bomblist"; addr $07da; size 2; comment "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."; }; label { name "cur_level_map_changes"; addr $07dc; size 2; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; }; label { name "cur_level_indirect_subs"; addr $07de; size 2; comment "pointer to list of indirect subs, always $0000 in this game"; }; label { name "cur_level_sub_bomb"; addr $07e0; size 2; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; }; label { name "cur_level_init"; addr $07e2; size 2; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; }; label { name "cur_level_sub6"; addr $07e4; size 2; comment "always $9740 aka game_main_loop"; }; label { name "cur_level_sub_eol"; addr $07e6; size 2; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; }; label { name "cur_level_offs_40"; addr $07e8; size 6; comment "all zeroes"; }; label { name "cur_level_colpf3"; addr $07ee; size 1; comment "color for missiles (aka 5th player)"; }; label { name "cur_level_colpf0"; addr $07ef; size 1; comment "color for girders and up-ropes"; }; label { name "cur_level_colpf1"; addr $07f0; size 1; comment "color for ladders and down-ropes"; }; label { name "cur_level_colpf2"; addr $07f1; size 1; comment "color for bombs"; }; label { name "cur_level_offs_50"; addr $07f2; size 5; comment "unknown"; }; label { name "cur_level_offs_55"; addr $07f7; size 3; comment "unknown, always $00 $00 $00"; }; label { name "cur_level_offs_58"; addr $07fa; size 2; comment "unknown, not a ROM address"; }; label { name "cur_level_offs_60"; addr $07fc; size 4; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; }; range { name "level01_desc"; start $a000; end $a001; type bytetable; comment "64-byte level descriptors, 12 of them (1 per level). Descriptor for Nothing To It. first 2 bytes are level number in screencodes"; }; range { name "level01_sub0"; start $a002; end $a003; type addrtable; comment "a subroutine"; }; range { name "level01_sub1"; start $a004; end $a005; type addrtable; comment "a subroutine"; }; range { name "level01_sub2"; start $a006; end $a007; type addrtable; comment "a subroutine"; }; range { name "level01_sub3"; start $a008; end $a009; type addrtable; comment "a subroutine"; }; range { name "level01_num_bombs"; start $a00a; end $a00a; type bytetable; comment "number of bombs to pick up on this level"; }; range { name "level01_bullet_max"; start $a00b; end $a00b; type bytetable; comment "0 = no bullets, range 0-4."; }; range { name "level01_y_start"; start $a00c; end $a00c; type bytetable; comment "jumpman starting Y position"; }; range { name "level01_x_start"; start $a00d; end $a00d; type bytetable; comment "jumpman starting X position"; }; range { name "level01_fudge_x"; start $a00e; end $a00e; type bytetable; comment "fudge factor for bomb locations, always $00"; }; range { name "level01_fudge_y"; start $a00f; end $a00f; type bytetable; comment "fudge factor for bomb locations, always $06"; }; range { name "level01_points_per_bomb"; start $a010; end $a010; type bytetable; comment "points awarded per bomb pickup (always $64 aka 100)"; }; range { name "level01_time_bonus"; start $a011; end $a012; type wordtable; comment "amount of time bonus at start of level"; }; range { name "level01_offs_19"; start $a013; end $a013; type bytetable; comment "always $00"; }; range { name "level01_unkn_table0"; start $a014; end $a015; type addrtable; comment "pointer to ROM table or $06xx"; }; range { name "level01_map"; start $a016; end $a017; type addrtable; comment "used to draw the level initially (see also map_changes)"; }; range { name "level01_map_bombs"; start $a018; end $a019; type addrtable; comment "start of bombs in map data (which must come last!)"; }; range { name "level01_bomblist"; start $a01a; end $a01b; type addrtable; comment "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."; }; range { name "level01_map_changes"; start $a01c; end $a01d; type addrtable; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; }; range { name "level01_indirect_subs"; start $a01e; end $a01f; type bytetable; comment "pointer to list of indirect subs, always $0000 in this game"; }; range { name "level01_sub_bomb"; start $a020; end $a021; type addrtable; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; }; range { name "level01_init"; start $a022; end $a023; type addrtable; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; }; range { name "level01_sub6"; start $a024; end $a025; type addrtable; comment "always $9740 aka game_main_loop"; }; range { name "level01_sub_eol"; start $a026; end $a027; type addrtable; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; }; range { name "level01_offs_40"; start $a028; end $a02d; type bytetable; comment "all zeroes"; }; range { name "level01_colpf3"; start $a02e; end $a02e; type bytetable; comment "color for missiles (aka 5th player)"; }; range { name "level01_colpf0"; start $a02f; end $a02f; type bytetable; comment "color for girders and up-ropes"; }; range { name "level01_colpf1"; start $a030; end $a030; type bytetable; comment "color for ladders and down-ropes"; }; range { name "level01_colpf2"; start $a031; end $a031; type bytetable; comment "color for bombs"; }; range { name "level01_offs_50"; start $a032; end $a036; type bytetable; comment "unknown"; }; range { name "level01_offs_55"; start $a037; end $a039; type bytetable; comment "unknown, always $00 $00 $00"; }; range { name "level01_offs_58"; start $a03a; end $a03b; type bytetable; comment "unknown, not a ROM address"; }; range { name "level01_offs_60"; start $a03c; end $a03f; type bytetable; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; }; range { name "level02_desc"; start $a040; end $a041; type bytetable; comment "Descriptor for Electrocution. first 2 bytes are level number in screencodes"; }; range { name "level02_sub0"; start $a042; end $a043; type addrtable; comment "a subroutine"; }; range { name "level02_sub1"; start $a044; end $a045; type addrtable; comment "a subroutine"; }; range { name "level02_sub2"; start $a046; end $a047; type addrtable; comment "a subroutine"; }; range { name "level02_sub3"; start $a048; end $a049; type addrtable; comment "a subroutine"; }; range { name "level02_num_bombs"; start $a04a; end $a04a; type bytetable; comment "number of bombs to pick up on this level"; }; range { name "level02_bullet_max"; start $a04b; end $a04b; type bytetable; comment "0 = no bullets, range 0-4."; }; range { name "level02_y_start"; start $a04c; end $a04c; type bytetable; comment "jumpman starting Y position"; }; range { name "level02_x_start"; start $a04d; end $a04d; type bytetable; comment "jumpman starting X position"; }; range { name "level02_fudge_x"; start $a04e; end $a04e; type bytetable; comment "fudge factor for bomb locations, always $00"; }; range { name "level02_fudge_y"; start $a04f; end $a04f; type bytetable; comment "fudge factor for bomb locations, always $06"; }; range { name "level02_points_per_bomb"; start $a050; end $a050; type bytetable; comment "points awarded per bomb pickup (always $64 aka 100)"; }; range { name "level02_time_bonus"; start $a051; end $a052; type wordtable; comment "amount of time bonus at start of level"; }; range { name "level02_offs_19"; start $a053; end $a053; type bytetable; comment "always $00"; }; range { name "level02_unkn_table0"; start $a054; end $a055; type addrtable; comment "pointer to ROM table or $06xx"; }; range { name "level02_map"; start $a056; end $a057; type addrtable; comment "used to draw the level initially (see also map_changes)"; }; range { name "level02_map_bombs"; start $a058; end $a059; type addrtable; comment "start of bombs in map data (which must come last!)"; }; range { name "level02_bomblist"; start $a05a; end $a05b; type addrtable; comment "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."; }; range { name "level02_map_changes"; start $a05c; end $a05d; type addrtable; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; }; range { name "level02_indirect_subs"; start $a05e; end $a05f; type bytetable; comment "pointer to list of indirect subs, always $0000 in this game"; }; range { name "level02_sub_bomb"; start $a060; end $a061; type addrtable; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; }; range { name "level02_init"; start $a062; end $a063; type addrtable; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; }; range { name "level02_sub6"; start $a064; end $a065; type addrtable; comment "always $9740 aka game_main_loop"; }; range { name "level02_sub_eol"; start $a066; end $a067; type addrtable; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; }; range { name "level02_offs_40"; start $a068; end $a06d; type bytetable; comment "all zeroes"; }; range { name "level02_colpf3"; start $a06e; end $a06e; type bytetable; comment "color for missiles (aka 5th player)"; }; range { name "level02_colpf0"; start $a06f; end $a06f; type bytetable; comment "color for girders and up-ropes"; }; range { name "level02_colpf1"; start $a070; end $a070; type bytetable; comment "color for ladders and down-ropes"; }; range { name "level02_colpf2"; start $a071; end $a071; type bytetable; comment "color for bombs"; }; range { name "level02_offs_50"; start $a072; end $a076; type bytetable; comment "unknown"; }; range { name "level02_offs_55"; start $a077; end $a079; type bytetable; comment "unknown, always $00 $00 $00"; }; range { name "level02_offs_58"; start $a07a; end $a07b; type bytetable; comment "unknown, not a ROM address"; }; range { name "level02_offs_60"; start $a07c; end $a07f; type bytetable; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; }; range { name "level03_desc"; start $a080; end $a081; type bytetable; comment "Descriptor for Dumbwaiter. first 2 bytes are level number in screencodes"; }; range { name "level03_sub0"; start $a082; end $a083; type addrtable; comment "a subroutine"; }; range { name "level03_sub1"; start $a084; end $a085; type addrtable; comment "a subroutine"; }; range { name "level03_sub2"; start $a086; end $a087; type addrtable; comment "a subroutine"; }; range { name "level03_sub3"; start $a088; end $a089; type addrtable; comment "a subroutine"; }; range { name "level03_num_bombs"; start $a08a; end $a08a; type bytetable; comment "number of bombs to pick up on this level"; }; range { name "level03_bullet_max"; start $a08b; end $a08b; type bytetable; comment "0 = no bullets, range 0-4."; }; range { name "level03_y_start"; start $a08c; end $a08c; type bytetable; comment "jumpman starting Y position"; }; range { name "level03_x_start"; start $a08d; end $a08d; type bytetable; comment "jumpman starting X position"; }; range { name "level03_fudge_x"; start $a08e; end $a08e; type bytetable; comment "fudge factor for bomb locations, always $00"; }; range { name "level03_fudge_y"; start $a08f; end $a08f; type bytetable; comment "fudge factor for bomb locations, always $06"; }; range { name "level03_points_per_bomb"; start $a090; end $a090; type bytetable; comment "points awarded per bomb pickup (always $64 aka 100)"; }; range { name "level03_time_bonus"; start $a091; end $a092; type wordtable; comment "amount of time bonus at start of level"; }; range { name "level03_offs_19"; start $a093; end $a093; type bytetable; comment "always $00"; }; range { name "level03_unkn_table0"; start $a094; end $a095; type addrtable; comment "pointer to ROM table or $06xx"; }; range { name "level03_map"; start $a096; end $a097; type addrtable; comment "used to draw the level initially (see also map_changes)"; }; range { name "level03_map_bombs"; start $a098; end $a099; type addrtable; comment "start of bombs in map data (which must come last!)"; }; range { name "level03_bomblist"; start $a09a; end $a09b; type addrtable; comment "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."; }; range { name "level03_map_changes"; start $a09c; end $a09d; type addrtable; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; }; range { name "level03_indirect_subs"; start $a09e; end $a09f; type bytetable; comment "pointer to list of indirect subs, always $0000 in this game"; }; range { name "level03_sub_bomb"; start $a0a0; end $a0a1; type addrtable; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; }; range { name "level03_init"; start $a0a2; end $a0a3; type addrtable; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; }; range { name "level03_sub6"; start $a0a4; end $a0a5; type addrtable; comment "always $9740 aka game_main_loop"; }; range { name "level03_sub_eol"; start $a0a6; end $a0a7; type addrtable; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; }; range { name "level03_offs_40"; start $a0a8; end $a0ad; type bytetable; comment "all zeroes"; }; range { name "level03_colpf3"; start $a0ae; end $a0ae; type bytetable; comment "color for missiles (aka 5th player)"; }; range { name "level03_colpf0"; start $a0af; end $a0af; type bytetable; comment "color for girders and up-ropes"; }; range { name "level03_colpf1"; start $a0b0; end $a0b0; type bytetable; comment "color for ladders and down-ropes"; }; range { name "level03_colpf2"; start $a0b1; end $a0b1; type bytetable; comment "color for bombs"; }; range { name "level03_offs_50"; start $a0b2; end $a0b6; type bytetable; comment "unknown"; }; range { name "level03_offs_55"; start $a0b7; end $a0b9; type bytetable; comment "unknown, always $00 $00 $00"; }; range { name "level03_offs_58"; start $a0ba; end $a0bb; type bytetable; comment "unknown, not a ROM address"; }; range { name "level03_offs_60"; start $a0bc; end $a0bf; type bytetable; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; }; range { name "level04_desc"; start $a0c0; end $a0c1; type bytetable; comment "Descriptor for Hellstones. first 2 bytes are level number in screencodes"; }; range { name "level04_sub0"; start $a0c2; end $a0c3; type addrtable; comment "a subroutine"; }; range { name "level04_sub1"; start $a0c4; end $a0c5; type addrtable; comment "a subroutine"; }; range { name "level04_sub2"; start $a0c6; end $a0c7; type addrtable; comment "a subroutine"; }; range { name "level04_sub3"; start $a0c8; end $a0c9; type addrtable; comment "a subroutine"; }; range { name "level04_num_bombs"; start $a0ca; end $a0ca; type bytetable; comment "number of bombs to pick up on this level"; }; range { name "level04_bullet_max"; start $a0cb; end $a0cb; type bytetable; comment "0 = no bullets, range 0-4."; }; range { name "level04_y_start"; start $a0cc; end $a0cc; type bytetable; comment "jumpman starting Y position"; }; range { name "level04_x_start"; start $a0cd; end $a0cd; type bytetable; comment "jumpman starting X position"; }; range { name "level04_fudge_x"; start $a0ce; end $a0ce; type bytetable; comment "fudge factor for bomb locations, always $00"; }; range { name "level04_fudge_y"; start $a0cf; end $a0cf; type bytetable; comment "fudge factor for bomb locations, always $06"; }; range { name "level04_points_per_bomb"; start $a0d0; end $a0d0; type bytetable; comment "points awarded per bomb pickup (always $64 aka 100)"; }; range { name "level04_time_bonus"; start $a0d1; end $a0d2; type wordtable; comment "amount of time bonus at start of level"; }; range { name "level04_offs_19"; start $a0d3; end $a0d3; type bytetable; comment "always $00"; }; range { name "level04_unkn_table0"; start $a0d4; end $a0d5; type addrtable; comment "pointer to ROM table or $06xx"; }; range { name "level04_map"; start $a0d6; end $a0d7; type addrtable; comment "used to draw the level initially (see also map_changes)"; }; range { name "level04_map_bombs"; start $a0d8; end $a0d9; type addrtable; comment "start of bombs in map data (which must come last!)"; }; range { name "level04_bomblist"; start $a0da; end $a0db; type addrtable; comment "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."; }; range { name "level04_map_changes"; start $a0dc; end $a0dd; type addrtable; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; }; range { name "level04_indirect_subs"; start $a0de; end $a0df; type bytetable; comment "pointer to list of indirect subs, always $0000 in this game"; }; range { name "level04_sub_bomb"; start $a0e0; end $a0e1; type addrtable; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; }; range { name "level04_init"; start $a0e2; end $a0e3; type addrtable; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; }; range { name "level04_sub6"; start $a0e4; end $a0e5; type addrtable; comment "always $9740 aka game_main_loop"; }; range { name "level04_sub_eol"; start $a0e6; end $a0e7; type addrtable; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; }; range { name "level04_offs_40"; start $a0e8; end $a0ed; type bytetable; comment "all zeroes"; }; range { name "level04_colpf3"; start $a0ee; end $a0ee; type bytetable; comment "color for missiles (aka 5th player)"; }; range { name "level04_colpf0"; start $a0ef; end $a0ef; type bytetable; comment "color for girders and up-ropes"; }; range { name "level04_colpf1"; start $a0f0; end $a0f0; type bytetable; comment "color for ladders and down-ropes"; }; range { name "level04_colpf2"; start $a0f1; end $a0f1; type bytetable; comment "color for bombs"; }; range { name "level04_offs_50"; start $a0f2; end $a0f6; type bytetable; comment "unknown"; }; range { name "level04_offs_55"; start $a0f7; end $a0f9; type bytetable; comment "unknown, always $00 $00 $00"; }; range { name "level04_offs_58"; start $a0fa; end $a0fb; type bytetable; comment "unknown, not a ROM address"; }; range { name "level04_offs_60"; start $a0fc; end $a0ff; type bytetable; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; }; range { name "level05_desc"; start $a100; end $a101; type bytetable; comment "Descriptor for Figurits Revenge. first 2 bytes are level number in screencodes"; }; range { name "level05_sub0"; start $a102; end $a103; type addrtable; comment "a subroutine"; }; range { name "level05_sub1"; start $a104; end $a105; type addrtable; comment "a subroutine"; }; range { name "level05_sub2"; start $a106; end $a107; type addrtable; comment "a subroutine"; }; range { name "level05_sub3"; start $a108; end $a109; type addrtable; comment "a subroutine"; }; range { name "level05_num_bombs"; start $a10a; end $a10a; type bytetable; comment "number of bombs to pick up on this level"; }; range { name "level05_bullet_max"; start $a10b; end $a10b; type bytetable; comment "0 = no bullets, range 0-4."; }; range { name "level05_y_start"; start $a10c; end $a10c; type bytetable; comment "jumpman starting Y position"; }; range { name "level05_x_start"; start $a10d; end $a10d; type bytetable; comment "jumpman starting X position"; }; range { name "level05_fudge_x"; start $a10e; end $a10e; type bytetable; comment "fudge factor for bomb locations, always $00"; }; range { name "level05_fudge_y"; start $a10f; end $a10f; type bytetable; comment "fudge factor for bomb locations, always $06"; }; range { name "level05_points_per_bomb"; start $a110; end $a110; type bytetable; comment "points awarded per bomb pickup (always $64 aka 100)"; }; range { name "level05_time_bonus"; start $a111; end $a112; type wordtable; comment "amount of time bonus at start of level"; }; range { name "level05_offs_19"; start $a113; end $a113; type bytetable; comment "always $00"; }; range { name "level05_unkn_table0"; start $a114; end $a115; type addrtable; comment "pointer to ROM table or $06xx"; }; range { name "level05_map"; start $a116; end $a117; type addrtable; comment "used to draw the level initially (see also map_changes)"; }; range { name "level05_map_bombs"; start $a118; end $a119; type addrtable; comment "start of bombs in map data (which must come last!)"; }; range { name "level05_bomblist"; start $a11a; end $a11b; type addrtable; comment "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."; }; range { name "level05_map_changes"; start $a11c; end $a11d; type addrtable; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; }; range { name "level05_indirect_subs"; start $a11e; end $a11f; type bytetable; comment "pointer to list of indirect subs, always $0000 in this game"; }; range { name "level05_sub_bomb"; start $a120; end $a121; type addrtable; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; }; range { name "level05_init"; start $a122; end $a123; type addrtable; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; }; range { name "level05_sub6"; start $a124; end $a125; type addrtable; comment "always $9740 aka game_main_loop"; }; range { name "level05_sub_eol"; start $a126; end $a127; type addrtable; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; }; range { name "level05_offs_40"; start $a128; end $a12d; type bytetable; comment "all zeroes"; }; range { name "level05_colpf3"; start $a12e; end $a12e; type bytetable; comment "color for missiles (aka 5th player)"; }; range { name "level05_colpf0"; start $a12f; end $a12f; type bytetable; comment "color for girders and up-ropes"; }; range { name "level05_colpf1"; start $a130; end $a130; type bytetable; comment "color for ladders and down-ropes"; }; range { name "level05_colpf2"; start $a131; end $a131; type bytetable; comment "color for bombs"; }; range { name "level05_offs_50"; start $a132; end $a136; type bytetable; comment "unknown"; }; range { name "level05_offs_55"; start $a137; end $a139; type bytetable; comment "unknown, always $00 $00 $00"; }; range { name "level05_offs_58"; start $a13a; end $a13b; type bytetable; comment "unknown, not a ROM address"; }; range { name "level05_offs_60"; start $a13c; end $a13f; type bytetable; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; }; range { name "level06_desc"; start $a140; end $a141; type bytetable; comment "Descriptor for Walls. first 2 bytes are level number in screencodes"; }; range { name "level06_sub0"; start $a142; end $a143; type addrtable; comment "a subroutine"; }; range { name "level06_sub1"; start $a144; end $a145; type addrtable; comment "a subroutine"; }; range { name "level06_sub2"; start $a146; end $a147; type addrtable; comment "a subroutine"; }; range { name "level06_sub3"; start $a148; end $a149; type addrtable; comment "a subroutine"; }; range { name "level06_num_bombs"; start $a14a; end $a14a; type bytetable; comment "number of bombs to pick up on this level"; }; range { name "level06_bullet_max"; start $a14b; end $a14b; type bytetable; comment "0 = no bullets, range 0-4."; }; range { name "level06_y_start"; start $a14c; end $a14c; type bytetable; comment "jumpman starting Y position"; }; range { name "level06_x_start"; start $a14d; end $a14d; type bytetable; comment "jumpman starting X position"; }; range { name "level06_fudge_x"; start $a14e; end $a14e; type bytetable; comment "fudge factor for bomb locations, always $00"; }; range { name "level06_fudge_y"; start $a14f; end $a14f; type bytetable; comment "fudge factor for bomb locations, always $06"; }; range { name "level06_points_per_bomb"; start $a150; end $a150; type bytetable; comment "points awarded per bomb pickup (always $64 aka 100)"; }; range { name "level06_time_bonus"; start $a151; end $a152; type wordtable; comment "amount of time bonus at start of level"; }; range { name "level06_offs_19"; start $a153; end $a153; type bytetable; comment "always $00"; }; range { name "level06_unkn_table0"; start $a154; end $a155; type addrtable; comment "pointer to ROM table or $06xx"; }; range { name "level06_map"; start $a156; end $a157; type addrtable; comment "used to draw the level initially (see also map_changes)"; }; range { name "level06_map_bombs"; start $a158; end $a159; type addrtable; comment "start of bombs in map data (which must come last!)"; }; range { name "level06_bomblist"; start $a15a; end $a15b; type addrtable; comment "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."; }; range { name "level06_map_changes"; start $a15c; end $a15d; type addrtable; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; }; range { name "level06_indirect_subs"; start $a15e; end $a15f; type bytetable; comment "pointer to list of indirect subs, always $0000 in this game"; }; range { name "level06_sub_bomb"; start $a160; end $a161; type addrtable; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; }; range { name "level06_init"; start $a162; end $a163; type addrtable; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; }; range { name "level06_sub6"; start $a164; end $a165; type addrtable; comment "always $9740 aka game_main_loop"; }; range { name "level06_sub_eol"; start $a166; end $a167; type addrtable; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; }; range { name "level06_offs_40"; start $a168; end $a16d; type bytetable; comment "all zeroes"; }; range { name "level06_colpf3"; start $a16e; end $a16e; type bytetable; comment "color for missiles (aka 5th player)"; }; range { name "level06_colpf0"; start $a16f; end $a16f; type bytetable; comment "color for girders and up-ropes"; }; range { name "level06_colpf1"; start $a170; end $a170; type bytetable; comment "color for ladders and down-ropes"; }; range { name "level06_colpf2"; start $a171; end $a171; type bytetable; comment "color for bombs"; }; range { name "level06_offs_50"; start $a172; end $a176; type bytetable; comment "unknown"; }; range { name "level06_offs_55"; start $a177; end $a179; type bytetable; comment "unknown, always $00 $00 $00"; }; range { name "level06_offs_58"; start $a17a; end $a17b; type bytetable; comment "unknown, not a ROM address"; }; range { name "level06_offs_60"; start $a17c; end $a17f; type bytetable; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; }; range { name "level07_desc"; start $a180; end $a181; type bytetable; comment "Descriptor for Zig-Zag. first 2 bytes are level number in screencodes"; }; range { name "level07_sub0"; start $a182; end $a183; type addrtable; comment "a subroutine"; }; range { name "level07_sub1"; start $a184; end $a185; type addrtable; comment "a subroutine"; }; range { name "level07_sub2"; start $a186; end $a187; type addrtable; comment "a subroutine"; }; range { name "level07_sub3"; start $a188; end $a189; type addrtable; comment "a subroutine"; }; range { name "level07_num_bombs"; start $a18a; end $a18a; type bytetable; comment "number of bombs to pick up on this level"; }; range { name "level07_bullet_max"; start $a18b; end $a18b; type bytetable; comment "0 = no bullets, range 0-4."; }; range { name "level07_y_start"; start $a18c; end $a18c; type bytetable; comment "jumpman starting Y position"; }; range { name "level07_x_start"; start $a18d; end $a18d; type bytetable; comment "jumpman starting X position"; }; range { name "level07_fudge_x"; start $a18e; end $a18e; type bytetable; comment "fudge factor for bomb locations, always $00"; }; range { name "level07_fudge_y"; start $a18f; end $a18f; type bytetable; comment "fudge factor for bomb locations, always $06"; }; range { name "level07_points_per_bomb"; start $a190; end $a190; type bytetable; comment "points awarded per bomb pickup (always $64 aka 100)"; }; range { name "level07_time_bonus"; start $a191; end $a192; type wordtable; comment "amount of time bonus at start of level"; }; range { name "level07_offs_19"; start $a193; end $a193; type bytetable; comment "always $00"; }; range { name "level07_unkn_table0"; start $a194; end $a195; type addrtable; comment "pointer to ROM table or $06xx"; }; range { name "level07_map"; start $a196; end $a197; type addrtable; comment "used to draw the level initially (see also map_changes)"; }; range { name "level07_map_bombs"; start $a198; end $a199; type addrtable; comment "start of bombs in map data (which must come last!)"; }; range { name "level07_bomblist"; start $a19a; end $a19b; type addrtable; comment "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."; }; range { name "level07_map_changes"; start $a19c; end $a19d; type addrtable; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; }; range { name "level07_indirect_subs"; start $a19e; end $a19f; type bytetable; comment "pointer to list of indirect subs, always $0000 in this game"; }; range { name "level07_sub_bomb"; start $a1a0; end $a1a1; type addrtable; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; }; range { name "level07_init"; start $a1a2; end $a1a3; type addrtable; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; }; range { name "level07_sub6"; start $a1a4; end $a1a5; type addrtable; comment "always $9740 aka game_main_loop"; }; range { name "level07_sub_eol"; start $a1a6; end $a1a7; type addrtable; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; }; range { name "level07_offs_40"; start $a1a8; end $a1ad; type bytetable; comment "all zeroes"; }; range { name "level07_colpf3"; start $a1ae; end $a1ae; type bytetable; comment "color for missiles (aka 5th player)"; }; range { name "level07_colpf0"; start $a1af; end $a1af; type bytetable; comment "color for girders and up-ropes"; }; range { name "level07_colpf1"; start $a1b0; end $a1b0; type bytetable; comment "color for ladders and down-ropes"; }; range { name "level07_colpf2"; start $a1b1; end $a1b1; type bytetable; comment "color for bombs"; }; range { name "level07_offs_50"; start $a1b2; end $a1b6; type bytetable; comment "unknown"; }; range { name "level07_offs_55"; start $a1b7; end $a1b9; type bytetable; comment "unknown, always $00 $00 $00"; }; range { name "level07_offs_58"; start $a1ba; end $a1bb; type bytetable; comment "unknown, not a ROM address"; }; range { name "level07_offs_60"; start $a1bc; end $a1bf; type bytetable; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; }; range { name "level08_desc"; start $a1c0; end $a1c1; type bytetable; comment "Descriptor for Spellbound. first 2 bytes are level number in screencodes"; }; range { name "level08_sub0"; start $a1c2; end $a1c3; type addrtable; comment "a subroutine"; }; range { name "level08_sub1"; start $a1c4; end $a1c5; type addrtable; comment "a subroutine"; }; range { name "level08_sub2"; start $a1c6; end $a1c7; type addrtable; comment "a subroutine"; }; range { name "level08_sub3"; start $a1c8; end $a1c9; type addrtable; comment "a subroutine"; }; range { name "level08_num_bombs"; start $a1ca; end $a1ca; type bytetable; comment "number of bombs to pick up on this level"; }; range { name "level08_bullet_max"; start $a1cb; end $a1cb; type bytetable; comment "0 = no bullets, range 0-4."; }; range { name "level08_y_start"; start $a1cc; end $a1cc; type bytetable; comment "jumpman starting Y position"; }; range { name "level08_x_start"; start $a1cd; end $a1cd; type bytetable; comment "jumpman starting X position"; }; range { name "level08_fudge_x"; start $a1ce; end $a1ce; type bytetable; comment "fudge factor for bomb locations, always $00"; }; range { name "level08_fudge_y"; start $a1cf; end $a1cf; type bytetable; comment "fudge factor for bomb locations, always $06"; }; range { name "level08_points_per_bomb"; start $a1d0; end $a1d0; type bytetable; comment "points awarded per bomb pickup (always $64 aka 100)"; }; range { name "level08_time_bonus"; start $a1d1; end $a1d2; type wordtable; comment "amount of time bonus at start of level"; }; range { name "level08_offs_19"; start $a1d3; end $a1d3; type bytetable; comment "always $00"; }; range { name "level08_unkn_table0"; start $a1d4; end $a1d5; type addrtable; comment "pointer to ROM table or $06xx"; }; range { name "level08_map"; start $a1d6; end $a1d7; type addrtable; comment "used to draw the level initially (see also map_changes)"; }; range { name "level08_map_bombs"; start $a1d8; end $a1d9; type addrtable; comment "start of bombs in map data (which must come last!)"; }; range { name "level08_bomblist"; start $a1da; end $a1db; type addrtable; comment "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."; }; range { name "level08_map_changes"; start $a1dc; end $a1dd; type addrtable; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; }; range { name "level08_indirect_subs"; start $a1de; end $a1df; type bytetable; comment "pointer to list of indirect subs, always $0000 in this game"; }; range { name "level08_sub_bomb"; start $a1e0; end $a1e1; type addrtable; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; }; range { name "level08_init"; start $a1e2; end $a1e3; type addrtable; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; }; range { name "level08_sub6"; start $a1e4; end $a1e5; type addrtable; comment "always $9740 aka game_main_loop"; }; range { name "level08_sub_eol"; start $a1e6; end $a1e7; type addrtable; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; }; range { name "level08_offs_40"; start $a1e8; end $a1ed; type bytetable; comment "all zeroes"; }; range { name "level08_colpf3"; start $a1ee; end $a1ee; type bytetable; comment "color for missiles (aka 5th player)"; }; range { name "level08_colpf0"; start $a1ef; end $a1ef; type bytetable; comment "color for girders and up-ropes"; }; range { name "level08_colpf1"; start $a1f0; end $a1f0; type bytetable; comment "color for ladders and down-ropes"; }; range { name "level08_colpf2"; start $a1f1; end $a1f1; type bytetable; comment "color for bombs"; }; range { name "level08_offs_50"; start $a1f2; end $a1f6; type bytetable; comment "unknown"; }; range { name "level08_offs_55"; start $a1f7; end $a1f9; type bytetable; comment "unknown, always $00 $00 $00"; }; range { name "level08_offs_58"; start $a1fa; end $a1fb; type bytetable; comment "unknown, not a ROM address"; }; range { name "level08_offs_60"; start $a1fc; end $a1ff; type bytetable; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; }; range { name "level09_desc"; start $a200; end $a201; type bytetable; comment "Descriptor for Blackout. first 2 bytes are level number in screencodes"; }; range { name "level09_sub0"; start $a202; end $a203; type addrtable; comment "a subroutine"; }; range { name "level09_sub1"; start $a204; end $a205; type addrtable; comment "a subroutine"; }; range { name "level09_sub2"; start $a206; end $a207; type addrtable; comment "a subroutine"; }; range { name "level09_sub3"; start $a208; end $a209; type addrtable; comment "a subroutine"; }; range { name "level09_num_bombs"; start $a20a; end $a20a; type bytetable; comment "number of bombs to pick up on this level"; }; range { name "level09_bullet_max"; start $a20b; end $a20b; type bytetable; comment "0 = no bullets, range 0-4."; }; range { name "level09_y_start"; start $a20c; end $a20c; type bytetable; comment "jumpman starting Y position"; }; range { name "level09_x_start"; start $a20d; end $a20d; type bytetable; comment "jumpman starting X position"; }; range { name "level09_fudge_x"; start $a20e; end $a20e; type bytetable; comment "fudge factor for bomb locations, always $00"; }; range { name "level09_fudge_y"; start $a20f; end $a20f; type bytetable; comment "fudge factor for bomb locations, always $06"; }; range { name "level09_points_per_bomb"; start $a210; end $a210; type bytetable; comment "points awarded per bomb pickup (always $64 aka 100)"; }; range { name "level09_time_bonus"; start $a211; end $a212; type wordtable; comment "amount of time bonus at start of level"; }; range { name "level09_offs_19"; start $a213; end $a213; type bytetable; comment "always $00"; }; range { name "level09_unkn_table0"; start $a214; end $a215; type addrtable; comment "pointer to ROM table or $06xx"; }; range { name "level09_map"; start $a216; end $a217; type addrtable; comment "used to draw the level initially (see also map_changes)"; }; range { name "level09_map_bombs"; start $a218; end $a219; type addrtable; comment "start of bombs in map data (which must come last!)"; }; range { name "level09_bomblist"; start $a21a; end $a21b; type addrtable; comment "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."; }; range { name "level09_map_changes"; start $a21c; end $a21d; type addrtable; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; }; range { name "level09_indirect_subs"; start $a21e; end $a21f; type bytetable; comment "pointer to list of indirect subs, always $0000 in this game"; }; range { name "level09_sub_bomb"; start $a220; end $a221; type addrtable; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; }; range { name "level09_init"; start $a222; end $a223; type addrtable; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; }; range { name "level09_sub6"; start $a224; end $a225; type addrtable; comment "always $9740 aka game_main_loop"; }; range { name "level09_sub_eol"; start $a226; end $a227; type addrtable; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; }; range { name "level09_offs_40"; start $a228; end $a22d; type bytetable; comment "all zeroes"; }; range { name "level09_colpf3"; start $a22e; end $a22e; type bytetable; comment "color for missiles (aka 5th player)"; }; range { name "level09_colpf0"; start $a22f; end $a22f; type bytetable; comment "color for girders and up-ropes"; }; range { name "level09_colpf1"; start $a230; end $a230; type bytetable; comment "color for ladders and down-ropes"; }; range { name "level09_colpf2"; start $a231; end $a231; type bytetable; comment "color for bombs"; }; range { name "level09_offs_50"; start $a232; end $a236; type bytetable; comment "unknown"; }; range { name "level09_offs_55"; start $a237; end $a239; type bytetable; comment "unknown, always $00 $00 $00"; }; range { name "level09_offs_58"; start $a23a; end $a23b; type bytetable; comment "unknown, not a ROM address"; }; range { name "level09_offs_60"; start $a23c; end $a23f; type bytetable; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; }; range { name "level10_desc"; start $a240; end $a241; type bytetable; comment "Descriptor for HereThereEverywhere. first 2 bytes are level number in screencodes"; }; range { name "level10_sub0"; start $a242; end $a243; type addrtable; comment "a subroutine"; }; range { name "level10_sub1"; start $a244; end $a245; type addrtable; comment "a subroutine"; }; range { name "level10_sub2"; start $a246; end $a247; type addrtable; comment "a subroutine"; }; range { name "level10_sub3"; start $a248; end $a249; type addrtable; comment "a subroutine"; }; range { name "level10_num_bombs"; start $a24a; end $a24a; type bytetable; comment "number of bombs to pick up on this level"; }; range { name "level10_bullet_max"; start $a24b; end $a24b; type bytetable; comment "0 = no bullets, range 0-4."; }; range { name "level10_y_start"; start $a24c; end $a24c; type bytetable; comment "jumpman starting Y position"; }; range { name "level10_x_start"; start $a24d; end $a24d; type bytetable; comment "jumpman starting X position"; }; range { name "level10_fudge_x"; start $a24e; end $a24e; type bytetable; comment "fudge factor for bomb locations, always $00"; }; range { name "level10_fudge_y"; start $a24f; end $a24f; type bytetable; comment "fudge factor for bomb locations, always $06"; }; range { name "level10_points_per_bomb"; start $a250; end $a250; type bytetable; comment "points awarded per bomb pickup (always $64 aka 100)"; }; range { name "level10_time_bonus"; start $a251; end $a252; type wordtable; comment "amount of time bonus at start of level"; }; range { name "level10_offs_19"; start $a253; end $a253; type bytetable; comment "always $00"; }; range { name "level10_unkn_table0"; start $a254; end $a255; type addrtable; comment "pointer to ROM table or $06xx"; }; range { name "level10_map"; start $a256; end $a257; type addrtable; comment "used to draw the level initially (see also map_changes)"; }; range { name "level10_map_bombs"; start $a258; end $a259; type addrtable; comment "start of bombs in map data (which must come last!)"; }; range { name "level10_bomblist"; start $a25a; end $a25b; type addrtable; comment "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."; }; range { name "level10_map_changes"; start $a25c; end $a25d; type addrtable; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; }; range { name "level10_indirect_subs"; start $a25e; end $a25f; type bytetable; comment "pointer to list of indirect subs, always $0000 in this game"; }; range { name "level10_sub_bomb"; start $a260; end $a261; type addrtable; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; }; range { name "level10_init"; start $a262; end $a263; type addrtable; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; }; range { name "level10_sub6"; start $a264; end $a265; type addrtable; comment "always $9740 aka game_main_loop"; }; range { name "level10_sub_eol"; start $a266; end $a267; type addrtable; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; }; range { name "level10_offs_40"; start $a268; end $a26d; type bytetable; comment "all zeroes"; }; range { name "level10_colpf3"; start $a26e; end $a26e; type bytetable; comment "color for missiles (aka 5th player)"; }; range { name "level10_colpf0"; start $a26f; end $a26f; type bytetable; comment "color for girders and up-ropes"; }; range { name "level10_colpf1"; start $a270; end $a270; type bytetable; comment "color for ladders and down-ropes"; }; range { name "level10_colpf2"; start $a271; end $a271; type bytetable; comment "color for bombs"; }; range { name "level10_offs_50"; start $a272; end $a276; type bytetable; comment "unknown"; }; range { name "level10_offs_55"; start $a277; end $a279; type bytetable; comment "unknown, always $00 $00 $00"; }; range { name "level10_offs_58"; start $a27a; end $a27b; type bytetable; comment "unknown, not a ROM address"; }; range { name "level10_offs_60"; start $a27c; end $a27f; type bytetable; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; }; range { name "level11_desc"; start $a280; end $a281; type bytetable; comment "Descriptor for Hatchlings. first 2 bytes are level number in screencodes"; }; range { name "level11_sub0"; start $a282; end $a283; type addrtable; comment "a subroutine"; }; range { name "level11_sub1"; start $a284; end $a285; type addrtable; comment "a subroutine"; }; range { name "level11_sub2"; start $a286; end $a287; type addrtable; comment "a subroutine"; }; range { name "level11_sub3"; start $a288; end $a289; type addrtable; comment "a subroutine"; }; range { name "level11_num_bombs"; start $a28a; end $a28a; type bytetable; comment "number of bombs to pick up on this level"; }; range { name "level11_bullet_max"; start $a28b; end $a28b; type bytetable; comment "0 = no bullets, range 0-4."; }; range { name "level11_y_start"; start $a28c; end $a28c; type bytetable; comment "jumpman starting Y position"; }; range { name "level11_x_start"; start $a28d; end $a28d; type bytetable; comment "jumpman starting X position"; }; range { name "level11_fudge_x"; start $a28e; end $a28e; type bytetable; comment "fudge factor for bomb locations, always $00"; }; range { name "level11_fudge_y"; start $a28f; end $a28f; type bytetable; comment "fudge factor for bomb locations, always $06"; }; range { name "level11_points_per_bomb"; start $a290; end $a290; type bytetable; comment "points awarded per bomb pickup (always $64 aka 100)"; }; range { name "level11_time_bonus"; start $a291; end $a292; type wordtable; comment "amount of time bonus at start of level"; }; range { name "level11_offs_19"; start $a293; end $a293; type bytetable; comment "always $00"; }; range { name "level11_unkn_table0"; start $a294; end $a295; type addrtable; comment "pointer to ROM table or $06xx"; }; range { name "level11_map"; start $a296; end $a297; type addrtable; comment "used to draw the level initially (see also map_changes)"; }; range { name "level11_map_bombs"; start $a298; end $a299; type addrtable; comment "start of bombs in map data (which must come last!)"; }; range { name "level11_bomblist"; start $a29a; end $a29b; type addrtable; comment "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."; }; range { name "level11_map_changes"; start $a29c; end $a29d; type addrtable; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; }; range { name "level11_indirect_subs"; start $a29e; end $a29f; type bytetable; comment "pointer to list of indirect subs, always $0000 in this game"; }; range { name "level11_sub_bomb"; start $a2a0; end $a2a1; type addrtable; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; }; range { name "level11_init"; start $a2a2; end $a2a3; type addrtable; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; }; range { name "level11_sub6"; start $a2a4; end $a2a5; type addrtable; comment "always $9740 aka game_main_loop"; }; range { name "level11_sub_eol"; start $a2a6; end $a2a7; type addrtable; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; }; range { name "level11_offs_40"; start $a2a8; end $a2ad; type bytetable; comment "all zeroes"; }; range { name "level11_colpf3"; start $a2ae; end $a2ae; type bytetable; comment "color for missiles (aka 5th player)"; }; range { name "level11_colpf0"; start $a2af; end $a2af; type bytetable; comment "color for girders and up-ropes"; }; range { name "level11_colpf1"; start $a2b0; end $a2b0; type bytetable; comment "color for ladders and down-ropes"; }; range { name "level11_colpf2"; start $a2b1; end $a2b1; type bytetable; comment "color for bombs"; }; range { name "level11_offs_50"; start $a2b2; end $a2b6; type bytetable; comment "unknown"; }; range { name "level11_offs_55"; start $a2b7; end $a2b9; type bytetable; comment "unknown, always $00 $00 $00"; }; range { name "level11_offs_58"; start $a2ba; end $a2bb; type bytetable; comment "unknown, not a ROM address"; }; range { name "level11_offs_60"; start $a2bc; end $a2bf; type bytetable; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; }; range { name "level12_desc"; start $a2c0; end $a2c1; type bytetable; comment "Descriptor for Hurricane. first 2 bytes are level number in screencodes"; }; range { name "level12_sub0"; start $a2c2; end $a2c3; type addrtable; comment "a subroutine"; }; range { name "level12_sub1"; start $a2c4; end $a2c5; type addrtable; comment "a subroutine"; }; range { name "level12_sub2"; start $a2c6; end $a2c7; type addrtable; comment "a subroutine"; }; range { name "level12_sub3"; start $a2c8; end $a2c9; type addrtable; comment "a subroutine"; }; range { name "level12_num_bombs"; start $a2ca; end $a2ca; type bytetable; comment "number of bombs to pick up on this level"; }; range { name "level12_bullet_max"; start $a2cb; end $a2cb; type bytetable; comment "0 = no bullets, range 0-4."; }; range { name "level12_y_start"; start $a2cc; end $a2cc; type bytetable; comment "jumpman starting Y position"; }; range { name "level12_x_start"; start $a2cd; end $a2cd; type bytetable; comment "jumpman starting X position"; }; range { name "level12_fudge_x"; start $a2ce; end $a2ce; type bytetable; comment "fudge factor for bomb locations, always $00"; }; range { name "level12_fudge_y"; start $a2cf; end $a2cf; type bytetable; comment "fudge factor for bomb locations, always $06"; }; range { name "level12_points_per_bomb"; start $a2d0; end $a2d0; type bytetable; comment "points awarded per bomb pickup (always $64 aka 100)"; }; range { name "level12_time_bonus"; start $a2d1; end $a2d2; type wordtable; comment "amount of time bonus at start of level"; }; range { name "level12_offs_19"; start $a2d3; end $a2d3; type bytetable; comment "always $00"; }; range { name "level12_unkn_table0"; start $a2d4; end $a2d5; type addrtable; comment "pointer to ROM table or $06xx"; }; range { name "level12_map"; start $a2d6; end $a2d7; type addrtable; comment "used to draw the level initially (see also map_changes)"; }; range { name "level12_map_bombs"; start $a2d8; end $a2d9; type addrtable; comment "start of bombs in map data (which must come last!)"; }; range { name "level12_bomblist"; start $a2da; end $a2db; type addrtable; comment "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."; }; range { name "level12_map_changes"; start $a2dc; end $a2dd; type addrtable; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; }; range { name "level12_indirect_subs"; start $a2de; end $a2df; type bytetable; comment "pointer to list of indirect subs, always $0000 in this game"; }; range { name "level12_sub_bomb"; start $a2e0; end $a2e1; type addrtable; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; }; range { name "level12_init"; start $a2e2; end $a2e3; type addrtable; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; }; range { name "level12_sub6"; start $a2e4; end $a2e5; type addrtable; comment "always $9740 aka game_main_loop"; }; range { name "level12_sub_eol"; start $a2e6; end $a2e7; type addrtable; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; }; range { name "level12_offs_40"; start $a2e8; end $a2ed; type bytetable; comment "all zeroes"; }; range { name "level12_colpf3"; start $a2ee; end $a2ee; type bytetable; comment "color for missiles (aka 5th player)"; }; range { name "level12_colpf0"; start $a2ef; end $a2ef; type bytetable; comment "color for girders and up-ropes"; }; range { name "level12_colpf1"; start $a2f0; end $a2f0; type bytetable; comment "color for ladders and down-ropes"; }; range { name "level12_colpf2"; start $a2f1; end $a2f1; type bytetable; comment "color for bombs"; }; range { name "level12_offs_50"; start $a2f2; end $a2f6; type bytetable; comment "unknown"; }; range { name "level12_offs_55"; start $a2f7; end $a2f9; type bytetable; comment "unknown, always $00 $00 $00"; }; range { name "level12_offs_58"; start $a2fa; end $a2fb; type bytetable; comment "unknown, not a ROM address"; }; range { name "level12_offs_60"; start $a2fc; end $a2ff; type bytetable; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; };