aboutsummaryrefslogtreecommitdiff
path: root/main.info
diff options
context:
space:
mode:
Diffstat (limited to 'main.info')
-rw-r--r--main.info501
1 files changed, 501 insertions, 0 deletions
diff --git a/main.info b/main.info
new file mode 100644
index 0000000..543d4ff
--- /dev/null
+++ b/main.info
@@ -0,0 +1,501 @@
+
+# da65 info file for jumpman junior ROM.
+
+GLOBAL {
+ OUTPUTNAME "jumpmanjr.dasm";
+ INPUTNAME "jumpmanjr.rom";
+ STARTADDR $8000;
+ CPU "6502";
+ COMMENTS 4;
+};
+
+#SEGMENT { START $8000; END $BFFF; NAME "jumpmanjr"; };
+
+ASMINC { FILE "jumpmanjr.inc"; };
+
+# RANGE { START $whatever; END $whatever; TYPE Code|ByteTable|AddrTable|RtsTable; }
+
+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; };
+
+label { name "copy_level_desc_2"; addr $9677; comment "copy level descriptor to $0780"; };
+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 $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)"; };
+
+range { name "code_99f7"; start $99F7; end $9A1B; type code; };
+range { name "data_8406"; start $8406; end $840c; type bytetable; };
+range { name "data_9a1c"; start $9a1c; end $9A5B; type bytetable; };
+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 "FR1"; addr $00e0; size 6; };
+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 "missiles_mask_table_minus_one"; addr $82df; };
+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_mask_table"; start $82e0; end $82E7; type bytetable; };
+range { name "missiles_done"; start $82DD; end $82df; type code; };
+range { name "position_missiles"; start $8293; end $82DA; type code; };
+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_collisions_1"; addr $8F73; size 1; comment "did any missile hit a player, or did players 2 or 3 hit a player..."; };
+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 "did player 0 or 1 hit the playfield..."; };
+label { name "collision_save"; addr $06B0; size 16; comment "save_collisions copies GTIA collision regs $D000-$d00f here"; };
+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"; };
+range { name "gr7_or_masks"; start $8143; end $8152; type bytetable; };
+range { name "gr7_and_masks"; start $8153; end $8156; type bytetable; };
+range { name "data_8892"; start $8892; end $88A7; type bytetable; };
+range { name "data_8dfa"; start $8DFA; end $8DFF; type bytetable; };
+range { name "data_8f43"; start $8F43; end $8f72; type bytetable; };
+
+##range { name "mus0_addr1"; start $8FC3; end $8fc4; type addrtable; comment "mus struct table, 5 bytes per entry: 0/1 are an address, 2/3 are another, 5 is maybe the length? tempo?"; };
+##range { name "mus0_addr2"; start $8FC5; end $8fc6; type addrtable; };
+##range { name "mus0_len_or_tempo"; start $8FC7; end $8fc7; type bytetable; };
+##
+##range { name "mus1_addr1"; start $8FC8; end $8fc9; type addrtable; };
+##range { name "mus1_addr2"; start $8FCA; end $8fcb; type addrtable; };
+##range { name "mus1_len_or_tempo"; start $8FCC; end $8fcc; type bytetable; };
+##
+##range { name "mus2_addr1"; start $8FC8; end $8fc9; type addrtable; };
+##range { name "mus2_addr2"; start $8FCA; end $8fcb; type addrtable; };
+##range { name "mus2_len_or_tempo"; start $8FCC; end $8fcc; type bytetable; };
+
+#range { name "more_mus"; start $8FC8; end $8fff; type bytetable; comment "more 5-byte structs"; };
+
+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_len_or_tempo"; 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_len_or_tempo"; 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_len_or_tempo"; 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_len_or_tempo"; 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_len_or_tempo"; 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_len_or_tempo"; 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_len_or_tempo"; 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_len_or_tempo"; 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_len_or_tempo"; 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_len_or_tempo"; 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_len_or_tempo"; 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_len_or_tempo"; 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 "sfx_tempo_tmp"; addr $0661; comment "??"; };
+label { name "sfx_slot_curpos"; addr $064E; size 2; comment "address we've got to so far, playing this sfx"; };
+label { name "sfx_slot_tempo"; addr $063E; size 1; comment "tempo of this sfx"; };
+label { name "sfx_lock"; addr $062F; size 1; comment "lets other code know cue_sfx is still running? not 100% sure"; };
+label { name "inc_sfx_pos"; addr $8231; size 1; comment "point to next byte in current sfx slot indexed by X"; };
+label { name "sfx_finished"; addr $8226; size 1; comment "done playing this sfx, free up the slot, X-indexed"; };
+label { name "sfx_next_note"; addr $817D; size 1; };
+label { name "sfx_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_sfx_slot"; addr $815F; size 1; };
+label { name "sfx_exit"; addr $815E; size 1; };
+label { name "is_slot_active"; addr $8163; size 1; comment "skip it, if slot is inactive"; };
+label { name "sfx_slot_timer"; addr $063F; size 1; };
+label { name "sfx_slot_duration"; addr $0646; size 1; };
+label { name "sfx_play_note"; addr $8206; size 1; comment "y==0, a>=4 on entry"; };
+label { name "sfx_play_rest"; addr $819E; size 1; comment "y==0 on entry"; };
+label { name "sfx_change_tempo"; addr $81AE; size 1; comment "y==0 on entry"; };
+label { name "sfx_jump"; addr $81C8; size 1; comment "I *think* this jumps to a different sfx address..."; };
+label { name "sfx_slot_freq"; addr $0647; size 1; };
+
+range { name "sfx00"; start $BDF2; end $BE24; type bytetable; };
+range { name "sfx01"; start $BE25; end $BE78; type bytetable; };
+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 "sfx12"; 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 $BFF9; type bytetable; comment "funeral march bass"; };
+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"; };
+range { name "code_adb5"; start $ADB5; end $adc0; type code; };
+range { name "code_adc1"; start $adc1; end $adc3; type code; };
+range { name "data_9134"; start $9134; end $9139; type bytetable; };
+label { name "maybe_data"; addr $913A; comment "this might be more data for the above table instead of code?"; };
+label { name "probly_code"; addr $913D; comment "this probably really is code"; };
+label { name "illegal_nop"; addr $AF1B; comment "NMOS 6502 illegal opcode, NOP zp"; };
+range { name "data_9afc"; start $9AFC; end $9aff; type bytetable; };
+range { name "num_player_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 "numplayer_screen_data_minus_one"; addr $959a; comment "1-indexed loop copies from here+1"; };
+range { name "numplayer_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 "data_table_8a39"; start $8a39; end $8a7f; type bytetable; };
+range { name "data_table_86da"; start $86da; end $8713; type bytetable; };
+range { name "level_name_hscrol_table"; start $BBF0; end $BBff; type bytetable; comment "used for centering level name on gameboard"; };
+range { name "zero_filler_b8bf"; start $b8bf; end $b96a; type bytetable; comment "all zeroes, filler?"; };
+range { name "zero_filler_baab"; start $baab; end $babb; type bytetable; comment "filler?"; };
+range { name "code_bccd"; start $bccd; end $bcd8; type code; comment "dunno, but referenced by code at $BC6A"; };
+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"; };
+range { name "well_done_shape"; start $bda0; end $bdc6; type bytetable; comment "used to draw the large WELL DONE banner"; };
+range { name "total_score_msg"; start $bdd2; end $bdf1; type bytetable; comment "not sure what displays this, but it's screen codes"; };
+range { name "zero_filler_8588"; start $B588; end $B696; type bytetable; };
+range { name "wind_table_1"; start $B76B; end $b7bf; type bytetable; comment "used in level11"; };
+label { name "wind_table_2"; addr $b771; };
+range { name "level00_map"; start $A300; end $a497; type bytetable; comment "level map data starts here"; };
+range { name "sfx_a52d"; start $A52D; end $A53C; type bytetable; comment "dunno, referenced by routine at $A50F"; };
+range { name "data_table_a542"; start $A542; end $A68B; type bytetable; comment "dunno, referenced by routine at $A498"; };
+range { name "dumbwaiter_player"; start $a782; end $A826; type bytetable; comment "the dumbwaiters from level02. stored upside-down."; };
+label { name "dw_platform_player"; addr $A685; comment "horizontally moving platforms from level02"; };
+range { name "data_table_a8fd"; start $a8fd; end $A9C6; type bytetable; comment "dunno, referenced by routine at $A8D4"; };
+range { name "map_aa90"; start $aa90; end $AD67; type bytetable; comment "dunno what this is for yet"; };
+label { name "map_aaa6"; addr $aaa6; comment "referenced by routine at $AA82"; };
+range { name "data_table_adc7"; start $adc7; end $af0c; type bytetable; comment "dunno, referenced by routines at $AD9E and $ADB5"; };
+range { name "sfx_afcb"; start $AFCB; end $b0c3; type bytetable; comment "referenced by routine at $AF96"; };
+label { name "map_b000"; addr $b000; comment "referenced by routine at $B0C4"; };
+range { name "data_table_85b6"; start $85b6; end $85bd; type bytetable; comment "used in vblank_imm_isr, not sure for what yet"; };
+range { name "data_table_85de"; start $85de; end $85f5; type bytetable; comment "dunno what this is for yet, but it's copied into page 6 by init_hardware"; };
+range { name "zero_filler_85f6"; start $85f6; end $85ff; type bytetable; comment "probably just filler"; };
+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; };
+range { name "color0_table_minus_one"; start $9727; end $9727; type bytetable; };
+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_blank_4x4"; addr $9C49; };
+label { name "sh_ladder"; addr $9C5F; };
+label { name "sh_9c89"; addr $9c89; comment "dunno what this is yet"; };
+label { name "sh_bomb"; addr $9cb3; };
+label { name "sh_up_rope"; addr $9cc9; };
+label { name "sh_down_rope"; addr $9cda; };
+label { name "sh_9ceb"; addr $9ceb; comment "dunno what this is yet"; };
+range { name "sprite_table"; start $9d00; end $9dff; type bytetable; comment "jumpman's animation frames and other sprites, seem to be 10 bytes per sprite"; };
+range { name "sxf_b319"; start $b319; end $B44B; type bytetable; comment "referenced by routine at $B2FD"; };
+range { name "data_table_b1df"; start $b1df; end $B27d; type bytetable; comment "dunno what this is for yet"; };
+range { name "data_table_b2a8"; start $b2a8; end $B2df; type bytetable; comment "dunno what this is for yet"; };
+range { name "data_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 number"; };
+label { name "continue_loop"; addr $8BD5; };
+label { name "check_alive"; addr $8BE9; comment "player 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 "jiffy_timer_1"; addr $061A; comment "gets incremented every frame"; };
+label { name "jiffy_timer_2"; addr $061B; comment "gets incremented every frame"; };
+label { name "bonus_jiffy_timer"; addr $0626; comment "gets incremented every frame when playing a level, bonus-=100 when this reaches 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, tempo (?) A"; };
+label { name "cue_sfx_lowprior"; addr $8240; comment "if cue_sfx not already in progress, setup to play sfx at (sfx_slot_tempo, sfx_lock) tempo (?) A"; };
+label { name "sfx_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-player struct?"; };
+label { name "struct_player_lives_offsets_minus_one"; addr $8C88; };
+label { name "struct_player_lives_offsets"; addr $8C89; comment "lookup table, offset from $713 to lives for indexed player"; };
+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_until_9c_is_0e"; addr $906E; comment "some ISR is writing to $9c..."; };
+label { name "funky_init_loop"; addr $90C8; comment "lot going on here, not understood yet"; };
+label { name "player_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 "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 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; comment "movement_direction_table+31 should read data_table_85de-1, da65 isn't perfect yet"; };
+
+# these are so far only for player 1
+label { name "number_of_players"; addr $06f4; size 1; comment "0 for single-player game, otherwise range 1-3 (2 to 4 players)"; };
+label { name "score"; addr $0700; size 3; };
+label { name "level"; addr $06f6; size 1; };
+label { name "lives"; addr $070a; size 1; };
+label { name "current_player"; addr $06fe; size 1; comment "*think* this ranges 1-4, not 0-3"; };
+label { name "player_speed"; addr $0624; size 1; };
+label { name "initial_speed"; addr $0625; size 1; };
+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)"; };
+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 "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;"; };
+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 "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 "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"; };
+range { name "map_b11a"; start $B11A; end $b120; type bytetable; comment "dunno what this is for yet"; };
+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 $872A; size 1; comment "clear P/M mem"; };
+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_bounce_2"; start $8a97; end $8abf; type bytetable; comment "used when jumpman is falling?"; };
+label { name "sfx_death"; addr $8a60; comment "jumpman hit by bullet or started falling"; };
+label { name "play_sfx_bounce_2"; 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"; };
+label { name "code_bd52"; addr $BD52; comment "referenced by code at $BC83"; };
+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 "init_page_7"; addr $9A5C; };
+label { name "init_page_7_jv"; addr $8024; };
+range { name "data_9a71"; start $9A71; end $9a7b; type bytetable; comment "used by code above"; };
+range { name "l_equals"; start $8CFD; end $8CFF; type bytetable; comment "L= (for lives display)"; };
+label { name "add_extra_life"; addr $8CE4; comment "plays sfx_extra_life"; };
+label { name "show_l_equals"; addr $8CCE; comment "L= (for lives display)"; };
+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 "xxx_level_something"; addr $8600; comment "gets called after the level is drawn & the intro music stops, and also during the level (?)"; };
+label { name "xxx_level_something_jv"; addr $8009; comment "gets called after the level is drawn & the intro music stops, and also during the level (?)"; };
+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 (level00_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 "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; };
+
+# end of main.info, everything below here is generated by mklevelinfo.pl