add debugging instructions

This commit is contained in:
J-DSilva 2023-05-02 21:46:39 -06:00 committed by Michael Miceli
parent 570e84bbcb
commit 730af486ab
11 changed files with 18042 additions and 2 deletions

View File

@ -11,6 +11,7 @@ Falcon](https://www.romhacking.net/hacks/2701/) project.
``` ```
|-- docs - supplemental documentation |-- docs - supplemental documentation
| |-- attachments - files used in other documentation | |-- attachments - files used in other documentation
| |-- debugging - files used to help debugging
| |-- diagrams - mermaid diagram files documenting program flow | |-- diagrams - mermaid diagram files documenting program flow
| |-- lua_scripts - lua scripts for mesen and fceux | |-- lua_scripts - lua scripts for mesen and fceux
| |-- sprite_library - extracted sprites for ease of viewing | |-- sprite_library - extracted sprites for ease of viewing
@ -142,6 +143,34 @@ interesting observations. You can search the code for these annotations.
* `!(UNUSED)` - unused code or data that is never executed nor read * `!(UNUSED)` - unused code or data that is never executed nor read
* `!(OBS)` - observation or note * `!(OBS)` - observation or note
# Debugging
One of the biggest advantages of building this rom is that the build scripts
also build the debugging symbols. Debugging symbols can be read by emulators
and be included in the source view while debugging the game. For example,
[Mesen](https://github.com/SourMesen/Mesen2) will automatically load the
debugging symbols as long as the `contra.dbg` file exists in the same folder as
`contra.nes`. Below is a screenshot of what debugging looks like with symbols.
![Mesen debugger screenshot](docs/attachments/mesen_debugger_screenshot.png?raw=true)
You can see that the debugging symbols file points to the source code to include
comments and labels. If you move or delete the source files, you will lose all
the debugging information.
## FCEUX NameList
[FCEUX](https://fceux.com/web/home.html) doesn't support reading the debugger
symbols, but you can load NameList (`.nl`) files. These files aren't as fully
featured as the debugging symbols file, but does at least allow you to label
jump/branch locations. It doesn't easily support comments on individual lines.
I've included the `.nl` files in `docs/debugging/fceux_namelists`. These files
were generated from the `-Ln contra.labels.txt` command line parameter to
`ld65`. Then the that file was converted to the `.nl` files with a custom
script. I can't promise to keep these up to date as the source labels change,
but I will try to.
# Project History # Project History
I first became interested in this project after watching the I first became interested in this project after watching the
[Summoning Salt](https://www.youtube.com/channel/UCtUbO6rBht0daVIOGML3c8w) video [Summoning Salt](https://www.youtube.com/channel/UCtUbO6rBht0daVIOGML3c8w) video

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,992 @@
$EB40#add_10_to_enemy_y_fract_vel#
$EB88#add_4_to_enemy_y_pos#
$EB27#add_a_to_enemy_x_pos#
$EB42#add_a_to_enemy_y_fract_vel#
$EB1F#add_a_to_enemy_y_pos#
$EB8A#add_a_with_vert_scroll_to_enemy_y_pos#
$EC35#add_a_y_to_enemy_pos_get_bg_collision#
$E8A7#add_scroll_to_enemy_pos#
$EB32#add_with_enemy_pos#
$EC33#add_y_to_y_pos_get_bg_collision#
$E78E#advance_enemy_routine#
$C892#advance_graphic_read_addr#
$F29E#aim_and_create_enemy_bullet#
$F420#aim_var_1_for_quadrant_aim_dir_00#
$F41A#aim_var_1_for_quadrant_aim_dir_01#
$E740#boss_defeated_routine#
$F2BE#bullet_generation#
$EC27#check_enemy_collision_solid_bg#
$EDF8#clear_enemy_custom_vars#
$EDF1#clear_sprite_clear_enemy_pt_3#
$EA23#clear_supertile_bg_collision#
$F2BF#create_enemy_bullet_angle_a#
$EAB7#create_enemy_for_explosion#
$EAAB#create_explosion_89#
$EAB3#create_two_explosion_89#
$C315#decrement_delay_timer#
$E9E5#destroy_all_enemies#
$EB03#disable_bullet_enemy_collision#
$EB07#disable_enemy_collision#
$F4CD#dragon_arm_orb_seek_should_move#
$EBB5#draw_enemy_supertile_a#
$EBAA#draw_enemy_supertile_a_set_delay#
$EB12#enable_bullet_enemy_collision#
$EB16#enable_enemy_collision#
$EB0E#enable_enemy_player_collision_check#
$E7B0#enemy_routine_explosion#
$E74B#enemy_routine_init_explosion#
$E806#enemy_routine_remove_enemy#
$EDD9#find_bullet_slot#
$ED4E#find_far_segment_for_a#
$ED4C#find_far_segment_for_x_pos#
$EDCE#find_next_enemy_slot#
$EDCA#find_next_enemy_slot_6_to_0#
$EB52#generate_enemy_a#
$EB57#generate_enemy_at_pos#
$E0BB#get_bg_collision#
$E087#get_bg_collision_far#
$E0C3#get_cart_bg_collision#
$F52C#get_quadrant_aim_dir_for_player#
$F44D#get_rotate_00#
$F451#get_rotate_01#
$F466#get_rotate_dir#
$C183#init_APU_channels#
$C2FA#init_game_routine_reset_timer_low_byte#
$EC31#init_vars_get_enemy_bg_collision#
$EE47#initialize_enemy#
$EAEA#level_boss_defeated#
$C204#load_A_offset_graphic_data#
$D064#load_alternate_graphics#
$C193#load_bank_3_update_nametable_supertile#
$C1A6#load_bank_3_update_nametable_tiles#
$D105#load_palette_indexes#
$D081#load_palettes_color_to_cpu#
$E752#mortar_shot_routine_03#
$C16B#play_sound#
$ECF5#player_enemy_x_dist#
$ECC7#red_turret_find_target_player#
$EA16#remove_all_enemies#
$E809#remove_enemy#
$C328#reset_delay_timer#
$E91E#reverse_enemy_x_direction#
$E7A4#roller_routine_04#
$C857#run_routine_from_tbl_below#
$EB2F#set_08_09_to_enemy_pos#
$CF27#set_a_as_current_level_routine#
$E3CD#set_bullet_routine_to_2#
$F313#set_bullet_velocities#
$EAF6#set_delay_remove_enemy#
$E974#set_destroyed_enemy_routine#
$E78B#set_enemy_delay_adv_routine#
$ED66#set_enemy_falling_arc_pos#
$E81A#set_enemy_routine_to_a#
$E8CD#set_enemy_velocity_to_0#
$E8D9#set_enemy_x_velocity_to_0#
$E851#set_enemy_y_vel_rem_off_screen#
$E8D0#set_enemy_y_velocity_to_0#
$EC6F#set_flying_capsule_x_vel#
$EC4B#set_flying_capsule_y_vel#
$CF1B#set_graphics_zero_mode#
$E85B#set_outdoor_weapon_item_vel#
$EA25#set_supertile_bg_collision#
$EA26#set_supertile_bg_collisions#
$D8D5#set_vel_for_speed_vars#
$ED9D#set_weapon_item_indoor_velocity#
$E7AA#shared_enemy_routine_03#
$E814#shared_enemy_routine_clear_sprite#
$EBCE#update_2_enemy_supertiles#
$EC0A#update_enemy_nametable_tiles#
$EC08#update_enemy_nametable_tiles_no_palette#
$E837#update_enemy_pos#
$E842#update_enemy_x_pos_rem_off_screen#
$EBA4#update_nametable_tiles_set_delay#
$E737#wall_core_routine_05#
$C9A1#zero_out_nametables#
$FFF6#nes_footer_maker_code#
$FFF5#nes_footer_mirroring#
$FFF4#nes_footer_size#
$FFF2#nes_footer_chr_checksum#
$FFF0#nes_footer_checksum#
$FFE0#nes_footer_rom_name#
$FFD8#konami_catalog_number#
$FF11#unknown_01#
$FCC0#dpcm_sample_01#
$FC51#unknown_00#
$FC00#dpcm_sample_00#
$F612#bank_7_unused_space#
$F5F2#quadrant_aim_dir_02#
$F5D2#quadrant_aim_dir_01#
$F5B2#quadrant_aim_dir_00#
$F5A9#@set_and_exit#
$F5AC#quadrant_aim_dir_lookup_tbl#
$F580#@continue#
$F56C#@shift_get_x_diff#
$F557#@get_x_pos#
$F54D#@get_y_pos#
$F527#@exit#
$F51B#@loop#
$F525#@clear_zero_exit#
$F51F#@continue#
$F528#@set_negative_exit#
$F508#@b3#
$F4F6#@player_below_enemy#
$F4E9#@check_player_vert_pos#
$F4C8#@exit#
$F4BC#@rotate_clockwise#
$F4C6#@rotate_counterclockwise#
$F4C0#@wrapped_rotation_check_dir#
$F4C9#@no_dir_change#
$F4A9#@determine_rotation#
$F495#@continue2#
$F497#@calc_reflected_dir#
$F486#@check_player_pos#
$F475#@continue#
$F463#@get_quadrant_aim_dir#
$F453#get_rotate_dir_for_index#
$F43F#@set_var_1_continue#
$F442#@continue#
$F435#@rotate_1_counterclockwise#
$F44B#@set_carry_exit#
$F423#rotate_enemy_var_1#
$F3F8#bullet_dir_half_a_add_to_vel#
$F3D9#bullet_velocity_adjust_add_a#
$F415#bullet_velocity_adjust_08#
$F3FF#bullet_velocity_adjust_07#
$F3F0#bullet_velocity_adjust_06#
$F3E5#bullet_velocity_adjust_05#
$F3D3#bullet_velocity_adjust_04#
$F3CA#bullet_velocity_adjust_03#
$F3E4#bullet_velocity_adjust_02#
$F3C3#bullet_velocity_adjust_01#
$F3BE#bullet_velocity_adjust_00#
$F3AC#bullet_velocity_adjust_ptr_tbl#
$F37E#@exit#
$F36B#@set_x_vel#
$F3A5#adjust_bullet_velocity#
$F397#bullet_fract_vel_tbl#
$F37F#bullet_fract_vel_dir_lookup_tbl#
$F334#calc_bullet_velocities#
$F303#@continue#
$F32F#bullet_gen_exit#
$F2E4#create_enemy_bullet#
$F2D6#@set_dir_create_bullet#
$F2D1#@continue#
$F2D8#create_enemy_bullet_if_attack_enabled#
$F2B7#@create_bullet_if_appropriate#
$F55E#get_quadrant_aim_dir#
$F2B4#@continue#
$F299#@advance_enemy_routine#
$F277#@generate_mortar_shot#
$F24E#@mortar_shot_routine_01_exit#
$F24F#@split_mortar#
$F214#mortar_shot_adv_routine#
$F217#mortar_shot_velocity_tbl#
$F1F9#@set_mortar_velocities#
$F1DF#@continue#
$F26E#mortar_shot_routine_02#
$F237#mortar_shot_routine_01#
$F1D6#mortar_shot_routine_00#
$F1B1#@add_scroll_exit#
$F1B4#@disable_and_dec_enemy_routine#
$F194#@continue#
$F176#@activate_scuba_soldier#
$F175#@exit#
$F15E#@continue#
$F183#scuba_soldier_routine_02#
$F14C#scuba_soldier_routine_01#
$F147#scuba_soldier_routine_00#
$F12E#turret_man_adv_routine#
$F131#turret_man_bullet_routine_01#
$F11F#turret_man_bullet_routine_00#
$F0EB#turret_man_exit#
$F0EC#turret_man_routine_02#
$F0DB#turret_man_routine_01#
$F0C9#turret_man_routine_00#
$F0BA#wall_plating_adv_enemy_routine#
$F0B1#wall_plating_routine_03#
$F0B0#wall_plating_routine_02#
$F08A#wall_plating_routine_01#
$F085#wall_plating_routine_00#
$F065#@set_delay_set_routine_01#
$F05B#wall_cannon_calc_delay_set_routine_01#
$F05A#wall_cannon_exit_01#
$F045#wall_cannon_bullet_type_and_angle#
$F042#wall_cannon_bullet_x_offset#
$F015#@create_bullet_loop#
$F02D#@continue#
$EFED#wall_cannon_set_delays#
$EFFC#animate_wall_cannon#
$EFEC#wall_cannon_exit#
$EFCE#set_anim_delay_adv_enemy_routine#
$F06D#wall_cannon_routine_04#
$F048#wall_cannon_routine_03#
$F007#wall_cannon_routine_02#
$EFD4#wall_cannon_routine_01#
$EFC7#wall_cannon_routine_00#
$EF5B#enemy_prop_07#
$EF37#enemy_prop_06#
$EF23#enemy_prop_05#
$EF07#enemy_prop_04#
$EEEF#enemy_prop_02#
$EEAB#enemy_prop_01#
$EE9F#enemy_prop_00#
$EE8D#enemy_prop_ptr_tbl#
$EE63#@continue#
$EE0A#clear_enemy_pt_2#
$EE3A#clear_enemy_pt_4#
$EE19#clear_enemy_pt_3#
$EDFC#clear_enemy#
$EDEA#@clear_next_enemy#
$EDE8#bank_7_unused_label_07#
$EDDB#@loop#
$EDD8#find_enemy_routine_slot_exit#
$EDD0#find_next_enemy_slot_x_to_0#
$EDBC#weapon_item_indoor_vel_tbl#
$ED9A#@remove_enemy#
$ED5A#@use_code_0#
$ED5D#@exit#
$ED5F#far_segment_code_tbl#
$ED50#@loop#
$ED4B#@exit#
$ED40#@set_closest#
$ED36#@continue_p1#
$ED2A#@continue#
$ED1B#@continue_to_p2#
$ED24#lda_closer_distance#
$ED02#@continue_to_p2#
$ECF2#@exit#
$ECE4#@continue#
$ED0E#player_enemy_y_dist#
$ECA7#@loop#
$ECB0#@loop2#
$ECB9#@set_vars_exit#
$EC91#bank_7_unused_label_06#
$EC6D#bank_7_unused_label_05#
$EC93#set_flying_capsule_path#
$EC49#bank_7_unused_label_04#
$EC46#@exit#
$EC05#@set_slot_exit#
$EBE4#@continue#
$EC07#@exit#
$EC23#nametable_update_exit#
$EBB7#draw_enemy_supertile_10#
$EBB4#@exit#
$EBAD#update_nametable_set_anim_delay_exit#
$EB83#@exit#
$EB18#enemy_state_width_and_a#
$EB1B#set_enemy_state_width_to_a#
$EB09#enemy_state_width_or_a#
$EAE7#@exit#
$EAB9#create_explosion_a#
$EABD#create_explosion_sequence#
$EAA2#@check_next_loop#
$EA88#@set_collision#
$EA7E#@find_bit_offset#
$EA7C#@continue#
$EAA7#bg_collision_bit_mask_tbl#
$EA6C#@set_quadrant_bg_collision#
$EA64#@set_half_supertile_bg_collisions#
$EA49#@loop#
$EA1A#@loop#
$EA10#@continue#
$E9E9#@enemy_loop#
$E9D9#enemy_destroyed_routine_06#
$E9D4#enemy_destroyed_routine_05#
$E9D1#enemy_destroyed_routine_04#
$E9CD#enemy_destroyed_routine_03#
$E9CA#enemy_destroyed_routine_02#
$E9C1#enemy_destroyed_routine_01#
$E9BF#enemy_destroyed_routine_00#
$E9A2#@exit#
$E998#@set_routine#
$E9AD#enemy_destroyed_routine_ptr_tbl#
$E981#@set_destroyed_routine#
$E9A3#score_codes_tbl#
$E96A#@continue#
$E95E#@add_y_code_to_player_score#
$E930#bank_7_unused_label_03#
$E8C7#bank_7_unused_label_02#
$E8B9#add_horizontal_scroll#
$E886#@set_y_vel_enemy_frame#
$E8B8#scroll_enemy_pos_exit#
$E880#remove_enemy_far#
$E883#set_weapon_item_y_vel_enemy_frame#
$E86F#@set_weapon_item_velocity#
$E8EC#update_enemy_y_pos#
$E900#update_enemy_x_pos_with_scroll#
$E849#apply_vel_exit#
$E90A#update_enemy_x_pos#
$E858#jmp_remove_enemy#
$E8E2#update_enemy_y_pos_with_scroll#
$E84A#update_enemy_x_pos_rem_if_off_screen#
$E835#explosion_type_03#
$E832#explosion_type_02#
$E82E#explosion_type_01#
$E82B#explosion_type_00#
$E823#explosion_type_ptr_tbl#
$E7F0#@continue2#
$E7DF#@continue#
$E805#enemy_routine_explosion_exit#
$E7BA#@continue#
$E7BC#show_explosion_a#
$E797#bank_7_unused_label_01#
$E80E#set_sprite_0#
$E77C#@continue#
$E76A#@skip_explosion_sound#
$E75E#explosion_sound_hide_enemy#
$E736#enemy_routine_do_nothing_00#
$F119#turret_man_bullet_routine_ptr_tbl#
$F0BD#turret_man_routine_ptr_tbl#
$F13B#scuba_soldier_routine_ptr_tbl#
$F1C4#mortar_shot_routine_ptr_tbl#
$F077#wall_plating_routine_ptr_tbl#
$E734#enemy_routine_do_nothing_ptr_tbl#
$EFB7#wall_cannon_routine_ptr_tbl#
$E726#enemy_routine_level_8#
$E714#enemy_routine_level_7#
$E70A#enemy_routine_level_6#
$E6FC#enemy_routine_level_5#
$E6F0#enemy_routine_level_3#
$E6CE#enemy_routine_level_2_4#
$E6C8#enemy_routine_level_1#
$E698#level_enemy_routine_ptr_tbl#
$E66B#exe_enemy_routine_subroutine#
$E6A8#enemy_routine_ptr_tbl#
$E67B#exec_level_enemy_routine#
$E64D#@continue#
$E644#@handle_outdoor#
$E659#exe_enemy_routine#
$E655#advance_enemy#
$E626#exe_enemy_routine_loop#
$E5E2#collision_box_codes_04#
$E5A6#collision_box_codes_03#
$E56A#collision_box_codes_02#
$E52E#collision_box_codes_01#
$E4F2#collision_box_codes_00#
$E4C3#@exit#
$E4B6#@replace_placeholder#
$E4D8#collision_code_f_adj_tbl#
$E4C4#collision_code_f_base_tbl#
$E459#@continue#
$E44B#@collision_code_f#
$E4E8#collision_box_codes_tbl#
$E40C#bullet_hit_sound_tbl#
$E3FA#@play_collision_sound#
$E3ED#@continue#
$E40B#@exit#
$E3BB#@continue_2#
$E3C7#@set_routine_exit#
$E3D8#bullet_collision_logic#
$E39F#@continue#
$E390#@bullet_enemy_collision#
$E371#@bullet_delay#
$E378#@test_collision#
$E38A#@next_bullet#
$E355#@loop#
$E345#bullet_enemy_collision_test#
$E339#@set_player_weapon#
$E320#@continue#
$E316#@set_invincibility_timer#
$E32D#@compare_and_set_weapon#
$E325#@set_rapid_flag#
$E942#add_enemy_score_set_enemy_routine#
$E2EB#@exit_01#
$E340#remove_current_enemy#
$E2D6#@invincible_collision#
$E2EC#pick_up_weapon_item#
$E2BC#@collide_with_enemy#
$E2AE#@check_can_land_on#
$E28E#@set_landing_pos#
$E265#@land_on_enemy#
$E262#@exit_00#
$E29F#@inside_enemy_collision_box#
$E411#set_enemy_collision_box#
$E245#@check_if_enemy_collision#
$E238#@set_collision_code_offset#
$E217#@set_state_width#
$E212#@set_collision_box_code#
$E21C#@check_player_jumping#
$E22A#@check_in_water_crouched#
$E1F7#@handle_outdoor_level#
$E25C#@next_player#
$E1DB#@check_player_x_collision#
$E1D9#check_players_collision#
$E1C9#@supertile_index_loop#
$E1B1#@repeat_level_data_byte#
$E1BB#@set_nametable_supertile_indexes#
$E1A3#@exit#
$E19B#@vertical_level_section_end#
$E18C#load_supertile_indexes_starting_at_y#
$E1A6#load_rle_repeat_command#
$E181#read_supertiles_screen_ptr_table#
$E159#auto_scroll_timer_tbl#
$E157#scroll_trigger_tbl#
$E154#@exit_mark_scroll_enabled#
$E156#@exit#
$E132#collision_code_lookup_tbl#
$E124#@no_shift#
$E122#@shift_2_bits#
$E120#@shift_4_bits#
$E11E#@shift_6_bits#
$E12A#@set_code_exit#
$E130#level_screen_mem_offset_tbl_01#
$E0E6#@bg_collision_data#
$E0D3#@continue#
$E0D1#@vert_overflow#
$E0C5#bg_collision_logic#
$E0BD#get_enemy_bg_collision#
$E105#read_bg_collision_byte#
$E0AD#@exit#
$E08A#floor_get_next_row_bg_collision#
$E077#vert_lvl_tile_collision_exit#
$E05C#set_collision_tile_col_4#
$E04B#set_collision_tile_col_3#
$E065#set_collision_tile#
$E038#set_collision_tile_col_2#
$E020#set_collision_code_03#
$E018#collision_code_2_check#
$E022#collision_continue#
$E010#collision_code_0_check#
$E014#set_collision_code_0#
$E074#tile_collision_exit#
$DFD1#@write_supertile_palette_to_cpu#
$DFE0#@merge_supertiles_across_nametable#
$DFC0#@set_supertile_attribute_byte#
$DF93#@exit#
$DF69#@set_supertile_attribute_byte#
$DEFE#@set_supertile_tiles#
$DFFF#set_tile_collision#
$DE66#load_level_supertile_data#
$DE55#@odd_nametable_column#
$DE04#@continue#
$DE0D#@swap_base_nametable#
$E16B#load_supertiles_screen_indexes#
$DDAA#@load_screen_a_supertile_indexes#
$DE14#level_2_4_boss_graphics_data#
$DD93#@loop#
$DDA3#@load_supertiles_screen_indexes_indoor#
$DDBF#@exit#
$DDAD#@write_column_tiles_exit#
$DDC3#@indoor_screen_transition#
$DDC0#@animate_indoor_fence#
$DD4C#@continue_loop#
$DD40#@dec_scroll_continue#
$DD51#@write_attribute_continue#
$DD11#@continue#
$DCF0#@frame_scroll_loop#
$DD50#@exit#
$DCEA#@init_loop#
$E15B#load_next_next_supertiles_screen_indexes#
$DCC3#@inc_scroll_exit#
$DCCA#@check_attr_update#
$DC8B#@change_screen#
$DC95#@inc_nametable_data#
$DC78#@set_scroll_graphics_data#
$DCC9#@exit#
$DC6F#@include_tank_auto_scroll#
$DC6B#@set_scroll_frame#
$DC61#@check_scroll_timer_00#
$DD5F#handle_indoor_scroll#
$DC59#@handle_outdoor_level#
$DCD8#handle_vertical_scroll#
$DC52#@handle_horizontal_level#
$DF96#write_row_attribute_to_cpu_memory#
$DEBE#set_vert_lvl_super_tiles#
$E162#load_next_supertiles_screen_indexes#
$DC17#@set_a_exit#
$DC19#@exit#
$DF48#write_col_attribute_to_cpu_memory#
$DE1A#load_column_of_tiles_to_cpu_buffer#
$DC3E#@indoor_level#
$DC1A#@vertical_level#
$E169#load_current_supertiles_screen_indexes#
$DBA7#config_horizontal_scrolling#
$DBDB#continue_init_level#
$DBC4#config_vertical_scrolling#
$E0AF#find_floor_collision#
$DB9B#@clear_carry_exit#
$DB7A#@loop#
$DB99#@set_carry_exit#
$DB5F#@find_bg_collision#
$DB5A#@player_bg_collision#
$DB4C#@continue_3#
$DB4A#@continue_2#
$DB38#@continue#
$E0B5#read_bg_collision_byte_unsafe#
$DACE#can_player_drop_down_exit#
$DAB0#@loop#
$DACF#set_carry_exit#
$DACD#collision_below_player#
$DA9B#@continue#
$DA8F#@exit#
$E136#set_boss_auto_scroll#
$DA58#@stop_player_x_velocity#
$DA3A#@set_horizontal_level_frame_scroll#
$DA60#horizontal_scroll_point_tbl#
$DA63#set_vertical_level_frame_scroll#
$DA5E#@exit#
$DA06#@set_game_over#
$D9D4#@continue#
$D9C7#@exit#
$D9BE#@indoor_continue#
$D9C5#@exit_code_0#
$D9B8#@indoor_floor#
$D9BC#@indoor_boss_level#
$D99B#init_PLAYER_WATER_STATE#
$D9A0#jmp_walk_off_ledge#
$D99A#@exit#
$D996#@clear_edge_code_exit#
$D93A#d_pad_player_aim_tbl#
$D92A#@set_player_aim#
$D91A#@continue#
$D90B#@set_sprite_y#
$D90F#landing_y_position_tbl#
$D8E1#@negate_bullet_velocities#
$D8C1#@continue#
$D8CD#set_vel_for_speed_code_a#
$D886#@continue#
$D87A#@check_aim_dir#
$D866#indoor_transition_exit#
$D83E#@exit#
$D82E#@continue#
$D829#@test_left_d_pad#
$D82F#x_velocity_exit#
$D81A#@continue#
$D812#@set_x_velocity#
$D9CB#player_jumping_set_y_pos#
$D800#@set_y_pos#
$D9EC#apply_gravity#
$D803#@set_jump_status_from_input#
$D7F4#@apply_gravity#
$D7CD#@check_collision#
$D7DB#@check_collision_above#
$D814#set_x_velocity_from_a_code#
$D820#get_x_velocity_d_pad_code#
$D7AA#@set_x_velocity#
$D867#player_land_on_ground#
$D791#@off_ledge_start#
$D77E#@exit#
$D772#@exit#
$D770#@continue#
$D762#set_player_x_vel_to_a#
$D89B#set_player_advancing_vel#
$D750#@check_next_player#
$D739#@check_player_x_advancing#
$D756#set_player_standing_sprite_sequence#
$D737#@check_players_advancing#
$D723#@indoor_screen_cleared#
$D70B#set_sprite_sequence_to_a#
$D70E#d_pad_up_pressed#
$D70A#set_sprite_sequence_to_y#
$D760#set_player_negative_x_velocity#
$D75C#set_player_positive_x_velocity#
$D6F2#@set_y_velocity#
$D6DD#@continue#
$D6D0#@continue#
$D6BA#walk_off_ledge#
$D6C4#set_edge_fall_code#
$D6D2#player_sprite_animation_exit#
$DA91#can_player_drop_down#
$D6F8#handle_d_pad#
$D83F#indoor_transition_set_pos#
$D69B#@handle_player_input#
$D7AF#handle_jump#
$D694#@indoor_transition_anim_check#
$D77F#set_x_velocity_for_edge_fall_code#
$D68D#@player_jump_check#
$D830#update_indoor_electrocution#
$D686#@player_edge_fall_check#
$D6D3#set_jump_status_and_y_velocity#
$D858#indoor_transition_end#
$D67F#@player_electrocution_check#
$D655#@apply_vel_to_player_x_pos#
$DA0B#set_frame_scroll_if_appropriate#
$D637#@lvl_boss_max_x_scroll_tbl#
$D665#level_right_edge_x_pos_tbl#
$DB28#check_player_solid_bg_collision#
$D631#@set_scroll_apply_x_vel#
$D63F#@player_negative_x_vel#
$D664#@exit#
$D66B#handle_player_state#
$D5F8#@continue#
$D5FB#calc_player_x_vel#
$D9C8#apply_gravity_set_y_pos#
$D8EF#set_player_landing_y_offset#
$D5DB#@set_animation_timer#
$D5DF#@set_pos_and_sprite#
$D5C1#@continue#
$D5EB#player_died_x_velocity_tbl#
$D9FA#init_player_dec_num_lives#
$D5E5#@set_player_sprite_exit#
$D5A9#@animation_timer_elapsed#
$D5E8#player_sprite_sequence_tbl#
$D773#sty_level_screen_type#
$D668#level_left_edge_x_pos_tbl#
$D58F#@inc_y_pos_exit#
$D592#@exit#
$D577#auto_scroll_player#
$D5EE#handle_player_state_calc_x_vel#
$D97A#check_player_ledge#
$D912#set_player_aim_for_input#
$D888#init_player_data#
$D54A#kill_player#
$D549#@exit#
$D56B#player_state_routine_01_logic#
$DAA1#check_collision_below#
$D523#@exit#
$D9A3#get_player_bg_collision_code#
$D500#@set_x_pos#
$D4EB#@find_landing#
$D514#@check_if_floor_exit#
$D505#@set_frame_invincible_timer_exit#
$D52C#horizontal_spawn_position#
$D524#vertical_spawn_position#
$DAD5#init_player_attributes#
$D593#player_state_routine_02#
$D534#player_state_routine_01#
$D4C3#player_state_routine_00#
$D4B3#player_state_routine#
$D4AC#@continue#
$D4BB#level_spawn_position_index#
$D49A#@exit#
$D49B#weapon_strength#
$D488#set_player_weapon_strength#
$D482#@continue#
$D476#decrement_invincibility_effect#
$D46C#set_enemies_to_attack#
$D4A0#run_player_state_routine#
$D45F#@exit#
$D43C#@exit#
$D454#find_scrolled_player#
$D43D#@vertical_scroll_player#
$D453#@exit2#
$DAD1#init_player_and_weapon#
$D421#@revive_player#
$D415#@subtract_life#
$D3FB#@check_transfer_life#
$D3F2#@player_loop#
$D42B#@exit#
$D42C#scroll_player#
$D460#handle_invincibility_and_weapon_strength#
$D3E6#player_state_routine_03#
$D3CC#run_player_invincibility_and_weapon_strength#
$D3C6#@p2_game_over_status#
$D38D#@player_bullet_loop#
$D388#@run_player_bullet_routines#
$D37C#@continue#
$D3B4#set_frame_scroll_weapon_strength#
$D227#game_palettes#
$D19A#ending_palette_2_index#
$D18A#indoor_boss_palette_2_index#
$D192#falcon_weapon_flash_tbl#
$D143#set_a_to_palette_2#
$D196#level_palette_2_index#
$D17C#set_ending_palette_animation#
$D145#load_10_sprite_palettes#
$D140#load_palettes_color_to_cpu_2_index#
$D16C#set_indoor_boss_palette_2_animation#
$D126#@continue#
$D181#lvl_palette_animation_count#
$D14A#falcon_weapon_flash#
$D16B#palette_mod_exit#
$D0FD#palette_shift_amount_tbl#
$D0F9#@write_black_to_cpu_mem#
$D0DC#@continue#
$D0CF#@exit#
$D0B8#write_palette_color_a_to_cpu_mem#
$D0B6#read_palette_color#
$D0D0#shift_bg_palette_color#
$D0B2#read_palette_loop#
$D225#game_palette_ptr_tbl#
$D08F#load_palette_colors_to_cpu#
$D19E#lvl_alt_collision_and_palette_tbl#
$D074#@loop#
$D38B#draw_player_bullet_sprites#
$D053#@game_paused#
$D063#pause_exit#
$D00E#@next_player_adv_lvl_index#
$D003#@player_loop#
$CFFF#@continue#
$D01E#level_routine_exit#
$CFC7#@set_cursor_sprite_and_scores#
$CFDC#reset_game_routine#
$CFBB#@check_select_button#
$CF95#@no_continues_remaining#
$CF9A#@set_demo_end_exit#
$CF65#level_routine_05_exit#
$CF60#load_level_intro#
$CF6E#show_game_over_screen#
$CF12#set_to_level_routine_05#
$CEF7#run_level_enemy_logic#
$CF0A#init_game_over#
$D371#set_frame_scroll_draw_player_bullets#
$CEEE#check_game_over_run_enemy_logic#
$CF25#set_to_level_routine_08#
$CF09#level_routine_04_exit#
$D038#check_for_pause#
$CEC4#level_routine_03_exit#
$CEBE#@continue#
$CEC8#level_vert_scroll_and_song#
$CEC5#draw_the_scores_1#
$CE95#@continue#
$CE97#skip_level_routine_01#
$CE7B#inc_level_routine_index#
$DB9D#init_ppu_write_screen_supertiles#
$CE6A#load_level_header#
$D02E#level_routine_0a#
$D01F#level_routine_09#
$CFEA#level_routine_08#
$CFE1#level_routine_07#
$CF9D#level_routine_06#
$CF2E#level_routine_05#
$CEE3#level_routine_04#
$CED8#level_routine_03#
$CE9B#level_routine_02#
$CE7E#level_routine_01#
$CE4B#level_routine_00#
$CE35#level_routine_ptr_tbl#
$CE32#run_level_routine#
$CDBF#pattern_tile_bg_00#
$CDFF#pattern_tile_fence_tbl#
$CDA3#@write_to_graphics_buffer#
$CDBD#pattern_tile_bg_tbl#
$CD6F#@continue#
$CD64#@draw_random_fence#
$CDBC#@exit#
$CD54#animate_indoor_fence#
$CD08#@loop#
$CD27#alt_graphics_loading_complete#
$CD2C#alt_graphic_data_ptr_tbl#
$CCE4#set_alt_graphics_cpu_buffer#
$CC9D#@loop#
$CCB7#graphics_loading_exit#
$CC70#@write_loop#
$CC60#@set_PPU_write_address#
$CC47#@write_to_ppu#
$CC2B#@write_byte_to_ppu#
$CC29#@write_ff_to_ppu#
$CC11#@loop#
$CC2E#@flush_graphics_buffer#
$CC1C#@reset_graphics_buffer#
$CBE5#@continue#
$CBD1#@read_cpu_mem_to_ppu#
$CC3F#@flush_cpu_graphics_buffer#
$CBC5#vram_address_increment#
$CBBF#write_to_700_offset#
$CB9C#@dec_blank_delay#
$CB9E#@next_char#
$CBA5#@handle_fd#
$CBA1#@write_ff_to_cpu_memory#
$CBC3#set_x_to_offset_exit#
$CB7D#@write_char_to_cpu_mem#
$CBBD#write_a_to_cpu_graphics_buffer#
$CB4B#blank_nametable_2#
$CB36#graphic_data_00 blank_nametables#
$CB2B#@draw_final_0_exit#
$CB2F#@draw_zero_score#
$CB1B#@draw_score_end_zeros#
$CB02#@draw_score_digit#
$CB2E#@exit#
$CAF8#@draw_score#
$CAC1#draw_the_scores#
$CAAD#draw_stage_and_level_name#
$CAA5#@exit#
$CA9A#@write_num_lives#
$CA8E#@convert_digits#
$CA7E#@draw_num_lives#
$CA7C#@continue#
$CAA6#draw_game_over_tex#
$CA61#draw_player_num_lives#
$CA2C#write_a_to_ppu_y_times#
$CA15#advance_ppu_write_addr#
$CA10#advance_graphic_read_addr_n_bytes#
$CA36#horizontal_flip_graphic_byte#
$CA06#write_repetition_sequence_byte#
$C9FD#write_next_n_sequence_bytes#
$CA1D#write_graphic_byte_a_times#
$CA51#change_ppu_write_address#
$CA5B#end_graphic_code#
$C9E8#write_graphic_data_sequences_to_ppu#
$C9E3#init_graphic_data_index#
$C9CC#begin_ppu_graphics_block_write#
$C950#graphic_data_ptr_tbl#
$C94B#ending_graphic_data#
$C948#intro_graphic_data_01#
$C946#intro_graphic_data_00#
$C940#level_4_boss_graphic_data#
$C93B#level_2_boss_graphic_data#
$C936#level_8_graphic_data#
$C92E#level_7_graphic_data#
$C926#level_6_graphic_data#
$C91E#level_5_graphic_data#
$C90D#level_4_graphic_data#
$C916#level_3_graphic_data#
$C905#level_2_graphic_data#
$C8FD#level_1_graphic_data#
$C9A3#write_graphic_data_to_ppu#
$C8D6#@loop#
$C8E3#level_graphic_data_tbl#
$C8C3#exit_load_graphics_group#
$C8A7#@handle_overflow_exit#
$C89C#@handle_overflow#
$C89B#@exit#
$C88A#continue_shift_score#
$C87E#shift_and_check_digit_carry#
$C874#calculate_score_digit#
$C870#bank_7_unused_label_00#
$C7FD#@continue#
$C7D3#@nametable#
$C7D1#@round_up#
$C7B5#level_screen_mem_offset_tbl_00#
$C7B3#attribute_base_high_byte#
$C7B1#nametable_base_high_byte#
$C77F#write_overwrite_tile_to_cpu_buffer#
$C76F#prep_overwrite_nametable_tiles#
$C7B7#palette_mask_tbl#
$C739#@shift_4#
$C73B#@shift_2#
$C73D#@set_supertile_palette#
$C75C#@update_nametable_tiles#
$C721#@continue#
$C79F#level_tile_animation_ptr_tbl#
$C6F7#update_nametable_tiles_exit#
$C6CA#@write_update_supertile#
$C6B8#@mv_down_row#
$C697#@write_palette_data#
$C6CD#update_palette_cfg_tbl#
$C631#@update_palette_02#
$C67B#@update_palette_continue#
$C601#@update_palette_01#
$C5AF#@write_graphic_group_bytes#
$C5A3#@write_graphic_group#
$C83C#set_graphics_buffer_header#
$C5D0#update_supertile_palette#
$C575#write_update_supertile_to_cpu#
$C6D3#nametable_update_data_ptr_tbl#
$C54B#@continue#
$C7BB#set_ppu_addresses_in_mem#
$C529#@set_high_score#
$C535#score_exit#
$C50C#@set_num_lives#
$C4FD#@inc_num_lives#
$C4F3#@continue_inc_num_lives#
$C4DC#@extra_life_logic#
$C517#@set_if_new_high_score#
$C4E5#@set_extra_life_inc_num_lives#
$C4CD#@set_if_extra_life#
$C4C1#@continue#
$C4A8#add_player_score#
$C4A0#add_player_low_score#
$C49F#add_player_score_exit#
$C494#clear_memory_block#
$C483#@loop#
$C481#clear_memory_starting_a_x#
$C469#init_player_num_lives#
$C461#init_player_lives#
$C47D#p2_game_over_status_tbl#
$C47B#player_mode_1d_table#
$C44B#clear_score_byte#
$C447#reset_players_score#
$C431#@continue#
$C47F#clear_memory_3#
$C3DB#player_mode_change#
$C3E7#stop_demo_load_player_select_UI#
$C3E6#timer_exit#
$C3A2#read_controller_button#
$C386#set_player_input#
$C384#write_input#
$C375#@continue#
$C36B#ensure_input_valid#
$C397#read_controller_state#
$C345#konami_input_index_correct#
$C351#konami_code_lookup_table#
$C350#konami_code_exit#
$C325#@exit_z_flag_clear#
$C327#@exit#
$C307#init_game_routine_flags#
$C43E#init_score_player_lives#
$C2DC#@intro_timer_elapsed#
$C40F#dec_intro_theme_delay#
$C2FC#set_game_routine_init_flag#
$C2D3#@continue#
$C30E#set_game_routine_index_to_a#
$C300#game_routine_02_exit#
$CE27#run_level_routine_for_demo#
$C41C#set_next_demo_level#
$C2BA#@continue#
$C305#increment_game_routine#
$C3F9#load_intro_palette2_play_intro_sound#
$C2B0#game_routine_01_exit#
$C282#game_routine_01_scroll_complete#
$C331#konami_input_check#
$C272#player_select_cursor_pos#
$C301#inc_routine_index_set_timer#
$C8A8#load_intro_graphics#
$CE30#game_routine_05#
$C2F4#game_routine_04#
$C2C7#game_routine_03#
$C2B1#game_routine_02#
$C274#game_routine_01#
$C25B#game_routine_00#
$C24D#game_routine_pointer_table#
$C3BC#dec_theme_delay_check_user_input#
$C248#run_game_routine#
$C233#load_bank_3_run_end_lvl_sequence_routine#
$C22B#simulate_input_for_demo#
$C223#game_routine_06#
$CB60#write_text_palette_to_mem#
$C217#load_bank_6_write_text_palette_to_mem#
$C20F#load_bank_2_set_players_paused_sprite_attr#
$C207#load_bank_2_set_player_sprite#
$C8C6#load_level_graphic_data#
$C8C4#load_current_level_graphic_data#
$C201#load_level_graphics#
$CCB8#alternate_tile_loading#
$C1F9#load_bank_2_alternate_tile_loading#
$DBE6#init_lvl_nametable_animation#
$C1F1#load_bank_3_init_lvl_nametable_animation#
$DC4B#handle_scroll#
$C1E9#load_bank_3_handle_scroll#
$C1E1#load_bank_2_exe_soldier_generation#
$E689#load_level_enemies_to_mem#
$C1D9#load_bank_0_load_level_enemies_to_mem#
$C1D1#load_bank_2_load_screen_enemy_data#
$E61E#exe_all_enemy_routine#
$C1C9#load_bank_0_exe_all_enemy_routine#
$C1C1#load_bank_6_check_player_fire#
$C1B9#load_bank_6_run_player_bullet_routines#
$C6F8#update_nametable_tiles#
$C536#update_nametable_supertile#
$C15E#local_previous_1_bank#
$C14C#load_bank_1#
$C146#load_previous_bank#
$FFD0#prg_rom_banks#
$C12C#@loop#
$C104#set_ppu_scroll#
$C13F#set_rom_bank_to_y#
$C0D1#@continue#
$C0BE#@handle_sound#
$C0B5#irq#
$C0AF#remove_registers_from_stack_and_rti#
$CBB9#write_0_to_cpu_graphics_buffer#
$C23B#exe_game_routine#
$C35B#load_controller_state#
$C139#load_bank_number#
$C0F7#set_ppu_addr_to_nametables#
$C08A#@continue#
$CBC9#write_cpu_graphics_buffer_to_ppu#
$CC81#write_palette_colors_to_ppu#
$C0B6#handle_sounds_set_ppu_scroll_rti#
$C060#nmi_start#
$C057#forever_loop#
$C0E7#configure_PPU#
$C0DC#init_APU#
$C038#@loop#
$C049#init_APU_and_PPU#
$C036#init_07f0_through_high_score#
$C02B#@loop#
$C126#clear_memory#
$C117#clear_ppu#
$C008#vertical_blank_entry#
$C003#wait_til_vblank#
$C001#reset_vector#

View File

@ -4617,7 +4617,7 @@ handle_jump:
@set_jump_status_from_input: @set_jump_status_from_input:
jsr get_x_velocity_d_pad_code ; see if left or right d-pad button is pressed jsr get_x_velocity_d_pad_code ; see if left or right d-pad button is pressed
beq @set_x_velocity ; branch if neither were pressed beq @set_x_velocity ; branch if neither were pressed
sta $08 ; store #$20 for left d-pad, #$40 for right d-pad in $08 sta $08 ; store #$20 for right d-pad, #$40 for left d-pad in $08
lda PLAYER_JUMP_STATUS,x ; low nibble 1 = jumping, 0 not jumping; high nibble = facing direction lda PLAYER_JUMP_STATUS,x ; low nibble 1 = jumping, 0 not jumping; high nibble = facing direction
and #$9f ; keep bits x..x xxxx and #$9f ; keep bits x..x xxxx
ora $08 ; update EDGE_FALL_CODE based on d-pad input ora $08 ; update EDGE_FALL_CODE based on d-pad input
@ -10561,4 +10561,4 @@ nes_footer_maker_code:
; these are stored at known locations so the NES can point the instruction ; these are stored at known locations so the NES can point the instruction
; pointer at known locations for triggering interrupts. ; pointer at known locations for triggering interrupts.
.segment "VECTORS" .segment "VECTORS"
.addr nmi_start, reset_vector, irq .addr nmi_start, reset_vector, irq