{
 "schema": 1,
 "platform": "c64",
 "game": "green-beret",
 "build": "Ocean disk, 1986 (C64 Preservation Project G64, green_beret[ocean_1986](!).zip, SHA-1 eb688ed6cb3f23072c6e09671c82dd3e92da5558)",
 "source": "regenerator2000 live",
 "regions": {
  "exclude": [
   [
    268,
    511,
    "stack"
   ],
   [
    16444,
    17407,
    "screen RAM"
   ],
   [
    0,
    255,
    "runtime: zero page, the game's pointers, the multiplexer's lists and the music driver's voice state (named in the listing)"
   ],
   [
    512,
    956,
    "runtime: the game's variables (named in the listing); only the hi score after them, $03BD-$03BF, is read before the game writes it"
   ],
   [
    16444,
    17407,
    "the playfield's screen: it loads holding a leftover screen of the game (rows of $20 and $21, a floor of $FB), which the blank picture (picture_draw 3) clears before anything is shown; the multiplexer writes the sprite pointers at $43F8"
   ]
  ],
  "extra": [
   [
    30720,
    32767,
    "character set"
   ]
  ],
  "edges": [
   0,
   256,
   512,
   1024,
   2048,
   4096,
   16384,
   32768,
   40960,
   49152,
   53248,
   57344
  ]
 },
 "blocks": [
  {
   "start": 0,
   "end": 255,
   "type": "Undefined"
  },
  {
   "start": 256,
   "end": 266,
   "type": "Code"
  },
  {
   "start": 267,
   "end": 267,
   "type": "Byte"
  },
  {
   "start": 268,
   "end": 956,
   "type": "Undefined"
  },
  {
   "start": 957,
   "end": 959,
   "type": "Byte"
  },
  {
   "start": 960,
   "end": 1759,
   "type": "Undefined"
  },
  {
   "start": 1760,
   "end": 2296,
   "type": "Code"
  },
  {
   "start": 2297,
   "end": 2301,
   "type": "Byte"
  },
  {
   "start": 2302,
   "end": 2626,
   "type": "Code"
  },
  {
   "start": 2627,
   "end": 2660,
   "type": "Byte"
  },
  {
   "start": 2661,
   "end": 2873,
   "type": "Code"
  },
  {
   "start": 2874,
   "end": 2885,
   "type": "Byte"
  },
  {
   "start": 2886,
   "end": 3131,
   "type": "Code"
  },
  {
   "start": 3132,
   "end": 3139,
   "type": "Byte"
  },
  {
   "start": 3140,
   "end": 3237,
   "type": "Code"
  },
  {
   "start": 3238,
   "end": 3241,
   "type": "Byte"
  },
  {
   "start": 3242,
   "end": 3423,
   "type": "Code"
  },
  {
   "start": 3424,
   "end": 3425,
   "type": "Byte"
  },
  {
   "start": 3426,
   "end": 4014,
   "type": "Code"
  },
  {
   "start": 4015,
   "end": 4068,
   "type": "Byte"
  },
  {
   "start": 4069,
   "end": 4455,
   "type": "Code"
  },
  {
   "start": 4456,
   "end": 4484,
   "type": "Byte"
  },
  {
   "start": 4485,
   "end": 4728,
   "type": "Code"
  },
  {
   "start": 4729,
   "end": 4790,
   "type": "Byte"
  },
  {
   "start": 4791,
   "end": 5062,
   "type": "Code"
  },
  {
   "start": 5063,
   "end": 5068,
   "type": "Byte"
  },
  {
   "start": 5069,
   "end": 5530,
   "type": "Code"
  },
  {
   "start": 5531,
   "end": 5578,
   "type": "Byte"
  },
  {
   "start": 5579,
   "end": 5648,
   "type": "Code"
  },
  {
   "start": 5649,
   "end": 5669,
   "type": "Byte"
  },
  {
   "start": 5670,
   "end": 5810,
   "type": "Code"
  },
  {
   "start": 5811,
   "end": 5830,
   "type": "Byte"
  },
  {
   "start": 5831,
   "end": 5850,
   "type": "Code"
  },
  {
   "start": 5851,
   "end": 5852,
   "type": "Byte"
  },
  {
   "start": 5853,
   "end": 6281,
   "type": "Code"
  },
  {
   "start": 6282,
   "end": 6289,
   "type": "Byte"
  },
  {
   "start": 6290,
   "end": 7035,
   "type": "Code"
  },
  {
   "start": 7036,
   "end": 7051,
   "type": "Byte"
  },
  {
   "start": 7052,
   "end": 7152,
   "type": "Code"
  },
  {
   "start": 7153,
   "end": 7179,
   "type": "Byte"
  },
  {
   "start": 7180,
   "end": 7308,
   "type": "Code"
  },
  {
   "start": 7309,
   "end": 7326,
   "type": "Byte"
  },
  {
   "start": 7327,
   "end": 7649,
   "type": "Code"
  },
  {
   "start": 7650,
   "end": 7709,
   "type": "Byte"
  },
  {
   "start": 7710,
   "end": 7731,
   "type": "Code"
  },
  {
   "start": 7732,
   "end": 7732,
   "type": "Byte"
  },
  {
   "start": 7733,
   "end": 8017,
   "type": "Code"
  },
  {
   "start": 8018,
   "end": 8374,
   "type": "Byte"
  },
  {
   "start": 8375,
   "end": 8658,
   "type": "Code"
  },
  {
   "start": 8659,
   "end": 8730,
   "type": "Byte"
  },
  {
   "start": 8731,
   "end": 8892,
   "type": "Code"
  },
  {
   "start": 8893,
   "end": 8895,
   "type": "Byte"
  },
  {
   "start": 8896,
   "end": 9337,
   "type": "Code"
  },
  {
   "start": 9338,
   "end": 9347,
   "type": "Byte"
  },
  {
   "start": 9348,
   "end": 9560,
   "type": "Code"
  },
  {
   "start": 9561,
   "end": 9746,
   "type": "Byte"
  },
  {
   "start": 9747,
   "end": 9872,
   "type": "Code"
  },
  {
   "start": 9873,
   "end": 10132,
   "type": "Byte"
  },
  {
   "start": 10133,
   "end": 10410,
   "type": "Code"
  },
  {
   "start": 10411,
   "end": 10416,
   "type": "Byte"
  },
  {
   "start": 10417,
   "end": 10540,
   "type": "Code"
  },
  {
   "start": 10541,
   "end": 10596,
   "type": "Byte"
  },
  {
   "start": 10597,
   "end": 11295,
   "type": "Code"
  },
  {
   "start": 11296,
   "end": 11327,
   "type": "Byte"
  },
  {
   "start": 11328,
   "end": 11858,
   "type": "Code"
  },
  {
   "start": 11859,
   "end": 11878,
   "type": "Byte"
  },
  {
   "start": 11879,
   "end": 12469,
   "type": "Code"
  },
  {
   "start": 12470,
   "end": 12518,
   "type": "Byte"
  },
  {
   "start": 12519,
   "end": 13031,
   "type": "Code"
  },
  {
   "start": 13032,
   "end": 13077,
   "type": "Byte"
  },
  {
   "start": 13078,
   "end": 13619,
   "type": "Code"
  },
  {
   "start": 13620,
   "end": 13631,
   "type": "Byte"
  },
  {
   "start": 13632,
   "end": 13933,
   "type": "Code"
  },
  {
   "start": 13934,
   "end": 13973,
   "type": "Byte"
  },
  {
   "start": 13974,
   "end": 14317,
   "type": "Code"
  },
  {
   "start": 14318,
   "end": 14333,
   "type": "Byte"
  },
  {
   "start": 14334,
   "end": 14536,
   "type": "Code"
  },
  {
   "start": 14537,
   "end": 14540,
   "type": "Byte"
  },
  {
   "start": 14541,
   "end": 14593,
   "type": "Code"
  },
  {
   "start": 14594,
   "end": 14596,
   "type": "Byte"
  },
  {
   "start": 14597,
   "end": 14662,
   "type": "Code"
  },
  {
   "start": 14663,
   "end": 14669,
   "type": "Byte"
  },
  {
   "start": 14670,
   "end": 14748,
   "type": "Code"
  },
  {
   "start": 14749,
   "end": 14758,
   "type": "Byte"
  },
  {
   "start": 14759,
   "end": 14840,
   "type": "Code"
  },
  {
   "start": 14841,
   "end": 14842,
   "type": "Byte"
  },
  {
   "start": 14843,
   "end": 15059,
   "type": "Code"
  },
  {
   "start": 15060,
   "end": 15301,
   "type": "Byte"
  },
  {
   "start": 15302,
   "end": 15499,
   "type": "Code"
  },
  {
   "start": 15500,
   "end": 15507,
   "type": "Byte"
  },
  {
   "start": 15508,
   "end": 15747,
   "type": "Code"
  },
  {
   "start": 15748,
   "end": 15868,
   "type": "Byte"
  },
  {
   "start": 15869,
   "end": 15981,
   "type": "Code"
  },
  {
   "start": 15982,
   "end": 16059,
   "type": "Byte"
  },
  {
   "start": 16060,
   "end": 16093,
   "type": "Code"
  },
  {
   "start": 16094,
   "end": 16094,
   "type": "Byte"
  },
  {
   "start": 16095,
   "end": 16290,
   "type": "Code"
  },
  {
   "start": 16291,
   "end": 16383,
   "type": "Byte"
  },
  {
   "start": 16384,
   "end": 16431,
   "type": "Code"
  },
  {
   "start": 16432,
   "end": 49758,
   "type": "Byte"
  },
  {
   "start": 49759,
   "end": 49919,
   "type": "Code"
  },
  {
   "start": 49920,
   "end": 50243,
   "type": "Byte"
  },
  {
   "start": 50244,
   "end": 50525,
   "type": "Code"
  },
  {
   "start": 50526,
   "end": 50531,
   "type": "Byte"
  },
  {
   "start": 50532,
   "end": 50556,
   "type": "Code"
  },
  {
   "start": 50557,
   "end": 52871,
   "type": "Byte"
  },
  {
   "start": 52872,
   "end": 53140,
   "type": "Code"
  },
  {
   "start": 53141,
   "end": 53150,
   "type": "Byte"
  },
  {
   "start": 53151,
   "end": 53205,
   "type": "Code"
  },
  {
   "start": 53206,
   "end": 53216,
   "type": "Byte"
  },
  {
   "start": 53217,
   "end": 53236,
   "type": "Code"
  },
  {
   "start": 53237,
   "end": 57343,
   "type": "Byte"
  },
  {
   "start": 57344,
   "end": 60423,
   "type": "Code"
  },
  {
   "start": 60424,
   "end": 61946,
   "type": "Byte"
  },
  {
   "start": 61947,
   "end": 62076,
   "type": "Code"
  },
  {
   "start": 62077,
   "end": 64768,
   "type": "Byte"
  },
  {
   "start": 64769,
   "end": 64901,
   "type": "Code"
  },
  {
   "start": 64902,
   "end": 65209,
   "type": "Byte"
  },
  {
   "start": 65210,
   "end": 65374,
   "type": "Code"
  },
  {
   "start": 65375,
   "end": 65437,
   "type": "Byte"
  },
  {
   "start": 65438,
   "end": 65508,
   "type": "Code"
  },
  {
   "start": 65509,
   "end": 65535,
   "type": "Byte"
  }
 ],
 "symbols": [
  {
   "address": 1,
   "name": "cpu_port",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 2,
   "name": "irq_phase",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 3,
   "name": "sort_stop",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 4,
   "name": "sort_sprite",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5,
   "name": "sort_pos",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6,
   "name": "order_changed",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8,
   "name": "mux_hw",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9,
   "name": "mux_raster",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10,
   "name": "mux_next",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 12,
   "name": "mux_sprite_y",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 15,
   "name": "ptr",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 16,
   "name": "ptr_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 17,
   "name": "ptr2",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 18,
   "name": "ptr2_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 19,
   "name": "map_ptr",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 20,
   "name": "map_ptr_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 22,
   "name": "col_row",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 23,
   "name": "count",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 24,
   "name": "col_temp",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 27,
   "name": "map_col",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 28,
   "name": "map_col_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 32,
   "name": "mux_order",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 53,
   "name": "sprite_order",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 74,
   "name": "mux_y",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 95,
   "name": "spr_y",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 96,
   "name": "hero_bot_y",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 97,
   "name": "enemy_top_y",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 103,
   "name": "enemy_bot_y",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 109,
   "name": "shot_y",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 112,
   "name": "eshot_y",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 115,
   "name": "pickup_y",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 116,
   "name": "mux_xhi",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 137,
   "name": "mux_xlo",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 160,
   "name": "col_ptrs",
   "type": "ZeroPagePointer",
   "kind": "user"
  },
  {
   "address": 192,
   "name": "colour_ptrs",
   "type": "ZeroPagePointer",
   "kind": "user"
  },
  {
   "address": 230,
   "name": "v1_pattern",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 232,
   "name": "v2_pattern",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 234,
   "name": "v3_pattern",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 236,
   "name": "v1_duration",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 237,
   "name": "v2_duration",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 238,
   "name": "v3_duration",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 239,
   "name": "v1_stack",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 240,
   "name": "v2_stack",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 241,
   "name": "v3_stack",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 242,
   "name": "v1_transpose",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 243,
   "name": "v2_transpose",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 244,
   "name": "v3_transpose",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 245,
   "name": "v1_playing",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 246,
   "name": "v2_playing",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 247,
   "name": "v3_playing",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 248,
   "name": "v1_free",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 249,
   "name": "v2_free",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 250,
   "name": "v3_free",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 251,
   "name": "note_byte",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 252,
   "name": "data_ptr",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 256,
   "name": "cia2_serial_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 267,
   "name": "b_010B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 324,
   "name": "spawn_done",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 384,
   "name": "spr_xlo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 385,
   "name": "hero_xlo",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 386,
   "name": "enemy_top_xlo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 392,
   "name": "enemy_bot_xlo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 398,
   "name": "shot_xlo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 401,
   "name": "eshot_xlo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 404,
   "name": "pickup_xlo",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 405,
   "name": "spr_xhi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 407,
   "name": "enemy_top_xhi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 413,
   "name": "enemy_bot_xhi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 419,
   "name": "shot_xhi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 422,
   "name": "eshot_xhi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 425,
   "name": "pickup_xhi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 426,
   "name": "spr_colour",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 428,
   "name": "enemy_top_colour",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 434,
   "name": "enemy_bot_colour",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 440,
   "name": "shot_colour",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 443,
   "name": "eshot_colour",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 446,
   "name": "pickup_colour",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 447,
   "name": "spr_shape",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 449,
   "name": "enemy_top_shape",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 455,
   "name": "enemy_bot_shape",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 461,
   "name": "shot_shape",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 464,
   "name": "eshot_shape",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 467,
   "name": "pickup_shape",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 512,
   "name": "flame_free",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 513,
   "name": "jump_index",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 514,
   "name": "scroll_step",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 515,
   "name": "jump_base",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 516,
   "name": "shot_arc_base",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 522,
   "name": "shot_arc_index",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 528,
   "name": "shot_arc_state",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 534,
   "name": "shot_char",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 540,
   "name": "shot_blast_timer",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 546,
   "name": "shot_exploding",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 552,
   "name": "enemy_on_ladder",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 558,
   "name": "dog_jump",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 564,
   "name": "scroll_pending",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 565,
   "name": "jump_joy",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 566,
   "name": "x_keep",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 568,
   "name": "wheel_timer",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 569,
   "name": "hero_facing",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 570,
   "name": "spawn_tries",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 571,
   "name": "enemy_facing",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 577,
   "name": "jump_state",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 578,
   "name": "shot_offset",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 579,
   "name": "enemy_jumping",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 585,
   "name": "player_pose",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 586,
   "name": "pose_x_keep",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 587,
   "name": "space_last",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 588,
   "name": "boss_on",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 589,
   "name": "boss_phase",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 590,
   "name": "lorry_started",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 591,
   "name": "lorry_speed",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 592,
   "name": "draw_count",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 593,
   "name": "helis_out",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 594,
   "name": "shot_active",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 597,
   "name": "eshot_active",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 600,
   "name": "shot_dir",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 606,
   "name": "shot_speed",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 612,
   "name": "weapon",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 613,
   "name": "weapon_shown",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 614,
   "name": "ammo",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 615,
   "name": "pickup_type",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 616,
   "name": "pickup_landed",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 617,
   "name": "spawn_lane",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 618,
   "name": "test_x",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 619,
   "name": "knife_x",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 621,
   "name": "knife_x2",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 622,
   "name": "test_y",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 623,
   "name": "knife_y",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 625,
   "name": "knife_y2",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 626,
   "name": "box_end",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 627,
   "name": "kbox_end",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 628,
   "name": "box_start",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 629,
   "name": "kbox_start",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 630,
   "name": "enemy_anim_state",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 635,
   "name": "dog_live",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 642,
   "name": "enemy_climbing",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 648,
   "name": "enemy_falling_from",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 654,
   "name": "enemy_floor",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 660,
   "name": "enemy_active",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 666,
   "name": "enemy_timer",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 672,
   "name": "ladder_through",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 678,
   "name": "enemy_step",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 684,
   "name": "fire_step",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 690,
   "name": "enemy_dying",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 696,
   "name": "dog_hit",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 702,
   "name": "enemy_entry",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 708,
   "name": "dog_anim",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 712,
   "name": "enemy_count",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 713,
   "name": "floor_counts",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 716,
   "name": "spawn_pending",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 717,
   "name": "lane_timer",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 723,
   "name": "lane_type",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 729,
   "name": "lane_ready",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 735,
   "name": "enemy_hit",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 741,
   "name": "falling",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 742,
   "name": "stab_hold",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 743,
   "name": "jump_used",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 744,
   "name": "joy_up_last",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 746,
   "name": "para_dropping",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 747,
   "name": "hero_floor",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 748,
   "name": "walk_speed",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 749,
   "name": "enemy_speed",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 755,
   "name": "walk_frac",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 756,
   "name": "enemy_frac",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 762,
   "name": "fall_speed",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 763,
   "name": "enemy_fall_speed",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 769,
   "name": "fall_frac",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 770,
   "name": "enemy_fall_frac",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 776,
   "name": "pose_timer",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 777,
   "name": "enemy_anim_timer",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 783,
   "name": "pose_index",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 784,
   "name": "enemy_anim_index",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 790,
   "name": "frame_flag",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 791,
   "name": "fine_scroll",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 792,
   "name": "player_xu",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 793,
   "name": "hero_char",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 794,
   "name": "hero_floor_char",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 795,
   "name": "dog_delay",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 796,
   "name": "joy",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 797,
   "name": "joy_raw",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 798,
   "name": "fire_last",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 799,
   "name": "jet_slot",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 800,
   "name": "idle_time",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 801,
   "name": "idle_lo",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 802,
   "name": "para_hit",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 803,
   "name": "hero_floor_attr",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 804,
   "name": "enemy_floor_attr",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 810,
   "name": "enemy_attr",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 816,
   "name": "work",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 817,
   "name": "kwork",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 818,
   "name": "hero_attr",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 819,
   "name": "climbing",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 820,
   "name": "ladder_on",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 821,
   "name": "column_due",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 822,
   "name": "coarse_due",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 823,
   "name": "enemy_type",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 829,
   "name": "shot_type",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 832,
   "name": "eshot_type",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 835,
   "name": "para_phase",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 836,
   "name": "enemy_wait",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 842,
   "name": "enemy_falling",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 848,
   "name": "heli_mode",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 850,
   "name": "helis_low",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 851,
   "name": "heli_height",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 853,
   "name": "enemy_xu",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 865,
   "name": "shot_xu",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 868,
   "name": "eshot_xu",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 871,
   "name": "pickup_xu",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 873,
   "name": "boss_count",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 874,
   "name": "scroll_copy",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 875,
   "name": "enemy_arc_index",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 881,
   "name": "enemy_arc_base",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 887,
   "name": "enemy_dir",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 893,
   "name": "enemy_char",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 899,
   "name": "enemy_floor_char",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 905,
   "name": "x_save",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 906,
   "name": "x_save2",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 907,
   "name": "x_save3",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 908,
   "name": "y_save",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 909,
   "name": "y_save2",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 910,
   "name": "y_save3",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 911,
   "name": "heli_xu",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 913,
   "name": "heli_dir",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 915,
   "name": "heli_base",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 917,
   "name": "heli_bob_index",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 919,
   "name": "heli_launch_timer",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 920,
   "name": "heli_frame",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 921,
   "name": "para_speed",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 922,
   "name": "player_frozen",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 923,
   "name": "dog_arc",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 927,
   "name": "dog_base",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 931,
   "name": "crawl_count",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 937,
   "name": "frame_counters",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 943,
   "name": "handler_side",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 944,
   "name": "handler_timer",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 945,
   "name": "stage",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 946,
   "name": "difficulty",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 947,
   "name": "lives",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 948,
   "name": "score",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 951,
   "name": "next_life",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 954,
   "name": "points_due",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 957,
   "name": "hi_score",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 960,
   "name": "picture_logo",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 1024,
   "name": "picture_logo_rest",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 1076,
   "name": "picture_map",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 1742,
   "name": "picture_blank",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 1760,
   "name": "main_loop",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 1810,
   "name": "b_0712",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1831,
   "name": "b_0727",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1912,
   "name": "irq_player",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 1939,
   "name": "b_0793",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1951,
   "name": "player_stab_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 1959,
   "name": "b_07A7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1965,
   "name": "jet_update",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 1984,
   "name": "r_07C0",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 1985,
   "name": "b_07C1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1989,
   "name": "b_07C5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1999,
   "name": "b_07CF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2003,
   "name": "b_07D3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2006,
   "name": "b_07D6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2012,
   "name": "jet_move_stub",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 2015,
   "name": "b_07DF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2028,
   "name": "jet_move",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 2055,
   "name": "r_0807",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 2056,
   "name": "b_0808",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2080,
   "name": "jet_drop_bomb",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 2091,
   "name": "r_082B",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 2092,
   "name": "b_082C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2099,
   "name": "b_0833",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2100,
   "name": "b_0834",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2137,
   "name": "jet_launch",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 2190,
   "name": "b_088E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2227,
   "name": "pickup_update",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 2233,
   "name": "b_08B9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2296,
   "name": "r_08F8",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 2297,
   "name": "pickup_ammo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2302,
   "name": "b_08FE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2324,
   "name": "b_0914",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2339,
   "name": "b_0923",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2360,
   "name": "b_0938",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2421,
   "name": "r_0975",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 2422,
   "name": "enemy_deaths",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 2424,
   "name": "b_0978",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2429,
   "name": "b_097D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2433,
   "name": "b_0981",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2446,
   "name": "b_098E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2502,
   "name": "b_09C6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2578,
   "name": "b_0A12",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2597,
   "name": "j_0A25",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 2621,
   "name": "b_0A3D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2627,
   "name": "dying_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2629,
   "name": "dying_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2633,
   "name": "pickup_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2638,
   "name": "pickup_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2643,
   "name": "enemy_points",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2661,
   "name": "knife_hit_test",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 2699,
   "name": "b_0A8B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2727,
   "name": "b_0AA7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2731,
   "name": "b_0AAB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2759,
   "name": "b_0AC7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2770,
   "name": "b_0AD2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2862,
   "name": "b_0B2E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2871,
   "name": "b_0B37",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2874,
   "name": "knife_offsets",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2886,
   "name": "dog_hit_test",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 2923,
   "name": "b_0B6B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2936,
   "name": "b_0B78",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2963,
   "name": "b_0B93",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2976,
   "name": "b_0BA0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2996,
   "name": "r_0BB4",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 2997,
   "name": "enemy_contact",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3012,
   "name": "b_0BC4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3017,
   "name": "b_0BC9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3023,
   "name": "b_0BCF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3068,
   "name": "b_0BFC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3105,
   "name": "player_killed",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 3115,
   "name": "b_0C2B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3118,
   "name": "stage_end_dispatch",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 3132,
   "name": "stage_end_handlers",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3140,
   "name": "prison_fight",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3168,
   "name": "b_0C60",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3174,
   "name": "prison_waves",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3192,
   "name": "b_0C78",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3237,
   "name": "r_0CA5",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 3238,
   "name": "prison_wave_types",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3242,
   "name": "harbour_fight",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3272,
   "name": "b_0CC8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3288,
   "name": "b_0CD8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3294,
   "name": "dog_handler",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3361,
   "name": "b_0D21",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3384,
   "name": "b_0D38",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3392,
   "name": "j_0D40",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 3423,
   "name": "r_0D5F",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 3424,
   "name": "handler_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3426,
   "name": "any_enemy_left",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3428,
   "name": "b_0D64",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3438,
   "name": "b_0D6E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3446,
   "name": "b_0D76",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3449,
   "name": "harbour_fight_start",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3477,
   "name": "r_0D95",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 3478,
   "name": "dogs_update",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3488,
   "name": "b_0DA0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3498,
   "name": "dogs_hit",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3500,
   "name": "b_0DAC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3535,
   "name": "b_0DCF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3540,
   "name": "b_0DD4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3543,
   "name": "b_0DD7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3547,
   "name": "dog_dying",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3580,
   "name": "r_0DFC",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 3581,
   "name": "dogs_animate",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3583,
   "name": "b_0DFF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3593,
   "name": "b_0E09",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3597,
   "name": "b_0E0D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3615,
   "name": "b_0E1F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3639,
   "name": "b_0E37",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3645,
   "name": "b_0E3D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3657,
   "name": "b_0E49",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3663,
   "name": "dogs_move",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3665,
   "name": "b_0E51",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3670,
   "name": "j_0E56",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 3674,
   "name": "b_0E5A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3707,
   "name": "b_0E7B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3713,
   "name": "b_0E81",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3739,
   "name": "b_0E9B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3747,
   "name": "b_0EA3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3750,
   "name": "b_0EA6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3781,
   "name": "dog_release",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3787,
   "name": "b_0ECB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3796,
   "name": "b_0ED4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3813,
   "name": "b_0EE5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3822,
   "name": "b_0EEE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3876,
   "name": "j_0F24",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 3888,
   "name": "b_0F30",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3906,
   "name": "r_0F42",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 3907,
   "name": "dog_leap_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3926,
   "name": "dog_leap_start",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3947,
   "name": "dog_leap",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3978,
   "name": "r_0F8A",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 3979,
   "name": "b_0F8B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3995,
   "name": "dog_hero_ahead",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4013,
   "name": "b_0FAD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4015,
   "name": "dog_delays",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4033,
   "name": "dog_sides",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4051,
   "name": "dog_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4069,
   "name": "fight_update",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4093,
   "name": "fight_enemies",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4102,
   "name": "bridge_fight_update",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4129,
   "name": "bridge_fight",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 4152,
   "name": "j_1038",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 4161,
   "name": "b_1041",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4170,
   "name": "heli_hits",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4172,
   "name": "b_104C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4177,
   "name": "j_1051",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 4181,
   "name": "b_1055",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4193,
   "name": "shots_explode_step",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4195,
   "name": "b_1063",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4202,
   "name": "helis_move",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4204,
   "name": "b_106C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4221,
   "name": "b_107D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4239,
   "name": "b_108F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4246,
   "name": "b_1096",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4264,
   "name": "b_10A8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4285,
   "name": "b_10BD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4313,
   "name": "b_10D9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4316,
   "name": "b_10DC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4326,
   "name": "b_10E6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4334,
   "name": "heli_steer",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4359,
   "name": "j_1107",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 4370,
   "name": "b_1112",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4391,
   "name": "b_1127",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4394,
   "name": "b_112A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4410,
   "name": "b_113A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4424,
   "name": "b_1148",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4440,
   "name": "b_1158",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4456,
   "name": "heli_bob",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4485,
   "name": "heli_turn",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4494,
   "name": "b_118E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4521,
   "name": "heli_fire",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4530,
   "name": "b_11B2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4566,
   "name": "r_11D6",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 4567,
   "name": "b_11D7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4571,
   "name": "r_11DB",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 4572,
   "name": "heli_destroy",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4579,
   "name": "b_11E3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4588,
   "name": "b_11EC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4638,
   "name": "helis_rotor",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4647,
   "name": "j_1227",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 4667,
   "name": "b_123B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4689,
   "name": "b_1251",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4696,
   "name": "b_1258",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4711,
   "name": "rotor_limit",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 4718,
   "name": "j_126E",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 4728,
   "name": "r_1278",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 4729,
   "name": "heli_first_slot",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4731,
   "name": "heli_turn_pause",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4733,
   "name": "rotor_frame_offsets",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4737,
   "name": "rotor_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4785,
   "name": "heli_turn_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4791,
   "name": "helis_x_to_pixels",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4793,
   "name": "b_12B9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4811,
   "name": "helis_place",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4819,
   "name": "b_12D3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4846,
   "name": "b_12EE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4856,
   "name": "b_12F8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4876,
   "name": "b_130C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4896,
   "name": "b_1320",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4902,
   "name": "j_1326",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 4908,
   "name": "b_132C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4911,
   "name": "r_132F",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 4912,
   "name": "helis_launch",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4930,
   "name": "b_1342",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4950,
   "name": "b_1356",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4964,
   "name": "b_1364",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4966,
   "name": "b_1366",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4977,
   "name": "b_1371",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4983,
   "name": "r_1377",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 4984,
   "name": "b_1378",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4992,
   "name": "heli_launch",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5017,
   "name": "b_1399",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5063,
   "name": "heli_start_dir",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5065,
   "name": "heli_start_x",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5067,
   "name": "heli_start_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5069,
   "name": "missile_fight_wait",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 5072,
   "name": "missile_fight",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 5082,
   "name": "b_13DA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5118,
   "name": "b_13FE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5124,
   "name": "stage_end_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5146,
   "name": "r_141A",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 5147,
   "name": "sprites_clear",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5151,
   "name": "b_141F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5162,
   "name": "stage_complete",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 5218,
   "name": "b_1462",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5235,
   "name": "b_1473",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5245,
   "name": "j_147D",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 5289,
   "name": "b_14A9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5297,
   "name": "b_14B1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5319,
   "name": "b_14C7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5391,
   "name": "b_150F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5401,
   "name": "b_1519",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5407,
   "name": "b_151F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5421,
   "name": "lose_life",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 5451,
   "name": "b_154B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5461,
   "name": "b_1555",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5477,
   "name": "b_1565",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5509,
   "name": "b_1585",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5523,
   "name": "b_1593",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5531,
   "name": "checkpoints",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5579,
   "name": "stage_swaps",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5612,
   "name": "b_15EC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5615,
   "name": "r_15EF",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 5616,
   "name": "stage_start",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 5629,
   "name": "b_15FD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5638,
   "name": "screen_toggle",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5648,
   "name": "stage_swap_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5651,
   "name": "stage_swap_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5654,
   "name": "stage_swap_c",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5658,
   "name": "stage_start_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5662,
   "name": "stage_start_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5665,
   "name": "stage_tunes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5670,
   "name": "play_reset",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5673,
   "name": "b_1629",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5683,
   "name": "b_1633",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5693,
   "name": "b_163D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5706,
   "name": "b_164A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5716,
   "name": "b_1654",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5723,
   "name": "missile_fight_spawn",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5755,
   "name": "b_167B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5810,
   "name": "r_16B2",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 5811,
   "name": "missile_fight_types",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5831,
   "name": "shots_flash",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5844,
   "name": "b_16D4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5851,
   "name": "shots_flash_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5853,
   "name": "weapon_update",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5885,
   "name": "b_16FD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5888,
   "name": "b_1700",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5893,
   "name": "b_1705",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5898,
   "name": "j_170A",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 5933,
   "name": "b_172D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5937,
   "name": "b_1731",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5961,
   "name": "b_1749",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5964,
   "name": "b_174C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5981,
   "name": "b_175D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5984,
   "name": "pshot_hits",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5986,
   "name": "b_1762",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5998,
   "name": "b_176E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6002,
   "name": "b_1772",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6007,
   "name": "b_1777",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6028,
   "name": "b_178C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6045,
   "name": "b_179D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6054,
   "name": "b_17A6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6065,
   "name": "b_17B1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6161,
   "name": "b_1811",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6166,
   "name": "j_1816",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 6190,
   "name": "b_182E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6219,
   "name": "b_184B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6222,
   "name": "weapon_trigger",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6254,
   "name": "r_186E",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 6255,
   "name": "b_186F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6258,
   "name": "weapon_special",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6279,
   "name": "j_1887",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 6280,
   "name": "weapon_vector",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6282,
   "name": "weapon_handlers",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 6290,
   "name": "r_1892",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 6292,
   "name": "grenades_update",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 6294,
   "name": "b_1896",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6303,
   "name": "b_189F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6315,
   "name": "b_18AB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6343,
   "name": "b_18C7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6352,
   "name": "b_18D0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6361,
   "name": "b_18D9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6369,
   "name": "shot_fall",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6390,
   "name": "b_18F6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6397,
   "name": "b_18FD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6409,
   "name": "shot_char_read",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6459,
   "name": "shot_explode",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6465,
   "name": "b_1941",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6504,
   "name": "r_1968",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 6505,
   "name": "shot_explosion",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6511,
   "name": "b_196F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6531,
   "name": "r_1983",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 6532,
   "name": "b_1984",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6543,
   "name": "blast_hits",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6545,
   "name": "b_1991",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6577,
   "name": "b_19B1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6582,
   "name": "b_19B6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6586,
   "name": "blast_box",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6604,
   "name": "b_19CC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6619,
   "name": "b_19DB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6632,
   "name": "b_19E8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6634,
   "name": "flame_update",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 6640,
   "name": "b_19F0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6642,
   "name": "b_19F2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6651,
   "name": "b_19FB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6666,
   "name": "b_1A0A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6671,
   "name": "j_1A0F",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 6685,
   "name": "j_1A1D",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 6690,
   "name": "b_1A22",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6698,
   "name": "b_1A2A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6717,
   "name": "shots_offscreen",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6719,
   "name": "b_1A3F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6735,
   "name": "b_1A4F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6739,
   "name": "b_1A53",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6759,
   "name": "b_1A67",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6777,
   "name": "pshot_free_slot",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6779,
   "name": "free_shot_from_x",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 6789,
   "name": "b_1A85",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6791,
   "name": "weapon_fire",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6804,
   "name": "b_1A94",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6815,
   "name": "b_1A9F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6871,
   "name": "b_1AD7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6877,
   "name": "j_1ADD",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 6897,
   "name": "b_1AF1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6918,
   "name": "b_1B06",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6919,
   "name": "b_1B07",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6956,
   "name": "b_1B2C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6971,
   "name": "j_1B3B",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 7000,
   "name": "eshots_update",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7002,
   "name": "b_1B5A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7007,
   "name": "j_1B5F",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 7013,
   "name": "b_1B65",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7030,
   "name": "eshot_call",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7031,
   "name": "eshot_vector",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7036,
   "name": "eshot_handlers",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7052,
   "name": "eshot_jet_bomb",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7078,
   "name": "eshot_fall",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7083,
   "name": "j_1BAB",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 7090,
   "name": "b_1BB2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7099,
   "name": "r_1BBB",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 7102,
   "name": "eshot_arc",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7111,
   "name": "b_1BC7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7139,
   "name": "b_1BE3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7148,
   "name": "b_1BEC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7153,
   "name": "shot_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7160,
   "name": "pshot_speeds",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7166,
   "name": "shot_shapes_right",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7173,
   "name": "shot_shapes_left",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7180,
   "name": "lorry_update",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7186,
   "name": "b_1C12",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7218,
   "name": "b_1C32",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7262,
   "name": "b_1C5E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7303,
   "name": "b_1C87",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7309,
   "name": "lorry_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7318,
   "name": "lorry_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7327,
   "name": "b_1C9F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7359,
   "name": "b_1CBF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7395,
   "name": "b_1CE3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7431,
   "name": "b_1D07",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7464,
   "name": "b_1D28",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7470,
   "name": "r_1D2E",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 7471,
   "name": "b_1D2F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7477,
   "name": "b_1D35",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7483,
   "name": "b_1D3B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7489,
   "name": "enemy_hold_timers",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7491,
   "name": "b_1D43",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7541,
   "name": "b_1D75",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7545,
   "name": "lorry_wheels",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7581,
   "name": "r_1D9D",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 7582,
   "name": "b_1D9E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7593,
   "name": "spawn_timers",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7595,
   "name": "b_1DAB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7629,
   "name": "b_1DCD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7633,
   "name": "lane_find_ready",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7635,
   "name": "b_1DD3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7645,
   "name": "b_1DDD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7650,
   "name": "lane_reload",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7670,
   "name": "lane_types",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7690,
   "name": "lane_sides",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7710,
   "name": "scripted_spawn",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7731,
   "name": "r_1E33",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 7733,
   "name": "scripted_place",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7771,
   "name": "j_1E5B",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 7774,
   "name": "b_1E5E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7780,
   "name": "j_1E64",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 7919,
   "name": "j_1EEF",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 7923,
   "name": "scripted_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7929,
   "name": "b_1EF9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8010,
   "name": "b_1F4A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8018,
   "name": "spawn_col_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8078,
   "name": "spawn_col_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8138,
   "name": "spawn_types",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8198,
   "name": "spawn_pickups",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8258,
   "name": "spawn_floors",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8318,
   "name": "spawn_dy_top",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8328,
   "name": "spawn_dy_bot",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8338,
   "name": "spawn_dx_top",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8348,
   "name": "spawn_dx_bot",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8358,
   "name": "stage_spawn_first",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8362,
   "name": "stage_spawn_end",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8366,
   "name": "spawn_type",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8367,
   "name": "spawn_wait",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8368,
   "name": "spawn_floor",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8369,
   "name": "spawn_speed",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8370,
   "name": "spawn_offsets",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8374,
   "name": "spawn_entry",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8375,
   "name": "random_spawn",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8393,
   "name": "r_20C9",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 8394,
   "name": "spawn_lane_enemy",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8402,
   "name": "spawn_on_floor",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8409,
   "name": "b_20D9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8412,
   "name": "b_20DC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8422,
   "name": "b_20E6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8445,
   "name": "b_20FD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8448,
   "name": "j_2100",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 8461,
   "name": "spawn_set_x",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8468,
   "name": "b_2114",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8496,
   "name": "b_2130",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8575,
   "name": "spawn_next_floor",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 8583,
   "name": "b_2187",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8592,
   "name": "r_2190",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 8593,
   "name": "spawn_floor_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8617,
   "name": "b_21A9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8658,
   "name": "r_21D2",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 8659,
   "name": "edge_x_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8661,
   "name": "edge_x_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8663,
   "name": "edge_row_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8667,
   "name": "edge_row_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8671,
   "name": "type_top_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8681,
   "name": "type_bot_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8691,
   "name": "type_speeds",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8701,
   "name": "type_hold_times",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8711,
   "name": "type_top_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8721,
   "name": "type_bot_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8731,
   "name": "enemy_count_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8737,
   "name": "enemy_free_slot",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8739,
   "name": "b_2223",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8748,
   "name": "b_222C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8750,
   "name": "hero_floor_find",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8754,
   "name": "b_2232",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8763,
   "name": "b_223B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8767,
   "name": "enemy_floors",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8769,
   "name": "b_2241",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8787,
   "name": "b_2253",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8795,
   "name": "b_225B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8799,
   "name": "b_225F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8843,
   "name": "b_228B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8852,
   "name": "b_2294",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8858,
   "name": "j_229A",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 8869,
   "name": "b_22A5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8881,
   "name": "b_22B1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8887,
   "name": "enemies_scroll",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8893,
   "name": "floor_y",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8896,
   "name": "b_22C0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8898,
   "name": "b_22C2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8907,
   "name": "b_22CB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8924,
   "name": "b_22DC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8941,
   "name": "b_22ED",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8945,
   "name": "shots_scroll",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8951,
   "name": "b_22F7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8953,
   "name": "b_22F9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8962,
   "name": "b_2302",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8979,
   "name": "b_2313",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8983,
   "name": "enemies_ladders",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8985,
   "name": "b_2319",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8990,
   "name": "b_231E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8994,
   "name": "b_2322",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9007,
   "name": "b_232F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9014,
   "name": "b_2336",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9096,
   "name": "b_2388",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9125,
   "name": "j_23A5",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 9135,
   "name": "b_23AF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9141,
   "name": "r_23B5",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 9146,
   "name": "b_23BA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9216,
   "name": "b_2400",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9248,
   "name": "enemy_fall_counts",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9260,
   "name": "j_242C",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 9267,
   "name": "b_2433",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9278,
   "name": "find_top_sprite",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9280,
   "name": "b_2440",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9292,
   "name": "b_244C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9295,
   "name": "b_244F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9316,
   "name": "enemy_fall_jump",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9337,
   "name": "r_2479",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 9338,
   "name": "fall_jump_types",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9348,
   "name": "r_2484",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 9349,
   "name": "player_animate",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9391,
   "name": "player_anim_step",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9410,
   "name": "j_24C2",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 9433,
   "name": "b_24D9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9436,
   "name": "b_24DC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9449,
   "name": "r_24E9",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 9450,
   "name": "b_24EA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9457,
   "name": "b_24F1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9474,
   "name": "b_2502",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9496,
   "name": "b_2518",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9504,
   "name": "b_2520",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9510,
   "name": "player_pose_set",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 9517,
   "name": "player_pose_start",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 9529,
   "name": "b_2539",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9537,
   "name": "b_2541",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9561,
   "name": "pose_dy",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9568,
   "name": "pose_dx",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9575,
   "name": "pose_anim_starts",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9582,
   "name": "weapon_pose_offsets",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9587,
   "name": "player_anim_tops",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9683,
   "name": "player_anim_bottoms",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9715,
   "name": "player_pose_starts",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9747,
   "name": "enemies_anim",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9749,
   "name": "b_2615",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9758,
   "name": "b_261E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9792,
   "name": "j_2640",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 9811,
   "name": "b_2653",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9815,
   "name": "b_2657",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9832,
   "name": "b_2668",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9838,
   "name": "b_266E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9845,
   "name": "enemy_anim_start",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9873,
   "name": "enemy_anim_tops",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9958,
   "name": "enemy_anim_bottoms",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 10043,
   "name": "enemy_anim_starts",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 10123,
   "name": "enemy_anim_bases",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 10133,
   "name": "hero_chars",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10137,
   "name": "head_row_offset",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10193,
   "name": "enemies_chars",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10195,
   "name": "b_27D3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10200,
   "name": "b_27D8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10204,
   "name": "b_27DC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10249,
   "name": "b_2809",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10262,
   "name": "b_2816",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10268,
   "name": "b_281C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10278,
   "name": "b_2826",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10314,
   "name": "b_284A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10330,
   "name": "b_285A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10342,
   "name": "b_2866",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10345,
   "name": "b_2869",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10360,
   "name": "b_2878",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10363,
   "name": "b_287B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10369,
   "name": "b_2881",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10382,
   "name": "b_288E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10391,
   "name": "b_2897",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10411,
   "name": "enemy_climb_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 10417,
   "name": "sprites_to_units",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10419,
   "name": "b_28B3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10441,
   "name": "read_joystick",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10472,
   "name": "b_28E8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10480,
   "name": "hero_attrs",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 10498,
   "name": "b_2902",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10523,
   "name": "b_291B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10540,
   "name": "r_292C",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 10541,
   "name": "char_attrs",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 10597,
   "name": "player_fall",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 10642,
   "name": "b_2992",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10657,
   "name": "b_29A1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10685,
   "name": "r_29BD",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 10686,
   "name": "player_move",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10693,
   "name": "b_29C5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10713,
   "name": "b_29D9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10716,
   "name": "b_29DC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10731,
   "name": "b_29EB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10738,
   "name": "player_walk",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 10750,
   "name": "j_29FE",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 10758,
   "name": "scroll_limit",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10776,
   "name": "b_2A18",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10785,
   "name": "b_2A21",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10812,
   "name": "b_2A3C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10832,
   "name": "b_2A50",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10835,
   "name": "j_2A53",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 10849,
   "name": "player_stab",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 10894,
   "name": "b_2A8E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10915,
   "name": "b_2AA3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10930,
   "name": "b_2AB2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10943,
   "name": "b_2ABF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10956,
   "name": "j_2ACC",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 10962,
   "name": "player_action",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 10969,
   "name": "b_2AD9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10989,
   "name": "b_2AED",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11004,
   "name": "b_2AFC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11012,
   "name": "b_2B04",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11020,
   "name": "b_2B0C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11028,
   "name": "b_2B14",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11049,
   "name": "b_2B29",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11071,
   "name": "player_jump",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 11083,
   "name": "b_2B4B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11126,
   "name": "b_2B76",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11135,
   "name": "b_2B7F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11138,
   "name": "j_2B82",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 11148,
   "name": "b_2B8C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11159,
   "name": "r_2B97",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 11160,
   "name": "b_2B98",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11176,
   "name": "player_ladder",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 11189,
   "name": "j_2BB5",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 11211,
   "name": "b_2BCB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11245,
   "name": "b_2BED",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11274,
   "name": "b_2C0A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11280,
   "name": "b_2C10",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11296,
   "name": "jump_arc",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 11328,
   "name": "enemies_move",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11330,
   "name": "b_2C42",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11335,
   "name": "b_2C47",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11339,
   "name": "b_2C4B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11357,
   "name": "b_2C5D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11364,
   "name": "b_2C64",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11392,
   "name": "b_2C80",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11400,
   "name": "b_2C88",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11422,
   "name": "b_2C9E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11430,
   "name": "b_2CA6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11440,
   "name": "b_2CB0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11456,
   "name": "b_2CC0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11496,
   "name": "b_2CE8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11511,
   "name": "b_2CF7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11545,
   "name": "r_2D19",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 11546,
   "name": "enemy_walk",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11566,
   "name": "b_2D2E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11582,
   "name": "b_2D3E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11593,
   "name": "b_2D49",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11613,
   "name": "b_2D5D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11626,
   "name": "b_2D6A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11643,
   "name": "b_2D7B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11649,
   "name": "enemy_jump_start",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 11676,
   "name": "b_2D9C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11691,
   "name": "b_2DAB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11696,
   "name": "b_2DB0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11699,
   "name": "b_2DB3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11709,
   "name": "b_2DBD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11746,
   "name": "enemy_jump",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 11765,
   "name": "b_2DF5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11811,
   "name": "b_2E23",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11820,
   "name": "b_2E2C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11824,
   "name": "j_2E30",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 11835,
   "name": "b_2E3B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11838,
   "name": "enemy_behaviour",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11857,
   "name": "behaviour_vector",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11859,
   "name": "behaviour_table",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 11885,
   "name": "para_behaviour",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11896,
   "name": "b_2E78",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11899,
   "name": "shooter",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 11905,
   "name": "b_2E81",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11949,
   "name": "b_2EAD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11962,
   "name": "r_2EBA",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 11963,
   "name": "enemy_fire_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11967,
   "name": "fire_frame_a",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11971,
   "name": "fire_frame_b",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11975,
   "name": "fire_frame_c",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11979,
   "name": "r_2ECB",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 11980,
   "name": "b_2ECC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12041,
   "name": "b_2F09",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12044,
   "name": "j_2F0C",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 12053,
   "name": "b_2F15",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12061,
   "name": "b_2F1D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12067,
   "name": "b_2F23",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12077,
   "name": "enemy_fire",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12121,
   "name": "b_2F59",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12128,
   "name": "j_2F60",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 12175,
   "name": "r_2F8F",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 12176,
   "name": "b_2F90",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12182,
   "name": "thrower",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12188,
   "name": "b_2F9C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12230,
   "name": "r_2FC6",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 12231,
   "name": "b_2FC7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12258,
   "name": "b_2FE2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12276,
   "name": "b_2FF4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12283,
   "name": "b_2FFB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12287,
   "name": "b_2FFF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12303,
   "name": "eshot_launch",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12319,
   "name": "b_301F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12326,
   "name": "b_3026",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12399,
   "name": "b_306F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12405,
   "name": "j_3075",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 12425,
   "name": "b_3089",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12470,
   "name": "eshot_speeds",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12477,
   "name": "thrower_tops",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12479,
   "name": "thrower_bottoms",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12481,
   "name": "thrower_throw_tops",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12483,
   "name": "wave_sides",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12485,
   "name": "eshot_types",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12495,
   "name": "fire_pose_offsets",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12505,
   "name": "fire_pose_tops",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12511,
   "name": "fire_pose_bottoms",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12517,
   "name": "officer_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12519,
   "name": "crawler",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12557,
   "name": "b_310D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12573,
   "name": "b_311D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12583,
   "name": "r_3127",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 12584,
   "name": "b_3128",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12595,
   "name": "para_update",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12634,
   "name": "b_315A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12643,
   "name": "b_3163",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12669,
   "name": "b_317D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12678,
   "name": "b_3186",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12691,
   "name": "b_3193",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12699,
   "name": "b_319B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12705,
   "name": "b_31A1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12731,
   "name": "b_31BB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12736,
   "name": "b_31C0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12751,
   "name": "b_31CF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12755,
   "name": "b_31D3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12769,
   "name": "b_31E1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12795,
   "name": "b_31FB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12803,
   "name": "j_3203",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 12829,
   "name": "b_321D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12837,
   "name": "j_3225",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 12841,
   "name": "para_release",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12870,
   "name": "b_3246",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12912,
   "name": "para_build",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12959,
   "name": "para_part",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13032,
   "name": "para_top_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13036,
   "name": "para_bot_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13040,
   "name": "para_top_x",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13044,
   "name": "para_bot_x",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13048,
   "name": "para_top_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13052,
   "name": "para_bot_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13056,
   "name": "para_top_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13060,
   "name": "para_bot_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13064,
   "name": "para_speed_limits",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13069,
   "name": "para_speeds",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13074,
   "name": "para_slots",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 13078,
   "name": "para_find",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13080,
   "name": "b_3318",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13091,
   "name": "b_3323",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13094,
   "name": "enemies_turn_left",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 13096,
   "name": "b_3328",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13112,
   "name": "b_3338",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13116,
   "name": "kicker",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13139,
   "name": "b_3353",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13179,
   "name": "b_337B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13190,
   "name": "b_3386",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13199,
   "name": "r_338F",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 13200,
   "name": "b_3390",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13219,
   "name": "enemies_offscreen",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13221,
   "name": "b_33A5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13226,
   "name": "b_33AA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13230,
   "name": "b_33AE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13249,
   "name": "b_33C1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13253,
   "name": "b_33C5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13268,
   "name": "enemy_remove",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13330,
   "name": "b_3412",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13362,
   "name": "b_3432",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13382,
   "name": "r_3446",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 13383,
   "name": "enemy_climb",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13392,
   "name": "b_3450",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13399,
   "name": "j_3457",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 13413,
   "name": "b_3465",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13447,
   "name": "b_3487",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13463,
   "name": "b_3497",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13474,
   "name": "b_34A2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13489,
   "name": "b_34B1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13523,
   "name": "b_34D3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13536,
   "name": "j_34E0",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 13541,
   "name": "r_34E5",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 13542,
   "name": "b_34E6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13546,
   "name": "floor_find",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13550,
   "name": "b_34EE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13558,
   "name": "r_34F6",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 13559,
   "name": "scroll_right",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13576,
   "name": "b_3508",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13591,
   "name": "b_3517",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13611,
   "name": "b_352B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13616,
   "name": "b_3530",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13620,
   "name": "stage_end_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13624,
   "name": "stage_end_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13628,
   "name": "stage_boss_counts",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13632,
   "name": "stage_end_reached",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 13638,
   "name": "b_3546",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13678,
   "name": "r_356E",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 13679,
   "name": "coarse_scroll",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13685,
   "name": "b_3575",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13687,
   "name": "b_3577",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13790,
   "name": "b_35DE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13874,
   "name": "status_draw",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13876,
   "name": "j_3634",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 13899,
   "name": "b_364B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13900,
   "name": "b_364C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13914,
   "name": "b_365A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13918,
   "name": "b_365E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13934,
   "name": "status_text",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13974,
   "name": "frame_wait",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13983,
   "name": "b_369F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13992,
   "name": "cold_start",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 14003,
   "name": "b_36B3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14012,
   "name": "new_game",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 14040,
   "name": "b_36D8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14177,
   "name": "b_3761",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14255,
   "name": "wait_tune",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 14264,
   "name": "captives_place",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 14266,
   "name": "b_37BA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14318,
   "name": "captive_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14326,
   "name": "captive_x_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14330,
   "name": "captive_x_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14334,
   "name": "guards_send",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 14353,
   "name": "b_3811",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14367,
   "name": "captives_struggle",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 14377,
   "name": "b_3829",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14388,
   "name": "hero_walk_map",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 14395,
   "name": "j_383B",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 14418,
   "name": "b_3852",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14424,
   "name": "b_3858",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14448,
   "name": "b_3870",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14485,
   "name": "rescue_walk",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 14495,
   "name": "b_389F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14512,
   "name": "b_38B0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14521,
   "name": "b_38B9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14537,
   "name": "captive_free_x",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14541,
   "name": "map_progress",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 14567,
   "name": "b_38E7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14574,
   "name": "b_38EE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14579,
   "name": "progress_fill",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 14581,
   "name": "j_38F5",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 14593,
   "name": "r_3901",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 14594,
   "name": "progress_columns",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14597,
   "name": "progress_done",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 14600,
   "name": "j_3908",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 14620,
   "name": "hero_init",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 14663,
   "name": "vic_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14670,
   "name": "irq_status",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14678,
   "name": "b_3956",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14700,
   "name": "b_396C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14728,
   "name": "b_3988",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14734,
   "name": "status_d018",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14739,
   "name": "status_dd00",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14749,
   "name": "difficulty_caps",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14753,
   "name": "difficulty_rates",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14757,
   "name": "difficulty_frac",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14758,
   "name": "loop_count",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14759,
   "name": "irq_playfield",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14810,
   "name": "stage_digits",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14843,
   "name": "column_draw",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 14849,
   "name": "b_3A01",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14868,
   "name": "b_3A14",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14899,
   "name": "j_3A33",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 14932,
   "name": "j_3A54",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 14959,
   "name": "b_3A6F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14970,
   "name": "b_3A7A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14975,
   "name": "chars_animate",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15005,
   "name": "b_3A9D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15009,
   "name": "anim_target",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 15016,
   "name": "mines_place",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 15022,
   "name": "b_3AAE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15052,
   "name": "b_3ACC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15060,
   "name": "stage_mine_first",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15064,
   "name": "stage_mine_end",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15068,
   "name": "mine_col_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15136,
   "name": "mine_col_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15204,
   "name": "anim_frame_ends",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15206,
   "name": "anim_targets",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15214,
   "name": "mine_chars",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15218,
   "name": "crater_chars",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15222,
   "name": "anim_frames",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15254,
   "name": "anim_restore",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15302,
   "name": "shots_vs_mines",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15304,
   "name": "b_3BC8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15309,
   "name": "b_3BCD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15313,
   "name": "b_3BD1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15349,
   "name": "b_3BF5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15366,
   "name": "b_3C06",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15373,
   "name": "b_3C0D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15390,
   "name": "b_3C1E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15396,
   "name": "mine_destroy",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15420,
   "name": "r_3C3C",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 15421,
   "name": "is_mine",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15451,
   "name": "b_3C5B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15453,
   "name": "b_3C5D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15459,
   "name": "mine_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15478,
   "name": "b_3C76",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15500,
   "name": "stage_mine_pair",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15508,
   "name": "anim_chars_restore",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15516,
   "name": "b_3C9C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15543,
   "name": "prison_setup",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15545,
   "name": "b_3CB9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15555,
   "name": "stage_draw",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15560,
   "name": "b_3CC8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15605,
   "name": "j_3CF5",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 15618,
   "name": "b_3D02",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15628,
   "name": "b_3D0C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15669,
   "name": "b_3D35",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15673,
   "name": "b_3D39",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15702,
   "name": "screen_clear",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15706,
   "name": "b_3D5A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15726,
   "name": "b_3D6E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15748,
   "name": "row_ptrs_init",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15812,
   "name": "bit_clear_masks",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15820,
   "name": "bit_set_masks",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15828,
   "name": "irq_phases",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15860,
   "name": "text_table",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15870,
   "name": "exit_vector",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 15872,
   "name": "tune_start",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15874,
   "name": "b_3E02",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15885,
   "name": "b_3E0D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15922,
   "name": "tune_playing",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15938,
   "name": "voices_stop",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15963,
   "name": "sound_off",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15968,
   "name": "b_3E60",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15982,
   "name": "tune_table",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16060,
   "name": "sfx_flame",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 16078,
   "name": "sfx_bark",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 16094,
   "name": "bark_voice",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 16095,
   "name": "voice1_tune_off",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 16100,
   "name": "sfx_jet",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 16116,
   "name": "sfx_hit",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 16125,
   "name": "sfx_gun",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 16141,
   "name": "sfx_explode",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 16166,
   "name": "sfx_pickup",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 16191,
   "name": "sfx_bazooka",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 16216,
   "name": "v1_pulse_restart",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 16228,
   "name": "v1_pulse_again",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 16241,
   "name": "v2_pulse_restart",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 16253,
   "name": "v2_pulse_again",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 16266,
   "name": "v3_pulse_restart",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 16278,
   "name": "v3_pulse_again",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 16291,
   "name": "title_sound1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16315,
   "name": "title_instr1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16344,
   "name": "title_effect1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16358,
   "name": "title_steps1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16368,
   "name": "swap_flags",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16384,
   "name": "startup",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16432,
   "name": "serial_check_src",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16464,
   "name": "f_4050",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 16503,
   "name": "f_4077",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 16543,
   "name": "f_409F",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 16583,
   "name": "f_40C7",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 16623,
   "name": "f_40EF",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 16663,
   "name": "f_4117",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 16694,
   "name": "f_4136",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 16704,
   "name": "f_4140",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 16705,
   "name": "f_4141",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 16744,
   "name": "f_4168",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 16745,
   "name": "f_4169",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 16784,
   "name": "f_4190",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 16785,
   "name": "f_4191",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 16824,
   "name": "f_41B8",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 16825,
   "name": "f_41B9",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 16864,
   "name": "f_41E0",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 16865,
   "name": "f_41E1",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 16904,
   "name": "f_4208",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 16905,
   "name": "f_4209",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 16924,
   "name": "f_421C",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 16944,
   "name": "f_4230",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 16945,
   "name": "f_4231",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 16984,
   "name": "f_4258",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 16985,
   "name": "f_4259",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 17024,
   "name": "f_4280",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 17025,
   "name": "f_4281",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 17064,
   "name": "f_42A8",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 17065,
   "name": "f_42A9",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 17104,
   "name": "f_42D0",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 17105,
   "name": "f_42D1",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 17144,
   "name": "f_42F8",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 17145,
   "name": "f_42F9",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 17154,
   "name": "f_4302",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 17184,
   "name": "f_4320",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 17185,
   "name": "f_4321",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 17224,
   "name": "f_4348",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 17225,
   "name": "f_4349",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 17264,
   "name": "f_4370",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 17265,
   "name": "f_4371",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 17304,
   "name": "f_4398",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 17305,
   "name": "f_4399",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 17343,
   "name": "f_43BF",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 17383,
   "name": "a_43E7",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 17400,
   "name": "f_43F8",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 17408,
   "name": "shapes_hero_left",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17984,
   "name": "shapes_hero_right",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18688,
   "name": "shapes_hero_poses",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 19456,
   "name": "shapes_soldier_legs",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20480,
   "name": "shapes_brown_walk",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21504,
   "name": "shapes_unused",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22528,
   "name": "shapes_shots",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23552,
   "name": "shapes_lorry",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24576,
   "name": "shapes_kicker",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25600,
   "name": "shapes_blue",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26624,
   "name": "shapes_weapons",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27648,
   "name": "shapes_dying",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28672,
   "name": "shapes_heli",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29696,
   "name": "shapes_heli_left",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30720,
   "name": "chars_base_a",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31232,
   "name": "text_credits",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31360,
   "name": "chars_mines",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31392,
   "name": "text_rescue",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31456,
   "name": "chars_base_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31744,
   "name": "chars_base_c",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32768,
   "name": "tiles_bridge_a",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33792,
   "name": "tiles_bridge_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34816,
   "name": "tiles_bridge_c",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35840,
   "name": "tiles_bridge_d",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36288,
   "name": "tiles_prison",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36864,
   "name": "tile_colours_bridge_a",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 37888,
   "name": "tile_colours_bridge_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38912,
   "name": "tile_colours_bridge_c",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39936,
   "name": "tile_colours_bridge_d",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40384,
   "name": "tile_colours_prison",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40960,
   "name": "tiles_a",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 41984,
   "name": "tiles_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 43008,
   "name": "tiles_c",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 44032,
   "name": "tiles_d",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 45056,
   "name": "tile_colours_a",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 46080,
   "name": "tile_colours_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 47104,
   "name": "tile_colours_c",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 48128,
   "name": "tile_colours_d",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 49152,
   "name": "map",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 49751,
   "name": "ammo_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 49759,
   "name": "lives_draw",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 49768,
   "name": "b_C268",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 49774,
   "name": "score_draw",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 49778,
   "name": "b_C272",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 49812,
   "name": "hi_score_draw",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 49816,
   "name": "b_C298",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 49850,
   "name": "score_add",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 49892,
   "name": "hi_score_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 49894,
   "name": "b_C2E6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 49907,
   "name": "r_C2F3",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 49908,
   "name": "b_C2F4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 49910,
   "name": "b_C2F6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 49920,
   "name": "picture_captives",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50176,
   "name": "status_screen",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50244,
   "name": "sprites_to_irq",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 50250,
   "name": "b_C44A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 50272,
   "name": "b_C460",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 50274,
   "name": "b_C462",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 50292,
   "name": "multiplexer",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 50300,
   "name": "b_C47C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 50339,
   "name": "b_C4A3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 50345,
   "name": "j_C4A9",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 50383,
   "name": "mux_done",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 50400,
   "name": "mux_wait",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 50409,
   "name": "b_C4E9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 50414,
   "name": "b_C4EE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 50426,
   "name": "title_wait",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 50442,
   "name": "b_C50A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 50455,
   "name": "text_draw",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 50484,
   "name": "j_C534",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 50492,
   "name": "text_dest",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50498,
   "name": "b_C542",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 50520,
   "name": "b_C558",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 50526,
   "name": "text_pages",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50531,
   "name": "mux_frames",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50532,
   "name": "sprite_order_reset",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 50534,
   "name": "b_C566",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 50560,
   "name": "shapes_dogs",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 51200,
   "name": "chars_title_a",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 52224,
   "name": "chars_title_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 52872,
   "name": "irq_start",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 52905,
   "name": "irq",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 52917,
   "name": "irq_call",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 52931,
   "name": "b_CEC3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 52945,
   "name": "irq_exit",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 52951,
   "name": "sprites_sort",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 52957,
   "name": "b_CEDD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 52977,
   "name": "b_CEF1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 52989,
   "name": "b_CEFD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 52996,
   "name": "b_CF04",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 53011,
   "name": "b_CF13",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 53033,
   "name": "b_CF29",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 53042,
   "name": "picture_draw",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 53062,
   "name": "j_CF46",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 53075,
   "name": "b_CF53",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 53093,
   "name": "pic_call",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 53098,
   "name": "pic_read",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 53108,
   "name": "r_CF74",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 53109,
   "name": "pic_put",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 53140,
   "name": "r_CF94",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 53141,
   "name": "picture_commands",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 53151,
   "name": "pic_run",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 53161,
   "name": "b_CFA9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 53171,
   "name": "pic_address",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 53182,
   "name": "pic_colour_set",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 53189,
   "name": "pic_end",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 53192,
   "name": "pic_skip",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 53206,
   "name": "pic_run_char",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 53207,
   "name": "pic_colour",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 53208,
   "name": "pic_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 53209,
   "name": "picture_table",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 53217,
   "name": "swaps_undo",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 53220,
   "name": "b_CFE4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 53232,
   "name": "b_CFF0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 53237,
   "name": "ammo_icons",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 53248,
   "name": "chars_harbour",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 54272,
   "name": "chars_harbour_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 54336,
   "name": "chars_prison",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55296,
   "name": "chars_bridge_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 56320,
   "name": "chars_bridge_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57344,
   "name": "sfx_voice1",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 57346,
   "name": "sfx_start",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 57372,
   "name": "b_E01C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57375,
   "name": "sfx_reg",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 57437,
   "name": "b_E05D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57462,
   "name": "v1_slide_start",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 57474,
   "name": "v1_slide_again",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 57498,
   "name": "r_E09A",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 57499,
   "name": "b_E09B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57511,
   "name": "b_E0A7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57516,
   "name": "v2_slide_start",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 57528,
   "name": "v2_slide_again",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 57552,
   "name": "r_E0D0",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 57553,
   "name": "b_E0D1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57561,
   "name": "b_E0D9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57566,
   "name": "v3_slide_start",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 57578,
   "name": "v3_slide_again",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 57602,
   "name": "r_E102",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 57603,
   "name": "v1_tick",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 57612,
   "name": "v1_skip3",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 57614,
   "name": "j_E10E",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 57623,
   "name": "v1_next_event",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 57645,
   "name": "v1_handler",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 57647,
   "name": "b_E12F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57650,
   "name": "v1_note",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 57658,
   "name": "b_E13A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57801,
   "name": "b_E1C9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57811,
   "name": "b_E1D3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57834,
   "name": "b_E1EA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57841,
   "name": "b_E1F1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57844,
   "name": "b_E1F4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57856,
   "name": "v1_note_length",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 57870,
   "name": "b_E20E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57883,
   "name": "r_E21B",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 57884,
   "name": "v1_return",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 57905,
   "name": "b_E231",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57908,
   "name": "v1_repeat",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57938,
   "name": "v1_repeat_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57958,
   "name": "b_E266",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57965,
   "name": "v1_cmd_instrument",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57977,
   "name": "b_E279",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57988,
   "name": "v1_fx_load",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58000,
   "name": "b_E290",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58017,
   "name": "v1_fx_steps",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58029,
   "name": "b_E2AD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58046,
   "name": "v1_fx_part",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58067,
   "name": "b_E2D3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58081,
   "name": "v1_transpose_jump",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58100,
   "name": "v1_jump",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58114,
   "name": "v1_transpose_call",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58124,
   "name": "b_E30C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58156,
   "name": "v1_call",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58162,
   "name": "v1_cmd_transpose",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58172,
   "name": "v1_fx_poke",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58185,
   "name": "v1_live_poke",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58198,
   "name": "r_E356",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 58199,
   "name": "v1_effects",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 58233,
   "name": "b_E379",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58245,
   "name": "b_E385",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58254,
   "name": "b_E38E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58264,
   "name": "b_E398",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58267,
   "name": "v1_pulse_sweep",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 58283,
   "name": "b_E3AB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58311,
   "name": "b_E3C7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58332,
   "name": "b_E3DC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58347,
   "name": "b_E3EB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58353,
   "name": "j_E3F1",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 58365,
   "name": "v1_freq_effect",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 58396,
   "name": "r_E41C",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 58397,
   "name": "v1_arpeggio",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 58405,
   "name": "b_E425",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58430,
   "name": "v1_slide",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 58431,
   "name": "b_E43F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58452,
   "name": "b_E454",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58472,
   "name": "b_E468",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58492,
   "name": "b_E47C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58500,
   "name": "b_E484",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58509,
   "name": "j_E48D",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 58510,
   "name": "b_E48E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58523,
   "name": "b_E49B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58538,
   "name": "b_E4AA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58544,
   "name": "v2_tick",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 58552,
   "name": "r_E4B8",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 58553,
   "name": "v2_skip3",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 58555,
   "name": "j_E4BB",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 58564,
   "name": "v2_next_event",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 58586,
   "name": "v2_handler",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 58588,
   "name": "b_E4DC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58591,
   "name": "v2_note",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 58599,
   "name": "b_E4E7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58742,
   "name": "b_E576",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58752,
   "name": "b_E580",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58775,
   "name": "b_E597",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58782,
   "name": "b_E59E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58785,
   "name": "b_E5A1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58797,
   "name": "v2_note_length",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 58811,
   "name": "b_E5BB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58824,
   "name": "r_E5C8",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 58825,
   "name": "v2_return",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 58846,
   "name": "b_E5DE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58849,
   "name": "v2_repeat",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58879,
   "name": "v2_repeat_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58899,
   "name": "b_E613",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58906,
   "name": "v2_cmd_instrument",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58918,
   "name": "b_E626",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58929,
   "name": "v2_fx_load",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58941,
   "name": "b_E63D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58958,
   "name": "v2_fx_steps",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58970,
   "name": "b_E65A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58987,
   "name": "v2_fx_part",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59008,
   "name": "b_E680",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59022,
   "name": "v2_transpose_jump",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59041,
   "name": "v2_jump",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59055,
   "name": "v2_transpose_call",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59065,
   "name": "b_E6B9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59097,
   "name": "v2_call",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59103,
   "name": "v2_cmd_transpose",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59113,
   "name": "v2_fx_poke",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59126,
   "name": "v2_live_poke",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59139,
   "name": "r_E703",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 59140,
   "name": "v2_effects",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 59174,
   "name": "b_E726",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59186,
   "name": "b_E732",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59195,
   "name": "b_E73B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59205,
   "name": "b_E745",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59208,
   "name": "v2_pulse_sweep",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 59224,
   "name": "b_E758",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59252,
   "name": "b_E774",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59273,
   "name": "b_E789",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59288,
   "name": "b_E798",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59294,
   "name": "j_E79E",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 59306,
   "name": "v2_freq_effect",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 59337,
   "name": "r_E7C9",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 59338,
   "name": "v2_arpeggio",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 59346,
   "name": "b_E7D2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59371,
   "name": "v2_slide",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 59372,
   "name": "b_E7EC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59392,
   "name": "b_E800",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59412,
   "name": "b_E814",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59432,
   "name": "b_E828",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59440,
   "name": "b_E830",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59449,
   "name": "j_E839",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 59450,
   "name": "b_E83A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59463,
   "name": "b_E847",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59478,
   "name": "b_E856",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59484,
   "name": "v3_tick",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 59492,
   "name": "r_E864",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 59493,
   "name": "v3_skip3",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 59495,
   "name": "j_E867",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 59504,
   "name": "v3_next_event",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 59526,
   "name": "v3_handler",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 59528,
   "name": "b_E888",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59531,
   "name": "v3_note",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 59539,
   "name": "b_E893",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59682,
   "name": "b_E922",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59692,
   "name": "b_E92C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59715,
   "name": "b_E943",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59722,
   "name": "b_E94A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59725,
   "name": "b_E94D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59737,
   "name": "v3_note_length",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 59751,
   "name": "b_E967",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59764,
   "name": "r_E974",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 59765,
   "name": "v3_return",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 59786,
   "name": "b_E98A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59789,
   "name": "v3_repeat",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59819,
   "name": "v3_repeat_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59839,
   "name": "b_E9BF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59846,
   "name": "v3_cmd_instrument",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59858,
   "name": "b_E9D2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59869,
   "name": "v3_fx_load",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59881,
   "name": "b_E9E9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59898,
   "name": "v3_fx_steps",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59910,
   "name": "b_EA06",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59927,
   "name": "v3_fx_part",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59948,
   "name": "b_EA2C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59962,
   "name": "v3_transpose_jump",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59981,
   "name": "v3_jump",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59995,
   "name": "v3_transpose_call",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60005,
   "name": "b_EA65",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60037,
   "name": "v3_call",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60043,
   "name": "v3_cmd_transpose",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60053,
   "name": "v3_fx_poke",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60066,
   "name": "v3_live_poke",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60079,
   "name": "r_EAAF",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 60080,
   "name": "v3_effects",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 60114,
   "name": "b_EAD2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60126,
   "name": "b_EADE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60135,
   "name": "b_EAE7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60145,
   "name": "b_EAF1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60148,
   "name": "v3_pulse_sweep",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 60164,
   "name": "b_EB04",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60192,
   "name": "b_EB20",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60213,
   "name": "b_EB35",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60228,
   "name": "b_EB44",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60234,
   "name": "j_EB4A",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 60246,
   "name": "v3_freq_effect",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 60277,
   "name": "r_EB75",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 60278,
   "name": "v3_arpeggio",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 60286,
   "name": "b_EB7E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60311,
   "name": "v3_slide",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 60312,
   "name": "b_EB98",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60332,
   "name": "b_EBAC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60352,
   "name": "b_EBC0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60372,
   "name": "b_EBD4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60380,
   "name": "b_EBDC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60389,
   "name": "j_EBE5",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 60390,
   "name": "b_EBE6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60403,
   "name": "b_EBF3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60418,
   "name": "b_EC02",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60424,
   "name": "v1_fx",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60437,
   "name": "v1_freq_fx_set",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60438,
   "name": "v1_pulse_times_set",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60440,
   "name": "v1_pulse_delay_set",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60441,
   "name": "v1_pulse_fx_set",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60442,
   "name": "v1_pulse_steps_set",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60446,
   "name": "v1_pulse_width",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60448,
   "name": "v1_instrument",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60453,
   "name": "v1_stack_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60461,
   "name": "v1_stack_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60469,
   "name": "v1_stack_count",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60477,
   "name": "v2_fx",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60490,
   "name": "v2_freq_fx_set",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60491,
   "name": "v2_pulse_times_set",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60493,
   "name": "v2_pulse_delay_set",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60494,
   "name": "v2_pulse_fx_set",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60495,
   "name": "v2_pulse_steps_set",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60499,
   "name": "v2_pulse_width",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60501,
   "name": "v2_instrument",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60506,
   "name": "v2_stack_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60514,
   "name": "v2_stack_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60522,
   "name": "v2_stack_count",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60530,
   "name": "v3_fx",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60543,
   "name": "v3_freq_fx_set",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60544,
   "name": "v3_pulse_times_set",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60546,
   "name": "v3_pulse_delay_set",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60547,
   "name": "v3_pulse_fx_set",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60548,
   "name": "v3_pulse_steps_set",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60552,
   "name": "v3_pulse_width",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60554,
   "name": "v3_instrument",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60559,
   "name": "v3_stack_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60567,
   "name": "v3_stack_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60575,
   "name": "v3_stack_count",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60582,
   "name": "durations",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60599,
   "name": "v1_slide_steps",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60607,
   "name": "v1_slide_times",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60611,
   "name": "v1_slide_delay",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60612,
   "name": "v1_freq_fx",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60613,
   "name": "v1_pulse_times",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60615,
   "name": "v1_pulse_delay",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60616,
   "name": "v1_pulse_fx",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60617,
   "name": "v1_pulse_steps",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60621,
   "name": "v1_pulse_start",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60623,
   "name": "v1_note_freq",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60625,
   "name": "v1_control",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60626,
   "name": "v1_gate_time",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60627,
   "name": "v1_sound_time",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60628,
   "name": "v1_freq",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60630,
   "name": "v1_slide_counts",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60634,
   "name": "v1_pulse",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60636,
   "name": "v1_pulse_counts",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60638,
   "name": "v2_slide_steps",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60646,
   "name": "v2_slide_times",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60650,
   "name": "v2_slide_delay",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60651,
   "name": "v2_freq_fx",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60652,
   "name": "v2_pulse_times",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60654,
   "name": "v2_pulse_delay",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60655,
   "name": "v2_pulse_fx",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60656,
   "name": "v2_pulse_steps",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60660,
   "name": "v2_pulse_start",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60662,
   "name": "v2_note_freq",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60664,
   "name": "v2_control",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60665,
   "name": "v2_gate_time",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60666,
   "name": "v2_sound_time",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60667,
   "name": "v2_freq",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60669,
   "name": "v2_slide_counts",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60673,
   "name": "v2_pulse",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60675,
   "name": "v2_pulse_counts",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60677,
   "name": "v3_slide_steps",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60685,
   "name": "v3_slide_times",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60689,
   "name": "v3_slide_delay",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60690,
   "name": "v3_freq_fx",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60691,
   "name": "v3_pulse_times",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60693,
   "name": "v3_pulse_delay",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60694,
   "name": "v3_pulse_fx",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60695,
   "name": "v3_pulse_steps",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60699,
   "name": "v3_pulse_start",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60701,
   "name": "v3_note_freq",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60703,
   "name": "v3_control",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60704,
   "name": "v3_gate_time",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60705,
   "name": "v3_sound_time",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60706,
   "name": "v3_freq",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60708,
   "name": "v3_slide_counts",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60712,
   "name": "v3_pulse",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60714,
   "name": "v3_pulse_counts",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60716,
   "name": "sfx_block_ends",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60719,
   "name": "sfx_reg_offsets",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60722,
   "name": "voice_offsets",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60725,
   "name": "bark_voices",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60728,
   "name": "note_freq_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60823,
   "name": "note_freq_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60918,
   "name": "v1_commands",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60946,
   "name": "v2_commands",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60974,
   "name": "v3_commands",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61004,
   "name": "bark_fx",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61035,
   "name": "flame_fx2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61066,
   "name": "flame_fx3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61097,
   "name": "explode_fx1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61128,
   "name": "explode_fx2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61159,
   "name": "explode_fx3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61190,
   "name": "jet_fx1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61221,
   "name": "jet_fx2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61252,
   "name": "hit_fx",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61283,
   "name": "gun_fx1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61314,
   "name": "gun_fx2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61345,
   "name": "pickup_fx1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61376,
   "name": "pickup_fx2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61407,
   "name": "pickup_fx3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61438,
   "name": "bazooka_fx1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61469,
   "name": "bazooka_fx2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61500,
   "name": "bazooka_fx3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61531,
   "name": "tempo_5",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61547,
   "name": "tempo_4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61563,
   "name": "intro_v1_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61572,
   "name": "intro_v1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61613,
   "name": "intro_v1_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61626,
   "name": "intro_v2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61657,
   "name": "intro_v1_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61662,
   "name": "rest_voice",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61663,
   "name": "intro_v3_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61672,
   "name": "intro_v3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61728,
   "name": "alarm_sound1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61757,
   "name": "alarm_v1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61768,
   "name": "alarm_v3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61782,
   "name": "lorry_sound1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61811,
   "name": "lorry_v1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61818,
   "name": "lorry_v1_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61826,
   "name": "helis_sound1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61855,
   "name": "helis_v1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61862,
   "name": "helis_v1_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61870,
   "name": "start_v3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61881,
   "name": "start_v3_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61899,
   "name": "start_v3_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61906,
   "name": "start_v3_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61925,
   "name": "start_v3_4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61947,
   "name": "v3_crash",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62072,
   "name": "b_F278",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 62077,
   "name": "resume_v3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62082,
   "name": "start_v3_5",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62106,
   "name": "death_v1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62125,
   "name": "death_v2_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62131,
   "name": "tempo_6",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62147,
   "name": "inter1_v1_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62159,
   "name": "death_v2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62182,
   "name": "death_v3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62205,
   "name": "game_over_v1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62240,
   "name": "game_over_v2_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62267,
   "name": "game_over_v2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62306,
   "name": "game_over_v3_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62316,
   "name": "game_over_v3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62373,
   "name": "rescue_v2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62375,
   "name": "rescue_v1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62421,
   "name": "rescue_v3_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62435,
   "name": "shared_sound1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62464,
   "name": "rescue_v3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62526,
   "name": "shared_sound2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62555,
   "name": "start_v1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62565,
   "name": "start_v1_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62586,
   "name": "start_v3_6",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62612,
   "name": "shared_tone1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62627,
   "name": "inter1_v1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62693,
   "name": "inter1_v2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62784,
   "name": "inter1_v3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62842,
   "name": "inter2_v1_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62875,
   "name": "inter2_v1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62890,
   "name": "inter2_v2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62906,
   "name": "inter2_v3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62948,
   "name": "inter3_v2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62950,
   "name": "inter3_v1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63034,
   "name": "inter3_v3_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63042,
   "name": "inter3_v3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63113,
   "name": "shared_effect1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63142,
   "name": "title_steps2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63146,
   "name": "title_steps3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63150,
   "name": "title_steps4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63154,
   "name": "title_effect2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63168,
   "name": "tempo_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63184,
   "name": "title_v1_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63203,
   "name": "title_v1_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63227,
   "name": "title_v1_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63247,
   "name": "title_v1_4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63253,
   "name": "title_v1_5",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63283,
   "name": "title_v1_6",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63288,
   "name": "title_v1_7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63423,
   "name": "title_sound2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63452,
   "name": "title_sound3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63481,
   "name": "title_sound4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63510,
   "name": "title_tone1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63525,
   "name": "title_v2_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63564,
   "name": "title_v2_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63571,
   "name": "title_v2_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63590,
   "name": "title_v2_4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63650,
   "name": "title_v2_5",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63658,
   "name": "title_v2_6",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63684,
   "name": "title_v2_7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63694,
   "name": "title_v2_8",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63706,
   "name": "title_v2_9",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64044,
   "name": "title_sound5",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64073,
   "name": "title_sound6",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64097,
   "name": "title_instr2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64102,
   "name": "title_instr3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64107,
   "name": "title_effect3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64121,
   "name": "title_sound7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64150,
   "name": "title_v3_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64191,
   "name": "title_v3_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64228,
   "name": "title_v1_8",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64262,
   "name": "title_v3_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64315,
   "name": "title_v2_10",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64396,
   "name": "title_v3_4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64409,
   "name": "title_v3_5",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64424,
   "name": "title_v3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64429,
   "name": "title_v3_6",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64769,
   "name": "shot_contact",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 64771,
   "name": "b_FD03",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 64776,
   "name": "j_FD08",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 64782,
   "name": "b_FD0E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 64826,
   "name": "b_FD3A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 64829,
   "name": "b_FD3D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 64832,
   "name": "dog_contact",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 64841,
   "name": "b_FD49",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 64846,
   "name": "b_FD4E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 64849,
   "name": "r_FD51",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 64850,
   "name": "b_FD52",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 64888,
   "name": "draw_game_over",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 64890,
   "name": "b_FD7A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 64902,
   "name": "game_over_text",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64912,
   "name": "text_ending",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64981,
   "name": "old_patterns",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 65210,
   "name": "next_life_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 65212,
   "name": "b_FEBC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 65225,
   "name": "b_FEC9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 65259,
   "name": "r_FEEB",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 65260,
   "name": "block_swap",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 65280,
   "name": "b_FF00",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 65314,
   "name": "a_FF22",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 65319,
   "name": "b_FF27",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 65343,
   "name": "b_FF3F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 65352,
   "name": "KERNAL_IRQ_BRK_VECTOR",
   "type": "Predefined",
   "kind": "system"
  },
  {
   "address": 65366,
   "name": "a_FF56",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 65369,
   "name": "b_FF59",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 65375,
   "name": "swap_a_addrs",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 65393,
   "name": "swap_b_addrs",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 65411,
   "name": "swap_lengths",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 65429,
   "name": "swap_ports",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 65438,
   "name": "draw_ammo",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 65444,
   "name": "b_FFA4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 65460,
   "name": "KERNAL_TALK",
   "type": "Predefined",
   "kind": "system"
  },
  {
   "address": 65477,
   "name": "r_FFC5",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 65478,
   "name": "KERNAL_CHKIN",
   "type": "Predefined",
   "kind": "system"
  },
  {
   "address": 65483,
   "name": "b_FFCB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 65530,
   "name": "nmi_vector",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 65532,
   "name": "nmi_rti",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 65534,
   "name": "irq_vector",
   "type": "UserDefined",
   "kind": "user"
  }
 ],
 "comments": [
  {
   "address": 256,
   "type": "line",
   "text": "Run once a frame from irq_player while the hero is under control. Reads CIA 2's interrupt register into A and X (LAX $DD0D, an undocumented opcode) and keeps bit 3, the serial port's \"byte shifted out\" flag, shifted down to bit 2 (ASR #$08). With the flag clear it falls on to the JAM at $010B and the machine locks up; with it set it writes the result to the serial port's data register (SAX $DD0C), which starts the next byte shifting out at timer A's rate, and returns. The start-up at $4000 set timer A to 2 cycles and the port to output, and copied these bytes here from $4030. A real CIA has the flag set again within a few dozen cycles; anything that leaves it clear between two frames, such as reading $DD0D in between, stops the game."
  },
  {
   "address": 267,
   "type": "line",
   "text": "The JAM that cia2_serial_check falls into when CIA 2's serial flag is clear: the processor stops until a reset."
  },
  {
   "address": 957,
   "type": "line",
   "text": "The hi score, three decimal bytes (low, middle, high) like score; as loaded $56 $03 $00, so a new machine shows a hi score of 3,560 (hi_score_draw adds a 0). hi_score_check raises it; nothing else writes it."
  },
  {
   "address": 960,
   "type": "line",
   "text": "Picture 2, the title's logo for picture_draw: GREEN BERET in two rows of large letters from $4118, red over green, built from the title character set's characters $80-$D0. Run-length commands: $FB count, character; $FC address; $FE colour; $FF end."
  },
  {
   "address": 1024,
   "type": "line",
   "text": "The rest of picture_logo past the $0400 edge: the last rows of the logo and its $FF end at $0433."
  },
  {
   "address": 1076,
   "type": "line",
   "text": "Picture 0, the intermission's scene: a watchtower, oil drums, a guard house and a wire fence on the ground, and along the bottom row the stages MISSILE, HARBOUR and BRIDGE, each followed by three arrows ($7A after MISSILE, $75 after the others) that map_progress fills in."
  },
  {
   "address": 1742,
   "type": "line",
   "text": "Picture 3, a blank screen: from $4000, 1,000 spaces (runs of 255, 255, 255 and 235) in white."
  },
  {
   "address": 1760,
   "type": "line",
   "text": "The game's main loop, one pass a frame during play. Waits for the frame (frame_wait, which also runs the three sound players), moves the scroll the interrupt counted into scroll_step, copies the fine scroll (scroll_copy) for finding the screen characters under each enemy (enemies_chars), hands the sprites to the interrupt (sprites_to_irq), draws the next map column and shifts the screen when due, updates the status line (lives, score added in, score, hi score, extra life). With boss_on set it leaves for the stage's end-of-stage fight (stage_end_dispatch). Otherwise it releases a paratrooper who was hit (para_hit), then every routine of play in turn: scripted and random enemy spawns, the hero's floor, the screen characters under everyone, ladders, animation, the player's weapon, projectiles, enemies' movement and removal, the jet, sprite sorting, the dropped weapon, deaths and points, enemy contact, char animation, mines, spawn timers, delayed enemies and the end-of-stage check, and loops."
  },
  {
   "address": 1810,
   "type": "line",
   "text": "A paratrooper was hit (para_hit is set): free his parachute and turn him into a soldier who walks (para_release), then hold slot X, the value para_hit holds, still for $80 frames (enemy_wait and enemy_timer), after which enemy_hold_timers puts it back on its floor. para_hit is only ever set to 1, so the slot held is always slot 1, whichever slot the paratrooper was in (para_slots)."
  },
  {
   "address": 1912,
   "type": "line",
   "text": "Run by irq_status, the interrupt's second phase, at raster $F6 below the playfield. Reads the joystick (read_joystick), then, unless key 1 is held or player_frozen is set, moves the hero (player_move), works out his pose and animation (player_animate), stabs if the pose is a stab (player_stab_check) and runs cia2_serial_check. Then finds the topmost sprite for the multiplexer's next frame (find_top_sprite) and runs the three voices of the sound driver. Key 1 is read on CIA 1 port B bit 0, with port A left as the loader set it; holding it freezes the hero where he is, in the air too."
  },
  {
   "address": 1951,
   "type": "line",
   "text": "If the hero's pose (player_pose) has bit 4 set, a stab, runs the knife's hit test (knife_hit_test) with the pose in A."
  },
  {
   "address": 1965,
   "type": "line",
   "text": "The jet that bombs a hero who stays still. While a jet is out (jet_slot set) it moves it (jet_move, jet_drop_bomb). Otherwise, unless the stage's end has been reached (the right-edge limit at $2A06 is $E0) it sends one when idle_time has reached 7 and at least two of the three enemy projectile slots are free (jet_launch)."
  },
  {
   "address": 2012,
   "type": "line",
   "text": "Jumps to jet_move. Its first three bytes are all that runs: the loop after it at $07DF, which looks for a slot holding projectile type 7, is not reached by any path."
  },
  {
   "address": 2015,
   "type": "line",
   "text": "Unreached: a search of the enemy projectile types at $0340 for type 7, the jet, which would leave X on its slot. jet_move_stub jumps past it."
  },
  {
   "address": 2028,
   "type": "line",
   "text": "Moves the jet in slot jet_slot: while its X (in game units) is $18 or more it flies; then the shape is changed to $C1 and, once it is, the jet climbs a line a frame until its Y is below $42, when the slot, jet_slot and idle_time are cleared."
  },
  {
   "address": 2080,
   "type": "line",
   "text": "Once the hero's X plus 7 reaches the jet's X, looks through the enemy projectile slots after the jet's for one holding type 7 (the bomb launched with it) whose Y is still 0, and drops it from the jet: the bomb takes the jet's X and the jet's Y plus $15."
  },
  {
   "address": 2137,
   "type": "line",
   "text": "Starts a jet in enemy projectile slot X (3-5 counted from the player's): type 7, Y $50, shape $C2, colour 5, X $40 with the high bit set, speed 4; then puts the bomb, type 7 with Y 0, shape $65, in the next free slot, and starts the jet's sound (sfx_jet)."
  },
  {
   "address": 2227,
   "type": "line",
   "text": "The dropped weapon (sprite 20). When the hero's X is within 6 units of it and his feet within $14 lines either way of its Y, he takes it: weapon and weapon_shown get its type, ammo comes from pickup_ammo, the pick-up sound plays and the ammo icons are drawn (draw_ammo). Otherwise (from $08FE) it scrolls with the screen, disappears once its X is under $0A, and until it lands (pickup_landed) falls a line a frame and drifts 2 pixels right, landing on a character whose attributes have both floor bits ($0C)."
  },
  {
   "address": 2297,
   "type": "line",
   "text": "Ammunition given with each weapon type 0-4: 0, 0, 4, 3, 3. Types 2, 3 and 4 are the three weapons the white soldiers drop (spawn_pickups); type 1 is never dropped."
  },
  {
   "address": 2302,
   "type": "line",
   "text": "The dropped weapon is not under the hero: scroll it, remove it at the left edge, or let it fall."
  },
  {
   "address": 2422,
   "type": "line",
   "text": "For each enemy marked hit (enemy_hit) and not yet dying: adds its type's points (enemy_points) to points_due, in decimal, marks it dying with $80 in enemy_wait, enemy_timer and enemy_dying. A white soldier (type 1) or type 6 is put back on the ground (top sprite at the bottom one's place); a white soldier also drops the weapon its spawn entry names (spawn_pickups), 10 lines above its head. Sets the dying shapes by facing (dying_shapes), then for every dying enemy flashes its colours white and red until enemy_timer falls below $60, when the slot is freed (enemy_remove)."
  },
  {
   "address": 2627,
   "type": "line",
   "text": "The two colours a dying enemy flashes: white and red, chosen by bit 2 of its enemy_timer."
  },
  {
   "address": 2629,
   "type": "line",
   "text": "Sprite shapes of a dying enemy, by facing (left, right): bottom halves $B0 and $B2 here, top halves $B1 and $B3 at $0A47."
  },
  {
   "address": 2633,
   "type": "line",
   "text": "Colour of the dropped weapon by type 0-4: white, green, white, green, white."
  },
  {
   "address": 2638,
   "type": "line",
   "text": "Sprite shape of the dropped weapon by type 0-4: $67, $67, $6C, $67, $6D."
  },
  {
   "address": 2643,
   "type": "line",
   "text": "Points for each enemy type 0-8, two decimal bytes each (low, middle), added to points_due: 20, 250, 35, 25, 50, 75, 85, 35, 55. The score is shown with a 0 after it, so these are 200, 2500, 350, 250, 500, 750, 850, 350 and 550 points."
  },
  {
   "address": 2661,
   "type": "line",
   "text": "The knife. With the hero's pose in A, puts the point of the knife at knife_y (his top Y plus 0 standing or -16 crouching, from knife_offsets) and knife_x (his X plus -13, -7, +11 or +21 units for left standing, left crouching, right standing, right crouching). Every live enemy that is not dying or already hit, whose X is $0D or more and within 6 units of the point, and whose top Y is within $10 lines of it, is marked hit ($80 in enemy_hit) and the hit sound plays (sfx_hit). A paratrooper (type 9 in four slots: the man and three of parachute) can be knifed only in the man's slot (para_slots), and his hit also sets para_hit; during the Bridge fight, while helicopters are out (helis_out), the type 9 slots that can be knifed are 1 and 4, the middle of each helicopter. In the Harbour fight a dog in slots 1-3 is tested by dog_hit_test instead."
  },
  {
   "address": 2874,
   "type": "line",
   "text": "The knife's offsets: Y $00 standing and $F0 crouching, then X $F3, $F9, $0B, $15 (left standing, left crouching, right standing, right crouching), in game X units."
  },
  {
   "address": 2880,
   "type": "line",
   "text": "Six bytes after knife_offsets that knife_hit_test never reads with its index of 0-5."
  },
  {
   "address": 2886,
   "type": "line",
   "text": "The knife against a Harbour dog in slot X. The dog's box is 12 units either side of its X ($0C up, $18 across) and from 13 to 20 lines above its top Y; the knife's point (knife_x, knife_y) or its second point (knife_x2, knife_y2) must be inside it. A hit marks the dog in dog_hit and plays sfx_hit."
  },
  {
   "address": 2997,
   "type": "line",
   "text": "Touching an enemy. With the hero's X and top Y, looks for a live enemy that is not dying within 3 units of his X and whose box holds his top Y: from its top Y less $15 up to its top Y plus $0B, or plus $1C when its two halves are at different heights. If one does, and no helicopter is out (helis_out), the hero dies (player_killed). When none touches, goes on to the projectile test (shot_contact)."
  },
  {
   "address": 3105,
   "type": "line",
   "text": "The hero is killed: plays tune $29 (the death tune), drops its caller's return address and goes to lose_life. Reached from enemy_contact, shot_contact and the Harbour fight's dog test, each one call below a routine the main loop called, so the two pulled bytes are the main loop's call; in an end-of-stage fight there is one call more, and two bytes stay on the stack."
  },
  {
   "address": 3118,
   "type": "line",
   "text": "The end-of-stage fight: jumps to the stage's own handler through stage_end_handlers (an RTS with the address less one pushed)."
  },
  {
   "address": 3132,
   "type": "line",
   "text": "The four end-of-stage fight handlers, each address less one for the RTS in stage_end_dispatch: Missile $13D0, Harbour $0CAA, Bridge $1021, Prison Camp $0C44."
  },
  {
   "address": 3140,
   "type": "line",
   "text": "The Prison Camp's end-of-stage fight, run each frame instead of the main loop's body while boss_on is set. Lets the waves in (prison_waves), runs the spawner (random_spawn), the shared updates (fight_update, projectiles, fight_enemies), and, once boss_count has gone negative and no enemy or enemy projectile is left (any_enemy_left), ends the stage (stage_complete)."
  },
  {
   "address": 3174,
   "type": "line",
   "text": "The Prison Camp fight's enemies. The first time no enemy or enemy projectile is left (dog_anim, which the Harbour's dogs use and the Prison Camp uses as its phase, still 0) it starts the fight: clears the bottom floor's count and sets the phase. After that, whenever the bottom floor holds fewer than 3 enemies and lane 0 is not already waiting, it readies lane 0 with the next of the 18 enemies (boss_count from $11 down to 0): its type from prison_wave_types by boss_count's two low bits (blue soldier, bazooka man lying down, kicker, officer) and its side from wave_sides by the lowest bit, so they come from the right and the left in turn. random_spawn then brings each one in."
  },
  {
   "address": 3238,
   "type": "line",
   "text": "Enemy types of the Prison Camp fight, chosen by boss_count's two low bits: 3 (blue soldier), 6 (bazooka man lying down), 5 (kicker), 8 (officer)."
  },
  {
   "address": 3242,
   "type": "line",
   "text": "The Harbour's end-of-stage fight, the dogs. Starts it (harbour_fight_start), runs the dog handler in slot 0 (dog_handler), the shared updates, the dogs (dogs_update) and the delayed-enemy timers. Once all 18 dogs are out (boss_count negative), the handler's slot is empty and no dog is left in slots 1-3, it swaps the dogs' sprite shapes out again (block_swap 7) and ends the stage (stage_complete)."
  },
  {
   "address": 3294,
   "type": "line",
   "text": "The man who sends the dogs, in enemy slot 0, while the fight runs (boss_phase set). When the slot is empty he is put in at the bottom floor as a type 5, at the edge (spawn_set_x) opposite to the last time (handler_side flips between 4, the right, and 8, the left), with a delay of $1E frames (handler_timer). When the timer runs out he stops for about 13 frames (enemy_wait 1, enemy_timer $19, which this fight counts down twice a frame, in fight_update and again in harbour_fight) if the hero is on the side he faces, turned towards the hero (handler_shapes), and the timer is reloaded with $3C."
  },
  {
   "address": 3424,
   "type": "line",
   "text": "The dog handler's sprite shape when he stops: $C8 with the hero to his left, $C7 to his right."
  },
  {
   "address": 3426,
   "type": "line",
   "text": "Looks for a live enemy in slots 5-0, then for a live enemy projectile in the three slots (eshot_active). Returns with X on the first found and the N flag clear; with X = $FF and N set when there is none."
  },
  {
   "address": 3449,
   "type": "line",
   "text": "Starts the Harbour fight once the last enemy and enemy projectile have gone: clears the bottom floor's count, sets boss_phase, points the handler at the right (handler_side 4) and swaps the dogs' sprite shapes into $71C0 (block_swap 7)."
  },
  {
   "address": 3478,
   "type": "line",
   "text": "Releases a dog while fewer than 4 dogs are out (dog_release; the bottom floor's count counts the dogs and the handler), then moves the dogs (dogs_move), takes the knife's hits (dogs_hit) and animates their legs (dogs_animate)."
  },
  {
   "address": 3498,
   "type": "line",
   "text": "For each dog (slots 1-3) the knife has marked in dog_hit and that is not dying yet: starts its $1E frames of dying (the dog's entry in enemy_step, counted down by dog_dying), turns it round and throws it up in a leap (dog_leap_start) with shape $CF if it was running right or $D0 if left (the BIT at $0DCE skips the second load). Every dying dog counts down (dog_dying)."
  },
  {
   "address": 3547,
   "type": "line",
   "text": "Counts a dying dog's timer down; at 0 clears its slot (jump state, active, hit, dying, X, Y and X units) and lowers the bottom floor's count."
  },
  {
   "address": 3581,
   "type": "line",
   "text": "Every fourth frame of each running dog (dog_anim, which counts 0-3), steps its shape: $C9-$CB running right, $CC-$CE running left. Dogs that are leaping or dying keep their shape."
  },
  {
   "address": 3663,
   "type": "line",
   "text": "Moves each dog 4 pixels a frame. A dog running right (side 8) may leap at the hero (dog_leap_check); a dog running left only finishes a leap it is in (dog_leap). A dog that passes X $150 on the right or $12 on the left is removed and the bottom floor's count lowered."
  },
  {
   "address": 3781,
   "type": "line",
   "text": "Sends the next dog: while boss_count is not negative, and dog_delay has run out, and one of slots 1-3 is free. The dog's side (dog_sides) and colour (dog_colours) are read at boss_count, which is then lowered, and dog_delay reloaded from dog_delays. A dog from the right (side 4) starts at X $14E with shape $CD, one from the left at X $10 with shape $CA; its feet are at Y $E2, the bottom floor. Plays the bark (sfx_bark)."
  },
  {
   "address": 3907,
   "type": "line",
   "text": "A dog running right leaps at the hero when he is between 0 and $13 units ahead of it (dog_hero_ahead) and is not pulling the joystick down: a crouching hero is never leapt at. Falls into dog_leap_start with shape $CA."
  },
  {
   "address": 3926,
   "type": "line",
   "text": "Starts a leap with the shape in A: the jump arc's index (dog_arc) starts at $11 near the top of jump_arc, and the dog's base Y (dog_base) is set so that its height does not change on the first frame. Falls into dog_leap."
  },
  {
   "address": 3947,
   "type": "line",
   "text": "One frame of a leap: Y = dog_base plus jump_arc at dog_arc. Rising (dog_jump positive) the index counts down to 0, then dog_jump becomes $80 and it counts up again; at $12 the leap is over and dog_jump is cleared."
  },
  {
   "address": 3995,
   "type": "line",
   "text": "Carry clear when the hero's X units are more than the dog's and less than the dog's plus $14, so he is just ahead of a dog running right; carry set otherwise."
  },
  {
   "address": 4015,
   "type": "line",
   "text": "Frames to wait before the next dog, read at the new boss_count: $14 twice and $19, repeated, so the dogs come in threes."
  },
  {
   "address": 4033,
   "type": "line",
   "text": "The side each of the 18 dogs comes from, read at boss_count ($11 first, down to 0): 8 is the left, 4 the right; the first three from the left, then three from the right, and so on."
  },
  {
   "address": 4051,
   "type": "line",
   "text": "Each dog's colour, read at boss_count: orange ($08) for the first three, then brown ($09), in threes."
  },
  {
   "address": 4069,
   "type": "line",
   "text": "The routines of play that every end-of-stage fight runs: X units (sprites_to_units), the characters at the hero's head and feet (hero_chars), removing enemies off the screen (enemies_offscreen), touching an enemy (enemy_contact), deaths and points (enemy_deaths), delayed enemies (enemy_hold_timers), the player's weapon and projectiles (weapon_update) and the extra weapon's own routine (weapon_special)."
  },
  {
   "address": 4093,
   "type": "line",
   "text": "The enemies' animation, the characters under them, and their movement (enemies_anim, enemies_chars, enemies_move), for the fights."
  },
  {
   "address": 4102,
   "type": "line",
   "text": "The Bridge fight's version of fight_update: the helicopters cannot be touched, so instead of enemy_deaths it only steps the explosions of the hero's projectiles (shots_explode_step) and destroys any helicopter whose slot is marked hit (heli_hits)."
  },
  {
   "address": 4129,
   "type": "line",
   "text": "The Bridge's end-of-stage fight, the helicopters. Launches them (helis_launch); while the fight is on (boss_phase) it places them (helis_place), turns their X units into pixels (helis_x_to_pixels), spins their rotors (helis_rotor) and moves them (helis_move), then runs bridge_fight_update. Before boss_phase is set it runs the shared fight routines as for the other stages. Then the projectiles, sprite sorting, and back to the main loop."
  },
  {
   "address": 4170,
   "type": "line",
   "text": "For every enemy slot marked hit, destroys the helicopter that slot belongs to (heli_destroy)."
  },
  {
   "address": 4193,
   "type": "line",
   "text": "Steps the explosion of each of the hero's three projectiles that is exploding (shot_explosion), slots 2 down to 0."
  },
  {
   "address": 4202,
   "type": "line",
   "text": "The two helicopters' heights. A helicopter coming down (heli_mode 0) drops 2 lines a frame from where it was launched until it reaches $90, or $58 when the other one is already low (helis_low); it then hovers (heli_mode 1) with heli_base at that height, bobbing down and up through heli_bob (heli_bob_index counts up to the table's end marker and back down to 0). Each helicopter is then steered (heli_steer)."
  },
  {
   "address": 4334,
   "type": "line",
   "text": "A helicopter's X units. One hovering at $58 patrols between $14 and $8C, turning at either end; one at $90 chases the hero, turning towards him whenever it is more than $14 units from him. A turn sets heli_dir to +1 or -1 and changes its shapes (heli_turn); the X units then move by heli_dir."
  },
  {
   "address": 4456,
   "type": "line",
   "text": "The helicopters' bob, added to heli_base: 0, 0, 1, 2, 3, 4, 6, 8 and on by 2 to $22, then by 1 to $28, $28; $FF marks the end, where the index turns back."
  },
  {
   "address": 4485,
   "type": "line",
   "text": "Gives helicopter Y (its first enemy slot from heli_first_slot) the shapes of turning, three tops from heli_turn_shapes and three bottoms after them, and pauses its rotor for 6 frames (heli_turn_pause)."
  },
  {
   "address": 4521,
   "type": "line",
   "text": "Makes the middle slot of helicopter Y fire: faces it by heli_dir ($04 left, $08 right; the BIT at $11B1 skips the second load), turns it into type 8 for long enough to launch a projectile the way the officer does (enemy_fire), and makes it type 9 again. A helicopter with no height (just destroyed) does not fire."
  },
  {
   "address": 4572,
   "type": "line",
   "text": "Clears the three slots of the helicopter that slot X belongs to (slots 0-2 for X below 3, 3-5 otherwise; the BIT at $11E2 skips LDX #$03), takes one off helis_out, waits $20 frames before the next launch (heli_launch_timer), and clears that helicopter's height and helis_low. It also clears both helicopters' modes ($0350 and $0351, written without the index), so the one still flying comes down again, to $90 now that helis_low is clear, where it chases the hero."
  },
  {
   "address": 4638,
   "type": "line",
   "text": "Animates the two helicopters' rotors. For each, unless its turn pause is counting down, steps its frame (heli_frame, 0-3) and copies three top and three bottom shapes from rotor_shapes at rotor_frame_offsets plus $18 when it flies left. The first helicopter's shapes go to slots 0-2, the second's to 3-5 (rotor_limit). The second's turn pause returns at once, before its first's would have."
  },
  {
   "address": 4711,
   "type": "line",
   "text": "The operand of CPX at $1266, the slot after the helicopter whose shapes are being copied: helis_rotor sets it to 3 for the first helicopter and 6 for the second."
  },
  {
   "address": 4729,
   "type": "line",
   "text": "The first enemy slot of each helicopter: 0 and 3."
  },
  {
   "address": 4731,
   "type": "line",
   "text": "Frames left in each helicopter's turn, during which its rotor does not turn: heli_turn sets 6."
  },
  {
   "address": 4733,
   "type": "line",
   "text": "Offsets into rotor_shapes of the four rotor frames: 0, 6, 12, 18."
  },
  {
   "address": 4737,
   "type": "line",
   "text": "The helicopters' sprite shapes, six to a frame (three tops then three bottoms, left to right): four frames flying right, then four flying left at +$18."
  },
  {
   "address": 4785,
   "type": "line",
   "text": "A helicopter's shapes while it turns: tops $CC, $DF, $CC; bottoms $CC, $DE, $CC (the $CC parts are blank)."
  },
  {
   "address": 4791,
   "type": "line",
   "text": "Doubles the X of the twelve enemy sprites (slots 0-5, tops and bottoms) into pixels, with the carry going to the high byte: helis_place has written them in X units."
  },
  {
   "address": 4811,
   "type": "line",
   "text": "Places each helicopter that is out: lets it fire when its time comes (enemy_fire_check, heli_fire), puts its three slots at its X units less $0C, plus 0, $0C and $18, and its height as their tops (bottoms $15 lines lower). A slot at X units $AC or more is hidden (Y 0), so a helicopter comes on at the edge a third at a time."
  },
  {
   "address": 4912,
   "type": "line",
   "text": "The helicopters, three in all (boss_count 3, 2, 1). At the start (boss_count still 3) it waits until no enemy or projectile is left, clears the dying and hit flags, plays tune $2F and sets boss_phase. While fewer than two helicopters are out and heli_launch_timer has run out ($20 frames after a launch or a kill), it launches one into the first free group of slots (heli_launch). With boss_count at 0 and none out, the stage is complete: it jumps to stage_complete from inside bridge_fight's call, so that call's return address is never taken off the stack, and each Bridge won leaves two bytes there for good, as a death in an end-of-stage fight does (player_killed)."
  },
  {
   "address": 4992,
   "type": "line",
   "text": "Launches helicopter Y into slots X to X+2: its direction (heli_start_dir), X units (heli_start_x) and height (heli_start_y), type 9, live, not dying, white tops and blue bottoms. Adds one to helis_out, takes one off boss_count, reloads heli_launch_timer with $20 and sets the helicopter coming down (heli_mode 0)."
  },
  {
   "address": 5063,
   "type": "line",
   "text": "Direction of each helicopter at launch: +1 (right) for the first, -1 for the second."
  },
  {
   "address": 5065,
   "type": "line",
   "text": "X units at launch: $01 for the first (at the left edge) and $B4 for the second (off the right edge)."
  },
  {
   "address": 5067,
   "type": "line",
   "text": "Height of each helicopter at launch: $46, at the top of the playfield."
  },
  {
   "address": 5069,
   "type": "line",
   "text": "Goes back into the main loop's body (after its boss_on test): the Missile Base's fight does not start until the last enemy of the stage is gone."
  },
  {
   "address": 5072,
   "type": "line",
   "text": "The Missile Base's end-of-stage fight. Until no enemy or projectile is left the main loop runs as before (missile_fight_wait); then the lorry drives across (lorry_update) and the shared updates run; once boss_phase is set, soldiers come (missile_fight_spawn) and the enemies move. When all 18 have come (boss_count 0) and the floor is empty, it ends voice 1's part of the lorry's tune (voice1_tune_off), waits for the rest of the music (wait_tune) and ends the stage."
  },
  {
   "address": 5124,
   "type": "line",
   "text": "Starts the end-of-stage fight once the scroll has reached the stage's end (scroll_limit is $E0) and the alarm tune has finished: sets boss_on and the frame counter to $FA."
  },
  {
   "address": 5147,
   "type": "line",
   "text": "Clears the Y of every virtual sprite but the last two (the hero's shots and the dropped weapon stay), sorts them and hands them to the interrupt."
  },
  {
   "address": 5162,
   "type": "line",
   "text": "A stage is won. Blanks the screen, moves to the next stage and its first map column (stage_start_lo, stage_start_hi), plays its tune (stage_tunes), clears the sprites, swaps the title's character set in (block_swap 8) and draws the intermission: the map of the four stages (picture 0) with RESCUE THE CAPTIVES (text 1) and WELL DONE and TARGET OVERCOME (text 2); the stages' names are part of picture 0, or, after the fourth stage, the captives' scene (picture 1; the BIT at $1461 skips LDA #$00) with text 3. The hero walks along the map (or the rescue plays) until the tune ends. Then it swaps the character set back, clears the play variables, places the hero and plays tune $41. After the fourth stage the game starts again at the Missile Base with stage 0 and map column 0, and the soldiers shoot twice as often (fire_frame_b becomes $82). loop_count is meant to add a third chance on the third time round (fire_frame_c $FA), but the DEY and INY leave it at 0 for ever. Then the stage's graphics are swapped in (stage_swaps) and play starts (stage_start)."
  },
  {
   "address": 5421,
   "type": "line",
   "text": "The hero has died. Freezes him, waits for the music (wait_tune) and takes a life. With none left it draws GAME OVER (draw_game_over), plays tune $23, waits, blanks the screen and starts a new game (new_game). Otherwise it plays tune $41 and restarts at the last checkpoint passed: the highest entry of checkpoints that the map column has reached, less $28 columns (the width of the screen, so the checkpoint is at its right edge). In the Harbour fight the dogs' shapes are swapped out (block_swap 7). It clears the play variables and the sprites, resets the difficulty to 0 and starts play (stage_start)."
  },
  {
   "address": 5531,
   "type": "line",
   "text": "The 24 map columns play restarts from after a death, six to a stage, low byte first. Missile Base $0028-$01C7, Harbour $0218-$03D9, Bridge $0438-$068E, Prison Camp $06C6-$08B8. lose_life restarts $28 columns before the last one reached."
  },
  {
   "address": 5579,
   "type": "line",
   "text": "Swaps the stage's graphics into place (block_swap) from stage_swap_a, stage_swap_b and stage_swap_c: Harbour swap 0; Bridge swaps 1, 3 and 2; Prison Camp swaps 4, 6 and 5. On the Missile Base, which uses memory as loaded, it returns at once; on the others it then clears the play variables (play_reset)."
  },
  {
   "address": 5616,
   "type": "line",
   "text": "Starts play on the stage: draws the status line (status_draw), on the Prison Camp sets its extras (prison_setup), draws the screen from the map (stage_draw), places the hero (hero_init) and enters the main loop."
  },
  {
   "address": 5638,
   "type": "line",
   "text": "Blanks or unblanks the screen: flips bit 4 of VIC control register 1 and clears bit 7 (raster high)."
  },
  {
   "address": 5648,
   "type": "line",
   "text": "The RTS of screen_toggle, and the base of the table of each stage's first block swap (stage 0 is never read): 0 for the Harbour, 1 for the Bridge, 4 for the Prison Camp."
  },
  {
   "address": 5649,
   "type": "line",
   "text": "stage_swap_a's entries for the Harbour (0) and the Bridge (1); the Prison Camp's 4 is at $1613."
  },
  {
   "address": 5651,
   "type": "line",
   "text": "Each stage's second block swap, read at the stage (0 means none): none, 3, 6. Its first byte is also the third entry of stage_swap_a."
  },
  {
   "address": 5654,
   "type": "line",
   "text": "Each stage's third block swap, read at the stage: none, 2, 5. Its first byte is also the third entry of stage_swap_b."
  },
  {
   "address": 5658,
   "type": "line",
   "text": "Low bytes of the map column each stage starts at, read at the new stage: $019F (Harbour), $03B1 (Bridge), $0666 (Prison Camp), and $1700 after the fourth, which the loop then replaces with 0."
  },
  {
   "address": 5662,
   "type": "line",
   "text": "High bytes of the map column each stage starts at, read at the new stage (1-4): $01, $03, $06, and $17 after the fourth. The $06 is also the first byte of stage_tunes, which is never read as a tune."
  },
  {
   "address": 5665,
   "type": "line",
   "text": "The tune started with each stage's intermission, read at the new stage (1-4): $17 after the Missile Base, $1D after the Harbour, $3B after the Bridge and $11 after the Prison Camp. The byte at $1621 itself is the last of stage_start_hi."
  },
  {
   "address": 5670,
   "type": "line",
   "text": "Clears the play variables: $0200-$02CC, $02CD-$0354, every virtual sprite's Y and X, and the scripted spawns' done flags (spawn_done); sets enemy_climb_y of all six enemies to $15."
  },
  {
   "address": 5723,
   "type": "line",
   "text": "The Missile Base fight's soldiers, 18 of them (boss_count from $11), from the right on the bottom floor (lane 0, side 4). A soldier comes when the floor holds fewer than 2, or 2 and 11 frames have passed since the last (the frame counter is set to $F5); never when it holds 3. Its type is read from missile_fight_types at boss_count; it is placed by spawn_on_floor, faces and walks left, and moves at once."
  },
  {
   "address": 5811,
   "type": "line",
   "text": "Types of the Missile Base fight's soldiers, read at boss_count: kicker (5) and brown soldier (0)."
  },
  {
   "address": 5831,
   "type": "line",
   "text": "Sets the colour of all six projectiles from shots_flash_colours by bit 2 of the frame counter, so they flash yellow and red every four frames."
  },
  {
   "address": 5851,
   "type": "line",
   "text": "The two colours shots_flash alternates: yellow and red."
  },
  {
   "address": 5853,
   "type": "line",
   "text": "The projectiles, once a frame. Frees those that have left the screen (shots_offscreen), tests the hero's against the enemies (pshot_hits) and every one against the mines on the ground (shots_vs_mines). If SPACE has just been pressed with a weapon and ammunition (weapon_trigger) and a slot is free (pshot_free_slot), fires (weapon_fire), takes one from ammo, clears weapon_shown at 0 and redraws the ammunition (draw_ammo). Then scrolls all six projectiles with the screen (shots_scroll), moves each that is out by its speed, right or left by its direction. With the flame thrower, once the flame has been let go (flame_free) and its back has closed to within $17 pixels of its front, the middle part is hidden and the back slows to 6, the front's speed. Last, the projectiles' colours flash (shots_flash)."
  },
  {
   "address": 5984,
   "type": "line",
   "text": "Tests each of the hero's three projectiles that is out against every enemy, unless the weapon is the hand grenades, which hit only when they explode (blast_hits). In the Harbour a dog in slots 1-3 counts as well. A paratrooper's rules are the knife's (para_slots, helis_out). A hit is the projectile's X units within 3 of the enemy's and its Y less $13 within $10 lines of the enemy's top: the enemy is marked in enemy_hit, or a dog in dog_hit. A paratrooper hit is cut loose at once (para_release, sfx_hit). In the Bridge fight a hit explodes the projectile (shot_explode) and destroys the helicopter (heli_destroy)."
  },
  {
   "address": 6222,
   "type": "line",
   "text": "Returns Z clear (A = $10) when SPACE has just gone down: CIA 1 port B bit 4, which with port A left at $7F (row 7) is SPACE, and also port 1's fire button. Nothing happens without a weapon, with ammo at 0, or on a ladder (ladder_on); space_last keeps the previous state so a held key fires once."
  },
  {
   "address": 6258,
   "type": "line",
   "text": "Runs the extra weapon's own routine each frame through weapon_handlers, by weapon less one: the self-modified JMP at $1887 jumps to it."
  },
  {
   "address": 6280,
   "type": "line",
   "text": "The operand of the JMP at $1887, written by weapon_special from weapon_handlers. As loaded it points at the JMP itself."
  },
  {
   "address": 6282,
   "type": "line",
   "text": "The extra weapons' routines, by weapon less one: 1 (never given) an RTS, 2 the bazooka an RTS (its shell flies straight), 3 the hand grenades (grenades_update), 4 the flame thrower (flame_update)."
  },
  {
   "address": 6290,
   "type": "line",
   "text": "No extra weapon: nothing to run."
  },
  {
   "address": 6291,
   "type": "line",
   "text": "The RTS that weapon 1 runs."
  },
  {
   "address": 6292,
   "type": "line",
   "text": "Each grenade out flies along jump_arc: Y = shot_arc_base plus the arc at shot_arc_index, the index counting down while it rises and then, with shot_arc_state $80, up again. The arc ends at index $13 or at Y $E2; from then on the grenade drops (shot_fall)."
  },
  {
   "address": 6369,
   "type": "line",
   "text": "A grenade after its arc: reads the screen character under it (shot_char_read); a character from $C8 with either floor bit ($0C in char_attrs) explodes it (shot_explode, shot_explosion); so does reaching Y $E2. Otherwise it drops 4 lines."
  },
  {
   "address": 6409,
   "type": "line",
   "text": "The screen character under projectile X: row from its Y less $26 (in eights, times 40, plus the screen at $4000) and column from its X units less 8, halved twice, plus $28 (one row lower). Keeps it in shot_char."
  },
  {
   "address": 6459,
   "type": "line",
   "text": "Turns projectile X into an explosion, unless it is one already: speed 0, white, shape $62, five frames to a shape, the explosion sound (sfx_explode). A projectile of the hero's (slots 0-2) also hits everything in the blast (blast_hits)."
  },
  {
   "address": 6505,
   "type": "line",
   "text": "Counts an explosion's five frames; then shows the next shape, $62 to $64, each smaller; after $64 the projectile is freed."
  },
  {
   "address": 6543,
   "type": "line",
   "text": "Marks hit every live enemy inside the blast of projectile X (blast_box), with the paratrooper's rule as for the knife (para_hit, para_slots)."
  },
  {
   "address": 6586,
   "type": "line",
   "text": "Carry set when enemy Y is inside the blast of projectile X: the projectile's X units more than the enemy's less $28 (8 at the left edge) and no more than the enemy's plus $28, and its Y more than the enemy's top and no more than the top plus $46."
  },
  {
   "address": 6634,
   "type": "line",
   "text": "The flame thrower. While the flame is held (flame_free clear), its three parts follow the hero's height (his top plus 5 while the stick is pulled down, plus $0A otherwise). Once the front part is $14 X units or more from the back, the flame is let go: flame_free is set, and the three parts fly on at 6, 7 and 8 pixels a frame, front to back, so the back closes up."
  },
  {
   "address": 6717,
   "type": "line",
   "text": "Frees each of the six projectiles whose X units are $AA or more or under 8. When one of the hero's goes with the flame thrower as the weapon, all three of his get speed 8."
  },
  {
   "address": 6777,
   "type": "line",
   "text": "Looks for a free projectile slot from 2 down: X on it and carry clear, or carry set when the hero's three are all out."
  },
  {
   "address": 6779,
   "type": "line",
   "text": "The search of pshot_free_slot from slot X down, which enemy_fire and the grenade thrower call with X = 5: they then use the slot only if it is 3 or more, an enemy projectile."
  },
  {
   "address": 6791,
   "type": "line",
   "text": "Fires the weapon from slot X, with Y the weapon less one. The flame thrower needs all three slots (X = 2). The projectile takes the hero's facing, its colour (shot_colours), Y his top plus $0A, X his plus $10 facing right or less $10 facing left, its shape by facing (shot_shapes_right, shot_shapes_left) and its speed (pshot_speeds). Hand grenades start on the jump arc at index $12. The flame thrower builds three parts in slots 2, 1 and 0, each starting where the part before it is, with the next shape and 2 more pixels a frame (0, 2, 4), so the flame stretches out from the hero's hands; then the flame's sound (sfx_flame)."
  },
  {
   "address": 7000,
   "type": "line",
   "text": "The enemies' projectiles, slots 5-3: each runs the routine for its type from eshot_handlers, through the self-modified JSR at $1B76."
  },
  {
   "address": 7030,
   "type": "line",
   "text": "JSR to the projectile type's routine; its operand is written by eshots_update. As loaded it calls itself."
  },
  {
   "address": 7031,
   "type": "line",
   "text": "The operand of eshot_call's JSR, written by eshots_update from the projectile type's routine."
  },
  {
   "address": 7036,
   "type": "line",
   "text": "Routines for enemy projectile types 0-7: 0 and 1 (bullet, bazooka shell) RTS, they fly straight; 2 (grenade) eshot_arc; 3 an RTS; 4 an RTS; 5 and 6 (bombs) eshot_fall; 7 (the jet's bomb) eshot_jet_bomb."
  },
  {
   "address": 7052,
   "type": "line",
   "text": "The jet's bomb. The jet's own slot is left alone. The bomb, while its Y is 0, is not out; once dropped it falls 4 lines a frame with its X at the hero's plus 9 (it homes in) until it passes Y $F3, when it is freed (Y 1)."
  },
  {
   "address": 7078,
   "type": "line",
   "text": "A bomb falls 2 lines a frame; past Y $F3 it is freed."
  },
  {
   "address": 7099,
   "type": "line",
   "text": "RTS for projectile types 0 and 4."
  },
  {
   "address": 7100,
   "type": "line",
   "text": "RTS for projectile type 1."
  },
  {
   "address": 7101,
   "type": "line",
   "text": "RTS for projectile type 3."
  },
  {
   "address": 7102,
   "type": "line",
   "text": "An enemy's grenade: flies along jump_arc from shot_arc_base, the index counting down then up again (shot_arc_state $80) to $1A; then it falls and explodes on a floor like the hero's (shot_fall)."
  },
  {
   "address": 7153,
   "type": "line",
   "text": "Projectile colours by type 0-6: yellow, light grey (the bazooka's shell), green (grenade), yellow (flame), green, yellow, cyan. The hero's weapons index it by weapon less one."
  },
  {
   "address": 7160,
   "type": "line",
   "text": "Speed in pixels a frame of the hero's projectiles: bazooka 4, grenade 3, flame 0 (its parts get 0, 2 and 4). The byte before is shot_colours' type 6."
  },
  {
   "address": 7163,
   "type": "line",
   "text": "Three bytes nothing reads."
  },
  {
   "address": 7166,
   "type": "line",
   "text": "Projectile shapes facing right, by type 0-6: $8E (bullet), $66 (bazooka shell), $67 (grenade), $69 (flame, its other parts $6A and $6B), $67, $67, $8E."
  },
  {
   "address": 7173,
   "type": "line",
   "text": "Projectile shapes facing left, by type: $8E, $65, $67, $98 (flame, then $99 and $9A), $67, $67, $8E."
  },
  {
   "address": 7180,
   "type": "line",
   "text": "The lorry that crosses the Missile Base before its fight. The first time (lorry_started clear) it sets its speed to 6 pixels a frame (lorry_speed), the wheel timer, boss_count $11, plays tune $4D, and builds the lorry from nine sprites in slots 0-5 (three columns of top, middle and bottom: shapes from lorry_shapes, colours from lorry_colours), at X 0 with its wheels on the bottom floor. Each frame until boss_phase is set it turns the wheels (lorry_wheels) and moves the columns right by lorry_speed, the second column once the first is 10 units in and the third once the second is; it slows to 4, 3 and 2 as it passes X units $32, $5A and $78, and at $AA, off the right edge, it is removed and boss_phase is set."
  },
  {
   "address": 7309,
   "type": "line",
   "text": "Shapes of the lorry's nine sprites, bottom to top in each column: the front column (slot 0, which leads as the lorry drives right) $70 (wheel), $76 (cab), $CC (blank); the middle $75, $77, $7A; the rear $73 (wheel), $78, $7B (the canopy)."
  },
  {
   "address": 7318,
   "type": "line",
   "text": "Colours of the lorry's nine sprites, in the same order: dark grey ($0B) and brown ($09)."
  },
  {
   "address": 7327,
   "type": "line",
   "text": "Once the lorry is built, each frame until boss_phase is set (checked at $1C87): turns the wheels (lorry_wheels) and moves the three columns right by lorry_speed pixels, carrying into the X high bit; the middle column starts once the front one is 10 X units in, the rear once the middle one is. By the rear column's X units it slows to 4 from $32, 3 from $5A and 2 from $78; at $AA it is gone: boss_phase is set, the bottom floor's count cleared and the Y of the nine sprites zeroed."
  },
  {
   "address": 7471,
   "type": "line",
   "text": "The lorry slows to 4 pixels a frame."
  },
  {
   "address": 7477,
   "type": "line",
   "text": "The lorry slows to 3."
  },
  {
   "address": 7483,
   "type": "line",
   "text": "The lorry slows to 2."
  },
  {
   "address": 7489,
   "type": "line",
   "text": "For each enemy held still (enemy_wait set) with a timer, counts enemy_timer down; at 0 the hold ends and the enemy is put back on its floor: top Y from floor_y by its floor, bottom $15 lower, the bottom sprite at the top's X, and its animation state set to 3. A hold with the timer at 0 lasts until something else clears enemy_wait."
  },
  {
   "address": 7545,
   "type": "line",
   "text": "Turns the lorry's two wheels every 7 less lorry_speed frames: the front wheel's shape steps $6F-$71 and the rear's $72-$74."
  },
  {
   "address": 7593,
   "type": "line",
   "text": "The five random spawn lanes. For lanes 4 down to 0, one not already waiting (lane_ready clear) counts its lane_timer down; when one reaches 0 it gets its next enemy type from lane_types and its new time from lane_reload, both read at the lane plus the difficulty, and becomes ready. One lane at most a frame."
  },
  {
   "address": 7633,
   "type": "line",
   "text": "Looks for a ready lane from 5 down: carry set with its number in spawn_lane, or carry clear when none is."
  },
  {
   "address": 7650,
   "type": "line",
   "text": "Frames until a lane is ready again, read at lane plus difficulty (0-15): $C8 (200) for lane 0 at the start, falling to $87 (135) for lane 4 at the top difficulty."
  },
  {
   "address": 7670,
   "type": "line",
   "text": "Enemy type each lane brings, read at lane plus difficulty: brown soldier (0), the two blue soldiers (2, 3) and kickers (5); the officer (8) only from difficulty 12."
  },
  {
   "address": 7690,
   "type": "line",
   "text": "Side each lane's enemies come from: 4 (the right) for all but lane 2, which brings them from the left (8). The fights write lane 0's: prison_waves alternates it, missile_fight_spawn sets 4."
  },
  {
   "address": 7710,
   "type": "line",
   "text": "The map's own enemies. Checks the scripted spawn table at this map column (scripted_check); with one pending, fewer than 6 enemies out and a free slot (enemy_free_slot), places it (scripted_place)."
  },
  {
   "address": 7732,
   "type": "line",
   "text": "A byte nothing reads ($02), between scripted_spawn and scripted_place."
  },
  {
   "address": 7733,
   "type": "line",
   "text": "Places the pending scripted enemy in slot X, if its floor holds fewer than 3 (otherwise it tries again next frame). Unless it is a paratrooper, the right edge of its floor must be standing ground (spawn_floor_check), or the entry is dropped. It comes in at X $14F (just off the right edge), its top and bottom at its floor's Y plus spawn_dy_top and spawn_dy_bot and X plus spawn_dx_top and spawn_dx_bot by type (a soldier lying down is two sprites side by side). Speed (type_speeds), colours (type_top_colours), shapes (type_top_shapes, type_bot_shapes), the hold timer (type_hold_times) and the table entry (enemy_entry, for the weapon a white soldier drops) are set; it faces left, held (enemy_wait 1), and the counts are raised."
  },
  {
   "address": 7919,
   "type": "line",
   "text": "The scripted enemy's floor has no ground at the edge: the entry is dropped."
  },
  {
   "address": 7923,
   "type": "line",
   "text": "Looks through the current stage's part of the scripted spawn table (stage_spawn_first to stage_spawn_end) for an entry not yet used (spawn_done) whose map column (spawn_col_hi, spawn_col_lo) is the current one. Marks it used and makes it pending (spawn_pending) with its type (spawn_types), its floor (spawn_floors) and its type's offsets and speed."
  },
  {
   "address": 8018,
   "type": "line",
   "text": "Low bytes of the map columns of the 60 scripted enemies, all four stages in turn."
  },
  {
   "address": 8078,
   "type": "line",
   "text": "High bytes of the scripted enemies' map columns."
  },
  {
   "address": 8138,
   "type": "line",
   "text": "Type of each scripted enemy, 60 in all: 16 white soldiers (1), 15 bazooka men lying down (6), 12 crawlers (7), 11 green grenade throwers (4) and 6 paratroopers (9)."
  },
  {
   "address": 8198,
   "type": "line",
   "text": "The weapon each scripted enemy drops when it is a white soldier and is killed: 2 the bazooka, 3 the hand grenades, 4 the flame thrower, 0 none."
  },
  {
   "address": 8258,
   "type": "line",
   "text": "Floor of each scripted enemy: 0 the bottom, 1 the middle, 2 the top."
  },
  {
   "address": 8318,
   "type": "line",
   "text": "Offset of a new enemy's top sprite from its floor's Y, by type 0-9: $15 for the types that lie down (1, 6, 7), $33 for the paratrooper, 0 for the rest."
  },
  {
   "address": 8328,
   "type": "line",
   "text": "Offset of its bottom sprite: $15, and $33 for the paratrooper."
  },
  {
   "address": 8338,
   "type": "line",
   "text": "X offset of its top sprite: $18 for the paratrooper, 0 for the rest."
  },
  {
   "address": 8348,
   "type": "line",
   "text": "X offset of its bottom sprite: $18 for the types that lie down and the paratrooper, so the two halves sit side by side."
  },
  {
   "address": 8358,
   "type": "line",
   "text": "First scripted spawn entry of each stage: 0, 5, 21, 43."
  },
  {
   "address": 8362,
   "type": "line",
   "text": "Entry after each stage's last: 5, 21, 43, 60."
  },
  {
   "address": 8366,
   "type": "line",
   "text": "The pending scripted enemy's type, with spawn_wait, spawn_floor, spawn_speed and its four offsets after it; the dogs' release uses it and spawn_speed for a dog's side and colour."
  },
  {
   "address": 8367,
   "type": "line",
   "text": "enemy_wait for the pending enemy: always 1."
  },
  {
   "address": 8368,
   "type": "line",
   "text": "Floor of the pending enemy."
  },
  {
   "address": 8369,
   "type": "line",
   "text": "Speed fraction of the pending enemy (type_speeds)."
  },
  {
   "address": 8370,
   "type": "line",
   "text": "Top and bottom Y offsets and top and bottom X offsets of the pending enemy, copied from spawn_dy_top, spawn_dy_bot, spawn_dx_top and spawn_dx_bot."
  },
  {
   "address": 8374,
   "type": "line",
   "text": "Table entry of the pending enemy, kept in enemy_entry."
  },
  {
   "address": 8375,
   "type": "line",
   "text": "Brings in a lane's enemy when a lane is ready (lane_find_ready), fewer than 5 enemies are out (enemy_count_check) and a slot is free (enemy_free_slot): spawn_lane_enemy."
  },
  {
   "address": 8394,
   "type": "line",
   "text": "Tries the hero's floor first, then the floors below it, wrapping round, three tries in all (spawn_tries)."
  },
  {
   "address": 8402,
   "type": "line",
   "text": "Places the ready lane's enemy in slot X on floor Y, if that floor holds fewer than 3 and (outside a fight's later phase, boss_phase) its edge is standing ground (spawn_floor_check); else tries the next floor down (spawn_next_floor). Its top is floor_y for the floor, or $A9 during a fight's later phase, its bottom $15 lower. Falls into spawn_set_x."
  },
  {
   "address": 8461,
   "type": "line",
   "text": "X for a new enemy coming from side A: from the right (4) $144 (8 less when the edge character spawn_floor_check found is $C8 or more), from the left (8) $012; plus the fine scroll. Then the lane's type, colours (type_top_colours, type_bot_colours), speed, active, the enemy count, and the lane's side as its direction. The lane is no longer ready."
  },
  {
   "address": 8575,
   "type": "line",
   "text": "The floor was full or had no ground at the edge: tries the floor below (from the bottom, the top), until three have been tried."
  },
  {
   "address": 8593,
   "type": "line",
   "text": "Carry set when floor Y (1 or 2; the bottom floor always passes) has a floor character at the screen's edge on the lane's side: reads the screen at edge_row_lo and edge_row_hi for the floor and side, keeps the first byte in x_save for spawn_set_x, and checks the attributes (char_attrs) of the second for both floor bits ($0C)."
  },
  {
   "address": 8659,
   "type": "line",
   "text": "X high byte of a new enemy from the right and from the left: 1, 0."
  },
  {
   "address": 8661,
   "type": "line",
   "text": "X low byte of a new enemy from the right and from the left: $44, $12."
  },
  {
   "address": 8663,
   "type": "line",
   "text": "Low bytes of the screen addresses checked at the floor edges: right edge of floors 1 and 2, then left edge of floors 1 and 2."
  },
  {
   "address": 8667,
   "type": "line",
   "text": "High bytes of the same screen addresses."
  },
  {
   "address": 8671,
   "type": "line",
   "text": "Top sprite colour by enemy type 0-9: brown, white, blue, blue, light green, light green, brown, brown, dark grey, light green."
  },
  {
   "address": 8681,
   "type": "line",
   "text": "Bottom sprite colour by type: as the tops, but blue for the officer (8)."
  },
  {
   "address": 8691,
   "type": "line",
   "text": "Walking speed fraction by type: each frame a type walks 1 pixel, and 1 more whenever this fraction carries ($80 is 1.5 pixels a frame, $C0 1.75, 0 one)."
  },
  {
   "address": 8701,
   "type": "line",
   "text": "Frames a scripted enemy of each type is held before it moves (enemy_timer): $3C for the white soldier, $1E for the bazooka man lying down, 0 (held until released) for the others."
  },
  {
   "address": 8711,
   "type": "line",
   "text": "Starting top shape by type."
  },
  {
   "address": 8721,
   "type": "line",
   "text": "Starting bottom shape by type."
  },
  {
   "address": 8731,
   "type": "line",
   "text": "Carry set when 5 or more enemies are out (enemy_count)."
  },
  {
   "address": 8737,
   "type": "line",
   "text": "Looks for an enemy slot with its top Y at 0, from 5 down: X on it and carry clear, or carry set when all six are used."
  },
  {
   "address": 8750,
   "type": "line",
   "text": "When the hero's top Y equals a floor's Y (floor_y), keeps that floor in hero_floor; between floors it keeps the last."
  },
  {
   "address": 8767,
   "type": "line",
   "text": "Keeps each standing enemy's floor (one not climbing, held, jumping or falling) up to date from its top Y. An enemy that fell from a higher floor was counted on the floors below it as well (enemy_fall_counts); when it lands the extra counts are taken off, depending on whether it is back on its own floor or landed lower."
  },
  {
   "address": 8866,
   "type": "line",
   "text": "A second JMP $225B, which no path reaches."
  },
  {
   "address": 8887,
   "type": "line",
   "text": "When the screen scrolled this frame, moves every live enemy's two sprites left by scroll_step pixels, clearing the high byte of X on a borrow."
  },
  {
   "address": 8893,
   "type": "line",
   "text": "Top Y of a figure standing on each floor: $CD the bottom, $9D the middle, $6D the top."
  },
  {
   "address": 8896,
   "type": "line",
   "text": "Shifts the enemies left by the scroll."
  },
  {
   "address": 8945,
   "type": "line",
   "text": "When the screen scrolled, moves every projectile out left by scroll_step pixels."
  },
  {
   "address": 8983,
   "type": "line",
   "text": "Sends enemies up and down ladders after the hero. A live enemy that is not held, not a brown soldier or a kicker, and not already climbing: standing on a character whose attributes have bit 1 (ladder down) when the hero is on a lower floor, it climbs down; with bit 0 (ladder up) level with its legs when he is higher, it climbs up; either only if the floor it goes to holds fewer than 3. Its direction becomes 2 or 1, its floor and the counts change, and it starts climbing (enemy_climbing). On the Bridge a ladder between the middle floor and the one beyond counts that floor too (ladder_through 1 going down, 3 going up), since the climb may pass it."
  },
  {
   "address": 9142,
   "type": "line",
   "text": "PLA and JMP $23AF, which no path reaches."
  },
  {
   "address": 9248,
   "type": "line",
   "text": "An enemy on floor 1 or 2 starts to drop: it is counted on the bottom floor (and the middle one, from floor 2) until it lands, with enemy_falling_from keeping where it came from; types that jump (fall_jump_types) jump off instead of stepping off."
  },
  {
   "address": 9278,
   "type": "line",
   "text": "Scans the sorted order of the virtual sprites (sprite_order) from its end for the first sprite with a Y other than 0 and keeps its place in the order in mux_next, where the multiplexer starts its next frame (0 when there is none). sprites_sort leaves the order in descending Y with the unused sprites, whose Y is 0, at the end, so this is the topmost sprite on the screen."
  },
  {
   "address": 9295,
   "type": "line",
   "text": "The stab's hold has run out (stab_hold): a hero in the air goes back to his jump pose."
  },
  {
   "address": 9316,
   "type": "line",
   "text": "For types that jump (fall_jump_types), adds bit 0 (jump) to the direction and stops the fall."
  },
  {
   "address": 9338,
   "type": "line",
   "text": "1 for the enemy types that jump rather than drop off a floor: white soldier, the two blue soldiers and the kicker."
  },
  {
   "address": 9348,
   "type": "line",
   "text": "Returns while the stab is still held, or when it ends with the hero on the ground."
  },
  {
   "address": 9349,
   "type": "line",
   "text": "The hero's pose and animation, from the interrupt. While a stab is held (stab_hold) it counts it down. With the stick at rest he stands (his facing), unless on a ladder, jumping or falling. With it held, the pose follows the stick, the floor and ladders under him: walking, crouching (down), climbing. A pose held steps its animation every 6 frames (pose_timer) through player_anim_tops and player_anim_bottoms; with an extra weapon shown, the top comes from the weapon's own frames (weapon_pose_offsets) where it has one."
  },
  {
   "address": 9391,
   "type": "line",
   "text": "Steps the animation of pose Y, or starts it when the pose changed."
  },
  {
   "address": 9450,
   "type": "line",
   "text": "Up was pressed: stands facing as before unless on a ladder or in the air."
  },
  {
   "address": 9474,
   "type": "line",
   "text": "Down on a floor: crouches facing the stick's direction, if not on a ladder."
  },
  {
   "address": 9504,
   "type": "line",
   "text": "The animation reached its end marker: starts the pose again."
  },
  {
   "address": 9510,
   "type": "line",
   "text": "Starts pose A at once (pose_timer 1)."
  },
  {
   "address": 9517,
   "type": "line",
   "text": "Sets the hero's pose to A: its animation start comes from player_pose_starts by the pose's five low bits. Poses that move the top sprite against the bottom (pose_anim_starts) take their Y offset (pose_dy) and X offset (pose_dx), so the hero lying down is two sprites side by side."
  },
  {
   "address": 9561,
   "type": "line",
   "text": "How far the top sprite is above the bottom for the poses in pose_anim_starts: $15 normally, 0 when the two lie side by side."
  },
  {
   "address": 9568,
   "type": "line",
   "text": "X of the top sprite against the bottom for those poses: 0, $18, $18, -8, 8, $18, $18."
  },
  {
   "address": 9575,
   "type": "line",
   "text": "The animation starts that have their own offsets in pose_dy and pose_dx: 0, $0F, $11, $13, $15, $19, $1B."
  },
  {
   "address": 9582,
   "type": "line",
   "text": "Offset into player_anim_tops of the hero's frames holding a weapon, by weapon_shown: $20 for the bazooka, $40 for the flame thrower, none for the others."
  },
  {
   "address": 9587,
   "type": "line",
   "text": "The hero's top sprite shapes, sequences ended by 0: walking $14-$17, crouching, jumping, climbing and stabbing; from +$20 the same holding the bazooka ($9E-$A1), from +$40 holding the flame thrower ($A8-$AB)."
  },
  {
   "address": 9683,
   "type": "line",
   "text": "The hero's bottom sprite shapes for the same sequences."
  },
  {
   "address": 9715,
   "type": "line",
   "text": "Animation start by pose (the pose's five low bits: 1 jump, 2 down, 4 left, 8 right, $10 stab)."
  },
  {
   "address": 9747,
   "type": "line",
   "text": "Animates each live enemy. One with a direction (enemy_dir) that is not falling or held: when its direction differs from the last animated (enemy_anim_state) the animation restarts, and every 5 frames (enemy_anim_timer) it steps through enemy_anim_tops and enemy_anim_bottoms until the end marker, then starts again. One with no direction is restarted on its facing's animation, held or falling or not, except while the hero is on a ladder or in the air."
  },
  {
   "address": 9845,
   "type": "line",
   "text": "Starts enemy X's animation for direction A: index enemy_anim_starts at the direction's low five bits plus the type's base (enemy_anim_bases)."
  },
  {
   "address": 9873,
   "type": "line",
   "text": "Enemies' top sprite shapes, in sequences ended by 0."
  },
  {
   "address": 9958,
   "type": "line",
   "text": "Enemies' bottom sprite shapes, in the same sequences."
  },
  {
   "address": 10043,
   "type": "line",
   "text": "Start of each animation in enemy_anim_tops, by direction (0-$1F) plus the type's base."
  },
  {
   "address": 10123,
   "type": "line",
   "text": "Each enemy type's base in enemy_anim_starts: $10 brown soldier, 0 white, $30 the two blue soldiers, $20 kicker, $40 bazooka man; 0 for the rest, which animate themselves."
  },
  {
   "address": 10133,
   "type": "line",
   "text": "Reads the screen character level with the hero's legs and the one his feet stand in: the row is his bottom Y less head_row_offset (normally $2A), in eights, from the screen at $4000 (row 23 on the bottom floor, where the mines lie); the column his X less $0A less the fine scroll, in eights. Keeps them in hero_char and hero_floor_char (the row below)."
  },
  {
   "address": 10137,
   "type": "line",
   "text": "The operand of SBC at $2798: $2A, or $1B while the hero looks for a ladder's top one row higher (player_ladder)."
  },
  {
   "address": 10193,
   "type": "line",
   "text": "For each live enemy not held: the screen character level with its legs (the row of its top Y less enemy_climb_y) into enemy_char and the one below, its floor, into enemy_floor_char, and their attributes (char_attrs, $C8 and up) into enemy_attr and enemy_floor_attr. Outside a fight, an enemy that walks off a floor (no floor character under its feet) and is not falling or jumping drops to the floor below if that holds fewer than 3 (enemy_fall_counts); otherwise its feet are given $FA as if on a floor, it turns round and steps back (enemy_walk)."
  },
  {
   "address": 10411,
   "type": "line",
   "text": "Per enemy, the offset from its top Y to the row enemies_chars reads: $15, or 6 while it climbs past the top of a ladder (enemy_climb)."
  },
  {
   "address": 10417,
   "type": "line",
   "text": "Works out the X units (X halved, 0-$AF) for twenty sprites from sprite 2, the first enemy's top, into enemy_xu and on, and the hero's from his bottom sprite into player_xu. There are only 19 sprites after the hero's two, so the twentieth entry ($0368) is worked out from bytes past the X lists (spr_xhi's and spr_colour's first) and nothing reads it."
  },
  {
   "address": 10441,
   "type": "line",
   "text": "Reads joystick port 2: joy_raw gets the five lines (1 up, 2 down, 4 left, 8 right, $10 fire, set when pressed). joy gets them too, but fire only on the frame it changes, so a held button stabs once. Up's own change (joy_up_last) clears jump_used, so a jump needs up pressed again. Falls into hero_attrs."
  },
  {
   "address": 10480,
   "type": "line",
   "text": "Looks up the attributes (char_attrs) of hero_char and hero_floor_char into hero_attr and hero_floor_attr (0 for characters under $C8)."
  },
  {
   "address": 10541,
   "type": "line",
   "text": "Attributes of characters $C8-$FF, the only ones figures stand on or climb: bit 0 a ladder up, bit 1 a ladder down, bits 2 and 3 a floor you walk along ($0C). Characters below $C8 are background."
  },
  {
   "address": 10597,
   "type": "line",
   "text": "The hero falls: the first frame starts it (falling set, fall_speed $80, walk speed 0); each frame he drops 4 lines (plus the carry of fall_speed into fall_frac) and moves on in his facing. Landing on a character from $C8 snaps his feet to the row (top Y less 4, rounded down to 8, plus 5), ends the fall and sets the walk speed back to $80 and jump_used."
  },
  {
   "address": 10686,
   "type": "line",
   "text": "The hero's movement, from the interrupt. Falling, he falls (player_fall). With the stick at rest he goes on with a jump, or falls if nothing is under his feet. Otherwise: jumping, he goes on with it; on nothing he falls; up, down or fire go to player_action; left or right walk, while the stab is not held."
  },
  {
   "address": 10738,
   "type": "line",
   "text": "Walks along a floor: right (when the floor character's attributes allow it) by 1 pixel and another whenever walk_speed carries into walk_frac (1.5 pixels a frame at $80), until scroll_limit, where the screen scrolls instead (scroll_right). Left the same, while his X is $20 or more, so a step can take him to $1F or $1E. Leaves the ladder and sets his facing."
  },
  {
   "address": 10758,
   "type": "line",
   "text": "The operand of CMP at $2A05, the hero's X past which the screen scrolls instead of him moving: $88, or $E0 at the stage's end (scroll_right), which lets him walk on for the fight and starts it (stage_end_check)."
  },
  {
   "address": 10849,
   "type": "line",
   "text": "Fire. Not on a ladder. Holds the stab for 5 frames (stab_hold). With down held on a floor: a crouching stab in his facing (pose +$12), or towards the stick's left or right. Otherwise a standing stab (+$10), towards the stick if it is pushed sideways on a floor. Each runs the knife's hit test (knife_hit_test) and sets the pose."
  },
  {
   "address": 10956,
   "type": "line",
   "text": "The stick at rest: a jump goes on."
  },
  {
   "address": 10962,
   "type": "line",
   "text": "Up, down or fire. Fire stabs. On a ladder, or with a ladder's attribute level with his legs or under his feet matching the stick, he climbs (player_ladder). Otherwise up, pressed again since the last jump (jump_used), starts a jump: the stick's direction is kept for it (jump_joy), and he rises along jump_arc from index $14 (30 lines up), with jump_base his bottom Y less the arc there."
  },
  {
   "address": 11071,
   "type": "line",
   "text": "One frame of a jump. A ladder level with his legs that matches the stick catches him (his feet snap to the row and he climbs). Otherwise his Y follows jump_arc from jump_base: the index counts down to 0 as he rises, then (jump_state $80) up again; past $14 the jump ends and he falls. Fire during the jump stabs; the takeoff's left or right moves him on (player_walk)."
  },
  {
   "address": 11176,
   "type": "line",
   "text": "Climbs. Up with a ladder up level with his legs (hero_attr): 2 lines up, on the ladder. Up without one: looks a row higher (head_row_offset $1B) for the ladder's top before giving up, and then up counts as a used jump. Down with a ladder down under his feet: 2 lines down."
  },
  {
   "address": 11296,
   "type": "line",
   "text": "The jump arc, 32 heights rising from 0 to $3C: 0, 0, 1, 1, 2, 3, 4, 5, 6, 7, then by 2 to $1B, then $1E, $21, $24, by 4 to $3C, and $3C three more times. The hero's jump uses entries 0-$14 (30 lines); the dogs, the enemies' jumps and the grenades fly along it too, the enemies' grenades as far as entry $1A."
  },
  {
   "address": 11328,
   "type": "line",
   "text": "Moves each live enemy. One held still (enemy_wait) runs only its behaviour (enemy_behaviour), and not even that for a paratrooper. One falling (enemy_falling) falls: its fall speed (enemy_fall_speed) rises by 8 a frame and adds into enemy_fall_frac, and it drops 4 lines and the carry, moving on in its facing; it lands on a character from $C8, its feet snapped to the row, and gets its type's speed back. Otherwise its behaviour runs, then: with no direction it continues a jump or falls if nothing is under it; with one, it walks (enemy_walk), climbs (enemy_climb), jumps (enemy_jump_start) or falls off the floor's end."
  },
  {
   "address": 11546,
   "type": "line",
   "text": "Walks enemy X in direction A: right (8) or left (4) by 1 pixel a frame and 1 more whenever its speed (enemy_speed) carries into its fraction, both sprites, and sets its facing. With neither bit it climbs (enemy_climb)."
  },
  {
   "address": 11649,
   "type": "line",
   "text": "An enemy with direction bit 0. On a ladder that matches its direction it climbs instead (but a kicker never does). Otherwise, unless climbing, it starts a jump (enemy_jumping 1): its animation for the jump (its facing plus 1), the arc index at $12 and the base from its bottom Y."
  },
  {
   "address": 11746,
   "type": "line",
   "text": "One frame of an enemy's jump along jump_arc, the index counting down then up; past $12 the jump ends, its direction becomes its facing and it falls until it lands. It moves on in its direction."
  },
  {
   "address": 11838,
   "type": "line",
   "text": "Runs enemy X's own behaviour by its type, through behaviour_table and the self-modified JMP at $2E50."
  },
  {
   "address": 11857,
   "type": "line",
   "text": "The operand of the JMP at $2E50, written by enemy_behaviour. As loaded it jumps to $FFFF."
  },
  {
   "address": 11859,
   "type": "line",
   "text": "Behaviour of each enemy type 0-9: 0 brown soldier, 1 white soldier and 3 blue soldier nothing of their own (RTS); 2 blue soldier who kneels and shoots (shooter); 4 green grenade thrower (thrower); 5 green kicker (kicker); 6 bazooka man lying down (shooter); 7 crawler (crawler); 8 officer, who throws grenades (shooter); 9 paratrooper (para_behaviour)."
  },
  {
   "address": 11879,
   "type": "line",
   "text": "Type 0 has no behaviour of its own."
  },
  {
   "address": 11880,
   "type": "line",
   "text": "Type 1 has none."
  },
  {
   "address": 11881,
   "type": "line",
   "text": "Type 2 shoots (shooter)."
  },
  {
   "address": 11884,
   "type": "line",
   "text": "Type 3 has none."
  },
  {
   "address": 11885,
   "type": "line",
   "text": "Type 9, the paratrooper: drifts down (para_update) and, once his parachute is open (para_phase 2), fires like a shooter."
  },
  {
   "address": 11896,
   "type": "line",
   "text": "Type 8 shoots (shooter)."
  },
  {
   "address": 11899,
   "type": "line",
   "text": "The enemies who fire: types 2, 6, 8 and the paratrooper (9). Not while dying. An enemy on the hero's floor, standing on a floor character and neither falling, climbing, waiting nor on a ladder (a paratrooper needs none of this) starts when its frame counter says so (enemy_fire_check): it stops for up to $3C frames (enemy_wait, enemy_timer), turns to face the hero and takes its firing pose (fire_pose_offsets, fire_pose_tops, fire_pose_bottoms); the paratrooper keeps his. On the fifth step (fire_step) it fires (enemy_fire)."
  },
  {
   "address": 11963,
   "type": "line",
   "text": "Carry set when enemy X's frame counter equals fire_frame_a, fire_frame_b or fire_frame_c: three chances in its 256 frames, all three $50 at the start of a game, so once."
  },
  {
   "address": 11967,
   "type": "line",
   "text": "The operand of CMP at $2EBE: the first frame count at which an enemy fires, $50."
  },
  {
   "address": 11971,
   "type": "line",
   "text": "The operand of CMP at $2EC2: $50 at a new game; stage_complete makes it $82 after the fourth stage, so on every later round enemies fire twice as often."
  },
  {
   "address": 11975,
   "type": "line",
   "text": "The operand of CMP at $2EC6: $50, the same as fire_frame_a. stage_complete would make it $FA from the third round, but loop_count never rises."
  },
  {
   "address": 11980,
   "type": "line",
   "text": "The firing sequence, by fire_step: step 1 stops and aims, steps 2-4 wait, step 5 fires."
  },
  {
   "address": 12077,
   "type": "line",
   "text": "Fires a projectile for the enemy whose slot is in x_save: takes a free enemy projectile slot (3-5), the projectile type the enemy's type gives (eshot_types) and launches it (eshot_launch), with the gunshot (sfx_gun) for the blue soldier and the bazooka's sound (sfx_bazooka) for the bazooka man. Then fire_step is cleared and the enemy stays still $0F frames (enemy_timer), the officer, outside the Bridge fight, with his top shape from officer_shapes; a paratrooper's counter is set to $48, so he fires again 8 frames on."
  },
  {
   "address": 12182,
   "type": "line",
   "text": "Type 4, the green soldier who throws grenades. When the hero is within $28 X units of him either side and his frame counter says so (enemy_fire_check), he starts to throw: he faces the hero (thrower_tops, thrower_throw_tops, thrower_bottoms, wave_sides) and after $10 frames (enemy_step) throws a grenade (projectile type 2) from a free slot, as eshot_launch."
  },
  {
   "address": 12303,
   "type": "line",
   "text": "Launches enemy projectile X, of type Y, from the enemy whose slot is in x_save: its direction is the enemy's facing (for type 5, the officer's grenade, the opposite way), colour shot_colours, Y the enemy's top plus $10, X units the enemy's plus $0C facing right or less 4 facing left, X in pixels twice that, shape by facing (shot_shapes_right, shot_shapes_left), speed eshot_speeds. Types 2 and 5 become grenades on jump_arc from index $19, type 2, with the bazooka's sound (sfx_bazooka); the thrower's step is cleared."
  },
  {
   "address": 12470,
   "type": "line",
   "text": "Speed in pixels a frame of enemy projectiles by type 0-6: 4, 4, 1, 6, 2, 2, 1."
  },
  {
   "address": 12477,
   "type": "line",
   "text": "The grenade thrower's top shape facing left and right: $14, $1D."
  },
  {
   "address": 12479,
   "type": "line",
   "text": "His bottom shape facing left and right: $6E, $9B."
  },
  {
   "address": 12481,
   "type": "line",
   "text": "His top shape while throwing, left and right: $2A, $79."
  },
  {
   "address": 12483,
   "type": "line",
   "text": "The two facings, also the sides an enemy comes from: 4 (facing left, from the right) and 8 (facing right, from the left)."
  },
  {
   "address": 12485,
   "type": "line",
   "text": "The projectile each enemy type fires: types 0-5 and 7 a bullet (0, used by the blue soldier), the bazooka man a shell (1), the officer a grenade (5, turned into 2), the paratrooper and helicopters a bomb (6)."
  },
  {
   "address": 12495,
   "type": "line",
   "text": "Index into fire_pose_tops and fire_pose_bottoms by enemy type: 0 for the bazooka man, 2 for the blue soldier, 4 for the officer."
  },
  {
   "address": 12505,
   "type": "line",
   "text": "Top shapes of the firing poses, facing left then right: bazooka man $B8, $B9; blue soldier $94, $95; officer $41, $3F."
  },
  {
   "address": 12511,
   "type": "line",
   "text": "Bottom shapes of the firing poses, in the same order: $BA, $BB; $96, $97; $31, $35."
  },
  {
   "address": 12517,
   "type": "line",
   "text": "The officer's top shape after he has thrown, facing left and right: $3F, $41."
  },
  {
   "address": 12519,
   "type": "line",
   "text": "Type 7, the soldier who crawls. Each frame his counter (crawl_count) goes up; on every other frame, for 16 frames out of 32, he crawls 1 pixel left (shapes $5F and $5E); otherwise, and while dying, he lies still with shapes $61 and $60."
  },
  {
   "address": 12595,
   "type": "line",
   "text": "The paratrooper. On the first call (para_phase 0) the counts of the top two floors are raised by 2 and the enemy count by 3 for him, the lanes are made not ready and the standing enemies turned left (enemies_turn_left). In phase 1 his slot waits at X $166, off the right edge, while 6 enemies are out; once fewer are, he is built from four slots (para_build), his frame counter set to $46, and phase 2 starts. In phase 2 he drifts: while drifting left his speed comes from his X units (para_speed_limits, para_speeds), slowing from 5 pixels a frame to 1 as he crosses the screen; under $3C units it becomes 2 to the right, and once back past $5A he drifts right by 1 and drops every frame (para_dropping). Otherwise all four slots drop a line every fourth frame. The bottom sprite of the third slot is kept hidden. When the man's top Y reaches $CE he lands (para_release)."
  },
  {
   "address": 12841,
   "type": "line",
   "text": "The paratrooper lands or is hit: lowers the counts raised for him, clears the three canopy slots (para_slots 1-3), and makes the man's slot (para_slots 0) a kicker (type 5) free to move. para_phase goes back to 0."
  },
  {
   "address": 12912,
   "type": "line",
   "text": "Builds the paratrooper from slot X and three free slots (enemy_free_slot), kept in para_slots, with his drift speed at 4."
  },
  {
   "address": 12959,
   "type": "line",
   "text": "Sets slot X as part Y (0 the man, 1-3 the canopy) of the paratrooper: tops at para_top_y, bottoms at para_bot_y, X at para_top_x and para_bot_x with the high byte 1 (off the right edge), shapes para_top_shapes and para_bot_shapes, colours para_top_colours and para_bot_colours; held (enemy_wait 1), live, type 9."
  },
  {
   "address": 13032,
   "type": "line",
   "text": "Top Y of the paratrooper's four parts at the start: the man $67, the canopy $5F, $4A, $4A."
  },
  {
   "address": 13036,
   "type": "line",
   "text": "Bottom Y of the four parts: the man $7C, the canopy $4A, $4A, $5F."
  },
  {
   "address": 13040,
   "type": "line",
   "text": "X low bytes of the four tops: $63, $5B, $67, $7F (high byte 1)."
  },
  {
   "address": 13044,
   "type": "line",
   "text": "X low bytes of the four bottoms: $63, $4F, $67, $73."
  },
  {
   "address": 13048,
   "type": "line",
   "text": "Shapes of the four tops: $84 (the man), $BF, $BD, $BE."
  },
  {
   "address": 13052,
   "type": "line",
   "text": "Shapes of the four bottoms: $86 (the man's legs), $BC, $BD, $C0."
  },
  {
   "address": 13056,
   "type": "line",
   "text": "Colours of the four tops: light green ($0D), brown ($09), orange ($08), brown."
  },
  {
   "address": 13060,
   "type": "line",
   "text": "Colours of the four bottoms: light green, brown, orange, brown."
  },
  {
   "address": 13064,
   "type": "line",
   "text": "X units at which the paratrooper's drift speed changes: $14, $3C, $50, $64, $80."
  },
  {
   "address": 13069,
   "type": "line",
   "text": "His drift speed, in pixels a frame to the left, by para_speed_limits: $FE (2 to the right), 1, 2, 3, 5."
  },
  {
   "address": 13074,
   "type": "line",
   "text": "The paratrooper's four slots: the man, then the three of the canopy."
  },
  {
   "address": 13078,
   "type": "line",
   "text": "Finds the highest slot holding type 9 and runs its behaviour (enemy_behaviour) once a frame: the paratrooper is moved once, not once for each of his four slots."
  },
  {
   "address": 13094,
   "type": "line",
   "text": "Gives every enemy that is not falling, climbing or jumping direction 4, walking left."
  },
  {
   "address": 13116,
   "type": "line",
   "text": "Type 5, the green kicker. Not while jumping or falling, nor as the Harbour's dog handler. When the hero is to his left, less than $1E X units away, on the same floor, and he does not face right: on the bottom floor he jump-kicks (direction bit 0); on a higher floor he jumps too, if the floors below have room, counted on them in case he lands there (enemy_fall_counts)."
  },
  {
   "address": 13219,
   "type": "line",
   "text": "Removes a live enemy, other than a paratrooper, that has gone off either edge. Off the left (X under $12) it removes each one and goes on; off the right ($150 and over) it removes the first it finds and ends the pass there (the BNE to enemy_remove, whose RTS returns for it), leaving any others for the next frame."
  },
  {
   "address": 13268,
   "type": "line",
   "text": "Frees enemy slot X: clears its Y, X, state, flags and X units; takes it off its floor's count (and the floor it was counted on for a ladder or a fall) and off enemy_count, and sets its head offset back to $15."
  },
  {
   "address": 13383,
   "type": "line",
   "text": "An enemy on a ladder, direction bit 0 up or bit 1 down. Up: 2 lines a frame while the attribute level with its legs (enemy_attr) has a ladder up; at the ladder's top it looks 6 lines above its top (enemy_climb_y) before stepping off. Down: 2 lines while the attribute under its feet has a ladder down. Off the ladder it turns towards the hero and stops climbing; a ladder_through count is settled from the floor it is on."
  },
  {
   "address": 13546,
   "type": "line",
   "text": "Y = the floor whose floor_y equals enemy X's top Y (from 2 down), or $FF."
  },
  {
   "address": 13559,
   "type": "line",
   "text": "The hero pushes the screen. At the stage's end column (stage_end_hi, stage_end_lo) the end-of-stage fight is set up instead (stage_end_reached). Otherwise the scroll moves by the hero's walking speed (1 pixel, and 2 when walk_speed carries): each pixel adds one to scroll_pending and takes one off the fine scroll (fine_scroll, 7 to 0); when it wraps to 7 the screen is due to shift a character (coarse_due) and idle_time goes down by one, not below 0."
  },
  {
   "address": 13620,
   "type": "line",
   "text": "Low bytes of each stage's end column, where the scroll stops and the fight begins: $019F, $03A8, $0660, $0918."
  },
  {
   "address": 13624,
   "type": "line",
   "text": "High bytes of the stage end columns: $01, $03, $06, $09."
  },
  {
   "address": 13628,
   "type": "line",
   "text": "boss_count at each stage's fight: $11 (18 soldiers after the lorry), $11 (18 dogs), 3 (helicopters), $11 (18 enemies from both sides)."
  },
  {
   "address": 13632,
   "type": "line",
   "text": "The scroll has reached the stage's end, once (boss_on still clear, scroll_limit not yet $E0). Fills the three floors' counts so no more enemies come ($06 and $E0, $E0), lets the hero walk on to X $E0 (scroll_limit), sets boss_count for the stage (stage_boss_counts), plays the alarm (tune $47) and clears boss_phase. stage_end_check starts the fight when the alarm ends."
  },
  {
   "address": 13679,
   "type": "line",
   "text": "When a shift is due (coarse_due), moves the playfield one character left: rows 8-23 of the screen at $4000, columns 1-39 to 0-38, and the colours of rows 12-23 with them (rows 8-11 are one colour). Then asks for a new column at the right edge (column_due)."
  },
  {
   "address": 13874,
   "type": "line",
   "text": "Writes the status line, \"LIVES 1   SCORE   HI  SCORE  STAGE 1\" (status_text), to the top row of the screen at $C400, which the interrupt shows above the playfield, in white; clears the row below up to column 27 in white and colours its last 12 columns black ($20 & 15; the BIT at $364B skips LDA #$01), colours that row's columns 1 to 10 brown ($09), where the weapon's rounds go (draw_ammo), and puts the stage's number (stage plus 1) at $C425."
  },
  {
   "address": 13934,
   "type": "line",
   "text": "The status line in screen codes (the top two bits dropped), ended by $FF: \"  LIVES 1   SCORE   HI  SCORE  STAGE 1 \"."
  },
  {
   "address": 13974,
   "type": "line",
   "text": "Runs three of the sound driver's six players (the interrupt runs the other three) and waits for the interrupt's frame flag (frame_flag), then takes it down."
  },
  {
   "address": 13992,
   "type": "line",
   "text": "The game's start after the start-up at $4000: blanks the screen, makes all sprites multicolour (X is $FF from the copy loop), sets the screen colours (vic_colours) and falls into new_game."
  },
  {
   "address": 14012,
   "type": "line",
   "text": "A new game: difficulty, map column, stage and loop_count 0, sprites off, the hero's two sprites dark grey, score, extra-life mark and points due cleared and the first extra life set at 30,000 (next_life $30 in its middle byte), fire_frame_b and fire_frame_c back to $50, the hero frozen, two lives. With the I/O in ($01 = $35) it resets the sprite order, undoes every block swap (swaps_undo), restores the animated characters (anim_chars_restore), clears the play variables (play_reset), sets the walking speed, silences the sound, turns the volume up and starts the interrupt. For the title the status band shows bank 1 (status_d018 $0F, status_dd00 $92) and the title's character set is swapped in (block_swap 8). Clears the screen and draws the logo (pictures 3 and 2), then title_wait shows the credits and waits for fire. Then the intro: the screen cleared and the captives' scene drawn (pictures 3 and 1), RESCUE THE CAPTIVES (text 1), the four captives at their posts (captives_place) and two guards walking in (guards_send), to tune 5; the captives struggle and the guards walk until the tune ends. Then the screen is blanked, play reset again, the status band set back to bank 3 ($12, $90), the title's characters swapped out, tune $0B started, and the first stage drawn (status_draw, stage_draw, hero_init) for the main loop."
  },
  {
   "address": 14255,
   "type": "line",
   "text": "Waits frame by frame (frame_wait) until the sound driver has finished every voice (tune_playing)."
  },
  {
   "address": 14264,
   "type": "line",
   "text": "The four captives tied to their posts, enemy slots 0-3: tops from captive_shapes, bottoms $B5, dark grey and brown, at Y $A0 and X from captive_x_lo and captive_x_hi."
  },
  {
   "address": 14318,
   "type": "line",
   "text": "The captives' top shapes in two frames of their struggle: $B4, $A7, $B4, $A7 and $A7, $B4, $A7, $B4 (captives_struggle starts at the first or fifth)."
  },
  {
   "address": 14326,
   "type": "line",
   "text": "X low bytes of the four captives: $3F, $87, $D7, $1F."
  },
  {
   "address": 14330,
   "type": "line",
   "text": "X high bytes of the four captives: 0, 0, 0, 1."
  },
  {
   "address": 14334,
   "type": "line",
   "text": "Makes lanes 2 and 5 ready (lane_ready + 2 and + 5) with type 3 (blue soldier) and brings their soldiers in with their tops at $C5 (spawn_on_floor's later part), one per free slot."
  },
  {
   "address": 14367,
   "type": "line",
   "text": "Every 16 frames (frame counter bit 4) swaps the captives' top shapes between the two frames of captive_shapes."
  },
  {
   "address": 14388,
   "type": "line",
   "text": "The intermission's hero walking along the map: he walks right one X unit a frame to $89. There he climbs the fence 3 lines a frame, in front of the background, until his feet (hero_bot_y) are above line $70; then he steps on to $8A behind the background (sprite priority set) and goes down the other side, one unit right and 3 lines down a frame, until his top reaches Y $C0, where he comes in front again and stays put. It sets the pose the intermission's loop gives player_anim_step (y_save): $0F as he climbs, 9 from the top on."
  },
  {
   "address": 14485,
   "type": "line",
   "text": "The hero's walk past the captives after the fourth stage: he walks right one unit a frame, and each captive he passes (captive_free_x) changes to shapes $8A and $8B, free; at X units $98 he stops and takes the same shapes himself."
  },
  {
   "address": 14537,
   "type": "line",
   "text": "X units at which the hero frees each captive: $1F, $43, $6B, $8F."
  },
  {
   "address": 14541,
   "type": "line",
   "text": "The intermission map's progress line along the bottom row ($4398): the stages done are filled (progress_done), and the one just done flashes, filling 0 to 3 of its three characters with $7A by the frame counter's bits 3 and 4, the rest $75."
  },
  {
   "address": 14579,
   "type": "line",
   "text": "Fills the progress line from column Y with $75 until X reaches 3; entered with X = 0 to fill a whole stage. Its first two bytes are the operand of the BIT at $38F2: map_progress's path loads $75 and skips them, progress_done enters here and loads $7A."
  },
  {
   "address": 14594,
   "type": "line",
   "text": "Column of each stage's three characters in the progress line: $0A, $16, $21."
  },
  {
   "address": 14597,
   "type": "line",
   "text": "Fills the progress line's characters of every stage before the current one with $7A."
  },
  {
   "address": 14620,
   "type": "line",
   "text": "Puts the hero at the start of play: pose and pose timer 3, facing right, scroll_limit $88, X $40, top Y $CD (the bottom floor), walk speed $80, and head_row_offset $2A."
  },
  {
   "address": 14663,
   "type": "line",
   "text": "The VIC colours at start-up, $D020-$D026: border and background black, background colours 1 and 2 grey ($0C) and light blue ($0E), background 3 black, sprite multicolours light red ($0A) and black."
  },
  {
   "address": 14670,
   "type": "line",
   "text": "The interrupt's second phase, at raster $F6, at the bottom of the screen. Runs irq_player, raises frame_flag and the six frame counters (frame_counters). Every 256 frames (idle_lo wraps) idle_time goes up (to $FF at most) and the difficulty creeps up: difficulty_frac gains the stage's rate (difficulty_rates) and, on a carry, difficulty goes up by one while under the stage's cap (difficulty_caps). Then sets the VIC for the status band at the top of the next frame: multicolour without scroll, D018 status_d018 and bank status_dd00 (in play the screen at $C400 and characters at $C800), and the next interrupt at raster $46."
  },
  {
   "address": 14734,
   "type": "line",
   "text": "The operand of LDA at $398D, the status band's VIC memory setting: $12 in play (screen at $C400, characters at $C800 in bank 3), $0F on the title and in an intermission (screen at $4000, characters at $7800 in bank 1)."
  },
  {
   "address": 14739,
   "type": "line",
   "text": "The operand of LDA at $3992, the status band's video bank for CIA 2 port A: $90 (bank 3, $C000-$FFFF) in play, $92 on the title and $96 in an intermission (both bank 1, $4000-$7FFF)."
  },
  {
   "address": 14749,
   "type": "line",
   "text": "The difficulty a stage cannot reach, by stage: 4, 7, 10, 15 (so it stops at 3, 6, 9 and 14)."
  },
  {
   "address": 14753,
   "type": "line",
   "text": "What each 256 frames add to difficulty_frac, by stage: $80, $AA, $D2, $FA (a step every 512 frames on the first stage, nearly every 256 on the last)."
  },
  {
   "address": 14757,
   "type": "line",
   "text": "The fraction that carries into difficulty."
  },
  {
   "address": 14758,
   "type": "line",
   "text": "Meant to count the rounds of the four stages; new_game clears it and stage_complete puts it back as it was (DEY then INY), so it is always 0."
  },
  {
   "address": 14759,
   "type": "line",
   "text": "The interrupt's third phase, at raster $46, where the playfield begins: the fine scroll (fine_scroll) into $D016, all eight sprites' Y to 0, the playfield's screen at $4000 and characters at $7800 (D018 $0F, bank 1 with $DD00 $92), and the next interrupt one line on, for the multiplexer."
  },
  {
   "address": 14810,
   "type": "line",
   "text": "Unreached: writes the stage number plus 1 as two decimal digits at $401B and $401C, on the playfield's top row; the status line shows the stage at $C425 instead."
  },
  {
   "address": 14841,
   "type": "line",
   "text": "Two zero bytes nothing reads."
  },
  {
   "address": 14843,
   "type": "line",
   "text": "When a new column is due (column_due), draws it at the right edge: the map column counter (map_col) goes up and its 16 characters and colours come from two tiles. The map at $C000 holds two bytes for every 8 columns (map_col shifted right twice, made even): the second byte is the upper tile, the first the lower. A tile is 64 characters at $A000 plus its number times 64, its colours $1000 higher, rows stored from the bottom up; map_col's three low bits pick its column. The characters go through the 16 row pointers (col_ptrs, $A0-$BF, rows 8-23 at column 39) and the colours through their twins at $C0-$DF. Then the mines (mines_place)."
  },
  {
   "address": 14975,
   "type": "line",
   "text": "Animates two of the stage's characters: copies 16 bytes into the character set at anim_targets for the stage, from anim_frames, the first or second frame by bit 2 of the frame counter (anim_frame_ends)."
  },
  {
   "address": 15009,
   "type": "line",
   "text": "The operand of the STA at $3AA0, the address of the two animated characters, written by chars_animate. As loaded it is $FFFF."
  },
  {
   "address": 15016,
   "type": "line",
   "text": "With a new column drawn, checks the stage's mines (stage_mine_first to stage_mine_end) for one at this map column (mine_col_hi, mine_col_lo) and puts its character, the stage's mine (mine_chars) plus 0 for a left half or 1 for a right half by the entry's lowest bit, at the bottom of the new column (row 23) in colour $0F."
  },
  {
   "address": 15060,
   "type": "line",
   "text": "First mine entry of each stage: 0, 6, $1A, $2E."
  },
  {
   "address": 15064,
   "type": "line",
   "text": "Entry after each stage's last mine: 6, $1A, $2E, $44. 68 entries, two to a mine, 34 mines."
  },
  {
   "address": 15068,
   "type": "line",
   "text": "High bytes of the map columns of the mines' halves."
  },
  {
   "address": 15136,
   "type": "line",
   "text": "Low bytes of the mines' columns; each mine's two halves are in consecutive columns."
  },
  {
   "address": 15204,
   "type": "line",
   "text": "Index of the last byte of each animation frame in anim_frames: $0F and $1F."
  },
  {
   "address": 15206,
   "type": "line",
   "text": "Where each stage's two animated characters are: $7A90, $79F0, $7A90, $7D00."
  },
  {
   "address": 15214,
   "type": "line",
   "text": "Left half of each stage's mine character (the right half is the next): $52, $3E, $52, $A0."
  },
  {
   "address": 15218,
   "type": "line",
   "text": "The character that replaces a destroyed mine, by stage: $50 on all four."
  },
  {
   "address": 15222,
   "type": "line",
   "text": "Two frames of 16 bytes (two characters) for the animated characters."
  },
  {
   "address": 15254,
   "type": "line",
   "text": "Three blocks of 16 bytes that anim_chars_restore copies back into the character sets ($79F0, $DA90 and $D640) at a new game, and the second of which prison_setup copies to $7A90 for the Prison Camp."
  },
  {
   "address": 15302,
   "type": "line",
   "text": "The hero's projectiles destroy mines. A projectile at Y $DE or lower reads the bottom row ($4398) under it; a mine there is turned into its crater (mine_destroy). A hand grenade does this once it has exploded (speed 0), for every mine from 6 columns left of it to 6 right."
  },
  {
   "address": 15396,
   "type": "line",
   "text": "Puts the stage's crater character (crater_chars) in the two columns of the mine at column Y of the bottom row, if Y is under $26."
  },
  {
   "address": 15421,
   "type": "line",
   "text": "Z set when character A is one of the stage's two mine characters (stage_mine_pair); for the right half Y is moved back to the left (not below 0)."
  },
  {
   "address": 15459,
   "type": "line",
   "text": "The hero steps on a mine when the character level with his legs (hero_char) is a mine's: the sound stops, he freezes, the explosion plays (sfx_explode), the music waits, tune $29 plays and, dropping the main loop's return address, the life is lost (lose_life)."
  },
  {
   "address": 15500,
   "type": "line",
   "text": "The two mine characters of each stage: $52, $53; $3E, $3F; $52, $53; $A0, $A1."
  },
  {
   "address": 15508,
   "type": "line",
   "text": "Copies the three blocks of anim_restore back to $79F0, $DA90 and $D640 (with the I/O switched out, $01 = $30), undoing the character animation."
  },
  {
   "address": 15543,
   "type": "line",
   "text": "For the Prison Camp, copies the second block of anim_restore to $7A90."
  },
  {
   "address": 15555,
   "type": "line",
   "text": "Draws a stage from its map column: sets the row pointers (row_ptrs_init) one column before the screen's left edge, freezes the hero, hides the sprites, reads his characters, clears the screen (screen_clear), draws the lives, score, hi score and status (lives_draw, score_draw, hi_score_draw, next_life_check), unblanks and then, one column a frame, draws 40 columns, moving the pointers right; each frame also fills rows 3-7 of that column with character $21 and the row under the playfield (row 24) with $FB, a floor the figures stand on. Colours rows 8-11 brown ($09), shows the sprites, and lets the hero move."
  },
  {
   "address": 15702,
   "type": "line",
   "text": "Clears rows 2-24 of the screen at $4000 to spaces ($20) with colour 9, the first row black."
  },
  {
   "address": 15748,
   "type": "line",
   "text": "The 16 screen row pointers and their 16 colour twins as stage_draw starts them: column 39 of rows 7-22, one character before rows 8-23 begin."
  },
  {
   "address": 15812,
   "type": "line",
   "text": "AND masks clearing bit 0-7 ($FE ... $7F), for the multiplexer's X high bits."
  },
  {
   "address": 15820,
   "type": "line",
   "text": "OR masks setting bit 0-7 ($01 ... $80)."
  },
  {
   "address": 15828,
   "type": "line",
   "text": "The interrupt's three phases, the address its JSR at $CEB4 takes: the multiplexer ($C474), irq_status ($394E) and irq_playfield ($39A7)."
  },
  {
   "address": 15834,
   "type": "line",
   "text": "26 bytes of $AA filler that nothing reads."
  },
  {
   "address": 15860,
   "type": "line",
   "text": "The four texts text_draw draws: 0 the title's credits ($CA00), 1 RESCUE THE CAPTIVES ($CAA0), 2 WELL DONE and TARGET OVERCOME ($CAB7), 3 the ending's CONGRATULATIONS, MISSION ACCOMPLISHED and NOW PROCEED TO NEXT CAMP ($FD90)."
  },
  {
   "address": 15868,
   "type": "line",
   "text": "A byte nothing reads ($CA)."
  },
  {
   "address": 15869,
   "type": "line",
   "text": "The depacker's exit, JMP $4000 to the start-up; the start-up clears its address, so it is JMP $0000 afterwards and never runs again."
  },
  {
   "address": 15870,
   "type": "line",
   "text": "The operand of the depacker's exit JMP at $3DFD: $4000 as loaded, set to $0000 by the start-up."
  },
  {
   "address": 15872,
   "type": "line",
   "text": "Starts tune Y: Y is the last of the tune's six bytes in tune_table (5, $0B, $11 and so on, six apart), and the six bytes, the three voices' pattern addresses, are copied to v1_pattern, v2_pattern and v3_pattern. Each voice is reset: transpose 0, no frequency effect or pulse sweep, pulse width $0800, duration 1 so the first note is read on the next frame, playing, free for the music, and its stack empty (index 7)."
  },
  {
   "address": 15922,
   "type": "line",
   "text": "Z clear while any voice's tune is playing or any voice is still sounding (its sound time not run out)."
  },
  {
   "address": 15938,
   "type": "line",
   "text": "Ends every voice's tune and sound (playing flags and sound times 0) and frees every voice for the music ($FF in v1_free, v2_free and v3_free)."
  },
  {
   "address": 15963,
   "type": "line",
   "text": "Stops all voices (voices_stop) and silences the SID: writes 8 and then 0 to each of its 21 voice registers (the test bit resets the oscillators)."
  },
  {
   "address": 15982,
   "type": "line",
   "text": "The 13 tunes, six bytes each (the three voices' start addresses): 0 the intro ($05), 1 the start of a game, after the intro ($0B), 2 the rescue after the fourth stage ($11), 3 and 4 the intermissions after the Missile Base and the Harbour ($17, $1D), 5 game over ($23), 6 a death ($29), 7 the helicopters ($2F), 8 the title ($35), 9 the intermission after the Bridge ($3B), 10 after a death or intermission ($41), 11 the alarm ($47), 12 the lorry ($4D)."
  },
  {
   "address": 16060,
   "type": "line",
   "text": "The flame thrower's sound: effects $EE6B on voice 2 and $EE8A on voice 3."
  },
  {
   "address": 16078,
   "type": "line",
   "text": "A dog's bark: effect $EE4C on the next voice in turn, the one bark_voices gives at bark_voice, which is then kept in bark_voice. The barks go round voices 3, 1 and 2."
  },
  {
   "address": 16094,
   "type": "line",
   "text": "The voice the last bark used, as an index into bark_voices, which gives the next (sfx_bark). As loaded 1, so the first bark is on voice 3 (index 2)."
  },
  {
   "address": 16095,
   "type": "line",
   "text": "Ends voice 1's tune (v1_playing), so that tune_playing and wait_tune no longer wait for it."
  },
  {
   "address": 16100,
   "type": "line",
   "text": "The jet: effects $EF25 on voice 2 and $EF06 on voice 1."
  },
  {
   "address": 16116,
   "type": "line",
   "text": "A knife or projectile hit: effect $EF44 on voice 2."
  },
  {
   "address": 16125,
   "type": "line",
   "text": "The blue soldier's shot: effects $EF82 on voice 2 and $EF63 on voice 1."
  },
  {
   "address": 16141,
   "type": "line",
   "text": "An explosion: effects $EEA9, $EEC8 and $EEE7 on voices 1, 2 and 3."
  },
  {
   "address": 16166,
   "type": "line",
   "text": "Taking a weapon: effects $EFA1, $EFC0 and $EFDF on voices 1, 2 and 3."
  },
  {
   "address": 16191,
   "type": "line",
   "text": "The bazooka and the grenades: effects $EFFE, $F01D and $F03C on voices 1, 2 and 3."
  },
  {
   "address": 16216,
   "type": "line",
   "text": "Starts voice 1's pulse sweep again from its start width (v1_pulse_start into v1_pulse) and falls into v1_pulse_again."
  },
  {
   "address": 16228,
   "type": "line",
   "text": "Reloads the two phase counters of voice 1's pulse sweep (v1_pulse_counts) from its phase lengths (v1_pulse_times)."
  },
  {
   "address": 16241,
   "type": "line",
   "text": "Starts voice 2's pulse sweep again from its start width and falls into v2_pulse_again."
  },
  {
   "address": 16253,
   "type": "line",
   "text": "Reloads the two phase counters of voice 2's pulse sweep from its phase lengths."
  },
  {
   "address": 16266,
   "type": "line",
   "text": "Starts voice 3's pulse sweep again from its start width and falls into v3_pulse_again."
  },
  {
   "address": 16278,
   "type": "line",
   "text": "Reloads the two phase counters of voice 3's pulse sweep from its phase lengths."
  },
  {
   "address": 16291,
   "type": "line",
   "text": "A whole sound, 29 bytes for command $D0 (index $1C), which sets every one of the voice's settings (the title, voices 1 and 3): an arpeggio on the note: offset $00, then its 4 offsets from the last down, round and round: $0C, $03, $07, $00; a pulse sweep from $0700 by +10 for 255 frames after 5 frames; pulse width $0700; pulse, attack/decay $05, sustain/release $B9, the gate on for 4 frames and then 50 frames to silence. Also A frequency effect, 14 bytes for command $D4 (the title, voice 2): an arpeggio on the note: offset $00, then its 4 offsets from the last down, round and round: $0C, $03, $07, $00."
  },
  {
   "address": 16315,
   "type": "line",
   "text": "An instrument, 5 bytes for command $D6 (the title, voice 2): pulse, attack/decay $05, sustain/release $B9, the gate on for 4 frames and then 50 frames to silence."
  },
  {
   "address": 16320,
   "type": "line",
   "text": "24 bytes no tune reads, between title_sound1 (whose instrument, title_instr1, ends at $3FBF) and title_effect1."
  },
  {
   "address": 16344,
   "type": "line",
   "text": "A frequency effect, 14 bytes for command $D4 (the title, voices 1 and 3): a slide of +0 for 10 frames, then -100 for 10 frames after 1 frame, then again from the start."
  },
  {
   "address": 16358,
   "type": "line",
   "text": "Frequency effect steps, 10 bytes for command $D2 (the title, voices 2 and 3): $00 $09 $05 $0C $01 $85 $00 $09, read as four 16-bit slide steps or as arpeggio offsets, and $05 $0C as the first two phase lengths."
  },
  {
   "address": 16368,
   "type": "line",
   "text": "One flag for each of the nine block swaps (block_swap), set while that swap is in effect: swaps_undo swaps back every one that is set."
  },
  {
   "address": 16377,
   "type": "line",
   "text": "Seven bytes after the swap flags that nothing reads."
  },
  {
   "address": 16384,
   "type": "line",
   "text": "The start-up the depacker jumps to, in what becomes the playfield's screen. Sets CIA 2's timer A to 2 cycles, turns all its interrupts off, starts the timer with the serial port as output, reads its interrupt register and writes the serial port's data register, so a byte is shifting out; copies cia2_serial_check's 21 bytes from $4030 to $0100; clears the depacker's jump address at $3DFE; and jumps to cold_start."
  },
  {
   "address": 16432,
   "type": "line",
   "text": "The 12 bytes of cia2_serial_check that the start-up copies to $0100; here they are only data."
  },
  {
   "address": 17408,
   "type": "line",
   "text": "Sprite shapes $10-$18, 64 bytes each (shape n at $4000 plus n times 64, in the video bank at $4000). $10-$13 the hero's legs walking left, under $14-$17, a soldier's top half walking left, which the hero and the white soldiers share (player_anim_tops, enemy_anim_tops; $14 is also the grenade thrower facing left); $18 the hero's top jumping left, over the legs $22."
  },
  {
   "address": 17984,
   "type": "line",
   "text": "Sprite shapes $19-$23: $19-$1C the hero's legs walking right under $1D-$20, the top walking right, shared with the white soldiers ($1D is also the grenade thrower facing right); $21 and $23 the hero's top and legs jumping right; $22 his legs jumping left."
  },
  {
   "address": 18688,
   "type": "line",
   "text": "Sprite shapes $24-$2F: $24-$27 the hero's two frames for a jump with no facing (tops $25, $27, legs $24, $26); $28 his legs on a ladder (with the top $A4); $29 his top stabbing left and $2B stabbing right, over walking legs; $2A the grenade thrower's top throwing left; $2C and $2D crouching right (legs, top) and $2E and $2F crouching left (top, legs). A crouching stab left is $2E over $C4, right $C3 over $2C."
  },
  {
   "address": 19456,
   "type": "line",
   "text": "Sprite shapes $30-$3F: $30-$33 a soldier's legs walking left and $34-$37 walking right, under the white and the blue soldiers' tops ($31 and $35 are also the officer's legs throwing); $38 and $39 the top and legs that type_top_shapes and type_bot_shapes give a white soldier (type 1) when he appears; $3A-$3D a soldier on a ladder (tops $3B and $3D, legs $3A and $3C); $3E a soldier's top jumping left; $3F the officer's top throwing."
  },
  {
   "address": 20480,
   "type": "line",
   "text": "Sprite shapes $40-$4F: $40 a soldier's top jumping right; $41 the officer's other throwing top (with $3F, one for each facing); $42-$45 legs walking left under $46-$49, the brown soldier's tops walking left; $4A-$4D legs walking right under $4E-$51, his tops walking right. The kicker and the bazooka man walk on the same legs."
  },
  {
   "address": 21504,
   "type": "line",
   "text": "Sprite shapes $50-$5F: $50 and $51 the last of the brown soldier's tops walking right; $52-$5D twelve shapes no shape table holds and no instruction loads, kneeling and leaping soldiers; $5E and $5F the crawler's legs and top, first frame."
  },
  {
   "address": 22528,
   "type": "line",
   "text": "Sprite shapes $60-$6F: $60 and $61 the crawler's second frame; $62-$64 an explosion's three frames (shot_explosion); $65 the bazooka shell facing left, also the jet's bomb, and $66 facing right; $67 a hand grenade, also the dropped weapon of types 0, 1 and 3; $68 a small ring no table selects; $69-$6B the flame thrower's three flames facing right; $6C and $6D the dropped bazooka and flame thrower (pickup_shapes); $6E the grenade thrower's legs facing left; $6F the lorry's front wheel, first frame."
  },
  {
   "address": 23552,
   "type": "line",
   "text": "Sprite shapes $70-$7F: $70 and $71 the lorry's front wheel's other frames and $72-$74 its rear wheel's three (lorry_wheels); $75-$78, $7A and $7B its cab and body (lorry_shapes); $79 the grenade thrower's top throwing right; $7C-$7F the green kicker's tops walking left."
  },
  {
   "address": 24576,
   "type": "line",
   "text": "Sprite shapes $80-$8F: $80-$83 the kicker's tops walking right; $84 over $86 and $85 over $87 his jump kick, left and right (the paratrooper hangs as $84 over $86); $88 and $89 the blue soldier's top walking left; $8A and $8B a freed captive, top and legs (rescue_walk); $8C and $8D the blue soldier's top walking right; $8E a bullet; $8F a shape no table selects."
  },
  {
   "address": 25600,
   "type": "line",
   "text": "Sprite shapes $90-$9F: $90 and $91 the blue soldier's top jumping left and right, over $92 and $93, the legs every soldier jumps with; $94-$97 the blue soldier kneeling to shoot (tops $94 and $95, legs $96 and $97, left and right: fire_pose_tops); $98-$9A the flame thrower's three flames facing left; $9B the grenade thrower's legs facing right; $9C and $9D the bazooka man's top walking left; $9E and $9F the hero's top walking left with the bazooka."
  },
  {
   "address": 26624,
   "type": "line",
   "text": "Sprite shapes $A0-$AF: $A0 and $A1 the hero's top walking right with the bazooka; $A2-$A4 the hero climbing (tops $A2 and $A4, legs $A3 and $28); $A5 and $A6 the bazooka man's top walking right; $A7 a captive's top struggling (with $B4); $A8 and $A9, $AA and $AB the hero's top walking left and right with the flame thrower; $AC-$AF the blue soldier and the bazooka man on a ladder (tops $AD and $AF, legs $AC and $AE)."
  },
  {
   "address": 27648,
   "type": "line",
   "text": "Sprite shapes $B0-$BF: $B0-$B3 an enemy dying, left and right (legs $B0 and $B2, tops $B1 and $B3: dying_shapes); $B4 a captive's other struggling top and $B5 the captives' legs; $B6 and $B7 the bazooka man lying down, legs and top; $B8-$BB the bazooka man firing, left and right (tops $B8 and $B9, legs $BA and $BB); $BC-$BF parts of the paratrooper's canopy (para_top_shapes, para_bot_shapes)."
  },
  {
   "address": 28672,
   "type": "line",
   "text": "Sprite shapes $C0-$CF: $C0 the canopy's last part; $C1 the jet climbing away and $C2 the jet; $C3 the hero's top in a crouching stab right and $C4 his legs in a crouching stab left; $C5-$CF parts of the helicopters (rotor_shapes; $CC is blank). Block swap 7 exchanges $C7-$D0 with the dog handler and dogs at $C580 for the Harbour's fight."
  },
  {
   "address": 29696,
   "type": "line",
   "text": "Sprite shapes $D0-$DF: more helicopter parts, $D3-$DD mostly flying left, and $DE and $DF the middle of a turning helicopter (heli_turn_shapes); $D2 is in no table."
  },
  {
   "address": 30720,
   "type": "line",
   "text": "The playfield's character set as loaded, the Missile Base's, characters $00-$3F, which its tiles draw with (a few, such as $05, $13 and $16, on none of its tiles). $3E and $3F at $79F0 are ground in the Missile Base and become the Harbour's mine there, which chars_animate makes blink; anim_chars_restore puts the ground back for a new game."
  },
  {
   "address": 31232,
   "type": "line",
   "text": "Text 0, the title's credits, in the character set's place for characters $40-$4E, which the Missile Base never draws: PRESS FIRE TO START, (C) KONAMI, PROGRAMMED BY D C, SOUND BY M G, GRAPHICS BY S W and (C) 1986 LICENCED BY IMAGINE 84, each after a marker byte and its screen address, ended by $FF at $7A76. The Harbour's block swap 0 moves it to $D000."
  },
  {
   "address": 31351,
   "type": "line",
   "text": "Nine zero bytes after the credits, to the end of character $4F; the Missile Base does not draw $4E or $4F."
  },
  {
   "address": 31360,
   "type": "line",
   "text": "Characters $50-$53: $50 a solid block of the first background colour, grey, used all over the scenery and as the crater a destroyed mine leaves (crater_chars names $50 on every stage, each in its own set); $51 blank; $52 and $53 the Missile Base's mine (stage_mine_pair), which chars_animate makes blink by copying anim_frames over it."
  },
  {
   "address": 31392,
   "type": "line",
   "text": "Texts 1 and 2, in the place of characters $54-$5B: RESCUE THE CAPTIVES at $4081, then WELL DONE at $40D6 and TARGET OVERCOME at $4122, each ended by $FF; after them RCOME and another $FF repeat the end of the last line, and four zeros."
  },
  {
   "address": 31456,
   "type": "line",
   "text": "Characters $5C-$7F of the Missile Base's set; its tiles draw with all of them but $5C."
  },
  {
   "address": 31744,
   "type": "line",
   "text": "Characters $80-$FF of the Missile Base's set, many of which its tiles draw with, and from $C8 the characters char_attrs gives ladder and floor flags; $FB is the floor stage_draw puts along row 24, under the playfield."
  },
  {
   "address": 32768,
   "type": "line",
   "text": "The Bridge's tiles $00-$0F, which block swap 1 exchanges with $A000: each tile 64 character codes, 8 columns by 8 rows from the bottom row up. Aeroplanes on the runway ($00, $01), brick walls ($02, $03, $07), the hangars' roofs and doors ($04-$0A), and roofs, walls and a ladder ($0B-$0F)."
  },
  {
   "address": 33792,
   "type": "line",
   "text": "The Bridge's tiles $10-$1F: walls and snowy roofs, white stacks ($16-$18), trees ($19, $1A) and cross-braced girders ($1C-$1E)."
  },
  {
   "address": 34816,
   "type": "line",
   "text": "The Bridge's tiles $20-$2F: girders and slopes, snowy ridges, stairs, the big cross-braced door ($2A) and a long gun ($2D-$2F)."
  },
  {
   "address": 35840,
   "type": "line",
   "text": "The Bridge's tiles $30-$36, to the swap's end at $8DBF: a rack ($30), a barracks front with windows ($31-$33), a snowy roof ($34), a wall ($35) and trees ($36)."
  },
  {
   "address": 36288,
   "type": "line",
   "text": "The Prison Camp's tiles $08-$10, which block swap 5 exchanges with $A200 after the Bridge's swap has put the Bridge's there: a snowy roof ($08), walls, a barred gate ($0B) and brick walls ($0D-$10)."
  },
  {
   "address": 36864,
   "type": "line",
   "text": "Colours of the Bridge's tiles $00-$0F, one for each character (block swap 2 exchanges them with $B000); a colour of 8 or more draws the character in multicolour."
  },
  {
   "address": 37888,
   "type": "line",
   "text": "Colours of the Bridge's tiles $10-$1F."
  },
  {
   "address": 38912,
   "type": "line",
   "text": "Colours of the Bridge's tiles $20-$2F."
  },
  {
   "address": 39936,
   "type": "line",
   "text": "Colours of the Bridge's tiles $30-$36, up to $9DBF."
  },
  {
   "address": 40384,
   "type": "line",
   "text": "Colours of the Prison Camp's tiles $08-$10, which block swap 6 exchanges with $B200."
  },
  {
   "address": 40960,
   "type": "line",
   "text": "The tiles as loaded, $00-$0F, the Harbour's: each 64 character codes, 8 columns by 8 rows from the bottom row up, which column_draw reads. The sea ($00, $01), warehouse fronts with ladders ($02-$05), cross-braced towers with green cargo ($06, $0E) and the harbour's grey sheds ($08-$0D)."
  },
  {
   "address": 41984,
   "type": "line",
   "text": "Tiles $10-$1F, the Missile Base's: brick embankments ($10, $11, $1B), the iron bridge's trusses with missiles under its deck ($12-$19), open sky ($1A) and the missile launcher lorry ($1C-$1F)."
  },
  {
   "address": 43008,
   "type": "line",
   "text": "Tiles $20-$2F: the Harbour's ruins ($20, $21) and sea ($22, $29-$2C), the Missile Base's snowy mountains ($23, $24) and launch site ($25-$27); $28 and $2D-$2F are on neither stage's map."
  },
  {
   "address": 44032,
   "type": "line",
   "text": "Tiles $30-$3F: $30 blank, the Harbour's tank ($31-$34), snow-covered trees ($35-$3B), mountains ($3C-$3E) and empty sky ($3F). The Bridge and the Prison Camp keep $37-$3F from here."
  },
  {
   "address": 45056,
   "type": "line",
   "text": "Colours of tiles $00-$0F, one for each of their characters, in the same order; column_draw copies them into colour RAM. 8 or more makes the character multicolour, with the background colours black, grey and light blue."
  },
  {
   "address": 46080,
   "type": "line",
   "text": "Colours of tiles $10-$1F."
  },
  {
   "address": 47104,
   "type": "line",
   "text": "Colours of tiles $20-$2F."
  },
  {
   "address": 48128,
   "type": "line",
   "text": "Colours of tiles $30-$3F."
  },
  {
   "address": 49152,
   "type": "line",
   "text": "The map of all four stages, one long strip: two bytes for every 8 columns, the lower tile then the upper. The Missile Base is columns $0001-$019F, the Harbour $01A0-$03A8, the Bridge $03B2-$0660 and the Prison Camp $0667-$0918; the columns between stages are never shown."
  },
  {
   "address": 49734,
   "type": "line",
   "text": "The Prison Camp's last tile column, map column $0918: tiles $C5 and $CE, which point into the I/O area and the music driver. column_draw draws it into screen column 39, which the 38-column screen hides. The bytes after it, to $C256, are never read."
  },
  {
   "address": 49751,
   "type": "line",
   "text": "Colours of the ammunition icons on the status line, two bytes a weapon, read at the weapon times 2 less 2: 0 0 (unused), $09 brown for the bazooka, $0D light green for the grenades, $0F light grey for the flame thrower."
  },
  {
   "address": 49759,
   "type": "line",
   "text": "Writes the number of lives at $C408 on the status line, as a digit, or a space when there are none. The space comes from the LDA #$20 hidden in the BIT at $C267, which the branch for 0 lands on."
  },
  {
   "address": 49774,
   "type": "line",
   "text": "Writes the score's six decimal digits at $C433 on the status line, highest first, and a 0 after them: every score is ten times what the game counts."
  },
  {
   "address": 49812,
   "type": "line",
   "text": "Writes the hi score's six digits and a 0 after them at $C43D on the status line."
  },
  {
   "address": 49850,
   "type": "line",
   "text": "Adds the points waiting in points_due to the score, three bytes in decimal mode, and clears points_due."
  },
  {
   "address": 49892,
   "type": "line",
   "text": "Compares the score with the hi score from the highest byte down and, when it is higher, copies it over."
  },
  {
   "address": 49908,
   "type": "line",
   "text": "The score beats the hi score: copy its three bytes."
  },
  {
   "address": 49920,
   "type": "line",
   "text": "The intro's scene for picture_draw: the screen at $4000 cleared and filled with the four posts and the ground, in run-length commands ($FB run, $FC address, $FE colour, $FF end)."
  },
  {
   "address": 50156,
   "type": "line",
   "text": "20 bytes nothing reads, after the end of picture_captives; from $C3F2 they decode as instructions that no path reaches."
  },
  {
   "address": 50176,
   "type": "line",
   "text": "The status band's screen, two rows at the top of the display: LIVES, SCORE, HI SCORE and STAGE on the first; on the second the ammunition icons at $C429, the score at $C433 and the hi score at $C43D."
  },
  {
   "address": 50244,
   "type": "line",
   "text": "Hands the virtual sprites to the multiplexer: copies their Y, X low and X high (21 each) into its own lists (mux_y, mux_xlo, mux_xhi), and the sorted order into mux_order too when the last sort changed it (order_changed). The multiplexer reads only these copies, so the main loop can move sprites while it runs."
  },
  {
   "address": 50272,
   "type": "line",
   "text": "The order is unchanged: copy only the positions."
  },
  {
   "address": 50292,
   "type": "line",
   "text": "The interrupt's first phase, which shares the 8 hardware sprites among the 21 virtual ones, run again and again down the playfield. Moves its raster threshold (mux_raster) 14 lines on and lets other interrupts in. Then, from mux_next back to the start of the order (sprites_sort leaves it in descending Y, so this goes from the top of the screen down), gives each sprite whose Y is under the threshold the next hardware sprite (mux_hw, 7 down to 0 and round again): its colour, its shape pointer (at $43F8 for the screen at $4000), its X and high bit and its Y. At the first sprite that is not yet due it sets the next raster interrupt 14 lines above it, or a few lines after the current one if that has passed, drops its return address and leaves the interrupt without moving on a phase, so that it runs again there."
  },
  {
   "address": 50300,
   "type": "line",
   "text": "The next virtual sprite in the order: place it, or wait for it."
  },
  {
   "address": 50376,
   "type": "line",
   "text": "7 bytes no path reaches: DEC mux_next, BMI, JMP $C47C, a copy of the end of the multiplexer's loop."
  },
  {
   "address": 50383,
   "type": "line",
   "text": "Every virtual sprite is placed: back to hardware sprite 7, mux_frames up by one, the next interrupt at raster $F6 (irq_status) and the threshold at $32. irq_start comes here too."
  },
  {
   "address": 50400,
   "type": "line",
   "text": "The next sprite is not due: the next interrupt goes 14 lines above it, or a few lines after the current one, and the interrupt ends at once (the two PLAs drop the return to irq)."
  },
  {
   "address": 50426,
   "type": "line",
   "text": "The title page: draws the credits (text 0), shows the screen, starts the title tune ($35) and waits a frame at a time until fire is pressed, then blanks the screen again."
  },
  {
   "address": 50455,
   "type": "line",
   "text": "Draws text A (0-3) from text_table. The text's high address byte gets the stage's page offset (text_pages), as stages 2 and 3 keep their texts 6 pages higher. With the I/O switched out ($01 = $30) and interrupts off, it copies characters (AND $3F turns the letters into screen codes) to the address the STA at $C53B holds, moving along; a byte of $80 or more other than $FF is followed by a new address (low, high) to write to, and $FF ends the text."
  },
  {
   "address": 50491,
   "type": "line",
   "text": "STA $FFFF,X: its address (text_dest, the operand at $C53C) is set by each address in the text."
  },
  {
   "address": 50492,
   "type": "line",
   "text": "The operand of the STA at $C53B, where text_draw writes the next character; each address in a text sets it."
  },
  {
   "address": 50498,
   "type": "line",
   "text": "A marker byte: $FF ends the text; any other takes the next two bytes as the new address."
  },
  {
   "address": 50526,
   "type": "line",
   "text": "Page offsets text_draw adds to a text's address, by stage: 0, 0, 6, 6, and 0 for the ending."
  },
  {
   "address": 50531,
   "type": "line",
   "text": "Counts the frames the multiplexer finishes; nothing reads it."
  },
  {
   "address": 50532,
   "type": "line",
   "text": "Puts the virtual sprites back in their own order (sprite_order 0-20), zeroes all sixteen hardware sprite position registers, turns interrupts off and hands the sprites to the multiplexer (sprites_to_irq) and sorts them (sprites_sort); it returns with interrupts still off."
  },
  {
   "address": 50557,
   "type": "line",
   "text": "Three bytes after sprite_order_reset that nothing reads: $CE, $00, $00."
  },
  {
   "address": 50560,
   "type": "line",
   "text": "Ten sprite shapes for the Harbour's fight, which block swap 7 exchanges with shapes $C7-$D0: $C7 and $C8 the dog handler (handler_shapes), $C9-$CB and $CC-$CE the dogs running each way ($CA and $CD also their leap), $CF and $D0 a knifed dog, thrown into the air (dogs_hit)."
  },
  {
   "address": 51200,
   "type": "line",
   "text": "The title's character set as loaded, which the status band shows in play and block swap 8 brings to $7800 for the title and the intermissions: $00 the copyright sign, $01-$1A the letters, $20 a space, $30-$39 the digits and $3A-$3E punctuation; $28-$2E and $40-$7F draw the intermission's scene."
  },
  {
   "address": 52224,
   "type": "line",
   "text": "Characters $80-$D0 of the title's set: the logo's pieces ($80-$91, $A0-$B0, $C0-$D0), more of the intermission's scene ($92-$98, $BB-$BF), the captives' posts ($99-$9F, $B1-$B5) and the ammunition icons $B6-$BA (ammo_icons). The swap ends at $CE87, where irq_start begins."
  },
  {
   "address": 52872,
   "type": "line",
   "text": "Points the interrupt vector at $FFFE to irq, lets only the VIC's raster interrupt in (CIA 1's timer interrupt is turned off and acknowledged), sets the phase to 0, the I/O in ($01 = $35), and goes to mux_done, which sets the first interrupt at raster $F6."
  },
  {
   "address": 52905,
   "type": "line",
   "text": "The raster interrupt. Saves the registers, acknowledges the VIC, clears decimal mode and calls the current phase (the JSR's operand at $CEB5): the multiplexer, irq_status or irq_playfield. Then moves irq_phase on, 0, 1, 2 and round, and puts the next phase's address from irq_phases into the JSR. The multiplexer can leave by irq_exit without coming back here, and then the phase stays."
  },
  {
   "address": 52916,
   "type": "line",
   "text": "The JSR to the current phase; its operand (irq_call, $CEB5) is rewritten after every phase."
  },
  {
   "address": 52917,
   "type": "line",
   "text": "The operand of the JSR at $CEB4, the current phase's address, rewritten by irq after every phase."
  },
  {
   "address": 52945,
   "type": "line",
   "text": "Restores X, Y and A and returns from the interrupt."
  },
  {
   "address": 52951,
   "type": "line",
   "text": "Sorts the 21 virtual sprites in descending order of Y, by insertion: sprite_order holds the sprite numbers, and each one with a higher Y than the one before it is moved back to its place. order_changed counts the moves, for sprites_to_irq. Then, with interrupts off, takes the scroll the main loop has used (scroll_step) from the scroll the interrupt has counted (scroll_pending)."
  },
  {
   "address": 53016,
   "type": "line",
   "text": "The scroll bookkeeping: scroll_pending less scroll_step, or 0 when they are equal."
  },
  {
   "address": 53042,
   "type": "line",
   "text": "Draws picture A (0-3) from picture_table onto the screen at $4000, starting at its top left. Bytes below $FB are characters, written in the current colour (pic_colour) with the colour into colour RAM at the same place. Bytes $FB-$FF are commands, run through picture_commands by the JSR at $CF64."
  },
  {
   "address": 53075,
   "type": "line",
   "text": "A command: puts the handler's address from picture_commands into the JSR at $CF64 (its operand at $CF65) and calls it."
  },
  {
   "address": 53092,
   "type": "line",
   "text": "The JSR to the command's handler; its operand (pic_call) is written from picture_commands."
  },
  {
   "address": 53093,
   "type": "line",
   "text": "The operand of the JSR at $CF64."
  },
  {
   "address": 53098,
   "type": "line",
   "text": "Reads the picture's next byte and moves the pointer on."
  },
  {
   "address": 53109,
   "type": "line",
   "text": "Writes the character in A at the screen pointer, the colour pic_colour at the same place in colour RAM ($D800 plus the pointer's low 10 bits), and moves the pointer on."
  },
  {
   "address": 53141,
   "type": "line",
   "text": "The handlers of picture_draw's commands $FB-$FF: $CF9F run, $CFB3 address, $CFC8 skip, $CFBE colour, $CFC5 end."
  },
  {
   "address": 53151,
   "type": "line",
   "text": "Command $FB: a count and a character follow; writes the character that many times (a count of 0 writes it 256 times)."
  },
  {
   "address": 53171,
   "type": "line",
   "text": "Command $FC: the next two bytes are the screen address to write at (low, high)."
  },
  {
   "address": 53182,
   "type": "line",
   "text": "Command $FE: the next byte is the colour for the characters after it."
  },
  {
   "address": 53189,
   "type": "line",
   "text": "Command $FF: drops the return address of the command's JSR and returns from picture_draw itself."
  },
  {
   "address": 53192,
   "type": "line",
   "text": "Command $FD: skips 20 bytes of the picture. No picture uses it."
  },
  {
   "address": 53206,
   "type": "line",
   "text": "The character of the run being drawn."
  },
  {
   "address": 53207,
   "type": "line",
   "text": "The colour picture_draw writes into colour RAM."
  },
  {
   "address": 53208,
   "type": "line",
   "text": "Keeps the screen pointer's high byte while pic_put writes the colour."
  },
  {
   "address": 53209,
   "type": "line",
   "text": "The four pictures: 0 the intermission's map ($0434), 1 the intro's captives (picture_captives, $C300), 2 the title's logo ($03C0), 3 a blank screen ($06CE)."
  },
  {
   "address": 53217,
   "type": "line",
   "text": "Puts every swapped block back: for each of the nine swaps, 8 down to 0, whose flag in swap_flags is set, swaps it again (block_swap). Keeps the interrupt flag as it was, as block_swap turns interrupts on."
  },
  {
   "address": 53237,
   "type": "line",
   "text": "The ammunition icons on the status line, two characters each, read at the weapon times 2 less 2: $B6 $B7 (unused), $B6 $B7 the bazooka, $BA and a space a grenade, $B8 $B9 the flame thrower, then $C2 $60 that nothing reads."
  },
  {
   "address": 53247,
   "type": "line",
   "text": "A byte nothing reads."
  },
  {
   "address": 53248,
   "type": "line",
   "text": "Under the I/O area: the Harbour's characters $40-$C7, which block swap 0 exchanges with $7A00 for the Harbour, its sea, ships, warehouses and cranes. Once swapped this holds the texts, which is why text_draw reads them 6 pages higher on stages 2 and 3."
  },
  {
   "address": 54272,
   "type": "line",
   "text": "The rest of the Harbour's characters past the first 1024 bytes: $C0-$C7, the last 64 bytes block swap 0 moves (to $7E00-$7E3F)."
  },
  {
   "address": 54336,
   "type": "line",
   "text": "Under the I/O area: the Prison Camp's characters $60-$B9, which block swap 4 exchanges with $7B00 after the Bridge's set is in, for the camp's walls and buildings. $D640 holds its mine, $A0 and $A1, whose original anim_chars_restore puts back."
  },
  {
   "address": 55056,
   "type": "line",
   "text": "240 bytes nothing reads: characters laid out like $E2-$FF of the Bridge's set at $DF10, and the same but for three of them ($EE, $EF and $F8)."
  },
  {
   "address": 55296,
   "type": "line",
   "text": "Under the I/O area and colour RAM: the first half of the Bridge's character set, characters $00-$7F; the rest, $80-$FF, is at $DC00 (chars_bridge_b). Block swap 3 exchanges all 2 KB, $D800-$DFFF, with $7800. The code that scrolls colour RAM reads and writes these addresses with the I/O switched in, so it never sees this RAM. $DA90 holds the Bridge's mine, $52 and $53."
  },
  {
   "address": 56320,
   "type": "line",
   "text": "The Bridge's characters $80-$FF, under the I/O area ($DC00-$DFFF: the two CIAs and the I/O 1 and 2 areas), and from $C8 its ladders and floors."
  },
  {
   "address": 57344,
   "type": "line",
   "text": "Starts the sound effect at A (low), Y (high) on voice 1: sfx_start with X = 0."
  },
  {
   "address": 57346,
   "type": "line",
   "text": "Starts the 31-byte sound effect at A (low), Y (high) on voice X (0-2 for SID voices 1-3). The music may no longer write the voice (its free flag, v1_free plus X, cleared) and its control register is set to $02, the gate off. Bytes $16-$1A go to the voice's pulse width, waveform, attack/decay and sustain/release registers, through the STA at $E01E whose operand ($E01F) is set to the voice's register offset from sfx_reg_offsets; bytes $1D-$1E are the frequency. Then the voice's live effect (its block, ending at the offset in sfx_block_ends) takes bytes 0-$17, the frequency effect and pulse sweep settings with the start width, and the waveform byte, gate time, sound time and frequency. Last it starts the pulse sweep and the frequency slide that the bytes ask for."
  },
  {
   "address": 57374,
   "type": "line",
   "text": "STA $D400+r,X for the effect's register bytes, X 4 down to 0, where r, the operand's low byte (sfx_reg), is the voice's pulse width register ($02, $09 or $10, from sfx_reg_offsets); the snapshot holds $09."
  },
  {
   "address": 57375,
   "type": "line",
   "text": "The operand's low byte of the STA at $E01E, set by sfx_start to the voice's register offset."
  },
  {
   "address": 57446,
   "type": "line",
   "text": "After the copy X is the voice's block offset less 23: 0 for voice 1, $27 for voice 2, $4E for voice 3."
  },
  {
   "address": 57449,
   "type": "line",
   "text": "Voice 1: starts the pulse sweep if the effect has one, then the frequency slide; the slide is left alone only when there is a sweep and no frequency effect."
  },
  {
   "address": 57462,
   "type": "line",
   "text": "Starts voice 1's frequency slide from the note's frequency (v1_note_freq into v1_freq) and falls into v1_slide_again."
  },
  {
   "address": 57474,
   "type": "line",
   "text": "Reloads the four phase counters of voice 1's slide (v1_slide_counts) from its phase lengths (v1_slide_times), so the four phases run again from the frequency it has reached."
  },
  {
   "address": 57499,
   "type": "line",
   "text": "Voice 2 or 3: voice 3 is the block offset $4E."
  },
  {
   "address": 57503,
   "type": "line",
   "text": "Voice 2: start the pulse sweep if the effect has one, then the frequency slide if it has one."
  },
  {
   "address": 57516,
   "type": "line",
   "text": "Starts voice 2's frequency slide from the note's frequency (v2_note_freq into v2_freq) and falls into v2_slide_again."
  },
  {
   "address": 57528,
   "type": "line",
   "text": "Reloads the four phase counters of voice 2's slide from its phase lengths."
  },
  {
   "address": 57553,
   "type": "line",
   "text": "Voice 3: start the pulse sweep if the effect has one, then the frequency slide if it has one."
  },
  {
   "address": 57566,
   "type": "line",
   "text": "Starts voice 3's frequency slide from the note's frequency (v3_note_freq into v3_freq) and falls into v3_slide_again."
  },
  {
   "address": 57578,
   "type": "line",
   "text": "Reloads the four phase counters of voice 3's slide from its phase lengths."
  },
  {
   "address": 57603,
   "type": "line",
   "text": "Voice 1's note reader, run once a frame by frame_wait. While its tune plays (v1_playing) it counts down the note's duration (v1_duration); when that runs out it reads the pattern's next events, commands first, up to the next note or rest."
  },
  {
   "address": 57612,
   "type": "line",
   "text": "Moves the pattern pointer (v1_pattern) on by 3 bytes, the length of most commands, or from $E10E by the count in A, and reads the next event."
  },
  {
   "address": 57623,
   "type": "line",
   "text": "Reads the next byte of voice 1's pattern. $C0 or more is a command: its handler's address comes from v1_commands and is written into the JMP at $E12C, which goes there. Below $C0 it is a note."
  },
  {
   "address": 57644,
   "type": "line",
   "text": "Voice 1's JMP to the command's handler: its operand is rewritten for each command. Each handler goes on to the next event itself, except a return ($C0) with nothing to return to, which ends the voice (v1_playing) and returns."
  },
  {
   "address": 57645,
   "type": "line",
   "text": "The operand of voice 1's JMP at $E12C, the handler of the command being read, from v1_commands."
  },
  {
   "address": 57647,
   "type": "line",
   "text": "Voice 1: a rest, or a note while a sound effect has the voice; only the duration is read."
  },
  {
   "address": 57650,
   "type": "line",
   "text": "A note: bytes $00-$5E are notes, $60-$BE the same notes with their duration given in frames; $5F and $BF are rests. The note plus the transpose (v1_transpose) indexes note_freq_lo and note_freq_hi. Unless a sound effect has the voice (v1_free is 0) it plays it: the test bit restarts the oscillator, then the instrument's sustain/release, attack/decay and waveform byte (with its bit 3 cleared, the gate in bit 0), the pulse width (v1_pulse_width) and the frequency, kept in v1_note_freq."
  },
  {
   "address": 57727,
   "type": "line",
   "text": "Voice 1: with a pulse sweep set (v1_pulse_fx_set) its settings are copied into the live ones: the start width, the two steps, the delay and the two phase lengths."
  },
  {
   "address": 57744,
   "type": "line",
   "text": "Voice 1's copy stores the start width's low byte back where it read it ($EC1E) rather than in v1_pulse_start, as voices 2 and 3 do at $E53D and $E8E9: a sweep that starts again (v1_pulse_restart) takes its low byte from whatever was last left there."
  },
  {
   "address": 57801,
   "type": "line",
   "text": "Voice 1: with a frequency effect set (v1_freq_fx_set) its 13 settings are copied into the live ones (v1_slide_steps on), and the effect starts: an arpeggio (bit 3) takes the note as its base, a slide starts from the note's frequency (v1_slide_start)."
  },
  {
   "address": 57844,
   "type": "line",
   "text": "Voice 1: the instrument's gate time and sound time go live (v1_gate_time, v1_sound_time)."
  },
  {
   "address": 57856,
   "type": "line",
   "text": "Reads the duration after a note or rest: for a note byte below $60 it is an index into durations (3 frames a step), for one of $60 or more a number of frames. Puts it in v1_duration and moves the pointer past the two bytes."
  },
  {
   "address": 57884,
   "type": "line",
   "text": "Voice 1's command $C0, the end of a pattern: returns to the place the last call saved on voice 1's stack (v1_stack_lo, v1_stack_hi). At the outermost level, the stack index back at 8, the voice's tune ends (v1_playing cleared)."
  },
  {
   "address": 57908,
   "type": "line",
   "text": "Voice 1's command $CC, count: starts a repeat. Saves the place after the command and the count on the stack (v1_stack_count) and goes on."
  },
  {
   "address": 57938,
   "type": "line",
   "text": "Voice 1's command $CE: counts the innermost repeat down. Until it reaches 0 the pattern goes back to the place the repeat saved; then the repeat is dropped from the stack and the pattern goes on."
  },
  {
   "address": 57965,
   "type": "line",
   "text": "Voice 1's command $D6, address: copies the five-byte instrument at the address into v1_instrument: waveform, attack/decay, sustain/release, gate time and sound time."
  },
  {
   "address": 57988,
   "type": "line",
   "text": "Voice 1's command $D4, address: copies 14 bytes from the address into the frequency effect's settings (v1_fx, $EC08-$EC15), its flags included."
  },
  {
   "address": 58017,
   "type": "line",
   "text": "Voice 1's command $D2, address: copies 10 bytes from the address into the frequency effect's settings: the four steps and the first two phase lengths."
  },
  {
   "address": 58046,
   "type": "line",
   "text": "Voice 1's command $D0, last index, last offset, address: copies bytes from the address into the settings (v1_fx onwards), ending at v1_fx plus the index and taking the offset plus one bytes. Moves on 5 bytes."
  },
  {
   "address": 58081,
   "type": "line",
   "text": "Voice 1's command $C8, transpose, address: sets the transpose and goes on at the address."
  },
  {
   "address": 58100,
   "type": "line",
   "text": "Voice 1's command $C4, address: goes on at the address."
  },
  {
   "address": 58114,
   "type": "line",
   "text": "Voice 1's command $C6, transpose, address: sets the transpose and calls the pattern at the address, saving the place after the command on the stack for the $C0 that ends it."
  },
  {
   "address": 58124,
   "type": "line",
   "text": "Voice 1's calls: saves the return place (the pointer plus A) on the stack and jumps to the address at offset X of the command."
  },
  {
   "address": 58156,
   "type": "line",
   "text": "Voice 1's command $C2, address: calls the pattern at the address, saving the place after the command on the stack."
  },
  {
   "address": 58162,
   "type": "line",
   "text": "Voice 1's command $DA, transpose: sets the number of semitones added to every note after it."
  },
  {
   "address": 58172,
   "type": "line",
   "text": "Voice 1's command $CA, index, value: sets one byte of the settings, v1_fx plus the index, for the notes after it."
  },
  {
   "address": 58185,
   "type": "line",
   "text": "Voice 1's command $D8, index, value: sets one byte of the live effect, v1_slide_steps plus the index, which changes the note already sounding."
  },
  {
   "address": 58199,
   "type": "line",
   "text": "Voice 1's effects, run every frame by irq_player. Nothing while its sound time (v1_sound_time) is 0. First the gate: with bit 3 of the waveform byte (v1_control) the gate goes off when the note has fewer frames left than v1_gate_time, otherwise after v1_gate_time frames; then v1_sound_time counts down and at 0 the voice's seven SID registers are cleared and the voice is free for the music again (v1_free). Then the pulse sweep and the frequency effect."
  },
  {
   "address": 58233,
   "type": "line",
   "text": "Voice 1: the gate time counts down to the gate going off; then the sound time counts down to silence."
  },
  {
   "address": 58267,
   "type": "line",
   "text": "Voice 1's pulse sweep, when one is on (v1_pulse_fx): after its delay (v1_pulse_delay) the width (v1_pulse) moves by the first step for v1_pulse_counts frames and by the second for the next count. At the end, flag bit 7 starts it again from the start width (v1_pulse_restart) and bit 0 runs the two phases again from where it is (v1_pulse_again); with neither it stays. Writes the width to the SID."
  },
  {
   "address": 58365,
   "type": "line",
   "text": "Voice 1's frequency effect, when one is on (v1_freq_fx). Bit 3 is an arpeggio; otherwise a slide in four phases after a delay (v1_slide_delay); with bit 1 the fourth phase's step is applied during the delay too."
  },
  {
   "address": 58397,
   "type": "line",
   "text": "Voice 1's arpeggio: each frame the next offset from v1_slide_steps, counting down from the length in v1_slide_times+3 and round again, is added to the base note (v1_slide_times+2) and that note's frequency is written to the SID."
  },
  {
   "address": 58430,
   "type": "line",
   "text": "Voice 1's slide: the frequency (v1_freq) moves by each of the four steps (v1_slide_steps) for its phase's count of frames (v1_slide_counts), in turn, and is written to the SID."
  },
  {
   "address": 58523,
   "type": "line",
   "text": "Voice 1, all four phases of the slide done: flag bit 7 starts the slide again from the note's frequency (v1_slide_start) and bit 0 runs the phases again from where it is (v1_slide_again), a vibrato; with neither the frequency stays."
  },
  {
   "address": 58544,
   "type": "line",
   "text": "Voice 2's note reader, run once a frame by frame_wait. While its tune plays (v2_playing) it counts down the note's duration (v2_duration); when that runs out it reads the pattern's next events, commands first, up to the next note or rest."
  },
  {
   "address": 58553,
   "type": "line",
   "text": "Moves the pattern pointer (v2_pattern) on by 3 bytes, the length of most commands, or from $E4BB by the count in A, and reads the next event."
  },
  {
   "address": 58564,
   "type": "line",
   "text": "Reads the next byte of voice 2's pattern. $C0 or more is a command: its handler's address comes from v2_commands and is written into the JMP at $E4D9, which goes there. Below $C0 it is a note."
  },
  {
   "address": 58585,
   "type": "line",
   "text": "Voice 2's JMP to the command's handler: its operand is rewritten for each command. Each handler goes on to the next event itself, except a return ($C0) with nothing to return to, which ends the voice (v2_playing) and returns."
  },
  {
   "address": 58586,
   "type": "line",
   "text": "The operand of voice 2's JMP at $E4D9, the handler of the command being read, from v2_commands."
  },
  {
   "address": 58588,
   "type": "line",
   "text": "Voice 2: a rest, or a note while a sound effect has the voice; only the duration is read."
  },
  {
   "address": 58591,
   "type": "line",
   "text": "A note: bytes $00-$5E are notes, $60-$BE the same notes with their duration given in frames; $5F and $BF are rests. The note plus the transpose (v2_transpose) indexes note_freq_lo and note_freq_hi. Unless a sound effect has the voice (v2_free is 0) it plays it: the test bit restarts the oscillator, then the instrument's sustain/release, attack/decay and waveform byte (with its bit 3 cleared, the gate in bit 0), the pulse width (v2_pulse_width) and the frequency, kept in v2_note_freq."
  },
  {
   "address": 58668,
   "type": "line",
   "text": "Voice 2: with a pulse sweep set (v2_pulse_fx_set) its settings are copied into the live ones: the start width, the two steps, the delay and the two phase lengths."
  },
  {
   "address": 58742,
   "type": "line",
   "text": "Voice 2: with a frequency effect set (v2_freq_fx_set) its 13 settings are copied into the live ones (v2_slide_steps on), and the effect starts: an arpeggio (bit 3) takes the note as its base, a slide starts from the note's frequency (v2_slide_start)."
  },
  {
   "address": 58785,
   "type": "line",
   "text": "Voice 2: the instrument's gate time and sound time go live (v2_gate_time, v2_sound_time)."
  },
  {
   "address": 58797,
   "type": "line",
   "text": "Reads the duration after a note or rest: for a note byte below $60 it is an index into durations (3 frames a step), for one of $60 or more a number of frames. Puts it in v2_duration and moves the pointer past the two bytes."
  },
  {
   "address": 58825,
   "type": "line",
   "text": "Voice 2's command $C0, the end of a pattern: returns to the place the last call saved on voice 2's stack (v2_stack_lo, v2_stack_hi). At the outermost level, the stack index back at 8, the voice's tune ends (v2_playing cleared)."
  },
  {
   "address": 58849,
   "type": "line",
   "text": "Voice 2's command $CC, count: starts a repeat. Saves the place after the command and the count on the stack (v2_stack_count) and goes on."
  },
  {
   "address": 58879,
   "type": "line",
   "text": "Voice 2's command $CE: counts the innermost repeat down. Until it reaches 0 the pattern goes back to the place the repeat saved; then the repeat is dropped from the stack and the pattern goes on."
  },
  {
   "address": 58906,
   "type": "line",
   "text": "Voice 2's command $D6, address: copies the five-byte instrument at the address into v2_instrument: waveform, attack/decay, sustain/release, gate time and sound time."
  },
  {
   "address": 58929,
   "type": "line",
   "text": "Voice 2's command $D4, address: copies 14 bytes from the address into the frequency effect's settings (v2_fx, $EC3D-$EC4A), its flags included."
  },
  {
   "address": 58958,
   "type": "line",
   "text": "Voice 2's command $D2, address: copies 10 bytes from the address into the frequency effect's settings: the four steps and the first two phase lengths."
  },
  {
   "address": 58987,
   "type": "line",
   "text": "Voice 2's command $D0, last index, last offset, address: copies bytes from the address into the settings (v2_fx onwards), ending at v2_fx plus the index and taking the offset plus one bytes. Moves on 5 bytes."
  },
  {
   "address": 59022,
   "type": "line",
   "text": "Voice 2's command $C8, transpose, address: sets the transpose and goes on at the address."
  },
  {
   "address": 59041,
   "type": "line",
   "text": "Voice 2's command $C4, address: goes on at the address."
  },
  {
   "address": 59055,
   "type": "line",
   "text": "Voice 2's command $C6, transpose, address: sets the transpose and calls the pattern at the address, saving the place after the command on the stack for the $C0 that ends it."
  },
  {
   "address": 59065,
   "type": "line",
   "text": "Voice 2's calls: saves the return place (the pointer plus A) on the stack and jumps to the address at offset X of the command."
  },
  {
   "address": 59097,
   "type": "line",
   "text": "Voice 2's command $C2, address: calls the pattern at the address, saving the place after the command on the stack."
  },
  {
   "address": 59103,
   "type": "line",
   "text": "Voice 2's command $DA, transpose: sets the number of semitones added to every note after it."
  },
  {
   "address": 59113,
   "type": "line",
   "text": "Voice 2's command $CA, index, value: sets one byte of the settings, v2_fx plus the index, for the notes after it."
  },
  {
   "address": 59126,
   "type": "line",
   "text": "Voice 2's command $D8, index, value: sets one byte of the live effect, v2_slide_steps plus the index, which changes the note already sounding."
  },
  {
   "address": 59140,
   "type": "line",
   "text": "Voice 2's effects, run every frame by irq_player. Nothing while its sound time (v2_sound_time) is 0. First the gate: with bit 3 of the waveform byte (v2_control) the gate goes off when the note has fewer frames left than v2_gate_time, otherwise after v2_gate_time frames; then v2_sound_time counts down and at 0 the voice's seven SID registers are cleared and the voice is free for the music again (v2_free). Then the pulse sweep and the frequency effect."
  },
  {
   "address": 59174,
   "type": "line",
   "text": "Voice 2: the gate time counts down to the gate going off; then the sound time counts down to silence."
  },
  {
   "address": 59208,
   "type": "line",
   "text": "Voice 2's pulse sweep, when one is on (v2_pulse_fx): after its delay (v2_pulse_delay) the width (v2_pulse) moves by the first step for v2_pulse_counts frames and by the second for the next count. At the end, flag bit 7 starts it again from the start width (v2_pulse_restart) and bit 0 runs the two phases again from where it is (v2_pulse_again); with neither it stays. Writes the width to the SID."
  },
  {
   "address": 59306,
   "type": "line",
   "text": "Voice 2's frequency effect, when one is on (v2_freq_fx). Bit 3 is an arpeggio; otherwise a slide in four phases after a delay (v2_slide_delay); with bit 1 the fourth phase's step is applied during the delay too."
  },
  {
   "address": 59338,
   "type": "line",
   "text": "Voice 2's arpeggio: each frame the next offset from v2_slide_steps, counting down from the length in v2_slide_times+3 and round again, is added to the base note (v2_slide_times+2) and that note's frequency is written to the SID."
  },
  {
   "address": 59371,
   "type": "line",
   "text": "Voice 2's slide: the frequency (v2_freq) moves by each of the four steps (v2_slide_steps) for its phase's count of frames (v2_slide_counts), in turn, and is written to the SID."
  },
  {
   "address": 59463,
   "type": "line",
   "text": "Voice 2, all four phases of the slide done: flag bit 7 starts the slide again from the note's frequency (v2_slide_start) and bit 0 runs the phases again from where it is (v2_slide_again), a vibrato; with neither the frequency stays."
  },
  {
   "address": 59484,
   "type": "line",
   "text": "Voice 3's note reader, run once a frame by frame_wait. While its tune plays (v3_playing) it counts down the note's duration (v3_duration); when that runs out it reads the pattern's next events, commands first, up to the next note or rest."
  },
  {
   "address": 59493,
   "type": "line",
   "text": "Moves the pattern pointer (v3_pattern) on by 3 bytes, the length of most commands, or from $E867 by the count in A, and reads the next event."
  },
  {
   "address": 59504,
   "type": "line",
   "text": "Reads the next byte of voice 3's pattern. $C0 or more is a command: its handler's address comes from v3_commands and is written into the JMP at $E885, which goes there. Below $C0 it is a note."
  },
  {
   "address": 59525,
   "type": "line",
   "text": "Voice 3's JMP to the command's handler: its operand is rewritten for each command. Each handler goes on to the next event itself, except a return ($C0) with nothing to return to, which ends the voice (v3_playing) and returns."
  },
  {
   "address": 59526,
   "type": "line",
   "text": "The operand of voice 3's JMP at $E885, the handler of the command being read, from v3_commands."
  },
  {
   "address": 59528,
   "type": "line",
   "text": "Voice 3: a rest, or a note while a sound effect has the voice; only the duration is read."
  },
  {
   "address": 59531,
   "type": "line",
   "text": "A note: bytes $00-$5E are notes, $60-$BE the same notes with their duration given in frames; $5F and $BF are rests. The note plus the transpose (v3_transpose) indexes note_freq_lo and note_freq_hi. Unless a sound effect has the voice (v3_free is 0) it plays it: the test bit restarts the oscillator, then the instrument's sustain/release, attack/decay and waveform byte (with its bit 3 cleared, the gate in bit 0), the pulse width (v3_pulse_width) and the frequency, kept in v3_note_freq."
  },
  {
   "address": 59608,
   "type": "line",
   "text": "Voice 3: with a pulse sweep set (v3_pulse_fx_set) its settings are copied into the live ones: the start width, the two steps, the delay and the two phase lengths."
  },
  {
   "address": 59682,
   "type": "line",
   "text": "Voice 3: with a frequency effect set (v3_freq_fx_set) its 13 settings are copied into the live ones (v3_slide_steps on), and the effect starts: an arpeggio (bit 3) takes the note as its base, a slide starts from the note's frequency (v3_slide_start)."
  },
  {
   "address": 59725,
   "type": "line",
   "text": "Voice 3: the instrument's gate time and sound time go live (v3_gate_time, v3_sound_time)."
  },
  {
   "address": 59737,
   "type": "line",
   "text": "Reads the duration after a note or rest: for a note byte below $60 it is an index into durations (3 frames a step), for one of $60 or more a number of frames. Puts it in v3_duration and moves the pointer past the two bytes."
  },
  {
   "address": 59765,
   "type": "line",
   "text": "Voice 3's command $C0, the end of a pattern: returns to the place the last call saved on voice 3's stack (v3_stack_lo, v3_stack_hi). At the outermost level, the stack index back at 8, the voice's tune ends (v3_playing cleared)."
  },
  {
   "address": 59789,
   "type": "line",
   "text": "Voice 3's command $CC, count: starts a repeat. Saves the place after the command and the count on the stack (v3_stack_count) and goes on."
  },
  {
   "address": 59819,
   "type": "line",
   "text": "Voice 3's command $CE: counts the innermost repeat down. Until it reaches 0 the pattern goes back to the place the repeat saved; then the repeat is dropped from the stack and the pattern goes on."
  },
  {
   "address": 59846,
   "type": "line",
   "text": "Voice 3's command $D6, address: copies the five-byte instrument at the address into v3_instrument: waveform, attack/decay, sustain/release, gate time and sound time."
  },
  {
   "address": 59869,
   "type": "line",
   "text": "Voice 3's command $D4, address: copies 14 bytes from the address into the frequency effect's settings (v3_fx, $EC72-$EC7F), its flags included."
  },
  {
   "address": 59898,
   "type": "line",
   "text": "Voice 3's command $D2, address: copies 10 bytes from the address into the frequency effect's settings: the four steps and the first two phase lengths."
  },
  {
   "address": 59927,
   "type": "line",
   "text": "Voice 3's command $D0, last index, last offset, address: copies bytes from the address into the settings (v3_fx onwards), ending at v3_fx plus the index and taking the offset plus one bytes. Moves on 5 bytes."
  },
  {
   "address": 59962,
   "type": "line",
   "text": "Voice 3's command $C8, transpose, address: sets the transpose and goes on at the address."
  },
  {
   "address": 59981,
   "type": "line",
   "text": "Voice 3's command $C4, address: goes on at the address."
  },
  {
   "address": 59995,
   "type": "line",
   "text": "Voice 3's command $C6, transpose, address: sets the transpose and calls the pattern at the address, saving the place after the command on the stack for the $C0 that ends it."
  },
  {
   "address": 60005,
   "type": "line",
   "text": "Voice 3's calls: saves the return place (the pointer plus A) on the stack and jumps to the address at offset X of the command."
  },
  {
   "address": 60037,
   "type": "line",
   "text": "Voice 3's command $C2, address: calls the pattern at the address, saving the place after the command on the stack."
  },
  {
   "address": 60043,
   "type": "line",
   "text": "Voice 3's command $DA, transpose: sets the number of semitones added to every note after it."
  },
  {
   "address": 60053,
   "type": "line",
   "text": "Voice 3's command $CA, index, value: sets one byte of the settings, v3_fx plus the index, for the notes after it."
  },
  {
   "address": 60066,
   "type": "line",
   "text": "Voice 3's command $D8, index, value: sets one byte of the live effect, v3_slide_steps plus the index, which changes the note already sounding."
  },
  {
   "address": 60080,
   "type": "line",
   "text": "Voice 3's effects, run every frame by irq_player. Nothing while its sound time (v3_sound_time) is 0. First the gate: with bit 3 of the waveform byte (v3_control) the gate goes off when the note has fewer frames left than v3_gate_time, otherwise after v3_gate_time frames; then v3_sound_time counts down and at 0 the voice's seven SID registers are cleared and the voice is free for the music again (v3_free). Then the pulse sweep and the frequency effect."
  },
  {
   "address": 60114,
   "type": "line",
   "text": "Voice 3: the gate time counts down to the gate going off; then the sound time counts down to silence."
  },
  {
   "address": 60148,
   "type": "line",
   "text": "Voice 3's pulse sweep, when one is on (v3_pulse_fx): after its delay (v3_pulse_delay) the width (v3_pulse) moves by the first step for v3_pulse_counts frames and by the second for the next count. At the end, flag bit 7 starts it again from the start width (v3_pulse_restart) and bit 0 runs the two phases again from where it is (v3_pulse_again); with neither it stays. Writes the width to the SID."
  },
  {
   "address": 60246,
   "type": "line",
   "text": "Voice 3's frequency effect, when one is on (v3_freq_fx). Bit 3 is an arpeggio; otherwise a slide in four phases after a delay (v3_slide_delay); with bit 1 the fourth phase's step is applied during the delay too."
  },
  {
   "address": 60278,
   "type": "line",
   "text": "Voice 3's arpeggio: each frame the next offset from v3_slide_steps, counting down from the length in v3_slide_times+3 and round again, is added to the base note (v3_slide_times+2) and that note's frequency is written to the SID."
  },
  {
   "address": 60311,
   "type": "line",
   "text": "Voice 3's slide: the frequency (v3_freq) moves by each of the four steps (v3_slide_steps) for its phase's count of frames (v3_slide_counts), in turn, and is written to the SID."
  },
  {
   "address": 60403,
   "type": "line",
   "text": "Voice 3, all four phases of the slide done: flag bit 7 starts the slide again from the note's frequency (v3_slide_start) and bit 0 runs the phases again from where it is (v3_slide_again), a vibrato; with neither the frequency stays."
  },
  {
   "address": 60424,
   "type": "line",
   "text": "Voice 1's frequency effect as the tune sets it, 13 bytes, which each note copies into its live effect (v1_slide_steps on): four 16-bit steps, four phase lengths and a delay. Commands $D4, $D2, $D0 and $CA write them."
  },
  {
   "address": 60437,
   "type": "line",
   "text": "Voice 1's frequency effect flags as set, which each note copies to v1_freq_fx: 0 none; bit 3 an arpeggio, else a slide; bit 1 the fourth step during the delay; bit 7 the slide starts again from the note, bit 0 its phases run again."
  },
  {
   "address": 60438,
   "type": "line",
   "text": "Voice 1's pulse sweep phase lengths as set, two bytes, for v1_pulse_times."
  },
  {
   "address": 60440,
   "type": "line",
   "text": "Voice 1's pulse sweep delay as set, for v1_pulse_delay."
  },
  {
   "address": 60441,
   "type": "line",
   "text": "Voice 1's pulse sweep flags as set, for v1_pulse_fx: 0 no sweep; bit 7 the sweep starts again from the start width, bit 0 its two phases run again."
  },
  {
   "address": 60442,
   "type": "line",
   "text": "Voice 1's two pulse sweep steps as set, 16 bits each, for v1_pulse_steps."
  },
  {
   "address": 60446,
   "type": "line",
   "text": "Voice 1's pulse width, low byte first: written to the SID with each note and the start of its pulse sweep; tune_start sets $0800."
  },
  {
   "address": 60448,
   "type": "line",
   "text": "Voice 1's instrument, five bytes (command $D6): the waveform byte (bit 0 the gate, bit 3 the gate rule), attack/decay, sustain/release, the gate time and the sound time in frames."
  },
  {
   "address": 60453,
   "type": "line",
   "text": "Voice 1's stack of return places, low bytes, eight deep, filled from the top (index 7) down by calls ($C2, $C6) and repeats ($CC)."
  },
  {
   "address": 60461,
   "type": "line",
   "text": "Voice 1's stack of return places, high bytes."
  },
  {
   "address": 60469,
   "type": "line",
   "text": "Voice 1's repeat counts, one for each stack level, counted down by command $CE."
  },
  {
   "address": 60477,
   "type": "line",
   "text": "Voice 2's frequency effect as the tune sets it, 13 bytes, which each note copies into its live effect (v2_slide_steps on): four 16-bit steps, four phase lengths and a delay. Commands $D4, $D2, $D0 and $CA write them."
  },
  {
   "address": 60490,
   "type": "line",
   "text": "Voice 2's frequency effect flags as set, which each note copies to v2_freq_fx: 0 none; bit 3 an arpeggio, else a slide; bit 1 the fourth step during the delay; bit 7 the slide starts again from the note, bit 0 its phases run again."
  },
  {
   "address": 60491,
   "type": "line",
   "text": "Voice 2's pulse sweep phase lengths as set, two bytes, for v2_pulse_times."
  },
  {
   "address": 60493,
   "type": "line",
   "text": "Voice 2's pulse sweep delay as set, for v2_pulse_delay."
  },
  {
   "address": 60494,
   "type": "line",
   "text": "Voice 2's pulse sweep flags as set, for v2_pulse_fx: 0 no sweep; bit 7 the sweep starts again from the start width, bit 0 its two phases run again."
  },
  {
   "address": 60495,
   "type": "line",
   "text": "Voice 2's two pulse sweep steps as set, 16 bits each, for v2_pulse_steps."
  },
  {
   "address": 60499,
   "type": "line",
   "text": "Voice 2's pulse width, low byte first: written to the SID with each note and the start of its pulse sweep; tune_start sets $0800."
  },
  {
   "address": 60501,
   "type": "line",
   "text": "Voice 2's instrument, five bytes (command $D6): the waveform byte (bit 0 the gate, bit 3 the gate rule), attack/decay, sustain/release, the gate time and the sound time in frames."
  },
  {
   "address": 60506,
   "type": "line",
   "text": "Voice 2's stack of return places, low bytes, eight deep, filled from the top (index 7) down by calls ($C2, $C6) and repeats ($CC)."
  },
  {
   "address": 60514,
   "type": "line",
   "text": "Voice 2's stack of return places, high bytes."
  },
  {
   "address": 60522,
   "type": "line",
   "text": "Voice 2's repeat counts, one for each stack level, counted down by command $CE."
  },
  {
   "address": 60530,
   "type": "line",
   "text": "Voice 3's frequency effect as the tune sets it, 13 bytes, which each note copies into its live effect (v3_slide_steps on): four 16-bit steps, four phase lengths and a delay. Commands $D4, $D2, $D0 and $CA write them."
  },
  {
   "address": 60543,
   "type": "line",
   "text": "Voice 3's frequency effect flags as set, which each note copies to v3_freq_fx: 0 none; bit 3 an arpeggio, else a slide; bit 1 the fourth step during the delay; bit 7 the slide starts again from the note, bit 0 its phases run again."
  },
  {
   "address": 60544,
   "type": "line",
   "text": "Voice 3's pulse sweep phase lengths as set, two bytes, for v3_pulse_times."
  },
  {
   "address": 60546,
   "type": "line",
   "text": "Voice 3's pulse sweep delay as set, for v3_pulse_delay."
  },
  {
   "address": 60547,
   "type": "line",
   "text": "Voice 3's pulse sweep flags as set, for v3_pulse_fx: 0 no sweep; bit 7 the sweep starts again from the start width, bit 0 its two phases run again."
  },
  {
   "address": 60548,
   "type": "line",
   "text": "Voice 3's two pulse sweep steps as set, 16 bits each, for v3_pulse_steps."
  },
  {
   "address": 60552,
   "type": "line",
   "text": "Voice 3's pulse width, low byte first: written to the SID with each note and the start of its pulse sweep; tune_start sets $0800."
  },
  {
   "address": 60554,
   "type": "line",
   "text": "Voice 3's instrument, five bytes (command $D6): the waveform byte (bit 0 the gate, bit 3 the gate rule), attack/decay, sustain/release, the gate time and the sound time in frames."
  },
  {
   "address": 60559,
   "type": "line",
   "text": "Voice 3's stack of return places, low bytes, eight deep, filled from the top (index 7) down by calls ($C2, $C6) and repeats ($CC)."
  },
  {
   "address": 60567,
   "type": "line",
   "text": "Voice 3's stack of return places, high bytes."
  },
  {
   "address": 60575,
   "type": "line",
   "text": "Voice 3's repeat counts, one for each stack level. Its eighth, the top level's, is the first byte of durations at $ECA6: a repeat in a tune's own pattern for voice 3, which several tunes have, writes its count there, and as no pattern uses duration 0 the clash never shows."
  },
  {
   "address": 60582,
   "type": "line",
   "text": "Note lengths in frames, read at the duration byte after a note below $60: 3 frames a step, $03 to $30 for 1 to 16 steps. Its first byte is also voice 3's top repeat count (v3_stack_count). Voice 3's command $D0 with index $44 writes 16 bytes past its own settings straight into steps 1-16, which is how a tune sets its tempo (tempo_4, tempo_6, tempo_3)."
  },
  {
   "address": 60599,
   "type": "line",
   "text": "Voice 1's live frequency effect, from v1_fx: the four 16-bit steps of its slide, or the note offsets of its arpeggio. Command $D8 changes a byte of it for the note that is sounding."
  },
  {
   "address": 60607,
   "type": "line",
   "text": "Voice 1's four slide phase lengths in frames; for an arpeggio the third byte is the base note and the fourth the number of offsets less one."
  },
  {
   "address": 60611,
   "type": "line",
   "text": "Voice 1's slide delay, counted down before the first phase; for an arpeggio, the place in the offsets."
  },
  {
   "address": 60612,
   "type": "line",
   "text": "Voice 1's live frequency effect flags: copied from v1_freq_fx_set at $E1CC, written by sfx_start from byte $0D of a sound effect, and cleared by v3_crash; 0 when the voice has none."
  },
  {
   "address": 60613,
   "type": "line",
   "text": "Voice 1's two pulse sweep phase lengths, reloaded into v1_pulse_counts each time the sweep runs again."
  },
  {
   "address": 60615,
   "type": "line",
   "text": "Voice 1's pulse sweep delay, counted down before the sweep starts."
  },
  {
   "address": 60616,
   "type": "line",
   "text": "Voice 1's live pulse sweep flags; 0 when the voice has no sweep."
  },
  {
   "address": 60617,
   "type": "line",
   "text": "Voice 1's two pulse sweep steps, 16 bits each, added to the width in the first and second phases."
  },
  {
   "address": 60621,
   "type": "line",
   "text": "Voice 1's pulse sweep start width, where a sweep that starts again begins."
  },
  {
   "address": 60623,
   "type": "line",
   "text": "Voice 1's note frequency, low byte first, where a slide starts."
  },
  {
   "address": 60625,
   "type": "line",
   "text": "Voice 1's waveform byte as written to the SID's control register, kept so the gate can be cleared later."
  },
  {
   "address": 60626,
   "type": "line",
   "text": "Voice 1's gate time in frames, counted down to the gate going off."
  },
  {
   "address": 60627,
   "type": "line",
   "text": "Voice 1's sound time in frames, counted down after the gate; at 0 the voice is silenced and freed."
  },
  {
   "address": 60628,
   "type": "line",
   "text": "Voice 1's frequency as the slide leaves it, low byte first."
  },
  {
   "address": 60630,
   "type": "line",
   "text": "Voice 1's four slide phase counters, counted down in turn."
  },
  {
   "address": 60634,
   "type": "line",
   "text": "Voice 1's pulse width as the sweep leaves it, low byte first."
  },
  {
   "address": 60636,
   "type": "line",
   "text": "Voice 1's two pulse sweep phase counters."
  },
  {
   "address": 60638,
   "type": "line",
   "text": "Voice 2's live frequency effect, from v2_fx: the four 16-bit steps of its slide, or the note offsets of its arpeggio. Command $D8 changes a byte of it for the note that is sounding."
  },
  {
   "address": 60646,
   "type": "line",
   "text": "Voice 2's four slide phase lengths in frames; for an arpeggio the third byte is the base note and the fourth the number of offsets less one."
  },
  {
   "address": 60650,
   "type": "line",
   "text": "Voice 2's slide delay, counted down before the first phase; for an arpeggio, the place in the offsets."
  },
  {
   "address": 60651,
   "type": "line",
   "text": "Voice 2's live frequency effect flags: copied from v2_freq_fx_set at $E579, written by sfx_start from byte $0D of a sound effect, and cleared by v3_crash; 0 when the voice has none."
  },
  {
   "address": 60652,
   "type": "line",
   "text": "Voice 2's two pulse sweep phase lengths, reloaded into v2_pulse_counts each time the sweep runs again."
  },
  {
   "address": 60654,
   "type": "line",
   "text": "Voice 2's pulse sweep delay, counted down before the sweep starts."
  },
  {
   "address": 60655,
   "type": "line",
   "text": "Voice 2's live pulse sweep flags; 0 when the voice has no sweep."
  },
  {
   "address": 60656,
   "type": "line",
   "text": "Voice 2's two pulse sweep steps, 16 bits each, added to the width in the first and second phases."
  },
  {
   "address": 60660,
   "type": "line",
   "text": "Voice 2's pulse sweep start width, where a sweep that starts again begins."
  },
  {
   "address": 60662,
   "type": "line",
   "text": "Voice 2's note frequency, low byte first, where a slide starts."
  },
  {
   "address": 60664,
   "type": "line",
   "text": "Voice 2's waveform byte as written to the SID's control register, kept so the gate can be cleared later."
  },
  {
   "address": 60665,
   "type": "line",
   "text": "Voice 2's gate time in frames, counted down to the gate going off."
  },
  {
   "address": 60666,
   "type": "line",
   "text": "Voice 2's sound time in frames, counted down after the gate; at 0 the voice is silenced and freed."
  },
  {
   "address": 60667,
   "type": "line",
   "text": "Voice 2's frequency as the slide leaves it, low byte first."
  },
  {
   "address": 60669,
   "type": "line",
   "text": "Voice 2's four slide phase counters, counted down in turn."
  },
  {
   "address": 60673,
   "type": "line",
   "text": "Voice 2's pulse width as the sweep leaves it, low byte first."
  },
  {
   "address": 60675,
   "type": "line",
   "text": "Voice 2's two pulse sweep phase counters."
  },
  {
   "address": 60677,
   "type": "line",
   "text": "Voice 3's live frequency effect, from v3_fx: the four 16-bit steps of its slide, or the note offsets of its arpeggio. Command $D8 changes a byte of it for the note that is sounding."
  },
  {
   "address": 60685,
   "type": "line",
   "text": "Voice 3's four slide phase lengths in frames; for an arpeggio the third byte is the base note and the fourth the number of offsets less one."
  },
  {
   "address": 60689,
   "type": "line",
   "text": "Voice 3's slide delay, counted down before the first phase; for an arpeggio, the place in the offsets."
  },
  {
   "address": 60690,
   "type": "line",
   "text": "Voice 3's live frequency effect flags: copied from v3_freq_fx_set at $E925, written by sfx_start from byte $0D of a sound effect, and cleared by v3_crash; 0 when the voice has none."
  },
  {
   "address": 60691,
   "type": "line",
   "text": "Voice 3's two pulse sweep phase lengths, reloaded into v3_pulse_counts each time the sweep runs again."
  },
  {
   "address": 60693,
   "type": "line",
   "text": "Voice 3's pulse sweep delay, counted down before the sweep starts."
  },
  {
   "address": 60694,
   "type": "line",
   "text": "Voice 3's live pulse sweep flags; 0 when the voice has no sweep."
  },
  {
   "address": 60695,
   "type": "line",
   "text": "Voice 3's two pulse sweep steps, 16 bits each, added to the width in the first and second phases."
  },
  {
   "address": 60699,
   "type": "line",
   "text": "Voice 3's pulse sweep start width, where a sweep that starts again begins."
  },
  {
   "address": 60701,
   "type": "line",
   "text": "Voice 3's note frequency, low byte first, where a slide starts."
  },
  {
   "address": 60703,
   "type": "line",
   "text": "Voice 3's waveform byte as written to the SID's control register, kept so the gate can be cleared later."
  },
  {
   "address": 60704,
   "type": "line",
   "text": "Voice 3's gate time in frames, counted down to the gate going off."
  },
  {
   "address": 60705,
   "type": "line",
   "text": "Voice 3's sound time in frames, counted down after the gate; at 0 the voice is silenced and freed."
  },
  {
   "address": 60706,
   "type": "line",
   "text": "Voice 3's frequency as the slide leaves it, low byte first."
  },
  {
   "address": 60708,
   "type": "line",
   "text": "Voice 3's four slide phase counters, counted down in turn."
  },
  {
   "address": 60712,
   "type": "line",
   "text": "Voice 3's pulse width as the sweep leaves it, low byte first."
  },
  {
   "address": 60714,
   "type": "line",
   "text": "Voice 3's two pulse sweep phase counters."
  },
  {
   "address": 60716,
   "type": "line",
   "text": "For sfx_start, by voice: the offset of the last byte of the voice's live effect it copies, $17, $3E and $65 (the voice's block of 39 bytes from v1_slide_steps, plus $17)."
  },
  {
   "address": 60719,
   "type": "line",
   "text": "For sfx_start, by voice: the offset of the voice's pulse width register from $D400, $02, $09 and $10."
  },
  {
   "address": 60722,
   "type": "line",
   "text": "For tune_start, by voice: the offset of the voice's settings from v1_fx, 0, $35 and $6A."
  },
  {
   "address": 60725,
   "type": "line",
   "text": "The voice after each voice for sfx_bark: 1, 2, 0."
  },
  {
   "address": 60728,
   "type": "line",
   "text": "High bytes of the 95 note frequencies, read at the note plus the transpose: notes 0-$5D are C0 ($0112) up in semitones to A7 ($E6B0), and $5E is 0, silence. On a PAL machine (985,248 Hz) they come out about a quarter of a semitone (26 cents) below concert pitch, except D#3 ($0A3C) and A#5 ($3D7E), about 19 and 15 cents below."
  },
  {
   "address": 60823,
   "type": "line",
   "text": "Low bytes of the 95 note frequencies."
  },
  {
   "address": 60918,
   "type": "line",
   "text": "Voice 1's command handlers, two bytes each, read at the command byte ($C0, $C2 and on to $DA) less $C0: return, call, jump, transpose and call, transpose and jump, set a setting, repeat, end of repeat, part of the settings, effect steps, effect, instrument, change the live effect, transpose."
  },
  {
   "address": 60946,
   "type": "line",
   "text": "Voice 2's command handlers, two bytes each, read at the command byte ($C0, $C2 and on to $DA) less $C0: return, call, jump, transpose and call, transpose and jump, set a setting, repeat, end of repeat, part of the settings, effect steps, effect, instrument, change the live effect, transpose."
  },
  {
   "address": 60974,
   "type": "line",
   "text": "Voice 3's command handlers, two bytes each, read at the command byte ($C0, $C2 and on to $DC) less $C0: return, call, jump, transpose and call, transpose and jump, set a setting, repeat, end of repeat, part of the settings, effect steps, effect, instrument, change the live effect, transpose, and the crash ($DC, v3_crash)."
  },
  {
   "address": 61004,
   "type": "line",
   "text": "A dog's bark (sfx_bark), on whichever voice is next, 31 bytes for sfx_start: pulse, gate on at frequency $0817, attack/decay $16, sustain/release $67, the gate on for 19 frames and then 6 frames to silence; an arpeggio on note $23: offset $09, then its 10 offsets from the last down, round and round: $08, $07, $06, $05, $04, $03, $02, $01, $DD, $09; a pulse sweep from $0400 by +100 for 15 frames, then -50 for 255 frames."
  },
  {
   "address": 61035,
   "type": "line",
   "text": "Voice 2's part of the flame thrower (sfx_flame), 31 bytes for sfx_start: pulse, gate on at frequency $03E8, attack/decay $90, sustain/release $F0, the gate on for 30 frames and then 2 frames to silence; a slide of +100 for 5 frames after 3 frames, then again from the start; a pulse sweep from $0800 by +50 for 15 frames, then -5 for 255 frames, then the phases again."
  },
  {
   "address": 61066,
   "type": "line",
   "text": "Voice 3's part of the flame thrower, 31 bytes for sfx_start: pulse with sync, gate on at frequency $07D0, attack/decay $90, sustain/release $F0, the gate on for 30 frames and then 2 frames to silence; a slide of +100 for 4 frames, then -100 for 4 frames after 10 frames (the fourth step during the delay too), then the phases again from where it is; a pulse sweep from $0800 by +5 for 5 frames, then -5 for 5 frames after 5 frames, then the phases again."
  },
  {
   "address": 61097,
   "type": "line",
   "text": "Voice 1's part of an explosion (sfx_explode), 31 bytes for sfx_start: noise, gate on at frequency $0BB8, attack/decay $00, sustain/release $C8, the gate on for 25 frames and then 25 frames to silence; a slide of -3000 for 1 frame, then +0 for 6 frames, then +4000 for 1 frame, then -50 for 255 frames after 4 frames; no pulse sweep."
  },
  {
   "address": 61128,
   "type": "line",
   "text": "Voice 2's part of an explosion, 31 bytes for sfx_start: triangle with ring modulation, gate on at frequency $0000, attack/decay $11, sustain/release $D8, the gate on for 17 frames and then 20 frames to silence; a slide of -30000 for 3 frames, then +20000 for 3 frames, then +25536 for 3 frames, then +30000 for 3 frames after 12 frames, then the phases again from where it is; no pulse sweep."
  },
  {
   "address": 61159,
   "type": "line",
   "text": "Voice 3's part of an explosion, 31 bytes for sfx_start: pulse with sync, gate on at frequency $0514, attack/decay $00, sustain/release $C8, the gate on for 20 frames and then 30 frames to silence; a slide of -1300 for 1 frame, then +0 for 6 frames, then +1700 for 1 frame, then -15 for 255 frames after 4 frames; a pulse sweep from $0800 by +40 for 255 frames."
  },
  {
   "address": 61190,
   "type": "line",
   "text": "Voice 1's part of the jet (sfx_jet), 31 bytes for sfx_start: noise, gate on at frequency $1A5E, attack/decay $A4, sustain/release $AA, the gate on for 70 frames and then 40 frames to silence; a slide of -50 for 255 frames, then the phases again from where it is; no pulse sweep."
  },
  {
   "address": 61221,
   "type": "line",
   "text": "Voice 2's part of the jet, 31 bytes for sfx_start: noise, gate on at frequency $03E8, attack/decay $A4, sustain/release $AA, the gate on for 70 frames and then 40 frames to silence; a slide of +300 for 10 frames, then -50 for 255 frames after 20 frames (the fourth step during the delay too), then the phases again from where it is; no pulse sweep."
  },
  {
   "address": 61252,
   "type": "line",
   "text": "A hit (sfx_hit), on voice 2, 31 bytes for sfx_start: noise, gate on at frequency $05DC, attack/decay $00, sustain/release $F0, the gate on for 9 frames and then 1 frame to silence; a slide of +200 for 255 frames, then the phases again from where it is; no pulse sweep."
  },
  {
   "address": 61283,
   "type": "line",
   "text": "Voice 1's part of the blue soldier's shot (sfx_gun), 31 bytes for sfx_start: noise, gate on at frequency $2CEC, attack/decay $00, sustain/release $D9, the gate on for 2 frames and then 28 frames to silence; no frequency effect; no pulse sweep."
  },
  {
   "address": 61314,
   "type": "line",
   "text": "Voice 2's part of the shot, 31 bytes for sfx_start: noise, gate on at frequency $251C, attack/decay $00, sustain/release $D9, the gate on for 2 frames and then 28 frames to silence; no frequency effect; no pulse sweep."
  },
  {
   "address": 61345,
   "type": "line",
   "text": "Voice 1's part of taking a weapon (sfx_pickup), 31 bytes for sfx_start: triangle with ring modulation, gate on at frequency $FDE8, attack/decay $00, sustain/release $D9, the gate on for 8 frames and then 14 frames to silence; a slide of +50 for 2 frames, then -50 for 2 frames, then -100 for 2 frames, then +100 for 2 frames, then the phases again from where it is; no pulse sweep."
  },
  {
   "address": 61376,
   "type": "line",
   "text": "Voice 2's part of taking a weapon, 31 bytes for sfx_start: noise, gate on at frequency $9A4C, attack/decay $00, sustain/release $98, the gate on for 8 frames and then 14 frames to silence; a slide of -110 for 255 frames; no pulse sweep."
  },
  {
   "address": 61407,
   "type": "line",
   "text": "Voice 3's part of taking a weapon, 31 bytes for sfx_start: triangle with ring modulation, gate on at frequency $9C40, attack/decay $00, sustain/release $D9, the gate on for 8 frames and then 14 frames to silence; a slide of +15000 for 1 frame, then -15000 for 1 frame after 10 frames, then the phases again from where it is; no pulse sweep."
  },
  {
   "address": 61438,
   "type": "line",
   "text": "Voice 1's part of the bazooka and grenades (sfx_bazooka), 31 bytes for sfx_start: pulse, gate on at frequency $09C4, attack/decay $11, sustain/release $89, the gate on for 10 frames and then 20 frames to silence; a slide of -20 for 255 frames; a pulse sweep from $0001 by -256 for 8 frames, then +100 for 255 frames."
  },
  {
   "address": 61469,
   "type": "line",
   "text": "Voice 2's part of the bazooka and grenades, 31 bytes for sfx_start: triangle with ring modulation, gate on at frequency $07D0, attack/decay $33, sustain/release $F9, the gate on for 8 frames and then 20 frames to silence; a slide of -50 for 255 frames; no pulse sweep."
  },
  {
   "address": 61500,
   "type": "line",
   "text": "Voice 3's part of the bazooka and grenades, 31 bytes for sfx_start: triangle with ring modulation, gate on at frequency $0BB8, attack/decay $00, sustain/release $D9, the gate on for 8 frames and then 14 frames to silence; no frequency effect; no pulse sweep."
  },
  {
   "address": 61531,
   "type": "line",
   "text": "16 bytes no tune reads, laid out like the tempo tables after it: 5 frames a step, $05 to $50."
  },
  {
   "address": 61547,
   "type": "line",
   "text": "A tempo of 4 frames a step: 16 note lengths, $04 to $40, which voice 3's command $D0 with index $44 copies over durations, steps 1-16 (the rescue after the fourth stage, voice 3; the intermission after the Missile Base, voice 3)."
  },
  {
   "address": 61563,
   "type": "line",
   "text": "A pattern for the intro and the intermission after the Missile Base and the intermission after the Harbour and game over and the intermission after the Bridge, voices 1 and 2 and 3, called from $F084, $F0BA, $F0ED, $F2FD, $F33B, $F4A3, $F59B, $F5AA, $F5E6: sound shared_tone1, effect shared_effect1; it returns."
  },
  {
   "address": 61572,
   "type": "line",
   "text": "Voice 1's pattern for the intro (tune 0): 11 notes, D4 to A#4 before any transpose, call intro_v1_1, call intro_v1_2 transposed +4 (2 times), transpose +0 (2 times); it goes on at intro_v1_3."
  },
  {
   "address": 61613,
   "type": "line",
   "text": "A pattern for the intro, voices 1 and 2, called from $F087, $F09D, $F0BD, $F0D0: 6 notes, A3 to A#3 before any transpose; it returns."
  },
  {
   "address": 61626,
   "type": "line",
   "text": "Voice 2's pattern for the intro (tune 0): 11 notes, A#3 to G4 before any transpose, call intro_v1_1, call intro_v1_2 (2 times); it runs on into intro_v1_3."
  },
  {
   "address": 61657,
   "type": "line",
   "text": "A pattern for the intro, voices 1 and 3, jumped to from $F0A9, $F11C: 1 note, A#4 before any transpose, the sustain/release set to $77; it runs on into rest_voice."
  },
  {
   "address": 61662,
   "type": "line",
   "text": "The pattern every tune gives a voice it does not use: tunes 1, 7, 10, 11, 12, voices 2 and 3: no notes; it ends the voice (command $C0 with nothing to return to)."
  },
  {
   "address": 61663,
   "type": "line",
   "text": "A pattern for the intro, voice 3, called from $F0F0, $F10B: 4 notes, D2 to D3 before any transpose; it returns."
  },
  {
   "address": 61672,
   "type": "line",
   "text": "Voice 3's pattern for the intro (tune 0): 19 notes, D2 to D3 before any transpose, tempo tempo_6, call intro_v1_1, call intro_v3_1 (2 times); it goes on at intro_v1_3."
  },
  {
   "address": 61728,
   "type": "line",
   "text": "A whole sound, 29 bytes for command $D0 (index $1C), which sets every one of the voice's settings (the alarm, voices 1 and 3): a slide of +30 for 4 frames, then -30 for 8 frames, then +30 for 4 frames after 25 frames (the fourth step during the delay too), then the phases again from where it is; a pulse sweep from $0800 by +50 for 5 frames, then -50 for 5 frames after 25 frames, then the phases again; pulse width $0800; pulse, attack/decay $A6, sustain/release $F8, the gate on for 90 frames and then 10 frames to silence."
  },
  {
   "address": 61757,
   "type": "line",
   "text": "Voice 1's pattern for the alarm (tune 11): 1 note, A#0 before any transpose, sound alarm_sound1, a repeat of 3; it ends the voice (command $C0 with nothing to return to)."
  },
  {
   "address": 61768,
   "type": "line",
   "text": "Voice 3's pattern for the alarm (tune 11): 1 note, C#1 before any transpose, sound alarm_sound1, the effect step 4 low byte set to $2E, a repeat of 3; it ends the voice (command $C0 with nothing to return to)."
  },
  {
   "address": 61782,
   "type": "line",
   "text": "A whole sound, 29 bytes for command $D0 (index $1C), which sets every one of the voice's settings (the lorry, voice 1): a slide of +45 for 5 frames, then -45 for 5 frames, then +20 for 5 frames, then -20 for 5 frames after 80 frames (the fourth step during the delay too), then the phases again from where it is; no pulse sweep; pulse width $0000; sawtooth, attack/decay $BB, sustain/release $5A, the gate on for 255 frames and then 50 frames to silence."
  },
  {
   "address": 61811,
   "type": "line",
   "text": "Voice 1's pattern for the lorry (tune 12): 1 note, C#3 before any transpose, sound lorry_sound1; it runs on into lorry_v1_1."
  },
  {
   "address": 61818,
   "type": "line",
   "text": "A pattern for the lorry, voice 1, jumped to from $F17F: 1 rest, the live gate time set to $0A; it goes back to lorry_v1_1, round and round."
  },
  {
   "address": 61826,
   "type": "line",
   "text": "A whole sound, 29 bytes for command $D0 (index $1C), which sets every one of the voice's settings (the helicopters, voice 1): a slide of -100 for 7 frames, then -1042 for 1 frame, then +0 for 2 frames, then again from the start; no pulse sweep; pulse width $0000; noise, attack/decay $AA, sustain/release $DA, the gate on for 255 frames and then 50 frames to silence."
  },
  {
   "address": 61855,
   "type": "line",
   "text": "Voice 1's pattern for the helicopters (tune 7): 1 note, G#2 before any transpose, sound helis_sound1; it runs on into helis_v1_1."
  },
  {
   "address": 61862,
   "type": "line",
   "text": "A pattern for the helicopters, voice 1, jumped to from $F1AB: 1 rest, the live gate time set to $0A; it goes back to helis_v1_1, round and round."
  },
  {
   "address": 61870,
   "type": "line",
   "text": "Voice 3's pattern for the start of a game (tune 1): 1 rest, a repeat of 3, call start_v3_6; it goes on at start_v3_5."
  },
  {
   "address": 61881,
   "type": "line",
   "text": "A pattern for the start of a game and play resuming after a death or intermission, voice 3, called from $F286, $F28E, $F291: 3 rests, a repeat of 2 (2 times), the crash (v3_crash) (3 times), a repeat of 3; it runs on into start_v3_2."
  },
  {
   "address": 61899,
   "type": "line",
   "text": "A pattern for the start of a game and play resuming after a death or intermission, voice 3, called from $F1DE: 1 rest, a repeat of 4, the crash (v3_crash); it returns."
  },
  {
   "address": 61906,
   "type": "line",
   "text": "A pattern for the start of a game and play resuming after a death or intermission, voice 3, called from $F28A: 4 rests, the crash (v3_crash) (4 times), a repeat of 6, call start_v3_2; it returns."
  },
  {
   "address": 61925,
   "type": "line",
   "text": "A pattern for the start of a game and play resuming after a death or intermission, voice 3, called from $F294: 5 rests, a repeat of 2, the crash (v3_crash) (5 times), a repeat of 16; it returns."
  },
  {
   "address": 61947,
   "type": "line",
   "text": "Voice 3's command $DC, which only voice 3 has: a hit on all three voices at once. Unless a sound effect holds any voice, it stops every effect and sets voice 1 to noise at frequency $2710, voices 2 and 3 to triangle at $1388 and $03E8, with attack/decay 0, 3 and 3 and sustain/release $86, the gate on, a gate time of 3 and a sound time of 8 frames. Moves on one byte."
  },
  {
   "address": 62077,
   "type": "line",
   "text": "Voice 3's pattern for play resuming after a death or intermission (tune 10): 1 rest, call start_v3_6; it runs on into start_v3_5."
  },
  {
   "address": 62082,
   "type": "line",
   "text": "A pattern for the start of a game and play resuming after a death or intermission, voice 3, jumped to from $F1B6, $F297: a repeat of 2, a repeat of 3, call start_v3_1 (3 times), call start_v3_3, call start_v3_4; it goes back to start_v3_5, round and round."
  },
  {
   "address": 62106,
   "type": "line",
   "text": "Voice 1's pattern for a death (tune 6): 8 notes, E4 to D5 before any transpose, call inter1_v1_1; it runs on into death_v2_1."
  },
  {
   "address": 62125,
   "type": "line",
   "text": "A pattern for a death, voices 2 and 3, jumped to from $F2E2, $F2F9: 1 note, D4 before any transpose, effect shared_effect1; it ends the voice (command $C0 with nothing to return to)."
  },
  {
   "address": 62131,
   "type": "line",
   "text": "A tempo of 6 frames a step: 16 note lengths, $06 to $60, which voice 3's command $D0 with index $44 copies over durations, steps 1-16 (the intro, voice 3; the intermission after the Harbour, voice 3; game over, voice 3; the intermission after the Bridge, voice 3)."
  },
  {
   "address": 62147,
   "type": "line",
   "text": "A pattern for the intermission after the Missile Base and a death, voices 1 and 2 and 3, called from $F29A, $F2CF, $F2E6, $F4E5: sound shared_tone1, the waveform byte set to $41, the gate time set to $19; it returns."
  },
  {
   "address": 62159,
   "type": "line",
   "text": "Voice 2's pattern for a death (tune 6): 8 notes, E3 to D4 before any transpose, call inter1_v1_1; it goes on at death_v2_1."
  },
  {
   "address": 62182,
   "type": "line",
   "text": "Voice 3's pattern for a death (tune 6): 8 notes, E2 to A#2 before any transpose, call inter1_v1_1; it goes on at death_v2_1."
  },
  {
   "address": 62205,
   "type": "line",
   "text": "Voice 1's pattern for game over (tune 5): 16 notes, F4 to D#5 before any transpose, call intro_v1_1; it runs on into game_over_v2_1."
  },
  {
   "address": 62240,
   "type": "line",
   "text": "A pattern for game over, voice 2, jumped to from $F35E: 13 notes, G3 to D#5 before any transpose; it ends the voice (command $C0 with nothing to return to)."
  },
  {
   "address": 62267,
   "type": "line",
   "text": "Voice 2's pattern for game over (tune 5): 16 notes, A#3 to A#4 before any transpose, call intro_v1_1; it goes on at game_over_v2_1."
  },
  {
   "address": 62306,
   "type": "line",
   "text": "A pattern for game over, voice 3, called from $F385, $F38A: 3 notes, all A#2 before any transpose, a repeat of 3; it returns."
  },
  {
   "address": 62316,
   "type": "line",
   "text": "Voice 3's pattern for game over (tune 5): 14 notes, F2 to D#3 before any transpose, tempo tempo_6, sound shared_sound1, a repeat of 2, call game_over_v3_1 (2 times), a repeat of 3, a repeat of 4, the gate time set to $32; it ends the voice (command $C0 with nothing to return to)."
  },
  {
   "address": 62373,
   "type": "line",
   "text": "Voice 2's pattern for the rescue after the fourth stage (tune 2): 1 rest; it runs on into rescue_v1."
  },
  {
   "address": 62375,
   "type": "line",
   "text": "Voice 1's pattern for the rescue after the fourth stage (tune 2): 19 notes, C#4 to F5 before any transpose, sound shared_sound1, the gate time set to $28; it runs on into rescue_v3_1."
  },
  {
   "address": 62421,
   "type": "line",
   "text": "A pattern for the rescue after the fourth stage, voice 3, jumped to from $F43A: 5 notes, C#4 to C#5 before any transpose, the gate time set to $14; it ends the voice (command $C0 with nothing to return to)."
  },
  {
   "address": 62435,
   "type": "line",
   "text": "A whole sound, 29 bytes for command $D0 (index $1C), which sets every one of the voice's settings (the rescue after the fourth stage, voices 1 and 2 and 3; the intermission after the Missile Base, voice 3; the intermission after the Harbour, voice 3; game over, voice 3; the intermission after the Bridge, voice 3): a slide of +15 for 3 frames, then -15 for 6 frames, then +15 for 3 frames after 7 frames, then the phases again from where it is; a pulse sweep from $0700 by +64 for 8 frames, then -5 for 255 frames after 3 frames; pulse width $0700; pulse, attack/decay $18, sustain/release $79, the gate on for 8 frames and then 30 frames to silence."
  },
  {
   "address": 62464,
   "type": "line",
   "text": "Voice 3's pattern for the rescue after the fourth stage (tune 2): 21 notes, C#2 to G#3 before any transpose, tempo tempo_4, sound shared_sound1, the gate time set to $1E, the gate time set to $28; it goes on at rescue_v3_1."
  },
  {
   "address": 62526,
   "type": "line",
   "text": "A whole sound, 29 bytes for command $D0 (index $1C), which sets every one of the voice's settings (the start of a game, voices 1 and 3; play resuming after a death or intermission, voices 1 and 3): a slide of +30 for 4 frames, then -30 for 8 frames, then +30 for 4 frames after 25 frames (the fourth step during the delay too), then the phases again from where it is; a pulse sweep from $0800 by +50 for 5 frames, then -50 for 5 frames after 25 frames, then the phases again; pulse width $0800; pulse, attack/decay $86, sustain/release $FA, the gate on for 65 frames and then 75 frames to silence."
  },
  {
   "address": 62555,
   "type": "line",
   "text": "Voice 1's pattern for the start of a game (tune 1): 2 rests, call start_v1_1 (2 times); it runs on into start_v1_1."
  },
  {
   "address": 62565,
   "type": "line",
   "text": "Voice 1's pattern for the start of a game (tune 1), also jumped to from $F45B, $F460: 1 note, A#1 before any transpose, 2 rests, sound shared_sound2, the live effect delay set to $FF, the live effect step 4 low byte set to $97, the live effect step 4 high byte set to $FF; it ends the voice (command $C0 with nothing to return to)."
  },
  {
   "address": 62586,
   "type": "line",
   "text": "A pattern for the start of a game and play resuming after a death or intermission, voice 3, called from $F1B0, $F27D: 1 note, B1 before any transpose, 2 rests, sound shared_sound2, tempo tempo_3, the live effect delay set to $FF, the live effect step 4 low byte set to $97, the live effect step 4 high byte set to $FF; it returns."
  },
  {
   "address": 62612,
   "type": "line",
   "text": "A tone, 15 bytes for command $D0 (index $1C, offset $0E), which sets the pulse sweep, pulse width and instrument and leaves the frequency effect (the intro, voices 1 and 2 and 3; the intermission after the Missile Base, voices 1 and 2; the intermission after the Harbour, voices 1 and 2; game over, voices 1 and 2; a death, voices 1 and 2 and 3; the intermission after the Bridge, voices 1 and 2): a pulse sweep from $0700 by +64 for 8 frames, then -5 for 255 frames after 3 frames; pulse width $0700; pulse; the gate goes off when the note has fewer than 3 frames left, attack/decay $18, sustain/release $79, then 30 frames to silence."
  },
  {
   "address": 62627,
   "type": "line",
   "text": "Voice 1's pattern for the intermission after the Missile Base (tune 3): 31 notes, G#3 to A#4 before any transpose, call intro_v1_1; it ends the voice (command $C0 with nothing to return to)."
  },
  {
   "address": 62693,
   "type": "line",
   "text": "Voice 2's pattern for the intermission after the Missile Base (tune 3): 39 notes, G#3 to D5 before any transpose, call inter1_v1_1, effect shared_effect1, the sustain/release set to $7A, the gate time set to $0F; it ends the voice (command $C0 with nothing to return to)."
  },
  {
   "address": 62784,
   "type": "line",
   "text": "Voice 3's pattern for the intermission after the Missile Base (tune 3): 22 notes, G2 to D#3 before any transpose, tempo tempo_4, sound shared_sound1, the effect flags set to $00; it ends the voice (command $C0 with nothing to return to)."
  },
  {
   "address": 62842,
   "type": "line",
   "text": "A pattern for the intermission after the Harbour, voices 1 and 2, called from $F59E, $F5AD: 15 notes, D#4 to D#5 before any transpose, transpose +0; it returns."
  },
  {
   "address": 62875,
   "type": "line",
   "text": "Voice 1's pattern for the intermission after the Harbour (tune 4): 4 notes, G4 to C#5 before any transpose, call intro_v1_1, call inter2_v1_1; it ends the voice (command $C0 with nothing to return to)."
  },
  {
   "address": 62890,
   "type": "line",
   "text": "Voice 2's pattern for the intermission after the Harbour (tune 4): 4 notes, C4 to A#4 before any transpose, call intro_v1_1, call inter2_v1_1 transposed +12; it ends the voice (command $C0 with nothing to return to)."
  },
  {
   "address": 62906,
   "type": "line",
   "text": "Voice 3's pattern for the intermission after the Harbour (tune 4): 13 notes, C#2 to G#2 before any transpose, 1 rest, tempo tempo_6, sound shared_sound1, a repeat of 3; it ends the voice (command $C0 with nothing to return to)."
  },
  {
   "address": 62948,
   "type": "line",
   "text": "Voice 2's pattern for the intermission after the Bridge (tune 9): 1 rest; it runs on into inter3_v1."
  },
  {
   "address": 62950,
   "type": "line",
   "text": "Voice 1's pattern for the intermission after the Bridge (tune 9): 40 notes, D#4 to F#5 before any transpose, call intro_v1_1; it ends the voice (command $C0 with nothing to return to)."
  },
  {
   "address": 63034,
   "type": "line",
   "text": "A pattern for the intermission after the Bridge, voice 3, called from $F64E, $F66F: 2 notes, all B2 before any transpose, a repeat of 3; it returns."
  },
  {
   "address": 63042,
   "type": "line",
   "text": "Voice 3's pattern for the intermission after the Bridge (tune 9): 23 notes, C#2 to B2 before any transpose, 1 rest, tempo tempo_6, sound shared_sound1, call inter3_v3_1 (2 times), a repeat of 3, a repeat of 4; it ends the voice (command $C0 with nothing to return to)."
  },
  {
   "address": 63113,
   "type": "line",
   "text": "A frequency effect, 14 bytes for command $D4 (the intro, voices 1 and 2 and 3; the intermission after the Missile Base, voices 1 and 2; the intermission after the Harbour, voices 1 and 2; game over, voices 1 and 2; a death, voice 1; the intermission after the Bridge, voices 1 and 2): a slide of +15 for 3 frames, then -15 for 6 frames, then +15 for 3 frames after 7 frames, then the phases again from where it is."
  },
  {
   "address": 63127,
   "type": "line",
   "text": "15 bytes no tune reads: the rest of a whole sound that starts at shared_effect1, whose first 14 bytes the tunes load with command $D4: a pulse sweep from $0600 by +100 for 6 frames, then -50 for 255 frames after 1 frame; pulse width $0600; an instrument, pulse, attack/decay $06, sustain/release $D7, the gate on for 10 frames and then 10 frames to silence."
  },
  {
   "address": 63142,
   "type": "line",
   "text": "Frequency effect steps, 10 bytes for command $D2 (the title, voices 1 and 2 and 3): $00 $08 $05 $0C $00 $07 $04 $0C, read as four 16-bit slide steps or as arpeggio offsets, and $00 $08 as the first two phase lengths."
  },
  {
   "address": 63146,
   "type": "line",
   "text": "Frequency effect steps, 10 bytes for command $D2 (the title, voices 1 and 2 and 3): $00 $07 $04 $0C $00 $08 $03 $0C, read as four 16-bit slide steps or as arpeggio offsets, and $F6 $FF as the first two phase lengths."
  },
  {
   "address": 63150,
   "type": "line",
   "text": "Frequency effect steps, 10 bytes for command $D2 (the title, voices 2 and 3): $00 $08 $03 $0C $F6 $FF $00 $00, read as four 16-bit slide steps or as arpeggio offsets, and $00 $00 as the first two phase lengths."
  },
  {
   "address": 63154,
   "type": "line",
   "text": "A frequency effect, 14 bytes for command $D4 (the title, voice 2): a slide of -10 for 9 frames after 3 frames."
  },
  {
   "address": 63168,
   "type": "line",
   "text": "A tempo of 3 frames a step: 16 note lengths, $03 to $30, which voice 3's command $D0 with index $44 copies over durations, steps 1-16 (the start of a game, voice 3; the title, voice 3; play resuming after a death or intermission, voice 3)."
  },
  {
   "address": 63184,
   "type": "line",
   "text": "A pattern for the title, voice 1, called from $F711, $F777, $F77B, $F77E: 6 notes, C0 to C1 before any transpose, the sustain/release set to $F9, the sustain/release set to $B9; it returns."
  },
  {
   "address": 63203,
   "type": "line",
   "text": "A pattern for the title, voice 1, called from $F79B, $F7A0: 4 rests, call title_v1_4 transposed +34, call title_v1_4 transposed +38, call title_v1_4 transposed +32, call title_v1_4 transposed +39; it runs on into title_v1_3."
  },
  {
   "address": 63227,
   "type": "line",
   "text": "A pattern for the title, voice 1, called from $F791: 3 rests, call title_v1_4 transposed +34, call title_v1_4 transposed +38, call title_v1_4 transposed +32, transpose +39; it runs on into title_v1_4."
  },
  {
   "address": 63247,
   "type": "line",
   "text": "A pattern for the title, voice 1, called from $F6E3, $F6E9, $F6EF, $F6F5, $F6FB, $F701, $F707, $F735, $F76A, $F788: a repeat of 3, call title_v1_1; it runs on into title_v1_5."
  },
  {
   "address": 63253,
   "type": "line",
   "text": "A pattern for the title, voice 1, called from $F782: 7 notes, C0 to C1 before any transpose, the sustain/release set to $F9 (3 times), the sustain/release set to $B9 (2 times); it returns."
  },
  {
   "address": 63283,
   "type": "line",
   "text": "A pattern for the title, voice 1, called from $F76E, $F771, $F78C: 1 rest; it goes on at title_v1_4."
  },
  {
   "address": 63288,
   "type": "line",
   "text": "Voice 1's pattern for the title (tune 8), also jumped to from $F7BC: 1 note, A#2 before any transpose, 10 rests, sound title_sound1, effect steps title_steps2 (2 times), a repeat of 2 (2 times), call title_v1_8 transposed +55, call title_v1_8 (3 times), call title_v1_8 transposed +50 (2 times), effect steps title_steps3, and 21 more commands; it goes back to title_v1_7, round and round."
  },
  {
   "address": 63423,
   "type": "line",
   "text": "A whole sound, 29 bytes for command $D0 (index $1C), which sets every one of the voice's settings (the title, voices 2 and 3): an arpeggio on the note: offset $09, then its 10 offsets from the last down, round and round: $08, $07, $06, $05, $04, $03, $02, $01, $00, $09; no pulse sweep; pulse width $0800; pulse, attack/decay $03, sustain/release $78, the gate on for 5 frames and then 18 frames to silence."
  },
  {
   "address": 63452,
   "type": "line",
   "text": "A whole sound, 29 bytes for command $D0 (index $1C), which sets every one of the voice's settings (the title, voice 2): a slide of +50 for 3 frames, then -50 for 6 frames, then +50 for 3 frames after 144 frames (the fourth step during the delay too), then the phases again from where it is; a pulse sweep from $0820 by +30 for 48 frames, then -30 for 48 frames, then the phases again; pulse width $0820; pulse, attack/decay $DD, sustain/release $FD, the gate on for 255 frames and then 255 frames to silence."
  },
  {
   "address": 63481,
   "type": "line",
   "text": "A whole sound, 29 bytes for command $D0 (index $1C), which sets every one of the voice's settings (the title, voices 2 and 3): a slide of +40 for 3 frames, then -40 for 6 frames, then +40 for 3 frames after 20 frames (the fourth step during the delay too), then the phases again from where it is; a pulse sweep from $0880 by +20 for 80 frames, then -20 for 80 frames after 9 frames, then the phases again; pulse width $0880; pulse; the gate goes off when the note has fewer than 30 frames left, attack/decay $DD, sustain/release $DB, then 200 frames to silence."
  },
  {
   "address": 63510,
   "type": "line",
   "text": "A tone, 15 bytes for command $D0 (index $1C, offset $0E), which sets the pulse sweep, pulse width and instrument and leaves the frequency effect (the title, voices 1 and 2 and 3): a pulse sweep from $0400 by +200 for 10 frames, then -20 for 255 frames, then the phases again; pulse width $0400; pulse, attack/decay $00, sustain/release $D9, the gate on for 5 frames and then 255 frames to silence."
  },
  {
   "address": 63525,
   "type": "line",
   "text": "A pattern for the title, voice 2, called from $F967, $F96A: 6 notes, D3 to C4 before any transpose, 1 rest, the effect step 4 low byte set to $33, the effect step 4 low byte set to $23, the effect step 4 low byte set to $20, the effect step 4 low byte set to $1B, the gate time set to $14, the effect step 4 low byte set to $00, the effect step 4 low byte set to $29, the gate time set to $1E; it returns."
  },
  {
   "address": 63564,
   "type": "line",
   "text": "A pattern for the title, voice 2, called from $F998, $F99B: effect steps title_steps1, call title_v2_4 transposed +53; it runs on into title_v2_3."
  },
  {
   "address": 63571,
   "type": "line",
   "text": "A pattern for the title, voice 2, called from $F9C9: effect steps title_steps2, call title_v2_4 transposed +57, effect steps title_steps3, call title_v2_4 transposed +56, effect steps title_steps4, transpose +55; it runs on into title_v2_4."
  },
  {
   "address": 63590,
   "type": "line",
   "text": "A pattern for the title, voice 2, called from $F84F, $F856, $F85D: 15 notes, all C0 before any transpose, 1 rest, the sustain/release set to $F9 (2 times), the sustain/release set to $B9 (2 times), a repeat of 3 (3 times), a repeat of 4, a repeat of 5; it returns."
  },
  {
   "address": 63650,
   "type": "line",
   "text": "A pattern for the title, voice 2, called from $F8AA, $F8B5: 2 notes, E3 to D4 before any transpose, a repeat of 3; it returns."
  },
  {
   "address": 63658,
   "type": "line",
   "text": "A pattern for the title, voice 2, called from $F9D3: 8 notes, E3 to D4 before any transpose, call title_v2_5 (2 times), a repeat of 4; it returns."
  },
  {
   "address": 63684,
   "type": "line",
   "text": "A pattern for the title, voice 2, called from $F9D8, $F9DE, $F9FD, $FA03: 3 notes, E3 to D4 before any transpose, a repeat of 3; it returns."
  },
  {
   "address": 63694,
   "type": "line",
   "text": "A pattern for the title, voice 2, called from $F9DB, $FA00: 4 notes, E3 to D4 before any transpose, a repeat of 3; it returns."
  },
  {
   "address": 63706,
   "type": "line",
   "text": "Voice 2's pattern for the title (tune 8), also jumped to from $FA29: 61 notes, D0 to D#5 before any transpose, 14 rests, sound title_sound5, the effect step 4 low byte set to $06, the effect step 4 high byte set to $00, the effect flags set to $07 (2 times), the live effect step 4 low byte set to $D2, the live effect step 4 high byte set to $03, effect title_effect2, and 49 more commands; it goes back to title_v2_9, round and round."
  },
  {
   "address": 64044,
   "type": "line",
   "text": "A whole sound, 29 bytes for command $D0 (index $1C), which sets every one of the voice's settings (the title, voices 2 and 3): a slide of +30 for 3 frames, then -30 for 6 frames, then +30 for 3 frames after 11 frames, then the phases again from where it is; a pulse sweep from $0700 by +15 for 10 frames, then -10 for 10 frames after 5 frames, then the phases again; pulse width $0700; pulse, attack/decay $03, sustain/release $C9, the gate on for 255 frames and then 20 frames to silence. Also A frequency effect, 14 bytes for command $D4 (the title, voices 2 and 3): a slide of +30 for 3 frames, then -30 for 6 frames, then +30 for 3 frames after 11 frames, then the phases again from where it is."
  },
  {
   "address": 64073,
   "type": "line",
   "text": "A whole sound, 29 bytes for command $D0 (index $1C), which sets every one of the voice's settings (the title, voices 2 and 3): a slide of +70 for 3 frames, then -70 for 6 frames, then +70 for 3 frames after 20 frames, then the phases again from where it is; a pulse sweep from $0000 by +200 for 11 frames, then -5 for 255 frames after 1 frame, then the phases again; pulse width $0000; pulse, attack/decay $09, sustain/release $EB, the gate on for 120 frames and then 100 frames to silence."
  },
  {
   "address": 64097,
   "type": "line",
   "text": "An instrument, 5 bytes for command $D6 (the title, voices 2 and 3): pulse, attack/decay $09, sustain/release $EB, the gate on for 120 frames and then 100 frames to silence."
  },
  {
   "address": 64102,
   "type": "line",
   "text": "An instrument, 5 bytes for command $D6 (the title, voices 2 and 3): pulse; the gate goes off when the note has fewer than 8 frames left, attack/decay $09, sustain/release $E7, then 10 frames to silence."
  },
  {
   "address": 64107,
   "type": "line",
   "text": "A frequency effect, 14 bytes for command $D4 (the title, voice 3): a slide of -20 for 9 frames after 3 frames."
  },
  {
   "address": 64121,
   "type": "line",
   "text": "A whole sound, 29 bytes for command $D0 (index $1C), which sets every one of the voice's settings (the title, voice 3): a slide of +20 for 3 frames, then -20 for 6 frames, then +20 for 3 frames after 151 frames (the fourth step during the delay too), then the phases again from where it is; a pulse sweep from $0820 by +30 for 48 frames, then -30 for 48 frames, then the phases again; pulse width $0820; pulse, attack/decay $DD, sustain/release $FD, the gate on for 255 frames and then 255 frames to silence."
  },
  {
   "address": 64150,
   "type": "line",
   "text": "A pattern for the title, voice 3, called from $FC30, $FC33: 6 notes, F3 to A3 before any transpose, 2 rests, the effect step 4 low byte set to $29 (2 times), the effect step 4 low byte set to $33, the effect step 4 low byte set to $27, the effect step 4 low byte set to $0F, the gate time set to $14, the effect step 4 low byte set to $00, the gate time set to $1E; it returns."
  },
  {
   "address": 64191,
   "type": "line",
   "text": "A pattern for the title, voice 3, called from $FC84, $FC87: effect steps title_steps1, call title_v1_8 transposed +53, call title_v1_8 (3 times), effect steps title_steps2, call title_v1_8 transposed +57, effect steps title_steps3, call title_v1_8 transposed +56, and 2 more commands; it runs on into title_v1_8."
  },
  {
   "address": 64228,
   "type": "line",
   "text": "A pattern for the title, voices 1 and 3, called from $F744, $F748, $F74B, $F74F, $F758, $F75C, $FAC2, $FAC6, $FACC, $FAD0, $FAD6, $FADA, $FAE0: 9 notes, all C0 before any transpose, the sustain/release set to $E9 (2 times), the sustain/release set to $B9 (2 times), a repeat of 4; it returns."
  },
  {
   "address": 64262,
   "type": "line",
   "text": "A pattern for the title, voice 3, called from $FC5A, $FC5F: 25 notes, G#4 to C6 before any transpose, 1 rest; it returns."
  },
  {
   "address": 64315,
   "type": "line",
   "text": "A pattern for the title, voices 2 and 3, called from $F9A5, $FC6A: 20 notes, D#4 to C6 before any transpose, 2 rests, the effect delay set to $24, the live effect flags set to $07 (2 times), the live effect step 4 low byte set to $5A, the live effect step 4 high byte set to $00, the effect delay set to $14, the effect flags set to $05, instrument title_instr3, and 4 more commands; it returns."
  },
  {
   "address": 64396,
   "type": "line",
   "text": "A pattern for the title, voice 3, called from $FCA6, $FCAC, $FCCD, $FCD3: 5 notes, E3 to D4 before any transpose, 1 rest; it returns."
  },
  {
   "address": 64409,
   "type": "line",
   "text": "A pattern for the title, voice 3, called from $FCA9, $FCD0: 6 notes, all D4 before any transpose, 1 rest; it returns."
  },
  {
   "address": 64424,
   "type": "line",
   "text": "Voice 3's pattern for the title (tune 8): tempo tempo_3; it runs on into title_v3_6."
  },
  {
   "address": 64429,
   "type": "line",
   "text": "A pattern for the title, voice 3, jumped to from $FCFE: 65 notes, G2 to G5 before any transpose, 1 silent note ($5E), 14 rests, sound title_sound5, the effect flags set to $07 (2 times), effect title_effect3, the gate time set to $0C (3 times), the sound time set to $02 (3 times), effect title_sound5, the gate time set to $FF (2 times), and 41 more commands; it goes back to title_v3_6, round and round."
  },
  {
   "address": 64769,
   "type": "line",
   "text": "Enemy projectiles against the hero. For each live one (eshot_active) whose Y is below his top Y and no more than $1C lines below it, and whose X (eshot_xu) is above his and no more than 6 units on: a shell, grenade, bomb or jet bomb explodes there first (shot_explode), a bullet (type 0 or 5) does not; the hero dies (player_killed). Then, on the Harbour (stage 1), the dogs."
  },
  {
   "address": 64832,
   "type": "line",
   "text": "On the Harbour, each live dog in slots 1-3 that is within 3 units of the hero's X and 10 lines of his top Y kills him."
  },
  {
   "address": 64888,
   "type": "line",
   "text": "Writes GAME OVER over LIVES on the status line, at $C401."
  },
  {
   "address": 64902,
   "type": "line",
   "text": "GAME OVER and a space, in PETSCII, which draw_game_over turns into screen codes."
  },
  {
   "address": 64912,
   "type": "line",
   "text": "Text 3, the ending, read at page offset 0 (text_pages): CONGRATULATIONS at $4034, MISSION ACCOMPLISHED at $4082 and NOW PROCEED TO NEXT CAMP at $40D0."
  },
  {
   "address": 64981,
   "type": "line",
   "text": "229 bytes no tune reads, after the ending's text: a 0, then from $FDD6 patterns in the driver's format: notes, repeats, live effect changes, sounds, calls and a closing jump. None of their addresses fits what is there now: the sounds at $F978, $F9B2 and $FC02 and the tone at $F9CF fall in the middle of the title tune's patterns, and so do the calls to $FC4F, $FC78, $FCBF and $FCF4; the sound at $3FA9 and the effect at $3FDE fall inside title_sound1 and title_effect1; the calls to $FD45 and $FD52 and the jump to $FD66 land inside dog_contact. Music left from an earlier layout of the game."
  },
  {
   "address": 65210,
   "type": "line",
   "text": "When the score reaches next_life: moves next_life on by 70,000 (its middle byte plus $70, in decimal), and gives an extra life if the hero has fewer than 9, redrawing the lives. The first is at 30,000, set by new_game, so they come at 30,000, 100,000, 170,000 and so on; at 9 lives the extra life is lost."
  },
  {
   "address": 65260,
   "type": "line",
   "text": "Swaps block A (0-8) with its partner, byte for byte, and flips its flag in swap_flags. The memory configuration comes from swap_ports and is written into the LDA at $FF21: $30, all RAM, for a block under the I/O, with interrupts off while the I/O is gone; $35 for the others. Whole pages first, then the remaining bytes (its count in the CPY at $FF55). Ends with the I/O in and interrupts on."
  },
  {
   "address": 65314,
   "type": "line",
   "text": "The operand of LDA at $FF21: the swap's memory configuration, from swap_ports."
  },
  {
   "address": 65352,
   "type": "line",
   "text": "The bytes after the whole pages."
  },
  {
   "address": 65366,
   "type": "line",
   "text": "The operand of CPY at $FF55: how many bytes after the whole pages, from the low byte of swap_lengths."
  },
  {
   "address": 65375,
   "type": "line",
   "text": "The first block of each swap 0-8: $D000, $8000, $9000, $D800, $D440, $8DC0, $9DC0, $C580, $C800."
  },
  {
   "address": 65393,
   "type": "line",
   "text": "The block each is swapped with: $7A00, $A000, $B000, $7800, $7B00, $A200, $B200, $71C0, $7800."
  },
  {
   "address": 65411,
   "type": "line",
   "text": "The length of each swap in bytes: $0440, $0DC0, $0DC0, $0800, $02D0, $0240, $0240, $0280, $0687."
  },
  {
   "address": 65429,
   "type": "line",
   "text": "The memory configuration for each swap: $30 (all RAM) for swaps 0, 3 and 4, whose first block is under the I/O, $35 for the others."
  },
  {
   "address": 65438,
   "type": "line",
   "text": "Draws the weapon's ammunition on the status line from $C429: an icon two characters wide for each round left (ammo_icons, coloured from ammo_colours), up to five, with spaces after them. With no weapon it draws nothing; with one round left it leaves the icon already there."
  },
  {
   "address": 65460,
   "type": "line",
   "text": "Blank the places after the last round, from the fifth down."
  },
  {
   "address": 65478,
   "type": "line",
   "text": "Draw an icon for each round, from the last down to the first."
  },
  {
   "address": 65509,
   "type": "line",
   "text": "21 bytes of $AA filler that nothing reads."
  },
  {
   "address": 65530,
   "type": "line",
   "text": "The NMI vector, $FFFC: the RESTORE key's interrupt goes to the RTI there and does nothing."
  },
  {
   "address": 65532,
   "type": "line",
   "text": "The RTI ($40) the NMI vector points at. With the vector beside it, the two bytes also read as the reset vector, $4040, which a real reset never uses, as the ROM is switched in then."
  },
  {
   "address": 65534,
   "type": "line",
   "text": "The interrupt vector, set to irq ($CEA9) by irq_start."
  }
 ]
}