{"schema":1,"platform":"c64","game":"falcon-patrol","title":"Falcon Patrol","build":"Remember crack, 'Falcon Patrol +5 and Highscoresaver 100%', highscore-saver only (no trainers)","symbols_sha256":"11aa8cdf96326ca2ea759de12f0c23a5f47fb0631a27d3acfa48f7e84bb4527d","index":[{"a":0,"n":"cpu_port_ddr","k":"variable","len":1,"c":true},{"a":1,"n":"cpu_port","k":"variable","len":1,"c":true},{"a":2,"n":"zp_clear_base","k":"table","len":3,"c":true},{"a":5,"n":"ptr_screen","k":"variable","len":1,"c":true},{"a":6,"n":"ptr_screen_hi","k":"variable","len":1,"c":true},{"a":7,"n":"ptr_colour","k":"variable","len":1,"c":true},{"a":8,"n":"ptr_colour_hi","k":"variable","len":1,"c":true},{"a":9,"n":"ptr_scroll_colour","k":"variable","len":1,"c":true},{"a":10,"n":"ptr_scroll_colour_hi","k":"variable","len":1,"c":true},{"a":11,"n":"scroll_rows_left","k":"variable","len":1,"c":true},{"a":12,"n":"input_byte","k":"variable","len":1,"c":true},{"a":13,"n":"world_x","k":"variable","len":1,"c":true},{"a":14,"n":"ptr_terrain","k":"variable","len":1,"c":true},{"a":15,"n":"ptr_terrain_hi","k":"variable","len":1,"c":true},{"a":16,"n":"tmp_x","k":"variable","len":1,"c":true},{"a":17,"n":"radar_origin","k":"variable","len":1,"c":true},{"a":18,"n":"score_digits","k":"variable","len":1,"c":true},{"a":19,"n":"score_digit_thousands","k":"variable","len":1,"c":true},{"a":20,"n":"score_digit_hundreds","k":"variable","len":2,"c":true},{"a":22,"n":"score_digit_units","k":"variable","len":1,"c":true},{"a":23,"n":"gas_hundreds","k":"variable","len":1,"c":true},{"a":24,"n":"gas_tens","k":"variable","len":1,"c":true},{"a":25,"n":"gas_units","k":"variable","len":1,"c":true},{"a":26,"n":"aam_hundreds","k":"variable","len":1,"c":true},{"a":27,"n":"aam_tens","k":"variable","len":1,"c":true},{"a":28,"n":"aam_units","k":"variable","len":1,"c":true},{"a":29,"n":"lives","k":"variable","len":1,"c":true},{"a":30,"n":"ptr_radar_glyph","k":"variable","len":1,"c":true},{"a":31,"n":"ptr_radar_glyph_hi","k":"variable","len":1,"c":true},{"a":32,"n":"radar_arg_row","k":"variable","len":1,"c":true},{"a":33,"n":"radar_arg_col","k":"variable","len":1,"c":true},{"a":34,"n":"flight_flags","k":"variable","len":1,"c":true},{"a":35,"n":"zp_23_unknown","k":"variable","len":1,"c":true},{"a":36,"n":"sfx_crash_state","k":"variable","len":1,"c":true},{"a":37,"n":"sfx_takeoff_state","k":"variable","len":1,"c":true},{"a":38,"n":"sfx_takeoff_timer","k":"variable","len":1,"c":true},{"a":39,"n":"sfx_warn_state","k":"variable","len":1,"c":true},{"a":40,"n":"sfx_warn_phase","k":"variable","len":1,"c":true},{"a":41,"n":"sfx_warn_freq","k":"variable","len":1,"c":true},{"a":42,"n":"vel_x","k":"variable","len":1,"c":true},{"a":43,"n":"vel_y","k":"variable","len":1,"c":true},{"a":44,"n":"scroll_phase","k":"variable","len":1,"c":true},{"a":45,"n":"tick_counter","k":"variable","len":1,"c":true},{"a":46,"n":"status_bar_colour","k":"variable","len":1,"c":true},{"a":47,"n":"zp_2f_scratch","k":"variable","len":1,"c":true},{"a":48,"n":"aam_slots","k":"table","len":11,"c":true},{"a":59,"n":"bomb_rows_minus1","k":"variable","len":1,"c":true},{"a":60,"n":"bomb_rows","k":"variable","len":1,"c":true},{"a":61,"n":"bomb_row2","k":"variable","len":1,"c":true},{"a":62,"n":"bomb_row3","k":"variable","len":1,"c":true},{"a":63,"n":"bomb_row4","k":"variable","len":1,"c":true},{"a":64,"n":"bomb_cols","k":"table","len":4,"c":true},{"a":68,"n":"tmp_44","k":"variable","len":1,"c":true},{"a":69,"n":"tmp_45","k":"variable","len":1,"c":true},{"a":70,"n":"tmp_46","k":"variable","len":1,"c":true},{"a":71,"n":"enemy_row","k":"table","len":4,"c":true},{"a":75,"n":"enemy_map_x","k":"variable","len":1,"c":true},{"a":76,"n":"enemy_map_x1","k":"table","len":3,"c":true},{"a":79,"n":"enemy_param3","k":"table","len":4,"c":true},{"a":83,"n":"enemy_param4","k":"table","len":4,"c":true},{"a":87,"n":"enemy_state","k":"variable","len":1,"c":true},{"a":88,"n":"enemy_state1","k":"table","len":3,"c":true},{"a":91,"n":"enemy_param6","k":"table","len":5,"c":true},{"a":96,"n":"wave_direction","k":"variable","len":1,"c":true},{"a":97,"n":"active_flags","k":"variable","len":1,"c":true},{"a":98,"n":"zp_62_unknown","k":"variable","len":1,"c":true},{"a":99,"n":"zp_63_wave_counter","k":"variable","len":1,"c":true},{"a":100,"n":"wave_spawn_column","k":"variable","len":1,"c":true},{"a":101,"n":"zp_65_unknown","k":"variable","len":1,"c":true},{"a":102,"n":"zp_66_unknown","k":"variable","len":1,"c":true},{"a":103,"n":"bonus_life_timer","k":"table","len":36,"c":true},{"a":139,"n":"collide_sprite","k":"variable","len":1,"c":true},{"a":140,"n":"collide_background","k":"table","len":4,"c":true},{"a":144,"n":"zp_90_crack_clear","k":"table","len":6,"c":true},{"a":150,"n":"ptr_attitude_frame","k":"variable","len":1,"c":true},{"a":151,"n":"ptr_attitude_frame_hi","k":"variable","len":1,"c":true},{"a":152,"n":"attitude_active","k":"variable","len":1,"c":true},{"a":153,"n":"attitude_step","k":"table","len":3,"c":true},{"a":156,"n":"music_note_delay","k":"variable","len":1,"c":true},{"a":157,"n":"music_note_index","k":"variable","len":2,"c":true},{"a":159,"n":"bomb_ground_row","k":"variable","len":2,"c":true},{"a":161,"n":"bomb_ground_col","k":"variable","len":2,"c":true},{"a":163,"n":"bomb_ground_sub_x","k":"variable","len":2,"c":true},{"a":165,"n":"bomb_ground_sub_y","k":"variable","len":2,"c":true},{"a":167,"n":"bomb_ground_active","k":"variable","len":1,"c":true},{"a":168,"n":"bomb_ground_active1","k":"variable","len":1,"c":true},{"a":169,"n":"bomb_ground_active2","k":"variable","len":1,"c":true},{"a":170,"n":"wave_score_value","k":"variable","len":2,"c":true},{"a":172,"n":"sfx_filter_cutoff","k":"variable","len":1,"c":true},{"a":173,"n":"sfx_freq_v1","k":"variable","len":1,"c":true},{"a":174,"n":"sfx_freq_v3","k":"variable","len":1,"c":true},{"a":175,"n":"zp_af_unknown","k":"variable","len":1,"c":true},{"a":176,"n":"raster_band","k":"variable","len":1,"c":true},{"a":177,"n":"title_timeout","k":"variable","len":1,"c":true},{"a":178,"n":"title_phase","k":"table","len":64,"c":true},{"a":251,"n":"save_ptr","k":"variable","len":1,"c":true},{"a":252,"n":"save_ptr_hi","k":"table","len":4,"c":true},{"a":512,"n":"basic_input_buffer","k":"table","len":64,"c":true},{"a":657,"n":"charset_lock","k":"table","len":64,"c":true},{"a":788,"n":"irq_vector_lo","k":"variable","len":1,"c":true},{"a":789,"n":"irq_vector_hi","k":"table","len":64,"c":true},{"a":1023,"n":"unused_03ff","k":"variable","len":1,"c":true},{"a":2048,"n":"title_screen","k":"table","len":12,"c":true},{"a":2060,"n":"title_logo_top","k":"table","len":28,"c":true},{"a":2088,"n":"title_row01","k":"table","len":12,"c":true},{"a":2100,"n":"title_logo_bottom","k":"table","len":15,"c":true},{"a":2115,"n":"title_row01_col27","k":"table","len":13,"c":true},{"a":2128,"n":"title_row02","k":"table","len":40,"c":true},{"a":2168,"n":"title_row03","k":"table","len":40,"c":true},{"a":2208,"n":"title_row04","k":"table","len":40,"c":true},{"a":2248,"n":"title_hiscore_row1","k":"table","len":7,"c":true},{"a":2255,"n":"title_rank1_digit","k":"variable","len":1,"c":true},{"a":2256,"n":"title_rank1_colon","k":"variable","len":2,"c":true},{"a":2258,"n":"title_rank1_score","k":"table","len":11,"c":true},{"a":2269,"n":"title_rank1_name","k":"table","len":19,"c":true},{"a":2288,"n":"title_row06","k":"table","len":9,"c":true},{"a":2297,"n":"title_clear_base_08f9","k":"table","len":31,"c":true},{"a":2328,"n":"title_hiscore_row2","k":"table","len":7,"c":true},{"a":2335,"n":"title_rank2_digit","k":"variable","len":1,"c":true},{"a":2336,"n":"title_rank2_colon","k":"variable","len":2,"c":true},{"a":2338,"n":"title_rank2_score","k":"table","len":11,"c":true},{"a":2349,"n":"title_rank2_name","k":"table","len":19,"c":true},{"a":2368,"n":"title_row08","k":"table","len":40,"c":true},{"a":2408,"n":"title_hiscore_row3","k":"table","len":7,"c":true},{"a":2415,"n":"title_rank3_digit","k":"variable","len":1,"c":true},{"a":2416,"n":"title_rank3_colon","k":"variable","len":2,"c":true},{"a":2418,"n":"title_rank3_score","k":"table","len":11,"c":true},{"a":2429,"n":"title_rank3_name","k":"table","len":19,"c":true},{"a":2448,"n":"title_row10","k":"table","len":40,"c":true},{"a":2488,"n":"title_hiscore_row4","k":"table","len":7,"c":true},{"a":2495,"n":"title_rank4_digit","k":"variable","len":1,"c":true},{"a":2496,"n":"title_rank4_colon","k":"variable","len":2,"c":true},{"a":2498,"n":"title_rank4_score","k":"table","len":11,"c":true},{"a":2509,"n":"title_rank4_name","k":"table","len":19,"c":true},{"a":2528,"n":"title_row12","k":"table","len":19,"c":true},{"a":2547,"n":"title_clear_base_09f3","k":"table","len":21,"c":true},{"a":2568,"n":"title_hiscore_row5","k":"table","len":7,"c":true},{"a":2575,"n":"title_rank5_digit","k":"variable","len":1,"c":true},{"a":2576,"n":"title_rank5_colon","k":"variable","len":2,"c":true},{"a":2578,"n":"title_rank5_score","k":"table","len":11,"c":true},{"a":2589,"n":"title_rank5_name","k":"table","len":19,"c":true},{"a":2608,"n":"title_row14","k":"table","len":40,"c":true},{"a":2648,"n":"title_row15","k":"table","len":40,"c":true},{"a":2688,"n":"title_row16","k":"table","len":40,"c":true},{"a":2728,"n":"title_row17","k":"table","len":10,"c":true},{"a":2738,"n":"title_prompt","k":"variable","len":2,"c":true},{"a":2740,"n":"name_buffer","k":"table","len":28,"c":true},{"a":2768,"n":"title_row18","k":"table","len":29,"c":true},{"a":2797,"n":"title_clear_base_0aed","k":"table","len":11,"c":true},{"a":2808,"n":"title_row19","k":"table","len":40,"c":true},{"a":2848,"n":"title_row20","k":"table","len":40,"c":true},{"a":2888,"n":"title_row21","k":"table","len":6,"c":true},{"a":2894,"n":"title_alphabet_strip","k":"table","len":34,"c":true},{"a":2928,"n":"title_row22","k":"table","len":40,"c":true},{"a":2968,"n":"title_row23","k":"table","len":40,"c":true},{"a":3008,"n":"title_credit_line","k":"table","len":40,"c":true},{"a":3048,"n":"title_screen_tail","k":"table","len":16,"c":true},{"a":3064,"n":"title_sprite_ptrs","k":"table","len":8,"c":true},{"a":3072,"n":"unused_0c00","k":"table","len":51,"c":true},{"a":3123,"n":"remember_intro_blob_0c33","k":"table","len":64,"c":true},{"a":3187,"n":"remember_intro_blob_0c73","k":"table","len":64,"c":true},{"a":3251,"n":"remember_intro_blob_0cb3","k":"table","len":64,"c":true},{"a":3315,"n":"remember_intro_blob_0cf3","k":"table","len":64,"c":true},{"a":3379,"n":"remember_intro_blob_0d33","k":"table","len":64,"c":true},{"a":3443,"n":"remember_intro_blob_0d73","k":"table","len":33,"c":true},{"a":3476,"n":"remember_intro_logo_0d94","k":"table","len":64,"c":true},{"a":3540,"n":"remember_intro_logo_0dd4","k":"table","len":64,"c":true},{"a":3604,"n":"remember_intro_logo_0e14","k":"table","len":55,"c":true},{"a":3659,"n":"unused_0e4b","k":"table","len":53,"c":true},{"a":3712,"n":"remember_scrolltext_0e80","k":"table","len":64,"c":true},{"a":3776,"n":"remember_scrolltext_0ec0","k":"table","len":64,"c":true},{"a":3840,"n":"remember_scrolltext_0f00","k":"table","len":64,"c":true},{"a":3904,"n":"remember_scrolltext_0f40","k":"table","len":64,"c":true},{"a":3968,"n":"remember_scrolltext_0f80","k":"table","len":64,"c":true},{"a":4032,"n":"remember_scrolltext_0fc0","k":"table","len":64,"c":true},{"a":4096,"n":"remember_scrolltext_1000","k":"table","len":64,"c":true},{"a":4160,"n":"remember_scrolltext_1040","k":"table","len":64,"c":true},{"a":4224,"n":"remember_scrolltext_1080","k":"table","len":64,"c":true},{"a":4288,"n":"remember_scrolltext_10c0","k":"table","len":64,"c":true},{"a":4352,"n":"remember_scrolltext_1100","k":"table","len":64,"c":true},{"a":4416,"n":"remember_scrolltext_1140","k":"table","len":64,"c":true},{"a":4480,"n":"remember_scrolltext_1180","k":"table","len":64,"c":true},{"a":4544,"n":"remember_scrolltext_11c0","k":"table","len":64,"c":true},{"a":4608,"n":"remember_scrolltext_1200","k":"table","len":64,"c":true},{"a":4672,"n":"unused_1240","k":"table","len":1024,"c":true},{"a":6400,"n":"crack_front_end","k":"routine","len":353,"c":true},{"a":6426,"n":"b_191A","k":"branch","len":1,"c":false},{"a":6472,"n":"b_1948","k":"branch","len":1,"c":false},{"a":6489,"n":"b_1959","k":"branch","len":1,"c":false},{"a":6509,"n":"b_196D","k":"branch","len":1,"c":false},{"a":6523,"n":"b_197B","k":"branch","len":1,"c":false},{"a":6537,"n":"b_1989","k":"branch","len":1,"c":false},{"a":6544,"n":"b_1990","k":"branch","len":1,"c":false},{"a":6553,"n":"b_1999","k":"branch","len":1,"c":false},{"a":6569,"n":"b_19A9","k":"branch","len":1,"c":false},{"a":6571,"n":"b_19AB","k":"branch","len":1,"c":false},{"a":6580,"n":"b_19B4","k":"branch","len":1,"c":false},{"a":6596,"n":"b_19C4","k":"branch","len":1,"c":false},{"a":6598,"n":"b_19C6","k":"branch","len":1,"c":false},{"a":6607,"n":"b_19CF","k":"branch","len":1,"c":false},{"a":6623,"n":"b_19DF","k":"branch","len":1,"c":false},{"a":6625,"n":"b_19E1","k":"branch","len":1,"c":false},{"a":6634,"n":"b_19EA","k":"branch","len":1,"c":false},{"a":6650,"n":"b_19FA","k":"branch","len":1,"c":false},{"a":6652,"n":"b_19FC","k":"branch","len":1,"c":false},{"a":6661,"n":"b_1A05","k":"branch","len":1,"c":false},{"a":6680,"n":"j_1A18","k":"branch","len":1,"c":false},{"a":6682,"n":"b_1A1A","k":"branch","len":1,"c":false},{"a":6695,"n":"b_1A27","k":"branch","len":1,"c":false},{"a":6717,"n":"b_1A3D","k":"branch","len":1,"c":false},{"a":6753,"n":"unused_1a61","k":"table","len":31,"c":true},{"a":6784,"n":"crack_banner","k":"table","len":40,"c":true},{"a":6824,"n":"crack_banner_rule","k":"table","len":40,"c":true},{"a":6864,"n":"crack_menu_prompt","k":"table","len":40,"c":true},{"a":6904,"n":"crack_q_lives","k":"table","len":40,"c":true},{"a":6944,"n":"crack_q_gas","k":"table","len":40,"c":true},{"a":6984,"n":"crack_q_aam","k":"table","len":40,"c":true},{"a":7024,"n":"crack_q_bases","k":"table","len":40,"c":true},{"a":7064,"n":"crack_q_collision","k":"table","len":40,"c":true},{"a":7104,"n":"crack_q_hiscore","k":"table","len":40,"c":true},{"a":7144,"n":"unused_1be8","k":"table","len":24,"c":true},{"a":7168,"n":"documents_row00","k":"table","len":40,"c":true},{"a":7208,"n":"documents_row01","k":"table","len":40,"c":true},{"a":7248,"n":"documents_row02","k":"table","len":40,"c":true},{"a":7288,"n":"documents_row03","k":"table","len":40,"c":true},{"a":7328,"n":"documents_row04","k":"table","len":40,"c":true},{"a":7368,"n":"documents_row05","k":"table","len":40,"c":true},{"a":7408,"n":"documents_row06","k":"table","len":16,"c":true},{"a":7424,"n":"documents_page_1d","k":"table","len":24,"c":true},{"a":7448,"n":"documents_row07","k":"table","len":40,"c":true},{"a":7488,"n":"documents_row08","k":"table","len":40,"c":true},{"a":7528,"n":"documents_row09","k":"table","len":40,"c":true},{"a":7568,"n":"documents_row10","k":"table","len":40,"c":true},{"a":7608,"n":"documents_row11","k":"table","len":40,"c":true},{"a":7648,"n":"documents_row12","k":"table","len":32,"c":true},{"a":7680,"n":"documents_page_1e","k":"table","len":8,"c":true},{"a":7688,"n":"documents_row13","k":"table","len":40,"c":true},{"a":7728,"n":"documents_row14","k":"table","len":40,"c":true},{"a":7768,"n":"documents_row15","k":"table","len":40,"c":true},{"a":7808,"n":"documents_row16","k":"table","len":40,"c":true},{"a":7848,"n":"documents_row17","k":"table","len":40,"c":true},{"a":7888,"n":"documents_row18","k":"table","len":40,"c":true},{"a":7928,"n":"documents_row19","k":"table","len":8,"c":true},{"a":7936,"n":"documents_page_1f","k":"table","len":32,"c":true},{"a":7968,"n":"documents_row20","k":"table","len":40,"c":true},{"a":8008,"n":"documents_row21","k":"table","len":40,"c":true},{"a":8048,"n":"documents_row22","k":"table","len":40,"c":true},{"a":8088,"n":"documents_row23","k":"table","len":40,"c":true},{"a":8128,"n":"documents_row24","k":"table","len":40,"c":true},{"a":8168,"n":"documents_row25","k":"table","len":24,"c":true},{"a":8192,"n":"sprite_player_yaw_left","k":"table","len":64,"c":true},{"a":8256,"n":"sprite_player_yaw_l2","k":"table","len":64,"c":true},{"a":8320,"n":"sprite_player_yaw_l1","k":"table","len":64,"c":true},{"a":8384,"n":"sprite_player_head_on","k":"table","len":64,"c":true},{"a":8448,"n":"sprite_player_yaw_r1","k":"table","len":64,"c":true},{"a":8512,"n":"sprite_player_yaw_r2","k":"table","len":64,"c":true},{"a":8576,"n":"sprite_player_yaw_right","k":"table","len":64,"c":true},{"a":8640,"n":"sprite_87_sparse_dots","k":"table","len":64,"c":true},{"a":8704,"n":"sprite_debris_1","k":"table","len":64,"c":true},{"a":8768,"n":"sprite_debris_2","k":"table","len":64,"c":true},{"a":8832,"n":"sprite_debris_3","k":"table","len":64,"c":true},{"a":8896,"n":"sprite_debris_4","k":"table","len":64,"c":true},{"a":8960,"n":"sprite_debris_5","k":"table","len":64,"c":true},{"a":9024,"n":"sprite_debris_6","k":"table","len":64,"c":true},{"a":9088,"n":"sprite_debris_7","k":"table","len":64,"c":true},{"a":9152,"n":"sprite_debris_8","k":"table","len":64,"c":true},{"a":9216,"n":"sprite_exhaust_0","k":"table","len":64,"c":true},{"a":9280,"n":"sprite_exhaust_1","k":"table","len":64,"c":true},{"a":9344,"n":"sprite_exhaust_2","k":"table","len":64,"c":true},{"a":9408,"n":"sprite_exhaust_3","k":"table","len":64,"c":true},{"a":9472,"n":"sprite_enemy_a0","k":"table","len":64,"c":true},{"a":9536,"n":"sprite_enemy_a1","k":"table","len":64,"c":true},{"a":9600,"n":"sprite_enemy_a2","k":"table","len":64,"c":true},{"a":9664,"n":"sprite_enemy_a3","k":"table","len":64,"c":true},{"a":9728,"n":"sprite_enemy_a4","k":"table","len":64,"c":true},{"a":9792,"n":"sprite_enemy_b0","k":"table","len":64,"c":true},{"a":9856,"n":"sprite_enemy_b1","k":"table","len":64,"c":true},{"a":9920,"n":"sprite_enemy_b2","k":"table","len":64,"c":true},{"a":9984,"n":"sprite_enemy_b3","k":"table","len":64,"c":true},{"a":10048,"n":"sprite_enemy_b4","k":"table","len":64,"c":true},{"a":10112,"n":"sprite_bomb","k":"table","len":64,"c":true},{"a":10176,"n":"sprite_9f_blank","k":"table","len":64,"c":true},{"a":10240,"n":"hiscore_entry1","k":"table","len":5,"c":true},{"a":10245,"n":"hiscore_name1","k":"table","len":12,"c":true},{"a":10257,"n":"hiscore_entry2","k":"table","len":5,"c":true},{"a":10262,"n":"hiscore_name2","k":"table","len":12,"c":true},{"a":10274,"n":"hiscore_entry3","k":"table","len":5,"c":true},{"a":10279,"n":"hiscore_name3","k":"table","len":12,"c":true},{"a":10291,"n":"hiscore_entry4","k":"table","len":5,"c":true},{"a":10296,"n":"hiscore_name4","k":"table","len":12,"c":true},{"a":10308,"n":"hiscore_entry5","k":"table","len":5,"c":true},{"a":10313,"n":"hiscore_name5","k":"table","len":12,"c":true},{"a":10325,"n":"hiscore_table_to_screen","k":"routine","len":71,"c":true},{"a":10327,"n":"b_2857","k":"branch","len":1,"c":false},{"a":10362,"n":"b_287A","k":"branch","len":1,"c":false},{"a":10400,"n":"hiscore_save_to_disk","k":"routine","len":120,"c":true},{"a":10432,"n":"b_28C0","k":"branch","len":1,"c":false},{"a":10467,"n":"b_28E3","k":"branch","len":1,"c":false},{"a":10502,"n":"b_2906","k":"branch","len":1,"c":false},{"a":10513,"n":"b_2911","k":"branch","len":1,"c":false},{"a":10520,"n":"hiscore_file_io","k":"routine","len":35,"c":true},{"a":10555,"n":"str_hiscore_filename","k":"table","len":19,"c":true},{"a":10574,"n":"hiscore_open_slot","k":"routine","len":1,"c":true},{"a":10575,"n":"hiscore_open_slot_arg","k":"routine","len":18,"c":true},{"a":10593,"n":"hiscore_shift_5","k":"routine","len":23,"c":true},{"a":10595,"n":"b_2963","k":"branch","len":1,"c":false},{"a":10606,"n":"b_296E","k":"branch","len":1,"c":false},{"a":10616,"n":"hiscore_shift_4","k":"routine","len":26,"c":true},{"a":10621,"n":"b_297D","k":"branch","len":1,"c":false},{"a":10632,"n":"b_2988","k":"branch","len":1,"c":false},{"a":10642,"n":"hiscore_shift_3","k":"routine","len":26,"c":true},{"a":10647,"n":"b_2997","k":"branch","len":1,"c":false},{"a":10658,"n":"b_29A2","k":"branch","len":1,"c":false},{"a":10668,"n":"hiscore_shift_2","k":"routine","len":26,"c":true},{"a":10673,"n":"b_29B1","k":"branch","len":1,"c":false},{"a":10684,"n":"b_29BC","k":"branch","len":1,"c":false},{"a":10694,"n":"unused_29c6","k":"table","len":58,"c":true},{"a":10752,"n":"tune_v1_freq_hi","k":"table","len":32,"c":true},{"a":10784,"n":"tune_v1_freq_lo","k":"table","len":32,"c":true},{"a":10816,"n":"tune_v2_freq_hi","k":"table","len":32,"c":true},{"a":10848,"n":"tune_v2_freq_lo","k":"table","len":32,"c":true},{"a":10880,"n":"tune_v3_freq_hi","k":"table","len":32,"c":true},{"a":10912,"n":"tune_v3_freq_lo","k":"table","len":32,"c":true},{"a":10944,"n":"tune_sid_init","k":"table","len":25,"c":true},{"a":10976,"n":"tune_note_length","k":"table","len":32,"c":true},{"a":11008,"n":"sprite_attitude_left_m2","k":"table","len":64,"c":true},{"a":11072,"n":"sprite_attitude_left_m1","k":"table","len":64,"c":true},{"a":11136,"n":"sprite_attitude_left_p0","k":"table","len":64,"c":true},{"a":11200,"n":"sprite_attitude_left_p1","k":"table","len":64,"c":true},{"a":11264,"n":"sprite_attitude_left_p2","k":"table","len":64,"c":true},{"a":11328,"n":"sprite_attitude_right_m2","k":"table","len":64,"c":true},{"a":11392,"n":"sprite_attitude_right_m1","k":"table","len":64,"c":true},{"a":11456,"n":"sprite_attitude_right_p0","k":"table","len":64,"c":true},{"a":11520,"n":"sprite_attitude_right_p1","k":"table","len":64,"c":true},{"a":11584,"n":"sprite_attitude_right_p2","k":"table","len":64,"c":true},{"a":11648,"n":"unused_2d80","k":"table","len":128,"c":true},{"a":11776,"n":"status_panel_row0","k":"table","len":40,"c":true},{"a":11816,"n":"status_panel_row1","k":"table","len":40,"c":true},{"a":11856,"n":"status_panel_row2","k":"table","len":40,"c":true},{"a":11896,"n":"status_panel_row3","k":"table","len":40,"c":true},{"a":11936,"n":"status_panel_row4","k":"table","len":40,"c":true},{"a":11976,"n":"unused_2ec8","k":"table","len":184,"c":true},{"a":12160,"n":"str_copyright","k":"table","len":40,"c":true},{"a":12200,"n":"str_falcon_patrol","k":"table","len":13,"c":true},{"a":12213,"n":"unused_2fb5","k":"table","len":11,"c":true},{"a":12224,"n":"note_freq_hi","k":"table","len":32,"c":true},{"a":12256,"n":"note_freq_lo","k":"table","len":32,"c":true},{"a":12288,"n":"charset_digits_aircraft","k":"table","len":256,"c":true},{"a":12544,"n":"charset_town","k":"table","len":80,"c":true},{"a":12624,"n":"charset_crater","k":"table","len":16,"c":true},{"a":12640,"n":"charset_crater_mask","k":"table","len":64,"c":true},{"a":12704,"n":"charset_town_shading","k":"table","len":96,"c":true},{"a":12800,"n":"charset_dither_a","k":"table","len":256,"c":true},{"a":13056,"n":"charset_dither_b","k":"table","len":256,"c":true},{"a":13312,"n":"charset_alphabet","k":"table","len":256,"c":true},{"a":13568,"n":"charset_runway","k":"table","len":160,"c":true},{"a":13728,"n":"charset_gas_gauge","k":"table","len":64,"c":true},{"a":13792,"n":"charset_runway_caps","k":"table","len":32,"c":true},{"a":13824,"n":"charset_strokes","k":"table","len":128,"c":true},{"a":13952,"n":"charset_radar_canvas","k":"table","len":55,"c":true},{"a":14007,"n":"charset_radar_mid","k":"table","len":64,"c":true},{"a":14071,"n":"charset_radar_edge","k":"table","len":9,"c":true},{"a":14080,"n":"charset_fill_animated","k":"table","len":56,"c":true},{"a":14136,"n":"charset_radar_canvas_2","k":"table","len":64,"c":true},{"a":14200,"n":"charset_solid_fill","k":"table","len":136,"c":true},{"a":14336,"n":"terrain_map_row0","k":"table","len":64,"c":true},{"a":14400,"n":"terrain_map_row0_cont","k":"table","len":192,"c":true},{"a":14592,"n":"terrain_map_rows1_7","k":"table","len":1024,"c":true},{"a":15616,"n":"terrain_map_rows5_7","k":"table","len":768,"c":true},{"a":16384,"n":"glyph_colour_table","k":"table","len":64,"c":true},{"a":16640,"n":"cold_start","k":"routine","len":64,"c":true},{"a":16645,"n":"b_4105","k":"branch","len":1,"c":false},{"a":16685,"n":"b_412D","k":"branch","len":1,"c":false},{"a":16704,"n":"start_life","k":"routine","len":4,"c":true},{"a":16708,"n":"life_sequence","k":"routine","len":56,"c":true},{"a":16755,"n":"b_4173","k":"branch","len":1,"c":false},{"a":16764,"n":"trainer_target_lives","k":"routine","len":9,"c":true},{"a":16773,"n":"frame_loop","k":"routine","len":59,"c":true},{"a":16832,"n":"wait_for_tick","k":"routine","len":30,"c":true},{"a":16861,"n":"b_41DD","k":"branch","len":1,"c":false},{"a":16862,"n":"rebuild_display","k":"routine","len":21,"c":true},{"a":16896,"n":"check_collisions","k":"routine","len":15,"c":true},{"a":16911,"n":"trainer_target_collision_sprite","k":"routine","len":50,"c":true},{"a":16923,"n":"b_421B","k":"branch","len":1,"c":false},{"a":16932,"n":"b_4224","k":"branch","len":1,"c":false},{"a":16939,"n":"b_422B","k":"branch","len":1,"c":false},{"a":16948,"n":"b_4234","k":"branch","len":1,"c":false},{"a":16956,"n":"b_423C","k":"branch","len":1,"c":false},{"a":16961,"n":"b_4241","k":"routine","len":11,"c":true},{"a":16972,"n":"trainer_target_collision_background","k":"routine","len":144,"c":true},{"a":16975,"n":"b_424F","k":"branch","len":1,"c":false},{"a":16984,"n":"b_4258","k":"branch","len":1,"c":false},{"a":17004,"n":"b_426C","k":"branch","len":1,"c":false},{"a":17010,"n":"b_4272","k":"branch","len":1,"c":false},{"a":17015,"n":"b_4277","k":"branch","len":1,"c":false},{"a":17025,"n":"b_4281","k":"branch","len":1,"c":false},{"a":17028,"n":"b_4284","k":"branch","len":1,"c":false},{"a":17033,"n":"b_4289","k":"branch","len":1,"c":false},{"a":17037,"n":"b_428D","k":"branch","len":1,"c":false},{"a":17042,"n":"b_4292","k":"branch","len":1,"c":false},{"a":17077,"n":"b_42B5","k":"branch","len":1,"c":false},{"a":17090,"n":"b_42C2","k":"branch","len":1,"c":false},{"a":17097,"n":"b_42C9","k":"branch","len":1,"c":false},{"a":17100,"n":"b_42CC","k":"branch","len":1,"c":false},{"a":17105,"n":"b_42D1","k":"branch","len":1,"c":false},{"a":17115,"n":"r_42DB","k":"branch","len":1,"c":false},{"a":17120,"n":"draw_crater","k":"routine","len":20,"c":true},{"a":17155,"n":"enemy_break_off","k":"routine","len":13,"c":true},{"a":17167,"n":"r_430F","k":"branch","len":1,"c":false},{"a":17168,"n":"sprite_register_image","k":"table","len":48,"c":true},{"a":17216,"n":"enemy_update_slot","k":"routine","len":145,"c":true},{"a":17218,"n":"j_4342","k":"branch","len":1,"c":false},{"a":17234,"n":"b_4352","k":"branch","len":1,"c":false},{"a":17238,"n":"b_4356","k":"branch","len":1,"c":false},{"a":17265,"n":"b_4371","k":"branch","len":1,"c":false},{"a":17279,"n":"b_437F","k":"branch","len":1,"c":false},{"a":17282,"n":"b_4382","k":"branch","len":1,"c":false},{"a":17292,"n":"b_438C","k":"branch","len":1,"c":false},{"a":17298,"n":"b_4392","k":"branch","len":1,"c":false},{"a":17307,"n":"b_439B","k":"branch","len":1,"c":false},{"a":17310,"n":"b_439E","k":"branch","len":1,"c":false},{"a":17321,"n":"b_43A9","k":"branch","len":1,"c":false},{"a":17325,"n":"b_43AD","k":"branch","len":1,"c":false},{"a":17351,"n":"b_43C7","k":"branch","len":1,"c":false},{"a":17354,"n":"b_43CA","k":"branch","len":1,"c":false},{"a":17360,"n":"r_43D0","k":"branch","len":1,"c":false},{"a":17376,"n":"enemy_sprites_level","k":"routine","len":26,"c":true},{"a":17384,"n":"b_43E8","k":"branch","len":1,"c":false},{"a":17386,"n":"b_43EA","k":"branch","len":1,"c":false},{"a":17408,"n":"player_hit","k":"routine","len":22,"c":true},{"a":17429,"n":"r_4415","k":"branch","len":1,"c":false},{"a":17440,"n":"title_page_build","k":"routine","len":95,"c":true},{"a":17444,"n":"b_4424","k":"branch","len":1,"c":false},{"a":17501,"n":"b_445D","k":"branch","len":1,"c":false},{"a":17523,"n":"b_4473","k":"branch","len":1,"c":false},{"a":17536,"n":"title_paint_colours","k":"routine","len":23,"c":true},{"a":17540,"n":"b_4484","k":"branch","len":1,"c":false},{"a":17568,"n":"title_draw_credits","k":"routine","len":20,"c":true},{"a":17573,"n":"b_44A5","k":"branch","len":1,"c":false},{"a":17600,"n":"title_draw_logo","k":"routine","len":33,"c":true},{"a":17602,"n":"b_44C2","k":"branch","len":1,"c":false},{"a":17617,"n":"b_44D1","k":"branch","len":1,"c":false},{"a":17664,"n":"wave_start","k":"routine","len":64,"c":true},{"a":17702,"n":"b_4526","k":"branch","len":1,"c":false},{"a":17704,"n":"b_4528","k":"branch","len":1,"c":false},{"a":17727,"n":"r_453F","k":"branch","len":1,"c":false},{"a":17728,"n":"wave_release_aircraft","k":"routine","len":48,"c":true},{"a":17775,"n":"r_456F","k":"branch","len":1,"c":false},{"a":17776,"n":"enemy_move_x","k":"routine","len":80,"c":true},{"a":17784,"n":"b_4578","k":"branch","len":1,"c":false},{"a":17786,"n":"b_457A","k":"branch","len":1,"c":false},{"a":17798,"n":"b_4586","k":"branch","len":1,"c":false},{"a":17823,"n":"b_459F","k":"branch","len":1,"c":false},{"a":17839,"n":"b_45AF","k":"branch","len":1,"c":false},{"a":17855,"n":"r_45BF","k":"branch","len":1,"c":false},{"a":17856,"n":"enemy_move_y","k":"routine","len":75,"c":true},{"a":17868,"n":"b_45CC","k":"branch","len":1,"c":false},{"a":17892,"n":"b_45E4","k":"branch","len":1,"c":false},{"a":17906,"n":"b_45F2","k":"branch","len":1,"c":false},{"a":17911,"n":"b_45F7","k":"branch","len":1,"c":false},{"a":17930,"n":"r_460A","k":"branch","len":1,"c":false},{"a":17934,"n":"enemy_choose_manoeuvre","k":"routine","len":124,"c":true},{"a":17942,"n":"b_4616","k":"branch","len":1,"c":false},{"a":17962,"n":"b_462A","k":"branch","len":1,"c":false},{"a":17968,"n":"b_4630","k":"branch","len":1,"c":false},{"a":17980,"n":"b_463C","k":"branch","len":1,"c":false},{"a":17984,"n":"b_4640","k":"branch","len":1,"c":false},{"a":17992,"n":"b_4648","k":"branch","len":1,"c":false},{"a":18009,"n":"b_4659","k":"branch","len":1,"c":false},{"a":18026,"n":"b_466A","k":"branch","len":1,"c":false},{"a":18045,"n":"b_467D","k":"branch","len":1,"c":false},{"a":18051,"n":"b_4683","k":"branch","len":1,"c":false},{"a":18054,"n":"b_4686","k":"branch","len":1,"c":false},{"a":18057,"n":"r_4689","k":"branch","len":1,"c":false},{"a":18080,"n":"show_title_screen","k":"routine","len":140,"c":true},{"a":18099,"n":"b_46B3","k":"branch","len":1,"c":false},{"a":18146,"n":"b_46E2","k":"branch","len":1,"c":false},{"a":18156,"n":"b_46EC","k":"branch","len":1,"c":false},{"a":18175,"n":"b_46FF","k":"branch","len":1,"c":false},{"a":18177,"n":"b_4701","k":"branch","len":1,"c":false},{"a":18189,"n":"b_470D","k":"branch","len":1,"c":false},{"a":18195,"n":"b_4713","k":"branch","len":1,"c":false},{"a":18224,"n":"enemy_sprites_place","k":"routine","len":140,"c":true},{"a":18228,"n":"j_4734","k":"branch","len":1,"c":false},{"a":18232,"n":"b_4738","k":"branch","len":1,"c":false},{"a":18249,"n":"b_4749","k":"branch","len":1,"c":false},{"a":18292,"n":"b_4774","k":"branch","len":1,"c":false},{"a":18305,"n":"b_4781","k":"branch","len":1,"c":false},{"a":18354,"n":"b_47B2","k":"branch","len":1,"c":false},{"a":18363,"n":"r_47BB","k":"branch","len":1,"c":false},{"a":18432,"n":"flight_sound_update","k":"routine","len":125,"c":true},{"a":18445,"n":"b_480D","k":"branch","len":1,"c":false},{"a":18449,"n":"b_4811","k":"branch","len":1,"c":false},{"a":18461,"n":"b_481D","k":"branch","len":1,"c":false},{"a":18476,"n":"b_482C","k":"branch","len":1,"c":false},{"a":18490,"n":"b_483A","k":"branch","len":1,"c":false},{"a":18498,"n":"b_4842","k":"branch","len":1,"c":false},{"a":18512,"n":"b_4850","k":"branch","len":1,"c":false},{"a":18528,"n":"b_4860","k":"branch","len":1,"c":false},{"a":18556,"n":"r_487C","k":"branch","len":1,"c":false},{"a":18560,"n":"flight_sound_takeoff_or_alarm","k":"routine","len":6,"c":true},{"a":18566,"n":"sfx_takeoff_step","k":"routine","len":58,"c":true},{"a":18577,"n":"b_4891","k":"branch","len":1,"c":false},{"a":18593,"n":"b_48A1","k":"branch","len":1,"c":false},{"a":18604,"n":"b_48AC","k":"branch","len":1,"c":false},{"a":18620,"n":"b_48BC","k":"branch","len":1,"c":false},{"a":18623,"n":"r_48BF","k":"branch","len":1,"c":false},{"a":18633,"n":"landed_delay_step","k":"routine","len":17,"c":true},{"a":18635,"n":"b_48CB","k":"branch","len":1,"c":false},{"a":18637,"n":"b_48CD","k":"branch","len":1,"c":false},{"a":18656,"n":"sfx_cutoff_decay","k":"routine","len":17,"c":true},{"a":18667,"n":"b_48EB","k":"branch","len":1,"c":false},{"a":18688,"n":"sfx_low_fuel_alarm","k":"routine","len":102,"c":true},{"a":18709,"n":"b_4915","k":"branch","len":1,"c":false},{"a":18733,"n":"b_492D","k":"branch","len":1,"c":false},{"a":18749,"n":"b_493D","k":"branch","len":1,"c":false},{"a":18765,"n":"b_494D","k":"branch","len":1,"c":false},{"a":18772,"n":"b_4954","k":"branch","len":1,"c":false},{"a":18775,"n":"b_4957","k":"branch","len":1,"c":false},{"a":18785,"n":"b_4961","k":"branch","len":1,"c":false},{"a":18787,"n":"b_4963","k":"branch","len":1,"c":false},{"a":18789,"n":"r_4965","k":"branch","len":1,"c":false},{"a":18800,"n":"sid_load_engine","k":"routine","len":23,"c":true},{"a":18802,"n":"b_4972","k":"branch","len":1,"c":false},{"a":18832,"n":"sid_load_dive","k":"routine","len":43,"c":true},{"a":18834,"n":"b_4992","k":"branch","len":1,"c":false},{"a":18880,"n":"sid_load_touchdown","k":"routine","len":38,"c":true},{"a":18882,"n":"b_49C2","k":"branch","len":1,"c":false},{"a":18928,"n":"sid_load_v2_engine","k":"routine","len":26,"c":true},{"a":18930,"n":"b_49F2","k":"branch","len":1,"c":false},{"a":18960,"n":"sfx_takeoff_start","k":"routine","len":78,"c":true},{"a":18962,"n":"b_4A12","k":"branch","len":1,"c":false},{"a":18988,"n":"b_4A2C","k":"branch","len":1,"c":false},{"a":18996,"n":"b_4A34","k":"branch","len":1,"c":false},{"a":19002,"n":"b_4A3A","k":"branch","len":1,"c":false},{"a":19006,"n":"b_4A3E","k":"branch","len":1,"c":false},{"a":19014,"n":"b_4A46","k":"branch","len":1,"c":false},{"a":19017,"n":"b_4A49","k":"branch","len":1,"c":false},{"a":19030,"n":"b_4A56","k":"branch","len":1,"c":false},{"a":19032,"n":"b_4A58","k":"branch","len":1,"c":false},{"a":19040,"n":"sid_load_v2_alarm","k":"routine","len":25,"c":true},{"a":19042,"n":"b_4A62","k":"branch","len":1,"c":false},{"a":19072,"n":"wave_size_and_spacing","k":"routine","len":59,"c":true},{"a":19086,"n":"b_4A8E","k":"branch","len":1,"c":false},{"a":19092,"n":"b_4A94","k":"branch","len":1,"c":false},{"a":19096,"n":"b_4A98","k":"branch","len":1,"c":false},{"a":19102,"n":"b_4A9E","k":"branch","len":1,"c":false},{"a":19104,"n":"b_4AA0","k":"branch","len":1,"c":false},{"a":19106,"n":"b_4AA2","k":"branch","len":1,"c":false},{"a":19117,"n":"b_4AAD","k":"branch","len":1,"c":false},{"a":19136,"n":"irq_raster_split","k":"routine","len":83,"c":true},{"a":19168,"n":"b_4AE0","k":"branch","len":1,"c":false},{"a":19192,"n":"b_4AF8","k":"branch","len":1,"c":false},{"a":19211,"n":"b_4B0B","k":"branch","len":1,"c":false},{"a":19232,"n":"irq_install","k":"routine","len":54,"c":true},{"a":19268,"n":"b_4B44","k":"branch","len":1,"c":false},{"a":19293,"n":"title_tune_play","k":"routine","len":173,"c":true},{"a":19298,"n":"b_4B62","k":"branch","len":1,"c":false},{"a":19309,"n":"j_4B6D","k":"branch","len":1,"c":false},{"a":19351,"n":"b_4B97","k":"branch","len":1,"c":false},{"a":19362,"n":"b_4BA2","k":"branch","len":1,"c":false},{"a":19372,"n":"b_4BAC","k":"branch","len":1,"c":false},{"a":19379,"n":"b_4BB3","k":"branch","len":1,"c":false},{"a":19388,"n":"b_4BBC","k":"branch","len":1,"c":false},{"a":19400,"n":"b_4BC8","k":"branch","len":1,"c":false},{"a":19411,"n":"b_4BD3","k":"branch","len":1,"c":false},{"a":19421,"n":"b_4BDD","k":"branch","len":1,"c":false},{"a":19428,"n":"b_4BE4","k":"branch","len":1,"c":false},{"a":19437,"n":"b_4BED","k":"branch","len":1,"c":false},{"a":19458,"n":"b_4C02","k":"branch","len":1,"c":false},{"a":19462,"n":"b_4C06","k":"branch","len":1,"c":false},{"a":19470,"n":"title_tune_abort","k":"routine","len":26,"c":true},{"a":19487,"n":"b_4C1F","k":"branch","len":1,"c":false},{"a":19489,"n":"b_4C21","k":"branch","len":1,"c":false},{"a":19504,"n":"sid_silence","k":"routine","len":15,"c":true},{"a":19506,"n":"b_4C32","k":"branch","len":1,"c":false},{"a":19520,"n":"highscore_rank_score","k":"routine","len":80,"c":true},{"a":19524,"n":"b_4C44","k":"branch","len":1,"c":false},{"a":19533,"n":"b_4C4D","k":"branch","len":1,"c":false},{"a":19543,"n":"b_4C57","k":"branch","len":1,"c":false},{"a":19545,"n":"b_4C59","k":"branch","len":1,"c":false},{"a":19556,"n":"b_4C64","k":"branch","len":1,"c":false},{"a":19561,"n":"b_4C69","k":"branch","len":1,"c":false},{"a":19569,"n":"b_4C71","k":"branch","len":1,"c":false},{"a":19576,"n":"b_4C78","k":"branch","len":1,"c":false},{"a":19596,"n":"b_4C8C","k":"branch","len":1,"c":false},{"a":19600,"n":"highscore_insert","k":"routine","len":82,"c":true},{"a":19608,"n":"b_4C98","k":"branch","len":1,"c":false},{"a":19624,"n":"b_4CA8","k":"branch","len":1,"c":false},{"a":19626,"n":"b_4CAA","k":"branch","len":1,"c":false},{"a":19638,"n":"b_4CB6","k":"branch","len":1,"c":false},{"a":19663,"n":"b_4CCF","k":"branch","len":1,"c":false},{"a":19679,"n":"b_4CDF","k":"branch","len":1,"c":false},{"a":19682,"n":"highscore_name_entry","k":"routine","len":145,"c":true},{"a":19704,"n":"b_4CF8","k":"branch","len":1,"c":false},{"a":19719,"n":"b_4D07","k":"branch","len":1,"c":false},{"a":19748,"n":"b_4D24","k":"branch","len":1,"c":false},{"a":19759,"n":"b_4D2F","k":"branch","len":1,"c":false},{"a":19766,"n":"b_4D36","k":"branch","len":1,"c":false},{"a":19782,"n":"b_4D46","k":"branch","len":1,"c":false},{"a":19799,"n":"b_4D57","k":"branch","len":1,"c":false},{"a":19809,"n":"b_4D61","k":"branch","len":1,"c":false},{"a":19820,"n":"b_4D6C","k":"branch","len":1,"c":false},{"a":19827,"n":"trainer_target_highscore_save","k":"routine","len":4,"c":true},{"a":19840,"n":"highscore_shift_down","k":"routine","len":61,"c":true},{"a":19847,"n":"b_4D87","k":"branch","len":1,"c":false},{"a":19861,"n":"b_4D95","k":"branch","len":1,"c":false},{"a":19875,"n":"b_4DA3","k":"branch","len":1,"c":false},{"a":19889,"n":"b_4DB1","k":"branch","len":1,"c":false},{"a":19898,"n":"b_4DBA","k":"branch","len":1,"c":false},{"a":19904,"n":"name_entry_cursor","k":"routine","len":35,"c":true},{"a":19927,"n":"b_4DD7","k":"branch","len":1,"c":false},{"a":19931,"n":"b_4DDB","k":"branch","len":1,"c":false},{"a":19941,"n":"name_entry_accept_letter","k":"routine","len":24,"c":true},{"a":19968,"n":"sid_setup_name_entry","k":"routine","len":37,"c":true},{"a":20016,"n":"name_entry_letter_note","k":"routine","len":29,"c":true},{"a":20048,"n":"draw_horizon_row","k":"routine","len":17,"c":true},{"a":20052,"n":"b_4E54","k":"branch","len":1,"c":false},{"a":20080,"n":"draw_status_panel","k":"routine","len":33,"c":true},{"a":20082,"n":"b_4E72","k":"branch","len":1,"c":false},{"a":20107,"n":"b_4E8B","k":"branch","len":1,"c":false},{"a":20128,"n":"draw_gas_gauge","k":"routine","len":60,"c":true},{"a":20132,"n":"b_4EA4","k":"branch","len":1,"c":false},{"a":20148,"n":"b_4EB4","k":"branch","len":1,"c":false},{"a":20158,"n":"b_4EBE","k":"branch","len":1,"c":false},{"a":20176,"n":"b_4ED0","k":"branch","len":1,"c":false},{"a":20178,"n":"b_4ED2","k":"branch","len":1,"c":false},{"a":20192,"n":"title_wait_for_fire","k":"routine","len":32,"c":true},{"a":20196,"n":"b_4EE4","k":"branch","len":1,"c":false},{"a":20198,"n":"b_4EE6","k":"branch","len":1,"c":false},{"a":20200,"n":"b_4EE8","k":"branch","len":1,"c":false},{"a":20211,"n":"b_4EF3","k":"branch","len":1,"c":false},{"a":20223,"n":"r_4EFF","k":"branch","len":1,"c":false},{"a":20224,"n":"sid_preset_engine","k":"table","len":25,"c":true},{"a":20249,"n":"sid_preset_dive","k":"table","len":25,"c":true},{"a":20274,"n":"sid_preset_touchdown","k":"table","len":25,"c":true},{"a":20299,"n":"sid_preset_v2_engine","k":"table","len":7,"c":true},{"a":20306,"n":"sid_preset_v2_takeoff","k":"table","len":7,"c":true},{"a":20313,"n":"sid_preset_v2_alarm","k":"table","len":7,"c":true},{"a":20336,"n":"gas_gauge_part_glyph","k":"routine","len":40,"c":true},{"a":20340,"n":"b_4F74","k":"branch","len":1,"c":false},{"a":20350,"n":"b_4F7E","k":"branch","len":1,"c":false},{"a":20358,"n":"b_4F86","k":"branch","len":1,"c":false},{"a":20360,"n":"b_4F88","k":"branch","len":1,"c":false},{"a":20367,"n":"b_4F8F","k":"branch","len":1,"c":false},{"a":20369,"n":"b_4F91","k":"branch","len":1,"c":false},{"a":20384,"n":"sfx_extra_life","k":"routine","len":36,"c":true},{"a":20397,"n":"b_4FAD","k":"branch","len":1,"c":false},{"a":20407,"n":"b_4FB7","k":"branch","len":1,"c":false},{"a":20409,"n":"b_4FB9","k":"branch","len":1,"c":false},{"a":20416,"n":"b_4FC0","k":"branch","len":1,"c":false},{"a":20419,"n":"r_4FC3","k":"branch","len":1,"c":false},{"a":20432,"n":"sid_load_v2_bonus","k":"routine","len":16,"c":true},{"a":20434,"n":"b_4FD2","k":"branch","len":1,"c":false},{"a":20448,"n":"sid_preset_v2_bonus","k":"table","len":7,"c":true},{"a":20480,"n":"refuel_rearm_sequence","k":"routine","len":32,"c":true},{"a":20482,"n":"b_5002","k":"branch","len":1,"c":false},{"a":20491,"n":"b_500B","k":"branch","len":1,"c":false},{"a":20512,"n":"dead_draw_lives_row21","k":"routine","len":11,"c":true},{"a":20523,"n":"cold_start_ports_then_sprites","k":"routine","len":5,"c":true},{"a":20528,"n":"load_sprite_registers","k":"routine","len":16,"c":true},{"a":20530,"n":"b_5032","k":"branch","len":1,"c":false},{"a":20540,"n":"b_503C","k":"branch","len":1,"c":false},{"a":20544,"n":"dead_delay_loop","k":"routine","len":17,"c":true},{"a":20546,"n":"b_5042","k":"branch","len":1,"c":false},{"a":20550,"n":"b_5046","k":"branch","len":1,"c":false},{"a":20561,"n":"delay_y_x_loops","k":"routine","len":9,"c":true},{"a":20563,"n":"b_5053","k":"branch","len":1,"c":false},{"a":20570,"n":"place_smoke_sprite","k":"routine","len":38,"c":true},{"a":20590,"n":"b_506E","k":"branch","len":1,"c":false},{"a":20598,"n":"b_5076","k":"branch","len":1,"c":false},{"a":20607,"n":"r_507F","k":"branch","len":1,"c":false},{"a":20608,"n":"clear_screen_and_reset_scroll","k":"routine","len":24,"c":true},{"a":20612,"n":"b_5084","k":"branch","len":1,"c":false},{"a":20639,"n":"put_terrain_column","k":"routine","len":33,"c":true},{"a":20654,"n":"b_50AE","k":"branch","len":1,"c":false},{"a":20672,"n":"advance_row_pointers","k":"routine","len":16,"c":true},{"a":20687,"n":"r_50CF","k":"branch","len":1,"c":false},{"a":20688,"n":"init_terrain_pointers","k":"routine","len":27,"c":true},{"a":20720,"n":"scroll_landscape_left","k":"routine","len":39,"c":true},{"a":20725,"n":"b_50F5","k":"branch","len":1,"c":false},{"a":20727,"n":"b_50F7","k":"branch","len":1,"c":false},{"a":20758,"n":"r_5116","k":"branch","len":1,"c":false},{"a":20768,"n":"scroll_landscape_right","k":"routine","len":37,"c":true},{"a":20773,"n":"b_5125","k":"branch","len":1,"c":false},{"a":20775,"n":"b_5127","k":"branch","len":1,"c":false},{"a":20804,"n":"r_5144","k":"branch","len":1,"c":false},{"a":20816,"n":"screen_ptr_if_on_playfield","k":"routine","len":13,"c":true},{"a":20828,"n":"r_515C","k":"branch","len":1,"c":false},{"a":20864,"n":"dead_fill_panel_solid","k":"routine","len":16,"c":true},{"a":20866,"n":"b_5182","k":"branch","len":1,"c":false},{"a":20880,"n":"dead_clear_sky_rows","k":"routine","len":32,"c":true},{"a":20884,"n":"b_5194","k":"branch","len":1,"c":false},{"a":20912,"n":"paint_landscape","k":"routine","len":16,"c":true},{"a":20914,"n":"b_51B2","k":"branch","len":1,"c":false},{"a":20928,"n":"draw_status_readouts","k":"routine","len":80,"c":true},{"a":20930,"n":"b_51C2","k":"branch","len":1,"c":false},{"a":20945,"n":"b_51D1","k":"branch","len":1,"c":false},{"a":20961,"n":"b_51E1","k":"branch","len":1,"c":false},{"a":21024,"n":"init_unread_6400_buffer","k":"routine","len":57,"c":true},{"a":21028,"n":"b_5224","k":"branch","len":1,"c":false},{"a":21066,"n":"b_524A","k":"branch","len":1,"c":false},{"a":21088,"n":"draw_radar_window","k":"routine","len":62,"c":true},{"a":21106,"n":"b_5272","k":"branch","len":1,"c":false},{"a":21121,"n":"b_5281","k":"branch","len":1,"c":false},{"a":21136,"n":"b_5290","k":"branch","len":1,"c":false},{"a":21152,"n":"clear_radar_bitmaps","k":"routine","len":70,"c":true},{"a":21156,"n":"b_52A4","k":"branch","len":1,"c":false},{"a":21169,"n":"b_52B1","k":"branch","len":1,"c":false},{"a":21185,"n":"b_52C1","k":"branch","len":1,"c":false},{"a":21203,"n":"b_52D3","k":"branch","len":1,"c":false},{"a":21205,"n":"b_52D5","k":"branch","len":1,"c":false},{"a":21208,"n":"b_52D8","k":"branch","len":1,"c":false},{"a":21232,"n":"draw_radar_blips","k":"routine","len":63,"c":true},{"a":21241,"n":"b_52F9","k":"branch","len":1,"c":false},{"a":21267,"n":"b_5313","k":"branch","len":1,"c":false},{"a":21270,"n":"b_5316","k":"branch","len":1,"c":false},{"a":21272,"n":"b_5318","k":"branch","len":1,"c":false},{"a":21291,"n":"b_532B","k":"branch","len":1,"c":false},{"a":21312,"n":"plot_radar_pixel","k":"routine","len":69,"c":true},{"a":21326,"n":"b_534E","k":"branch","len":1,"c":false},{"a":21332,"n":"b_5354","k":"branch","len":1,"c":false},{"a":21363,"n":"b_5373","k":"branch","len":1,"c":false},{"a":21370,"n":"b_537A","k":"branch","len":1,"c":false},{"a":21392,"n":"lower_jet_onto_pad","k":"routine","len":49,"c":true},{"a":21414,"n":"b_53A6","k":"branch","len":1,"c":false},{"a":21422,"n":"b_53AE","k":"branch","len":1,"c":false},{"a":21424,"n":"b_53B0","k":"branch","len":1,"c":false},{"a":21434,"n":"b_53BA","k":"branch","len":1,"c":false},{"a":21456,"n":"msg_press_fire","k":"table","len":19,"c":true},{"a":21475,"n":"prompt_press_fire","k":"routine","len":61,"c":true},{"a":21481,"n":"b_53E9","k":"branch","len":1,"c":false},{"a":21499,"n":"b_53FB","k":"branch","len":1,"c":false},{"a":21519,"n":"b_540F","k":"branch","len":1,"c":false},{"a":21523,"n":"b_5413","k":"branch","len":1,"c":false},{"a":21536,"n":"refuel_rearm_tick","k":"routine","len":80,"c":true},{"a":21573,"n":"b_5445","k":"branch","len":1,"c":false},{"a":21606,"n":"b_5466","k":"branch","len":1,"c":false},{"a":21616,"n":"dead_input_forge","k":"routine","len":37,"c":true},{"a":21635,"n":"b_5483","k":"branch","len":1,"c":false},{"a":21653,"n":"flight_update","k":"routine","len":19,"c":true},{"a":21663,"n":"b_549F","k":"branch","len":1,"c":false},{"a":21672,"n":"apply_turn","k":"routine","len":104,"c":true},{"a":21689,"n":"b_54B9","k":"branch","len":1,"c":false},{"a":21706,"n":"b_54CA","k":"branch","len":1,"c":false},{"a":21720,"n":"b_54D8","k":"branch","len":1,"c":false},{"a":21734,"n":"b_54E6","k":"branch","len":1,"c":false},{"a":21738,"n":"b_54EA","k":"branch","len":1,"c":false},{"a":21752,"n":"b_54F8","k":"branch","len":1,"c":false},{"a":21760,"n":"b_5500","k":"branch","len":1,"c":false},{"a":21776,"n":"pad_nops_5510","k":"table","len":48,"c":true},{"a":21824,"n":"burn_fuel","k":"routine","len":30,"c":true},{"a":21852,"n":"b_555C","k":"branch","len":1,"c":false},{"a":21854,"n":"trainer_target_fuel","k":"routine","len":53,"c":true},{"a":21872,"n":"b_5570","k":"branch","len":1,"c":false},{"a":21896,"n":"b_5588","k":"branch","len":1,"c":false},{"a":21906,"n":"r_5592","k":"branch","len":1,"c":false},{"a":21914,"n":"base_refuel_and_bonus_life","k":"routine","len":86,"c":true},{"a":21965,"n":"b_55CD","k":"branch","len":1,"c":false},{"a":21983,"n":"b_55DF","k":"branch","len":1,"c":false},{"a":21999,"n":"r_55EF","k":"branch","len":1,"c":false},{"a":22016,"n":"animate_bank_attitude","k":"routine","len":64,"c":true},{"a":22028,"n":"b_560C","k":"branch","len":1,"c":false},{"a":22051,"n":"b_5623","k":"branch","len":1,"c":false},{"a":22056,"n":"b_5628","k":"branch","len":1,"c":false},{"a":22061,"n":"b_562D","k":"branch","len":1,"c":false},{"a":22072,"n":"b_5638","k":"branch","len":1,"c":false},{"a":22079,"n":"r_563F","k":"branch","len":1,"c":false},{"a":22080,"n":"end_life_when_wreck_settled","k":"routine","len":14,"c":true},{"a":22094,"n":"reset_game_state","k":"routine","len":53,"c":true},{"a":22103,"n":"b_5657","k":"branch","len":1,"c":false},{"a":22114,"n":"b_5662","k":"branch","len":1,"c":false},{"a":22123,"n":"b_566B","k":"branch","len":1,"c":false},{"a":22146,"n":"r_5682","k":"branch","len":1,"c":false},{"a":22160,"n":"crash_sequence","k":"routine","len":100,"c":true},{"a":22211,"n":"b_56C3","k":"branch","len":1,"c":false},{"a":22229,"n":"b_56D5","k":"branch","len":1,"c":false},{"a":22245,"n":"b_56E5","k":"branch","len":1,"c":false},{"a":22252,"n":"b_56EC","k":"branch","len":1,"c":false},{"a":22259,"n":"r_56F3","k":"branch","len":1,"c":false},{"a":22272,"n":"read_input","k":"routine","len":24,"c":true},{"a":22290,"n":"b_5712","k":"branch","len":1,"c":false},{"a":22296,"n":"b_5718","k":"routine","len":12,"c":true},{"a":22308,"n":"b_5724","k":"routine","len":13,"c":true},{"a":22321,"n":"b_5731","k":"routine","len":12,"c":true},{"a":22333,"n":"b_573D","k":"routine","len":35,"c":true},{"a":22368,"n":"b_5760","k":"routine","len":48,"c":true},{"a":22400,"n":"b_5780","k":"branch","len":1,"c":false},{"a":22415,"n":"r_578F","k":"branch","len":1,"c":false},{"a":22416,"n":"launch_missile","k":"routine","len":75,"c":true},{"a":22438,"n":"b_57A6","k":"branch","len":1,"c":false},{"a":22440,"n":"b_57A8","k":"branch","len":1,"c":false},{"a":22452,"n":"b_57B4","k":"branch","len":1,"c":false},{"a":22454,"n":"b_57B6","k":"branch","len":1,"c":false},{"a":22463,"n":"b_57BF","k":"branch","len":1,"c":false},{"a":22465,"n":"b_57C1","k":"branch","len":1,"c":false},{"a":22482,"n":"b_57D2","k":"branch","len":1,"c":false},{"a":22489,"n":"b_57D9","k":"branch","len":1,"c":false},{"a":22491,"n":"trainer_target_aam","k":"routine","len":37,"c":true},{"a":22505,"n":"b_57E9","k":"branch","len":1,"c":false},{"a":22521,"n":"b_57F9","k":"branch","len":1,"c":false},{"a":22527,"n":"r_57FF","k":"branch","len":1,"c":false},{"a":22528,"n":"screen_ptr_from_cell","k":"routine","len":49,"c":true},{"a":22542,"n":"b_580E","k":"branch","len":1,"c":false},{"a":22562,"n":"b_5822","k":"branch","len":1,"c":false},{"a":22576,"n":"r_5830","k":"branch","len":1,"c":false},{"a":22592,"n":"erase_player_missiles","k":"routine","len":33,"c":true},{"a":22594,"n":"b_5842","k":"branch","len":1,"c":false},{"a":22619,"n":"b_585B","k":"branch","len":1,"c":false},{"a":22640,"n":"move_player_missiles","k":"routine","len":44,"c":true},{"a":22648,"n":"b_5878","k":"branch","len":1,"c":false},{"a":22660,"n":"b_5884","k":"branch","len":1,"c":false},{"a":22662,"n":"b_5886","k":"branch","len":1,"c":false},{"a":22670,"n":"b_588E","k":"branch","len":1,"c":false},{"a":22678,"n":"b_5896","k":"branch","len":1,"c":false},{"a":22683,"n":"r_589B","k":"branch","len":1,"c":false},{"a":22688,"n":"draw_player_missiles","k":"routine","len":47,"c":true},{"a":22690,"n":"b_58A2","k":"branch","len":1,"c":false},{"a":22714,"n":"b_58BA","k":"branch","len":1,"c":false},{"a":22716,"n":"b_58BC","k":"branch","len":1,"c":false},{"a":22729,"n":"b_58C9","k":"branch","len":1,"c":false},{"a":22736,"n":"update_enemy_aircraft","k":"routine","len":34,"c":true},{"a":22766,"n":"b_58EE","k":"branch","len":1,"c":false},{"a":22784,"n":"unused_enemy_shot_spawn","k":"table","len":96,"c":true},{"a":22880,"n":"erase_enemy_shots","k":"routine","len":32,"c":true},{"a":22882,"n":"b_5962","k":"branch","len":1,"c":false},{"a":22905,"n":"b_5979","k":"branch","len":1,"c":false},{"a":22912,"n":"move_enemy_shots","k":"routine","len":64,"c":true},{"a":22920,"n":"b_5988","k":"branch","len":1,"c":false},{"a":22934,"n":"b_5996","k":"branch","len":1,"c":false},{"a":22936,"n":"b_5998","k":"branch","len":1,"c":false},{"a":22944,"n":"b_59A0","k":"branch","len":1,"c":false},{"a":22950,"n":"b_59A6","k":"branch","len":1,"c":false},{"a":22961,"n":"b_59B1","k":"branch","len":1,"c":false},{"a":22975,"n":"r_59BF","k":"branch","len":1,"c":false},{"a":22976,"n":"draw_enemy_shots","k":"routine","len":48,"c":true},{"a":22978,"n":"b_59C2","k":"branch","len":1,"c":false},{"a":23000,"n":"b_59D8","k":"branch","len":1,"c":false},{"a":23002,"n":"b_59DA","k":"branch","len":1,"c":false},{"a":23015,"n":"b_59E7","k":"branch","len":1,"c":false},{"a":23040,"n":"update_enemy_shots","k":"routine","len":13,"c":true},{"a":23072,"n":"animate_player_bank","k":"routine","len":164,"c":true},{"a":23110,"n":"b_5A46","k":"branch","len":1,"c":false},{"a":23112,"n":"b_5A48","k":"branch","len":1,"c":false},{"a":23130,"n":"b_5A5A","k":"branch","len":1,"c":false},{"a":23148,"n":"b_5A6C","k":"branch","len":1,"c":false},{"a":23150,"n":"j_5A6E","k":"branch","len":1,"c":false},{"a":23165,"n":"b_5A7D","k":"branch","len":1,"c":false},{"a":23178,"n":"b_5A8A","k":"branch","len":1,"c":false},{"a":23188,"n":"b_5A94","k":"branch","len":1,"c":false},{"a":23201,"n":"b_5AA1","k":"branch","len":1,"c":false},{"a":23204,"n":"b_5AA4","k":"branch","len":1,"c":false},{"a":23215,"n":"b_5AAF","k":"branch","len":1,"c":false},{"a":23224,"n":"b_5AB8","k":"branch","len":1,"c":false},{"a":23228,"n":"b_5ABC","k":"branch","len":1,"c":false},{"a":23236,"n":"copy_frame_to_block86","k":"routine","len":11,"c":true},{"a":23238,"n":"b_5AC6","k":"branch","len":1,"c":false},{"a":23248,"n":"copy_frame_to_block80","k":"routine","len":11,"c":true},{"a":23250,"n":"b_5AD2","k":"branch","len":1,"c":false},{"a":23264,"n":"init_cia1_ports_and_0200","k":"routine","len":21,"c":true},{"a":23278,"n":"b_5AEE","k":"branch","len":1,"c":false},{"a":23296,"n":"spawn_enemy_shot","k":"routine","len":128,"c":true},{"a":23317,"n":"b_5B15","k":"branch","len":1,"c":false},{"a":23348,"n":"b_5B34","k":"branch","len":1,"c":false},{"a":23359,"n":"b_5B3F","k":"branch","len":1,"c":false},{"a":23394,"n":"b_5B62","k":"branch","len":1,"c":false},{"a":23414,"n":"b_5B76","k":"branch","len":1,"c":false},{"a":23419,"n":"b_5B7B","k":"branch","len":1,"c":false},{"a":23423,"n":"r_5B7F","k":"branch","len":1,"c":false},{"a":23424,"n":"logo_row_top","k":"table","len":16,"c":true},{"a":23440,"n":"logo_row_bottom","k":"table","len":16,"c":true},{"a":23456,"n":"reset_player_sprite_shapes","k":"routine","len":18,"c":true},{"a":23458,"n":"b_5BA2","k":"branch","len":1,"c":false},{"a":23504,"n":"update_bombs","k":"routine","len":16,"c":true},{"a":23552,"n":"spawn_bomb","k":"routine","len":112,"c":true},{"a":23577,"n":"b_5C19","k":"branch","len":1,"c":false},{"a":23595,"n":"b_5C2B","k":"branch","len":1,"c":false},{"a":23604,"n":"b_5C34","k":"branch","len":1,"c":false},{"a":23613,"n":"b_5C3D","k":"branch","len":1,"c":false},{"a":23663,"n":"r_5C6F","k":"branch","len":1,"c":false},{"a":23664,"n":"bomb_track_scroll","k":"routine","len":64,"c":true},{"a":23672,"n":"b_5C78","k":"branch","len":1,"c":false},{"a":23674,"n":"b_5C7A","k":"branch","len":1,"c":false},{"a":23698,"n":"b_5C92","k":"branch","len":1,"c":false},{"a":23714,"n":"b_5CA2","k":"branch","len":1,"c":false},{"a":23727,"n":"r_5CAF","k":"branch","len":1,"c":false},{"a":23728,"n":"bomb_fall","k":"routine","len":64,"c":true},{"a":23736,"n":"b_5CB8","k":"branch","len":1,"c":false},{"a":23738,"n":"b_5CBA","k":"branch","len":1,"c":false},{"a":23782,"n":"b_5CE6","k":"branch","len":1,"c":false},{"a":23791,"n":"r_5CEF","k":"branch","len":1,"c":false},{"a":23808,"n":"draw_bomb_sprites","k":"routine","len":144,"c":true},{"a":23812,"n":"j_5D04","k":"branch","len":1,"c":false},{"a":23816,"n":"b_5D08","k":"branch","len":1,"c":false},{"a":23833,"n":"b_5D19","k":"branch","len":1,"c":false},{"a":23876,"n":"b_5D44","k":"branch","len":1,"c":false},{"a":23889,"n":"b_5D51","k":"branch","len":1,"c":false},{"a":23938,"n":"b_5D82","k":"branch","len":1,"c":false},{"a":23951,"n":"r_5D8F","k":"branch","len":1,"c":false},{"a":23968,"n":"sprite_cell_position","k":"routine","len":58,"c":true},{"a":24000,"n":"b_5DC0","k":"branch","len":1,"c":false},{"a":24006,"n":"b_5DC6","k":"branch","len":1,"c":false},{"a":24018,"n":"b_5DD2","k":"branch","len":1,"c":false},{"a":24080,"n":"add_score","k":"routine","len":31,"c":true},{"a":24089,"n":"b_5E19","k":"branch","len":1,"c":false},{"a":24091,"n":"b_5E1B","k":"branch","len":1,"c":false},{"a":24105,"n":"b_5E29","k":"branch","len":1,"c":false},{"a":24112,"n":"clear_bomb_active_flag","k":"routine","len":21,"c":true},{"a":24132,"n":"r_5E44","k":"branch","len":1,"c":false},{"a":24133,"n":"refresh_blast_glyphs","k":"routine","len":32,"c":true},{"a":24135,"n":"b_5E47","k":"branch","len":1,"c":false},{"a":24145,"n":"b_5E51","k":"branch","len":1,"c":false},{"a":24148,"n":"b_5E54","k":"branch","len":1,"c":false},{"a":24170,"n":"enemy_shot_down","k":"routine","len":40,"c":true},{"a":24209,"n":"r_5E91","k":"branch","len":1,"c":false},{"a":24224,"n":"enemy_proximity_siren","k":"routine","len":92,"c":true},{"a":24236,"n":"b_5EAC","k":"branch","len":1,"c":false},{"a":24244,"n":"b_5EB4","k":"branch","len":1,"c":false},{"a":24249,"n":"b_5EB9","k":"branch","len":1,"c":false},{"a":24258,"n":"b_5EC2","k":"branch","len":1,"c":false},{"a":24264,"n":"b_5EC8","k":"branch","len":1,"c":false},{"a":24272,"n":"b_5ED0","k":"branch","len":1,"c":false},{"a":24286,"n":"b_5EDE","k":"branch","len":1,"c":false},{"a":24298,"n":"b_5EEA","k":"branch","len":1,"c":false},{"a":24304,"n":"b_5EF0","k":"branch","len":1,"c":false},{"a":24312,"n":"b_5EF8","k":"branch","len":1,"c":false},{"a":24315,"n":"r_5EFB","k":"branch","len":1,"c":false},{"a":24320,"n":"scroll_world","k":"routine","len":66,"c":true},{"a":24350,"n":"b_5F1E","k":"branch","len":1,"c":false},{"a":24356,"n":"b_5F24","k":"branch","len":1,"c":false},{"a":24373,"n":"b_5F35","k":"branch","len":1,"c":false},{"a":24385,"n":"r_5F41","k":"branch","len":1,"c":false},{"a":24386,"n":"update_enemy_shots_twice","k":"routine","len":7,"c":true},{"a":24416,"n":"destroy_base","k":"routine","len":17,"c":true},{"a":24427,"n":"b_5F6B","k":"branch","len":1,"c":false},{"a":24433,"n":"trainer_target_base_hit","k":"routine","len":79,"c":true},{"a":24443,"n":"b_5F7B","k":"branch","len":1,"c":false},{"a":24445,"n":"b_5F7D","k":"branch","len":1,"c":false},{"a":24456,"n":"b_5F88","k":"branch","len":1,"c":false},{"a":24458,"n":"b_5F8A","k":"branch","len":1,"c":false},{"a":24483,"n":"b_5FA3","k":"branch","len":1,"c":false},{"a":24511,"n":"r_5FBF","k":"branch","len":1,"c":false},{"a":24528,"n":"rebuild_bases","k":"routine","len":26,"c":true},{"a":24530,"n":"b_5FD2","k":"branch","len":1,"c":false},{"a":24541,"n":"b_5FDD","k":"branch","len":1,"c":false},{"a":24547,"n":"b_5FE3","k":"branch","len":1,"c":false},{"a":24550,"n":"b_5FE6","k":"branch","len":1,"c":false},{"a":24576,"n":"gas_bar_buffer","k":"table","len":64,"c":true},{"a":25600,"n":"initfill_6400","k":"table","len":64,"c":true},{"a":25735,"n":"initfill_hole_1","k":"table","len":25,"c":true},{"a":25760,"n":"initfill_64A0","k":"table","len":55,"c":true},{"a":25815,"n":"initfill_hole_2","k":"table","len":64,"c":true},{"a":25988,"n":"initrec_tag_1","k":"variable","len":1,"c":true},{"a":25989,"n":"initrec_value_1","k":"table","len":64,"c":true},{"a":26068,"n":"initrec_tag_2","k":"variable","len":1,"c":true},{"a":26069,"n":"initrec_value_2","k":"table","len":64,"c":true},{"a":26148,"n":"initrec_tag_3","k":"variable","len":1,"c":true},{"a":26149,"n":"initrec_value_3","k":"variable","len":2,"c":true},{"a":26151,"n":"initrec_stray_zero_field","k":"table","len":64,"c":true}],"records":[{"a":0,"l":"cpu_port_ddr","c":"6510 on-chip port data-direction register (not RAM; the snapshot's RAM image here holds unrelated bytes). This game plays no banking tricks: facts.md records $01 = $37 for the whole run, so BASIC ROM, I/O and KERNAL are all banked in.","t":"byte","b":[0]},{"a":1,"l":"cpu_port","c":"6510 on-chip port. Stays $37 throughout, so the VIC bank-0 window at $1000-$1FFF hides the RAM the crack keeps its menu text and documents screen in (see crack_front_end at $1900).","t":"byte","b":[0]},{"a":2,"l":"zp_clear_base","c":"Not a variable. The cold start at $4100 clears zero page with LDX #$70 / STA $02,X / DEX / BNE, so it writes $03-$72 and never touches $02 itself. No other code reads or writes it.","t":"byte","b":[1,0,0],"x":[16645]},{"a":5,"l":"ptr_screen","c":"Low byte of a 16-bit screen-RAM pointer ($05/$06). build_screen_ptr at $5800 loads it with $0400 + 40*Y + X (Y in .Y, X in .X) and the matching colour-RAM address into $07/$08; the AAM and bomb drawing at $5840/$58A0/$5960/$59C0 then stores through ($05),Y. The high-score name entry at $4C51-$4CBD reuses the same pair for its own screen pointer.","t":"byte","b":[240],"x":[17004,17124,17133,19537,19548,19576,19581,19602,19611,19616,19629,19638,19645,19769,22530,22545,22550,22564,22566,22614,22718,22900,23004,24418]},{"a":6,"l":"ptr_screen_hi","c":"High byte of the screen pointer built by $5800 (starts at $04 and is INCed once per 256 bytes of row offset).","t":"byte","b":[4],"x":[19541,19585,19606,19620,19652,22536,22556,22572]},{"a":7,"l":"ptr_colour","c":"Low byte of the colour-RAM pointer ($07/$08) that $5800 builds alongside ptr_screen, so a glyph and its colour are written from one row/column pair. $50D0 reuses $07/$08 as a *screen* pointer ($05E0, landscape row 12) for the character scroll, with $09/$0A as the matching colour pointer - the pair is scratch, not dedicated.","t":"byte","b":[240],"x":[17128,17137,19650,19663,20662,20672,20677,20690,20727,20736,20775,20784,21090,21107,21122,21137,22532,22552,22568,22724,23010]},{"a":8,"l":"ptr_colour_hi","c":"High byte of the colour pointer built by $5800 (starts $D8); $50D8 loads $05 here instead when the landscape scroller borrows the pair.","t":"byte","b":[216],"x":[19657,20683,20696,21096,22540,22558,22574]},{"a":9,"l":"ptr_scroll_colour","c":"Low byte of the colour-RAM pointer the landscape scroller uses ($09/$0A, set to $D9E0 at $50DA = colour RAM for screen row 12). $50F7-$5100 shifts screen and colour together one character per call.","t":"byte","b":[84],"x":[20667,20679,20692,20730,20733,20778,20781,21092,21111,21126,21141]},{"a":10,"l":"ptr_scroll_colour_hi","c":"High byte of the landscape scroller's colour pointer, $D9 at $50DA, INCed at $50CD when the row pointer crosses a page.","t":"byte","b":[219],"x":[20685,20700,21100]},{"a":11,"l":"scroll_rows_left","c":"Countdown of landscape rows still to shift. $50E0 loads 8 (screen rows 12-19, the landscape band); DECed at $510C (scroll left) and $513A (scroll right), and the routine stops when it reaches zero.","t":"byte","b":[0],"x":[20704,20748,20794]},{"a":12,"l":"input_byte","c":"Joystick/keyboard byte after the game has forged it. Not the raw port: altitude limits, take-off and touchdown all rewrite it, and everything downstream believes it.","t":"byte","b":[255],"x":[19685,19691,19704,21619,21627,21631,21643,21672,21689,21706,21720,22275,22284,22288,22300,22304,22315,22319,22327,22331,22341,22358,22403]},{"a":13,"l":"world_x","c":"World scroll position: the column of the terrain/base map at $3800 that is currently at the left of the view. INCed at $50F3 when the landscape scrolls left and DECed at $5123 when it scrolls right. Used as the map index by the landing test ($55B1 reads $3800+$0D+$12 and +$14 and wants glyph $16, an intact base), by the radar at $52F0 ($11 = $0D-$6C), by the wave spawner at $450C and by the base-damage scan at $5F68.","t":"byte","b":[66],"x":[17676,18249,20629,20639,20723,20771,21232,21937,23328,23833,24286,24424,24466]},{"a":14,"l":"ptr_terrain","c":"Low byte of a pointer into the terrain map ($0E/$0F, high byte $38 set at $50E4). $50B0 reads the next map glyph through ($0E),Y when the landscape scroller needs a new column; $50BD INCs $0F. Cleared to $00 at $50E8.","t":"byte","b":[0],"x":[20656,20712]},{"a":15,"l":"ptr_terrain_hi","c":"High byte of the terrain-map pointer, $38 at $50E4.","t":"byte","b":[64],"x":[20669,20708]},{"a":16,"l":"tmp_x","c":"General one-byte scratch. Most often the saved X register: $584A, $58AB, $5968 and $59C8 park X here while they call build_screen_ptr ($5800), which needs X for the column, and reload it at $5858/$58C6/$5976. Also holds the wave's spawn column at $4511 and the chosen enemy's slot index at $5C29.","t":"byte","b":[223],"x":[17681,17689,18029,18035,18235,18240,18254,18259,18271,18276,18295,18300,18344,18349,19676,19728,19740,19742,20548,20550,20641,20647,20652,20654,22602,22616,22699,22726,22888,22902,22984,23012,23593,23615,23819,23824,23838,23843,23855,23860,23879,23884,23928,23933,23993,24011,24016,24018,24461,24473]},{"a":17,"l":"radar_origin","c":"Map column at the left edge of the radar window: $52F2 computes $0D - $6C. $5359 subtracts it from a blip's map column to get the blip's position inside the radar box; $5E1F reaches it as $11,X when the score carry runs.","t":"byte","b":[214],"x":[21237,21337,24095]},{"a":18,"l":"score_digits","c":"Score as five decimal digits, most significant first ($12 ten-thousands .. $16 units). $5E10 adds $AA to $16 and carries upward through $11,X; $51C2 copies all five to screen $0770 (row 22, column 0) in colour 1. The 3000-point bonus life at $55E3 tests $13 >= 3. Cleared with the rest of $17-$64 at $5655 when a life starts.","t":"byte","b":[0],"x":[19524,19545,19626,20930,21523,24089,24100]},{"a":19,"l":"score_digit_thousands","c":"Thousands digit of the score (element 1 of score_digits at $12). Read on its own at $55E3, where a value of 3 or more - a score of 3000 - awards the one bonus life, and at $4A84, part of the sound code.","t":"byte","b":[0],"x":[19076,21987]},{"a":20,"l":"score_digit_hundreds","c":"Hundreds digit of the score (element 2 of score_digits at $12). Read on its own only at $4A8E/$4A98, in the sound code.","t":"byte","b":[0,0],"x":[19086,19096]},{"a":22,"l":"score_digit_units","c":"Units digit of the score (element 4, the last, of score_digits at $12). $5E13 adds wave_score_value ($AA) straight into it and then carries upward; $5657 clears $17-$64 starting just above it when a life begins.","t":"byte","b":[0],"x":[22103,24083,24085]},{"a":23,"l":"gas_hundreds","c":"GAS gauge, hundreds digit. The refuel routine at $5420 stops topping up once this reaches 9, so a full tank is 900-something. $5576 ORs $17/$18/$19 together: all zero sets flight_flags bit 7 (dry), and $17 alone being zero sets bit 6 (under 100 left - the low-fuel warning). $4EB0 uses it as the length of the GAS bar.","t":"byte","b":[9],"x":[18992,19017,20144,20505,21545,21571,21866,21870,21878,21896]},{"a":24,"l":"gas_tens","c":"GAS gauge, tens digit. INCed at $5439 when the units digit wraps during refuelling, DECed at $5564 when the units digit underflows during consumption.","t":"byte","b":[0],"x":[19004,20338,20341,21561,21563,21569,21860,21864,21880]},{"a":25,"l":"gas_units","c":"GAS gauge, units digit; the digit actually burned. $555E DECs it - that instruction is the byte the crack's 'Unlimited GAS ??' trainer overwrites with $A5 (LDA) from $19A6. Burn rate: one unit every other tick at full horizontal deflection (vel_x = $03 or $FD), otherwise one every eighth tick, see $5546-$555A.","t":"byte","b":[0],"x":[20347,21551,21553,21559,21854,21858,21882]},{"a":26,"l":"aam_hundreds","c":"Air-to-air missile count, hundreds digit. The rearm loop at $544C only adds missiles while this is zero, which is what caps the load at 100 - the figure the instruction screen at $1D90 quotes.","t":"byte","b":[1],"x":[20961,21580,21604,22426,22503]},{"a":27,"l":"aam_tens","c":"AAM count, tens digit. INCed at $545A on units wrap, DECed at $57E1 on units underflow.","t":"byte","b":[0],"x":[21594,21596,21602,22430,22497,22501]},{"a":28,"l":"aam_units","c":"AAM count, units digit. $57DB DECs it each time a missile is launched - that instruction is the byte the crack's \"Unlimited AAM's ??\" trainer overwrites with $A5 (LDA) from $19DC. $57A2 refuses to launch when all three digits are zero.","t":"byte","b":[0],"x":[21584,21586,21592,22434,22491,22495]},{"a":29,"l":"lives","c":"Lives remaining. Set to 3 at $4142 at the start of a game, DECed at $417C when a life ends (the byte the crack's Unlimited LIVES trainer overwrites with $A5 from $19A6), INCed at $55ED for the one 3000-point bonus life, preserved across the $5655 clear by $5651/$565C, and copied to screen $0777 by $51EE. Previously named life_phase; it is a plain counter.","t":"byte","b":[1],"x":[16706,16739,16764,16854,20512,20974,21997,22097,22108]},{"a":30,"l":"ptr_radar_glyph","c":"Low byte of a pointer into the character generator where a radar blip is plotted ($1E/$1F, high byte always $36). $5346 selects $36F8 for blip rows 8 and up and $534E selects $3680 for rows below that; $537E/$5382 OR the blip bit into ($1E),Y. This is how the radar is drawn without touching screen RAM.","t":"byte","b":[248],"x":[21320,21328,21374,21378]},{"a":31,"l":"ptr_radar_glyph_hi","c":"High byte of the radar blip pointer, always $36 ($5352/$5354).","t":"byte","b":[54],"x":[21332]},{"a":32,"l":"radar_arg_row","c":"In: the radar row of the blip to plot (0-15; $5302 passes $0B for a ground base, $531C passes the enemy's row from $47,X). $5371-$537A then overwrites it with the two-bit pixel mask for that column.","t":"byte","b":[192],"x":[21254,21278,21312,21353,21370,21376]},{"a":33,"l":"radar_arg_col","c":"In: the map column of the blip to plot ($5302 passes the map index of a base, $5320 the enemy's map column from $4B,X). $5356-$536B turns it into the byte offset inside the radar glyph row, relative to radar_origin ($11).","t":"byte","b":[121],"x":[21250,21282,21334,21355,21372]},{"a":34,"l":"flight_flags","c":"Flight/state bit set, and the single most consulted byte in the game. bit 0: set at $53BC at the end of the start-of-life drop-in; meaning beyond that not established. bit 1: parked on a refuelling base - $559A sets it only on a pass where sprite 0 Y is exactly $84, vel_x is 0 and the two map cells at $3800+world_x+$12/+$14 are both the base glyph $16, and it then refuels twice; the input gate at $5731 forces $0C to $FE (up only) while it is set, which is the vertical take-off. bit 3: the player has been destroyed - $4400 sets it (preserving bit 4) for every hit the VIC reports, $5774 sets it when the tank has run dry and the aircraft reaches the ground, $4800 plays the crash sound on it, the input gate forces a dive, $41C7/$41D0 end the life on it. bit 4: survives the rewrite at $4404 and $5778; meaning not established. bit 6: fuel below 100, set at $558E. bit 7: fuel exhausted, set at $5582 and cleared by the refuel routine at $5468. NOTE: bit 3 is death, not landing - see $4400.","t":"byte","b":[3],"x":[16839,16848,17408,17414,18432,18560,18688,21434,21438,21606,21610,21621,21635,21824,21872,21876,21886,21892,21900,21904,21914,21920,21924,21965,21969,22016,22321,22333,22343,22382,22388,22394,22505,23072,24185,24224,24489,24495,24501]},{"a":35,"l":"zp_23_unknown","c":"Written at $5EBE and $5EDA, read at $5EA6. No other access anywhere in the tracked code. Purpose not established.","t":"byte","b":[129],"x":[24230,24254,24282]},{"a":36,"l":"sfx_crash_state","c":"State byte for the crash / ground-impact sound run by $4800 while flight_flags bit 3 (player destroyed) is set. $4806 calls $4990 to start it when this is zero; $4871 sets it to $90 at the moment of impact, which also gates the noise burst into $D404/$D40B/$D412 and puts the first explosion frame ($88) in the sprite 0 pointer. $567D clears it when a new life starts.","t":"byte","b":[0],"x":[18438,18505,18528,18547,18847,18895,22141,22171]},{"a":37,"l":"sfx_takeoff_state","c":"State byte for the sound $4880 plays while flight_flags bit 1 (parked on a base) is set: $4886 tests its sign, $489D and $4A26 write it. Written/read only inside $4880-$48BC and $4A10-$4A2E.","t":"byte","b":[253],"x":[18566,18577,18579,18589,18604,18606,18982]},{"a":38,"l":"sfx_takeoff_timer","c":"Step counter for the same $4880 sound: $488A/$48A1 read it, $4891/$48AC INC it, $4899/$48B4/$4A01 reload it.","t":"byte","b":[1],"x":[18570,18585,18593,18602,18612,18945,18973]},{"a":39,"l":"sfx_warn_state","c":"State byte for the low-fuel / dry-tank warning sound at $4900, which runs while flight_flags bits 6-7 are set. $4906 clears it on entry to the warning; $494D starts the idle engine sound at $49F0 when it is zero.","t":"byte","b":[0],"x":[18696,18765,18941,18984,18990,20445]},{"a":40,"l":"sfx_warn_phase","c":"Phase flag of the warning sound at $4900: zero means the rising sweep, non-zero the fall. $4931 sets it and gates the voice-2 gate/frequency at $D40B/$D408.","t":"byte","b":[0],"x":[18702,18725,18733,18737,18757,18947,19057]},{"a":41,"l":"sfx_warn_freq","c":"Working frequency high byte for the warning sound's voice 2: stepped by 2 at $4917 up to $58, then reset, and written straight to $D408 at $491C. $4957-$4963 takes bit 2 of it to flash the GAS bar colour ($2E) in time with the beep.","t":"byte","b":[0],"x":[18698,18709,18714,18729,18749,18751,18761,18775,19055]},{"a":42,"l":"vel_x","c":"Horizontal velocity, stepped one unit per 8 passes of tick_counter, clamped to $FD..$03 (-3..+3).","t":"byte","b":[0],"x":[17425,20584,21678,21684,21695,21701,21734,21836,21933,22038,22364,22422,22444,23088,23130,23178,24322,24356]},{"a":43,"l":"vel_y","c":"Vertical velocity. Zeroed on touchdown and on ground contact.","t":"byte","b":[0],"x":[17427,18445,21712,21718,21726,21732,21738,21959,21963,22167,22292,22362,22380,23188]},{"a":44,"l":"scroll_phase","c":"Free-running counter INCed once per pass at $5F00, used only to divide the landscape scroll rate: at |vel_x| = 2 the world moves on every other value ($5F16 masks 1), at |vel_x| = 1 on every fourth ($5F1E masks 3), and at |vel_x| = 3 on every pass.","t":"byte","b":[139],"x":[24320,24342,24350]},{"a":45,"l":"tick_counter","c":"Free-running counter; its low bits pick which part of the flight update runs this pass.","t":"byte","b":[139],"x":[16768,17228,17315,17670,17790,18549,19782,19931,21506,21536,21573,21653,21655,21663,21830,21846,22032,22087,22211,22416,22465,22604,22640,22654,22660,22662,22672,22701,22912,23078,23309,23565]},{"a":46,"l":"status_bar_colour","c":"Colour index the GAS bar is repainted in by $4EA0 ($DB8F onwards, screen row 22 columns 31-39). $4963 alternates it between 1 and 2 in step with the low-fuel warning sound, so the bar flashes; $5676 forces 2 at the start of a life. Note the bytes at $2E,X reached by the AAM routines are $31/$34/$37/$3A, not this variable.","t":"byte","b":[2],"x":[18616,18787,18951,20130,22134,22476,22598,22674,22695]},{"a":47,"l":"zp_2f_scratch","c":"One-byte scratch with no single owner: $425E saves a sprite index in it inside the collision handler, $4CD8/$4DD0 use it in the name-entry code, $5D25/$5D3E in the bomb drawing. The $2F,X accesses from $57A8, $5842, $5878 and $58A2 reach $32/$35/$38/$3B - the AAM records, not this byte.","t":"byte","b":[118],"x":[16990,17048,18261,18281,18286,18305,19672,19906,19910,19920,22440,22454,22594,22648,22676,22690,23845,23865,23870,23889,23968,23995]},{"a":48,"l":"aam_slots","c":"Four air-to-air missiles in flight, three bytes each, at $30, $33, $36 and $39. +0 = screen column (0-$27), +1 = screen row, +2 = direction and occupancy ($00 free, $01 travelling right, $FF travelling left). $57A6-$57CC fills a free slot on a fire press - column $12 or $15, row = ($D001-$28)/8, direction opposite the sign of vel_x - and then DECs the AAM count. $5870 steps each one and frees it once the column leaves 0-$27; $5840 erases the old cell with a space and $58A0 redraws it as glyph $12 (right) or $13 (left) with the colour from the $4000 table. The missiles are character graphics, not sprites.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":56,"t":"byte","b":[0,0,0]},{"a":59,"l":"bomb_rows_minus1","c":"Not a variable of its own: it is the base the enemy-bomb row array is addressed from, $3B,X with X = 1..4 reaching bomb_rows at $3C-$3F ($5962, $59A2, $5B6C). $412D also DECs $3B,X for X = 8..1 at the cold start, which is what puts $FF in all eight bytes $3C-$43.","t":"byte","b":[0],"x":[16685,22882,22946,22978,23404]},{"a":60,"l":"bomb_rows","c":"Screen rows of the up to four enemy bombs in flight, one byte per bomb at $3C-$3F; $FF means the slot is free. $412D (cold start) and $5662 (new life) fill $3C-$43 with $FF. $5B6C writes the row when an enemy releases a bomb, and $5B50-$5B5E refuses to release one into a row a bomb already occupies.","t":"byte","b":[255],"x":[22114,23376]},{"a":61,"l":"bomb_row2","c":"Screen row of enemy bomb 2 (element 1 of bomb_rows at $3C), $FF when the slot is free. $5B50-$5B5E compares a proposed new bomb's row against $3C, $3D, $3E and $3F in turn and refuses to drop one into a row that is already taken.","t":"byte","b":[255],"x":[23380]},{"a":62,"l":"bomb_row3","c":"Screen row of enemy bomb 3 (element 2 of bomb_rows at $3C), $FF when the slot is free. $5B50-$5B5E compares a proposed new bomb's row against $3C, $3D, $3E and $3F in turn and refuses to drop one into a row that is already taken.","t":"byte","b":[255],"x":[23384]},{"a":63,"l":"bomb_row4","c":"Screen row of enemy bomb 4 (element 3 of bomb_rows at $3C), $FF when the slot is free. $5B50-$5B5E compares a proposed new bomb's row against $3C, $3D, $3E and $3F in turn and refuses to drop one into a row that is already taken.","t":"byte","b":[255],"x":[22890,22920,22928,22934,22936,22948,22961,22986,23388,23394,23400]},{"a":64,"l":"bomb_cols","c":"Screen columns of the same four enemy bombs, at $40-$43, $FF when free. $5B68 sets it from the enemy's on-screen column; $5988-$599E walks the bomb across (one column per pass, direction from $60) and frees both halves of the record when the column leaves 0-$27. $5960 erases and $59C0 redraws the bomb glyph.","t":"byte","b":[255,255,255,255]},{"a":68,"l":"tmp_44","c":"Scratch used by the enemy-bomb and base-bombing code: $5B22 holds the enemy's on-screen column, $5C15/$5C27 the highest radar row found among live enemies, $5C53 a counter that seeds the ground-explosion record. Also reached as $44,X by nothing.","t":"byte","b":[6],"x":[18313,18332,23330,23340,23348,23398,23573,23587,23591,23598,23619,23635,23637,23897,23916]},{"a":69,"l":"tmp_45","c":"Scratch alongside $44: $5B46 holds the enemy's radar row plus one, which becomes the bomb's screen row; $5C47 holds a copy of the chosen enemy's map column.","t":"byte","b":[100],"x":[18326,18337,23366,23368,23370,23402,23623,23641,23910,23921]},{"a":70,"l":"tmp_46","c":"Scratch alongside $44/$45; $5C4B copies the chosen enemy's third parameter ($4F,X) here before $5C5F files it into the ground-object record.","t":"byte","b":[37],"x":[16995,17053,23627,23645,24023]},{"a":71,"l":"enemy_row","c":"Base of the four-entry enemy array reached as $47,X with X = 1..4, i.e. the bytes $48-$4B: the aircraft's radar row / height band. Read by the radar plotter at $531C, by the bomb-release test at $5B44 and by the base-bombing chooser at $5C21/$5C41. The byte at $47 itself is index 0 and is used separately as a scratch by $4263, $429D, $45F0 and $5C61.","t":"byte","b":[18,9,6,0],"x":[16997,17055,17063,17765,17882,17904,17946,17992,18315,21276,23364,23585,23617,23631,23649,23981]},{"a":75,"l":"enemy_map_x","c":"Base of the enemy array reached as $4B,X (X = 1..4, bytes $4C-$4F): the aircraft's position in world/map columns. $5B1D subtracts world_x from it to get the on-screen column, $5320 passes it to the radar plotter, $5C45 copies it into a bomb record.","t":"byte","b":[0],"x":[17761,17818,17837,18256,21280,23325,23621]},{"a":76,"l":"enemy_map_x1","c":"World/map column of enemy aircraft 1 (element 1 of enemy_map_x at $4B, reached as $4B,X with X=1). $5EE4 reads it directly.","t":"byte","b":[181,189,0],"x":[24292]},{"a":79,"l":"enemy_param3","c":"Base of the enemy array reached as $4F,X (X = 1..4, bytes $50-$53). Copied into the ground-bomb record at $5C49. Which quantity it holds is not established.","t":"byte","b":[0,6,6,0],"x":[17767,17874,17880,17892,17894,17902,18324,23625]},{"a":83,"l":"enemy_param4","c":"Base of the enemy array reached as $53,X (X = 1..4, bytes $54-$57). Copied into the ground-bomb record at $5C4D. Which quantity it holds is not established.","t":"byte","b":[0,4,3,0],"x":[17769,17808,17816,17823,17827,17835,18311,23629]},{"a":87,"l":"enemy_state","c":"Base of the enemy array reached as $57,X (X = 1..4, bytes $58-$5B): the aircraft's life state, and the value that picks its sprite. $4342 reads it: $00 = slot empty, $01-$CF = flying (shape chosen from blocks $94-$98, mirrored to $99-$9D when $60 is negative), $D0-$DF = shape forced to block $95, $E0 and up = destroyed, drawn as a random one of the debris blocks $88-$8B in white multicolour. $5B19 and $5C1D refuse to let a destroyed aircraft bomb anything.","t":"byte","b":[0],"x":[17155,17165,17218,17757,17786,17796,17798,17864,17888,17911,17942,17952,17960,17968,18228,21272,23317,23577,24170,24180]},{"a":88,"l":"enemy_state1","c":"Life state of enemy aircraft 1 (element 1 of enemy_state at $57, reached as $57,X with X=1). Read directly at $5EAC and $5EC8. See enemy_state for the value ranges.","t":"byte","b":[71,71,0],"x":[24236,24264]},{"a":91,"l":"enemy_param6","c":"Base of the enemy array reached as $5B,X (X = 1..4, bytes $5C-$5F). $4372 tests it for zero and then for sign to choose which way the aircraft's attitude frame steps, so it behaves as a per-aircraft manoeuvre direction. DECed at $4655, written from seven sites in $456D-$4683. Not fully established.","t":"byte","b":[0,0,255,0,0],"x":[17266,17773,17868,17964,17980,17998,18005,18015,18022,18041,18051]},{"a":96,"l":"wave_direction","c":"Which way the current wave of enemies is coming from. $4520-$4528 sets it to $01 or $FF from a random bit of SID oscillator 3 ($D41B). Everything that has to mirror left/right reads its sign: the enemy sprite frame ($4392 adds 5 to the pointer for the mirrored set), the bomb's drift direction ($598C), the falling-bomb motion ($5C7E) and the base scan ($5F2B).","t":"byte","b":[1],"x":[17298,17376,17704,17804,22924,22992,23336,23678,24363,24376]},{"a":97,"l":"active_flags","c":"Bit set of what is currently in play. Bit 0 = a wave of enemy aircraft is up (set at $452C by the wave spawner, tested at $5B00/$5C00/$58D3). Bit 1 = a ground bomb is falling (set at $5C69, cleared at $5E3E once both slots at $A8/$A9 are empty). Bit 2 = an air-dropped bomb record is live (set at $5B70, cleared at $59B8 when the last one has left the screen). $4500 only starts a new wave when bits 0-2 are all clear.","t":"byte","b":[1],"x":[17664,17706,17710,17728,17776,17856,17924,17928,17934,22739,22953,22968,22972,23296,23406,23410,23552,23655,23659,23664,23728,24112,24126,24130]},{"a":98,"l":"zp_62_unknown","c":"Loaded with $0A at $4125 (cold start) and $5672 (new life); also written at $4AA8 and $4AB5, and read at $4550 and $4AB3. Behaves like a countdown or a phase index shared with the code just below the raster handler, but its meaning is not established.","t":"byte","b":[9],"x":[16677,17744,19112,19123,19125,22130]},{"a":99,"l":"zp_63_wave_counter","c":"Cleared at $4532 when a wave is spawned, INCed at $454C and compared at $454E, written again at $4556. Looks like a per-wave counter (how many aircraft have been released), but that is not established.","t":"byte","b":[0],"x":[17714,17740,17742,17750]},{"a":100,"l":"wave_spawn_column","c":"Map column the current wave enters at. $450C-$451B computes world_x - $A0 plus a random 0-$3F from SID oscillator 3. Read once, at $455F.","t":"byte","b":[209],"x":[17691,17759]},{"a":101,"l":"zp_65_unknown","c":"Cleared at $4534 when a wave is spawned, INCed at $4558, read at $4546, $455A, $45FE and $5EC2. Purpose not established.","t":"byte","b":[2],"x":[17716,17734,17752,17754,17918,24258]},{"a":102,"l":"zp_66_unknown","c":"Loaded with $04 at $4129 (cold start), also written at $4A82 and $4AA0; read at $4548, $4600, $4AA2 and $4AAA. Purpose not established.","t":"byte","b":[2],"x":[16681,17736,17920,19074,19104,19106,19114]},{"a":103,"l":"bonus_life_timer","c":"Bonus-life state. $55DF only awards the 3000-point extra life while this is zero, and $55EB then sets it to $30, so the bonus can only ever be given once per game; $41EE clears it when the title screen is entered. While it is non-zero $4FA0-$4FBC plays the bonus fanfare on SID voice 2 and INCs it, so it runs $30..$FF and wraps back to zero; $494D's idle engine sound and $4FC0's warning sound are suppressed meanwhile.","t":"byte","b":[0,0,0,0,0,0,0,0],"x":[16735,16878,20384,20397,20412,21983,21995]},{"a":111,"t":"byte","b":[0,0,0,0,230,122,208,2]},{"a":119,"t":"byte","b":[230,123,173,11,8,201,58,176]},{"a":127,"t":"byte","b":[10,201,32,240,239,56,233,48]},{"a":135,"t":"byte","b":[56,233,208,96]},{"a":139,"l":"collide_sprite","c":"One frame's worth of the VIC's sprite-to-sprite collision register. $4204 reads $D01E into it once per pass, because reading that register clears it, and everything downstream works off this copy. Bit 0 is the player: $420F calls player_hit ($4400). Bits 5 and 6 are the two enemy bombs on sprites 5 and 6: $4218-$4227 cancels the matching bomb record by zeroing $A8/$A9. Bits 1-4 are the enemy aircraft: $4231-$423F calls $4303 for each one that collided.","t":"byte","b":[0],"x":[16903,16914,16939]},{"a":140,"l":"collide_background","c":"One frame's worth of the VIC's sprite-to-background collision register, read once at $4241 from $D01F for the same reason. Bit 0 is the player hitting the landscape, which calls player_hit at $424C. Bits 1-4 are the enemy aircraft hitting a background character - and since the player's air-to-air missiles are character graphics (the records at $30-$3B, drawn as glyphs $12/$13), this is the only path by which a missile can register a hit on an aircraft. That the register latches and is cleared by the single read is a plausible explanation for the missed hits the wiki reports, but it has not been tested.","t":"byte","b":[0,199,82,88],"x":[16964,16975,17033]},{"a":144,"l":"zp_90_crack_clear","c":"$90-$FF is the KERNAL's own zero page. The crack's save routine zeroes all of it at $290F-$2916 before calling SETLFS/SETNAM/SAVE, so the KERNAL starts from a clean state; the game itself uses $96-$B2 of this area for its own variables while it runs, and they are destroyed by that clear.","t":"byte","b":[0,255,0,0,84,255],"x":[10515]},{"a":150,"l":"ptr_attitude_frame","c":"Low byte of a pointer ($96/$97) into the aircraft attitude bank at $2B00-$2D7F. $5A38 loads $2CC0 (level, nose right) when vel_x reaches +3 and $5A4C loads $2B80 (level, nose left) when it reaches -3; $5A73/$5A82 then steps it by $40 - one sprite block - per unit of $99. $5AC4 copies the 64 bytes it points at into sprite block $86 ($2180) and $5AD0 into block $80 ($2000).","t":"byte","b":[0],"x":[23098,23118,23152,23157,23167,23172,23238,23250]},{"a":151,"l":"ptr_attitude_frame_hi","c":"High byte of the attitude-bank pointer, $2B or $2C, so the pointer always lands inside $2B00-$2D7F.","t":"byte","b":[0],"x":[23102,23122,23161,23176]},{"a":152,"l":"attitude_active","c":"Non-zero once the aircraft has reached full deflection and the attitude bank is driving sprite block $80/$86. Set at $5A36/$5A4A, cleared at $5A68 when $99 has returned to zero, and cleared with $98-$B0 at $566B when a life starts. $560C makes the yaw animation at $5600 stand down while it is set.","t":"byte","b":[0],"x":[22028,22123,23084,23094,23114,23144]},{"a":153,"l":"attitude_step","c":"Signed attitude index, -2..+2, added to ptr_attitude_frame as a count of $40-byte sprite blocks. $5A94-$5AB5 drives it from vertical velocity: vel_y zero walks it back to 0 (level), climbing walks it to +2, diving to -2. Cleared at $566B when a life starts.","t":"byte","b":[0,0,0],"x":[23140,23150,23165,23192,23206,23215]},{"a":156,"l":"music_note_delay","c":"Delay constant for the note the title tune is currently sounding. $4BB3 and $4BE4 use it as the inner count of the two timing loops in the player at $4B5D, and $4BF6 reloads it from the duration table at $2AE0 for the next note. $4C3A sets $BF when the SID is silenced.","t":"byte","b":[191],"x":[19379,19428,19449,19516]},{"a":157,"l":"music_note_index","c":"Index of the current note of the title tune, 0..$1C. $4B6B loads X from it, $4BF5 steps it, $4BFB ends the tune at $1D. It selects one entry from each of the six frequency tables at $2A00-$2ABF and from the duration table at $2AE0. The crack zeroes it at $1A25 before handing over.","t":"byte","b":[0,0],"x":[6693,18185,18191,19307,20217,20219]},{"a":159,"l":"bomb_ground_row","c":"Base of a two-entry array reached as $9F,X with X = 1..2, i.e. the bytes $A0/$A1: the falling ground bomb's row. $5C57 seeds it, $5CCC steps it, and $5CD0 ends the bomb when it reaches $13 (the ground).","t":"byte","b":[0,0],"x":[20019,20023,23639,23756,23758,23766,23899]},{"a":161,"l":"bomb_ground_col","c":"Base of the two-entry array reached as $A1,X (bytes $A2/$A3): the falling bomb's column. $5C5B seeds it from the enemy's map column; $5C8C/$5CA0 step it as the bomb drifts.","t":"byte","b":[0,0],"x":[23643,23692,23712,23768,23840]},{"a":163,"l":"bomb_ground_sub_x","c":"Base of the two-entry array reached as $A3,X (bytes $A4/$A5): a sub-column accumulator - $5CBE adds to it and $5CC8 carries into bomb_ground_col when it passes 8. The collision handler also reaches $A8/$A9 through this base at $4221 (X = 5, 6) to cancel a bomb whose sprite has hit something.","t":"byte","b":[0,0],"x":[16929,17095,23647,23742,23746,23754,23770,23908]},{"a":165,"l":"bomb_ground_sub_y","c":"Base of the two-entry array reached as $A5,X (bytes $A6/$A7): a sub-row accumulator, stepped by 2 at $5C82/$5C92 and carried into the row counter at $5C88/$5C9C.","t":"byte","b":[0,0],"x":[23651,23682,23684,23690,23698,23700,23702,23710,23772,23895]},{"a":167,"l":"bomb_ground_active","c":"Base of the two-entry array reached as $A7,X (bytes $A8/$A9): non-zero while that bomb slot is in use. $5C34 looks for a free slot, $5CD4-$5CDE clears the whole record when the bomb lands, $4221 clears it when sprite 5 or 6 registers a collision, and $5E36/$5E3A clear active_flags bit 1 once both are empty. Sprites 5 and 6 carry these bombs - $410C points both at sprite block $9E.","t":"byte","b":[0],"x":[23604,23653,23674,23738,23774,23812]},{"a":168,"l":"bomb_ground_active1","c":"Occupancy byte of ground-bomb slot 1 (element 1 of bomb_ground_active at $A7). Non-zero while that bomb is falling; $5E36 tests it, $4221 clears it when $D01E reports a collision on sprite 5, $5CDE clears it when the bomb lands.","t":"byte","b":[0],"x":[24118]},{"a":169,"l":"bomb_ground_active2","c":"Occupancy byte of ground-bomb slot 2 (element 2 of bomb_ground_active at $A7). $5E3A tests it; together with $A8 it decides when active_flags bit 1 is cleared at $5E3E.","t":"byte","b":[0],"x":[24122]},{"a":170,"l":"wave_score_value","c":"Points for the next enemy shot down in this wave. $4538 loads $19 (25) when a wave spawns and $5E2C doubles it after every score, giving 25, 50, 100, 200 - the progression the wiki documents. $5E10 adds it to the score digits at $12-$16.","t":"byte","b":[25,0],"x":[17720,24080,24108]},{"a":172,"l":"sfx_filter_cutoff","c":"Working value for the SID filter cutoff high byte ($D416) during the crash sound. $482F ramps it up by 2 to a ceiling of $6D while the wreck falls, $4850 and $48E0 ramp it back down, and $4860 fires the impact noise burst once it drops below $40.","t":"byte","b":[23],"x":[18479,18493,18512,18521,18656,18667,18820,18849,18915,24307]},{"a":173,"l":"sfx_freq_v1","c":"Working frequency high byte for SID voice 1 during the crash sound: INCed at $4811 and clamped to $E0, then written to $D401. Reset by $481B/$49A5/$49D3/$4A3A when a sound starts.","t":"byte","b":[63],"x":[18449,18451,18459,18853,18899,19002,19010,19030,19032]},{"a":174,"l":"sfx_freq_v3","c":"Working frequency high byte for SID voice 3 during the crash sound: INCed at $4820, clamped to $E0, written to $D40F. The pair $AD/$AE is what makes the falling-aircraft whine.","t":"byte","b":[0],"x":[18464,18466,18474,18857,18903]},{"a":175,"l":"zp_af_unknown","c":"DECed at $42D1, written at $42D9 and $5E8F, read at $42D3 and $5E7F. Both users sit in the scoring / enemy-destruction path, so it behaves like a short countdown there, but its meaning is not established.","t":"byte","b":[0],"x":[17105,17107,17113,24191,24207]},{"a":176,"l":"raster_band","c":"Which of the three raster bands the interrupt is about to set up: $FF, $00 or $01.","t":"byte","b":[255],"x":[19136,19154,19178,19199,19277]},{"a":177,"l":"title_timeout","c":"Countdown that decides how long the title screen waits before dropping back into the demo/attract path. $46E8 loads $E8, $5409 INCs it, and $416C tests it at the start of a life. Not fully established.","t":"byte","b":[232],"x":[16748,18152,21497,21513]},{"a":178,"l":"title_phase","c":"Phase counter of the title screen. $46E4 clears it, $4C0E INCs it when the tune is cut short by fire, $4EEF INCs it elsewhere, and $4EE0 and $53E3 read it.","t":"byte","b":[0,3,0,0,0,19,1,97],"x":[18148,19470,20192,20207,21475]},{"a":186,"t":"byte","b":[8,59,41,0,0,0,0,0]},{"a":194,"t":"byte","b":[40,1,8,64,0,0,3,0]},{"a":202,"t":"byte","b":[3,64,1,2,32,0,0,0]},{"a":210,"t":"byte","b":[4,0,0,39,0,13,0,132]},{"a":218,"t":"byte","b":[132,132,132,132,132,132,133,133]},{"a":226,"t":"byte","b":[133,133,133,133,134,134,134,134]},{"a":234,"t":"byte","b":[134,134,134,135,135,135,135,135]},{"a":242,"t":"gap","n":9},{"a":251,"l":"save_ptr","c":"Low byte of the start address the crack's high-score save passes to the KERNAL SAVE at $2935: $2929/$292D set $FB/$FC to $2800, the base of the saved high-score table. Part of the Remember crack, not the game.","t":"byte","b":[0],"x":[10539]},{"a":252,"l":"save_ptr_hi","c":"High byte of the high-score save's start address, $28 ($292D/$292F).","t":"byte","b":[40,173,0,0],"x":[10543]},{"a":256,"t":"gap","n":256},{"a":512,"l":"basic_input_buffer","c":"$0200-$0290, the KERNAL/BASIC input buffer. Neither Steve Lee's code nor the crack writes it while the game runs; it still holds whatever the loader left. Not part of the game.","t":"byte","b":[0,0,0,0,0,0,0,0],"x":[23278]},{"a":520,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":528,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":536,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":544,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":552,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":560,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":568,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":576,"t":"gap","n":81},{"a":657,"l":"charset_lock","c":"$0291, the KERNAL's shift-mode flag. The crack writes $80 here at $1910, which disables the Shift+Commodore character-set switch so the player cannot flip the documents screen into the graphics set. The rest of $0292-$0313 is untouched KERNAL workspace.","t":"byte","b":[128,0,0,0,0,0,0,0],"x":[6416]},{"a":665,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":673,"t":"byte","b":[0,0,0,0,0,1,0,0]},{"a":681,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":689,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":697,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":705,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":713,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":721,"t":"gap","n":67},{"a":788,"l":"irq_vector_lo","c":"Low byte of the KERNAL's IRQ vector. $4B20 points it at the game's raster handler; $28A3 puts $31 back and $2909 reloads the whole vector table $0314-$0333 from the KERNAL's copy at $FD30 before the high-score save calls back into the KERNAL.","t":"byte","b":[192],"x":[10403,10505,19235]},{"a":789,"l":"irq_vector_hi","c":"High byte of the KERNAL's IRQ vector; $28A8 restores $EA. The bytes above it, $0316-$03FF, are ordinary KERNAL workspace (BRK and NMI vectors, tape and RS-232 areas) that neither the game nor the crack uses.","t":"byte","b":[74,102,254,71,254,74,243,145],"x":[10408,19240]},{"a":797,"t":"byte","b":[242,14,242,80,242,51,243,87]},{"a":805,"t":"byte","b":[241,202,241,237,246,62,241,47]},{"a":813,"t":"byte","b":[243,102,254,165,244,237,245,0]},{"a":821,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":829,"t":"byte","b":[0,0,0,168,0,0,3,76]},{"a":837,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":845,"t":"byte","b":[0,0,0,0,178,153,13,25]},{"a":853,"t":"gap","n":170},{"a":1023,"l":"unused_03ff","c":"$03FF, the last byte of the system work area. Unused by both the game and the crack; the screen begins at $0400.","t":"byte","b":[55],"x":[20612,20884]},{"a":1024,"t":"gap","n":1024,"x":[6443,6512]},{"a":2048,"l":"title_screen","c":"Start of the title screen. This is LIVE screen RAM, not a stored copy: $46C5-$46C7 writes $2C to $D018, which moves the VIC's screen base to $0800 (character base stays $3000) for as long as the title is up, and $4716-$4718 writes $1C to put it back to $0400 for play (it reads back as $1D because bit 0 of $D018 is unused). 1000 bytes, $0800-$0BE7, with the sprite pointers at $0BF8. $4420 blanks the whole thing with spaces; rows 0-1 columns 12-27 then get the FALCON PATROL logo from $5B80/$5B90, rows 5/7/9/11/13 the five high-score places, row 17 the PRESS FIRE prompt, row 21 the generated alphabet strip and row 24 the credit line from $2F80. NOTE: facts.md calls this 'a stored copy of the title screen at $0843, stamped onto $0400'. It is neither stored nor at $0843: the VIC is simply pointed at it.","t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2056,"t":"byte","b":[32,32,32,32]},{"a":2060,"l":"title_logo_top","c":"Title screen row 0, columns 12-27: the top half of the FALCON PATROL logo, 16 glyphs copied here from $5B80 by $44D1. They are shape glyphs from the game's own character set, not letters of the alphabet at $81-$9A.","t":"byte","b":[181,182,183,184,185,186,187,32],"x":[17620]},{"a":2068,"t":"byte","b":[195,196,197,198,199,200,201,32]},{"a":2076,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2084,"t":"byte","b":[32,32,32,32]},{"a":2088,"l":"title_row01","c":"Row 1, columns 12-26: bottom half of the FALCON PATROL logo, 16 glyphs copied from $5B90 by $44D7-$44DC. Colour RAM rows 0 and 1 are set to 7 and 5 by $44C0.","t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2096,"t":"byte","b":[32,32,32,32]},{"a":2100,"l":"title_logo_bottom","c":"Title screen row 1, columns 12-27: the bottom half of the FALCON PATROL logo, 16 glyphs copied here from $5B90 by $44D7. Together with $080C it makes a two-row-tall title in custom glyphs.","t":"byte","b":[188,189,190,191,192,193,194,32],"x":[17626]},{"a":2108,"t":"byte","b":[202,203,204,205,206,207,127]},{"a":2115,"l":"title_row01_col27","c":"Inside title screen row 1, column 27 - nothing starts here. This address carried the label 'title_screen_image' and the claim in facts.md that a 1000-byte copy of the title screen lives here and is stamped onto $0400. It is not a copy and it is not the base: the title screen is live screen RAM at $0800 (see title_screen), selected by $D018 = $2C at $46C5.","t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2123,"t":"byte","b":[32,32,32,32,32]},{"a":2128,"l":"title_row02","c":"Row 2: blank spacer between the logo and the high-score table.","t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2136,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2144,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2152,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2160,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2168,"l":"title_row03","c":"Row 3: blank spacer above high-score rank 1.","t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2176,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2184,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2192,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2200,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2208,"l":"title_row04","c":"Row 4: blank spacer; the high-score table starts on the next row.","t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2216,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2224,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2232,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2240,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2248,"l":"title_hiscore_row1","c":"High-score rank 1 on the title screen. Column 7 holds the rank digit and column 8 the ':' glyph ($9C), both written by $4435/$444A; columns 10-14 hold the five score digits (copied from $2800 by $2855) and columns 21-32 the twelve name characters (copied from $2805). Currently reads: '       1{9C} 00000'.","t":"byte","b":[32,32,32,32,32,32,32]},{"a":2255,"l":"title_rank1_digit","c":"Title screen row 5, column 7: the rank digit for high-score place 1, written as the plain digit glyph 1 by $4435.","t":"byte","b":[1],"x":[17461]},{"a":2256,"l":"title_rank1_colon","c":"Title screen row 5, column 8: the ':' separator after the rank digit, glyph $9C, written by $444A-$4456.","t":"byte","b":[156,32],"x":[17482]},{"a":2258,"l":"title_rank1_score","c":"Title screen row 5, columns 10-14: the five score digits of high-score place 1. $445D zeroes them when the table is built, $2855 fills them from $2800, and $28C0 reads them back before the table is saved.","t":"byte","b":[0,0,0,0,0,32,32,32],"x":[10330,10432,10673,17501,19889,20945]},{"a":2266,"t":"byte","b":[32,32,32]},{"a":2269,"l":"title_rank1_name","c":"Title screen row 5, columns 21-32: the twelve name characters of high-score place 1, in the game's alphabet. $2855 fills them from $2805 and $28E3 reads them back for the save; $4D61 writes the freshly entered name straight here through name_buffer.","t":"byte","b":[32,32,32,32,32,32,32,32],"x":[10365,10467,10684]},{"a":2277,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2285,"t":"byte","b":[32,32,32]},{"a":2288,"l":"title_row06","c":"Row 6: blank spacer between high-score ranks 1 and 2.","t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2296,"t":"byte","b":[32]},{"a":2297,"l":"title_clear_base_08f9","c":"Title screen row 6, column 9. Nothing special is stored here: this is one of the four bases $4420 uses to blank the whole 1000-byte title screen with spaces in overlapping 250-byte runs ($07FF, $08F9, $09F3 and $0AED, each indexed X = $FA..1).","t":"byte","b":[32,32,32,32,32,32,32,32],"x":[17447]},{"a":2305,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2313,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2321,"t":"byte","b":[32,32,32,32,32,32,32]},{"a":2328,"l":"title_hiscore_row2","c":"High-score rank 2 on the title screen. Column 7 holds the rank digit and column 8 the ':' glyph ($9C), both written by $4435/$444A; columns 10-14 hold the five score digits (copied from $2811 by $2855) and columns 21-32 the twelve name characters (copied from $2816). Currently reads: '       2{9C} 00000'.","t":"byte","b":[32,32,32,32,32,32,32]},{"a":2335,"l":"title_rank2_digit","c":"Title screen row 7, column 7: the rank digit for high-score place 2, written as the plain digit glyph 2 by $4438.","t":"byte","b":[2],"x":[17465]},{"a":2336,"l":"title_rank2_colon","c":"Title screen row 7, column 8: the ':' separator after the rank digit, glyph $9C, written by $444A-$4456.","t":"byte","b":[156,32],"x":[17485]},{"a":2338,"l":"title_rank2_score","c":"Title screen row 7, columns 10-14: the five score digits of high-score place 2. $445D zeroes them when the table is built, $2855 fills them from $2811, and $28C0 reads them back before the table is saved.","t":"byte","b":[0,0,0,0,0,32,32,32],"x":[10336,10438,10647,10676,17504,19875,19892]},{"a":2346,"t":"byte","b":[32,32,32]},{"a":2349,"l":"title_rank2_name","c":"Title screen row 7, columns 21-32: the twelve name characters of high-score place 2, in the game's alphabet. $2855 fills them from $2816 and $28E3 reads them back for the save; $4D61 writes the freshly entered name straight here through name_buffer.","t":"byte","b":[32,32,32,32,32,32,32,32],"x":[10371,10473,10658,10687]},{"a":2357,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2365,"t":"byte","b":[32,32,32]},{"a":2368,"l":"title_row08","c":"Row 8: blank spacer between high-score ranks 2 and 3.","t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2376,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2384,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2392,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2400,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2408,"l":"title_hiscore_row3","c":"High-score rank 3 on the title screen. Column 7 holds the rank digit and column 8 the ':' glyph ($9C), both written by $4435/$444A; columns 10-14 hold the five score digits (copied from $2822 by $2855) and columns 21-32 the twelve name characters (copied from $2827). Currently reads: '       3{9C} 00000'.","t":"byte","b":[32,32,32,32,32,32,32]},{"a":2415,"l":"title_rank3_digit","c":"Title screen row 9, column 7: the rank digit for high-score place 3, written as the plain digit glyph 3 by $4430.","t":"byte","b":[3],"x":[17469]},{"a":2416,"l":"title_rank3_colon","c":"Title screen row 9, column 8: the ':' separator after the rank digit, glyph $9C, written by $444A-$4456.","t":"byte","b":[156,32],"x":[17488]},{"a":2418,"l":"title_rank3_score","c":"Title screen row 9, columns 10-14: the five score digits of high-score place 3. $445D zeroes them when the table is built, $2855 fills them from $2822, and $28C0 reads them back before the table is saved.","t":"byte","b":[0,0,0,0,0,32,32,32],"x":[10342,10444,10621,10650,17507,19861,19878]},{"a":2426,"t":"byte","b":[32,32,32]},{"a":2429,"l":"title_rank3_name","c":"Title screen row 9, columns 21-32: the twelve name characters of high-score place 3, in the game's alphabet. $2855 fills them from $2827 and $28E3 reads them back for the save; $4D61 writes the freshly entered name straight here through name_buffer.","t":"byte","b":[32,32,32,32,32,32,32,32],"x":[10377,10479,10632,10661]},{"a":2437,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2445,"t":"byte","b":[32,32,32]},{"a":2448,"l":"title_row10","c":"Row 10: blank spacer between high-score ranks 3 and 4.","t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2456,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2464,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2472,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2480,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2488,"l":"title_hiscore_row4","c":"High-score rank 4 on the title screen. Column 7 holds the rank digit and column 8 the ':' glyph ($9C), both written by $4435/$444A; columns 10-14 hold the five score digits (copied from $2833 by $2855) and columns 21-32 the twelve name characters (copied from $2838). Currently reads: '       4{9C} 00000'.","t":"byte","b":[32,32,32,32,32,32,32]},{"a":2495,"l":"title_rank4_digit","c":"Title screen row 11, column 7: the rank digit for high-score place 4, written as the plain digit glyph 4 by $4430.","t":"byte","b":[4],"x":[17473]},{"a":2496,"l":"title_rank4_colon","c":"Title screen row 11, column 8: the ':' separator after the rank digit, glyph $9C, written by $444A-$4456.","t":"byte","b":[156,32],"x":[17491]},{"a":2498,"l":"title_rank4_score","c":"Title screen row 11, columns 10-14: the five score digits of high-score place 4. $445D zeroes them when the table is built, $2855 fills them from $2833, and $28C0 reads them back before the table is saved.","t":"byte","b":[0,0,0,0,0,32,32,32],"x":[10348,10450,10595,10624,17510,19847,19864]},{"a":2506,"t":"byte","b":[32,32,32]},{"a":2509,"l":"title_rank4_name","c":"Title screen row 11, columns 21-32: the twelve name characters of high-score place 4, in the game's alphabet. $2855 fills them from $2838 and $28E3 reads them back for the save; $4D61 writes the freshly entered name straight here through name_buffer.","t":"byte","b":[32,32,32,32,32,32,32,32],"x":[10383,10485,10606,10635]},{"a":2517,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2525,"t":"byte","b":[32,32,32]},{"a":2528,"l":"title_row12","c":"Row 12: blank spacer between high-score ranks 4 and 5.","t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2536,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2544,"t":"byte","b":[32,32,32]},{"a":2547,"l":"title_clear_base_09f3","c":"Title screen row 12, column 19. Nothing special is stored here: this is one of the four bases $4420 uses to blank the whole 1000-byte title screen with spaces in overlapping 250-byte runs ($07FF, $08F9, $09F3 and $0AED, each indexed X = $FA..1).","t":"byte","b":[32,32,32,32,32,32,32,32],"x":[17450]},{"a":2555,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2563,"t":"byte","b":[32,32,32,32,32]},{"a":2568,"l":"title_hiscore_row5","c":"High-score rank 5 on the title screen. Column 7 holds the rank digit and column 8 the ':' glyph ($9C), both written by $4435/$444A; columns 10-14 hold the five score digits (copied from $2844 by $2855) and columns 21-32 the twelve name characters (copied from $2849). Currently reads: '       5{9C} 00000'.","t":"byte","b":[32,32,32,32,32,32,32]},{"a":2575,"l":"title_rank5_digit","c":"Title screen row 13, column 7: the rank digit for high-score place 5, written as the plain digit glyph 5 by $4430.","t":"byte","b":[5],"x":[17477]},{"a":2576,"l":"title_rank5_colon","c":"Title screen row 13, column 8: the ':' separator after the rank digit, glyph $9C, written by $444A-$4456.","t":"byte","b":[156,32],"x":[17494]},{"a":2578,"l":"title_rank5_score","c":"Title screen row 13, columns 10-14: the five score digits of high-score place 5. $445D zeroes them when the table is built, $2855 fills them from $2844, and $28C0 reads them back before the table is saved.","t":"byte","b":[0,0,0,0,0,32,32,32],"x":[10354,10456,10598,17513,19850]},{"a":2586,"t":"byte","b":[32,32,32]},{"a":2589,"l":"title_rank5_name","c":"Title screen row 13, columns 21-32: the twelve name characters of high-score place 5, in the game's alphabet. $2855 fills them from $2849 and $28E3 reads them back for the save; $4D61 writes the freshly entered name straight here through name_buffer.","t":"byte","b":[32,32,32,32,32,32,32,32],"x":[10389,10491,10609]},{"a":2597,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2605,"t":"byte","b":[32,32,32]},{"a":2608,"l":"title_row14","c":"Row 14: blank spacer below the high-score table.","t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2616,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2624,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2632,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2640,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2648,"l":"title_row15","c":"Row 15: blank spacer above the PRESS FIRE prompt.","t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2656,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2664,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2672,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2680,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2688,"l":"title_row16","c":"Row 16: blank spacer; the PRESS FIRE prompt sits on the next row.","t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2696,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2704,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2712,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2720,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2728,"l":"title_row17","c":"Row 17, columns 10-28: 'PRESS FIRE TO START', 19 glyphs stamped from $53D0 by $46EC in colour 3. $46B3 blanks the same 19 cells with spaces while the tune plays. The buffer they land in is name_buffer at $0AB4, which the high-score name entry reuses.","t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2736,"t":"byte","b":[32,32]},{"a":2738,"l":"title_prompt","c":"Title screen row 17, columns 10-11: the first two characters of the 19-character 'PRESS FIRE TO START' prompt that $46EC stamps here from $53D0 in colour 3, and that $46B3 blanks with spaces while the tune plays. The remaining 17 characters are name_buffer at $0AB4, which the high-score name entry types into, so the prompt and the name share the same cells.","t":"byte","b":[144,146],"x":[18099,18159]},{"a":2740,"l":"name_buffer","c":"Twelve-character buffer the high-score name is typed into by $4D12/$4D61 and read back by $4D36. It sits at title screen row 17, column 12, so the name being entered is visible where 'PRESS FIRE TO START' is otherwise printed ($46EC stamps that string over $0AB2). $46B3 blanks $0AB2-$0AC4 before the tune starts.","t":"byte","b":[133,147,147,32,134,137,146,133],"x":[19730,19766,19809]},{"a":2748,"t":"byte","b":[32,148,143,32,147,148,129,146]},{"a":2756,"t":"byte","b":[148,32,32,32,32,32,32,32]},{"a":2764,"t":"byte","b":[32,32,32,32]},{"a":2768,"l":"title_row18","c":"Row 18: blank spacer below the PRESS FIRE prompt.","t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2776,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2784,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2792,"t":"byte","b":[32,32,32,32,32]},{"a":2797,"l":"title_clear_base_0aed","c":"Title screen row 18, column 29. Nothing special is stored here: this is one of the four bases $4420 uses to blank the whole 1000-byte title screen with spaces in overlapping 250-byte runs ($07FF, $08F9, $09F3 and $0AED, each indexed X = $FA..1).","t":"byte","b":[32,32,32,32,32,32,32,32],"x":[17453]},{"a":2805,"t":"byte","b":[32,32,32]},{"a":2808,"l":"title_row19","c":"Row 19: blank spacer above the alphabet strip.","t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2816,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2824,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2832,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2840,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2848,"l":"title_row20","c":"Row 20: blank spacer; the name-entry alphabet strip is on the next row.","t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2856,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2864,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2872,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2880,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2888,"l":"title_row21","c":"Row 21, columns 6-33: the alphabet strip '.ABCDEFGHIJKLMNOPQRSTUVWXYZ_' the high-score name entry at $4CE2 walks with left/right, index 0-$1B.","t":"byte","b":[32,32,32,32,32,32]},{"a":2894,"l":"title_alphabet_strip","c":"Title screen row 21, columns 6-33: the 28-glyph strip '.ABCDEFGHIJKLMNOPQRSTUVWXYZ_'. It is generated, not stored - $4471-$4479 counts Y down from $9B while X counts down from $1B, so it writes codes $80 ('.') through $9B ('_') into $0B4E-$0B69. The name entry at $4CE2 walks an index 0-$1B along it with left/right and takes the character under the cursor on fire.","t":"byte","b":[128,129,130,131,132,133,134,135],"x":[17524]},{"a":2902,"t":"byte","b":[136,137,138,139,140,141,142,143]},{"a":2910,"t":"byte","b":[144,145,146,147,148,149,150,151]},{"a":2918,"t":"byte","b":[152,153,154,155,32,32,32,32]},{"a":2926,"t":"byte","b":[32,32]},{"a":2928,"l":"title_row22","c":"Row 22: blank spacer below the alphabet strip.","t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2936,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2944,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2952,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2960,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2968,"l":"title_row23","c":"Row 23: blank spacer above the copyright line.","t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2976,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2984,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":2992,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":3000,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":3008,"l":"title_credit_line","c":"Row 24: the 40-character credit line '(c)VIRGIN GAMES 1983  WRITTEN BY STEVE LEE', stamped here from copyright_string at $2F80 by $44A5 in colour $0F.","t":"byte","b":[157,150,137,146,135,137,142,32],"x":[17576]},{"a":3016,"t":"byte","b":[135,129,141,133,147,32,1,9]},{"a":3024,"t":"byte","b":[8,3,32,32,151,146,137,148]},{"a":3032,"t":"byte","b":[148,133,142,32,130,153,32,147]},{"a":3040,"t":"byte","b":[148,133,150,133,32,140,133,133]},{"a":3048,"l":"title_screen_tail","c":"The last 16 unused bytes of the $0800 screen page ($0BE8-$0BF7), all spaces/$00. Nothing writes them.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":3056,"t":"byte","b":[1,0,0,0,0,0,0,0]},{"a":3064,"l":"title_sprite_ptrs","c":"Sprite pointers for the title screen's $0800 page ($0800+$03F8). All zero, i.e. sprite block $80, and $46D5 writes $00 to $D015 so no sprite is shown on the title at all.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":3072,"l":"unused_0c00","c":"$0C00-$0C32: all $00 apart from isolated $01 bytes at $0C10, $0C22 and $0C40. Part of the memory the Remember loader left behind; nothing in this image reads it.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":3080,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":3088,"t":"byte","b":[1,0,0,0,0,0,0,0]},{"a":3096,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":3104,"t":"byte","b":[0,0,1,0,0,0,0,0]},{"a":3112,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":3120,"t":"byte","b":[0,0,0]},{"a":3123,"l":"remember_intro_blob_0c33","c":"Unidentified Remember intro data, $0C33 onwards (first bytes 0F 40 20 F2 00 00 00 06). Dense, byte-oriented, not 8-byte glyph bitmaps and not 6502 code; it sits between the intro's PETSCII logo at $0D94 and the scroll text at $0E80, so it is most likely the intro's packed music or its scroll charset. No code anywhere in this image references it.","t":"byte","b":[15,64,32,242,0,0,0,6]},{"a":3131,"t":"byte","b":[64,35,114,0,0,0,6,64]},{"a":3139,"t":"byte","b":[35,162,0,8,240,24,172,172]},{"a":3147,"t":"byte","b":[172,172,172,172,172,3,69,67]},{"a":3155,"t":"byte","b":[12,138,13,0,133,3,133,7]},{"a":3163,"t":"byte","b":[133,3,133,7,69,10,22,12]},{"a":3171,"t":"byte","b":[134,67,12,140,21,10,134,8]},{"a":3179,"t":"byte","b":[69,12,134,10,134,8,69,10]},{"a":3187,"l":"remember_intro_blob_0c73","c":"Unidentified Remember intro data, $0C73 onwards (first bytes 26 8A 15 03 26 0C 86 43). Dense, byte-oriented, not 8-byte glyph bitmaps and not 6502 code; it sits between the intro's PETSCII logo at $0D94 and the scroll text at $0E80, so it is most likely the intro's packed music or its scroll charset. No code anywhere in this image references it.","t":"byte","b":[38,138,21,3,38,12,134,67]},{"a":3195,"t":"byte","b":[12,140,21,10,134,8,69,12]},{"a":3203,"t":"byte","b":[134,10,134,8,69,10,38,138]},{"a":3211,"t":"byte","b":[21,7,37,3,37,76,20,135]},{"a":3219,"t":"byte","b":[20,12,37,10,21,74,20,133]},{"a":3227,"t":"byte","b":[20,10,69,74,12,133,12,10]},{"a":3235,"t":"byte","b":[133,10,133,2,133,10,133,2]},{"a":3243,"t":"byte","b":[69,5,21,7,133,74,12,135]},{"a":3251,"l":"remember_intro_blob_0cb3","c":"Unidentified Remember intro data, $0CB3 onwards (first bytes 14 05 85 03 45 07 85 05). Dense, byte-oriented, not 8-byte glyph bitmaps and not 6502 code; it sits between the intro's PETSCII logo at $0D94 and the scroll text at $0E80, so it is most likely the intro's packed music or its scroll charset. No code anywhere in this image references it.","t":"byte","b":[20,5,133,3,69,7,133,5]},{"a":3259,"t":"byte","b":[133,3,69,5,37,133,20,10]},{"a":3267,"t":"byte","b":[38,7,133,74,12,135,20,5]},{"a":3275,"t":"byte","b":[133,3,69,7,133,5,133,3]},{"a":3283,"t":"byte","b":[69,5,37,133,20,2,37,10]},{"a":3291,"t":"byte","b":[37,71,19,130,20,7,36,8]},{"a":3299,"t":"byte","b":[20,72,11,131,12,10,37,12]},{"a":3307,"t":"byte","b":[37,10,21,74,12,133,12,2]},{"a":3315,"l":"remember_intro_blob_0cf3","c":"Unidentified Remember intro data, $0CF3 onwards (first bytes 15 03 45 43 0C 8A 0D 03). Dense, byte-oriented, not 8-byte glyph bitmaps and not 6502 code; it sits between the intro's PETSCII logo at $0D94 and the scroll text at $0E80, so it is most likely the intro's packed music or its scroll charset. No code anywhere in this image references it.","t":"byte","b":[21,3,69,67,12,138,13,3]},{"a":3323,"t":"byte","b":[133,3,133,7,133,3,133,7]},{"a":3331,"t":"byte","b":[69,10,22,12,134,67,12,140]},{"a":3339,"t":"byte","b":[21,10,134,8,69,12,134,10]},{"a":3347,"t":"byte","b":[134,8,69,10,38,138,21,3]},{"a":3355,"t":"byte","b":[38,12,134,67,12,140,21,10]},{"a":3363,"t":"byte","b":[134,8,69,12,134,10,134,8]},{"a":3371,"t":"byte","b":[69,10,38,138,21,7,37,3]},{"a":3379,"l":"remember_intro_blob_0d33","c":"Unidentified Remember intro data, $0D33 onwards (first bytes 25 4C 14 87 14 0C 25 0A). Dense, byte-oriented, not 8-byte glyph bitmaps and not 6502 code; it sits between the intro's PETSCII logo at $0D94 and the scroll text at $0E80, so it is most likely the intro's packed music or its scroll charset. No code anywhere in this image references it.","t":"byte","b":[37,76,20,135,20,12,37,10]},{"a":3387,"t":"byte","b":[21,74,20,133,20,8,68,72]},{"a":3395,"t":"byte","b":[11,131,12,8,132,8,132,12]},{"a":3403,"t":"byte","b":[133,8,132,12,69,3,37,2]},{"a":3411,"t":"byte","b":[69,12,69,10,69,74,12,133]},{"a":3419,"t":"byte","b":[12,10,133,10,133,2,133,10]},{"a":3427,"t":"byte","b":[133,2,69,5,37,3,69,2]},{"a":3435,"t":"byte","b":[69,8,68,72,11,131,12,8]},{"a":3443,"l":"remember_intro_blob_0d73","c":"Unidentified Remember intro data, $0D73 onwards (first bytes 84 08 84 0C 85 08 84 0C). Dense, byte-oriented, not 8-byte glyph bitmaps and not 6502 code; it sits between the intro's PETSCII logo at $0D94 and the scroll text at $0E80, so it is most likely the intro's packed music or its scroll charset. No code anywhere in this image references it.","t":"byte","b":[132,8,132,12,133,8,132,12]},{"a":3451,"t":"byte","b":[69,3,37,2,69,12,69,10]},{"a":3459,"t":"byte","b":[69,74,12,133,12,10,133,10]},{"a":3467,"t":"byte","b":[133,2,133,10,133,2,69,5]},{"a":3475,"t":"byte","b":[21]},{"a":3476,"l":"remember_intro_logo_0d94","c":"PETSCII picture data for the Remember intro screen, $0D94 onwards: printable characters mixed with colour controls ($97 light blue, $92 reverse off, $12 reverse on, $9E yellow) and line-drawing graphics ($C0 $B0 $B1 $B2 $B3 $DD $AB $AD $AE $BD), ending each line with $0D. Bytes here: 00 15 FF FF FF 20 20 20. Unreferenced by any code in this image.","t":"byte","b":[0,21,255,255,255,32,32,32]},{"a":3484,"t":"byte","b":[32,32,151,223,18,32,32,32]},{"a":3492,"t":"byte","b":[32,146,31,176,192,174,32,32]},{"a":3500,"t":"byte","b":[32,32,32,32,32,32,32,176]},{"a":3508,"t":"byte","b":[174,32,32,32,32,32,151,18]},{"a":3516,"t":"byte","b":[32,32,32,32,146,169,13,32]},{"a":3524,"t":"byte","b":[32,32,32,32,154,32,32,32]},{"a":3532,"t":"byte","b":[32,32,221,221,171,192,178,192]},{"a":3540,"l":"remember_intro_logo_0dd4","c":"PETSCII picture data for the Remember intro screen, $0DD4 onwards: printable characters mixed with colour controls ($97 light blue, $92 reverse off, $12 reverse on, $9E yellow) and line-drawing graphics ($C0 $B0 $B1 $B2 $B3 $DD $AB $AD $AE $BD), ending each line with $0D. Bytes here: C0 B2 C0 B2 C0 C0 B3 AD. Unreferenced by any code in this image.","t":"byte","b":[192,178,192,178,192,192,179,173]},{"a":3548,"t":"byte","b":[178,192,178,192,174,13,32,32]},{"a":3556,"t":"byte","b":[32,32,32,152,32,32,223,18]},{"a":3564,"t":"byte","b":[32,32,146,159,221,32,179,221]},{"a":3572,"t":"byte","b":[221,221,221,221,221,221,221,221]},{"a":3580,"t":"byte","b":[221,221,221,221,221,171,189,152]},{"a":3588,"t":"byte","b":[18,32,32,146,169,13,32,32]},{"a":3596,"t":"byte","b":[32,32,32,153,32,32,32,32]},{"a":3604,"l":"remember_intro_logo_0e14","c":"PETSCII picture data for the Remember intro screen, $0E14 onwards: printable characters mixed with colour controls ($97 light blue, $92 reverse off, $12 reverse on, $9E yellow) and line-drawing graphics ($C0 $B0 $B1 $B2 $B3 $DD $AB $AD $AE $BD), ending each line with $0D. Bytes here: 20 DD DD DD B0 B3 DD DD. Unreferenced by any code in this image.","t":"byte","b":[32,221,221,221,176,179,221,221]},{"a":3612,"t":"byte","b":[221,176,179,221,221,221,221,221]},{"a":3620,"t":"byte","b":[176,179,221,13,32,32,32,32]},{"a":3628,"t":"byte","b":[32,155,32,32,32,32,223,158]},{"a":3636,"t":"byte","b":[146,173,177,177,192,177,177,177]},{"a":3644,"t":"byte","b":[177,192,177,177,177,177,192,177]},{"a":3652,"t":"byte","b":[192,177,189,32,155,169,13]},{"a":3659,"l":"unused_0e4b","c":"$0E4B-$0E7F: all $00, the gap between the Remember intro logo data and its scroll text.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":3667,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":3675,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":3683,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":3691,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":3699,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":3707,"t":"byte","b":[0,0,0,0,0]},{"a":3712,"l":"remember_scrolltext_0e80","c":"Remember's scroll text, $0E80-$0EBF, PETSCII: \" ...and here release #60 !!!   This time we show you 'FALCON PAT\". Letters appear both as $01-$1A and as $41-$5A, the two cases of the intro's own charset. The whole message runs $0E80-$123F and ends 'BACK ALIEN/REMEMBER IN OCTOBER 1997'. It names the crack's own changes - a fix to the IRQ and a new routine to push high-score places down on name entry - and no code in this image reads it, so it is left over from the intro that ran before the game was loaded over it.","t":"byte","b":[32,46,46,46,1,14,4,32]},{"a":3720,"t":"byte","b":[8,5,18,5,32,18,5,12]},{"a":3728,"t":"byte","b":[5,1,19,5,32,35,54,48]},{"a":3736,"t":"byte","b":[32,33,33,33,32,32,32,84]},{"a":3744,"t":"byte","b":[8,9,19,32,20,9,13,5]},{"a":3752,"t":"byte","b":[32,23,5,32,19,8,15,23]},{"a":3760,"t":"byte","b":[32,25,15,21,32,34,70,65]},{"a":3768,"t":"byte","b":[76,67,79,78,32,80,65,84]},{"a":3776,"l":"remember_scrolltext_0ec0","c":"Remember's scroll text, $0EC0-$0EFF, PETSCII: \"ROL', a game by Steve Lee. Original supplied by DERBYSHIRE RAM/R\". Letters appear both as $01-$1A and as $41-$5A, the two cases of the intro's own charset. The whole message runs $0E80-$123F and ends 'BACK ALIEN/REMEMBER IN OCTOBER 1997'. It names the crack's own changes - a fix to the IRQ and a new routine to push high-score places down on name entry - and no code in this image reads it, so it is left over from the intro that ran before the game was loaded over it.","t":"byte","b":[82,79,76,34,44,32,1,32]},{"a":3784,"t":"byte","b":[7,1,13,5,32,2,25,32]},{"a":3792,"t":"byte","b":[83,20,5,22,5,32,76,5]},{"a":3800,"t":"byte","b":[5,46,32,79,18,9,7,9]},{"a":3808,"t":"byte","b":[14,1,12,32,19,21,16,16]},{"a":3816,"t":"byte","b":[12,9,5,4,32,2,25,32]},{"a":3824,"t":"byte","b":[68,69,82,66,89,83,72,73]},{"a":3832,"t":"byte","b":[82,69,32,82,65,77,47,82]},{"a":3840,"l":"remember_scrolltext_0f00","c":"Remember's scroll text, $0F00-$0F3F, PETSCII: \"EMEMBER, cracked from tape, +5 trained, highscoresaver installed\". Letters appear both as $01-$1A and as $41-$5A, the two cases of the intro's own charset. The whole message runs $0E80-$123F and ends 'BACK ALIEN/REMEMBER IN OCTOBER 1997'. It names the crack's own changes - a fix to the IRQ and a new routine to push high-score places down on name entry - and no code in this image reads it, so it is left over from the intro that ran before the game was loaded over it.","t":"byte","b":[69,77,69,77,66,69,82,44]},{"a":3848,"t":"byte","b":[32,3,18,1,3,11,5,4]},{"a":3856,"t":"byte","b":[32,6,18,15,13,32,20,1]},{"a":3864,"t":"byte","b":[16,5,44,32,43,53,32,20]},{"a":3872,"t":"byte","b":[18,1,9,14,5,4,44,32]},{"a":3880,"t":"byte","b":[8,9,7,8,19,3,15,18]},{"a":3888,"t":"byte","b":[5,19,1,22,5,18,32,9]},{"a":3896,"t":"byte","b":[14,19,20,1,12,12,5,4]},{"a":3904,"l":"remember_scrolltext_0f40","c":"Remember's scroll text, $0F40-$0F7F, PETSCII: \", debugged and documents typed by JACK ALIEN/REMEMBER !!!   Well\". Letters appear both as $01-$1A and as $41-$5A, the two cases of the intro's own charset. The whole message runs $0E80-$123F and ends 'BACK ALIEN/REMEMBER IN OCTOBER 1997'. It names the crack's own changes - a fix to the IRQ and a new routine to push high-score places down on name entry - and no code in this image reads it, so it is left over from the intro that ran before the game was loaded over it.","t":"byte","b":[44,32,4,5,2,21,7,7]},{"a":3912,"t":"byte","b":[5,4,32,1,14,4,32,4]},{"a":3920,"t":"byte","b":[15,3,21,13,5,14,20,19]},{"a":3928,"t":"byte","b":[32,20,25,16,5,4,32,2]},{"a":3936,"t":"byte","b":[25,32,74,65,67,75,32,65]},{"a":3944,"t":"byte","b":[76,73,69,78,47,82,69,77]},{"a":3952,"t":"byte","b":[69,77,66,69,82,32,33,33]},{"a":3960,"t":"byte","b":[33,32,32,32,87,5,12,12]},{"a":3968,"l":"remember_scrolltext_0f80","c":"Remember's scroll text, $0F80-$0FBF, PETSCII: \", first the game fucked up sometimes. I just changed something i\". Letters appear both as $01-$1A and as $41-$5A, the two cases of the intro's own charset. The whole message runs $0E80-$123F and ends 'BACK ALIEN/REMEMBER IN OCTOBER 1997'. It names the crack's own changes - a fix to the IRQ and a new routine to push high-score places down on name entry - and no code in this image reads it, so it is left over from the intro that ran before the game was loaded over it.","t":"byte","b":[44,32,6,9,18,19,20,32]},{"a":3976,"t":"byte","b":[20,8,5,32,7,1,13,5]},{"a":3984,"t":"byte","b":[32,6,21,3,11,5,4,32]},{"a":3992,"t":"byte","b":[21,16,32,19,15,13,5,20]},{"a":4000,"t":"byte","b":[9,13,5,19,46,32,73,32]},{"a":4008,"t":"byte","b":[10,21,19,20,32,3,8,1]},{"a":4016,"t":"byte","b":[14,7,5,4,32,19,15,13]},{"a":4024,"t":"byte","b":[5,20,8,9,14,7,32,9]},{"a":4032,"l":"remember_scrolltext_0fc0","c":"Remember's scroll text, $0FC0-$0FFF, PETSCII: \"n the irq, now it seems that it works fine (till now, hehe!) and\". Letters appear both as $01-$1A and as $41-$5A, the two cases of the intro's own charset. The whole message runs $0E80-$123F and ends 'BACK ALIEN/REMEMBER IN OCTOBER 1997'. It names the crack's own changes - a fix to the IRQ and a new routine to push high-score places down on name entry - and no code in this image reads it, so it is left over from the intro that ran before the game was loaded over it.","t":"byte","b":[14,32,20,8,5,32,9,18]},{"a":4040,"t":"byte","b":[17,44,32,14,15,23,32,9]},{"a":4048,"t":"byte","b":[20,32,19,5,5,13,19,32]},{"a":4056,"t":"byte","b":[20,8,1,20,32,9,20,32]},{"a":4064,"t":"byte","b":[23,15,18,11,19,32,6,9]},{"a":4072,"t":"byte","b":[14,5,32,40,20,9,12,12]},{"a":4080,"t":"byte","b":[32,14,15,23,44,32,8,5]},{"a":4088,"t":"byte","b":[8,5,33,41,32,1,14,4]},{"a":4096,"l":"remember_scrolltext_1000","c":"Remember's scroll text, $1000-$103F, PETSCII: \" another thing was that in the game was no routine which sets th\". Letters appear both as $01-$1A and as $41-$5A, the two cases of the intro's own charset. The whole message runs $0E80-$123F and ends 'BACK ALIEN/REMEMBER IN OCTOBER 1997'. It names the crack's own changes - a fix to the IRQ and a new routine to push high-score places down on name entry - and no code in this image reads it, so it is left over from the intro that ran before the game was loaded over it.","t":"byte","b":[32,1,14,15,20,8,5,18]},{"a":4104,"t":"byte","b":[32,20,8,9,14,7,32,23]},{"a":4112,"t":"byte","b":[1,19,32,20,8,1,20,32]},{"a":4120,"t":"byte","b":[9,14,32,20,8,5,32,7]},{"a":4128,"t":"byte","b":[1,13,5,32,23,1,19,32]},{"a":4136,"t":"byte","b":[14,15,32,18,15,21,20,9]},{"a":4144,"t":"byte","b":[14,5,32,23,8,9,3,8]},{"a":4152,"t":"byte","b":[32,19,5,20,19,32,20,8]},{"a":4160,"l":"remember_scrolltext_1040","c":"Remember's scroll text, $1040-$107F, PETSCII: \"e places downwards when you entered your name in the highscoreli\". Letters appear both as $01-$1A and as $41-$5A, the two cases of the intro's own charset. The whole message runs $0E80-$123F and ends 'BACK ALIEN/REMEMBER IN OCTOBER 1997'. It names the crack's own changes - a fix to the IRQ and a new routine to push high-score places down on name entry - and no code in this image reads it, so it is left over from the intro that ran before the game was loaded over it.","t":"byte","b":[5,32,16,12,1,3,5,19]},{"a":4168,"t":"byte","b":[32,4,15,23,14,23,1,18]},{"a":4176,"t":"byte","b":[4,19,32,23,8,5,14,32]},{"a":4184,"t":"byte","b":[25,15,21,32,5,14,20,5]},{"a":4192,"t":"byte","b":[18,5,4,32,25,15,21,18]},{"a":4200,"t":"byte","b":[32,14,1,13,5,32,9,14]},{"a":4208,"t":"byte","b":[32,20,8,5,32,8,9,7]},{"a":4216,"t":"byte","b":[8,19,3,15,18,5,12,9]},{"a":4224,"l":"remember_scrolltext_1080","c":"Remember's scroll text, $1080-$10BF, PETSCII: \"st, so i coded a routine and it works !!!   If you've the origin\". Letters appear both as $01-$1A and as $41-$5A, the two cases of the intro's own charset. The whole message runs $0E80-$123F and ends 'BACK ALIEN/REMEMBER IN OCTOBER 1997'. It names the crack's own changes - a fix to the IRQ and a new routine to push high-score places down on name entry - and no code in this image reads it, so it is left over from the intro that ran before the game was loaded over it.","t":"byte","b":[19,20,44,32,19,15,32,9]},{"a":4232,"t":"byte","b":[32,3,15,4,5,4,32,1]},{"a":4240,"t":"byte","b":[32,18,15,21,20,9,14,5]},{"a":4248,"t":"byte","b":[32,1,14,4,32,9,20,32]},{"a":4256,"t":"byte","b":[23,15,18,11,19,32,33,33]},{"a":4264,"t":"byte","b":[33,32,32,32,73,6,32,25]},{"a":4272,"t":"byte","b":[15,21,39,22,5,32,20,8]},{"a":4280,"t":"byte","b":[5,32,15,18,9,7,9,14]},{"a":4288,"l":"remember_scrolltext_10c0","c":"Remember's scroll text, $10C0-$10FF, PETSCII: \"al of 'FALCON PATROL II' with documents, please, then contact or\". Letters appear both as $01-$1A and as $41-$5A, the two cases of the intro's own charset. The whole message runs $0E80-$123F and ends 'BACK ALIEN/REMEMBER IN OCTOBER 1997'. It names the crack's own changes - a fix to the IRQ and a new routine to push high-score places down on name entry - and no code in this image reads it, so it is left over from the intro that ran before the game was loaded over it.","t":"byte","b":[1,12,32,15,6,32,34,70]},{"a":4296,"t":"byte","b":[65,76,67,79,78,32,80,65]},{"a":4304,"t":"byte","b":[84,82,79,76,32,73,73,34]},{"a":4312,"t":"byte","b":[32,23,9,20,8,32,4,15]},{"a":4320,"t":"byte","b":[3,21,13,5,14,20,19,44]},{"a":4328,"t":"byte","b":[32,16,12,5,1,19,5,44]},{"a":4336,"t":"byte","b":[32,20,8,5,14,32,3,15]},{"a":4344,"t":"byte","b":[14,20,1,3,20,32,15,18]},{"a":4352,"l":"remember_scrolltext_1100","c":"Remember's scroll text, $1100-$113F, PETSCII: \" send it to our newest member DERBYSHIRE RAM !!! Thanx alot... .\". Letters appear both as $01-$1A and as $41-$5A, the two cases of the intro's own charset. The whole message runs $0E80-$123F and ends 'BACK ALIEN/REMEMBER IN OCTOBER 1997'. It names the crack's own changes - a fix to the IRQ and a new routine to push high-score places down on name entry - and no code in this image reads it, so it is left over from the intro that ran before the game was loaded over it.","t":"byte","b":[32,19,5,14,4,32,9,20]},{"a":4360,"t":"byte","b":[32,20,15,32,15,21,18,32]},{"a":4368,"t":"byte","b":[14,5,23,5,19,20,32,13]},{"a":4376,"t":"byte","b":[5,13,2,5,18,32,68,69]},{"a":4384,"t":"byte","b":[82,66,89,83,72,73,82,69]},{"a":4392,"t":"byte","b":[32,82,65,77,32,33,33,33]},{"a":4400,"t":"byte","b":[32,84,8,1,14,24,32,1]},{"a":4408,"t":"byte","b":[12,15,20,46,46,46,32,46]},{"a":4416,"l":"remember_scrolltext_1140","c":"Remember's scroll text, $1140-$117F, PETSCII: \". . Greetings to: Cupid/Padua/Hitmen, all in Hitmen, Manik, Nost\". Letters appear both as $01-$1A and as $41-$5A, the two cases of the intro's own charset. The whole message runs $0E80-$123F and ends 'BACK ALIEN/REMEMBER IN OCTOBER 1997'. It names the crack's own changes - a fix to the IRQ and a new routine to push high-score places down on name entry - and no code in this image reads it, so it is left over from the intro that ran before the game was loaded over it.","t":"byte","b":[46,32,46,32,71,18,5,5]},{"a":4424,"t":"byte","b":[20,9,14,7,19,32,20,15]},{"a":4432,"t":"byte","b":[58,32,67,21,16,9,4,47]},{"a":4440,"t":"byte","b":[80,1,4,21,1,47,72,9]},{"a":4448,"t":"byte","b":[20,13,5,14,44,32,1,12]},{"a":4456,"t":"byte","b":[12,32,9,14,32,72,9,20]},{"a":4464,"t":"byte","b":[13,5,14,44,32,77,1,14]},{"a":4472,"t":"byte","b":[9,11,44,32,78,15,19,20]},{"a":4480,"l":"remember_scrolltext_1180","c":"Remember's scroll text, $1180-$11BF, PETSCII: \"algia, Emulators, Cyberpunx, Boomer, Fatman & Dodger/Dytec, The \". Letters appear both as $01-$1A and as $41-$5A, the two cases of the intro's own charset. The whole message runs $0E80-$123F and ends 'BACK ALIEN/REMEMBER IN OCTOBER 1997'. It names the crack's own changes - a fix to the IRQ and a new routine to push high-score places down on name entry - and no code in this image reads it, so it is left over from the intro that ran before the game was loaded over it.","t":"byte","b":[1,12,7,9,1,44,32,69]},{"a":4488,"t":"byte","b":[13,21,12,1,20,15,18,19]},{"a":4496,"t":"byte","b":[44,32,67,25,2,5,18,16]},{"a":4504,"t":"byte","b":[21,14,24,44,32,66,15,15]},{"a":4512,"t":"byte","b":[13,5,18,44,32,70,1,20]},{"a":4520,"t":"byte","b":[13,1,14,32,38,32,68,15]},{"a":4528,"t":"byte","b":[4,7,5,18,47,68,25,20]},{"a":4536,"t":"byte","b":[5,3,44,32,84,8,5,32]},{"a":4544,"l":"remember_scrolltext_11c0","c":"Remember's scroll text, $11C0-$11FF, PETSCII: \"Collector, Nomad/Sunrise... and all the others !!!   Jack Alien/\". Letters appear both as $01-$1A and as $41-$5A, the two cases of the intro's own charset. The whole message runs $0E80-$123F and ends 'BACK ALIEN/REMEMBER IN OCTOBER 1997'. It names the crack's own changes - a fix to the IRQ and a new routine to push high-score places down on name entry - and no code in this image reads it, so it is left over from the intro that ran before the game was loaded over it.","t":"byte","b":[67,15,12,12,5,3,20,15]},{"a":4552,"t":"byte","b":[18,44,32,78,15,13,1,4]},{"a":4560,"t":"byte","b":[47,83,21,14,18,9,19,5]},{"a":4568,"t":"byte","b":[46,46,46,32,1,14,4,32]},{"a":4576,"t":"byte","b":[1,12,12,32,20,8,5,32]},{"a":4584,"t":"byte","b":[15,20,8,5,18,19,32,33]},{"a":4592,"t":"byte","b":[33,33,32,32,32,74,1,3]},{"a":4600,"t":"byte","b":[11,32,65,12,9,5,14,47]},{"a":4608,"l":"remember_scrolltext_1200","c":"Remember's scroll text, $1200-$123F, PETSCII: \"Remember in October 1997                                        \". Letters appear both as $01-$1A and as $41-$5A, the two cases of the intro's own charset. The whole message runs $0E80-$123F and ends 'BACK ALIEN/REMEMBER IN OCTOBER 1997'. It names the crack's own changes - a fix to the IRQ and a new routine to push high-score places down on name entry - and no code in this image reads it, so it is left over from the intro that ran before the game was loaded over it.","t":"byte","b":[82,5,13,5,13,2,5,18]},{"a":4616,"t":"byte","b":[32,9,14,32,79,3,20,15]},{"a":4624,"t":"byte","b":[2,5,18,32,49,57,57,55]},{"a":4632,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":4640,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":4648,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":4656,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":4664,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":4672,"l":"unused_1240","c":"$1240-$18FF: 1728 bytes of $00, left clear by the loader. It sits in the VIC bank-0 window $1000-$1FFF, where the video chip sees the character ROM instead of RAM, so nothing displayed can come from here. Nothing reads or writes it.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4680,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4688,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4696,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4704,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4712,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4720,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4728,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4736,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4744,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4752,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4760,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4768,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4776,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4784,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4792,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4800,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4808,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4816,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4824,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4832,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4840,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4848,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4856,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4864,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4872,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4880,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4888,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4896,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4904,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4912,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4920,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4928,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4936,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4944,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4952,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4960,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4968,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4976,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4984,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":4992,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5000,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5008,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5016,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5024,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5032,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5040,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5048,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5056,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5064,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5072,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5080,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5088,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5096,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5104,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5112,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5120,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5128,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5136,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5144,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5152,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5160,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5168,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5176,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5184,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5192,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5200,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5208,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5216,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5224,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5232,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5240,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5248,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5256,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5264,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5272,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5280,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5288,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5296,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5304,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5312,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5320,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5328,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5336,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5344,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5352,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5360,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5368,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5376,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5384,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5392,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5400,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5408,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5416,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5424,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5432,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5440,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5448,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5456,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5464,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5472,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5480,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5488,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5496,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5504,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5512,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5520,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5528,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5536,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5544,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5552,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5560,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5568,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5576,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5584,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5592,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5600,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5608,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5616,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5624,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5632,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5640,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5648,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5656,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5664,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5672,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5680,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5688,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":5696,"t":"gap","n":704},{"a":6400,"l":"crack_front_end","c":"The Remember crack's boot menu - not Steve Lee's code. Entered before the game and never returned to; it ends with JMP $4100, the game's cold start. Sequence: clear the screen ($E544), $D018 = $16 so the VIC shows screen $0400 with the ROM character set (the RAM at $1800-$1FFF is invisible to the VIC in bank 0, which is why the crack parks its text there), border and background black, colour RAM all $0F, then copy documents_screen $1C00-$1FFF onto $0400-$07FF and wait at $1948 for $DC01 = $EF - fire on port 1, which is also SPACE, the key the screen at $1FC0 asks for. Then it paints three colour bars, prints crack_banner ($1A80, three rows) and asks 'Highscore or Trainers?' via GETIN ($FFE4): 'H' skips to $1A18, 'T' first pokes $AD over the JSR opcode at $4D73 so the high-score save is disabled, then asks five trainer questions in turn, each printed at screen row 2 from $1AF8, $1B20, $1B48, $1B70 and $1B98 and each answered Y/N; a 'Y' pokes a single byte into the game: $417C -> $A5 (DEC lives becomes LDA, unlimited lives), $555E -> $A5 (unlimited GAS), $57DB -> $A5 (unlimited AAMs), $5F71 -> $4D (the BEQ after CMP #$16 jumps to the already-destroyed path, so bases are indestructible) and $420F/$424C -> $AD (both JSR player_hit become LDA, no collisions). Finally it prints $1BC0, zeroes music_note_index, and waits for 'R' or 'L': 'R' jumps to $2918 to SAVE a fresh high-score file, 'L' does SETLFS 1,8,1 / SETNAM 'F.PATROL HI /REM' / LOAD to $2800 and then JMP $4100. Inputs: keyboard via GETIN and $DC01. Side effects: it writes $D018, $D020, $D021, $D011, $D800-$DBFF, all of screen RAM, and up to seven bytes of the game's own code.","t":"code","b":[32,68,229],"m":"jsr","o":"s_E544","oa":58692},{"a":6403,"t":"code","b":[169,22],"m":"lda","o":"#$16"},{"a":6405,"t":"code","b":[141,24,208],"m":"sta","o":"vic_memory"},{"a":6408,"t":"code","b":[169,128],"m":"lda","o":"#$80"},{"a":6410,"t":"code","b":[141,32,208],"m":"sta","o":"vic_border"},{"a":6413,"t":"code","b":[141,33,208],"m":"sta","o":"vic_background0"},{"a":6416,"t":"code","b":[141,145,2],"m":"sta","o":"charset_lock","oa":657},{"a":6419,"t":"code","b":[169,11],"m":"lda","o":"#$0B"},{"a":6421,"t":"code","b":[141,17,208],"m":"sta","o":"vic_control1"},{"a":6424,"t":"code","b":[162,0],"m":"ldx","o":"#$00"},{"a":6426,"l":"b_191A","t":"code","b":[169,15],"m":"lda","o":"#$0F","x":[6465]},{"a":6428,"t":"code","b":[157,0,216],"m":"sta","o":"colour_ram,x"},{"a":6431,"t":"code","b":[157,0,217],"m":"sta","o":"$D900,x"},{"a":6434,"t":"code","b":[157,0,218],"m":"sta","o":"$DA00,x"},{"a":6437,"t":"code","b":[157,0,219],"m":"sta","o":"$DB00,x"},{"a":6440,"t":"code","b":[189,0,28],"m":"lda","o":"documents_row00,x","oa":7168},{"a":6443,"t":"code","b":[157,0,4],"m":"sta","o":"f_0400,x","oa":1024},{"a":6446,"t":"code","b":[189,0,29],"m":"lda","o":"documents_page_1d,x","oa":7424},{"a":6449,"t":"code","b":[157,0,5],"m":"sta","o":"f_0500,x","oa":1280},{"a":6452,"t":"code","b":[189,0,30],"m":"lda","o":"documents_page_1e,x","oa":7680},{"a":6455,"t":"code","b":[157,0,6],"m":"sta","o":"f_0600,x","oa":1536},{"a":6458,"t":"code","b":[189,0,31],"m":"lda","o":"documents_page_1f,x","oa":7936},{"a":6461,"t":"code","b":[157,0,7],"m":"sta","o":"f_0700,x","oa":1792},{"a":6464,"t":"code","b":[232],"m":"inx"},{"a":6465,"t":"code","b":[208,215],"m":"bne","o":"b_191A","oa":6426},{"a":6467,"t":"code","b":[169,27],"m":"lda","o":"#$1B"},{"a":6469,"t":"code","b":[141,17,208],"m":"sta","o":"vic_control1"},{"a":6472,"l":"b_1948","t":"code","b":[173,1,220],"m":"lda","o":"cia1_port_b","x":[6477]},{"a":6475,"t":"code","b":[201,239],"m":"cmp","o":"#$EF"},{"a":6477,"t":"code","b":[208,249],"m":"bne","o":"b_1948","oa":6472},{"a":6479,"t":"code","b":[169,11],"m":"lda","o":"#$0B"},{"a":6481,"t":"code","b":[141,17,208],"m":"sta","o":"vic_control1"},{"a":6484,"t":"code","b":[32,68,229],"m":"jsr","o":"s_E544","oa":58692},{"a":6487,"t":"code","b":[162,39],"m":"ldx","o":"#$27"},{"a":6489,"l":"b_1959","t":"code","b":[169,14],"m":"lda","o":"#$0E","x":[6505]},{"a":6491,"t":"code","b":[157,0,216],"m":"sta","o":"colour_ram,x"},{"a":6494,"t":"code","b":[169,6],"m":"lda","o":"#$06"},{"a":6496,"t":"code","b":[157,40,216],"m":"sta","o":"$D828,x"},{"a":6499,"t":"code","b":[169,3],"m":"lda","o":"#$03"},{"a":6501,"t":"code","b":[157,80,216],"m":"sta","o":"$D850,x"},{"a":6504,"t":"code","b":[202],"m":"dex"},{"a":6505,"t":"code","b":[16,238],"m":"bpl","o":"b_1959","oa":6489},{"a":6507,"t":"code","b":[162,119],"m":"ldx","o":"#$77"},{"a":6509,"l":"b_196D","t":"code","b":[189,128,26],"m":"lda","o":"crack_banner,x","oa":6784,"x":[6516]},{"a":6512,"t":"code","b":[157,0,4],"m":"sta","o":"f_0400,x","oa":1024},{"a":6515,"t":"code","b":[202],"m":"dex"},{"a":6516,"t":"code","b":[16,247],"m":"bpl","o":"b_196D","oa":6509},{"a":6518,"t":"code","b":[169,27],"m":"lda","o":"#$1B"},{"a":6520,"t":"code","b":[141,17,208],"m":"sta","o":"vic_control1"},{"a":6523,"l":"b_197B","t":"code","b":[32,228,255],"m":"jsr","o":"s_FFE4","oa":65508,"x":[6532]},{"a":6526,"t":"code","b":[201,84],"m":"cmp","o":"#$54"},{"a":6528,"t":"code","b":[240,7],"m":"beq","o":"b_1989","oa":6537},{"a":6530,"t":"code","b":[201,72],"m":"cmp","o":"#$48"},{"a":6532,"t":"code","b":[208,245],"m":"bne","o":"b_197B","oa":6523},{"a":6534,"t":"code","b":[76,24,26],"m":"jmp","o":"j_1A18","oa":6680},{"a":6537,"l":"b_1989","t":"code","b":[169,173],"m":"lda","o":"#$AD","x":[6528]},{"a":6539,"t":"code","b":[141,115,77],"m":"sta","o":"trainer_target_highscore_save","oa":19827},{"a":6542,"t":"code","b":[162,39],"m":"ldx","o":"#$27"},{"a":6544,"l":"b_1990","t":"code","b":[189,248,26],"m":"lda","o":"crack_q_lives,x","oa":6904,"x":[6551]},{"a":6547,"t":"code","b":[157,80,4],"m":"sta","o":"f_0450,x","oa":1104},{"a":6550,"t":"code","b":[202],"m":"dex"},{"a":6551,"t":"code","b":[16,247],"m":"bpl","o":"b_1990","oa":6544},{"a":6553,"l":"b_1999","t":"code","b":[32,228,255],"m":"jsr","o":"s_FFE4","oa":65508,"x":[6562]},{"a":6556,"t":"code","b":[201,78],"m":"cmp","o":"#$4E"},{"a":6558,"t":"code","b":[240,9],"m":"beq","o":"b_19A9","oa":6569},{"a":6560,"t":"code","b":[201,89],"m":"cmp","o":"#$59"},{"a":6562,"t":"code","b":[208,245],"m":"bne","o":"b_1999","oa":6553},{"a":6564,"t":"code","b":[169,165],"m":"lda","o":"#$A5"},{"a":6566,"t":"code","b":[141,124,65],"m":"sta","o":"trainer_target_lives","oa":16764},{"a":6569,"l":"b_19A9","t":"code","b":[162,39],"m":"ldx","o":"#$27","x":[6558]},{"a":6571,"l":"b_19AB","t":"code","b":[189,32,27],"m":"lda","o":"crack_q_gas,x","oa":6944,"x":[6578]},{"a":6574,"t":"code","b":[157,80,4],"m":"sta","o":"f_0450,x","oa":1104},{"a":6577,"t":"code","b":[202],"m":"dex"},{"a":6578,"t":"code","b":[16,247],"m":"bpl","o":"b_19AB","oa":6571},{"a":6580,"l":"b_19B4","t":"code","b":[32,228,255],"m":"jsr","o":"s_FFE4","oa":65508,"x":[6589]},{"a":6583,"t":"code","b":[201,78],"m":"cmp","o":"#$4E"},{"a":6585,"t":"code","b":[240,9],"m":"beq","o":"b_19C4","oa":6596},{"a":6587,"t":"code","b":[201,89],"m":"cmp","o":"#$59"},{"a":6589,"t":"code","b":[208,245],"m":"bne","o":"b_19B4","oa":6580},{"a":6591,"t":"code","b":[169,165],"m":"lda","o":"#$A5"},{"a":6593,"t":"code","b":[141,94,85],"m":"sta","o":"trainer_target_fuel","oa":21854},{"a":6596,"l":"b_19C4","t":"code","b":[162,39],"m":"ldx","o":"#$27","x":[6585]},{"a":6598,"l":"b_19C6","t":"code","b":[189,72,27],"m":"lda","o":"crack_q_aam,x","oa":6984,"x":[6605]},{"a":6601,"t":"code","b":[157,80,4],"m":"sta","o":"f_0450,x","oa":1104},{"a":6604,"t":"code","b":[202],"m":"dex"},{"a":6605,"t":"code","b":[16,247],"m":"bpl","o":"b_19C6","oa":6598},{"a":6607,"l":"b_19CF","t":"code","b":[32,228,255],"m":"jsr","o":"s_FFE4","oa":65508,"x":[6616]},{"a":6610,"t":"code","b":[201,78],"m":"cmp","o":"#$4E"},{"a":6612,"t":"code","b":[240,9],"m":"beq","o":"b_19DF","oa":6623},{"a":6614,"t":"code","b":[201,89],"m":"cmp","o":"#$59"},{"a":6616,"t":"code","b":[208,245],"m":"bne","o":"b_19CF","oa":6607},{"a":6618,"t":"code","b":[169,165],"m":"lda","o":"#$A5"},{"a":6620,"t":"code","b":[141,219,87],"m":"sta","o":"trainer_target_aam","oa":22491},{"a":6623,"l":"b_19DF","t":"code","b":[162,39],"m":"ldx","o":"#$27","x":[6612]},{"a":6625,"l":"b_19E1","t":"code","b":[189,112,27],"m":"lda","o":"crack_q_bases,x","oa":7024,"x":[6632]},{"a":6628,"t":"code","b":[157,80,4],"m":"sta","o":"f_0450,x","oa":1104},{"a":6631,"t":"code","b":[202],"m":"dex"},{"a":6632,"t":"code","b":[16,247],"m":"bpl","o":"b_19E1","oa":6625},{"a":6634,"l":"b_19EA","t":"code","b":[32,228,255],"m":"jsr","o":"s_FFE4","oa":65508,"x":[6643]},{"a":6637,"t":"code","b":[201,78],"m":"cmp","o":"#$4E"},{"a":6639,"t":"code","b":[240,9],"m":"beq","o":"b_19FA","oa":6650},{"a":6641,"t":"code","b":[201,89],"m":"cmp","o":"#$59"},{"a":6643,"t":"code","b":[208,245],"m":"bne","o":"b_19EA","oa":6634},{"a":6645,"t":"code","b":[169,77],"m":"lda","o":"#$4D"},{"a":6647,"t":"code","b":[141,113,95],"m":"sta","o":"trainer_target_base_hit","oa":24433},{"a":6650,"l":"b_19FA","t":"code","b":[162,39],"m":"ldx","o":"#$27","x":[6639]},{"a":6652,"l":"b_19FC","t":"code","b":[189,152,27],"m":"lda","o":"crack_q_collision,x","oa":7064,"x":[6659]},{"a":6655,"t":"code","b":[157,80,4],"m":"sta","o":"f_0450,x","oa":1104},{"a":6658,"t":"code","b":[202],"m":"dex"},{"a":6659,"t":"code","b":[16,247],"m":"bpl","o":"b_19FC","oa":6652},{"a":6661,"l":"b_1A05","t":"code","b":[32,228,255],"m":"jsr","o":"s_FFE4","oa":65508,"x":[6670]},{"a":6664,"t":"code","b":[201,78],"m":"cmp","o":"#$4E"},{"a":6666,"t":"code","b":[240,12],"m":"beq","o":"j_1A18","oa":6680},{"a":6668,"t":"code","b":[201,89],"m":"cmp","o":"#$59"},{"a":6670,"t":"code","b":[208,245],"m":"bne","o":"b_1A05","oa":6661},{"a":6672,"t":"code","b":[169,173],"m":"lda","o":"#$AD"},{"a":6674,"t":"code","b":[141,15,66],"m":"sta","o":"trainer_target_collision_sprite","oa":16911},{"a":6677,"t":"code","b":[141,76,66],"m":"sta","o":"trainer_target_collision_background","oa":16972},{"a":6680,"l":"j_1A18","t":"code","b":[162,39],"m":"ldx","o":"#$27","x":[6534,6666]},{"a":6682,"l":"b_1A1A","t":"code","b":[189,192,27],"m":"lda","o":"crack_q_hiscore,x","oa":7104,"x":[6689]},{"a":6685,"t":"code","b":[157,80,4],"m":"sta","o":"f_0450,x","oa":1104},{"a":6688,"t":"code","b":[202],"m":"dex"},{"a":6689,"t":"code","b":[16,247],"m":"bpl","o":"b_1A1A","oa":6682},{"a":6691,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":6693,"t":"code","b":[133,157],"m":"sta","o":"music_note_index","oa":157},{"a":6695,"l":"b_1A27","t":"code","b":[32,228,255],"m":"jsr","o":"s_FFE4","oa":65508,"x":[6704]},{"a":6698,"t":"code","b":[201,76],"m":"cmp","o":"#$4C"},{"a":6700,"t":"code","b":[240,15],"m":"beq","o":"b_1A3D","oa":6717},{"a":6702,"t":"code","b":[201,82],"m":"cmp","o":"#$52"},{"a":6704,"t":"code","b":[208,245],"m":"bne","o":"b_1A27","oa":6695},{"a":6706,"t":"code","b":[32,68,229],"m":"jsr","o":"s_E544","oa":58692},{"a":6709,"t":"code","b":[169,11],"m":"lda","o":"#$0B"},{"a":6711,"t":"code","b":[141,17,208],"m":"sta","o":"vic_control1"},{"a":6714,"t":"code","b":[76,24,41],"m":"jmp","o":"hiscore_file_io","oa":10520},{"a":6717,"l":"b_1A3D","t":"code","b":[32,68,229],"m":"jsr","o":"s_E544","oa":58692,"x":[6700]},{"a":6720,"t":"code","b":[169,11],"m":"lda","o":"#$0B"},{"a":6722,"t":"code","b":[141,17,208],"m":"sta","o":"vic_control1"},{"a":6725,"t":"code","b":[169,1],"m":"lda","o":"#$01"},{"a":6727,"t":"code","b":[168],"m":"tay"},{"a":6728,"t":"code","b":[162,8],"m":"ldx","o":"#$08"},{"a":6730,"t":"code","b":[32,186,255],"m":"jsr","o":"s_FFBA","oa":65466},{"a":6733,"t":"code","b":[169,16],"m":"lda","o":"#$10"},{"a":6735,"t":"code","b":[162,62],"m":"ldx","o":"#$3E"},{"a":6737,"t":"code","b":[160,41],"m":"ldy","o":"#$29"},{"a":6739,"t":"code","b":[32,189,255],"m":"jsr","o":"s_FFBD","oa":65469},{"a":6742,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":6744,"t":"code","b":[170],"m":"tax"},{"a":6745,"t":"code","b":[160,40],"m":"ldy","o":"#$28"},{"a":6747,"t":"code","b":[32,213,255],"m":"jsr","o":"s_FFD5","oa":65493},{"a":6750,"t":"code","b":[76,0,65],"m":"jmp","o":"cold_start","oa":16640},{"a":6753,"l":"unused_1a61","c":"$1A61-$1A7F: $00 padding between crack_front_end and its text block at $1A80.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":6761,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":6769,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":6777,"t":"byte","b":[0,0,0,0,0,0,0]},{"a":6784,"l":"crack_banner","c":"Crack menu text, 40 C64 screen codes for one row, printed by crack_front_end (banner row): \"FALCON PATROL +5 AND HIGHSCORESAVER 100%\". Screen codes for the ROM lower-case set, bit 7 = reverse video.","t":"byte","b":[70,65,76,67,79,78,32,80],"x":[6509]},{"a":6792,"t":"byte","b":[65,84,82,79,76,32,43,53]},{"a":6800,"t":"byte","b":[32,65,78,68,32,72,73,71]},{"a":6808,"t":"byte","b":[72,83,67,79,82,69,83,65]},{"a":6816,"t":"byte","b":[86,69,82,32,49,48,48,37]},{"a":6824,"l":"crack_banner_rule","c":"Crack menu text, 40 C64 screen codes for one row, printed by crack_front_end (banner underline row): \"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\". Screen codes for the ROM lower-case set, bit 7 = reverse video.","t":"byte","b":[99,99,99,99,99,99,99,99]},{"a":6832,"t":"byte","b":[99,99,99,99,99,99,99,99]},{"a":6840,"t":"byte","b":[99,99,99,99,99,99,99,99]},{"a":6848,"t":"byte","b":[99,99,99,99,99,99,99,99]},{"a":6856,"t":"byte","b":[99,99,99,99,99,99,99,99]},{"a":6864,"l":"crack_menu_prompt","c":"Crack menu text, 40 C64 screen codes for one row, printed by crack_front_end (top-level prompt): \"      ~H~ighscore or ~T~rainers ??      \". Screen codes for the ROM lower-case set, bit 7 = reverse video.","t":"byte","b":[32,32,32,32,32,32,27,72]},{"a":6872,"t":"byte","b":[29,9,7,8,19,3,15,18]},{"a":6880,"t":"byte","b":[5,32,15,18,32,27,84,29]},{"a":6888,"t":"byte","b":[18,1,9,14,5,18,19,32]},{"a":6896,"t":"byte","b":[63,63,32,32,32,32,32,32]},{"a":6904,"l":"crack_q_lives","c":"Crack menu text, 40 C64 screen codes for one row, printed by crack_front_end (trainer question 1) - answering Y pokes $A5 over the DEC $1D at $417C: \"           Unlimited LIVES ??           \". Screen codes for the ROM lower-case set, bit 7 = reverse video.","t":"byte","b":[32,32,32,32,32,32,32,32],"x":[6544]},{"a":6912,"t":"byte","b":[32,32,32,85,14,12,9,13]},{"a":6920,"t":"byte","b":[9,20,5,4,32,76,73,86]},{"a":6928,"t":"byte","b":[69,83,32,63,63,32,32,32]},{"a":6936,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":6944,"l":"crack_q_gas","c":"Crack menu text, 40 C64 screen codes for one row, printed by crack_front_end (trainer question 2) - answering Y pokes $A5 over the DEC $19 at $555E: \"            Unlimited GAS ??            \". Screen codes for the ROM lower-case set, bit 7 = reverse video.","t":"byte","b":[32,32,32,32,32,32,32,32],"x":[6571]},{"a":6952,"t":"byte","b":[32,32,32,32,85,14,12,9]},{"a":6960,"t":"byte","b":[13,9,20,5,4,32,71,65]},{"a":6968,"t":"byte","b":[83,32,63,63,32,32,32,32]},{"a":6976,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":6984,"l":"crack_q_aam","c":"Crack menu text, 40 C64 screen codes for one row, printed by crack_front_end (trainer question 3) - answering Y pokes $A5 over the DEC $1C at $57DB: \"           Unlimited AAM's ??           \". Screen codes for the ROM lower-case set, bit 7 = reverse video.","t":"byte","b":[32,32,32,32,32,32,32,32],"x":[6598]},{"a":6992,"t":"byte","b":[32,32,32,85,14,12,9,13]},{"a":7000,"t":"byte","b":[9,20,5,4,32,65,65,77]},{"a":7008,"t":"byte","b":[39,19,32,63,63,32,32,32]},{"a":7016,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7024,"l":"crack_q_bases","c":"Crack menu text, 40 C64 screen codes for one row, printed by crack_front_end (trainer question 4) - answering Y pokes $4D over the branch offset at $5F71: \" REFUELLING BASES are indestructible ?? \". Screen codes for the ROM lower-case set, bit 7 = reverse video.","t":"byte","b":[32,82,69,70,85,69,76,76],"x":[6625]},{"a":7032,"t":"byte","b":[73,78,71,32,66,65,83,69]},{"a":7040,"t":"byte","b":[83,32,1,18,5,32,9,14]},{"a":7048,"t":"byte","b":[4,5,19,20,18,21,3,20]},{"a":7056,"t":"byte","b":[9,2,12,5,32,63,63,32]},{"a":7064,"l":"crack_q_collision","c":"Crack menu text, 40 C64 screen codes for one row, printed by crack_front_end (trainer question 5) - answering Y pokes $AD over the JSR opcodes at $420F and $424C: \"No collision with PLANES, SHOTS & TOWN ?\". Screen codes for the ROM lower-case set, bit 7 = reverse video.","t":"byte","b":[78,15,32,3,15,12,12,9],"x":[6652]},{"a":7072,"t":"byte","b":[19,9,15,14,32,23,9,20]},{"a":7080,"t":"byte","b":[8,32,80,76,65,78,69,83]},{"a":7088,"t":"byte","b":[44,32,83,72,79,84,83,32]},{"a":7096,"t":"byte","b":[38,32,84,79,87,78,32,63]},{"a":7104,"l":"crack_q_hiscore","c":"Crack menu text, 40 C64 screen codes for one row, printed by crack_front_end (high-score file prompt): \"   ~R~eset or ~L~oad Highscorelist ??   \". Screen codes for the ROM lower-case set, bit 7 = reverse video.","t":"byte","b":[32,32,32,27,82,29,5,19],"x":[6682]},{"a":7112,"t":"byte","b":[5,20,32,15,18,32,27,76]},{"a":7120,"t":"byte","b":[29,15,1,4,32,72,9,7]},{"a":7128,"t":"byte","b":[8,19,3,15,18,5,12,9]},{"a":7136,"t":"byte","b":[19,20,32,63,63,32,32,32]},{"a":7144,"l":"unused_1be8","c":"$1BE8-$1BFF: 24 bytes of $00 between the crack's menu text and its documents screen.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":7152,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":7160,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":7168,"l":"documents_row00","c":"Documents screen row 0, 40 C64 screen codes (ROM lower-case set, bit 7 = reverse): \"       DOCUMENTS TO FALCON PATROL       \". The whole 1024-byte block $1C00-$1FFF is copied to $0400 by crack_front_end at $1928-$193F and is the release's instruction screen - Virgin credit, the object of the game, the 100 AAMs, the vertical landing, and joystick port 1.","t":"byte","b":[32,32,32,32,32,32,32,68],"x":[6440]},{"a":7176,"t":"byte","b":[79,67,85,77,69,78,84,83]},{"a":7184,"t":"byte","b":[32,84,79,32,70,65,76,67]},{"a":7192,"t":"byte","b":[79,78,32,80,65,84,82,79]},{"a":7200,"t":"byte","b":[76,32,32,32,32,32,32,32]},{"a":7208,"l":"documents_row01","c":"Documents screen row 1, 40 C64 screen codes (ROM lower-case set, bit 7 = reverse): \"       ~~~~~~~~~~~~~~~~~~~~~~~~~~       \". The whole 1024-byte block $1C00-$1FFF is copied to $0400 by crack_front_end at $1928-$193F and is the release's instruction screen - Virgin credit, the object of the game, the 100 AAMs, the vertical landing, and joystick port 1.","t":"byte","b":[32,32,32,32,32,32,32,99]},{"a":7216,"t":"byte","b":[99,99,99,99,99,99,99,99]},{"a":7224,"t":"byte","b":[99,99,99,99,99,99,99,99]},{"a":7232,"t":"byte","b":[99,99,99,99,99,99,99,99]},{"a":7240,"t":"byte","b":[99,32,32,32,32,32,32,32]},{"a":7248,"l":"documents_row02","c":"Documents screen row 2, 40 C64 screen codes (ROM lower-case set, bit 7 = reverse): \"        (C) by Virgin Games 1983        \". The whole 1024-byte block $1C00-$1FFF is copied to $0400 by crack_front_end at $1928-$193F and is the release's instruction screen - Virgin credit, the object of the game, the 100 AAMs, the vertical landing, and joystick port 1.","t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7256,"t":"byte","b":[40,67,41,32,2,25,32,86]},{"a":7264,"t":"byte","b":[9,18,7,9,14,32,71,1]},{"a":7272,"t":"byte","b":[13,5,19,32,49,57,56,51]},{"a":7280,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7288,"l":"documents_row03","c":"Documents screen row 3, 40 C64 screen codes (ROM lower-case set, bit 7 = reverse): \"                                        \". The whole 1024-byte block $1C00-$1FFF is copied to $0400 by crack_front_end at $1928-$193F and is the release's instruction screen - Virgin credit, the object of the game, the 100 AAMs, the vertical landing, and joystick port 1.","t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7296,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7304,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7312,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7320,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7328,"l":"documents_row04","c":"Documents screen row 4, 40 C64 screen codes (ROM lower-case set, bit 7 = reverse): \"          Written by Steve Lee          \". The whole 1024-byte block $1C00-$1FFF is copied to $0400 by crack_front_end at $1928-$193F and is the release's instruction screen - Virgin credit, the object of the game, the 100 AAMs, the vertical landing, and joystick port 1.","t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7336,"t":"byte","b":[32,32,87,18,9,20,20,5]},{"a":7344,"t":"byte","b":[14,32,2,25,32,83,20,5]},{"a":7352,"t":"byte","b":[22,5,32,76,5,5,32,32]},{"a":7360,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7368,"l":"documents_row05","c":"Documents screen row 5, 40 C64 screen codes (ROM lower-case set, bit 7 = reverse): \"                                        \". The whole 1024-byte block $1C00-$1FFF is copied to $0400 by crack_front_end at $1928-$193F and is the release's instruction screen - Virgin credit, the object of the game, the 100 AAMs, the vertical landing, and joystick port 1.","t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7376,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7384,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7392,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7400,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7408,"l":"documents_row06","c":"Documents screen row 6, 40 C64 screen codes (ROM lower-case set, bit 7 = reverse): \"GAME                                    \". The whole 1024-byte block $1C00-$1FFF is copied to $0400 by crack_front_end at $1928-$193F and is the release's instruction screen - Virgin credit, the object of the game, the 100 AAMs, the vertical landing, and joystick port 1.","t":"byte","b":[71,65,77,69,32,32,32,32]},{"a":7416,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7424,"l":"documents_page_1d","c":"Page boundary inside documents_screen, at row 6 column 16 of the instruction screen: \"                        \". No separate meaning - the 1024 bytes $1C00-$1FFF are one screen image, copied to $0400 by $1928.","t":"byte","b":[32,32,32,32,32,32,32,32],"x":[6446]},{"a":7432,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7440,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7448,"l":"documents_row07","c":"Documents screen row 7, 40 C64 screen codes (ROM lower-case set, bit 7 = reverse): \"~~~~                                    \". The whole 1024-byte block $1C00-$1FFF is copied to $0400 by crack_front_end at $1928-$193F and is the release's instruction screen - Virgin credit, the object of the game, the 100 AAMs, the vertical landing, and joystick port 1.","t":"byte","b":[99,99,99,99,32,32,32,32]},{"a":7456,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7464,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7472,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7480,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7488,"l":"documents_row08","c":"Documents screen row 8, 40 C64 screen codes (ROM lower-case set, bit 7 = reverse): \"Stop the attacking jets destroying your \". The whole 1024-byte block $1C00-$1FFF is copied to $0400 by crack_front_end at $1928-$193F and is the release's instruction screen - Virgin credit, the object of the game, the 100 AAMs, the vertical landing, and joystick port 1.","t":"byte","b":[83,20,15,16,32,20,8,5]},{"a":7496,"t":"byte","b":[32,1,20,20,1,3,11,9]},{"a":7504,"t":"byte","b":[14,7,32,10,5,20,19,32]},{"a":7512,"t":"byte","b":[4,5,19,20,18,15,25,9]},{"a":7520,"t":"byte","b":[14,7,32,25,15,21,18,32]},{"a":7528,"l":"documents_row09","c":"Documents screen row 9, 40 C64 screen codes (ROM lower-case set, bit 7 = reverse): \"oil installations and refuelling bases. \". The whole 1024-byte block $1C00-$1FFF is copied to $0400 by crack_front_end at $1928-$193F and is the release's instruction screen - Virgin credit, the object of the game, the 100 AAMs, the vertical landing, and joystick port 1.","t":"byte","b":[15,9,12,32,9,14,19,20]},{"a":7536,"t":"byte","b":[1,12,12,1,20,9,15,14]},{"a":7544,"t":"byte","b":[19,32,1,14,4,32,18,5]},{"a":7552,"t":"byte","b":[6,21,5,12,12,9,14,7]},{"a":7560,"t":"byte","b":[32,2,1,19,5,19,46,32]},{"a":7568,"l":"documents_row10","c":"Documents screen row 10, 40 C64 screen codes (ROM lower-case set, bit 7 = reverse): \"You have radar and 100 AAM's. To refuel \". The whole 1024-byte block $1C00-$1FFF is copied to $0400 by crack_front_end at $1928-$193F and is the release's instruction screen - Virgin credit, the object of the game, the 100 AAMs, the vertical landing, and joystick port 1.","t":"byte","b":[89,15,21,32,8,1,22,5]},{"a":7576,"t":"byte","b":[32,18,1,4,1,18,32,1]},{"a":7584,"t":"byte","b":[14,4,32,49,48,48,32,65]},{"a":7592,"t":"byte","b":[65,77,39,19,46,32,84,15]},{"a":7600,"t":"byte","b":[32,18,5,6,21,5,12,32]},{"a":7608,"l":"documents_row11","c":"Documents screen row 11, 40 C64 screen codes (ROM lower-case set, bit 7 = reverse): \"and rearm you must land vertically on   \". The whole 1024-byte block $1C00-$1FFF is copied to $0400 by crack_front_end at $1928-$193F and is the release's instruction screen - Virgin credit, the object of the game, the 100 AAMs, the vertical landing, and joystick port 1.","t":"byte","b":[1,14,4,32,18,5,1,18]},{"a":7616,"t":"byte","b":[13,32,25,15,21,32,13,21]},{"a":7624,"t":"byte","b":[19,20,32,12,1,14,4,32]},{"a":7632,"t":"byte","b":[22,5,18,20,9,3,1,12]},{"a":7640,"t":"byte","b":[12,25,32,15,14,32,32,32]},{"a":7648,"l":"documents_row12","c":"Documents screen row 12, 40 C64 screen codes (ROM lower-case set, bit 7 = reverse): \"one of your bases. Beware, the enemy    \". The whole 1024-byte block $1C00-$1FFF is copied to $0400 by crack_front_end at $1928-$193F and is the release's instruction screen - Virgin credit, the object of the game, the 100 AAMs, the vertical landing, and joystick port 1.","t":"byte","b":[15,14,5,32,15,6,32,25]},{"a":7656,"t":"byte","b":[15,21,18,32,2,1,19,5]},{"a":7664,"t":"byte","b":[19,46,32,66,5,23,1,18]},{"a":7672,"t":"byte","b":[5,44,32,20,8,5,32,5]},{"a":7680,"l":"documents_page_1e","c":"Page boundary inside documents_screen, at row 12 column 32 of the instruction screen: \"nemy    will relish the \". No separate meaning - the 1024 bytes $1C00-$1FFF are one screen image, copied to $0400 by $1928.","t":"byte","b":[14,5,13,25,32,32,32,32],"x":[6452]},{"a":7688,"l":"documents_row13","c":"Documents screen row 13, 40 C64 screen codes (ROM lower-case set, bit 7 = reverse): \"will relish the chance to bomb you      \". The whole 1024-byte block $1C00-$1FFF is copied to $0400 by crack_front_end at $1928-$193F and is the release's instruction screen - Virgin credit, the object of the game, the 100 AAMs, the vertical landing, and joystick port 1.","t":"byte","b":[23,9,12,12,32,18,5,12]},{"a":7696,"t":"byte","b":[9,19,8,32,20,8,5,32]},{"a":7704,"t":"byte","b":[3,8,1,14,3,5,32,20]},{"a":7712,"t":"byte","b":[15,32,2,15,13,2,32,25]},{"a":7720,"t":"byte","b":[15,21,32,32,32,32,32,32]},{"a":7728,"l":"documents_row14","c":"Documents screen row 14, 40 C64 screen codes (ROM lower-case set, bit 7 = reverse): \"whilst you are vulnerable. The longer   \". The whole 1024-byte block $1C00-$1FFF is copied to $0400 by crack_front_end at $1928-$193F and is the release's instruction screen - Virgin credit, the object of the game, the 100 AAMs, the vertical landing, and joystick port 1.","t":"byte","b":[23,8,9,12,19,20,32,25]},{"a":7736,"t":"byte","b":[15,21,32,1,18,5,32,22]},{"a":7744,"t":"byte","b":[21,12,14,5,18,1,2,12]},{"a":7752,"t":"byte","b":[5,46,32,84,8,5,32,12]},{"a":7760,"t":"byte","b":[15,14,7,5,18,32,32,32]},{"a":7768,"l":"documents_row15","c":"Documents screen row 15, 40 C64 screen codes (ROM lower-case set, bit 7 = reverse): \"you survive, the more planes will attack\". The whole 1024-byte block $1C00-$1FFF is copied to $0400 by crack_front_end at $1928-$193F and is the release's instruction screen - Virgin credit, the object of the game, the 100 AAMs, the vertical landing, and joystick port 1.","t":"byte","b":[25,15,21,32,19,21,18,22]},{"a":7776,"t":"byte","b":[9,22,5,44,32,20,8,5]},{"a":7784,"t":"byte","b":[32,13,15,18,5,32,16,12]},{"a":7792,"t":"byte","b":[1,14,5,19,32,23,9,12]},{"a":7800,"t":"byte","b":[12,32,1,20,20,1,3,11]},{"a":7808,"l":"documents_row16","c":"Documents screen row 16, 40 C64 screen codes (ROM lower-case set, bit 7 = reverse): \"you in each wave.                       \". The whole 1024-byte block $1C00-$1FFF is copied to $0400 by crack_front_end at $1928-$193F and is the release's instruction screen - Virgin credit, the object of the game, the 100 AAMs, the vertical landing, and joystick port 1.","t":"byte","b":[25,15,21,32,9,14,32,5]},{"a":7816,"t":"byte","b":[1,3,8,32,23,1,22,5]},{"a":7824,"t":"byte","b":[46,32,32,32,32,32,32,32]},{"a":7832,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7840,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7848,"l":"documents_row17","c":"Documents screen row 17, 40 C64 screen codes (ROM lower-case set, bit 7 = reverse): \"                                        \". The whole 1024-byte block $1C00-$1FFF is copied to $0400 by crack_front_end at $1928-$193F and is the release's instruction screen - Virgin credit, the object of the game, the 100 AAMs, the vertical landing, and joystick port 1.","t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7856,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7864,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7872,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7880,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7888,"l":"documents_row18","c":"Documents screen row 18, 40 C64 screen codes (ROM lower-case set, bit 7 = reverse): \"CONTROLS                                \". The whole 1024-byte block $1C00-$1FFF is copied to $0400 by crack_front_end at $1928-$193F and is the release's instruction screen - Virgin credit, the object of the game, the 100 AAMs, the vertical landing, and joystick port 1.","t":"byte","b":[67,79,78,84,82,79,76,83]},{"a":7896,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7904,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7912,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7920,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7928,"l":"documents_row19","c":"Documents screen row 19, 40 C64 screen codes (ROM lower-case set, bit 7 = reverse): \"~~~~~~~~                                \". The whole 1024-byte block $1C00-$1FFF is copied to $0400 by crack_front_end at $1928-$193F and is the release's instruction screen - Virgin credit, the object of the game, the 100 AAMs, the vertical landing, and joystick port 1.","t":"byte","b":[99,99,99,99,99,99,99,99]},{"a":7936,"l":"documents_page_1f","c":"Page boundary inside documents_screen, at row 19 column 8 of the instruction screen: \"                        \". No separate meaning - the 1024 bytes $1C00-$1FFF are one screen image, copied to $0400 by $1928.","t":"byte","b":[32,32,32,32,32,32,32,32],"x":[6458]},{"a":7944,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7952,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7960,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":7968,"l":"documents_row20","c":"Documents screen row 20, 40 C64 screen codes (ROM lower-case set, bit 7 = reverse): \"Joystick control, Port 1.               \". The whole 1024-byte block $1C00-$1FFF is copied to $0400 by crack_front_end at $1928-$193F and is the release's instruction screen - Virgin credit, the object of the game, the 100 AAMs, the vertical landing, and joystick port 1.","t":"byte","b":[74,15,25,19,20,9,3,11]},{"a":7976,"t":"byte","b":[32,3,15,14,20,18,15,12]},{"a":7984,"t":"byte","b":[44,32,80,15,18,20,32,49]},{"a":7992,"t":"byte","b":[46,32,32,32,32,32,32,32]},{"a":8000,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":8008,"l":"documents_row21","c":"Documents screen row 21, 40 C64 screen codes (ROM lower-case set, bit 7 = reverse): \"Press the FIRE button to start the game.\". The whole 1024-byte block $1C00-$1FFF is copied to $0400 by crack_front_end at $1928-$193F and is the release's instruction screen - Virgin credit, the object of the game, the 100 AAMs, the vertical landing, and joystick port 1.","t":"byte","b":[80,18,5,19,19,32,20,8]},{"a":8016,"t":"byte","b":[5,32,70,73,82,69,32,2]},{"a":8024,"t":"byte","b":[21,20,20,15,14,32,20,15]},{"a":8032,"t":"byte","b":[32,19,20,1,18,20,32,20]},{"a":8040,"t":"byte","b":[8,5,32,7,1,13,5,46]},{"a":8048,"l":"documents_row22","c":"Documents screen row 22, 40 C64 screen codes (ROM lower-case set, bit 7 = reverse): \"Press the FIRE button to release AAM's. \". The whole 1024-byte block $1C00-$1FFF is copied to $0400 by crack_front_end at $1928-$193F and is the release's instruction screen - Virgin credit, the object of the game, the 100 AAMs, the vertical landing, and joystick port 1.","t":"byte","b":[80,18,5,19,19,32,20,8]},{"a":8056,"t":"byte","b":[5,32,70,73,82,69,32,2]},{"a":8064,"t":"byte","b":[21,20,20,15,14,32,20,15]},{"a":8072,"t":"byte","b":[32,18,5,12,5,1,19,5]},{"a":8080,"t":"byte","b":[32,65,65,77,39,19,46,32]},{"a":8088,"l":"documents_row23","c":"Documents screen row 23, 40 C64 screen codes (ROM lower-case set, bit 7 = reverse): \"                                        \". The whole 1024-byte block $1C00-$1FFF is copied to $0400 by crack_front_end at $1928-$193F and is the release's instruction screen - Virgin credit, the object of the game, the 100 AAMs, the vertical landing, and joystick port 1.","t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":8096,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":8104,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":8112,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":8120,"t":"byte","b":[32,32,32,32,32,32,32,32]},{"a":8128,"l":"documents_row24","c":"Documents screen row 24, 40 C64 screen codes (ROM lower-case set, bit 7 = reverse): \"       Now press ~SPACE~ to start       \". The whole 1024-byte block $1C00-$1FFF is copied to $0400 by crack_front_end at $1928-$193F and is the release's instruction screen - Virgin credit, the object of the game, the 100 AAMs, the vertical landing, and joystick port 1.","t":"byte","b":[32,32,32,32,32,32,32,78]},{"a":8136,"t":"byte","b":[15,23,32,16,18,5,19,19]},{"a":8144,"t":"byte","b":[32,27,83,80,65,67,69,29]},{"a":8152,"t":"byte","b":[32,20,15,32,19,20,1,18]},{"a":8160,"t":"byte","b":[20,32,32,32,32,32,32,32]},{"a":8168,"l":"documents_row25","c":"Documents screen row 25, 40 C64 screen codes (ROM lower-case set, bit 7 = reverse): \"@@@@@@@@@@@@@@@@@@@@@@@@\". The whole 1024-byte block $1C00-$1FFF is copied to $0400 by crack_front_end at $1928-$193F and is the release's instruction screen - Virgin credit, the object of the game, the 100 AAMs, the vertical landing, and joystick port 1.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8176,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8184,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8192,"l":"sprite_player_yaw_left","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $80 selects it. Player aircraft, frame 1 of the 7-frame yaw sequence $80-$86 that $5600 walks one step per four ticks: the aircraft in full side view with the nose to the LEFT: a long fuselage on rows 8-10 and the tail fin standing up at the right on rows 3-7. This block is not fixed - $5AD0 copies a 64-byte frame from the attitude bank at $2B00-$2C00 over it whenever the aircraft is at full left deflection, so what is here is the current left-facing attitude ($2B80, the level one, is restored by $5BA0 at the start of every life).","t":"byte","b":[0,0,0,0,0,0,0,0],"x":[23252,23461]},{"a":8200,"t":"byte","b":[0,0,0,4,0,0,12,0]},{"a":8208,"t":"byte","b":[0,28,0,0,124,11,255,252]},{"a":8216,"t":"byte","b":[35,213,238,127,255,254,255,255]},{"a":8224,"t":"byte","b":[248,0,124,0,0,0,0,0]},{"a":8232,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8240,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8248,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8256,"l":"sprite_player_yaw_l2","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $81 selects it. Player aircraft, frame 2 of the 7-frame yaw sequence $80-$86 that $5600 walks one step per four ticks: one step of the yaw animation between nose-left and head-on: the fuselage has shortened and the fin has moved inboard to columns 10-14. Fixed data - nothing rewrites it.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8264,"t":"byte","b":[0,0,0,16,0,0,16,0]},{"a":8272,"t":"byte","b":[0,48,0,0,112,0,0,240]},{"a":8280,"t":"byte","b":[7,255,240,49,255,248,23,255]},{"a":8288,"t":"byte","b":[248,15,255,192,0,48,0,0]},{"a":8296,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8304,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8312,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8320,"l":"sprite_player_yaw_l1","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $82 selects it. Player aircraft, frame 3 of the 7-frame yaw sequence $80-$86 that $5600 walks one step per four ticks: the next yaw step toward head-on: the wings are nearly symmetrical about column 12 and the fin is a short stroke at columns 15-17. Fixed data.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8328,"t":"byte","b":[0,0,0,128,0,0,128,0]},{"a":8336,"t":"byte","b":[1,128,0,1,128,0,15,192]},{"a":8344,"t":"byte","b":[0,51,192,15,243,254,2,127]},{"a":8352,"t":"byte","b":[200,0,76,64,0,64,64,0]},{"a":8360,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8368,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8376,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8384,"l":"sprite_player_head_on","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $83 selects it. Player aircraft, frame 4 of the 7-frame yaw sequence $80-$86 that $5600 walks one step per four ticks: the aircraft seen head-on/tail-on: a single vertical fin on column 12 rows 3-8 with the wings spread symmetrically on rows 9-11. This is the frame the yaw walk at $5600 settles on when vel_x is zero, and the pointer value $83 the spawn routine at $539A writes at the start of a life.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8392,"t":"byte","b":[0,0,8,0,0,8,0,0]},{"a":8400,"t":"byte","b":[8,0,0,8,0,0,28,0]},{"a":8408,"t":"byte","b":[0,227,128,63,227,254,8,255]},{"a":8416,"t":"byte","b":[136,0,156,128,0,128,128,0]},{"a":8424,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8432,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8440,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8448,"l":"sprite_player_yaw_r1","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $84 selects it. Player aircraft, frame 5 of the 7-frame yaw sequence $80-$86 that $5600 walks one step per four ticks: mirror of block $82: the first yaw step away from head-on toward the right. Fixed data.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8456,"t":"byte","b":[0,0,128,0,0,128,0,0]},{"a":8464,"t":"byte","b":[192,0,0,192,0,1,248,0]},{"a":8472,"t":"byte","b":[1,230,0,63,231,240,9,255]},{"a":8480,"t":"byte","b":[64,1,25,0,1,1,0,0]},{"a":8488,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8496,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8504,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8512,"l":"sprite_player_yaw_r2","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $85 selects it. Player aircraft, frame 6 of the 7-frame yaw sequence $80-$86 that $5600 walks one step per four ticks: mirror of block $81: the second yaw step toward nose-right. Fixed data.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8520,"t":"byte","b":[0,8,0,0,8,0,0,12]},{"a":8528,"t":"byte","b":[0,0,14,0,0,15,0,0]},{"a":8536,"t":"byte","b":[15,255,224,31,255,140,31,255]},{"a":8544,"t":"byte","b":[232,3,255,240,0,12,0,0]},{"a":8552,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8560,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8568,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8576,"l":"sprite_player_yaw_right","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $86 selects it. Player aircraft, frame 7 of the 7-frame yaw sequence $80-$86 that $5600 walks one step per four ticks: the aircraft in full side view with the nose to the RIGHT, the mirror of block $80. Like $80 it is live: $5AC4 copies a frame from the attitude bank at $2C40-$2D40 over it while the aircraft is at full right deflection, and $5BA0 restores the level frame from $2CC0 at the start of every life.","t":"byte","b":[0,0,0,0,0,0,0,0],"x":[23240,23467]},{"a":8584,"t":"byte","b":[0,32,0,0,48,0,0,56]},{"a":8592,"t":"byte","b":[0,0,62,0,0,63,255,208]},{"a":8600,"t":"byte","b":[119,171,196,127,255,254,31,255]},{"a":8608,"t":"byte","b":[255,0,62,0,0,0,0,0]},{"a":8616,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8624,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8632,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8640,"l":"sprite_87_sparse_dots","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $87 selects it. A sparse scatter of 22 set pixels over rows 9-16, the same kind of random-dot pattern as the debris frames in $88-$8F rather than an aircraft. No code in the tracked disassembly ever writes $87 to a sprite pointer: the yaw walk at $5600 clamps to $80-$86 and the explosion at $56A1/$43BC starts at $88, so this frame appears to be unused.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8648,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8656,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8664,"t":"byte","b":[0,0,0,0,136,0,0,36]},{"a":8672,"t":"byte","b":[0,2,18,0,0,73,0,0]},{"a":8680,"t":"byte","b":[132,128,0,33,64,2,90,0]},{"a":8688,"t":"byte","b":[0,128,0,0,0,0,0,0]},{"a":8696,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8704,"l":"sprite_debris_1","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $88 selects it. Debris/explosion frame 1 of 8 ($88-$8F). 61 set pixels spread over rows 7-17 in a random-dot pattern; across the eight frames the cloud starts small and dense in the middle rows and ends wide and sparse, which is what makes it read as a puff expanding and thinning rather than as a shape. Chosen in two places: $56A1 takes a random one of all eight ($D41B AND 7 plus $88) for the player's own wreck, and $43C5 takes a random one of the first four ($D41B AND 3 plus $88) for a destroyed enemy; both switch the sprite to multicolour and colour 1. This is the densest-but-smallest frame and the one the impact code at $4877 writes directly when the wreck hits the ground.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8712,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8720,"t":"byte","b":[0,0,0,0,0,2,76,0]},{"a":8728,"t":"byte","b":[1,195,128,6,136,0,1,146]},{"a":8736,"t":"byte","b":[64,25,154,64,10,200,208,4]},{"a":8744,"t":"byte","b":[49,0,17,39,64,6,12,132]},{"a":8752,"t":"byte","b":[1,137,128,0,98,128,0,0]},{"a":8760,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8768,"l":"sprite_debris_2","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $89 selects it. Debris/explosion frame 2 of 8 ($88-$8F). 83 set pixels spread over rows 4-18 in a random-dot pattern; across the eight frames the cloud starts small and dense in the middle rows and ends wide and sparse, which is what makes it read as a puff expanding and thinning rather than as a shape. Chosen in two places: $56A1 takes a random one of all eight ($D41B AND 7 plus $88) for the player's own wreck, and $43C5 takes a random one of the first four ($D41B AND 3 plus $88) for a destroyed enemy; both switch the sprite to multicolour and colour 1. ","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8776,"t":"byte","b":[0,0,0,0,0,4,0,10]},{"a":8784,"t":"byte","b":[97,0,0,0,64,2,76,192]},{"a":8792,"t":"byte","b":[1,195,144,36,134,64,5,1]},{"a":8800,"t":"byte","b":[16,32,132,136,18,78,88,33]},{"a":8808,"t":"byte","b":[100,18,8,18,216,15,52,176]},{"a":8816,"t":"byte","b":[20,177,16,9,16,32,4,66]},{"a":8824,"t":"byte","b":[128,0,0,0,0,0,0,0]},{"a":8832,"l":"sprite_debris_3","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $8A selects it. Debris/explosion frame 3 of 8 ($88-$8F). 99 set pixels spread over rows 3-19 in a random-dot pattern; across the eight frames the cloud starts small and dense in the middle rows and ends wide and sparse, which is what makes it read as a puff expanding and thinning rather than as a shape. Chosen in two places: $56A1 takes a random one of all eight ($D41B AND 7 plus $88) for the player's own wreck, and $43C5 takes a random one of the first four ($D41B AND 3 plus $88) for a destroyed enemy; both switch the sprite to multicolour and colour 1. ","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":8840,"t":"byte","b":[0,12,160,128,5,137,0,72]},{"a":8848,"t":"byte","b":[163,48,44,148,100,17,17,72]},{"a":8856,"t":"byte","b":[72,132,0,40,136,70,5,1]},{"a":8864,"t":"byte","b":[16,91,129,20,4,132,128,33]},{"a":8872,"t":"byte","b":[100,18,21,0,142,33,4,130]},{"a":8880,"t":"byte","b":[0,49,44,37,130,2,11,66]},{"a":8888,"t":"byte","b":[8,0,32,0,0,0,0,0]},{"a":8896,"l":"sprite_debris_4","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $8B selects it. Debris/explosion frame 4 of 8 ($88-$8F). 105 set pixels spread over rows 2-19 in a random-dot pattern; across the eight frames the cloud starts small and dense in the middle rows and ends wide and sparse, which is what makes it read as a puff expanding and thinning rather than as a shape. Chosen in two places: $56A1 takes a random one of all eight ($D41B AND 7 plus $88) for the player's own wreck, and $43C5 takes a random one of the first four ($D41B AND 3 plus $88) for a destroyed enemy; both switch the sprite to multicolour and colour 1. $43C5 picks one of $88-$8B at random for a destroyed enemy, so the enemy debris only ever uses the first four frames.","t":"byte","b":[0,0,0,0,0,0,2,67]},{"a":8904,"t":"byte","b":[0,12,128,16,34,39,16,41]},{"a":8912,"t":"byte","b":[198,44,68,9,4,32,128,16]},{"a":8920,"t":"byte","b":[147,4,120,66,1,1,17,8]},{"a":8928,"t":"byte","b":[8,136,64,128,32,128,17,100]},{"a":8936,"t":"byte","b":[32,66,147,210,81,68,17,65]},{"a":8944,"t":"byte","b":[51,196,128,68,34,56,4,69]},{"a":8952,"t":"byte","b":[192,32,32,128,0,0,0,0]},{"a":8960,"l":"sprite_debris_5","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $8C selects it. Debris/explosion frame 5 of 8 ($88-$8F). 75 set pixels spread over rows 0-20 in a random-dot pattern; across the eight frames the cloud starts small and dense in the middle rows and ends wide and sparse, which is what makes it read as a puff expanding and thinning rather than as a shape. Chosen in two places: $56A1 takes a random one of all eight ($D41B AND 7 plus $88) for the player's own wreck, and $43C5 takes a random one of the first four ($D41B AND 3 plus $88) for a destroyed enemy; both switch the sprite to multicolour and colour 1. ","t":"byte","b":[4,12,32,0,145,129,4,4]},{"a":8968,"t":"byte","b":[12,32,64,130,34,16,1,4]},{"a":8976,"t":"byte","b":[32,66,33,0,16,136,2,0]},{"a":8984,"t":"byte","b":[32,0,2,4,0,32,68,4]},{"a":8992,"t":"byte","b":[8,8,0,64,32,128,17,2]},{"a":9000,"t":"byte","b":[32,128,128,18,64,8,4,48]},{"a":9008,"t":"byte","b":[15,2,16,8,67,2,96,136]},{"a":9016,"t":"byte","b":[32,0,132,0,0,32,0,0]},{"a":9024,"l":"sprite_debris_6","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $8D selects it. Debris/explosion frame 6 of 8 ($88-$8F). 67 set pixels spread over rows 0-20 in a random-dot pattern; across the eight frames the cloud starts small and dense in the middle rows and ends wide and sparse, which is what makes it read as a puff expanding and thinning rather than as a shape. Chosen in two places: $56A1 takes a random one of all eight ($D41B AND 7 plus $88) for the player's own wreck, and $43C5 takes a random one of the first four ($D41B AND 3 plus $88) for a destroyed enemy; both switch the sprite to multicolour and colour 1. ","t":"byte","b":[65,2,4,16,33,16,0,20]},{"a":9032,"t":"byte","b":[8,1,1,0,64,128,128,4]},{"a":9040,"t":"byte","b":[0,8,4,0,97,0,64,0]},{"a":9048,"t":"byte","b":[8,2,0,66,0,12,0,8]},{"a":9056,"t":"byte","b":[0,0,8,2,176,44,4,0]},{"a":9064,"t":"byte","b":[0,120,0,160,0,0,16,32]},{"a":9072,"t":"byte","b":[72,0,8,64,224,4,2,1]},{"a":9080,"t":"byte","b":[0,32,65,4,24,24,40,0]},{"a":9088,"l":"sprite_debris_7","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $8E selects it. Debris/explosion frame 7 of 8 ($88-$8F). 36 set pixels spread over rows 0-20 in a random-dot pattern; across the eight frames the cloud starts small and dense in the middle rows and ends wide and sparse, which is what makes it read as a puff expanding and thinning rather than as a shape. Chosen in two places: $56A1 takes a random one of all eight ($D41B AND 7 plus $88) for the player's own wreck, and $43C5 takes a random one of the first four ($D41B AND 3 plus $88) for a destroyed enemy; both switch the sprite to multicolour and colour 1. ","t":"byte","b":[4,4,2,0,0,128,8,16]},{"a":9096,"t":"byte","b":[0,0,32,8,0,0,0,0]},{"a":9104,"t":"byte","b":[64,0,1,128,0,195,0,4]},{"a":9112,"t":"byte","b":[0,4,32,4,8,1,0,16]},{"a":9120,"t":"byte","b":[0,1,0,32,0,0,192,8]},{"a":9128,"t":"byte","b":[0,4,0,0,0,0,64,0]},{"a":9136,"t":"byte","b":[0,1,128,4,0,0,128,4]},{"a":9144,"t":"byte","b":[0,0,0,16,0,64,0,0]},{"a":9152,"l":"sprite_debris_8","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $8F selects it. Debris/explosion frame 8 of 8 ($88-$8F). 20 set pixels spread over rows 0-19 in a random-dot pattern; across the eight frames the cloud starts small and dense in the middle rows and ends wide and sparse, which is what makes it read as a puff expanding and thinning rather than as a shape. Chosen in two places: $56A1 takes a random one of all eight ($D41B AND 7 plus $88) for the player's own wreck, and $43C5 takes a random one of the first four ($D41B AND 3 plus $88) for a destroyed enemy; both switch the sprite to multicolour and colour 1. Last and faintest frame; the pointer reaching $90 (a blank block) is what $5643 uses to decide the life has ended.","t":"byte","b":[0,16,0,0,0,0,1,128]},{"a":9160,"t":"byte","b":[3,4,0,0,0,4,0,0]},{"a":9168,"t":"byte","b":[0,0,0,0,192,0,0,0]},{"a":9176,"t":"byte","b":[0,32,0,0,0,2,8,0]},{"a":9184,"t":"byte","b":[0,128,0,0,0,16,0,0]},{"a":9192,"t":"byte","b":[128,0,0,0,0,0,2,0]},{"a":9200,"t":"byte","b":[0,4,1,0,0,0,1,0]},{"a":9208,"t":"byte","b":[0,0,16,0,0,0,0,0]},{"a":9216,"l":"sprite_exhaust_0","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $90 selects it. Exhaust plume frame 0: entirely blank (all 64 bytes zero), so the plume is invisible on this frame. $56E5 starts sprite 7's pointer here and $56F0 cycles it $90-$93; $5643 also uses 'sprite 0 pointer has reached $90' as the signal that the player's explosion has finished and the life is over.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9224,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9232,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9240,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9248,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9256,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9264,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9272,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9280,"l":"sprite_exhaust_1","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $91 selects it. Exhaust plume frame 1 of the 4-frame cycle $90-$93 that $56E0-$56F0 runs on sprite 7 (enabled by $D015 bit 7 at $56D8 and positioned by $505A through $D00E/$D00F). 42 set pixels over rows 4-12 - a loose dot cluster that grows and drifts right across the cycle, reading as the jet's exhaust smoke.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9288,"t":"byte","b":[0,0,0,0,0,16,0,0]},{"a":9296,"t":"byte","b":[28,0,1,148,0,0,145,192]},{"a":9304,"t":"byte","b":[0,56,224,13,36,82,1,23]},{"a":9312,"t":"byte","b":[16,12,68,32,1,24,128,0]},{"a":9320,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9328,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9336,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9344,"l":"sprite_exhaust_2","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $92 selects it. Exhaust plume frame 2 of the 4-frame cycle $90-$93 that $56E0-$56F0 runs on sprite 7 (enabled by $D015 bit 7 at $56D8 and positioned by $505A through $D00E/$D00F). 43 set pixels over rows 4-13 - a loose dot cluster that grows and drifts right across the cycle, reading as the jet's exhaust smoke.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9352,"t":"byte","b":[0,0,0,0,0,4,0,0]},{"a":9360,"t":"byte","b":[56,0,0,101,0,2,71,0]},{"a":9368,"t":"byte","b":[0,227,128,1,8,48,12,49]},{"a":9376,"t":"byte","b":[32,3,17,8,0,33,208,0]},{"a":9384,"t":"byte","b":[200,128,0,0,0,0,0,0]},{"a":9392,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9400,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9408,"l":"sprite_exhaust_3","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $93 selects it. Exhaust plume frame 3 of the 4-frame cycle $90-$93 that $56E0-$56F0 runs on sprite 7 (enabled by $D015 bit 7 at $56D8 and positioned by $505A through $D00E/$D00F). 53 set pixels over rows 4-13 - a loose dot cluster that grows and drifts right across the cycle, reading as the jet's exhaust smoke.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9416,"t":"byte","b":[0,0,0,0,0,88,0,0]},{"a":9424,"t":"byte","b":[130,64,0,200,192,19,145,192]},{"a":9432,"t":"byte","b":[8,84,96,2,25,16,6,132]},{"a":9440,"t":"byte","b":[72,2,59,16,8,184,16,0]},{"a":9448,"t":"byte","b":[50,32,0,0,0,0,0,0]},{"a":9456,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9464,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9472,"l":"sprite_enemy_a0","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $94 selects it. Enemy jet, attitude 0 of the 5-frame set $94-$98 (nose to the LEFT). 117 set pixels over rows 7-18: the delta extends furthest both above and below the fuselage - the steepest attitude on this side. $4367-$4390 walks the pointer through this set one step at a time; $4392 adds 5 when wave_direction ($60) is negative, which selects the mirrored set $99-$9D instead. The enemy sprites are drawn hires in colour 2 with multicolour cleared ($435C/$4364).","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9480,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9488,"t":"byte","b":[0,0,0,0,0,0,1,224]},{"a":9496,"t":"byte","b":[0,3,224,2,15,240,7,170]},{"a":9504,"t":"byte","b":[238,33,255,190,111,255,234,7]},{"a":9512,"t":"byte","b":[170,254,3,63,248,2,15,240]},{"a":9520,"t":"byte","b":[0,7,224,0,3,224,0,1]},{"a":9528,"t":"byte","b":[224,0,0,0,0,0,0,0]},{"a":9536,"l":"sprite_enemy_a1","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $95 selects it. Enemy jet, attitude 1 of the 5-frame set $94-$98 (nose to the LEFT). 105 set pixels over rows 8-16: the delta is part-open above and below the fuselage - a moderate attitude on this side. $4367-$4390 walks the pointer through this set one step at a time; $4392 adds 5 when wave_direction ($60) is negative, which selects the mirrored set $99-$9D instead. The enemy sprites are drawn hires in colour 2 with multicolour cleared ($435C/$4364).","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9544,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9552,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9560,"t":"byte","b":[0,1,238,2,7,222,31,254]},{"a":9568,"t":"byte","b":[190,35,255,234,110,171,254,7]},{"a":9576,"t":"byte","b":[255,252,2,31,240,0,7,224]},{"a":9584,"t":"byte","b":[0,1,224,0,0,0,0,0]},{"a":9592,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9600,"l":"sprite_enemy_a2","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $96 selects it. Enemy jet, attitude 2 of the 5-frame set $94-$98 (nose to the LEFT). 97 set pixels over rows 6-14: the delta is edge-on: a plain lens-shaped fuselage on rows 10-13 with only a short fin above it. This is the rest attitude - $4376 walks the pointer back to $96 whenever the aircraft's manoeuvre byte ($5B,X) is zero, and $439E forces it when enemy_state is in $D0-$DF. $4367-$4390 walks the pointer through this set one step at a time; $4392 adds 5 when wave_direction ($60) is negative, which selects the mirrored set $99-$9D instead. The enemy sprites are drawn hires in colour 2 with multicolour cleared ($435C/$4364).","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9608,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9616,"t":"byte","b":[0,0,0,0,6,0,0,14]},{"a":9624,"t":"byte","b":[0,0,30,0,0,254,15,255]},{"a":9632,"t":"byte","b":[254,39,255,254,127,255,252,7]},{"a":9640,"t":"byte","b":[255,240,0,31,192,0,0,0]},{"a":9648,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9656,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9664,"l":"sprite_enemy_a3","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $97 selects it. Enemy jet, attitude 3 of the 5-frame set $94-$98 (nose to the LEFT). 123 set pixels over rows 6-16: the delta is part-open on the other side of level - the mirror-sense partner of $95. $4367-$4390 walks the pointer through this set one step at a time; $4392 adds 5 when wave_direction ($60) is negative, which selects the mirrored set $99-$9D instead. The enemy sprites are drawn hires in colour 2 with multicolour cleared ($435C/$4364).","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9672,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9680,"t":"byte","b":[0,0,0,1,224,0,3,224]},{"a":9688,"t":"byte","b":[2,7,238,3,239,246,10,191]},{"a":9696,"t":"byte","b":[254,63,255,254,127,255,254,2]},{"a":9704,"t":"byte","b":[255,248,0,15,224,0,3,224]},{"a":9712,"t":"byte","b":[0,1,224,0,0,0,0,0]},{"a":9720,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9728,"l":"sprite_enemy_a4","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $98 selects it. Enemy jet, attitude 4 of the 5-frame set $94-$98 (nose to the LEFT). 154 set pixels over rows 4-17: the delta is fully open on the other side of level - the steepest attitude the other way. $4367-$4390 walks the pointer through this set one step at a time; $4392 adds 5 when wave_direction ($60) is negative, which selects the mirrored set $99-$9D instead. The enemy sprites are drawn hires in colour 2 with multicolour cleared ($435C/$4364).","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9736,"t":"byte","b":[0,0,0,0,0,1,224,0]},{"a":9744,"t":"byte","b":[3,224,0,7,224,0,15,240]},{"a":9752,"t":"byte","b":[3,63,250,3,255,254,15,255]},{"a":9760,"t":"byte","b":[254,63,255,254,87,255,252,3]},{"a":9768,"t":"byte","b":[255,248,1,63,240,0,7,224]},{"a":9776,"t":"byte","b":[0,3,224,0,1,224,0,0]},{"a":9784,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9792,"l":"sprite_enemy_b0","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $99 selects it. Enemy jet, attitude 0 of the mirrored 5-frame set $99-$9D (nose to the RIGHT); pixel-for-pixel the horizontal mirror of block $94. 117 set pixels over rows 7-18. $4392 selects this half of the table by adding 5 to the pointer when wave_direction ($60) is negative, so a wave coming from the other side flies the other way round.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9800,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9808,"t":"byte","b":[0,0,0,0,0,7,128,0]},{"a":9816,"t":"byte","b":[7,192,0,15,240,64,119,85]},{"a":9824,"t":"byte","b":[224,125,255,132,87,255,246,127]},{"a":9832,"t":"byte","b":[85,224,31,252,192,15,240,64]},{"a":9840,"t":"byte","b":[7,224,0,7,192,0,7,128]},{"a":9848,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9856,"l":"sprite_enemy_b1","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $9A selects it. Enemy jet, attitude 1 of the mirrored 5-frame set $99-$9D (nose to the RIGHT); pixel-for-pixel the horizontal mirror of block $95. 105 set pixels over rows 8-16. $4392 selects this half of the table by adding 5 to the pointer when wave_direction ($60) is negative, so a wave coming from the other side flies the other way round.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9864,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9872,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9880,"t":"byte","b":[119,128,0,123,224,64,125,127]},{"a":9888,"t":"byte","b":[248,87,255,196,127,213,118,63]},{"a":9896,"t":"byte","b":[255,224,15,248,64,7,224,0]},{"a":9904,"t":"byte","b":[7,128,0,0,0,0,0,0]},{"a":9912,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9920,"l":"sprite_enemy_b2","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $9B selects it. Enemy jet, attitude 2 of the mirrored 5-frame set $99-$9D (nose to the RIGHT); pixel-for-pixel the horizontal mirror of block $96. 97 set pixels over rows 6-14. $4392 selects this half of the table by adding 5 to the pointer when wave_direction ($60) is negative, so a wave coming from the other side flies the other way round.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9928,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9936,"t":"byte","b":[0,0,96,0,0,112,0,0]},{"a":9944,"t":"byte","b":[120,0,0,127,0,0,127,255]},{"a":9952,"t":"byte","b":[240,127,255,228,63,255,254,15]},{"a":9960,"t":"byte","b":[255,224,3,248,0,0,0,0]},{"a":9968,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9976,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9984,"l":"sprite_enemy_b3","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $9C selects it. Enemy jet, attitude 3 of the mirrored 5-frame set $99-$9D (nose to the RIGHT); pixel-for-pixel the horizontal mirror of block $97. 123 set pixels over rows 6-16. $4392 selects this half of the table by adding 5 to the pointer when wave_direction ($60) is negative, so a wave coming from the other side flies the other way round.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":9992,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":10000,"t":"byte","b":[0,0,7,128,0,7,192,0]},{"a":10008,"t":"byte","b":[119,224,64,111,247,192,127,253]},{"a":10016,"t":"byte","b":[80,127,255,252,127,255,254,31]},{"a":10024,"t":"byte","b":[255,64,7,240,0,7,192,0]},{"a":10032,"t":"byte","b":[7,128,0,0,0,0,0,0]},{"a":10040,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":10048,"l":"sprite_enemy_b4","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $9D selects it. Enemy jet, attitude 4 of the mirrored 5-frame set $99-$9D (nose to the RIGHT); pixel-for-pixel the horizontal mirror of block $98. 154 set pixels over rows 4-17. $4392 selects this half of the table by adding 5 to the pointer when wave_direction ($60) is negative, so a wave coming from the other side flies the other way round.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":10056,"t":"byte","b":[0,0,0,0,7,128,0,7]},{"a":10064,"t":"byte","b":[192,0,7,224,0,15,240,0]},{"a":10072,"t":"byte","b":[95,252,192,127,255,192,127,255]},{"a":10080,"t":"byte","b":[240,127,255,252,63,255,234,31]},{"a":10088,"t":"byte","b":[255,192,15,252,128,7,224,0]},{"a":10096,"t":"byte","b":[7,192,0,7,128,0,0,0]},{"a":10104,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":10112,"l":"sprite_bomb","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $9E selects it. A single small blob - %d set pixels on rows %d-%d, about 11 pixels wide and 3 rows tall. This is the block the cold start at $410C writes into both $07FD and $07FE, the pointers for sprites 5 and 6, and sprites 5 and 6 are the two enemy bombs tracked by the records at $A0-$A9 (the collision handler at $4218-$4227 cancels a bomb by clearing $A8/$A9 when bit 5 or 6 of $D01E is set). Never rewritten.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":10120,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":10128,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":10136,"t":"byte","b":[0,0,0,1,255,0,3,255]},{"a":10144,"t":"byte","b":[128,1,255,0,0,0,0,0]},{"a":10152,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":10160,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":10168,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":10176,"l":"sprite_9f_blank","c":"24x21 hires sprite bitmap, 63 of 64 bytes used; VIC bank 0, so sprite pointer $9F selects it. Effectively blank: one stray byte ($0D at $27C0) and 63 zeros, which renders as four pixels on the top row. No sprite pointer in the tracked code is ever set to $9F. Most likely slack at the end of the sprite area rather than a shape.","t":"byte","b":[13,0,0,0,0,0,0,0]},{"a":10184,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":10192,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":10200,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":10208,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":10216,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":10224,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":10232,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":10240,"l":"hiscore_entry1","c":"Saved high-score entry 1, 17 bytes: five score digits at +$00 and a twelve-character name at +$05, both in the game's own alphabet (digits $00-$09, letters $81-$9A, '_' $9B, space $20). $2855 stamps it onto title screen row 5 and $28C0/$28E3 reads it back off the screen before saving. In this image all five entries are blank - the file had just been reset. Part of the Remember crack's high-score saver, which writes $2800-$2854 to disk.","t":"byte","b":[0,0,0,0,0],"x":[10327,10435]},{"a":10245,"l":"hiscore_name1","c":"Twelve-character name of saved high-score entry 1, in the game's own alphabet ($81-$9A letters, $9B underscore, $20 space). $287A copies it onto title screen row 5 columns 21-32 and $28E3 reads it back off the screen before the file is written. Blank in this image.","t":"byte","b":[32,32,32,32,32,32,32,32],"x":[10362,10470]},{"a":10253,"t":"byte","b":[32,32,32,32]},{"a":10257,"l":"hiscore_entry2","c":"Saved high-score entry 2, 17 bytes: five score digits at +$00 and a twelve-character name at +$05, both in the game's own alphabet (digits $00-$09, letters $81-$9A, '_' $9B, space $20). $2855 stamps it onto title screen row 7 and $28C0/$28E3 reads it back off the screen before saving. In this image all five entries are blank - the file had just been reset. Part of the Remember crack's high-score saver, which writes $2800-$2854 to disk.","t":"byte","b":[0,0,0,0,0],"x":[10333,10441]},{"a":10262,"l":"hiscore_name2","c":"Twelve-character name of saved high-score entry 2, in the game's own alphabet ($81-$9A letters, $9B underscore, $20 space). $287A copies it onto title screen row 7 columns 21-32 and $28E3 reads it back off the screen before the file is written. Blank in this image.","t":"byte","b":[32,32,32,32,32,32,32,32],"x":[10368,10476]},{"a":10270,"t":"byte","b":[32,32,32,32]},{"a":10274,"l":"hiscore_entry3","c":"Saved high-score entry 3, 17 bytes: five score digits at +$00 and a twelve-character name at +$05, both in the game's own alphabet (digits $00-$09, letters $81-$9A, '_' $9B, space $20). $2855 stamps it onto title screen row 9 and $28C0/$28E3 reads it back off the screen before saving. In this image all five entries are blank - the file had just been reset. Part of the Remember crack's high-score saver, which writes $2800-$2854 to disk.","t":"byte","b":[0,0,0,0,0],"x":[10339,10447]},{"a":10279,"l":"hiscore_name3","c":"Twelve-character name of saved high-score entry 3, in the game's own alphabet ($81-$9A letters, $9B underscore, $20 space). $287A copies it onto title screen row 9 columns 21-32 and $28E3 reads it back off the screen before the file is written. Blank in this image.","t":"byte","b":[32,32,32,32,32,32,32,32],"x":[10374,10482]},{"a":10287,"t":"byte","b":[32,32,32,32]},{"a":10291,"l":"hiscore_entry4","c":"Saved high-score entry 4, 17 bytes: five score digits at +$00 and a twelve-character name at +$05, both in the game's own alphabet (digits $00-$09, letters $81-$9A, '_' $9B, space $20). $2855 stamps it onto title screen row 11 and $28C0/$28E3 reads it back off the screen before saving. In this image all five entries are blank - the file had just been reset. Part of the Remember crack's high-score saver, which writes $2800-$2854 to disk.","t":"byte","b":[0,0,0,0,0],"x":[10345,10453]},{"a":10296,"l":"hiscore_name4","c":"Twelve-character name of saved high-score entry 4, in the game's own alphabet ($81-$9A letters, $9B underscore, $20 space). $287A copies it onto title screen row 11 columns 21-32 and $28E3 reads it back off the screen before the file is written. Blank in this image.","t":"byte","b":[32,32,32,32,32,32,32,32],"x":[10380,10488]},{"a":10304,"t":"byte","b":[32,32,32,32]},{"a":10308,"l":"hiscore_entry5","c":"Saved high-score entry 5, 17 bytes: five score digits at +$00 and a twelve-character name at +$05, both in the game's own alphabet (digits $00-$09, letters $81-$9A, '_' $9B, space $20). $2855 stamps it onto title screen row 13 and $28C0/$28E3 reads it back off the screen before saving. In this image all five entries are blank - the file had just been reset. Part of the Remember crack's high-score saver, which writes $2800-$2854 to disk.","t":"byte","b":[0,0,0,0,0],"x":[10351,10459]},{"a":10313,"l":"hiscore_name5","c":"Twelve-character name of saved high-score entry 5, in the game's own alphabet ($81-$9A letters, $9B underscore, $20 space). $287A copies it onto title screen row 13 columns 21-32 and $28E3 reads it back off the screen before the file is written. Blank in this image.","t":"byte","b":[32,32,32,32,32,32,32,32],"x":[10386,10494]},{"a":10321,"t":"byte","b":[32,32,32,32]},{"a":10325,"l":"hiscore_table_to_screen","c":"Copy the five saved high-score entries onto the title screen. In: the table at $2800 (5 x 17 bytes). Out: the five score fields at $08D2/$0922/$0972/$09C2/$0A12 (5 digits each) and the five name fields at $08DD/$092D/$097D/$09CD/$0A1D (12 characters each) - i.e. title screen rows 5, 7, 9, 11 and 13, columns 10-14 and 21-32. No other side effects. Called once from $46B9 as the title screen is built. Remember crack code, not the original game.","t":"code","b":[162,4],"m":"ldx","o":"#$04","x":[18105]},{"a":10327,"l":"b_2857","t":"code","b":[189,0,40],"m":"lda","o":"hiscore_entry1,x","oa":10240,"x":[10358]},{"a":10330,"t":"code","b":[157,210,8],"m":"sta","o":"title_rank1_score,x","oa":2258},{"a":10333,"t":"code","b":[189,17,40],"m":"lda","o":"hiscore_entry2,x","oa":10257},{"a":10336,"t":"code","b":[157,34,9],"m":"sta","o":"title_rank2_score,x","oa":2338},{"a":10339,"t":"code","b":[189,34,40],"m":"lda","o":"hiscore_entry3,x","oa":10274},{"a":10342,"t":"code","b":[157,114,9],"m":"sta","o":"title_rank3_score,x","oa":2418},{"a":10345,"t":"code","b":[189,51,40],"m":"lda","o":"hiscore_entry4,x","oa":10291},{"a":10348,"t":"code","b":[157,194,9],"m":"sta","o":"title_rank4_score,x","oa":2498},{"a":10351,"t":"code","b":[189,68,40],"m":"lda","o":"hiscore_entry5,x","oa":10308},{"a":10354,"t":"code","b":[157,18,10],"m":"sta","o":"title_rank5_score,x","oa":2578},{"a":10357,"t":"code","b":[202],"m":"dex"},{"a":10358,"t":"code","b":[16,223],"m":"bpl","o":"b_2857","oa":10327},{"a":10360,"t":"code","b":[162,11],"m":"ldx","o":"#$0B"},{"a":10362,"l":"b_287A","t":"code","b":[189,5,40],"m":"lda","o":"hiscore_name1,x","oa":10245,"x":[10393]},{"a":10365,"t":"code","b":[157,221,8],"m":"sta","o":"title_rank1_name,x","oa":2269},{"a":10368,"t":"code","b":[189,22,40],"m":"lda","o":"hiscore_name2,x","oa":10262},{"a":10371,"t":"code","b":[157,45,9],"m":"sta","o":"title_rank2_name,x","oa":2349},{"a":10374,"t":"code","b":[189,39,40],"m":"lda","o":"hiscore_name3,x","oa":10279},{"a":10377,"t":"code","b":[157,125,9],"m":"sta","o":"title_rank3_name,x","oa":2429},{"a":10380,"t":"code","b":[189,56,40],"m":"lda","o":"hiscore_name4,x","oa":10296},{"a":10383,"t":"code","b":[157,205,9],"m":"sta","o":"title_rank4_name,x","oa":2509},{"a":10386,"t":"code","b":[189,73,40],"m":"lda","o":"hiscore_name5,x","oa":10313},{"a":10389,"t":"code","b":[157,29,10],"m":"sta","o":"title_rank5_name,x","oa":2589},{"a":10392,"t":"code","b":[202],"m":"dex"},{"a":10393,"t":"code","b":[16,223],"m":"bpl","o":"b_287A","oa":10362},{"a":10395,"t":"code","b":[96],"m":"rts"},{"a":10396,"t":"gap","n":4},{"a":10400,"l":"hiscore_save_to_disk","c":"Hand the machine back to the KERNAL and save the high-score table to disk. SEI; restore the IRQ vector $0314/$0315 to $EA31; $D01A = $F0 and $DC0D = $00; $D011 = $0B (screen off); JSR $FDA3 (IOINIT); CLI. Then read the five high-score entries back out of the title screen ($08D2... and $08DD...) into $2800-$2854, copy the 32-byte KERNAL vector table from $FD30 to $0314-$0333, zero $90-$FF, and fall into $2918: SETLFS 1,8,1, SETNAM with the 19-byte name at $293B ('@S:F.PATROL HI /REM'), $FB/$FC = $2800 and SAVE ($FFD8) up to $2855, then JMP $4100 to restart the game. Called from $4D73 once a name has been entered; the crack's own trainer menu pokes $AD over that JSR at $1989 when trainers are chosen, which is how picking trainers disables the saver. $1A3A also jumps straight into $2918 to write a fresh empty file when the player answers 'R' at the boot menu.","t":"code","b":[120],"m":"sei","x":[19827]},{"a":10401,"t":"code","b":[169,49],"m":"lda","o":"#$31"},{"a":10403,"t":"code","b":[141,20,3],"m":"sta","o":"irq_vector_lo","oa":788},{"a":10406,"t":"code","b":[169,234],"m":"lda","o":"#$EA"},{"a":10408,"t":"code","b":[141,21,3],"m":"sta","o":"irq_vector_hi","oa":789},{"a":10411,"t":"code","b":[169,240],"m":"lda","o":"#$F0"},{"a":10413,"t":"code","b":[141,26,208],"m":"sta","o":"vic_irq_enable"},{"a":10416,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":10418,"t":"code","b":[141,13,220],"m":"sta","o":"cia1_interrupt"},{"a":10421,"t":"code","b":[169,11],"m":"lda","o":"#$0B"},{"a":10423,"t":"code","b":[141,17,208],"m":"sta","o":"vic_control1"},{"a":10426,"t":"code","b":[32,163,253],"m":"jsr","o":"s_FDA3","oa":64931},{"a":10429,"t":"code","b":[88],"m":"cli"},{"a":10430,"t":"code","b":[162,4],"m":"ldx","o":"#$04"},{"a":10432,"l":"b_28C0","t":"code","b":[189,210,8],"m":"lda","o":"title_rank1_score,x","oa":2258,"x":[10463]},{"a":10435,"t":"code","b":[157,0,40],"m":"sta","o":"hiscore_entry1,x","oa":10240},{"a":10438,"t":"code","b":[189,34,9],"m":"lda","o":"title_rank2_score,x","oa":2338},{"a":10441,"t":"code","b":[157,17,40],"m":"sta","o":"hiscore_entry2,x","oa":10257},{"a":10444,"t":"code","b":[189,114,9],"m":"lda","o":"title_rank3_score,x","oa":2418},{"a":10447,"t":"code","b":[157,34,40],"m":"sta","o":"hiscore_entry3,x","oa":10274},{"a":10450,"t":"code","b":[189,194,9],"m":"lda","o":"title_rank4_score,x","oa":2498},{"a":10453,"t":"code","b":[157,51,40],"m":"sta","o":"hiscore_entry4,x","oa":10291},{"a":10456,"t":"code","b":[189,18,10],"m":"lda","o":"title_rank5_score,x","oa":2578},{"a":10459,"t":"code","b":[157,68,40],"m":"sta","o":"hiscore_entry5,x","oa":10308},{"a":10462,"t":"code","b":[202],"m":"dex"},{"a":10463,"t":"code","b":[16,223],"m":"bpl","o":"b_28C0","oa":10432},{"a":10465,"t":"code","b":[162,11],"m":"ldx","o":"#$0B"},{"a":10467,"l":"b_28E3","t":"code","b":[189,221,8],"m":"lda","o":"title_rank1_name,x","oa":2269,"x":[10498]},{"a":10470,"t":"code","b":[157,5,40],"m":"sta","o":"hiscore_name1,x","oa":10245},{"a":10473,"t":"code","b":[189,45,9],"m":"lda","o":"title_rank2_name,x","oa":2349},{"a":10476,"t":"code","b":[157,22,40],"m":"sta","o":"hiscore_name2,x","oa":10262},{"a":10479,"t":"code","b":[189,125,9],"m":"lda","o":"title_rank3_name,x","oa":2429},{"a":10482,"t":"code","b":[157,39,40],"m":"sta","o":"hiscore_name3,x","oa":10279},{"a":10485,"t":"code","b":[189,205,9],"m":"lda","o":"title_rank4_name,x","oa":2509},{"a":10488,"t":"code","b":[157,56,40],"m":"sta","o":"hiscore_name4,x","oa":10296},{"a":10491,"t":"code","b":[189,29,10],"m":"lda","o":"title_rank5_name,x","oa":2589},{"a":10494,"t":"code","b":[157,73,40],"m":"sta","o":"hiscore_name5,x","oa":10313},{"a":10497,"t":"code","b":[202],"m":"dex"},{"a":10498,"t":"code","b":[16,223],"m":"bpl","o":"b_28E3","oa":10467},{"a":10500,"t":"code","b":[162,31],"m":"ldx","o":"#$1F"},{"a":10502,"l":"b_2906","t":"code","b":[189,48,253],"m":"lda","o":"f_FD30,x","oa":64816,"x":[10509]},{"a":10505,"t":"code","b":[157,20,3],"m":"sta","o":"irq_vector_lo,x","oa":788},{"a":10508,"t":"code","b":[202],"m":"dex"},{"a":10509,"t":"code","b":[16,247],"m":"bpl","o":"b_2906","oa":10502},{"a":10511,"t":"code","b":[162,111],"m":"ldx","o":"#$6F"},{"a":10513,"l":"b_2911","t":"code","b":[169,0],"m":"lda","o":"#$00","x":[10518]},{"a":10515,"t":"code","b":[149,144],"m":"sta","o":"zp_90_crack_clear,x","oa":144},{"a":10517,"t":"code","b":[202],"m":"dex"},{"a":10518,"t":"code","b":[16,249],"m":"bpl","o":"b_2911","oa":10513},{"a":10520,"l":"hiscore_file_io","c":"Entry point for the KERNAL file calls of the crack's high-score saver, reached by falling through from $28A0 and jumped to directly from $1A3A when the boot menu's 'R' (reset the high-score list) is chosen. SETLFS 1,8,1; SETNAM 19 characters at $293B ('@S:F.PATROL HI /REM'); $FB/$FC = $2800; SAVE ($FFD8) from ($FB) to $2855, i.e. the 85-byte table; then JMP $4100 to cold-start the game. The matching load is at $1A45 in the crack's menu, which uses the same name without the '@S:' prefix.","t":"code","b":[169,1],"m":"lda","o":"#$01","x":[6714]},{"a":10522,"t":"code","b":[168],"m":"tay"},{"a":10523,"t":"code","b":[162,8],"m":"ldx","o":"#$08"},{"a":10525,"t":"code","b":[32,186,255],"m":"jsr","o":"s_FFBA","oa":65466},{"a":10528,"t":"code","b":[169,19],"m":"lda","o":"#$13"},{"a":10530,"t":"code","b":[162,59],"m":"ldx","o":"#$3B"},{"a":10532,"t":"code","b":[160,41],"m":"ldy","o":"#$29"},{"a":10534,"t":"code","b":[32,189,255],"m":"jsr","o":"s_FFBD","oa":65469},{"a":10537,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":10539,"t":"code","b":[133,251],"m":"sta","o":"save_ptr","oa":251},{"a":10541,"t":"code","b":[160,40],"m":"ldy","o":"#$28"},{"a":10543,"t":"code","b":[132,252],"m":"sty","o":"save_ptr_hi","oa":252},{"a":10545,"t":"code","b":[169,251],"m":"lda","o":"#$FB"},{"a":10547,"t":"code","b":[162,85],"m":"ldx","o":"#$55"},{"a":10549,"t":"code","b":[32,216,255],"m":"jsr","o":"s_FFD8","oa":65496},{"a":10552,"t":"code","b":[76,0,65],"m":"jmp","o":"cold_start","oa":16640},{"a":10555,"l":"str_hiscore_filename","c":"Disk filenames for the high-score file, in PETSCII, overlapping: 19 bytes from $293B are '@S:F.PATROL HI /REM' (the save-and-replace form used by $2926) and the last 16 of them, from $293E, are 'F.PATROL HI /REM' (the plain form used by the LOAD at $1A4F).","t":"byte","b":[64,83,58,70,46,80,65,84]},{"a":10563,"t":"byte","b":[82,79,76,32,72,73,32,47]},{"a":10571,"t":"byte","b":[82,69,77]},{"a":10574,"l":"hiscore_open_slot","c":"Open a slot in the on-screen high-score table by pushing the lower entries down one place. In: the accumulator, loaded by the LDA #$00 at $294E whose operand byte $294F is written from $4C8C - it is the number of existing entries the new score beats, plus one, so 5 vacates rank 1 and 2 vacates rank 4; 0 or 1 does nothing and returns at $2960. Works on the live title screen rows, not on the $2800 table: each step copies a score field ($08D2/$0922/$0972/$09C2 -> $0922/$0972/$09C2/$0A12) and the matching 12-byte name field. Implemented as a cascade, $29AC calling $2992 calling $2978 calling $2961. Called from $46BC. Remember crack code - the scroll text at $1013 claims this routine is the crack's own addition, because the original never pushed the places down.","t":"code","b":[169,0],"m":"lda","o":"#$00","x":[18108]},{"a":10575,"t":"note","l":"hiscore_open_slot_arg","c":"The immediate operand of the LDA #$00 at $294E. It is self-modified: $4C8C writes the rank the new score has earned into this byte before calling $294E, so the constant in the listing is only the value it happens to hold in this snapshot. 5 pushes every entry down and vacates rank 1; 2 vacates rank 4; 0 or 1 means the new score is last and nothing moves.","note":"inside the item at $294E","x":[19596]},{"a":10576,"t":"code","b":[201,2],"m":"cmp","o":"#$02"},{"a":10578,"t":"code","b":[240,13],"m":"beq","o":"hiscore_shift_5","oa":10593},{"a":10580,"t":"code","b":[201,3],"m":"cmp","o":"#$03"},{"a":10582,"t":"code","b":[240,32],"m":"beq","o":"hiscore_shift_4","oa":10616},{"a":10584,"t":"code","b":[201,4],"m":"cmp","o":"#$04"},{"a":10586,"t":"code","b":[240,54],"m":"beq","o":"hiscore_shift_3","oa":10642},{"a":10588,"t":"code","b":[201,5],"m":"cmp","o":"#$05"},{"a":10590,"t":"code","b":[240,76],"m":"beq","o":"hiscore_shift_2","oa":10668},{"a":10592,"t":"code","b":[96],"m":"rts"},{"a":10593,"l":"hiscore_shift_5","c":"Last step of the cascade: copy rank 4 (score $09C2, name $09CD) down into rank 5 ($0A12/$0A1D). Entry point of the $294E cascade; five score digits and twelve name characters per rank, on the live title screen.","t":"code","b":[162,4],"m":"ldx","o":"#$04","x":[10578,10616]},{"a":10595,"l":"b_2963","t":"code","b":[189,194,9],"m":"lda","o":"title_rank4_score,x","oa":2498,"x":[10602]},{"a":10598,"t":"code","b":[157,18,10],"m":"sta","o":"title_rank5_score,x","oa":2578},{"a":10601,"t":"code","b":[202],"m":"dex"},{"a":10602,"t":"code","b":[16,247],"m":"bpl","o":"b_2963","oa":10595},{"a":10604,"t":"code","b":[162,11],"m":"ldx","o":"#$0B"},{"a":10606,"l":"b_296E","t":"code","b":[189,205,9],"m":"lda","o":"title_rank4_name,x","oa":2509,"x":[10613]},{"a":10609,"t":"code","b":[157,29,10],"m":"sta","o":"title_rank5_name,x","oa":2589},{"a":10612,"t":"code","b":[202],"m":"dex"},{"a":10613,"t":"code","b":[16,247],"m":"bpl","o":"b_296E","oa":10606},{"a":10615,"t":"code","b":[96],"m":"rts"},{"a":10616,"l":"hiscore_shift_4","c":"Calls $2961 first, then copies rank 3 ($0972/$097D) down into rank 4 ($09C2/$09CD). Entry point of the $294E cascade; five score digits and twelve name characters per rank, on the live title screen.","t":"code","b":[32,97,41],"m":"jsr","o":"hiscore_shift_5","oa":10593,"x":[10582,10642]},{"a":10619,"t":"code","b":[162,4],"m":"ldx","o":"#$04"},{"a":10621,"l":"b_297D","t":"code","b":[189,114,9],"m":"lda","o":"title_rank3_score,x","oa":2418,"x":[10628]},{"a":10624,"t":"code","b":[157,194,9],"m":"sta","o":"title_rank4_score,x","oa":2498},{"a":10627,"t":"code","b":[202],"m":"dex"},{"a":10628,"t":"code","b":[16,247],"m":"bpl","o":"b_297D","oa":10621},{"a":10630,"t":"code","b":[162,11],"m":"ldx","o":"#$0B"},{"a":10632,"l":"b_2988","t":"code","b":[189,125,9],"m":"lda","o":"title_rank3_name,x","oa":2429,"x":[10639]},{"a":10635,"t":"code","b":[157,205,9],"m":"sta","o":"title_rank4_name,x","oa":2509},{"a":10638,"t":"code","b":[202],"m":"dex"},{"a":10639,"t":"code","b":[16,247],"m":"bpl","o":"b_2988","oa":10632},{"a":10641,"t":"code","b":[96],"m":"rts"},{"a":10642,"l":"hiscore_shift_3","c":"Calls $2978 first, then copies rank 2 ($0922/$092D) down into rank 3 ($0972/$097D). Entry point of the $294E cascade; five score digits and twelve name characters per rank, on the live title screen.","t":"code","b":[32,120,41],"m":"jsr","o":"hiscore_shift_4","oa":10616,"x":[10586,10668]},{"a":10645,"t":"code","b":[162,4],"m":"ldx","o":"#$04"},{"a":10647,"l":"b_2997","t":"code","b":[189,34,9],"m":"lda","o":"title_rank2_score,x","oa":2338,"x":[10654]},{"a":10650,"t":"code","b":[157,114,9],"m":"sta","o":"title_rank3_score,x","oa":2418},{"a":10653,"t":"code","b":[202],"m":"dex"},{"a":10654,"t":"code","b":[16,247],"m":"bpl","o":"b_2997","oa":10647},{"a":10656,"t":"code","b":[162,11],"m":"ldx","o":"#$0B"},{"a":10658,"l":"b_29A2","t":"code","b":[189,45,9],"m":"lda","o":"title_rank2_name,x","oa":2349,"x":[10665]},{"a":10661,"t":"code","b":[157,125,9],"m":"sta","o":"title_rank3_name,x","oa":2429},{"a":10664,"t":"code","b":[202],"m":"dex"},{"a":10665,"t":"code","b":[16,247],"m":"bpl","o":"b_29A2","oa":10658},{"a":10667,"t":"code","b":[96],"m":"rts"},{"a":10668,"l":"hiscore_shift_2","c":"Calls $2992 first, then copies rank 1 ($08D2/$08DD) down into rank 2 ($0922/$092D), vacating rank 1. Entry point of the $294E cascade; five score digits and twelve name characters per rank, on the live title screen.","t":"code","b":[32,146,41],"m":"jsr","o":"hiscore_shift_3","oa":10642,"x":[10590]},{"a":10671,"t":"code","b":[162,4],"m":"ldx","o":"#$04"},{"a":10673,"l":"b_29B1","t":"code","b":[189,210,8],"m":"lda","o":"title_rank1_score,x","oa":2258,"x":[10680]},{"a":10676,"t":"code","b":[157,34,9],"m":"sta","o":"title_rank2_score,x","oa":2338},{"a":10679,"t":"code","b":[202],"m":"dex"},{"a":10680,"t":"code","b":[16,247],"m":"bpl","o":"b_29B1","oa":10673},{"a":10682,"t":"code","b":[162,11],"m":"ldx","o":"#$0B"},{"a":10684,"l":"b_29BC","t":"code","b":[189,221,8],"m":"lda","o":"title_rank1_name,x","oa":2269,"x":[10691]},{"a":10687,"t":"code","b":[157,45,9],"m":"sta","o":"title_rank2_name,x","oa":2349},{"a":10690,"t":"code","b":[202],"m":"dex"},{"a":10691,"t":"code","b":[16,247],"m":"bpl","o":"b_29BC","oa":10684},{"a":10693,"t":"code","b":[96],"m":"rts"},{"a":10694,"l":"unused_29c6","c":"$29C6-$29FF: 58 bytes of $00 between the crack's high-score code and the title tune's data tables at $2A00.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":10702,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":10710,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":10718,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":10726,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":10734,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":10742,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":10750,"t":"byte","b":[0,0]},{"a":10752,"l":"tune_v1_freq_hi","c":"Title-tune note table: voice 1 frequency high byte, written to $D401, indexed by music_note_index ($9D). 29 notes used ($00-$1C), the remaining three bytes of the 32 are $EA padding. First eight entries 10 16 15 10 19 00 16 1D. The player is $4B5D; a zero here is a rest. The pitches are drawn from the same chromatic set as note_freq_hi at $2FC0 - $10C3 is about 252 Hz on PAL and each step up is a semitone.","t":"byte","b":[16,22,21,16,25,0,22,29],"x":[19309]},{"a":10760,"t":"byte","b":[28,22,33,0,16,22,21,16]},{"a":10768,"t":"byte","b":[25,0,22,29,28,22,33,0]},{"a":10776,"t":"byte","b":[39,37,33,29,33,234,234,234]},{"a":10784,"l":"tune_v1_freq_lo","c":"Title-tune note table: voice 1 frequency low byte, written to $D400, indexed by music_note_index ($9D). 29 notes used ($00-$1C), the remaining three bytes of the 32 are $EA padding. First eight entries C3 60 1F C3 2E 00 60 DF. The player is $4B5D; a zero here is a rest. The pitches are drawn from the same chromatic set as note_freq_hi at $2FC0 - $10C3 is about 252 Hz on PAL and each step up is a semitone.","t":"byte","b":[195,96,31,195,46,0,96,223],"x":[19315]},{"a":10792,"t":"byte","b":[49,96,135,0,195,96,31,195]},{"a":10800,"t":"byte","b":[46,0,96,223,49,96,135,0]},{"a":10808,"t":"byte","b":[223,162,135,223,135,234,234,234]},{"a":10816,"l":"tune_v2_freq_hi","c":"Title-tune note table: voice 2 frequency high byte, written to $D408, indexed by music_note_index ($9D). 29 notes used ($00-$1C), the remaining three bytes of the 32 are $EA padding. First eight entries 00 00 00 00 0C 0C 0C 0C. The player is $4B5D; a zero here is a rest. The pitches are drawn from the same chromatic set as note_freq_hi at $2FC0 - $10C3 is about 252 Hz on PAL and each step up is a semitone.","t":"byte","b":[0,0,0,0,12,12,12,12],"x":[19321]},{"a":10824,"t":"byte","b":[12,12,11,11,11,11,11,11]},{"a":10832,"t":"byte","b":[12,12,12,12,12,12,11,11]},{"a":10840,"t":"byte","b":[19,22,16,14,16,234,234,234]},{"a":10848,"l":"tune_v2_freq_lo","c":"Title-tune note table: voice 2 frequency low byte, written to $D407, indexed by music_note_index ($9D). 29 notes used ($00-$1C), the remaining three bytes of the 32 are $EA padding. First eight entries 00 00 00 00 8F 8F 8F 8F. The player is $4B5D; a zero here is a rest. The pitches are drawn from the same chromatic set as note_freq_hi at $2FC0 - $10C3 is about 252 Hz on PAL and each step up is a semitone.","t":"byte","b":[0,0,0,0,143,143,143,143],"x":[19327]},{"a":10856,"t":"byte","b":[143,143,48,48,48,48,48,48]},{"a":10864,"t":"byte","b":[143,143,143,143,143,143,48,48]},{"a":10872,"t":"byte","b":[239,96,195,239,195,234,234,234]},{"a":10880,"l":"tune_v3_freq_hi","c":"Title-tune note table: voice 3 frequency high byte, written to $D40F, indexed by music_note_index ($9D). 29 notes used ($00-$1C), the remaining three bytes of the 32 are $EA padding. First eight entries 00 00 00 00 08 08 08 08. The player is $4B5D; a zero here is a rest. The pitches are drawn from the same chromatic set as note_freq_hi at $2FC0 - $10C3 is about 252 Hz on PAL and each step up is a semitone.","t":"byte","b":[0,0,0,0,8,8,8,8],"x":[19333]},{"a":10888,"t":"byte","b":[8,8,16,16,16,16,16,16]},{"a":10896,"t":"byte","b":[8,8,8,8,8,8,16,16]},{"a":10904,"t":"byte","b":[14,14,11,11,12,234,234,234]},{"a":10912,"l":"tune_v3_freq_lo","c":"Title-tune note table: voice 3 frequency low byte, written to $D40E, indexed by music_note_index ($9D). 29 notes used ($00-$1C), the remaining three bytes of the 32 are $EA padding. First eight entries 00 00 00 00 61 61 61 61. The player is $4B5D; a zero here is a rest. The pitches are drawn from the same chromatic set as note_freq_hi at $2FC0 - $10C3 is about 252 Hz on PAL and each step up is a semitone.","t":"byte","b":[0,0,0,0,97,97,97,97],"x":[19339]},{"a":10920,"t":"byte","b":[97,97,195,195,195,195,195,195]},{"a":10928,"t":"byte","b":[97,97,97,97,97,97,195,195]},{"a":10936,"t":"byte","b":[239,239,48,48,143,234,234,234]},{"a":10944,"l":"tune_sid_init","c":"25 bytes copied straight over $D400-$D418 at $4B60 before the title tune starts. Voice 1: pulse width $00FF, control $20 (sawtooth, gate off), attack/decay $58, sustain/release $EB. Voice 2: pulse width $02F0, control $20, AD $58, SR $7C. Voice 3: pulse width $05FF, control $10 (triangle), AD $58, SR $7C. Then filter cutoff $004F, resonance/routing $F0 (resonance 15, no voice routed through the filter) and $D418 = $1F (volume 15, low-pass selected). The byte at $2AD9 is not copied.","t":"byte","b":[0,0,255,0,32,88,235,0],"x":[19298]},{"a":10952,"t":"byte","b":[0,240,2,32,88,124,0,0]},{"a":10960,"t":"byte","b":[255,5,16,88,124,0,79,240]},{"a":10968,"t":"byte","b":[31]},{"a":10969,"t":"gap","n":7},{"a":10976,"l":"tune_note_length","c":"Title-tune note-length table, one byte per note, read at $4BF6 into music_note_delay ($9C) as the inner count of the player's two delay loops. 29 entries used; the pattern AF 7F 7F AF FF AF repeats four times and the last five notes are EF EF EF EF FF, so the tune is a six-note bar played four times with a five-note tag. The remaining three bytes are $EA padding.","t":"byte","b":[175,127,127,175,255,175,175,127],"x":[19446]},{"a":10984,"t":"byte","b":[127,175,255,175,175,127,127,175]},{"a":10992,"t":"byte","b":[255,175,175,127,127,175,255,175]},{"a":11000,"t":"byte","b":[239,239,239,239,255,234,234,234]},{"a":11008,"l":"sprite_attitude_left_m2","c":"Player attitude frame, left-facing set, offset -2 from level. 24x21 hires bitmap, 64 bytes. $5A20 keeps a pointer ($96/$97) on the level frame of this set ($2B80 nose-left, $2CC0 nose-right) and adds $40 per unit of attitude_step ($99), which $5A94-$5AB5 drives from vertical velocity: level when vel_y is 0, +2 climbing, -2 diving. $5AD0 copies the selected frame over sprite block $80 and $5AC4 over block $86, so the live player sprite is repainted from this bank rather than the pointer being changed. The fuselage stays horizontal while the delta wing/fin opens out above and below the fuselage, so the aircraft reads as rolled hard. ","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11016,"t":"byte","b":[0,0,3,128,0,7,128,0]},{"a":11024,"t":"byte","b":[15,140,0,213,84,5,255,222]},{"a":11032,"t":"byte","b":[16,255,170,99,255,254,255,85]},{"a":11040,"t":"byte","b":[94,0,255,252,0,95,220,0]},{"a":11048,"t":"byte","b":[15,204,0,7,192,0,3,192]},{"a":11056,"t":"byte","b":[0,1,192,0,0,0,0,0]},{"a":11064,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11072,"l":"sprite_attitude_left_m1","c":"Player attitude frame, left-facing set, offset -1 from level. 24x21 hires bitmap, 64 bytes. $5A20 keeps a pointer ($96/$97) on the level frame of this set ($2B80 nose-left, $2CC0 nose-right) and adds $40 per unit of attitude_step ($99), which $5A94-$5AB5 drives from vertical velocity: level when vel_y is 0, +2 climbing, -2 diving. $5AD0 copies the selected frame over sprite block $80 and $5AC4 over block $86, so the live player sprite is repainted from this bank rather than the pointer being changed. The fuselage stays horizontal while the delta wing/fin opens out partly above and below the fuselage, so the aircraft reads as rolled. ","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11080,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11088,"t":"byte","b":[3,140,0,15,156,5,255,188]},{"a":11096,"t":"byte","b":[17,255,214,103,85,126,255,255]},{"a":11104,"t":"byte","b":[254,0,191,220,0,31,140,0]},{"a":11112,"t":"byte","b":[7,128,0,3,128,0,0,0]},{"a":11120,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11128,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11136,"l":"sprite_attitude_left_p0","c":"Player attitude frame, left-facing set, offset +0 from level. 24x21 hires bitmap, 64 bytes. $5A20 keeps a pointer ($96/$97) on the level frame of this set ($2B80 nose-left, $2CC0 nose-right) and adds $40 per unit of attitude_step ($99), which $5A94-$5AB5 drives from vertical velocity: level when vel_y is 0, +2 climbing, -2 diving. $5AD0 copies the selected frame over sprite block $80 and $5AC4 over block $86, so the live player sprite is repainted from this bank rather than the pointer being changed. The level frame, and the one $5BA0 copies into sprite block $80 at the start of every life: a plain side view with a long fuselage on rows 8-10 and the tail fin standing up at the right end.","t":"byte","b":[0,0,0,0,0,0,0,0],"x":[23458]},{"a":11144,"t":"byte","b":[0,0,0,4,0,0,12,0]},{"a":11152,"t":"byte","b":[0,28,0,0,124,11,255,252]},{"a":11160,"t":"byte","b":[35,213,238,127,255,254,255,255]},{"a":11168,"t":"byte","b":[248,0,124,0,0,0,0,0]},{"a":11176,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11184,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11192,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11200,"l":"sprite_attitude_left_p1","c":"Player attitude frame, left-facing set, offset +1 from level. 24x21 hires bitmap, 64 bytes. $5A20 keeps a pointer ($96/$97) on the level frame of this set ($2B80 nose-left, $2CC0 nose-right) and adds $40 per unit of attitude_step ($99), which $5A94-$5AB5 drives from vertical velocity: level when vel_y is 0, +2 climbing, -2 diving. $5AD0 copies the selected frame over sprite block $80 and $5AC4 over block $86, so the live player sprite is repainted from this bank rather than the pointer being changed. The fuselage stays horizontal while the delta wing/fin opens out partly above and below the fuselage, so the aircraft reads as rolled. ","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11208,"t":"byte","b":[0,0,3,128,0,7,128,0]},{"a":11216,"t":"byte","b":[15,140,0,191,148,5,85,172]},{"a":11224,"t":"byte","b":[19,255,222,127,171,254,255,255]},{"a":11232,"t":"byte","b":[254,0,255,220,0,15,132,0]},{"a":11240,"t":"byte","b":[7,128,0,3,128,0,0,0]},{"a":11248,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11256,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11264,"l":"sprite_attitude_left_p2","c":"Player attitude frame, left-facing set, offset +2 from level. 24x21 hires bitmap, 64 bytes. $5A20 keeps a pointer ($96/$97) on the level frame of this set ($2B80 nose-left, $2CC0 nose-right) and adds $40 per unit of attitude_step ($99), which $5A94-$5AB5 drives from vertical velocity: level when vel_y is 0, +2 climbing, -2 diving. $5AD0 copies the selected frame over sprite block $80 and $5AC4 over block $86, so the live player sprite is repainted from this bank rather than the pointer being changed. The fuselage stays horizontal while the delta wing/fin opens out above and below the fuselage, so the aircraft reads as rolled hard. ","t":"byte","b":[0,0,0,0,3,128,0,7]},{"a":11272,"t":"byte","b":[128,0,15,128,0,31,140,0]},{"a":11280,"t":"byte","b":[191,156,0,170,188,5,255,214]},{"a":11288,"t":"byte","b":[31,171,254,127,171,254,255,255]},{"a":11296,"t":"byte","b":[254,0,170,212,0,31,156,0]},{"a":11304,"t":"byte","b":[15,140,0,7,128,0,3,128]},{"a":11312,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11320,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11328,"l":"sprite_attitude_right_m2","c":"Player attitude frame, right-facing set, offset -2 from level. 24x21 hires bitmap, 64 bytes. $5A20 keeps a pointer ($96/$97) on the level frame of this set ($2B80 nose-left, $2CC0 nose-right) and adds $40 per unit of attitude_step ($99), which $5A94-$5AB5 drives from vertical velocity: level when vel_y is 0, +2 climbing, -2 diving. $5AD0 copies the selected frame over sprite block $80 and $5AC4 over block $86, so the live player sprite is repainted from this bank rather than the pointer being changed. The fuselage stays horizontal while the delta wing/fin opens out above and below the fuselage, so the aircraft reads as rolled hard. ","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11336,"t":"byte","b":[0,1,192,0,1,224,0,49]},{"a":11344,"t":"byte","b":[240,0,42,171,0,123,255,160]},{"a":11352,"t":"byte","b":[85,255,8,127,255,198,122,170]},{"a":11360,"t":"byte","b":[255,63,255,0,59,250,0,51]},{"a":11368,"t":"byte","b":[240,0,3,224,0,3,192,0]},{"a":11376,"t":"byte","b":[3,128,0,0,0,0,0,0]},{"a":11384,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11392,"l":"sprite_attitude_right_m1","c":"Player attitude frame, right-facing set, offset -1 from level. 24x21 hires bitmap, 64 bytes. $5A20 keeps a pointer ($96/$97) on the level frame of this set ($2B80 nose-left, $2CC0 nose-right) and adds $40 per unit of attitude_step ($99), which $5A94-$5AB5 drives from vertical velocity: level when vel_y is 0, +2 climbing, -2 diving. $5AD0 copies the selected frame over sprite block $80 and $5AC4 over block $86, so the live player sprite is repainted from this bank rather than the pointer being changed. The fuselage stays horizontal while the delta wing/fin opens out partly above and below the fuselage, so the aircraft reads as rolled. ","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11400,"t":"byte","b":[0,0,0,0,0,0,0,49]},{"a":11408,"t":"byte","b":[192,0,57,240,0,61,255,160]},{"a":11416,"t":"byte","b":[107,255,136,126,170,230,127,255]},{"a":11424,"t":"byte","b":[255,59,253,0,49,248,0,1]},{"a":11432,"t":"byte","b":[224,0,1,192,0,0,0,0]},{"a":11440,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11448,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11456,"l":"sprite_attitude_right_p0","c":"Player attitude frame, right-facing set, offset +0 from level. 24x21 hires bitmap, 64 bytes. $5A20 keeps a pointer ($96/$97) on the level frame of this set ($2B80 nose-left, $2CC0 nose-right) and adds $40 per unit of attitude_step ($99), which $5A94-$5AB5 drives from vertical velocity: level when vel_y is 0, +2 climbing, -2 diving. $5AD0 copies the selected frame over sprite block $80 and $5AC4 over block $86, so the live player sprite is repainted from this bank rather than the pointer being changed. The level frame, and the one $5BA0 copies into sprite block $86 at the start of every life: a plain side view with a long fuselage on rows 8-10 and the tail fin standing up at the left end.","t":"byte","b":[0,0,0,0,0,0,0,0],"x":[23464]},{"a":11464,"t":"byte","b":[0,32,0,0,48,0,0,56]},{"a":11472,"t":"byte","b":[0,0,62,0,0,63,255,208]},{"a":11480,"t":"byte","b":[119,171,196,127,255,254,31,255]},{"a":11488,"t":"byte","b":[255,0,62,0,0,0,0,0]},{"a":11496,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11504,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11512,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11520,"l":"sprite_attitude_right_p1","c":"Player attitude frame, right-facing set, offset +1 from level. 24x21 hires bitmap, 64 bytes. $5A20 keeps a pointer ($96/$97) on the level frame of this set ($2B80 nose-left, $2CC0 nose-right) and adds $40 per unit of attitude_step ($99), which $5A94-$5AB5 drives from vertical velocity: level when vel_y is 0, +2 climbing, -2 diving. $5AD0 copies the selected frame over sprite block $80 and $5AC4 over block $86, so the live player sprite is repainted from this bank rather than the pointer being changed. The fuselage stays horizontal while the delta wing/fin opens out partly above and below the fuselage, so the aircraft reads as rolled. ","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11528,"t":"byte","b":[0,1,192,0,1,224,0,49]},{"a":11536,"t":"byte","b":[240,0,41,253,0,53,170,160]},{"a":11544,"t":"byte","b":[123,255,200,127,213,254,127,255]},{"a":11552,"t":"byte","b":[255,59,255,0,33,240,0,1]},{"a":11560,"t":"byte","b":[224,0,1,192,0,0,0,0]},{"a":11568,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11576,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11584,"l":"sprite_attitude_right_p2","c":"Player attitude frame, right-facing set, offset +2 from level. 24x21 hires bitmap, 64 bytes. $5A20 keeps a pointer ($96/$97) on the level frame of this set ($2B80 nose-left, $2CC0 nose-right) and adds $40 per unit of attitude_step ($99), which $5A94-$5AB5 drives from vertical velocity: level when vel_y is 0, +2 climbing, -2 diving. $5AD0 copies the selected frame over sprite block $80 and $5AC4 over block $86, so the live player sprite is repainted from this bank rather than the pointer being changed. The fuselage stays horizontal while the delta wing/fin opens out above and below the fuselage, so the aircraft reads as rolled hard. ","t":"byte","b":[0,0,0,1,192,0,1,224]},{"a":11592,"t":"byte","b":[0,1,240,0,49,248,0,57]},{"a":11600,"t":"byte","b":[253,0,61,85,0,107,255,160]},{"a":11608,"t":"byte","b":[127,213,248,127,213,254,127,255]},{"a":11616,"t":"byte","b":[255,43,85,0,57,248,0,49]},{"a":11624,"t":"byte","b":[240,0,1,224,0,1,192,0]},{"a":11632,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11640,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11648,"l":"unused_2d80","c":"$2D80-$2DFF: 128 bytes of $00 - sprite blocks $B6 and $B7, unused, between the attitude bank and the status-panel template.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11656,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11664,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11672,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11680,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11688,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11696,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11704,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11712,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11720,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11728,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11736,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11744,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11752,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11760,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11768,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11776,"l":"status_panel_row0","c":"Status-panel template, row 0 of 5 (screen rows 20-24). $4E70 copies the whole 200-byte block $2E00-$2EC7 to $0720-$07E7 and, for every byte that is not $FF, also copies that glyph's colour from the table at $4000 to $DB20 onwards; $FF means 'leave this cell alone', which is how the radar window and the live readouts survive the repaint. This row carries the top border of the panel: frame glyphs around the radar box. The live values are written over it afterwards: score digits at $0770, lives at $0777, GAS bar at $078F, top score at $07C0 and AAM count at $07E2.","t":"byte","b":[161,161,161,161,161,161,161,161],"x":[20082]},{"a":11784,"t":"byte","b":[161,164,160,170,166,166,166,166]},{"a":11792,"t":"byte","b":[166,166,166,166,166,166,166,166]},{"a":11800,"t":"byte","b":[166,166,166,166,171,160,165,161]},{"a":11808,"t":"byte","b":[161,161,161,161,161,161,161,161]},{"a":11816,"l":"status_panel_row1","c":"Status-panel template, row 1 of 5 (screen rows 20-24). $4E70 copies the whole 200-byte block $2E00-$2EC7 to $0720-$07E7 and, for every byte that is not $FF, also copies that glyph's colour from the table at $4000 to $DB20 onwards; $FF means 'leave this cell alone', which is how the radar window and the live readouts survive the repaint. This row carries the SCORE label on the left, the radar box, and the GAS label on the right. The live values are written over it afterwards: score digits at $0770, lives at $0777, GAS bar at $078F, top score at $07C0 and AAM count at $07E2.","t":"byte","b":[147,131,143,146,133,255,255,174]},{"a":11824,"t":"byte","b":[255,162,160,168,255,255,255,255]},{"a":11832,"t":"byte","b":[255,255,255,255,255,255,255,255]},{"a":11840,"t":"byte","b":[255,255,255,255,169,160,163,32]},{"a":11848,"t":"byte","b":[32,32,135,129,147,32,32,32]},{"a":11856,"l":"status_panel_row2","c":"Status-panel template, row 2 of 5 (screen rows 20-24). $4E70 copies the whole 200-byte block $2E00-$2EC7 to $0720-$07E7 and, for every byte that is not $FF, also copies that glyph's colour from the table at $4000 to $DB20 onwards; $FF means 'leave this cell alone', which is how the radar window and the live readouts survive the repaint. This row carries panel side walls and the middle of the radar box. The live values are written over it afterwards: score digits at $0770, lives at $0777, GAS bar at $078F, top score at $07C0 and AAM count at $07E2.","t":"byte","b":[255,255,255,255,255,255,175,255]},{"a":11864,"t":"byte","b":[176,162,160,168,255,255,255,255]},{"a":11872,"t":"byte","b":[255,255,255,255,255,255,255,255]},{"a":11880,"t":"byte","b":[255,255,255,255,169,160,163,255]},{"a":11888,"t":"byte","b":[255,255,255,255,255,255,255,255]},{"a":11896,"l":"status_panel_row3","c":"Status-panel template, row 3 of 5 (screen rows 20-24). $4E70 copies the whole 200-byte block $2E00-$2EC7 to $0720-$07E7 and, for every byte that is not $FF, also copies that glyph's colour from the table at $4000 to $DB20 onwards; $FF means 'leave this cell alone', which is how the radar window and the live readouts survive the repaint. This row carries the HI label on the left, the radar box, and the AAM label on the right. The live values are written over it afterwards: score digits at $0770, lives at $0777, GAS bar at $078F, top score at $07C0 and AAM count at $07E2.","t":"byte","b":[32,136,137,32,32,255,177,178]},{"a":11904,"t":"byte","b":[179,162,160,168,255,255,255,255]},{"a":11912,"t":"byte","b":[255,255,255,255,255,255,255,255]},{"a":11920,"t":"byte","b":[255,255,255,255,169,160,163,32]},{"a":11928,"t":"byte","b":[32,32,129,129,141,32,32,32]},{"a":11936,"l":"status_panel_row4","c":"Status-panel template, row 4 of 5 (screen rows 20-24). $4E70 copies the whole 200-byte block $2E00-$2EC7 to $0720-$07E7 and, for every byte that is not $FF, also copies that glyph's colour from the table at $4000 to $DB20 onwards; $FF means 'leave this cell alone', which is how the radar window and the live readouts survive the repaint. This row carries the bottom border of the panel. The live values are written over it afterwards: score digits at $0770, lives at $0777, GAS bar at $078F, top score at $07C0 and AAM count at $07E2.","t":"byte","b":[255,255,255,255,255,255,255,255]},{"a":11944,"t":"byte","b":[255,162,160,172,167,167,167,167]},{"a":11952,"t":"byte","b":[167,167,167,167,167,167,167,167]},{"a":11960,"t":"byte","b":[167,167,167,167,173,160,163,32]},{"a":11968,"t":"byte","b":[32,32,255,255,255,32,32,32]},{"a":11976,"l":"unused_2ec8","c":"$2EC8-$2F7F: 184 bytes of $00 between the status-panel template and the copyright string.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11984,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":11992,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":12000,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":12008,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":12016,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":12024,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":12032,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":12040,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":12048,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":12056,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":12064,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":12072,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":12080,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":12088,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":12096,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":12104,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":12112,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":12120,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":12128,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":12136,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":12144,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":12152,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":12160,"l":"str_copyright","c":"40 characters in the game's own alphabet: '(C)VIRGIN GAMES 1983  WRITTEN BY STEVE LEE'. $44A5 stamps it onto the last row of the title screen ($0BC0) in colour $0F. Codes are screen code plus $80 for letters, $9D for the copyright sign, $20 for space and $00-$09 for digits.","t":"byte","b":[157,150,137,146,135,137,142,32],"x":[17573]},{"a":12168,"t":"byte","b":[135,129,141,133,147,32,1,9]},{"a":12176,"t":"byte","b":[8,3,32,32,151,146,137,148]},{"a":12184,"t":"byte","b":[148,133,142,32,130,153,32,147]},{"a":12192,"t":"byte","b":[148,133,150,133,32,140,133,133]},{"a":12200,"l":"str_falcon_patrol","c":"13 characters in the game's alphabet spelling 'FALCON PATROL', immediately after the copyright line. Nothing in the tracked disassembly reads it - the title's own FALCON PATROL logo is drawn from the glyph blocks at $5B80/$5B90 instead - so this looks like a leftover or an alternate title string.","t":"byte","b":[134,129,140,131,143,142,32,144]},{"a":12208,"t":"byte","b":[129,148,146,143,140]},{"a":12213,"l":"unused_2fb5","c":"$2FB5-$2FBF: eleven $00 bytes padding the copyright block out to $2FC0.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":12221,"t":"byte","b":[0,0,0]},{"a":12224,"l":"note_freq_hi","c":"High bytes of an eight-note chromatic scale, $10 $11 $12 $13 $15 $16 $17 $19, repeated four times to fill $2FC0-$2FDF. Paired with note_freq_lo at $2FE0 they give $10C3 $11C3 $12D1 $13EF $151F $1660 $17B5 $191E - successive ratios of 1.0595, i.e. eight semitones, about 252 Hz to 378 Hz on PAL. $4E3F reads this table during the high-score name entry, where each step along the alphabet strip sounds the next note.","t":"byte","b":[16,17,18,19,21,22,23,25],"x":[20031]},{"a":12232,"t":"byte","b":[16,17,18,19,21,22,23,25]},{"a":12240,"t":"byte","b":[16,17,18,19,21,22,23,25]},{"a":12248,"t":"byte","b":[16,17,18,19,21,22,23,25]},{"a":12256,"l":"note_freq_lo","c":"Low bytes of the same eight-note chromatic scale, $C3 $C3 $D1 $EF $1F $60 $B5 $1E, repeated four times over $2FE0-$2FFF. Read at $4E39, one index behind note_freq_hi at $2FC0. The four-fold repeat means an index of 0-$1F wraps through the same octave, which is why the name-entry tone cycles as the cursor walks the 28-glyph alphabet strip.","t":"byte","b":[195,195,209,239,31,96,181,30],"x":[20025]},{"a":12264,"t":"byte","b":[195,195,209,239,31,96,181,30]},{"a":12272,"t":"byte","b":[195,195,209,239,31,96,181,30]},{"a":12280,"t":"byte","b":[195,195,209,239,31,96,181,30]},{"a":12288,"l":"charset_digits_aircraft","c":"Glyphs $00-$1F. $00-$09 are the digits 0-9, stored so that a glyph's index IS its digit, which is why the score and AAM readouts can be written straight from a binary value. $0A is a rosette, $0B a vertical-stripe dither. $0C-$11 are wing and fuselage fragments: aircraft drawn as characters rather than sprites. $12-$15 are thin horizontal rules, the ruled lines of the radar panel. $16-$1D are coarse dithers and wall textures; $1E is blank.","t":"byte","b":[126,66,66,66,66,66,126,0]},{"a":12296,"t":"byte","b":[8,8,8,8,8,8,28,0]},{"a":12304,"t":"byte","b":[126,2,2,126,64,64,126,0]},{"a":12312,"t":"byte","b":[126,2,2,62,2,2,126,0]},{"a":12320,"t":"byte","b":[64,72,72,126,8,8,8,0]},{"a":12328,"t":"byte","b":[126,64,64,126,2,2,126,0]},{"a":12336,"t":"byte","b":[126,64,64,126,66,66,126,0]},{"a":12344,"t":"byte","b":[126,2,2,4,8,8,8,0]},{"a":12352,"t":"byte","b":[126,66,66,126,66,66,126,0]},{"a":12360,"t":"byte","b":[126,66,66,126,2,2,126,0]},{"a":12368,"t":"byte","b":[0,56,84,146,254,146,84,56]},{"a":12376,"t":"byte","b":[85,85,85,85,85,85,85,85]},{"a":12384,"t":"byte","b":[0,1,1,3,63,38,35,5]},{"a":12392,"t":"byte","b":[0,0,255,128,64,124,100,196]},{"a":12400,"t":"byte","b":[32,32,255,0,255,0,255,0]},{"a":12408,"t":"byte","b":[0,128,192,248,254,255,192,128]},{"a":12416,"t":"byte","b":[0,1,3,31,127,255,3,1]},{"a":12424,"t":"byte","b":[2,230,206,254,255,254,198,224]},{"a":12432,"t":"byte","b":[0,0,0,0,0,64,126,64]},{"a":12440,"t":"byte","b":[0,0,0,0,0,2,125,2]},{"a":12448,"t":"byte","b":[0,0,0,0,0,0,110,52]},{"a":12456,"t":"byte","b":[0,0,0,0,255,255,255,255]},{"a":12464,"t":"byte","b":[255,238,255,123,123,127,255,85]},{"a":12472,"t":"byte","b":[255,187,255,237,237,253,255,85]},{"a":12480,"t":"byte","b":[0,40,92,109,220,58,26,32]},{"a":12488,"t":"byte","b":[72,106,80,180,56,105,132,81]},{"a":12496,"t":"byte","b":[64,20,2,80,69,40,66,8]},{"a":12504,"t":"byte","b":[68,133,0,80,9,64,33,137]},{"a":12512,"t":"byte","b":[36,66,0,33,0,64,4,33]},{"a":12520,"t":"byte","b":[1,20,23,58,157,128,99,70]},{"a":12528,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":12536,"t":"byte","b":[93,117,125,221,255,223,247,255]},{"a":12544,"l":"charset_town","c":"Glyphs $20-$3F. $20 is the space. $25 and $26 are small four-pointed sparks. $27 is a solid half-height block. $28-$36 are the multicolour tiles the desert town is built from - flat-roofed buildings, their shadowed sides, and the roadway - and $2E, $2F and $37 are solid fills used to close them off. This block also holds glyphs the game rewrites while it runs: during play the only character data that changed was inside this page and page $3700.","t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":12552,"t":"byte","b":[96,119,123,127,255,63,7,15]},{"a":12560,"t":"byte","b":[0,224,128,248,254,255,128,224]},{"a":12568,"t":"byte","b":[0,7,1,31,127,255,1,7]},{"a":12576,"t":"byte","b":[6,238,222,254,255,252,224,240]},{"a":12584,"t":"byte","b":[0,0,0,16,126,16,0,0]},{"a":12592,"t":"byte","b":[0,0,0,8,126,8,0,0]},{"a":12600,"t":"byte","b":[0,0,0,0,0,60,60,0]},{"a":12608,"t":"byte","b":[0,0,0,0,255,235,235,255]},{"a":12616,"t":"byte","b":[255,255,255,255,255,235,235,255]},{"a":12624,"l":"charset_crater","c":"Glyphs $2A-$3F. The first four are the bomb crater and its silhouette mask: $2A/$2B are the crater itself and $2C/$2D the mask, and $5E45 re-randomises $3150-$315F from CIA2's timer every pass, so each crater is freshly speckled. The rest of the block is town and roadway fill.","t":"byte","b":[127,95,247,215,247,215,127,95],"x":[24153]},{"a":12632,"t":"byte","b":[125,93,215,247,223,127,93,125]},{"a":12640,"l":"charset_crater_mask","c":"Glyphs $2C-$3B. $2C and $2D are the crater's silhouette mask, the fixed outline inside which $5E45's fresh speckle is drawn; the rest are the dithered wall and roadway tiles the town is assembled from.","t":"byte","b":[47,175,255,255,255,255,175,47],"x":[24148]},{"a":12648,"t":"byte","b":[248,248,255,255,255,255,248,248]},{"a":12656,"t":"byte","b":[255,255,255,255,255,255,255,255]},{"a":12664,"t":"byte","b":[255,255,255,255,255,255,255,255]},{"a":12672,"t":"byte","b":[127,250,234,250,255,250,250,250]},{"a":12680,"t":"byte","b":[250,250,250,250,250,250,122,95]},{"a":12688,"t":"byte","b":[253,175,171,175,255,175,175,175]},{"a":12696,"t":"byte","b":[175,175,175,175,175,175,173,245]},{"a":12704,"l":"charset_town_shading","c":"Glyphs $34-$39: the half-lit and fully shaded wall faces that give the flat-roofed buildings their depth, drawn as two-pixel multicolour pairs so they tile against the solid blocks without a seam.","t":"byte","b":[85,85,85,85,87,95,127,255]},{"a":12712,"t":"byte","b":[85,85,85,85,255,252,240,192]},{"a":12720,"t":"byte","b":[255,235,235,255,255,235,235,255]},{"a":12728,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":12736,"t":"byte","b":[0,0,0,0,0,3,15,63]},{"a":12744,"t":"byte","b":[85,85,85,85,255,255,255,255]},{"a":12752,"t":"byte","b":[255,235,235,255,235,235,235,235]},{"a":12760,"t":"byte","b":[0,0,0,0,0,1,5,21]},{"a":12768,"t":"byte","b":[87,95,127,245,85,95,125,213]},{"a":12776,"t":"byte","b":[85,215,247,255,125,255,237,101]},{"a":12784,"t":"byte","b":[125,255,213,85,245,253,95,85]},{"a":12792,"t":"byte","b":[101,101,101,101,101,101,101,101]},{"a":12800,"l":"charset_dither_a","c":"Glyphs $40-$5F. Almost entirely two-pixel dither patterns in multicolour pairs, the shading that gives the town its depth: solid walls, half-lit walls, and the speckled sand between the buildings. $44 is a solid block with a lighter lower half, $4F and $53 are full-height verticals used as building edges.","t":"byte","b":[101,101,101,101,101,101,101,169]},{"a":12808,"t":"byte","b":[170,170,170,170,170,42,117,117]},{"a":12816,"t":"byte","b":[133,181,128,128,128,0,93,93]},{"a":12824,"t":"byte","b":[85,85,95,122,122,127,126,126]},{"a":12832,"t":"byte","b":[126,126,126,126,95,85,85,85]},{"a":12840,"t":"byte","b":[85,85,245,173,173,253,189,189]},{"a":12848,"t":"byte","b":[189,189,189,189,245,85,85,85]},{"a":12856,"t":"byte","b":[85,87,92,92,95,94,94,94]},{"a":12864,"t":"byte","b":[94,94,94,94,87,85,85,85]},{"a":12872,"t":"byte","b":[213,245,205,13,249,169,169,169]},{"a":12880,"t":"byte","b":[169,169,169,173,245,85,85,85]},{"a":12888,"t":"byte","b":[85,95,112,112,127,122,122,122]},{"a":12896,"t":"byte","b":[122,122,122,122,122,122,122,95]},{"a":12904,"t":"byte","b":[213,245,205,13,249,169,169,169]},{"a":12912,"t":"byte","b":[169,169,169,169,169,169,173,245]},{"a":12920,"t":"byte","b":[85,85,85,85,85,85,85,255]},{"a":12928,"t":"byte","b":[85,85,85,85,85,85,85,213]},{"a":12936,"t":"byte","b":[250,250,206,14,250,170,170,171]},{"a":12944,"t":"byte","b":[85,95,112,112,127,122,122,255]},{"a":12952,"t":"byte","b":[213,245,205,13,249,169,169,255]},{"a":12960,"t":"byte","b":[84,84,80,80,64,64,0,0]},{"a":12968,"t":"byte","b":[0,0,0,20,0,0,0,0]},{"a":12976,"t":"byte","b":[0,0,1,1,5,5,21,21]},{"a":12984,"t":"byte","b":[85,85,85,85,84,80,64,0]},{"a":12992,"t":"byte","b":[84,80,64,0,1,5,21,85]},{"a":13000,"t":"byte","b":[1,5,21,85,85,85,85,85]},{"a":13008,"t":"byte","b":[255,235,235,255,255,0,0,0]},{"a":13016,"t":"byte","b":[222,254,206,14,251,169,169,169]},{"a":13024,"t":"byte","b":[85,87,92,92,95,94,94,255]},{"a":13032,"t":"byte","b":[213,245,205,13,249,169,169,255]},{"a":13040,"t":"byte","b":[101,101,101,101,101,169,85,85]},{"a":13048,"t":"byte","b":[0,85,127,127,127,85,63,48]},{"a":13056,"l":"charset_dither_b","c":"Glyphs $60-$7F. $60-$6F continue the town shading and include the palm-tree crowns ($63, $6F). $70-$7C are recognisably letter shapes in a second, narrower face - a P, R, S and A can be read straight off the bitmaps - but NO screen in the analysed state uses any code in $70-$7F, so what draws with them is not established. $7D and $7E are solid fills.","t":"byte","b":[0,112,116,127,127,127,255,12]},{"a":13064,"t":"byte","b":[0,0,0,20,0,3,15,63]},{"a":13072,"t":"byte","b":[0,0,0,0,255,252,240,192]},{"a":13080,"t":"byte","b":[100,96,96,32,33,37,37,169]},{"a":13088,"t":"byte","b":[1,5,21,85,255,255,255,255]},{"a":13096,"t":"byte","b":[84,80,64,0,255,255,255,255]},{"a":13104,"t":"byte","b":[32,32,32,36,32,32,32,32]},{"a":13112,"t":"byte","b":[0,0,0,0,255,255,255,255]},{"a":13120,"t":"byte","b":[85,85,85,85,1,5,21,85]},{"a":13128,"t":"byte","b":[85,85,85,85,0,0,0,0]},{"a":13136,"t":"byte","b":[1,5,21,85,0,0,0,0]},{"a":13144,"t":"byte","b":[84,80,64,0,0,0,0,0]},{"a":13152,"t":"byte","b":[170,170,170,168,255,255,255,170]},{"a":13160,"t":"byte","b":[170,170,170,170,255,255,255,170]},{"a":13168,"t":"byte","b":[170,170,170,138,255,255,255,170]},{"a":13176,"t":"byte","b":[115,24,182,150,69,134,255,85]},{"a":13184,"t":"byte","b":[136,66,140,172,50,253,255,85]},{"a":13192,"t":"byte","b":[124,66,66,124,64,64,64,0]},{"a":13200,"t":"byte","b":[124,66,66,124,72,68,66,0]},{"a":13208,"t":"byte","b":[255,191,32,32,188,32,32,191]},{"a":13216,"t":"byte","b":[128,158,255,0,207,0,255,0]},{"a":13224,"t":"byte","b":[255,0,255,0,255,0,255,0]},{"a":13232,"t":"byte","b":[255,0,255,0,255,0,28,8]},{"a":13240,"t":"byte","b":[8,8,8,8,28,0,62,8]},{"a":13248,"t":"byte","b":[8,8,8,8,8,0,24,36]},{"a":13256,"t":"byte","b":[66,66,66,36,24,0,24,36]},{"a":13264,"t":"byte","b":[66,126,66,66,66,0,60,66]},{"a":13272,"t":"byte","b":[64,60,2,66,60,0,66,68]},{"a":13280,"t":"byte","b":[72,112,72,68,66,0,255,255]},{"a":13288,"t":"byte","b":[255,255,255,255,255,255,255,255]},{"a":13296,"t":"byte","b":[255,255,255,255,255,255,255,255]},{"a":13304,"t":"byte","b":[128,128,128,0,252,252,0,0]},{"a":13312,"l":"charset_alphabet","c":"Glyphs $80-$9F, the game's own alphabet and the reason a byte search in screen codes or PETSCII finds no text at all. $80 is a full stop, $81-$9A are A to Z in order, $9B is the underscore that ends the name-entry strip, and $9D is the copyright sign used by the credit line. A letter's code is its C64 screen code plus $80. $9E is a dither; $9F an arrow.","t":"byte","b":[0,0,0,0,0,24,24,0]},{"a":13320,"t":"byte","b":[24,60,102,126,102,102,102,0]},{"a":13328,"t":"byte","b":[124,102,102,124,102,102,124,0]},{"a":13336,"t":"byte","b":[60,102,96,96,96,102,60,0]},{"a":13344,"t":"byte","b":[120,108,102,102,102,108,120,0]},{"a":13352,"t":"byte","b":[126,96,96,120,96,96,126,0]},{"a":13360,"t":"byte","b":[126,96,96,120,96,96,96,0]},{"a":13368,"t":"byte","b":[60,102,96,110,102,102,60,0]},{"a":13376,"t":"byte","b":[102,102,102,126,102,102,102,0]},{"a":13384,"t":"byte","b":[60,24,24,24,24,24,60,0]},{"a":13392,"t":"byte","b":[30,12,12,12,12,108,56,0]},{"a":13400,"t":"byte","b":[102,108,120,112,120,108,102,0]},{"a":13408,"t":"byte","b":[96,96,96,96,96,96,126,0]},{"a":13416,"t":"byte","b":[99,119,127,107,99,99,99,0]},{"a":13424,"t":"byte","b":[102,118,126,126,110,102,102,0]},{"a":13432,"t":"byte","b":[60,102,102,102,102,102,60,0]},{"a":13440,"t":"byte","b":[124,102,102,124,96,96,96,0]},{"a":13448,"t":"byte","b":[60,102,102,102,102,60,14,0]},{"a":13456,"t":"byte","b":[124,102,102,124,120,108,102,0]},{"a":13464,"t":"byte","b":[60,102,96,60,6,102,60,0]},{"a":13472,"t":"byte","b":[126,24,24,24,24,24,24,0]},{"a":13480,"t":"byte","b":[102,102,102,102,102,102,60,0]},{"a":13488,"t":"byte","b":[102,102,102,102,102,60,24,0]},{"a":13496,"t":"byte","b":[99,99,99,107,127,119,99,0]},{"a":13504,"t":"byte","b":[102,102,60,24,60,102,102,0]},{"a":13512,"t":"byte","b":[102,102,102,60,24,24,24,0]},{"a":13520,"t":"byte","b":[126,6,12,24,48,96,126,0]},{"a":13528,"t":"byte","b":[0,0,0,0,0,0,255,255]},{"a":13536,"t":"byte","b":[0,0,0,0,0,24,24,0]},{"a":13544,"t":"byte","b":[60,66,185,162,162,185,66,60]},{"a":13552,"t":"byte","b":[0,0,0,85,85,85,85,85]},{"a":13560,"t":"byte","b":[0,16,48,127,127,48,16,0]},{"a":13568,"l":"charset_runway","c":"Glyphs $A0-$BF. $A0 and $B4 are solid fills. $A8-$AD are vertical rules and half-tone columns. $AE and $AF are rounded and diagonal caps, and $B0-$B3 and $B5-$BF are diagonal and stepped shapes - the sloped ends of the landing strips and the angled roof lines of the town.","t":"byte","b":[255,255,255,255,255,255,255,255]},{"a":13576,"t":"byte","b":[255,255,255,255,255,255,170,170]},{"a":13584,"t":"byte","b":[191,191,191,191,191,191,191,191]},{"a":13592,"t":"byte","b":[254,254,254,254,254,254,254,254]},{"a":13600,"t":"byte","b":[255,255,255,255,255,255,191,191]},{"a":13608,"t":"byte","b":[255,255,255,255,255,255,254,254]},{"a":13616,"t":"byte","b":[255,255,255,255,170,170,0,0]},{"a":13624,"t":"byte","b":[0,0,170,170,255,255,255,255]},{"a":13632,"t":"byte","b":[128,128,128,128,128,128,128,128]},{"a":13640,"t":"byte","b":[2,2,2,2,2,2,2,2]},{"a":13648,"t":"byte","b":[255,255,255,255,170,170,128,128]},{"a":13656,"t":"byte","b":[255,255,255,255,170,170,2,2]},{"a":13664,"t":"byte","b":[128,128,170,170,255,255,255,255]},{"a":13672,"t":"byte","b":[2,2,170,170,255,255,255,255]},{"a":13680,"t":"byte","b":[0,24,24,60,60,60,126,255]},{"a":13688,"t":"byte","b":[1,1,3,7,15,31,63,63]},{"a":13696,"t":"byte","b":[128,128,192,224,240,248,252,252]},{"a":13704,"t":"byte","b":[63,0,0,0,0,1,3,0]},{"a":13712,"t":"byte","b":[255,60,60,126,255,255,255,24]},{"a":13720,"t":"byte","b":[252,0,0,0,0,128,192,0]},{"a":13728,"l":"charset_gas_gauge","c":"Glyphs $B4-$B9. $B4 is the GAS gauge's part-full cell and is not a fixed picture: draw_gas_gauge at $4EA0 rewrites this bitmap every time the fuel fraction changes, so the bar's last cell empties smoothly while the other eight stay solid blocks. The same animate-the-charset trick as the landscape and the radar.","t":"byte","b":[255,255,255,255,255,255,255,255],"x":[20369]},{"a":13736,"t":"byte","b":[0,0,31,31,24,48,48,63]},{"a":13744,"t":"byte","b":[0,0,223,223,24,48,48,63]},{"a":13752,"t":"byte","b":[0,0,236,236,108,216,216,216]},{"a":13760,"t":"byte","b":[0,0,15,15,12,24,24,24]},{"a":13768,"t":"byte","b":[0,0,239,239,12,24,24,24]},{"a":13776,"t":"byte","b":[0,0,251,251,27,55,55,55]},{"a":13784,"t":"byte","b":[0,0,12,12,140,152,152,152]},{"a":13792,"l":"charset_runway_caps","c":"Glyphs $BC-$BF: the stepped and diagonal caps that close off the ends of a landing strip and the angled roof lines where a building meets the sand.","t":"byte","b":[127,96,96,192,192,192,0,0]},{"a":13800,"t":"byte","b":[127,97,97,195,195,195,0,0]},{"a":13808,"t":"byte","b":[176,176,176,96,127,127,0,0]},{"a":13816,"t":"byte","b":[48,48,48,96,127,127,0,0]},{"a":13824,"l":"charset_strokes","c":"Glyphs $C0-$DF. $C0-$CF are thick angled strokes that read as digits and letters in a heavy face, drawn with the same two-pixel multicolour pairs as the town. $D0-$DF are a single repeating vertical dither, one column lit and one dark, used as flat fill.","t":"byte","b":[48,48,48,96,127,127,0,0]},{"a":13832,"t":"byte","b":[109,109,109,217,216,216,0,0]},{"a":13840,"t":"byte","b":[176,176,176,224,224,96,0,0]},{"a":13848,"t":"byte","b":[0,0,31,31,24,49,49,63]},{"a":13856,"t":"byte","b":[0,0,223,223,152,176,176,63]},{"a":13864,"t":"byte","b":[0,0,239,239,97,195,195,195]},{"a":13872,"t":"byte","b":[0,0,247,247,134,12,12,15]},{"a":13880,"t":"byte","b":[0,0,240,240,48,97,97,225]},{"a":13888,"t":"byte","b":[0,0,254,254,198,140,140,140]},{"a":13896,"t":"byte","b":[0,0,96,96,96,192,192,192]},{"a":13904,"t":"byte","b":[127,96,96,192,192,192,0,0]},{"a":13912,"t":"byte","b":[127,97,97,195,195,195,0,0]},{"a":13920,"t":"byte","b":[134,134,134,12,12,12,0,0]},{"a":13928,"t":"byte","b":[31,24,24,48,48,48,0,0]},{"a":13936,"t":"byte","b":[195,195,227,102,103,55,0,0]},{"a":13944,"t":"byte","b":[25,25,25,51,243,243,0,0]},{"a":13952,"l":"charset_radar_canvas","c":"Glyphs $D0-$DF, the left half of the radar's canvas. The radar is not a bitmap and not sprites: $52A0 clears these glyphs to a sky/horizon dither and $5340 sets individual multicolour pixels in them, one per contact, so the whole 256-column world is plotted four world columns to the pixel with the player fixed at the centre.","t":"byte","b":[170,170,170,170,170,170,170,170],"x":[21156,21185]},{"a":13960,"t":"byte","b":[170,170,170,170,170,170,170,170]},{"a":13968,"t":"byte","b":[170,170,170,170,170,170,170,170]},{"a":13976,"t":"byte","b":[170,170,170,170,170,170,170,170]},{"a":13984,"t":"byte","b":[170,170,170,170,170,170,170,170]},{"a":13992,"t":"byte","b":[170,170,170,170,170,170,170,170]},{"a":14000,"t":"byte","b":[170,170,170,170,170,170,170]},{"a":14007,"l":"charset_radar_mid","c":"Glyphs $D6-$DF, the middle of the radar canvas. $52A0 clears these to the sky and horizon dither every pass, and the player's own centre marker is set into glyphs $D7 and $E7, which is why the player always sits exactly in the middle of the display however far round the 256-column world has scrolled.","t":"byte","b":[170,171,171,171,171,171,171,171],"x":[21169,21174]},{"a":14015,"t":"byte","b":[171,170,170,170,170,170,170,170]},{"a":14023,"t":"byte","b":[170,170,170,170,170,170,170,170]},{"a":14031,"t":"byte","b":[170,170,170,170,170,170,170,170]},{"a":14039,"t":"byte","b":[170,170,170,170,170,170,170,170]},{"a":14047,"t":"byte","b":[170,170,170,170,170,170,170,170]},{"a":14055,"t":"byte","b":[170,170,170,170,170,170,170,170]},{"a":14063,"t":"byte","b":[170,170,170,170,170,170,170,174]},{"a":14071,"l":"charset_radar_edge","c":"Glyphs $DE-$DF, the right-hand edge of the radar canvas, cleared with the rest of it by $52A0.","t":"byte","b":[170,170,170,170,170,170,170,170]},{"a":14079,"t":"byte","b":[170]},{"a":14080,"l":"charset_fill_animated","c":"Glyphs $E0-$FF. $E0-$EF are a vertical dither whose top half and bottom half use opposite phases, so a run of them tiles into a continuous texture; small breaks in individual glyphs ($E5, $EB, $ED, $EE, $EF) are where the game pokes moving detail into otherwise uniform fill. $F0-$FF are sixteen identical solid blocks. This page is the second of the two the game rewrites while it runs.","t":"byte","b":[170,170,170,170,85,85,85,85]},{"a":14088,"t":"byte","b":[170,170,170,170,85,85,85,85]},{"a":14096,"t":"byte","b":[170,170,170,171,85,85,85,85]},{"a":14104,"t":"byte","b":[170,170,170,170,85,85,85,85]},{"a":14112,"t":"byte","b":[170,170,170,170,85,85,85,85]},{"a":14120,"t":"byte","b":[170,170,170,234,85,85,85,85]},{"a":14128,"t":"byte","b":[170,170,170,170,85,85,85,85]},{"a":14136,"l":"charset_radar_canvas_2","c":"Glyphs $E7-$FF. $E7-$EF finish the radar canvas that $52A0 clears and $5340 plots into, and $F0-$FF are sixteen identical solid blocks, the fill the status panel and the gauges are built from.","t":"byte","b":[171,171,171,171,87,85,85,85],"x":[21208,21213]},{"a":14144,"t":"byte","b":[170,170,170,170,85,85,85,85]},{"a":14152,"t":"byte","b":[170,170,170,170,85,85,85,85]},{"a":14160,"t":"byte","b":[170,170,170,170,85,85,85,85]},{"a":14168,"t":"byte","b":[170,170,170,234,85,85,85,85]},{"a":14176,"t":"byte","b":[170,170,170,170,85,85,85,85]},{"a":14184,"t":"byte","b":[170,170,170,186,85,85,85,85]},{"a":14192,"t":"byte","b":[170,234,170,170,85,85,85,85]},{"a":14200,"l":"charset_solid_fill","c":"Glyphs $EF-$FF. $EF closes the radar canvas; $F0-$FF are sixteen identical all-bits-set blocks. Having sixteen copies of one solid glyph is not waste: it lets the colour table at $4000 give the same solid block sixteen different colours, which is how the status panel, the gauges and the solid parts of the town are drawn without a single extra bitmap.","t":"byte","b":[170,170,170,234,85,85,85,85]},{"a":14208,"t":"byte","b":[255,255,255,255,255,255,255,255]},{"a":14216,"t":"byte","b":[255,255,255,255,255,255,255,255]},{"a":14224,"t":"byte","b":[255,255,255,255,255,255,255,255]},{"a":14232,"t":"byte","b":[255,255,255,255,255,255,255,255]},{"a":14240,"t":"byte","b":[255,255,255,255,255,255,255,255]},{"a":14248,"t":"byte","b":[255,255,255,255,255,255,255,255]},{"a":14256,"t":"byte","b":[255,255,255,255,255,255,255,255]},{"a":14264,"t":"byte","b":[255,255,255,255,255,255,255,255]},{"a":14272,"t":"byte","b":[255,255,255,255,255,255,255,255]},{"a":14280,"t":"byte","b":[255,255,255,255,255,255,255,255]},{"a":14288,"t":"byte","b":[255,255,255,255,255,255,255,255]},{"a":14296,"t":"byte","b":[255,255,255,255,255,255,255,255]},{"a":14304,"t":"byte","b":[255,255,255,255,255,255,255,255]},{"a":14312,"t":"byte","b":[255,255,255,255,255,255,255,255]},{"a":14320,"t":"byte","b":[255,255,255,255,255,255,255,255]},{"a":14328,"t":"byte","b":[255,255,255,255,255,255,255,255]},{"a":14336,"l":"terrain_map_row0","c":"Top row of the terrain map and the one that matters: 256 world columns, one byte each, where $0B is open desert, $69 a second ground tile and $16/$17 a base. The six bases sit at columns 4, 40, 84, 136, 172 and 200, each written as the four cells $16 $17 $16 $17. A base that has been bombed reads $6F/$70 instead, and $5FD0 restores it only when a life is lost. $55B1 allows a landing only where two $16 cells sit under the aircraft, and $52F9 scans this row to plot the surviving bases on the radar. The world is 256 columns round: world_x at $0D indexes here and wraps in eight bits.","t":"byte","b":[11,11,11,11,22,23,22,23],"x":[21241,21943,21952,24427,24445,24458,24530,24547]},{"a":14344,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":14352,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":14360,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":14368,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":14376,"t":"byte","b":[22,23,22,23,11,11,11,11]},{"a":14384,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":14392,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":14400,"l":"terrain_map_row0_cont","c":"The rest of the terrain map's top row, world columns $40 to $FF. It carries the bases at columns 84, 136, 172 and 200 and the runs of $69 ground tile between them; $0B is open desert. Same row as $3800, continued.","t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":14408,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":14416,"t":"byte","b":[11,11,11,11,22,23,22,23]},{"a":14424,"t":"byte","b":[105,105,105,105,105,105,104,11]},{"a":14432,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":14440,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":14448,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":14456,"t":"byte","b":[11,87,105,105,105,105,105,105]},{"a":14464,"t":"byte","b":[105,105,105,105,105,105,105,105]},{"a":14472,"t":"byte","b":[22,23,22,23,11,11,11,11]},{"a":14480,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":14488,"t":"byte","b":[11,11,11,11,87,105,105,105]},{"a":14496,"t":"byte","b":[105,105,105,105,105,105,105,105]},{"a":14504,"t":"byte","b":[105,105,105,105,22,23,22,23]},{"a":14512,"t":"byte","b":[105,105,105,105,105,105,105,104]},{"a":14520,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":14528,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":14536,"t":"byte","b":[22,23,22,23,11,11,11,11]},{"a":14544,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":14552,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":14560,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":14568,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":14576,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":14584,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":14592,"l":"terrain_map_rows1_7","c":"Rows 1 to 7 of the terrain map, one 256-byte page each, holding the body of the town below the skyline: building faces, roadway and sand. put_terrain_column at $509F walks down them through the pointer at $0E/$0F, doing inc $0F per row, so one screen column is drawn from the same offset in all eight pages. Nothing references these pages by address; they are reached only through that computed pointer.","t":"byte","b":[62,11,11,11,87,88,89,11]},{"a":14600,"t":"byte","b":[75,77,75,77,11,11,11,11]},{"a":14608,"t":"byte","b":[11,52,57,57,53,60,61,62]},{"a":14616,"t":"byte","b":[11,67,69,67,69,11,11,11]},{"a":14624,"t":"byte","b":[11,11,11,87,105,105,105,105]},{"a":14632,"t":"byte","b":[105,107,106,105,105,105,105,105]},{"a":14640,"t":"byte","b":[105,105,105,105,105,105,105,105]},{"a":14648,"t":"byte","b":[105,105,105,105,105,105,105,105]},{"a":14656,"t":"byte","b":[105,105,105,105,104,52,57,57]},{"a":14664,"t":"byte","b":[53,11,11,11,11,11,11,11]},{"a":14672,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":14680,"t":"byte","b":[11,11,11,87,88,89,52,57]},{"a":14688,"t":"byte","b":[57,53,11,11,11,11,11,11]},{"a":14696,"t":"byte","b":[11,11,52,57,57,57,53,11]},{"a":14704,"t":"byte","b":[11,11,11,60,61,62,11,87]},{"a":14712,"t":"byte","b":[88,89,11,11,52,57,57,57]},{"a":14720,"t":"byte","b":[53,11,60,61,62,11,11,11]},{"a":14728,"t":"byte","b":[87,88,89,11,11,11,11,11]},{"a":14736,"t":"byte","b":[11,11,11,52,57,57,53,11]},{"a":14744,"t":"byte","b":[11,11,87,88,89,11,52,57]},{"a":14752,"t":"byte","b":[57,57,53,11,11,11,79,79]},{"a":14760,"t":"byte","b":[79,80,11,11,11,65,66,11]},{"a":14768,"t":"byte","b":[11,11,11,11,87,88,89,11]},{"a":14776,"t":"byte","b":[11,11,65,66,11,65,66,79]},{"a":14784,"t":"byte","b":[79,79,80,11,60,61,62,11]},{"a":14792,"t":"byte","b":[87,107,106,105,105,105,105,105]},{"a":14800,"t":"byte","b":[105,105,105,105,105,105,105,105]},{"a":14808,"t":"byte","b":[105,105,105,105,105,105,104,60]},{"a":14816,"t":"byte","b":[61,62,11,11,11,11,11,52]},{"a":14824,"t":"byte","b":[53,11,11,11,11,67,69,67]},{"a":14832,"t":"byte","b":[69,11,11,11,11,11,52,57]},{"a":14840,"t":"byte","b":[53,11,11,11,11,11,60,61]},{"a":14848,"t":"byte","b":[11,11,87,88,89,11,11,11]},{"a":14856,"t":"byte","b":[76,78,76,78,11,11,11,52]},{"a":14864,"t":"byte","b":[57,54,54,54,55,11,63,11]},{"a":14872,"t":"byte","b":[11,68,70,68,70,75,77,11]},{"a":14880,"t":"byte","b":[11,87,88,89,11,65,66,11]},{"a":14888,"t":"byte","b":[11,11,11,11,11,11,67,69]},{"a":14896,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":14904,"t":"byte","b":[11,11,11,11,67,69,67,69]},{"a":14912,"t":"byte","b":[11,87,88,89,11,58,54,58]},{"a":14920,"t":"byte","b":[59,11,11,11,11,11,60,61]},{"a":14928,"t":"byte","b":[62,11,11,11,11,60,61,62]},{"a":14936,"t":"byte","b":[11,87,88,89,11,11,58,54]},{"a":14944,"t":"byte","b":[58,59,11,60,61,62,11,11]},{"a":14952,"t":"byte","b":[11,11,54,90,90,54,59,11]},{"a":14960,"t":"byte","b":[60,61,62,11,64,87,88,89]},{"a":14968,"t":"byte","b":[11,11,11,11,54,90,90,54]},{"a":14976,"t":"byte","b":[59,11,11,64,11,11,87,88]},{"a":14984,"t":"byte","b":[89,65,66,11,11,60,61,62]},{"a":14992,"t":"byte","b":[11,11,11,58,54,58,59,11]},{"a":15000,"t":"byte","b":[87,88,89,11,11,11,54,90]},{"a":15008,"t":"byte","b":[90,54,59,11,11,75,77,11]},{"a":15016,"t":"byte","b":[75,77,11,11,11,11,11,11]},{"a":15024,"t":"byte","b":[65,66,87,88,89,11,11,11]},{"a":15032,"t":"byte","b":[52,57,57,57,53,11,75,77]},{"a":15040,"t":"byte","b":[11,75,77,11,11,63,87,88]},{"a":15048,"t":"byte","b":[89,11,11,11,11,60,61,62]},{"a":15056,"t":"byte","b":[67,69,67,69,67,69,11,60]},{"a":15064,"t":"byte","b":[61,62,11,87,88,89,65,66]},{"a":15072,"t":"byte","b":[63,11,11,11,11,52,57,54]},{"a":15080,"t":"byte","b":[56,57,53,11,11,68,70,68]},{"a":15088,"t":"byte","b":[70,11,11,11,11,52,54,54]},{"a":15096,"t":"byte","b":[56,57,53,11,11,11,11,63]},{"a":15104,"t":"byte","b":[87,88,89,52,57,57,53,11]},{"a":15112,"t":"byte","b":[11,11,11,60,61,62,11,58]},{"a":15120,"t":"byte","b":[54,90,90,54,59,11,94,52]},{"a":15128,"t":"byte","b":[57,57,53,11,11,76,78,87]},{"a":15136,"t":"byte","b":[88,89,11,65,66,11,79,79]},{"a":15144,"t":"byte","b":[79,80,11,60,61,62,68,70]},{"a":15152,"t":"byte","b":[11,52,57,57,53,11,52,57]},{"a":15160,"t":"byte","b":[57,53,11,11,68,70,68,70]},{"a":15168,"t":"byte","b":[84,95,96,85,85,85,85,85]},{"a":15176,"t":"byte","b":[97,98,85,85,85,85,85,102]},{"a":15184,"t":"byte","b":[85,85,85,95,96,85,102,85]},{"a":15192,"t":"byte","b":[85,85,85,85,85,85,85,85]},{"a":15200,"t":"byte","b":[85,85,85,85,102,85,85,85]},{"a":15208,"t":"byte","b":[85,85,85,95,96,85,85,95]},{"a":15216,"t":"byte","b":[96,102,85,85,97,103,98,85]},{"a":15224,"t":"byte","b":[85,85,85,85,85,85,95,96]},{"a":15232,"t":"byte","b":[85,85,85,85,85,85,85,85]},{"a":15240,"t":"byte","b":[85,85,97,103,103,98,102,85]},{"a":15248,"t":"byte","b":[85,85,85,85,85,85,85,95]},{"a":15256,"t":"byte","b":[96,85,86,11,79,79,79,80]},{"a":15264,"t":"byte","b":[11,60,61,62,11,76,78,11]},{"a":15272,"t":"byte","b":[76,78,60,61,62,11,65,66]},{"a":15280,"t":"byte","b":[87,88,89,11,60,61,62,52]},{"a":15288,"t":"byte","b":[54,54,54,54,56,53,76,78]},{"a":15296,"t":"byte","b":[11,76,78,11,87,99,89,79]},{"a":15304,"t":"byte","b":[79,79,79,79,79,80,63,11]},{"a":15312,"t":"byte","b":[68,70,68,70,68,70,11,11]},{"a":15320,"t":"byte","b":[63,87,88,89,52,57,53,11]},{"a":15328,"t":"byte","b":[94,11,11,11,11,58,54,90]},{"a":15336,"t":"byte","b":[54,58,59,11,52,57,57,53]},{"a":15344,"t":"byte","b":[60,61,62,11,11,54,58,58]},{"a":15352,"t":"byte","b":[54,54,59,60,61,62,11,94]},{"a":15360,"t":"byte","b":[97,103,103,58,58,58,55,85]},{"a":15368,"t":"byte","b":[95,96,85,85,102,95,96,85]},{"a":15376,"t":"byte","b":[85,85,85,85,85,85,85,54]},{"a":15384,"t":"byte","b":[54,54,56,103,98,85,85,85]},{"a":15392,"t":"byte","b":[86,65,66,11,11,82,83,79]},{"a":15400,"t":"byte","b":[82,83,79,80,63,11,60,61]},{"a":15408,"t":"byte","b":[62,54,54,54,56,57,54,54]},{"a":15416,"t":"byte","b":[54,55,11,75,77,11,75,77]},{"a":15424,"t":"byte","b":[11,11,11,11,60,61,62,52]},{"a":15432,"t":"byte","b":[54,56,57,53,60,61,62,64]},{"a":15440,"t":"byte","b":[52,101,100,57,53,11,94,11]},{"a":15448,"t":"byte","b":[11,52,57,57,53,11,11,11]},{"a":15456,"t":"byte","b":[11,87,88,89,94,52,53,11]},{"a":15464,"t":"byte","b":[11,11,11,60,61,62,60,61]},{"a":15472,"t":"byte","b":[62,94,11,52,54,54,56,57]},{"a":15480,"t":"byte","b":[57,57,53,60,61,62,11,87]},{"a":15488,"t":"byte","b":[88,89,65,66,60,61,62,52]},{"a":15496,"t":"byte","b":[57,57,54,54,54,55,64,60]},{"a":15504,"t":"byte","b":[61,62,11,11,11,87,88,89]},{"a":15512,"t":"byte","b":[60,61,62,82,83,79,82,83]},{"a":15520,"t":"byte","b":[79,80,63,11,11,11,11,11]},{"a":15528,"t":"byte","b":[11,11,11,63,11,11,87,88]},{"a":15536,"t":"byte","b":[89,11,11,65,66,63,11,54]},{"a":15544,"t":"byte","b":[54,54,54,54,54,55,60,61]},{"a":15552,"t":"byte","b":[62,11,87,88,89,11,82,83]},{"a":15560,"t":"byte","b":[79,82,83,79,75,77,64,67]},{"a":15568,"t":"byte","b":[69,67,69,67,69,11,84,85]},{"a":15576,"t":"byte","b":[102,85,85,97,54,54,56,103]},{"a":15584,"t":"byte","b":[103,103,98,85,85,85,85,85]},{"a":15592,"t":"byte","b":[95,96,97,103,54,54,54,55]},{"a":15600,"t":"byte","b":[85,102,85,85,85,85,85,85]},{"a":15608,"t":"byte","b":[95,96,85,85,102,85,85,85]},{"a":15616,"l":"terrain_map_rows5_7","c":"The last three pages of the terrain map, rows 5 to 7 of the landscape: the lowest bands of the town, nearest the bottom of the playfield, where the roadway and the building bases sit. Reached like every other row through the pointer at $0E/$0F, which put_terrain_column walks a page at a time.","t":"byte","b":[54,54,54,54,54,54,56,57]},{"a":15624,"t":"byte","b":[57,53,11,11,64,87,88,89]},{"a":15632,"t":"byte","b":[75,77,11,75,77,11,11,54]},{"a":15640,"t":"byte","b":[58,58,54,54,55,60,61,62]},{"a":15648,"t":"byte","b":[11,60,61,62,75,81,78,75]},{"a":15656,"t":"byte","b":[81,78,75,77,94,11,11,63]},{"a":15664,"t":"byte","b":[11,54,54,54,58,58,54,54]},{"a":15672,"t":"byte","b":[54,55,75,81,78,75,81,78]},{"a":15680,"t":"byte","b":[75,77,11,11,11,63,11,54]},{"a":15688,"t":"byte","b":[54,54,54,55,11,63,87,88]},{"a":15696,"t":"byte","b":[54,54,54,54,55,11,60,61]},{"a":15704,"t":"byte","b":[62,54,58,54,59,11,11,87]},{"a":15712,"t":"byte","b":[88,89,11,52,57,54,56,57]},{"a":15720,"t":"byte","b":[53,11,11,11,63,11,11,63]},{"a":15728,"t":"byte","b":[11,11,11,54,58,58,54,54]},{"a":15736,"t":"byte","b":[54,54,55,11,63,87,88,89]},{"a":15744,"t":"byte","b":[65,66,11,11,11,63,11,54]},{"a":15752,"t":"byte","b":[58,90,90,90,58,59,11,11]},{"a":15760,"t":"byte","b":[63,11,11,87,88,89,11,11]},{"a":15768,"t":"byte","b":[11,63,75,81,78,75,81,78]},{"a":15776,"t":"byte","b":[75,77,94,11,48,50,11,48]},{"a":15784,"t":"byte","b":[50,11,11,64,87,88,89,11]},{"a":15792,"t":"byte","b":[11,65,66,11,11,64,11,58]},{"a":15800,"t":"byte","b":[54,90,90,54,58,59,11,63]},{"a":15808,"t":"byte","b":[87,88,89,11,11,75,81,78]},{"a":15816,"t":"byte","b":[75,81,78,75,81,78,11,68]},{"a":15824,"t":"byte","b":[70,68,70,68,70,87,88,89]},{"a":15832,"t":"byte","b":[60,61,62,54,58,58,54,54]},{"a":15840,"t":"byte","b":[54,54,55,11,75,77,75,77]},{"a":15848,"t":"byte","b":[11,11,54,54,58,58,54,55]},{"a":15856,"t":"byte","b":[11,64,87,88,89,60,61,62]},{"a":15864,"t":"byte","b":[11,11,11,11,64,11,11,11]},{"a":15872,"t":"byte","b":[54,54,54,58,90,58,90,90]},{"a":15880,"t":"byte","b":[58,59,11,87,88,89,11,75]},{"a":15888,"t":"byte","b":[81,78,75,81,78,11,11,54]},{"a":15896,"t":"byte","b":[90,90,54,58,59,11,63,11]},{"a":15904,"t":"byte","b":[65,66,63,11,76,78,11,76]},{"a":15912,"t":"byte","b":[78,11,76,78,65,66,11,64]},{"a":15920,"t":"byte","b":[11,54,58,54,90,90,54,58]},{"a":15928,"t":"byte","b":[54,59,76,78,11,76,78,11]},{"a":15936,"t":"byte","b":[76,78,11,11,11,64,11,58]},{"a":15944,"t":"byte","b":[54,58,54,59,87,99,89,11]},{"a":15952,"t":"byte","b":[58,54,90,54,59,11,11,63]},{"a":15960,"t":"byte","b":[11,11,11,11,11,87,88,89]},{"a":15968,"t":"byte","b":[11,11,11,58,90,54,54,58]},{"a":15976,"t":"byte","b":[59,11,11,11,64,11,11,94]},{"a":15984,"t":"byte","b":[11,11,11,58,90,90,58,54]},{"a":15992,"t":"byte","b":[54,54,59,87,99,89,65,66]},{"a":16000,"t":"byte","b":[11,11,11,11,11,94,11,11]},{"a":16008,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":16016,"t":"byte","b":[64,87,88,89,11,11,11,11]},{"a":16024,"t":"byte","b":[11,64,76,78,11,76,78,11]},{"a":16032,"t":"byte","b":[76,78,11,11,49,51,11,49]},{"a":16040,"t":"byte","b":[51,11,87,107,106,105,105,105]},{"a":16048,"t":"byte","b":[105,105,105,105,105,105,105,105]},{"a":16056,"t":"byte","b":[105,105,105,105,105,105,105,99]},{"a":16064,"t":"byte","b":[89,11,11,11,11,76,78,11]},{"a":16072,"t":"byte","b":[76,78,11,76,78,11,11,65]},{"a":16080,"t":"byte","b":[66,11,11,87,88,89,65,66]},{"a":16088,"t":"byte","b":[11,63,11,58,90,90,58,54]},{"a":16096,"t":"byte","b":[54,54,59,11,76,78,76,78]},{"a":16104,"t":"byte","b":[11,11,58,54,90,90,54,59]},{"a":16112,"t":"byte","b":[87,88,89,65,66,11,63,11]},{"a":16120,"t":"byte","b":[67,69,67,69,11,65,66,11]},{"a":16128,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":16136,"t":"byte","b":[11,87,88,89,11,11,11,76]},{"a":16144,"t":"byte","b":[78,11,76,78,11,11,11,11]},{"a":16152,"t":"byte","b":[11,11,11,11,11,11,94,11]},{"a":16160,"t":"byte","b":[11,11,94,11,11,11,11,11]},{"a":16168,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":16176,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":16184,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":16192,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":16200,"t":"byte","b":[11,11,87,88,89,11,11,11]},{"a":16208,"t":"byte","b":[11,11,11,11,11,11,11,94]},{"a":16216,"t":"byte","b":[11,11,11,87,88,89,11,11]},{"a":16224,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":16232,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":16240,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":16248,"t":"byte","b":[11,87,88,89,11,11,11,11]},{"a":16256,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":16264,"t":"byte","b":[11,11,11,11,11,11,11,87]},{"a":16272,"t":"byte","b":[88,89,11,11,11,11,11,11]},{"a":16280,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":16288,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":16296,"t":"byte","b":[87,88,89,11,11,11,11,11]},{"a":16304,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":16312,"t":"byte","b":[11,11,11,11,87,88,89,11]},{"a":16320,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":16328,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":16336,"t":"byte","b":[11,87,88,89,11,11,11,11]},{"a":16344,"t":"byte","b":[11,94,11,11,11,11,11,11]},{"a":16352,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":16360,"t":"byte","b":[11,11,11,11,11,11,87,88]},{"a":16368,"t":"byte","b":[89,11,11,11,11,11,94,11]},{"a":16376,"t":"byte","b":[68,70,68,70,11,11,11,11]},{"a":16384,"l":"glyph_colour_table","c":"256-entry table giving every glyph its colour. put_terrain_column at $509F and draw_status_panel at $4E70 both colour a cell by looking up the glyph they just wrote, so colour follows the tile rather than being stored per cell - which is what lets the landscape scroll by moving screen codes alone, with colour RAM following for free.","t":"byte","b":[1,1,1,1,1,1,1,1],"x":[20097,20664,22721,23007]},{"a":16392,"t":"byte","b":[1,1,4,13,6,6,6,6]},{"a":16400,"t":"byte","b":[6,6,2,2,1,5,9,9]},{"a":16408,"t":"byte","b":[2,2,7,1,7,7,7,7]},{"a":16416,"t":"byte","b":[0,2,2,2,2,1,1,0]},{"a":16424,"t":"byte","b":[8,8,15,15,15,15,1,1]},{"a":16432,"t":"byte","b":[10,10,10,10,10,10,9,9]},{"a":16440,"t":"byte","b":[10,10,9,9,13,13,13,13]},{"a":16448,"t":"gap","n":192},{"a":16640,"l":"cold_start","c":"Cold start, entered from $2938. Clears zero page $02-$72, points sprites 5 and 6 at block $9E, calls $502B, silences CIA1 interrupts ($DC0D = $7F), starts both CIA2 timers, seeds $62 = $0A and $66 = $04, decrements the eight bytes at $3B-$43, then sets up sound ($564E), installs the raster split and calls $4420 before entering the display setup at $41DE.","t":"code","b":[120],"m":"sei","x":[6750,10552]},{"a":16641,"t":"code","b":[162,112],"m":"ldx","o":"#$70"},{"a":16643,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":16645,"l":"b_4105","t":"code","b":[149,2],"m":"sta","o":"zp_clear_base,x","oa":2,"x":[16648]},{"a":16647,"t":"code","b":[202],"m":"dex"},{"a":16648,"t":"code","b":[208,251],"m":"bne","o":"b_4105","oa":16645},{"a":16650,"t":"code","b":[169,158],"m":"lda","o":"#$9E"},{"a":16652,"t":"code","b":[141,253,7],"m":"sta","o":"a_07FD","oa":2045},{"a":16655,"t":"code","b":[141,254,7],"m":"sta","o":"a_07FE","oa":2046},{"a":16658,"t":"code","b":[234],"m":"nop"},{"a":16659,"t":"code","b":[32,43,80],"m":"jsr","o":"cold_start_ports_then_sprites","oa":20523},{"a":16662,"t":"code","b":[169,127],"m":"lda","o":"#$7F"},{"a":16664,"t":"code","b":[141,13,220],"m":"sta","o":"cia1_interrupt"},{"a":16667,"t":"code","b":[169,1],"m":"lda","o":"#$01"},{"a":16669,"t":"code","b":[141,14,221],"m":"sta","o":"cia2_control_a"},{"a":16672,"t":"code","b":[141,15,221],"m":"sta","o":"cia2_control_b"},{"a":16675,"t":"code","b":[169,10],"m":"lda","o":"#$0A"},{"a":16677,"t":"code","b":[133,98],"m":"sta","o":"zp_62_unknown","oa":98},{"a":16679,"t":"code","b":[169,4],"m":"lda","o":"#$04"},{"a":16681,"t":"code","b":[133,102],"m":"sta","o":"zp_66_unknown","oa":102},{"a":16683,"t":"code","b":[162,8],"m":"ldx","o":"#$08"},{"a":16685,"l":"b_412D","t":"code","b":[214,59],"m":"dec","o":"bomb_rows_minus1,x","oa":59,"x":[16688]},{"a":16687,"t":"code","b":[202],"m":"dex"},{"a":16688,"t":"code","b":[208,251],"m":"bne","o":"b_412D","oa":16685},{"a":16690,"t":"code","b":[32,78,86],"m":"jsr","o":"reset_game_state","oa":22094},{"a":16693,"t":"code","b":[32,32,75],"m":"jsr","o":"irq_install","oa":19232},{"a":16696,"t":"code","b":[32,32,68],"m":"jsr","o":"title_page_build","oa":17440},{"a":16699,"t":"code","b":[160,0],"m":"ldy","o":"#$00"},{"a":16701,"t":"code","b":[76,222,65],"m":"jmp","o":"rebuild_display","oa":16862},{"a":16704,"l":"start_life","c":"Start of a life: sets the counter at $1D to 3 and falls into the per-life sequence.","t":"code","b":[169,3],"m":"lda","o":"#$03","x":[16880]},{"a":16706,"t":"code","b":[133,29],"m":"sta","o":"lives","oa":29},{"a":16708,"l":"life_sequence","c":"Runs once per life, before the flying loop: nine routines in order ($5080, $5030, $4E70, $5220, $52A0, $51B0, $51C0, $5260, $52F0) that build the display and the wave. If $67 is clear and the counter at $1D has reached 3 it also runs $53E3 and checks $B1, which is the path that ends the game rather than starting another life.","t":"code","b":[32,128,80],"m":"jsr","o":"clear_screen_and_reset_scroll","oa":20608,"x":[16858]},{"a":16711,"t":"code","b":[32,48,80],"m":"jsr","o":"load_sprite_registers","oa":20528},{"a":16714,"t":"code","b":[32,112,78],"m":"jsr","o":"draw_status_panel","oa":20080},{"a":16717,"t":"code","b":[32,32,82],"m":"jsr","o":"init_unread_6400_buffer","oa":21024},{"a":16720,"t":"code","b":[32,160,82],"m":"jsr","o":"clear_radar_bitmaps","oa":21152},{"a":16723,"t":"code","b":[32,176,81],"m":"jsr","o":"paint_landscape","oa":20912},{"a":16726,"t":"code","b":[32,192,81],"m":"jsr","o":"draw_status_readouts","oa":20928},{"a":16729,"t":"code","b":[32,96,82],"m":"jsr","o":"draw_radar_window","oa":21088},{"a":16732,"t":"code","b":[32,240,82],"m":"jsr","o":"draw_radar_blips","oa":21232},{"a":16735,"t":"code","b":[165,103],"m":"lda","o":"bonus_life_timer","oa":103},{"a":16737,"t":"code","b":[208,16],"m":"bne","o":"b_4173","oa":16755},{"a":16739,"t":"code","b":[165,29],"m":"lda","o":"lives","oa":29},{"a":16741,"t":"code","b":[201,3],"m":"cmp","o":"#$03"},{"a":16743,"t":"code","b":[144,10],"m":"bcc","o":"b_4173","oa":16755},{"a":16745,"t":"code","b":[32,227,83],"m":"jsr","o":"prompt_press_fire","oa":21475},{"a":16748,"t":"code","b":[165,177],"m":"lda","o":"title_timeout","oa":177},{"a":16750,"t":"code","b":[208,3],"m":"bne","o":"b_4173","oa":16755},{"a":16752,"t":"code","b":[168],"m":"tay"},{"a":16753,"t":"code","b":[240,106],"m":"beq","o":"b_41DD","oa":16861},{"a":16755,"l":"b_4173","t":"code","b":[32,112,73],"m":"jsr","o":"sid_load_engine","oa":18800,"x":[16737,16743,16750]},{"a":16758,"t":"code","b":[234],"m":"nop"},{"a":16759,"t":"code","b":[234],"m":"nop"},{"a":16760,"t":"code","b":[234],"m":"nop"},{"a":16761,"t":"code","b":[234],"m":"nop"},{"a":16762,"t":"code","b":[234],"m":"nop"},{"a":16763,"t":"code","b":[234],"m":"nop"},{"a":16764,"l":"trainer_target_lives","c":"DEC lives. This is the byte Remember's 'unlimited lives' trainer overwrites with $A5, turning DEC $1D into LDA $1D. That the cracker patched exactly here is what identifies $1D as the life counter.","t":"code","b":[198,29],"m":"dec","o":"lives","oa":29,"x":[6566]},{"a":16766,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":16768,"t":"code","b":[133,45],"m":"sta","o":"tick_counter","oa":45},{"a":16770,"t":"code","b":[32,0,80],"m":"jsr","o":"refuel_rearm_sequence","oa":20480},{"a":16773,"l":"frame_loop","c":"The per-frame loop, and the reason the game's tempo is not the frame rate. It loads CIA2 Timer B's high byte with $7F and restarts the timer one-shot ($DD0F = $09), runs the whole frame's work as a fixed list of calls - terrain, input, the aircraft, the radar, collisions - and then spins at wait_for_tick until that timer has run out. The frame therefore takes a fixed number of CIA cycles, about $7Fxx, regardless of how long the work took or what the raster is doing.","t":"code","b":[169,127],"m":"lda","o":"#$7F","x":[16843,16852]},{"a":16775,"t":"code","b":[141,7,221],"m":"sta","o":"cia2_timer_b_hi"},{"a":16778,"t":"code","b":[169,9],"m":"lda","o":"#$09"},{"a":16780,"t":"code","b":[141,15,221],"m":"sta","o":"cia2_control_b"},{"a":16783,"t":"code","b":[32,69,94],"m":"jsr","o":"refresh_blast_glyphs","oa":24133},{"a":16786,"t":"code","b":[234],"m":"nop"},{"a":16787,"t":"code","b":[32,160,82],"m":"jsr","o":"clear_radar_bitmaps","oa":21152},{"a":16790,"t":"code","b":[32,240,82],"m":"jsr","o":"draw_radar_blips","oa":21232},{"a":16793,"t":"code","b":[32,0,87],"m":"jsr","o":"read_input","oa":22272},{"a":16796,"t":"code","b":[32,0,95],"m":"jsr","o":"scroll_world","oa":24320},{"a":16799,"t":"code","b":[32,192,81],"m":"jsr","o":"draw_status_readouts","oa":20928},{"a":16802,"t":"code","b":[32,64,85],"m":"jsr","o":"burn_fuel","oa":21824},{"a":16805,"t":"code","b":[32,154,85],"m":"jsr","o":"base_refuel_and_bonus_life","oa":21914},{"a":16808,"t":"code","b":[32,64,88],"m":"jsr","o":"erase_player_missiles","oa":22592},{"a":16811,"t":"code","b":[32,112,88],"m":"jsr","o":"move_player_missiles","oa":22640},{"a":16814,"t":"code","b":[32,160,88],"m":"jsr","o":"draw_player_missiles","oa":22688},{"a":16817,"t":"code","b":[32,208,88],"m":"jsr","o":"update_enemy_aircraft","oa":22736},{"a":16820,"t":"code","b":[32,0,90],"m":"jsr","o":"update_enemy_shots","oa":23040},{"a":16823,"t":"code","b":[32,208,91],"m":"jsr","o":"update_bombs","oa":23504},{"a":16826,"t":"code","b":[32,0,66],"m":"jsr","o":"check_collisions","oa":16896},{"a":16829,"t":"code","b":[32,0,72],"m":"jsr","o":"flight_sound_update","oa":18432},{"a":16832,"l":"wait_for_tick","c":"Frame pace. Spins until CIA2 Timer B's high byte reads $7F: the game's tick is this timer, NOT the raster interrupt, which only paints the colour split. A snapshot restored into VICE comes back with this timer stopped, so the loop never exits and the game appears frozen.","t":"code","b":[173,7,221],"m":"lda","o":"cia2_timer_b_hi","x":[16837]},{"a":16835,"t":"code","b":[201,127],"m":"cmp","o":"#$7F"},{"a":16837,"t":"code","b":[208,249],"m":"bne","o":"wait_for_tick","oa":16832},{"a":16839,"t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34},{"a":16841,"t":"code","b":[41,8],"m":"and","o":"#$08"},{"a":16843,"t":"code","b":[240,184],"m":"beq","o":"frame_loop","oa":16773},{"a":16845,"t":"code","b":[32,64,86],"m":"jsr","o":"end_life_when_wreck_settled","oa":22080},{"a":16848,"t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34},{"a":16850,"t":"code","b":[41,8],"m":"and","o":"#$08"},{"a":16852,"t":"code","b":[208,175],"m":"bne","o":"frame_loop","oa":16773},{"a":16854,"t":"code","b":[165,29],"m":"lda","o":"lives","oa":29},{"a":16856,"t":"code","b":[240,3],"m":"beq","o":"b_41DD","oa":16861},{"a":16858,"t":"code","b":[76,68,65],"m":"jmp","o":"life_sequence","oa":16708},{"a":16861,"l":"b_41DD","t":"code","b":[120],"m":"sei","x":[16753,16856]},{"a":16862,"l":"rebuild_display","c":"Rebuilds the display with the raster interrupt masked off: clears $D01A, calls $46A0, re-enables the interrupt, clears $67 and drops into start_life.","t":"code","b":[169,0],"m":"lda","o":"#$00","x":[16701]},{"a":16864,"t":"code","b":[141,26,208],"m":"sta","o":"vic_irq_enable"},{"a":16867,"t":"code","b":[32,160,70],"m":"jsr","o":"show_title_screen","oa":18080},{"a":16870,"t":"code","b":[169,1],"m":"lda","o":"#$01"},{"a":16872,"t":"code","b":[141,26,208],"m":"sta","o":"vic_irq_enable"},{"a":16875,"t":"code","b":[88],"m":"cli"},{"a":16876,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":16878,"t":"code","b":[133,103],"m":"sta","o":"bonus_life_timer","oa":103},{"a":16880,"t":"code","b":[76,64,65],"m":"jmp","o":"start_life","oa":16704},{"a":16883,"t":"gap","n":13},{"a":16896,"l":"check_collisions","c":"Collision handling, both kinds, straight from the VIC's own registers. Reading them clears them, so each is read exactly once per pass and kept in zero page.","t":"code","b":[234],"m":"nop","x":[16826]},{"a":16897,"t":"code","b":[234],"m":"nop"},{"a":16898,"t":"code","b":[234],"m":"nop"},{"a":16899,"t":"code","b":[234],"m":"nop"},{"a":16900,"c":"Sprite-to-sprite collisions into $8B. Bit 0 is the player: that calls player_hit. Bits 1-4 and 5-6 are the other aircraft.","t":"code","b":[173,30,208],"m":"lda","o":"vic_sprite_collision"},{"a":16903,"t":"code","b":[133,139],"m":"sta","o":"collide_sprite","oa":139},{"a":16905,"t":"code","b":[48,54],"m":"bmi","o":"b_4241","oa":16961},{"a":16907,"t":"code","b":[41,1],"m":"and","o":"#$01"},{"a":16909,"t":"code","b":[240,50],"m":"beq","o":"b_4241","oa":16961},{"a":16911,"l":"trainer_target_collision_sprite","c":"JSR player_hit on the sprite-to-sprite path. The 'no collision' trainer writes $AD here, turning the JSR into LDA and so never calling player_hit.","t":"code","b":[32,0,68],"m":"jsr","o":"player_hit","oa":17408,"x":[6674]},{"a":16914,"t":"code","b":[165,139],"m":"lda","o":"collide_sprite","oa":139},{"a":16916,"t":"code","b":[41,96],"m":"and","o":"#$60"},{"a":16918,"t":"code","b":[240,19],"m":"beq","o":"b_422B","oa":16939},{"a":16920,"t":"code","b":[42],"m":"rol","o":"a"},{"a":16921,"t":"code","b":[162,6],"m":"ldx","o":"#$06"},{"a":16923,"l":"b_421B","t":"code","b":[42],"m":"rol","o":"a","x":[16935]},{"a":16924,"t":"code","b":[144,6],"m":"bcc","o":"b_4224","oa":16932},{"a":16926,"t":"code","b":[72],"m":"pha"},{"a":16927,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":16929,"t":"code","b":[149,163],"m":"sta","o":"bomb_ground_sub_x,x","oa":163},{"a":16931,"t":"code","b":[104],"m":"pla"},{"a":16932,"l":"b_4224","t":"code","b":[202],"m":"dex","x":[16924]},{"a":16933,"t":"code","b":[224,5],"m":"cpx","o":"#$05"},{"a":16935,"t":"code","b":[176,242],"m":"bcs","o":"b_421B","oa":16923},{"a":16937,"t":"code","b":[234],"m":"nop"},{"a":16938,"t":"code","b":[234],"m":"nop"},{"a":16939,"l":"b_422B","t":"code","b":[165,139],"m":"lda","o":"collide_sprite","oa":139,"x":[16918]},{"a":16941,"t":"code","b":[41,30],"m":"and","o":"#$1E"},{"a":16943,"t":"code","b":[240,16],"m":"beq","o":"b_4241","oa":16961},{"a":16945,"t":"code","b":[106],"m":"ror","o":"a"},{"a":16946,"t":"code","b":[162,1],"m":"ldx","o":"#$01"},{"a":16948,"l":"b_4234","t":"code","b":[106],"m":"ror","o":"a","x":[16959]},{"a":16949,"t":"code","b":[144,5],"m":"bcc","o":"b_423C","oa":16956},{"a":16951,"t":"code","b":[72],"m":"pha"},{"a":16952,"t":"code","b":[32,3,67],"m":"jsr","o":"enemy_break_off","oa":17155},{"a":16955,"t":"code","b":[104],"m":"pla"},{"a":16956,"l":"b_423C","t":"code","b":[232],"m":"inx","x":[16949]},{"a":16957,"t":"code","b":[224,5],"m":"cpx","o":"#$05"},{"a":16959,"t":"code","b":[144,243],"m":"bcc","o":"b_4234","oa":16948},{"a":16961,"l":"b_4241","c":"Sprite-to-background collisions into $8C. Bit 0 again means the player touched the scenery, and calls the same player_hit. Bits 1-4 are enemy aircraft meeting the ground.","t":"code","b":[173,31,208],"m":"lda","o":"vic_sprite_bg_collision","x":[16905,16909,16943]},{"a":16964,"t":"code","b":[133,140],"m":"sta","o":"collide_background","oa":140},{"a":16966,"t":"code","b":[240,69],"m":"beq","o":"b_428D","oa":17037},{"a":16968,"t":"code","b":[41,1],"m":"and","o":"#$01"},{"a":16970,"t":"code","b":[240,3],"m":"beq","o":"b_424F","oa":16975},{"a":16972,"l":"trainer_target_collision_background","c":"JSR player_hit on the sprite-to-background path, the second of the two bytes the 'no collision' trainer overwrites with $AD. Together with $420F this proves $4400 is the only route to losing a life.","t":"code","b":[32,0,68],"m":"jsr","o":"player_hit","oa":17408,"x":[6677]},{"a":16975,"l":"b_424F","t":"code","b":[165,140],"m":"lda","o":"collide_background","oa":140,"x":[16970]},{"a":16977,"t":"code","b":[41,30],"m":"and","o":"#$1E"},{"a":16979,"t":"code","b":[240,52],"m":"beq","o":"b_4289","oa":17033},{"a":16981,"t":"code","b":[106],"m":"ror","o":"a"},{"a":16982,"t":"code","b":[160,1],"m":"ldy","o":"#$01"},{"a":16984,"l":"b_4258","t":"code","b":[106],"m":"ror","o":"a","x":[17031]},{"a":16985,"t":"code","b":[144,41],"m":"bcc","o":"b_4284","oa":17028},{"a":16987,"t":"code","b":[72],"m":"pha"},{"a":16988,"t":"code","b":[152],"m":"tya"},{"a":16989,"t":"code","b":[72],"m":"pha"},{"a":16990,"t":"code","b":[133,47],"m":"sta","o":"zp_2f_scratch","oa":47},{"a":16992,"t":"code","b":[32,160,93],"m":"jsr","o":"sprite_cell_position","oa":23968},{"a":16995,"t":"code","b":[166,70],"m":"ldx","o":"tmp_46","oa":70},{"a":16997,"t":"code","b":[164,71],"m":"ldy","o":"enemy_row","oa":71},{"a":16999,"t":"code","b":[32,0,88],"m":"jsr","o":"screen_ptr_from_cell","oa":22528},{"a":17002,"t":"code","b":[160,2],"m":"ldy","o":"#$02"},{"a":17004,"l":"b_426C","t":"code","b":[177,5],"m":"lda","o":"(ptr_screen),y","oa":5,"x":[17011]},{"a":17006,"t":"code","b":[201,20],"m":"cmp","o":"#$14"},{"a":17008,"t":"code","b":[144,5],"m":"bcc","o":"b_4277","oa":17015},{"a":17010,"l":"b_4272","t":"code","b":[136],"m":"dey","x":[17017]},{"a":17011,"t":"code","b":[16,247],"m":"bpl","o":"b_426C","oa":17004},{"a":17013,"t":"code","b":[48,10],"m":"bmi","o":"b_4281","oa":17025},{"a":17015,"l":"b_4277","t":"code","b":[201,12],"m":"cmp","o":"#$0C","x":[17008]},{"a":17017,"t":"code","b":[144,247],"m":"bcc","o":"b_4272","oa":17010},{"a":17019,"t":"code","b":[104],"m":"pla"},{"a":17020,"t":"code","b":[170],"m":"tax"},{"a":17021,"t":"code","b":[72],"m":"pha"},{"a":17022,"t":"code","b":[32,106,94],"m":"jsr","o":"enemy_shot_down","oa":24170},{"a":17025,"l":"b_4281","t":"code","b":[104],"m":"pla","x":[17013]},{"a":17026,"t":"code","b":[168],"m":"tay"},{"a":17027,"t":"code","b":[104],"m":"pla"},{"a":17028,"l":"b_4284","t":"code","b":[200],"m":"iny","x":[16985]},{"a":17029,"t":"code","b":[192,5],"m":"cpy","o":"#$05"},{"a":17031,"t":"code","b":[144,207],"m":"bcc","o":"b_4258","oa":16984},{"a":17033,"l":"b_4289","t":"code","b":[165,140],"m":"lda","o":"collide_background","oa":140,"x":[16979]},{"a":17035,"t":"code","b":[41,96],"m":"and","o":"#$60"},{"a":17037,"l":"b_428D","t":"code","b":[240,66],"m":"beq","o":"b_42D1","oa":17105,"x":[16966]},{"a":17039,"t":"code","b":[42],"m":"rol","o":"a"},{"a":17040,"t":"code","b":[160,6],"m":"ldy","o":"#$06"},{"a":17042,"l":"b_4292","t":"code","b":[42],"m":"rol","o":"a","x":[17103]},{"a":17043,"t":"code","b":[144,55],"m":"bcc","o":"b_42CC","oa":17100},{"a":17045,"t":"code","b":[72],"m":"pha"},{"a":17046,"t":"code","b":[152],"m":"tya"},{"a":17047,"t":"code","b":[72],"m":"pha"},{"a":17048,"t":"code","b":[133,47],"m":"sta","o":"zp_2f_scratch","oa":47},{"a":17050,"t":"code","b":[32,160,93],"m":"jsr","o":"sprite_cell_position","oa":23968},{"a":17053,"t":"code","b":[166,70],"m":"ldx","o":"tmp_46","oa":70},{"a":17055,"t":"code","b":[164,71],"m":"ldy","o":"enemy_row","oa":71},{"a":17057,"t":"code","b":[200],"m":"iny"},{"a":17058,"t":"code","b":[32,80,81],"m":"jsr","o":"screen_ptr_if_on_playfield","oa":20816},{"a":17061,"t":"code","b":[176,34],"m":"bcs","o":"b_42C9","oa":17097},{"a":17063,"t":"code","b":[165,71],"m":"lda","o":"enemy_row","oa":71},{"a":17065,"t":"code","b":[201,11],"m":"cmp","o":"#$0B"},{"a":17067,"t":"code","b":[144,28],"m":"bcc","o":"b_42C9","oa":17097},{"a":17069,"t":"code","b":[208,6],"m":"bne","o":"b_42B5","oa":17077},{"a":17071,"t":"code","b":[32,96,95],"m":"jsr","o":"destroy_base","oa":24416},{"a":17074,"t":"code","b":[24],"m":"clc"},{"a":17075,"t":"code","b":[144,13],"m":"bcc","o":"b_42C2","oa":17090},{"a":17077,"l":"b_42B5","t":"code","b":[32,224,66],"m":"jsr","o":"draw_crater","oa":17120,"x":[17069]},{"a":17080,"t":"code","b":[234],"m":"nop"},{"a":17081,"t":"code","b":[234],"m":"nop"},{"a":17082,"t":"code","b":[234],"m":"nop"},{"a":17083,"t":"code","b":[234],"m":"nop"},{"a":17084,"t":"code","b":[234],"m":"nop"},{"a":17085,"t":"code","b":[234],"m":"nop"},{"a":17086,"t":"code","b":[234],"m":"nop"},{"a":17087,"t":"code","b":[234],"m":"nop"},{"a":17088,"t":"code","b":[234],"m":"nop"},{"a":17089,"t":"code","b":[234],"m":"nop"},{"a":17090,"l":"b_42C2","t":"code","b":[104],"m":"pla","x":[17075]},{"a":17091,"t":"code","b":[170],"m":"tax"},{"a":17092,"t":"code","b":[72],"m":"pha"},{"a":17093,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":17095,"t":"code","b":[149,163],"m":"sta","o":"bomb_ground_sub_x,x","oa":163},{"a":17097,"l":"b_42C9","t":"code","b":[104],"m":"pla","x":[17061,17067]},{"a":17098,"t":"code","b":[168],"m":"tay"},{"a":17099,"t":"code","b":[104],"m":"pla"},{"a":17100,"l":"b_42CC","t":"code","b":[136],"m":"dey","x":[17043]},{"a":17101,"t":"code","b":[192,5],"m":"cpy","o":"#$05"},{"a":17103,"t":"code","b":[176,193],"m":"bcs","o":"b_4292","oa":17042},{"a":17105,"l":"b_42D1","t":"code","b":[198,175],"m":"dec","o":"zp_af_unknown","oa":175,"x":[17037]},{"a":17107,"t":"code","b":[165,175],"m":"lda","o":"zp_af_unknown","oa":175},{"a":17109,"t":"code","b":[16,4],"m":"bpl","o":"r_42DB","oa":17115},{"a":17111,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":17113,"t":"code","b":[133,175],"m":"sta","o":"zp_af_unknown","oa":175},{"a":17115,"l":"r_42DB","t":"code","b":[96],"m":"rts","x":[17109]},{"a":17116,"t":"gap","n":4},{"a":17120,"l":"draw_crater","c":"Stamps the two-cell bomb crater through ptr_screen: glyphs $2A and $2B, both in colour $0C. The crater's bitmaps are re-randomised every pass by $5E45, so no two craters look alike.","t":"code","b":[160,0],"m":"ldy","o":"#$00","x":[17077]},{"a":17122,"t":"code","b":[169,42],"m":"lda","o":"#$2A"},{"a":17124,"t":"code","b":[145,5],"m":"sta","o":"(ptr_screen),y","oa":5},{"a":17126,"t":"code","b":[169,12],"m":"lda","o":"#$0C"},{"a":17128,"t":"code","b":[145,7],"m":"sta","o":"(ptr_colour),y","oa":7},{"a":17130,"t":"code","b":[200],"m":"iny"},{"a":17131,"t":"code","b":[169,43],"m":"lda","o":"#$2B"},{"a":17133,"t":"code","b":[145,5],"m":"sta","o":"(ptr_screen),y","oa":5},{"a":17135,"t":"code","b":[169,12],"m":"lda","o":"#$0C"},{"a":17137,"t":"code","b":[145,7],"m":"sta","o":"(ptr_colour),y","oa":7},{"a":17139,"t":"code","b":[96],"m":"rts"},{"a":17140,"t":"gap","n":15},{"a":17155,"l":"enemy_break_off","c":"Puts one enemy slot into the leaving state: if $57,x is flying (non-zero and below $D0) it is forced to $D0, the range that pins the aircraft to shape $95 and flies it off. Called from the collision handler at $4238, so an aircraft that survives a collision breaks off rather than dying.","t":"code","b":[181,87],"m":"lda","o":"enemy_state,x","oa":87,"x":[16952]},{"a":17157,"t":"code","b":[240,8],"m":"beq","o":"r_430F","oa":17167},{"a":17159,"t":"code","b":[201,208],"m":"cmp","o":"#$D0"},{"a":17161,"t":"code","b":[176,4],"m":"bcs","o":"r_430F","oa":17167},{"a":17163,"t":"code","b":[169,208],"m":"lda","o":"#$D0"},{"a":17165,"t":"code","b":[149,87],"m":"sta","o":"enemy_state,x","oa":87},{"a":17167,"l":"r_430F","t":"code","b":[96],"m":"rts","x":[17157,17161]},{"a":17168,"l":"sprite_register_image","c":"47-byte image of the sprite registers $D000-$D02E, copied by load_sprite_registers at $5032. A byte of $FF means leave that register alone, which is how the routine sets positions and colours without disturbing whatever is already enabled.","t":"byte","b":[0,0,0,0,0,0,0,0],"x":[20530]},{"a":17176,"t":"byte","b":[0,0,0,0,0,0,0,0]},{"a":17184,"t":"byte","b":[0,255,255,255,255,0,24,0]},{"a":17192,"t":"byte","b":[28,255,255,0,128,0,255,255]},{"a":17200,"t":"byte","b":[5,14,7,0,1,2,4,6]},{"a":17208,"t":"byte","b":[2,2,2,2,0,0,1,234]},{"a":17216,"l":"enemy_update_slot","c":"Per-slot enemy update, called with X counting 4 down to 1. It branches on the slot's state byte $57,x: at $E0 and above the aircraft is destroyed and goes to $43A9, which picks a random debris frame from SID oscillator 3; between $D0 and $DF it is leaving and is pinned to shape $95; below that it is flying, and the manoeuvre code chooses its next attitude frame from the $94-$98 or $99-$9D set.","t":"code","b":[162,4],"m":"ldx","o":"#$04","x":[22763]},{"a":17218,"l":"j_4342","t":"code","b":[181,87],"m":"lda","o":"enemy_state,x","oa":87,"x":[17357]},{"a":17220,"t":"code","b":[201,224],"m":"cmp","o":"#$E0"},{"a":17222,"t":"code","b":[176,97],"m":"bcs","o":"b_43A9","oa":17321},{"a":17224,"t":"code","b":[201,208],"m":"cmp","o":"#$D0"},{"a":17226,"t":"code","b":[176,82],"m":"bcs","o":"b_439E","oa":17310},{"a":17228,"t":"code","b":[165,45],"m":"lda","o":"tick_counter","oa":45},{"a":17230,"t":"code","b":[41,7],"m":"and","o":"#$07"},{"a":17232,"t":"code","b":[208,120],"m":"bne","o":"b_43CA","oa":17354},{"a":17234,"l":"b_4352","t":"code","b":[138],"m":"txa","x":[17319]},{"a":17235,"t":"code","b":[168],"m":"tay"},{"a":17236,"t":"code","b":[169,1],"m":"lda","o":"#$01"},{"a":17238,"l":"b_4356","t":"code","b":[10],"m":"asl","o":"a","x":[17240]},{"a":17239,"t":"code","b":[136],"m":"dey"},{"a":17240,"t":"code","b":[208,252],"m":"bne","o":"b_4356","oa":17238},{"a":17242,"t":"code","b":[73,255],"m":"eor","o":"#$FF"},{"a":17244,"t":"code","b":[45,28,208],"m":"and","o":"vic_sprite_multicolour"},{"a":17247,"t":"code","b":[141,28,208],"m":"sta","o":"vic_sprite_multicolour"},{"a":17250,"t":"code","b":[169,2],"m":"lda","o":"#$02"},{"a":17252,"t":"code","b":[157,39,208],"m":"sta","o":"vic_sprite0_colour,x"},{"a":17255,"t":"code","b":[189,248,7],"m":"lda","o":"f_07F8,x","oa":2040},{"a":17258,"t":"code","b":[201,153],"m":"cmp","o":"#$99"},{"a":17260,"t":"code","b":[144,3],"m":"bcc","o":"b_4371","oa":17265},{"a":17262,"t":"code","b":[56],"m":"sec"},{"a":17263,"t":"code","b":[233,5],"m":"sbc","o":"#$05"},{"a":17265,"l":"b_4371","t":"code","b":[168],"m":"tay","x":[17260]},{"a":17266,"t":"code","b":[181,91],"m":"lda","o":"enemy_param6,x","oa":91},{"a":17268,"t":"code","b":[208,12],"m":"bne","o":"b_4382","oa":17282},{"a":17270,"t":"code","b":[192,150],"m":"cpy","o":"#$96"},{"a":17272,"t":"code","b":[240,24],"m":"beq","o":"b_4392","oa":17298},{"a":17274,"t":"code","b":[176,3],"m":"bcs","o":"b_437F","oa":17279},{"a":17276,"t":"code","b":[200],"m":"iny"},{"a":17277,"t":"code","b":[208,19],"m":"bne","o":"b_4392","oa":17298},{"a":17279,"l":"b_437F","t":"code","b":[136],"m":"dey","x":[17274]},{"a":17280,"t":"code","b":[208,16],"m":"bne","o":"b_4392","oa":17298},{"a":17282,"l":"b_4382","t":"code","b":[48,8],"m":"bmi","o":"b_438C","oa":17292,"x":[17268]},{"a":17284,"t":"code","b":[200],"m":"iny"},{"a":17285,"t":"code","b":[192,153],"m":"cpy","o":"#$99"},{"a":17287,"t":"code","b":[144,9],"m":"bcc","o":"b_4392","oa":17298},{"a":17289,"t":"code","b":[136],"m":"dey"},{"a":17290,"t":"code","b":[208,6],"m":"bne","o":"b_4392","oa":17298},{"a":17292,"l":"b_438C","t":"code","b":[136],"m":"dey","x":[17282]},{"a":17293,"t":"code","b":[192,148],"m":"cpy","o":"#$94"},{"a":17295,"t":"code","b":[176,1],"m":"bcs","o":"b_4392","oa":17298},{"a":17297,"t":"code","b":[200],"m":"iny"},{"a":17298,"l":"b_4392","t":"code","b":[165,96],"m":"lda","o":"wave_direction","oa":96,"x":[17272,17277,17280,17287,17290,17295]},{"a":17300,"t":"code","b":[16,5],"m":"bpl","o":"b_439B","oa":17307},{"a":17302,"t":"code","b":[152],"m":"tya"},{"a":17303,"t":"code","b":[24],"m":"clc"},{"a":17304,"t":"code","b":[105,5],"m":"adc","o":"#$05"},{"a":17306,"t":"code","b":[168],"m":"tay"},{"a":17307,"l":"b_439B","t":"code","b":[152],"m":"tya","x":[17300]},{"a":17308,"t":"code","b":[208,41],"m":"bne","o":"b_43C7","oa":17351},{"a":17310,"l":"b_439E","t":"code","b":[169,149],"m":"lda","o":"#$95","x":[17226]},{"a":17312,"t":"code","b":[157,248,7],"m":"sta","o":"f_07F8,x","oa":2040},{"a":17315,"t":"code","b":[165,45],"m":"lda","o":"tick_counter","oa":45},{"a":17317,"t":"code","b":[41,1],"m":"and","o":"#$01"},{"a":17319,"t":"code","b":[208,169],"m":"bne","o":"b_4352","oa":17234},{"a":17321,"l":"b_43A9","t":"code","b":[138],"m":"txa","x":[17222]},{"a":17322,"t":"code","b":[168],"m":"tay"},{"a":17323,"t":"code","b":[169,1],"m":"lda","o":"#$01"},{"a":17325,"l":"b_43AD","t":"code","b":[10],"m":"asl","o":"a","x":[17327]},{"a":17326,"t":"code","b":[136],"m":"dey"},{"a":17327,"t":"code","b":[208,252],"m":"bne","o":"b_43AD","oa":17325},{"a":17329,"t":"code","b":[13,28,208],"m":"ora","o":"vic_sprite_multicolour"},{"a":17332,"t":"code","b":[141,28,208],"m":"sta","o":"vic_sprite_multicolour"},{"a":17335,"t":"code","b":[169,1],"m":"lda","o":"#$01"},{"a":17337,"t":"code","b":[157,39,208],"m":"sta","o":"vic_sprite0_colour,x"},{"a":17340,"c":"Random shape for an aircraft: SID oscillator 3 ($D41B) masked to 0-3 and added to $88, written to that sprite's pointer. The game's randomness comes from the sound chip.","t":"code","b":[173,27,212],"m":"lda","o":"sid_v3_oscillator"},{"a":17343,"t":"code","b":[234],"m":"nop"},{"a":17344,"t":"code","b":[234],"m":"nop"},{"a":17345,"t":"code","b":[234],"m":"nop"},{"a":17346,"t":"code","b":[41,3],"m":"and","o":"#$03"},{"a":17348,"t":"code","b":[24],"m":"clc"},{"a":17349,"t":"code","b":[105,136],"m":"adc","o":"#$88"},{"a":17351,"l":"b_43C7","t":"code","b":[157,248,7],"m":"sta","o":"f_07F8,x","oa":2040,"x":[17308]},{"a":17354,"l":"b_43CA","t":"code","b":[202],"m":"dex","x":[17232]},{"a":17355,"t":"code","b":[240,3],"m":"beq","o":"r_43D0","oa":17360},{"a":17357,"t":"code","b":[76,66,67],"m":"jmp","o":"j_4342","oa":17218},{"a":17360,"l":"r_43D0","t":"code","b":[96],"m":"rts","x":[17355]},{"a":17361,"t":"gap","n":15},{"a":17376,"l":"enemy_sprites_level","c":"Points all four enemy sprite pointers ($07F9-$07FC) at the level attitude facing the way the wave is travelling: $96 when wave_direction is positive, $9B when negative, the two being the level frames of the nose-left and nose-right sets. Then sets the wave's size and spacing.","t":"code","b":[165,96],"m":"lda","o":"wave_direction","oa":96,"x":[17722]},{"a":17378,"t":"code","b":[48,4],"m":"bmi","o":"b_43E8","oa":17384},{"a":17380,"t":"code","b":[169,150],"m":"lda","o":"#$96"},{"a":17382,"t":"code","b":[208,2],"m":"bne","o":"b_43EA","oa":17386},{"a":17384,"l":"b_43E8","t":"code","b":[169,155],"m":"lda","o":"#$9B","x":[17378]},{"a":17386,"l":"b_43EA","t":"code","b":[141,249,7],"m":"sta","o":"a_07F9","oa":2041,"x":[17382]},{"a":17389,"t":"code","b":[141,250,7],"m":"sta","o":"a_07FA","oa":2042},{"a":17392,"t":"code","b":[141,251,7],"m":"sta","o":"a_07FB","oa":2043},{"a":17395,"t":"code","b":[141,252,7],"m":"sta","o":"a_07FC","oa":2044},{"a":17398,"t":"code","b":[32,128,74],"m":"jsr","o":"wave_size_and_spacing","oa":19072},{"a":17401,"t":"code","b":[96],"m":"rts"},{"a":17402,"t":"gap","n":6},{"a":17408,"l":"player_hit","c":"Player crash response, called from $420F (sprite-to-sprite) and $424C (sprite-to-background). Rewrites flight_flags to (old & $10) | $08: every bit but 4 is dropped and bit 3 is forced on, which makes the input gate at $573D forge 'down held' from then on, so the aircraft falls out of the sky with the stick dead. If sprite 0's Y ($D001) is already $7F or more - at or below the ground line - it also zeroes vel_x and vel_y, stopping the wreck dead. It awards nothing and does not touch lives; the impact sound and the end of the life are left to flight_sound_update ($4800), which sees bit 3 on the next frame.","t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34,"x":[16911,16972]},{"a":17410,"t":"code","b":[41,16],"m":"and","o":"#$10"},{"a":17412,"t":"code","b":[9,8],"m":"ora","o":"#$08"},{"a":17414,"t":"code","b":[133,34],"m":"sta","o":"flight_flags","oa":34},{"a":17416,"t":"code","b":[173,1,208],"m":"lda","o":"vic_sprite0_y"},{"a":17419,"t":"code","b":[201,127],"m":"cmp","o":"#$7F"},{"a":17421,"t":"code","b":[144,6],"m":"bcc","o":"r_4415","oa":17429},{"a":17423,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":17425,"t":"code","b":[133,42],"m":"sta","o":"vel_x","oa":42},{"a":17427,"t":"code","b":[133,43],"m":"sta","o":"vel_y","oa":43},{"a":17429,"l":"r_4415","t":"code","b":[96],"m":"rts","x":[17421]},{"a":17430,"t":"gap","n":10},{"a":17440,"l":"title_page_build","c":"Cold start only, from $4138: builds the title/high-score page in the 1000-byte off-screen screen image at $0800-$0BE7 (the VIC is pointed at it by $D018 = $2C in show_title_screen). Fills the whole page with spaces, writes rank digits 1-5 at $08CF, $091F, $096F, $09BF and $0A0F each followed by the full-stop glyph $9C, zeroes the five 5-digit score fields at $08D2, $0922, $0972, $09C2 and $0A12 (one entry every $50 bytes, i.e. two screen rows apart), and lays the alphabet strip - codes $80-$9B, which decode as '.A-Z_' - across $0B4E-$0B69 for name entry. Ends by calling title_paint_colours.","t":"code","b":[162,250],"m":"ldx","o":"#$FA","x":[16696]},{"a":17442,"t":"code","b":[169,32],"m":"lda","o":"#$20"},{"a":17444,"l":"b_4424","t":"code","b":[157,255,7],"m":"sta","o":"f_07FF,x","oa":2047,"x":[17457]},{"a":17447,"t":"code","b":[157,249,8],"m":"sta","o":"title_clear_base_08f9,x","oa":2297},{"a":17450,"t":"code","b":[157,243,9],"m":"sta","o":"title_clear_base_09f3,x","oa":2547},{"a":17453,"t":"code","b":[157,237,10],"m":"sta","o":"title_clear_base_0aed,x","oa":2797},{"a":17456,"t":"code","b":[202],"m":"dex"},{"a":17457,"t":"code","b":[208,241],"m":"bne","o":"b_4424","oa":17444},{"a":17459,"t":"code","b":[160,1],"m":"ldy","o":"#$01"},{"a":17461,"t":"code","b":[140,207,8],"m":"sty","o":"title_rank1_digit","oa":2255},{"a":17464,"t":"code","b":[200],"m":"iny"},{"a":17465,"t":"code","b":[140,31,9],"m":"sty","o":"title_rank2_digit","oa":2335},{"a":17468,"t":"code","b":[200],"m":"iny"},{"a":17469,"t":"code","b":[140,111,9],"m":"sty","o":"title_rank3_digit","oa":2415},{"a":17472,"t":"code","b":[200],"m":"iny"},{"a":17473,"t":"code","b":[140,191,9],"m":"sty","o":"title_rank4_digit","oa":2495},{"a":17476,"t":"code","b":[200],"m":"iny"},{"a":17477,"t":"code","b":[140,15,10],"m":"sty","o":"title_rank5_digit","oa":2575},{"a":17480,"t":"code","b":[160,156],"m":"ldy","o":"#$9C"},{"a":17482,"t":"code","b":[140,208,8],"m":"sty","o":"title_rank1_colon","oa":2256},{"a":17485,"t":"code","b":[140,32,9],"m":"sty","o":"title_rank2_colon","oa":2336},{"a":17488,"t":"code","b":[140,112,9],"m":"sty","o":"title_rank3_colon","oa":2416},{"a":17491,"t":"code","b":[140,192,9],"m":"sty","o":"title_rank4_colon","oa":2496},{"a":17494,"t":"code","b":[140,16,10],"m":"sty","o":"title_rank5_colon","oa":2576},{"a":17497,"t":"code","b":[162,4],"m":"ldx","o":"#$04"},{"a":17499,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":17501,"l":"b_445D","t":"code","b":[157,210,8],"m":"sta","o":"title_rank1_score,x","oa":2258,"x":[17517]},{"a":17504,"t":"code","b":[157,34,9],"m":"sta","o":"title_rank2_score,x","oa":2338},{"a":17507,"t":"code","b":[157,114,9],"m":"sta","o":"title_rank3_score,x","oa":2418},{"a":17510,"t":"code","b":[157,194,9],"m":"sta","o":"title_rank4_score,x","oa":2498},{"a":17513,"t":"code","b":[157,18,10],"m":"sta","o":"title_rank5_score,x","oa":2578},{"a":17516,"t":"code","b":[202],"m":"dex"},{"a":17517,"t":"code","b":[16,238],"m":"bpl","o":"b_445D","oa":17501},{"a":17519,"t":"code","b":[162,27],"m":"ldx","o":"#$1B"},{"a":17521,"t":"code","b":[160,155],"m":"ldy","o":"#$9B"},{"a":17523,"l":"b_4473","t":"code","b":[152],"m":"tya","x":[17529]},{"a":17524,"t":"code","b":[157,78,11],"m":"sta","o":"title_alphabet_strip,x","oa":2894},{"a":17527,"t":"code","b":[136],"m":"dey"},{"a":17528,"t":"code","b":[202],"m":"dex"},{"a":17529,"t":"code","b":[16,248],"m":"bpl","o":"b_4473","oa":17523},{"a":17531,"t":"code","b":[32,128,68],"m":"jsr","o":"title_paint_colours","oa":17536},{"a":17534,"t":"code","b":[96],"m":"rts"},{"a":17535,"t":"gap","n":1},{"a":17536,"l":"title_paint_colours","c":"Paints all 1000 cells of colour RAM ($D800-$DBE7) purple ($04) as the title screen's background colour, then calls title_draw_credits for the logo and the credit line. Called from title_page_build at cold start and again from show_title_screen ($46D2) every time the title is put back up.","t":"code","b":[162,250],"m":"ldx","o":"#$FA","x":[17531,18130]},{"a":17538,"t":"code","b":[169,4],"m":"lda","o":"#$04"},{"a":17540,"l":"b_4484","t":"code","b":[157,255,215],"m":"sta","o":"$D7FF,x","x":[17553]},{"a":17543,"t":"code","b":[157,249,216],"m":"sta","o":"$D8F9,x"},{"a":17546,"t":"code","b":[157,243,217],"m":"sta","o":"$D9F3,x"},{"a":17549,"t":"code","b":[157,237,218],"m":"sta","o":"$DAED,x"},{"a":17552,"t":"code","b":[202],"m":"dex"},{"a":17553,"t":"code","b":[208,241],"m":"bne","o":"b_4484","oa":17540},{"a":17555,"t":"code","b":[32,160,68],"m":"jsr","o":"title_draw_credits","oa":17568},{"a":17558,"t":"code","b":[96],"m":"rts"},{"a":17559,"t":"gap","n":9},{"a":17568,"l":"title_draw_credits","c":"Draws the credit line on the title page. Calls title_draw_logo first, then copies the 40 bytes at $2F80 - '(c)VIRGIN GAMES 1983  WRITTEN BY STEVE LEE' in the game's own alphabet - into the bottom row of the off-screen page at $0BC0-$0BE7 and sets the matching colour RAM $DBC0-$DBE7 to light grey ($0F).","t":"code","b":[32,192,68],"m":"jsr","o":"title_draw_logo","oa":17600,"x":[17555]},{"a":17571,"t":"code","b":[162,39],"m":"ldx","o":"#$27"},{"a":17573,"l":"b_44A5","t":"code","b":[189,128,47],"m":"lda","o":"str_copyright,x","oa":12160,"x":[17585]},{"a":17576,"t":"code","b":[157,192,11],"m":"sta","o":"title_credit_line,x","oa":3008},{"a":17579,"t":"code","b":[169,15],"m":"lda","o":"#$0F"},{"a":17581,"t":"code","b":[157,192,219],"m":"sta","o":"$DBC0,x"},{"a":17584,"t":"code","b":[202],"m":"dex"},{"a":17585,"t":"code","b":[16,242],"m":"bpl","o":"b_44A5","oa":17573},{"a":17587,"t":"code","b":[96],"m":"rts"},{"a":17588,"t":"gap","n":12},{"a":17600,"l":"title_draw_logo","c":"Draws the FALCON PATROL logo on the title page. Colours screen row 0's colour RAM ($D800-$D827) yellow ($07) and row 1's ($D828-$D84F) green ($05), then copies the two 16-glyph strips at $5B80 and $5B90 into the off-screen page at $080C and $0834. Those are glyphs $B5-$CF, the top and bottom halves of a 16x2 character-drawn 'FALCON PATROL'.","t":"code","b":[162,39],"m":"ldx","o":"#$27","x":[17568]},{"a":17602,"l":"b_44C2","t":"code","b":[169,7],"m":"lda","o":"#$07","x":[17613]},{"a":17604,"t":"code","b":[157,0,216],"m":"sta","o":"colour_ram,x"},{"a":17607,"t":"code","b":[169,5],"m":"lda","o":"#$05"},{"a":17609,"t":"code","b":[157,40,216],"m":"sta","o":"$D828,x"},{"a":17612,"t":"code","b":[202],"m":"dex"},{"a":17613,"t":"code","b":[16,243],"m":"bpl","o":"b_44C2","oa":17602},{"a":17615,"t":"code","b":[162,15],"m":"ldx","o":"#$0F"},{"a":17617,"l":"b_44D1","t":"code","b":[189,128,91],"m":"lda","o":"logo_row_top,x","oa":23424,"x":[17630]},{"a":17620,"t":"code","b":[157,12,8],"m":"sta","o":"title_logo_top,x","oa":2060},{"a":17623,"t":"code","b":[189,144,91],"m":"lda","o":"logo_row_bottom,x","oa":23440},{"a":17626,"t":"code","b":[157,52,8],"m":"sta","o":"title_logo_bottom,x","oa":2100},{"a":17629,"t":"code","b":[202],"m":"dex"},{"a":17630,"t":"code","b":[16,241],"m":"bpl","o":"b_44D1","oa":17617},{"a":17632,"t":"code","b":[96],"m":"rts"},{"a":17633,"t":"gap","n":31},{"a":17664,"l":"wave_start","c":"Starts a new enemy wave; called once per frame from $58D0. Does nothing unless the wave-state byte $61 has bits 0-2 all clear (no wave running) and tick_counter & $3F is zero, so a wave can only begin on one tick in 64. Then it picks the wave's entry column $64 = ($0D - $A0) + (SID oscillator 3, $D41B, masked to $3F) - a random point 96 to 160 character columns behind the scrolled world position $0D, well off the 44-column visible window; picks the wave's travel direction $60 = $01 or $FF from the sign of a second $D41B read; sets bit 0 of $61 to mark the wave running; clears the release timer $63 and the released-count $65; seeds the kill award $AA with $19 (25 points, which $5E10 doubles after each kill to give 25/50/100/200 within a wave); and calls $43E0.","t":"code","b":[165,97],"m":"lda","o":"active_flags","oa":97,"x":[22736]},{"a":17666,"t":"code","b":[41,7],"m":"and","o":"#$07"},{"a":17668,"t":"code","b":[208,57],"m":"bne","o":"r_453F","oa":17727},{"a":17670,"t":"code","b":[165,45],"m":"lda","o":"tick_counter","oa":45},{"a":17672,"t":"code","b":[41,63],"m":"and","o":"#$3F"},{"a":17674,"t":"code","b":[208,51],"m":"bne","o":"r_453F","oa":17727},{"a":17676,"t":"code","b":[165,13],"m":"lda","o":"world_x","oa":13},{"a":17678,"t":"code","b":[56],"m":"sec"},{"a":17679,"t":"code","b":[233,160],"m":"sbc","o":"#$A0"},{"a":17681,"t":"code","b":[133,16],"m":"sta","o":"tmp_x","oa":16},{"a":17683,"t":"code","b":[173,27,212],"m":"lda","o":"sid_v3_oscillator"},{"a":17686,"t":"code","b":[41,63],"m":"and","o":"#$3F"},{"a":17688,"t":"code","b":[24],"m":"clc"},{"a":17689,"t":"code","b":[101,16],"m":"adc","o":"tmp_x","oa":16},{"a":17691,"t":"code","b":[133,100],"m":"sta","o":"wave_spawn_column","oa":100},{"a":17693,"t":"code","b":[173,27,212],"m":"lda","o":"sid_v3_oscillator"},{"a":17696,"t":"code","b":[16,4],"m":"bpl","o":"b_4526","oa":17702},{"a":17698,"t":"code","b":[169,255],"m":"lda","o":"#$FF"},{"a":17700,"t":"code","b":[208,2],"m":"bne","o":"b_4528","oa":17704},{"a":17702,"l":"b_4526","t":"code","b":[169,1],"m":"lda","o":"#$01","x":[17696]},{"a":17704,"l":"b_4528","t":"code","b":[133,96],"m":"sta","o":"wave_direction","oa":96,"x":[17700]},{"a":17706,"t":"code","b":[165,97],"m":"lda","o":"active_flags","oa":97},{"a":17708,"t":"code","b":[9,1],"m":"ora","o":"#$01"},{"a":17710,"t":"code","b":[133,97],"m":"sta","o":"active_flags","oa":97},{"a":17712,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":17714,"t":"code","b":[133,99],"m":"sta","o":"zp_63_wave_counter","oa":99},{"a":17716,"t":"code","b":[133,101],"m":"sta","o":"zp_65_unknown","oa":101},{"a":17718,"t":"code","b":[169,25],"m":"lda","o":"#$19"},{"a":17720,"t":"code","b":[133,170],"m":"sta","o":"wave_score_value","oa":170},{"a":17722,"t":"code","b":[32,224,67],"m":"jsr","o":"enemy_sprites_level","oa":17376},{"a":17725,"t":"code","b":[234],"m":"nop"},{"a":17726,"t":"code","b":[234],"m":"nop"},{"a":17727,"l":"r_453F","t":"code","b":[96],"m":"rts","x":[17668,17674]},{"a":17728,"l":"wave_release_aircraft","c":"Releases the next aircraft of the running wave, once per frame from $58D9. Runs only while $61 bit 0 is set and fewer than $66 aircraft (the wave size chosen by wave_size_and_spacing) have been released. Counts $63 up to the spacing value $62, resets it, bumps the released-count $65 and uses that as the slot index x (1-4) to arm one aircraft: $57+x goes from 0 to 1 (slot now alive), $4B+x = $64 (the wave's entry column), $47+x, $4F+x and $53+x = 0 (row, sub-row, sub-column) and $5B+x = $FF, so it enters descending.","t":"code","b":[165,97],"m":"lda","o":"active_flags","oa":97,"x":[22745]},{"a":17730,"t":"code","b":[41,1],"m":"and","o":"#$01"},{"a":17732,"t":"code","b":[240,41],"m":"beq","o":"r_456F","oa":17775},{"a":17734,"t":"code","b":[165,101],"m":"lda","o":"zp_65_unknown","oa":101},{"a":17736,"t":"code","b":[197,102],"m":"cmp","o":"zp_66_unknown","oa":102},{"a":17738,"t":"code","b":[176,35],"m":"bcs","o":"r_456F","oa":17775},{"a":17740,"t":"code","b":[230,99],"m":"inc","o":"zp_63_wave_counter","oa":99},{"a":17742,"t":"code","b":[165,99],"m":"lda","o":"zp_63_wave_counter","oa":99},{"a":17744,"t":"code","b":[197,98],"m":"cmp","o":"zp_62_unknown","oa":98},{"a":17746,"t":"code","b":[144,27],"m":"bcc","o":"r_456F","oa":17775},{"a":17748,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":17750,"t":"code","b":[133,99],"m":"sta","o":"zp_63_wave_counter","oa":99},{"a":17752,"t":"code","b":[230,101],"m":"inc","o":"zp_65_unknown","oa":101},{"a":17754,"t":"code","b":[166,101],"m":"ldx","o":"zp_65_unknown","oa":101},{"a":17756,"t":"code","b":[234],"m":"nop"},{"a":17757,"t":"code","b":[246,87],"m":"inc","o":"enemy_state,x","oa":87},{"a":17759,"t":"code","b":[165,100],"m":"lda","o":"wave_spawn_column","oa":100},{"a":17761,"t":"code","b":[149,75],"m":"sta","o":"enemy_map_x,x","oa":75},{"a":17763,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":17765,"t":"code","b":[149,71],"m":"sta","o":"enemy_row,x","oa":71},{"a":17767,"t":"code","b":[149,79],"m":"sta","o":"enemy_param3,x","oa":79},{"a":17769,"t":"code","b":[149,83],"m":"sta","o":"enemy_param4,x","oa":83},{"a":17771,"t":"code","b":[169,255],"m":"lda","o":"#$FF"},{"a":17773,"t":"code","b":[149,91],"m":"sta","o":"enemy_param6,x","oa":91},{"a":17775,"l":"r_456F","t":"code","b":[96],"m":"rts","x":[17732,17738,17746]},{"a":17776,"l":"enemy_move_x","c":"Moves every live enemy aircraft sideways; called once per frame from $58DC while $61 bit 0 says a wave is running. Runs seven sub-steps (y = 7..1) over the four slots x = 4..1, so an aircraft crosses 7/8 of a character cell per frame. For each live slot it ages the aircraft by incrementing its state byte $57+x on every 32nd tick, and skips any slot whose $57+x has reached $E0 or more - the destroyed range - so a dying aircraft freezes horizontally. Otherwise it steps the sub-column $53+x by one in the direction held in $60, carrying into the column $4B+x when it passes 0 or 8. enemy_sprites_place turns $4B/$53 into sprite X.","t":"code","b":[165,97],"m":"lda","o":"active_flags","oa":97,"x":[22748]},{"a":17778,"t":"code","b":[41,1],"m":"and","o":"#$01"},{"a":17780,"t":"code","b":[240,73],"m":"beq","o":"r_45BF","oa":17855},{"a":17782,"t":"code","b":[160,7],"m":"ldy","o":"#$07"},{"a":17784,"l":"b_4578","t":"code","b":[162,4],"m":"ldx","o":"#$04","x":[17843]},{"a":17786,"l":"b_457A","t":"code","b":[181,87],"m":"lda","o":"enemy_state,x","oa":87,"x":[17840]},{"a":17788,"t":"code","b":[240,49],"m":"beq","o":"b_45AF","oa":17839},{"a":17790,"t":"code","b":[165,45],"m":"lda","o":"tick_counter","oa":45},{"a":17792,"t":"code","b":[41,31],"m":"and","o":"#$1F"},{"a":17794,"t":"code","b":[208,2],"m":"bne","o":"b_4586","oa":17798},{"a":17796,"t":"code","b":[246,87],"m":"inc","o":"enemy_state,x","oa":87},{"a":17798,"l":"b_4586","t":"code","b":[181,87],"m":"lda","o":"enemy_state,x","oa":87,"x":[17794]},{"a":17800,"t":"code","b":[201,224],"m":"cmp","o":"#$E0"},{"a":17802,"t":"code","b":[176,35],"m":"bcs","o":"b_45AF","oa":17839},{"a":17804,"t":"code","b":[165,96],"m":"lda","o":"wave_direction","oa":96},{"a":17806,"t":"code","b":[48,15],"m":"bmi","o":"b_459F","oa":17823},{"a":17808,"t":"code","b":[214,83],"m":"dec","o":"enemy_param4,x","oa":83},{"a":17810,"t":"code","b":[234],"m":"nop"},{"a":17811,"t":"code","b":[234],"m":"nop"},{"a":17812,"t":"code","b":[16,25],"m":"bpl","o":"b_45AF","oa":17839},{"a":17814,"t":"code","b":[169,7],"m":"lda","o":"#$07"},{"a":17816,"t":"code","b":[149,83],"m":"sta","o":"enemy_param4,x","oa":83},{"a":17818,"t":"code","b":[214,75],"m":"dec","o":"enemy_map_x,x","oa":75},{"a":17820,"t":"code","b":[76,175,69],"m":"jmp","o":"b_45AF","oa":17839},{"a":17823,"l":"b_459F","t":"code","b":[246,83],"m":"inc","o":"enemy_param4,x","oa":83,"x":[17806]},{"a":17825,"t":"code","b":[234],"m":"nop"},{"a":17826,"t":"code","b":[234],"m":"nop"},{"a":17827,"t":"code","b":[181,83],"m":"lda","o":"enemy_param4,x","oa":83},{"a":17829,"t":"code","b":[201,8],"m":"cmp","o":"#$08"},{"a":17831,"t":"code","b":[144,6],"m":"bcc","o":"b_45AF","oa":17839},{"a":17833,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":17835,"t":"code","b":[149,83],"m":"sta","o":"enemy_param4,x","oa":83},{"a":17837,"t":"code","b":[246,75],"m":"inc","o":"enemy_map_x,x","oa":75},{"a":17839,"l":"b_45AF","t":"code","b":[202],"m":"dex","x":[17788,17802,17812,17820,17831]},{"a":17840,"t":"code","b":[208,200],"m":"bne","o":"b_457A","oa":17786},{"a":17842,"t":"code","b":[136],"m":"dey"},{"a":17843,"t":"code","b":[208,195],"m":"bne","o":"b_4578","oa":17784},{"a":17845,"t":"code","b":[234],"m":"nop"},{"a":17846,"t":"code","b":[234],"m":"nop"},{"a":17847,"t":"code","b":[234],"m":"nop"},{"a":17848,"t":"code","b":[234],"m":"nop"},{"a":17849,"t":"code","b":[234],"m":"nop"},{"a":17850,"t":"code","b":[234],"m":"nop"},{"a":17851,"t":"code","b":[234],"m":"nop"},{"a":17852,"t":"code","b":[234],"m":"nop"},{"a":17853,"t":"code","b":[234],"m":"nop"},{"a":17854,"t":"code","b":[234],"m":"nop"},{"a":17855,"l":"r_45BF","t":"code","b":[96],"m":"rts","x":[17780]},{"a":17856,"l":"enemy_move_y","c":"Moves every live enemy aircraft up or down and retires the wave; called once per frame from $58E2/$58E5. Over slots x = 4..1, an aircraft whose direction byte $5B+x is non-zero steps its sub-row $4F+x, carrying into the row $47+x at 0 and 8: $5B+x negative sinks it (row increases, i.e. towards the desert), positive climbs it. An aircraft whose row goes below 0 has left the top of the sky and its slot is freed ($57+x = 0). Finally, if every slot is free and the whole wave has been released ($65 = $66), bit 0 of $61 is cleared so wave_start may begin the next wave.","t":"code","b":[165,97],"m":"lda","o":"active_flags","oa":97,"x":[22754,22757]},{"a":17858,"t":"code","b":[41,1],"m":"and","o":"#$01"},{"a":17860,"t":"code","b":[240,68],"m":"beq","o":"r_460A","oa":17930},{"a":17862,"t":"code","b":[162,4],"m":"ldx","o":"#$04"},{"a":17864,"t":"code","b":[181,87],"m":"lda","o":"enemy_state,x","oa":87},{"a":17866,"t":"code","b":[240,38],"m":"beq","o":"b_45F2","oa":17906},{"a":17868,"l":"b_45CC","t":"code","b":[181,91],"m":"lda","o":"enemy_param6,x","oa":91,"x":[17907]},{"a":17870,"t":"code","b":[240,34],"m":"beq","o":"b_45F2","oa":17906},{"a":17872,"t":"code","b":[48,18],"m":"bmi","o":"b_45E4","oa":17892},{"a":17874,"t":"code","b":[214,79],"m":"dec","o":"enemy_param3,x","oa":79},{"a":17876,"t":"code","b":[16,28],"m":"bpl","o":"b_45F2","oa":17906},{"a":17878,"t":"code","b":[169,7],"m":"lda","o":"#$07"},{"a":17880,"t":"code","b":[149,79],"m":"sta","o":"enemy_param3,x","oa":79},{"a":17882,"t":"code","b":[214,71],"m":"dec","o":"enemy_row,x","oa":71},{"a":17884,"t":"code","b":[16,20],"m":"bpl","o":"b_45F2","oa":17906},{"a":17886,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":17888,"t":"code","b":[149,87],"m":"sta","o":"enemy_state,x","oa":87},{"a":17890,"t":"code","b":[240,14],"m":"beq","o":"b_45F2","oa":17906},{"a":17892,"l":"b_45E4","t":"code","b":[246,79],"m":"inc","o":"enemy_param3,x","oa":79,"x":[17872]},{"a":17894,"t":"code","b":[181,79],"m":"lda","o":"enemy_param3,x","oa":79},{"a":17896,"t":"code","b":[201,8],"m":"cmp","o":"#$08"},{"a":17898,"t":"code","b":[144,6],"m":"bcc","o":"b_45F2","oa":17906},{"a":17900,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":17902,"t":"code","b":[149,79],"m":"sta","o":"enemy_param3,x","oa":79},{"a":17904,"t":"code","b":[246,71],"m":"inc","o":"enemy_row,x","oa":71},{"a":17906,"l":"b_45F2","t":"code","b":[202],"m":"dex","x":[17866,17870,17876,17884,17890,17898]},{"a":17907,"t":"code","b":[208,215],"m":"bne","o":"b_45CC","oa":17868},{"a":17909,"t":"code","b":[162,4],"m":"ldx","o":"#$04"},{"a":17911,"l":"b_45F7","t":"code","b":[181,87],"m":"lda","o":"enemy_state,x","oa":87,"x":[17916]},{"a":17913,"t":"code","b":[208,15],"m":"bne","o":"r_460A","oa":17930},{"a":17915,"t":"code","b":[202],"m":"dex"},{"a":17916,"t":"code","b":[208,249],"m":"bne","o":"b_45F7","oa":17911},{"a":17918,"t":"code","b":[165,101],"m":"lda","o":"zp_65_unknown","oa":101},{"a":17920,"t":"code","b":[197,102],"m":"cmp","o":"zp_66_unknown","oa":102},{"a":17922,"t":"code","b":[208,6],"m":"bne","o":"r_460A","oa":17930},{"a":17924,"t":"code","b":[165,97],"m":"lda","o":"active_flags","oa":97},{"a":17926,"t":"code","b":[41,254],"m":"and","o":"#$FE"},{"a":17928,"t":"code","b":[133,97],"m":"sta","o":"active_flags","oa":97},{"a":17930,"l":"r_460A","t":"code","b":[96],"m":"rts","x":[17860,17913,17922]},{"a":17931,"t":"gap","n":3},{"a":17934,"l":"enemy_choose_manoeuvre","c":"Chooses each live enemy aircraft's next vertical manoeuvre; called once per frame from $58DF. It writes only the per-slot direction byte $5B+x that enemy_move_y then acts on. For slots x = 4..1: an aircraft at row $0E or below has reached the desert, so it is levelled ($5B+x = 0) and, if it was not already dying, its state $57+x is forced to $E0 - the start of the destroyed range - so enemies that fly into the ground crash. Otherwise its age decides: $57+x of $E0 or more flies level, $D0 or more sinks, $80 or more climbs, which is how an aircraft that has been around too long veers away. A young aircraft manoeuvres by position: at row 0 (the top of the sky) it levels and may start sinking, at row $0A or below it levels and may start climbing, and in between it re-rolls its direction on about one call in 32. Randomness is SID oscillator 3 ($D41B) at the edges and CIA2 Timer B's low byte ($DD06) in the middle.","t":"code","b":[165,97],"m":"lda","o":"active_flags","oa":97,"x":[22751]},{"a":17936,"t":"code","b":[41,1],"m":"and","o":"#$01"},{"a":17938,"t":"code","b":[240,117],"m":"beq","o":"r_4689","oa":18057},{"a":17940,"t":"code","b":[162,4],"m":"ldx","o":"#$04"},{"a":17942,"l":"b_4616","t":"code","b":[181,87],"m":"lda","o":"enemy_state,x","oa":87,"x":[18055]},{"a":17944,"t":"code","b":[240,108],"m":"beq","o":"b_4686","oa":18054},{"a":17946,"t":"code","b":[181,71],"m":"lda","o":"enemy_row,x","oa":71},{"a":17948,"t":"code","b":[201,14],"m":"cmp","o":"#$0E"},{"a":17950,"t":"code","b":[144,16],"m":"bcc","o":"b_4630","oa":17968},{"a":17952,"t":"code","b":[181,87],"m":"lda","o":"enemy_state,x","oa":87},{"a":17954,"t":"code","b":[201,224],"m":"cmp","o":"#$E0"},{"a":17956,"t":"code","b":[176,4],"m":"bcs","o":"b_462A","oa":17962},{"a":17958,"t":"code","b":[169,224],"m":"lda","o":"#$E0"},{"a":17960,"t":"code","b":[149,87],"m":"sta","o":"enemy_state,x","oa":87},{"a":17962,"l":"b_462A","t":"code","b":[169,0],"m":"lda","o":"#$00","x":[17956,17972]},{"a":17964,"t":"code","b":[149,91],"m":"sta","o":"enemy_param6,x","oa":91},{"a":17966,"t":"code","b":[240,86],"m":"beq","o":"b_4686","oa":18054},{"a":17968,"l":"b_4630","t":"code","b":[181,87],"m":"lda","o":"enemy_state,x","oa":87,"x":[17950]},{"a":17970,"t":"code","b":[201,224],"m":"cmp","o":"#$E0"},{"a":17972,"t":"code","b":[176,244],"m":"bcs","o":"b_462A","oa":17962},{"a":17974,"t":"code","b":[201,208],"m":"cmp","o":"#$D0"},{"a":17976,"t":"code","b":[144,6],"m":"bcc","o":"b_4640","oa":17984},{"a":17978,"t":"code","b":[169,255],"m":"lda","o":"#$FF"},{"a":17980,"l":"b_463C","t":"code","b":[149,91],"m":"sta","o":"enemy_param6,x","oa":91,"x":[17990]},{"a":17982,"t":"code","b":[208,70],"m":"bne","o":"b_4686","oa":18054},{"a":17984,"l":"b_4640","t":"code","b":[201,128],"m":"cmp","o":"#$80","x":[17976]},{"a":17986,"t":"code","b":[144,4],"m":"bcc","o":"b_4648","oa":17992},{"a":17988,"t":"code","b":[169,1],"m":"lda","o":"#$01"},{"a":17990,"t":"code","b":[208,244],"m":"bne","o":"b_463C","oa":17980},{"a":17992,"l":"b_4648","t":"code","b":[181,71],"m":"lda","o":"enemy_row,x","oa":71,"x":[17986]},{"a":17994,"t":"code","b":[208,13],"m":"bne","o":"b_4659","oa":18009},{"a":17996,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":17998,"t":"code","b":[149,91],"m":"sta","o":"enemy_param6,x","oa":91},{"a":18000,"t":"code","b":[173,27,212],"m":"lda","o":"sid_v3_oscillator"},{"a":18003,"t":"code","b":[16,49],"m":"bpl","o":"b_4686","oa":18054},{"a":18005,"t":"code","b":[214,91],"m":"dec","o":"enemy_param6,x","oa":91},{"a":18007,"t":"code","b":[208,45],"m":"bne","o":"b_4686","oa":18054},{"a":18009,"l":"b_4659","t":"code","b":[201,10],"m":"cmp","o":"#$0A","x":[17994]},{"a":18011,"t":"code","b":[144,13],"m":"bcc","o":"b_466A","oa":18026},{"a":18013,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":18015,"t":"code","b":[149,91],"m":"sta","o":"enemy_param6,x","oa":91},{"a":18017,"t":"code","b":[173,27,212],"m":"lda","o":"sid_v3_oscillator"},{"a":18020,"t":"code","b":[16,32],"m":"bpl","o":"b_4686","oa":18054},{"a":18022,"t":"code","b":[246,91],"m":"inc","o":"enemy_param6,x","oa":91},{"a":18024,"t":"code","b":[208,28],"m":"bne","o":"b_4686","oa":18054},{"a":18026,"l":"b_466A","t":"code","b":[173,6,221],"m":"lda","o":"cia2_timer_b_lo","x":[18011]},{"a":18029,"t":"code","b":[133,16],"m":"sta","o":"tmp_x","oa":16},{"a":18031,"t":"code","b":[41,31],"m":"and","o":"#$1F"},{"a":18033,"t":"code","b":[208,19],"m":"bne","o":"b_4686","oa":18054},{"a":18035,"t":"code","b":[165,16],"m":"lda","o":"tmp_x","oa":16},{"a":18037,"t":"code","b":[48,6],"m":"bmi","o":"b_467D","oa":18045},{"a":18039,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":18041,"t":"code","b":[149,91],"m":"sta","o":"enemy_param6,x","oa":91},{"a":18043,"t":"code","b":[240,9],"m":"beq","o":"b_4686","oa":18054},{"a":18045,"l":"b_467D","t":"code","b":[41,1],"m":"and","o":"#$01","x":[18037]},{"a":18047,"t":"code","b":[208,2],"m":"bne","o":"b_4683","oa":18051},{"a":18049,"t":"code","b":[169,255],"m":"lda","o":"#$FF"},{"a":18051,"l":"b_4683","t":"code","b":[149,91],"m":"sta","o":"enemy_param6,x","oa":91,"x":[18047]},{"a":18053,"t":"code","b":[234],"m":"nop"},{"a":18054,"l":"b_4686","t":"code","b":[202],"m":"dex","x":[17944,17966,17982,18003,18007,18020,18024,18033,18043]},{"a":18055,"t":"code","b":[208,141],"m":"bne","o":"b_4616","oa":17942},{"a":18057,"l":"r_4689","t":"code","b":[96],"m":"rts","x":[17938]},{"a":18058,"t":"gap","n":22},{"a":18080,"l":"show_title_screen","c":"End of game and title screen; the only caller is $41E3. First calls highscore_rank_score, which ranks the score just played and leaves the rank 1-5 (0 = none) in Y; that value is kept on the stack for the rest of the routine. Paints border and background dark grey ($0B), blanks the 19 cells at $0AB2 that the 'PRESS FIRE TO START' banner and the name-entry field share, runs the crack's high-score file routines at $2855 and $294E, points the VIC at the off-screen title page ($D018 = $2C, screen $0800, charset $3000) in hires ($D016 bit 4 cleared), repaints it through title_paint_colours and turns every sprite off. On a ranking score it then runs highscore_insert, which includes name entry. It clears the fire-seen flag $B2, seeds the fire-wait timeout $B1 with $E8, draws msg_press_fire at $0AB2 in cyan ($03), sets the tune start index $9D ($17 after a high score - which shortens the tune - else 0), plays the tune with title_tune_play, then switches the VIC back to the play screen ($D018 = $1C, multicolour on) and reloads the engine sound with sid_load_engine.","t":"code","b":[32,64,76],"m":"jsr","o":"highscore_rank_score","oa":19520,"x":[16867]},{"a":18083,"t":"code","b":[152],"m":"tya"},{"a":18084,"t":"code","b":[72],"m":"pha"},{"a":18085,"t":"code","b":[169,11],"m":"lda","o":"#$0B"},{"a":18087,"t":"code","b":[141,33,208],"m":"sta","o":"vic_background0"},{"a":18090,"t":"code","b":[169,11],"m":"lda","o":"#$0B"},{"a":18092,"t":"code","b":[141,32,208],"m":"sta","o":"vic_border"},{"a":18095,"t":"code","b":[162,18],"m":"ldx","o":"#$12"},{"a":18097,"t":"code","b":[169,32],"m":"lda","o":"#$20"},{"a":18099,"l":"b_46B3","t":"code","b":[157,178,10],"m":"sta","o":"title_prompt,x","oa":2738,"x":[18103]},{"a":18102,"t":"code","b":[202],"m":"dex"},{"a":18103,"t":"code","b":[16,250],"m":"bpl","o":"b_46B3","oa":18099},{"a":18105,"t":"code","b":[32,85,40],"m":"jsr","o":"hiscore_table_to_screen","oa":10325},{"a":18108,"t":"code","b":[32,78,41],"m":"jsr","o":"hiscore_open_slot","oa":10574},{"a":18111,"t":"code","b":[234],"m":"nop"},{"a":18112,"t":"code","b":[234],"m":"nop"},{"a":18113,"t":"code","b":[234],"m":"nop"},{"a":18114,"t":"code","b":[234],"m":"nop"},{"a":18115,"t":"code","b":[234],"m":"nop"},{"a":18116,"t":"code","b":[234],"m":"nop"},{"a":18117,"t":"code","b":[169,44],"m":"lda","o":"#$2C"},{"a":18119,"t":"code","b":[141,24,208],"m":"sta","o":"vic_memory"},{"a":18122,"t":"code","b":[173,22,208],"m":"lda","o":"vic_control2"},{"a":18125,"t":"code","b":[41,239],"m":"and","o":"#$EF"},{"a":18127,"t":"code","b":[141,22,208],"m":"sta","o":"vic_control2"},{"a":18130,"t":"code","b":[32,128,68],"m":"jsr","o":"title_paint_colours","oa":17536},{"a":18133,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":18135,"t":"code","b":[141,21,208],"m":"sta","o":"vic_sprite_enable"},{"a":18138,"t":"code","b":[104],"m":"pla"},{"a":18139,"t":"code","b":[72],"m":"pha"},{"a":18140,"t":"code","b":[168],"m":"tay"},{"a":18141,"t":"code","b":[240,3],"m":"beq","o":"b_46E2","oa":18146},{"a":18143,"t":"code","b":[32,144,76],"m":"jsr","o":"highscore_insert","oa":19600},{"a":18146,"l":"b_46E2","t":"code","b":[169,0],"m":"lda","o":"#$00","x":[18141]},{"a":18148,"t":"code","b":[133,178],"m":"sta","o":"title_phase","oa":178},{"a":18150,"t":"code","b":[160,232],"m":"ldy","o":"#$E8"},{"a":18152,"t":"code","b":[132,177],"m":"sty","o":"title_timeout","oa":177},{"a":18154,"t":"code","b":[162,18],"m":"ldx","o":"#$12"},{"a":18156,"l":"b_46EC","t":"code","b":[189,208,83],"m":"lda","o":"msg_press_fire,x","oa":21456,"x":[18168]},{"a":18159,"t":"code","b":[157,178,10],"m":"sta","o":"title_prompt,x","oa":2738},{"a":18162,"t":"code","b":[169,3],"m":"lda","o":"#$03"},{"a":18164,"t":"code","b":[157,178,218],"m":"sta","o":"$DAB2,x"},{"a":18167,"t":"code","b":[202],"m":"dex"},{"a":18168,"t":"code","b":[16,242],"m":"bpl","o":"b_46EC","oa":18156},{"a":18170,"t":"code","b":[104],"m":"pla"},{"a":18171,"t":"code","b":[240,16],"m":"beq","o":"b_470D","oa":18189},{"a":18173,"t":"code","b":[162,255],"m":"ldx","o":"#$FF"},{"a":18175,"l":"b_46FF","t":"code","b":[160,255],"m":"ldy","o":"#$FF","x":[18181]},{"a":18177,"l":"b_4701","t":"code","b":[136],"m":"dey","x":[18178]},{"a":18178,"t":"code","b":[208,253],"m":"bne","o":"b_4701","oa":18177},{"a":18180,"t":"code","b":[202],"m":"dex"},{"a":18181,"t":"code","b":[208,248],"m":"bne","o":"b_46FF","oa":18175},{"a":18183,"t":"code","b":[169,23],"m":"lda","o":"#$17"},{"a":18185,"t":"code","b":[133,157],"m":"sta","o":"music_note_index","oa":157},{"a":18187,"t":"code","b":[208,6],"m":"bne","o":"b_4713","oa":18195},{"a":18189,"l":"b_470D","t":"code","b":[169,0],"m":"lda","o":"#$00","x":[18171]},{"a":18191,"t":"code","b":[133,157],"m":"sta","o":"music_note_index","oa":157},{"a":18193,"t":"code","b":[234],"m":"nop"},{"a":18194,"t":"code","b":[234],"m":"nop"},{"a":18195,"l":"b_4713","t":"code","b":[32,93,75],"m":"jsr","o":"title_tune_play","oa":19293,"x":[18187]},{"a":18198,"t":"code","b":[169,28],"m":"lda","o":"#$1C"},{"a":18200,"t":"code","b":[141,24,208],"m":"sta","o":"vic_memory"},{"a":18203,"t":"code","b":[234],"m":"nop"},{"a":18204,"t":"code","b":[234],"m":"nop"},{"a":18205,"t":"code","b":[234],"m":"nop"},{"a":18206,"t":"code","b":[234],"m":"nop"},{"a":18207,"t":"code","b":[234],"m":"nop"},{"a":18208,"t":"code","b":[173,22,208],"m":"lda","o":"vic_control2"},{"a":18211,"t":"code","b":[9,16],"m":"ora","o":"#$10"},{"a":18213,"t":"code","b":[141,22,208],"m":"sta","o":"vic_control2"},{"a":18216,"t":"code","b":[32,112,73],"m":"jsr","o":"sid_load_engine","oa":18800},{"a":18219,"t":"code","b":[96],"m":"rts"},{"a":18220,"t":"gap","n":4},{"a":18224,"l":"enemy_sprites_place","c":"Puts the four enemy aircraft on screen as hardware sprites 1-4; called once per frame from $58E8. Walks slots x = 4..1 with the matching sprite bit in Y ($10, $08, $04, $02). A free slot ($57+x = 0), or one whose column $4B+x lies $2C or more cells right of the left edge ($0D - 3), is switched off in $D015. Otherwise sprite X = (column - left edge) * 8 + $53+x, with the 256-pixel overflow moved into $D010, and sprite Y = row $47+x * 8 + $2A + $4F+x; both go to $D000+2x and $D001+2x and the sprite is switched on in $D015. So sprite 0 is the player and sprites 1-4 the enemies, the visible world window is 44 character columns wide, and enemy rows 0-$0E map to raster Y $2A-$BA.","t":"code","b":[162,4],"m":"ldx","o":"#$04","x":[22760]},{"a":18226,"t":"code","b":[160,16],"m":"ldy","o":"#$10"},{"a":18228,"l":"j_4734","t":"code","b":[181,87],"m":"lda","o":"enemy_state,x","oa":87,"x":[18360]},{"a":18230,"t":"code","b":[208,17],"m":"bne","o":"b_4749","oa":18249},{"a":18232,"l":"b_4738","t":"code","b":[152],"m":"tya","x":[18265]},{"a":18233,"t":"code","b":[73,255],"m":"eor","o":"#$FF"},{"a":18235,"t":"code","b":[133,16],"m":"sta","o":"tmp_x","oa":16},{"a":18237,"t":"code","b":[173,21,208],"m":"lda","o":"vic_sprite_enable"},{"a":18240,"t":"code","b":[37,16],"m":"and","o":"tmp_x","oa":16},{"a":18242,"t":"code","b":[141,21,208],"m":"sta","o":"vic_sprite_enable"},{"a":18245,"t":"code","b":[240,107],"m":"beq","o":"b_47B2","oa":18354},{"a":18247,"t":"code","b":[208,105],"m":"bne","o":"b_47B2","oa":18354},{"a":18249,"l":"b_4749","t":"code","b":[165,13],"m":"lda","o":"world_x","oa":13,"x":[18230]},{"a":18251,"t":"code","b":[56],"m":"sec"},{"a":18252,"t":"code","b":[233,3],"m":"sbc","o":"#$03"},{"a":18254,"t":"code","b":[133,16],"m":"sta","o":"tmp_x","oa":16},{"a":18256,"t":"code","b":[181,75],"m":"lda","o":"enemy_map_x,x","oa":75},{"a":18258,"t":"code","b":[56],"m":"sec"},{"a":18259,"t":"code","b":[229,16],"m":"sbc","o":"tmp_x","oa":16},{"a":18261,"t":"code","b":[133,47],"m":"sta","o":"zp_2f_scratch","oa":47},{"a":18263,"t":"code","b":[201,44],"m":"cmp","o":"#$2C"},{"a":18265,"t":"code","b":[176,221],"m":"bcs","o":"b_4738","oa":18232},{"a":18267,"t":"code","b":[201,32],"m":"cmp","o":"#$20"},{"a":18269,"t":"code","b":[144,21],"m":"bcc","o":"b_4774","oa":18292},{"a":18271,"t":"code","b":[132,16],"m":"sty","o":"tmp_x","oa":16},{"a":18273,"t":"code","b":[173,16,208],"m":"lda","o":"vic_sprite_x_msb"},{"a":18276,"t":"code","b":[5,16],"m":"ora","o":"tmp_x","oa":16},{"a":18278,"t":"code","b":[141,16,208],"m":"sta","o":"vic_sprite_x_msb"},{"a":18281,"t":"code","b":[165,47],"m":"lda","o":"zp_2f_scratch","oa":47},{"a":18283,"t":"code","b":[56],"m":"sec"},{"a":18284,"t":"code","b":[233,32],"m":"sbc","o":"#$20"},{"a":18286,"t":"code","b":[133,47],"m":"sta","o":"zp_2f_scratch","oa":47},{"a":18288,"t":"code","b":[240,15],"m":"beq","o":"b_4781","oa":18305},{"a":18290,"t":"code","b":[208,13],"m":"bne","o":"b_4781","oa":18305},{"a":18292,"l":"b_4774","t":"code","b":[152],"m":"tya","x":[18269]},{"a":18293,"t":"code","b":[73,255],"m":"eor","o":"#$FF"},{"a":18295,"t":"code","b":[133,16],"m":"sta","o":"tmp_x","oa":16},{"a":18297,"t":"code","b":[173,16,208],"m":"lda","o":"vic_sprite_x_msb"},{"a":18300,"t":"code","b":[37,16],"m":"and","o":"tmp_x","oa":16},{"a":18302,"t":"code","b":[141,16,208],"m":"sta","o":"vic_sprite_x_msb"},{"a":18305,"l":"b_4781","t":"code","b":[165,47],"m":"lda","o":"zp_2f_scratch","oa":47,"x":[18288,18290]},{"a":18307,"t":"code","b":[10],"m":"asl","o":"a"},{"a":18308,"t":"code","b":[10],"m":"asl","o":"a"},{"a":18309,"t":"code","b":[10],"m":"asl","o":"a"},{"a":18310,"t":"code","b":[24],"m":"clc"},{"a":18311,"t":"code","b":[117,83],"m":"adc","o":"enemy_param4,x","oa":83},{"a":18313,"t":"code","b":[133,68],"m":"sta","o":"tmp_44","oa":68},{"a":18315,"t":"code","b":[181,71],"m":"lda","o":"enemy_row,x","oa":71},{"a":18317,"t":"code","b":[10],"m":"asl","o":"a"},{"a":18318,"t":"code","b":[10],"m":"asl","o":"a"},{"a":18319,"t":"code","b":[10],"m":"asl","o":"a"},{"a":18320,"t":"code","b":[24],"m":"clc"},{"a":18321,"t":"code","b":[105,42],"m":"adc","o":"#$2A"},{"a":18323,"t":"code","b":[24],"m":"clc"},{"a":18324,"t":"code","b":[117,79],"m":"adc","o":"enemy_param3,x","oa":79},{"a":18326,"t":"code","b":[133,69],"m":"sta","o":"tmp_45","oa":69},{"a":18328,"t":"code","b":[138],"m":"txa"},{"a":18329,"t":"code","b":[72],"m":"pha"},{"a":18330,"t":"code","b":[10],"m":"asl","o":"a"},{"a":18331,"t":"code","b":[170],"m":"tax"},{"a":18332,"t":"code","b":[165,68],"m":"lda","o":"tmp_44","oa":68},{"a":18334,"t":"code","b":[157,0,208],"m":"sta","o":"vic_sprite0_x,x"},{"a":18337,"t":"code","b":[165,69],"m":"lda","o":"tmp_45","oa":69},{"a":18339,"t":"code","b":[157,1,208],"m":"sta","o":"vic_sprite0_y,x"},{"a":18342,"t":"code","b":[104],"m":"pla"},{"a":18343,"t":"code","b":[170],"m":"tax"},{"a":18344,"t":"code","b":[132,16],"m":"sty","o":"tmp_x","oa":16},{"a":18346,"t":"code","b":[173,21,208],"m":"lda","o":"vic_sprite_enable"},{"a":18349,"t":"code","b":[5,16],"m":"ora","o":"tmp_x","oa":16},{"a":18351,"t":"code","b":[141,21,208],"m":"sta","o":"vic_sprite_enable"},{"a":18354,"l":"b_47B2","t":"code","b":[202],"m":"dex","x":[18245,18247]},{"a":18355,"t":"code","b":[240,6],"m":"beq","o":"r_47BB","oa":18363},{"a":18357,"t":"code","b":[152],"m":"tya"},{"a":18358,"t":"code","b":[74],"m":"lsr","o":"a"},{"a":18359,"t":"code","b":[168],"m":"tay"},{"a":18360,"t":"code","b":[76,52,71],"m":"jmp","o":"j_4734","oa":18228},{"a":18363,"l":"r_47BB","t":"code","b":[96],"m":"rts","x":[18355]},{"a":18364,"t":"gap","n":68},{"a":18432,"l":"flight_sound_update","c":"Per-frame flight sound and landing driver, called from frame_loop at $41BD; it dispatches on flight_flags. With bit 3 set (descending, whether landing or shot down) it loads the dive preset through sid_load_dive if the sound phase $24 is still 0, then, while vel_y is non-zero or sprite 0 is still above Y $7F, ramps the voice 1 and voice 3 frequency high bytes ($AD, $AE -> $D401, $D40F, capped at $E0) and the filter cutoff $AC ($D416, capped $6D) upwards - the rising scream of the dive. Once the aircraft has stopped and is low it loads the touchdown preset through sid_load_touchdown, runs the cutoff back down to $40, and then gates all three voices off ($D404/$D40B/$D412 = $80), sets $24 = $90, zeroes tick_counter and forces the sprite 0 pointer $07F8 to $88 - the settled-on-the-ground shape the touchdown test at $5754 looks for. Anything else falls through to $4880.","t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34,"x":[16829]},{"a":18434,"t":"code","b":[41,8],"m":"and","o":"#$08"},{"a":18436,"t":"code","b":[240,122],"m":"beq","o":"flight_sound_takeoff_or_alarm","oa":18560},{"a":18438,"t":"code","b":[165,36],"m":"lda","o":"sfx_crash_state","oa":36},{"a":18440,"t":"code","b":[208,3],"m":"bne","o":"b_480D","oa":18445},{"a":18442,"t":"code","b":[32,144,73],"m":"jsr","o":"sid_load_dive","oa":18832},{"a":18445,"l":"b_480D","t":"code","b":[165,43],"m":"lda","o":"vel_y","oa":43,"x":[18440]},{"a":18447,"t":"code","b":[240,49],"m":"beq","o":"b_4842","oa":18498},{"a":18449,"l":"b_4811","t":"code","b":[230,173],"m":"inc","o":"sfx_freq_v1","oa":173,"x":[18503]},{"a":18451,"t":"code","b":[165,173],"m":"lda","o":"sfx_freq_v1","oa":173},{"a":18453,"t":"code","b":[201,224],"m":"cmp","o":"#$E0"},{"a":18455,"t":"code","b":[144,4],"m":"bcc","o":"b_481D","oa":18461},{"a":18457,"t":"code","b":[169,224],"m":"lda","o":"#$E0"},{"a":18459,"t":"code","b":[133,173],"m":"sta","o":"sfx_freq_v1","oa":173},{"a":18461,"l":"b_481D","t":"code","b":[141,1,212],"m":"sta","o":"sid_v1_freq_hi","x":[18455]},{"a":18464,"t":"code","b":[230,174],"m":"inc","o":"sfx_freq_v3","oa":174},{"a":18466,"t":"code","b":[165,174],"m":"lda","o":"sfx_freq_v3","oa":174},{"a":18468,"t":"code","b":[201,224],"m":"cmp","o":"#$E0"},{"a":18470,"t":"code","b":[144,4],"m":"bcc","o":"b_482C","oa":18476},{"a":18472,"t":"code","b":[169,224],"m":"lda","o":"#$E0"},{"a":18474,"t":"code","b":[133,174],"m":"sta","o":"sfx_freq_v3","oa":174},{"a":18476,"l":"b_482C","t":"code","b":[141,15,212],"m":"sta","o":"sid_v3_freq_hi","x":[18470]},{"a":18479,"t":"code","b":[165,172],"m":"lda","o":"sfx_filter_cutoff","oa":172},{"a":18481,"t":"code","b":[24],"m":"clc"},{"a":18482,"t":"code","b":[105,2],"m":"adc","o":"#$02"},{"a":18484,"t":"code","b":[201,109],"m":"cmp","o":"#$6D"},{"a":18486,"t":"code","b":[144,2],"m":"bcc","o":"b_483A","oa":18490},{"a":18488,"t":"code","b":[169,109],"m":"lda","o":"#$6D"},{"a":18490,"l":"b_483A","t":"code","b":[141,22,212],"m":"sta","o":"sid_filter_cutoff_hi","x":[18486]},{"a":18493,"t":"code","b":[133,172],"m":"sta","o":"sfx_filter_cutoff","oa":172},{"a":18495,"t":"code","b":[24],"m":"clc"},{"a":18496,"t":"code","b":[144,58],"m":"bcc","o":"r_487C","oa":18556},{"a":18498,"l":"b_4842","t":"code","b":[173,1,208],"m":"lda","o":"vic_sprite0_y","x":[18447]},{"a":18501,"t":"code","b":[201,127],"m":"cmp","o":"#$7F"},{"a":18503,"t":"code","b":[144,200],"m":"bcc","o":"b_4811","oa":18449},{"a":18505,"t":"code","b":[165,36],"m":"lda","o":"sfx_crash_state","oa":36},{"a":18507,"t":"code","b":[48,3],"m":"bmi","o":"b_4850","oa":18512},{"a":18509,"t":"code","b":[32,192,73],"m":"jsr","o":"sid_load_touchdown","oa":18880},{"a":18512,"l":"b_4850","t":"code","b":[165,172],"m":"lda","o":"sfx_filter_cutoff","oa":172,"x":[18507]},{"a":18514,"t":"code","b":[201,64],"m":"cmp","o":"#$40"},{"a":18516,"t":"code","b":[144,10],"m":"bcc","o":"b_4860","oa":18528},{"a":18518,"t":"code","b":[56],"m":"sec"},{"a":18519,"t":"code","b":[233,1],"m":"sbc","o":"#$01"},{"a":18521,"t":"code","b":[133,172],"m":"sta","o":"sfx_filter_cutoff","oa":172},{"a":18523,"t":"code","b":[141,22,212],"m":"sta","o":"sid_filter_cutoff_hi"},{"a":18526,"t":"code","b":[208,28],"m":"bne","o":"r_487C","oa":18556},{"a":18528,"l":"b_4860","t":"code","b":[165,36],"m":"lda","o":"sfx_crash_state","oa":36,"x":[18516]},{"a":18530,"t":"code","b":[201,144],"m":"cmp","o":"#$90"},{"a":18532,"t":"code","b":[240,22],"m":"beq","o":"r_487C","oa":18556},{"a":18534,"t":"code","b":[169,128],"m":"lda","o":"#$80"},{"a":18536,"t":"code","b":[141,4,212],"m":"sta","o":"sid_v1_control"},{"a":18539,"t":"code","b":[141,11,212],"m":"sta","o":"sid_v2_control"},{"a":18542,"t":"code","b":[141,18,212],"m":"sta","o":"sid_v3_control"},{"a":18545,"t":"code","b":[169,144],"m":"lda","o":"#$90"},{"a":18547,"t":"code","b":[133,36],"m":"sta","o":"sfx_crash_state","oa":36},{"a":18549,"t":"code","b":[133,45],"m":"sta","o":"tick_counter","oa":45},{"a":18551,"t":"code","b":[169,136],"m":"lda","o":"#$88"},{"a":18553,"t":"code","b":[141,248,7],"m":"sta","o":"f_07F8","oa":2040},{"a":18556,"l":"r_487C","t":"code","b":[96],"m":"rts","x":[18496,18526,18532]},{"a":18557,"t":"gap","n":3},{"a":18560,"l":"flight_sound_takeoff_or_alarm","c":"Second arm of flight_sound_update's dispatch, reached when flight_flags bit 3 is clear. If bit 1 is set the aircraft is taking off, so one step of sfx_takeoff_step runs; otherwise control goes to sfx_extra_life, which in turn passes on to the low-fuel alarm.","t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34,"x":[18436]},{"a":18562,"t":"code","b":[41,2],"m":"and","o":"#$02"},{"a":18564,"t":"code","b":[240,54],"m":"beq","o":"b_48BC","oa":18620},{"a":18566,"l":"sfx_takeoff_step","c":"One step of the vertical take-off sound; called from $4880 each frame and from landed_delay_step. $25 is a signed phase counter and $26 a once-only flag. While $25 is positive it starts the take-off preset through sfx_takeoff_start if $26 is clear and counts $25 up; when $25 turns negative it clears $26 and reloads $25 = $FC. While $25 is negative it gates voice 2 with control $14 once, counts $25 up, and on reaching 0 clears $26 and sets the GAS-gauge colour $2E back to red ($02).","t":"code","b":[165,37],"m":"lda","o":"sfx_takeoff_state","oa":37,"x":[18643]},{"a":18568,"t":"code","b":[48,23],"m":"bmi","o":"b_48A1","oa":18593},{"a":18570,"t":"code","b":[165,38],"m":"lda","o":"sfx_takeoff_timer","oa":38},{"a":18572,"t":"code","b":[208,3],"m":"bne","o":"b_4891","oa":18577},{"a":18574,"t":"code","b":[32,16,74],"m":"jsr","o":"sfx_takeoff_start","oa":18960},{"a":18577,"l":"b_4891","t":"code","b":[230,37],"m":"inc","o":"sfx_takeoff_state","oa":37,"x":[18572]},{"a":18579,"t":"code","b":[165,37],"m":"lda","o":"sfx_takeoff_state","oa":37},{"a":18581,"t":"code","b":[16,40],"m":"bpl","o":"r_48BF","oa":18623},{"a":18583,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":18585,"t":"code","b":[133,38],"m":"sta","o":"sfx_takeoff_timer","oa":38},{"a":18587,"t":"code","b":[169,252],"m":"lda","o":"#$FC"},{"a":18589,"t":"code","b":[133,37],"m":"sta","o":"sfx_takeoff_state","oa":37},{"a":18591,"t":"code","b":[208,30],"m":"bne","o":"r_48BF","oa":18623},{"a":18593,"l":"b_48A1","t":"code","b":[165,38],"m":"lda","o":"sfx_takeoff_timer","oa":38,"x":[18568]},{"a":18595,"t":"code","b":[208,7],"m":"bne","o":"b_48AC","oa":18604},{"a":18597,"t":"code","b":[169,20],"m":"lda","o":"#$14"},{"a":18599,"t":"code","b":[141,11,212],"m":"sta","o":"sid_v2_control"},{"a":18602,"t":"code","b":[230,38],"m":"inc","o":"sfx_takeoff_timer","oa":38},{"a":18604,"l":"b_48AC","t":"code","b":[230,37],"m":"inc","o":"sfx_takeoff_state","oa":37,"x":[18595]},{"a":18606,"t":"code","b":[165,37],"m":"lda","o":"sfx_takeoff_state","oa":37},{"a":18608,"t":"code","b":[48,13],"m":"bmi","o":"r_48BF","oa":18623},{"a":18610,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":18612,"t":"code","b":[133,38],"m":"sta","o":"sfx_takeoff_timer","oa":38},{"a":18614,"t":"code","b":[169,2],"m":"lda","o":"#$02"},{"a":18616,"t":"code","b":[133,46],"m":"sta","o":"status_bar_colour","oa":46},{"a":18618,"t":"code","b":[208,3],"m":"bne","o":"r_48BF","oa":18623},{"a":18620,"l":"b_48BC","t":"code","b":[32,160,79],"m":"jsr","o":"sfx_extra_life","oa":20384,"x":[18564]},{"a":18623,"l":"r_48BF","t":"code","b":[96],"m":"rts","x":[18581,18591,18608,18618]},{"a":18624,"t":"gap","n":9},{"a":18633,"l":"landed_delay_step","c":"Called from $500B while the aircraft is sitting on a base. Burns a busy delay of about $0B * $FF loop passes - no timer, just the CPU - then runs one step of the take-off sound (sfx_takeoff_step) and one step of the refuel/rearm counter at $5420, which is what makes the GAS and AAM readouts climb visibly while you wait on the ground.","t":"code","b":[160,11],"m":"ldy","o":"#$0B","x":[20491]},{"a":18635,"l":"b_48CB","t":"code","b":[162,255],"m":"ldx","o":"#$FF","x":[18641]},{"a":18637,"l":"b_48CD","t":"code","b":[202],"m":"dex","x":[18638]},{"a":18638,"t":"code","b":[208,253],"m":"bne","o":"b_48CD","oa":18637},{"a":18640,"t":"code","b":[136],"m":"dey"},{"a":18641,"t":"code","b":[208,248],"m":"bne","o":"b_48CB","oa":18635},{"a":18643,"t":"code","b":[32,134,72],"m":"jsr","o":"sfx_takeoff_step","oa":18566},{"a":18646,"t":"code","b":[32,32,84],"m":"jsr","o":"refuel_rearm_tick","oa":21536},{"a":18649,"t":"code","b":[96],"m":"rts"},{"a":18650,"t":"gap","n":6},{"a":18656,"l":"sfx_cutoff_decay","c":"Winds the working SID filter cutoff $AC down by one per call, with a floor of $10, and writes it to $D416. Sole caller is $5EF8. What that call site is doing is outside this range and the sound this fades is not established here; mechanically it is only a one-step cutoff fade.","t":"code","b":[165,172],"m":"lda","o":"sfx_filter_cutoff","oa":172,"x":[24312]},{"a":18658,"t":"code","b":[56],"m":"sec"},{"a":18659,"t":"code","b":[233,1],"m":"sbc","o":"#$01"},{"a":18661,"t":"code","b":[201,16],"m":"cmp","o":"#$10"},{"a":18663,"t":"code","b":[176,2],"m":"bcs","o":"b_48EB","oa":18667},{"a":18665,"t":"code","b":[169,16],"m":"lda","o":"#$10"},{"a":18667,"l":"b_48EB","t":"code","b":[133,172],"m":"sta","o":"sfx_filter_cutoff","oa":172,"x":[18663]},{"a":18669,"t":"code","b":[141,22,212],"m":"sta","o":"sid_filter_cutoff_hi"},{"a":18672,"t":"code","b":[96],"m":"rts"},{"a":18673,"t":"gap","n":15},{"a":18688,"l":"sfx_low_fuel_alarm","c":"Low-fuel alarm; reached from sfx_extra_life once the bonus fanfare is over or was never due. It sounds only while flight_flags has bit 6 or bit 7 set, and $5540 derives both purely from the fuel digits $17/$18/$19 - bit 6 means less than one whole unit left, bit 7 means empty. It clears $27 so the normal voice-2 tone is reloaded when fuel returns, then sweeps voice 2's frequency high byte $29 ($D408): up in steps of 2 to $58, then up again from $FD, each half restarting its preset through sid_load_v2_alarm and re-gating voice 2. Bit 2 of the sweep toggles the gauge colour $2E between $01 and $02, so the GAS bar drawn by draw_gas_gauge flashes white and red in time with the alarm. When the fuel is healthy again it restores voice 2 through sid_load_v2_engine.","t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34,"x":[20416]},{"a":18690,"t":"code","b":[41,192],"m":"and","o":"#$C0"},{"a":18692,"t":"code","b":[240,71],"m":"beq","o":"b_494D","oa":18765},{"a":18694,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":18696,"t":"code","b":[133,39],"m":"sta","o":"sfx_warn_state","oa":39},{"a":18698,"t":"code","b":[165,41],"m":"lda","o":"sfx_warn_freq","oa":41},{"a":18700,"t":"code","b":[48,31],"m":"bmi","o":"b_492D","oa":18733},{"a":18702,"t":"code","b":[165,40],"m":"lda","o":"sfx_warn_phase","oa":40},{"a":18704,"t":"code","b":[208,3],"m":"bne","o":"b_4915","oa":18709},{"a":18706,"t":"code","b":[32,96,74],"m":"jsr","o":"sid_load_v2_alarm","oa":19040},{"a":18709,"l":"b_4915","t":"code","b":[165,41],"m":"lda","o":"sfx_warn_freq","oa":41,"x":[18704]},{"a":18711,"t":"code","b":[24],"m":"clc"},{"a":18712,"t":"code","b":[105,2],"m":"adc","o":"#$02"},{"a":18714,"t":"code","b":[133,41],"m":"sta","o":"sfx_warn_freq","oa":41},{"a":18716,"t":"code","b":[141,8,212],"m":"sta","o":"sid_v2_freq_hi"},{"a":18719,"t":"code","b":[201,88],"m":"cmp","o":"#$58"},{"a":18721,"t":"code","b":[144,52],"m":"bcc","o":"b_4957","oa":18775},{"a":18723,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":18725,"t":"code","b":[133,40],"m":"sta","o":"sfx_warn_phase","oa":40},{"a":18727,"t":"code","b":[169,253],"m":"lda","o":"#$FD"},{"a":18729,"t":"code","b":[133,41],"m":"sta","o":"sfx_warn_freq","oa":41},{"a":18731,"t":"code","b":[208,42],"m":"bne","o":"b_4957","oa":18775},{"a":18733,"l":"b_492D","t":"code","b":[165,40],"m":"lda","o":"sfx_warn_phase","oa":40,"x":[18700]},{"a":18735,"t":"code","b":[208,12],"m":"bne","o":"b_493D","oa":18749},{"a":18737,"t":"code","b":[230,40],"m":"inc","o":"sfx_warn_phase","oa":40},{"a":18739,"t":"code","b":[169,32],"m":"lda","o":"#$20"},{"a":18741,"t":"code","b":[141,11,212],"m":"sta","o":"sid_v2_control"},{"a":18744,"t":"code","b":[169,16],"m":"lda","o":"#$10"},{"a":18746,"t":"code","b":[141,8,212],"m":"sta","o":"sid_v2_freq_hi"},{"a":18749,"l":"b_493D","t":"code","b":[230,41],"m":"inc","o":"sfx_warn_freq","oa":41,"x":[18735]},{"a":18751,"t":"code","b":[165,41],"m":"lda","o":"sfx_warn_freq","oa":41},{"a":18753,"t":"code","b":[48,20],"m":"bmi","o":"b_4957","oa":18775},{"a":18755,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":18757,"t":"code","b":[133,40],"m":"sta","o":"sfx_warn_phase","oa":40},{"a":18759,"t":"code","b":[169,16],"m":"lda","o":"#$10"},{"a":18761,"t":"code","b":[133,41],"m":"sta","o":"sfx_warn_freq","oa":41},{"a":18763,"t":"code","b":[208,10],"m":"bne","o":"b_4957","oa":18775},{"a":18765,"l":"b_494D","t":"code","b":[165,39],"m":"lda","o":"sfx_warn_state","oa":39,"x":[18692]},{"a":18767,"t":"code","b":[208,3],"m":"bne","o":"b_4954","oa":18772},{"a":18769,"t":"code","b":[32,240,73],"m":"jsr","o":"sid_load_v2_engine","oa":18928},{"a":18772,"l":"b_4954","t":"code","b":[24],"m":"clc","x":[18767]},{"a":18773,"t":"code","b":[144,14],"m":"bcc","o":"r_4965","oa":18789},{"a":18775,"l":"b_4957","t":"code","b":[165,41],"m":"lda","o":"sfx_warn_freq","oa":41,"x":[18721,18731,18753,18763]},{"a":18777,"t":"code","b":[41,4],"m":"and","o":"#$04"},{"a":18779,"t":"code","b":[208,4],"m":"bne","o":"b_4961","oa":18785},{"a":18781,"t":"code","b":[169,2],"m":"lda","o":"#$02"},{"a":18783,"t":"code","b":[208,2],"m":"bne","o":"b_4963","oa":18787},{"a":18785,"l":"b_4961","t":"code","b":[169,1],"m":"lda","o":"#$01","x":[18779]},{"a":18787,"l":"b_4963","t":"code","b":[133,46],"m":"sta","o":"status_bar_colour","oa":46,"x":[18783]},{"a":18789,"l":"r_4965","t":"code","b":[96],"m":"rts","x":[18773]},{"a":18790,"t":"gap","n":10},{"a":18800,"l":"sid_load_engine","c":"Loads the 25-byte SID image at sid_preset_engine ($4F00) into $D400-$D418 - the filtered-noise jet engine - gates voice 1 on with control $81 (noise) and resets the working filter cutoff $AC to $10. Called at the start of every life from $4173 and again from $4728, where show_title_screen hands the display back to the game.","t":"code","b":[162,0],"m":"ldx","o":"#$00","x":[16755,18216]},{"a":18802,"l":"b_4972","t":"code","b":[189,0,79],"m":"lda","o":"sid_preset_engine,x","oa":20224,"x":[18811]},{"a":18805,"t":"code","b":[157,0,212],"m":"sta","o":"sid_v1_freq_lo,x"},{"a":18808,"t":"code","b":[232],"m":"inx"},{"a":18809,"t":"code","b":[224,25],"m":"cpx","o":"#$19"},{"a":18811,"t":"code","b":[144,245],"m":"bcc","o":"b_4972","oa":18802},{"a":18813,"t":"code","b":[169,129],"m":"lda","o":"#$81"},{"a":18815,"t":"code","b":[141,4,212],"m":"sta","o":"sid_v1_control"},{"a":18818,"t":"code","b":[169,16],"m":"lda","o":"#$10"},{"a":18820,"t":"code","b":[133,172],"m":"sta","o":"sfx_filter_cutoff","oa":172},{"a":18822,"t":"code","b":[96],"m":"rts"},{"a":18823,"t":"gap","n":9},{"a":18832,"l":"sid_load_dive","c":"Starts the descent sound. Loads the 25-byte SID image at sid_preset_dive ($4F19) into $D400-$D418 and seeds the ramps flight_sound_update then drives: sound phase $24 = $20, filter cutoff $AC = $20, voice 1 and voice 3 frequency highs $AD = $0E and $AE = $04. Gates voice 3 with $15, voice 1 with $81 and voice 2 with $83. Called once per descent, from $480A.","t":"code","b":[162,0],"m":"ldx","o":"#$00","x":[18442]},{"a":18834,"l":"b_4992","t":"code","b":[189,25,79],"m":"lda","o":"sid_preset_dive,x","oa":20249,"x":[18843]},{"a":18837,"t":"code","b":[157,0,212],"m":"sta","o":"sid_v1_freq_lo,x"},{"a":18840,"t":"code","b":[232],"m":"inx"},{"a":18841,"t":"code","b":[224,25],"m":"cpx","o":"#$19"},{"a":18843,"t":"code","b":[144,245],"m":"bcc","o":"b_4992","oa":18834},{"a":18845,"t":"code","b":[169,32],"m":"lda","o":"#$20"},{"a":18847,"t":"code","b":[133,36],"m":"sta","o":"sfx_crash_state","oa":36},{"a":18849,"t":"code","b":[133,172],"m":"sta","o":"sfx_filter_cutoff","oa":172},{"a":18851,"t":"code","b":[169,14],"m":"lda","o":"#$0E"},{"a":18853,"t":"code","b":[133,173],"m":"sta","o":"sfx_freq_v1","oa":173},{"a":18855,"t":"code","b":[169,4],"m":"lda","o":"#$04"},{"a":18857,"t":"code","b":[133,174],"m":"sta","o":"sfx_freq_v3","oa":174},{"a":18859,"t":"code","b":[169,21],"m":"lda","o":"#$15"},{"a":18861,"t":"code","b":[141,18,212],"m":"sta","o":"sid_v3_control"},{"a":18864,"t":"code","b":[169,129],"m":"lda","o":"#$81"},{"a":18866,"t":"code","b":[141,4,212],"m":"sta","o":"sid_v1_control"},{"a":18869,"t":"code","b":[169,131],"m":"lda","o":"#$83"},{"a":18871,"t":"code","b":[141,11,212],"m":"sta","o":"sid_v2_control"},{"a":18874,"t":"code","b":[96],"m":"rts"},{"a":18875,"t":"gap","n":5},{"a":18880,"l":"sid_load_touchdown","c":"Starts the touchdown sound. Loads the 25-byte SID image at sid_preset_touchdown ($4F32) into $D400-$D418, sets sound phase $24 = $FF, $AD = $0E and $AE = $04, gates voices 1 and 2 with $81 and starts the fade at filter cutoff $AC = $60. Called from $484D the moment the aircraft comes to rest on the ground.","t":"code","b":[162,0],"m":"ldx","o":"#$00","x":[18509]},{"a":18882,"l":"b_49C2","t":"code","b":[189,50,79],"m":"lda","o":"sid_preset_touchdown,x","oa":20274,"x":[18891]},{"a":18885,"t":"code","b":[157,0,212],"m":"sta","o":"sid_v1_freq_lo,x"},{"a":18888,"t":"code","b":[232],"m":"inx"},{"a":18889,"t":"code","b":[224,25],"m":"cpx","o":"#$19"},{"a":18891,"t":"code","b":[144,245],"m":"bcc","o":"b_49C2","oa":18882},{"a":18893,"t":"code","b":[169,255],"m":"lda","o":"#$FF"},{"a":18895,"t":"code","b":[133,36],"m":"sta","o":"sfx_crash_state","oa":36},{"a":18897,"t":"code","b":[169,14],"m":"lda","o":"#$0E"},{"a":18899,"t":"code","b":[133,173],"m":"sta","o":"sfx_freq_v1","oa":173},{"a":18901,"t":"code","b":[169,4],"m":"lda","o":"#$04"},{"a":18903,"t":"code","b":[133,174],"m":"sta","o":"sfx_freq_v3","oa":174},{"a":18905,"t":"code","b":[169,129],"m":"lda","o":"#$81"},{"a":18907,"t":"code","b":[141,4,212],"m":"sta","o":"sid_v1_control"},{"a":18910,"t":"code","b":[141,11,212],"m":"sta","o":"sid_v2_control"},{"a":18913,"t":"code","b":[169,96],"m":"lda","o":"#$60"},{"a":18915,"t":"code","b":[133,172],"m":"sta","o":"sfx_filter_cutoff","oa":172},{"a":18917,"t":"code","b":[96],"m":"rts"},{"a":18918,"t":"gap","n":10},{"a":18928,"l":"sid_load_v2_engine","c":"Restores voice 2 to its ordinary flying tone: copies the 7-byte image at sid_preset_v2_engine ($4F4B) into $D407-$D40D, raises the 'voice 2 is in its normal state' flag $27, clears the alarm phase flags $26 and $28 and puts the GAS-gauge colour $2E back to red ($02). Called from $4951 when the fuel stops being low.","t":"code","b":[162,0],"m":"ldx","o":"#$00","x":[18769]},{"a":18930,"l":"b_49F2","t":"code","b":[189,75,79],"m":"lda","o":"sid_preset_v2_engine,x","oa":20299,"x":[18939]},{"a":18933,"t":"code","b":[157,7,212],"m":"sta","o":"sid_v2_freq_lo,x"},{"a":18936,"t":"code","b":[232],"m":"inx"},{"a":18937,"t":"code","b":[224,7],"m":"cpx","o":"#$07"},{"a":18939,"t":"code","b":[144,245],"m":"bcc","o":"b_49F2","oa":18930},{"a":18941,"t":"code","b":[230,39],"m":"inc","o":"sfx_warn_state","oa":39},{"a":18943,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":18945,"t":"code","b":[133,38],"m":"sta","o":"sfx_takeoff_timer","oa":38},{"a":18947,"t":"code","b":[133,40],"m":"sta","o":"sfx_warn_phase","oa":40},{"a":18949,"t":"code","b":[169,2],"m":"lda","o":"#$02"},{"a":18951,"t":"code","b":[133,46],"m":"sta","o":"status_bar_colour","oa":46},{"a":18953,"t":"code","b":[96],"m":"rts"},{"a":18954,"t":"gap","n":6},{"a":18960,"l":"sfx_takeoff_start","c":"Starts, and re-pitches, the take-off sound; called from $488E. Copies the 7-byte image at sid_preset_v2_takeoff ($4F52) into $D407-$D40D, sets $26, gates voice 2 with control $15 and seeds the phase counter $25 = $7C. The pitch $AD, written to $D408, depends on the fuel load: when the flag $27 is set - or the tanks are full ($17 = 9), in which case voice 2's decay is first lengthened to $A0 - it is rebuilt as 7 per whole fuel unit $17 plus one per two tenths $18, and $27 is cleared; otherwise it just creeps up by one per call. A heavier, fuller aircraft therefore lifts off to a higher-pitched note.","t":"code","b":[162,0],"m":"ldx","o":"#$00","x":[18574]},{"a":18962,"l":"b_4A12","t":"code","b":[189,82,79],"m":"lda","o":"sid_preset_v2_takeoff,x","oa":20306,"x":[18971]},{"a":18965,"t":"code","b":[157,7,212],"m":"sta","o":"sid_v2_freq_lo,x"},{"a":18968,"t":"code","b":[232],"m":"inx"},{"a":18969,"t":"code","b":[224,7],"m":"cpx","o":"#$07"},{"a":18971,"t":"code","b":[144,245],"m":"bcc","o":"b_4A12","oa":18962},{"a":18973,"t":"code","b":[230,38],"m":"inc","o":"sfx_takeoff_timer","oa":38},{"a":18975,"t":"code","b":[169,21],"m":"lda","o":"#$15"},{"a":18977,"t":"code","b":[141,11,212],"m":"sta","o":"sid_v2_control"},{"a":18980,"t":"code","b":[169,124],"m":"lda","o":"#$7C"},{"a":18982,"t":"code","b":[133,37],"m":"sta","o":"sfx_takeoff_state","oa":37},{"a":18984,"t":"code","b":[165,39],"m":"lda","o":"sfx_warn_state","oa":39},{"a":18986,"t":"code","b":[240,29],"m":"beq","o":"b_4A49","oa":19017},{"a":18988,"l":"b_4A2C","t":"code","b":[169,0],"m":"lda","o":"#$00","x":[19028]},{"a":18990,"t":"code","b":[133,39],"m":"sta","o":"sfx_warn_state","oa":39},{"a":18992,"t":"code","b":[166,23],"m":"ldx","o":"gas_hundreds","oa":23},{"a":18994,"t":"code","b":[240,6],"m":"beq","o":"b_4A3A","oa":19002},{"a":18996,"l":"b_4A34","t":"code","b":[24],"m":"clc","x":[19000]},{"a":18997,"t":"code","b":[105,7],"m":"adc","o":"#$07"},{"a":18999,"t":"code","b":[202],"m":"dex"},{"a":19000,"t":"code","b":[208,250],"m":"bne","o":"b_4A34","oa":18996},{"a":19002,"l":"b_4A3A","t":"code","b":[133,173],"m":"sta","o":"sfx_freq_v1","oa":173,"x":[18994]},{"a":19004,"t":"code","b":[166,24],"m":"ldx","o":"gas_tens","oa":24},{"a":19006,"l":"b_4A3E","t":"code","b":[202],"m":"dex","x":[19012]},{"a":19007,"t":"code","b":[202],"m":"dex"},{"a":19008,"t":"code","b":[48,4],"m":"bmi","o":"b_4A46","oa":19014},{"a":19010,"t":"code","b":[230,173],"m":"inc","o":"sfx_freq_v1","oa":173},{"a":19012,"t":"code","b":[208,248],"m":"bne","o":"b_4A3E","oa":19006},{"a":19014,"l":"b_4A46","t":"code","b":[24],"m":"clc","x":[19008]},{"a":19015,"t":"code","b":[144,15],"m":"bcc","o":"b_4A58","oa":19032},{"a":19017,"l":"b_4A49","t":"code","b":[165,23],"m":"lda","o":"gas_hundreds","oa":23,"x":[18986]},{"a":19019,"t":"code","b":[201,9],"m":"cmp","o":"#$09"},{"a":19021,"t":"code","b":[144,7],"m":"bcc","o":"b_4A56","oa":19030},{"a":19023,"t":"code","b":[169,160],"m":"lda","o":"#$A0"},{"a":19025,"t":"code","b":[141,12,212],"m":"sta","o":"sid_v2_attack_decay"},{"a":19028,"t":"code","b":[208,214],"m":"bne","o":"b_4A2C","oa":18988},{"a":19030,"l":"b_4A56","t":"code","b":[230,173],"m":"inc","o":"sfx_freq_v1","oa":173,"x":[19021]},{"a":19032,"l":"b_4A58","t":"code","b":[165,173],"m":"lda","o":"sfx_freq_v1","oa":173,"x":[19015]},{"a":19034,"t":"code","b":[141,8,212],"m":"sta","o":"sid_v2_freq_hi"},{"a":19037,"t":"code","b":[96],"m":"rts"},{"a":19038,"t":"gap","n":2},{"a":19040,"l":"sid_load_v2_alarm","c":"Loads the 7-byte image at sid_preset_v2_alarm ($4F59) into $D407-$D40D, gates voice 2 with control $41 (sawtooth) and seeds the sweep at $29 = $28 = $10. This is the preset the low-fuel alarm at sfx_low_fuel_alarm restarts each half of its sweep with; sole caller is $4912.","t":"code","b":[162,0],"m":"ldx","o":"#$00","x":[18706]},{"a":19042,"l":"b_4A62","t":"code","b":[189,89,79],"m":"lda","o":"sid_preset_v2_alarm,x","oa":20313,"x":[19051]},{"a":19045,"t":"code","b":[157,7,212],"m":"sta","o":"sid_v2_freq_lo,x"},{"a":19048,"t":"code","b":[232],"m":"inx"},{"a":19049,"t":"code","b":[224,7],"m":"cpx","o":"#$07"},{"a":19051,"t":"code","b":[144,245],"m":"bcc","o":"b_4A62","oa":19042},{"a":19053,"t":"code","b":[169,16],"m":"lda","o":"#$10"},{"a":19055,"t":"code","b":[133,41],"m":"sta","o":"sfx_warn_freq","oa":41},{"a":19057,"t":"code","b":[133,40],"m":"sta","o":"sfx_warn_phase","oa":40},{"a":19059,"t":"code","b":[169,65],"m":"lda","o":"#$41"},{"a":19061,"t":"code","b":[141,11,212],"m":"sta","o":"sid_v2_control"},{"a":19064,"t":"code","b":[96],"m":"rts"},{"a":19065,"t":"gap","n":7},{"a":19072,"l":"wave_size_and_spacing","c":"Chooses how many aircraft the next wave holds and how far apart they are released; called from $43F6. The wave size $66 is read off the player's SCORE, whose five decimal digits live at $12-$16 with $13 the thousands and $14 the hundreds: under 400 points two aircraft, 400 to 1499 three, 1500 and over four. Note this is a score threshold, not a count of waves survived, and the ten-thousands digit $12 is never looked at. The release spacing $62 is then 2 * $66 + 2, plus one SID-oscillator-3 random value ($D41B & $03) for every aircraft after the first, so bigger waves also arrive more raggedly.","t":"code","b":[169,2],"m":"lda","o":"#$02","x":[17398]},{"a":19074,"t":"code","b":[133,102],"m":"sta","o":"zp_66_unknown","oa":102},{"a":19076,"t":"code","b":[165,19],"m":"lda","o":"score_digit_thousands","oa":19},{"a":19078,"t":"code","b":[201,1],"m":"cmp","o":"#$01"},{"a":19080,"t":"code","b":[240,4],"m":"beq","o":"b_4A8E","oa":19086},{"a":19082,"t":"code","b":[176,8],"m":"bcs","o":"b_4A94","oa":19092},{"a":19084,"t":"code","b":[144,10],"m":"bcc","o":"b_4A98","oa":19096},{"a":19086,"l":"b_4A8E","t":"code","b":[165,20],"m":"lda","o":"score_digit_hundreds","oa":20,"x":[19080]},{"a":19088,"t":"code","b":[201,5],"m":"cmp","o":"#$05"},{"a":19090,"t":"code","b":[144,10],"m":"bcc","o":"b_4A9E","oa":19102},{"a":19092,"l":"b_4A94","t":"code","b":[169,4],"m":"lda","o":"#$04","x":[19082]},{"a":19094,"t":"code","b":[208,8],"m":"bne","o":"b_4AA0","oa":19104},{"a":19096,"l":"b_4A98","t":"code","b":[165,20],"m":"lda","o":"score_digit_hundreds","oa":20,"x":[19084]},{"a":19098,"t":"code","b":[201,4],"m":"cmp","o":"#$04"},{"a":19100,"t":"code","b":[144,4],"m":"bcc","o":"b_4AA2","oa":19106},{"a":19102,"l":"b_4A9E","t":"code","b":[169,3],"m":"lda","o":"#$03","x":[19090]},{"a":19104,"l":"b_4AA0","t":"code","b":[133,102],"m":"sta","o":"zp_66_unknown","oa":102,"x":[19094]},{"a":19106,"l":"b_4AA2","t":"code","b":[165,102],"m":"lda","o":"zp_66_unknown","oa":102,"x":[19100]},{"a":19108,"t":"code","b":[10],"m":"asl","o":"a"},{"a":19109,"t":"code","b":[24],"m":"clc"},{"a":19110,"t":"code","b":[105,2],"m":"adc","o":"#$02"},{"a":19112,"t":"code","b":[133,98],"m":"sta","o":"zp_62_unknown","oa":98},{"a":19114,"t":"code","b":[164,102],"m":"ldy","o":"zp_66_unknown","oa":102},{"a":19116,"t":"code","b":[136],"m":"dey"},{"a":19117,"l":"b_4AAD","t":"code","b":[173,27,212],"m":"lda","o":"sid_v3_oscillator","x":[19128]},{"a":19120,"t":"code","b":[41,3],"m":"and","o":"#$03"},{"a":19122,"t":"code","b":[24],"m":"clc"},{"a":19123,"t":"code","b":[101,98],"m":"adc","o":"zp_62_unknown","oa":98},{"a":19125,"t":"code","b":[133,98],"m":"sta","o":"zp_62_unknown","oa":98},{"a":19127,"t":"code","b":[136],"m":"dey"},{"a":19128,"t":"code","b":[208,243],"m":"bne","o":"b_4AAD","oa":19117},{"a":19130,"t":"code","b":[96],"m":"rts"},{"a":19131,"t":"gap","n":5},{"a":19136,"l":"irq_raster_split","c":"Raster interrupt, installed at $0314. Three bands per frame at lines $01, $8A and $D2, chained through raster_band, each setting the background colours for the band that follows. Acknowledges $D019 and leaves through the KERNAL's IRQ exit at $EA7E. Measured live at 151 Hz, three per PAL frame.","t":"code","b":[165,176],"m":"lda","o":"raster_band","oa":176},{"a":19138,"t":"code","b":[240,28],"m":"beq","o":"b_4AE0","oa":19168},{"a":19140,"t":"code","b":[16,50],"m":"bpl","o":"b_4AF8","oa":19192},{"a":19142,"t":"code","b":[169,12],"m":"lda","o":"#$0C"},{"a":19144,"t":"code","b":[141,33,208],"m":"sta","o":"vic_background0"},{"a":19147,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":19149,"t":"code","b":[141,35,208],"m":"sta","o":"vic_background2"},{"a":19152,"t":"code","b":[169,1],"m":"lda","o":"#$01"},{"a":19154,"t":"code","b":[133,176],"m":"sta","o":"raster_band","oa":176},{"a":19156,"t":"code","b":[169,27],"m":"lda","o":"#$1B"},{"a":19158,"t":"code","b":[141,17,208],"m":"sta","o":"vic_control1"},{"a":19161,"t":"code","b":[169,1],"m":"lda","o":"#$01"},{"a":19163,"t":"code","b":[141,18,208],"m":"sta","o":"vic_raster"},{"a":19166,"t":"code","b":[208,43],"m":"bne","o":"b_4B0B","oa":19211},{"a":19168,"l":"b_4AE0","t":"code","b":[169,12],"m":"lda","o":"#$0C","x":[19138]},{"a":19170,"t":"code","b":[141,33,208],"m":"sta","o":"vic_background0"},{"a":19173,"t":"code","b":[169,8],"m":"lda","o":"#$08"},{"a":19175,"t":"code","b":[141,35,208],"m":"sta","o":"vic_background2"},{"a":19178,"t":"code","b":[198,176],"m":"dec","o":"raster_band","oa":176},{"a":19180,"t":"code","b":[169,27],"m":"lda","o":"#$1B"},{"a":19182,"t":"code","b":[141,17,208],"m":"sta","o":"vic_control1"},{"a":19185,"t":"code","b":[169,210],"m":"lda","o":"#$D2"},{"a":19187,"t":"code","b":[141,18,208],"m":"sta","o":"vic_raster"},{"a":19190,"t":"code","b":[208,19],"m":"bne","o":"b_4B0B","oa":19211},{"a":19192,"l":"b_4AF8","t":"code","b":[169,14],"m":"lda","o":"#$0E","x":[19140]},{"a":19194,"t":"code","b":[141,33,208],"m":"sta","o":"vic_background0"},{"a":19197,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":19199,"t":"code","b":[133,176],"m":"sta","o":"raster_band","oa":176},{"a":19201,"t":"code","b":[169,27],"m":"lda","o":"#$1B"},{"a":19203,"t":"code","b":[141,17,208],"m":"sta","o":"vic_control1"},{"a":19206,"t":"code","b":[169,138],"m":"lda","o":"#$8A"},{"a":19208,"t":"code","b":[141,18,208],"m":"sta","o":"vic_raster"},{"a":19211,"l":"b_4B0B","t":"code","b":[169,1],"m":"lda","o":"#$01","x":[19166,19190]},{"a":19213,"t":"code","b":[141,25,208],"m":"sta","o":"vic_irq_status"},{"a":19216,"t":"code","b":[76,126,234],"m":"jmp","o":"j_EA7E","oa":60030},{"a":19219,"t":"gap","n":13},{"a":19232,"l":"irq_install","c":"Installs the raster split: points $0314/$0315 at $4AC0, enables the VIC raster interrupt, DISABLES every CIA1 interrupt source ($DC0D = $7F), syncs on raster $FE and seeds raster_band.","t":"code","b":[120],"m":"sei","x":[16693]},{"a":19233,"t":"code","b":[169,192],"m":"lda","o":"#$C0"},{"a":19235,"t":"code","b":[141,20,3],"m":"sta","o":"irq_vector_lo","oa":788},{"a":19238,"t":"code","b":[169,74],"m":"lda","o":"#$4A"},{"a":19240,"t":"code","b":[141,21,3],"m":"sta","o":"irq_vector_hi","oa":789},{"a":19243,"t":"code","b":[169,1],"m":"lda","o":"#$01"},{"a":19245,"t":"code","b":[141,26,208],"m":"sta","o":"vic_irq_enable"},{"a":19248,"t":"code","b":[169,127],"m":"lda","o":"#$7F"},{"a":19250,"t":"code","b":[141,13,220],"m":"sta","o":"cia1_interrupt"},{"a":19253,"t":"code","b":[169,27],"m":"lda","o":"#$1B"},{"a":19255,"t":"code","b":[141,17,208],"m":"sta","o":"vic_control1"},{"a":19258,"t":"code","b":[169,138],"m":"lda","o":"#$8A"},{"a":19260,"t":"code","b":[141,18,208],"m":"sta","o":"vic_raster"},{"a":19263,"t":"code","b":[169,14],"m":"lda","o":"#$0E"},{"a":19265,"t":"code","b":[141,33,208],"m":"sta","o":"vic_background0"},{"a":19268,"l":"b_4B44","t":"code","b":[173,18,208],"m":"lda","o":"vic_raster","x":[19273]},{"a":19271,"t":"code","b":[201,254],"m":"cmp","o":"#$FE"},{"a":19273,"t":"code","b":[208,249],"m":"bne","o":"b_4B44","oa":19268},{"a":19275,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":19277,"t":"code","b":[133,176],"m":"sta","o":"raster_band","oa":176},{"a":19279,"t":"code","b":[169,1],"m":"lda","o":"#$01"},{"a":19281,"t":"code","b":[141,25,208],"m":"sta","o":"vic_irq_status"},{"a":19284,"t":"code","b":[88],"m":"cli"},{"a":19285,"t":"code","b":[96],"m":"rts"},{"a":19286,"t":"gap","n":7},{"a":19293,"l":"title_tune_play","c":"Plays the title tune and watches for fire; called from show_title_screen at $4713. Silences the SID through sid_silence, loads the 25-byte base register image at $2AC0 into $D400-$D418, then steps an index x from $9D up to $1C through six parallel note tables - $2A00/$2A20 voice 1 high/low, $2A40/$2A60 voice 2, $2A80/$2AA0 voice 3 - with a per-step note-length byte taken from $2AE0 into $9C. Each step gates the voices on ($D404 = $21, and also $D40B = $21 / $D412 = $41 when the step index is $18 or more or is 4 modulo 6), delays, gates them off ($20/$20/$40) and delays again. Both delay loops poll $DC01 bit 4, and fire aborts the tune through title_tune_abort. Ends by calling title_wait_for_fire.","t":"code","b":[32,48,76],"m":"jsr","o":"sid_silence","oa":19504,"x":[18195]},{"a":19296,"t":"code","b":[162,24],"m":"ldx","o":"#$18"},{"a":19298,"l":"b_4B62","t":"code","b":[189,192,42],"m":"lda","o":"tune_sid_init,x","oa":10944,"x":[19305]},{"a":19301,"t":"code","b":[157,0,212],"m":"sta","o":"sid_v1_freq_lo,x"},{"a":19304,"t":"code","b":[202],"m":"dex"},{"a":19305,"t":"code","b":[16,247],"m":"bpl","o":"b_4B62","oa":19298},{"a":19307,"t":"code","b":[166,157],"m":"ldx","o":"music_note_index","oa":157},{"a":19309,"l":"j_4B6D","t":"code","b":[189,0,42],"m":"lda","o":"tune_v1_freq_hi,x","oa":10752,"x":[19455]},{"a":19312,"t":"code","b":[141,1,212],"m":"sta","o":"sid_v1_freq_hi"},{"a":19315,"t":"code","b":[189,32,42],"m":"lda","o":"tune_v1_freq_lo,x","oa":10784},{"a":19318,"t":"code","b":[141,0,212],"m":"sta","o":"sid_v1_freq_lo"},{"a":19321,"t":"code","b":[189,64,42],"m":"lda","o":"tune_v2_freq_hi,x","oa":10816},{"a":19324,"t":"code","b":[141,8,212],"m":"sta","o":"sid_v2_freq_hi"},{"a":19327,"t":"code","b":[189,96,42],"m":"lda","o":"tune_v2_freq_lo,x","oa":10848},{"a":19330,"t":"code","b":[141,7,212],"m":"sta","o":"sid_v2_freq_lo"},{"a":19333,"t":"code","b":[189,128,42],"m":"lda","o":"tune_v3_freq_hi,x","oa":10880},{"a":19336,"t":"code","b":[141,15,212],"m":"sta","o":"sid_v3_freq_hi"},{"a":19339,"t":"code","b":[189,160,42],"m":"lda","o":"tune_v3_freq_lo,x","oa":10912},{"a":19342,"t":"code","b":[141,14,212],"m":"sta","o":"sid_v3_freq_lo"},{"a":19345,"t":"code","b":[138],"m":"txa"},{"a":19346,"t":"code","b":[72],"m":"pha"},{"a":19347,"t":"code","b":[201,24],"m":"cmp","o":"#$18"},{"a":19349,"t":"code","b":[176,11],"m":"bcs","o":"b_4BA2","oa":19362},{"a":19351,"l":"b_4B97","t":"code","b":[201,4],"m":"cmp","o":"#$04","x":[19358]},{"a":19353,"t":"code","b":[240,7],"m":"beq","o":"b_4BA2","oa":19362},{"a":19355,"t":"code","b":[56],"m":"sec"},{"a":19356,"t":"code","b":[233,6],"m":"sbc","o":"#$06"},{"a":19358,"t":"code","b":[16,247],"m":"bpl","o":"b_4B97","oa":19351},{"a":19360,"t":"code","b":[48,10],"m":"bmi","o":"b_4BAC","oa":19372},{"a":19362,"l":"b_4BA2","t":"code","b":[169,33],"m":"lda","o":"#$21","x":[19349,19353]},{"a":19364,"t":"code","b":[141,11,212],"m":"sta","o":"sid_v2_control"},{"a":19367,"t":"code","b":[169,65],"m":"lda","o":"#$41"},{"a":19369,"t":"code","b":[141,18,212],"m":"sta","o":"sid_v3_control"},{"a":19372,"l":"b_4BAC","t":"code","b":[169,33],"m":"lda","o":"#$21","x":[19360]},{"a":19374,"t":"code","b":[141,4,212],"m":"sta","o":"sid_v1_control"},{"a":19377,"t":"code","b":[162,255],"m":"ldx","o":"#$FF"},{"a":19379,"l":"b_4BB3","t":"code","b":[164,156],"m":"ldy","o":"music_note_delay","oa":156,"x":[19392]},{"a":19381,"t":"code","b":[173,1,220],"m":"lda","o":"cia1_port_b"},{"a":19384,"t":"code","b":[41,16],"m":"and","o":"#$10"},{"a":19386,"t":"code","b":[240,70],"m":"beq","o":"b_4C02","oa":19458},{"a":19388,"l":"b_4BBC","t":"code","b":[136],"m":"dey","x":[19389]},{"a":19389,"t":"code","b":[208,253],"m":"bne","o":"b_4BBC","oa":19388},{"a":19391,"t":"code","b":[202],"m":"dex"},{"a":19392,"t":"code","b":[208,241],"m":"bne","o":"b_4BB3","oa":19379},{"a":19394,"t":"code","b":[104],"m":"pla"},{"a":19395,"t":"code","b":[72],"m":"pha"},{"a":19396,"t":"code","b":[201,24],"m":"cmp","o":"#$18"},{"a":19398,"t":"code","b":[176,11],"m":"bcs","o":"b_4BD3","oa":19411},{"a":19400,"l":"b_4BC8","t":"code","b":[201,4],"m":"cmp","o":"#$04","x":[19407]},{"a":19402,"t":"code","b":[240,7],"m":"beq","o":"b_4BD3","oa":19411},{"a":19404,"t":"code","b":[56],"m":"sec"},{"a":19405,"t":"code","b":[233,6],"m":"sbc","o":"#$06"},{"a":19407,"t":"code","b":[16,247],"m":"bpl","o":"b_4BC8","oa":19400},{"a":19409,"t":"code","b":[48,10],"m":"bmi","o":"b_4BDD","oa":19421},{"a":19411,"l":"b_4BD3","t":"code","b":[169,32],"m":"lda","o":"#$20","x":[19398,19402]},{"a":19413,"t":"code","b":[141,11,212],"m":"sta","o":"sid_v2_control"},{"a":19416,"t":"code","b":[169,64],"m":"lda","o":"#$40"},{"a":19418,"t":"code","b":[141,18,212],"m":"sta","o":"sid_v3_control"},{"a":19421,"l":"b_4BDD","t":"code","b":[169,32],"m":"lda","o":"#$20","x":[19409]},{"a":19423,"t":"code","b":[141,4,212],"m":"sta","o":"sid_v1_control"},{"a":19426,"t":"code","b":[162,95],"m":"ldx","o":"#$5F"},{"a":19428,"l":"b_4BE4","t":"code","b":[164,156],"m":"ldy","o":"music_note_delay","oa":156,"x":[19441]},{"a":19430,"t":"code","b":[173,1,220],"m":"lda","o":"cia1_port_b"},{"a":19433,"t":"code","b":[41,16],"m":"and","o":"#$10"},{"a":19435,"t":"code","b":[240,21],"m":"beq","o":"b_4C02","oa":19458},{"a":19437,"l":"b_4BED","t":"code","b":[136],"m":"dey","x":[19438]},{"a":19438,"t":"code","b":[208,253],"m":"bne","o":"b_4BED","oa":19437},{"a":19440,"t":"code","b":[202],"m":"dex"},{"a":19441,"t":"code","b":[208,241],"m":"bne","o":"b_4BE4","oa":19428},{"a":19443,"t":"code","b":[104],"m":"pla"},{"a":19444,"t":"code","b":[170],"m":"tax"},{"a":19445,"t":"code","b":[232],"m":"inx"},{"a":19446,"t":"code","b":[189,224,42],"m":"lda","o":"tune_note_length,x","oa":10976},{"a":19449,"t":"code","b":[133,156],"m":"sta","o":"music_note_delay","oa":156},{"a":19451,"t":"code","b":[224,29],"m":"cpx","o":"#$1D"},{"a":19453,"t":"code","b":[176,7],"m":"bcs","o":"b_4C06","oa":19462},{"a":19455,"t":"code","b":[76,109,75],"m":"jmp","o":"j_4B6D","oa":19309},{"a":19458,"l":"b_4C02","t":"code","b":[104],"m":"pla","x":[19386,19435]},{"a":19459,"t":"code","b":[32,14,76],"m":"jsr","o":"title_tune_abort","oa":19470},{"a":19462,"l":"b_4C06","t":"code","b":[32,224,78],"m":"jsr","o":"title_wait_for_fire","oa":20192,"x":[19453]},{"a":19465,"t":"code","b":[96],"m":"rts"},{"a":19466,"t":"gap","n":4},{"a":19470,"l":"title_tune_abort","c":"Stops the title tune when fire is pressed inside title_tune_play. Raises the fire-seen flag $B2 so title_wait_for_fire returns at once, gates all three voices off ($D404 = $20, $D40B = $20, $D412 = $40) and burns about $3F * $FF loop passes as a debounce so the same press is not read again by the game about to start.","t":"code","b":[230,178],"m":"inc","o":"title_phase","oa":178,"x":[19459]},{"a":19472,"t":"code","b":[169,32],"m":"lda","o":"#$20"},{"a":19474,"t":"code","b":[141,4,212],"m":"sta","o":"sid_v1_control"},{"a":19477,"t":"code","b":[141,11,212],"m":"sta","o":"sid_v2_control"},{"a":19480,"t":"code","b":[169,64],"m":"lda","o":"#$40"},{"a":19482,"t":"code","b":[141,18,212],"m":"sta","o":"sid_v3_control"},{"a":19485,"t":"code","b":[162,63],"m":"ldx","o":"#$3F"},{"a":19487,"l":"b_4C1F","t":"code","b":[160,255],"m":"ldy","o":"#$FF","x":[19493]},{"a":19489,"l":"b_4C21","t":"code","b":[136],"m":"dey","x":[19490]},{"a":19490,"t":"code","b":[208,253],"m":"bne","o":"b_4C21","oa":19489},{"a":19492,"t":"code","b":[202],"m":"dex"},{"a":19493,"t":"code","b":[208,248],"m":"bne","o":"b_4C1F","oa":19487},{"a":19495,"t":"code","b":[96],"m":"rts"},{"a":19496,"t":"gap","n":8},{"a":19504,"l":"sid_silence","c":"Silences the SID: zeroes $D401-$D419, leaving $D400 alone, and resets the title tune's note-length byte $9C to $BF. Called from title_tune_play before the tune starts and from $5678 at the start of a life.","t":"code","b":[162,25],"m":"ldx","o":"#$19","x":[19293,22136]},{"a":19506,"l":"b_4C32","t":"code","b":[169,0],"m":"lda","o":"#$00","x":[19512]},{"a":19508,"t":"code","b":[157,0,212],"m":"sta","o":"sid_v1_freq_lo,x"},{"a":19511,"t":"code","b":[202],"m":"dex"},{"a":19512,"t":"code","b":[208,248],"m":"bne","o":"b_4C32","oa":19506},{"a":19514,"t":"code","b":[169,191],"m":"lda","o":"#$BF"},{"a":19516,"t":"code","b":[133,156],"m":"sta","o":"music_note_delay","oa":156},{"a":19518,"t":"code","b":[96],"m":"rts"},{"a":19519,"t":"gap","n":1},{"a":19520,"l":"highscore_rank_score","c":"Ranks the score just played against the five-entry high-score table and opens a slot for it; called from show_title_screen. The score is the five decimal digits at $12-$16, most significant first. The table lives in the off-screen title page, one entry every $50 bytes at $08D2 (rank 1), $0922, $0972, $09C2 and $0A12 (rank 5). A score of all zeroes is rejected outright. Otherwise the digits are compared entry by entry starting at rank 5 and working up; the first entry the score beats fixes the rank, highscore_shift_down pushes the lower entries down, and the rank (0 = no place) is returned in Y. It is also stored to $294F, which is not a variable but the immediate operand of the 'lda #$00' at $294E inside the crack's high-score file code, so the rank reaches that code by self-modification.","t":"code","b":[160,0],"m":"ldy","o":"#$00","x":[18080]},{"a":19522,"t":"code","b":[162,4],"m":"ldx","o":"#$04"},{"a":19524,"l":"b_4C44","t":"code","b":[181,18],"m":"lda","o":"score_digits,x","oa":18,"x":[19529]},{"a":19526,"t":"code","b":[208,5],"m":"bne","o":"b_4C4D","oa":19533},{"a":19528,"t":"code","b":[202],"m":"dex"},{"a":19529,"t":"code","b":[16,249],"m":"bpl","o":"b_4C44","oa":19524},{"a":19531,"t":"code","b":[48,63],"m":"bmi","o":"b_4C8C","oa":19596},{"a":19533,"l":"b_4C4D","t":"code","b":[162,5],"m":"ldx","o":"#$05","x":[19526]},{"a":19535,"t":"code","b":[169,210],"m":"lda","o":"#$D2"},{"a":19537,"t":"code","b":[133,5],"m":"sta","o":"ptr_screen","oa":5},{"a":19539,"t":"code","b":[169,8],"m":"lda","o":"#$08"},{"a":19541,"t":"code","b":[133,6],"m":"sta","o":"ptr_screen_hi","oa":6},{"a":19543,"l":"b_4C57","t":"code","b":[160,0],"m":"ldy","o":"#$00","x":[19583,19587]},{"a":19545,"l":"b_4C59","t":"code","b":[185,18,0],"m":"lda","o":"score_digits,y","oa":18,"x":[19559]},{"a":19548,"t":"code","b":[209,5],"m":"cmp","o":"(ptr_screen),y","oa":5},{"a":19550,"t":"code","b":[240,4],"m":"beq","o":"b_4C64","oa":19556},{"a":19552,"t":"code","b":[176,7],"m":"bcs","o":"b_4C69","oa":19561},{"a":19554,"t":"code","b":[144,13],"m":"bcc","o":"b_4C71","oa":19569},{"a":19556,"l":"b_4C64","t":"code","b":[200],"m":"iny","x":[19550]},{"a":19557,"t":"code","b":[192,5],"m":"cpy","o":"#$05"},{"a":19559,"t":"code","b":[144,240],"m":"bcc","o":"b_4C59","oa":19545},{"a":19561,"l":"b_4C69","t":"code","b":[138],"m":"txa","x":[19552]},{"a":19562,"t":"code","b":[168],"m":"tay"},{"a":19563,"t":"code","b":[32,128,77],"m":"jsr","o":"highscore_shift_down","oa":19840},{"a":19566,"t":"code","b":[24],"m":"clc"},{"a":19567,"t":"code","b":[144,27],"m":"bcc","o":"b_4C8C","oa":19596},{"a":19569,"l":"b_4C71","t":"code","b":[202],"m":"dex","x":[19554]},{"a":19570,"t":"code","b":[208,4],"m":"bne","o":"b_4C78","oa":19576},{"a":19572,"t":"code","b":[160,0],"m":"ldy","o":"#$00"},{"a":19574,"t":"code","b":[240,20],"m":"beq","o":"b_4C8C","oa":19596},{"a":19576,"l":"b_4C78","t":"code","b":[165,5],"m":"lda","o":"ptr_screen","oa":5,"x":[19570]},{"a":19578,"t":"code","b":[24],"m":"clc"},{"a":19579,"t":"code","b":[105,80],"m":"adc","o":"#$50"},{"a":19581,"t":"code","b":[133,5],"m":"sta","o":"ptr_screen","oa":5},{"a":19583,"t":"code","b":[144,214],"m":"bcc","o":"b_4C57","oa":19543},{"a":19585,"t":"code","b":[230,6],"m":"inc","o":"ptr_screen_hi","oa":6},{"a":19587,"t":"code","b":[208,210],"m":"bne","o":"b_4C57","oa":19543},{"a":19589,"t":"code","b":[234],"m":"nop"},{"a":19590,"t":"code","b":[234],"m":"nop"},{"a":19591,"t":"code","b":[234],"m":"nop"},{"a":19592,"t":"code","b":[234],"m":"nop"},{"a":19593,"t":"code","b":[234],"m":"nop"},{"a":19594,"t":"code","b":[234],"m":"nop"},{"a":19595,"t":"code","b":[234],"m":"nop"},{"a":19596,"l":"b_4C8C","t":"code","b":[140,79,41],"m":"sty","o":"hiscore_open_slot_arg","oa":10575,"x":[19531,19567,19574]},{"a":19599,"t":"code","b":[96],"m":"rts"},{"a":19600,"l":"highscore_insert","c":"Writes a new high score into the table and runs name entry; called from show_title_screen at $46DF with the rank 1-5 in Y. Steps the pointer $05/$06 from $0A12 (rank 5) up in $50-byte steps to that rank's row in the off-screen title page, stores the five score digits $12-$16 there, blanks the twelve-character name field (offsets 9 to $16) with spaces, and paints that row's 26 cells of colour RAM white ($01) so the new entry stands out. Then it clears the highlighted-letter index $2F to $FF and the name length $10 to 0 and drops into the loop of name_entry_cursor plus highscore_name_entry.","t":"code","b":[169,18],"m":"lda","o":"#$12","x":[18143]},{"a":19602,"t":"code","b":[133,5],"m":"sta","o":"ptr_screen","oa":5},{"a":19604,"t":"code","b":[169,10],"m":"lda","o":"#$0A"},{"a":19606,"t":"code","b":[133,6],"m":"sta","o":"ptr_screen_hi","oa":6},{"a":19608,"l":"b_4C98","t":"code","b":[136],"m":"dey","x":[19618,19622]},{"a":19609,"t":"code","b":[240,13],"m":"beq","o":"b_4CA8","oa":19624},{"a":19611,"t":"code","b":[165,5],"m":"lda","o":"ptr_screen","oa":5},{"a":19613,"t":"code","b":[56],"m":"sec"},{"a":19614,"t":"code","b":[233,80],"m":"sbc","o":"#$50"},{"a":19616,"t":"code","b":[133,5],"m":"sta","o":"ptr_screen","oa":5},{"a":19618,"t":"code","b":[176,244],"m":"bcs","o":"b_4C98","oa":19608},{"a":19620,"t":"code","b":[198,6],"m":"dec","o":"ptr_screen_hi","oa":6},{"a":19622,"t":"code","b":[208,240],"m":"bne","o":"b_4C98","oa":19608},{"a":19624,"l":"b_4CA8","t":"code","b":[160,4],"m":"ldy","o":"#$04","x":[19609]},{"a":19626,"l":"b_4CAA","t":"code","b":[185,18,0],"m":"lda","o":"score_digits,y","oa":18,"x":[19632]},{"a":19629,"t":"code","b":[145,5],"m":"sta","o":"(ptr_screen),y","oa":5},{"a":19631,"t":"code","b":[136],"m":"dey"},{"a":19632,"t":"code","b":[16,248],"m":"bpl","o":"b_4CAA","oa":19626},{"a":19634,"t":"code","b":[160,9],"m":"ldy","o":"#$09"},{"a":19636,"t":"code","b":[169,32],"m":"lda","o":"#$20"},{"a":19638,"l":"b_4CB6","t":"code","b":[145,5],"m":"sta","o":"(ptr_screen),y","oa":5,"x":[19643]},{"a":19640,"t":"code","b":[200],"m":"iny"},{"a":19641,"t":"code","b":[192,23],"m":"cpy","o":"#$17"},{"a":19643,"t":"code","b":[144,249],"m":"bcc","o":"b_4CB6","oa":19638},{"a":19645,"t":"code","b":[164,5],"m":"ldy","o":"ptr_screen","oa":5},{"a":19647,"t":"code","b":[136],"m":"dey"},{"a":19648,"t":"code","b":[136],"m":"dey"},{"a":19649,"t":"code","b":[136],"m":"dey"},{"a":19650,"t":"code","b":[132,7],"m":"sty","o":"ptr_colour","oa":7},{"a":19652,"t":"code","b":[165,6],"m":"lda","o":"ptr_screen_hi","oa":6},{"a":19654,"t":"code","b":[24],"m":"clc"},{"a":19655,"t":"code","b":[105,208],"m":"adc","o":"#$D0"},{"a":19657,"t":"code","b":[133,8],"m":"sta","o":"ptr_colour_hi","oa":8},{"a":19659,"t":"code","b":[160,0],"m":"ldy","o":"#$00"},{"a":19661,"t":"code","b":[169,1],"m":"lda","o":"#$01"},{"a":19663,"l":"b_4CCF","t":"code","b":[145,7],"m":"sta","o":"(ptr_colour),y","oa":7,"x":[19668]},{"a":19665,"t":"code","b":[200],"m":"iny"},{"a":19666,"t":"code","b":[192,26],"m":"cpy","o":"#$1A"},{"a":19668,"t":"code","b":[144,249],"m":"bcc","o":"b_4CCF","oa":19663},{"a":19670,"t":"code","b":[169,255],"m":"lda","o":"#$FF"},{"a":19672,"t":"code","b":[133,47],"m":"sta","o":"zp_2f_scratch","oa":47},{"a":19674,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":19676,"t":"code","b":[133,16],"m":"sta","o":"tmp_x","oa":16},{"a":19678,"t":"code","b":[170],"m":"tax"},{"a":19679,"l":"b_4CDF","t":"code","b":[32,192,77],"m":"jsr","o":"name_entry_cursor","oa":19904,"x":[19698,19702,19708,19713,19717,19755]},{"a":19682,"l":"highscore_name_entry","c":"High-score name entry. Left and right walk an index 0..$1B over the alphabet strip, fire accepts, and the name is built in the buffer at $0AB4 up to 12 characters.","t":"code","b":[173,1,220],"m":"lda","o":"cia1_port_b"},{"a":19685,"t":"code","b":[133,12],"m":"sta","o":"input_byte","oa":12},{"a":19687,"t":"code","b":[41,16],"m":"and","o":"#$10"},{"a":19689,"t":"code","b":[240,28],"m":"beq","o":"b_4D07","oa":19719},{"a":19691,"t":"code","b":[165,12],"m":"lda","o":"input_byte","oa":12},{"a":19693,"t":"code","b":[41,4],"m":"and","o":"#$04"},{"a":19695,"t":"code","b":[208,7],"m":"bne","o":"b_4CF8","oa":19704},{"a":19697,"t":"code","b":[202],"m":"dex"},{"a":19698,"t":"code","b":[16,235],"m":"bpl","o":"b_4CDF","oa":19679},{"a":19700,"t":"code","b":[162,27],"m":"ldx","o":"#$1B"},{"a":19702,"t":"code","b":[208,231],"m":"bne","o":"b_4CDF","oa":19679},{"a":19704,"l":"b_4CF8","t":"code","b":[165,12],"m":"lda","o":"input_byte","oa":12,"x":[19695]},{"a":19706,"t":"code","b":[41,8],"m":"and","o":"#$08"},{"a":19708,"t":"code","b":[208,225],"m":"bne","o":"b_4CDF","oa":19679},{"a":19710,"t":"code","b":[232],"m":"inx"},{"a":19711,"t":"code","b":[224,28],"m":"cpx","o":"#$1C"},{"a":19713,"t":"code","b":[144,220],"m":"bcc","o":"b_4CDF","oa":19679},{"a":19715,"t":"code","b":[162,0],"m":"ldx","o":"#$00"},{"a":19717,"t":"code","b":[240,216],"m":"beq","o":"b_4CDF","oa":19679},{"a":19719,"l":"b_4D07","t":"code","b":[224,27],"m":"cpx","o":"#$1B","x":[19689]},{"a":19721,"t":"code","b":[240,36],"m":"beq","o":"b_4D2F","oa":19759},{"a":19723,"t":"code","b":[138],"m":"txa"},{"a":19724,"t":"code","b":[72],"m":"pha"},{"a":19725,"t":"code","b":[24],"m":"clc"},{"a":19726,"t":"code","b":[105,128],"m":"adc","o":"#$80"},{"a":19728,"t":"code","b":[166,16],"m":"ldx","o":"tmp_x","oa":16},{"a":19730,"t":"code","b":[157,180,10],"m":"sta","o":"name_buffer,x","oa":2740},{"a":19733,"t":"code","b":[32,229,77],"m":"jsr","o":"name_entry_accept_letter","oa":19941},{"a":19736,"t":"code","b":[234],"m":"nop"},{"a":19737,"t":"code","b":[234],"m":"nop"},{"a":19738,"t":"code","b":[104],"m":"pla"},{"a":19739,"t":"code","b":[170],"m":"tax"},{"a":19740,"t":"code","b":[230,16],"m":"inc","o":"tmp_x","oa":16},{"a":19742,"t":"code","b":[165,16],"m":"lda","o":"tmp_x","oa":16},{"a":19744,"t":"code","b":[201,12],"m":"cmp","o":"#$0C"},{"a":19746,"t":"code","b":[176,11],"m":"bcs","o":"b_4D2F","oa":19759},{"a":19748,"l":"b_4D24","t":"code","b":[173,1,220],"m":"lda","o":"cia1_port_b","x":[19753]},{"a":19751,"t":"code","b":[41,16],"m":"and","o":"#$10"},{"a":19753,"t":"code","b":[240,249],"m":"beq","o":"b_4D24","oa":19748},{"a":19755,"t":"code","b":[208,178],"m":"bne","o":"b_4CDF","oa":19679},{"a":19757,"t":"code","b":[234],"m":"nop"},{"a":19758,"t":"code","b":[234],"m":"nop"},{"a":19759,"l":"b_4D2F","t":"code","b":[32,0,78],"m":"jsr","o":"sid_setup_name_entry","oa":19968,"x":[19721,19746]},{"a":19762,"t":"code","b":[160,11],"m":"ldy","o":"#$0B"},{"a":19764,"t":"code","b":[162,0],"m":"ldx","o":"#$00"},{"a":19766,"l":"b_4D36","t":"code","b":[189,180,10],"m":"lda","o":"name_buffer,x","oa":2740,"x":[19803]},{"a":19769,"t":"code","b":[145,5],"m":"sta","o":"(ptr_screen),y","oa":5},{"a":19771,"t":"code","b":[201,32],"m":"cmp","o":"#$20"},{"a":19773,"t":"code","b":[240,24],"m":"beq","o":"b_4D57","oa":19799},{"a":19775,"t":"code","b":[32,48,78],"m":"jsr","o":"name_entry_letter_note","oa":20016},{"a":19778,"t":"code","b":[152],"m":"tya"},{"a":19779,"t":"code","b":[72],"m":"pha"},{"a":19780,"t":"code","b":[160,255],"m":"ldy","o":"#$FF"},{"a":19782,"l":"b_4D46","t":"code","b":[230,45],"m":"inc","o":"tick_counter","oa":45,"x":[19784,19790]},{"a":19784,"t":"code","b":[208,252],"m":"bne","o":"b_4D46","oa":19782},{"a":19786,"t":"code","b":[136],"m":"dey"},{"a":19787,"t":"code","b":[140,22,212],"m":"sty","o":"sid_filter_cutoff_hi"},{"a":19790,"t":"code","b":[208,246],"m":"bne","o":"b_4D46","oa":19782},{"a":19792,"t":"code","b":[169,16],"m":"lda","o":"#$10"},{"a":19794,"t":"code","b":[141,4,212],"m":"sta","o":"sid_v1_control"},{"a":19797,"t":"code","b":[104],"m":"pla"},{"a":19798,"t":"code","b":[168],"m":"tay"},{"a":19799,"l":"b_4D57","t":"code","b":[200],"m":"iny","x":[19773]},{"a":19800,"t":"code","b":[232],"m":"inx"},{"a":19801,"t":"code","b":[224,12],"m":"cpx","o":"#$0C"},{"a":19803,"t":"code","b":[144,217],"m":"bcc","o":"b_4D36","oa":19766},{"a":19805,"t":"code","b":[162,11],"m":"ldx","o":"#$0B"},{"a":19807,"t":"code","b":[169,32],"m":"lda","o":"#$20"},{"a":19809,"l":"b_4D61","t":"code","b":[157,180,10],"m":"sta","o":"name_buffer,x","oa":2740,"x":[19813]},{"a":19812,"t":"code","b":[202],"m":"dex"},{"a":19813,"t":"code","b":[16,250],"m":"bpl","o":"b_4D61","oa":19809},{"a":19815,"t":"code","b":[162,32],"m":"ldx","o":"#$20"},{"a":19817,"t":"code","b":[32,192,77],"m":"jsr","o":"name_entry_cursor","oa":19904},{"a":19820,"l":"b_4D6C","t":"code","b":[173,1,220],"m":"lda","o":"cia1_port_b","x":[19825]},{"a":19823,"t":"code","b":[41,16],"m":"and","o":"#$10"},{"a":19825,"t":"code","b":[240,249],"m":"beq","o":"b_4D6C","oa":19820},{"a":19827,"l":"trainer_target_highscore_save","c":"JSR into the crack's high-score save at $28A0. Choosing any trainer writes $AD here, which is why trainers and the high-score saver are mutually exclusive in this release.","t":"code","b":[32,160,40],"m":"jsr","o":"hiscore_save_to_disk","oa":10400,"x":[6539]},{"a":19830,"t":"code","b":[96],"m":"rts"},{"a":19831,"t":"gap","n":9},{"a":19840,"l":"highscore_shift_down","c":"Opens a slot in the high-score table by shifting the entries below it down one place; called from highscore_rank_score with the new entry's rank in Y. Ranks 4, 3, 2 and 1 are copied one row lower in turn ($09C2 to $0A12, $0972 to $09C2, $0922 to $0972, $08D2 to $0922), 23 bytes each - the five score digits plus the twelve-character name and the gap between them. The bottom entry is simply overwritten and lost. Y is preserved.","t":"code","b":[152],"m":"tya","x":[19563]},{"a":19841,"t":"code","b":[72],"m":"pha"},{"a":19842,"t":"code","b":[136],"m":"dey"},{"a":19843,"t":"code","b":[240,53],"m":"beq","o":"b_4DBA","oa":19898},{"a":19845,"t":"code","b":[162,22],"m":"ldx","o":"#$16"},{"a":19847,"l":"b_4D87","t":"code","b":[189,194,9],"m":"lda","o":"title_rank4_score,x","oa":2498,"x":[19854]},{"a":19850,"t":"code","b":[157,18,10],"m":"sta","o":"title_rank5_score,x","oa":2578},{"a":19853,"t":"code","b":[202],"m":"dex"},{"a":19854,"t":"code","b":[16,247],"m":"bpl","o":"b_4D87","oa":19847},{"a":19856,"t":"code","b":[136],"m":"dey"},{"a":19857,"t":"code","b":[240,39],"m":"beq","o":"b_4DBA","oa":19898},{"a":19859,"t":"code","b":[162,22],"m":"ldx","o":"#$16"},{"a":19861,"l":"b_4D95","t":"code","b":[189,114,9],"m":"lda","o":"title_rank3_score,x","oa":2418,"x":[19868]},{"a":19864,"t":"code","b":[157,194,9],"m":"sta","o":"title_rank4_score,x","oa":2498},{"a":19867,"t":"code","b":[202],"m":"dex"},{"a":19868,"t":"code","b":[16,247],"m":"bpl","o":"b_4D95","oa":19861},{"a":19870,"t":"code","b":[136],"m":"dey"},{"a":19871,"t":"code","b":[240,25],"m":"beq","o":"b_4DBA","oa":19898},{"a":19873,"t":"code","b":[162,22],"m":"ldx","o":"#$16"},{"a":19875,"l":"b_4DA3","t":"code","b":[189,34,9],"m":"lda","o":"title_rank2_score,x","oa":2338,"x":[19882]},{"a":19878,"t":"code","b":[157,114,9],"m":"sta","o":"title_rank3_score,x","oa":2418},{"a":19881,"t":"code","b":[202],"m":"dex"},{"a":19882,"t":"code","b":[16,247],"m":"bpl","o":"b_4DA3","oa":19875},{"a":19884,"t":"code","b":[136],"m":"dey"},{"a":19885,"t":"code","b":[240,11],"m":"beq","o":"b_4DBA","oa":19898},{"a":19887,"t":"code","b":[162,22],"m":"ldx","o":"#$16"},{"a":19889,"l":"b_4DB1","t":"code","b":[189,210,8],"m":"lda","o":"title_rank1_score,x","oa":2258,"x":[19896]},{"a":19892,"t":"code","b":[157,34,9],"m":"sta","o":"title_rank2_score,x","oa":2338},{"a":19895,"t":"code","b":[202],"m":"dex"},{"a":19896,"t":"code","b":[16,247],"m":"bpl","o":"b_4DB1","oa":19889},{"a":19898,"l":"b_4DBA","t":"code","b":[104],"m":"pla","x":[19843,19857,19871,19885]},{"a":19899,"t":"code","b":[168],"m":"tay"},{"a":19900,"t":"code","b":[96],"m":"rts"},{"a":19901,"t":"gap","n":3},{"a":19904,"l":"name_entry_cursor","c":"Moves the name-entry highlight to the letter X selects, and paces the loop. If X differs from the previously highlighted index $2F, the old cell's colour RAM at $DB4E+$2F goes back to purple ($04) and the new one to white ($01) - $DB4E is the colour row belonging to the alphabet strip at $0B4E. Then it burns about $3F * $FF loop passes, incrementing tick_counter as it goes, which sets the repeat rate of the left/right cursor. Called from the name-entry loop at $4CDF, and once more at $4D69 with X = $20 to park the highlight off the strip.","t":"code","b":[138],"m":"txa","x":[19679,19817]},{"a":19905,"t":"code","b":[72],"m":"pha"},{"a":19906,"t":"code","b":[197,47],"m":"cmp","o":"zp_2f_scratch","oa":47},{"a":19908,"t":"code","b":[240,17],"m":"beq","o":"b_4DD7","oa":19927},{"a":19910,"t":"code","b":[166,47],"m":"ldx","o":"zp_2f_scratch","oa":47},{"a":19912,"t":"code","b":[169,4],"m":"lda","o":"#$04"},{"a":19914,"t":"code","b":[157,78,219],"m":"sta","o":"$DB4E,x"},{"a":19917,"t":"code","b":[104],"m":"pla"},{"a":19918,"t":"code","b":[72],"m":"pha"},{"a":19919,"t":"code","b":[170],"m":"tax"},{"a":19920,"t":"code","b":[134,47],"m":"stx","o":"zp_2f_scratch","oa":47},{"a":19922,"t":"code","b":[169,1],"m":"lda","o":"#$01"},{"a":19924,"t":"code","b":[157,78,219],"m":"sta","o":"$DB4E,x"},{"a":19927,"l":"b_4DD7","t":"code","b":[104],"m":"pla","x":[19908]},{"a":19928,"t":"code","b":[170],"m":"tax"},{"a":19929,"t":"code","b":[160,63],"m":"ldy","o":"#$3F"},{"a":19931,"l":"b_4DDB","t":"code","b":[230,45],"m":"inc","o":"tick_counter","oa":45,"x":[19933,19936]},{"a":19933,"t":"code","b":[208,252],"m":"bne","o":"b_4DDB","oa":19931},{"a":19935,"t":"code","b":[136],"m":"dey"},{"a":19936,"t":"code","b":[208,249],"m":"bne","o":"b_4DDB","oa":19931},{"a":19938,"t":"code","b":[96],"m":"rts"},{"a":19939,"t":"gap","n":2},{"a":19941,"l":"name_entry_accept_letter","c":"Accepts one letter during name entry; called from $4D15 with X as the position in the name. Turns the just-filled cell white by writing $01 to $DAB4+X, the colour row belonging to the name buffer at $0AB4, sets voice 1 up through sid_setup_name_entry, then plays the key-click: filter resonance $D417 = $F0, attack/decay $D405 = $52 and voice 1 control $D404 = $11 (triangle, gated).","t":"code","b":[169,1],"m":"lda","o":"#$01","x":[19733]},{"a":19943,"t":"code","b":[157,180,218],"m":"sta","o":"$DAB4,x"},{"a":19946,"t":"code","b":[32,0,78],"m":"jsr","o":"sid_setup_name_entry","oa":19968},{"a":19949,"t":"code","b":[169,240],"m":"lda","o":"#$F0"},{"a":19951,"t":"code","b":[141,23,212],"m":"sta","o":"sid_filter_resonance"},{"a":19954,"t":"code","b":[169,82],"m":"lda","o":"#$52"},{"a":19956,"t":"code","b":[141,5,212],"m":"sta","o":"sid_v1_attack_decay"},{"a":19959,"t":"code","b":[169,17],"m":"lda","o":"#$11"},{"a":19961,"t":"code","b":[141,4,212],"m":"sta","o":"sid_v1_control"},{"a":19964,"t":"code","b":[96],"m":"rts"},{"a":19965,"t":"gap","n":3},{"a":19968,"l":"sid_setup_name_entry","c":"Sets voice 1 up for the name-entry sounds: control $20, attack/decay $3A, sustain/release $00, filter resonance $F1, cutoff $7F, volume with low-pass on ($D418 = $1F) and frequency high byte $17. Called from name_entry_accept_letter and again at $4D2F, just before the finished name is typed out across the high-score row.","t":"code","b":[169,32],"m":"lda","o":"#$20","x":[19759,19946]},{"a":19970,"t":"code","b":[141,4,212],"m":"sta","o":"sid_v1_control"},{"a":19973,"t":"code","b":[169,58],"m":"lda","o":"#$3A"},{"a":19975,"t":"code","b":[141,5,212],"m":"sta","o":"sid_v1_attack_decay"},{"a":19978,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":19980,"t":"code","b":[141,6,212],"m":"sta","o":"sid_v1_sustain_release"},{"a":19983,"t":"code","b":[169,241],"m":"lda","o":"#$F1"},{"a":19985,"t":"code","b":[141,23,212],"m":"sta","o":"sid_filter_resonance"},{"a":19988,"t":"code","b":[169,127],"m":"lda","o":"#$7F"},{"a":19990,"t":"code","b":[141,22,212],"m":"sta","o":"sid_filter_cutoff_hi"},{"a":19993,"t":"code","b":[234],"m":"nop"},{"a":19994,"t":"code","b":[169,31],"m":"lda","o":"#$1F"},{"a":19996,"t":"code","b":[141,24,212],"m":"sta","o":"sid_filter_mode_volume"},{"a":19999,"t":"code","b":[169,23],"m":"lda","o":"#$17"},{"a":20001,"t":"code","b":[141,1,212],"m":"sta","o":"sid_v1_freq_hi"},{"a":20004,"t":"code","b":[96],"m":"rts"},{"a":20005,"t":"gap","n":11},{"a":20016,"l":"name_entry_letter_note","c":"Sounds the note for one letter as the finished name is typed across the high-score row; called from $4D3F with the character code in A. Subtracting $80 turns the code into an alphabet index in $9F, which selects a frequency from the split tables $2FC0 (high byte) and $2FE0 (low byte); voice 1 is then gated with control $21 (sawtooth). Each letter of a name therefore has its own pitch. X is preserved.","t":"code","b":[56],"m":"sec","x":[19775]},{"a":20017,"t":"code","b":[233,128],"m":"sbc","o":"#$80"},{"a":20019,"t":"code","b":[133,159],"m":"sta","o":"bomb_ground_row","oa":159},{"a":20021,"t":"code","b":[138],"m":"txa"},{"a":20022,"t":"code","b":[72],"m":"pha"},{"a":20023,"t":"code","b":[166,159],"m":"ldx","o":"bomb_ground_row","oa":159},{"a":20025,"t":"code","b":[189,224,47],"m":"lda","o":"note_freq_lo,x","oa":12256},{"a":20028,"t":"code","b":[141,0,212],"m":"sta","o":"sid_v1_freq_lo"},{"a":20031,"t":"code","b":[189,192,47],"m":"lda","o":"note_freq_hi,x","oa":12224},{"a":20034,"t":"code","b":[141,1,212],"m":"sta","o":"sid_v1_freq_hi"},{"a":20037,"t":"code","b":[169,33],"m":"lda","o":"#$21"},{"a":20039,"t":"code","b":[141,4,212],"m":"sta","o":"sid_v1_control"},{"a":20042,"t":"code","b":[104],"m":"pla"},{"a":20043,"t":"code","b":[170],"m":"tax"},{"a":20044,"t":"code","b":[96],"m":"rts"},{"a":20045,"t":"gap","n":3},{"a":20048,"l":"draw_horizon_row","c":"Draws the horizon line: fills the 40 cells of screen row 11 ($05B8-$05DF) with glyph $9E, a half-tone dither, and their colour RAM ($D9B8-$D9DF) with light grey ($0F). Row 11 is where the sky ends and the desert begins. Called from $51BC while the display is being built.","t":"code","b":[160,15],"m":"ldy","o":"#$0F","x":[20924]},{"a":20050,"t":"code","b":[162,39],"m":"ldx","o":"#$27"},{"a":20052,"l":"b_4E54","t":"code","b":[169,158],"m":"lda","o":"#$9E","x":[20062]},{"a":20054,"t":"code","b":[157,184,5],"m":"sta","o":"f_05B8,x","oa":1464},{"a":20057,"t":"code","b":[152],"m":"tya"},{"a":20058,"t":"code","b":[157,184,217],"m":"sta","o":"$D9B8,x"},{"a":20061,"t":"code","b":[202],"m":"dex"},{"a":20062,"t":"code","b":[16,244],"m":"bpl","o":"b_4E54","oa":20052},{"a":20064,"t":"code","b":[96],"m":"rts"},{"a":20065,"t":"gap","n":15},{"a":20080,"l":"draw_status_panel","c":"Draws the whole status panel at the start of a life; called from the per-life sequence at $414A. Copies up to 200 bytes of the panel template at $2E00 into screen rows 20-24 ($0720-$07E7), skipping any template byte of $FF so the template can leave holes - the score digits, the radar window and the gauges - untouched. Each cell's colour is looked up in the 256-entry glyph-to-colour table at $4000, indexed by the glyph just written, and stored to $DB20+x. The template carries the SCORE and HI labels, the GAS and AAM labels and the panel border.","t":"code","b":[162,0],"m":"ldx","o":"#$00","x":[16714]},{"a":20082,"l":"b_4E72","t":"code","b":[189,0,46],"m":"lda","o":"status_panel_row0,x","oa":11776,"x":[20110]},{"a":20085,"t":"code","b":[201,255],"m":"cmp","o":"#$FF"},{"a":20087,"t":"code","b":[240,18],"m":"beq","o":"b_4E8B","oa":20107},{"a":20089,"t":"code","b":[157,32,7],"m":"sta","o":"f_0720,x","oa":1824},{"a":20092,"t":"code","b":[168],"m":"tay"},{"a":20093,"t":"code","b":[138],"m":"txa"},{"a":20094,"t":"code","b":[72],"m":"pha"},{"a":20095,"t":"code","b":[152],"m":"tya"},{"a":20096,"t":"code","b":[170],"m":"tax"},{"a":20097,"t":"code","b":[189,0,64],"m":"lda","o":"glyph_colour_table,x","oa":16384},{"a":20100,"t":"code","b":[168],"m":"tay"},{"a":20101,"t":"code","b":[104],"m":"pla"},{"a":20102,"t":"code","b":[170],"m":"tax"},{"a":20103,"t":"code","b":[152],"m":"tya"},{"a":20104,"t":"code","b":[157,32,219],"m":"sta","o":"$DB20,x"},{"a":20107,"l":"b_4E8B","t":"code","b":[232],"m":"inx","x":[20087]},{"a":20108,"t":"code","b":[224,200],"m":"cpx","o":"#$C8"},{"a":20110,"t":"code","b":[144,226],"m":"bcc","o":"b_4E72","oa":20082},{"a":20112,"t":"code","b":[96],"m":"rts"},{"a":20113,"t":"gap","n":15},{"a":20128,"l":"draw_gas_gauge","c":"Redraws the nine-cell GAS bar; called from $51F8. Builds the nine glyphs in the scratch buffer $6000-$6008 and copies them to screen row 22, columns 31-39 ($078F-$0797), colouring those cells from $2E - which sfx_low_fuel_alarm flashes between white and red while the alarm sounds. Fuel is held as three decimal digits: $17 units (0-9), $18 tenths, $19 hundredths. $17 whole cells get the solid glyph $A0 and, unless the tanks are full, the next cell gets glyph $B4, whose bitmap gas_gauge_part_glyph has just redrawn to the right part-width. The remaining cells stay blank.","t":"code","b":[162,8],"m":"ldx","o":"#$08","x":[20984]},{"a":20130,"t":"code","b":[164,46],"m":"ldy","o":"status_bar_colour","oa":46},{"a":20132,"l":"b_4EA4","t":"code","b":[169,32],"m":"lda","o":"#$20","x":[20142]},{"a":20134,"t":"code","b":[157,0,96],"m":"sta","o":"gas_bar_buffer,x","oa":24576},{"a":20137,"t":"code","b":[152],"m":"tya"},{"a":20138,"t":"code","b":[157,143,219],"m":"sta","o":"$DB8F,x"},{"a":20141,"t":"code","b":[202],"m":"dex"},{"a":20142,"t":"code","b":[16,244],"m":"bpl","o":"b_4EA4","oa":20132},{"a":20144,"t":"code","b":[166,23],"m":"ldx","o":"gas_hundreds","oa":23},{"a":20146,"t":"code","b":[138],"m":"txa"},{"a":20147,"t":"code","b":[72],"m":"pha"},{"a":20148,"l":"b_4EB4","t":"code","b":[202],"m":"dex","x":[20156]},{"a":20149,"t":"code","b":[48,7],"m":"bmi","o":"b_4EBE","oa":20158},{"a":20151,"t":"code","b":[169,160],"m":"lda","o":"#$A0"},{"a":20153,"t":"code","b":[157,0,96],"m":"sta","o":"gas_bar_buffer,x","oa":24576},{"a":20156,"t":"code","b":[208,246],"m":"bne","o":"b_4EB4","oa":20148},{"a":20158,"l":"b_4EBE","t":"code","b":[104],"m":"pla","x":[20149]},{"a":20159,"t":"code","b":[170],"m":"tax"},{"a":20160,"t":"code","b":[224,9],"m":"cpx","o":"#$09"},{"a":20162,"t":"code","b":[240,12],"m":"beq","o":"b_4ED0","oa":20176},{"a":20164,"t":"code","b":[138],"m":"txa"},{"a":20165,"t":"code","b":[72],"m":"pha"},{"a":20166,"t":"code","b":[32,112,79],"m":"jsr","o":"gas_gauge_part_glyph","oa":20336},{"a":20169,"t":"code","b":[104],"m":"pla"},{"a":20170,"t":"code","b":[170],"m":"tax"},{"a":20171,"t":"code","b":[169,180],"m":"lda","o":"#$B4"},{"a":20173,"t":"code","b":[157,0,96],"m":"sta","o":"gas_bar_buffer,x","oa":24576},{"a":20176,"l":"b_4ED0","t":"code","b":[162,8],"m":"ldx","o":"#$08","x":[20162]},{"a":20178,"l":"b_4ED2","t":"code","b":[189,0,96],"m":"lda","o":"gas_bar_buffer,x","oa":24576,"x":[20185]},{"a":20181,"t":"code","b":[157,143,7],"m":"sta","o":"f_078F,x","oa":1935},{"a":20184,"t":"code","b":[202],"m":"dex"},{"a":20185,"t":"code","b":[16,247],"m":"bpl","o":"b_4ED2","oa":20178},{"a":20187,"t":"code","b":[96],"m":"rts"},{"a":20188,"t":"gap","n":4},{"a":20192,"l":"title_wait_for_fire","c":"Waits out the rest of the title screen after the tune; called from the end of title_tune_play. Returns immediately if $B2 already says fire was pressed during the tune. Otherwise it polls $DC01 bit 4 in a loop of $2F * $7F passes and raises $B2 the moment fire is seen; each time that loop runs out it increments the tune start index $9D and goes round again, until $9D reaches $80. So the title ends either on fire or on a timeout of roughly ($80 - $9D) of those loops, and in both cases show_title_screen goes straight on to start a game - the attract cycle is the 'PRESS FIRE TO START' wait at $53E3 on the play screen, not here.","t":"code","b":[165,178],"m":"lda","o":"title_phase","oa":178,"x":[19462]},{"a":20194,"t":"code","b":[208,27],"m":"bne","o":"r_4EFF","oa":20223},{"a":20196,"l":"b_4EE4","t":"code","b":[160,47],"m":"ldy","o":"#$2F","x":[20221]},{"a":20198,"l":"b_4EE6","t":"code","b":[162,127],"m":"ldx","o":"#$7F","x":[20215]},{"a":20200,"l":"b_4EE8","t":"code","b":[173,1,220],"m":"lda","o":"cia1_port_b","x":[20212]},{"a":20203,"t":"code","b":[41,16],"m":"and","o":"#$10"},{"a":20205,"t":"code","b":[208,4],"m":"bne","o":"b_4EF3","oa":20211},{"a":20207,"t":"code","b":[230,178],"m":"inc","o":"title_phase","oa":178},{"a":20209,"t":"code","b":[208,12],"m":"bne","o":"r_4EFF","oa":20223},{"a":20211,"l":"b_4EF3","t":"code","b":[202],"m":"dex","x":[20205]},{"a":20212,"t":"code","b":[208,242],"m":"bne","o":"b_4EE8","oa":20200},{"a":20214,"t":"code","b":[136],"m":"dey"},{"a":20215,"t":"code","b":[208,237],"m":"bne","o":"b_4EE6","oa":20198},{"a":20217,"t":"code","b":[230,157],"m":"inc","o":"music_note_index","oa":157},{"a":20219,"t":"code","b":[165,157],"m":"lda","o":"music_note_index","oa":157},{"a":20221,"t":"code","b":[16,229],"m":"bpl","o":"b_4EE4","oa":20196},{"a":20223,"l":"r_4EFF","t":"code","b":[96],"m":"rts","x":[20194,20209]},{"a":20224,"l":"sid_preset_engine","c":"25-byte image of $D400-$D418 loaded by sid_load_engine: the jet engine heard throughout normal flight. All three voices are set to noise ($D404/$D40B/$D412 = $80, gate off until sid_load_engine turns voice 1 on) at frequencies $22DA, $17BE and $419B, with resonance $F5 routing voices 1 and 3 into the filter, cutoff $10 and low-pass at full volume ($D418 = $1F).","t":"byte","b":[218,34,255,0,128,13,106,190],"x":[18802]},{"a":20232,"t":"byte","b":[23,240,7,128,27,0,155,65]},{"a":20240,"t":"byte","b":[255,15,128,0,127,0,16,245]},{"a":20248,"t":"byte","b":[31]},{"a":20249,"l":"sid_preset_dive","c":"25-byte image of $D400-$D418 loaded by sid_load_dive when the aircraft starts going down, whether under control or shot down. Voice 1 noise at $0EDA with a long sustain/release ($AF), voice 2 at $419B, voice 3 at $0407, cutoff $20 and resonance $F6. flight_sound_update then sweeps the cutoff and the voice 1 and 3 frequency highs upwards from here, which is the rising scream of a dive.","t":"byte","b":[218,14,255,8,128,13,175,155],"x":[18834]},{"a":20257,"t":"byte","b":[65,255,0,128,10,191,7,4]},{"a":20265,"t":"byte","b":[255,8,128,10,160,0,32,246]},{"a":20273,"t":"byte","b":[31]},{"a":20274,"l":"sid_preset_touchdown","c":"25-byte image of $D400-$D418 loaded by sid_load_touchdown at the instant the aircraft stops on the ground. Voice 1 noise at $22DA with attack/decay $00 and sustain/release $FD, voice 2 noise at $089B with attack/decay and sustain/release both $00, voice 3 triangle at $0407, cutoff $20, resonance $F7 - the thump that flight_sound_update then fades by running the cutoff back down to $40.","t":"byte","b":[218,34,255,8,128,0,253,155],"x":[18882]},{"a":20282,"t":"byte","b":[8,255,0,128,0,0,7,4]},{"a":20290,"t":"byte","b":[255,8,16,10,253,0,32,247]},{"a":20298,"t":"byte","b":[31]},{"a":20299,"l":"sid_preset_v2_engine","c":"7-byte image of $D407-$D40D loaded by sid_load_v2_engine: voice 2's ordinary flying tone. Frequency $17BE, pulse width $07F0, control $14 (triangle with ring modulation, ungated), attack/decay $1B, sustain/release $00. Restored whenever the fuel stops being low.","t":"byte","b":[190,23,240,7,20,27,0],"x":[18930]},{"a":20306,"l":"sid_preset_v2_takeoff","c":"7-byte image of $D407-$D40D loaded by sfx_takeoff_start: voice 2 for the vertical take-off. Frequency low $00, pulse width $00FF, control $14, attack/decay $44, sustain/release $44. The frequency high byte here is a placeholder - sfx_takeoff_start overwrites $D408 with a pitch worked out from the fuel load.","t":"byte","b":[0,0,255,0,20,68,68],"x":[18962]},{"a":20313,"l":"sid_preset_v2_alarm","c":"7-byte image of $D407-$D40D loaded by sid_load_v2_alarm at each half of the low-fuel alarm's sweep: frequency $0000, pulse width $02F0, control $20 (sawtooth, ungated), attack/decay $58, sustain/release $DF. sid_load_v2_alarm then sets the frequency high to $10 and gates voice 2 with $41.","t":"byte","b":[0,0,240,2,32,88,223],"x":[19042]},{"a":20320,"t":"gap","n":16},{"a":20336,"l":"gas_gauge_part_glyph","c":"Redraws the part-full cell of the GAS bar by rewriting a character bitmap. The fractional fuel - tenths $18 and hundredths $19 - becomes a pixel count ($18 * 10 + $19) / $0C, which is 0 to 8, and that many bits are set from the left of a byte that is then written into all eight rows of glyph $B4 at $35A0 in the character generator. This is the game animating its character set rather than its screen, the same trick the radar and the landscape use. Called from draw_gas_gauge at $4EC6.","t":"code","b":[162,8],"m":"ldx","o":"#$08","x":[20166]},{"a":20338,"t":"code","b":[165,24],"m":"lda","o":"gas_tens","oa":24},{"a":20340,"l":"b_4F74","t":"code","b":[24],"m":"clc","x":[20344]},{"a":20341,"t":"code","b":[101,24],"m":"adc","o":"gas_tens","oa":24},{"a":20343,"t":"code","b":[202],"m":"dex"},{"a":20344,"t":"code","b":[16,250],"m":"bpl","o":"b_4F74","oa":20340},{"a":20346,"t":"code","b":[24],"m":"clc"},{"a":20347,"t":"code","b":[101,25],"m":"adc","o":"gas_units","oa":25},{"a":20349,"t":"code","b":[232],"m":"inx"},{"a":20350,"l":"b_4F7E","t":"code","b":[56],"m":"sec","x":[20356]},{"a":20351,"t":"code","b":[233,12],"m":"sbc","o":"#$0C"},{"a":20353,"t":"code","b":[48,3],"m":"bmi","o":"b_4F86","oa":20358},{"a":20355,"t":"code","b":[232],"m":"inx"},{"a":20356,"t":"code","b":[208,248],"m":"bne","o":"b_4F7E","oa":20350},{"a":20358,"l":"b_4F86","t":"code","b":[169,0],"m":"lda","o":"#$00","x":[20353]},{"a":20360,"l":"b_4F88","t":"code","b":[202],"m":"dex","x":[20365]},{"a":20361,"t":"code","b":[48,4],"m":"bmi","o":"b_4F8F","oa":20367},{"a":20363,"t":"code","b":[56],"m":"sec"},{"a":20364,"t":"code","b":[106],"m":"ror","o":"a"},{"a":20365,"t":"code","b":[208,249],"m":"bne","o":"b_4F88","oa":20360},{"a":20367,"l":"b_4F8F","t":"code","b":[162,7],"m":"ldx","o":"#$07","x":[20361]},{"a":20369,"l":"b_4F91","t":"code","b":[157,160,53],"m":"sta","o":"charset_gas_gauge,x","oa":13728,"x":[20373]},{"a":20372,"t":"code","b":[202],"m":"dex"},{"a":20373,"t":"code","b":[16,250],"m":"bpl","o":"b_4F91","oa":20369},{"a":20375,"t":"code","b":[96],"m":"rts"},{"a":20376,"t":"gap","n":8},{"a":20384,"l":"sfx_extra_life","c":"Extra-life fanfare, and the gate in front of the low-fuel alarm; called from $48BC whenever the aircraft is neither taking off nor going down. $55E9 sets $67 to $30 when the thousands digit of the score ($13) reaches 3, and bumps the life counter - that is the 3000-point bonus life, awarded once because $67 is only set while it is still zero. While $67 runs from $30 up to $7F this routine plays the fanfare: voice 2's preset is reloaded once through sid_load_v2_bonus on the first pass, then voice 2's control register is toggled between $41 and $20 on bit 2 of $67, a warble, and $67 counts up. Once $67 has passed $7F, or was never set, control falls through to sfx_low_fuel_alarm.","t":"code","b":[165,103],"m":"lda","o":"bonus_life_timer","oa":103,"x":[18620]},{"a":20386,"t":"code","b":[240,28],"m":"beq","o":"b_4FC0","oa":20416},{"a":20388,"t":"code","b":[48,26],"m":"bmi","o":"b_4FC0","oa":20416},{"a":20390,"t":"code","b":[201,49],"m":"cmp","o":"#$31"},{"a":20392,"t":"code","b":[176,3],"m":"bcs","o":"b_4FAD","oa":20397},{"a":20394,"t":"code","b":[32,208,79],"m":"jsr","o":"sid_load_v2_bonus","oa":20432},{"a":20397,"l":"b_4FAD","t":"code","b":[165,103],"m":"lda","o":"bonus_life_timer","oa":103,"x":[20392]},{"a":20399,"t":"code","b":[41,7],"m":"and","o":"#$07"},{"a":20401,"t":"code","b":[240,4],"m":"beq","o":"b_4FB7","oa":20407},{"a":20403,"t":"code","b":[169,65],"m":"lda","o":"#$41"},{"a":20405,"t":"code","b":[208,2],"m":"bne","o":"b_4FB9","oa":20409},{"a":20407,"l":"b_4FB7","t":"code","b":[169,32],"m":"lda","o":"#$20","x":[20401]},{"a":20409,"l":"b_4FB9","t":"code","b":[141,11,212],"m":"sta","o":"sid_v2_control","x":[20405]},{"a":20412,"t":"code","b":[230,103],"m":"inc","o":"bonus_life_timer","oa":103},{"a":20414,"t":"code","b":[208,3],"m":"bne","o":"r_4FC3","oa":20419},{"a":20416,"l":"b_4FC0","t":"code","b":[32,0,73],"m":"jsr","o":"sfx_low_fuel_alarm","oa":18688,"x":[20386,20388]},{"a":20419,"l":"r_4FC3","t":"code","b":[96],"m":"rts","x":[20414]},{"a":20420,"t":"gap","n":12},{"a":20432,"l":"sid_load_v2_bonus","c":"Loads the 7-byte image at sid_preset_v2_bonus ($4FE0) into $D407-$D40D for the extra-life fanfare and clears $27, so the alarm code at sfx_low_fuel_alarm knows voice 2 is no longer carrying its normal flying tone. Called once per bonus, from $4FAA.","t":"code","b":[162,6],"m":"ldx","o":"#$06","x":[20394]},{"a":20434,"l":"b_4FD2","t":"code","b":[189,224,79],"m":"lda","o":"sid_preset_v2_bonus,x","oa":20448,"x":[20441]},{"a":20437,"t":"code","b":[157,7,212],"m":"sta","o":"sid_v2_freq_lo,x"},{"a":20440,"t":"code","b":[202],"m":"dex"},{"a":20441,"t":"code","b":[16,247],"m":"bpl","o":"b_4FD2","oa":20434},{"a":20443,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":20445,"t":"code","b":[133,39],"m":"sta","o":"sfx_warn_state","oa":39},{"a":20447,"t":"code","b":[96],"m":"rts"},{"a":20448,"l":"sid_preset_v2_bonus","c":"7-byte image of $D407-$D40D used by sid_load_v2_bonus for the 3000-point bonus life fanfare: frequency $22BE, pulse width $07F0, control $10 (triangle, ungated - sfx_extra_life does the gating), attack/decay $88, sustain/release $05.","t":"byte","b":[190,34,240,7,16,136,5],"x":[20434]},{"a":20455,"t":"gap","n":25},{"a":20480,"l":"refuel_rearm_sequence","c":"Start of a life, called once from $4182: the jet is set down on the pad and the gauges wind up to full. First fills screen $04AB..$04AA+X with the blank glyph $1E (X is whatever the caller left; on the live path $4970 leaves X=$19, which covers the 19 bytes of the PRESS FIRE TO START prompt at $04AB). Then $5390 flies sprite 0 down onto the ground. Then it loops: $48C9 (a delay plus the engine sound plus one refuel tick), $5420 (a second refuel tick), $51C0 (repaint the readouts) and a short $5051 delay, until the fuel bar level $17 reads 9. On exit GAS is full and the AAM count has climbed to 100.","t":"code","b":[169,30],"m":"lda","o":"#$1E","x":[16770]},{"a":20482,"l":"b_5002","t":"code","b":[157,170,4],"m":"sta","o":"f_04AA,x","oa":1194,"x":[20486]},{"a":20485,"t":"code","b":[202],"m":"dex"},{"a":20486,"t":"code","b":[208,250],"m":"bne","o":"b_5002","oa":20482},{"a":20488,"t":"code","b":[32,144,83],"m":"jsr","o":"lower_jet_onto_pad","oa":21392},{"a":20491,"l":"b_500B","t":"code","b":[32,201,72],"m":"jsr","o":"landed_delay_step","oa":18633,"x":[20509]},{"a":20494,"t":"code","b":[32,32,84],"m":"jsr","o":"refuel_rearm_tick","oa":21536},{"a":20497,"t":"code","b":[32,192,81],"m":"jsr","o":"draw_status_readouts","oa":20928},{"a":20500,"t":"code","b":[160,2],"m":"ldy","o":"#$02"},{"a":20502,"t":"code","b":[32,81,80],"m":"jsr","o":"delay_y_x_loops","oa":20561},{"a":20505,"t":"code","b":[165,23],"m":"lda","o":"gas_hundreds","oa":23},{"a":20507,"t":"code","b":[201,9],"m":"cmp","o":"#$09"},{"a":20509,"t":"code","b":[144,236],"m":"bcc","o":"b_500B","oa":20491},{"a":20511,"t":"code","b":[96],"m":"rts"},{"a":20512,"l":"dead_draw_lives_row21","c":"Unreachable: eleven bytes with no cross-references, lying in the gap after $5000's rts. Would write the lives count $1D to screen $0767 (row 21, column 31) in colour 6 and return. An orphaned variant of the lives readout that the live code draws at $0777 (row 22, column 7) in colour 2, inside $51C0.","t":"code","b":[165,29],"m":"lda","o":"lives","oa":29},{"a":20514,"t":"code","b":[141,103,7],"m":"sta","o":"a_0767","oa":1895},{"a":20517,"t":"code","b":[169,6],"m":"lda","o":"#$06"},{"a":20519,"t":"code","b":[141,103,219],"m":"sta","o":"$DB67"},{"a":20522,"t":"code","b":[96],"m":"rts"},{"a":20523,"l":"cold_start_ports_then_sprites","c":"Cold-start helper, called once from $4113. Calls $5AE0, which writes CIA1's data direction registers $DC02/$DC03, then two NOPs and falls straight through into $5030, so the sprite registers get loaded from their table in the same breath.","t":"code","b":[32,224,90],"m":"jsr","o":"init_cia1_ports_and_0200","oa":23264,"x":[16659]},{"a":20526,"t":"code","b":[234],"m":"nop"},{"a":20527,"t":"code","b":[234],"m":"nop"},{"a":20528,"l":"load_sprite_registers","c":"Loads the whole VIC sprite register bank from a 47-byte table at $4310: for X = $2E down to 0, copy $4310+X into $D000+X unless the table byte is $FF, which means leave that register alone. That covers sprite X/Y ($D000-$D00F), the X high bits, enable, multicolour select and the eight sprite colours. Called per life from $4147 and reached on cold start by falling in from $502B.","t":"code","b":[162,46],"m":"ldx","o":"#$2E","x":[16711]},{"a":20530,"l":"b_5032","t":"code","b":[189,16,67],"m":"lda","o":"sprite_register_image,x","oa":17168,"x":[20541]},{"a":20533,"t":"code","b":[201,255],"m":"cmp","o":"#$FF"},{"a":20535,"t":"code","b":[240,3],"m":"beq","o":"b_503C","oa":20540},{"a":20537,"t":"code","b":[157,0,208],"m":"sta","o":"vic_sprite0_x,x"},{"a":20540,"l":"b_503C","t":"code","b":[202],"m":"dex","x":[20535]},{"a":20541,"t":"code","b":[16,243],"m":"bpl","o":"b_5032","oa":20530},{"a":20543,"t":"code","b":[96],"m":"rts"},{"a":20544,"l":"dead_delay_loop","c":"Unreachable: seventeen bytes with no cross-references, in the gap after $5030's rts. A three-deep busy-wait (Y times $10 times 255 decrements of zero-page $10) whose exit branch lands on the rts at $503F. An orphan; the delay the live code uses is $5051.","t":"code","b":[162,16],"m":"ldx","o":"#$10","x":[20558]},{"a":20546,"l":"b_5042","t":"code","b":[169,255],"m":"lda","o":"#$FF","x":[20555]},{"a":20548,"t":"code","b":[133,16],"m":"sta","o":"tmp_x","oa":16},{"a":20550,"l":"b_5046","t":"code","b":[198,16],"m":"dec","o":"tmp_x","oa":16,"x":[20552]},{"a":20552,"t":"code","b":[208,252],"m":"bne","o":"b_5046","oa":20550},{"a":20554,"t":"code","b":[202],"m":"dex"},{"a":20555,"t":"code","b":[208,245],"m":"bne","o":"b_5042","oa":20546},{"a":20557,"t":"code","b":[136],"m":"dey"},{"a":20558,"t":"code","b":[208,240],"m":"bne","o":"dead_delay_loop","oa":20544},{"a":20560,"t":"code","b":[96],"m":"rts"},{"a":20561,"l":"delay_y_x_loops","c":"Busy-wait: Y passes of a 256-step dex loop. Y on entry is the length and is destroyed; nothing else is touched. Used by $5000 to pace the start-of-life refuel animation.","t":"code","b":[162,255],"m":"ldx","o":"#$FF","x":[20502,20567]},{"a":20563,"l":"b_5053","t":"code","b":[202],"m":"dex","x":[20564]},{"a":20564,"t":"code","b":[208,253],"m":"bne","o":"b_5053","oa":20563},{"a":20566,"t":"code","b":[136],"m":"dey"},{"a":20567,"t":"code","b":[208,248],"m":"bne","o":"delay_y_x_loops","oa":20561},{"a":20569,"t":"code","b":[96],"m":"rts"},{"a":20570,"l":"place_smoke_sprite","c":"Puts sprite 7 on top of the player's sprite 0 and nudges it 8 pixels along the direction of travel: copies $D000/$D001 into $D00E/$D00F, then adds 8 to sprite 7's X for a positive vel_x or subtracts 8 for a negative one, leaving it alone when vel_x is 0. The X high bit register $D010 is not written. Only caller is $56DD, which uses sprite 7 as the smoke puff trailing a shot-down aircraft.","t":"code","b":[173,0,208],"m":"lda","o":"vic_sprite0_x","x":[22237]},{"a":20573,"t":"code","b":[141,14,208],"m":"sta","o":"vic_sprite7_x"},{"a":20576,"t":"code","b":[173,1,208],"m":"lda","o":"vic_sprite0_y"},{"a":20579,"t":"code","b":[141,15,208],"m":"sta","o":"vic_sprite7_y"},{"a":20582,"t":"code","b":[162,8],"m":"ldx","o":"#$08"},{"a":20584,"t":"code","b":[165,42],"m":"lda","o":"vel_x","oa":42},{"a":20586,"t":"code","b":[240,19],"m":"beq","o":"r_507F","oa":20607},{"a":20588,"t":"code","b":[16,8],"m":"bpl","o":"b_5076","oa":20598},{"a":20590,"l":"b_506E","t":"code","b":[238,14,208],"m":"inc","o":"vic_sprite7_x","x":[20594]},{"a":20593,"t":"code","b":[202],"m":"dex"},{"a":20594,"t":"code","b":[208,250],"m":"bne","o":"b_506E","oa":20590},{"a":20596,"t":"code","b":[240,9],"m":"beq","o":"r_507F","oa":20607},{"a":20598,"l":"b_5076","t":"code","b":[206,14,208],"m":"dec","o":"vic_sprite7_x","x":[20588,20602]},{"a":20601,"t":"code","b":[202],"m":"dex"},{"a":20602,"t":"code","b":[208,250],"m":"bne","o":"b_5076","oa":20598},{"a":20604,"t":"code","b":[234],"m":"nop"},{"a":20605,"t":"code","b":[234],"m":"nop"},{"a":20606,"t":"code","b":[234],"m":"nop"},{"a":20607,"l":"r_507F","t":"code","b":[96],"m":"rts","x":[20586,20596]},{"a":20608,"l":"clear_screen_and_reset_scroll","c":"First thing done for a new life ($4144). Blanks all 1000 bytes of screen RAM $0400-$07E7 with the space glyph $20 using four interleaved 250-byte stores, then sets the world scroll position $0D to $18. Colour RAM is left alone; the landscape, the status panel and the radar are all redrawn by the routines that follow it in the life sequence.","t":"code","b":[162,250],"m":"ldx","o":"#$FA","x":[16708]},{"a":20610,"t":"code","b":[169,32],"m":"lda","o":"#$20"},{"a":20612,"l":"b_5084","t":"code","b":[157,255,3],"m":"sta","o":"unused_03ff,x","oa":1023,"x":[20625]},{"a":20615,"t":"code","b":[157,249,4],"m":"sta","o":"f_04F9,x","oa":1273},{"a":20618,"t":"code","b":[157,243,5],"m":"sta","o":"f_05F3,x","oa":1523},{"a":20621,"t":"code","b":[157,237,6],"m":"sta","o":"f_06ED,x","oa":1773},{"a":20624,"t":"code","b":[202],"m":"dex"},{"a":20625,"t":"code","b":[208,241],"m":"bne","o":"b_5084","oa":20612},{"a":20627,"t":"code","b":[169,24],"m":"lda","o":"#$18"},{"a":20629,"t":"code","b":[133,13],"m":"sta","o":"world_x","oa":13},{"a":20631,"t":"code","b":[96],"m":"rts"},{"a":20632,"t":"gap","n":7},{"a":20639,"l":"put_terrain_column","c":"Fills one column of one landscape row from the terrain map and gives it its colour. Y on entry is the screen column (39 for the left scroller, 0 for the right one). $10 becomes $0D, plus $27 when Y is not 0, and the tile is fetched from ($0E),Y where $0E/$0F walks the map pages $3800, $3900, ... one page per landscape row. The tile code goes through ($07),Y into screen RAM and is also the index into the colour table at $4000, whose byte goes through ($09),Y into colour RAM. Ends by incrementing $0F so the next row reads the next map page. Called by $50F0 and $5120.","t":"code","b":[165,13],"m":"lda","o":"world_x","oa":13,"x":[20745,20791]},{"a":20641,"t":"code","b":[133,16],"m":"sta","o":"tmp_x","oa":16},{"a":20643,"t":"code","b":[152],"m":"tya"},{"a":20644,"t":"code","b":[72],"m":"pha"},{"a":20645,"t":"code","b":[240,7],"m":"beq","o":"b_50AE","oa":20654},{"a":20647,"t":"code","b":[165,16],"m":"lda","o":"tmp_x","oa":16},{"a":20649,"t":"code","b":[24],"m":"clc"},{"a":20650,"t":"code","b":[105,39],"m":"adc","o":"#$27"},{"a":20652,"t":"code","b":[133,16],"m":"sta","o":"tmp_x","oa":16},{"a":20654,"l":"b_50AE","t":"code","b":[164,16],"m":"ldy","o":"tmp_x","oa":16,"x":[20645]},{"a":20656,"t":"code","b":[177,14],"m":"lda","o":"(ptr_terrain),y","oa":14},{"a":20658,"t":"code","b":[170],"m":"tax"},{"a":20659,"t":"code","b":[104],"m":"pla"},{"a":20660,"t":"code","b":[168],"m":"tay"},{"a":20661,"t":"code","b":[138],"m":"txa"},{"a":20662,"t":"code","b":[145,7],"m":"sta","o":"(ptr_colour),y","oa":7},{"a":20664,"t":"code","b":[189,0,64],"m":"lda","o":"glyph_colour_table,x","oa":16384},{"a":20667,"t":"code","b":[145,9],"m":"sta","o":"(ptr_scroll_colour),y","oa":9},{"a":20669,"t":"code","b":[230,15],"m":"inc","o":"ptr_terrain_hi","oa":15},{"a":20671,"t":"code","b":[96],"m":"rts"},{"a":20672,"l":"advance_row_pointers","c":"Steps the screen pointer $07/$08 and the matching colour pointer $09/$0A on by 40 bytes, i.e. down one screen row, propagating the carry into both high bytes. The two low bytes are deliberately kept identical, which works because the screen base $0400 and colour RAM $D800 share the same alignment.","t":"code","b":[165,7],"m":"lda","o":"ptr_colour","oa":7,"x":[20752,20798]},{"a":20674,"t":"code","b":[24],"m":"clc"},{"a":20675,"t":"code","b":[105,40],"m":"adc","o":"#$28"},{"a":20677,"t":"code","b":[133,7],"m":"sta","o":"ptr_colour","oa":7},{"a":20679,"t":"code","b":[133,9],"m":"sta","o":"ptr_scroll_colour","oa":9},{"a":20681,"t":"code","b":[144,4],"m":"bcc","o":"r_50CF","oa":20687},{"a":20683,"t":"code","b":[230,8],"m":"inc","o":"ptr_colour_hi","oa":8},{"a":20685,"t":"code","b":[230,10],"m":"inc","o":"ptr_scroll_colour_hi","oa":10},{"a":20687,"l":"r_50CF","t":"code","b":[96],"m":"rts","x":[20681]},{"a":20688,"l":"init_terrain_pointers","c":"Sets up the landscape scrollers. Screen pointer $07/$08 = $05E0 (row 12, column 0, the top landscape row), colour pointer $09/$0A = $D9E0 to match, row counter $0B = 8 rows, and terrain map pointer $0E/$0F = $3800, the first map page. Called at the top of both $50F0 and $5120.","t":"code","b":[169,224],"m":"lda","o":"#$E0","x":[20720,20768]},{"a":20690,"t":"code","b":[133,7],"m":"sta","o":"ptr_colour","oa":7},{"a":20692,"t":"code","b":[133,9],"m":"sta","o":"ptr_scroll_colour","oa":9},{"a":20694,"t":"code","b":[169,5],"m":"lda","o":"#$05"},{"a":20696,"t":"code","b":[133,8],"m":"sta","o":"ptr_colour_hi","oa":8},{"a":20698,"t":"code","b":[169,217],"m":"lda","o":"#$D9"},{"a":20700,"t":"code","b":[133,10],"m":"sta","o":"ptr_scroll_colour_hi","oa":10},{"a":20702,"t":"code","b":[169,8],"m":"lda","o":"#$08"},{"a":20704,"t":"code","b":[133,11],"m":"sta","o":"scroll_rows_left","oa":11},{"a":20706,"t":"code","b":[169,56],"m":"lda","o":"#$38"},{"a":20708,"t":"code","b":[133,15],"m":"sta","o":"ptr_terrain_hi","oa":15},{"a":20710,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":20712,"t":"code","b":[133,14],"m":"sta","o":"ptr_terrain","oa":14},{"a":20714,"t":"code","b":[96],"m":"rts"},{"a":20715,"t":"gap","n":5},{"a":20720,"l":"scroll_landscape_left","c":"Scrolls the eight landscape rows (screen rows 12-19) one character to the left and increments the world position $0D - what the player sees while flying right. Per row it shifts screen and colour bytes from column c to column c-1 for c = 1..39, calls $509F to fill the vacated column 39 from that row's terrain map page, then $50C0 to drop a row; $0B counts the eight rows down. Called $2A times by $51B0 to paint the landscape from scratch, and once per step from $5F35.","t":"code","b":[32,208,80],"m":"jsr","o":"init_terrain_pointers","oa":20688,"x":[20916,24373]},{"a":20723,"t":"code","b":[230,13],"m":"inc","o":"world_x","oa":13},{"a":20725,"l":"b_50F5","t":"code","b":[160,1],"m":"ldy","o":"#$01","x":[20756]},{"a":20727,"l":"b_50F7","t":"code","b":[177,7],"m":"lda","o":"(ptr_colour),y","oa":7,"x":[20742]},{"a":20729,"t":"code","b":[72],"m":"pha"},{"a":20730,"t":"code","b":[177,9],"m":"lda","o":"(ptr_scroll_colour),y","oa":9},{"a":20732,"t":"code","b":[136],"m":"dey"},{"a":20733,"t":"code","b":[145,9],"m":"sta","o":"(ptr_scroll_colour),y","oa":9},{"a":20735,"t":"code","b":[104],"m":"pla"},{"a":20736,"t":"code","b":[145,7],"m":"sta","o":"(ptr_colour),y","oa":7},{"a":20738,"t":"code","b":[200],"m":"iny"},{"a":20739,"t":"code","b":[200],"m":"iny"},{"a":20740,"t":"code","b":[192,40],"m":"cpy","o":"#$28"},{"a":20742,"t":"code","b":[208,239],"m":"bne","o":"b_50F7","oa":20727},{"a":20744,"t":"code","b":[136],"m":"dey"},{"a":20745,"t":"code","b":[32,159,80],"m":"jsr","o":"put_terrain_column","oa":20639},{"a":20748,"t":"code","b":[198,11],"m":"dec","o":"scroll_rows_left","oa":11},{"a":20750,"t":"code","b":[240,6],"m":"beq","o":"r_5116","oa":20758},{"a":20752,"t":"code","b":[32,192,80],"m":"jsr","o":"advance_row_pointers","oa":20672},{"a":20755,"t":"code","b":[200],"m":"iny"},{"a":20756,"t":"code","b":[208,223],"m":"bne","o":"b_50F5","oa":20725},{"a":20758,"l":"r_5116","t":"code","b":[96],"m":"rts","x":[20750]},{"a":20759,"t":"gap","n":9},{"a":20768,"l":"scroll_landscape_right","c":"The mirror of $50F0: scrolls the eight landscape rows one character to the right and decrements the world position $0D, for flying left. Per row it shifts screen and colour bytes from column c to column c+1 for c = 38 down to 0, then calls $509F with Y = 0 to fill the vacated column 0 from the terrain map and $50C0 for the next row. Only caller is $5F28.","t":"code","b":[32,208,80],"m":"jsr","o":"init_terrain_pointers","oa":20688,"x":[24360]},{"a":20771,"t":"code","b":[198,13],"m":"dec","o":"world_x","oa":13},{"a":20773,"l":"b_5125","t":"code","b":[160,38],"m":"ldy","o":"#$26","x":[20802]},{"a":20775,"l":"b_5127","t":"code","b":[177,7],"m":"lda","o":"(ptr_colour),y","oa":7,"x":[20788]},{"a":20777,"t":"code","b":[72],"m":"pha"},{"a":20778,"t":"code","b":[177,9],"m":"lda","o":"(ptr_scroll_colour),y","oa":9},{"a":20780,"t":"code","b":[200],"m":"iny"},{"a":20781,"t":"code","b":[145,9],"m":"sta","o":"(ptr_scroll_colour),y","oa":9},{"a":20783,"t":"code","b":[104],"m":"pla"},{"a":20784,"t":"code","b":[145,7],"m":"sta","o":"(ptr_colour),y","oa":7},{"a":20786,"t":"code","b":[136],"m":"dey"},{"a":20787,"t":"code","b":[136],"m":"dey"},{"a":20788,"t":"code","b":[16,241],"m":"bpl","o":"b_5127","oa":20775},{"a":20790,"t":"code","b":[200],"m":"iny"},{"a":20791,"t":"code","b":[32,159,80],"m":"jsr","o":"put_terrain_column","oa":20639},{"a":20794,"t":"code","b":[198,11],"m":"dec","o":"scroll_rows_left","oa":11},{"a":20796,"t":"code","b":[240,6],"m":"beq","o":"r_5144","oa":20804},{"a":20798,"t":"code","b":[32,192,80],"m":"jsr","o":"advance_row_pointers","oa":20672},{"a":20801,"t":"code","b":[200],"m":"iny"},{"a":20802,"t":"code","b":[208,225],"m":"bne","o":"b_5125","oa":20773},{"a":20804,"l":"r_5144","t":"code","b":[96],"m":"rts","x":[20796]},{"a":20805,"t":"gap","n":11},{"a":20816,"l":"screen_ptr_if_on_playfield","c":"Bounds-checked wrapper round $5800. X is a screen column and Y a screen row; if X is $27 or more, or Y is $12 or more, it returns immediately with carry SET, meaning the point is outside the flying area. Otherwise it calls $5800 to build the screen pointer $05/$06 and colour pointer $07/$08 for that cell and returns with carry CLEAR. Used at $42A2 to work out where an enemy aircraft has hit the ground.","t":"code","b":[224,39],"m":"cpx","o":"#$27","x":[17058]},{"a":20818,"t":"code","b":[176,8],"m":"bcs","o":"r_515C","oa":20828},{"a":20820,"t":"code","b":[192,18],"m":"cpy","o":"#$12"},{"a":20822,"t":"code","b":[176,4],"m":"bcs","o":"r_515C","oa":20828},{"a":20824,"t":"code","b":[32,0,88],"m":"jsr","o":"screen_ptr_from_cell","oa":22528},{"a":20827,"t":"code","b":[24],"m":"clc"},{"a":20828,"l":"r_515C","t":"code","b":[96],"m":"rts","x":[20818,20822]},{"a":20829,"t":"gap","n":35},{"a":20864,"l":"dead_fill_panel_solid","c":"Unreachable: sixteen bytes with no cross-references, in the NOP gap between $5150 and $51B0. Would fill screen $0720-$07E8, the five status-panel rows, with the solid block glyph $A0 in colour 5 and return. The live code builds that panel instead by copying a stored image from $2E00 ($4E70).","t":"code","b":[162,201],"m":"ldx","o":"#$C9"},{"a":20866,"l":"b_5182","t":"code","b":[169,160],"m":"lda","o":"#$A0","x":[20877]},{"a":20868,"t":"code","b":[157,31,7],"m":"sta","o":"f_071F,x","oa":1823},{"a":20871,"t":"code","b":[169,5],"m":"lda","o":"#$05"},{"a":20873,"t":"code","b":[157,31,219],"m":"sta","o":"$DB1F,x"},{"a":20876,"t":"code","b":[202],"m":"dex"},{"a":20877,"t":"code","b":[208,243],"m":"bne","o":"b_5182","oa":20866},{"a":20879,"t":"code","b":[96],"m":"rts"},{"a":20880,"l":"dead_clear_sky_rows","c":"Unreachable: thirty-two bytes with no cross-references. Would fill screen $0400-$04DB and $04DC-$05B7, the sky rows above the horizon, with the blank glyph $1E and return. Six NOPs sit inside its loop body and twelve more before its rts, the shape of a routine that has been patched short.","t":"code","b":[162,220],"m":"ldx","o":"#$DC"},{"a":20882,"t":"code","b":[169,30],"m":"lda","o":"#$1E"},{"a":20884,"l":"b_5194","t":"code","b":[157,255,3],"m":"sta","o":"unused_03ff,x","oa":1023,"x":[20897]},{"a":20887,"t":"code","b":[157,219,4],"m":"sta","o":"f_04DB,x","oa":1243},{"a":20890,"t":"code","b":[234],"m":"nop"},{"a":20891,"t":"code","b":[234],"m":"nop"},{"a":20892,"t":"code","b":[234],"m":"nop"},{"a":20893,"t":"code","b":[234],"m":"nop"},{"a":20894,"t":"code","b":[234],"m":"nop"},{"a":20895,"t":"code","b":[234],"m":"nop"},{"a":20896,"t":"code","b":[202],"m":"dex"},{"a":20897,"t":"code","b":[208,241],"m":"bne","o":"b_5194","oa":20884},{"a":20899,"t":"code","b":[234],"m":"nop"},{"a":20900,"t":"code","b":[234],"m":"nop"},{"a":20901,"t":"code","b":[234],"m":"nop"},{"a":20902,"t":"code","b":[234],"m":"nop"},{"a":20903,"t":"code","b":[234],"m":"nop"},{"a":20904,"t":"code","b":[234],"m":"nop"},{"a":20905,"t":"code","b":[234],"m":"nop"},{"a":20906,"t":"code","b":[234],"m":"nop"},{"a":20907,"t":"code","b":[234],"m":"nop"},{"a":20908,"t":"code","b":[234],"m":"nop"},{"a":20909,"t":"code","b":[234],"m":"nop"},{"a":20910,"t":"code","b":[234],"m":"nop"},{"a":20911,"t":"code","b":[96],"m":"rts"},{"a":20912,"l":"paint_landscape","c":"Draws the whole landscape for a new life ($4153). Calls $50F0 $2A times, so 42 fresh columns of terrain are scrolled in from the map and every one of the 40 visible columns of all eight rows is filled; X is carried round each call on the stack. Then calls $4E50, which lays the horizon strip (glyph $9E in colour 15) along screen row 11.","t":"code","b":[162,42],"m":"ldx","o":"#$2A","x":[16723]},{"a":20914,"l":"b_51B2","t":"code","b":[138],"m":"txa","x":[20922]},{"a":20915,"t":"code","b":[72],"m":"pha"},{"a":20916,"t":"code","b":[32,240,80],"m":"jsr","o":"scroll_landscape_left","oa":20720},{"a":20919,"t":"code","b":[104],"m":"pla"},{"a":20920,"t":"code","b":[170],"m":"tax"},{"a":20921,"t":"code","b":[202],"m":"dex"},{"a":20922,"t":"code","b":[208,246],"m":"bne","o":"b_51B2","oa":20914},{"a":20924,"t":"code","b":[32,80,78],"m":"jsr","o":"draw_horizon_row","oa":20048},{"a":20927,"t":"code","b":[96],"m":"rts"},{"a":20928,"l":"draw_status_readouts","c":"Repaints every number in the status panel. Called per life ($4156), once per frame ($419F) and from the refuel loop ($5011). Score digits $12-$16 go to $0770 (row 22, columns 0-4) in white; the high score's five digits at $08D2 go to $07C0 (row 24, columns 0-4) in blue; the AAM missile count $1A-$1C goes to $07E2 (row 24, columns 34-36) in yellow; the lives count $1D goes to $0777 (row 22, column 7) in red. It ends by calling $4EA0, which draws the nine-cell GAS bar at $078F from the fuel bar level $17. The last twenty bytes before the rts are NOPs.","t":"code","b":[162,4],"m":"ldx","o":"#$04","x":[16726,16799,20497]},{"a":20930,"l":"b_51C2","t":"code","b":[181,18],"m":"lda","o":"score_digits,x","oa":18,"x":[20941]},{"a":20932,"t":"code","b":[157,112,7],"m":"sta","o":"f_0770,x","oa":1904},{"a":20935,"t":"code","b":[169,1],"m":"lda","o":"#$01"},{"a":20937,"t":"code","b":[157,112,219],"m":"sta","o":"$DB70,x"},{"a":20940,"t":"code","b":[202],"m":"dex"},{"a":20941,"t":"code","b":[16,243],"m":"bpl","o":"b_51C2","oa":20930},{"a":20943,"t":"code","b":[162,4],"m":"ldx","o":"#$04"},{"a":20945,"l":"b_51D1","t":"code","b":[189,210,8],"m":"lda","o":"title_rank1_score,x","oa":2258,"x":[20957]},{"a":20948,"t":"code","b":[157,192,7],"m":"sta","o":"f_07C0,x","oa":1984},{"a":20951,"t":"code","b":[169,6],"m":"lda","o":"#$06"},{"a":20953,"t":"code","b":[157,192,219],"m":"sta","o":"$DBC0,x"},{"a":20956,"t":"code","b":[202],"m":"dex"},{"a":20957,"t":"code","b":[16,242],"m":"bpl","o":"b_51D1","oa":20945},{"a":20959,"t":"code","b":[162,2],"m":"ldx","o":"#$02"},{"a":20961,"l":"b_51E1","t":"code","b":[181,26],"m":"lda","o":"aam_hundreds,x","oa":26,"x":[20972]},{"a":20963,"t":"code","b":[157,226,7],"m":"sta","o":"f_07E2,x","oa":2018},{"a":20966,"t":"code","b":[169,7],"m":"lda","o":"#$07"},{"a":20968,"t":"code","b":[157,226,219],"m":"sta","o":"$DBE2,x"},{"a":20971,"t":"code","b":[202],"m":"dex"},{"a":20972,"t":"code","b":[16,243],"m":"bpl","o":"b_51E1","oa":20961},{"a":20974,"t":"code","b":[165,29],"m":"lda","o":"lives","oa":29},{"a":20976,"t":"code","b":[141,119,7],"m":"sta","o":"a_0777","oa":1911},{"a":20979,"t":"code","b":[169,2],"m":"lda","o":"#$02"},{"a":20981,"t":"code","b":[141,119,219],"m":"sta","o":"$DB77"},{"a":20984,"t":"code","b":[32,160,78],"m":"jsr","o":"draw_gas_gauge","oa":20128},{"a":20987,"t":"code","b":[234],"m":"nop"},{"a":20988,"t":"code","b":[234],"m":"nop"},{"a":20989,"t":"code","b":[234],"m":"nop"},{"a":20990,"t":"code","b":[234],"m":"nop"},{"a":20991,"t":"code","b":[234],"m":"nop"},{"a":20992,"t":"code","b":[234],"m":"nop"},{"a":20993,"t":"code","b":[234],"m":"nop"},{"a":20994,"t":"code","b":[234],"m":"nop"},{"a":20995,"t":"code","b":[234],"m":"nop"},{"a":20996,"t":"code","b":[234],"m":"nop"},{"a":20997,"t":"code","b":[234],"m":"nop"},{"a":20998,"t":"code","b":[234],"m":"nop"},{"a":20999,"t":"code","b":[234],"m":"nop"},{"a":21000,"t":"code","b":[234],"m":"nop"},{"a":21001,"t":"code","b":[234],"m":"nop"},{"a":21002,"t":"code","b":[234],"m":"nop"},{"a":21003,"t":"code","b":[234],"m":"nop"},{"a":21004,"t":"code","b":[234],"m":"nop"},{"a":21005,"t":"code","b":[234],"m":"nop"},{"a":21006,"t":"code","b":[234],"m":"nop"},{"a":21007,"t":"code","b":[96],"m":"rts"},{"a":21008,"t":"gap","n":16},{"a":21024,"l":"init_unread_6400_buffer","c":"Purpose NOT established. Fills $6400-$653F (320 bytes) with glyph code $0B, writes 1, 2 and 3 into $6584, $65D4 and $6624 each followed by glyph $AE, and clears five bytes at each of $6487, $64D7 and $6627. Called once per life from $414D. Nothing else in the tracked image touches $6400-$66FF: a scan of every absolute-mode operand in $0800-$6FFF and of every immediate $64/$65/$66 stored into a zero-page pointer found only these nine instructions, and in the snapshot everything from $6540 up still holds VICE's uninitialised-RAM pattern, which this routine's own three records punch holes in. The three records are also inconsistent with one another - $6584/$65D4/$6624 and $6487/$64D7 step by $50, but the third clear is at $6627 rather than $6527. It reads like a table builder whose consumer no longer exists, but that is inference; the code itself only shows the writes.","t":"code","b":[162,0],"m":"ldx","o":"#$00","x":[16717]},{"a":21026,"t":"code","b":[169,11],"m":"lda","o":"#$0B"},{"a":21028,"l":"b_5224","t":"code","b":[157,0,100],"m":"sta","o":"initfill_6400,x","oa":25600,"x":[21037]},{"a":21031,"t":"code","b":[157,160,100],"m":"sta","o":"initfill_64A0,x","oa":25760},{"a":21034,"t":"code","b":[232],"m":"inx"},{"a":21035,"t":"code","b":[224,160],"m":"cpx","o":"#$A0"},{"a":21037,"t":"code","b":[208,245],"m":"bne","o":"b_5224","oa":21028},{"a":21039,"t":"code","b":[160,1],"m":"ldy","o":"#$01"},{"a":21041,"t":"code","b":[140,132,101],"m":"sty","o":"initrec_tag_1","oa":25988},{"a":21044,"t":"code","b":[200],"m":"iny"},{"a":21045,"t":"code","b":[140,212,101],"m":"sty","o":"initrec_tag_2","oa":26068},{"a":21048,"t":"code","b":[200],"m":"iny"},{"a":21049,"t":"code","b":[140,36,102],"m":"sty","o":"initrec_tag_3","oa":26148},{"a":21052,"t":"code","b":[169,174],"m":"lda","o":"#$AE"},{"a":21054,"t":"code","b":[141,133,101],"m":"sta","o":"initrec_value_1","oa":25989},{"a":21057,"t":"code","b":[141,213,101],"m":"sta","o":"initrec_value_2","oa":26069},{"a":21060,"t":"code","b":[141,37,102],"m":"sta","o":"initrec_value_3","oa":26149},{"a":21063,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":21065,"t":"code","b":[170],"m":"tax"},{"a":21066,"l":"b_524A","t":"code","b":[157,135,100],"m":"sta","o":"initfill_hole_1,x","oa":25735,"x":[21078]},{"a":21069,"t":"code","b":[157,215,100],"m":"sta","o":"initfill_hole_2,x","oa":25815},{"a":21072,"t":"code","b":[157,39,102],"m":"sta","o":"initrec_stray_zero_field,x","oa":26151},{"a":21075,"t":"code","b":[232],"m":"inx"},{"a":21076,"t":"code","b":[224,5],"m":"cpx","o":"#$05"},{"a":21078,"t":"code","b":[208,242],"m":"bne","o":"b_524A","oa":21066},{"a":21080,"t":"code","b":[96],"m":"rts"},{"a":21081,"t":"gap","n":7},{"a":21088,"l":"draw_radar_window","c":"Lays out the radar in the middle of the status panel. Through the pointer pair $07/$08 = $0754 and $09/$0A = $DB54 it stamps 48 consecutive glyph codes into screen rows 21, 22 and 23, columns 12-27: $D0-$DF on row 21 and $E0-$EF on row 22 in colour 9, $F0-$FF on row 23 in colour 7. Every cell gets a glyph of its own, which is what lets the radar be animated by rewriting character bitmaps at $3680-$37FF rather than by writing screen codes. Called per life from $4159.","t":"code","b":[169,84],"m":"lda","o":"#$54","x":[16729]},{"a":21090,"t":"code","b":[133,7],"m":"sta","o":"ptr_colour","oa":7},{"a":21092,"t":"code","b":[133,9],"m":"sta","o":"ptr_scroll_colour","oa":9},{"a":21094,"t":"code","b":[169,7],"m":"lda","o":"#$07"},{"a":21096,"t":"code","b":[133,8],"m":"sta","o":"ptr_colour_hi","oa":8},{"a":21098,"t":"code","b":[169,219],"m":"lda","o":"#$DB"},{"a":21100,"t":"code","b":[133,10],"m":"sta","o":"ptr_scroll_colour_hi","oa":10},{"a":21102,"t":"code","b":[160,0],"m":"ldy","o":"#$00"},{"a":21104,"t":"code","b":[162,208],"m":"ldx","o":"#$D0"},{"a":21106,"l":"b_5272","t":"code","b":[138],"m":"txa","x":[21117]},{"a":21107,"t":"code","b":[145,7],"m":"sta","o":"(ptr_colour),y","oa":7},{"a":21109,"t":"code","b":[169,9],"m":"lda","o":"#$09"},{"a":21111,"t":"code","b":[145,9],"m":"sta","o":"(ptr_scroll_colour),y","oa":9},{"a":21113,"t":"code","b":[232],"m":"inx"},{"a":21114,"t":"code","b":[200],"m":"iny"},{"a":21115,"t":"code","b":[192,16],"m":"cpy","o":"#$10"},{"a":21117,"t":"code","b":[208,243],"m":"bne","o":"b_5272","oa":21106},{"a":21119,"t":"code","b":[160,40],"m":"ldy","o":"#$28"},{"a":21121,"l":"b_5281","t":"code","b":[138],"m":"txa","x":[21132]},{"a":21122,"t":"code","b":[145,7],"m":"sta","o":"(ptr_colour),y","oa":7},{"a":21124,"t":"code","b":[169,9],"m":"lda","o":"#$09"},{"a":21126,"t":"code","b":[145,9],"m":"sta","o":"(ptr_scroll_colour),y","oa":9},{"a":21128,"t":"code","b":[232],"m":"inx"},{"a":21129,"t":"code","b":[200],"m":"iny"},{"a":21130,"t":"code","b":[192,56],"m":"cpy","o":"#$38"},{"a":21132,"t":"code","b":[208,243],"m":"bne","o":"b_5281","oa":21121},{"a":21134,"t":"code","b":[160,80],"m":"ldy","o":"#$50"},{"a":21136,"l":"b_5290","t":"code","b":[138],"m":"txa","x":[21147]},{"a":21137,"t":"code","b":[145,7],"m":"sta","o":"(ptr_colour),y","oa":7},{"a":21139,"t":"code","b":[169,7],"m":"lda","o":"#$07"},{"a":21141,"t":"code","b":[145,9],"m":"sta","o":"(ptr_scroll_colour),y","oa":9},{"a":21143,"t":"code","b":[232],"m":"inx"},{"a":21144,"t":"code","b":[200],"m":"iny"},{"a":21145,"t":"code","b":[192,96],"m":"cpy","o":"#$60"},{"a":21147,"t":"code","b":[208,243],"m":"bne","o":"b_5290","oa":21136},{"a":21149,"t":"code","b":[96],"m":"rts"},{"a":21150,"t":"gap","n":2},{"a":21152,"l":"clear_radar_bitmaps","c":"Wipes the radar back to its empty picture by rewriting the character bitmaps behind it; called per life ($4150) and again every frame ($4193) just before $52F0 plots the blips. $3680-$36FF (glyphs $D0-$DF, radar row 1) is filled with $AA, multicolour pattern %10 throughout. $3700-$377F (glyphs $E0-$EF, radar row 2) is filled with $AA and $55 in alternating runs of four bytes, so each of those glyphs is %10 across its top four scanlines and %01 across its bottom four - the horizon line drawn across the radar. It also ORs bits 0 and 1 into all eight bytes of glyph $D7 ($36B8-$36BF) and the first five bytes of glyph $E7 ($3738-$373C), a vertical line down the right edge of radar cell 7 of 16. That is exactly where $5340 plots the player (map column $0D+$12 against a left edge of $0D-$6C gives glyph 7, rightmost pixel), so it is the player's fixed centre marker.","t":"code","b":[162,0],"m":"ldx","o":"#$00","x":[16720,16787]},{"a":21154,"t":"code","b":[169,170],"m":"lda","o":"#$AA"},{"a":21156,"l":"b_52A4","t":"code","b":[157,128,54],"m":"sta","o":"charset_radar_canvas,x","oa":13952,"x":[21162]},{"a":21159,"t":"code","b":[232],"m":"inx"},{"a":21160,"t":"code","b":[224,128],"m":"cpx","o":"#$80"},{"a":21162,"t":"code","b":[208,248],"m":"bne","o":"b_52A4","oa":21156},{"a":21164,"t":"code","b":[72],"m":"pha"},{"a":21165,"t":"code","b":[138],"m":"txa"},{"a":21166,"t":"code","b":[72],"m":"pha"},{"a":21167,"t":"code","b":[162,8],"m":"ldx","o":"#$08"},{"a":21169,"l":"b_52B1","t":"code","b":[189,183,54],"m":"lda","o":"charset_radar_mid,x","oa":14007,"x":[21178]},{"a":21172,"t":"code","b":[9,3],"m":"ora","o":"#$03"},{"a":21174,"t":"code","b":[157,183,54],"m":"sta","o":"charset_radar_mid,x","oa":14007},{"a":21177,"t":"code","b":[202],"m":"dex"},{"a":21178,"t":"code","b":[208,245],"m":"bne","o":"b_52B1","oa":21169},{"a":21180,"t":"code","b":[104],"m":"pla"},{"a":21181,"t":"code","b":[170],"m":"tax"},{"a":21182,"t":"code","b":[104],"m":"pla"},{"a":21183,"t":"code","b":[160,0],"m":"ldy","o":"#$00"},{"a":21185,"l":"b_52C1","t":"code","b":[157,128,54],"m":"sta","o":"charset_radar_canvas,x","oa":13952,"x":[21206]},{"a":21188,"t":"code","b":[200],"m":"iny"},{"a":21189,"t":"code","b":[192,4],"m":"cpy","o":"#$04"},{"a":21191,"t":"code","b":[208,12],"m":"bne","o":"b_52D5","oa":21205},{"a":21193,"t":"code","b":[160,0],"m":"ldy","o":"#$00"},{"a":21195,"t":"code","b":[201,170],"m":"cmp","o":"#$AA"},{"a":21197,"t":"code","b":[240,4],"m":"beq","o":"b_52D3","oa":21203},{"a":21199,"t":"code","b":[169,170],"m":"lda","o":"#$AA"},{"a":21201,"t":"code","b":[208,2],"m":"bne","o":"b_52D5","oa":21205},{"a":21203,"l":"b_52D3","t":"code","b":[169,85],"m":"lda","o":"#$55","x":[21197]},{"a":21205,"l":"b_52D5","t":"code","b":[232],"m":"inx","x":[21191,21201]},{"a":21206,"t":"code","b":[208,233],"m":"bne","o":"b_52C1","oa":21185},{"a":21208,"l":"b_52D8","t":"code","b":[189,56,55],"m":"lda","o":"charset_radar_canvas_2,x","oa":14136,"x":[21219]},{"a":21211,"t":"code","b":[9,3],"m":"ora","o":"#$03"},{"a":21213,"t":"code","b":[157,56,55],"m":"sta","o":"charset_radar_canvas_2,x","oa":14136},{"a":21216,"t":"code","b":[232],"m":"inx"},{"a":21217,"t":"code","b":[224,5],"m":"cpx","o":"#$05"},{"a":21219,"t":"code","b":[208,243],"m":"bne","o":"b_52D8","oa":21208},{"a":21221,"t":"code","b":[96],"m":"rts"},{"a":21222,"t":"gap","n":10},{"a":21232,"l":"draw_radar_blips","c":"Draws the radar contents; called per life ($415C) and every frame ($4196), straight after $52A0 has cleared it. Sets $11 = $0D - $6C, the map column at the radar's left edge. Walks all 256 columns of the top terrain map page $3800 and, for every tile equal to $16 (an intact base), plots a blip through $5340 at radar row $0B with the map column as the position, then skips three columns so a base gives exactly one blip. The map holds six bases, at columns 4, 40, 84, 136, 172 and 200, each written as the four tiles $16 $17 $16 $17; a destroyed base reads $6F/$70 instead and so disappears from the radar until $5FD0 puts it back. It then runs X from 4 down to 1 and, where the enemy slot flag $57+X is non-zero, plots that aircraft at radar row $47+X, map column $4B+X.","t":"code","b":[165,13],"m":"lda","o":"world_x","oa":13,"x":[16732,16790]},{"a":21234,"t":"code","b":[56],"m":"sec"},{"a":21235,"t":"code","b":[233,108],"m":"sbc","o":"#$6C"},{"a":21237,"t":"code","b":[133,17],"m":"sta","o":"radar_origin","oa":17},{"a":21239,"t":"code","b":[162,0],"m":"ldx","o":"#$00"},{"a":21241,"l":"b_52F9","t":"code","b":[189,0,56],"m":"lda","o":"terrain_map_row0,x","oa":14336,"x":[21268]},{"a":21244,"t":"code","b":[201,22],"m":"cmp","o":"#$16"},{"a":21246,"t":"code","b":[208,19],"m":"bne","o":"b_5313","oa":21267},{"a":21248,"t":"code","b":[138],"m":"txa"},{"a":21249,"t":"code","b":[72],"m":"pha"},{"a":21250,"t":"code","b":[133,33],"m":"sta","o":"radar_arg_col","oa":33},{"a":21252,"t":"code","b":[169,11],"m":"lda","o":"#$0B"},{"a":21254,"t":"code","b":[133,32],"m":"sta","o":"radar_arg_row","oa":32},{"a":21256,"t":"code","b":[32,64,83],"m":"jsr","o":"plot_radar_pixel","oa":21312},{"a":21259,"t":"code","b":[104],"m":"pla"},{"a":21260,"t":"code","b":[170],"m":"tax"},{"a":21261,"t":"code","b":[232],"m":"inx"},{"a":21262,"t":"code","b":[240,6],"m":"beq","o":"b_5316","oa":21270},{"a":21264,"t":"code","b":[232],"m":"inx"},{"a":21265,"t":"code","b":[240,3],"m":"beq","o":"b_5316","oa":21270},{"a":21267,"l":"b_5313","t":"code","b":[232],"m":"inx","x":[21246]},{"a":21268,"t":"code","b":[208,227],"m":"bne","o":"b_52F9","oa":21241},{"a":21270,"l":"b_5316","t":"code","b":[162,4],"m":"ldx","o":"#$04","x":[21262,21265]},{"a":21272,"l":"b_5318","t":"code","b":[181,87],"m":"lda","o":"enemy_state,x","oa":87,"x":[21292]},{"a":21274,"t":"code","b":[240,15],"m":"beq","o":"b_532B","oa":21291},{"a":21276,"t":"code","b":[181,71],"m":"lda","o":"enemy_row,x","oa":71},{"a":21278,"t":"code","b":[133,32],"m":"sta","o":"radar_arg_row","oa":32},{"a":21280,"t":"code","b":[181,75],"m":"lda","o":"enemy_map_x,x","oa":75},{"a":21282,"t":"code","b":[133,33],"m":"sta","o":"radar_arg_col","oa":33},{"a":21284,"t":"code","b":[138],"m":"txa"},{"a":21285,"t":"code","b":[72],"m":"pha"},{"a":21286,"t":"code","b":[32,64,83],"m":"jsr","o":"plot_radar_pixel","oa":21312},{"a":21289,"t":"code","b":[104],"m":"pla"},{"a":21290,"t":"code","b":[170],"m":"tax"},{"a":21291,"l":"b_532B","t":"code","b":[202],"m":"dex","x":[21274]},{"a":21292,"t":"code","b":[208,234],"m":"bne","o":"b_5318","oa":21272},{"a":21294,"t":"code","b":[96],"m":"rts"},{"a":21295,"t":"gap","n":17},{"a":21312,"l":"plot_radar_pixel","c":"Sets one multicolour pixel in the radar's character bitmaps. $20 is the radar row 0-15 and $21 the map column; $11 must already hold the map column at the radar's left edge. Rows 0-7 are drawn through base $3680 (glyphs $D0-$DF); rows 8-15 through base $36F8, which is $3700 minus 8 so the row number carries straight on into glyphs $E0-$EF. The position is reduced to $21-$11: its high nibble selects the glyph (times 8 bytes), its low nibble divided by four selects one of the four multicolour pixels in that byte, and the mask %11000000 shifted right two bits per pixel is ORed in, so blips are drawn in pattern %11. The subtraction wraps in a byte, so the radar shows the whole 256-column world at four columns per pixel with the player centred, and nothing is ever clipped. Destroys $1E, $1F, $20 and $21.","t":"code","b":[165,32],"m":"lda","o":"radar_arg_row","oa":32,"x":[21256,21286]},{"a":21314,"t":"code","b":[201,8],"m":"cmp","o":"#$08"},{"a":21316,"t":"code","b":[144,8],"m":"bcc","o":"b_534E","oa":21326},{"a":21318,"t":"code","b":[169,248],"m":"lda","o":"#$F8"},{"a":21320,"t":"code","b":[133,30],"m":"sta","o":"ptr_radar_glyph","oa":30},{"a":21322,"t":"code","b":[169,54],"m":"lda","o":"#$36"},{"a":21324,"t":"code","b":[208,6],"m":"bne","o":"b_5354","oa":21332},{"a":21326,"l":"b_534E","t":"code","b":[169,128],"m":"lda","o":"#$80","x":[21316]},{"a":21328,"t":"code","b":[133,30],"m":"sta","o":"ptr_radar_glyph","oa":30},{"a":21330,"t":"code","b":[169,54],"m":"lda","o":"#$36"},{"a":21332,"l":"b_5354","t":"code","b":[133,31],"m":"sta","o":"ptr_radar_glyph_hi","oa":31,"x":[21324]},{"a":21334,"t":"code","b":[165,33],"m":"lda","o":"radar_arg_col","oa":33},{"a":21336,"t":"code","b":[56],"m":"sec"},{"a":21337,"t":"code","b":[229,17],"m":"sbc","o":"radar_origin","oa":17},{"a":21339,"t":"code","b":[168],"m":"tay"},{"a":21340,"t":"code","b":[41,15],"m":"and","o":"#$0F"},{"a":21342,"t":"code","b":[72],"m":"pha"},{"a":21343,"t":"code","b":[152],"m":"tya"},{"a":21344,"t":"code","b":[74],"m":"lsr","o":"a"},{"a":21345,"t":"code","b":[74],"m":"lsr","o":"a"},{"a":21346,"t":"code","b":[74],"m":"lsr","o":"a"},{"a":21347,"t":"code","b":[74],"m":"lsr","o":"a"},{"a":21348,"t":"code","b":[24],"m":"clc"},{"a":21349,"t":"code","b":[42],"m":"rol","o":"a"},{"a":21350,"t":"code","b":[42],"m":"rol","o":"a"},{"a":21351,"t":"code","b":[42],"m":"rol","o":"a"},{"a":21352,"t":"code","b":[24],"m":"clc"},{"a":21353,"t":"code","b":[101,32],"m":"adc","o":"radar_arg_row","oa":32},{"a":21355,"t":"code","b":[133,33],"m":"sta","o":"radar_arg_col","oa":33},{"a":21357,"t":"code","b":[104],"m":"pla"},{"a":21358,"t":"code","b":[74],"m":"lsr","o":"a"},{"a":21359,"t":"code","b":[74],"m":"lsr","o":"a"},{"a":21360,"t":"code","b":[168],"m":"tay"},{"a":21361,"t":"code","b":[169,192],"m":"lda","o":"#$C0"},{"a":21363,"l":"b_5373","t":"code","b":[136],"m":"dey","x":[21368]},{"a":21364,"t":"code","b":[48,4],"m":"bmi","o":"b_537A","oa":21370},{"a":21366,"t":"code","b":[74],"m":"lsr","o":"a"},{"a":21367,"t":"code","b":[74],"m":"lsr","o":"a"},{"a":21368,"t":"code","b":[208,249],"m":"bne","o":"b_5373","oa":21363},{"a":21370,"l":"b_537A","t":"code","b":[133,32],"m":"sta","o":"radar_arg_row","oa":32,"x":[21364]},{"a":21372,"t":"code","b":[164,33],"m":"ldy","o":"radar_arg_col","oa":33},{"a":21374,"t":"code","b":[177,30],"m":"lda","o":"(ptr_radar_glyph),y","oa":30},{"a":21376,"t":"code","b":[5,32],"m":"ora","o":"radar_arg_row","oa":32},{"a":21378,"t":"code","b":[145,30],"m":"sta","o":"(ptr_radar_glyph),y","oa":30},{"a":21380,"t":"code","b":[96],"m":"rts"},{"a":21381,"t":"gap","n":11},{"a":21392,"l":"lower_jet_onto_pad","c":"The opening shot of a life, called from $5008. Parks the player's sprite 0 at X = $AC (172, its fixed screen position) and Y = $60, selects the level-flight frame $83 in the sprite 0 pointer $07F8 and enables sprite 0 alone ($D015 = $01). It then walks Y down $24 steps to $84, which is ground level, with a two-deep busy-wait between steps so the descent is visible. Finally it sets flight_flags bit 0. Since $557E clears bit 0 the moment the fuel runs out, bit 0 reads as 'fuel aboard, engine running'.","t":"code","b":[169,172],"m":"lda","o":"#$AC","x":[20488]},{"a":21394,"t":"code","b":[141,0,208],"m":"sta","o":"vic_sprite0_x"},{"a":21397,"t":"code","b":[169,96],"m":"lda","o":"#$60"},{"a":21399,"t":"code","b":[141,1,208],"m":"sta","o":"vic_sprite0_y"},{"a":21402,"t":"code","b":[169,131],"m":"lda","o":"#$83"},{"a":21404,"t":"code","b":[141,248,7],"m":"sta","o":"f_07F8","oa":2040},{"a":21407,"t":"code","b":[169,1],"m":"lda","o":"#$01"},{"a":21409,"t":"code","b":[141,21,208],"m":"sta","o":"vic_sprite_enable"},{"a":21412,"t":"code","b":[162,36],"m":"ldx","o":"#$24"},{"a":21414,"l":"b_53A6","t":"code","b":[238,1,208],"m":"inc","o":"vic_sprite0_y","x":[21432]},{"a":21417,"t":"code","b":[202],"m":"dex"},{"a":21418,"t":"code","b":[240,14],"m":"beq","o":"b_53BA","oa":21434},{"a":21420,"t":"code","b":[169,32],"m":"lda","o":"#$20"},{"a":21422,"l":"b_53AE","t":"code","b":[160,255],"m":"ldy","o":"#$FF","x":[21430]},{"a":21424,"l":"b_53B0","t":"code","b":[136],"m":"dey","x":[21425]},{"a":21425,"t":"code","b":[208,253],"m":"bne","o":"b_53B0","oa":21424},{"a":21427,"t":"code","b":[56],"m":"sec"},{"a":21428,"t":"code","b":[233,1],"m":"sbc","o":"#$01"},{"a":21430,"t":"code","b":[208,246],"m":"bne","o":"b_53AE","oa":21422},{"a":21432,"t":"code","b":[240,236],"m":"beq","o":"b_53A6","oa":21414},{"a":21434,"l":"b_53BA","t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34,"x":[21418]},{"a":21436,"t":"code","b":[9,1],"m":"ora","o":"#$01"},{"a":21438,"t":"code","b":[133,34],"m":"sta","o":"flight_flags","oa":34},{"a":21440,"t":"code","b":[96],"m":"rts"},{"a":21441,"t":"gap","n":15},{"a":21456,"l":"msg_press_fire","c":"19 bytes, 'PRESS FIRE TO START' in the game's own alphabet, where a letter is its C64 screen code plus $80 and space is $20. Printed by $53E3 at screen $04AB (row 4, column 11) in white, and rubbed out again by the fill at the top of $5000. Also read from $46EC by the title screen. Everything from $53E3 onwards is code, not more text.","t":"byte","b":[144,146,133,147,147,32,134,137],"x":[18156,21481]},{"a":21464,"t":"byte","b":[146,133,32,148,143,32,147,148]},{"a":21472,"t":"byte","b":[129,146,148]},{"a":21475,"l":"prompt_press_fire","c":"Shown between games, not between lives: $4169 only calls it when the extra-life flag $67 is clear and the lives count $1D has reached 3. Returns at once if $B2 is non-zero. Otherwise it prints the 19 bytes of msg_press_fire at $04AB (row 4, column 11) in white, seeds both Y and $B1 with $E8, and spins on $DC01 waiting for the fire bit ($10) to go low. Each pass of the spin also bumps tick_counter, which is where the following game gets its randomness. If nobody presses fire the loop times out: tick_counter wrapping bumps Y, Y wrapping bumps $B1, and $B1 wrapping to 0 leaves the loop with $B1 = 0, which $416C reads as 'go back to the title screen'. On the way out it zeroes the five score digits $12-$16 and reads $D01E and $D01F to throw away any collisions latched while it waited.","t":"code","b":[165,178],"m":"lda","o":"title_phase","oa":178,"x":[16745]},{"a":21477,"t":"code","b":[208,40],"m":"bne","o":"b_540F","oa":21519},{"a":21479,"t":"code","b":[162,18],"m":"ldx","o":"#$12"},{"a":21481,"l":"b_53E9","t":"code","b":[189,208,83],"m":"lda","o":"msg_press_fire,x","oa":21456,"x":[21493]},{"a":21484,"t":"code","b":[157,171,4],"m":"sta","o":"f_04AB,x","oa":1195},{"a":21487,"t":"code","b":[169,1],"m":"lda","o":"#$01"},{"a":21489,"t":"code","b":[157,171,216],"m":"sta","o":"$D8AB,x"},{"a":21492,"t":"code","b":[202],"m":"dex"},{"a":21493,"t":"code","b":[16,242],"m":"bpl","o":"b_53E9","oa":21481},{"a":21495,"t":"code","b":[160,232],"m":"ldy","o":"#$E8"},{"a":21497,"t":"code","b":[132,177],"m":"sty","o":"title_timeout","oa":177},{"a":21499,"l":"b_53FB","t":"code","b":[173,1,220],"m":"lda","o":"cia1_port_b","x":[21508,21511,21515]},{"a":21502,"t":"code","b":[41,16],"m":"and","o":"#$10"},{"a":21504,"t":"code","b":[240,13],"m":"beq","o":"b_540F","oa":21519},{"a":21506,"t":"code","b":[230,45],"m":"inc","o":"tick_counter","oa":45},{"a":21508,"t":"code","b":[208,245],"m":"bne","o":"b_53FB","oa":21499},{"a":21510,"t":"code","b":[200],"m":"iny"},{"a":21511,"t":"code","b":[208,242],"m":"bne","o":"b_53FB","oa":21499},{"a":21513,"t":"code","b":[230,177],"m":"inc","o":"title_timeout","oa":177},{"a":21515,"t":"code","b":[208,238],"m":"bne","o":"b_53FB","oa":21499},{"a":21517,"t":"code","b":[234],"m":"nop"},{"a":21518,"t":"code","b":[234],"m":"nop"},{"a":21519,"l":"b_540F","t":"code","b":[162,4],"m":"ldx","o":"#$04","x":[21477,21504]},{"a":21521,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":21523,"l":"b_5413","t":"code","b":[149,18],"m":"sta","o":"score_digits,x","oa":18,"x":[21526]},{"a":21525,"t":"code","b":[202],"m":"dex"},{"a":21526,"t":"code","b":[16,251],"m":"bpl","o":"b_5413","oa":21523},{"a":21528,"t":"code","b":[173,30,208],"m":"lda","o":"vic_sprite_collision"},{"a":21531,"t":"code","b":[173,31,208],"m":"lda","o":"vic_sprite_bg_collision"},{"a":21534,"t":"code","b":[234],"m":"nop"},{"a":21535,"t":"code","b":[96],"m":"rts"},{"a":21536,"l":"refuel_rearm_tick","c":"One tick of refuelling and rearming - the thing that makes GAS and AAM climb. The first block adds one to the fuel fraction $19, carrying into $18 and then into the bar level $17, and stops once $17 reads 9, the nine-cell GAS bar full. The second block adds one to the AAM units $1C, carrying into $1B and then $1A, and runs only while $1A is still zero and only on one pass in eight of tick_counter, so the missile count climbs to 100 and then sticks - the documented 100 missiles at the start of a life. It finishes by clearing flight_flags bit 7, the out-of-fuel flag. Callers: $500E and (through $48C9) $48D6 in the start-of-life refuel loop, and $55D3/$55D6 twice per frame while the jet is standing on a base. NOTE the gate at $5422 is 'and #$00', which can never branch, so the fuel block always runs; that mask has plainly been patched, the way the surviving #$07 at $5447 thins the missile block.","t":"code","b":[165,45],"m":"lda","o":"tick_counter","oa":45,"x":[18646,20494,21971,21974]},{"a":21538,"t":"code","b":[41,0],"m":"and","o":"#$00"},{"a":21540,"t":"code","b":[208,31],"m":"bne","o":"b_5445","oa":21573},{"a":21542,"t":"code","b":[234],"m":"nop"},{"a":21543,"t":"code","b":[162,0],"m":"ldx","o":"#$00"},{"a":21545,"t":"code","b":[165,23],"m":"lda","o":"gas_hundreds","oa":23},{"a":21547,"t":"code","b":[201,9],"m":"cmp","o":"#$09"},{"a":21549,"t":"code","b":[240,22],"m":"beq","o":"b_5445","oa":21573},{"a":21551,"t":"code","b":[230,25],"m":"inc","o":"gas_units","oa":25},{"a":21553,"t":"code","b":[165,25],"m":"lda","o":"gas_units","oa":25},{"a":21555,"t":"code","b":[201,10],"m":"cmp","o":"#$0A"},{"a":21557,"t":"code","b":[144,14],"m":"bcc","o":"b_5445","oa":21573},{"a":21559,"t":"code","b":[134,25],"m":"stx","o":"gas_units","oa":25},{"a":21561,"t":"code","b":[230,24],"m":"inc","o":"gas_tens","oa":24},{"a":21563,"t":"code","b":[165,24],"m":"lda","o":"gas_tens","oa":24},{"a":21565,"t":"code","b":[201,10],"m":"cmp","o":"#$0A"},{"a":21567,"t":"code","b":[144,4],"m":"bcc","o":"b_5445","oa":21573},{"a":21569,"t":"code","b":[134,24],"m":"stx","o":"gas_tens","oa":24},{"a":21571,"t":"code","b":[230,23],"m":"inc","o":"gas_hundreds","oa":23},{"a":21573,"l":"b_5445","t":"code","b":[165,45],"m":"lda","o":"tick_counter","oa":45,"x":[21540,21549,21557,21567]},{"a":21575,"t":"code","b":[41,7],"m":"and","o":"#$07"},{"a":21577,"t":"code","b":[208,27],"m":"bne","o":"b_5466","oa":21606},{"a":21579,"t":"code","b":[234],"m":"nop"},{"a":21580,"t":"code","b":[165,26],"m":"lda","o":"aam_hundreds","oa":26},{"a":21582,"t":"code","b":[208,22],"m":"bne","o":"b_5466","oa":21606},{"a":21584,"t":"code","b":[230,28],"m":"inc","o":"aam_units","oa":28},{"a":21586,"t":"code","b":[165,28],"m":"lda","o":"aam_units","oa":28},{"a":21588,"t":"code","b":[201,10],"m":"cmp","o":"#$0A"},{"a":21590,"t":"code","b":[144,14],"m":"bcc","o":"b_5466","oa":21606},{"a":21592,"t":"code","b":[134,28],"m":"stx","o":"aam_units","oa":28},{"a":21594,"t":"code","b":[230,27],"m":"inc","o":"aam_tens","oa":27},{"a":21596,"t":"code","b":[165,27],"m":"lda","o":"aam_tens","oa":27},{"a":21598,"t":"code","b":[201,10],"m":"cmp","o":"#$0A"},{"a":21600,"t":"code","b":[144,4],"m":"bcc","o":"b_5466","oa":21606},{"a":21602,"t":"code","b":[134,27],"m":"stx","o":"aam_tens","oa":27},{"a":21604,"t":"code","b":[230,26],"m":"inc","o":"aam_hundreds","oa":26},{"a":21606,"l":"b_5466","t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34,"x":[21577,21582,21590,21600]},{"a":21608,"t":"code","b":[41,127],"m":"and","o":"#$7F"},{"a":21610,"t":"code","b":[133,34],"m":"sta","o":"flight_flags","oa":34},{"a":21612,"t":"code","b":[234],"m":"nop"},{"a":21613,"t":"code","b":[234],"m":"nop"},{"a":21614,"t":"code","b":[234],"m":"nop"},{"a":21615,"t":"code","b":[96],"m":"rts"},{"a":21616,"l":"dead_input_forge","c":"Unreachable, and the answer to the open question about $5470 versus $5700: $5470 itself has NO cross-references, while $5495 in the middle of it is entered by the jsr at $5780. These 37 bytes are a short original of the input handler - read $DC01 into input_byte, force $FE when flight_flags bit 1 is set (take-off) and $FF when bit 3 or bit 7 is set (going down) - followed by eight NOPs where the rest of it used to be. The version the game runs is $5700, which does the same and adds the ceiling, the floor and the low-altitude firing lock, and then calls $5495 to finish the job. So $5700 is the replacement and $5470 is the stump of what it replaced. Whether Virgin or the Remember crack did the replacing is not established.","t":"code","b":[173,1,220],"m":"lda","o":"cia1_port_b"},{"a":21619,"t":"code","b":[133,12],"m":"sta","o":"input_byte","oa":12},{"a":21621,"t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34},{"a":21623,"t":"code","b":[41,2],"m":"and","o":"#$02"},{"a":21625,"t":"code","b":[240,8],"m":"beq","o":"b_5483","oa":21635},{"a":21627,"t":"code","b":[165,12],"m":"lda","o":"input_byte","oa":12},{"a":21629,"t":"code","b":[9,254],"m":"ora","o":"#$FE"},{"a":21631,"t":"code","b":[133,12],"m":"sta","o":"input_byte","oa":12},{"a":21633,"t":"code","b":[208,18],"m":"bne","o":"flight_update","oa":21653},{"a":21635,"l":"b_5483","t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34,"x":[21625]},{"a":21637,"t":"code","b":[41,136],"m":"and","o":"#$88"},{"a":21639,"t":"code","b":[240,12],"m":"beq","o":"flight_update","oa":21653},{"a":21641,"t":"code","b":[162,255],"m":"ldx","o":"#$FF"},{"a":21643,"t":"code","b":[134,12],"m":"stx","o":"input_byte","oa":12},{"a":21645,"t":"code","b":[234],"m":"nop"},{"a":21646,"t":"code","b":[234],"m":"nop"},{"a":21647,"t":"code","b":[234],"m":"nop"},{"a":21648,"t":"code","b":[234],"m":"nop"},{"a":21649,"t":"code","b":[234],"m":"nop"},{"a":21650,"t":"code","b":[234],"m":"nop"},{"a":21651,"t":"code","b":[234],"m":"nop"},{"a":21652,"t":"code","b":[234],"m":"nop"},{"a":21653,"l":"flight_update","c":"Where the flight model actually runs. Entered by the jsr at $5780, the tail of read_input - NOT by any call to $5470, whose last instructions merely fall into it. Bumps tick_counter, then on one pass in eight calls apply_turn to step the horizontal velocity; on the other passes the bottom bit of the counter picks between the climb/dive block at $54CA and the sprite move at $54E6. $54CA and $54D8 step vel_y one unit per pass towards +1 for up held and -1 for down held. $54EA then moves the player: a positive vel_y decrements sprite 0's Y ($D001), a negative one increments it, one raster line per pass. Ends with a call to $5A20, the throttle/afterburner sound.","t":"code","b":[230,45],"m":"inc","o":"tick_counter","oa":45,"x":[21633,21639,22400]},{"a":21655,"t":"code","b":[165,45],"m":"lda","o":"tick_counter","oa":45},{"a":21657,"t":"code","b":[41,7],"m":"and","o":"#$07"},{"a":21659,"t":"code","b":[208,2],"m":"bne","o":"b_549F","oa":21663},{"a":21661,"t":"code","b":[240,9],"m":"beq","o":"apply_turn","oa":21672},{"a":21663,"l":"b_549F","t":"code","b":[165,45],"m":"lda","o":"tick_counter","oa":45,"x":[21659]},{"a":21665,"t":"code","b":[41,1],"m":"and","o":"#$01"},{"a":21667,"t":"code","b":[240,37],"m":"beq","o":"b_54CA","oa":21706},{"a":21669,"t":"code","b":[208,63],"m":"bne","o":"b_54E6","oa":21734},{"a":21671,"t":"code","b":[234],"m":"nop"},{"a":21672,"l":"apply_turn","c":"Left and right step vel_x by one, clamped to -3..+3, once every 8 passes of tick_counter. Verified live: holding right ramps vel_x to exactly +3 and world_x $0D advances; holding left ramps it to -3 and world_x retreats.","t":"code","b":[165,12],"m":"lda","o":"input_byte","oa":12,"x":[21661]},{"a":21674,"t":"code","b":[41,4],"m":"and","o":"#$04"},{"a":21676,"t":"code","b":[208,11],"m":"bne","o":"b_54B9","oa":21689},{"a":21678,"t":"code","b":[165,42],"m":"lda","o":"vel_x","oa":42},{"a":21680,"t":"code","b":[201,253],"m":"cmp","o":"#$FD"},{"a":21682,"t":"code","b":[240,22],"m":"beq","o":"b_54CA","oa":21706},{"a":21684,"t":"code","b":[198,42],"m":"dec","o":"vel_x","oa":42},{"a":21686,"t":"code","b":[76,202,84],"m":"jmp","o":"b_54CA","oa":21706},{"a":21689,"l":"b_54B9","t":"code","b":[165,12],"m":"lda","o":"input_byte","oa":12,"x":[21676]},{"a":21691,"t":"code","b":[41,8],"m":"and","o":"#$08"},{"a":21693,"t":"code","b":[208,11],"m":"bne","o":"b_54CA","oa":21706},{"a":21695,"t":"code","b":[165,42],"m":"lda","o":"vel_x","oa":42},{"a":21697,"t":"code","b":[201,3],"m":"cmp","o":"#$03"},{"a":21699,"t":"code","b":[240,5],"m":"beq","o":"b_54CA","oa":21706},{"a":21701,"t":"code","b":[230,42],"m":"inc","o":"vel_x","oa":42},{"a":21703,"t":"code","b":[234],"m":"nop"},{"a":21704,"t":"code","b":[234],"m":"nop"},{"a":21705,"t":"code","b":[234],"m":"nop"},{"a":21706,"l":"b_54CA","t":"code","b":[165,12],"m":"lda","o":"input_byte","oa":12,"x":[21667,21682,21686,21693,21699]},{"a":21708,"t":"code","b":[41,1],"m":"and","o":"#$01"},{"a":21710,"t":"code","b":[208,8],"m":"bne","o":"b_54D8","oa":21720},{"a":21712,"t":"code","b":[165,43],"m":"lda","o":"vel_y","oa":43},{"a":21714,"t":"code","b":[201,1],"m":"cmp","o":"#$01"},{"a":21716,"t":"code","b":[240,2],"m":"beq","o":"b_54D8","oa":21720},{"a":21718,"t":"code","b":[230,43],"m":"inc","o":"vel_y","oa":43},{"a":21720,"l":"b_54D8","t":"code","b":[165,12],"m":"lda","o":"input_byte","oa":12,"x":[21710,21716]},{"a":21722,"t":"code","b":[41,2],"m":"and","o":"#$02"},{"a":21724,"t":"code","b":[208,8],"m":"bne","o":"b_54E6","oa":21734},{"a":21726,"t":"code","b":[165,43],"m":"lda","o":"vel_y","oa":43},{"a":21728,"t":"code","b":[201,255],"m":"cmp","o":"#$FF"},{"a":21730,"t":"code","b":[240,2],"m":"beq","o":"b_54E6","oa":21734},{"a":21732,"t":"code","b":[198,43],"m":"dec","o":"vel_y","oa":43},{"a":21734,"l":"b_54E6","t":"code","b":[165,42],"m":"lda","o":"vel_x","oa":42,"x":[21669,21724,21730]},{"a":21736,"t":"code","b":[208,0],"m":"bne","o":"b_54EA","oa":21738},{"a":21738,"l":"b_54EA","t":"code","b":[165,43],"m":"lda","o":"vel_y","oa":43,"x":[21736]},{"a":21740,"t":"code","b":[240,18],"m":"beq","o":"b_5500","oa":21760},{"a":21742,"t":"code","b":[48,8],"m":"bmi","o":"b_54F8","oa":21752},{"a":21744,"t":"code","b":[206,1,208],"m":"dec","o":"vic_sprite0_y"},{"a":21747,"t":"code","b":[234],"m":"nop"},{"a":21748,"t":"code","b":[234],"m":"nop"},{"a":21749,"t":"code","b":[234],"m":"nop"},{"a":21750,"t":"code","b":[208,8],"m":"bne","o":"b_5500","oa":21760},{"a":21752,"l":"b_54F8","t":"code","b":[238,1,208],"m":"inc","o":"vic_sprite0_y","x":[21742]},{"a":21755,"t":"code","b":[234],"m":"nop"},{"a":21756,"t":"code","b":[234],"m":"nop"},{"a":21757,"t":"code","b":[234],"m":"nop"},{"a":21758,"t":"code","b":[234],"m":"nop"},{"a":21759,"t":"code","b":[234],"m":"nop"},{"a":21760,"l":"b_5500","t":"code","b":[32,32,90],"m":"jsr","o":"animate_player_bank","oa":23072,"x":[21740,21750]},{"a":21763,"t":"code","b":[234],"m":"nop"},{"a":21764,"t":"code","b":[234],"m":"nop"},{"a":21765,"t":"code","b":[234],"m":"nop"},{"a":21766,"t":"code","b":[234],"m":"nop"},{"a":21767,"t":"code","b":[234],"m":"nop"},{"a":21768,"t":"code","b":[234],"m":"nop"},{"a":21769,"t":"code","b":[234],"m":"nop"},{"a":21770,"t":"code","b":[234],"m":"nop"},{"a":21771,"t":"code","b":[234],"m":"nop"},{"a":21772,"t":"code","b":[234],"m":"nop"},{"a":21773,"t":"code","b":[234],"m":"nop"},{"a":21774,"t":"code","b":[234],"m":"nop"},{"a":21775,"t":"code","b":[96],"m":"rts"},{"a":21776,"l":"pad_nops_5510","c":"48 bytes of $EA between the rts that ends the flight update at $550F and the fuel burn at $5540. Padding with nothing referencing it: the routine before ends in rts and the routine after is entered by jsr from $41A2.","t":"byte","b":[234,234,234,234,234,234,234,234]},{"a":21784,"t":"byte","b":[234,234,234,234,234,234,234,234]},{"a":21792,"t":"byte","b":[234,234,234,234,234,234,234,234]},{"a":21800,"t":"byte","b":[234,234,234,234,234,234,234,234]},{"a":21808,"t":"byte","b":[234,234,234,234,234,234,234,234]},{"a":21816,"t":"byte","b":[234,234,234,234,234,234,234,234]},{"a":21824,"l":"burn_fuel","c":"Burns fuel and derives the two fuel warning flags; called every frame from $41A2. Does nothing at all while flight_flags bit 3 or bit 7 is set (the aircraft is on its way down). Otherwise it subtracts one from the fuel fraction $19, borrowing from $18 and then from the bar level $17 and stopping at zero: every second pass of tick_counter at full throttle (vel_x = +3 or -3), but only one pass in eight otherwise, so flying flat out is what empties the tank. It then clears flight_flags bits 6 and 7 and recomputes them. All three fuel bytes zero clears bit 0 and sets bit 7, which $573D reads as a forced dive - running dry puts the jet into an unrecoverable descent. $17 alone zero (bar empty, some fraction left) sets bit 6, which $4900 reads to sound the low-fuel warning.","t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34,"x":[16802]},{"a":21826,"t":"code","b":[41,138],"m":"and","o":"#$8A"},{"a":21828,"t":"code","b":[208,76],"m":"bne","o":"r_5592","oa":21906},{"a":21830,"t":"code","b":[165,45],"m":"lda","o":"tick_counter","oa":45},{"a":21832,"t":"code","b":[41,1],"m":"and","o":"#$01"},{"a":21834,"t":"code","b":[208,36],"m":"bne","o":"b_5570","oa":21872},{"a":21836,"t":"code","b":[165,42],"m":"lda","o":"vel_x","oa":42},{"a":21838,"t":"code","b":[201,253],"m":"cmp","o":"#$FD"},{"a":21840,"t":"code","b":[240,10],"m":"beq","o":"b_555C","oa":21852},{"a":21842,"t":"code","b":[201,3],"m":"cmp","o":"#$03"},{"a":21844,"t":"code","b":[240,6],"m":"beq","o":"b_555C","oa":21852},{"a":21846,"t":"code","b":[165,45],"m":"lda","o":"tick_counter","oa":45},{"a":21848,"t":"code","b":[41,7],"m":"and","o":"#$07"},{"a":21850,"t":"code","b":[208,20],"m":"bne","o":"b_5570","oa":21872},{"a":21852,"l":"b_555C","t":"code","b":[162,9],"m":"ldx","o":"#$09","x":[21840,21844]},{"a":21854,"l":"trainer_target_fuel","c":"DEC of the fuel units digit. The 'unlimited gas' trainer writes $A5 here, which identifies $17/$18/$19 as the fuel digits.","t":"code","b":[198,25],"m":"dec","o":"gas_units","oa":25,"x":[6593]},{"a":21856,"t":"code","b":[16,14],"m":"bpl","o":"b_5570","oa":21872},{"a":21858,"t":"code","b":[134,25],"m":"stx","o":"gas_units","oa":25},{"a":21860,"t":"code","b":[198,24],"m":"dec","o":"gas_tens","oa":24},{"a":21862,"t":"code","b":[16,8],"m":"bpl","o":"b_5570","oa":21872},{"a":21864,"t":"code","b":[134,24],"m":"stx","o":"gas_tens","oa":24},{"a":21866,"t":"code","b":[198,23],"m":"dec","o":"gas_hundreds","oa":23},{"a":21868,"t":"code","b":[16,2],"m":"bpl","o":"b_5570","oa":21872},{"a":21870,"t":"code","b":[230,23],"m":"inc","o":"gas_hundreds","oa":23},{"a":21872,"l":"b_5570","t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34,"x":[21834,21850,21856,21862,21868]},{"a":21874,"t":"code","b":[41,63],"m":"and","o":"#$3F"},{"a":21876,"t":"code","b":[133,34],"m":"sta","o":"flight_flags","oa":34},{"a":21878,"t":"code","b":[165,23],"m":"lda","o":"gas_hundreds","oa":23},{"a":21880,"t":"code","b":[5,24],"m":"ora","o":"gas_tens","oa":24},{"a":21882,"t":"code","b":[5,25],"m":"ora","o":"gas_units","oa":25},{"a":21884,"t":"code","b":[208,10],"m":"bne","o":"b_5588","oa":21896},{"a":21886,"t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34},{"a":21888,"t":"code","b":[41,254],"m":"and","o":"#$FE"},{"a":21890,"t":"code","b":[9,128],"m":"ora","o":"#$80"},{"a":21892,"t":"code","b":[133,34],"m":"sta","o":"flight_flags","oa":34},{"a":21894,"t":"code","b":[208,10],"m":"bne","o":"r_5592","oa":21906},{"a":21896,"l":"b_5588","t":"code","b":[165,23],"m":"lda","o":"gas_hundreds","oa":23,"x":[21884]},{"a":21898,"t":"code","b":[208,6],"m":"bne","o":"r_5592","oa":21906},{"a":21900,"t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34},{"a":21902,"t":"code","b":[9,64],"m":"ora","o":"#$40"},{"a":21904,"t":"code","b":[133,34],"m":"sta","o":"flight_flags","oa":34},{"a":21906,"l":"r_5592","t":"code","b":[96],"m":"rts","x":[21828,21894,21898]},{"a":21907,"t":"gap","n":7},{"a":21914,"l":"base_refuel_and_bonus_life","c":"Two jobs, both once per frame from $41A5. First the on-a-base test, skipped entirely while flight_flags bit 3 is set: it clears bit 1, then requires sprite 0's Y to be exactly $84 (wheels on the ground), vel_x to be zero, and the terrain map bytes at $3800+$0D+$12 and $3800+$0D+$14 both to read $16, the intact-base tile - that is, the jet standing squarely on the two pads of an airfield. When all of that holds it nudges a negative vel_y back towards zero, sets flight_flags bit 1 (which makes $5731 forge the stick to 'up', the automatic take-off) and calls the refuel tick $5420 twice, so GAS and AAM climb while the jet sits there. Second, unconditionally: if the extra-life flag $67 is still clear and score digit $13 - the thousands column of the five digits $12-$16 that $51C0 prints - has reached 3, it sets $67 to $30 and adds one to the lives count $1D. That is the documented one-off extra life at 3,000 points, and $67 being non-zero afterwards is also what stops $4163 putting the PRESS FIRE prompt up again.","t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34,"x":[16805]},{"a":21916,"t":"code","b":[41,8],"m":"and","o":"#$08"},{"a":21918,"t":"code","b":[208,63],"m":"bne","o":"b_55DF","oa":21983},{"a":21920,"t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34},{"a":21922,"t":"code","b":[41,253],"m":"and","o":"#$FD"},{"a":21924,"t":"code","b":[133,34],"m":"sta","o":"flight_flags","oa":34},{"a":21926,"t":"code","b":[173,1,208],"m":"lda","o":"vic_sprite0_y"},{"a":21929,"t":"code","b":[201,132],"m":"cmp","o":"#$84"},{"a":21931,"t":"code","b":[208,50],"m":"bne","o":"b_55DF","oa":21983},{"a":21933,"t":"code","b":[165,42],"m":"lda","o":"vel_x","oa":42},{"a":21935,"t":"code","b":[208,46],"m":"bne","o":"b_55DF","oa":21983},{"a":21937,"t":"code","b":[165,13],"m":"lda","o":"world_x","oa":13},{"a":21939,"t":"code","b":[24],"m":"clc"},{"a":21940,"t":"code","b":[105,18],"m":"adc","o":"#$12"},{"a":21942,"t":"code","b":[170],"m":"tax"},{"a":21943,"t":"code","b":[189,0,56],"m":"lda","o":"terrain_map_row0,x","oa":14336},{"a":21946,"t":"code","b":[201,22],"m":"cmp","o":"#$16"},{"a":21948,"t":"code","b":[208,33],"m":"bne","o":"b_55DF","oa":21983},{"a":21950,"t":"code","b":[232],"m":"inx"},{"a":21951,"t":"code","b":[232],"m":"inx"},{"a":21952,"t":"code","b":[189,0,56],"m":"lda","o":"terrain_map_row0,x","oa":14336},{"a":21955,"t":"code","b":[201,22],"m":"cmp","o":"#$16"},{"a":21957,"t":"code","b":[208,24],"m":"bne","o":"b_55DF","oa":21983},{"a":21959,"t":"code","b":[165,43],"m":"lda","o":"vel_y","oa":43},{"a":21961,"t":"code","b":[16,2],"m":"bpl","o":"b_55CD","oa":21965},{"a":21963,"t":"code","b":[230,43],"m":"inc","o":"vel_y","oa":43},{"a":21965,"l":"b_55CD","t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34,"x":[21961]},{"a":21967,"t":"code","b":[9,2],"m":"ora","o":"#$02"},{"a":21969,"t":"code","b":[133,34],"m":"sta","o":"flight_flags","oa":34},{"a":21971,"t":"code","b":[32,32,84],"m":"jsr","o":"refuel_rearm_tick","oa":21536},{"a":21974,"t":"code","b":[32,32,84],"m":"jsr","o":"refuel_rearm_tick","oa":21536},{"a":21977,"t":"code","b":[234],"m":"nop"},{"a":21978,"t":"code","b":[234],"m":"nop"},{"a":21979,"t":"code","b":[234],"m":"nop"},{"a":21980,"t":"code","b":[234],"m":"nop"},{"a":21981,"t":"code","b":[234],"m":"nop"},{"a":21982,"t":"code","b":[234],"m":"nop"},{"a":21983,"l":"b_55DF","t":"code","b":[165,103],"m":"lda","o":"bonus_life_timer","oa":103,"x":[21918,21931,21935,21948,21957]},{"a":21985,"t":"code","b":[208,12],"m":"bne","o":"r_55EF","oa":21999},{"a":21987,"t":"code","b":[165,19],"m":"lda","o":"score_digit_thousands","oa":19},{"a":21989,"t":"code","b":[201,3],"m":"cmp","o":"#$03"},{"a":21991,"t":"code","b":[144,6],"m":"bcc","o":"r_55EF","oa":21999},{"a":21993,"t":"code","b":[169,48],"m":"lda","o":"#$30"},{"a":21995,"t":"code","b":[133,103],"m":"sta","o":"bonus_life_timer","oa":103},{"a":21997,"t":"code","b":[230,29],"m":"inc","o":"lives","oa":29},{"a":21999,"l":"r_55EF","t":"code","b":[96],"m":"rts","x":[21985,21991]},{"a":22000,"t":"gap","n":16},{"a":22016,"l":"animate_bank_attitude","c":"Chooses the player aircraft's shape from what it is doing; called from $5AB8. If flight_flags bit 3 is set the aircraft has been hit, so it hands straight over to the crash sequence $5690 and returns. Otherwise it does nothing while the throttle-sound state $98 is non-zero, and then, on one pass in four of tick_counter, steps the sprite 0 pointer $07F8 one frame towards a target chosen by the horizontal velocity: $83 when vel_x is zero, $80 when it is negative and $86 when it is positive. Frames $80-$86 are the seven bank attitudes of the jet with $83 level, so the aircraft rolls into and out of a turn over several frames instead of snapping.","t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34,"x":[23224]},{"a":22018,"t":"code","b":[41,8],"m":"and","o":"#$08"},{"a":22020,"t":"code","b":[240,6],"m":"beq","o":"b_560C","oa":22028},{"a":22022,"t":"code","b":[32,144,86],"m":"jsr","o":"crash_sequence","oa":22160},{"a":22025,"t":"code","b":[24],"m":"clc"},{"a":22026,"t":"code","b":[144,51],"m":"bcc","o":"r_563F","oa":22079},{"a":22028,"l":"b_560C","t":"code","b":[165,152],"m":"lda","o":"attitude_active","oa":152,"x":[22020]},{"a":22030,"t":"code","b":[208,47],"m":"bne","o":"r_563F","oa":22079},{"a":22032,"t":"code","b":[165,45],"m":"lda","o":"tick_counter","oa":45},{"a":22034,"t":"code","b":[41,3],"m":"and","o":"#$03"},{"a":22036,"t":"code","b":[208,41],"m":"bne","o":"r_563F","oa":22079},{"a":22038,"t":"code","b":[165,42],"m":"lda","o":"vel_x","oa":42},{"a":22040,"t":"code","b":[208,19],"m":"bne","o":"b_562D","oa":22061},{"a":22042,"t":"code","b":[173,248,7],"m":"lda","o":"f_07F8","oa":2040},{"a":22045,"t":"code","b":[201,131],"m":"cmp","o":"#$83"},{"a":22047,"t":"code","b":[240,30],"m":"beq","o":"r_563F","oa":22079},{"a":22049,"t":"code","b":[176,5],"m":"bcs","o":"b_5628","oa":22056},{"a":22051,"l":"b_5623","t":"code","b":[238,248,7],"m":"inc","o":"f_07F8","oa":2040,"x":[22077]},{"a":22054,"t":"code","b":[208,23],"m":"bne","o":"r_563F","oa":22079},{"a":22056,"l":"b_5628","t":"code","b":[206,248,7],"m":"dec","o":"f_07F8","oa":2040,"x":[22049,22070]},{"a":22059,"t":"code","b":[208,18],"m":"bne","o":"r_563F","oa":22079},{"a":22061,"l":"b_562D","t":"code","b":[16,9],"m":"bpl","o":"b_5638","oa":22072,"x":[22040]},{"a":22063,"t":"code","b":[173,248,7],"m":"lda","o":"f_07F8","oa":2040},{"a":22066,"t":"code","b":[201,128],"m":"cmp","o":"#$80"},{"a":22068,"t":"code","b":[240,9],"m":"beq","o":"r_563F","oa":22079},{"a":22070,"t":"code","b":[208,240],"m":"bne","o":"b_5628","oa":22056},{"a":22072,"l":"b_5638","t":"code","b":[173,248,7],"m":"lda","o":"f_07F8","oa":2040,"x":[22061]},{"a":22075,"t":"code","b":[201,134],"m":"cmp","o":"#$86"},{"a":22077,"t":"code","b":[208,228],"m":"bne","o":"b_5623","oa":22051},{"a":22079,"l":"r_563F","t":"code","b":[96],"m":"rts","x":[22026,22030,22036,22047,22054,22059,22068]},{"a":22080,"l":"end_life_when_wreck_settled","c":"Called from $41CD, which only reaches it while flight_flags bit 3 is set - the aircraft has been destroyed. It waits for the explosion to finish: sprite 0's pointer $07F8 must have reached $90, the blank frame at the end of the $88-$8F debris sequence, and tick_counter must happen to read $4F. Then it falls into $564E and the life is over. The caller afterwards sees bit 3 cleared, leaves the inner loop, and either restarts the life sequence or, when $1D has reached zero, goes back to the title screen.","t":"code","b":[173,248,7],"m":"lda","o":"f_07F8","oa":2040,"x":[16845]},{"a":22083,"t":"code","b":[201,144],"m":"cmp","o":"#$90"},{"a":22085,"t":"code","b":[144,59],"m":"bcc","o":"r_5682","oa":22146},{"a":22087,"t":"code","b":[165,45],"m":"lda","o":"tick_counter","oa":45},{"a":22089,"t":"code","b":[201,79],"m":"cmp","o":"#$4F"},{"a":22091,"t":"code","b":[208,53],"m":"bne","o":"r_5682","oa":22146},{"a":22093,"t":"code","b":[234],"m":"nop"},{"a":22094,"l":"reset_game_state","c":"Wipes the working state for a fresh life; also called on cold start from $4132. It first calls $5FD0, which walks the top terrain map page and turns every destroyed-base tile ($6F, $70) back into an intact one ($16, $17) - this is the only place in the image that brings bases back, which is exactly the documented 'destroyed bases return only when a life is lost'. It then zeroes $17-$64 (fuel, missile count, enemy slots and the rest) while saving and restoring the lives count $1D across the wipe, sets the eight bytes $3C-$43 to $FF, zeroes $98-$B0, sets $62 = $0A and the panel colour $2E = $02, calls $4C30, clears the explosion-stage byte $24 and calls $5BA0.","t":"code","b":[32,208,95],"m":"jsr","o":"rebuild_bases","oa":24528,"x":[16690]},{"a":22097,"t":"code","b":[164,29],"m":"ldy","o":"lives","oa":29},{"a":22099,"t":"code","b":[162,78],"m":"ldx","o":"#$4E"},{"a":22101,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":22103,"l":"b_5657","t":"code","b":[149,22],"m":"sta","o":"score_digit_units,x","oa":22,"x":[22106]},{"a":22105,"t":"code","b":[202],"m":"dex"},{"a":22106,"t":"code","b":[208,251],"m":"bne","o":"b_5657","oa":22103},{"a":22108,"t":"code","b":[132,29],"m":"sty","o":"lives","oa":29},{"a":22110,"t":"code","b":[169,255],"m":"lda","o":"#$FF"},{"a":22112,"t":"code","b":[162,7],"m":"ldx","o":"#$07"},{"a":22114,"l":"b_5662","t":"code","b":[149,60],"m":"sta","o":"bomb_rows,x","oa":60,"x":[22117]},{"a":22116,"t":"code","b":[202],"m":"dex"},{"a":22117,"t":"code","b":[16,251],"m":"bpl","o":"b_5662","oa":22114},{"a":22119,"t":"code","b":[162,24],"m":"ldx","o":"#$18"},{"a":22121,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":22123,"l":"b_566B","t":"code","b":[149,152],"m":"sta","o":"attitude_active,x","oa":152,"x":[22126]},{"a":22125,"t":"code","b":[202],"m":"dex"},{"a":22126,"t":"code","b":[16,251],"m":"bpl","o":"b_566B","oa":22123},{"a":22128,"t":"code","b":[169,10],"m":"lda","o":"#$0A"},{"a":22130,"t":"code","b":[133,98],"m":"sta","o":"zp_62_unknown","oa":98},{"a":22132,"t":"code","b":[169,2],"m":"lda","o":"#$02"},{"a":22134,"t":"code","b":[133,46],"m":"sta","o":"status_bar_colour","oa":46},{"a":22136,"t":"code","b":[32,48,76],"m":"jsr","o":"sid_silence","oa":19504},{"a":22139,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":22141,"t":"code","b":[133,36],"m":"sta","o":"sfx_crash_state","oa":36},{"a":22143,"t":"code","b":[32,160,91],"m":"jsr","o":"reset_player_sprite_shapes","oa":23456},{"a":22146,"l":"r_5682","t":"code","b":[96],"m":"rts","x":[22085,22091]},{"a":22147,"t":"gap","n":13},{"a":22160,"l":"crash_sequence","c":"The aircraft's own part of being shot down; reached from $5600 whenever flight_flags bit 3 is set. While the wreck is still above the ground (sprite 0 Y below $7F) or still moving vertically it switches sprite 7 on, calls $505A to hold it over the player's sprite offset 8 pixels along the direction of travel, and cycles sprite 7's pointer $07FF round $90, $91, $92, $93 - the expanding smoke puff trailing the fall. Once the wreck is down and stopped it takes one of two paths on the explosion-stage byte $24. While $24 is not yet $90 it picks a random debris frame $88-$8F for sprite 0 from SID oscillator 3 ($D41B masked to 0-7 plus $88), switches sprite 7 off, and turns sprite 0 multicolour ($D01C bit 0) and white ($D027 = 1): a flickering fireball. Once the sound routine $4800 has finished its filter sweep and set $24 to $90, it instead steps $07F8 up one frame every eighth tick until it reaches $90, the blank frame, which is what $5640 is waiting for to end the life.","t":"code","b":[173,1,208],"m":"lda","o":"vic_sprite0_y","x":[22022]},{"a":22163,"t":"code","b":[201,127],"m":"cmp","o":"#$7F"},{"a":22165,"t":"code","b":[144,62],"m":"bcc","o":"b_56D5","oa":22229},{"a":22167,"t":"code","b":[165,43],"m":"lda","o":"vel_y","oa":43},{"a":22169,"t":"code","b":[208,58],"m":"bne","o":"b_56D5","oa":22229},{"a":22171,"t":"code","b":[165,36],"m":"lda","o":"sfx_crash_state","oa":36},{"a":22173,"t":"code","b":[201,144],"m":"cmp","o":"#$90"},{"a":22175,"t":"code","b":[240,34],"m":"beq","o":"b_56C3","oa":22211},{"a":22177,"t":"code","b":[173,27,212],"m":"lda","o":"sid_v3_oscillator"},{"a":22180,"t":"code","b":[41,7],"m":"and","o":"#$07"},{"a":22182,"t":"code","b":[24],"m":"clc"},{"a":22183,"t":"code","b":[105,136],"m":"adc","o":"#$88"},{"a":22185,"t":"code","b":[141,248,7],"m":"sta","o":"f_07F8","oa":2040},{"a":22188,"t":"code","b":[173,21,208],"m":"lda","o":"vic_sprite_enable"},{"a":22191,"t":"code","b":[41,127],"m":"and","o":"#$7F"},{"a":22193,"t":"code","b":[141,21,208],"m":"sta","o":"vic_sprite_enable"},{"a":22196,"t":"code","b":[173,28,208],"m":"lda","o":"vic_sprite_multicolour"},{"a":22199,"t":"code","b":[9,1],"m":"ora","o":"#$01"},{"a":22201,"t":"code","b":[141,28,208],"m":"sta","o":"vic_sprite_multicolour"},{"a":22204,"t":"code","b":[169,1],"m":"lda","o":"#$01"},{"a":22206,"t":"code","b":[141,39,208],"m":"sta","o":"vic_sprite0_colour"},{"a":22209,"t":"code","b":[208,48],"m":"bne","o":"r_56F3","oa":22259},{"a":22211,"l":"b_56C3","t":"code","b":[165,45],"m":"lda","o":"tick_counter","oa":45,"x":[22175]},{"a":22213,"t":"code","b":[41,7],"m":"and","o":"#$07"},{"a":22215,"t":"code","b":[208,42],"m":"bne","o":"r_56F3","oa":22259},{"a":22217,"t":"code","b":[173,248,7],"m":"lda","o":"f_07F8","oa":2040},{"a":22220,"t":"code","b":[201,144],"m":"cmp","o":"#$90"},{"a":22222,"t":"code","b":[176,35],"m":"bcs","o":"r_56F3","oa":22259},{"a":22224,"t":"code","b":[238,248,7],"m":"inc","o":"f_07F8","oa":2040},{"a":22227,"t":"code","b":[208,30],"m":"bne","o":"r_56F3","oa":22259},{"a":22229,"l":"b_56D5","t":"code","b":[173,21,208],"m":"lda","o":"vic_sprite_enable","x":[22165,22169]},{"a":22232,"t":"code","b":[9,128],"m":"ora","o":"#$80"},{"a":22234,"t":"code","b":[141,21,208],"m":"sta","o":"vic_sprite_enable"},{"a":22237,"t":"code","b":[32,90,80],"m":"jsr","o":"place_smoke_sprite","oa":20570},{"a":22240,"t":"code","b":[173,255,7],"m":"lda","o":"f_07FF","oa":2047},{"a":22243,"t":"code","b":[208,7],"m":"bne","o":"b_56EC","oa":22252},{"a":22245,"l":"b_56E5","t":"code","b":[169,144],"m":"lda","o":"#$90","x":[22254]},{"a":22247,"t":"code","b":[141,255,7],"m":"sta","o":"f_07FF","oa":2047},{"a":22250,"t":"code","b":[208,7],"m":"bne","o":"r_56F3","oa":22259},{"a":22252,"l":"b_56EC","t":"code","b":[201,147],"m":"cmp","o":"#$93","x":[22243]},{"a":22254,"t":"code","b":[176,245],"m":"bcs","o":"b_56E5","oa":22245},{"a":22256,"t":"code","b":[238,255,7],"m":"inc","o":"f_07FF","oa":2047},{"a":22259,"l":"r_56F3","t":"code","b":[96],"m":"rts","x":[22209,22215,22222,22227,22250]},{"a":22260,"t":"gap","n":12},{"a":22272,"l":"read_input","c":"Reads control port 1 at $DC01 into input_byte, then forges that byte to enforce the flight envelope. Called from $419A. Port 1 shares $DC01 with keyboard row 7, which is why $DC00 is parked at $7F.","t":"code","b":[173,1,220],"m":"lda","o":"cia1_port_b","x":[16793]},{"a":22275,"t":"code","b":[133,12],"m":"sta","o":"input_byte","oa":12},{"a":22277,"c":"Ceiling: above sprite Y $30, set the up bit so the climb reads as released. Verified live - a climb from the pad stops dead at Y $2F with the input byte snapping from $FE back to $FF.","t":"code","b":[173,1,208],"m":"lda","o":"vic_sprite0_y"},{"a":22280,"t":"code","b":[201,48],"m":"cmp","o":"#$30"},{"a":22282,"t":"code","b":[176,12],"m":"bcs","o":"b_5718","oa":22296},{"a":22284,"t":"code","b":[165,12],"m":"lda","o":"input_byte","oa":12},{"a":22286,"t":"code","b":[9,1],"m":"ora","o":"#$01"},{"a":22288,"t":"code","b":[133,12],"m":"sta","o":"input_byte","oa":12},{"a":22290,"l":"b_5712","t":"code","b":[169,0],"m":"lda","o":"#$00","x":[22306]},{"a":22292,"t":"code","b":[133,43],"m":"sta","o":"vel_y","oa":43},{"a":22294,"t":"code","b":[240,12],"m":"beq","o":"b_5724","oa":22308},{"a":22296,"l":"b_5718","c":"Floor: below sprite Y $BF, set the down bit so the dive reads as released. Verified live on a falling wreck: the forged $FD becomes $FF at exactly Y $BF.","t":"code","b":[201,191],"m":"cmp","o":"#$BF","x":[22282]},{"a":22298,"t":"code","b":[144,8],"m":"bcc","o":"b_5724","oa":22308},{"a":22300,"t":"code","b":[165,12],"m":"lda","o":"input_byte","oa":12},{"a":22302,"t":"code","b":[9,2],"m":"ora","o":"#$02"},{"a":22304,"t":"code","b":[133,12],"m":"sta","o":"input_byte","oa":12},{"a":22306,"t":"code","b":[208,238],"m":"bne","o":"b_5712","oa":22290},{"a":22308,"l":"b_5724","c":"No firing at low altitude: at sprite Y $7C or below, set the fire bit so the trigger reads as released.","t":"code","b":[173,1,208],"m":"lda","o":"vic_sprite0_y","x":[22294,22298]},{"a":22311,"t":"code","b":[201,124],"m":"cmp","o":"#$7C"},{"a":22313,"t":"code","b":[144,6],"m":"bcc","o":"b_5731","oa":22321},{"a":22315,"t":"code","b":[165,12],"m":"lda","o":"input_byte","oa":12},{"a":22317,"t":"code","b":[9,16],"m":"ora","o":"#$10"},{"a":22319,"t":"code","b":[133,12],"m":"sta","o":"input_byte","oa":12},{"a":22321,"l":"b_5731","c":"Take-off gate. While flight_flags bit 1 is set the input byte is ORed with $FE, which sets every bit except bit 0 - so the climb still comes from the player and everything else is masked off. It does NOT force a climb: verified live, the aircraft sits on the pad indefinitely until up is pressed, and bit 1 clears the moment it starts to rise. Contrast $573D, which uses an immediate lda #$FD and really does force the dive.","t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34,"x":[22313]},{"a":22323,"t":"code","b":[41,2],"m":"and","o":"#$02"},{"a":22325,"t":"code","b":[240,6],"m":"beq","o":"b_573D","oa":22333},{"a":22327,"t":"code","b":[165,12],"m":"lda","o":"input_byte","oa":12},{"a":22329,"t":"code","b":[9,254],"m":"ora","o":"#$FE"},{"a":22331,"t":"code","b":[133,12],"m":"sta","o":"input_byte","oa":12},{"a":22333,"l":"b_573D","c":"Landing AND running dry, the same three instructions. flight_flags bit 3 (landing) or bit 7 (tank empty, set at $5582 when all three fuel digits are zero) replaces the input with $FD, down held. If bit 3 is set and the player's sprite pointer at $07F8 has reached $88, the input becomes $FF and both velocities are zeroed: touchdown.","t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34,"x":[22325]},{"a":22335,"t":"code","b":[41,136],"m":"and","o":"#$88"},{"a":22337,"t":"code","b":[240,29],"m":"beq","o":"b_5760","oa":22368},{"a":22339,"t":"code","b":[169,253],"m":"lda","o":"#$FD"},{"a":22341,"t":"code","b":[133,12],"m":"sta","o":"input_byte","oa":12},{"a":22343,"t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34},{"a":22345,"t":"code","b":[41,8],"m":"and","o":"#$08"},{"a":22347,"t":"code","b":[240,19],"m":"beq","o":"b_5760","oa":22368},{"a":22349,"t":"code","b":[173,248,7],"m":"lda","o":"f_07F8","oa":2040},{"a":22352,"t":"code","b":[201,136],"m":"cmp","o":"#$88"},{"a":22354,"t":"code","b":[144,12],"m":"bcc","o":"b_5760","oa":22368},{"a":22356,"t":"code","b":[169,255],"m":"lda","o":"#$FF"},{"a":22358,"t":"code","b":[133,12],"m":"sta","o":"input_byte","oa":12},{"a":22360,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":22362,"t":"code","b":[133,43],"m":"sta","o":"vel_y","oa":43},{"a":22364,"t":"code","b":[133,42],"m":"sta","o":"vel_x","oa":42},{"a":22366,"t":"code","b":[234],"m":"nop"},{"a":22367,"t":"code","b":[234],"m":"nop"},{"a":22368,"l":"b_5760","c":"Bottom of the dive: below sprite Y $C0 the vertical velocity is zeroed, and if flight_flags bit 7 is set - the tank is empty - the flags are rewritten to (old & $10) | $08, which latches the forced-descent gate above. An aircraft that runs out of fuel is flown into the ground by the landing path.","t":"code","b":[173,1,208],"m":"lda","o":"vic_sprite0_y","x":[22337,22347,22354]},{"a":22371,"t":"code","b":[201,192],"m":"cmp","o":"#$C0"},{"a":22373,"t":"code","b":[144,25],"m":"bcc","o":"b_5780","oa":22400},{"a":22375,"t":"code","b":[162,255],"m":"ldx","o":"#$FF"},{"a":22377,"t":"code","b":[234],"m":"nop"},{"a":22378,"t":"code","b":[234],"m":"nop"},{"a":22379,"t":"code","b":[232],"m":"inx"},{"a":22380,"t":"code","b":[134,43],"m":"stx","o":"vel_y","oa":43},{"a":22382,"t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34},{"a":22384,"t":"code","b":[41,128],"m":"and","o":"#$80"},{"a":22386,"t":"code","b":[240,12],"m":"beq","o":"b_5780","oa":22400},{"a":22388,"t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34},{"a":22390,"t":"code","b":[41,16],"m":"and","o":"#$10"},{"a":22392,"t":"code","b":[9,8],"m":"ora","o":"#$08"},{"a":22394,"t":"code","b":[133,34],"m":"sta","o":"flight_flags","oa":34},{"a":22396,"t":"code","b":[234],"m":"nop"},{"a":22397,"t":"code","b":[234],"m":"nop"},{"a":22398,"t":"code","b":[234],"m":"nop"},{"a":22399,"t":"code","b":[234],"m":"nop"},{"a":22400,"l":"b_5780","t":"code","b":[32,149,84],"m":"jsr","o":"flight_update","oa":21653,"x":[22373,22386]},{"a":22403,"t":"code","b":[165,12],"m":"lda","o":"input_byte","oa":12},{"a":22405,"t":"code","b":[41,16],"m":"and","o":"#$10"},{"a":22407,"t":"code","b":[208,6],"m":"bne","o":"r_578F","oa":22415},{"a":22409,"t":"code","b":[32,144,87],"m":"jsr","o":"launch_missile","oa":22416},{"a":22412,"t":"code","b":[234],"m":"nop"},{"a":22413,"t":"code","b":[234],"m":"nop"},{"a":22414,"t":"code","b":[234],"m":"nop"},{"a":22415,"l":"r_578F","t":"code","b":[96],"m":"rts","x":[22407]},{"a":22416,"l":"launch_missile","c":"Launches an AAM, and it can refuse for three reasons: it runs on only one pass in eight of tick_counter, it needs vel_x to be non-zero, so a stationary aircraft cannot fire at all, and it needs a non-zero AAM count across $1A/$1B/$1C. It then finds a free slot in the three-byte records at $30, sets its direction from the sign of vel_x and seeds the glyph.","t":"code","b":[165,45],"m":"lda","o":"tick_counter","oa":45,"x":[22409]},{"a":22418,"t":"code","b":[41,7],"m":"and","o":"#$07"},{"a":22420,"t":"code","b":[208,105],"m":"bne","o":"r_57FF","oa":22527},{"a":22422,"t":"code","b":[165,42],"m":"lda","o":"vel_x","oa":42},{"a":22424,"t":"code","b":[240,101],"m":"beq","o":"r_57FF","oa":22527},{"a":22426,"t":"code","b":[165,26],"m":"lda","o":"aam_hundreds","oa":26},{"a":22428,"t":"code","b":[208,8],"m":"bne","o":"b_57A6","oa":22438},{"a":22430,"t":"code","b":[165,27],"m":"lda","o":"aam_tens","oa":27},{"a":22432,"t":"code","b":[208,4],"m":"bne","o":"b_57A6","oa":22438},{"a":22434,"t":"code","b":[165,28],"m":"lda","o":"aam_units","oa":28},{"a":22436,"t":"code","b":[240,89],"m":"beq","o":"r_57FF","oa":22527},{"a":22438,"l":"b_57A6","t":"code","b":[162,12],"m":"ldx","o":"#$0C","x":[22428,22432]},{"a":22440,"l":"b_57A8","t":"code","b":[181,47],"m":"lda","o":"zp_2f_scratch,x","oa":47,"x":[22485]},{"a":22442,"t":"code","b":[208,38],"m":"bne","o":"b_57D2","oa":22482},{"a":22444,"t":"code","b":[164,42],"m":"ldy","o":"vel_x","oa":42},{"a":22446,"t":"code","b":[48,4],"m":"bmi","o":"b_57B4","oa":22452},{"a":22448,"t":"code","b":[160,255],"m":"ldy","o":"#$FF"},{"a":22450,"t":"code","b":[208,2],"m":"bne","o":"b_57B6","oa":22454},{"a":22452,"l":"b_57B4","t":"code","b":[160,1],"m":"ldy","o":"#$01","x":[22446]},{"a":22454,"l":"b_57B6","t":"code","b":[148,47],"m":"sty","o":"zp_2f_scratch,x","oa":47,"x":[22450]},{"a":22456,"t":"code","b":[152],"m":"tya"},{"a":22457,"t":"code","b":[48,4],"m":"bmi","o":"b_57BF","oa":22463},{"a":22459,"t":"code","b":[169,18],"m":"lda","o":"#$12"},{"a":22461,"t":"code","b":[208,2],"m":"bne","o":"b_57C1","oa":22465},{"a":22463,"l":"b_57BF","t":"code","b":[169,21],"m":"lda","o":"#$15","x":[22457]},{"a":22465,"l":"b_57C1","t":"code","b":[149,45],"m":"sta","o":"tick_counter,x","oa":45,"x":[22461]},{"a":22467,"t":"code","b":[173,1,208],"m":"lda","o":"vic_sprite0_y"},{"a":22470,"t":"code","b":[56],"m":"sec"},{"a":22471,"t":"code","b":[233,40],"m":"sbc","o":"#$28"},{"a":22473,"t":"code","b":[74],"m":"lsr","o":"a"},{"a":22474,"t":"code","b":[74],"m":"lsr","o":"a"},{"a":22475,"t":"code","b":[74],"m":"lsr","o":"a"},{"a":22476,"t":"code","b":[149,46],"m":"sta","o":"status_bar_colour,x","oa":46},{"a":22478,"t":"code","b":[208,9],"m":"bne","o":"b_57D9","oa":22489},{"a":22480,"t":"code","b":[240,7],"m":"beq","o":"b_57D9","oa":22489},{"a":22482,"l":"b_57D2","t":"code","b":[202],"m":"dex","x":[22442]},{"a":22483,"t":"code","b":[202],"m":"dex"},{"a":22484,"t":"code","b":[202],"m":"dex"},{"a":22485,"t":"code","b":[208,209],"m":"bne","o":"b_57A8","oa":22440},{"a":22487,"t":"code","b":[240,38],"m":"beq","o":"r_57FF","oa":22527},{"a":22489,"l":"b_57D9","t":"code","b":[162,9],"m":"ldx","o":"#$09","x":[22478,22480]},{"a":22491,"l":"trainer_target_aam","c":"DEC of the AAM units digit, run when a missile is launched. The 'unlimited AAM's' trainer writes $A5 here, turning it into LDA, which is what identifies $1A/$1B/$1C as the missile count.","t":"code","b":[198,28],"m":"dec","o":"aam_units","oa":28,"x":[6620]},{"a":22493,"t":"code","b":[16,10],"m":"bpl","o":"b_57E9","oa":22505},{"a":22495,"t":"code","b":[134,28],"m":"stx","o":"aam_units","oa":28},{"a":22497,"t":"code","b":[198,27],"m":"dec","o":"aam_tens","oa":27},{"a":22499,"t":"code","b":[16,4],"m":"bpl","o":"b_57E9","oa":22505},{"a":22501,"t":"code","b":[134,27],"m":"stx","o":"aam_tens","oa":27},{"a":22503,"t":"code","b":[198,26],"m":"dec","o":"aam_hundreds","oa":26},{"a":22505,"l":"b_57E9","t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34,"x":[22493,22499]},{"a":22507,"t":"code","b":[41,192],"m":"and","o":"#$C0"},{"a":22509,"t":"code","b":[208,10],"m":"bne","o":"b_57F9","oa":22521},{"a":22511,"t":"code","b":[169,128],"m":"lda","o":"#$80"},{"a":22513,"t":"code","b":[141,11,212],"m":"sta","o":"sid_v2_control"},{"a":22516,"t":"code","b":[169,129],"m":"lda","o":"#$81"},{"a":22518,"t":"code","b":[141,11,212],"m":"sta","o":"sid_v2_control"},{"a":22521,"l":"b_57F9","t":"code","b":[234],"m":"nop","x":[22509]},{"a":22522,"t":"code","b":[234],"m":"nop"},{"a":22523,"t":"code","b":[234],"m":"nop"},{"a":22524,"t":"code","b":[234],"m":"nop"},{"a":22525,"t":"code","b":[234],"m":"nop"},{"a":22526,"t":"code","b":[234],"m":"nop"},{"a":22527,"l":"r_57FF","t":"code","b":[96],"m":"rts","x":[22420,22424,22436,22487]},{"a":22528,"l":"screen_ptr_from_cell","c":"Screen/colour-RAM pointer from a character cell: on entry X = column, Y = row. Builds $05/$06 = $0400 + 40*Y + X (screen RAM) and $07/$08 = $D800 + 40*Y + X (colour RAM) by adding $28 to both low bytes Y times and carrying the two high bytes together; a negative Y is treated as row 0. Every character-drawn object goes through it: the player's missiles ($584F, $58B0), the enemy's shots ($596D, $59CD), and the collision handler's read of the cell under a sprite ($4267, and $5158 via the bounds-checked wrapper $5150).","t":"code","b":[169,0],"m":"lda","o":"#$00","x":[16999,20824,22607,22704,22893,22989]},{"a":22530,"t":"code","b":[133,5],"m":"sta","o":"ptr_screen","oa":5},{"a":22532,"t":"code","b":[133,7],"m":"sta","o":"ptr_colour","oa":7},{"a":22534,"t":"code","b":[169,4],"m":"lda","o":"#$04"},{"a":22536,"t":"code","b":[133,6],"m":"sta","o":"ptr_screen_hi","oa":6},{"a":22538,"t":"code","b":[169,216],"m":"lda","o":"#$D8"},{"a":22540,"t":"code","b":[133,8],"m":"sta","o":"ptr_colour_hi","oa":8},{"a":22542,"l":"b_580E","t":"code","b":[136],"m":"dey","x":[22554,22560]},{"a":22543,"t":"code","b":[48,17],"m":"bmi","o":"b_5822","oa":22562},{"a":22545,"t":"code","b":[165,5],"m":"lda","o":"ptr_screen","oa":5},{"a":22547,"t":"code","b":[24],"m":"clc"},{"a":22548,"t":"code","b":[105,40],"m":"adc","o":"#$28"},{"a":22550,"t":"code","b":[133,5],"m":"sta","o":"ptr_screen","oa":5},{"a":22552,"t":"code","b":[133,7],"m":"sta","o":"ptr_colour","oa":7},{"a":22554,"t":"code","b":[144,242],"m":"bcc","o":"b_580E","oa":22542},{"a":22556,"t":"code","b":[230,6],"m":"inc","o":"ptr_screen_hi","oa":6},{"a":22558,"t":"code","b":[230,8],"m":"inc","o":"ptr_colour_hi","oa":8},{"a":22560,"t":"code","b":[208,236],"m":"bne","o":"b_580E","oa":22542},{"a":22562,"l":"b_5822","t":"code","b":[138],"m":"txa","x":[22543]},{"a":22563,"t":"code","b":[24],"m":"clc"},{"a":22564,"t":"code","b":[101,5],"m":"adc","o":"ptr_screen","oa":5},{"a":22566,"t":"code","b":[133,5],"m":"sta","o":"ptr_screen","oa":5},{"a":22568,"t":"code","b":[133,7],"m":"sta","o":"ptr_colour","oa":7},{"a":22570,"t":"code","b":[144,4],"m":"bcc","o":"r_5830","oa":22576},{"a":22572,"t":"code","b":[230,6],"m":"inc","o":"ptr_screen_hi","oa":6},{"a":22574,"t":"code","b":[230,8],"m":"inc","o":"ptr_colour_hi","oa":8},{"a":22576,"l":"r_5830","t":"code","b":[96],"m":"rts","x":[22570]},{"a":22577,"t":"gap","n":15},{"a":22592,"l":"erase_player_missiles","c":"Erases the player's air-to-air missiles from the screen at the top of each pass, before they are moved. Walks the four 3-byte missile records at $30/$33/$36/$39 (X = 12, 9, 6, 3; +0 = screen column 0-39, +1 = screen row, +2 = direction and in-use: 0 free, $01 travelling left, $FF travelling right). For each in-use record it calls $5800 with that column and row and writes $20, a space, through ($05). $10 saves X across the call. Called from the frame loop at $41A8.","t":"code","b":[162,12],"m":"ldx","o":"#$0C","x":[16808]},{"a":22594,"l":"b_5842","t":"code","b":[181,47],"m":"lda","o":"zp_2f_scratch,x","oa":47,"x":[22622]},{"a":22596,"t":"code","b":[240,21],"m":"beq","o":"b_585B","oa":22619},{"a":22598,"t":"code","b":[181,46],"m":"lda","o":"status_bar_colour,x","oa":46},{"a":22600,"t":"code","b":[168],"m":"tay"},{"a":22601,"t":"code","b":[138],"m":"txa"},{"a":22602,"t":"code","b":[133,16],"m":"sta","o":"tmp_x","oa":16},{"a":22604,"t":"code","b":[181,45],"m":"lda","o":"tick_counter,x","oa":45},{"a":22606,"t":"code","b":[170],"m":"tax"},{"a":22607,"t":"code","b":[32,0,88],"m":"jsr","o":"screen_ptr_from_cell","oa":22528},{"a":22610,"t":"code","b":[169,32],"m":"lda","o":"#$20"},{"a":22612,"t":"code","b":[160,0],"m":"ldy","o":"#$00"},{"a":22614,"t":"code","b":[145,5],"m":"sta","o":"(ptr_screen),y","oa":5},{"a":22616,"t":"code","b":[165,16],"m":"lda","o":"tmp_x","oa":16},{"a":22618,"t":"code","b":[170],"m":"tax"},{"a":22619,"l":"b_585B","t":"code","b":[202],"m":"dex","x":[22596]},{"a":22620,"t":"code","b":[202],"m":"dex"},{"a":22621,"t":"code","b":[202],"m":"dex"},{"a":22622,"t":"code","b":[208,226],"m":"bne","o":"b_5842","oa":22594},{"a":22624,"t":"code","b":[96],"m":"rts"},{"a":22625,"t":"gap","n":15},{"a":22640,"l":"move_player_missiles","c":"Advances the player's missiles one character column per pass and retires them at the screen edge. For each of the four records at $30/$33/$36/$39: a negative direction byte (+2) increments the column, a positive one decrements it; if the column then goes negative or reaches $28 all three record bytes are zeroed and the slot is free again. The rate gate at $5870-$5874 is `lda $2D / and #$00 / bne`, which can never branch, so the routine runs on every pass; the mask looks patched out. Called from the frame loop at $41AB.","t":"code","b":[165,45],"m":"lda","o":"tick_counter","oa":45,"x":[16811]},{"a":22642,"t":"code","b":[41,0],"m":"and","o":"#$00"},{"a":22644,"t":"code","b":[208,37],"m":"bne","o":"r_589B","oa":22683},{"a":22646,"t":"code","b":[162,12],"m":"ldx","o":"#$0C"},{"a":22648,"l":"b_5878","t":"code","b":[181,47],"m":"lda","o":"zp_2f_scratch,x","oa":47,"x":[22681]},{"a":22650,"t":"code","b":[240,26],"m":"beq","o":"b_5896","oa":22678},{"a":22652,"t":"code","b":[48,6],"m":"bmi","o":"b_5884","oa":22660},{"a":22654,"t":"code","b":[214,45],"m":"dec","o":"tick_counter,x","oa":45},{"a":22656,"t":"code","b":[240,4],"m":"beq","o":"b_5886","oa":22662},{"a":22658,"t":"code","b":[208,2],"m":"bne","o":"b_5886","oa":22662},{"a":22660,"l":"b_5884","t":"code","b":[246,45],"m":"inc","o":"tick_counter,x","oa":45,"x":[22652]},{"a":22662,"l":"b_5886","t":"code","b":[181,45],"m":"lda","o":"tick_counter,x","oa":45,"x":[22656,22658]},{"a":22664,"t":"code","b":[48,4],"m":"bmi","o":"b_588E","oa":22670},{"a":22666,"t":"code","b":[201,40],"m":"cmp","o":"#$28"},{"a":22668,"t":"code","b":[144,8],"m":"bcc","o":"b_5896","oa":22678},{"a":22670,"l":"b_588E","t":"code","b":[169,0],"m":"lda","o":"#$00","x":[22664]},{"a":22672,"t":"code","b":[149,45],"m":"sta","o":"tick_counter,x","oa":45},{"a":22674,"t":"code","b":[149,46],"m":"sta","o":"status_bar_colour,x","oa":46},{"a":22676,"t":"code","b":[149,47],"m":"sta","o":"zp_2f_scratch,x","oa":47},{"a":22678,"l":"b_5896","t":"code","b":[202],"m":"dex","x":[22650,22668]},{"a":22679,"t":"code","b":[202],"m":"dex"},{"a":22680,"t":"code","b":[202],"m":"dex"},{"a":22681,"t":"code","b":[208,221],"m":"bne","o":"b_5878","oa":22648},{"a":22683,"l":"r_589B","t":"code","b":[96],"m":"rts","x":[22644]},{"a":22684,"t":"gap","n":4},{"a":22688,"l":"draw_player_missiles","c":"Draws the player's air-to-air missiles as characters. For each in-use record at $30/$33/$36/$39 it calls $5800 with the record's column and row, then writes glyph $12 (streak with its fin on the left, pointing right) when the direction byte is negative or $13 (pointing left) when positive into screen RAM, plus that glyph's entry in the per-glyph colour table at $4000 (both $02, red) into colour RAM. Because the missiles are characters, not sprites, they cannot raise a sprite-to-sprite collision - which is the reported weakness where missiles seem to pass through enemies. A kill is registered the other way round: the enemy sprite's sprite-to-background bit makes $426A read the cell under it and test for a glyph in $0C..$13. Called from the frame loop at $41AE.","t":"code","b":[162,12],"m":"ldx","o":"#$0C","x":[16814]},{"a":22690,"l":"b_58A2","t":"code","b":[181,47],"m":"lda","o":"zp_2f_scratch,x","oa":47,"x":[22732]},{"a":22692,"t":"code","b":[240,35],"m":"beq","o":"b_58C9","oa":22729},{"a":22694,"t":"code","b":[72],"m":"pha"},{"a":22695,"t":"code","b":[181,46],"m":"lda","o":"status_bar_colour,x","oa":46},{"a":22697,"t":"code","b":[168],"m":"tay"},{"a":22698,"t":"code","b":[138],"m":"txa"},{"a":22699,"t":"code","b":[133,16],"m":"sta","o":"tmp_x","oa":16},{"a":22701,"t":"code","b":[181,45],"m":"lda","o":"tick_counter,x","oa":45},{"a":22703,"t":"code","b":[170],"m":"tax"},{"a":22704,"t":"code","b":[32,0,88],"m":"jsr","o":"screen_ptr_from_cell","oa":22528},{"a":22707,"t":"code","b":[104],"m":"pla"},{"a":22708,"t":"code","b":[16,4],"m":"bpl","o":"b_58BA","oa":22714},{"a":22710,"t":"code","b":[169,18],"m":"lda","o":"#$12"},{"a":22712,"t":"code","b":[208,2],"m":"bne","o":"b_58BC","oa":22716},{"a":22714,"l":"b_58BA","t":"code","b":[169,19],"m":"lda","o":"#$13","x":[22708]},{"a":22716,"l":"b_58BC","t":"code","b":[160,0],"m":"ldy","o":"#$00","x":[22712]},{"a":22718,"t":"code","b":[145,5],"m":"sta","o":"(ptr_screen),y","oa":5},{"a":22720,"t":"code","b":[170],"m":"tax"},{"a":22721,"t":"code","b":[189,0,64],"m":"lda","o":"glyph_colour_table,x","oa":16384},{"a":22724,"t":"code","b":[145,7],"m":"sta","o":"(ptr_colour),y","oa":7},{"a":22726,"t":"code","b":[165,16],"m":"lda","o":"tmp_x","oa":16},{"a":22728,"t":"code","b":[170],"m":"tax"},{"a":22729,"l":"b_58C9","t":"code","b":[202],"m":"dex","x":[22692]},{"a":22730,"t":"code","b":[202],"m":"dex"},{"a":22731,"t":"code","b":[202],"m":"dex"},{"a":22732,"t":"code","b":[208,212],"m":"bne","o":"b_58A2","oa":22690},{"a":22734,"t":"code","b":[96],"m":"rts"},{"a":22735,"t":"gap","n":1},{"a":22736,"l":"update_enemy_aircraft","c":"Per-pass update of the enemy aircraft. They are sprites 1-4 and their state lives in five parallel 4-byte arrays indexed 1..4: row at $48, world column at $4C, fine Y at $50, fine X at $54 and state/lifetime at $58 ($00 = empty, below $D0 = flying, $D0 and above = exploding or leaving). Always calls the wave spawner at $4500; then, only while $61 bit 0 is set, the wave pacing at $4540, the state ageing at $4570, vertical motion at $45C0 (twice), $460E, the sprite enable and positioning pass at $4730 and the attitude/sprite-pointer pass at $4340. Called from the frame loop at $41B1.","t":"code","b":[32,0,69],"m":"jsr","o":"wave_start","oa":17664,"x":[16817]},{"a":22739,"t":"code","b":[165,97],"m":"lda","o":"active_flags","oa":97},{"a":22741,"t":"code","b":[41,1],"m":"and","o":"#$01"},{"a":22743,"t":"code","b":[240,21],"m":"beq","o":"b_58EE","oa":22766},{"a":22745,"t":"code","b":[32,64,69],"m":"jsr","o":"wave_release_aircraft","oa":17728},{"a":22748,"t":"code","b":[32,112,69],"m":"jsr","o":"enemy_move_x","oa":17776},{"a":22751,"t":"code","b":[32,14,70],"m":"jsr","o":"enemy_choose_manoeuvre","oa":17934},{"a":22754,"t":"code","b":[32,192,69],"m":"jsr","o":"enemy_move_y","oa":17856},{"a":22757,"t":"code","b":[32,192,69],"m":"jsr","o":"enemy_move_y","oa":17856},{"a":22760,"t":"code","b":[32,48,71],"m":"jsr","o":"enemy_sprites_place","oa":18224},{"a":22763,"t":"code","b":[32,64,67],"m":"jsr","o":"enemy_update_slot","oa":17216},{"a":22766,"l":"b_58EE","t":"code","b":[234],"m":"nop","x":[22743]},{"a":22767,"t":"code","b":[234],"m":"nop"},{"a":22768,"t":"code","b":[234],"m":"nop"},{"a":22769,"t":"code","b":[96],"m":"rts"},{"a":22770,"t":"gap","n":14},{"a":22784,"l":"unused_enemy_shot_spawn","c":"96 bytes of code that nothing calls or jumps to: an earlier, shorter version of the enemy-shot spawner at $5B00. Same shape - gate on $61 bit 0, on $D015 & $1C, and on $2D bit 0 rather than $2D & 7; scan enemy slots 4..1 for one whose screen column ($4C,x - $0D) is under $28 and whose row ($48,x + 1) is under $0A and not already held by $3C-$3F; then claim a free slot and set $61 bit 2. It lacks $5B00's two extra tests (the enemy must not be exploding, $58,x < $D0, and must be on the far half of the screen for the scroll direction), and its branch at $5954 lands mid-instruction at $5961. Dead code left in the image, like the near-identical input pair $5470 / $5700.","t":"byte","b":[165,97,41,1,240,89,173,21]},{"a":22792,"t":"byte","b":[208,41,28,240,82,165,45,41]},{"a":22800,"t":"byte","b":[1,208,76,162,4,181,87,240]},{"a":22808,"t":"byte","b":[64,181,75,56,229,13,133,68]},{"a":22816,"t":"byte","b":[201,40,176,55,181,71,133,69]},{"a":22824,"t":"byte","b":[230,69,165,69,201,10,176,43]},{"a":22832,"t":"byte","b":[197,60,240,39,197,61,240,35]},{"a":22840,"t":"byte","b":[197,62,240,31,197,63,240,27]},{"a":22848,"t":"byte","b":[162,4,181,63,16,16,165,68]},{"a":22856,"t":"byte","b":[149,63,165,69,149,59,165,97]},{"a":22864,"t":"byte","b":[9,4,133,97,208,11,202,208]},{"a":22872,"t":"byte","b":[233,240,4,202,208,183,234,96]},{"a":22880,"l":"erase_enemy_shots","c":"Erases the enemy aircraft's shots from the screen before they are moved. There are four slots, X = 4..1, held in two parallel arrays: screen row at $3C-$3F (negative means the slot is free) and screen column at $40-$43. For each live slot it calls $5800 with that column and row and writes $20, a space, through ($05). $10 saves X across the call. Called from $5A03.","t":"code","b":[162,4],"m":"ldx","o":"#$04","x":[23043]},{"a":22882,"l":"b_5962","t":"code","b":[181,59],"m":"lda","o":"bomb_rows_minus1,x","oa":59,"x":[22906]},{"a":22884,"t":"code","b":[48,19],"m":"bmi","o":"b_5979","oa":22905},{"a":22886,"t":"code","b":[168],"m":"tay"},{"a":22887,"t":"code","b":[138],"m":"txa"},{"a":22888,"t":"code","b":[133,16],"m":"sta","o":"tmp_x","oa":16},{"a":22890,"t":"code","b":[181,63],"m":"lda","o":"bomb_row4,x","oa":63},{"a":22892,"t":"code","b":[170],"m":"tax"},{"a":22893,"t":"code","b":[32,0,88],"m":"jsr","o":"screen_ptr_from_cell","oa":22528},{"a":22896,"t":"code","b":[160,0],"m":"ldy","o":"#$00"},{"a":22898,"t":"code","b":[169,32],"m":"lda","o":"#$20"},{"a":22900,"t":"code","b":[145,5],"m":"sta","o":"(ptr_screen),y","oa":5},{"a":22902,"t":"code","b":[165,16],"m":"lda","o":"tmp_x","oa":16},{"a":22904,"t":"code","b":[170],"m":"tax"},{"a":22905,"l":"b_5979","t":"code","b":[202],"m":"dex","x":[22884]},{"a":22906,"t":"code","b":[208,230],"m":"bne","o":"b_5962","oa":22882},{"a":22908,"t":"code","b":[234],"m":"nop"},{"a":22909,"t":"code","b":[234],"m":"nop"},{"a":22910,"t":"code","b":[234],"m":"nop"},{"a":22911,"t":"code","b":[96],"m":"rts"},{"a":22912,"l":"move_enemy_shots","c":"Moves the enemy shots one character column per pass and frees them when they leave the screen. For each live slot the column at $40-$43 is incremented while the scroll-direction byte $60 is negative and decremented otherwise; once it falls outside 0..$27 both the row byte ($3C-$3F) and the column byte are set to $FF, marking the slot free. Afterwards, if $61 bit 2 claims shots exist but all four slots are now free, the bit is cleared. The gate at $5980-$5984 is `lda $2D / and #$00 / bne` and can never branch, so this runs every pass. Called from $5A06.","t":"code","b":[165,45],"m":"lda","o":"tick_counter","oa":45,"x":[23046]},{"a":22914,"t":"code","b":[41,0],"m":"and","o":"#$00"},{"a":22916,"t":"code","b":[208,57],"m":"bne","o":"r_59BF","oa":22975},{"a":22918,"t":"code","b":[162,4],"m":"ldx","o":"#$04"},{"a":22920,"l":"b_5988","t":"code","b":[181,63],"m":"lda","o":"bomb_row4,x","oa":63,"x":[22951]},{"a":22922,"t":"code","b":[48,26],"m":"bmi","o":"b_59A6","oa":22950},{"a":22924,"t":"code","b":[165,96],"m":"lda","o":"wave_direction","oa":96},{"a":22926,"t":"code","b":[16,6],"m":"bpl","o":"b_5996","oa":22934},{"a":22928,"t":"code","b":[246,63],"m":"inc","o":"bomb_row4,x","oa":63},{"a":22930,"t":"code","b":[240,4],"m":"beq","o":"b_5998","oa":22936},{"a":22932,"t":"code","b":[208,2],"m":"bne","o":"b_5998","oa":22936},{"a":22934,"l":"b_5996","t":"code","b":[214,63],"m":"dec","o":"bomb_row4,x","oa":63,"x":[22926]},{"a":22936,"l":"b_5998","t":"code","b":[181,63],"m":"lda","o":"bomb_row4,x","oa":63,"x":[22930,22932]},{"a":22938,"t":"code","b":[48,4],"m":"bmi","o":"b_59A0","oa":22944},{"a":22940,"t":"code","b":[201,40],"m":"cmp","o":"#$28"},{"a":22942,"t":"code","b":[144,6],"m":"bcc","o":"b_59A6","oa":22950},{"a":22944,"l":"b_59A0","t":"code","b":[169,255],"m":"lda","o":"#$FF","x":[22938]},{"a":22946,"t":"code","b":[149,59],"m":"sta","o":"bomb_rows_minus1,x","oa":59},{"a":22948,"t":"code","b":[149,63],"m":"sta","o":"bomb_row4,x","oa":63},{"a":22950,"l":"b_59A6","t":"code","b":[202],"m":"dex","x":[22922,22942]},{"a":22951,"t":"code","b":[208,223],"m":"bne","o":"b_5988","oa":22920},{"a":22953,"t":"code","b":[165,97],"m":"lda","o":"active_flags","oa":97},{"a":22955,"t":"code","b":[41,4],"m":"and","o":"#$04"},{"a":22957,"t":"code","b":[240,16],"m":"beq","o":"r_59BF","oa":22975},{"a":22959,"t":"code","b":[162,4],"m":"ldx","o":"#$04"},{"a":22961,"l":"b_59B1","t":"code","b":[181,63],"m":"lda","o":"bomb_row4,x","oa":63,"x":[22966]},{"a":22963,"t":"code","b":[16,10],"m":"bpl","o":"r_59BF","oa":22975},{"a":22965,"t":"code","b":[202],"m":"dex"},{"a":22966,"t":"code","b":[208,249],"m":"bne","o":"b_59B1","oa":22961},{"a":22968,"t":"code","b":[165,97],"m":"lda","o":"active_flags","oa":97},{"a":22970,"t":"code","b":[41,251],"m":"and","o":"#$FB"},{"a":22972,"t":"code","b":[133,97],"m":"sta","o":"active_flags","oa":97},{"a":22974,"t":"code","b":[234],"m":"nop"},{"a":22975,"l":"r_59BF","t":"code","b":[96],"m":"rts","x":[22916,22957,22963]},{"a":22976,"l":"draw_enemy_shots","c":"Draws the enemy shots as characters. For each live slot it calls $5800 with the slot's column ($40-$43) and row ($3C-$3F), then writes glyph $26 or $25 - the same short horizontal streak drawn one pixel apart, chosen by the sign of the scroll direction $60 - into screen RAM and that glyph's entry in the colour table at $4000 (both $01, white) into colour RAM. These codes are outside the $0C..$13 window that $426A reads as a player missile, so an enemy shot can never kill an enemy; it reaches the player through the VIC's sprite-0-to-background bit, read at $4241. Called from $5A09.","t":"code","b":[162,4],"m":"ldx","o":"#$04","x":[23049]},{"a":22978,"l":"b_59C2","t":"code","b":[181,59],"m":"lda","o":"bomb_rows_minus1,x","oa":59,"x":[23016]},{"a":22980,"t":"code","b":[48,33],"m":"bmi","o":"b_59E7","oa":23015},{"a":22982,"t":"code","b":[168],"m":"tay"},{"a":22983,"t":"code","b":[138],"m":"txa"},{"a":22984,"t":"code","b":[133,16],"m":"sta","o":"tmp_x","oa":16},{"a":22986,"t":"code","b":[181,63],"m":"lda","o":"bomb_row4,x","oa":63},{"a":22988,"t":"code","b":[170],"m":"tax"},{"a":22989,"t":"code","b":[32,0,88],"m":"jsr","o":"screen_ptr_from_cell","oa":22528},{"a":22992,"t":"code","b":[165,96],"m":"lda","o":"wave_direction","oa":96},{"a":22994,"t":"code","b":[48,4],"m":"bmi","o":"b_59D8","oa":23000},{"a":22996,"t":"code","b":[169,38],"m":"lda","o":"#$26"},{"a":22998,"t":"code","b":[208,2],"m":"bne","o":"b_59DA","oa":23002},{"a":23000,"l":"b_59D8","t":"code","b":[169,37],"m":"lda","o":"#$25","x":[22994]},{"a":23002,"l":"b_59DA","t":"code","b":[160,0],"m":"ldy","o":"#$00","x":[22998]},{"a":23004,"t":"code","b":[145,5],"m":"sta","o":"(ptr_screen),y","oa":5},{"a":23006,"t":"code","b":[170],"m":"tax"},{"a":23007,"t":"code","b":[189,0,64],"m":"lda","o":"glyph_colour_table,x","oa":16384},{"a":23010,"t":"code","b":[145,7],"m":"sta","o":"(ptr_colour),y","oa":7},{"a":23012,"t":"code","b":[165,16],"m":"lda","o":"tmp_x","oa":16},{"a":23014,"t":"code","b":[170],"m":"tax"},{"a":23015,"l":"b_59E7","t":"code","b":[202],"m":"dex","x":[22980]},{"a":23016,"t":"code","b":[208,216],"m":"bne","o":"b_59C2","oa":22978},{"a":23018,"t":"code","b":[234],"m":"nop"},{"a":23019,"t":"code","b":[234],"m":"nop"},{"a":23020,"t":"code","b":[234],"m":"nop"},{"a":23021,"t":"code","b":[234],"m":"nop"},{"a":23022,"t":"code","b":[234],"m":"nop"},{"a":23023,"t":"code","b":[96],"m":"rts"},{"a":23024,"t":"gap","n":16},{"a":23040,"l":"update_enemy_shots","c":"One complete pass over the enemy shots: spawn ($5B00), erase ($5960), move ($5980), draw ($59C0). Called once a frame from $41B4, and twice more from $5F42 when the player is flying with the scroll, which is what lets a shot cross three columns in a frame instead of one.","t":"code","b":[32,0,91],"m":"jsr","o":"spawn_enemy_shot","oa":23296,"x":[16820,24386,24389]},{"a":23043,"t":"code","b":[32,96,89],"m":"jsr","o":"erase_enemy_shots","oa":22880},{"a":23046,"t":"code","b":[32,128,89],"m":"jsr","o":"move_enemy_shots","oa":22912},{"a":23049,"t":"code","b":[32,192,89],"m":"jsr","o":"draw_enemy_shots","oa":22976},{"a":23052,"t":"code","b":[96],"m":"rts"},{"a":23053,"t":"gap","n":19},{"a":23072,"l":"animate_player_bank","c":"Animates the player's aircraft rolling through a turn - the frames the player sees as the jet swings from facing one way to the other. Skipped entirely while landed ($22 bit 3) and otherwise runs on one pass in eight ($2D & 7). $98 flags that a turn is under way, $99 is the signed frame index (clamped to -2..+2), and $96/$97 point at the current 64-byte sprite frame. A turn starts when $2A (vel_x) reaches +3 - pointer $2CC0, frame copied into sprite block $86 at $2180 by $5AC4 - or -3 - pointer $2B80, sprite block $80 at $2000 by $5AD0. While it runs, $5A6E steps the pointer back 64 bytes and $5A7D forward 64 bytes through the frame strip, the choice made by $99 and by the current $2A/$2B. Every path ends at $5AB8, JSR $5600. Called from $5500.","t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34,"x":[21760]},{"a":23074,"t":"code","b":[41,8],"m":"and","o":"#$08"},{"a":23076,"t":"code","b":[208,34],"m":"bne","o":"b_5A48","oa":23112},{"a":23078,"t":"code","b":[165,45],"m":"lda","o":"tick_counter","oa":45},{"a":23080,"t":"code","b":[41,7],"m":"and","o":"#$07"},{"a":23082,"t":"code","b":[208,28],"m":"bne","o":"b_5A48","oa":23112},{"a":23084,"t":"code","b":[165,152],"m":"lda","o":"attitude_active","oa":152},{"a":23086,"t":"code","b":[208,42],"m":"bne","o":"b_5A5A","oa":23130},{"a":23088,"t":"code","b":[165,42],"m":"lda","o":"vel_x","oa":42},{"a":23090,"t":"code","b":[201,3],"m":"cmp","o":"#$03"},{"a":23092,"t":"code","b":[208,16],"m":"bne","o":"b_5A46","oa":23110},{"a":23094,"t":"code","b":[230,152],"m":"inc","o":"attitude_active","oa":152},{"a":23096,"t":"code","b":[169,192],"m":"lda","o":"#$C0"},{"a":23098,"t":"code","b":[133,150],"m":"sta","o":"ptr_attitude_frame","oa":150},{"a":23100,"t":"code","b":[169,44],"m":"lda","o":"#$2C"},{"a":23102,"t":"code","b":[133,151],"m":"sta","o":"ptr_attitude_frame_hi","oa":151},{"a":23104,"t":"code","b":[32,196,90],"m":"jsr","o":"copy_frame_to_block86","oa":23236},{"a":23107,"t":"code","b":[24],"m":"clc"},{"a":23108,"t":"code","b":[144,114],"m":"bcc","o":"b_5AB8","oa":23224},{"a":23110,"l":"b_5A46","t":"code","b":[201,253],"m":"cmp","o":"#$FD","x":[23092]},{"a":23112,"l":"b_5A48","t":"code","b":[208,110],"m":"bne","o":"b_5AB8","oa":23224,"x":[23076,23082]},{"a":23114,"t":"code","b":[230,152],"m":"inc","o":"attitude_active","oa":152},{"a":23116,"t":"code","b":[169,128],"m":"lda","o":"#$80"},{"a":23118,"t":"code","b":[133,150],"m":"sta","o":"ptr_attitude_frame","oa":150},{"a":23120,"t":"code","b":[169,43],"m":"lda","o":"#$2B"},{"a":23122,"t":"code","b":[133,151],"m":"sta","o":"ptr_attitude_frame_hi","oa":151},{"a":23124,"t":"code","b":[32,208,90],"m":"jsr","o":"copy_frame_to_block80","oa":23248},{"a":23127,"t":"code","b":[24],"m":"clc"},{"a":23128,"t":"code","b":[144,94],"m":"bcc","o":"b_5AB8","oa":23224},{"a":23130,"l":"b_5A5A","t":"code","b":[165,42],"m":"lda","o":"vel_x","oa":42,"x":[23086]},{"a":23132,"t":"code","b":[201,3],"m":"cmp","o":"#$03"},{"a":23134,"t":"code","b":[240,52],"m":"beq","o":"b_5A94","oa":23188},{"a":23136,"t":"code","b":[201,253],"m":"cmp","o":"#$FD"},{"a":23138,"t":"code","b":[240,48],"m":"beq","o":"b_5A94","oa":23188},{"a":23140,"t":"code","b":[165,153],"m":"lda","o":"attitude_step","oa":153},{"a":23142,"t":"code","b":[208,4],"m":"bne","o":"b_5A6C","oa":23148},{"a":23144,"t":"code","b":[133,152],"m":"sta","o":"attitude_active","oa":152},{"a":23146,"t":"code","b":[240,76],"m":"beq","o":"b_5AB8","oa":23224},{"a":23148,"l":"b_5A6C","t":"code","b":[48,15],"m":"bmi","o":"b_5A7D","oa":23165,"x":[23142]},{"a":23150,"l":"j_5A6E","t":"code","b":[198,153],"m":"dec","o":"attitude_step","oa":153,"x":[23198,23221]},{"a":23152,"t":"code","b":[165,150],"m":"lda","o":"ptr_attitude_frame","oa":150},{"a":23154,"t":"code","b":[56],"m":"sec"},{"a":23155,"t":"code","b":[233,64],"m":"sbc","o":"#$40"},{"a":23157,"t":"code","b":[133,150],"m":"sta","o":"ptr_attitude_frame","oa":150},{"a":23159,"t":"code","b":[176,17],"m":"bcs","o":"b_5A8A","oa":23178},{"a":23161,"t":"code","b":[198,151],"m":"dec","o":"ptr_attitude_frame_hi","oa":151},{"a":23163,"t":"code","b":[208,13],"m":"bne","o":"b_5A8A","oa":23178},{"a":23165,"l":"b_5A7D","t":"code","b":[230,153],"m":"inc","o":"attitude_step","oa":153,"x":[23148,23201,23212]},{"a":23167,"t":"code","b":[165,150],"m":"lda","o":"ptr_attitude_frame","oa":150},{"a":23169,"t":"code","b":[24],"m":"clc"},{"a":23170,"t":"code","b":[105,64],"m":"adc","o":"#$40"},{"a":23172,"t":"code","b":[133,150],"m":"sta","o":"ptr_attitude_frame","oa":150},{"a":23174,"t":"code","b":[144,2],"m":"bcc","o":"b_5A8A","oa":23178},{"a":23176,"t":"code","b":[230,151],"m":"inc","o":"ptr_attitude_frame_hi","oa":151},{"a":23178,"l":"b_5A8A","t":"code","b":[165,42],"m":"lda","o":"vel_x","oa":42,"x":[23159,23163,23174]},{"a":23180,"t":"code","b":[48,46],"m":"bmi","o":"b_5ABC","oa":23228},{"a":23182,"t":"code","b":[32,196,90],"m":"jsr","o":"copy_frame_to_block86","oa":23236},{"a":23185,"t":"code","b":[24],"m":"clc"},{"a":23186,"t":"code","b":[144,36],"m":"bcc","o":"b_5AB8","oa":23224},{"a":23188,"l":"b_5A94","t":"code","b":[165,43],"m":"lda","o":"vel_y","oa":43,"x":[23134,23138]},{"a":23190,"t":"code","b":[208,12],"m":"bne","o":"b_5AA4","oa":23204},{"a":23192,"t":"code","b":[165,153],"m":"lda","o":"attitude_step","oa":153},{"a":23194,"t":"code","b":[240,28],"m":"beq","o":"b_5AB8","oa":23224},{"a":23196,"t":"code","b":[48,3],"m":"bmi","o":"b_5AA1","oa":23201},{"a":23198,"t":"code","b":[76,110,90],"m":"jmp","o":"j_5A6E","oa":23150},{"a":23201,"l":"b_5AA1","t":"code","b":[76,125,90],"m":"jmp","o":"b_5A7D","oa":23165,"x":[23196]},{"a":23204,"l":"b_5AA4","t":"code","b":[48,9],"m":"bmi","o":"b_5AAF","oa":23215,"x":[23190]},{"a":23206,"t":"code","b":[165,153],"m":"lda","o":"attitude_step","oa":153},{"a":23208,"t":"code","b":[201,2],"m":"cmp","o":"#$02"},{"a":23210,"t":"code","b":[240,12],"m":"beq","o":"b_5AB8","oa":23224},{"a":23212,"t":"code","b":[76,125,90],"m":"jmp","o":"b_5A7D","oa":23165},{"a":23215,"l":"b_5AAF","t":"code","b":[165,153],"m":"lda","o":"attitude_step","oa":153,"x":[23204]},{"a":23217,"t":"code","b":[201,254],"m":"cmp","o":"#$FE"},{"a":23219,"t":"code","b":[240,3],"m":"beq","o":"b_5AB8","oa":23224},{"a":23221,"t":"code","b":[76,110,90],"m":"jmp","o":"j_5A6E","oa":23150},{"a":23224,"l":"b_5AB8","t":"code","b":[32,0,86],"m":"jsr","o":"animate_bank_attitude","oa":22016,"x":[23108,23112,23128,23146,23186,23194,23210,23219,23232]},{"a":23227,"t":"code","b":[96],"m":"rts"},{"a":23228,"l":"b_5ABC","t":"code","b":[32,208,90],"m":"jsr","o":"copy_frame_to_block80","oa":23248,"x":[23180]},{"a":23231,"t":"code","b":[24],"m":"clc"},{"a":23232,"t":"code","b":[144,246],"m":"bcc","o":"b_5AB8","oa":23224},{"a":23234,"t":"code","b":[234],"m":"nop"},{"a":23235,"t":"code","b":[234],"m":"nop"},{"a":23236,"l":"copy_frame_to_block86","c":"Copies the 64 bytes at ($96),y into $2180, the bitmap of sprite block $86 - the half of the player's aircraft shape that the bank animation at $5A20 rewrites when the turn is in the +3 direction.","t":"code","b":[160,63],"m":"ldy","o":"#$3F","x":[23104,23182]},{"a":23238,"l":"b_5AC6","t":"code","b":[177,150],"m":"lda","o":"(ptr_attitude_frame),y","oa":150,"x":[23244]},{"a":23240,"t":"code","b":[153,128,33],"m":"sta","o":"sprite_player_yaw_right,y","oa":8576},{"a":23243,"t":"code","b":[136],"m":"dey"},{"a":23244,"t":"code","b":[16,248],"m":"bpl","o":"b_5AC6","oa":23238},{"a":23246,"t":"code","b":[96],"m":"rts"},{"a":23247,"t":"gap","n":1},{"a":23248,"l":"copy_frame_to_block80","c":"Copies the 64 bytes at ($96),y into $2000, the bitmap of sprite block $80 - the half of the player's aircraft shape the bank animation at $5A20 rewrites when the turn is in the -3 direction.","t":"code","b":[160,63],"m":"ldy","o":"#$3F","x":[23124,23228]},{"a":23250,"l":"b_5AD2","t":"code","b":[177,150],"m":"lda","o":"(ptr_attitude_frame),y","oa":150,"x":[23256]},{"a":23252,"t":"code","b":[153,0,32],"m":"sta","o":"sprite_player_yaw_left,y","oa":8192},{"a":23255,"t":"code","b":[136],"m":"dey"},{"a":23256,"t":"code","b":[16,248],"m":"bpl","o":"b_5AD2","oa":23250},{"a":23258,"t":"code","b":[96],"m":"rts"},{"a":23259,"t":"gap","n":5},{"a":23264,"l":"init_cia1_ports_and_0200","c":"Sets CIA1's data-direction registers and clears a work area. $DC02 = $FF makes port A all outputs, which is what lets the game park the keyboard row select at $7F; $DC03 = $E0 makes port B bits 0-4 inputs (the joystick and keyboard columns the game reads at $DC01) and bits 5-7 outputs. Then zeroes the 89 bytes $0200-$0258. Called once from $502B. What the game keeps in $0200-$0258 is not established.","t":"code","b":[169,255],"m":"lda","o":"#$FF","x":[20523]},{"a":23266,"t":"code","b":[141,2,220],"m":"sta","o":"cia1_ddr_a"},{"a":23269,"t":"code","b":[169,224],"m":"lda","o":"#$E0"},{"a":23271,"t":"code","b":[141,3,220],"m":"sta","o":"cia1_ddr_b"},{"a":23274,"t":"code","b":[162,88],"m":"ldx","o":"#$58"},{"a":23276,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":23278,"l":"b_5AEE","t":"code","b":[157,0,2],"m":"sta","o":"basic_input_buffer,x","oa":512,"x":[23282]},{"a":23281,"t":"code","b":[202],"m":"dex"},{"a":23282,"t":"code","b":[16,250],"m":"bpl","o":"b_5AEE","oa":23278},{"a":23284,"t":"code","b":[96],"m":"rts"},{"a":23285,"t":"gap","n":11},{"a":23296,"l":"spawn_enemy_shot","c":"Spawns one enemy shot - the character-drawn streak an enemy aircraft fires. Runs only while $61 bit 0 is set, at least one of sprites 1-4 is enabled ($D015 & $1E) and on one pass in eight ($2D & 7). Scans enemy slots X = 4..1 for one that is alive and not exploding ($58,x non-zero and below $D0), whose screen column ($4C,x - $0D) is inside 0..$27 and on the far half of the screen for the current scroll direction ($60 non-negative needs column >= $14, negative needs column < $14), and whose row ($48,x + 1) is below $0A and not already used by any of $3C-$3F, so at most one shot per sky row. The first free slot (row byte negative) takes the column in $40-$43 and the row in $3C-$3F, and $61 bit 2 is set. Called from $5A00.","t":"code","b":[165,97],"m":"lda","o":"active_flags","oa":97,"x":[23040]},{"a":23298,"t":"code","b":[41,1],"m":"and","o":"#$01"},{"a":23300,"t":"code","b":[240,121],"m":"beq","o":"r_5B7F","oa":23423},{"a":23302,"t":"code","b":[173,21,208],"m":"lda","o":"vic_sprite_enable"},{"a":23305,"t":"code","b":[41,30],"m":"and","o":"#$1E"},{"a":23307,"t":"code","b":[240,114],"m":"beq","o":"r_5B7F","oa":23423},{"a":23309,"t":"code","b":[165,45],"m":"lda","o":"tick_counter","oa":45},{"a":23311,"t":"code","b":[41,7],"m":"and","o":"#$07"},{"a":23313,"t":"code","b":[208,108],"m":"bne","o":"r_5B7F","oa":23423},{"a":23315,"t":"code","b":[162,4],"m":"ldx","o":"#$04"},{"a":23317,"l":"b_5B15","t":"code","b":[181,87],"m":"lda","o":"enemy_state,x","oa":87,"x":[23420]},{"a":23319,"t":"code","b":[240,98],"m":"beq","o":"b_5B7B","oa":23419},{"a":23321,"t":"code","b":[201,208],"m":"cmp","o":"#$D0"},{"a":23323,"t":"code","b":[176,94],"m":"bcs","o":"b_5B7B","oa":23419},{"a":23325,"t":"code","b":[181,75],"m":"lda","o":"enemy_map_x,x","oa":75},{"a":23327,"t":"code","b":[56],"m":"sec"},{"a":23328,"t":"code","b":[229,13],"m":"sbc","o":"world_x","oa":13},{"a":23330,"t":"code","b":[133,68],"m":"sta","o":"tmp_44","oa":68},{"a":23332,"t":"code","b":[201,40],"m":"cmp","o":"#$28"},{"a":23334,"t":"code","b":[176,83],"m":"bcs","o":"b_5B7B","oa":23419},{"a":23336,"t":"code","b":[165,96],"m":"lda","o":"wave_direction","oa":96},{"a":23338,"t":"code","b":[48,8],"m":"bmi","o":"b_5B34","oa":23348},{"a":23340,"t":"code","b":[165,68],"m":"lda","o":"tmp_44","oa":68},{"a":23342,"t":"code","b":[201,20],"m":"cmp","o":"#$14"},{"a":23344,"t":"code","b":[144,73],"m":"bcc","o":"b_5B7B","oa":23419},{"a":23346,"t":"code","b":[176,11],"m":"bcs","o":"b_5B3F","oa":23359},{"a":23348,"l":"b_5B34","t":"code","b":[165,68],"m":"lda","o":"tmp_44","oa":68,"x":[23338]},{"a":23350,"t":"code","b":[201,20],"m":"cmp","o":"#$14"},{"a":23352,"t":"code","b":[176,65],"m":"bcs","o":"b_5B7B","oa":23419},{"a":23354,"t":"code","b":[234],"m":"nop"},{"a":23355,"t":"code","b":[234],"m":"nop"},{"a":23356,"t":"code","b":[234],"m":"nop"},{"a":23357,"t":"code","b":[234],"m":"nop"},{"a":23358,"t":"code","b":[234],"m":"nop"},{"a":23359,"l":"b_5B3F","t":"code","b":[234],"m":"nop","x":[23346]},{"a":23360,"t":"code","b":[234],"m":"nop"},{"a":23361,"t":"code","b":[234],"m":"nop"},{"a":23362,"t":"code","b":[234],"m":"nop"},{"a":23363,"t":"code","b":[234],"m":"nop"},{"a":23364,"t":"code","b":[181,71],"m":"lda","o":"enemy_row,x","oa":71},{"a":23366,"t":"code","b":[133,69],"m":"sta","o":"tmp_45","oa":69},{"a":23368,"t":"code","b":[230,69],"m":"inc","o":"tmp_45","oa":69},{"a":23370,"t":"code","b":[165,69],"m":"lda","o":"tmp_45","oa":69},{"a":23372,"t":"code","b":[201,10],"m":"cmp","o":"#$0A"},{"a":23374,"t":"code","b":[176,43],"m":"bcs","o":"b_5B7B","oa":23419},{"a":23376,"t":"code","b":[197,60],"m":"cmp","o":"bomb_rows","oa":60},{"a":23378,"t":"code","b":[240,39],"m":"beq","o":"b_5B7B","oa":23419},{"a":23380,"t":"code","b":[197,61],"m":"cmp","o":"bomb_row2","oa":61},{"a":23382,"t":"code","b":[240,35],"m":"beq","o":"b_5B7B","oa":23419},{"a":23384,"t":"code","b":[197,62],"m":"cmp","o":"bomb_row3","oa":62},{"a":23386,"t":"code","b":[240,31],"m":"beq","o":"b_5B7B","oa":23419},{"a":23388,"t":"code","b":[197,63],"m":"cmp","o":"bomb_row4","oa":63},{"a":23390,"t":"code","b":[240,27],"m":"beq","o":"b_5B7B","oa":23419},{"a":23392,"t":"code","b":[162,4],"m":"ldx","o":"#$04"},{"a":23394,"l":"b_5B62","t":"code","b":[181,63],"m":"lda","o":"bomb_row4,x","oa":63,"x":[23415]},{"a":23396,"t":"code","b":[16,16],"m":"bpl","o":"b_5B76","oa":23414},{"a":23398,"t":"code","b":[165,68],"m":"lda","o":"tmp_44","oa":68},{"a":23400,"t":"code","b":[149,63],"m":"sta","o":"bomb_row4,x","oa":63},{"a":23402,"t":"code","b":[165,69],"m":"lda","o":"tmp_45","oa":69},{"a":23404,"t":"code","b":[149,59],"m":"sta","o":"bomb_rows_minus1,x","oa":59},{"a":23406,"t":"code","b":[165,97],"m":"lda","o":"active_flags","oa":97},{"a":23408,"t":"code","b":[9,4],"m":"ora","o":"#$04"},{"a":23410,"t":"code","b":[133,97],"m":"sta","o":"active_flags","oa":97},{"a":23412,"t":"code","b":[208,9],"m":"bne","o":"r_5B7F","oa":23423},{"a":23414,"l":"b_5B76","t":"code","b":[202],"m":"dex","x":[23396]},{"a":23415,"t":"code","b":[208,233],"m":"bne","o":"b_5B62","oa":23394},{"a":23417,"t":"code","b":[240,4],"m":"beq","o":"r_5B7F","oa":23423},{"a":23419,"l":"b_5B7B","t":"code","b":[202],"m":"dex","x":[23319,23323,23334,23344,23352,23374,23378,23382,23386,23390]},{"a":23420,"t":"code","b":[208,151],"m":"bne","o":"b_5B15","oa":23317},{"a":23422,"t":"code","b":[234],"m":"nop"},{"a":23423,"l":"r_5B7F","t":"code","b":[96],"m":"rts","x":[23300,23307,23313,23412,23417]},{"a":23424,"l":"logo_row_top","c":"Top character row of the FALCON PATROL title logo: 16 screen codes - $B5-$BB, the upper halves of F, A, L, C, O, N; $20; $C3-$C9, the upper halves of P, A, T, R, O, L; $20. $44D1 copies these 16 bytes into the stored title screen at $080C. The shapes themselves are glyph bitmaps in the game's own character set at $3000 + code*8.","t":"byte","b":[181,182,183,184,185,186,187,32],"x":[17617]},{"a":23432,"t":"byte","b":[195,196,197,198,199,200,201,32]},{"a":23440,"l":"logo_row_bottom","c":"Bottom character row of the FALCON PATROL logo, the row drawn directly under $5B80: $BC-$C2, the lower halves of FALCON; $20; $CA-$CF and $7F, the lower halves of PATROL; $20. $44D7 copies these 16 bytes into the stored title screen at $0834, 40 cells after $080C.","t":"byte","b":[188,189,190,191,192,193,194,32],"x":[17623]},{"a":23448,"t":"byte","b":[202,203,204,205,206,207,127,32]},{"a":23456,"l":"reset_player_sprite_shapes","c":"Restores the player's aircraft to its level-flight bitmaps, undoing whatever frame the bank animation at $5A20 left behind: copies 64 bytes from $2B80 to $2000 (sprite block $80) and 64 bytes from $2CC0 to $2180 (sprite block $86). Called from $567F, in the start-of-life reset.","t":"code","b":[162,63],"m":"ldx","o":"#$3F","x":[22143]},{"a":23458,"l":"b_5BA2","t":"code","b":[189,128,43],"m":"lda","o":"sprite_attitude_left_p0,x","oa":11136,"x":[23471]},{"a":23461,"t":"code","b":[157,0,32],"m":"sta","o":"sprite_player_yaw_left,x","oa":8192},{"a":23464,"t":"code","b":[189,192,44],"m":"lda","o":"sprite_attitude_right_p0,x","oa":11456},{"a":23467,"t":"code","b":[157,128,33],"m":"sta","o":"sprite_player_yaw_right,x","oa":8576},{"a":23470,"t":"code","b":[202],"m":"dex"},{"a":23471,"t":"code","b":[16,241],"m":"bpl","o":"b_5BA2","oa":23458},{"a":23473,"t":"code","b":[96],"m":"rts"},{"a":23474,"t":"gap","n":30},{"a":23504,"l":"update_bombs","c":"Per-frame pass over the enemy bombs - the two falling objects the game draws as hardware sprites 5 and 6. Calls the spawner at $5C00, the scroll tracker at $5C70, the fall step at $5CB0, the sprite positioner at $5D00, and $5E30 which drops the 'a bomb exists' flag when both slots are free. Called from the frame loop at $41B7.","t":"code","b":[32,0,92],"m":"jsr","o":"spawn_bomb","oa":23552,"x":[16823]},{"a":23507,"t":"code","b":[32,112,92],"m":"jsr","o":"bomb_track_scroll","oa":23664},{"a":23510,"t":"code","b":[32,176,92],"m":"jsr","o":"bomb_fall","oa":23728},{"a":23513,"t":"code","b":[32,0,93],"m":"jsr","o":"draw_bomb_sprites","oa":23808},{"a":23516,"t":"code","b":[32,48,94],"m":"jsr","o":"clear_bomb_active_flag","oa":24112},{"a":23519,"t":"code","b":[96],"m":"rts"},{"a":23520,"t":"gap","n":32},{"a":23552,"l":"spawn_bomb","c":"Drops a bomb from the lowest-flying enemy aircraft - the feature where enemy jets bomb the bases and bomb the player while landed. Runs while $61 bit 0 is set, at least one of sprites 1-4 is on ($D015 & $1E) and on one pass in 64 ($2D & $3F). Picks the live, non-exploding enemy slot with the largest row value ($48,x, with $57,x - i.e. $58,x - non-zero and below $D0), keeping the row in $44 and the slot in $10, and needs one of the two bomb slots free ($A7/$A8 zero, X = 2 or 1). Copies that aircraft's row, world column, fine Y and fine X from $48/$4C/$50/$54 into the bomb's $9F/$A1/$A3/$A5, with the row incremented so the bomb starts one row under the aircraft, marks the slot busy in $A7,x and sets $61 bit 1.","t":"code","b":[165,97],"m":"lda","o":"active_flags","oa":97,"x":[23504]},{"a":23554,"t":"code","b":[41,1],"m":"and","o":"#$01"},{"a":23556,"t":"code","b":[240,105],"m":"beq","o":"r_5C6F","oa":23663},{"a":23558,"t":"code","b":[173,21,208],"m":"lda","o":"vic_sprite_enable"},{"a":23561,"t":"code","b":[41,30],"m":"and","o":"#$1E"},{"a":23563,"t":"code","b":[240,98],"m":"beq","o":"r_5C6F","oa":23663},{"a":23565,"t":"code","b":[165,45],"m":"lda","o":"tick_counter","oa":45},{"a":23567,"t":"code","b":[41,63],"m":"and","o":"#$3F"},{"a":23569,"t":"code","b":[208,92],"m":"bne","o":"r_5C6F","oa":23663},{"a":23571,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":23573,"t":"code","b":[133,68],"m":"sta","o":"tmp_44","oa":68},{"a":23575,"t":"code","b":[162,4],"m":"ldx","o":"#$04"},{"a":23577,"l":"b_5C19","t":"code","b":[181,87],"m":"lda","o":"enemy_state,x","oa":87,"x":[23596]},{"a":23579,"t":"code","b":[240,14],"m":"beq","o":"b_5C2B","oa":23595},{"a":23581,"t":"code","b":[201,208],"m":"cmp","o":"#$D0"},{"a":23583,"t":"code","b":[176,10],"m":"bcs","o":"b_5C2B","oa":23595},{"a":23585,"t":"code","b":[181,71],"m":"lda","o":"enemy_row,x","oa":71},{"a":23587,"t":"code","b":[197,68],"m":"cmp","o":"tmp_44","oa":68},{"a":23589,"t":"code","b":[144,4],"m":"bcc","o":"b_5C2B","oa":23595},{"a":23591,"t":"code","b":[133,68],"m":"sta","o":"tmp_44","oa":68},{"a":23593,"t":"code","b":[134,16],"m":"stx","o":"tmp_x","oa":16},{"a":23595,"l":"b_5C2B","t":"code","b":[202],"m":"dex","x":[23579,23583,23589]},{"a":23596,"t":"code","b":[208,235],"m":"bne","o":"b_5C19","oa":23577},{"a":23598,"t":"code","b":[165,68],"m":"lda","o":"tmp_44","oa":68},{"a":23600,"t":"code","b":[240,61],"m":"beq","o":"r_5C6F","oa":23663},{"a":23602,"t":"code","b":[162,2],"m":"ldx","o":"#$02"},{"a":23604,"l":"b_5C34","t":"code","b":[181,167],"m":"lda","o":"bomb_ground_active,x","oa":167,"x":[23609]},{"a":23606,"t":"code","b":[240,5],"m":"beq","o":"b_5C3D","oa":23613},{"a":23608,"t":"code","b":[202],"m":"dex"},{"a":23609,"t":"code","b":[208,249],"m":"bne","o":"b_5C34","oa":23604},{"a":23611,"t":"code","b":[240,50],"m":"beq","o":"r_5C6F","oa":23663},{"a":23613,"l":"b_5C3D","t":"code","b":[138],"m":"txa","x":[23606]},{"a":23614,"t":"code","b":[72],"m":"pha"},{"a":23615,"t":"code","b":[166,16],"m":"ldx","o":"tmp_x","oa":16},{"a":23617,"t":"code","b":[181,71],"m":"lda","o":"enemy_row,x","oa":71},{"a":23619,"t":"code","b":[133,68],"m":"sta","o":"tmp_44","oa":68},{"a":23621,"t":"code","b":[181,75],"m":"lda","o":"enemy_map_x,x","oa":75},{"a":23623,"t":"code","b":[133,69],"m":"sta","o":"tmp_45","oa":69},{"a":23625,"t":"code","b":[181,79],"m":"lda","o":"enemy_param3,x","oa":79},{"a":23627,"t":"code","b":[133,70],"m":"sta","o":"tmp_46","oa":70},{"a":23629,"t":"code","b":[181,83],"m":"lda","o":"enemy_param4,x","oa":83},{"a":23631,"t":"code","b":[133,71],"m":"sta","o":"enemy_row","oa":71},{"a":23633,"t":"code","b":[104],"m":"pla"},{"a":23634,"t":"code","b":[170],"m":"tax"},{"a":23635,"t":"code","b":[230,68],"m":"inc","o":"tmp_44","oa":68},{"a":23637,"t":"code","b":[165,68],"m":"lda","o":"tmp_44","oa":68},{"a":23639,"t":"code","b":[149,159],"m":"sta","o":"bomb_ground_row,x","oa":159},{"a":23641,"t":"code","b":[165,69],"m":"lda","o":"tmp_45","oa":69},{"a":23643,"t":"code","b":[149,161],"m":"sta","o":"bomb_ground_col,x","oa":161},{"a":23645,"t":"code","b":[165,70],"m":"lda","o":"tmp_46","oa":70},{"a":23647,"t":"code","b":[149,163],"m":"sta","o":"bomb_ground_sub_x,x","oa":163},{"a":23649,"t":"code","b":[165,71],"m":"lda","o":"enemy_row","oa":71},{"a":23651,"t":"code","b":[149,165],"m":"sta","o":"bomb_ground_sub_y,x","oa":165},{"a":23653,"t":"code","b":[246,167],"m":"inc","o":"bomb_ground_active,x","oa":167},{"a":23655,"t":"code","b":[165,97],"m":"lda","o":"active_flags","oa":97},{"a":23657,"t":"code","b":[9,2],"m":"ora","o":"#$02"},{"a":23659,"t":"code","b":[133,97],"m":"sta","o":"active_flags","oa":97},{"a":23661,"t":"code","b":[234],"m":"nop"},{"a":23662,"t":"code","b":[234],"m":"nop"},{"a":23663,"l":"r_5C6F","t":"code","b":[96],"m":"rts","x":[23556,23563,23569,23600,23611]},{"a":23664,"l":"bomb_track_scroll","c":"Keeps a falling bomb over the same spot on the ground while the world scrolls beneath it. Two passes (Y = 1, then the inner X loop twice) over both bomb slots: the fine X at $A5/$A6 is stepped by two - down when the scroll direction $60 is non-negative, up when it is negative - and the carry out of 0..7 moves the character column at $A1/$A2 by one, the fine value being reloaded with 6 or 0. Does nothing unless $61 bit 1 says a bomb exists.","t":"code","b":[165,97],"m":"lda","o":"active_flags","oa":97,"x":[23507]},{"a":23666,"t":"code","b":[41,2],"m":"and","o":"#$02"},{"a":23668,"t":"code","b":[240,57],"m":"beq","o":"r_5CAF","oa":23727},{"a":23670,"t":"code","b":[160,1],"m":"ldy","o":"#$01"},{"a":23672,"l":"b_5C78","t":"code","b":[162,2],"m":"ldx","o":"#$02","x":[23718]},{"a":23674,"l":"b_5C7A","t":"code","b":[181,167],"m":"lda","o":"bomb_ground_active,x","oa":167,"x":[23715]},{"a":23676,"t":"code","b":[240,36],"m":"beq","o":"b_5CA2","oa":23714},{"a":23678,"t":"code","b":[165,96],"m":"lda","o":"wave_direction","oa":96},{"a":23680,"t":"code","b":[48,16],"m":"bmi","o":"b_5C92","oa":23698},{"a":23682,"t":"code","b":[214,165],"m":"dec","o":"bomb_ground_sub_y,x","oa":165},{"a":23684,"t":"code","b":[214,165],"m":"dec","o":"bomb_ground_sub_y,x","oa":165},{"a":23686,"t":"code","b":[16,26],"m":"bpl","o":"b_5CA2","oa":23714},{"a":23688,"t":"code","b":[169,6],"m":"lda","o":"#$06"},{"a":23690,"t":"code","b":[149,165],"m":"sta","o":"bomb_ground_sub_y,x","oa":165},{"a":23692,"t":"code","b":[214,161],"m":"dec","o":"bomb_ground_col,x","oa":161},{"a":23694,"t":"code","b":[240,18],"m":"beq","o":"b_5CA2","oa":23714},{"a":23696,"t":"code","b":[208,16],"m":"bne","o":"b_5CA2","oa":23714},{"a":23698,"l":"b_5C92","t":"code","b":[246,165],"m":"inc","o":"bomb_ground_sub_y,x","oa":165,"x":[23680]},{"a":23700,"t":"code","b":[246,165],"m":"inc","o":"bomb_ground_sub_y,x","oa":165},{"a":23702,"t":"code","b":[181,165],"m":"lda","o":"bomb_ground_sub_y,x","oa":165},{"a":23704,"t":"code","b":[201,8],"m":"cmp","o":"#$08"},{"a":23706,"t":"code","b":[144,6],"m":"bcc","o":"b_5CA2","oa":23714},{"a":23708,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":23710,"t":"code","b":[149,165],"m":"sta","o":"bomb_ground_sub_y,x","oa":165},{"a":23712,"t":"code","b":[246,161],"m":"inc","o":"bomb_ground_col,x","oa":161},{"a":23714,"l":"b_5CA2","t":"code","b":[202],"m":"dex","x":[23676,23686,23694,23696,23706]},{"a":23715,"t":"code","b":[208,213],"m":"bne","o":"b_5C7A","oa":23674},{"a":23717,"t":"code","b":[136],"m":"dey"},{"a":23718,"t":"code","b":[208,208],"m":"bne","o":"b_5C78","oa":23672},{"a":23720,"t":"code","b":[234],"m":"nop"},{"a":23721,"t":"code","b":[234],"m":"nop"},{"a":23722,"t":"code","b":[234],"m":"nop"},{"a":23723,"t":"code","b":[234],"m":"nop"},{"a":23724,"t":"code","b":[234],"m":"nop"},{"a":23725,"t":"code","b":[234],"m":"nop"},{"a":23726,"t":"code","b":[234],"m":"nop"},{"a":23727,"l":"r_5CAF","t":"code","b":[96],"m":"rts","x":[23668]},{"a":23728,"l":"bomb_fall","c":"Makes the bombs fall and expire. Two passes over both bomb slots: the fine Y at $A3/$A4 is incremented, and every eighth step it wraps to 0 and the character row at $9F/$A0 advances one. When the row reaches $13 the bomb has reached the ground, and all five of its bytes - $9F, $A1, $A3, $A5 and the busy flag $A7 - are cleared, freeing the slot. Does nothing unless $61 bit 1 is set.","t":"code","b":[165,97],"m":"lda","o":"active_flags","oa":97,"x":[23510]},{"a":23730,"t":"code","b":[41,2],"m":"and","o":"#$02"},{"a":23732,"t":"code","b":[240,57],"m":"beq","o":"r_5CEF","oa":23791},{"a":23734,"t":"code","b":[160,2],"m":"ldy","o":"#$02"},{"a":23736,"l":"b_5CB8","t":"code","b":[162,2],"m":"ldx","o":"#$02","x":[23786]},{"a":23738,"l":"b_5CBA","t":"code","b":[181,167],"m":"lda","o":"bomb_ground_active,x","oa":167,"x":[23783]},{"a":23740,"t":"code","b":[240,40],"m":"beq","o":"b_5CE6","oa":23782},{"a":23742,"t":"code","b":[246,163],"m":"inc","o":"bomb_ground_sub_x,x","oa":163},{"a":23744,"t":"code","b":[234],"m":"nop"},{"a":23745,"t":"code","b":[234],"m":"nop"},{"a":23746,"t":"code","b":[181,163],"m":"lda","o":"bomb_ground_sub_x,x","oa":163},{"a":23748,"t":"code","b":[201,8],"m":"cmp","o":"#$08"},{"a":23750,"t":"code","b":[144,30],"m":"bcc","o":"b_5CE6","oa":23782},{"a":23752,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":23754,"t":"code","b":[149,163],"m":"sta","o":"bomb_ground_sub_x,x","oa":163},{"a":23756,"t":"code","b":[246,159],"m":"inc","o":"bomb_ground_row,x","oa":159},{"a":23758,"t":"code","b":[181,159],"m":"lda","o":"bomb_ground_row,x","oa":159},{"a":23760,"t":"code","b":[201,19],"m":"cmp","o":"#$13"},{"a":23762,"t":"code","b":[144,18],"m":"bcc","o":"b_5CE6","oa":23782},{"a":23764,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":23766,"t":"code","b":[149,159],"m":"sta","o":"bomb_ground_row,x","oa":159},{"a":23768,"t":"code","b":[149,161],"m":"sta","o":"bomb_ground_col,x","oa":161},{"a":23770,"t":"code","b":[149,163],"m":"sta","o":"bomb_ground_sub_x,x","oa":163},{"a":23772,"t":"code","b":[149,165],"m":"sta","o":"bomb_ground_sub_y,x","oa":165},{"a":23774,"t":"code","b":[149,167],"m":"sta","o":"bomb_ground_active,x","oa":167},{"a":23776,"t":"code","b":[234],"m":"nop"},{"a":23777,"t":"code","b":[234],"m":"nop"},{"a":23778,"t":"code","b":[234],"m":"nop"},{"a":23779,"t":"code","b":[234],"m":"nop"},{"a":23780,"t":"code","b":[234],"m":"nop"},{"a":23781,"t":"code","b":[234],"m":"nop"},{"a":23782,"l":"b_5CE6","t":"code","b":[202],"m":"dex","x":[23740,23750,23762]},{"a":23783,"t":"code","b":[208,209],"m":"bne","o":"b_5CBA","oa":23738},{"a":23785,"t":"code","b":[136],"m":"dey"},{"a":23786,"t":"code","b":[208,204],"m":"bne","o":"b_5CB8","oa":23736},{"a":23788,"t":"code","b":[234],"m":"nop"},{"a":23789,"t":"code","b":[234],"m":"nop"},{"a":23790,"t":"code","b":[234],"m":"nop"},{"a":23791,"l":"r_5CEF","t":"code","b":[96],"m":"rts","x":[23732]},{"a":23792,"t":"gap","n":16},{"a":23808,"l":"draw_bomb_sprites","c":"Turns the two bomb records into hardware sprites: slot 2 drives sprite 6 (enable mask $40) and slot 1 sprite 5 (mask $20), the mask being shifted right between passes. A free slot, or one whose screen column $2F = $A1,x - ($0D - 3) has reached $2C, has its bit cleared in $D015 and is skipped. Otherwise the sprite X is $2F * 8 + the fine X at $A5,x and the sprite Y is $9F,x * 8 + $2A + the fine Y at $A3,x; a column of $20 or more sets that sprite's bit in $D010 and has $20 taken off it, a lower column clears the bit. The pair is written to $D008+2n / $D009+2n and the sprite is switched on in $D015.","t":"code","b":[162,2],"m":"ldx","o":"#$02","x":[23513]},{"a":23810,"t":"code","b":[160,64],"m":"ldy","o":"#$40"},{"a":23812,"l":"j_5D04","t":"code","b":[181,167],"m":"lda","o":"bomb_ground_active,x","oa":167,"x":[23948]},{"a":23814,"t":"code","b":[208,17],"m":"bne","o":"b_5D19","oa":23833},{"a":23816,"l":"b_5D08","t":"code","b":[152],"m":"tya","x":[23849]},{"a":23817,"t":"code","b":[73,255],"m":"eor","o":"#$FF"},{"a":23819,"t":"code","b":[133,16],"m":"sta","o":"tmp_x","oa":16},{"a":23821,"t":"code","b":[173,21,208],"m":"lda","o":"vic_sprite_enable"},{"a":23824,"t":"code","b":[37,16],"m":"and","o":"tmp_x","oa":16},{"a":23826,"t":"code","b":[141,21,208],"m":"sta","o":"vic_sprite_enable"},{"a":23829,"t":"code","b":[240,107],"m":"beq","o":"b_5D82","oa":23938},{"a":23831,"t":"code","b":[208,105],"m":"bne","o":"b_5D82","oa":23938},{"a":23833,"l":"b_5D19","t":"code","b":[165,13],"m":"lda","o":"world_x","oa":13,"x":[23814]},{"a":23835,"t":"code","b":[56],"m":"sec"},{"a":23836,"t":"code","b":[233,3],"m":"sbc","o":"#$03"},{"a":23838,"t":"code","b":[133,16],"m":"sta","o":"tmp_x","oa":16},{"a":23840,"t":"code","b":[181,161],"m":"lda","o":"bomb_ground_col,x","oa":161},{"a":23842,"t":"code","b":[56],"m":"sec"},{"a":23843,"t":"code","b":[229,16],"m":"sbc","o":"tmp_x","oa":16},{"a":23845,"t":"code","b":[133,47],"m":"sta","o":"zp_2f_scratch","oa":47},{"a":23847,"t":"code","b":[201,44],"m":"cmp","o":"#$2C"},{"a":23849,"t":"code","b":[176,221],"m":"bcs","o":"b_5D08","oa":23816},{"a":23851,"t":"code","b":[201,32],"m":"cmp","o":"#$20"},{"a":23853,"t":"code","b":[144,21],"m":"bcc","o":"b_5D44","oa":23876},{"a":23855,"t":"code","b":[132,16],"m":"sty","o":"tmp_x","oa":16},{"a":23857,"t":"code","b":[173,16,208],"m":"lda","o":"vic_sprite_x_msb"},{"a":23860,"t":"code","b":[5,16],"m":"ora","o":"tmp_x","oa":16},{"a":23862,"t":"code","b":[141,16,208],"m":"sta","o":"vic_sprite_x_msb"},{"a":23865,"t":"code","b":[165,47],"m":"lda","o":"zp_2f_scratch","oa":47},{"a":23867,"t":"code","b":[56],"m":"sec"},{"a":23868,"t":"code","b":[233,32],"m":"sbc","o":"#$20"},{"a":23870,"t":"code","b":[133,47],"m":"sta","o":"zp_2f_scratch","oa":47},{"a":23872,"t":"code","b":[240,15],"m":"beq","o":"b_5D51","oa":23889},{"a":23874,"t":"code","b":[208,13],"m":"bne","o":"b_5D51","oa":23889},{"a":23876,"l":"b_5D44","t":"code","b":[152],"m":"tya","x":[23853]},{"a":23877,"t":"code","b":[73,255],"m":"eor","o":"#$FF"},{"a":23879,"t":"code","b":[133,16],"m":"sta","o":"tmp_x","oa":16},{"a":23881,"t":"code","b":[173,16,208],"m":"lda","o":"vic_sprite_x_msb"},{"a":23884,"t":"code","b":[37,16],"m":"and","o":"tmp_x","oa":16},{"a":23886,"t":"code","b":[141,16,208],"m":"sta","o":"vic_sprite_x_msb"},{"a":23889,"l":"b_5D51","t":"code","b":[165,47],"m":"lda","o":"zp_2f_scratch","oa":47,"x":[23872,23874]},{"a":23891,"t":"code","b":[10],"m":"asl","o":"a"},{"a":23892,"t":"code","b":[10],"m":"asl","o":"a"},{"a":23893,"t":"code","b":[10],"m":"asl","o":"a"},{"a":23894,"t":"code","b":[24],"m":"clc"},{"a":23895,"t":"code","b":[117,165],"m":"adc","o":"bomb_ground_sub_y,x","oa":165},{"a":23897,"t":"code","b":[133,68],"m":"sta","o":"tmp_44","oa":68},{"a":23899,"t":"code","b":[181,159],"m":"lda","o":"bomb_ground_row,x","oa":159},{"a":23901,"t":"code","b":[10],"m":"asl","o":"a"},{"a":23902,"t":"code","b":[10],"m":"asl","o":"a"},{"a":23903,"t":"code","b":[10],"m":"asl","o":"a"},{"a":23904,"t":"code","b":[24],"m":"clc"},{"a":23905,"t":"code","b":[105,42],"m":"adc","o":"#$2A"},{"a":23907,"t":"code","b":[24],"m":"clc"},{"a":23908,"t":"code","b":[117,163],"m":"adc","o":"bomb_ground_sub_x,x","oa":163},{"a":23910,"t":"code","b":[133,69],"m":"sta","o":"tmp_45","oa":69},{"a":23912,"t":"code","b":[138],"m":"txa"},{"a":23913,"t":"code","b":[72],"m":"pha"},{"a":23914,"t":"code","b":[10],"m":"asl","o":"a"},{"a":23915,"t":"code","b":[170],"m":"tax"},{"a":23916,"t":"code","b":[165,68],"m":"lda","o":"tmp_44","oa":68},{"a":23918,"t":"code","b":[157,8,208],"m":"sta","o":"vic_sprite4_x,x"},{"a":23921,"t":"code","b":[165,69],"m":"lda","o":"tmp_45","oa":69},{"a":23923,"t":"code","b":[157,9,208],"m":"sta","o":"vic_sprite4_y,x"},{"a":23926,"t":"code","b":[104],"m":"pla"},{"a":23927,"t":"code","b":[170],"m":"tax"},{"a":23928,"t":"code","b":[132,16],"m":"sty","o":"tmp_x","oa":16},{"a":23930,"t":"code","b":[173,21,208],"m":"lda","o":"vic_sprite_enable"},{"a":23933,"t":"code","b":[5,16],"m":"ora","o":"tmp_x","oa":16},{"a":23935,"t":"code","b":[141,21,208],"m":"sta","o":"vic_sprite_enable"},{"a":23938,"l":"b_5D82","t":"code","b":[202],"m":"dex","x":[23829,23831]},{"a":23939,"t":"code","b":[240,10],"m":"beq","o":"r_5D8F","oa":23951},{"a":23941,"t":"code","b":[152],"m":"tya"},{"a":23942,"t":"code","b":[74],"m":"lsr","o":"a"},{"a":23943,"t":"code","b":[168],"m":"tay"},{"a":23944,"t":"code","b":[192,16],"m":"cpy","o":"#$10"},{"a":23946,"t":"code","b":[240,3],"m":"beq","o":"r_5D8F","oa":23951},{"a":23948,"t":"code","b":[76,4,93],"m":"jmp","o":"j_5D04","oa":23812},{"a":23951,"l":"r_5D8F","t":"code","b":[96],"m":"rts","x":[23939,23946]},{"a":23952,"t":"gap","n":16},{"a":23968,"l":"sprite_cell_position","c":"Converts a hardware sprite's position back into the character cell it covers, for the collision handler. On entry $2F holds the sprite number. From $D001+2n it leaves the row in $47 as ($D001+2n - $2C) / 8; from $D000+2n it leaves the column in $46 as ($D000+2n + 6) / 8, plus $20 when that sprite's bit is set in $D010, minus 3. Called from $4260 for an enemy aircraft and from $429A for a bomb; both then hand $46/$47 to $5800 (or $5150) to read the screen cell underneath.","t":"code","b":[165,47],"m":"lda","o":"zp_2f_scratch","oa":47,"x":[16992,17050]},{"a":23970,"t":"code","b":[10],"m":"asl","o":"a"},{"a":23971,"t":"code","b":[170],"m":"tax"},{"a":23972,"t":"code","b":[189,1,208],"m":"lda","o":"vic_sprite0_y,x"},{"a":23975,"t":"code","b":[56],"m":"sec"},{"a":23976,"t":"code","b":[233,44],"m":"sbc","o":"#$2C"},{"a":23978,"t":"code","b":[74],"m":"lsr","o":"a"},{"a":23979,"t":"code","b":[74],"m":"lsr","o":"a"},{"a":23980,"t":"code","b":[74],"m":"lsr","o":"a"},{"a":23981,"t":"code","b":[133,71],"m":"sta","o":"enemy_row","oa":71},{"a":23983,"t":"code","b":[189,0,208],"m":"lda","o":"vic_sprite0_x,x"},{"a":23986,"t":"code","b":[234],"m":"nop"},{"a":23987,"t":"code","b":[24],"m":"clc"},{"a":23988,"t":"code","b":[105,6],"m":"adc","o":"#$06"},{"a":23990,"t":"code","b":[74],"m":"lsr","o":"a"},{"a":23991,"t":"code","b":[74],"m":"lsr","o":"a"},{"a":23992,"t":"code","b":[74],"m":"lsr","o":"a"},{"a":23993,"t":"code","b":[133,16],"m":"sta","o":"tmp_x","oa":16},{"a":23995,"t":"code","b":[165,47],"m":"lda","o":"zp_2f_scratch","oa":47},{"a":23997,"t":"code","b":[168],"m":"tay"},{"a":23998,"t":"code","b":[169,1],"m":"lda","o":"#$01"},{"a":24000,"l":"b_5DC0","t":"code","b":[136],"m":"dey","x":[24004]},{"a":24001,"t":"code","b":[48,3],"m":"bmi","o":"b_5DC6","oa":24006},{"a":24003,"t":"code","b":[10],"m":"asl","o":"a"},{"a":24004,"t":"code","b":[208,250],"m":"bne","o":"b_5DC0","oa":24000},{"a":24006,"l":"b_5DC6","t":"code","b":[45,16,208],"m":"and","o":"vic_sprite_x_msb","x":[24001]},{"a":24009,"t":"code","b":[240,7],"m":"beq","o":"b_5DD2","oa":24018},{"a":24011,"t":"code","b":[165,16],"m":"lda","o":"tmp_x","oa":16},{"a":24013,"t":"code","b":[24],"m":"clc"},{"a":24014,"t":"code","b":[105,32],"m":"adc","o":"#$20"},{"a":24016,"t":"code","b":[133,16],"m":"sta","o":"tmp_x","oa":16},{"a":24018,"l":"b_5DD2","t":"code","b":[165,16],"m":"lda","o":"tmp_x","oa":16,"x":[24009]},{"a":24020,"t":"code","b":[56],"m":"sec"},{"a":24021,"t":"code","b":[233,3],"m":"sbc","o":"#$03"},{"a":24023,"t":"code","b":[133,70],"m":"sta","o":"tmp_46","oa":70},{"a":24025,"t":"code","b":[96],"m":"rts"},{"a":24026,"t":"gap","n":54},{"a":24080,"l":"add_score","c":"Adds the current kill award to the score and then doubles the award. $AA holds the award - $19, i.e. 25, at the start of a wave - and is added to the least significant score digit at $16; the five digits at $12-$16 are then normalised by repeatedly taking 10 off a digit and carrying one into the digit before it; finally $AA is shifted left. That is exactly the documented 25 / 50 / 100 / 200 for the first four jets of a wave. Called from $5E76, inside the enemy-destroyed handler.","t":"code","b":[165,170],"m":"lda","o":"wave_score_value","oa":170,"x":[24182]},{"a":24082,"t":"code","b":[24],"m":"clc"},{"a":24083,"t":"code","b":[101,22],"m":"adc","o":"score_digit_units","oa":22},{"a":24085,"t":"code","b":[133,22],"m":"sta","o":"score_digit_units","oa":22},{"a":24087,"t":"code","b":[162,4],"m":"ldx","o":"#$04"},{"a":24089,"l":"b_5E19","t":"code","b":[181,18],"m":"lda","o":"score_digits,x","oa":18,"x":[24106]},{"a":24091,"l":"b_5E1B","t":"code","b":[201,10],"m":"cmp","o":"#$0A","x":[24103]},{"a":24093,"t":"code","b":[144,10],"m":"bcc","o":"b_5E29","oa":24105},{"a":24095,"t":"code","b":[246,17],"m":"inc","o":"radar_origin,x","oa":17},{"a":24097,"t":"code","b":[56],"m":"sec"},{"a":24098,"t":"code","b":[233,10],"m":"sbc","o":"#$0A"},{"a":24100,"t":"code","b":[149,18],"m":"sta","o":"score_digits,x","oa":18},{"a":24102,"t":"code","b":[24],"m":"clc"},{"a":24103,"t":"code","b":[144,242],"m":"bcc","o":"b_5E1B","oa":24091},{"a":24105,"l":"b_5E29","t":"code","b":[202],"m":"dex","x":[24093]},{"a":24106,"t":"code","b":[208,237],"m":"bne","o":"b_5E19","oa":24089},{"a":24108,"t":"code","b":[6,170],"m":"asl","o":"wave_score_value","oa":170},{"a":24110,"t":"code","b":[96],"m":"rts"},{"a":24111,"t":"gap","n":1},{"a":24112,"l":"clear_bomb_active_flag","c":"Drops $61 bit 1 once neither bomb is in the air. Reads the two bomb busy bytes $A8 and $A9, and if both are zero clears the bit that $5C00 sets, which is what stops $5C70 and $5CB0 doing any work. Called from $5BDC, last in the bomb pass.","t":"code","b":[165,97],"m":"lda","o":"active_flags","oa":97,"x":[23516]},{"a":24114,"t":"code","b":[41,2],"m":"and","o":"#$02"},{"a":24116,"t":"code","b":[240,14],"m":"beq","o":"r_5E44","oa":24132},{"a":24118,"t":"code","b":[165,168],"m":"lda","o":"bomb_ground_active1","oa":168},{"a":24120,"t":"code","b":[208,10],"m":"bne","o":"r_5E44","oa":24132},{"a":24122,"t":"code","b":[165,169],"m":"lda","o":"bomb_ground_active2","oa":169},{"a":24124,"t":"code","b":[208,6],"m":"bne","o":"r_5E44","oa":24132},{"a":24126,"t":"code","b":[165,97],"m":"lda","o":"active_flags","oa":97},{"a":24128,"t":"code","b":[41,253],"m":"and","o":"#$FD"},{"a":24130,"t":"code","b":[133,97],"m":"sta","o":"active_flags","oa":97},{"a":24132,"l":"r_5E44","t":"code","b":[96],"m":"rts","x":[24116,24120,24124]},{"a":24133,"l":"refresh_blast_glyphs","c":"First thing the frame loop does ($418F): re-randomises the bomb-blast graphic, then services the enemy siren. The 16 bitmap bytes of character-set glyphs $2A and $2B at $3150 are rewritten on every pass with the low byte of CIA2 Timer A ($DD04), a value fast enough to serve as noise, ANDed with the matching byte of glyphs $2C/$2D at $3160 and ORed with $55, so the pair flickers as a two-colour dither inside a fixed silhouette. $42E0 stamps exactly those two glyphs side by side, in colour $0C, at the cell where an enemy bomb strikes the ground. The two `lda $DD04` at $5E4C and $5E51 are identical, so the branch that picks between them has no effect - another patched-looking detail. Ends with JSR $5EA0.","t":"code","b":[162,0],"m":"ldx","o":"#$00","x":[16783]},{"a":24135,"l":"b_5E47","t":"code","b":[138],"m":"txa","x":[24159]},{"a":24136,"t":"code","b":[41,1],"m":"and","o":"#$01"},{"a":24138,"t":"code","b":[208,5],"m":"bne","o":"b_5E51","oa":24145},{"a":24140,"t":"code","b":[173,4,221],"m":"lda","o":"cia2_timer_a_lo"},{"a":24143,"t":"code","b":[144,3],"m":"bcc","o":"b_5E54","oa":24148},{"a":24145,"l":"b_5E51","t":"code","b":[173,4,221],"m":"lda","o":"cia2_timer_a_lo","x":[24138]},{"a":24148,"l":"b_5E54","t":"code","b":[61,96,49],"m":"and","o":"charset_crater_mask,x","oa":12640,"x":[24143]},{"a":24151,"t":"code","b":[9,85],"m":"ora","o":"#$55"},{"a":24153,"t":"code","b":[157,80,49],"m":"sta","o":"charset_crater,x","oa":12624},{"a":24156,"t":"code","b":[232],"m":"inx"},{"a":24157,"t":"code","b":[224,16],"m":"cpx","o":"#$10"},{"a":24159,"t":"code","b":[144,230],"m":"bcc","o":"b_5E47","oa":24135},{"a":24161,"t":"code","b":[32,160,94],"m":"jsr","o":"enemy_proximity_siren","oa":24224},{"a":24164,"t":"code","b":[96],"m":"rts"},{"a":24165,"t":"gap","n":5},{"a":24170,"l":"enemy_shot_down","c":"Marks the enemy aircraft in slot X as destroyed and pays the player for it. Called from $427E once the sprite-to-background test at $426A has found a player-missile glyph ($0C..$13) in the cell under the enemy sprite. If the slot is alive and not already exploding ($58,x non-zero and below $D0) its state becomes $D0, the score is advanced by $5E10 (which also doubles the award), and - unless the player is landed ($22 bit 3) or a sound is still running ($AF non-zero) - SID voice 2's control register $D404 is retriggered, $80 then $81, gating the noise waveform, and $AF is set to 6 as the sound's hold-off.","t":"code","b":[181,87],"m":"lda","o":"enemy_state,x","oa":87,"x":[17022]},{"a":24172,"t":"code","b":[240,35],"m":"beq","o":"r_5E91","oa":24209},{"a":24174,"t":"code","b":[201,208],"m":"cmp","o":"#$D0"},{"a":24176,"t":"code","b":[176,31],"m":"bcs","o":"r_5E91","oa":24209},{"a":24178,"t":"code","b":[169,208],"m":"lda","o":"#$D0"},{"a":24180,"t":"code","b":[149,87],"m":"sta","o":"enemy_state,x","oa":87},{"a":24182,"t":"code","b":[32,16,94],"m":"jsr","o":"add_score","oa":24080},{"a":24185,"t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34},{"a":24187,"t":"code","b":[41,8],"m":"and","o":"#$08"},{"a":24189,"t":"code","b":[208,18],"m":"bne","o":"r_5E91","oa":24209},{"a":24191,"t":"code","b":[165,175],"m":"lda","o":"zp_af_unknown","oa":175},{"a":24193,"t":"code","b":[208,14],"m":"bne","o":"r_5E91","oa":24209},{"a":24195,"t":"code","b":[169,128],"m":"lda","o":"#$80"},{"a":24197,"t":"code","b":[141,4,212],"m":"sta","o":"sid_v1_control"},{"a":24200,"t":"code","b":[169,129],"m":"lda","o":"#$81"},{"a":24202,"t":"code","b":[141,4,212],"m":"sta","o":"sid_v1_control"},{"a":24205,"t":"code","b":[169,6],"m":"lda","o":"#$06"},{"a":24207,"t":"code","b":[133,175],"m":"sta","o":"zp_af_unknown","oa":175},{"a":24209,"l":"r_5E91","t":"code","b":[96],"m":"rts","x":[24172,24176,24189,24193]},{"a":24210,"t":"gap","n":14},{"a":24224,"l":"enemy_proximity_siren","c":"The warning tone that tightens as an enemy aircraft closes on the player. Silent while the player is landed ($22 bit 3). $23 is the siren's on/off flag: it is raised, together with $D412 = $81 (SID voice 3, noise waveform gated on), as soon as any enemy state byte in $58-$5B is live and below $D0, and dropped, with $D412 = $80, when none is - the drop being gated on $65 as well. While it sounds, the filter cutoff $D416 (mirrored in $AC) is set from the horizontal gap between player and jet, $0D + $93 - $4C,x, taken as an absolute value and clipped to $6D. With no jet about it calls $48E0 instead. Called from $5E61, at the end of $5E45.","t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34,"x":[24161]},{"a":24226,"t":"code","b":[41,8],"m":"and","o":"#$08"},{"a":24228,"t":"code","b":[208,85],"m":"bne","o":"r_5EFB","oa":24315},{"a":24230,"t":"code","b":[165,35],"m":"lda","o":"zp_23_unknown","oa":35},{"a":24232,"t":"code","b":[208,24],"m":"bne","o":"b_5EC2","oa":24258},{"a":24234,"t":"code","b":[162,3],"m":"ldx","o":"#$03"},{"a":24236,"l":"b_5EAC","t":"code","b":[181,88],"m":"lda","o":"enemy_state1,x","oa":88,"x":[24245]},{"a":24238,"t":"code","b":[240,4],"m":"beq","o":"b_5EB4","oa":24244},{"a":24240,"t":"code","b":[201,208],"m":"cmp","o":"#$D0"},{"a":24242,"t":"code","b":[144,5],"m":"bcc","o":"b_5EB9","oa":24249},{"a":24244,"l":"b_5EB4","t":"code","b":[202],"m":"dex","x":[24238]},{"a":24245,"t":"code","b":[16,245],"m":"bpl","o":"b_5EAC","oa":24236},{"a":24247,"t":"code","b":[48,63],"m":"bmi","o":"b_5EF8","oa":24312},{"a":24249,"l":"b_5EB9","t":"code","b":[169,129],"m":"lda","o":"#$81","x":[24242]},{"a":24251,"t":"code","b":[141,18,212],"m":"sta","o":"sid_v3_control"},{"a":24254,"t":"code","b":[133,35],"m":"sta","o":"zp_23_unknown","oa":35},{"a":24256,"t":"code","b":[208,28],"m":"bne","o":"b_5EDE","oa":24286},{"a":24258,"l":"b_5EC2","t":"code","b":[165,101],"m":"lda","o":"zp_65_unknown","oa":101,"x":[24232]},{"a":24260,"t":"code","b":[240,50],"m":"beq","o":"b_5EF8","oa":24312},{"a":24262,"t":"code","b":[162,3],"m":"ldx","o":"#$03"},{"a":24264,"l":"b_5EC8","t":"code","b":[181,88],"m":"lda","o":"enemy_state1,x","oa":88,"x":[24273]},{"a":24266,"t":"code","b":[240,4],"m":"beq","o":"b_5ED0","oa":24272},{"a":24268,"t":"code","b":[201,208],"m":"cmp","o":"#$D0"},{"a":24270,"t":"code","b":[144,14],"m":"bcc","o":"b_5EDE","oa":24286},{"a":24272,"l":"b_5ED0","t":"code","b":[202],"m":"dex","x":[24266]},{"a":24273,"t":"code","b":[16,245],"m":"bpl","o":"b_5EC8","oa":24264},{"a":24275,"t":"code","b":[169,128],"m":"lda","o":"#$80"},{"a":24277,"t":"code","b":[141,18,212],"m":"sta","o":"sid_v3_control"},{"a":24280,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":24282,"t":"code","b":[133,35],"m":"sta","o":"zp_23_unknown","oa":35},{"a":24284,"t":"code","b":[240,26],"m":"beq","o":"b_5EF8","oa":24312},{"a":24286,"l":"b_5EDE","t":"code","b":[165,13],"m":"lda","o":"world_x","oa":13,"x":[24256,24270]},{"a":24288,"t":"code","b":[24],"m":"clc"},{"a":24289,"t":"code","b":[105,147],"m":"adc","o":"#$93"},{"a":24291,"t":"code","b":[56],"m":"sec"},{"a":24292,"t":"code","b":[245,76],"m":"sbc","o":"enemy_map_x1,x","oa":76},{"a":24294,"t":"code","b":[16,2],"m":"bpl","o":"b_5EEA","oa":24298},{"a":24296,"t":"code","b":[73,255],"m":"eor","o":"#$FF"},{"a":24298,"l":"b_5EEA","t":"code","b":[201,109],"m":"cmp","o":"#$6D","x":[24294]},{"a":24300,"t":"code","b":[144,2],"m":"bcc","o":"b_5EF0","oa":24304},{"a":24302,"t":"code","b":[169,109],"m":"lda","o":"#$6D"},{"a":24304,"l":"b_5EF0","t":"code","b":[141,22,212],"m":"sta","o":"sid_filter_cutoff_hi","x":[24300]},{"a":24307,"t":"code","b":[133,172],"m":"sta","o":"sfx_filter_cutoff","oa":172},{"a":24309,"t":"code","b":[24],"m":"clc"},{"a":24310,"t":"code","b":[144,3],"m":"bcc","o":"r_5EFB","oa":24315},{"a":24312,"l":"b_5EF8","t":"code","b":[32,224,72],"m":"jsr","o":"sfx_cutoff_decay","oa":18656,"x":[24247,24260,24284]},{"a":24315,"l":"r_5EFB","t":"code","b":[96],"m":"rts","x":[24228,24310]},{"a":24316,"t":"gap","n":4},{"a":24320,"l":"scroll_world","c":"Scrolls the world past the player and paces the scroll by airspeed. Bumps the phase counter $2C, then returns at once while $2A (vel_x) is zero; at +/-3 it scrolls on every pass, at +/-1 on one pass in four ($2C & 3) and at +/-2 on one pass in two ($2C & 1). A negative vel_x scrolls through $5120, which decrements the world offset $0D, a positive one through $50F0, which increments it; both move the landscape by rotating character bitmaps rather than by rewriting screen RAM. When the resulting scroll direction $60 agrees with the direction of travel, the enemy shots are given two extra updates through $5F42. Called from $419C, straight after the input read.","t":"code","b":[230,44],"m":"inc","o":"scroll_phase","oa":44,"x":[16796]},{"a":24322,"t":"code","b":[165,42],"m":"lda","o":"vel_x","oa":42},{"a":24324,"t":"code","b":[240,59],"m":"beq","o":"r_5F41","oa":24385},{"a":24326,"t":"code","b":[201,3],"m":"cmp","o":"#$03"},{"a":24328,"t":"code","b":[240,26],"m":"beq","o":"b_5F24","oa":24356},{"a":24330,"t":"code","b":[201,253],"m":"cmp","o":"#$FD"},{"a":24332,"t":"code","b":[240,22],"m":"beq","o":"b_5F24","oa":24356},{"a":24334,"t":"code","b":[201,1],"m":"cmp","o":"#$01"},{"a":24336,"t":"code","b":[240,12],"m":"beq","o":"b_5F1E","oa":24350},{"a":24338,"t":"code","b":[201,255],"m":"cmp","o":"#$FF"},{"a":24340,"t":"code","b":[240,8],"m":"beq","o":"b_5F1E","oa":24350},{"a":24342,"t":"code","b":[165,44],"m":"lda","o":"scroll_phase","oa":44},{"a":24344,"t":"code","b":[41,1],"m":"and","o":"#$01"},{"a":24346,"t":"code","b":[208,37],"m":"bne","o":"r_5F41","oa":24385},{"a":24348,"t":"code","b":[240,6],"m":"beq","o":"b_5F24","oa":24356},{"a":24350,"l":"b_5F1E","t":"code","b":[165,44],"m":"lda","o":"scroll_phase","oa":44,"x":[24336,24340]},{"a":24352,"t":"code","b":[41,3],"m":"and","o":"#$03"},{"a":24354,"t":"code","b":[208,29],"m":"bne","o":"r_5F41","oa":24385},{"a":24356,"l":"b_5F24","t":"code","b":[165,42],"m":"lda","o":"vel_x","oa":42,"x":[24328,24332,24348]},{"a":24358,"t":"code","b":[16,13],"m":"bpl","o":"b_5F35","oa":24373},{"a":24360,"t":"code","b":[32,32,81],"m":"jsr","o":"scroll_landscape_right","oa":20768},{"a":24363,"t":"code","b":[165,96],"m":"lda","o":"wave_direction","oa":96},{"a":24365,"t":"code","b":[16,18],"m":"bpl","o":"r_5F41","oa":24385},{"a":24367,"t":"code","b":[32,66,95],"m":"jsr","o":"update_enemy_shots_twice","oa":24386},{"a":24370,"t":"code","b":[24],"m":"clc"},{"a":24371,"t":"code","b":[144,12],"m":"bcc","o":"r_5F41","oa":24385},{"a":24373,"l":"b_5F35","t":"code","b":[32,240,80],"m":"jsr","o":"scroll_landscape_left","oa":20720,"x":[24358]},{"a":24376,"t":"code","b":[165,96],"m":"lda","o":"wave_direction","oa":96},{"a":24378,"t":"code","b":[201,1],"m":"cmp","o":"#$01"},{"a":24380,"t":"code","b":[208,3],"m":"bne","o":"r_5F41","oa":24385},{"a":24382,"t":"code","b":[32,66,95],"m":"jsr","o":"update_enemy_shots_twice","oa":24386},{"a":24385,"l":"r_5F41","t":"code","b":[96],"m":"rts","x":[24324,24346,24354,24365,24371,24380]},{"a":24386,"l":"update_enemy_shots_twice","c":"Runs the whole enemy-shot pass at $5A00 two more times in the same frame, so the shots cross three character columns instead of one while the player is flying with the scroll. Called from $5F2F and $5F3E inside $5F00.","t":"code","b":[32,0,90],"m":"jsr","o":"update_enemy_shots","oa":23040,"x":[24367,24382]},{"a":24389,"t":"code","b":[32,0,90],"m":"jsr","o":"update_enemy_shots","oa":23040},{"a":24392,"t":"code","b":[96],"m":"rts"},{"a":24393,"t":"gap","n":23},{"a":24416,"l":"destroy_base","c":"Wrecks the base an enemy bomb has just hit. Called from $42AF after $5DA0 and $5150 have put the impact cell in $46/$47 and its screen pointer in $05/$06. Turns that cell into an index into the 256-byte world map at $3800 (Y + $05 - $EA + $0D) and scans forward for the first intact base marker $16, returning without doing anything if it meets an already-wrecked $6F first. It then rewrites four consecutive map cells, $16 becoming $6F and $17 becoming $70 - the burnt-out shapes - and for each of the four that falls inside the visible 40 columns (index - $0D) writes the new glyph into screen row 12 at $05E0,x and sets that cell's colour RAM at $D9E0,x to 0, black. Finally, if the player was in the take-off state ($22 bit 1) the state is forced to landing ($22 bit 3, bit 4 preserved). This routine writes screen RAM during play, so the earlier claim that screen RAM never changes in play holds only while nothing is destroyed.","t":"code","b":[152],"m":"tya","x":[17071]},{"a":24417,"t":"code","b":[24],"m":"clc"},{"a":24418,"t":"code","b":[101,5],"m":"adc","o":"ptr_screen","oa":5},{"a":24420,"t":"code","b":[56],"m":"sec"},{"a":24421,"t":"code","b":[233,234],"m":"sbc","o":"#$EA"},{"a":24423,"t":"code","b":[24],"m":"clc"},{"a":24424,"t":"code","b":[101,13],"m":"adc","o":"world_x","oa":13},{"a":24426,"t":"code","b":[170],"m":"tax"},{"a":24427,"l":"b_5F6B","t":"code","b":[189,0,56],"m":"lda","o":"terrain_map_row0,x","oa":14336,"x":[24440]},{"a":24430,"t":"code","b":[201,22],"m":"cmp","o":"#$16"},{"a":24432,"t":"code","b":[240,9],"m":"beq","o":"b_5F7B","oa":24443},{"a":24433,"t":"note","l":"trainer_target_base_hit","c":"The branch taken after comparing a map cell against $16. The 'bases indestructible' trainer rewrites it to $4D so the test lands on the already-destroyed path, which is what identifies $16 as an intact base tile.","note":"inside the item at $5F70","x":[6647]},{"a":24434,"t":"code","b":[201,111],"m":"cmp","o":"#$6F"},{"a":24436,"t":"code","b":[240,73],"m":"beq","o":"r_5FBF","oa":24511},{"a":24438,"t":"code","b":[232],"m":"inx"},{"a":24439,"t":"code","b":[24],"m":"clc"},{"a":24440,"t":"code","b":[144,241],"m":"bcc","o":"b_5F6B","oa":24427},{"a":24442,"t":"code","b":[234],"m":"nop"},{"a":24443,"l":"b_5F7B","t":"code","b":[160,4],"m":"ldy","o":"#$04","x":[24432]},{"a":24445,"l":"b_5F7D","t":"code","b":[189,0,56],"m":"lda","o":"terrain_map_row0,x","oa":14336,"x":[24487]},{"a":24448,"t":"code","b":[201,22],"m":"cmp","o":"#$16"},{"a":24450,"t":"code","b":[208,4],"m":"bne","o":"b_5F88","oa":24456},{"a":24452,"t":"code","b":[169,111],"m":"lda","o":"#$6F"},{"a":24454,"t":"code","b":[208,2],"m":"bne","o":"b_5F8A","oa":24458},{"a":24456,"l":"b_5F88","t":"code","b":[169,112],"m":"lda","o":"#$70","x":[24450]},{"a":24458,"l":"b_5F8A","t":"code","b":[157,0,56],"m":"sta","o":"terrain_map_row0,x","oa":14336,"x":[24454]},{"a":24461,"t":"code","b":[133,16],"m":"sta","o":"tmp_x","oa":16},{"a":24463,"t":"code","b":[138],"m":"txa"},{"a":24464,"t":"code","b":[72],"m":"pha"},{"a":24465,"t":"code","b":[56],"m":"sec"},{"a":24466,"t":"code","b":[229,13],"m":"sbc","o":"world_x","oa":13},{"a":24468,"t":"code","b":[170],"m":"tax"},{"a":24469,"t":"code","b":[224,40],"m":"cpx","o":"#$28"},{"a":24471,"t":"code","b":[176,10],"m":"bcs","o":"b_5FA3","oa":24483},{"a":24473,"t":"code","b":[165,16],"m":"lda","o":"tmp_x","oa":16},{"a":24475,"t":"code","b":[157,224,5],"m":"sta","o":"f_05E0,x","oa":1504},{"a":24478,"t":"code","b":[169,0],"m":"lda","o":"#$00"},{"a":24480,"t":"code","b":[157,224,217],"m":"sta","o":"$D9E0,x"},{"a":24483,"l":"b_5FA3","t":"code","b":[104],"m":"pla","x":[24471]},{"a":24484,"t":"code","b":[170],"m":"tax"},{"a":24485,"t":"code","b":[232],"m":"inx"},{"a":24486,"t":"code","b":[136],"m":"dey"},{"a":24487,"t":"code","b":[208,212],"m":"bne","o":"b_5F7D","oa":24445},{"a":24489,"t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34},{"a":24491,"t":"code","b":[41,2],"m":"and","o":"#$02"},{"a":24493,"t":"code","b":[240,16],"m":"beq","o":"r_5FBF","oa":24511},{"a":24495,"t":"code","b":[165,34],"m":"lda","o":"flight_flags","oa":34},{"a":24497,"t":"code","b":[41,16],"m":"and","o":"#$10"},{"a":24499,"t":"code","b":[9,8],"m":"ora","o":"#$08"},{"a":24501,"t":"code","b":[133,34],"m":"sta","o":"flight_flags","oa":34},{"a":24503,"t":"code","b":[234],"m":"nop"},{"a":24504,"t":"code","b":[234],"m":"nop"},{"a":24505,"t":"code","b":[234],"m":"nop"},{"a":24506,"t":"code","b":[234],"m":"nop"},{"a":24507,"t":"code","b":[234],"m":"nop"},{"a":24508,"t":"code","b":[234],"m":"nop"},{"a":24509,"t":"code","b":[234],"m":"nop"},{"a":24510,"t":"code","b":[234],"m":"nop"},{"a":24511,"l":"r_5FBF","t":"code","b":[96],"m":"rts","x":[24436,24493]},{"a":24512,"t":"gap","n":16},{"a":24528,"l":"rebuild_bases","c":"Puts every wrecked base back. Walks all 256 bytes of the world map at $3800 and turns each burnt marker back into its intact form, $6F into $16 and $70 into $17. Called from $564E, the start-of-life reset, which is what makes destroyed bases return only when a life is lost. The map holds six bases, each the four cells $16 $17 $16 $17, at indices $04, $28, $54, $8E, $B0 and $D0.","t":"code","b":[162,0],"m":"ldx","o":"#$00","x":[22094]},{"a":24530,"l":"b_5FD2","t":"code","b":[189,0,56],"m":"lda","o":"terrain_map_row0,x","oa":14336,"x":[24551]},{"a":24533,"t":"code","b":[201,111],"m":"cmp","o":"#$6F"},{"a":24535,"t":"code","b":[208,4],"m":"bne","o":"b_5FDD","oa":24541},{"a":24537,"t":"code","b":[169,22],"m":"lda","o":"#$16"},{"a":24539,"t":"code","b":[208,6],"m":"bne","o":"b_5FE3","oa":24547},{"a":24541,"l":"b_5FDD","t":"code","b":[201,112],"m":"cmp","o":"#$70","x":[24535]},{"a":24543,"t":"code","b":[208,5],"m":"bne","o":"b_5FE6","oa":24550},{"a":24545,"t":"code","b":[169,23],"m":"lda","o":"#$17"},{"a":24547,"l":"b_5FE3","t":"code","b":[157,0,56],"m":"sta","o":"terrain_map_row0,x","oa":14336,"x":[24539]},{"a":24550,"l":"b_5FE6","t":"code","b":[232],"m":"inx","x":[24543]},{"a":24551,"t":"code","b":[208,233],"m":"bne","o":"b_5FD2","oa":24530},{"a":24553,"t":"code","b":[96],"m":"rts"},{"a":24554,"t":"gap","n":22},{"a":24576,"l":"gas_bar_buffer","c":"Nine-byte staging buffer for the GAS gauge in the status panel; only $6000-$6008 is real, the rest of this span is RAM the game never writes. $4EA0 fills the nine bytes with $20 (space), then writes $A0, a solid block, into the first $17 of them - $17 is the fuel level, 0 to 9, and reads 9 in the snapshot - and $B4, a part block, into the cell after them whenever the tank is not full, before copying all nine to screen $078F-$0797, row 22 columns 31-39, under the GAS caption. The same loop sets colour RAM $DB8F-$DB97 from $2E.","t":"byte","b":[160,160,160,160,160,160,160,160],"x":[20134,20153,20173,20178]},{"a":24584,"t":"byte","b":[160,255,0,0,0,0,255,255]},{"a":24592,"t":"byte","b":[255,255,0,0,0,0,255,255]},{"a":24600,"t":"byte","b":[255,255,0,0,0,0,223,255]},{"a":24608,"t":"byte","b":[255,255,0,8,0,0,255,255]},{"a":24616,"t":"byte","b":[255,255,0,0,0,0,255,255]},{"a":24624,"t":"byte","b":[255,255,0,0,0,1,255,255]},{"a":24632,"t":"byte","b":[255,255,0,0,0,0,255,255]},{"a":24640,"t":"gap","n":960},{"a":25600,"l":"initfill_6400","c":"Start of a 320-byte area, $6400-$653F, that the new-game reset at $5220 (reached from $414D and $1B6F) fills with $0B, the same code the world map at $3800 uses for plain desert. This first 64 bytes are nothing but that fill. No instruction anywhere in the tracked image reads a byte of $6400-$65FF, so what the area is for is not established; it may be a buffer of the Remember crack rather than of the game.","t":"byte","b":[11,11,11,11,11,11,11,11],"x":[21028]},{"a":25608,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":25616,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":25624,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":25632,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":25640,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":25648,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":25656,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":25664,"t":"gap","n":71},{"a":25735,"l":"initfill_hole_1","c":"Five bytes, $6487-$648B, that $5220 zeroes inside the $0B fill at $524A, followed by more fill to $649F. It is the first of three such holes written by one loop; the second is $50 bytes further on at $64D7 and the third, by that spacing, should be at $6527 - but the third store at $5250 writes $6627 instead, and $6527-$652B in the snapshot is still $0B. Nothing reads these bytes.","t":"byte","b":[0,0,0,0,0,11,11,11],"x":[21066]},{"a":25743,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":25751,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":25759,"t":"byte","b":[11]},{"a":25760,"l":"initfill_64A0","c":"The second of the two overlapping stores that lay down the $0B fill: $5227 writes $64A0,x while $5224 writes $6400,x, both for x = 0..$9F, so together they cover $6400-$653F exactly once. This span is plain fill up to the hole at $64D7. Read by nothing in the tracked image.","t":"byte","b":[11,11,11,11,11,11,11,11],"x":[21031]},{"a":25768,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":25776,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":25784,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":25792,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":25800,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":25808,"t":"byte","b":[11,11,11,11,11,11,11]},{"a":25815,"l":"initfill_hole_2","c":"The second five-byte hole $5220 zeroes in the fill, $64D7-$64DB, exactly $50 past the one at $6487. The rest of this span is $0B fill, including $6527-$652B, which the third pass of that loop was evidently meant to zero but did not. Nothing reads these bytes.","t":"byte","b":[0,0,0,0,0,11,11,11],"x":[21069]},{"a":25823,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":25831,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":25839,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":25847,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":25855,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":25863,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":25871,"t":"byte","b":[11,11,11,11,11,11,11,11]},{"a":25879,"t":"gap","n":109},{"a":25988,"l":"initrec_tag_1","c":"One byte, set to 1 by $5231 in the new-game reset. It is the first of three single-byte tags written $50 apart - $6584 = 1, $65D4 = 2, $6624 = 3 - each immediately followed by $AE. The three look like index fields of three records, but no instruction in the image reads them back, so what the records hold is not established.","t":"byte","b":[1],"x":[21041]},{"a":25989,"l":"initrec_value_1","c":"Set to $AE by $523E: the byte that follows index tag 1 at $6584, the same $AE that follows tags 2 and 3. Only this one byte of the span is written - $6586 onwards to $65D3 is RAM the game never touches, and the snapshot shows VICE's $FF/$00 power-on filler there. Never read back.","t":"byte","b":[174,255,255,255,255,0,0,0],"x":[21054]},{"a":25997,"t":"byte","b":[0,255,255,255,255,0,0,0]},{"a":26005,"t":"byte","b":[0,255,255,255,255,0,0,0]},{"a":26013,"t":"byte","b":[0,255,255,255,255,0,0,0]},{"a":26021,"t":"byte","b":[0,255,255,255,255,0,0,0]},{"a":26029,"t":"byte","b":[0,255,255,255,255,0,0,0]},{"a":26037,"t":"byte","b":[0,255,255,255,255,0,0,128]},{"a":26045,"t":"byte","b":[0,255,255,255,255,0,0,0]},{"a":26053,"t":"gap","n":15},{"a":26068,"l":"initrec_tag_2","c":"Set to 2 by $5235: the middle of the three index tags $5220 writes at $6584, $65D4 and $6624. Like the other two it is immediately followed by $AE, and like them it is never read back by any code in the image.","t":"byte","b":[2],"x":[21045]},{"a":26069,"l":"initrec_value_2","c":"Set to $AE by $5241, the companion of index tag 2 at $65D4 and the exact counterpart of $6585. The rest of this span, up to tag 3 at $6624, is untouched power-on RAM. Never read back.","t":"byte","b":[174,255,255,255,255,0,0,0],"x":[21057]},{"a":26077,"t":"byte","b":[0,255,255,255,255,0,0,0]},{"a":26085,"t":"byte","b":[0,255,255,255,255,0,0,0]},{"a":26093,"t":"byte","b":[0,255,255,255,255,0,0,0]},{"a":26101,"t":"byte","b":[0,255,255,255,255,0,0,0]},{"a":26109,"t":"byte","b":[0,255,255,255,255,0,0,0]},{"a":26117,"t":"byte","b":[0,255,255,255,255,0,0,0]},{"a":26125,"t":"byte","b":[0,255,255,255,255,0,0,0]},{"a":26133,"t":"gap","n":15},{"a":26148,"l":"initrec_tag_3","c":"Set to 3 by $5239, the last of the three index tags. It is the one whose five-byte zeroed field went astray: $5250 writes $6627,x where the $50 spacing of $6487 and $64D7 calls for $6527, so this record's field sits outside the filled area and $6527-$652B was left holding $0B.","t":"byte","b":[3],"x":[21049]},{"a":26149,"l":"initrec_value_3","c":"Set to $AE by $5244, the companion of index tag 3 at $6624, matching $6585 and $65D5. Never read back.","t":"byte","b":[174,255],"x":[21060]},{"a":26151,"l":"initrec_stray_zero_field","c":"Five bytes zeroed by $5250, in the same loop that zeroes $6487 and $64D7. Almost certainly misaddressed: the other two holes are $50 apart inside the $0B-filled area $6400-$653F, so the third belongs at $6527, and the snapshot confirms $6527-$652B was left at $0B. $6627 itself lies in RAM nothing else in the game touches, and the rest of this span is VICE's power-on $FF/$00 filler, not data.","t":"byte","b":[0,0,0,0,0,0,0,255],"x":[21072]},{"a":26159,"t":"byte","b":[255,255,255,0,0,0,0,255]},{"a":26167,"t":"byte","b":[255,255,255,0,0,0,0,253]},{"a":26175,"t":"byte","b":[255,255,255,0,0,0,0,255]},{"a":26183,"t":"byte","b":[255,255,255,0,0,0,0,255]},{"a":26191,"t":"byte","b":[255,255,255,0,0,0,0,255]},{"a":26199,"t":"byte","b":[255,255,255,0,0,0,0,255]},{"a":26207,"t":"byte","b":[255,255,255,0,0,0,0,255]},{"a":26215,"t":"gap","n":39321}]}