{
 "schema": 1,
 "platform": "c64",
 "game": "uridium",
 "build": "Hewson's disk release, a GCR image of the protected original (disk name gma240286); booted through a copy with track 39's sync marks restored (orientation.md)",
 "source": "regenerator2000 live",
 "regions": {
  "exclude": [
   [
    256,
    511,
    "stack"
   ],
   [
    53248,
    53759,
    "I/O and colour RAM"
   ],
   [
    18432,
    19455,
    "screen RAM"
   ],
   [
    1024,
    2047,
    "not the game's: the loader's loading screen (\"GMA86\", \"URIDIUM\", \"BY ANDREW BRAYBROOK\", \"PUBLISHED BY HEWSON CONSULTANTS LTD\"), left in the default screen; the game shows video bank 1 only"
   ],
   [
    2048,
    2303,
    "runtime: the random byte table, a copy of the sound driver's 256 bytes at $1000 made by game_start and stirred with noise by stir_random"
   ],
   [
    18432,
    19455,
    "runtime: the screen and the sprite pointers, drawn by the code (draw_map, print_string); the loaded screen here is the fuel rod chamber, which game_start copies to $A600 before the code ever reads it"
   ],
   [
    23552,
    26623,
    "runtime: the shadow shapes $70-$9F, built from the Manta's frames at $5000 by thicken_shapes at every restart; the loaded bytes here are the Dreadnought tile sets, which game_start has moved to $D400"
   ],
   [
    31744,
    32767,
    "runtime: the playfield characters $80-$FF, copied in for each level from a tile set at $D400, $D800 or $DC00 (copy_tile_set), or from $D200 for the chamber"
   ],
   [
    32768,
    33279,
    "runtime and leftover: the load's copy of $E000-$E1FF, left behind by game_start, with the reset vectors restart writes at $8000 and the giant message's piece list build_message writes from $8010"
   ],
   [
    33280,
    41983,
    "runtime: the Dreadnought map, 17 rows of 512 columns, built at every level start by build_map"
   ],
   [
    44544,
    45055,
    "leftover: the load's copy of $CE00-$CFFF (level 15's map list), moved there by game_start; the code reads that copy"
   ],
   [
    48896,
    49151,
    "not loaded: the RAM fill pattern above the end of the file"
   ],
   [
    51375,
    52735,
    "unused: zeros after the enemy paths, inside the block game_start copies to $C000"
   ],
   [
    53248,
    53759,
    "unused: the RAM fill pattern under the I/O chips, below the chamber's characters"
   ],
   [
    61427,
    61439,
    "unused: zeros after the level names"
   ],
   [
    65474,
    65529,
    "unused: the RAM fill pattern at the top of the last level list's page, below the hardware vectors"
   ]
  ],
  "extra": [
   [
    30720,
    32767,
    "character set"
   ]
  ]
 },
 "blocks": [
  {
   "start": 0,
   "end": 511,
   "type": "Undefined"
  },
  {
   "start": 512,
   "end": 623,
   "type": "Byte"
  },
  {
   "start": 624,
   "end": 2303,
   "type": "Undefined"
  },
  {
   "start": 2304,
   "end": 4416,
   "type": "Code"
  },
  {
   "start": 4417,
   "end": 4429,
   "type": "Byte"
  },
  {
   "start": 4430,
   "end": 12553,
   "type": "Code"
  },
  {
   "start": 12554,
   "end": 14052,
   "type": "Byte"
  },
  {
   "start": 14053,
   "end": 14066,
   "type": "Address"
  },
  {
   "start": 14067,
   "end": 14609,
   "type": "Byte"
  },
  {
   "start": 14610,
   "end": 14610,
   "type": "Undefined"
  },
  {
   "start": 14611,
   "end": 16127,
   "type": "Byte"
  },
  {
   "start": 16128,
   "end": 16342,
   "type": "Code"
  },
  {
   "start": 16343,
   "end": 16383,
   "type": "Undefined"
  },
  {
   "start": 16384,
   "end": 18431,
   "type": "Byte"
  },
  {
   "start": 18432,
   "end": 19455,
   "type": "Undefined"
  },
  {
   "start": 19456,
   "end": 23551,
   "type": "Byte"
  },
  {
   "start": 23552,
   "end": 26623,
   "type": "Undefined"
  },
  {
   "start": 26624,
   "end": 31743,
   "type": "Byte"
  },
  {
   "start": 31744,
   "end": 41983,
   "type": "Undefined"
  },
  {
   "start": 41984,
   "end": 42335,
   "type": "Byte"
  },
  {
   "start": 42336,
   "end": 42495,
   "type": "Undefined"
  },
  {
   "start": 42496,
   "end": 44543,
   "type": "Byte"
  },
  {
   "start": 44544,
   "end": 45055,
   "type": "Undefined"
  },
  {
   "start": 45056,
   "end": 45140,
   "type": "Code"
  },
  {
   "start": 45141,
   "end": 45148,
   "type": "Byte"
  },
  {
   "start": 45149,
   "end": 45668,
   "type": "Code"
  },
  {
   "start": 45669,
   "end": 45681,
   "type": "Byte"
  },
  {
   "start": 45682,
   "end": 45919,
   "type": "Code"
  },
  {
   "start": 45920,
   "end": 48895,
   "type": "Byte"
  },
  {
   "start": 48896,
   "end": 49151,
   "type": "Undefined"
  },
  {
   "start": 49152,
   "end": 51374,
   "type": "Byte"
  },
  {
   "start": 51375,
   "end": 52735,
   "type": "Undefined"
  },
  {
   "start": 52736,
   "end": 53247,
   "type": "Byte"
  },
  {
   "start": 53248,
   "end": 53759,
   "type": "Undefined"
  },
  {
   "start": 53760,
   "end": 61426,
   "type": "Byte"
  },
  {
   "start": 61427,
   "end": 61439,
   "type": "Undefined"
  },
  {
   "start": 61440,
   "end": 65473,
   "type": "Byte"
  },
  {
   "start": 65474,
   "end": 65529,
   "type": "Undefined"
  },
  {
   "start": 65530,
   "end": 65535,
   "type": "Byte"
  }
 ],
 "symbols": [
  {
   "address": 0,
   "name": "cpu_ddr",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 1,
   "name": "cpu_port",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 2,
   "name": "spr_mask",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 3,
   "name": "spr_unmask",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 4,
   "name": "spr_num",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5,
   "name": "spr_x",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6,
   "name": "spr_xhi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7,
   "name": "spr_y",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8,
   "name": "spr_on",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9,
   "name": "spr_expy",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10,
   "name": "spr_prio",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11,
   "name": "spr_mc",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 12,
   "name": "spr_expx",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 13,
   "name": "spr_col",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14,
   "name": "spr_shape",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 15,
   "name": "tmp0",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 16,
   "name": "tmp1",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 17,
   "name": "tmp2",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 18,
   "name": "ptr_a",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 19,
   "name": "ptr_a_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 20,
   "name": "ptr_b",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21,
   "name": "ptr_b_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 22,
   "name": "stick_v",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 23,
   "name": "stick_h",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 24,
   "name": "fire",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 25,
   "name": "keys",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 26,
   "name": "ptr_c",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 27,
   "name": "ptr_c_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 28,
   "name": "ptr_d",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 29,
   "name": "ptr_d_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 30,
   "name": "port_cell",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 31,
   "name": "port_cell_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 32,
   "name": "score",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 33,
   "name": "score_1",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 34,
   "name": "score_2",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 35,
   "name": "score_3",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 36,
   "name": "wave_index",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 37,
   "name": "lives",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 38,
   "name": "level",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 39,
   "name": "next_level",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 40,
   "name": "difficulty",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 41,
   "name": "map_pos",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 42,
   "name": "map_pos_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 43,
   "name": "saved_frame",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 44,
   "name": "fine_scroll",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 45,
   "name": "speed_frac",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 46,
   "name": "speed",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 47,
   "name": "frame_flag",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 48,
   "name": "map_col_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 49,
   "name": "map_col",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50,
   "name": "manta_lost",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 51,
   "name": "manta_y",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 52,
   "name": "manta_vy",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 53,
   "name": "vy_min",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 54,
   "name": "vy_max",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 55,
   "name": "speed_min",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 56,
   "name": "speed_max",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 57,
   "name": "accel_a",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 58,
   "name": "accel_b",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 59,
   "name": "accel_c",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60,
   "name": "accel_d",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 61,
   "name": "manta_height",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 62,
   "name": "speed_size",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 63,
   "name": "push",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 64,
   "name": "manta_frame",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 65,
   "name": "shadow_frame",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 66,
   "name": "anim_ptr",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 67,
   "name": "anim_ptr_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 68,
   "name": "anim_step",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 69,
   "name": "manta_state",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 70,
   "name": "manta_request",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 71,
   "name": "anim_climbs",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 72,
   "name": "fire_state",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 73,
   "name": "fire_hold",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 74,
   "name": "playfield_bg",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 75,
   "name": "level_mc2",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 76,
   "name": "level_mc1",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 77,
   "name": "map_colour",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 78,
   "name": "manta_mc",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 79,
   "name": "enemy_colour",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 80,
   "name": "vis_left",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 81,
   "name": "vis_right",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 82,
   "name": "under_manta",
   "type": "ZeroPagePointer",
   "kind": "user"
  },
  {
   "address": 83,
   "name": "under_manta_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 84,
   "name": "ports",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 85,
   "name": "port_colour_now",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 86,
   "name": "collide_shape",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 87,
   "name": "collide_narrow",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 88,
   "name": "star_colour",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 89,
   "name": "counter",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 90,
   "name": "game_mode",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 91,
   "name": "status_msg",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 92,
   "name": "players",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 93,
   "name": "player",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 94,
   "name": "demo_v",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 95,
   "name": "auto_h",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 96,
   "name": "pause_keys",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 97,
   "name": "mono",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 98,
   "name": "frame",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 99,
   "name": "enemy_dx_a",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 100,
   "name": "enemy_dx_a_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 101,
   "name": "bullet_dx",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 102,
   "name": "enemy_dx_b",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 103,
   "name": "enemy_dx_b_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 104,
   "name": "filler_wave",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 105,
   "name": "fire_chance",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 106,
   "name": "bullet_shape",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 107,
   "name": "wave_dir",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 108,
   "name": "enemies_up",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 109,
   "name": "wave_list",
   "type": "ZeroPagePointer",
   "kind": "user"
  },
  {
   "address": 110,
   "name": "wave_list_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 111,
   "name": "path_flags",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 112,
   "name": "paths",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 113,
   "name": "zpf_71",
   "type": "ZeroPageField",
   "kind": "auto"
  },
  {
   "address": 124,
   "name": "wave_spacing",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 125,
   "name": "wave_delay",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 126,
   "name": "wave_type",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 127,
   "name": "wave_score",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 128,
   "name": "enemy_dy_up",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 129,
   "name": "enemy_dy_up_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 130,
   "name": "enemy_dy_down",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 131,
   "name": "enemy_dy_down_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 132,
   "name": "wave_vx",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 133,
   "name": "landing",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 134,
   "name": "under_char",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 135,
   "name": "formations",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 136,
   "name": "wave_left",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 137,
   "name": "vapour",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 138,
   "name": "vapour_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 141,
   "name": "tries",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 142,
   "name": "demo_fire",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 143,
   "name": "count",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 144,
   "name": "sound_mode",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 145,
   "name": "sound_req",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 146,
   "name": "sound_req_2",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 147,
   "name": "sound_req_3",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 148,
   "name": "cassette_flag",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 149,
   "name": "music_volume",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 150,
   "name": "sound_now",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 151,
   "name": "sound_now_2",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 152,
   "name": "sound_now_3",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 153,
   "name": "gate_time",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 156,
   "name": "waveform",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 159,
   "name": "voice",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 160,
   "name": "voice_block",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 161,
   "name": "voice_sid",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 162,
   "name": "snd_ptr",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 163,
   "name": "snd_ptr_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 164,
   "name": "instrument",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 167,
   "name": "rod_flash",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 168,
   "name": "countdown",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 169,
   "name": "rod_step",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 170,
   "name": "rod_value",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 171,
   "name": "rod_lit",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 172,
   "name": "quit_side",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 173,
   "name": "rod_bonus",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 174,
   "name": "rod_speed",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 176,
   "name": "copy_dst",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 177,
   "name": "copy_dst_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 178,
   "name": "copy_src",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 179,
   "name": "copy_src_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 180,
   "name": "print_row",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 181,
   "name": "print_col",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 182,
   "name": "print_char",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 183,
   "name": "init_b7",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 184,
   "name": "init_b8",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 186,
   "name": "print_index",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 187,
   "name": "init_bb",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 188,
   "name": "init_bc",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 190,
   "name": "string_ptr",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 191,
   "name": "string_ptr_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 192,
   "name": "v_freq",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 193,
   "name": "v_freq_hi",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 194,
   "name": "v_fstep",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 195,
   "name": "v_fstep_hi",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 196,
   "name": "v_steptime",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 197,
   "name": "v_steptime_reload",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 198,
   "name": "v_duration",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 199,
   "name": "v_pulse",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 200,
   "name": "v_pulse_hi",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 201,
   "name": "v_pstep",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 202,
   "name": "v_pstep_hi",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 203,
   "name": "v_stepmode",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 204,
   "name": "v_restart",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 205,
   "name": "v_restart_hi",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 206,
   "name": "v_next",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 239,
   "name": "volume",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 240,
   "name": "note_freq",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 241,
   "name": "note_freq_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 242,
   "name": "music_tempo",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 243,
   "name": "pattern_ptr",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 246,
   "name": "note_time",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 249,
   "name": "octave",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 252,
   "name": "pattern_ptr_hi",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 512,
   "name": "port_half_col",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 528,
   "name": "port_col",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 544,
   "name": "port_row",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 560,
   "name": "port_col_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 576,
   "name": "port_screen_col",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 592,
   "name": "player1_state",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 597,
   "name": "a_0255",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 608,
   "name": "player2_state",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 613,
   "name": "a_0265",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 2048,
   "name": "a_0800",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 2304,
   "name": "game_start",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2326,
   "name": "b_0916",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2461,
   "name": "restart",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2592,
   "name": "title",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 2621,
   "name": "b_0A3D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2671,
   "name": "j_0A6F",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 2772,
   "name": "b_0AD4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2797,
   "name": "b_0AED",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2917,
   "name": "new_game",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 2919,
   "name": "b_0B67",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2977,
   "name": "next_turn",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 2991,
   "name": "b_0BAF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3020,
   "name": "b_0BCC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3048,
   "name": "b_0BE8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3058,
   "name": "b_0BF2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3081,
   "name": "b_0C09",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3091,
   "name": "j_0C13",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 3097,
   "name": "start_life",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 3167,
   "name": "b_0C5F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3174,
   "name": "j_0C66",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 3185,
   "name": "b_0C71",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3252,
   "name": "j_0CB4",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 3281,
   "name": "b_0CD1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3287,
   "name": "b_0CD7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3312,
   "name": "b_0CF0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3321,
   "name": "play_loop",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 3366,
   "name": "a_0D26",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 3367,
   "name": "a_0D27",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 3393,
   "name": "b_0D41",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3397,
   "name": "life_over",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 3426,
   "name": "b_0D62",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3433,
   "name": "b_0D69",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3445,
   "name": "b_0D75",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3506,
   "name": "b_0DB2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3513,
   "name": "j_0DB9",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 3543,
   "name": "b_0DD7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3554,
   "name": "b_0DE2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3560,
   "name": "b_0DE8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3571,
   "name": "b_0DF3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3586,
   "name": "b_0E02",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3606,
   "name": "b_0E16",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3609,
   "name": "end_level",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 3619,
   "name": "sound_frame",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3630,
   "name": "b_0E2E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3637,
   "name": "b_0E35",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3644,
   "name": "b_0E3C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3657,
   "name": "b_0E49",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3679,
   "name": "b_0E5F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3687,
   "name": "b_0E67",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3690,
   "name": "r_0E6A",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 3691,
   "name": "music_tick",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 3698,
   "name": "b_0E72",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3713,
   "name": "j_0E81",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 3735,
   "name": "b_0E97",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3763,
   "name": "b_0EB3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3767,
   "name": "j_0EB7",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 3775,
   "name": "b_0EBF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3812,
   "name": "b_0EE4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3829,
   "name": "b_0EF5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3852,
   "name": "b_0F0C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3856,
   "name": "j_0F10",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 3874,
   "name": "b_0F22",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3921,
   "name": "j_0F51",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 3932,
   "name": "voices_frame",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 3935,
   "name": "a_0F5F",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 3943,
   "name": "b_0F67",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3954,
   "name": "b_0F72",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3960,
   "name": "b_0F78",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3980,
   "name": "j_0F8C",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 3992,
   "name": "b_0F98",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4038,
   "name": "b_0FC6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4055,
   "name": "b_0FD7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4077,
   "name": "b_0FED",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4133,
   "name": "b_1025",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4141,
   "name": "j_102D",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 4159,
   "name": "j_103F",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 4172,
   "name": "b_104C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4188,
   "name": "r_105C",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 4189,
   "name": "start_effect",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4241,
   "name": "b_1091",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4260,
   "name": "r_10A4",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 4261,
   "name": "silence_voice",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4282,
   "name": "start_voice",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4293,
   "name": "b_10C5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4307,
   "name": "b_10D3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4352,
   "name": "voice_regs",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4360,
   "name": "sound_reset",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4368,
   "name": "b_1110",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4395,
   "name": "noise_on",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4417,
   "name": "sid_voice_offsets",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4420,
   "name": "f_1144",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 4423,
   "name": "f_1147",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 4426,
   "name": "f_114A",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 4430,
   "name": "fuel_rod_chamber",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4459,
   "name": "b_116B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4463,
   "name": "b_116F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4512,
   "name": "b_11A0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4516,
   "name": "b_11A4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4582,
   "name": "j_11E6",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 4613,
   "name": "b_1205",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4617,
   "name": "b_1209",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4656,
   "name": "b_1230",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4663,
   "name": "b_1237",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4699,
   "name": "b_125B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4734,
   "name": "b_127E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4740,
   "name": "b_1284",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4772,
   "name": "b_12A4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4807,
   "name": "b_12C7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4810,
   "name": "j_12CA",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 4821,
   "name": "b_12D5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4838,
   "name": "b_12E6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4850,
   "name": "two_digits",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4861,
   "name": "b_12FD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4870,
   "name": "b_1306",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4873,
   "name": "b_1309",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4882,
   "name": "r_1312",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 4883,
   "name": "draw_rod_value",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4893,
   "name": "b_131D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4907,
   "name": "b_132B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4921,
   "name": "erase_rod_value",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4923,
   "name": "b_133B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4935,
   "name": "chamber_tick",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5005,
   "name": "r_138D",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 5006,
   "name": "copy_logo_glyphs",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5008,
   "name": "b_1390",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5025,
   "name": "b_13A1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5041,
   "name": "frame_tick",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5055,
   "name": "frame_autopilot",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 5099,
   "name": "frame_coast",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 5139,
   "name": "dreadnought_destruct",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5155,
   "name": "b_1423",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5175,
   "name": "b_1437",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5179,
   "name": "b_143B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5201,
   "name": "b_1451",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5235,
   "name": "b_1473",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5255,
   "name": "b_1487",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5380,
   "name": "b_1504",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5391,
   "name": "b_150F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5438,
   "name": "b_153E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5466,
   "name": "b_155A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5485,
   "name": "b_156D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5506,
   "name": "b_1582",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5523,
   "name": "b_1593",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5539,
   "name": "b_15A3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5554,
   "name": "b_15B2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5565,
   "name": "out_of_time",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 5588,
   "name": "shift_rows_left",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5612,
   "name": "b_15EC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5614,
   "name": "b_15EE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5651,
   "name": "b_1613",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5662,
   "name": "b_161E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5671,
   "name": "shift_rows_right",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5691,
   "name": "b_163B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5693,
   "name": "b_163D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5721,
   "name": "b_1659",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5732,
   "name": "b_1664",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5741,
   "name": "landing_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5749,
   "name": "r_1675",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 5750,
   "name": "b_1676",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5763,
   "name": "b_1683",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5786,
   "name": "b_169A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5801,
   "name": "b_16A9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5804,
   "name": "b_16AC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5820,
   "name": "land_now_flash",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 5842,
   "name": "vaporise_column",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5860,
   "name": "b_16E4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5862,
   "name": "b_16E6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5881,
   "name": "b_16F9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5898,
   "name": "b_170A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5915,
   "name": "b_171B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5946,
   "name": "r_173A",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 5947,
   "name": "random_heights",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5961,
   "name": "b_1749",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5981,
   "name": "b_175D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5989,
   "name": "b_1765",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5998,
   "name": "count_bonus",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6014,
   "name": "j_177E",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 6028,
   "name": "b_178C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6031,
   "name": "j_178F",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 6045,
   "name": "b_179D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6067,
   "name": "b_17B3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6091,
   "name": "r_17CB",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 6092,
   "name": "use_title_irq",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6114,
   "name": "use_play_irq",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6136,
   "name": "enter_hiscore",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6156,
   "name": "j_180C",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 6158,
   "name": "b_180E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6170,
   "name": "b_181A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6175,
   "name": "b_181F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6177,
   "name": "b_1821",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6218,
   "name": "j_184A",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 6225,
   "name": "b_1851",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6289,
   "name": "b_1891",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6304,
   "name": "b_18A0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6322,
   "name": "b_18B2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6334,
   "name": "j_18BE",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 6347,
   "name": "j_18CB",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 6361,
   "name": "b_18D9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6368,
   "name": "b_18E0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6375,
   "name": "j_18E7",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 6382,
   "name": "b_18EE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6384,
   "name": "b_18F0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6397,
   "name": "b_18FD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6408,
   "name": "b_1908",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6413,
   "name": "b_190D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6426,
   "name": "enter_letter",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6434,
   "name": "b_1922",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6460,
   "name": "b_193C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6462,
   "name": "b_193E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6488,
   "name": "b_1958",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6492,
   "name": "b_195C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6509,
   "name": "b_196D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6515,
   "name": "r_1973",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 6516,
   "name": "cycle_colours",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6583,
   "name": "print_lives",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6600,
   "name": "b_19C8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6618,
   "name": "b_19DA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6627,
   "name": "b_19E3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6645,
   "name": "add_score",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6689,
   "name": "b_1A21",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6710,
   "name": "b_1A36",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6712,
   "name": "waves_start",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6740,
   "name": "copy_tile_set",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6773,
   "name": "wave_control",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6803,
   "name": "b_1A93",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6807,
   "name": "r_1A97",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 6808,
   "name": "new_wave",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 6841,
   "name": "b_1AB9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6847,
   "name": "j_1ABF",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 6966,
   "name": "b_1B36",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6981,
   "name": "b_1B45",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6989,
   "name": "b_1B4D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7003,
   "name": "b_1B5B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7043,
   "name": "j_1B83",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 7061,
   "name": "b_1B95",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7104,
   "name": "b_1BC0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7115,
   "name": "b_1BCB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7156,
   "name": "b_1BF4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7165,
   "name": "enemies_frame",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7182,
   "name": "b_1C0E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7212,
   "name": "a_1C2C",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 7213,
   "name": "a_1C2D",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 7214,
   "name": "b_1C2E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7223,
   "name": "explosion_move",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7255,
   "name": "b_1C57",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7258,
   "name": "scroll_sprite_x",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7271,
   "name": "r_1C67",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 7272,
   "name": "b_1C68",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7283,
   "name": "fighter_move",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7308,
   "name": "b_1C8C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7324,
   "name": "b_1C9C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7335,
   "name": "b_1CA7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7354,
   "name": "b_1CBA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7390,
   "name": "b_1CDE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7421,
   "name": "j_1CFD",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 7447,
   "name": "b_1D17",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7470,
   "name": "b_1D2E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7473,
   "name": "b_1D31",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7489,
   "name": "b_1D41",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7492,
   "name": "b_1D44",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7518,
   "name": "b_1D5E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7543,
   "name": "b_1D77",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7563,
   "name": "b_1D8B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7592,
   "name": "b_1DA8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7600,
   "name": "j_1DB0",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 7627,
   "name": "j_1DCB",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 7645,
   "name": "b_1DDD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7667,
   "name": "b_1DF3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7674,
   "name": "b_1DFA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7692,
   "name": "b_1E0C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7725,
   "name": "b_1E2D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7755,
   "name": "b_1E4B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7764,
   "name": "b_1E54",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7784,
   "name": "j_1E68",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 7808,
   "name": "b_1E80",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7815,
   "name": "b_1E87",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7827,
   "name": "b_1E93",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7833,
   "name": "b_1E99",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7842,
   "name": "j_1EA2",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 7846,
   "name": "remove_if_gone",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 7871,
   "name": "b_1EBF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7875,
   "name": "bullet_move",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7905,
   "name": "b_1EE1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7908,
   "name": "b_1EE4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7924,
   "name": "move_by_velocity",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7951,
   "name": "enemy_fire",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7953,
   "name": "b_1F11",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7964,
   "name": "b_1F1C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8034,
   "name": "mine_appear",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8060,
   "name": "b_1F7C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8063,
   "name": "spawn_mine",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8082,
   "name": "b_1F92",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8090,
   "name": "r_1F9A",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 8091,
   "name": "b_1F9B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8093,
   "name": "b_1F9D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8102,
   "name": "b_1FA6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8176,
   "name": "hits_manta",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8223,
   "name": "b_201F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8225,
   "name": "mine_move",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8255,
   "name": "b_203F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8268,
   "name": "b_204C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8271,
   "name": "b_204F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8287,
   "name": "home_in",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8308,
   "name": "b_2074",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8314,
   "name": "j_207A",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 8331,
   "name": "b_208B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8337,
   "name": "b_2091",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8357,
   "name": "b_20A5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8374,
   "name": "j_20B6",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 8388,
   "name": "b_20C4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8402,
   "name": "r_20D2",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 8403,
   "name": "b_20D3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8414,
   "name": "b_20DE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8428,
   "name": "level_setup",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8528,
   "name": "title_page",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8536,
   "name": "b_2158",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8573,
   "name": "r_217D",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 8574,
   "name": "message_page",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8578,
   "name": "b_2182",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8628,
   "name": "r_21B4",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 8629,
   "name": "demo",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8717,
   "name": "b_220D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8726,
   "name": "b_2216",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8788,
   "name": "a_2254",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 8789,
   "name": "a_2255",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 8827,
   "name": "r_227B",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 8828,
   "name": "b_227C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8839,
   "name": "demo_stick",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8858,
   "name": "b_229A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8882,
   "name": "b_22B2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8886,
   "name": "b_22B6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8910,
   "name": "b_22CE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8914,
   "name": "r_22D2",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 8915,
   "name": "status_line",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8956,
   "name": "b_22FC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8981,
   "name": "b_2315",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8988,
   "name": "r_231C",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 8989,
   "name": "b_231D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8997,
   "name": "b_2325",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9005,
   "name": "b_232D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9013,
   "name": "b_2335",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9026,
   "name": "option_keys",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9041,
   "name": "b_2351",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9076,
   "name": "j_2374",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 9083,
   "name": "b_237B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9097,
   "name": "b_2389",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9111,
   "name": "clear_playfield",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9125,
   "name": "colour_rows",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9127,
   "name": "b_23A7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9141,
   "name": "colour_keys",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9174,
   "name": "r_23D6",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 9175,
   "name": "b_23D7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9198,
   "name": "rts_23ee",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9199,
   "name": "colour_icons",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9218,
   "name": "b_2402",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9237,
   "name": "build_message",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9243,
   "name": "b_241B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9266,
   "name": "b_2432",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9274,
   "name": "b_243A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9293,
   "name": "b_244D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9299,
   "name": "b_2453",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9307,
   "name": "manta_explodes",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9352,
   "name": "j_2488",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 9360,
   "name": "b_2490",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9407,
   "name": "b_24BF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9414,
   "name": "b_24C6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9429,
   "name": "b_24D5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9464,
   "name": "b_24F8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9475,
   "name": "b_2503",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9478,
   "name": "b_2506",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9480,
   "name": "j_2508",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 9493,
   "name": "b_2515",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9496,
   "name": "j_2518",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 9507,
   "name": "r_2523",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 9508,
   "name": "port_colour",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9522,
   "name": "star_rows",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9548,
   "name": "b_254C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9573,
   "name": "b_2565",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9580,
   "name": "b_256C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9590,
   "name": "manta_vertical",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9594,
   "name": "b_257A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9614,
   "name": "r_258E",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 9615,
   "name": "b_258F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9630,
   "name": "b_259E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9643,
   "name": "b_25AB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9648,
   "name": "b_25B0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9657,
   "name": "b_25B9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9686,
   "name": "b_25D6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9695,
   "name": "b_25DF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9701,
   "name": "thicken_shapes",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9719,
   "name": "b_25F7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9751,
   "name": "b_2617",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9767,
   "name": "b_2627",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9781,
   "name": "manta_speed",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9808,
   "name": "b_2650",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9817,
   "name": "r_2659",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 9818,
   "name": "b_265A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9832,
   "name": "b_2668",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9849,
   "name": "j_2679",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 9854,
   "name": "b_267E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9868,
   "name": "manta_limits",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9879,
   "name": "b_2697",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9885,
   "name": "b_269D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9899,
   "name": "b_26AB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9914,
   "name": "b_26BA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9922,
   "name": "b_26C2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9931,
   "name": "b_26CB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9937,
   "name": "b_26D1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9945,
   "name": "b_26D9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9963,
   "name": "b_26EB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9983,
   "name": "r_26FF",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 9984,
   "name": "b_2700",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10003,
   "name": "manta_animate",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10039,
   "name": "j_2737",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 10057,
   "name": "b_2749",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10062,
   "name": "b_274E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10071,
   "name": "b_2757",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10100,
   "name": "b_2774",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10107,
   "name": "b_277B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10131,
   "name": "b_2793",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10147,
   "name": "j_27A3",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 10197,
   "name": "manta_collide",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10223,
   "name": "b_27EF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10237,
   "name": "b_27FD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10253,
   "name": "b_280D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10273,
   "name": "b_2821",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10292,
   "name": "b_2834",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10296,
   "name": "r_2838",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 10297,
   "name": "launch_sequence",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10302,
   "name": "b_283E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10325,
   "name": "b_2855",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10336,
   "name": "b_2860",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10383,
   "name": "b_288F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10424,
   "name": "b_28B8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10464,
   "name": "b_28E0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10520,
   "name": "wait_frame",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10538,
   "name": "b_292A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10543,
   "name": "fire_control",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10550,
   "name": "a_2936",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 10562,
   "name": "r_2942",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 10563,
   "name": "b_2943",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10573,
   "name": "b_294D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10580,
   "name": "b_2954",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10585,
   "name": "manta_fire",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10643,
   "name": "r_2993",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 10644,
   "name": "free_bullet",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10655,
   "name": "b_299F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10657,
   "name": "launch_bullet",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10691,
   "name": "b_29C3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10719,
   "name": "b_29DF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10741,
   "name": "b_29F5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10767,
   "name": "j_2A0F",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 10775,
   "name": "draw_bullets",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10779,
   "name": "b_2A1B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10799,
   "name": "b_2A2F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10803,
   "name": "b_2A33",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10846,
   "name": "b_2A5E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10879,
   "name": "a_2A7F",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 10888,
   "name": "b_2A88",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10889,
   "name": "a_2A89",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 10890,
   "name": "a_2A8A",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 10912,
   "name": "a_2AA0",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 10915,
   "name": "b_2AA3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10937,
   "name": "b_2AB9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10941,
   "name": "b_2ABD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10953,
   "name": "bullet_step",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10970,
   "name": "b_2ADA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10985,
   "name": "hit_feature",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11025,
   "name": "j_2B11",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 11027,
   "name": "b_2B13",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11042,
   "name": "b_2B22",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11056,
   "name": "b_2B30",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11059,
   "name": "b_2B33",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11072,
   "name": "scroll_step",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11091,
   "name": "b_2B53",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11101,
   "name": "b_2B5D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11117,
   "name": "pause_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11141,
   "name": "b_2B85",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11163,
   "name": "j_2B9B",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 11198,
   "name": "rts_2bbe",
   "type": "Return",
   "kind": "user"
  },
  {
   "address": 11199,
   "name": "b_2BBF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11202,
   "name": "b_2BC2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11243,
   "name": "draw_map",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11293,
   "name": "b_2C1D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11295,
   "name": "b_2C1F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11296,
   "name": "a_2C20",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 11297,
   "name": "a_2C21",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 11299,
   "name": "a_2C23",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 11300,
   "name": "a_2C24",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 11330,
   "name": "b_2C42",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11366,
   "name": "index_pieces",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11376,
   "name": "b_2C70",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11401,
   "name": "b_2C89",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11428,
   "name": "r_2CA4",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 11429,
   "name": "clear_piece_index",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11432,
   "name": "b_2CA8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11442,
   "name": "build_map",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11469,
   "name": "b_2CCD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11473,
   "name": "b_2CD1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11496,
   "name": "b_2CE8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11524,
   "name": "b_2D04",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11529,
   "name": "b_2D09",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11543,
   "name": "b_2D17",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11561,
   "name": "j_2D29",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 11584,
   "name": "b_2D40",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11595,
   "name": "b_2D4B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11607,
   "name": "b_2D57",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11622,
   "name": "b_2D66",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11635,
   "name": "b_2D73",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11679,
   "name": "b_2D9F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11686,
   "name": "b_2DA6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11700,
   "name": "b_2DB4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11713,
   "name": "b_2DC1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11738,
   "name": "b_2DDA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11747,
   "name": "r_2DE3",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 11748,
   "name": "note_port",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11798,
   "name": "r_2E16",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 11799,
   "name": "make_stars",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11803,
   "name": "b_2E1B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11817,
   "name": "b_2E29",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11838,
   "name": "b_2E3E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11874,
   "name": "b_2E62",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11883,
   "name": "b_2E6B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11934,
   "name": "b_2E9E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11941,
   "name": "pick_star_row",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11945,
   "name": "b_2EA9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11955,
   "name": "b_2EB3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11965,
   "name": "r_2EBD",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 11966,
   "name": "pick_star_column",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11970,
   "name": "b_2EC2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11980,
   "name": "b_2ECC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11990,
   "name": "r_2ED6",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 11991,
   "name": "draw_stars",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11993,
   "name": "b_2ED9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12023,
   "name": "j_2EF7",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 12043,
   "name": "b_2F0B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12053,
   "name": "star_row",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12055,
   "name": "b_2F17",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12077,
   "name": "b_2F2D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12083,
   "name": "level_colours",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12108,
   "name": "b_2F4C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12119,
   "name": "b_2F57",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12123,
   "name": "b_2F5B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12125,
   "name": "b_2F5D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12189,
   "name": "read_pause_keys",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12231,
   "name": "r_2FC7",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 12232,
   "name": "draw_ports",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12236,
   "name": "b_2FCC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12258,
   "name": "b_2FE2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12285,
   "name": "b_2FFD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12288,
   "name": "r_3000",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 12289,
   "name": "b_3001",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12296,
   "name": "status_colours",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12310,
   "name": "b_3016",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12348,
   "name": "b_303C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12386,
   "name": "b_3062",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12422,
   "name": "stir_random",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12426,
   "name": "b_308A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12448,
   "name": "spread_font",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12468,
   "name": "b_30B4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12474,
   "name": "b_30BA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12504,
   "name": "b_30D8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12549,
   "name": "b_3105",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12554,
   "name": "chamber_speeds",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12574,
   "name": "star_masks",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12582,
   "name": "str_player1_label",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12592,
   "name": "str_player2_label",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12602,
   "name": "str_lives_1up",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12610,
   "name": "a_3142",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 12611,
   "name": "a_3143",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 12613,
   "name": "str_lives_2up",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12617,
   "name": "a_3149",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 12618,
   "name": "a_314A",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 12624,
   "name": "str_status_blank",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12638,
   "name": "str_land_now",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12650,
   "name": "status_colours_1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12690,
   "name": "status_colours_2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12730,
   "name": "status_colours_3",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12770,
   "name": "manoeuvre_sequences",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12902,
   "name": "seq_lo_left",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12924,
   "name": "seq_hi_left",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12946,
   "name": "seq_lo_right",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12964,
   "name": "seq_hi_right",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12982,
   "name": "rec_demo_manta",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13004,
   "name": "rec_launch_manta",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13015,
   "name": "rec_shadow",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13026,
   "name": "rec_explosion",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13037,
   "name": "manta_limits_table",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13045,
   "name": "loop_heights",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13062,
   "name": "launch_rec_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13070,
   "name": "a_330E",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 13071,
   "name": "a_330F",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 13072,
   "name": "launch_rec_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13080,
   "name": "a_3318",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 13081,
   "name": "a_3319",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 13082,
   "name": "rec_transporter",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13170,
   "name": "colour_schemes",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13171,
   "name": "f_3373",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 13217,
   "name": "f_33A1",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 13235,
   "name": "gun_a",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13254,
   "name": "f_33C6",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 13270,
   "name": "f_33D6",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 13281,
   "name": "gun_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13286,
   "name": "f_33E6",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 13288,
   "name": "f_33E8",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 13302,
   "name": "f_33F6",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 13327,
   "name": "colour_row_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13352,
   "name": "collide_shapes",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13398,
   "name": "feature_col",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13414,
   "name": "feature_row",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13430,
   "name": "feature_size",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13446,
   "name": "feature_score",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13462,
   "name": "player_template",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13471,
   "name": "message_text",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13507,
   "name": "f_34C3",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 13520,
   "name": "str_icon_2p_shared",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13531,
   "name": "str_icon_2p_two",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13541,
   "name": "str_icon_1p",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13553,
   "name": "str_icon_colour",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13557,
   "name": "str_icon_mono",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13561,
   "name": "str_logo_status",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13584,
   "name": "str_hiscore_label",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13606,
   "name": "str_hiscore_value",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13610,
   "name": "f_352A",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 13626,
   "name": "str_opt_2p_two",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13643,
   "name": "str_opt_1p",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13662,
   "name": "str_opt_2p_shared",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13680,
   "name": "opt_str_ptrs",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13683,
   "name": "f_3573",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 13686,
   "name": "str_hewson",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13695,
   "name": "str_presents",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13706,
   "name": "str_logo_title",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13719,
   "name": "str_copyright",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13744,
   "name": "str_designed",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13773,
   "name": "str_author",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13793,
   "name": "str_hall_of_fame",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13808,
   "name": "hall_of_fame",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13813,
   "name": "f_35F5",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 13830,
   "name": "hof_entry2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13852,
   "name": "hof_entry3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13874,
   "name": "hof_entry4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13896,
   "name": "hof_entry5",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13918,
   "name": "hof_entry6",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13940,
   "name": "hof_entry7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13962,
   "name": "hof_entry8",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13984,
   "name": "str_colour",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13997,
   "name": "str_mono",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14009,
   "name": "str_demo",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14021,
   "name": "port_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14029,
   "name": "rotating_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14037,
   "name": "rotating_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14045,
   "name": "demo_rotating_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14049,
   "name": "demo_rotating_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14053,
   "name": "enemy_state_handlers",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14054,
   "name": "f_36E6",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 14067,
   "name": "type_speed",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14083,
   "name": "type_climb",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14099,
   "name": "type_fire",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14115,
   "name": "type_bullet",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14131,
   "name": "type_score",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14147,
   "name": "type_bullet_speed",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14151,
   "name": "f_3747",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 14159,
   "name": "f_374F",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 14163,
   "name": "hitbox_top",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14171,
   "name": "hitbox_bottom",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14179,
   "name": "colours_launch",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14200,
   "name": "colours_title",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14221,
   "name": "colours_destruct",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14242,
   "name": "colours_flash",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14243,
   "name": "a_37A3",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 14245,
   "name": "a_37A5",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 14246,
   "name": "a_37A6",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 14248,
   "name": "a_37A8",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 14249,
   "name": "a_37A9",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 14251,
   "name": "a_37AB",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 14252,
   "name": "a_37AC",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 14259,
   "name": "flash_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14260,
   "name": "f_37B4",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 14261,
   "name": "f_37B5",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 14262,
   "name": "f_37B6",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 14263,
   "name": "f_37B7",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 14271,
   "name": "colours_life",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14285,
   "name": "colours_game_over",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14296,
   "name": "str_player_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14307,
   "name": "str_player_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14318,
   "name": "str_game_on",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14329,
   "name": "str_lives_left",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14331,
   "name": "a_37FB",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 14332,
   "name": "a_37FC",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 14344,
   "name": "str_game_over",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14357,
   "name": "str_destruct",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14385,
   "name": "str_formation_bonus",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14417,
   "name": "str_ship_bonus",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14440,
   "name": "str_bonus_count",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14448,
   "name": "a_3870",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 14449,
   "name": "a_3871",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 14453,
   "name": "a_3875",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 14454,
   "name": "a_3876",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 14458,
   "name": "str_great_score",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14492,
   "name": "str_initials",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14522,
   "name": "str_entry",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14524,
   "name": "f_38BC",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 14525,
   "name": "a_38BD",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 14526,
   "name": "a_38BE",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 14531,
   "name": "initials_alphabet",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14558,
   "name": "chamber_fade",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14563,
   "name": "f_38E3",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 14568,
   "name": "f_38E8",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 14573,
   "name": "score_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14585,
   "name": "score_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14597,
   "name": "rod_left_rows",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14604,
   "name": "f_390C",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 14610,
   "name": "rod_left_col_6",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14611,
   "name": "rod_right_rows",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14618,
   "name": "f_391A",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 14625,
   "name": "rod_flash_times",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14632,
   "name": "rod_digits",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14633,
   "name": "a_3929",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 14636,
   "name": "rod_quit",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14640,
   "name": "rod_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14647,
   "name": "shot_glyph_offsets",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14663,
   "name": "voice_setups",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14763,
   "name": "effects",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15085,
   "name": "a_3AED",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 15101,
   "name": "a_3AFD",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 15165,
   "name": "effects_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15499,
   "name": "countdown_pitches",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15509,
   "name": "flash_pitches",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15517,
   "name": "patterns_a",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15616,
   "name": "note_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15632,
   "name": "note_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15646,
   "name": "instr_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15653,
   "name": "instr_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15660,
   "name": "song",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15729,
   "name": "pattern_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15760,
   "name": "pattern_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15791,
   "name": "patterns_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16025,
   "name": "song_pos",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 16026,
   "name": "a_3E9A",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 16027,
   "name": "unused_3e9b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16128,
   "name": "irq_bottom",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16184,
   "name": "irq_playfield",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16188,
   "name": "b_3F3C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 16202,
   "name": "a_3F4A",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 16243,
   "name": "irq_frame_start",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16275,
   "name": "title_irq",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16279,
   "name": "b_3F97",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 16304,
   "name": "a_3FB0",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 16341,
   "name": "b_3FD5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 16342,
   "name": "nmi_rti",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16384,
   "name": "spr_transporter",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16768,
   "name": "spr_transporter_door",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17152,
   "name": "spr_bullets",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17472,
   "name": "spr_mine",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17664,
   "name": "spr_sparkle",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18716,
   "name": "a_491C",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 18717,
   "name": "a_491D",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 18746,
   "name": "a_493A",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 18747,
   "name": "a_493B",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 18756,
   "name": "a_4944",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 18757,
   "name": "a_4945",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 18786,
   "name": "a_4962",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 18787,
   "name": "a_4963",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 19312,
   "name": "f_4B70",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 19372,
   "name": "f_4BAC",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 19412,
   "name": "f_4BD4",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 19448,
   "name": "f_4BF8",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 19456,
   "name": "spr_manta_explosion",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20480,
   "name": "spr_manta_a",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21504,
   "name": "spr_manta_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22528,
   "name": "spr_manta_c",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26624,
   "name": "spr_fighters",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27648,
   "name": "spr_fighters_mirror",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28672,
   "name": "font_status_top",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29064,
   "name": "f_7188",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 29128,
   "name": "font_status_top_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29672,
   "name": "f_73E8",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 29696,
   "name": "font_status_bottom",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30088,
   "name": "f_7588",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 30152,
   "name": "font_status_bottom_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30696,
   "name": "f_77E8",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 30720,
   "name": "chars_play_low",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 30792,
   "name": "f_7848",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 30800,
   "name": "f_7850",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 30864,
   "name": "char_logo_12",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30872,
   "name": "f_7898",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 30936,
   "name": "chars_play_1b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30976,
   "name": "chars_play_fixed",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31253,
   "name": "a_7A15",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 31258,
   "name": "a_7A1A",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 31259,
   "name": "a_7A1B",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 31323,
   "name": "chars_play_hull",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32768,
   "name": "a_8000",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 32769,
   "name": "a_8001",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 32770,
   "name": "a_8002",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 32771,
   "name": "a_8003",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 32783,
   "name": "a_800F",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 32784,
   "name": "f_8010",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 41480,
   "name": "f_A208",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 41984,
   "name": "stars_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 41985,
   "name": "a_A401",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 42000,
   "name": "stars_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42016,
   "name": "stars_char",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42032,
   "name": "shot_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42048,
   "name": "shot_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42064,
   "name": "shot_under",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42080,
   "name": "shot_step",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42096,
   "name": "shot_row",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42112,
   "name": "stars_colour_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42128,
   "name": "enemy_state",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42136,
   "name": "enemy_vx",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42144,
   "name": "enemy_vy",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42152,
   "name": "enemy_vx_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42160,
   "name": "enemy_timer",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42168,
   "name": "enemy_flags",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42176,
   "name": "enemy_vx_frac",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42184,
   "name": "enemy_vy_frac",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42192,
   "name": "vapour_heights",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42216,
   "name": "enemy_edge",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42240,
   "name": "star_rows_used",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42241,
   "name": "a_A501",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 42264,
   "name": "star_cols_used",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42496,
   "name": "chamber_screen",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 43520,
   "name": "level7_map",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 43992,
   "name": "level8_map",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 45056,
   "name": "init_vars",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 45081,
   "name": "read_stick",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 45093,
   "name": "a_B025",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 45094,
   "name": "a_B026",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 45096,
   "name": "a_B028",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 45097,
   "name": "a_B029",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 45111,
   "name": "b_B037",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45115,
   "name": "b_B03B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45117,
   "name": "j_B03D",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 45130,
   "name": "b_B04A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45134,
   "name": "b_B04E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45136,
   "name": "j_B050",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 45141,
   "name": "bit_masks",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 45142,
   "name": "a_B056",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 45143,
   "name": "a_B057",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 45144,
   "name": "a_B058",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 45149,
   "name": "sprite_get",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 45192,
   "name": "b_B088",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45202,
   "name": "sprite_get_all",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 45245,
   "name": "b_B0BD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45283,
   "name": "sprite_put_all",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 45310,
   "name": "b_B0FE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45315,
   "name": "b_B103",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45329,
   "name": "b_B111",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45334,
   "name": "b_B116",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45348,
   "name": "b_B124",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45353,
   "name": "b_B129",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45367,
   "name": "b_B137",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45372,
   "name": "b_B13C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45375,
   "name": "sprite_put",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 45421,
   "name": "b_B16D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45426,
   "name": "b_B172",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45440,
   "name": "b_B180",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45445,
   "name": "b_B185",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45449,
   "name": "fill_rows",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 45451,
   "name": "j_B18B",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 45453,
   "name": "b_B18D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45474,
   "name": "b_B1A2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45479,
   "name": "b_B1A7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45491,
   "name": "r_B1B3",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 45492,
   "name": "print_score",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 45497,
   "name": "a_B1B9",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 45508,
   "name": "b_B1C4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45518,
   "name": "j_B1CE",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 45537,
   "name": "j_B1E1",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 45551,
   "name": "b_B1EF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45558,
   "name": "b_B1F6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45565,
   "name": "read_keys",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 45619,
   "name": "b_B233",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45636,
   "name": "delay",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 45643,
   "name": "cassette_motor",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 45657,
   "name": "r_B259",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 45658,
   "name": "b_B25A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45669,
   "name": "str_pause",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 45682,
   "name": "wait_fire_release",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 45686,
   "name": "b_B276",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45703,
   "name": "sprite_from_record",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 45705,
   "name": "b_B289",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45717,
   "name": "print_string",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 45744,
   "name": "j_B2B0",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 45748,
   "name": "j_B2B4",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 45765,
   "name": "r_B2C5",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 45766,
   "name": "put_char",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 45825,
   "name": "r_B301",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 45826,
   "name": "copy_pages",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 45839,
   "name": "copy_bytes",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 45851,
   "name": "volume_keys",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 45878,
   "name": "b_B336",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45886,
   "name": "b_B33E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45899,
   "name": "b_B34B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45901,
   "name": "j_B34D",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 45919,
   "name": "r_B35F",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 45920,
   "name": "row_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 45945,
   "name": "row_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 45970,
   "name": "unused_b392",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 46008,
   "name": "str_volume",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 46017,
   "name": "a_B3C1",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 46018,
   "name": "a_B3C2",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 46021,
   "name": "unused_b3c5",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 46032,
   "name": "level14_map",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 46592,
   "name": "level12_map",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 47152,
   "name": "level11_map",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 47824,
   "name": "level10_map",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 48304,
   "name": "level13_map",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 49152,
   "name": "giant_letter_index",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 49248,
   "name": "giant_letters",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 49408,
   "name": "wave_list_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 49424,
   "name": "wave_lists_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 49440,
   "name": "path_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 49552,
   "name": "path_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 49664,
   "name": "wave_records",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50576,
   "name": "wave_lists",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50760,
   "name": "fighter_paths",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 52736,
   "name": "level15_map",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 53760,
   "name": "chamber_chars",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 54272,
   "name": "tiles_a",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55296,
   "name": "tiles_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 55326,
   "name": "f_D81E",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55336,
   "name": "f_D828",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55366,
   "name": "f_D846",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55376,
   "name": "f_D850",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55386,
   "name": "a_D85A",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 55387,
   "name": "a_D85B",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 55406,
   "name": "f_D86E",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55416,
   "name": "f_D878",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55426,
   "name": "a_D882",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 55427,
   "name": "a_D883",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 55446,
   "name": "f_D896",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55510,
   "name": "tiles_b_rest",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56320,
   "name": "tiles_c",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57344,
   "name": "cbm80_copy",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57360,
   "name": "level_map_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 57376,
   "name": "level_map_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 57392,
   "name": "level_scheme",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 57408,
   "name": "level_tiles",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 57424,
   "name": "level_name_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 57440,
   "name": "level_name_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 57456,
   "name": "level_names_a",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57600,
   "name": "pieces_a",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58624,
   "name": "pieces_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59648,
   "name": "pieces_c",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60672,
   "name": "pieces_d",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61269,
   "name": "level_names_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61440,
   "name": "level3_map",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61928,
   "name": "level2_map",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62488,
   "name": "level1_map",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63008,
   "name": "level9_map",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63696,
   "name": "level4_map",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64272,
   "name": "level5_map",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64808,
   "name": "level6_map",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 65530,
   "name": "hw_vectors",
   "type": "UserDefined",
   "kind": "user"
  }
 ],
 "comments": [
  {
   "address": 0,
   "type": "line",
   "text": "The processor port's data direction register; the game leaves it as the KERNAL set it."
  },
  {
   "address": 1,
   "type": "line",
   "text": "The processor port: $24 everything RAM (copies under the ROMs and I/O), $25 the I/O banked in (play), the cassette motor line driven by cassette_motor."
  },
  {
   "address": 2,
   "type": "line",
   "text": "The current sprite's bit in the video chip's one-bit-per-sprite registers (sprite_get, sprite_put)."
  },
  {
   "address": 3,
   "type": "line",
   "text": "The inverse of spr_mask, for clearing the sprite's bit."
  },
  {
   "address": 4,
   "type": "line",
   "text": "The hardware sprite (0-7) the sprite routines work on; the enemy loop's slot while it runs."
  },
  {
   "address": 5,
   "type": "line",
   "text": "The current sprite's X, low eight bits (sprite work copy)."
  },
  {
   "address": 6,
   "type": "line",
   "text": "The current sprite's X high bit: $00/$FF as read, bit 0 written; also used as a signed high byte while moving."
  },
  {
   "address": 7,
   "type": "line",
   "text": "The current sprite's Y."
  },
  {
   "address": 8,
   "type": "line",
   "text": "Non-zero when the current sprite is enabled; 0 switches it off on sprite_put."
  },
  {
   "address": 9,
   "type": "line",
   "text": "The current sprite's expand-Y bit (sprite_get_all, sprite_put_all)."
  },
  {
   "address": 10,
   "type": "line",
   "text": "The current sprite's priority bit: set, it goes behind the background's foreground colours."
  },
  {
   "address": 11,
   "type": "line",
   "text": "The current sprite's multicolour bit."
  },
  {
   "address": 12,
   "type": "line",
   "text": "The current sprite's expand-X bit."
  },
  {
   "address": 13,
   "type": "line",
   "text": "The current sprite's colour; also fill_rows' fill value."
  },
  {
   "address": 14,
   "type": "line",
   "text": "The current sprite's shape pointer (the shape is at $4000 + 64 x value); the explosion and mine handlers step it as their animation."
  },
  {
   "address": 15,
   "type": "line",
   "text": "Scratch byte: digit counts, the leading-space flag of print_score, intermediate column and row values."
  },
  {
   "address": 16,
   "type": "line",
   "text": "Scratch byte and index: enemy loop index x 2, character counts, the random table index of the star routines."
  },
  {
   "address": 17,
   "type": "line",
   "text": "Scratch byte: the enemy slot of enemies_frame and new_wave, offsets in index_pieces and build_map, the letter of enter_letter."
  },
  {
   "address": 18,
   "type": "line",
   "text": "Pointer (low byte; high at $13): the level's piece list in build_map, a bullet's map cell, the colour RAM in the wipe, the column vaporise_column works on."
  },
  {
   "address": 19,
   "type": "line",
   "text": "High byte of ptr_a."
  },
  {
   "address": 20,
   "type": "line",
   "text": "Pointer (high at $15): the map cell being built, a star's screen cell, the chamber's value cells, a hall-of-fame entry."
  },
  {
   "address": 21,
   "type": "line",
   "text": "High byte of ptr_b."
  },
  {
   "address": 22,
   "type": "line",
   "text": "The joystick's vertical direction: -1 up, 0, +1 down (read_stick, or demo_stick in the demo)."
  },
  {
   "address": 23,
   "type": "line",
   "text": "The joystick's horizontal direction: -1 left, 0, +1 right."
  },
  {
   "address": 24,
   "type": "line",
   "text": "The fire button: 0 while held, $10 while not."
  },
  {
   "address": 25,
   "type": "line",
   "text": "Keys held, a bit clear for each (read_keys): F7, F1, F3, F5 in bits 3-6, SHIFT in bit 7, port 1's stick in bits 0-4 set when held."
  },
  {
   "address": 26,
   "type": "line",
   "text": "Pointer (high at $1B): sprite records, piece data, strings' colour tables, the wave record in new_wave."
  },
  {
   "address": 27,
   "type": "line",
   "text": "High byte of ptr_c."
  },
  {
   "address": 28,
   "type": "line",
   "text": "Pointer (high at $1D): a screen or colour RAM row being filled, a cell a shot covers."
  },
  {
   "address": 29,
   "type": "line",
   "text": "High byte of ptr_d."
  },
  {
   "address": 30,
   "type": "line",
   "text": "Pointer to a generator port's colour RAM row (draw_ports), low byte."
  },
  {
   "address": 31,
   "type": "line",
   "text": "High byte of port_cell: the colour RAM page of the port's row ($340F)."
  },
  {
   "address": 32,
   "type": "line",
   "text": "The current player's score, four BCD bytes from $20 (highest) to $23 (tens and units), the first of the nine bytes of player state saved at $0250 or $0260."
  },
  {
   "address": 33,
   "type": "line",
   "text": "Score, second BCD byte (hundred-thousands and ten-thousands): a carry into it gives an extra life."
  },
  {
   "address": 34,
   "type": "line",
   "text": "Score, third BCD byte (thousands and hundreds)."
  },
  {
   "address": 35,
   "type": "line",
   "text": "Score, fourth BCD byte (tens and units)."
  },
  {
   "address": 36,
   "type": "line",
   "text": "Index of the next wave in the level's wave list; four back after a Manta is lost."
  },
  {
   "address": 37,
   "type": "line",
   "text": "Lives left, BCD; three at the start."
  },
  {
   "address": 38,
   "type": "line",
   "text": "The Dreadnought being played, 1-15 (0 builds the giant message)."
  },
  {
   "address": 39,
   "type": "line",
   "text": "Set to level + 1 when a Dreadnought is destroyed; life_over moves to it."
  },
  {
   "address": 40,
   "type": "line",
   "text": "Added to the firing chance and the chamber's speed: $10 more each time the 15 levels are completed, at most $30."
  },
  {
   "address": 41,
   "type": "line",
   "text": "The map position in pixels, low byte (high at $2A); the screen's left edge is this divided by 8."
  },
  {
   "address": 42,
   "type": "line",
   "text": "The map position's high byte (0-$0F)."
  },
  {
   "address": 43,
   "type": "line",
   "text": "The frame counter kept while paused."
  },
  {
   "address": 44,
   "type": "line",
   "text": "The fine horizontal scroll (0-7) that irq_playfield writes to $D016."
  },
  {
   "address": 45,
   "type": "line",
   "text": "The Manta's speed, fraction (signed 8.8 with $2E)."
  },
  {
   "address": 46,
   "type": "line",
   "text": "The Manta's speed in pixels a frame, signed: the map scrolls by it."
  },
  {
   "address": 47,
   "type": "line",
   "text": "The raster interrupts' frame flag: in play set at lines 252 and 82 and cleared at line 97; on the other screens $80 from line 128 and 0 from line 0 (title_irq). The main loops wait on it."
  },
  {
   "address": 48,
   "type": "line",
   "text": "The page of the map's first row at the screen's left edge ($82 or $83)."
  },
  {
   "address": 49,
   "type": "line",
   "text": "The map column at the screen's left edge, low byte."
  },
  {
   "address": 50,
   "type": "line",
   "text": "Non-zero ends the play loop: the Manta destroyed ($80 for a crash into the Dreadnought), or with the level finished."
  },
  {
   "address": 51,
   "type": "line",
   "text": "The Manta's Y position ($62-$D7)."
  },
  {
   "address": 52,
   "type": "line",
   "text": "The Manta's vertical speed, signed."
  },
  {
   "address": 53,
   "type": "line",
   "text": "The most negative vertical speed (from the movement table $32ED, as are $36-$3C)."
  },
  {
   "address": 54,
   "type": "line",
   "text": "The largest downward vertical speed."
  },
  {
   "address": 55,
   "type": "line",
   "text": "The speed limit in one direction (negative)."
  },
  {
   "address": 56,
   "type": "line",
   "text": "The speed limit in the other direction."
  },
  {
   "address": 57,
   "type": "line",
   "text": "Acceleration, facing right and pushing up the scale."
  },
  {
   "address": 58,
   "type": "line",
   "text": "Acceleration, facing right, the other way."
  },
  {
   "address": 59,
   "type": "line",
   "text": "Acceleration, facing left, one way."
  },
  {
   "address": 60,
   "type": "line",
   "text": "Acceleration, facing left, the other way."
  },
  {
   "address": 61,
   "type": "line",
   "text": "The Manta's height above the Dreadnought ($10 normally): the shadow's offset; above $13 shots and mines pass under it."
  },
  {
   "address": 62,
   "type": "line",
   "text": "The size of the speed (its absolute value), for the roll and half-loop tests."
  },
  {
   "address": 63,
   "type": "line",
   "text": "The speed push of a running manoeuvre, added to the speed each frame; 0 when none."
  },
  {
   "address": 64,
   "type": "line",
   "text": "The Manta's sprite shape (its animation frame); the guns, collision shape and shadow follow it."
  },
  {
   "address": 65,
   "type": "line",
   "text": "The shadow's shape: the Manta's plus $30."
  },
  {
   "address": 66,
   "type": "line",
   "text": "Pointer to the running manoeuvre's animation sequence (high at $43)."
  },
  {
   "address": 67,
   "type": "line",
   "text": "High byte of anim_ptr; also the transporter's slide speed in launch_sequence."
  },
  {
   "address": 68,
   "type": "line",
   "text": "Frames left in the running manoeuvre's sequence."
  },
  {
   "address": 69,
   "type": "line",
   "text": "The Manta's attitude: bits 0-1 the roll (1 level, others edge-on one way or the other), bit 2 facing left, bit 7 a manoeuvre running."
  },
  {
   "address": 70,
   "type": "line",
   "text": "A requested attitude for manta_animate, bit 7 set when there is one."
  },
  {
   "address": 71,
   "type": "line",
   "text": "Non-zero when the running manoeuvre changes the height (a half-loop)."
  },
  {
   "address": 72,
   "type": "line",
   "text": "Fire-button state for fire_control: 1 waiting for a press, 0 held (set to 1 when a life starts). The Manta fires on the press and again on the release; bit 7 is set on the frame the shots go."
  },
  {
   "address": 73,
   "type": "line",
   "text": "Frames fire has been held, counting down from 7: at 0 up or down rolls the Manta."
  },
  {
   "address": 74,
   "type": "line",
   "text": "The playfield's background colour, written by irq_playfield."
  },
  {
   "address": 75,
   "type": "line",
   "text": "The level's second multicolour ($D023), also sprite 7's colour (the shadow), from the colour schemes at $3372 (with $4C-$4F)."
  },
  {
   "address": 76,
   "type": "line",
   "text": "The level's first multicolour ($D022)."
  },
  {
   "address": 77,
   "type": "line",
   "text": "The level's map colour, put in the colour RAM of the playfield."
  },
  {
   "address": 78,
   "type": "line",
   "text": "The Manta's sprite multicolour ($D025)."
  },
  {
   "address": 79,
   "type": "line",
   "text": "The level's fighters' colour."
  },
  {
   "address": 80,
   "type": "line",
   "text": "The first visible map column / 2 (shots past it end)."
  },
  {
   "address": 81,
   "type": "line",
   "text": "The last visible map column / 2."
  },
  {
   "address": 82,
   "type": "line",
   "text": "The map address under the Manta's middle, low byte (high at $53)."
  },
  {
   "address": 83,
   "type": "line",
   "text": "High byte of under_manta: the row's page."
  },
  {
   "address": 84,
   "type": "line",
   "text": "The number of generator ports recorded, minus one ($FF for none)."
  },
  {
   "address": 85,
   "type": "line",
   "text": "The generator ports' current flashing colour."
  },
  {
   "address": 86,
   "type": "line",
   "text": "The collision flags of the Manta's frame, from $33E8 + frame (collide_shapes): bit 0 set, test only the middle column; bit 7 set, test the rows above and below the middle too."
  },
  {
   "address": 87,
   "type": "line",
   "text": "Bit 0 of collide_shape, kept as the start index of the test."
  },
  {
   "address": 88,
   "type": "line",
   "text": "The stars' colour: the map colour without bit 3."
  },
  {
   "address": 89,
   "type": "line",
   "text": "A general down counter: frames of a page, letters, the explosion's sprites."
  },
  {
   "address": 90,
   "type": "line",
   "text": "0 title, 1 demo, 2 playing, 3 paused."
  },
  {
   "address": 91,
   "type": "line",
   "text": "Which message the status line shows (0-3)."
  },
  {
   "address": 92,
   "type": "line",
   "text": "The player option: 1 one player, 2 two players sharing a joystick, 0 two players with a joystick each."
  },
  {
   "address": 93,
   "type": "line",
   "text": "The player whose turn it is, 1 or 2."
  },
  {
   "address": 94,
   "type": "line",
   "text": "The demo pilot's vertical direction, kept between frames (demo_stick)."
  },
  {
   "address": 95,
   "type": "line",
   "text": "The horizontal input of the demo pilot (demo_stick) and of frame_autopilot at the end of a level ($FF, 0 or 1), kept between frames."
  },
  {
   "address": 96,
   "type": "line",
   "text": "RUN/STOP (bit 7) and CLR/HOME (bit 3), clear while held (read_pause_keys)."
  },
  {
   "address": 97,
   "type": "line",
   "text": "$FF in black and white (F8), 0 in colour."
  },
  {
   "address": 98,
   "type": "line",
   "text": "The frame counter: paces the status line, waves, flashing and the rotating calls; also a countdown on some screens."
  },
  {
   "address": 99,
   "type": "line",
   "text": "The wave's horizontal speed, negative (signed; high byte at $64)."
  },
  {
   "address": 100,
   "type": "line",
   "text": "High byte of enemy_dx_a."
  },
  {
   "address": 101,
   "type": "line",
   "text": "The wave's bullets' extra horizontal speed."
  },
  {
   "address": 102,
   "type": "line",
   "text": "The wave's horizontal speed, positive (high byte at $67)."
  },
  {
   "address": 103,
   "type": "line",
   "text": "High byte of enemy_dx_b."
  },
  {
   "address": 104,
   "type": "line",
   "text": "Non-zero for a filler wave after the level's list has ended: no score for its fighters, no formation bonus."
  },
  {
   "address": 105,
   "type": "line",
   "text": "The wave's firing chance, compared with a random byte; also the mines' chance."
  },
  {
   "address": 106,
   "type": "line",
   "text": "The wave's bullet sprite shape."
  },
  {
   "address": 107,
   "type": "line",
   "text": "$FF when the wave entered from the right."
  },
  {
   "address": 108,
   "type": "line",
   "text": "Bit 7 set from the moment new_wave launches a wave until wave_control finds every sprite of it gone (then 0 until the next wave starts); the low bits count the enemy sprites in use, homing mines included, so a mine still flying holds back the next wave."
  },
  {
   "address": 109,
   "type": "line",
   "text": "Pointer to the level's wave list (high at $6E)."
  },
  {
   "address": 110,
   "type": "line",
   "text": "High byte of wave_list."
  },
  {
   "address": 111,
   "type": "line",
   "text": "The flags of the fighter's current path step, while fighter_move runs."
  },
  {
   "address": 112,
   "type": "line",
   "text": "The six fighters' path pointers, two bytes each ($70-$7B), indexed by slot x 2."
  },
  {
   "address": 113,
   "type": "line",
   "text": "The high byte of the first fighter's path pointer; the other five pointers follow to $7B (paths)."
  },
  {
   "address": 124,
   "type": "line",
   "text": "The frames between fighters entering, from the wave record."
  },
  {
   "address": 125,
   "type": "line",
   "text": "The start delay of the next fighter, adding up wave_spacing."
  },
  {
   "address": 126,
   "type": "line",
   "text": "The wave's type (0-15): indexes the type tables at $36F3 on."
  },
  {
   "address": 127,
   "type": "line",
   "text": "The score entry for each fighter of the wave."
  },
  {
   "address": 128,
   "type": "line",
   "text": "The wave's vertical speed upwards (negative, high byte at $81)."
  },
  {
   "address": 129,
   "type": "line",
   "text": "High byte of enemy_dy_up."
  },
  {
   "address": 130,
   "type": "line",
   "text": "The wave's vertical speed downwards (high byte at $83)."
  },
  {
   "address": 131,
   "type": "line",
   "text": "High byte of enemy_dy_down."
  },
  {
   "address": 132,
   "type": "line",
   "text": "The fighters' starting horizontal velocity."
  },
  {
   "address": 133,
   "type": "line",
   "text": "0 before the last wave, 1 when \"Land now!\" (watching for the landing), $80 landed; enter_hiscore reuses it as the place reached."
  },
  {
   "address": 134,
   "type": "line",
   "text": "The map character under the Manta's middle (the runway's end is $6F)."
  },
  {
   "address": 135,
   "type": "line",
   "text": "Formations destroyed on this level: the formation annihilation bonus, in hundreds."
  },
  {
   "address": 136,
   "type": "line",
   "text": "Fighters of the current wave not yet shot."
  },
  {
   "address": 137,
   "type": "line",
   "text": "The map address of the column being vaporised, low byte (high at $8A)."
  },
  {
   "address": 138,
   "type": "line",
   "text": "High byte of vapour, and two unused bytes after it."
  },
  {
   "address": 141,
   "type": "line",
   "text": "The number of stars draw_stars draws, minus one, and how many places pick_star_row and pick_star_column try: 15 for the giant message ($0ADA), 9 in a game ($0B8F), 7 in the demo ($21CB)."
  },
  {
   "address": 142,
   "type": "line",
   "text": "The demo pilot's fire bit."
  },
  {
   "address": 143,
   "type": "line",
   "text": "A down counter: rows, characters, chamber fade steps, bonus counts."
  },
  {
   "address": 144,
   "type": "line",
   "text": "The sound driver's mode (0 off, 1 music, 2 and 3 effects); $11, $12, $13 ask for a change."
  },
  {
   "address": 145,
   "type": "line",
   "text": "Effect requests, one per voice ($91-$93): set to an effect number, bit 7 to force it."
  },
  {
   "address": 146,
   "type": "line",
   "text": "Effect request for voice 2."
  },
  {
   "address": 147,
   "type": "line",
   "text": "Effect request for voice 3."
  },
  {
   "address": 148,
   "type": "line",
   "text": "The processor port as cassette_motor last saw it with no key down; 0 until then."
  },
  {
   "address": 149,
   "type": "line",
   "text": "The music volume, 0-15, from F5/F6 (5 at start)."
  },
  {
   "address": 150,
   "type": "line",
   "text": "The effect sounding on each voice ($96-$98), 0 for none."
  },
  {
   "address": 151,
   "type": "line",
   "text": "The effect sounding on voice 2."
  },
  {
   "address": 152,
   "type": "line",
   "text": "The effect sounding on voice 3."
  },
  {
   "address": 153,
   "type": "line",
   "text": "Each voice's frames until its gate drops ($99-$9B)."
  },
  {
   "address": 156,
   "type": "line",
   "text": "Each voice's waveform byte ($9C-$9E), written without the gate bit at release."
  },
  {
   "address": 159,
   "type": "line",
   "text": "The voice the driver is working on, 0-2."
  },
  {
   "address": 160,
   "type": "line",
   "text": "The offset of the voice's state block from $C0; a scratch byte in music_tick."
  },
  {
   "address": 161,
   "type": "line",
   "text": "The voice's SID register offset (0, 7, 14)."
  },
  {
   "address": 162,
   "type": "line",
   "text": "Pointer to an effect record or a pattern (high at $A3)."
  },
  {
   "address": 163,
   "type": "line",
   "text": "High byte of snd_ptr."
  },
  {
   "address": 164,
   "type": "line",
   "text": "Each voice's instrument in the music ($A4-$A6)."
  },
  {
   "address": 167,
   "type": "line",
   "text": "Frames until the chamber's lit value and \"Quit\" change over."
  },
  {
   "address": 168,
   "type": "line",
   "text": "The chamber's countdown, 9 down to 0."
  },
  {
   "address": 169,
   "type": "line",
   "text": "The chamber's step, 6 down to 1."
  },
  {
   "address": 170,
   "type": "line",
   "text": "The value on offer at this step (countdown + bonus)."
  },
  {
   "address": 171,
   "type": "line",
   "text": "Which of the two sides is lit (0 or 1)."
  },
  {
   "address": 172,
   "type": "line",
   "text": "Which side shows \"Quit\" at this step."
  },
  {
   "address": 173,
   "type": "line",
   "text": "The ship destruct bonus taken so far, in hundreds; starts at the level number."
  },
  {
   "address": 174,
   "type": "line",
   "text": "Frames per countdown step, from $310A; one more byte after it, unused."
  },
  {
   "address": 176,
   "type": "line",
   "text": "copy_pages' and copy_bytes' destination (high at $B1); put_char's screen address."
  },
  {
   "address": 177,
   "type": "line",
   "text": "High byte of copy_dst."
  },
  {
   "address": 178,
   "type": "line",
   "text": "The copy routines' source (high at $B3)."
  },
  {
   "address": 179,
   "type": "line",
   "text": "High byte of copy_src."
  },
  {
   "address": 180,
   "type": "line",
   "text": "The row put_char prints on."
  },
  {
   "address": 181,
   "type": "line",
   "text": "The column put_char prints at, moved on by the character's width."
  },
  {
   "address": 182,
   "type": "line",
   "text": "The character put_char prints."
  },
  {
   "address": 183,
   "type": "line",
   "text": "Set to $10 by init_vars with $B8 = 0; nothing reads them."
  },
  {
   "address": 184,
   "type": "line",
   "text": "Set to 0 by init_vars; unread, and one byte after it unused."
  },
  {
   "address": 186,
   "type": "line",
   "text": "print_string's index into the string."
  },
  {
   "address": 187,
   "type": "line",
   "text": "Set to $80 by init_vars; nothing reads it."
  },
  {
   "address": 188,
   "type": "line",
   "text": "Set to 1 by init_vars; nothing reads it (and the byte after it is unused)."
  },
  {
   "address": 190,
   "type": "line",
   "text": "Pointer to the string print_string prints (high at $BF)."
  },
  {
   "address": 191,
   "type": "line",
   "text": "High byte of string_ptr."
  },
  {
   "address": 192,
   "type": "line",
   "text": "Voice 1's effect state, 15 bytes from $C0 (voice 2 at $CF, voice 3 at $DE): frequency low."
  },
  {
   "address": 193,
   "type": "line",
   "text": "Effect state: frequency high."
  },
  {
   "address": 194,
   "type": "line",
   "text": "Effect state: frequency step, low."
  },
  {
   "address": 195,
   "type": "line",
   "text": "Effect state: frequency step, high."
  },
  {
   "address": 196,
   "type": "line",
   "text": "Effect state: frames until the step reverses or restarts."
  },
  {
   "address": 197,
   "type": "line",
   "text": "Effect state: the step time's reload."
  },
  {
   "address": 198,
   "type": "line",
   "text": "Effect state: frames until the effect ends."
  },
  {
   "address": 199,
   "type": "line",
   "text": "Effect state: pulse width low."
  },
  {
   "address": 200,
   "type": "line",
   "text": "Effect state: pulse width high."
  },
  {
   "address": 201,
   "type": "line",
   "text": "Effect state: pulse step low."
  },
  {
   "address": 202,
   "type": "line",
   "text": "Effect state: pulse step high."
  },
  {
   "address": 203,
   "type": "line",
   "text": "Effect state: 1 to restart the frequency at each step, else reverse both steps."
  },
  {
   "address": 204,
   "type": "line",
   "text": "Effect state: the frequency to restart at, low."
  },
  {
   "address": 205,
   "type": "line",
   "text": "Effect state: the restart frequency, high."
  },
  {
   "address": 206,
   "type": "line",
   "text": "Effect state: the effect to start when this one ends (0 none); voices 2 and 3's blocks follow to $EE."
  },
  {
   "address": 239,
   "type": "line",
   "text": "The volume written to $D418 each frame."
  },
  {
   "address": 240,
   "type": "line",
   "text": "A note's frequency being worked out, low byte."
  },
  {
   "address": 241,
   "type": "line",
   "text": "The note's frequency, high byte."
  },
  {
   "address": 242,
   "type": "line",
   "text": "Frames until the music's next step (every fifth frame)."
  },
  {
   "address": 243,
   "type": "line",
   "text": "Each voice's pattern pointer, low bytes ($F3-$F5; high at $FC-$FE)."
  },
  {
   "address": 246,
   "type": "line",
   "text": "Each voice's frames left on its note ($F6-$F8)."
  },
  {
   "address": 249,
   "type": "line",
   "text": "Each voice's octave shift ($F9-$FB)."
  },
  {
   "address": 252,
   "type": "line",
   "text": "The pattern pointers' high bytes ($FC-$FE); $FF unused."
  },
  {
   "address": 512,
   "type": "line",
   "text": "Generator ports (up to 16, note_port): each port's map column / 2, compared with the visible columns $50/$51."
  },
  {
   "address": 528,
   "type": "line",
   "text": "Each generator port's map column, low byte."
  },
  {
   "address": 544,
   "type": "line",
   "text": "Each generator port's screen row."
  },
  {
   "address": 560,
   "type": "line",
   "text": "Each generator port's map column, high bit."
  },
  {
   "address": 576,
   "type": "line",
   "text": "Each generator port's screen column while it is on screen, $FF while not (draw_ports); spawn_mine picks from those on screen."
  },
  {
   "address": 592,
   "type": "line",
   "text": "Player 1's saved state, nine bytes in the order of $20-$28 (score, wave, lives, level, next level, difficulty); the rest of the 16 bytes unused."
  },
  {
   "address": 597,
   "type": "line",
   "text": "Player 1's saved lives, which next_turn tests to skip a player who has none."
  },
  {
   "address": 608,
   "type": "line",
   "text": "Player 2's saved state, as player1_state."
  },
  {
   "address": 613,
   "type": "line",
   "text": "Player 2's saved lives."
  },
  {
   "address": 2304,
   "type": "line",
   "text": "The game's first instruction, where the loader hands over. Blanks the screen, banks everything to RAM ($01 = $24), clears zero page, then lays memory out for play with copy_pages: $8000-$9FFF to $E000-$FFFF (level tables and pieces, under the KERNAL), $A000-$AFFF to $C000-$CFFF (wave and path tables), $7C00-$7DFF to $D200-$D3FF and $5C00-$67FF to $D400-$DFFF (both under the I/O), $4800-$4BFF to $A600-$A9FF and $7400-$77FF to $AA00-$ADFF, and copies the 256 bytes at $1000 to $0800 (the random byte table) with copy_bytes. Then spreads the status font (spread_font), copies the logo into it (copy_logo_glyphs), and falls into restart."
  },
  {
   "address": 2461,
   "type": "line",
   "text": "Also the RESET vector and the CBM80 entry at $8000. Banks in the I/O ($01 = $25), selects video bank 1 ($4000-$7FFF) through CIA 2, sets the music volume (init_vars), points the IRQ at title_irq ($3F93), NMI at an RTI (RESTORE does nothing), RESET and the cartridge vectors at itself, enables the raster interrupt at line $80 and switches off the CIA interrupts. Rebuilds $5C00-$67FF from $5000-$5BFF (thicken_shapes), clears the screen, prints both scores, and sets one player ($5C = 1)."
  },
  {
   "address": 2592,
   "type": "line",
   "text": "The title sequence, the game's outer loop. Resets the stack, points read_stick at both ports again, colours the status lines and prints \"Player1\" and \"Player2\" over the scores game_start printed, colours the colour icon (colour_icons) and builds the giant message's map (build_message). Then loops: the title page with the music (title_page), the giant scrolling message (level 0, message_page), the hall of fame, and a demo flight (demo); the option icons are printed inside those pages, and fire on any of them starts a game at new_game."
  },
  {
   "address": 2917,
   "type": "line",
   "text": "Starts a game: copies the nine-byte player template at $3496 (score 0, wave 0, three lives, level 1) into both players' saved states ($0250, $0260) and the current state at $20-$28. Switches the sound to effects ($90 = $12), prints player 2's lives, sets the playfield character set operand of the raster interrupt ($3F4A = $2F), makes player 1 current ($5D) in game mode 2 ($5A), prints both scores and falls into next_turn."
  },
  {
   "address": 2977,
   "type": "line",
   "text": "Chooses whose turn it is and loads that player's saved state into $20-$28: player 1 from $0250 (score printed at column 1), player 2 from $0260 (column $1F). With one player ($5C = 1) it is always player 1; with two it is the player in $5D, passing over a player with no lives left ($0255, $0265). When no player has lives left it goes back to the title. In two-stick mode ($5C = 0) it rewrites read_stick's two port operands: player 1 reads $DC01 (port 1), player 2 $DC00 (port 2)."
  },
  {
   "address": 3097,
   "type": "line",
   "text": "Starts a life: the title interrupt, an empty status line and the lives, the status colours of the current player (status_colours), then the launch screen: \"Player 1\" or \"Player 2\", the lives left and \"Game On!\", with the Manta's sprite (record $32CC). Waits for fire to be released, stirs the random table (stir_random), plays effects 3, 4 and 5, and waits for fire or about four seconds ($62 from $BF). Then builds the Dreadnought (level_setup), starts its wave list (waves_start), runs the launch out of the transporter (launch_sequence), sets the Manta's movement limits from $32ED into $35-$3C and enters the play loop."
  },
  {
   "address": 3321,
   "type": "line",
   "text": "The play loop, once a frame: waits for the frame flag $2F to clear (at line 97, irq_frame_start), then draws the shots (draw_bullets), scrolls (scroll_step), copies the map to the screen (draw_map), draws the stars (draw_stars), the generator ports (draw_ports) and the enemies (enemies_frame); counts the frame ($62), reads the stick, calls one of eight routines in turn by the frame counter (table $36CD/$36D5, through the operand at $0D25), then fire, vertical movement, speed, manoeuvres and the Manta's sprites, and the landing check. A pass sometimes takes longer than a frame: 382 passes in 400 frames from play-level1.vsf. Leaves when the Manta is lost ($32) or the Dreadnought is destroyed ($85 bit 7, end_level)."
  },
  {
   "address": 3366,
   "type": "line",
   "text": "The low byte of the play loop's rotating call, written each frame from $36CD by the frame counter."
  },
  {
   "address": 3367,
   "type": "line",
   "text": "The high byte of the rotating call (from $36D5); the eight targets, one a frame in turn, are status_line, wave_control, print_score, pause_check (twice), rts_2bbe, spawn_mine and port_colour. After it: the stick-driven controls (fire_control, manta_vertical, manta_speed, manta_limits, manta_animate), landing_check, and the loop's exits."
  },
  {
   "address": 3397,
   "type": "line",
   "text": "After the play loop. If the level was finished ($27 differs from $26) moves to it; after level 15 it goes back to level 1 and adds $10 to the difficulty $28 while that stays below $40; then wave 0 and start_life. Otherwise the Manta was lost: manta_explodes, the wave index $24 goes back four (not below 0), and a life is taken from $25 (BCD). With none left, \"Player N\" and \"Game Over!\" are shown for a few seconds and the hall of fame is checked (enter_hiscore). Either way the state is saved to the player's slot and, with two players, the turn passes to the other (next_turn)."
  },
  {
   "address": 3609,
   "type": "line",
   "text": "The Dreadnought has been destroyed: runs the landing, bonus and destruction sequence (dreadnought_destruct), clears $32 and goes back to life_over, which moves on to the next level."
  },
  {
   "address": 3619,
   "type": "line",
   "text": "Sound driver, called once a frame from the raster interrupt (handlers $3F00 and $3F93). $90 is the sound mode: 0 silences everything; 1 plays the music, stepping the song every fifth call ($F2) and then running the voices; 2 and 3 run the voices for sound effects only. A request of $11 or $13 starts the song from its first row at the music volume $95 (mode 1 or 3), $12 switches to effects at full volume. Each mode change goes through sound_reset."
  },
  {
   "address": 3691,
   "type": "line",
   "text": "Music sequencer, every fifth frame. $3E99 is the row of the song list $3D2C (three pattern numbers a row, one per voice, $FF ends the song and stops the music); $3E9A = $FE asks for the next row. For each voice it counts down the note length $F6,x; at zero it reads the next byte of the voice's pattern through $F3/$FC: a $00 byte is followed by a control byte whose low three bits set the octave ($F9,x) and high nibble the instrument ($A4,x); $FF ends the pattern and fetches the next song row; any other byte is a note, length in its high nibble (0 means 16) and pitch in its low nibble, looked up in $3D10/$3D00 and halved once per octave step. The pitch is written into the instrument's sound record (pointer $3D25/$3D1E) and the instrument's effect number ($27 + instrument) is requested on that voice through $91,x."
  },
  {
   "address": 3932,
   "type": "line",
   "text": "Runs the three SID voices for one frame. Writes the volume $EF to $D418, ORed with the operand at $0F5F, which is $80 (voice 3 cut off from the output) while voice 3 serves as the random-number generator and 0 while it sounds. Starts any requested effect ($91-$93): a request with bit 7 set always starts, others only when the voice's current effect ($96-$98) is not a forced one. Then for each sounding voice: adds the frequency step to the frequency and the pulse step to the pulse width (turning the pulse step round at the ends of its range), counts down the gate time ($99,x) and drops the gate when it runs out, counts down the step time ($C4) to either restart the frequency or reverse both steps, and counts down the duration ($C6); at the end it silences the voice, starts the effect chained after it ($CE) and, on voice 3, gives the voice back to the noise generator."
  },
  {
   "address": 3935,
   "type": "line",
   "text": "The operand of ORA #$00 in voices_frame: $80 mutes voice 3's output while it is the noise generator (sound_reset), 0 once an effect is started on it (start_effect). The rest of voices_frame follows: the requests, then each voice's frequency, pulse, gate, step and duration."
  },
  {
   "address": 4189,
   "type": "line",
   "text": "Starts sound effect $96,y on voice Y. Its 16-byte record is at $39AB + 16 x (number - 1): byte 0 picks the voice set-up (start_voice), bytes 1-15 are copied into the voice's state block at $C0 + 0/$0F/$1E (start frequency, frequency step, step time, duration, pulse width, pulse step, step mode, restart frequency, chained effect). Starting an effect on voice 3 takes it off the noise generator by clearing the operand at $0F5F."
  },
  {
   "address": 4261,
   "type": "line",
   "text": "Silences the SID voice whose register offset is in $A1: attack, decay, sustain and release to zero, then the test bit on and off to stop the oscillator."
  },
  {
   "address": 4282,
   "type": "line",
   "text": "Sets up a SID voice for an effect: A x 4 indexes the voice set-ups at $3947 (waveform, attack/decay, sustain/release, gate time). Silences the voice, writes $08 0 0 0 from $114A into its frequency and pulse registers, then the waveform and envelope, keeps the gate time in $99,x and the waveform in $9C,x, and writes the waveform again with the gate bit set to start the note."
  },
  {
   "address": 4352,
   "type": "line",
   "text": "$A1 = the SID register offset of voice $9F (0, 7 or 14, from $1141)."
  },
  {
   "address": 4360,
   "type": "line",
   "text": "Sets the sound mode $90 to the low nibble of A and clears everything: all 25 SID registers, the current effects $96-$98 and the requests $91-$93; mutes voice 3 ($80 into the operand at $0F5F) and gives it back to the noise generator."
  },
  {
   "address": 4395,
   "type": "line",
   "text": "Voice 3 as the random-number generator: frequency $FFFF, pulse 0, noise waveform with the gate on, so that $D41B reads a fresh random byte. Its output is muted by bit 7 of $D418."
  },
  {
   "address": 4417,
   "type": "line",
   "text": "Per voice: the SID register offset (0, 7, 14), the offset of its state block from $C0 (0, $0F, $1E), and the last byte of that block ($0E, $1D, $2C, start_effect copies backwards). Then $114A: $08 0 0 0, the frequency and pulse bytes start_voice writes first, in reverse order."
  },
  {
   "address": 4420,
   "type": "line",
   "text": "Each voice's state block offset from $C0: 0, $0F, $1E (part of sid_voice_offsets)."
  },
  {
   "address": 4423,
   "type": "line",
   "text": "Each voice's last state byte, $0E, $1D, $2C: start_effect copies a record backwards from there."
  },
  {
   "address": 4426,
   "type": "line",
   "text": "The four bytes start_voice writes first into a voice's frequency and pulse registers: $08, 0, 0, 0, read backwards."
  },
  {
   "address": 4430,
   "type": "line",
   "text": "The bonus game after landing. Puts up the chamber: its screen from $A6A0 (the copy of the loaded screen at $4800) and its characters from $D200 to $7C00, fading the colours in over five steps ($38DE, $38E3, $38E8). Then six steps ($A9), from the bottom row of slots up, with a countdown $A8 from 9 that steps every 256 - $AE frames ($AE from chamber_speeds by level and difficulty). At each step a value and \"Quit\" flash alternately in the row's two slots (which side is random, $AC); the value is the countdown plus the bonus so far $AD, which starts at the level number, in hundreds. Fire while the value is lit takes it into $AD and goes to the next step; fire on \"Quit\" ends with the bonus; the countdown reaching 0 ends with nothing ($A8 = 0)."
  },
  {
   "address": 4850,
   "type": "line",
   "text": "Writes $AA as two decimal digits, as the chamber's digit characters ($80 + digit), into $3928/$3929."
  },
  {
   "address": 4883,
   "type": "line",
   "text": "Draws four characters at ($14) and their colour at ($1C): \"Quit\" from $392C when the lit side is the quit side ($AB = $AC), else the value from $3928, in the step's colour $3930."
  },
  {
   "address": 4921,
   "type": "line",
   "text": "Blanks four characters at ($14), colour black at ($1C)."
  },
  {
   "address": 4935,
   "type": "line",
   "text": "The chamber's countdown: when the counter $62 wraps, one less ($A8), its digit's glyph from $3C8B into the countdown character, effect $15, the counter reloaded from $AE, and four bytes at $491C-$4963 (the screen cells of the countdown's moving marks) moved two places."
  },
  {
   "address": 5006,
   "type": "line",
   "text": "Copies the URIDIUM logo into the status font: play characters $00-$08 ($7800) become the top halves $31-$39 ($7188) and $0A-$12 ($7850) the bottom halves $B1-$B9 ($7588); characters $09 and $13 become $7D and $FD. The strings print the logo as codes $31-$39, $7D."
  },
  {
   "address": 5041,
   "type": "line",
   "text": "A frame on a still screen: reads the stick, updates the status line, waits about $18 x 1,280 cycles and counts the frame $62."
  },
  {
   "address": 5055,
   "type": "line",
   "text": "A frame of the end-of-level flight: as the play loop (bullets, scroll, map, stars, ports, pause) but the horizontal input, which sets the speed, comes from $5F instead of the stick; fire, vertical movement and speed as in play."
  },
  {
   "address": 5099,
   "type": "line",
   "text": "A frame with no input at all ($16 = $17 = 0): bullets, scroll, map, stars, ports, stick read for fire only, then vertical movement, speed and the Manta's collision test."
  },
  {
   "address": 5139,
   "type": "line",
   "text": "After a landing. The Manta drifts down onto the runway: frames run on autopilot (frame_autopilot), the height $3D lowered by one every fourth frame until it is below 5, then 160 frames more. The sprites go and the screen is wiped from both sides (shift_rows_left, shift_rows_right, 31 times) into the fuel rod chamber (fuel_rod_chamber). If the countdown ran out there ($A8 = 0) the Manta is lost (out_of_time). Otherwise \"Destruct sequence primed!\", then the formation annihilation bonus (one count for each formation destroyed, $87) and the ship destruct bonus (the chamber's $AD), each counted up in hundreds (count_bonus). Then the take-off ($150F on): the Dreadnought's tiles and colours back, the autopilot pushes right ($5F = 1) and the Manta climbs one a frame to height $18; the turn at the map's end (manta_limits) half-loops it to face left; then, with its speed held at 7 and a random full roll one frame in 64, it flies back while the hull vaporises from column 480 (vaporise_column, once the map position is below $0E00), one column a frame, faster than the Manta, so the edge overtakes it. Below map position $0200 the next level ($27) and the play loop ends ($32). Recorded live: 568 frames from the start of the take-off to level 2."
  },
  {
   "address": 5565,
   "type": "line",
   "text": "The fuel rod chamber's countdown reached zero: the play screen is put back and $32 set with the level unchanged, so life_over treats it as a Manta lost."
  },
  {
   "address": 5588,
   "type": "line",
   "text": "The chamber wipe's left half: shifts the screen and colour rows from row 2 on, columns 0-29, one character to the left, narrowing by one row each time from $1E down to 9, with a space and colour $F8 at the right end."
  },
  {
   "address": 5671,
   "type": "line",
   "text": "The wipe's right half: shifts each row's columns from $1D to $26 one character to the right, from row 2 on."
  },
  {
   "address": 5741,
   "type": "line",
   "text": "The landing, once a frame in play. Until the level's last wave has been launched ($85 = 0) it watches the wave list for its end marker, then sets $85 = 1. From then on \"Land now!\" flashes in the status line (on for 16 frames in 32, with effect $8F), and the Manta lands when it is over the runway's end character $6F flying level and facing right ($45 = 1): $85 = $80, which ends the play loop; any fighters still flying explode."
  },
  {
   "address": 5812,
   "type": "line",
   "text": "Never reached: landing_check's RTS comes just before it, nothing in the listing refers to it, and both branches into this code ($1687, $168D) enter at land_now_flash after it. It would set wave_left, the fighters of the wave not yet shot, to $FF when it is zero, then run on into the \"Land now!\" flashing."
  },
  {
   "address": 5820,
   "type": "line",
   "text": "Part of landing_check, while waiting for the landing: at frame $00 of each 32 the status message is cleared (string $3150), at frame $10 \"Land now!\" (string $315E) is printed with effect $8F."
  },
  {
   "address": 5842,
   "type": "line",
   "text": "One frame of the vaporising: at the column of $89/$8A (row 0's map address, moving left by one each call, stopping below $8220), in each of the 17 rows from row 0 down, from that row's column offset ($A4D0 + 17 - row): the three cells there, if not a space, become wreckage, the first $F9 or $FA, the second $FB or $FC, the third $FD or $FE (bit 0 of the noise picks), and the three cells after them become spaces. As the band moves left each character passes through the three wrecks in three frames and goes."
  },
  {
   "address": 5947,
   "type": "line",
   "text": "Starts the vaporising at $89/$8A = $83E0 (column 480) and gives each row a column offset for a ragged edge: a random walk over the rows from 8, kept within 0-16, where a noise byte below $55 keeps it, $55-$A9 adds one and $AA or more takes one, into $A4E1 (row 0) down to $A4D1 (row 16)."
  },
  {
   "address": 5998,
   "type": "line",
   "text": "Counts a bonus up: shows \"100 X n = n00\" with the count $8F as two digits (the operands of the string at $3868), then for each count adds 100 to the score (add_score, entry 4), reprints the score and waits, until the count is 0."
  },
  {
   "address": 6092,
   "type": "line",
   "text": "Waits for the frame flag $2F to clear, blacks the background, and points the IRQ vector at title_irq for the screens outside play."
  },
  {
   "address": 6114,
   "type": "line",
   "text": "Waits for the frame flag to clear, sets the raster line to 252 and points the IRQ vector at irq_bottom: the three-handler chain of play."
  },
  {
   "address": 6136,
   "type": "line",
   "text": "At game over: compares the score $20-$23 with the hall of fame's eight entries (22-byte string records from $35F0 to $368A, each followed by its score as four BCD bytes) from the bottom up, moving lower entries down a place. If it made the list: \"You have amassed a great score!\", \"Please enter your initials.\" and three letters (enter_letter), then the entry's initials and digits are written, and a new best score also becomes the status line's hi-score string ($352A) and the giant message's (\"High - ...\", $34C3)."
  },
  {
   "address": 6426,
   "type": "line",
   "text": "Enter one initial: the stick up or down steps through the 27 characters at $38C3 (A-Z and a space), shown in the string at $38BA with flashing colours (cycle_colours); fire takes it, and the entry also ends after $59 x 256 frames."
  },
  {
   "address": 6516,
   "type": "line",
   "text": "Rotates five colours from the table at $37B3 by the frame counter into $37A2-$37AC and colours 17 rows from them: the flashing of the hall-of-fame entry."
  },
  {
   "address": 6583,
   "type": "line",
   "text": "Prints the lives $25 (BCD, a leading zero as a space) beside the ship icon of the current player's corner: \"1up\" at the left for player 1, \"2up\" at the right for player 2."
  },
  {
   "address": 6645,
   "type": "line",
   "text": "Adds score entry Y to the BCD score $20-$23: $38ED,y to the hundreds and thousands byte $22, $38F9,y to the tens and units byte $23, carrying up; past 99999999 the score sticks at 99999999. A carry out of $22 (another 10,000 points) gives an extra life: $25 + 1, the lives reprinted and effect $81."
  },
  {
   "address": 6712,
   "type": "line",
   "text": "Starts the current level's waves: the wave list pointer $6D/$6E from $C100/$C110 by level $26, no formations destroyed yet ($87), not landing ($85 = 0), no wave in flight ($6C = $80, $68 = $80), then copies the level's tile set into the playfield characters (copy_tile_set)."
  },
  {
   "address": 6740,
   "type": "line",
   "text": "Copies four pages, the level's tile set from the page $E040 names for level $26 ($D400, $D800 or $DC00), to $7C00-$7FFF: the playfield's characters $80-$FF. Runs with every ROM and the I/O banked out, since the sets lie under the I/O."
  },
  {
   "address": 6773,
   "type": "line",
   "text": "Every 64 frames (at phase $21 of the frame counter $62): when the last wave has gone ($6C = $80) counts it as destroyed ($87) if every fighter was shot ($88 = 0) and it was not a filler wave ($68 = 0), then marks no wave; when there is none ($6C = 0) starts the next one at new_wave."
  },
  {
   "address": 6808,
   "type": "line",
   "text": "Launches a formation. Reads the next wave number from the level's list ($6D),$24 (and advances $24); $FF, the end of the list, gives one of the filler waves $12-$15 at random, marked in $68 so that it scores no formation bonus. The 16-byte record at $C200 + 16 x number holds six path numbers (0 for no fighter), six start heights (bytes 6-11, 0 for the Manta's height), the frames between fighters starting their paths (byte 12), the side byte (13) and the type (14). The type picks, from the tables at $36F3 on, the horizontal acceleration ($66, and $63 its negative), the vertical one ($82, $80 its negative), the firing chance ($69, plus half the lives, the level and the difficulty), the bullet shape ($6A), the score ($7F) and the bullet's speed ($65). Every fighter starts at the same sprite X in the band hidden between the borders: $1A4 with shapes $A0 + type ($1B4D), or $1A2 with the mirrored shapes $B0 + type, the two accelerations and the bullet speed swapped ($1B5B). Side byte 0: starting horizontal speed 0, mirrored when the Manta's speed is negative; $FF: starting speed minus the Manta's, mirrored when it is positive or 0; any other value: bit 7 of the noise picks one of the two. Each fighter gets its path pointer from $C120/$C190, state 2, a start delay and its sprite; requests effect $AE."
  },
  {
   "address": 7165,
   "type": "line",
   "text": "Runs the six enemy sprites (0-5), once a frame: for each one in use ($A490,y non-zero) reads its sprite (sprite_get) and calls the handler for its state through the table at $36E5, written into the JSR at $1C2B: 2 a fighter following its path (fighter_move), 4 an enemy bullet (bullet_move), 6 an explosion (explosion_move), 8 a mine materialising (mine_appear), 10 a homing mine (mine_move)."
  },
  {
   "address": 7212,
   "type": "line",
   "text": "Low byte of enemies_frame's handler call, written from enemy_state_handlers by the sprite's state."
  },
  {
   "address": 7213,
   "type": "line",
   "text": "High byte of the handler call; after the call, the loop moves on to the next of the six sprites."
  },
  {
   "address": 7223,
   "type": "line",
   "text": "State 6, an explosion: moves with the Dreadnought, and every other frame steps the shape $0E on; at shape $1E the sprite is switched off and its slot freed ($6C counted down)."
  },
  {
   "address": 7258,
   "type": "line",
   "text": "Adds the scroll speed $2E (signed) to the sprite's 9-bit X in $05/$06, so that it keeps its place over the Dreadnought."
  },
  {
   "address": 7283,
   "type": "line",
   "text": "State 2, a fighter. Moves it with the scroll and by its velocity (move_by_velocity), then follows its path: when its step timer $A4B0 runs out it reads the next path byte through ($70,x): $FF holds the last step; otherwise bits 0-6 are the step's flags ($A4B8) and with bit 7 set the next byte is the step's length (else 1 frame). Flags: 1 accelerate by $63/$64, 2 by $66/$67, 4 down by $82, 8 up by $80; with none of those, $10 fire once, $20 stop dead, $40 steer towards the Manta's height (closing at up to 4 or 5 a frame, stopping dead past it). Every eighth frame (on its slot's phase), on screen, it fires when a noise byte is no higher than the chance $69. On screen, finds the four characters under the sprite: a code below $20, a shot's own character, means it is shot: that shot (the code's low four bits) is put out, the type's score added (none in a filler wave), effect $26, state 6 explosion and one fewer fighter left ($88). Off the visible screen it notes in $A4E8 which edge it left by ($FF the right, 0 the left) and is switched off once well past it."
  },
  {
   "address": 7846,
   "type": "line",
   "text": "Shared end of the enemy handlers: a sprite whose X has passed $19C-$1C3 (off the right edge, in the border) is switched off and its slot freed. Writes the sprite back (sprite_put)."
  },
  {
   "address": 7875,
   "type": "line",
   "text": "State 4, an enemy bullet: moves with the scroll and by its velocity for its lifetime $A4B0; if it touches the Manta (hits_manta) while the Manta is low (height $3D below $14) the Manta is lost ($32). At the end of its time it turns into an explosion (state 6) with effect $0A."
  },
  {
   "address": 7924,
   "type": "line",
   "text": "Adds sprite Y's velocity to its position: X ($05/$06) by the 16-bit $A498/$A4A8, Y ($07) by $A4A0 (with the carry of the fraction $A4C8)."
  },
  {
   "address": 7951,
   "type": "line",
   "text": "A fighter fires: takes a free sprite slot (0-5) if there is one, places a bullet there with the wave's bullet shape $6A at the fighter's position, moving at the fighter's speed plus the bullet speed $65, state 4 with a lifetime of $A0 frames, and requests effect $0B."
  },
  {
   "address": 8034,
   "type": "line",
   "text": "State 8, a mine materialising over its generator port: moves with the scroll and every fourth frame steps its shape down from $1D; at $13 it becomes a homing mine (state 10, shape $11)."
  },
  {
   "address": 8063,
   "type": "line",
   "text": "Called in turn from the play loop every eighth frame: only while a wave is in progress ($6C bit 7 set) and when a noise byte is no higher than a quarter of the firing chance $69, takes the last generator port found ($0240,x positive, searching down from the $54th) that is on the screen and a free sprite slot, and starts a mine materialising over it (state 8, shape $1D, effect $0D, Y = row x 8 + $2C, X = (screen column + 2) x 8), still, with a homing lifetime of 128 + 4 x level + difficulty frames; it counts itself in $6C. The vertical fraction $A4C8 of the slot is not cleared."
  },
  {
   "address": 8176,
   "type": "line",
   "text": "Carry set when the sprite touches the Manta: its X must be between $A2 and $B1 on the left of the screen (where the Manta always is) and its Y within the box the tables $374F and $3747 give for its shape around the Manta's Y $33."
  },
  {
   "address": 8225,
   "type": "line",
   "text": "State 10, a homing mine: moves with the scroll and by its velocity, steers towards the Manta (home_in), counts down its lifetime (effect $0E every 16 frames, on its slot's phase), and like a bullet destroys a Manta flying below height $14 that it touches (hits_manta). It never tests the characters under it, so shots pass through it. At the end it bursts (state 6, shape $14, effect $0A)."
  },
  {
   "address": 8287,
   "type": "line",
   "text": "Every fourth frame turns the mine's velocity towards the Manta, by one each way: vertically towards its Y $33 (up when level with it or below it), horizontally towards the Manta's column, sprite X $AA (from the hidden band, X $1A0 up, to the right; from X $100-$19F, to the left); then the horizontal speed is kept within -6..6 and the vertical within -4..4. Nothing damps it, so the mine overshoots and swings back through the Manta."
  },
  {
   "address": 8428,
   "type": "line",
   "text": "Builds the Dreadnought for level $26 and resets the Manta: indexes the map pieces (index_pieces), map position $0040 (the left edge of the map), background $4A = $F1, builds the map (build_map), clears the piece index (clear_piece_index), sets the level's colours (level_colours), scatters the stars (make_stars), draws the first screen (draw_map, draw_stars), the star rows above and below the playfield (star_rows). Then the Manta at rest: speed 0, no manoeuvre, level and facing left ($45 = 5), as it reverses out of the transporter, height $3D = $10, Y $98, frame $59, and switches to the play interrupt."
  },
  {
   "address": 8528,
   "type": "line",
   "text": "Holds a still page for up to two times 256 frames, or until fire: each frame reads the stick and the keys, the volume keys, the status line, the player keys (option_keys) and the colour keys (colour_keys), with a delay for pacing."
  },
  {
   "address": 8574,
   "type": "line",
   "text": "Runs the giant scrolling message: level 0's map, built from letter pieces, scrolls past at the speed set by the caller ($2E = -4) with the stars and the status line, the option, volume and colour keys working, until fire or the end of the map."
  },
  {
   "address": 8629,
   "type": "line",
   "text": "The demo flight. Game mode 1 ($5A), score and wave 0, a level from 1 to 8 picked by the random byte at $0800, built as for play; the Manta and its shadow placed from records, then up to eight times 256 frames of play driven by demo_stick instead of the joystick, the real stick still read for fire, which ends the demo (and starts a game). A Manta lost also ends it with the explosion."
  },
  {
   "address": 8788,
   "type": "line",
   "text": "Low byte of the demo's rotating call, from $36DD by the frame counter (four targets: status_line, spawn_mine, colour_keys, option_keys)."
  },
  {
   "address": 8789,
   "type": "line",
   "text": "High byte of the demo's rotating call (from $36E1); then the demo's pilot (demo_stick), fire, vertical, speed, limits and animation of the Manta, and the demo's exits: the Manta lost, or the time used up."
  },
  {
   "address": 8839,
   "type": "line",
   "text": "The demo's pilot: fire toggled at random about one frame in four ($8E), and each of the vertical and horizontal directions kept from the last frame ($5E, $5F) except when a random byte of $B4 or more picks a new one (-1, 0 or +1)."
  },
  {
   "address": 8915,
   "type": "line",
   "text": "Every 128 frames steps the message in the middle of the second status line on ($5B, 0-3): the URIDIUM logo; \"Hi-score\"; the best score and its initials; then in play (mode 2) the level's name, otherwise the joystick icons of the player option ($5C, strings $353A, $354B, $355E) with the colour or black-and-white icon. In game mode 3 (paused) it shows the logo. \"Demo\" in the top line is printed by the title loop."
  },
  {
   "address": 9026,
   "type": "line",
   "text": "The player options on the title screens. F1 alone: one player ($5C = 1); SHIFT and F1 (F2): two players sharing one joystick ($5C = 2); F3: two players with a joystick each ($5C = 0). F1 and F2 also point read_stick at both ports. Each prints its icon in the status line."
  },
  {
   "address": 9111,
   "type": "line",
   "text": "Fills 21 rows of the screen from $48A0 (below the top status line) with A."
  },
  {
   "address": 9125,
   "type": "line",
   "text": "Colours Y + 1 screen rows, from the colour RAM address in $1C/$1D, each with the colour the table at ($1A) gives for it, last row first."
  },
  {
   "address": 9141,
   "type": "line",
   "text": "F7 sets colour ($61 = 0, \"Colour\"), SHIFT and F7 (F8) black and white ($61 = $FF, \"Blck-Whte\"), and updates the icons (colour_icons). Black and white makes level_colours use scheme 0 for every level."
  },
  {
   "address": 9198,
   "type": "line",
   "text": "An RTS nothing reaches: the routine before it ends with a JMP."
  },
  {
   "address": 9199,
   "type": "line",
   "text": "Colours the two icon cells of the top status line ($D85A, $D85B, $D882, $D883) grey for black and white, or in colours."
  },
  {
   "address": 9237,
   "type": "line",
   "text": "Builds the giant message's map list at $8010 from the text at $349F (\"Uridium by Andrew Braybrook. High - 12000 AEB\" in the game's alphabet, ending with a negative byte): for each character, the table at $C000 gives an offset into the letter pieces at $C060, four piece numbers per letter, of which the non-zero ones are written, then piece 1 (a gap). Four zeros end it. Level 0's piece list ($E010) points here."
  },
  {
   "address": 9307,
   "type": "line",
   "text": "The Manta is lost: its sprites become an explosion of eight sprites thrown out at random around it, with effect $0C on two voices, while the Dreadnought coasts to a stop (frame_coast), for six frames plus 16 more; in two-player games the score is reprinted. Fire can cut it short except in play."
  },
  {
   "address": 9508,
   "type": "line",
   "text": "Steps the generator ports' flashing colour $55 through the eight colours at $36C5, one step every eight frames."
  },
  {
   "address": 9522,
   "type": "line",
   "text": "Fills the two rows above the playfield ($48A0) and the two below ($4B98) with random stars (star_row), and clears the six cells of $4BAC and $4BD4 (under the bottom status)."
  },
  {
   "address": 9590,
   "type": "line",
   "text": "Up and down. Normally the stick ($16) changes the vertical velocity $34 by one a frame, up to the limits $35 (up) and $36 (down) from the level's movement table; with the stick centred the velocity is halved towards zero each frame. When fire has been held for seven frames ($49 reaches 0, fire_control) up or down instead asks for a roll: from level flight to edge-on in the direction pushed, or back to level, as long as the speed $3E is at least 3 and no manoeuvre is running ($3F, $45 bit 7)."
  },
  {
   "address": 9701,
   "type": "line",
   "text": "Rebuilds $5C00-$67FF from $5000-$5BFF: every byte ORed with itself with each pair of bits swapped, so that any pixel set in a pair sets both. Run at every restart."
  },
  {
   "address": 9781,
   "type": "line",
   "text": "Left and right change the speed $2D/$2E (signed, pixels a frame and a fraction): with the Manta facing one way ($45 bit 2 clear) by $39 or $3A, facing the other by $3B or $3C. During a half-loop the manoeuvre's own acceleration $3F is added instead, which carries the Manta through the turn. Keeps the size of the speed in $3E."
  },
  {
   "address": 9868,
   "type": "line",
   "text": "Moves the Manta vertically by $34 and keeps its Y between $62 and $D7; keeps the speed within the limits $37 and $38. Near the ends of the map, unless a manoeuvre is running: with the speed positive (the map position $29/$2A falling), a position below $0100 sets the push $3F = $C8 and one from $0E80 up asks for a half-loop; with it negative, below $0080 asks for a half-loop and from $0E00 up sets $3F = $38. Below speed 2 ($3E) it asks for a half-loop that reverses the direction (bit 2 of $45), and at speed 2 brings an edge-on Manta back level."
  },
  {
   "address": 10003,
   "type": "line",
   "text": "Starts and steps the Manta's manoeuvres. A request ($46 bit 7) picks the animation from the tables $3292/$32A4 (facing right, $45 bit 2 clear) or $3266/$327C (facing left), by the current roll position (bits 0-1 of $45) and the requested one: each sequence is a length, the frames, whether the height changes and the push $3F. While one runs (bit 7 of $45) it steps every other frame: the frame into $40 and, for a half-loop, the height $3D changed by $32F5. At the end the manoeuvre bit is cleared. Then places the Manta (sprite 6, shape $40, Y $33) and its shadow (sprite 7, shape $40 + $30, lower and further right by the height $3D) and falls into manta_collide."
  },
  {
   "address": 10197,
   "type": "line",
   "text": "The Manta against the Dreadnought: $33E8 + frame gives the collision flags (collide_shapes). Looks at the map characters under the Manta through $52/$53: the middle one always (kept in $86), the left and right ones unless bit 0 is set (an end-on frame), and the cells above and below the middle when bit 7 is set (every frame but an edge-on one). Any of the solid characters $80-$8F there destroys the Manta ($32 = $80)."
  },
  {
   "address": 10297,
   "type": "line",
   "text": "The launch from the transporter: places the transporter and Manta sprites from the eight records at $3306/$3310, waits 16 frames, opens the transporter's door (sprite 6's shape stepped to $0B with effect 6), moves the Manta out to the right with effect 7, then the transporter and its parts slide away left, accelerating, with effect 8 on all voices, until off screen. Leaves sprite 6 on as the Manta with its multicolour."
  },
  {
   "address": 10520,
   "type": "line",
   "text": "One frame of a screen outside play: waits for the frame flag $2F to clear, reads the stick, checks for pause (pause_check), reads the keys, updates the status line and counts the frame, then waits for the flag to be set again."
  },
  {
   "address": 10543,
   "type": "line",
   "text": "The fire button. A press fires a pair of shots at once (manta_fire). While fire stays held $49 counts down from 7; at 0 the next up or down rolls the Manta (manta_vertical). Releasing fire re-arms it."
  },
  {
   "address": 10550,
   "type": "line",
   "text": "The operand of LDA #$07 in fire_control, the frames fire must be held before up or down rolls the Manta; other routines read it to reset $49. The rest of fire_control handles a press and a held button."
  },
  {
   "address": 10585,
   "type": "line",
   "text": "Fires up to two shots from the Manta's guns: the tables $3373 and $33A1 give, for the current frame $40, the height of each gun relative to the Manta (0 for none). Each shot takes a free bullet slot (free_bullet) and is launched (launch_bullet)."
  },
  {
   "address": 10644,
   "type": "line",
   "text": "Carry clear and X = the first free bullet slot of six ($A460,x = 0), searching up from X; carry set if all are in flight."
  },
  {
   "address": 10657,
   "type": "line",
   "text": "Puts a shot into bullet slot X at the Manta's nose: its step $A460 is 2 or -2 columns a frame in the direction of flight ($2E), its map address $A430/$A440 from the Manta's map position $52/$53 and the gun's height, its pixel row in the character $A470, and the character it covers in $A450. Requests effect 9."
  },
  {
   "address": 10775,
   "type": "line",
   "text": "The Manta's shots are software sprites drawn into the map. First puts back the character each shot covers. Then moves each one by its step: outside the visible columns ($50-$51) it ends; on a wall character ($80-$8F) it ends with effect $21; on a target ($90-$9F) it destroys it (hit_feature). Otherwise it copies the character under it into its own character ($10 + slot, or $00 + slot on alternate frames) at $7800, draws the shot as two pixel rows ($00, $AA) at its row, and puts that character in the map. Alternating the two character sets of codes stops a shot flickering while the screen is copied."
  },
  {
   "address": 10879,
   "type": "line",
   "text": "The operand of ORA #$80 in draw_bullets, flipped between $80 and 0 every frame: which of the two character banks a shot's glyph is built in ($7880 + 8 x slot or $7800 + 8 x slot)."
  },
  {
   "address": 10889,
   "type": "line",
   "text": "The low byte of the LDA $7800,Y in draw_bullets: the character under the shot x 8, written before the copy."
  },
  {
   "address": 10890,
   "type": "line",
   "text": "The high byte of that LDA ($78 plus the top bits of character x 8): the copy of the covered character into the shot's own character, then the two pixel rows of the shot."
  },
  {
   "address": 10912,
   "type": "line",
   "text": "The operand of ORA #$10, flipped between $10 and 0 every frame with $2A7F: the shot's character code is $10 + slot or slot. Then the loop over the six shots ends and the flips are made; the routine's last part ends a shot that hit a wall (effect $21) or left the screen."
  },
  {
   "address": 10953,
   "type": "line",
   "text": "Adds the step A (signed) to bullet X's map address $A430/$A440 and returns the new high byte, the low byte in $1C."
  },
  {
   "address": 10985,
   "type": "line",
   "text": "A shot hit target character A ($90-$9F). The tables at $33C6 on give for each the offset back to the feature's top-left corner, its width, height and score: the score is added (add_score), effect $1B played, and every character of the feature turned into its wreck (code - $20), ending any other shot found there."
  },
  {
   "address": 11072,
   "type": "line",
   "text": "Moves the map position $29/$2A by the speed $2E and sets the fine scroll $2C for $D016 from its low three bits."
  },
  {
   "address": 11117,
   "type": "line",
   "text": "RUN/STOP pauses the game: \"Pause\" in the status line, the sound off, mode 3. Waits for the key to be released, then until fire or RUN/STOP resumes (sound back to effects, mode 2), keeping the frame counter. CLR/HOME while paused abandons the game and goes back to the title."
  },
  {
   "address": 11198,
   "type": "line",
   "text": "An RTS: pause_check's way out when RUN/STOP is not down, and the handler of the empty enemy states 0 and 12 (enemy_state_handlers). After it, the rest of pause_check: CLR/HOME back to the title; fire or RUN/STOP to resume, the frame counter restored, sound back to effects and mode 2."
  },
  {
   "address": 11243,
   "type": "line",
   "text": "Copies the visible part of the map to the screen: from the column $29/$2A divided by 8, 17 rows of 39 characters, each row a page pair apart in the map ($8200 + $200 x row), to screen $48F0 on. The copy loop's operands are rewritten as it goes. Leaves the map address under the Manta in $52/$53 (fixed screen column $12, its row from Y $33) and the visible columns in $50/$51."
  },
  {
   "address": 11296,
   "type": "line",
   "text": "Low byte of draw_map's row source, the map column ($31)."
  },
  {
   "address": 11297,
   "type": "line",
   "text": "High byte of the row source: the map row's page ($30), moved on two pages for each row."
  },
  {
   "address": 11299,
   "type": "line",
   "text": "Low byte of draw_map's screen destination, from $48F0, 40 on for each row."
  },
  {
   "address": 11300,
   "type": "line",
   "text": "High byte of the screen destination. After the 17 rows: the map address under the Manta ($52/$53) and the visible columns ($50/$51)."
  },
  {
   "address": 11366,
   "type": "line",
   "text": "Makes the table of map pieces: walks the piece store at $E100 and puts each piece's address into $A400/$A500 by piece number, from 1. A piece is a count of columns, then for each column a count of characters (low five bits) and the characters, bottom up. A count of 0 ends the store."
  },
  {
   "address": 11429,
   "type": "line",
   "text": "Zeroes $A400-$A5FF, the piece index, once the map is built; the space is reused for the stars and the bullets."
  },
  {
   "address": 11442,
   "type": "line",
   "text": "Builds level $26's map at $8200-$A3FF: 17 rows of 512 columns, row r at $8200 + $200 x r. Fills columns 0-63 with spaces, then lays pieces side by side from column 64 to 511 in the order the level's list gives ($E010/$E020; a 0 repeats piece 1, empty space), each column drawn upwards from the bottom row and topped up with spaces. Then a second list places pieces at a given row and column (a byte with the row's page, a column, a piece number; spaces in the piece leave the map as it is), noting every generator port it lays (note_port)."
  },
  {
   "address": 11748,
   "type": "line",
   "text": "While a piece is laid: a character $59-$5B is a generator port. Up to sixteen are recorded ($54 counts them): map column high bit $0230, screen row $0220, column $0210 and column / 2 $0200, and $0240 = $FF, not on screen."
  },
  {
   "address": 11799,
   "type": "line",
   "text": "Places sixteen stars for the space around the Dreadnought from the random table at $0800: for each a screen row 7-22 (moved on to a row with no star yet, over $8D tries, pick_star_row) and a column 0-19 or 25-36 (columns 20-24 are marked as taken before the first star, pick_star_column), its screen address in $A400/$A410, its colour RAM page in $A480 and its character, $42 or $43, in $A420. draw_stars draws the first $8D + 1 of them."
  },
  {
   "address": 11941,
   "type": "line",
   "text": "Moves the star's row X on by 7 (wrapping within 7-22) until it finds a row with no star yet or has tried $8D times."
  },
  {
   "address": 11966,
   "type": "line",
   "text": "Moves the star's column X on by 7 (wrapping at 39) until it finds a column with no star yet or has tried $8D times."
  },
  {
   "address": 11991,
   "type": "line",
   "text": "Draws the stars over the map copy on the screen: a star goes only where the screen holds a space, in the star colour $58, and where it is covered its colour cell takes the map colour $4D. Then the fine scroll $2C picks one of the star characters' patterns from $311E, written into the three star rows of characters $42/$43 at $7A15-$7A1B, so the stars stay still while the screen scrolls by whole characters."
  },
  {
   "address": 12053,
   "type": "line",
   "text": "Fills a 39-character screen row at ($1C) with random stars from the table at $0800 (indexed by $10): mostly spaces, a star character $42 or $43 for one byte in sixteen."
  },
  {
   "address": 12083,
   "type": "line",
   "text": "Sets the Dreadnought's colours: five bytes from $3372 + 5 x the level's scheme ($E030; scheme 0 in black and white, $61) into $4B-$4F: the two multicolours ($D023, $D022), the map colour $4D (colour RAM of the 17 playfield rows), the Manta's multicolour $D025, and the enemies' colour $4F. The star colour $58 is the map colour without bit 3."
  },
  {
   "address": 12189,
   "type": "line",
   "text": "Reads RUN/STOP and CLR/HOME into $60: bit 7 clear while RUN/STOP is down (row 7), bit 3 clear while CLR/HOME is (row 6). Leaves $60 = $FF, nothing pressed, if the joystick in port 1 is pushing right, which would look like a key on these rows."
  },
  {
   "address": 12232,
   "type": "line",
   "text": "Flashes the generator ports: for each recorded port ($54 of them) puts the map colour back where it was last drawn, then, if its column is on screen, writes the flashing colour $55 into its colour cell and keeps the screen column in $0240 ($FF when off screen, which spawn_mine reads)."
  },
  {
   "address": 12296,
   "type": "line",
   "text": "Colours the two status lines for the turn: the current player's corner bright and the other's dim, or with one player the player 2 corner black."
  },
  {
   "address": 12422,
   "type": "line",
   "text": "XORs every byte of the random table at $0800 with a fresh random byte from the noise voice ($D41B). The ROL/ROR pair of $800F in the loop leaves it unchanged and only spends time."
  },
  {
   "address": 12448,
   "type": "line",
   "text": "Makes the status lines' double-height font from the 8-row font at $7000: each of 128 characters becomes a top half at $7000 (its rows 0-3) and a bottom half at $7400 (rows 4-7, the code + $80), each glyph row followed by a blank row, which gives the status text its scan-line look. Run once at start-up; it overwrites the source as it goes, top half last."
  },
  {
   "address": 12554,
   "type": "line",
   "text": "The fuel rod chamber's countdown speeds, indexed by the level plus the difficulty / 16: the counter starts at the value and counts up to 256, so a digit lasts 256 minus it frames ($90 at level 1, 112 frames), down to 16 frames at $F0. The byte at $310A, index 0, is never used."
  },
  {
   "address": 12574,
   "type": "line",
   "text": "Eight single-pixel-hole bytes ($FE, $FD .. $7F), one per fine-scroll position: draw_stars writes the one for $2C into the star characters' rows, so a star seems to stay in place while the screen scrolls a whole character at a time."
  },
  {
   "address": 12582,
   "type": "line",
   "text": "String record: \"Player1\", row 0, column 1, the first status line's left label."
  },
  {
   "address": 12592,
   "type": "line",
   "text": "String record: \"Player2\", row 0, column 31."
  },
  {
   "address": 12602,
   "type": "line",
   "text": "String record: \"1up\", the ship icon ($7A, $7B) and the lives, row 0, column 1; print_lives writes the digits into it at $3142/$3143."
  },
  {
   "address": 12610,
   "type": "line",
   "text": "Player 1's lives, tens digit (a space for none), written by print_lives."
  },
  {
   "address": 12611,
   "type": "line",
   "text": "Player 1's lives, units digit, then the rest of the 1up string."
  },
  {
   "address": 12613,
   "type": "line",
   "text": "String record: the ship icon, the lives and \"2up\", row 0, column 31; print_lives writes the digits at $3149/$314A."
  },
  {
   "address": 12617,
   "type": "line",
   "text": "Player 2's lives, tens digit."
  },
  {
   "address": 12618,
   "type": "line",
   "text": "Player 2's lives, units digit, then \" 2up\"."
  },
  {
   "address": 12624,
   "type": "line",
   "text": "String record: eleven spaces at row 0, column 15, which clears the middle of the top status line."
  },
  {
   "address": 12638,
   "type": "line",
   "text": "String record: \"Land now!\", row 0, column 15, flashed by land_now_flash."
  },
  {
   "address": 12650,
   "type": "line",
   "text": "Colour RAM of the top status line's first row, 40 bytes (title copies it to $D800, and without bit 3 to $D828): cyan at the corners, light red in the middle."
  },
  {
   "address": 12690,
   "type": "line",
   "text": "Colour RAM of the second status line's first row ($D850): light green corners, white middle."
  },
  {
   "address": 12730,
   "type": "line",
   "text": "Colour RAM of the second status line's second row ($D878): green corners, yellow middle."
  },
  {
   "address": 12770,
   "type": "line",
   "text": "The Manta's twelve manoeuvre animations, each a length, that many sprite frames (played last first), a byte that says whether the height changes, and the speed push $3F. Eight four-frame rolls between level and edge-on; two sixteen-frame turns through the whole roll cycle ($3211 facing right, $3253 facing left); and the two half-loops, which climb and push the speed and end facing the other way: $31FE through the end-on frames $60-$66 to the left-facing level frame $59, $3240 through $67-$6D to the right-facing $41."
  },
  {
   "address": 12902,
   "type": "line",
   "text": "Low bytes of the animation for each change of attitude while facing left ($45 bit 2 set): index = current roll (bits 0-1 of $45) x 8 + requested attitude's low three bits; 0 for none (manta_animate)."
  },
  {
   "address": 12924,
   "type": "line",
   "text": "High bytes of the animations facing left."
  },
  {
   "address": 12946,
   "type": "line",
   "text": "Low bytes of the animations while facing right ($45 bit 2 clear)."
  },
  {
   "address": 12964,
   "type": "line",
   "text": "High bytes of the animations facing right."
  },
  {
   "address": 12982,
   "type": "line",
   "text": "Two 11-byte sprite records (sprite, X, X high, Y, enable, expand Y, priority, multicolour, expand X, colour, shape) for sprite 6: the Manta at $70 and at $AA, shape $59."
  },
  {
   "address": 13004,
   "type": "line",
   "text": "Sprite record: sprite 6 at X $A0, Y $AE, shape $41, on the launch screen (start_life)."
  },
  {
   "address": 13015,
   "type": "line",
   "text": "Sprite record: sprite 7, the Manta's shadow, X $BA, Y $A8 (the Manta's $AA, $98 moved by the height $10 and half of it), hires behind the background, colour $FB, shape $89 (demo, launch_sequence)."
  },
  {
   "address": 13026,
   "type": "line",
   "text": "Sprite record: sprite 7 at X $AA for the Manta's explosion, shape $30 (manta_explodes)."
  },
  {
   "address": 13037,
   "type": "line",
   "text": "The Manta's movement limits, copied to $35-$3C at each life: vertical speed -3 to +3, speed -8 to +8, and the four accelerations $B0, $40, $50, $C0."
  },
  {
   "address": 13045,
   "type": "line",
   "text": "The height change for each frame of a half-loop (manta_animate, indexed by the frames left): down to -3 and back, then up to +3 and back, so the Manta rises over the Dreadnought and comes down again."
  },
  {
   "address": 13062,
   "type": "line",
   "text": "Low bytes of the sprite records launch_sequence places: eight transporter pieces ($331A on) and, at index 8 and 9, the demo Manta ($32B6) and the shadow ($32D7)."
  },
  {
   "address": 13070,
   "type": "line",
   "text": "launch_rec_lo's entry 8: the Manta's record ($32B6, facing left, shape $59), which launch_sequence places when the door has opened."
  },
  {
   "address": 13071,
   "type": "line",
   "text": "launch_rec_lo's entry 9: the shadow's record ($32D7), placed by launch_sequence and demo."
  },
  {
   "address": 13072,
   "type": "line",
   "text": "High bytes of launch_sequence's records."
  },
  {
   "address": 13080,
   "type": "line",
   "text": "launch_rec_hi's entry 8."
  },
  {
   "address": 13081,
   "type": "line",
   "text": "launch_rec_hi's entry 9."
  },
  {
   "address": 13082,
   "type": "line",
   "text": "Eight 11-byte sprite records: the transporter (sprites 0-5 at X $52-$82, Y $8D and $A2, shapes $00-$05) and the Manta inside it (sprites 6 and 7, shapes $07 and $06)."
  },
  {
   "address": 13170,
   "type": "line",
   "text": "Thirteen colour schemes of five bytes for the Dreadnoughts (level_colours, by $E030): the two multicolours, the map colour, the Manta's multicolour, the fighters' colour. Scheme 0 is the grey one used in black and white."
  },
  {
   "address": 13171,
   "type": "line",
   "text": "The base of gun_a (manta_fire reads $3373 + frame, frames $40-$6D): no entry of its own here, inside colour_schemes."
  },
  {
   "address": 13217,
   "type": "line",
   "text": "The base of gun_b (manta_fire reads $33A1 + frame): inside colour_schemes."
  },
  {
   "address": 13235,
   "type": "line",
   "text": "The upper gun's height for each Manta frame $40-$6D, relative to the Manta (0 for none): where manta_fire starts a shot."
  },
  {
   "address": 13254,
   "type": "line",
   "text": "The base of feature_col (hit_feature reads $33C6 + character, characters $90-$9F)."
  },
  {
   "address": 13270,
   "type": "line",
   "text": "The base of feature_row (hit_feature reads $33D6 + character)."
  },
  {
   "address": 13281,
   "type": "line",
   "text": "The lower gun's height for each Manta frame $40-$6D (0 for none)."
  },
  {
   "address": 13286,
   "type": "line",
   "text": "The base of feature_size (hit_feature reads $33E6 + character)."
  },
  {
   "address": 13288,
   "type": "line",
   "text": "The base of collide_shapes (manta_collide reads $33E8 + frame)."
  },
  {
   "address": 13302,
   "type": "line",
   "text": "The base of feature_score (hit_feature reads $33F6 + character)."
  },
  {
   "address": 13327,
   "type": "line",
   "text": "The colour RAM page of each screen row 0-24 ($D8 to $DB); with the low bytes of row_lo ($B379) it gives a row's colour address."
  },
  {
   "address": 13352,
   "type": "line",
   "text": "The collision flags of each Manta frame $40-$6D (manta_collide): $80 for the level frames and the frames between, three columns on the Manta's row and the cells above and below its middle; $00 for the edge-on frames ($44-$46, $4C-$4E, $54-$56, $5C-$5E), the three columns of one row only, which is how a roll slips through a gap one character high; $81 for the end-on frames of the half-loops ($62-$64, $69-$6B), the middle column with the cells above and below."
  },
  {
   "address": 13398,
   "type": "line",
   "text": "For each target character $90-$9F, how many columns back the target's top-left corner is."
  },
  {
   "address": 13414,
   "type": "line",
   "text": "For each target character $90-$9F, how many map rows up its top-left corner is, times 2 (a map row is $200 bytes)."
  },
  {
   "address": 13430,
   "type": "line",
   "text": "For each target character, the target's size minus one: $90-$93 are 2 x 2, $94-$9C 3 x 3, $9D-$9F one character."
  },
  {
   "address": 13446,
   "type": "line",
   "text": "For each target character, its score entry: 2 (25 points) for a 2 x 2, 4 (100) for a 3 x 3, 1 (10) for a single character."
  },
  {
   "address": 13462,
   "type": "line",
   "text": "A new player's state, copied to $20-$28: score 0, wave 0, three lives, level 1, next level 1, difficulty 0."
  },
  {
   "address": 13471,
   "type": "line",
   "text": "The giant scrolling message in the game's alphabet: \"Uridium by Andrew Braybrook. High - 12000 AEB\", ending with $FF; enter_hiscore rewrites the score and initials from $34C3, and the three $FF after it leave room for a longer score."
  },
  {
   "address": 13507,
   "type": "line",
   "text": "The score and initials of the giant message, written by enter_hiscore for a new best score."
  },
  {
   "address": 13520,
   "type": "line",
   "text": "String record: the joystick icons for two players sharing one joystick, top status line (option_keys)."
  },
  {
   "address": 13531,
   "type": "line",
   "text": "String record: the icons for two players with a joystick each."
  },
  {
   "address": 13541,
   "type": "line",
   "text": "String record: the icon for one player."
  },
  {
   "address": 13553,
   "type": "line",
   "text": "String record: the colour icon ($57), second status line."
  },
  {
   "address": 13557,
   "type": "line",
   "text": "String record: the black-and-white icon ($58)."
  },
  {
   "address": 13561,
   "type": "line",
   "text": "String record: the URIDIUM logo (codes $31-$39, $7D) in the middle of the second status line."
  },
  {
   "address": 13584,
   "type": "line",
   "text": "String record: \"Hi-score\", second status line."
  },
  {
   "address": 13606,
   "type": "line",
   "text": "String record: the best score and initials, \"12000 AEB\" at the start; enter_hiscore rewrites it from $352A."
  },
  {
   "address": 13610,
   "type": "line",
   "text": "The digits and initials of the status line's best score, written by enter_hiscore."
  },
  {
   "address": 13626,
   "type": "line",
   "text": "String record: the status line's joystick icons for two players with a joystick each."
  },
  {
   "address": 13643,
   "type": "line",
   "text": "String record: the status line's icon for one player."
  },
  {
   "address": 13662,
   "type": "line",
   "text": "String record: the status line's icons for two players sharing a joystick."
  },
  {
   "address": 13680,
   "type": "line",
   "text": "Low (three bytes) and high (three) bytes of the three option strings above, by $5C."
  },
  {
   "address": 13683,
   "type": "line",
   "text": "The high bytes of the three option strings."
  },
  {
   "address": 13686,
   "type": "line",
   "text": "String record: \"HEWSON\", title page, row 6."
  },
  {
   "address": 13695,
   "type": "line",
   "text": "String record: \"presents\", row 9."
  },
  {
   "address": 13706,
   "type": "line",
   "text": "String record: the URIDIUM logo, row 12."
  },
  {
   "address": 13719,
   "type": "line",
   "text": "String record: \"(c) Graftgold Ltd. 1986.\", row 15 (the copyright sign is code $59)."
  },
  {
   "address": 13744,
   "type": "line",
   "text": "String record: \"Designed and programmed by\", row 18."
  },
  {
   "address": 13773,
   "type": "line",
   "text": "String record: \"Andrew Braybrook.\", row 21."
  },
  {
   "address": 13793,
   "type": "line",
   "text": "String record: \"Hall of Fame\", row 6."
  },
  {
   "address": 13808,
   "type": "line",
   "text": "The hall of fame: eight 22-byte entries from $35F0, each a string record (\"1.    12000 AEB\" down to \"8.     5000    \", rows 9 to 23) followed by the score as four BCD bytes (enter_hiscore compares and moves them)."
  },
  {
   "address": 13813,
   "type": "line",
   "text": "The digits and initials of the best entry, which enter_hiscore copies to the status line and the giant message."
  },
  {
   "address": 13830,
   "type": "line",
   "text": "Hall of fame entry 2: \"2.    11000\" and its score."
  },
  {
   "address": 13852,
   "type": "line",
   "text": "Hall of fame entry 3: \"3.    10000\" and its score."
  },
  {
   "address": 13874,
   "type": "line",
   "text": "Hall of fame entry 4: \"4.     9000\" and its score."
  },
  {
   "address": 13896,
   "type": "line",
   "text": "Hall of fame entry 5: \"5.     8000\" and its score."
  },
  {
   "address": 13918,
   "type": "line",
   "text": "Hall of fame entry 6: \"6.     7000\" and its score."
  },
  {
   "address": 13940,
   "type": "line",
   "text": "Hall of fame entry 7: \"7.     6000\" and its score."
  },
  {
   "address": 13962,
   "type": "line",
   "text": "Hall of fame entry 8: \"8.     5000\" and its score, the bottom of the table."
  },
  {
   "address": 13984,
   "type": "line",
   "text": "String record: \"Colour\", row 0, column 15 (colour_keys)."
  },
  {
   "address": 13997,
   "type": "line",
   "text": "String record: \"Blck-Whte\"."
  },
  {
   "address": 14009,
   "type": "line",
   "text": "String record: \"Demo\", printed before the demo flight."
  },
  {
   "address": 14021,
   "type": "line",
   "text": "The generator ports' flashing colours, eight steps (port_colour)."
  },
  {
   "address": 14029,
   "type": "line",
   "text": "Low bytes of the play loop's eight rotating calls, one a frame (status_line, wave_control, print_score, pause_check, rts_2bbe, spawn_mine, port_colour, pause_check)."
  },
  {
   "address": 14037,
   "type": "line",
   "text": "High bytes of the rotating calls."
  },
  {
   "address": 14045,
   "type": "line",
   "text": "Low bytes of the demo's four rotating calls (status_line, spawn_mine, colour_keys, option_keys)."
  },
  {
   "address": 14049,
   "type": "line",
   "text": "High bytes of the demo's rotating calls."
  },
  {
   "address": 14053,
   "type": "line",
   "text": "Seven handler addresses for the enemy states 0, 2 .. 12 (enemies_frame): $2BBE (an RTS) for 0 and 12, fighter_move, bullet_move, explosion_move, mine_appear, mine_move."
  },
  {
   "address": 14054,
   "type": "line",
   "text": "The high byte of enemy_state_handlers' first entry; the rest of the table follows."
  },
  {
   "address": 14067,
   "type": "line",
   "text": "Per wave type (0-15): the fighters' horizontal speed (new_wave)."
  },
  {
   "address": 14083,
   "type": "line",
   "text": "Per wave type: the fighters' vertical speed."
  },
  {
   "address": 14099,
   "type": "line",
   "text": "Per wave type: the base firing chance, to which half the lives, the level and the difficulty are added."
  },
  {
   "address": 14115,
   "type": "line",
   "text": "Per wave type: the bullet sprite shape."
  },
  {
   "address": 14131,
   "type": "line",
   "text": "Per wave type: the score entry each fighter is worth (4 = 100 up to 9 = 1000)."
  },
  {
   "address": 14147,
   "type": "line",
   "text": "Per wave type: how much faster than the fighter its bullets fly."
  },
  {
   "address": 14151,
   "type": "line",
   "text": "The base of the bullet hit box's top (hits_manta reads $3747 + shape, shapes $0C-$12): inside type_bullet_speed."
  },
  {
   "address": 14159,
   "type": "line",
   "text": "The base of the bullet hit box's bottom ($374F + shape): inside type_bullet_speed."
  },
  {
   "address": 14163,
   "type": "line",
   "text": "For bullet and mine shapes $0C-$12, the top of the box (relative) in which they touch the Manta (hits_manta)."
  },
  {
   "address": 14171,
   "type": "line",
   "text": "For shapes $0C-$12, the bottom of the hit box."
  },
  {
   "address": 14179,
   "type": "line",
   "text": "Row colours for the launch screen (start_life, 21 rows)."
  },
  {
   "address": 14200,
   "type": "line",
   "text": "Row colours for the title page (21 rows)."
  },
  {
   "address": 14221,
   "type": "line",
   "text": "Row colours for the bonus screens after the chamber."
  },
  {
   "address": 14242,
   "type": "line",
   "text": "Row colours for the hall-of-fame entry, rewritten every frame by cycle_colours."
  },
  {
   "address": 14243,
   "type": "line",
   "text": "colours_flash's second and third rows, set by cycle_colours."
  },
  {
   "address": 14245,
   "type": "line",
   "text": "colours_flash's fourth row."
  },
  {
   "address": 14246,
   "type": "line",
   "text": "colours_flash's fifth and sixth rows."
  },
  {
   "address": 14248,
   "type": "line",
   "text": "colours_flash's seventh row."
  },
  {
   "address": 14249,
   "type": "line",
   "text": "colours_flash's eighth and ninth rows."
  },
  {
   "address": 14251,
   "type": "line",
   "text": "colours_flash's tenth row."
  },
  {
   "address": 14252,
   "type": "line",
   "text": "colours_flash's eleventh row; the last rows stay black."
  },
  {
   "address": 14259,
   "type": "line",
   "text": "The colours cycle_colours rotates through."
  },
  {
   "address": 14260,
   "type": "line",
   "text": "flash_colours read one step on (cycle_colours takes five in a row from the frame's position)."
  },
  {
   "address": 14261,
   "type": "line",
   "text": "flash_colours read two steps on."
  },
  {
   "address": 14262,
   "type": "line",
   "text": "flash_colours read three steps on."
  },
  {
   "address": 14263,
   "type": "line",
   "text": "flash_colours read four steps on; the table repeats its first colours so that the five reads never run past it."
  },
  {
   "address": 14271,
   "type": "line",
   "text": "Row colours for the start of a life's screen (14 rows)."
  },
  {
   "address": 14285,
   "type": "line",
   "text": "Row colours for \"Game Over!\" (11 rows)."
  },
  {
   "address": 14296,
   "type": "line",
   "text": "String record: \"Player 1\", row 10."
  },
  {
   "address": 14307,
   "type": "line",
   "text": "String record: \"Player 2\", row 10."
  },
  {
   "address": 14318,
   "type": "line",
   "text": "String record: \"Game On!\", row 13."
  },
  {
   "address": 14329,
   "type": "line",
   "text": "String record: \" 3     left.\", row 16; start_life writes the lives into it at $37FB/$37FC."
  },
  {
   "address": 14331,
   "type": "line",
   "text": "The lives' tens digit in \" 3     left.\", written by start_life."
  },
  {
   "address": 14332,
   "type": "line",
   "text": "The lives' units digit, then \"     left.\"."
  },
  {
   "address": 14344,
   "type": "line",
   "text": "String record: \"Game Over!\"."
  },
  {
   "address": 14357,
   "type": "line",
   "text": "String record: \"Destruct sequence primed!\"."
  },
  {
   "address": 14385,
   "type": "line",
   "text": "String record: \"Formation annihilation bonus:\"."
  },
  {
   "address": 14417,
   "type": "line",
   "text": "String record: \"Ship destruct bonus:\"."
  },
  {
   "address": 14440,
   "type": "line",
   "text": "String record: \"100 X 00 = 0000\", row 13; count_bonus writes the count's digits into it (at $3870/$3871 and $3875/$3876) and the callers its column."
  },
  {
   "address": 14448,
   "type": "line",
   "text": "The count's tens digit in the first number of the bonus line."
  },
  {
   "address": 14449,
   "type": "line",
   "text": "The count's units digit, then the rest of the multiplication."
  },
  {
   "address": 14453,
   "type": "line",
   "text": "The count's tens digit in the total."
  },
  {
   "address": 14454,
   "type": "line",
   "text": "The count's units digit in the total, then \"00\"."
  },
  {
   "address": 14458,
   "type": "line",
   "text": "String record: \"You have amassed a great score!\"."
  },
  {
   "address": 14492,
   "type": "line",
   "text": "String record: \"Please enter your initials.\"."
  },
  {
   "address": 14522,
   "type": "line",
   "text": "String record: the initials being entered, row 19, column 17 (\"A..\" at first; enter_letter writes into it)."
  },
  {
   "address": 14524,
   "type": "line",
   "text": "The first initial being entered (enter_letter writes the letter at $38BC + the letter's number)."
  },
  {
   "address": 14525,
   "type": "line",
   "text": "The second initial; enter_hiscore sets it to \".\" at the start."
  },
  {
   "address": 14526,
   "type": "line",
   "text": "The third initial, then the record's end."
  },
  {
   "address": 14531,
   "type": "line",
   "text": "The 27 characters an initial can be: A-Z (with the narrow I at code $16) and a space."
  },
  {
   "address": 14558,
   "type": "line",
   "text": "The fuel rod chamber's colours over five fade-in steps: background, multicolour 1, multicolour 2 (three tables of five)."
  },
  {
   "address": 14563,
   "type": "line",
   "text": "chamber_fade's second table: multicolour 1 for each step."
  },
  {
   "address": 14568,
   "type": "line",
   "text": "chamber_fade's third table: multicolour 2 for each step."
  },
  {
   "address": 14573,
   "type": "line",
   "text": "Score entries, the hundreds and thousands byte (BCD), entries 0-11: 0, 10, 25, 50, 100, 150, 250, 500, 750, 1000, 2000, 5000 points with score_lo."
  },
  {
   "address": 14585,
   "type": "line",
   "text": "Score entries, the tens and units byte (BCD)."
  },
  {
   "address": 14597,
   "type": "line",
   "text": "The chamber's left column for each step: screen row (with the next table, the column)."
  },
  {
   "address": 14604,
   "type": "line",
   "text": "The left column's screen columns for each step."
  },
  {
   "address": 14610,
   "type": "line",
   "text": "The left column's screen column at the last step, the seventh byte of f_390C."
  },
  {
   "address": 14611,
   "type": "line",
   "text": "The chamber's right column for each step: row and column."
  },
  {
   "address": 14618,
   "type": "line",
   "text": "The right column's screen columns for each step."
  },
  {
   "address": 14625,
   "type": "line",
   "text": "Frames between the lit side changing, for each step: faster as the steps go on."
  },
  {
   "address": 14632,
   "type": "line",
   "text": "The value's four characters as drawn: two digits written by two_digits, then $80 $80, which in the chamber's character set is the digit 0, so the value reads in hundreds (\"1000\")."
  },
  {
   "address": 14633,
   "type": "line",
   "text": "The value's second digit, then the two $80 characters (the digit 0)."
  },
  {
   "address": 14636,
   "type": "line",
   "text": "\"Quit\" as four of the chamber's characters ($A0-$A3)."
  },
  {
   "address": 14640,
   "type": "line",
   "text": "The value's colour for each step."
  },
  {
   "address": 14647,
   "type": "line",
   "text": "Eight times the slot number (0, 8, .. $78): the offset of each shot's own character in the character set (draw_bullets)."
  },
  {
   "address": 14663,
   "type": "line",
   "text": "25 voice set-ups of four bytes for start_voice: waveform (with the gate bit added at start), attack/decay, sustain/release, gate time in frames."
  },
  {
   "address": 14763,
   "type": "line",
   "text": "46 sound effects of 16 bytes (start_effect, effect n at $39AB + 16 x (n - 1)): the voice set-up, then the start frequency, frequency step, step time and its reload, duration, pulse width and step, step mode, restart frequency and the effect chained after. Effects $27-$2D are the music's seven instruments, whose start frequency music_tick rewrites for each note."
  },
  {
   "address": 15085,
   "type": "line",
   "text": "The high byte of effect $15's start frequency (the chamber's countdown beep), written by chamber_tick from countdown_pitches."
  },
  {
   "address": 15101,
   "type": "line",
   "text": "The high byte of effect $16's start frequency (the chamber's flash beep), written by fuel_rod_chamber from flash_pitches."
  },
  {
   "address": 15165,
   "type": "line",
   "text": "Sound effects $1A-$2E continued: the game's later effects and, from $3C0B, the seven music instruments ($27-$2D)."
  },
  {
   "address": 15499,
   "type": "line",
   "text": "The countdown beep's pitch for each countdown value, higher as it nears zero."
  },
  {
   "address": 15509,
   "type": "line",
   "text": "The flash beep's pitch for each step of the chamber (index 1-6); halved on the quit side."
  },
  {
   "address": 15517,
   "type": "line",
   "text": "Music patterns (the song's 31, here and from $3DAF): $00 then a control byte (octave in bits 0-2, instrument in bits 4-7), notes as length in the high nibble and pitch in the low, $FF at the end."
  },
  {
   "address": 15616,
   "type": "line",
   "text": "The high bytes of the sixteen notes' frequencies at the top octave, one per pitch nibble 0-15 (music_tick halves them per octave)."
  },
  {
   "address": 15632,
   "type": "line",
   "text": "The low bytes of the sixteen notes' frequencies; the last two are the first bytes of instr_hi."
  },
  {
   "address": 15646,
   "type": "line",
   "text": "High bytes of the seven instruments' effect records ($3C0B-$3C6B, effects $27-$2D)."
  },
  {
   "address": 15653,
   "type": "line",
   "text": "Low bytes of the instruments' records."
  },
  {
   "address": 15660,
   "type": "line",
   "text": "The title tune: 22 rows of three pattern numbers, one per voice, ending with $FF."
  },
  {
   "address": 15729,
   "type": "line",
   "text": "Low bytes of the 31 patterns' addresses."
  },
  {
   "address": 15760,
   "type": "line",
   "text": "High bytes of the patterns' addresses."
  },
  {
   "address": 15791,
   "type": "line",
   "text": "The rest of the music patterns (format as patterns_a)."
  },
  {
   "address": 16025,
   "type": "line",
   "text": "The song's position: the row ($3E99) and $FE when the next row is wanted, $FF when the song has ended ($3E9A)."
  },
  {
   "address": 16026,
   "type": "line",
   "text": "$FE when music_tick should read the next song row, $FF when the song has ended."
  },
  {
   "address": 16027,
   "type": "line",
   "text": "Unused: the RAM fill pattern ($00, $FF) between the music data and the raster handlers."
  },
  {
   "address": 16128,
   "type": "line",
   "text": "Raster interrupt at line 252, below the playfield: $D016 = $C0 and $D018 = $2D (the status lines' character set at $7000 and screen $4800, hires, 38 columns) for the bottom status line and the top of the next frame, background black. Next interrupt line 82 at irq_playfield. Counts the frame flag $2F up and runs the sound driver (sound_frame) with X and Y saved."
  },
  {
   "address": 16184,
   "type": "line",
   "text": "Raster interrupt at line 82, where the playfield starts: after a short delay to reach the edge of the line, the fine horizontal scroll $2C into $D016 with multicolour on and 38 columns, the playfield character set from the operand at $3F4A ($D018 = $2F: characters at $7800), and the background $4A. Next interrupt line 97 at irq_frame_start. Also counts $2F and drives the cassette motor line (cassette_motor)."
  },
  {
   "address": 16202,
   "type": "line",
   "text": "The operand of LDA #$2F in irq_playfield, the playfield's $D018: $2F in play; level_setup and new_game set it. The rest of irq_playfield sets the background, the next interrupt and the frame flag."
  },
  {
   "address": 16243,
   "type": "line",
   "text": "Raster interrupt at line 97: clears the frame flag $2F, which lets the main loop start the frame's work while the beam is below the top of the playfield, and points the next interrupt at irq_bottom, line 252."
  },
  {
   "address": 16275,
   "type": "line",
   "text": "The raster interrupt for every screen that is not play (title, launch, hall of fame, chamber, bonus): $D018 = $2D, black background, $D011 = $1B, $D016 = $C8 (hires, 40 columns). It fires twice a frame, at lines 128 and 0: the operand of LDA #$80 at $3FAF is both the value put in the frame flag $2F and the next raster line, and is flipped between $80 and 0 each time. So $2F is $80 from line 128 and 0 from line 0, and the sound driver runs once a frame, at line 128; cassette_motor runs at both. Measured: 400 interrupts and 200 calls of sound_frame in 200 frames of the title."
  },
  {
   "address": 16304,
   "type": "line",
   "text": "The operand of LDA #$80 in title_irq, flipped between $80 and 0 each time: stored in $2F and written to $D012 as the next interrupt's line (128 or 0). The rest acknowledges the interrupt, drives the cassette line and runs the sound driver when $2F is set."
  },
  {
   "address": 16342,
   "type": "line",
   "text": "The end of title_irq, and also the NMI vector: an RTI, so the RESTORE key does nothing."
  },
  {
   "address": 16384,
   "type": "line",
   "text": "Sprite shapes $00-$05: the Manta's transporter, a long ship in six multicolour pieces placed side by side in two rows (rec_transporter)."
  },
  {
   "address": 16768,
   "type": "line",
   "text": "Shapes $06-$0B: the transporter's doors, sets of vertical bars that narrow as launch_sequence steps sprite 6 from $07 to $0B (sprite 7 shows $06) and the Manta comes out."
  },
  {
   "address": 17152,
   "type": "line",
   "text": "Shapes $0C-$10: the fighters' bullets, horizontal dashes of different lengths (type_bullet)."
  },
  {
   "address": 17472,
   "type": "line",
   "text": "Shapes $11-$13: the homing mine as it appears ($11, a cross), two small blobs ($12, the enemy bullet shape in type_bullet) and an empty shape ($13). The mines' other shapes are $14-$1D."
  },
  {
   "address": 17664,
   "type": "line",
   "text": "Shapes $14-$1D: a burst of dots, used both ways: a fighter's explosion steps through them upwards ($14 to $1D, explosion_move) and a mine materialises through them downwards (mine_appear). $1E and $1F are empty."
  },
  {
   "address": 19456,
   "type": "line",
   "text": "Shapes $30-$3A: the Manta's explosion, a ball of fire breaking into scattered pieces (manta_explodes steps the eight sprites from $30); $3B-$3F empty."
  },
  {
   "address": 20480,
   "type": "line",
   "text": "Shapes $40-$4F: the Manta facing right, rolling: level ($41), edge-on ($4D, reached by fire and up), and the frames between, sixteen in all."
  },
  {
   "address": 21504,
   "type": "line",
   "text": "Shapes $50-$5F: the Manta facing left, rolling, from level ($59) through edge-on."
  },
  {
   "address": 22528,
   "type": "line",
   "text": "Shapes $60-$6D: the Manta seen nose-on and tail-on as it turns in a half-loop ($6E and $6F empty). Shapes $40-$6F are also the source of the shadows at $70-$9F (thicken_shapes)."
  },
  {
   "address": 26624,
   "type": "line",
   "text": "Shapes $A0-$AF: the sixteen types of enemy fighter, facing one way; a wave of type n flies shape $A0 + n or its mirror $B0 + n."
  },
  {
   "address": 27648,
   "type": "line",
   "text": "Shapes $B0-$BF: the sixteen fighters mirrored, for waves flying the other way."
  },
  {
   "address": 28672,
   "type": "line",
   "text": "The status lines' font, top halves, codes $00-$7F: the loaded 8-row font spread by spread_font, one glyph row in two. Digits $00-$09, a-z $0A-$23, punctuation, the wide capitals $3A-$53 and their right halves $5A-$73, the joystick and colour icons, the URIDIUM logo at $31-$39 and $7D (copy_logo_glyphs)."
  },
  {
   "address": 29064,
   "type": "line",
   "text": "The top halves of the URIDIUM logo's glyphs $31-$39, copied from the play characters by copy_logo_glyphs."
  },
  {
   "address": 29128,
   "type": "line",
   "text": "The status font's top halves, continued: codes $39-$7C, the wide capitals' halves, the icons and the rest of the logo."
  },
  {
   "address": 29672,
   "type": "line",
   "text": "The top half of the logo's last glyph, $7D."
  },
  {
   "address": 29696,
   "type": "line",
   "text": "The status font's bottom halves, codes $80-$FF: glyph rows 4-7 of each character, printed on the row below its top half (put_char)."
  },
  {
   "address": 30088,
   "type": "line",
   "text": "The bottom halves of the logo glyphs, $B1-$B9."
  },
  {
   "address": 30152,
   "type": "line",
   "text": "The status font's bottom halves, continued: $B9, the end of the logo's bottom row (copy_logo_glyphs writes it with $B1-$B8), then $BA-$FC, the bottom halves of codes $3A-$7C: the wide capitals, the icons and the rest."
  },
  {
   "address": 30696,
   "type": "line",
   "text": "The bottom half of the logo's last glyph, $FD."
  },
  {
   "address": 30720,
   "type": "line",
   "text": "The playfield's characters $00-$1F. At load $00-$13 are the URIDIUM logo in two rows; once copied to the status font, $00-$05 and $10-$15 become the six shots' own characters, rebuilt every frame by draw_bullets."
  },
  {
   "address": 30784,
   "type": "line",
   "text": "Characters $08 and $09 of the logo's top row."
  },
  {
   "address": 30792,
   "type": "line",
   "text": "Character $09, the logo's last top glyph, copied to the status font as $7D."
  },
  {
   "address": 30800,
   "type": "line",
   "text": "Characters $0A-$12: the logo's bottom row, copied as the status glyphs $B1-$B9."
  },
  {
   "address": 30864,
   "type": "line",
   "text": "Character $12, the end of the logo's bottom row in the play set (copied as status glyph $B9)."
  },
  {
   "address": 30872,
   "type": "line",
   "text": "Character $13, the logo's last bottom glyph (status $FD), then $14-$1F."
  },
  {
   "address": 30936,
   "type": "line",
   "text": "Characters $1B-$1F of the play set, all zero in the snapshot."
  },
  {
   "address": 30976,
   "type": "line",
   "text": "Characters $20-$7F, the same on every Dreadnought: the space ($20), hull edges and plating, the stars $42 and $43 (whose rows draw_stars rewrites), the generator ports $59-$5B, the runway's end $6F and the wreckage $70-$7F that targets $90-$9F turn into."
  },
  {
   "address": 31253,
   "type": "line",
   "text": "Rows of the star characters $42/$43 that draw_stars rewrites with the fine scroll's mask."
  },
  {
   "address": 31258,
   "type": "line",
   "text": "Another star row draw_stars rewrites."
  },
  {
   "address": 31259,
   "type": "line",
   "text": "The last star row draw_stars rewrites, then the rest of the fixed characters."
  },
  {
   "address": 31323,
   "type": "line",
   "text": "The fixed characters continued from the fourth row of character $4B to $7F: hull plating and edges, the generator ports $59-$5B, the runway's end $6F, and the wreckage $70-$7F that a target becomes when shot (its code minus $20)."
  },
  {
   "address": 31328,
   "type": "line",
   "text": "Character $4C."
  },
  {
   "address": 41984,
   "type": "line",
   "text": "Piece index low bytes while a map is built (by piece number); then the 16 stars' screen row addresses, high byte (make_stars)."
  },
  {
   "address": 41985,
   "type": "line",
   "text": "Piece 1's address, low byte: the piece build_map repeats for a 0 in a level's list."
  },
  {
   "address": 42000,
   "type": "line",
   "text": "The stars' screen addresses, low byte."
  },
  {
   "address": 42016,
   "type": "line",
   "text": "The stars' characters, $42 or $43."
  },
  {
   "address": 42032,
   "type": "line",
   "text": "The six shots' map addresses, low byte (draw_bullets)."
  },
  {
   "address": 42048,
   "type": "line",
   "text": "The shots' map addresses, high byte."
  },
  {
   "address": 42064,
   "type": "line",
   "text": "The map character each shot covers, put back every frame."
  },
  {
   "address": 42080,
   "type": "line",
   "text": "Each shot's step in columns a frame (2 or $FE), 0 for a free slot."
  },
  {
   "address": 42096,
   "type": "line",
   "text": "Each shot's pixel row inside its character."
  },
  {
   "address": 42112,
   "type": "line",
   "text": "The stars' colour RAM addresses, high byte."
  },
  {
   "address": 42128,
   "type": "line",
   "text": "Each enemy sprite's state: 0 free, 2 fighter, 4 bullet, 6 explosion, 8 mine appearing, 10 homing mine (enemies_frame)."
  },
  {
   "address": 42136,
   "type": "line",
   "text": "Each enemy's horizontal velocity, low byte."
  },
  {
   "address": 42144,
   "type": "line",
   "text": "Each enemy's vertical velocity."
  },
  {
   "address": 42152,
   "type": "line",
   "text": "Each enemy's horizontal velocity, high byte."
  },
  {
   "address": 42160,
   "type": "line",
   "text": "Each enemy's timer: the steps of a fighter's path, a bullet's or mine's life."
  },
  {
   "address": 42168,
   "type": "line",
   "text": "Each fighter's current path flags."
  },
  {
   "address": 42176,
   "type": "line",
   "text": "Each enemy's horizontal velocity, fraction."
  },
  {
   "address": 42184,
   "type": "line",
   "text": "Each enemy's vertical velocity, fraction."
  },
  {
   "address": 42192,
   "type": "line",
   "text": "The ragged edge of the vaporising Dreadnought: each row's column offset from $89/$8A, row 0 at $A4E1 down to row 16 at $A4D1 (random_heights, vaporise_column)."
  },
  {
   "address": 42216,
   "type": "line",
   "text": "Each enemy's state at the screen edge: $80 on screen, then $FF or 0 for the side it went off."
  },
  {
   "address": 42240,
   "type": "line",
   "text": "Piece index high bytes while a map is built; then a flag for each screen row that has a star (make_stars)."
  },
  {
   "address": 42241,
   "type": "line",
   "text": "Piece 1's address, high byte."
  },
  {
   "address": 42264,
   "type": "line",
   "text": "A flag for each screen column that has a star."
  },
  {
   "address": 42496,
   "type": "line",
   "text": "The fuel rod chamber's screen, the loaded screen copied here by game_start (fuel_rod_chamber copies rows 4-24 from $A6A0): a grey panel of six rows of paired slots joined by arrows, narrow at the top and widest at the bottom, with the countdown digit in a box at each top corner."
  },
  {
   "address": 43520,
   "type": "line",
   "text": "Level 7's map list (Platinum), from the block game_start copies from $7400: piece numbers for columns 64-511, a 0, then overlay records (a row's page, a column, a piece), ending with three zeros."
  },
  {
   "address": 43992,
   "type": "line",
   "text": "Level 8's map list (Tungsten), as level7_map, followed by zeros."
  },
  {
   "address": 45056,
   "type": "line",
   "text": "One-time set-up of a few variables at start-up: $BC = 1, $BB = $80, $B7/$B8 = $0010, $94 = 0 (cassette motor flag, cassette_motor), and the music volume $95 = 5."
  },
  {
   "address": 45081,
   "type": "line",
   "text": "Reads the joystick. With no keyboard row selected ($DC00 = $FF) it ANDs $DC00 with $DC01 (the two operands, which next_turn rewrites in two-stick mode), so a stick in either port moves the Manta. $16 = vertical (-1 up, +1 down, 0), $17 = horizontal (-1 left, +1 right, 0), $18 = the fire bit, 0 while fire is held and $10 while not. The bit masks come from $B055."
  },
  {
   "address": 45093,
   "type": "line",
   "text": "The low byte of read_stick's first port, $DC00 or $DC01 (written by title, next_turn and option_keys)."
  },
  {
   "address": 45094,
   "type": "line",
   "text": "The high byte of read_stick's first port ($DC)."
  },
  {
   "address": 45096,
   "type": "line",
   "text": "The low byte of read_stick's second port, ANDed with the first."
  },
  {
   "address": 45097,
   "type": "line",
   "text": "The high byte of the second port. Then read_stick turns the bits into the directions $16, $17 and the fire bit $18."
  },
  {
   "address": 45141,
   "type": "line",
   "text": "The eight single-bit masks $01, $02 .. $80, by sprite or bit number."
  },
  {
   "address": 45142,
   "type": "line",
   "text": "bit_masks' $02: down, which read_stick tests."
  },
  {
   "address": 45143,
   "type": "line",
   "text": "bit_masks' $04: left."
  },
  {
   "address": 45144,
   "type": "line",
   "text": "bit_masks' $08: right, then $10-$80."
  },
  {
   "address": 45149,
   "type": "line",
   "text": "Reads hardware sprite $04 into the work copy at $02-$0E: its mask and inverse mask, colour ($0D), shape pointer from $4BF8,y ($0E), X ($05) and X high bit as $00/$FF ($06), Y ($07) and whether it is enabled ($08)."
  },
  {
   "address": 45202,
   "type": "line",
   "text": "As sprite_get, and also the sprite's expand-Y ($09), priority ($0A), multicolour ($0B) and expand-X ($0C) bits."
  },
  {
   "address": 45283,
   "type": "line",
   "text": "Writes the work copy at $04-$0E back to hardware sprite $04: colour, multicolour, expand-Y, expand-X and priority bits, then falls into sprite_put."
  },
  {
   "address": 45375,
   "type": "line",
   "text": "Writes sprite $04's shape pointer ($0E into $4BF8,y), X and Y, X high bit from bit 0 of $06, and enable bit from $08, back into the video chip."
  },
  {
   "address": 45449,
   "type": "line",
   "text": "Fills X whole screen rows of 40 bytes with A, from the address in $1C/$1D, and leaves $1C/$1D on the row after the last."
  },
  {
   "address": 45492,
   "type": "line",
   "text": "Prints the four BCD bytes of the score at $20-$23 at row 2, column 1 (a caller sets the column first through the operand at $B1B9: 1 for player 1, $1F for player 2). Leading zeros print as spaces ($30) except the last digit, each digit through put_char."
  },
  {
   "address": 45497,
   "type": "line",
   "text": "The operand of LDA #$01 in print_score: the score's column, 1 for player 1 and $1F for player 2, written before each call. The rest prints the eight digits."
  },
  {
   "address": 45565,
   "type": "line",
   "text": "Scans the keys the title and the pause use into $19, a bit clear for a key held: bits 3-6 F7, F1, F3, F5 (row 0), bit 7 clear for either SHIFT (left from row 1, right from row 6), and bits 0-4 the joystick in port 1 (set for a direction or fire held), read with no row selected."
  },
  {
   "address": 45636,
   "type": "line",
   "text": "Busy wait: counts X down to zero Y times (about Y x 1,280 cycles from X = 0)."
  },
  {
   "address": 45643,
   "type": "line",
   "text": "Called from the raster interrupt. Drives the cassette motor line of the processor port: while no cassette key is down (bit 4 of $01 set) it switches the motor off (bit 5) and keeps $01's value in $94; once a key is down and $94 is non-zero it switches the motor on. In this disk release nothing else touches the cassette."
  },
  {
   "address": 45669,
   "type": "line",
   "text": "The pause message, row 0, column 15: \"  Pause   \" in the game's alphabet, printed by $2B76 when RUN/STOP pauses the game."
  },
  {
   "address": 45682,
   "type": "line",
   "text": "Waits until fire has been seen released on eight readings in a row, a short delay apart, so that the press that ended one screen does not count on the next."
  },
  {
   "address": 45703,
   "type": "line",
   "text": "Copies an 11-byte sprite record from ($1A) into $04-$0E (sprite number, masks, X, X high, Y, enable, expand, priority, multicolour, expand X, colour, shape) and writes it to the video chip with sprite_put_all."
  },
  {
   "address": 45717,
   "type": "line",
   "text": "Prints the string record at X/Y (low/high). A record is a row (below $18) and a column, then characters in the game's alphabet until one with bit 7 set; a first byte of $18 or more prints nothing. Each character goes through put_char. The string's position is left in $B4/$B5 and the read index in $BA."
  },
  {
   "address": 45766,
   "type": "line",
   "text": "Puts character $B6 at row $B4, column $B5 of the screen through the row address tables $B360 (high) and $B379 (low). Every character is two rows tall: its code on the row and the code with bit 7 set on the row below. Codes $3A-$59 (the wide capitals, m and w) are two columns wide: the code plus $20 goes in the next column, top and bottom. Advances $B5 by the width."
  },
  {
   "address": 45826,
   "type": "line",
   "text": "Copies X whole pages from ($B2) to ($B0)."
  },
  {
   "address": 45839,
   "type": "line",
   "text": "Copies Y + 1 bytes, from offset Y down to 0, from ($B2) to ($B0)."
  },
  {
   "address": 45851,
   "type": "line",
   "text": "Every fourth frame, while F5 is held (bit 6 of $19 clear): with SHIFT (F6) turns the music volume $95 down, without it up, between 0 and 15; then writes the volume as two digits into the string at $B3B8, sets the playing volume $EF and prints the string."
  },
  {
   "address": 45920,
   "type": "line",
   "text": "The screen's row addresses, high bytes, rows 0-24 (screen $4800)."
  },
  {
   "address": 45945,
   "type": "line",
   "text": "The screen's and colour RAM's row addresses, low bytes, rows 0-24."
  },
  {
   "address": 45970,
   "type": "line",
   "text": "Not referenced: a string record for row 2, column 12 (\"abmon : ... - \" in the game's alphabet, with zeros for digits), $B392-$B3A5, and 18 more bytes up to str_volume, left over from development."
  },
  {
   "address": 46008,
   "type": "line",
   "text": "String record: \"Volume 05\", row 0, column 15; volume_keys writes the digits at $B3C1/$B3C2."
  },
  {
   "address": 46017,
   "type": "line",
   "text": "The volume's tens digit."
  },
  {
   "address": 46018,
   "type": "line",
   "text": "The volume's units digit, then the string's end."
  },
  {
   "address": 46021,
   "type": "line",
   "text": "Not referenced: eleven bytes that decode as the middle of some code (CMP #$46, BEQ, CMP #$53, BNE), left over."
  },
  {
   "address": 46032,
   "type": "line",
   "text": "Level 14's map list (Galactium): piece numbers, a 0, overlay records, three zeros."
  },
  {
   "address": 46592,
   "type": "line",
   "text": "Level 12's map list (Quadmium)."
  },
  {
   "address": 47152,
   "type": "line",
   "text": "Level 11's map list (Tri-alloy)."
  },
  {
   "address": 47824,
   "type": "line",
   "text": "Level 10's map list (Kallisto)."
  },
  {
   "address": 48304,
   "type": "line",
   "text": "Level 13's map list (Ergonite); after it the RAM fill pattern to the end of the file."
  },
  {
   "address": 49152,
   "type": "line",
   "text": "For each character code of the giant message, the offset of its four piece numbers in giant_letters (build_message)."
  },
  {
   "address": 49248,
   "type": "line",
   "text": "Four map piece numbers per letter of the giant message (0 for none): each letter is built from up to four column pieces of the piece store."
  },
  {
   "address": 49408,
   "type": "line",
   "text": "Each level's wave list address, low byte (level 0, the message, has none)."
  },
  {
   "address": 49424,
   "type": "line",
   "text": "Each level's wave list address, high byte."
  },
  {
   "address": 49440,
   "type": "line",
   "text": "The fighters' path addresses, low byte, by path number: 1-40 used, the rest 0."
  },
  {
   "address": 49552,
   "type": "line",
   "text": "The path addresses' high bytes."
  },
  {
   "address": 49664,
   "type": "line",
   "text": "57 wave records of 16 bytes (new_wave): six path numbers, six start heights, the spacing, the entry side, the type and one spare byte. Waves $12-$15 are also the fillers flown once a level's list has run out."
  },
  {
   "address": 50576,
   "type": "line",
   "text": "The fifteen levels' wave lists: wave numbers in the order they fly, each list ending with $FF."
  },
  {
   "address": 50760,
   "type": "line",
   "text": "The 40 fighter paths: steps of flags (1 and 2 horizontal acceleration, 4 down, 8 up, $10 fire, $20 stop, $40 follow the Manta's height), with bit 7 set for a step whose length follows, ending with $FF (fighter_move)."
  },
  {
   "address": 52736,
   "type": "line",
   "text": "Level 15's map list (Uridium), then zeros."
  },
  {
   "address": 53760,
   "type": "line",
   "text": "The fuel rod chamber's characters $80-$BF, copied to $7C00 for the chamber screen (fuel_rod_chamber)."
  },
  {
   "address": 54272,
   "type": "line",
   "text": "Dreadnought tile set A, characters $80-$FF, used by levels 2, 4, 8, 11 and 14: walls $80-$8F (fatal to fly into), targets $90-$9F (2 x 2 and 3 x 3 shapes and single characters that shots destroy), and the hull's plating and markings."
  },
  {
   "address": 55296,
   "type": "line",
   "text": "In RAM, tile set B's first characters; the label comes from colour RAM writes (STA $D800,Y), whose meaning here is the chip's."
  },
  {
   "address": 55326,
   "type": "line",
   "text": "In RAM, a tile set B byte named by the status colour writes to $D81E."
  },
  {
   "address": 55336,
   "type": "line",
   "text": "In RAM, a tile set B byte named by colour writes to $D828."
  },
  {
   "address": 55366,
   "type": "line",
   "text": "In RAM, a tile set B byte named by colour writes to $D846."
  },
  {
   "address": 55376,
   "type": "line",
   "text": "In RAM, a tile set B byte named by colour writes to $D850."
  },
  {
   "address": 55386,
   "type": "line",
   "text": "In RAM, a tile set B byte named by colour_icons' writes to $D85A."
  },
  {
   "address": 55387,
   "type": "line",
   "text": "In RAM, a tile set B byte named by colour_icons' writes to $D85B."
  },
  {
   "address": 55406,
   "type": "line",
   "text": "In RAM, a tile set B byte named by colour writes to $D86E."
  },
  {
   "address": 55416,
   "type": "line",
   "text": "In RAM, a tile set B byte named by colour writes to $D878."
  },
  {
   "address": 55426,
   "type": "line",
   "text": "In RAM, a tile set B byte named by colour_icons' writes to $D882."
  },
  {
   "address": 55427,
   "type": "line",
   "text": "In RAM, a tile set B byte named by colour_icons' writes to $D883."
  },
  {
   "address": 55446,
   "type": "line",
   "text": "In RAM, a tile set B byte named by colour writes to $D896, then the rest of the set."
  },
  {
   "address": 55510,
   "type": "line",
   "text": "Tile set B, continued: characters $9A-$FF, the rest of the targets and the hull."
  },
  {
   "address": 56320,
   "type": "line",
   "text": "Dreadnought tile set C, for levels 1, 3, 6, 10, 12 and 15."
  },
  {
   "address": 57344,
   "type": "line",
   "text": "The first bytes of the block game_start copies from $8000: the cartridge start vectors ($0900, $0900) and the CBM80 signature. The copy left at $8000 makes a hardware reset restart the game; RESTORE does nothing, since the NMI vector points at an RTI."
  },
  {
   "address": 57360,
   "type": "line",
   "text": "Each level's map list address, low byte (level 0 is the giant message at $8010)."
  },
  {
   "address": 57376,
   "type": "line",
   "text": "Each level's map list address, high byte."
  },
  {
   "address": 57392,
   "type": "line",
   "text": "Each level's colour scheme (colour_schemes)."
  },
  {
   "address": 57408,
   "type": "line",
   "text": "Each level's tile set: the page $D4, $D8 or $DC whose four pages copy_tile_set copies to $7C00, characters $80-$FF."
  },
  {
   "address": 57424,
   "type": "line",
   "text": "Each level's name string, low byte."
  },
  {
   "address": 57440,
   "type": "line",
   "text": "Each level's name string, high byte."
  },
  {
   "address": 57456,
   "type": "line",
   "text": "String records of the names of levels 1-7 for the status line: \"01. Zinc.\", \"02. Lead.\", \"03. Copper.\", \"04. Silver.\", \"05. Iron.\", \"06. Gold.\", \"07. Platinum.\"."
  },
  {
   "address": 57600,
   "type": "line",
   "text": "The map pieces (index_pieces numbers them from 1): each a count of columns, and for each column a count of characters and the characters from the bottom row up. Pieces 1-46 start here, most of them one to six columns wide; piece 1 is a single empty column."
  },
  {
   "address": 58624,
   "type": "line",
   "text": "Map pieces, continued: the end of piece 46 and pieces 47-80."
  },
  {
   "address": 59648,
   "type": "line",
   "text": "Map pieces, continued: the end of piece 80 and pieces 81-132."
  },
  {
   "address": 60672,
   "type": "line",
   "text": "The last byte of map piece 132, then pieces 133-148 from $ED01, then the 0 that ends the store at $EF54."
  },
  {
   "address": 61269,
   "type": "line",
   "text": "String records of the names of levels 8-15: \"08. Tungsten.\", \"09. Iridon.\", \"10. Kallisto.\", \"11. Tri-alloy.\", \"12. Quadmium.\", \"13. Ergonite.\", \"14. Galactium.\", \"15. Uridium.\" (level 0 shares the last)."
  },
  {
   "address": 61440,
   "type": "line",
   "text": "Level 3's map list (Copper)."
  },
  {
   "address": 61928,
   "type": "line",
   "text": "Level 2's map list (Lead)."
  },
  {
   "address": 62488,
   "type": "line",
   "text": "Level 1's map list (Zinc)."
  },
  {
   "address": 63008,
   "type": "line",
   "text": "Level 9's map list (Iridon)."
  },
  {
   "address": 63696,
   "type": "line",
   "text": "Level 4's map list (Silver)."
  },
  {
   "address": 64272,
   "type": "line",
   "text": "Level 5's map list (Iron)."
  },
  {
   "address": 64808,
   "type": "line",
   "text": "Level 6's map list (Gold)."
  },
  {
   "address": 65530,
   "type": "line",
   "text": "The hardware vectors: NMI $3FD6 (an RTI), RESET $099D (restart), IRQ (rewritten by each raster handler)."
  }
 ]
}