{
 "schema": 1,
 "platform": "c64",
 "game": "commando",
 "build": "REMEMBER's crack \"Commando +5HD\" (CSDb release 40672, June 1997): a D64 headed \"once upon a time\", ID \"-rem-\", with the packed game and a saved high-score file. The 1985 release was not available to compare.",
 "source": "regenerator2000 live",
 "regions": {
  "exclude": [
   [
    256,
    511,
    "stack"
   ],
   [
    53312,
    53375,
    "I/O and colour RAM"
   ],
   [
    57344,
    58367,
    "screen RAM"
   ],
   [
    1299,
    2047,
    "the rest of REMEMBER's screen at $0400 (its menu and the instructions viewer, $4763, $476F), spaces at the hand-over; the game's variables end at $0512 and no game code reads or writes past them"
   ],
   [
    53312,
    53375,
    "sprite block $41, the name entry's gunsight: blank as loaded, written by $0A57 from $0A7F"
   ],
   [
    65472,
    65535,
    "sprite block $FF, the blank block: $3E93 zeroes it before anything is shown, over a near copy of block $AC"
   ],
   [
    57344,
    58367,
    "the game's screen and sprite pointers, rewritten whole before play ($3F75, $4081); at the hand-over it still holds a copy of REMEMBER's last two menu lines ($7F60-$7FAF) at $E118-$E167"
   ]
  ],
  "extra": [
   [
    49152,
    51199,
    "character set"
   ],
   [
    24576,
    32607,
    "area 0's map, 200 rows of 40 characters, and the zeros after it"
   ],
   [
    32768,
    40959,
    "area 1's map and the zeros after it"
   ],
   [
    40960,
    49151,
    "area 3's map and the zeros after it"
   ],
   [
    49152,
    53247,
    "the character sets of areas 0 and 1"
   ],
   [
    58368,
    65471,
    "sprite blocks $90-$FE"
   ]
  ]
 },
 "blocks": [
  {
   "start": 0,
   "end": 2047,
   "type": "Undefined"
  },
  {
   "start": 2048,
   "end": 2108,
   "type": "Byte"
  },
  {
   "start": 2109,
   "end": 2127,
   "type": "PETSCII Text"
  },
  {
   "start": 2128,
   "end": 2637,
   "type": "Code"
  },
  {
   "start": 2638,
   "end": 2646,
   "type": "Byte"
  },
  {
   "start": 2647,
   "end": 2686,
   "type": "Code"
  },
  {
   "start": 2687,
   "end": 2749,
   "type": "Byte"
  },
  {
   "start": 2750,
   "end": 3336,
   "type": "Code"
  },
  {
   "start": 3337,
   "end": 3416,
   "type": "Byte"
  },
  {
   "start": 3417,
   "end": 3789,
   "type": "Code"
  },
  {
   "start": 3790,
   "end": 3911,
   "type": "Byte"
  },
  {
   "start": 3912,
   "end": 4075,
   "type": "Code"
  },
  {
   "start": 4076,
   "end": 4110,
   "type": "Byte"
  },
  {
   "start": 4111,
   "end": 4211,
   "type": "Code"
  },
  {
   "start": 4212,
   "end": 4250,
   "type": "Byte"
  },
  {
   "start": 4251,
   "end": 4418,
   "type": "Code"
  },
  {
   "start": 4419,
   "end": 4641,
   "type": "Byte"
  },
  {
   "start": 4642,
   "end": 4791,
   "type": "Code"
  },
  {
   "start": 4792,
   "end": 4885,
   "type": "Byte"
  },
  {
   "start": 4886,
   "end": 5130,
   "type": "Code"
  },
  {
   "start": 5131,
   "end": 5158,
   "type": "Byte"
  },
  {
   "start": 5159,
   "end": 5252,
   "type": "Code"
  },
  {
   "start": 5253,
   "end": 5300,
   "type": "Address"
  },
  {
   "start": 5301,
   "end": 5347,
   "type": "Code"
  },
  {
   "start": 5348,
   "end": 5563,
   "type": "Byte"
  },
  {
   "start": 5564,
   "end": 5630,
   "type": "Code"
  },
  {
   "start": 5631,
   "end": 5634,
   "type": "Address"
  },
  {
   "start": 5635,
   "end": 5904,
   "type": "Byte"
  },
  {
   "start": 5905,
   "end": 6026,
   "type": "Code"
  },
  {
   "start": 6027,
   "end": 7050,
   "type": "Byte"
  },
  {
   "start": 7051,
   "end": 7143,
   "type": "Code"
  },
  {
   "start": 7144,
   "end": 7199,
   "type": "Address"
  },
  {
   "start": 7200,
   "end": 7727,
   "type": "Byte"
  },
  {
   "start": 7728,
   "end": 7822,
   "type": "Code"
  },
  {
   "start": 7823,
   "end": 7824,
   "type": "Byte"
  },
  {
   "start": 7825,
   "end": 8720,
   "type": "Code"
  },
  {
   "start": 8721,
   "end": 8733,
   "type": "Byte"
  },
  {
   "start": 8734,
   "end": 9427,
   "type": "Code"
  },
  {
   "start": 9428,
   "end": 9509,
   "type": "Address"
  },
  {
   "start": 9510,
   "end": 9591,
   "type": "Byte"
  },
  {
   "start": 9592,
   "end": 9954,
   "type": "Code"
  },
  {
   "start": 9955,
   "end": 9989,
   "type": "Byte"
  },
  {
   "start": 9990,
   "end": 10177,
   "type": "Code"
  },
  {
   "start": 10178,
   "end": 10181,
   "type": "Byte"
  },
  {
   "start": 10182,
   "end": 10364,
   "type": "Code"
  },
  {
   "start": 10365,
   "end": 10372,
   "type": "Byte"
  },
  {
   "start": 10373,
   "end": 10547,
   "type": "Code"
  },
  {
   "start": 10548,
   "end": 10551,
   "type": "Byte"
  },
  {
   "start": 10552,
   "end": 10968,
   "type": "Code"
  },
  {
   "start": 10969,
   "end": 10970,
   "type": "Byte"
  },
  {
   "start": 10971,
   "end": 11017,
   "type": "Code"
  },
  {
   "start": 11018,
   "end": 11019,
   "type": "Byte"
  },
  {
   "start": 11020,
   "end": 11052,
   "type": "Code"
  },
  {
   "start": 11053,
   "end": 11054,
   "type": "Byte"
  },
  {
   "start": 11055,
   "end": 11426,
   "type": "Code"
  },
  {
   "start": 11427,
   "end": 11450,
   "type": "Byte"
  },
  {
   "start": 11451,
   "end": 11975,
   "type": "Code"
  },
  {
   "start": 11976,
   "end": 11980,
   "type": "Byte"
  },
  {
   "start": 11981,
   "end": 12051,
   "type": "Code"
  },
  {
   "start": 12052,
   "end": 12056,
   "type": "Byte"
  },
  {
   "start": 12057,
   "end": 12974,
   "type": "Code"
  },
  {
   "start": 12975,
   "end": 13006,
   "type": "Byte"
  },
  {
   "start": 13007,
   "end": 13590,
   "type": "Code"
  },
  {
   "start": 13591,
   "end": 13622,
   "type": "Byte"
  },
  {
   "start": 13623,
   "end": 13655,
   "type": "Code"
  },
  {
   "start": 13656,
   "end": 13679,
   "type": "Byte"
  },
  {
   "start": 13680,
   "end": 13784,
   "type": "Code"
  },
  {
   "start": 13785,
   "end": 13848,
   "type": "Byte"
  },
  {
   "start": 13849,
   "end": 13858,
   "type": "Address"
  },
  {
   "start": 13859,
   "end": 14036,
   "type": "Code"
  },
  {
   "start": 14037,
   "end": 14047,
   "type": "Byte"
  },
  {
   "start": 14048,
   "end": 14069,
   "type": "Code"
  },
  {
   "start": 14070,
   "end": 14078,
   "type": "Byte"
  },
  {
   "start": 14079,
   "end": 14251,
   "type": "Code"
  },
  {
   "start": 14252,
   "end": 14256,
   "type": "Byte"
  },
  {
   "start": 14257,
   "end": 15489,
   "type": "Code"
  },
  {
   "start": 15490,
   "end": 15521,
   "type": "Byte"
  },
  {
   "start": 15522,
   "end": 15537,
   "type": "Address"
  },
  {
   "start": 15538,
   "end": 15624,
   "type": "Code"
  },
  {
   "start": 15625,
   "end": 15657,
   "type": "Byte"
  },
  {
   "start": 15658,
   "end": 15761,
   "type": "Code"
  },
  {
   "start": 15762,
   "end": 15796,
   "type": "Byte"
  },
  {
   "start": 15797,
   "end": 16047,
   "type": "Code"
  },
  {
   "start": 16048,
   "end": 16079,
   "type": "Byte"
  },
  {
   "start": 16080,
   "end": 16087,
   "type": "Address"
  },
  {
   "start": 16088,
   "end": 16133,
   "type": "Byte"
  },
  {
   "start": 16134,
   "end": 16571,
   "type": "Code"
  },
  {
   "start": 16572,
   "end": 16615,
   "type": "Byte"
  },
  {
   "start": 16616,
   "end": 16802,
   "type": "Code"
  },
  {
   "start": 16803,
   "end": 16806,
   "type": "Byte"
  },
  {
   "start": 16807,
   "end": 17512,
   "type": "Code"
  },
  {
   "start": 17513,
   "end": 17631,
   "type": "Byte"
  },
  {
   "start": 17632,
   "end": 18014,
   "type": "Code"
  },
  {
   "start": 18015,
   "end": 18015,
   "type": "Byte"
  },
  {
   "start": 18016,
   "end": 18175,
   "type": "Screencode Text"
  },
  {
   "start": 18176,
   "end": 18191,
   "type": "Byte"
  },
  {
   "start": 18192,
   "end": 18389,
   "type": "Code"
  },
  {
   "start": 18390,
   "end": 18429,
   "type": "Byte"
  },
  {
   "start": 18430,
   "end": 18431,
   "type": "Address"
  },
  {
   "start": 18432,
   "end": 20431,
   "type": "Screencode Text"
  },
  {
   "start": 20432,
   "end": 20465,
   "type": "Code"
  },
  {
   "start": 20466,
   "end": 20479,
   "type": "Byte"
  },
  {
   "start": 20480,
   "end": 20607,
   "type": "Code"
  },
  {
   "start": 20608,
   "end": 20610,
   "type": "Byte"
  },
  {
   "start": 20611,
   "end": 20646,
   "type": "Code"
  },
  {
   "start": 20647,
   "end": 20649,
   "type": "Byte"
  },
  {
   "start": 20650,
   "end": 21543,
   "type": "Code"
  },
  {
   "start": 21544,
   "end": 21808,
   "type": "Byte"
  },
  {
   "start": 21809,
   "end": 21904,
   "type": "Code"
  },
  {
   "start": 21905,
   "end": 24331,
   "type": "Byte"
  },
  {
   "start": 24332,
   "end": 24436,
   "type": "Code"
  },
  {
   "start": 24437,
   "end": 24447,
   "type": "Byte"
  },
  {
   "start": 24448,
   "end": 24567,
   "type": "Screencode Text"
  },
  {
   "start": 24568,
   "end": 32607,
   "type": "Byte"
  },
  {
   "start": 32608,
   "end": 32687,
   "type": "Screencode Text"
  },
  {
   "start": 32688,
   "end": 32767,
   "type": "Undefined"
  },
  {
   "start": 32768,
   "end": 53311,
   "type": "Byte"
  },
  {
   "start": 53312,
   "end": 53375,
   "type": "Undefined"
  },
  {
   "start": 53376,
   "end": 57343,
   "type": "Byte"
  },
  {
   "start": 57344,
   "end": 58367,
   "type": "Undefined"
  },
  {
   "start": 58368,
   "end": 65471,
   "type": "Byte"
  },
  {
   "start": 65472,
   "end": 65535,
   "type": "Undefined"
  }
 ],
 "symbols": [
  {
   "address": 0,
   "name": "cpu_port_ddr",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1,
   "name": "cpu_port",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 2,
   "name": "rem_fade_saved_y",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 3,
   "name": "rem_fade_saved_x",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14,
   "name": "rem_docs_src",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 15,
   "name": "rem_docs_src_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 20,
   "name": "sort_gap_size",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 25,
   "name": "diag_walk_lo",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 26,
   "name": "diag_walk_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 34,
   "name": "spawn_x_ptr",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 35,
   "name": "spawn_x_ptr_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 36,
   "name": "spawn_rows_ptr",
   "type": "ZeroPagePointer",
   "kind": "user"
  },
  {
   "address": 37,
   "name": "spawn_rows_ptr_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 38,
   "name": "spawn_xhigh_ptr",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 39,
   "name": "spawn_xhigh_ptr_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 40,
   "name": "spawn_types_ptr",
   "type": "ZeroPagePointer",
   "kind": "user"
  },
  {
   "address": 41,
   "name": "spawn_types_ptr_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 42,
   "name": "terrain_ptr",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 43,
   "name": "terrain_ptr_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 61,
   "name": "sort_start",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 63,
   "name": "sort_j",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 65,
   "name": "sort_j_gap",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 75,
   "name": "sort_order",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 78,
   "name": "sort_order_3",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 83,
   "name": "sort_order_8",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 84,
   "name": "sort_order_9",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 85,
   "name": "sort_order_10",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 86,
   "name": "sort_order_11",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 87,
   "name": "sort_order_12",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 88,
   "name": "sort_order_13",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 89,
   "name": "sort_order_14",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 90,
   "name": "sort_order_15",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 93,
   "name": "mus_track_ptr",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 94,
   "name": "mus_track_ptr_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 95,
   "name": "mus_pattern_ptr",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 96,
   "name": "mus_pattern_ptr_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 157,
   "name": "kernal_msgflag",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 167,
   "name": "irq_temp",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 168,
   "name": "irq_sprite_reg",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 201,
   "name": "sort_limit",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 215,
   "name": "sort_count",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 247,
   "name": "hs_cell_ptr",
   "type": "ZeroPagePointer",
   "kind": "user"
  },
  {
   "address": 248,
   "name": "hs_cell_ptr_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 251,
   "name": "ptr_a",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 252,
   "name": "ptr_a_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 253,
   "name": "ptr_b",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 254,
   "name": "ptr_b_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 657,
   "name": "kernal_shift_mode",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 788,
   "name": "irq_vector",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 789,
   "name": "irq_vector_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 792,
   "name": "nmi_vector",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 793,
   "name": "nmi_vector_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1024,
   "name": "rng_state",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1025,
   "name": "rng_state_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1026,
   "name": "fine_scroll",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1027,
   "name": "map_top_row",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1028,
   "name": "scroll_step",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1029,
   "name": "map_page",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1030,
   "name": "raster_next",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1031,
   "name": "raster_next_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1034,
   "name": "frame_counter",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1035,
   "name": "irq_ticks",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1037,
   "name": "slot_xhi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1038,
   "name": "shot_xhi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1041,
   "name": "grenade_xhi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1042,
   "name": "enemy_xhi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1053,
   "name": "slot_x",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1054,
   "name": "shot_x",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1057,
   "name": "grenade_x",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1058,
   "name": "enemy_x",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1069,
   "name": "slot_y",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1070,
   "name": "shot_y",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1073,
   "name": "grenade_y",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1074,
   "name": "enemy_y",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1085,
   "name": "slot_behind",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1086,
   "name": "shot_behind",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1089,
   "name": "grenade_behind",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1090,
   "name": "enemy_behind",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1101,
   "name": "slot_colour",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1102,
   "name": "shot_colour",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1104,
   "name": "shot3_colour",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1105,
   "name": "grenade_colour",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1106,
   "name": "enemy_colour",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1117,
   "name": "slot_block",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1118,
   "name": "shot_block",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1121,
   "name": "grenade_block",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1122,
   "name": "enemy_block",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1133,
   "name": "slot_xspeed",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1134,
   "name": "shot_xspeed",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1137,
   "name": "grenade_xspeed",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1138,
   "name": "enemy_xspeed",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1149,
   "name": "slot_yspeed",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1150,
   "name": "shot_yspeed",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1153,
   "name": "grenade_yspeed",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1154,
   "name": "enemy_yspeed",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1165,
   "name": "slot_type",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1166,
   "name": "shot_type",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1169,
   "name": "grenade_type",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1170,
   "name": "enemy_behaviour",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1181,
   "name": "shot_count",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1184,
   "name": "grenade_count",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1185,
   "name": "enemy_param",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1196,
   "name": "enemy_heading",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1207,
   "name": "enemy_timer",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1218,
   "name": "sprite_y_copy",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1247,
   "name": "fire_repeat",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1248,
   "name": "joy_heading",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1249,
   "name": "player_facing",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1250,
   "name": "colour_bg",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1251,
   "name": "colour_mc1",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1252,
   "name": "colour_mc2",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1254,
   "name": "wait_count",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1255,
   "name": "enemy_calls",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1256,
   "name": "spawn_index",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1257,
   "name": "scroll_phase",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1258,
   "name": "recoil_flag",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1260,
   "name": "guards_shot",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1261,
   "name": "prisoner_slot",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1262,
   "name": "at_top_flag",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1263,
   "name": "gate_to_come",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1264,
   "name": "map_x",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1265,
   "name": "map_y",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1266,
   "name": "map_xhi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1267,
   "name": "area_counter",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1268,
   "name": "gate_alive",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1269,
   "name": "walkout_done",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1271,
   "name": "walkout_flag",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1272,
   "name": "score",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1273,
   "name": "score_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1277,
   "name": "life_flag_unused",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1279,
   "name": "grenades",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1280,
   "name": "lives",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1281,
   "name": "unused_0501",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1282,
   "name": "unused_0502",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1283,
   "name": "dying",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1284,
   "name": "fire_mask",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1285,
   "name": "hs_shot_flying",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1286,
   "name": "hs_name",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1295,
   "name": "hs_name_len",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1296,
   "name": "hs_letter",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1297,
   "name": "hs_flash_on",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1298,
   "name": "hs_flash_timer",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1536,
   "name": "rem_screen_row12",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1792,
   "name": "rem_screen_row19",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2048,
   "name": "unused_0800",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2109,
   "name": "rem_save_filename",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2128,
   "name": "game_start",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 2164,
   "name": "init_sort_order",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 2179,
   "name": "title_and_new_game",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 2232,
   "name": "area_start",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 2242,
   "name": "life_start",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 2251,
   "name": "main_loop",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 2295,
   "name": "main_loop_logic",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 2332,
   "name": "b_091C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2339,
   "name": "area_complete",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2361,
   "name": "next_area",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 2384,
   "name": "b_0950",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2387,
   "name": "death_sequence",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 2416,
   "name": "b_0970",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2424,
   "name": "b_0978",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2446,
   "name": "b_098E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2454,
   "name": "lose_life",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 2468,
   "name": "game_over_rank",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 2470,
   "name": "b_09A6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2491,
   "name": "hiscore_shift_down",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 2511,
   "name": "b_09CF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2543,
   "name": "b_09EF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2557,
   "name": "hiscore_place",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 2579,
   "name": "hiscore_name_slot",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 2591,
   "name": "b_0A1F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2603,
   "name": "hiscore_done",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 2619,
   "name": "b_0A3B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2634,
   "name": "b_0A4A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2635,
   "name": "hiscore_jmp_lo",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 2636,
   "name": "hiscore_jmp_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 2637,
   "name": "nmi_rti",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2638,
   "name": "cbm80_blanked",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2647,
   "name": "copy_gunsight_sprite",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 2663,
   "name": "b_0A67",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2687,
   "name": "spr_gunsight",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2750,
   "name": "hiscore_flash_letter",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 2788,
   "name": "b_0AE4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2794,
   "name": "b_0AEA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2799,
   "name": "b_0AEF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2809,
   "name": "r_0AF9",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 2810,
   "name": "hiscore_read_cell",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 2833,
   "name": "b_0B11",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2964,
   "name": "hiscore_entry_setup",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3043,
   "name": "b_0BE3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3082,
   "name": "hiscore_joystick",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3101,
   "name": "b_0C1D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3120,
   "name": "b_0C30",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3139,
   "name": "b_0C43",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3158,
   "name": "b_0C56",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3183,
   "name": "hiscore_snap",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3195,
   "name": "b_0C7B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3207,
   "name": "r_0C87",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 3208,
   "name": "hiscore_name_entry",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3257,
   "name": "hiscore_print_row",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 3259,
   "name": "j_0CBB",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 3281,
   "name": "b_0CD1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3302,
   "name": "b_0CE6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3305,
   "name": "b_0CE9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3308,
   "name": "hiscore_entry_loop",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 3337,
   "name": "txt_hiscore_grid",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3417,
   "name": "hiscore_shot",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3431,
   "name": "b_0D67",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3456,
   "name": "r_0D80",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 3457,
   "name": "hiscore_fire",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 3465,
   "name": "b_0D89",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3576,
   "name": "b_0DF8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3598,
   "name": "r_0E0E",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 3599,
   "name": "show_hiscore_table",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3614,
   "name": "b_0E1E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3675,
   "name": "b_0E5B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3680,
   "name": "wait_fire_hiscore",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 3688,
   "name": "print_rank",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3695,
   "name": "b_0E6F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3709,
   "name": "print_name",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3717,
   "name": "b_0E85",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3731,
   "name": "print_hiscore",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3790,
   "name": "txt_ranks",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3822,
   "name": "hiscore_names",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3830,
   "name": "hiscore_names_1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3894,
   "name": "hiscore_scores",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3895,
   "name": "hiscore_score0_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3896,
   "name": "hiscore_score1_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3897,
   "name": "hiscore_scores_1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3912,
   "name": "title_attract",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3938,
   "name": "title_logo_loop",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 4013,
   "name": "title_view_wait",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 4018,
   "name": "title_wait_fire",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 4075,
   "name": "r_0FEB",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 4076,
   "name": "title_logo_x",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4083,
   "name": "title_logo_xhigh",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4090,
   "name": "title_logo_blocks",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4097,
   "name": "attract_view_area",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4104,
   "name": "attract_view_row",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4111,
   "name": "player_touch_enemies",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4113,
   "name": "b_1011",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4182,
   "name": "touch_kill",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4206,
   "name": "touch_next_slot",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 4212,
   "name": "behaviour_kills_on_touch",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4251,
   "name": "spawn_scan_window",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4253,
   "name": "j_109D",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 4293,
   "name": "spawn_find_free_slot",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 4306,
   "name": "b_10D2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4340,
   "name": "spawn_scan_next",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 4344,
   "name": "spawn_scan_done",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 4348,
   "name": "print_title_credits",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4370,
   "name": "credits_row",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 4372,
   "name": "j_1114",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 4394,
   "name": "credits_newline",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 4415,
   "name": "b_113F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4418,
   "name": "r_1142",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 4419,
   "name": "txt_title_credits",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4642,
   "name": "area_message",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4653,
   "name": "b_122D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4720,
   "name": "b_1270",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4738,
   "name": "area_message_line1",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 4739,
   "name": "msg_line1_src",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 4740,
   "name": "msg_line1_src_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 4761,
   "name": "area_message_line2",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 4762,
   "name": "msg_line2_src",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 4763,
   "name": "msg_line2_src_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 4792,
   "name": "txt_area_messages",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 4802,
   "name": "txt_area_ordinal_1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4823,
   "name": "txt_area_ordinal_2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4870,
   "name": "txt_area_ordinals",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4874,
   "name": "txt_ordinal_next",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4886,
   "name": "clear_screen",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4906,
   "name": "b_132A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4936,
   "name": "wait_frames",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4943,
   "name": "add_score",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4963,
   "name": "extra_life_inc",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 4974,
   "name": "b_136E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4975,
   "name": "draw_score",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5027,
   "name": "draw_hiscore",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5079,
   "name": "draw_grenades",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5105,
   "name": "draw_lives",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5131,
   "name": "unused_copy_heights",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 5143,
   "name": "slot_park_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5144,
   "name": "slot_park_y_shots",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5148,
   "name": "slot_park_y_enemies",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5159,
   "name": "set_area_tables",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5253,
   "name": "area_spawn_x",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5254,
   "name": "area_spawn_x_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5261,
   "name": "area_spawn_rows",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5262,
   "name": "area_spawn_rows_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5269,
   "name": "area_spawn_xhigh",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5270,
   "name": "area_spawn_xhigh_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5277,
   "name": "area_spawn_types",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5278,
   "name": "area_spawn_types_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5285,
   "name": "area_terrain",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5286,
   "name": "area_terrain_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5293,
   "name": "stamp_sources",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5294,
   "name": "stamp_sources_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5301,
   "name": "stamp_map",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5316,
   "name": "b_14C4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5318,
   "name": "b_14C6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5319,
   "name": "stamp_src",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5320,
   "name": "stamp_src_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5343,
   "name": "b_14DF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5348,
   "name": "stamp_0",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5402,
   "name": "stamp_1",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5456,
   "name": "stamp_2",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5510,
   "name": "stamp_3",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5564,
   "name": "draw_gate",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5599,
   "name": "b_15DF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5601,
   "name": "b_15E1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5602,
   "name": "gate_src",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5603,
   "name": "gate_src_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5626,
   "name": "b_15FA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5630,
   "name": "r_15FE",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 5631,
   "name": "gate_pictures",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5632,
   "name": "gate_pictures_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5635,
   "name": "gate_picture_0",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5770,
   "name": "gate_picture_1",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5905,
   "name": "map_cell_at",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5926,
   "name": "b_1726",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6027,
   "name": "terrain_area0",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6283,
   "name": "terrain_area1",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6539,
   "name": "terrain_unused",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 6795,
   "name": "terrain_area3",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7051,
   "name": "spawn_on_row",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7062,
   "name": "b_1B96",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7067,
   "name": "b_1B9B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7077,
   "name": "b_1BA5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7087,
   "name": "b_1BAF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7122,
   "name": "b_1BD2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7144,
   "name": "spawn_handlers",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7145,
   "name": "spawn_handlers_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7200,
   "name": "spawn_rows_area0",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7241,
   "name": "spawn_x_area0",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7281,
   "name": "spawn_xhigh_area0",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7321,
   "name": "spawn_types_area0",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7361,
   "name": "spawn_rows_area1",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7394,
   "name": "spawn_x_area1",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7426,
   "name": "spawn_xhigh_area1",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7458,
   "name": "spawn_types_area1",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7490,
   "name": "spawn_rows_unused",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7516,
   "name": "spawn_x_unused",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7541,
   "name": "spawn_xhigh_unused",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7566,
   "name": "spawn_types_unused",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7591,
   "name": "spawn_rows_area3",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7626,
   "name": "spawn_x_area3",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7660,
   "name": "spawn_xhigh_area3",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7694,
   "name": "spawn_types_area3",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7728,
   "name": "spawn_nothing",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7729,
   "name": "spawn_mortar_man",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7738,
   "name": "spawn_sniper",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7747,
   "name": "spawn_gate_opens",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7752,
   "name": "spawn_door_left",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7765,
   "name": "spawn_door_right",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7775,
   "name": "spawn_door_common",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7823,
   "name": "jeep_start_x",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7825,
   "name": "spawn_jeep",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7887,
   "name": "spawn_lorry",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7935,
   "name": "b_1EFF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7946,
   "name": "spawn_lorry_back",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8001,
   "name": "spawn_vehicle_left",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8049,
   "name": "spawn_vehicle_right",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8051,
   "name": "b_1F73",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8062,
   "name": "b_1F7E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8163,
   "name": "spawn_bomber_right",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8191,
   "name": "spawn_bomber_left",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8216,
   "name": "spawn_bomber_common",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8245,
   "name": "spawn_bunker_gun_left",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8292,
   "name": "spawn_bunker_gun_right",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8339,
   "name": "spawn_green_soldier",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8408,
   "name": "spawn_grenadier_right",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8465,
   "name": "spawn_grenade_box",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8513,
   "name": "spawn_prisoner",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8562,
   "name": "spawn_guard",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8611,
   "name": "spawn_motorcycle",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8659,
   "name": "b_21D3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8670,
   "name": "spawn_motorcycle_back",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8721,
   "name": "unused_find_free_slot",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8734,
   "name": "spawn_trench_soldier",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8787,
   "name": "spawn_lying_soldier",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8843,
   "name": "spawn_foxhole",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8902,
   "name": "spawn_jumper_right",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8971,
   "name": "spawn_jumper_left",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9040,
   "name": "spawn_walker_left",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9063,
   "name": "spawn_walker_right",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9083,
   "name": "spawn_walker_common",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9134,
   "name": "spawn_grenadier_right2",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9191,
   "name": "enemy_hit",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9216,
   "name": "b_2400",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9229,
   "name": "enemy_hit_green",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9254,
   "name": "enemy_hit_guard",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9319,
   "name": "enemy_hit_lorry",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9330,
   "name": "b_2472",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9348,
   "name": "enemy_hit_dies",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9353,
   "name": "enemy_hit_stop",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9365,
   "name": "update_enemies",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9370,
   "name": "b_249A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9393,
   "name": "b_24B1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9396,
   "name": "b_24B4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9425,
   "name": "call_behaviour",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9428,
   "name": "behaviours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9429,
   "name": "behaviours_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9510,
   "name": "behaviour_hit_by",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9551,
   "name": "behaviour_points",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9592,
   "name": "beh_carried",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9593,
   "name": "beh_mortar_man",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9615,
   "name": "b_258F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9624,
   "name": "b_2598",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9638,
   "name": "mortar_fire",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9646,
   "name": "b_25AE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9681,
   "name": "r_25D1",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 9682,
   "name": "beh_sniper",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9691,
   "name": "beh_door",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9706,
   "name": "b_25EA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9724,
   "name": "r_25FC",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 9725,
   "name": "door_closed",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9731,
   "name": "door_let_out",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9738,
   "name": "b_260A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9749,
   "name": "b_2615",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9815,
   "name": "beh_jeep",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9836,
   "name": "b_266C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9842,
   "name": "b_2672",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9848,
   "name": "beh_lorry_front",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9849,
   "name": "beh_lorry_back",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9861,
   "name": "b_2685",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9872,
   "name": "b_2690",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9919,
   "name": "beh_vehicle_crossing",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9941,
   "name": "b_26D5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9954,
   "name": "r_26E2",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 9955,
   "name": "unused_26e3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9990,
   "name": "beh_bomber",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10030,
   "name": "b_272E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10037,
   "name": "r_2735",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 10038,
   "name": "bomber_throw",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10048,
   "name": "b_2740",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10059,
   "name": "b_274B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10156,
   "name": "b_27AC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10167,
   "name": "b_27B7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10178,
   "name": "bomber_frames",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10182,
   "name": "beh_bunker_gun",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10193,
   "name": "b_27D1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10203,
   "name": "b_27DB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10213,
   "name": "r_27E5",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 10214,
   "name": "b_27E6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10291,
   "name": "bunker_gun_right",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10306,
   "name": "beh_sinking",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10321,
   "name": "b_2851",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10325,
   "name": "b_2855",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10328,
   "name": "beh_foxhole",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10352,
   "name": "b_2870",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10362,
   "name": "b_287A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10365,
   "name": "foxhole_frames",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10373,
   "name": "enemy_lookahead",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10426,
   "name": "enemy_avoid_walls",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10443,
   "name": "b_28CB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10479,
   "name": "enemy_avoid_done",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10480,
   "name": "enemy_depth",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10501,
   "name": "r_2905",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 10502,
   "name": "beh_green_soldier",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10532,
   "name": "b_2924",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10548,
   "name": "green_soldier_frames",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10550,
   "name": "green_soldier_left",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 10552,
   "name": "beh_grenadier_stop",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10570,
   "name": "b_294A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10594,
   "name": "grenadier_raise",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10600,
   "name": "b_2968",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10608,
   "name": "grenadier_leave",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10621,
   "name": "grenadier_walk_frame",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10653,
   "name": "beh_grenadier",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10677,
   "name": "b_29B5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10687,
   "name": "grenadier_go",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10726,
   "name": "grenadier_walking",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10761,
   "name": "grenadier_terrain",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10774,
   "name": "beh_walker",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10823,
   "name": "walker_turn_down",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10842,
   "name": "beh_grenade_box",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10895,
   "name": "box_grenades",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10921,
   "name": "grenade_box_flash",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10934,
   "name": "b_2AB6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10940,
   "name": "beh_freed_prisoner",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10966,
   "name": "b_2AD6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10969,
   "name": "freed_prisoner_frames",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10971,
   "name": "beh_score_sprite",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10982,
   "name": "b_2AE6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10985,
   "name": "beh_prisoner",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11017,
   "name": "r_2B09",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 11018,
   "name": "prisoner_frames",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11020,
   "name": "beh_guard",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11052,
   "name": "r_2B2C",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 11053,
   "name": "guard_frames",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11055,
   "name": "beh_sidecar",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11103,
   "name": "b_2B5F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11114,
   "name": "b_2B6A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11139,
   "name": "r_2B83",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 11140,
   "name": "sidecar_moving",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11156,
   "name": "b_2B94",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11169,
   "name": "b_2BA1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11185,
   "name": "b_2BB1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11200,
   "name": "r_2BC0",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 11201,
   "name": "beh_trench_soldier",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11223,
   "name": "b_2BD7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11232,
   "name": "b_2BE0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11246,
   "name": "trench_climb_out",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11283,
   "name": "trench_lob",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11291,
   "name": "b_2C1B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11293,
   "name": "b_2C1D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11304,
   "name": "b_2C28",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11385,
   "name": "b_2C79",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11426,
   "name": "r_2CA2",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 11427,
   "name": "side_entry_tables",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11431,
   "name": "side_entry_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 11435,
   "name": "side_entry_xspeed",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 11439,
   "name": "side_entry_heading",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 11443,
   "name": "side_entry_block",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 11447,
   "name": "side_entry_xhigh",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 11451,
   "name": "beh_free_slot",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11459,
   "name": "b_2CC3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11481,
   "name": "b_2CD9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11501,
   "name": "b_2CED",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11528,
   "name": "gate_soldier_side",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11592,
   "name": "gate_soldier_area3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11619,
   "name": "ambient_soldier",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11678,
   "name": "soldier_common",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11706,
   "name": "soldier_colour",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11724,
   "name": "r_2DCC",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 11725,
   "name": "ambient_side",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11733,
   "name": "b_2DD5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11774,
   "name": "b_2DFE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11839,
   "name": "ambient_side_right",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11936,
   "name": "r_2EA0",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 11937,
   "name": "beh_enemy_grenade",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11951,
   "name": "b_2EAF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11975,
   "name": "r_2EC7",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 11976,
   "name": "enemy_grenade_frames",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11981,
   "name": "enemy_explode",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12012,
   "name": "r_2EEC",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 12013,
   "name": "beh_mortar_bomb",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 12027,
   "name": "b_2EFB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12051,
   "name": "r_2F13",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 12052,
   "name": "mortar_bomb_frames",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12057,
   "name": "beh_enemy_bullet",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 12104,
   "name": "r_2F48",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 12105,
   "name": "enemy_bullet_spark",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12129,
   "name": "beh_bomb",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 12140,
   "name": "b_2F6C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12143,
   "name": "beh_bullet_spark",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 12161,
   "name": "b_2F81",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12165,
   "name": "free_enemy_slot",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12196,
   "name": "beh_lying_soldier",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 12246,
   "name": "b_2FD6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12260,
   "name": "lying_soldier_fire",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12267,
   "name": "b_2FEB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12270,
   "name": "face_player_lying",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12286,
   "name": "b_2FFE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12299,
   "name": "j_300B",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 12312,
   "name": "b_3018",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12325,
   "name": "b_3025",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12338,
   "name": "b_3032",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12348,
   "name": "r_303C",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 12349,
   "name": "beh_jumper",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 12380,
   "name": "b_305C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12390,
   "name": "b_3066",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12424,
   "name": "jumper_in_air",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12434,
   "name": "b_3092",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12448,
   "name": "r_30A0",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 12449,
   "name": "jumper_lands",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12479,
   "name": "beh_risen_soldier",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 12523,
   "name": "b_30EB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12536,
   "name": "b_30F8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12553,
   "name": "r_3109",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 12554,
   "name": "aim_at_player",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12603,
   "name": "aim_below",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12606,
   "name": "aim_right",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12631,
   "name": "b_3157",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12637,
   "name": "b_315D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12643,
   "name": "aim_left",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12668,
   "name": "b_317C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12674,
   "name": "b_3182",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12680,
   "name": "aim_above",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12705,
   "name": "b_31A1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12711,
   "name": "b_31A7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12717,
   "name": "aim_below_side",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12742,
   "name": "b_31C6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12748,
   "name": "b_31CC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12754,
   "name": "beh_gate_soldier",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 12775,
   "name": "beh_rifle_soldier",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 12820,
   "name": "rifle_soldier_stands",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12825,
   "name": "rifle_soldier_moves",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12854,
   "name": "r_3236",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 12855,
   "name": "enemy_new_heading",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12880,
   "name": "b_3250",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12888,
   "name": "b_3258",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12907,
   "name": "j_326B",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 12925,
   "name": "b_327D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12938,
   "name": "heading_wander",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12952,
   "name": "b_3298",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12956,
   "name": "heading_set",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12975,
   "name": "heading_dx",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12991,
   "name": "heading_dy",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13007,
   "name": "enemy_throw",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13017,
   "name": "b_32D9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13027,
   "name": "enemy_throw_none",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13030,
   "name": "enemy_throw_launch",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13150,
   "name": "throw_left_below",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13167,
   "name": "throw_right",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13207,
   "name": "throw_right_below",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13210,
   "name": "throw_set_speed",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13234,
   "name": "enemy_fire",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13244,
   "name": "b_33BC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13254,
   "name": "enemy_fire_none",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13255,
   "name": "b_33C7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13268,
   "name": "b_33D4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13307,
   "name": "b_33FB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13310,
   "name": "fire_right",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13339,
   "name": "b_341B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13349,
   "name": "b_3425",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13359,
   "name": "fire_ok",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13362,
   "name": "fire_left",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13391,
   "name": "b_344F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13401,
   "name": "b_3459",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13411,
   "name": "fire_above",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13438,
   "name": "b_347E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13448,
   "name": "b_3488",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13458,
   "name": "fire_below",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13487,
   "name": "b_34AF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13497,
   "name": "b_34B9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13507,
   "name": "fire_bullet",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13591,
   "name": "bullet_dx",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13607,
   "name": "bullet_dy",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13623,
   "name": "divide_by_64",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13625,
   "name": "b_3539",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13635,
   "name": "beh_dying",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 13653,
   "name": "b_3555",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13656,
   "name": "dying_frames",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13680,
   "name": "free_enemy",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13711,
   "name": "video_setup",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13744,
   "name": "turn_player_facing",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13773,
   "name": "turn_player_step",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 13776,
   "name": "b_35D0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13785,
   "name": "player_bullet_dx",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13801,
   "name": "player_bullet_dy",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13817,
   "name": "muzzle_dx",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13833,
   "name": "muzzle_dy",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13849,
   "name": "shot_routines",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13850,
   "name": "shot_routines_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13859,
   "name": "update_shots",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13861,
   "name": "b_3625",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13884,
   "name": "b_363C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13887,
   "name": "b_363F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13913,
   "name": "call_shot",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13916,
   "name": "shot_grenade",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 13935,
   "name": "b_366F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13958,
   "name": "b_3686",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14004,
   "name": "r_36B4",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 14005,
   "name": "grenade_lands",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14037,
   "name": "grenade_frames",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14043,
   "name": "throw_frames",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14048,
   "name": "shot_spark",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14066,
   "name": "b_36F2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14070,
   "name": "spark_frames",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14079,
   "name": "free_shot",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 14110,
   "name": "shot_blast",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14115,
   "name": "b_3723",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14194,
   "name": "b_3772",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14197,
   "name": "blast_next",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14219,
   "name": "blast_over",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14252,
   "name": "blast_frames",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14257,
   "name": "bunker_destroyed",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14371,
   "name": "bunker_done",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14378,
   "name": "bunker_destroyed_fixed",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14445,
   "name": "beh_explosion",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14465,
   "name": "b_3881",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14501,
   "name": "throw_grenade",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 14516,
   "name": "b_38B4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14601,
   "name": "throw_cost",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14614,
   "name": "throw_grenade_done",
   "type": "Return",
   "kind": "user"
  },
  {
   "address": 14615,
   "name": "shot_bullet",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14628,
   "name": "b_3924",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14630,
   "name": "b_3926",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14705,
   "name": "bullet_next",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14757,
   "name": "b_39A5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14763,
   "name": "bullet_to_spark",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14787,
   "name": "shot_ready",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14802,
   "name": "b_39D2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14887,
   "name": "shot_ready_done",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14888,
   "name": "fire_released",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14894,
   "name": "area_won",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 14907,
   "name": "area_walk",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 14939,
   "name": "area_walk_left",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 14957,
   "name": "area_walk_up",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 14980,
   "name": "b_3A84",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 14988,
   "name": "player_control",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15006,
   "name": "b_3A9E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15054,
   "name": "b_3ACE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15069,
   "name": "b_3ADD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15074,
   "name": "player_down",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 15098,
   "name": "player_left",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 15122,
   "name": "b_3B12",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15127,
   "name": "player_right",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 15151,
   "name": "b_3B2F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15156,
   "name": "player_diagonals",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 15180,
   "name": "b_3B4C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15199,
   "name": "b_3B5F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15218,
   "name": "b_3B72",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15237,
   "name": "b_3B85",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15246,
   "name": "player_animate",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 15278,
   "name": "player_terrain",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 15322,
   "name": "b_3BDA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15376,
   "name": "player_falls",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15455,
   "name": "player_depth",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 15467,
   "name": "player_in_front",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 15473,
   "name": "player_blocked",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 15489,
   "name": "r_3C81",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 15490,
   "name": "walk_frames",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15494,
   "name": "walk_frames_down",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 15498,
   "name": "walk_frames_left",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 15502,
   "name": "walk_frames_right",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 15506,
   "name": "walk_frames_downright",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 15510,
   "name": "walk_frames_downleft",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 15514,
   "name": "walk_frames_upright",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 15518,
   "name": "walk_frames_upleft",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 15522,
   "name": "walk_frame_ptrs",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15523,
   "name": "walk_frame_ptrs_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15538,
   "name": "ending",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15543,
   "name": "b_3CB7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15592,
   "name": "ending_flicker",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 15594,
   "name": "b_3CEA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15611,
   "name": "b_3CFB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15625,
   "name": "ending_x",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15636,
   "name": "ending_xhigh",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15647,
   "name": "ending_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15658,
   "name": "move_sprites",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15683,
   "name": "move_player_y",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 15702,
   "name": "move_slot",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 15738,
   "name": "move_slot_y",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 15756,
   "name": "move_next",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 15762,
   "name": "unused_3d92",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15797,
   "name": "clear_slots",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15799,
   "name": "b_3DB7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15840,
   "name": "life_reset",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15907,
   "name": "restart_row",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 15918,
   "name": "b_3E2E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 16019,
   "name": "blank_block_ff",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 16047,
   "name": "r_3EAF",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 16048,
   "name": "area_map_pages",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16052,
   "name": "fire_masks",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16060,
   "name": "restart_rows",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16065,
   "name": "restart_rows_area1",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 16075,
   "name": "restart_rows_area3",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 16080,
   "name": "restart_lists",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16081,
   "name": "restart_lists_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16088,
   "name": "unused_bubble_sort",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16134,
   "name": "sort_sprites",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 16142,
   "name": "sort_gap",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 16162,
   "name": "sort_pass",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 16168,
   "name": "sort_compare",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 16230,
   "name": "sort_next",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 16244,
   "name": "sort_done",
   "type": "Return",
   "kind": "user"
  },
  {
   "address": 16245,
   "name": "draw_playfield",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 16316,
   "name": "draw_row",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 16318,
   "name": "b_3FBE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 16319,
   "name": "draw_row_src",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 16320,
   "name": "draw_row_src_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 16322,
   "name": "draw_row_dst",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 16323,
   "name": "draw_row_dst_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 16341,
   "name": "b_3FD5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 16355,
   "name": "b_3FE3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 16360,
   "name": "random",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 16383,
   "name": "seed_random",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 16396,
   "name": "wait_frame",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 16399,
   "name": "b_400F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 16405,
   "name": "colour_playfield",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 16423,
   "name": "colour_fill",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 16447,
   "name": "b_403F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 16457,
   "name": "build_play_screen",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 16513,
   "name": "hud_copy",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 16572,
   "name": "area_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16576,
   "name": "txt_hud",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16616,
   "name": "start_irqs",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 16662,
   "name": "irq_entry",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16665,
   "name": "irq_bottom",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16676,
   "name": "b_4124",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 16746,
   "name": "irq_score",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16803,
   "name": "unused_41a3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16807,
   "name": "irq_top",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16862,
   "name": "irq_top_sprite",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16998,
   "name": "irq_middle",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17259,
   "name": "irq_lower",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17513,
   "name": "sprite_bits",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17514,
   "name": "sprite_bit_1",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 17515,
   "name": "sprite_bit_2",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 17516,
   "name": "sprite_bit_3",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 17517,
   "name": "sprite_bit_4",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 17518,
   "name": "sprite_bit_5",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 17519,
   "name": "sprite_bit_6",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 17520,
   "name": "sprite_bit_7",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 17521,
   "name": "sprite_bits_clear",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17529,
   "name": "stale_irq_copy",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17615,
   "name": "unused_44cf",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17632,
   "name": "rem_save_hiscores",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 17663,
   "name": "rem_save_file",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 17668,
   "name": "rem_save_clear_sid",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 17713,
   "name": "rem_menu",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 17734,
   "name": "b_4546",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 17745,
   "name": "b_4551",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 17765,
   "name": "b_4565",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 17774,
   "name": "b_456E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 17788,
   "name": "rem_menu_trainer",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 17800,
   "name": "b_4588",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 17809,
   "name": "b_4591",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 17828,
   "name": "rem_ask_grenades",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 17830,
   "name": "b_45A6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 17839,
   "name": "b_45AF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 17858,
   "name": "rem_ask_holes",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 17860,
   "name": "b_45C4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 17869,
   "name": "b_45CD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 17882,
   "name": "b_45DA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 17892,
   "name": "rem_ask_collision",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 17894,
   "name": "b_45E6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 17903,
   "name": "b_45EF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 17916,
   "name": "b_45FC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 17926,
   "name": "rem_ask_skip",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 17928,
   "name": "b_4608",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 17937,
   "name": "b_4611",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 17953,
   "name": "rem_ask_load",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 17955,
   "name": "b_4623",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 17964,
   "name": "b_462C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 17981,
   "name": "rem_load_hiscores",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 18015,
   "name": "rem_unused_465f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18016,
   "name": "rem_txt_banner",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18136,
   "name": "rem_txt_lives",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18176,
   "name": "rem_unused_4700",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18192,
   "name": "rem_docs",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18211,
   "name": "rem_docs_first_page",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 18220,
   "name": "b_472C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 18235,
   "name": "rem_docs_page",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 18240,
   "name": "b_4740",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 18247,
   "name": "b_4747",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 18259,
   "name": "b_4753",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 18271,
   "name": "b_475F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 18283,
   "name": "b_476B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 18308,
   "name": "b_4784",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 18323,
   "name": "b_4793",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 18352,
   "name": "rem_docs_fade",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 18354,
   "name": "b_47B2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 18362,
   "name": "b_47BA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 18372,
   "name": "b_47C4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 18390,
   "name": "rem_fade_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18414,
   "name": "rem_unused_47ee",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18430,
   "name": "rem_docs_end",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 18431,
   "name": "rem_docs_end_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 18432,
   "name": "rem_docs_page1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 19432,
   "name": "rem_docs_page2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20432,
   "name": "rem_docs_key",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 20440,
   "name": "rem_docs_to_menu",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 20466,
   "name": "rem_unused_4ff2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20480,
   "name": "music_start_tune",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 20483,
   "name": "music_stop",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20486,
   "name": "effects_on",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 20489,
   "name": "effects_off",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20492,
   "name": "effect_cut",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20495,
   "name": "sound_effect",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 20498,
   "name": "music_play",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20515,
   "name": "b_5023",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 20536,
   "name": "music_stopped",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20559,
   "name": "b_504F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 20562,
   "name": "music_voices",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20575,
   "name": "voice_frame",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20611,
   "name": "voice_between_ticks",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20614,
   "name": "voice_next_entry",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20633,
   "name": "track_restart",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20650,
   "name": "voice_new_note",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20711,
   "name": "note_instrument",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20714,
   "name": "note_read_pitch",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20717,
   "name": "note_pitch",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20760,
   "name": "note_rest",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20763,
   "name": "note_instrument_regs",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20820,
   "name": "note_done",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20849,
   "name": "note_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20852,
   "name": "voice_release",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20860,
   "name": "voice_release_test",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20891,
   "name": "voice_effects",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20899,
   "name": "b_51A3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 20940,
   "name": "vibrato_position",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20964,
   "name": "vibrato_step",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21000,
   "name": "vibrato_add",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21025,
   "name": "vibrato_write",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21040,
   "name": "voice_pulse",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21068,
   "name": "pulse_sweep",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21125,
   "name": "pulse_down",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21148,
   "name": "pulse_write",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21171,
   "name": "voice_slide",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21218,
   "name": "slide_up",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21242,
   "name": "voice_drum",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21291,
   "name": "drum_noise",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21299,
   "name": "drum_write",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21302,
   "name": "voice_rise",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21342,
   "name": "voice_octaves",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21365,
   "name": "octave_base",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21368,
   "name": "octave_write",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21391,
   "name": "voice_next",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21404,
   "name": "voice_lend",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21413,
   "name": "effects_play",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21428,
   "name": "effects_done",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21429,
   "name": "b_53B5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 21434,
   "name": "effect_count",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21455,
   "name": "effect_stop",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21470,
   "name": "effect_step",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21494,
   "name": "effect_voice2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21512,
   "name": "effect_gates",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21528,
   "name": "effect_gate2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21541,
   "name": "effect_done",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21544,
   "name": "note_freqs",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21545,
   "name": "note_freqs_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21546,
   "name": "note_freqs_next",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21547,
   "name": "note_freqs_next_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21736,
   "name": "voice_regs",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21739,
   "name": "mus_voice_reg",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21740,
   "name": "mus_track_pos",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21743,
   "name": "mus_pattern_pos",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21746,
   "name": "mus_note_count",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21749,
   "name": "mus_note_len",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21752,
   "name": "mus_waveform",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21755,
   "name": "mus_note",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21758,
   "name": "mus_instrument",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21761,
   "name": "mus_gate_mask",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21762,
   "name": "mus_len_byte",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21763,
   "name": "mus_freq_lo",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21764,
   "name": "mus_temp",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21765,
   "name": "mus_wave_temp",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21766,
   "name": "mus_vib_depth",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21767,
   "name": "mus_pulse_speed",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21768,
   "name": "mus_vib_step",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21769,
   "name": "mus_vib_step_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21770,
   "name": "mus_vib_freq",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21771,
   "name": "mus_vib_freq_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21772,
   "name": "mus_vib_pos",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21773,
   "name": "mus_pulse_count",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21776,
   "name": "mus_pulse_dir",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21779,
   "name": "mus_tempo_count",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21780,
   "name": "tune_speeds",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21783,
   "name": "mus_speed",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21784,
   "name": "mus_instr_ofs",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21785,
   "name": "mus_state",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21786,
   "name": "mus_freq_hi",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21789,
   "name": "mus_freq_lo2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21792,
   "name": "mus_slide",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21795,
   "name": "mus_fx",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21796,
   "name": "mus_pulse_step",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21797,
   "name": "mus_frames",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21798,
   "name": "fx_off",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21799,
   "name": "fx_request",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21800,
   "name": "mus_sid_ok",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21801,
   "name": "fx_note",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21802,
   "name": "fx_count",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21803,
   "name": "fx_end_note",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21804,
   "name": "fx_interval",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21805,
   "name": "fx_flags",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21806,
   "name": "fx_wave1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21807,
   "name": "fx_wave2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21808,
   "name": "fx_mode",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21809,
   "name": "effect_setup",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21876,
   "name": "effect_copy_regs",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21901,
   "name": "effect_set_direction",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21905,
   "name": "instruments",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21906,
   "name": "ins_pulse_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21907,
   "name": "ins_waveform",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21908,
   "name": "ins_attack_decay",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21909,
   "name": "ins_sustain_release",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21910,
   "name": "ins_vibrato",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21911,
   "name": "ins_pulse_step",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21912,
   "name": "ins_effects",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22009,
   "name": "effects",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22010,
   "name": "fx_start_note",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22014,
   "name": "fx_waveform_1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22017,
   "name": "fx_flags_byte",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22021,
   "name": "fx_waveform_2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22024,
   "name": "fx_end_note_byte",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22265,
   "name": "mus_tracks",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22268,
   "name": "mus_tracks_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22271,
   "name": "tune_tracks",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22289,
   "name": "pattern_lo",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22334,
   "name": "pattern_hi",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22379,
   "name": "track_t0v0",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22444,
   "name": "track_t0v1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22508,
   "name": "track_t0v2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22632,
   "name": "track_t1v0",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22642,
   "name": "track_t1v1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22644,
   "name": "track_t1v2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22654,
   "name": "track_t2v0",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22657,
   "name": "track_t2v1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22660,
   "name": "track_t2v2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22663,
   "name": "pattern_00",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22665,
   "name": "pattern_07",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22778,
   "name": "pattern_08",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22849,
   "name": "pattern_10",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22920,
   "name": "pattern_09",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22994,
   "name": "pattern_12",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23078,
   "name": "pattern_15",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23133,
   "name": "pattern_16",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23155,
   "name": "pattern_17",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23185,
   "name": "pattern_18",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23245,
   "name": "pattern_19",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23281,
   "name": "pattern_20",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23317,
   "name": "pattern_21",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23353,
   "name": "pattern_22",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23389,
   "name": "pattern_23",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23421,
   "name": "pattern_24",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23453,
   "name": "pattern_25",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23482,
   "name": "pattern_26",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23626,
   "name": "pattern_27",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23672,
   "name": "pattern_28",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23697,
   "name": "pattern_29",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23722,
   "name": "pattern_30",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23747,
   "name": "pattern_31",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23757,
   "name": "pattern_01",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23779,
   "name": "pattern_02",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23801,
   "name": "pattern_03",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23823,
   "name": "pattern_04",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23845,
   "name": "pattern_05",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23867,
   "name": "pattern_06",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23889,
   "name": "pattern_11",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23911,
   "name": "pattern_13",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23933,
   "name": "pattern_14",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23955,
   "name": "pattern_32",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23988,
   "name": "pattern_33",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24021,
   "name": "pattern_34",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24054,
   "name": "pattern_35",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24087,
   "name": "pattern_36",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24105,
   "name": "pattern_37",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24116,
   "name": "pattern_38",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24125,
   "name": "pattern_39",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24156,
   "name": "pattern_40",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24191,
   "name": "pattern_41",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24209,
   "name": "pattern_42",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24250,
   "name": "pattern_43",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24291,
   "name": "pattern_44",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24332,
   "name": "start_tune",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 24352,
   "name": "b_5F20",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 24386,
   "name": "stop_tune",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24392,
   "name": "effects_on_entry",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 24398,
   "name": "effects_off_entry",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24406,
   "name": "request_effect",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 24415,
   "name": "request_effect_on",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 24426,
   "name": "rem_key_hook",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 24429,
   "name": "rem_skip_opcode",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 24431,
   "name": "rem_skip_test",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24434,
   "name": "rem_skip_area",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24437,
   "name": "rem_unused_5f75",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24448,
   "name": "rem_txt_grenades",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24488,
   "name": "rem_txt_holes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24528,
   "name": "rem_txt_collision",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24568,
   "name": "rem_unused_5ff8",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24576,
   "name": "map_area0_rows_000",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25576,
   "name": "map_area0_rows_025",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26576,
   "name": "map_area0_rows_050",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27576,
   "name": "map_area0_rows_075",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28576,
   "name": "map_area0_rows_100",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29576,
   "name": "map_area0_rows_125",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30576,
   "name": "map_area0_rows_150",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31576,
   "name": "map_area0_rows_175",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32576,
   "name": "map_area0_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32608,
   "name": "rem_txt_skip",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 32648,
   "name": "rem_txt_load",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 32768,
   "name": "map_area1_rows_000",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33768,
   "name": "map_area1_rows_025",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34768,
   "name": "map_area1_rows_050",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35768,
   "name": "map_area1_rows_075",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36768,
   "name": "map_area1_rows_100",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 37768,
   "name": "map_area1_rows_125",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38768,
   "name": "map_area1_rows_150",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39768,
   "name": "map_area1_rows_175",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40768,
   "name": "map_area1_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40960,
   "name": "map_area3_rows_000",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 41960,
   "name": "map_area3_rows_025",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42960,
   "name": "map_area3_rows_050",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 43960,
   "name": "map_area3_rows_075",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 44960,
   "name": "map_area3_rows_100",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 45960,
   "name": "map_area3_rows_125",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 46960,
   "name": "map_area3_rows_150",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 47960,
   "name": "map_area3_rows_175",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 48960,
   "name": "map_area3_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 49152,
   "name": "charset_area0_lo",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50176,
   "name": "charset_area0_hi",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 51200,
   "name": "charset_area1_lo",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 52224,
   "name": "charset_area1_hi",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 53248,
   "name": "charset_text_lo",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 53312,
   "name": "f_D040",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 53376,
   "name": "charset_text_glyphs",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 54272,
   "name": "charset_text_hi",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55296,
   "name": "charset_area3_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 55336,
   "name": "colour_row1_rem",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 55376,
   "name": "colour_row2_rem",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 55552,
   "name": "colour_rem_docs_1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 55706,
   "name": "colour_msg_line1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 55785,
   "name": "colour_msg_line2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 55808,
   "name": "colour_rem_docs_2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 56064,
   "name": "colour_rem_docs_3",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 56136,
   "name": "colour_score_row",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 56216,
   "name": "colour_row23",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 56320,
   "name": "charset_area3_hi",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57479,
   "name": "f_E087",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 57754,
   "name": "f_E19A",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 57833,
   "name": "f_E1E9",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 58184,
   "name": "f_E348",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 58190,
   "name": "a_E34E",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 58191,
   "name": "a_E34F",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 58192,
   "name": "a_E350",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 58193,
   "name": "a_E351",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 58201,
   "name": "a_E359",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 58202,
   "name": "a_E35A",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 58209,
   "name": "a_E361",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 58210,
   "name": "a_E362",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 58218,
   "name": "a_E36A",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 58219,
   "name": "a_E36B",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 58220,
   "name": "a_E36C",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 58221,
   "name": "a_E36D",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 58264,
   "name": "f_E398",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 58360,
   "name": "f_E3F8",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 58361,
   "name": "a_E3F9",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 58362,
   "name": "a_E3FA",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 58363,
   "name": "a_E3FB",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 58364,
   "name": "a_E3FC",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 58365,
   "name": "a_E3FD",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 58366,
   "name": "a_E3FE",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 58367,
   "name": "a_E3FF",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 58368,
   "name": "sprites_shots",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58692,
   "name": "kernal_clear_screen",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 58880,
   "name": "sprites_walk",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59648,
   "name": "sprites_walk_up",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60160,
   "name": "sprites_logo_o",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60416,
   "name": "sprites_vehicles",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60928,
   "name": "sprites_misc",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61440,
   "name": "sprites_people",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61952,
   "name": "sprites_lying",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62464,
   "name": "sprites_soldiers",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63488,
   "name": "sprites_throwers",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64512,
   "name": "sprites_scenery",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64816,
   "name": "kernal_vectors",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 65466,
   "name": "KERNAL_SETLFS",
   "type": "Predefined",
   "kind": "system"
  },
  {
   "address": 65469,
   "name": "KERNAL_SETNAM",
   "type": "Predefined",
   "kind": "system"
  },
  {
   "address": 65472,
   "name": "KERNAL_OPEN",
   "type": "Predefined",
   "kind": "system"
  },
  {
   "address": 65493,
   "name": "KERNAL_LOAD",
   "type": "Predefined",
   "kind": "system"
  },
  {
   "address": 65496,
   "name": "KERNAL_SAVE",
   "type": "Predefined",
   "kind": "system"
  },
  {
   "address": 65508,
   "name": "KERNAL_GETIN",
   "type": "Predefined",
   "kind": "system"
  }
 ],
 "comments": [
  {
   "address": 0,
   "type": "line",
   "text": "The processor port's direction register, which the game leaves as the KERNAL set it. It has a symbol only because draw_row's LDA and STA ($3FBE, $3FC1) name $0000,Y as loaded; the redraw ($3F75) writes both operands before the first row is copied. In the 1985 release a reset restarts the game through its signature at $8000 before the KERNAL sets this register, so it stays 0 and the game's writes to $01 change nothing ($0A57)."
  },
  {
   "address": 1,
   "type": "line",
   "text": "The processor port. The game banks BASIC out at its start ($358F), so it reads $36 in play with the KERNAL and I/O in, and changes it twice more: it clears CHAREN while it copies the gunsight into the RAM under the I/O area ($0A5F-$0A74), and clears HIRAM while it reads the letter under the gunsight from the screen at $E000, beneath the KERNAL ROM ($0B7F-$0B90). REMEMBER's saver writes $37 back ($44FC)."
  },
  {
   "address": 2,
   "type": "line",
   "text": "REMEMBER's fade ($47B0) keeps Y here through its delay loop ($47B2, $47C2)."
  },
  {
   "address": 3,
   "type": "line",
   "text": "REMEMBER's fade keeps X here through the same delay loop ($47B4, $47C0)."
  },
  {
   "address": 14,
   "type": "line",
   "text": "The instructions viewer's source pointer ($0E/$0F), low byte: zero at the first page ($4729); the page is copied from ($0E),Y ($4747-$476B)."
  },
  {
   "address": 15,
   "type": "line",
   "text": "The viewer's source pointer, high byte: $48 at the first page ($4725), stepped as the page is copied ($4751-$4769), and compared with $4F to start the instructions again ($47A1)."
  },
  {
   "address": 20,
   "type": "line",
   "text": "The Shell sort's gap ($3F06): set to 15, then halved to 7, 3 and 1."
  },
  {
   "address": 25,
   "type": "line",
   "text": "The low byte of a walk table address that each diagonal stores ($3B44-$3B7D): $9A, $92, $96 or $9E. Nothing reads it."
  },
  {
   "address": 26,
   "type": "line",
   "text": "The high byte stored with it, always $3C. Nothing reads it either."
  },
  {
   "address": 34,
   "type": "line",
   "text": "Pointer to the area's spawn-list x column ($22/$23, from area_spawn_x at each life's start, $1449), read as ($22),Y by the spawn handlers. For a walker who comes in from the side it holds instead the time before he turns down ($23A8)."
  },
  {
   "address": 35,
   "type": "line",
   "text": "The x column pointer's high byte ($144F)."
  },
  {
   "address": 36,
   "type": "line",
   "text": "Pointer to the spawn list's trigger rows ($24/$25, from area_spawn_rows, $143D), read by the spawner ($1B8E), by the placement at each life's start ($109D, $10DC) and by three handlers that set a soldier's y from his trigger row ($22CC, $2311, $239D)."
  },
  {
   "address": 37,
   "type": "line",
   "text": "The trigger rows pointer's high byte ($1443)."
  },
  {
   "address": 38,
   "type": "line",
   "text": "Pointer to the spawn list's x-high column ($26/$27, from area_spawn_xhigh, $1455), read as ($26),Y by the handlers that place a sprite across the screen's 256-pixel line, such as the door ($1E71). The walkers' handler reads the same column as the map row a walker enters on ($239A)."
  },
  {
   "address": 39,
   "type": "line",
   "text": "The x-high column pointer's high byte ($145B)."
  },
  {
   "address": 40,
   "type": "line",
   "text": "Pointer to the spawn list's handler numbers ($28/$29, from area_spawn_types, $1461), read at $10B3 and $1BD5."
  },
  {
   "address": 41,
   "type": "line",
   "text": "The handler numbers pointer's high byte ($1467)."
  },
  {
   "address": 42,
   "type": "line",
   "text": "Pointer to the area's terrain table ($2A/$2B, from area_terrain, $146D): a byte for each character, bit 0 a wall, bit 1 scenery the sprites pass behind, bit 2 water or a hole. Read as ($2A),Y wherever the map is tested."
  },
  {
   "address": 43,
   "type": "line",
   "text": "The terrain table pointer's high byte ($1473)."
  },
  {
   "address": 61,
   "type": "line",
   "text": "The Shell sort's start position for the pass ($3F1F-$3F6C)."
  },
  {
   "address": 63,
   "type": "line",
   "text": "The sort position being compared, stepped back by the gap while it swaps ($3F25-$3F61)."
  },
  {
   "address": 65,
   "type": "line",
   "text": "The position one gap beyond $3F ($3F2F-$3F49)."
  },
  {
   "address": 75,
   "type": "line",
   "text": "The sprite order, slot numbers sorted by y, top first ($3F06): seventeen bytes from here to $5B, filled with 0-16 at the start ($0874). Positions 0-7 go to hardware sprites 7-0 in the top band ($41DE); $4B-$4D here are positions 0-2."
  },
  {
   "address": 78,
   "type": "line",
   "text": "Positions 3-7 of the sort order ($4E-$52). The top band reads position 3 again to time the next interrupt, at its slot's y + $14 ($423D)."
  },
  {
   "address": 83,
   "type": "line",
   "text": "Position 8: the slot the second band ($4266) puts in hardware sprite 7."
  },
  {
   "address": 84,
   "type": "line",
   "text": "Position 9: the second band's sprite 6 ($42A9)."
  },
  {
   "address": 85,
   "type": "line",
   "text": "Position 10: the second band's sprite 5 ($42DC)."
  },
  {
   "address": 86,
   "type": "line",
   "text": "Position 11: the second band's sprite 4 ($430F)."
  },
  {
   "address": 87,
   "type": "line",
   "text": "Position 12: its slot's y, less 2, times the third band ($4342), which puts it in hardware sprite 3 ($437B)."
  },
  {
   "address": 88,
   "type": "line",
   "text": "Position 13: the third band's sprite 2 ($43AE)."
  },
  {
   "address": 89,
   "type": "line",
   "text": "Position 14: the third band's sprite 1 ($43E1)."
  },
  {
   "address": 90,
   "type": "line",
   "text": "Position 15: the third band's sprite 0 ($4414). The seventeenth byte, $5B, is filled at the start and never read."
  },
  {
   "address": 93,
   "type": "line",
   "text": "The music's track pointer ($5D/$5E) for the voice being played, from mus_tracks ($5071); read as ($5D),Y for the next pattern ($5089)."
  },
  {
   "address": 94,
   "type": "line",
   "text": "The track pointer's high byte ($5076)."
  },
  {
   "address": 95,
   "type": "line",
   "text": "The music's pattern pointer ($5F/$60), read as ($5F),Y for the notes and their instruments ($50C2-$5163)."
  },
  {
   "address": 96,
   "type": "line",
   "text": "The pattern pointer's high byte ($50B3)."
  },
  {
   "address": 157,
   "type": "line",
   "text": "The KERNAL's message flag: REMEMBER zeroes it before its save ($4501) and its load ($4653), so the KERNAL prints no SAVING or LOADING."
  },
  {
   "address": 167,
   "type": "line",
   "text": "The top band's scratch byte ($41A7): the fine scroll, inverted, on its way into $D011; then the count of sprites placed, 0-8 ($41DB-$4225); then the character set bits for $D018, the area counter's low two bits times two ($422F)."
  },
  {
   "address": 168,
   "type": "line",
   "text": "The top band's sprite register offset, 14 down to 0 in twos ($41D6-$421C); halved, it is the hardware sprite's number."
  },
  {
   "address": 201,
   "type": "line",
   "text": "The last start position for a pass of the sort: 15 less the gap ($3F1A, $3F69)."
  },
  {
   "address": 215,
   "type": "line",
   "text": "The sort's last position, 15 ($3F0B), from which the limit is worked out ($3F13)."
  },
  {
   "address": 247,
   "type": "line",
   "text": "The name entry's pointer to the screen cell under the gunsight ($F7/$F8), where the flashing letter is written ($0AE1-$0AF7) and put back when a shot leaves ($0DC5)."
  },
  {
   "address": 248,
   "type": "line",
   "text": "The gunsight cell pointer's high byte ($0B7B, $0BFB)."
  },
  {
   "address": 251,
   "type": "line",
   "text": "The game's general pointer ($FB/$FC), also used alone as a scratch byte: a screen or map address, a table's entry ($3E18), the x-distance in the aiming code ($331B), an indirect jump's target ($24D1, $3659)."
  },
  {
   "address": 252,
   "type": "line",
   "text": "The general pointer's high byte, or a second scratch byte: the y-distance in the throws ($3332). With $FD, the map cell pointer that $1711 returns."
  },
  {
   "address": 253,
   "type": "line",
   "text": "The second pointer ($FD/$FE): the colour RAM beside a screen pointer in $FB ($0CCA), the index of the spawn-list entry being placed ($10D9), the map cell's high byte from $1711."
  },
  {
   "address": 254,
   "type": "line",
   "text": "The second pointer's high byte ($0B1C-$0CB4)."
  },
  {
   "address": 657,
   "type": "line",
   "text": "The KERNAL's shift mode flag: REMEMBER writes $80 ($4541, $4720) so that C= and SHIFT cannot switch the character set while its screens show."
  },
  {
   "address": 788,
   "type": "line",
   "text": "The IRQ vector, low byte: the game points it at its raster interrupt, $4116 ($4107); REMEMBER's saver puts back the KERNAL's $EA31 ($44E3), and its menu copies all sixteen of the KERNAL's vectors, $0314-$0333, from $FD30 ($4549)."
  },
  {
   "address": 789,
   "type": "line",
   "text": "The IRQ vector's high byte: $41 for the game's interrupt ($410C), $EA from the saver ($44E8)."
  },
  {
   "address": 792,
   "type": "line",
   "text": "The NMI vector, low byte: $4D, set at the game's start ($0853), so RESTORE runs the RTI at $0A4D."
  },
  {
   "address": 793,
   "type": "line",
   "text": "The NMI vector's high byte, $0A ($0858). The KERNAL vectors after it, to $0333, are only touched by REMEMBER's menu."
  },
  {
   "address": 1024,
   "type": "line",
   "text": "The random generator's state, low byte ($3FE8: rotates the two bytes left as one 16-bit value, then makes this byte their EOR plus the high byte plus the carry, the bit the rotation took from this byte's top), seeded from the raster line ($3FFF). Before the game starts, the first byte of REMEMBER's screen, where its menu prints its banner ($4568)."
  },
  {
   "address": 1025,
   "type": "line",
   "text": "The random generator's high byte: the raster line shifted left at seeding ($4006), seeded again while it is zero."
  },
  {
   "address": 1026,
   "type": "line",
   "text": "The vertical fine scroll, 0-7: one off each frame the map moves ($08D4), and the top interrupt writes it, inverted, into $D011 ($41A7)."
  },
  {
   "address": 1027,
   "type": "line",
   "text": "The map row at the top of the screen: $A5 when an area starts ($08BA), moved down at each life's start to the nearest restart row at or below it ($3E2E), then counting down as the player advances ($08E0), 0 at the gate or the fortress. Also the title views' row ($0FCC)."
  },
  {
   "address": 1028,
   "type": "line",
   "text": "$FF on a frame when the map moves down a pixel, because the player pushes up while above y $A4 with the map not at its top ($3ADF); otherwise 0 ($3AA6), and put back to 0 when that step would take him into a wall ($3C7E), when he is killed ($106B) or falls ($3C5C), and in the name entry ($0C95). Added to the fine scroll ($08CE), and taken off the y of every slot in use except the player's, so the soldiers on the ground move with the map ($3D86)."
  },
  {
   "address": 1029,
   "type": "line",
   "text": "The high byte of the area's map, $60, $80 or $A0 ($1430), added to the map addresses that the map lookup ($1784) and the redraw ($3FB6) work out, and the gate's high byte ($15D7). Some bunker stamps use fixed addresses in area 1's map instead: the three bunkers each life puts back ($3E4E-$3E73) and one ruin ($3858)."
  },
  {
   "address": 1030,
   "type": "line",
   "text": "The raster interrupt's next handler, low byte: the set-up names the first ($40F7), each handler names the next ($4157, $4190, $4253, $4358, $4456), and the entry ($4116) jumps through it."
  },
  {
   "address": 1031,
   "type": "line",
   "text": "The next handler's high byte ($40FC-$445B)."
  },
  {
   "address": 1034,
   "type": "line",
   "text": "The game's frame counter, counted on every pass of the game logic ($08F7): each frame, except, while the map scrolls, the one frame in eight on which it moves a character row ($08DC); its bits pace the animations, the box's flashing and the rifle soldiers' aim."
  },
  {
   "address": 1035,
   "type": "line",
   "text": "Counted up by the raster interrupt each frame ($4145); wait_frame ($400C) waits for it to change."
  },
  {
   "address": 1037,
   "type": "line",
   "text": "The x-high flags of the sixteen slots, $040D-$041C, $FF when x is 256 or more; this byte is slot 0's, the player's."
  },
  {
   "address": 1038,
   "type": "line",
   "text": "The x-high flags of slots 1-3, the player's bullets, which the shot routines index as $040E,X."
  },
  {
   "address": 1041,
   "type": "line",
   "text": "The x-high flag of slot 4, the fourth shot slot, which a thrown grenade always takes ($38D4)."
  },
  {
   "address": 1042,
   "type": "line",
   "text": "The x-high flags of slots 5-15, the eleven enemies, which the enemy routines index as $0412,X."
  },
  {
   "address": 1053,
   "type": "line",
   "text": "The x positions of the sixteen slots, $041D-$042C (low byte, the x-high flag above it); this byte is the player's."
  },
  {
   "address": 1054,
   "type": "line",
   "text": "The x positions of slots 1-3, the bullets."
  },
  {
   "address": 1057,
   "type": "line",
   "text": "The x position of slot 4, a thrown grenade, which starts at the player's ($38C8)."
  },
  {
   "address": 1058,
   "type": "line",
   "text": "The x positions of slots 5-15, the enemies."
  },
  {
   "address": 1069,
   "type": "line",
   "text": "The y positions of the sixteen slots, $042D-$043C; this byte is the player's. The area ends when he walks up to y $5A ($091C)."
  },
  {
   "address": 1070,
   "type": "line",
   "text": "The y positions of slots 1-3, the bullets."
  },
  {
   "address": 1073,
   "type": "line",
   "text": "The y position of slot 4, the grenade."
  },
  {
   "address": 1074,
   "type": "line",
   "text": "The y positions of slots 5-15, the enemies."
  },
  {
   "address": 1085,
   "type": "line",
   "text": "The behind-scenery flags of the sixteen slots, $043D-$044C: $FF sets the sprite's bit in $D01B, so the scenery's foreground colours cover it. This byte is the player's ($3C5F)."
  },
  {
   "address": 1086,
   "type": "line",
   "text": "The behind-scenery flags of slots 1-3: a bullet goes behind the scenery it passes ($39A1)."
  },
  {
   "address": 1089,
   "type": "line",
   "text": "The behind-scenery flag of slot 4: a grenade starts with the player's ($38EE)."
  },
  {
   "address": 1090,
   "type": "line",
   "text": "The behind-scenery flags of slots 5-15."
  },
  {
   "address": 1101,
   "type": "line",
   "text": "The sprite colours of the sixteen slots, $044D-$045C; this byte is the player's."
  },
  {
   "address": 1102,
   "type": "line",
   "text": "The colours of slots 1 and 2, bullets."
  },
  {
   "address": 1104,
   "type": "line",
   "text": "The colour of slot 3, the third bullet, written as $044E,X. Before the game starts, the start of the third row of REMEMBER's screen, where its menu prints each question ($458B-$4626)."
  },
  {
   "address": 1105,
   "type": "line",
   "text": "The colour of slot 4: light blue for a thrown grenade ($38E8)."
  },
  {
   "address": 1106,
   "type": "line",
   "text": "The colours of slots 5-15."
  },
  {
   "address": 1117,
   "type": "line",
   "text": "The sprite blocks of the sixteen slots, $045D-$046C ($FF is the blank block); this byte is the player's."
  },
  {
   "address": 1118,
   "type": "line",
   "text": "The blocks of slots 1-3: $90 for a bullet, the spark's frames after it."
  },
  {
   "address": 1121,
   "type": "line",
   "text": "The block of slot 4: $93, the smallest grenade, when it is thrown ($38E3)."
  },
  {
   "address": 1122,
   "type": "line",
   "text": "The blocks of slots 5-15."
  },
  {
   "address": 1133,
   "type": "line",
   "text": "The x-speeds of the sixteen slots, $046D-$047C, signed pixels a frame; this byte is the player's."
  },
  {
   "address": 1134,
   "type": "line",
   "text": "The x-speeds of slots 1-3, from the facing ($39F0)."
  },
  {
   "address": 1137,
   "type": "line",
   "text": "The x-speed of slot 4: 0, as a grenade goes straight up the screen ($38D9)."
  },
  {
   "address": 1138,
   "type": "line",
   "text": "The x-speeds of slots 5-15."
  },
  {
   "address": 1149,
   "type": "line",
   "text": "The y-speeds of the sixteen slots, $047D-$048C; this byte is the player's."
  },
  {
   "address": 1150,
   "type": "line",
   "text": "The y-speeds of slots 1-3 ($39F6)."
  },
  {
   "address": 1153,
   "type": "line",
   "text": "The y-speed of slot 4: -2 when a grenade is thrown ($38DE)."
  },
  {
   "address": 1154,
   "type": "line",
   "text": "The y-speeds of slots 5-15. A door uses its own as its state ($25DB)."
  },
  {
   "address": 1165,
   "type": "line",
   "text": "The type of each of the sixteen slots, $048D-$049C: the movement loop moves slots 1-15 only while their byte is not zero ($3D5C), and the player always. This byte, the player's, is set only in the name entry ($0BDC), cleared with the rest ($3DD7) and never read."
  },
  {
   "address": 1166,
   "type": "line",
   "text": "The types of slots 1-3: 0 ready to fire, 1 a bullet, 3 a spark ($3619)."
  },
  {
   "address": 1169,
   "type": "line",
   "text": "The type of slot 4, the fourth shot slot: like slots 1-3 it can carry a bullet, and a grenade takes it (2 in the air, 4 its blast). A grenade can be thrown only while it is 0 ($38B4)."
  },
  {
   "address": 1170,
   "type": "line",
   "text": "The behaviours of slots 5-15, 0 for a free slot (the table at $24D4)."
  },
  {
   "address": 1181,
   "type": "line",
   "text": "The shot slots' frame counts ($049D,X, to $04A0). Outside play, the title's view number, 0-7 ($0FC6), and in the name entry the row the shot is aimed at ($0DBD)."
  },
  {
   "address": 1184,
   "type": "line",
   "text": "Slot 4's frame count, zeroed when a grenade is thrown ($38F8): it lands at 40 ($36B5)."
  },
  {
   "address": 1185,
   "type": "line",
   "text": "One byte for each enemy, 11 in all: the slot of a vehicle's other half ($1F0B), the time before a walker turns down ($23AA), the heading a wanderer keeps ($329E)."
  },
  {
   "address": 1196,
   "type": "line",
   "text": "One byte for each enemy: the heading, 0-15, it faces and shoots along ($34C6), from which its walk frame is taken ($297D)."
  },
  {
   "address": 1207,
   "type": "line",
   "text": "One byte for each enemy: its timer, counted up on every pass of the game logic by most behaviours, whose low bits decide when it fires, throws or turns."
  },
  {
   "address": 1218,
   "type": "line",
   "text": "The sixteen slots' y for the raster interrupts, $04C2-$04D1, copied by the movement loop ($3D51, $3D59)."
  },
  {
   "address": 1247,
   "type": "line",
   "text": "The fire button's repeat count, $FF while fire is up ($3A2A). While fire is held, each empty shot slot adds one on each pass of the game logic ($39E0) and a bullet goes when the count's low three bits come round to zero: the first at once, the second at 8, after which nothing until fire is let go ($39D9)."
  },
  {
   "address": 1248,
   "type": "line",
   "text": "The player's heading from the joystick (0 up, 2 up-right, 4 right ... $0E up-left), which picks his walk frames ($3B8E); his facing turns towards it ($35B8)."
  },
  {
   "address": 1249,
   "type": "line",
   "text": "The player's facing in sixteenths of a turn, turned a step at a time towards the joystick's heading ($35B0): the way his bullets go ($39EA)."
  },
  {
   "address": 1250,
   "type": "line",
   "text": "The background colour the top interrupt writes to $D021 ($41BA): brown ($09) in play ($4060), black behind the title, the messages and the name entry ($0F50, $127D, $0C9B)."
  },
  {
   "address": 1251,
   "type": "line",
   "text": "The character multicolour 1 ($D022): black ($406B)."
  },
  {
   "address": 1252,
   "type": "line",
   "text": "The character multicolour 2 ($D023): grey ($4073)."
  },
  {
   "address": 1254,
   "type": "line",
   "text": "A frame count with several jobs: the player's walk animation ($3B9E), the death's frames ($095A), the waits on the title and the high-score table ($0A38) and the ending's flicker ($3CE5)."
  },
  {
   "address": 1255,
   "type": "line",
   "text": "Counted up each time an enemy's behaviour is called ($24C5). Nothing reads it."
  },
  {
   "address": 1256,
   "type": "line",
   "text": "The index of the next spawn-list entry to come due ($10F8), stepped by the spawner ($1B96)."
  },
  {
   "address": 1257,
   "type": "line",
   "text": "Set to 0, 1 and 2 through a frame on which the map moves a whole row ($08E5-$08F1). Nothing reads it."
  },
  {
   "address": 1258,
   "type": "line",
   "text": "Set to 1 when a mortar man or a trench soldier fires ($25B3, $2C4C): while it is set, every such soldier plays the recoil frames $CF, $CE and $CD, at frames 3, 15 and 20 of his timer's 32, and the one that reaches frame 20 clears it ($25A3, $2BEB)."
  },
  {
   "address": 1260,
   "type": "line",
   "text": "How many guards have been shot, zeroed when a guard is placed ($219A): the second frees the prisoner ($2443)."
  },
  {
   "address": 1261,
   "type": "line",
   "text": "The prisoner's enemy slot ($216E), set free when both guards are shot ($244F)."
  },
  {
   "address": 1262,
   "type": "line",
   "text": "Set to 1 when the player pushes up with the map at its top ($3ABC), cleared at each life's start ($3E36). Nothing reads it."
  },
  {
   "address": 1263,
   "type": "line",
   "text": "The gate soldiers still to come out: 20 at each life's start ($3E3B), one fewer for each ($2CD4)."
  },
  {
   "address": 1264,
   "type": "line",
   "text": "The x of a point to look up in the map ($1711): the routines that test the ground under a sprite write it."
  },
  {
   "address": 1265,
   "type": "line",
   "text": "The y of the point to look up in the map ($1734)."
  },
  {
   "address": 1266,
   "type": "line",
   "text": "The x-high flag of the point to look up ($171E)."
  },
  {
   "address": 1267,
   "type": "line",
   "text": "The area counter: 0, 1, 3, then 4, 5, 7 for the second loop ($0941-$094D). Its low two bits choose the area's tables, character set and colours; area 2 is skipped. The fire mask alone is chosen by the low three bits ($3E80), so every area of the second loop gets $0F. The messages set it to 2 while they show, for the text character set ($1270)."
  },
  {
   "address": 1268,
   "type": "line",
   "text": "The gate soldiers on the screen, counted afresh on every pass of the game logic: zeroed before the enemies run ($2497), one added by each gate soldier's behaviour ($31D2) and by each one sent out ($2D02, $2D5D). The area is won when it and $04EF are both zero ($3A91)."
  },
  {
   "address": 1269,
   "type": "line",
   "text": "Set to 1 when the walk out reaches y $5A ($3A86), cleared at each life's start ($3E7D). Nothing reads it."
  },
  {
   "address": 1271,
   "type": "line",
   "text": "Set when the last gate soldier is gone and the player walks out on his own ($3A30): the controls and the touch test stop ($0914, $3A8C)."
  },
  {
   "address": 1272,
   "type": "line",
   "text": "The score's low byte, two BCD digits of hundreds ($134F): the screen shows four digits and a fixed \"00\" ($136F). Each carry into the high byte, every 10,000 points, is an extra life ($1363)."
  },
  {
   "address": 1273,
   "type": "line",
   "text": "The score's high byte, two BCD digits for the 10,000s and 100,000s."
  },
  {
   "address": 1277,
   "type": "line",
   "text": "Zeroed at each life's start ($3E4B). Nothing reads it."
  },
  {
   "address": 1279,
   "type": "line",
   "text": "The grenades left, in BCD: 5 at the start ($08B2), back to at least 5 for each life ($3EA3), three more from a box ($2A92), one fewer a throw ($3904)."
  },
  {
   "address": 1280,
   "type": "line",
   "text": "The lives left: 5 at the start ($08B5), one fewer a death ($0996), one more every 10,000 points ($1363)."
  },
  {
   "address": 1281,
   "type": "line",
   "text": "Zeroed at the start ($0880). Nothing reads it."
  },
  {
   "address": 1282,
   "type": "line",
   "text": "Zeroed at the start beside $0501 ($087D). Nothing reads it."
  },
  {
   "address": 1283,
   "type": "line",
   "text": "How the player is dying: 0 alive, 1 shot or touched ($1058), 2 fallen into water or a hole ($3C12). The death runs from the main loop ($0953)."
  },
  {
   "address": 1284,
   "type": "line",
   "text": "The enemies' fire mask, ANDed with each shooter's timer: a shot only when the result is zero ($33B5). From fire_masks by the area counter's low three bits at each life's start ($3E89): $3F, $1F and $0F in areas 0, 1 and 3, $0F in every area of the second loop. $3F while the gate soldiers come ($2CD1)."
  },
  {
   "address": 1285,
   "type": "line",
   "text": "1 while the name entry's shot is in flight ($0DB7), 0 when it reaches its row ($0D6C)."
  },
  {
   "address": 1286,
   "type": "line",
   "text": "The name being entered, eight letters ($0506-$050D), zero bytes at first ($0BE3), which show as blanks; a rub-out puts the $75 mark back in its place ($0DE7)."
  },
  {
   "address": 1295,
   "type": "line",
   "text": "How many letters of the name have been entered ($0BEE, $0DF8)."
  },
  {
   "address": 1296,
   "type": "line",
   "text": "The glyph that was under the gunsight at the last press of fire ($0B89; $20 before the first, $0C00), END ($78) to finish ($0D01)."
  },
  {
   "address": 1297,
   "type": "line",
   "text": "Whether the cell under the gunsight is flashing ($0ABE)."
  },
  {
   "address": 1298,
   "type": "line",
   "text": "The flash's frame count ($0AC5)."
  },
  {
   "address": 1536,
   "type": "line",
   "text": "REMEMBER's screen from row 12, column 32: the instructions viewer copies the third 256 bytes of each 1,000-byte page here ($4763)."
  },
  {
   "address": 1792,
   "type": "line",
   "text": "REMEMBER's screen from row 19, column 8: the last 232 bytes of each page ($476F)."
  },
  {
   "address": 2048,
   "type": "line",
   "text": "Sixty-one zero bytes ($0800-$083C) before REMEMBER's file name, as memory holds them once the packed file, which loads at $0801, has unpacked. Nothing in the unpacked program reads or writes them; the game's own code starts at $0850."
  },
  {
   "address": 2109,
   "type": "line",
   "text": "REMEMBER's file name for the high-score table, \"@S:COMMANDO HI /REM\" (19 bytes). The crack's saver at $44E0 names all 19 bytes, so the \"@S:\" prefix tells the drive to replace the old file; its loader at $463D names only the last 16, from $0840, \"COMMANDO HI /REM\". Not part of the 1985 game."
  },
  {
   "address": 2128,
   "type": "line",
   "text": "The game's entry point, reached from REMEMBER's menu and again from its high-score saver ($44E0) after every saved game. Points the NMI vector at an RTI ($0A4D) so RESTORE does nothing, turns the screen on ($D011 = $1B, REMEMBER's), seeds the random generator from the raster line ($3FFF), copies the name-entry gunsight sprite under the I/O area ($0A57) and fills the sprite sort order $4B-$5B with 0-16. Then falls into title_and_new_game. In the 1985 release, $085C-$0868 is LDX #$00 / LDA $0A4E,X / STA $8000,X / INX / CPX #$09 / BNE $085E instead: it copies the nine bytes at $0A4E to $8000, a cartridge's signature that makes a reset restart the game at $0850. REMEMBER put the LDA #$1B / STA $D011 and eight NOPs in its place."
  },
  {
   "address": 2140,
   "type": "side",
   "text": "REMEMBER's; the 1985 release copies its reset trap to $8000 here"
  },
  {
   "address": 2145,
   "type": "side",
   "text": "eight NOPs over the 1985 copy loop's STA $8000,X / INX / CPX #$09 / BNE"
  },
  {
   "address": 2153,
   "type": "side",
   "text": "video set-up: VIC bank 3, screen at $E000, and the BASIC ROM banked out"
  },
  {
   "address": 2164,
   "type": "line",
   "text": "Fills the sprite order ($4B-$5B) with 0-16, one more entry than there are slots, then zeroes $0501 and $0502, which nothing reads."
  },
  {
   "address": 2165,
   "type": "side",
   "text": "sprite sort order table, $4B+X = X"
  },
  {
   "address": 2179,
   "type": "line",
   "text": "Title, then a new game. Parks the map at row $A5, sets up a life ($3DE0, which moves the map down to the area's first checkpoint), builds the play screen ($4049) and starts the raster interrupts ($40E8), starts tune 0 and runs the title and attract loop ($0F48) until fire. Then turns the sound effects on ($5006, though nothing in the game turns them off), zeroes the score, area counter and fine scroll, turns sprite expansion off and gives five grenades ($04FF) and five lives ($0500). The manual promises six grenades; this build starts with five."
  },
  {
   "address": 2232,
   "type": "line",
   "text": "Start of an area: map row $A5, tune 0 again, then falls into life_start, whose set-up ($3DE0) moves the map down to the first checkpoint at or below that row. So play begins at row $AF in area 0 and $A6 in areas 1 and 3 (live)."
  },
  {
   "address": 2242,
   "type": "line",
   "text": "Start of a life, also entered after a death with lives left: reset the slots and put the player back at the checkpoint ($3DE0), rebuild the play screen ($4049) and restart the raster interrupts ($40E8)."
  },
  {
   "address": 2251,
   "type": "line",
   "text": "The in-game frame loop. Waits for the raster interrupt's frame tick ($400C). While the screen is scrolling ($0404 non-zero) it steps the fine scroll ($0402) and, each time it wraps to 7, moves the map one character row ($0403 decremented), moves the sprites ($3D2A) and redraws the playfield ($3F75), with $04E9 marking which half of that work is done; that frame skips the game logic. Otherwise it counts a frame ($040A), moves and sorts the sprites ($3D2A, $3F06), checks for a grenade throw ($38A5), runs the eleven enemy slots ($2495), the spawn list ($1B8B) and the player's shots and grenade ($3623). With the player dying ($0503) it goes to the death sequence at $0953; otherwise it reads the joystick ($3A8C) and, unless the gate is open and he is walking out ($04F7, set at $3A30 and cleared at each life's start), tests him against every enemy ($100F). The area is over when the player's sprite reaches y = $5A."
  },
  {
   "address": 2295,
   "type": "line",
   "text": "The logic of a frame on which the map did not move a character row: counts the frame ($040A), moves and sorts the sprites, checks for a grenade throw, runs the enemies, the spawner and the shots, then the player's death or his controls and the touch test, and ends the area when he reaches y $5A."
  },
  {
   "address": 2339,
   "type": "line",
   "text": "Area complete: 1,400 points ($14 to $134F). After the last area (area counter & 3 = 3) it plays effect 9 and runs the fortress-gate ending ($3CB2). Falls into next_area."
  },
  {
   "address": 2361,
   "type": "line",
   "text": "Plays tune 2 and shows the area-complete message ($1222), then advances the area counter ($04F3), stepping over every value whose low two bits are 2, so the areas played are 0, 1 and 3 and then 0 again. Also the target of REMEMBER's area-skip key ($5F6A)."
  },
  {
   "address": 2387,
   "type": "line",
   "text": "Runs on every pass of the game logic while the player is dying, counting $04E6 up to $50, when a life goes. $0503 = 2 means he fell into a hole or the water: the count starts at $0F there (A as the sound call leaves it, $3C1A), so he shows sprite $CB for four frames, then $CC, 65 frames in all. Otherwise he was hit: the count starts at 1, so he shows $DD until it reaches $14, then $B8, 79 frames in all."
  },
  {
   "address": 2454,
   "type": "line",
   "text": "Takes a life and redraws the count. With lives left the game goes back to life_start; otherwise on to the high-score check. REMEMBER's unlimited-lives trainer turns the DEC here into LDA $0500."
  },
  {
   "address": 2454,
   "type": "side",
   "text": "the unlimited-lives trainer writes $AD here, making it LDA $0500"
  },
  {
   "address": 2468,
   "type": "line",
   "text": "Game over: insert the score into the eight-entry high-score table. Walks from the bottom entry (X = 7) up, moving every entry the score beats or equals down one place, name and all. The first entry it does not beat stops the walk: the score goes in below it, and the name entry ($0C88) follows. Beating them all puts it at the top. A score below the eighth goes into the spare ninth slot ($0F46) and the game returns to the title without asking for a name. The 1985 release has 6 here and at $0A0D, the walk's only difference: a score that does not beat the seventh entry then goes into the eighth, over the score there and under the name there, and no name is asked for. REMEMBER's 7 is the bug fix CSDb credits the crack with."
  },
  {
   "address": 2468,
   "type": "side",
   "text": "7 in this copy, 6 in the 1985 release"
  },
  {
   "address": 2491,
   "type": "line",
   "text": "The score beats or equals entry X: moves entry X down to X + 1, its score (two BCD bytes, high first, $0F36 + 2X) and its eight-letter name ($0EEE + 8X), then tries the entry above. Past the top, the score becomes entry 0 and the name entry's letters are copied there ($09EF)."
  },
  {
   "address": 2557,
   "type": "line",
   "text": "The score does not beat entry X: it goes in as entry X + 1. When X is 7 that is the spare ninth slot and the game goes back to the title ($0883) with no name; otherwise the name is asked for ($0A13)."
  },
  {
   "address": 2572,
   "type": "side",
   "text": "the walk never moved: no name; #$06 in the 1985 release"
  },
  {
   "address": 2579,
   "type": "line",
   "text": "Runs the name entry ($0C88) and copies its eight letters ($0506) into the name of entry X + 1, then shows the table ($0A2B)."
  },
  {
   "address": 2603,
   "type": "line",
   "text": "After a name: show the table ($0E0F, which waits for fire), pause about 100 frames, then wait up to 255 frames for fire before saving. The JMP at $0A4A goes to REMEMBER's high-score saver at $44E0, which writes the table to disk and restarts at $0850. A 1985 build cannot have jumped into the crack's code, so REMEMBER changed this jump; where it went before is unknown (the path at $0A10 that skips the name goes to $0883)."
  },
  {
   "address": 2634,
   "type": "side",
   "text": "REMEMBER's jump to its saver; the 1985 release jumps to the title ($0883)"
  },
  {
   "address": 2635,
   "type": "line",
   "text": "The low byte of the JMP at $0A4A: $E0, so the high-score table ends in REMEMBER's saver ($44E0). The trainer writes $83 ($457E), for the title ($0883) instead, which is what the 1985 release has."
  },
  {
   "address": 2636,
   "type": "line",
   "text": "The JMP's high byte: $44, or $08 from the trainer ($4583) and in the 1985 release."
  },
  {
   "address": 2637,
   "type": "line",
   "text": "The NMI handler: an RTI, so the RESTORE key is ignored. $0850 points the NMI vector here."
  },
  {
   "address": 2638,
   "type": "line",
   "text": "Nine zero bytes between the NMI handler and the sprite copy, which nothing reads. In the 1985 release they are $50 $08 $50 $08 $C3 $C2 $CD $38 $30: $0850 twice and CBM80 with bit 7 set, the signature $085C copies to $8000 so that the KERNAL's reset jumps to $0850. REMEMBER zeroed them."
  },
  {
   "address": 2647,
   "type": "line",
   "text": "Copies the name-entry gunsight (64 bytes from $0A7F) to $D040, sprite block $41 of video bank 3, in the RAM under the I/O area. Stops CIA 1's timer A and clears the processor port's CHAREN bit ($01 bit 2) so the writes land in RAM, then puts both back. When the 1985 release restarts after a reset, $00 is 0, the CHAREN write does nothing, and the 64 bytes go to the video chip's registers instead: $D011 gets $20, which turns the display off, and nothing in the game sets the display bit again."
  },
  {
   "address": 2666,
   "type": "side",
   "text": "RAM under the I/O area: CHAREN is clear, so this store reaches sprite block $41"
  },
  {
   "address": 2687,
   "type": "line",
   "text": "The name-entry gunsight, 63 bytes of a multicolour sprite: a ring with four ticks pointing in and a small cross at its centre, drawn in colour 2 (red, set at $0BAE). Copied to $D040 by $0A57; the copy takes 64 bytes, so its last byte is the opcode at $0ABE."
  },
  {
   "address": 2750,
   "type": "line",
   "text": "Name entry: flashes the letter just shot. While $0511 is set, each frame counts $0512 up, and the cell under the gunsight ($F7) cycles in steps of four frames through the letter, glyph $79, the letter + $20 and $79 again; when the count reaches 50 the letter is put back and the flash ends. A new press of fire moves a running flash to the new cell without restarting it. Only a rub-out zeroes the count ($0DF2), so a flash after a rub-out lasts 50 frames, one after an earlier flash has ended 256, and the first after loading starts from the byte REMEMBER's screen left there."
  },
  {
   "address": 2810,
   "type": "line",
   "text": "Name entry: finds the screen cell under the gunsight (slot 5's x and y, in 16-pixel steps) and reads it. The screen is at $E000, under the KERNAL ROM, so the read clears HIRAM ($01 bit 1) with interrupts off. Leaves the cell's address in $F7/$F8 and its glyph in $0510."
  },
  {
   "address": 2951,
   "type": "side",
   "text": "KERNAL banked out: reads the screen RAM at $E000-$E3FF"
  },
  {
   "address": 2964,
   "type": "line",
   "text": "Name entry: sets up the sprites. Slot 5 is the gunsight (block $41, red, drawn behind the letters, in 16-pixel steps from x $60, y $60); the player (slot 0) stands at the bottom (y $B4) under it. Clears the eight-letter name buffer ($0506), its length ($050F) and the flash, and points $F7 at the screen's first cell."
  },
  {
   "address": 3082,
   "type": "line",
   "text": "Name entry: the joystick moves the gunsight two pixels a frame, between x $60 and $F0 and y $60 and $80 (ten letters by three rows), and the player walks along the bottom under it, animated from the walk frames at $3C82 by x."
  },
  {
   "address": 3183,
   "type": "line",
   "text": "Name entry: stops the gunsight when it reaches a 16-pixel grid point, so each push moves it one letter."
  },
  {
   "address": 3208,
   "type": "line",
   "text": "Name entry after a high score. Plays tune 1, clears the screen and the slots, sets the area to 2 (the text character set) and prints the letter grid from $0D09 at $E082 in white. Then runs the frame loop: joystick ($0C0A), shot ($0D59), flash ($0ABE), sprites ($3D2A, $3F06) and snap ($0C6F), until fire is pressed with the gunsight on glyph $78, END."
  },
  {
   "address": 3257,
   "type": "line",
   "text": "Prints the name entry's screen from $0D09 at ($FB), white in the colour RAM at ($FD): $FF moves to the next row, $FE ends."
  },
  {
   "address": 3308,
   "type": "line",
   "text": "The name entry's frame loop: wait for the frame, joystick, shot, flash, sprites, snap to the grid, until the glyph read at the last press of fire ($0510) is END ($78)."
  },
  {
   "address": 3337,
   "type": "line",
   "text": "Name entry screen, in the game's alphabet (A = $5B ... Z = $74, digits from $21): five spaces, the eight $75 marks where the name goes and an END glyph ($78) after them, then two blank lines and the rows \"A B C D E F G H I J\", \"K L M N O P Q R S T\" and \"U V W X Y Z\" followed by $75, $76, $77 (rub out) and $78 (END), with a blank line between each. $FF moves down a row, $FE ends."
  },
  {
   "address": 3417,
   "type": "line",
   "text": "Name entry: the shot. With no shot in flight ($0505 = 0), fire sends one straight up from the player (slot 1, six pixels a frame) towards the gunsight's row, puts back the cell that was flashing, reads the new one ($0AFA) and plays effect $0B. END ($78) does nothing more (the loop ends), $77 rubs out the last letter, and anything else is added to the name while it is shorter than eight. When the shot passes the row ($049D) it is removed and, unless the letter was the rub-out, the flash starts."
  },
  {
   "address": 3457,
   "type": "line",
   "text": "Fire in the name entry: with the button down, slot 1 becomes the shot (block $90, rising six pixels a frame from the player), the gunsight's row goes into $049D for the shot to reach, the cell that was flashing is put back and the new one read ($0AFA), effect $0B plays, and the letter is acted on."
  },
  {
   "address": 3599,
   "type": "line",
   "text": "Prints the high-score table: eight lines from $E082, two screen rows apart, each the rank ($0ECE), the name ($0EEE) and the score as four BCD digits plus two fixed zeros. Then waits, with no time limit, for fire alone on port 2 ($DC00 = $6F)."
  },
  {
   "address": 3680,
   "type": "line",
   "text": "Waits, with no time limit, for fire alone on port 2 ($DC00 = $6F)."
  },
  {
   "address": 3688,
   "type": "line",
   "text": "Prints rank X's four-byte label from $0ECE at ($FB)."
  },
  {
   "address": 3709,
   "type": "line",
   "text": "Prints entry X's eight-letter name from $0EEE at ($FB)."
  },
  {
   "address": 3731,
   "type": "line",
   "text": "Prints entry X's score from $0F36 at ($FB) as four digits (glyph = digit + $21)."
  },
  {
   "address": 3790,
   "type": "line",
   "text": "The eight rank labels of the high-score table, four bytes each in the game's alphabet: \"1ST \", \"2ND \", \"3RD \", \"4TH \" up to \"8TH \". REMEMBER's saver starts its file at the last of these bytes ($0EED)."
  },
  {
   "address": 3822,
   "type": "line",
   "text": "High-score names, eight letters each, best first, plus a ninth slot ($0F2E) that a beaten eighth entry is pushed into. Loaded from REMEMBER's file before $0850 runs. The file on this disk holds the table the 1985 release starts with (CHRIS, RORY, THE DUDE, SARAH followed by a space and the heart glyph $76, NIGEL, KEITH, ADOLF, DILK), byte for byte."
  },
  {
   "address": 3830,
   "type": "line",
   "text": "The names of entries 1-7 and the spare ninth ($0F2E), eight letters each: a name moves here as $0EF6 + 8X when entry X moves down ($09D2) or goes in below it ($0A22)."
  },
  {
   "address": 3894,
   "type": "line",
   "text": "High scores, two BCD bytes each (high byte first, in hundreds of points), eight entries and a ninth spare at $0F46. Loaded from REMEMBER's file with the names: 9000 down to 2000 here, which the screen shows as 009000 to 002000. The top entry is the HI on the play screen ($13A3)."
  },
  {
   "address": 3895,
   "type": "line",
   "text": "Entry 0's low score byte. Scores are compared ($09B6) and shown ($0EB2) through it as $0F37 + 2X."
  },
  {
   "address": 3896,
   "type": "line",
   "text": "Entry 1's high score byte, the base for scores written into entry X + 1 ($09C1, $0A03)."
  },
  {
   "address": 3897,
   "type": "line",
   "text": "Entry 1's low score byte and the scores after it, to the spare ninth entry's at $0F46-$0F47 ($09C7, $0A09)."
  },
  {
   "address": 3912,
   "type": "line",
   "text": "The title and attract loop, returning when fire is pressed. Clears the slots and the screen, sets the area counter to 2 (whose character set holds the letters) and lays out the COMMANDO logo from seven sprites doubled in both directions (slots 5-11 at y $48: x, x-high and block from $0FEC, $0FF3 and $0FFA, orange), prints the credits ($10FC) and waits about five seconds (255 frames) for fire alone on port 2. Then it draws eight views of the battlefield: view X takes its area from $1001 and its map row from $1008, sets the area tables ($1427), colours the playfield ($4015) and draws the map ($3F75) under the logo. The first seven stay about five seconds each, with the same wait for fire; the eighth is wiped as soon as it is drawn, because the loop then starts again with the credits."
  },
  {
   "address": 3938,
   "type": "line",
   "text": "Places the seven sprites of the COMMANDO logo, slots 5-11, from the tables at $0FEC, $0FF3 and $0FFA, at y $48, still, with behaviour $10, the one that does nothing ($2578). The enemy loop does not run during the title, and the game's start clears the slots ($3DE0)."
  },
  {
   "address": 4013,
   "type": "line",
   "text": "Waits about five seconds (255 frames, counted in $04E6) for fire alone, then shows the next view of the battlefield."
  },
  {
   "address": 4018,
   "type": "line",
   "text": "The wait's loop: fire alone on port 2 starts a game ($0FEB); otherwise one frame passes and the count goes down. $6F needs bit 7 of CIA 1's port A low, which it is because the KERNAL makes the port an output ($DC02 = $FF) and writes $7F to it. When the 1985 release restarts after a reset, the KERNAL has not done that, the port is all inputs and reads $EF with fire, and no game can be started."
  },
  {
   "address": 4021,
   "type": "side",
   "text": "$6F: fire alone on port 2; fire with a direction does not start the game"
  },
  {
   "address": 4076,
   "type": "line",
   "text": "The COMMANDO logo: x of each of its seven sprites (doubled width, 48 pixels apart)."
  },
  {
   "address": 4083,
   "type": "line",
   "text": "The COMMANDO logo: x-high flag of each sprite ($FF for the last two, past x 255)."
  },
  {
   "address": 4090,
   "type": "line",
   "text": "The COMMANDO logo: sprite block of each of its seven sprites, $F6-$FB and $AC. The eight letters straddle the sprites' edges, and $AC holds the logo's right-hand end."
  },
  {
   "address": 4096,
   "type": "line",
   "text": "The last of title_logo_blocks' seven entries: $AC, the block that holds the logo's right-hand end."
  },
  {
   "address": 4097,
   "type": "line",
   "text": "Attract mode: the area of each view (0, 0, 1, 1, 3, 3, 3). The loop draws eight views but this table has seven entries: the eighth reads $1008, the next table's first byte ($53), whose low two bits make it area 3; that view is wiped as soon as it is drawn."
  },
  {
   "address": 4104,
   "type": "line",
   "text": "Attract mode: the map row each view starts at ($53, $7C, $3A, $01, $A9, $6E, $36). The eighth view reads one byte further, the LDY opcode $A0 at $100F, so it draws area 3 from row 160, which the loop's restart wipes at once."
  },
  {
   "address": 4111,
   "type": "line",
   "text": "Kills the player on contact. For each of the eleven enemy slots whose behaviour is marked in $1074 (soldiers on the move, enemy bullets, bombs and the bunker guns' shells, explosions, the leading half of a crossing vehicle, the lorry and the jeep; not guards, soldiers in cover, the motorcycle that stops, or grenades and mortar bombs in flight), compares positions: the same x-high half, the enemy's x from 3 pixels left of the player's to 4 right, and its y from 7 above to 8 below. A hit sets $0503 = 1, starts the death timer, plays effect 4, stops the player and stops the scroll. REMEMBER's \"switch off the collision\" trainer fills $1056-$106D with NOPs, which removes the kill."
  },
  {
   "address": 4182,
   "type": "line",
   "text": "The touch test's kill, 24 bytes to $106D: dying = 1, the death count, effect 4, the player and the scroll stopped. The trainer's no-collision answer fills them with NOPs ($45FD)."
  },
  {
   "address": 4182,
   "type": "side",
   "text": "$1056-$106D: the collision trainer replaces these 24 bytes with NOPs"
  },
  {
   "address": 4206,
   "type": "line",
   "text": "Next enemy slot for the touch test, eleven in all."
  },
  {
   "address": 4212,
   "type": "line",
   "text": "One byte per enemy behaviour: bit 0 set means touching an enemy with that behaviour kills the player (0 = harmless, such as a grenade box or a bullet already spent). The table holds behaviours 0-38; behaviours 39 and 40 read the next routine's first bytes, $A0 and $00, both with bit 0 clear."
  },
  {
   "address": 4251,
   "type": "line",
   "text": "Spawns at once everything in the area's spawn list whose trigger row is on screen: used when a life starts ($3DE0), often at a checkpoint part-way up the map. Walks the list from its start. An entry whose trigger row lies from the top row ($0403) to 21 rows below it is given the first free enemy slot and its handler from $1BE8, then placed at its row's height on screen, (trigger row - top row) x 8 + $2B, with its partner slot ($04A1) moved with it. Stops at $FF or at the first trigger above the top row, which has not scrolled in yet, and leaves that entry's index in $04E8 for the per-row spawner ($1B8B)."
  },
  {
   "address": 4293,
   "type": "line",
   "text": "Looks for a free enemy slot (behaviour 0) among the eleven; with none the entry is skipped ($10F4)."
  },
  {
   "address": 4331,
   "type": "side",
   "text": "for an enemy with no partner $04A1 holds its heading, a walker's walking time ($50 or $6E) or a value left by an earlier occupant, and this store writes the y to $0432 plus that number: another enemy's y for 0-10, a byte of a later table above that ($0482, enemy 0's y-speed, for $50)"
  },
  {
   "address": 4340,
   "type": "line",
   "text": "Steps to the next entry of the spawn list and goes round again."
  },
  {
   "address": 4344,
   "type": "line",
   "text": "Leaves the index of the first entry not yet due in $04E8, where the per-row spawner ($1B8B) carries on."
  },
  {
   "address": 4348,
   "type": "line",
   "text": "Prints the title credits from $1143 at $E029 in white; $FF moves down two rows, $FE ends."
  },
  {
   "address": 4370,
   "type": "line",
   "text": "Prints one line of the title credits from $1143 at ($FB), white in the colour RAM at ($FD): $FF ends the line, $FE the credits."
  },
  {
   "address": 4394,
   "type": "line",
   "text": "Moves the credits two screen rows down (80 bytes) for the next line."
  },
  {
   "address": 4419,
   "type": "line",
   "text": "The title credits in the game's alphabet: \"ELITE PRESENTS\", \"PROGRAMMING CHRIS BUTLER\", \"GRAPHICS RORY GREEN\", \"CHRIS HARVEY\", \"SOUND ROB HUBBARD\", \"JAPAN CAPSULE COMPUTERS UK C 1985\" and \"PRESS FIRE TO START\". These credits are the 1985 game's own and are what game.json's credits follow."
  },
  {
   "address": 4642,
   "type": "line",
   "text": "The message between areas. Copies the ordinals for \"BROKE THE ... AREA\" and \"NOW RUSH THE ... AREA\" from $1306 (area & 3 picks \"1ST\"/\"2ND\", \"2ND\"/\"3RD\"), or after area 3 points the two lines at \"CONGRATULATIONS\" and \"MISSION COMPLETE\" instead, by rewriting the LDA operands at $1283 and $129A. Then clears the slots and the screen and types the lines out a letter every six frames at row 10 and row 12, in the text character set (area counter 2 while it runs), and holds them 121 frames ($1348 with Y = $78)."
  },
  {
   "address": 4738,
   "type": "line",
   "text": "Types out the area message's first line a letter every six frames ($1348), at screen row 10 ($E19A) in white; the LDA's operand ($1283) is set to the line by area_message."
  },
  {
   "address": 4739,
   "type": "line",
   "text": "The low byte of line 1's LDA operand: $B8 for \"BROKE THE ... AREA\" ($1241) or $DF for \" CONGRATULATIONS\" after the last area ($125E)."
  },
  {
   "address": 4739,
   "type": "side",
   "text": "operand rewritten by area_message: the first line's text"
  },
  {
   "address": 4740,
   "type": "line",
   "text": "Line 1's operand high byte, $12 either way ($1246, $1263)."
  },
  {
   "address": 4761,
   "type": "line",
   "text": "Types out the second line the same way at row 12 ($E1E9), from the address area_message wrote into its operand ($129A)."
  },
  {
   "address": 4762,
   "type": "line",
   "text": "The low byte of line 2's LDA operand: $CA for \"NOW RUSH THE ... AREA\" ($124B) or $F1 for \"MISSION COMPLETE\" ($1268)."
  },
  {
   "address": 4762,
   "type": "side",
   "text": "operand rewritten by area_message: the second line's text"
  },
  {
   "address": 4763,
   "type": "line",
   "text": "Line 2's operand high byte, also $12 ($1250, $126D)."
  },
  {
   "address": 4792,
   "type": "line",
   "text": "The four lines of the area message in the game's alphabet: \"BROKE THE XXX AREA\" ($12B8), \"NOW RUSH THE XXX AREA\" ($12CA), \" CONGRATULATIONS\" ($12DF) and \"MISSION COMPLETE\" ($12F1). area_message writes the ordinal over each XXX."
  },
  {
   "address": 4802,
   "type": "line",
   "text": "The XXX of \"BROKE THE XXX AREA\", where area_message copies the ordinal of the area just won ($1230); with \" AREA\" after it and the second line, \"NOW RUSH THE \", from $12CA."
  },
  {
   "address": 4823,
   "type": "line",
   "text": "The XXX of \"NOW RUSH THE XXX AREA\", which gets the next area's ordinal ($1236), then \" AREA\", \" CONGRATULATIONS\" ($12DF) and \"MISSION COMPLETE\" ($12F1)."
  },
  {
   "address": 4870,
   "type": "line",
   "text": "Ordinals for the area message, four bytes each: \"1ST \", \"2ND \", \"3RD \", \"3RD \". Area 2, which is never played, has a copy of area 3's."
  },
  {
   "address": 4874,
   "type": "line",
   "text": "The ordinals from \"2ND \" on: area_message reads them as $130A,Y, four on from the area's own, for the area to come ($1233). For the last area the next is read from past the table's end, into the code at $1316, but that message is never shown."
  },
  {
   "address": 4886,
   "type": "line",
   "text": "Fills the screen $E000-$E3FF with spaces and the colour RAM with white. That runs over the sprite pointers at $E3F8-$E3FF too, which the raster interrupt rewrites every frame."
  },
  {
   "address": 4936,
   "type": "line",
   "text": "Waits Y + 1 frames."
  },
  {
   "address": 4943,
   "type": "line",
   "text": "Adds A, in BCD hundreds of points, to the score ($04F8 low, $04F9 high). A carry out of the low byte, every 10,000 points, also gives a life, redraws the lives and plays effect $0C. Then redraws the score. Values above 9, such as $0A, still add the right amount: the 6502's decimal mode adjusts an invalid low digit when it adds. The score is four BCD digits shown with two fixed zeros, so it wraps at 999,900."
  },
  {
   "address": 4963,
   "type": "line",
   "text": "The INC of the lives for every 10,000 points: the trainer's unlimited lives turns its opcode into LDA ($AD, $45A1), as it does the DEC at $0996."
  },
  {
   "address": 4963,
   "type": "side",
   "text": "extra life; the unlimited-lives trainer writes $AD here, making it LDA $0500"
  },
  {
   "address": 4975,
   "type": "line",
   "text": "Prints the score's four BCD digits at $E34E (glyph = digit + $21); the two zeros after them are part of the HUD text."
  },
  {
   "address": 5027,
   "type": "line",
   "text": "Prints the top high score ($0F36) at $E36A, the HI on the play screen."
  },
  {
   "address": 5079,
   "type": "line",
   "text": "Prints the grenade count ($04FF, two BCD digits) at $E359."
  },
  {
   "address": 5105,
   "type": "line",
   "text": "Prints the lives ($0500, two BCD digits) at $E361, after MEN."
  },
  {
   "address": 5131,
   "type": "line",
   "text": "Twelve bytes of code nothing calls: LDX #$0F / LDA $042D,X / STA $04C2,X / DEX / BPL / RTS, a copy of every slot's height into the multiplexer's table. $3D2A does the same job as it moves the slots."
  },
  {
   "address": 5143,
   "type": "line",
   "text": "Where an unused slot is parked, one byte for each of the 16 slots: $C2 for the player and the three bullets, $28 for the grenade and the first three enemies, $1E for the rest. Read by $3DB5, and from $1418 and $141C by the routines that free a shot ($36FF) or an enemy ($3570)."
  },
  {
   "address": 5144,
   "type": "line",
   "text": "The parking y of slots 1-4, the shot slots, read as $1418,X when a shot is freed ($370A, $3796): $C2, $C2, $C2 and $28."
  },
  {
   "address": 5148,
   "type": "line",
   "text": "The parking y of slots 5-15, the enemies, read as $141C,X when an enemy is freed ($357B): $28 for the first three, $1E for the rest."
  },
  {
   "address": 5159,
   "type": "line",
   "text": "Points the zero-page pointers at the current area's tables (area counter & 3): the map's base page into $0405 (from $3EB0), the spawn list's x ($22), trigger rows ($24), x-high ($26) and handler numbers ($28), and the terrain classes by character ($2A). Also sets the character set, area x 2 in the low nibble of $D018, so area 0 uses $C000, 1 $C800, 2 $D000 and 3 $D800."
  },
  {
   "address": 5253,
   "type": "line",
   "text": "Per area, the address of its spawn list's x column: $1C49, $1CE2, $1DCA, $1DCA (area 2 has area 3's)."
  },
  {
   "address": 5254,
   "type": "line",
   "text": "The high bytes in area_spawn_x, read as $1486,Y with Y twice the area ($144C)."
  },
  {
   "address": 5261,
   "type": "line",
   "text": "Per area, the address of its spawn list's trigger rows: $1C20, $1CC1, $1DA7, $1DA7."
  },
  {
   "address": 5262,
   "type": "line",
   "text": "The high bytes in area_spawn_rows ($1440)."
  },
  {
   "address": 5269,
   "type": "line",
   "text": "Per area, the address of its spawn list's x-high column: $1C71, $1D02, $1DEC, $1DEC."
  },
  {
   "address": 5270,
   "type": "line",
   "text": "The high bytes in area_spawn_xhigh ($1458)."
  },
  {
   "address": 5277,
   "type": "line",
   "text": "Per area, the address of its spawn list's handler numbers: $1C99, $1D22, $1E0E, $1E0E."
  },
  {
   "address": 5278,
   "type": "line",
   "text": "The high bytes in area_spawn_types ($1464)."
  },
  {
   "address": 5285,
   "type": "line",
   "text": "Per area, the address of its terrain table: $178B, $188B, $1A8B, $1A8B. The table at $198B is never pointed at."
  },
  {
   "address": 5286,
   "type": "line",
   "text": "The high bytes in area_terrain ($1470)."
  },
  {
   "address": 5293,
   "type": "line",
   "text": "The four map stamps put down by $14B5, indexed by A = 0, 2, 4, 6: $14E4, $151A, $1550, $1586."
  },
  {
   "address": 5294,
   "type": "line",
   "text": "The high bytes in stamp_sources ($14BC): $14, $15, $15, $15."
  },
  {
   "address": 5301,
   "type": "line",
   "text": "Copies a 6 x 9 block of characters (stamp A/2 from $14AD) into the map at ($FB), 40 bytes to a row. At every life's start $3DE0 puts stamps 0, 1 and 0 back at $88C0, $859A and $8370 in area 1's map, and a grenade that destroys a building puts down stamp 2 or 3 over it ($381D, $3864). The source is an LDA whose operand this routine rewrites."
  },
  {
   "address": 5318,
   "type": "side",
   "text": "operand rewritten by stamp_map: the stamp's source"
  },
  {
   "address": 5319,
   "type": "line",
   "text": "The low byte of stamp_map's LDA operand, from stamp_sources ($14B9); X runs through the stamp's 54 characters."
  },
  {
   "address": 5320,
   "type": "line",
   "text": "The stamp source's high byte ($14BF)."
  },
  {
   "address": 5348,
   "type": "line",
   "text": "Map stamp 0, 6 x 9 characters of area 1's character set: a concrete bunker drawn corner-on, with its slit facing right. Put back at $88C0 and $8370 in area 1's map at every life's start."
  },
  {
   "address": 5402,
   "type": "line",
   "text": "Map stamp 1, 6 x 9 characters: the same bunker facing the other way, slit to the left. Put back at $859A in area 1's map at every life's start."
  },
  {
   "address": 5456,
   "type": "line",
   "text": "Map stamp 2, 6 x 9 characters: the right-facing bunker blown open, its roof gone and rubble inside. A grenade that destroys the bunker puts it down over the bunker ($381D)."
  },
  {
   "address": 5510,
   "type": "line",
   "text": "Map stamp 3, 6 x 9 characters: the left-facing bunker blown open. Put down at $859A, where stamp 1 stands, when the bunker destroyed is the one whose $04AC is $0A ($3864)."
  },
  {
   "address": 5564,
   "type": "line",
   "text": "Draws the gate in the wall at the top of the map, 15 x 9 characters from map row 0, column 13, in areas 0 and 1 (area counter & 3 = 3 returns at once; area 3's map ends differently). A = 0 draws it closed ($1603), at every life's start ($3E43); A = 2 draws it open ($168A), when spawn handler 11 ($1E43) comes up in the list (row $01 in both areas) and when the area's last gate soldier is gone ($3A35). The source is an LDA operand it rewrites."
  },
  {
   "address": 5601,
   "type": "side",
   "text": "operand rewritten by draw_gate: the picture's source"
  },
  {
   "address": 5602,
   "type": "line",
   "text": "The low byte of draw_gate's LDA operand, from gate_pictures ($15C0)."
  },
  {
   "address": 5603,
   "type": "line",
   "text": "The gate picture's high byte ($15C6)."
  },
  {
   "address": 5631,
   "type": "line",
   "text": "The two gate pictures for draw_gate: $1603 and $168A."
  },
  {
   "address": 5632,
   "type": "line",
   "text": "The high bytes in gate_pictures, read as $1600,X ($15C3), both $16; $1601 holds the open gate's low byte, $8A."
  },
  {
   "address": 5635,
   "type": "line",
   "text": "Gate picture 0, 15 x 9 characters: a closed double gate between two stretches of stone wall."
  },
  {
   "address": 5770,
   "type": "line",
   "text": "Gate picture 1, 15 x 9 characters: the same gateway standing open, the ground showing through."
  },
  {
   "address": 5905,
   "type": "line",
   "text": "Turns a sprite position into the address of the map character under it: the column is (x - 16) / 8 from $04F0, plus 32 when the x-high flag $04F2 is set (the 8-bit subtraction's borrow already gets x 256-271 right), and the row is (y - 30) / 8 from $04F1 plus the map row at the top of the screen ($0403). Leaves the address, the area's map base page $0405 added, in $FC/$FD. Most callers read the character there and look it up in the area's terrain table ($2A); $2E54 compares it with character $30, and $380C hands the address to stamp_map ($14B5) to put down a ruined bunker."
  },
  {
   "address": 6027,
   "type": "line",
   "text": "Area 0's terrain class for each of the 256 characters. Bit 0: a wall, which stops the player (looked ahead of him at $3C04-$3C08), turns a walking soldier aside ($28BA) and stops a bullet, turning it into a spark ($3993). Bit 1: scenery the sprites pass behind ($28F0, $36A9). Bit 2, water or a hole, is not used in this area. Values 0-3."
  },
  {
   "address": 6283,
   "type": "line",
   "text": "Area 1's terrain class for each of the 256 characters, as for area 0, with bit 2 (value 4) on the characters of water and holes: the player walking onto one falls in ($3C0A, then $3C10) and soldiers turn away from them as from a wall ($28BA)."
  },
  {
   "address": 6539,
   "type": "line",
   "text": "A fourth terrain table, laid out like the others (values 0-4), that $14A5 never points at: area 2 uses $1A8B, area 3's. Nothing reads it."
  },
  {
   "address": 6795,
   "type": "line",
   "text": "Area 3's terrain class for each of the 256 characters (also used for area 2), with water and holes marked by bit 2 as in area 1."
  },
  {
   "address": 7051,
   "type": "line",
   "text": "The spawner, run on every pass of the game logic ($08F7). When the next entry of the area's spawn list ($04E8) has a trigger row equal to the map row now at the top of the screen ($0403), it steps past the entry and looks for one of the eleven enemy slots: a free one (the search runs twice, the second pass identical to the first), else one holding an enemy bullet or its spark, a score sprite, an explosion, a dying soldier, an enemy grenade or a rifle soldier (behaviours 8, 9, $13, $0C, 6, $0B or 5), which is overwritten. With none the entry is lost; with one it jumps to the entry's handler from $1BE8 with X = the slot and $FD = the entry's index. The lists run from the bottom of the map up, and entries sharing a row come due on successive frames."
  },
  {
   "address": 7075,
   "type": "side",
   "text": "a second free-slot search, identical to the first, which can never succeed where the first failed"
  },
  {
   "address": 7087,
   "type": "side",
   "text": "the third pass takes over a slot in use; behaviour 5, the ordinary rifle soldier, is among those given up"
  },
  {
   "address": 7144,
   "type": "line",
   "text": "The 28 spawn handlers, by the handler number in a spawn list: 0 $2253 a soldier lying in wait, 1 $22C6 and 2 $230B soldiers running in from the right or left who jump, 3 $221E a soldier in a trench, 4 $21A3 a motorcycle and sidecar, 5 $2172 a guard, 6 $2141 a prisoner, 7 $2111 a box of grenades, 8 $2350 and 9 $2367 soldiers walking in from the left or right, 10 $20D8 and 12 $23AE grenade throwers from the right, 11 $1E43 the gate opening, 13 $2093 a green soldier, 14 $228B a foxhole, 15 $2035 and 16 $2064 a bunker's gun, 17 $1FE3 and 18 $1FFF bomb throwers, 19 $1F71 and 22 $1F41 vehicles crossing, 20 $1ECF a lorry dropping soldiers, 21 $1E91 a jeep from behind, 23 $1E55 and 24 $1E48 a door that lets a soldier out, 25 $1E3A a sniper, 26 $1E31 a mortar man, 27 $1E30 nothing (each list's last entry)."
  },
  {
   "address": 7145,
   "type": "line",
   "text": "The spawn handlers' addresses from the first one's high byte on, the 28 entries to $1C1F, read as $1BE9,Y for the high bytes ($10BD, $1BDF)."
  },
  {
   "address": 7200,
   "type": "line",
   "text": "Area 0's spawn list, trigger rows: 40 entries from the bottom of the map up (row $9E first), ended by $FF. Each entry's x, x-high and handler number are at the same index in $1C49, $1C71 and $1C99."
  },
  {
   "address": 7241,
   "type": "line",
   "text": "Area 0's spawn list, x of each entry (the low byte). Handlers 8 and 9 use it as the number of frames the soldier walks in before turning down the screen."
  },
  {
   "address": 7281,
   "type": "line",
   "text": "Area 0's spawn list, x-high of each entry ($FF = right of x 255). Handlers 8 and 9 use it as a map row instead: the soldier walks in at the height of that row, which is why values such as $58 appear."
  },
  {
   "address": 7321,
   "type": "line",
   "text": "Area 0's spawn list, handler number of each entry (index into $1BE8), ending with 27, the empty handler."
  },
  {
   "address": 7361,
   "type": "line",
   "text": "Area 1's spawn list, trigger rows: 32 entries from row $A5 up, ended by $FF; x, x-high and handlers at $1CE2, $1D02 and $1D22."
  },
  {
   "address": 7394,
   "type": "line",
   "text": "Area 1's spawn list, x of each entry."
  },
  {
   "address": 7426,
   "type": "line",
   "text": "Area 1's spawn list, x-high of each entry (a map row for handlers 8 and 9)."
  },
  {
   "address": 7458,
   "type": "line",
   "text": "Area 1's spawn list, handler number of each entry."
  },
  {
   "address": 7490,
   "type": "line",
   "text": "A fourth spawn list that no pointer in $1485-$149C reaches, trigger rows: 25 entries from row $C6 up, ended by $FF, laid out exactly as the three in use, with x, x-high and handlers at $1D5C, $1D75 and $1D8E. Its first two rows, $C6 and $C4, lie near the map's bottom, below where any area in use starts. With area 2's table entries copying area 3's, it reads like the list of an area that is no longer played."
  },
  {
   "address": 7516,
   "type": "line",
   "text": "The unused spawn list, x of each entry."
  },
  {
   "address": 7541,
   "type": "line",
   "text": "The unused spawn list, x-high of each entry (a map row for handlers 8 and 9)."
  },
  {
   "address": 7566,
   "type": "line",
   "text": "The unused spawn list, handler number of each entry: doors (handlers 23 and 24) above all, ending with 27 like the others."
  },
  {
   "address": 7591,
   "type": "line",
   "text": "Area 3's spawn list (also area 2's), trigger rows: 34 entries from row $B4 up, ended by $FF; x, x-high and handlers at $1DCA, $1DEC and $1E0E."
  },
  {
   "address": 7626,
   "type": "line",
   "text": "Area 3's spawn list, x of each entry."
  },
  {
   "address": 7660,
   "type": "line",
   "text": "Area 3's spawn list, x-high of each entry, $00 or $FF: this list has no handler 8 or 9, whose entries would hold a map row here."
  },
  {
   "address": 7694,
   "type": "line",
   "text": "Area 3's spawn list, handler number of each entry."
  },
  {
   "address": 7728,
   "type": "line",
   "text": "Spawn handler 27: does nothing. Every list ends with it, at the entry before the $FF."
  },
  {
   "address": 7729,
   "type": "line",
   "text": "Spawn handler 26: a soldier in a trench ($221E) given behaviour 40 instead, the mortar man ($2579)."
  },
  {
   "address": 7738,
   "type": "line",
   "text": "Spawn handler 25: a soldier lying in wait ($2253) given behaviour 39 instead, the sniper who never gets up ($25D2)."
  },
  {
   "address": 7747,
   "type": "line",
   "text": "Spawn handler 11: redraws the gate at the top of the map open ($15BC with A = 2), when row $01 comes up in areas 0 and 1. Uses no slot, though the spawner has found one."
  },
  {
   "address": 7752,
   "type": "line",
   "text": "Spawn handler 24: a door, block $F5, whose soldier will walk out down and to the right (heading 6). Shares the rest with $1E55."
  },
  {
   "address": 7765,
   "type": "line",
   "text": "Spawn handler 23: a door, block $F4, whose soldier will walk out down and to the left (heading $0A). The door stands at the list's x and x-high, y $28, grey and behind the scenery, with a random start to its timer, and runs behaviour 38 ($25DB)."
  },
  {
   "address": 7775,
   "type": "line",
   "text": "The rest of a door: at the list's x and x-high, y $28, grey ($0B), still, with a random start to its timer, behind the scenery, running behaviour $26 (38, $25DB)."
  },
  {
   "address": 7823,
   "type": "line",
   "text": "The two columns a jeep from behind can start in, x $78 or $D2, picked at random by $1E91."
  },
  {
   "address": 7825,
   "type": "line",
   "text": "Spawn handler 21: a jeep (block $F3, blue) that drives up from the bottom of the screen (y $B8, two pixels a frame) at x $78 or $D2, running behaviour 37 ($2657). Plays effect 5."
  },
  {
   "address": 7887,
   "type": "line",
   "text": "Spawn handler 20: a lorry two sprites wide (blocks $F1 and $F2, orange) entering from the right at x $13E, y $64, one pixel a frame to the left. The front runs behaviour 35 (nothing of its own) and the back, in the next free slot, behaviour 36, which drops soldiers ($2679). Each half's $04A1 names the other."
  },
  {
   "address": 7946,
   "type": "line",
   "text": "The lorry's back half, in the next free slot Y: each half names the other in $04A1; the back is 24 pixels right of the front, at x $156, y $64, block $F2, orange, driving left with it a pixel a frame."
  },
  {
   "address": 8001,
   "type": "line",
   "text": "Spawn handler 22: a vehicle two sprites wide (blocks $B6 and $B7, purple) crossing from the left at x $1E, y $82, two pixels a frame. Built by $1F71 and then moved and recoloured. When $1F71 finds no free slot it returns with Y = $0B, and the stores meant for the second half land on the player's own fields: x $041D, y $042D, block $045D and the speeds $046D and $047D."
  },
  {
   "address": 8049,
   "type": "line",
   "text": "Spawn handler 19: a motorcycle and sidecar, two sprites wide (blocks $B0 and $B1, grey), crossing from the right at x $13E, y $82, two pixels a frame to the left. The leader runs behaviour 34 ($26BF) and the other half, in the next free slot, behaviour 16 (it is only carried along); each half's $04A1 names the other. The search for the second slot runs before the leader's own slot is marked. With no free slot at all (the spawner took over a busy one) it returns at once with Y = $0B and sets up nothing; when the leader's slot is itself the first free one (always at a life's start, $109B, and in play when it is the only one free) both halves are written into that slot, which ends as a lone carried half (behaviour 16, block $B1) drifting left."
  },
  {
   "address": 8163,
   "type": "line",
   "text": "Spawn handler 17: a bomb thrower (block $E6, blue) entering from the right at x $146, y $1E, walking left. Shares the rest with $1FFF."
  },
  {
   "address": 8191,
   "type": "line",
   "text": "Spawn handler 18: a bomb thrower entering from the left at x $32, y $1E, walking right. Both run behaviour 32 ($2706)."
  },
  {
   "address": 8216,
   "type": "line",
   "text": "The rest of a bomb thrower: block $E6, blue, no y-speed, timer zero, in front of the scenery, running behaviour $20 (32, $2706)."
  },
  {
   "address": 8245,
   "type": "line",
   "text": "Spawn handler 15: the gun in a bunker's slit, block $FC, at x $2C, y $24, aimed down and to the right (heading 6), running behaviour 30 ($27C6)."
  },
  {
   "address": 8292,
   "type": "line",
   "text": "Spawn handler 16: the gun in the other bunker's slit, block $FD, at x $130, y $1E, aimed down and to the left (heading $0A), running behaviour 30 ($27C6)."
  },
  {
   "address": 8339,
   "type": "line",
   "text": "Spawn handler 13: a green soldier (block $B9) at x $A0, y $50, walking diagonally down to the left or the right at random, running behaviour 26 ($2906)."
  },
  {
   "address": 8408,
   "type": "line",
   "text": "Spawn handler 10: a soldier (block $D5) entering from the right at x $15A, y $1E, walking left, running behaviour 24 ($299D), who stops now and then to throw grenades."
  },
  {
   "address": 8465,
   "type": "line",
   "text": "Spawn handler 7: a box of grenades (block $BB) at the list's x and x-high, y $26, running behaviour 22 ($2A5A)."
  },
  {
   "address": 8513,
   "type": "line",
   "text": "Spawn handler 6: a prisoner (block $C2, blue like the player) at the list's x, y $21, running behaviour 18 ($2AE9). Keeps the slot in $04ED so the guards' handler can free him."
  },
  {
   "address": 8562,
   "type": "line",
   "text": "Spawn handler 5: a guard (block $C0, grey) at the list's x, y $21, running behaviour 17 ($2B0C). Zeroes the count of guards shot ($04EC)."
  },
  {
   "address": 8611,
   "type": "line",
   "text": "Spawn handler 4: a motorcycle and sidecar (blocks $B0 and $B1, brown) entering from the right at x $120, y $21, two pixels a frame to the left. The leader runs behaviour 15 ($2B2F), the other half behaviour 16 and is carried along; the leader's $04A1 names the sidecar's slot, but the sidecar's own $04A1 is left as it was."
  },
  {
   "address": 8670,
   "type": "line",
   "text": "The motorcycle's sidecar half, in the next free slot Y, whose number goes into the rider's $04A1 (the sidecar's own $04A1 is not set); it sits 24 pixels to the right of the rider at x $138, y $21, block $B1."
  },
  {
   "address": 8721,
   "type": "line",
   "text": "Thirteen bytes of code nothing reaches: LDY #0 / LDA $0492,Y / BEQ / INY / CPY #$0B / BNE / RTS, the free-slot search that several handlers have inline."
  },
  {
   "address": 8734,
   "type": "line",
   "text": "Spawn handler 3: a soldier in a trench (block $CD, red, behind the scenery) at the list's x and x-high, y $21, running behaviour 13 ($2BC1). Also called by $1E31."
  },
  {
   "address": 8787,
   "type": "line",
   "text": "Spawn handler 0: a soldier lying in wait (block $C8, grey) at the list's x and x-high, y $26, facing down, running behaviour 7 ($2FA4). Also called by $1E3A."
  },
  {
   "address": 8843,
   "type": "line",
   "text": "Spawn handler 14: a foxhole (block $ED) at the list's x and x-high, y $2A, with a random start to its timer, running behaviour 28 ($2858)."
  },
  {
   "address": 8902,
   "type": "line",
   "text": "Spawn handler 1: a soldier (block $D5) running in from the right at x $15A, two pixels a frame, at the height of map row $9F counted from the trigger row, running behaviour 10 ($303D), who jumps on his 30th frame."
  },
  {
   "address": 8971,
   "type": "line",
   "text": "Spawn handler 2: a soldier (block $D9) running in from the left at x 1, two pixels a frame, at the height of map row $86 counted from the trigger row, running behaviour 10 ($303D)."
  },
  {
   "address": 9040,
   "type": "line",
   "text": "Spawn handler 8: a soldier walking in from the left at x 1. Shares $237B with $2367."
  },
  {
   "address": 9063,
   "type": "line",
   "text": "Spawn handler 9: a soldier walking in from the right at x $15A. Both are given block $D5, behaviour $17 (23, $2A16), the list's x-high column as the map row whose height they walk in at, and the list's x column as the number of frames before they turn down the screen ($04A1)."
  },
  {
   "address": 9083,
   "type": "line",
   "text": "The rest of a walker from the side: block $D5, grey ($0B), no y-speed, its timer zero, behaviour $17 (23, $2A16), and its height and walking time ($04A1) from the spawn list's entry."
  },
  {
   "address": 9134,
   "type": "line",
   "text": "Spawn handler 12: a soldier (block $D5) entering from the right at x $15A, y $1E, one pixel a frame, running behaviour 25 ($2938), who stops to throw grenades and later walks off to the right."
  },
  {
   "address": 9191,
   "type": "line",
   "text": "An enemy (slot Y) is hit by the player's bullet or grenade (X is the shot, in slot X + 1). Adds its points from $254F, then by behaviour: a soldier lying in wait or in a foxhole (7, $1C) sinks out of sight (behaviour $1D, block $CB); the green soldier ($1A) leaves a white score sprite reading 2000 (block $BC, behaviour $13), though the points added are $14, 1,400; a guard ($11) hit by a bullet leaves a score sprite reading 1000 (block $BD) and counts in $04EC, and the second guard shot frees the prisoner ($04ED gets behaviour $14); a lorry half ($23, $24) blows up together with its other half ($2ECD); anything else falls dead (behaviour 6)."
  },
  {
   "address": 9229,
   "type": "line",
   "text": "A hit on the green soldier (behaviour $1A): the slot becomes a white score sprite reading 2000 (block $BC, behaviour $13), though the points added are $14, 1,400."
  },
  {
   "address": 9254,
   "type": "line",
   "text": "A hit on a guard (behaviour $11): he becomes a score sprite reading 1000 (block $BD) and is counted in $04EC; the second guard shot frees the prisoner ($244D). The test for a grenade's blast (shot type 4) would make him an ordinary dying soldier, but the hit table ($2526) lets only bullets reach a guard."
  },
  {
   "address": 9261,
   "type": "side",
   "text": "a test for a grenade's blast (shot type 4), which never reaches here: a blast cannot hit a guard ($2526)"
  },
  {
   "address": 9319,
   "type": "line",
   "text": "A hit on either half of a lorry (behaviours $23 and $24): both halves become explosions ($2ECD)."
  },
  {
   "address": 9348,
   "type": "line",
   "text": "Anything else hit becomes a dying soldier (behaviour 6), stopped, its timer zero."
  },
  {
   "address": 9353,
   "type": "line",
   "text": "Stops the slot hit: timer zero and both speeds zero."
  },
  {
   "address": 9365,
   "type": "line",
   "text": "Runs the eleven enemy slots (5-15, X = 0-10 here, so the fields read $0412, $0422, $0432 ... for slot X + 5) on every pass of the game logic ($08F7), which misses the frame on which the map moves a whole row. First zeroes the count of gate soldiers alive ($04F4), which their behaviour counts up again. A slot whose sprite has left the play area (y above $1E or from $C2 down, or x from $15B on) is freed first ($3570). Then each slot's behaviour number ($0492) picks its routine from $24D4, called through $24D1; a free slot has behaviour 0, which may start an ambient soldier in it. Two routines return with X changed and the walk goes on from there: a trench soldier's lob ($2C64, X = $FF from $3537) sends it back to enemy 0, and a box picked up ($2AA6, X = 0 from the effect request) back to enemy 1, so the slots from there up to theirs run twice in that pass."
  },
  {
   "address": 9413,
   "type": "side",
   "text": "a count no code reads"
  },
  {
   "address": 9425,
   "type": "line",
   "text": "An indirect JMP through $FB/$FC, so the dispatcher can JSR to the behaviour's routine."
  },
  {
   "address": 9428,
   "type": "line",
   "text": "The 41 enemy behaviours, by behaviour number: 0 $2CBB a free slot, 5 $31E7 a rifle soldier, 6 $3543 a soldier dying, 7 $2FA4 a soldier lying in wait, 8 $2F19 an enemy bullet, 9 $2F6F its spark, 10 $303D a soldier who jumps, 11 $2EA1 an enemy's grenade, 12 $386D an explosion, 13 $2BC1 a soldier in a trench, 14 $2EED a mortar bomb, 15 $2B2F a motorcycle that stops, 16 $2578 the half of a pair that is carried, 17 $2B0C a guard, 18 $2AE9 a prisoner, 19 $2ADB a score sprite, 20 $2ABC a freed prisoner, 21 $30BF a soldier risen from cover, 22 $2A5A a box of grenades, 23 $2A16 a soldier walking in, 24 $299D and 25 $2938 grenade throwers, 26 $2906 the green soldier, 27 $31D2 a soldier from the gate, 28 $2858 a foxhole, 29 $2842 a soldier sinking, 30 $27C6 a bunker's gun, 31 and 33 $2F61 a bomb, 32 $2706 a bomb thrower, 34 $26BF a vehicle crossing, 35 $2678 a lorry's front, 36 $2679 its back, 37 $2657 a jeep, 38 $25DB a door, 39 $25D2 a sniper, 40 $2579 a mortar man. Entries 1-4 are the player's shot routines ($3917, $365C, $36E0, $371E), which no enemy is given in play: the name entry gives its gunsight, slot 5, behaviour 1 ($0BB8), but the enemy loop does not run there."
  },
  {
   "address": 9429,
   "type": "line",
   "text": "The behaviours' addresses from the first one's high byte on, the 41 entries to $2525, read as $24D5,Y for the high bytes ($24BF)."
  },
  {
   "address": 9510,
   "type": "line",
   "text": "What can hit each behaviour: bit 0 the player's bullets ($3917), bit 1 a grenade's blast ($371E). Rifle soldiers, jumpers, risen soldiers, walkers, grenade throwers, the green soldier, gate soldiers and bomb throwers (5, 10, 21, 23-27, 32) take both; soldiers lying in wait, in trenches and foxholes, bunker guns, lorries, snipers and mortar men (7, 13, 28, 30, 35, 36, 39, 40) only a grenade; guards (17) only a bullet. Prisoners, vehicles, jeeps, doors and anything thrown are never hit."
  },
  {
   "address": 9551,
   "type": "line",
   "text": "Points for hitting each behaviour, in hundreds and in BCD, added by $23E7: 3 (300) for most soldiers, 2 for a foxhole, 5 for a trench soldier, a bomb thrower, a sniper or a mortar man, $0A (1,000) for a guard or either half of a lorry, $14 (1,400) for the green soldier. A bunker's gun is listed at $0A, but a grenade that destroys it takes the path at $37B1, which adds its own 1,000."
  },
  {
   "address": 9592,
   "type": "line",
   "text": "Behaviour 16: nothing. The second sprite of a motorcycle and sidecar is moved by its leader."
  },
  {
   "address": 9593,
   "type": "line",
   "text": "Behaviour 40, the mortar man in his trench. Every 64 frames he fires a mortar bomb at the player when $32CF can (a free slot, the player on his side of x 256), the bomb then made behaviour $0E with block $D0, black; the shared flag $04EA, set whether or not a bomb went out, then plays his three-frame recoil ($CF, $CE, $CD at frames 3, 15 and 20 of the 32) and clears itself. The flag is shared with the trench soldiers ($2BC1), so one man's shot can set another's animation going."
  },
  {
   "address": 9638,
   "type": "line",
   "text": "Every 64 frames of his timer the mortar man tries to fire at the player ($32CF, which needs a free slot and the player on his side of x 256) and starts his recoil ($04EA = 1) either way."
  },
  {
   "address": 9682,
   "type": "line",
   "text": "Behaviour 39, the sniper: a soldier lying in wait who never gets up. Turns to face the player ($2FEE) and fires ($33B2) on every pass he is allowed to."
  },
  {
   "address": 9691,
   "type": "line",
   "text": "Behaviour 38, a door in a wall. Every 128 frames it slides up for 15 frames (dy = -1, the y-speed doubling as its state), then down for 15, and at the turn lets out a rifle soldier (behaviour 5, dark grey) 16 pixels below it, walking out in the door's heading ($04AC, down-left or down-right)."
  },
  {
   "address": 9725,
   "type": "line",
   "text": "Fifteen frames after the turn the door is shut again and stops."
  },
  {
   "address": 9731,
   "type": "line",
   "text": "Fifteen frames after it started up the door is open: it turns to slide down (y-speed 1) and lets out a rifle soldier (behaviour 5, grey) in the first free slot, 16 pixels below it, walking in the door's heading."
  },
  {
   "address": 9815,
   "type": "line",
   "text": "Behaviour 37, the jeep from behind: faces the player's direction ($310A) and fires ($33B2) as it drives up the screen, slowing to one pixel a frame at frame 70 and speeding up to two again at frame 140."
  },
  {
   "address": 9848,
   "type": "line",
   "text": "Behaviour 35: the front half of the lorry does nothing of its own; it moves with the speed it was given. Also the RTS the routines around it branch to."
  },
  {
   "address": 9849,
   "type": "line",
   "text": "Behaviour 36, the back of the lorry: every 64 frames it drops a soldier ten pixels to its right, a jumper (behaviour 10, orange, x-speed 1) whose timer starts at 29, so he jumps on the next frame."
  },
  {
   "address": 9919,
   "type": "line",
   "text": "Behaviour 34, the leading half of a vehicle crossing the screen: every 16 frames it moves itself and its other half ($04A1) down a pixel. The bob back up copies the motorcycle's at $2B84, but with the timer masked to its low four bits the value compared with $10 is 1-15, or the y just stored on the frame of the step down, so it would run only at y $10, outside the play area, and the vehicle drifts down."
  },
  {
   "address": 9941,
   "type": "side",
   "text": "A holds the timer's low bits (1-15) or the y just stored, never $10 unless the y is"
  },
  {
   "address": 9955,
   "type": "line",
   "text": "35 bytes of code nothing reaches: a behaviour that waits until its timer reaches 60, then becomes an explosion (behaviour $0C), stopped, with the spark table's first block ($36F6)."
  },
  {
   "address": 9990,
   "type": "line",
   "text": "Behaviour 32, the bomb thrower: walks in its heading, animated from $27C2 every 8 frames. Every 32 frames, if the player is level with him or below and a slot is free, he stops for a moment (block $E8) and throws a bomb from his own position: behaviour $21 (33), white, falling two pixels a frame, drawn and aimed by where the player is: down-left (block $EA) when the player is 30 or more pixels to his left, and always when the thrower is right of x 255; down-right ($EB) when the player is more than 30 to his right; straight down ($E9) otherwise. The player's x-high is not looked at. The bomb explodes after 90 frames ($2F61)."
  },
  {
   "address": 10038,
   "type": "line",
   "text": "The bomb thrower throws, if the player is level with him or below and a slot is free: he stops (block $E8) and the free slot becomes a bomb (behaviour $21, white), aimed straight down, down-left or down-right by where the player is."
  },
  {
   "address": 10064,
   "type": "side",
   "text": "the same store twice; dy is left as it was"
  },
  {
   "address": 10178,
   "type": "line",
   "text": "The bomb thrower's walk, four blocks: $E5, $E6, $E7, $E6."
  },
  {
   "address": 10182,
   "type": "line",
   "text": "Behaviour 30, the gun in a bunker's slit: every 32 frames, if the player is level with it or below and a slot is free, it fires a shell (behaviour $1F (31), black, block $D2) from six pixels below it and eight to the side it faces, moving one pixel down and two across a frame, which explodes after 90 frames ($2F61). Only a grenade destroys it ($37B1)."
  },
  {
   "address": 10291,
   "type": "line",
   "text": "The right-hand bunker gun's shell moves two pixels a frame to the right and starts eight pixels right of the gun."
  },
  {
   "address": 10306,
   "type": "line",
   "text": "Behaviour 29, a soldier shot in a foxhole or lying down: shows block $CB, then $CC from frame 10, and is gone at frame 20."
  },
  {
   "address": 10328,
   "type": "line",
   "text": "Behaviour 28, a foxhole: its soldier rises and ducks in a 128-frame cycle of eight 16-frame steps from $287D, standing up (block $C8) for three of them. While he stands he fires ($33B2), turning to face the player ($2FEE) once he is at y $50 or lower."
  },
  {
   "address": 10365,
   "type": "line",
   "text": "The foxhole's eight steps: $EC, $ED (rising), $C8 three times (up and firing), $ED, $EC, $EC."
  },
  {
   "address": 10373,
   "type": "line",
   "text": "Finds the map cell four steps ahead of enemy X: its x and y plus four times its speeds, into $04F0-$04F2, then the cell's address ($1711, which leaves it in $FC/$FD)."
  },
  {
   "address": 10426,
   "type": "line",
   "text": "After $2885: if the cell ahead is a wall or water (terrain bit 0 or 2), turns the enemy round, adding 4 to 11 sixteenths of a turn at random to its heading ($04A1), and sets its speeds from the heading tables ($32AF, $32BF)."
  },
  {
   "address": 10479,
   "type": "line",
   "text": "The cell ahead was clear: the enemy keeps its heading."
  },
  {
   "address": 10480,
   "type": "line",
   "text": "After $2885: puts the enemy behind the scenery ($0442 = $FF) when the cell ahead has terrain bit 1, in front otherwise."
  },
  {
   "address": 10502,
   "type": "line",
   "text": "Behaviour 26, the green soldier: walks, turning away from walls ($28BA), in front of or behind the scenery ($28F0), with two walk frames for each direction ($2934). Never fires. Hitting him leaves a score sprite reading 2000 ($23E7)."
  },
  {
   "address": 10548,
   "type": "line",
   "text": "The green soldier's frames: $B9 and $BA walking right, $EF and $F0 walking left."
  },
  {
   "address": 10550,
   "type": "line",
   "text": "The green soldier's frames walking left, $EF and $F0, every eight frames ($291D)."
  },
  {
   "address": 10552,
   "type": "line",
   "text": "Behaviour 25, a grenade thrower who walks in from the right for 100 frames, then stands. Standing, he raises a grenade (block $E3) every 16 frames and throws it eight frames later (block $E4, $32CF). From frame 200 he turns right and walks off at one pixel a frame."
  },
  {
   "address": 10594,
   "type": "line",
   "text": "The grenadier raises his grenade: block $E3."
  },
  {
   "address": 10608,
   "type": "line",
   "text": "From frame 200 the grenadier turns right (heading 4) and walks off a pixel a frame."
  },
  {
   "address": 10621,
   "type": "line",
   "text": "The grenadier's walk frame for his heading, from the shared walk table ($3CA2), a new frame every four frames."
  },
  {
   "address": 10653,
   "type": "line",
   "text": "Behaviour 24, a soldier who throws grenades as he goes: every 64 frames he stops (block $E3), throws at frame 6 of the 64 ($32CF), and at frame 20 sets off again, his heading turned a sixteenth of a turn either way at random. On every other frame of the 64, standing or walking, he turns from walls, goes behind scenery and may fire his rifle ($33B2)."
  },
  {
   "address": 10687,
   "type": "line",
   "text": "At frame 20 of each 64 the grenadier sets off again, his heading turned a sixteenth either way at random, with that heading's speeds."
  },
  {
   "address": 10726,
   "type": "line",
   "text": "From frame 20 of each 64 he walks, animated from the shared walk table; before it he stands."
  },
  {
   "address": 10761,
   "type": "line",
   "text": "Every frame but frames 0, 6 and 20 of each 64: the map ahead ($2885), turning from walls ($28BA), going behind scenery ($28F0), and a chance to fire ($33B2)."
  },
  {
   "address": 10774,
   "type": "line",
   "text": "Behaviour 23, a soldier walking in from the side (handlers 8 and 9): walks in its heading, animated from the shared walk frames ($3CA2), behind the scenery where the map says, and when its timer reaches the count the spawn list gave it ($04A1) turns down the screen (heading 8). It never fires and does not turn at walls."
  },
  {
   "address": 10823,
   "type": "line",
   "text": "The walker's timer has reached the spawn list's count: he turns down the screen (heading 8) and takes that heading's speeds ($32AF, $32BF)."
  },
  {
   "address": 10842,
   "type": "line",
   "text": "Behaviour 22, a box of grenades. When the player stands on it (same x-high, the box's x from 14 pixels left of his to 15 right, its y from 9 above his to 18 below) he gains three grenades, the count is redrawn, 1,000 points are added and effect 0 plays, and the box goes. The box flashes between colours $0B and $08 every 8 frames. The effect request returns with X = 0 ($5F56 loads it from $5526, 0 while effects are on), so on the frame of the pickup that colour store lands on enemy 0 and the enemy loop goes on from enemy 1 ($2495). When the 1,000 points cross a multiple of 10,000, the extra life's effect zeroes X before $3570 too, which then frees enemy 0 instead; unless the box is enemy 0, the loop reaches it again and it pays out a second time, six grenades and 2,000 points in all."
  },
  {
   "address": 10895,
   "type": "line",
   "text": "The operand of the LDA #$03 that gives three grenades for a box: the trainer's unlimited grenades zeroes it ($45BC)."
  },
  {
   "address": 10921,
   "type": "line",
   "text": "The grenade box flashes grey ($0B) and orange ($08), changing every eight frames."
  },
  {
   "address": 10940,
   "type": "line",
   "text": "Behaviour 20, a freed prisoner: waves (blocks $C4 and $C5, every 8 frames) for 100 frames, then goes. Freeing him adds no points of his own."
  },
  {
   "address": 10969,
   "type": "line",
   "text": "The freed prisoner's two frames, arms up: $C4 and $C5."
  },
  {
   "address": 10971,
   "type": "line",
   "text": "Behaviour 19, a score sprite (2000 or 1000) left where a green soldier or a guard was shot: gone after 65 frames."
  },
  {
   "address": 10985,
   "type": "line",
   "text": "Behaviour 18, a prisoner: two frames ($2B0A), standing, until the top of the screen passes map row $71; then he walks up and to the left, one pixel a frame each way, with the guards."
  },
  {
   "address": 11018,
   "type": "line",
   "text": "The prisoner's two frames: $C2 and $C3."
  },
  {
   "address": 11020,
   "type": "line",
   "text": "Behaviour 17, a guard: as the prisoner, with frames $C0 and $C1, leading him up and to the left once the top of the screen passes map row $71. Shooting both guards (only a bullet counts) frees the prisoner ($23E7)."
  },
  {
   "address": 11053,
   "type": "line",
   "text": "The guard's two frames: $C0 and $C1."
  },
  {
   "address": 11055,
   "type": "line",
   "text": "Behaviour 15, the motorcycle and sidecar that stops (handler 4). Coming in from the right it bobs a pixel down and up every 32 pixels, slows to one pixel a frame at x $B4 and stops at x $A5. Stopped, the pair alternates two frame pairs every 16 frames ($B2/$B3, $B4/$B5) and the passenger throws a grenade every 32 frames ($32CF), until the scrolling map has carried it down to y $73; then it rides off to the left (blocks $B0/$B1), speeding up again at x $A0."
  },
  {
   "address": 11140,
   "type": "line",
   "text": "The motorcycle in motion (the rider and the sidecar together, Y the other half): for 16 pixels in every 32 of its x it rides a pixel lower, and between x $B4 and x $A0 it slows to a pixel a frame, then goes back to two."
  },
  {
   "address": 11201,
   "type": "line",
   "text": "Behaviour 13, a soldier in a trench, shown with the recoil frames he shares with the mortar man ($04EA). Every 64 frames, if a slot is free and the player's x is from $2F to $FF (x-high clear), he lobs a mortar bomb (behaviour $0E, block $D0, black) to the left: its x-speed is ($12E - the player's x) / 64 made negative, -1 to -3, so always leftward, and its y-speed the distance down to the player / 64, less 2; the distance is shifted as an unsigned byte, so with the player above him the y-speed comes out 0 or 1. When the map has carried him down to y $82 he climbs out and becomes a rifle soldier (behaviour 5) walking up the screen."
  },
  {
   "address": 11246,
   "type": "line",
   "text": "The trench soldier climbs out when the map has carried him down to y $82: block $98, x-speed 0, y-speed -1, heading up (0), timer zero, and from then on a rifle soldier (behaviour 5) walking up."
  },
  {
   "address": 11283,
   "type": "line",
   "text": "The trench soldier's lob, every 64 frames of his timer, if a slot is free and the player is left of x 256 and not at the far left (x $2F-$FF): the free slot becomes a mortar bomb from two pixels above him, its speeds from the distance to the player ($3537), and his recoil starts ($04EA, block $CE)."
  },
  {
   "address": 11427,
   "type": "line",
   "text": "Where the soldiers entering from the side at the gate start (area 1, $2D08), four ways chosen at random, six tables of four: x ($2CA3: $29, $29, $32, $32), y before a random 0-7 is added ($2CA7: $78, $A5, $78, $A5), x-speed ($2CAB: 1, 1, -1, -1), heading ($2CAF: right, right, left, left), block ($2CB3: $9B) and x-high ($2CB7: 0, 0, $FF, $FF). So two from the left edge and two from the right, each at one of two heights."
  },
  {
   "address": 11431,
   "type": "line",
   "text": "The side entries' y before a random 0-7 is added ($2D1A): $78, $A5, $78, $A5."
  },
  {
   "address": 11435,
   "type": "line",
   "text": "The side entries' x-speeds ($2D26): 1, 1, -1, -1."
  },
  {
   "address": 11439,
   "type": "line",
   "text": "The side entries' headings ($2D31): right (4) from the left edge, left ($0C) from the right."
  },
  {
   "address": 11443,
   "type": "line",
   "text": "The side entries' first block, $9B for all four ($2D3A)."
  },
  {
   "address": 11447,
   "type": "line",
   "text": "The side entries' x-high flags ($2D20): 0, 0, $FF, $FF, so the last two start at x $132."
  },
  {
   "address": 11451,
   "type": "line",
   "text": "Behaviour 0, a free slot, which may start a soldier of its own. At the top of the map ($0403 = 0), while gate soldiers remain ($04EF, 20 a life), one chance in 128 for each free slot on each pass of the game logic sends one out: it sets the enemies' fire mask to the slowest ($0504 = $3F), counts the soldier off and makes a gate soldier (behaviour 27) by area: at x $8C-$CB, from y $64 in area 3 and y $3C in the others, except that in area 1 half of them enter from a side ($2CA3). Lower down the map it goes on to $2D63."
  },
  {
   "address": 11479,
   "type": "side",
   "text": "a branch to the next instruction"
  },
  {
   "address": 11528,
   "type": "line",
   "text": "Area 1's side entries: half of its gate soldiers come in from the left or right edge, the place, heading and block from the tables at $2CA3 chosen at random."
  },
  {
   "address": 11592,
   "type": "line",
   "text": "Area 3's gate soldiers come out of the fortress door: x $8C-$CB at random, y $64."
  },
  {
   "address": 11619,
   "type": "line",
   "text": "Lower down the map, run for each free enemy slot on each pass of the game logic. One time in four at random (a random number's low two bits, $3FE8) it tries: one chance in 256 sends a rifle soldier down from the top of the screen (y $28) at a random x where the map is clear (terrain 0); otherwise one chance in 256 sends a grenade thrower (behaviour 24) in from a side at a random height from $3C: from the left edge (block $D9, heading right of 2-5) where the map is clear, or from the right edge (heading 11-14) where the cell is character $30."
  },
  {
   "address": 11678,
   "type": "line",
   "text": "The rest of a gate soldier or a rifle soldier sent down from the top: down a pixel a frame (heading 8), block $9B, left of x 256."
  },
  {
   "address": 11706,
   "type": "line",
   "text": "Gives a new soldier his grey colour ($0B), a random start to his timer and a place in front of the scenery."
  },
  {
   "address": 11725,
   "type": "line",
   "text": "One chance in 256 at each try a grenadier comes in from a side, left or right at random, at a random height from y $3C: from the left at x $18 where the map there is clear (terrain 0), as behaviour $18 (24) with block $D9 and a heading to the right of 2-5."
  },
  {
   "address": 11839,
   "type": "line",
   "text": "The grenadier from the right: at x $13A, only where the map cell there is character $30, heading 11-14, given block $15, which his walk replaces on his first frame."
  },
  {
   "address": 11901,
   "type": "side",
   "text": "block $15, where the left-hand version uses $D9; the walk animation replaces it the next frame"
  },
  {
   "address": 11937,
   "type": "line",
   "text": "Behaviour 11, a grenade thrown by an enemy: flies in an arc, its y-speed growing by one every 16 frames, through the frames at $2EC8, and after 80 frames becomes an explosion ($2ECD)."
  },
  {
   "address": 11976,
   "type": "line",
   "text": "The enemy grenade's frames, one per 16 frames: $92, $91, $91, $92, $93."
  },
  {
   "address": 11981,
   "type": "line",
   "text": "Turns enemy slot X into an explosion: behaviour $0C ($386D), stopped, block $AF, red. Used by thrown grenades, mortar bombs, bombs and shells when their time is up, and for both halves of a lorry hit by the player."
  },
  {
   "address": 12007,
   "type": "side",
   "text": "a test whose branch goes to the next instruction either way"
  },
  {
   "address": 12013,
   "type": "line",
   "text": "Behaviour 14, a mortar bomb: as the grenade, with the frames at $2F14, exploding after 80 frames."
  },
  {
   "address": 12052,
   "type": "line",
   "text": "The mortar bomb's frames: $D2, $D1, $D0, $D1, $D2, so it grows and shrinks as it rises and falls."
  },
  {
   "address": 12057,
   "type": "line",
   "text": "Behaviour 8, an enemy's bullet: lives 70 frames. From frame 22 on it looks at the map ahead ($2885): a wall stops it, and it goes behind scenery. Either way it ends as a spark (behaviour 9). The first 22 frames let it leave a soldier standing behind cover."
  },
  {
   "address": 12105,
   "type": "line",
   "text": "An enemy bullet becomes a spark (behaviour 9): stopped, timer zero."
  },
  {
   "address": 12129,
   "type": "line",
   "text": "Behaviours 31 and 33, a bunker's shell or a thrown bomb: moves as it was launched and explodes after 90 frames ($2ECD)."
  },
  {
   "address": 12143,
   "type": "line",
   "text": "Behaviour 9, the spark where an enemy bullet ends: nine frames from $36F6, then the slot is freed ($2F85)."
  },
  {
   "address": 12165,
   "type": "line",
   "text": "Frees enemy slot X: behaviour 0, stopped, parked off the right of the screen (x $164) at its own y ($141C) with the blank block $FF. The same as $3570."
  },
  {
   "address": 12196,
   "type": "line",
   "text": "Behaviour 7, a soldier lying in wait: turns to face the player once he is at y $50 or lower ($2FEE) and fires ($33B2). When the map has carried him down to y $82 he gets up and becomes a soldier risen from cover (behaviour 21) walking up the screen, straight or a pixel to either side, behind the scenery."
  },
  {
   "address": 12260,
   "type": "line",
   "text": "Once the scroll has carried this soldier down to y $50 or lower he turns to face the player ($2FEE); on every pass he may fire ($33B2)."
  },
  {
   "address": 12270,
   "type": "line",
   "text": "Turns a soldier who lies or crouches to face the player, choosing from three frames: down-left (block $CA) when the player is more than 50 pixels to his left, down-right ($C9) when he is 50 or more to his right, straight down ($C8) otherwise. Sets his facing ($04AC) to match."
  },
  {
   "address": 12349,
   "type": "line",
   "text": "Behaviour 10, a soldier who runs and jumps: runs in his heading until his timer reaches 30 (30 frames for one from the spawn list, none for one dropped from a lorry, whose timer starts at 29), then leaps (y-speed -2, block $C6 going left or $D3 going right, one pixel a frame across, the next block, $C7 or $D4, five frames later), falling back as gravity adds one to his y-speed every 8 frames, and when it reaches 3 he lands and becomes a rifle soldier (behaviour 5) walking up the screen."
  },
  {
   "address": 12424,
   "type": "line",
   "text": "In the air the jumper's leap frame advances once, at frame $23 of his timer ($C6 to $C7, $D3 to $D4), and every eight frames gravity adds one to his y-speed; when it reaches 3 he lands."
  },
  {
   "address": 12449,
   "type": "line",
   "text": "He lands: the walk's first block ($98), no x-speed, heading up, then a rifle soldier (behaviour 5) at a pixel a frame upwards."
  },
  {
   "address": 12479,
   "type": "line",
   "text": "Behaviour 21, a soldier risen from cover: walks with the shared walk frames, turning from walls and behind scenery from frame 15. With one chance in eight on each pass he turns to face the player's direction ($310A); otherwise every 32 frames he changes his walking heading ($3237). He never fires."
  },
  {
   "address": 12554,
   "type": "line",
   "text": "Sets enemy X's facing ($04AC) to the eighth of a turn that points at the player: right when the player is more than 30 pixels to the right, left when he is 30 or more to the left, straight otherwise; up when he is 20 or more above, down when he is more than 20 below, level otherwise. Leaves it alone when the player is inside that box. Only the facing changes; the soldier keeps walking his own heading ($04A1), so he can walk one way while facing and firing another. The x test adds 30 to the low byte of the soldier's x and drops the carry ($3118), so a soldier at x 226-255 on the left half of the 256 line takes a player to his left, beyond the wrapped sum, as one on his right, and faces right (live: soldier at x $E8, player at $64, heading 4)."
  },
  {
   "address": 12603,
   "type": "line",
   "text": "The player is below the enemy: the aim is decided by $31AD."
  },
  {
   "address": 12606,
   "type": "line",
   "text": "The player is to the right: up-right, right or down-right depending on whether he is 20 or more pixels above, level, or more than 20 below."
  },
  {
   "address": 12643,
   "type": "line",
   "text": "The player is to the left: up-left, left or down-left, the same way."
  },
  {
   "address": 12680,
   "type": "line",
   "text": "The player is above, within 30 pixels in x: straight up. The tests for up-right and up-left that follow repeat the caller's x test, so they never pass."
  },
  {
   "address": 12717,
   "type": "line",
   "text": "The player is below, within 30 pixels in x: straight down. The tests for down-right and down-left that follow repeat the caller's x test, so they never pass."
  },
  {
   "address": 12754,
   "type": "line",
   "text": "Behaviour 27, a soldier from the gate: counts himself alive for this pass ($04F4), and with one chance in 64 on each pass stops and tries to throw a grenade ($32CF). Either way he then runs as a rifle soldier ($31E7)."
  },
  {
   "address": 12775,
   "type": "line",
   "text": "Behaviour 5, the rifle soldier: walks with the shared walk frames for his facing (block $E4 when standing), turns from walls, goes behind scenery and fires ($33B2). Every 32 frames of his own timer he changes heading ($3237); every 32 frames of the game's he faces the player again ($310A)."
  },
  {
   "address": 12820,
   "type": "line",
   "text": "The rifle soldier stands still: block $E4."
  },
  {
   "address": 12825,
   "type": "line",
   "text": "Every frame the rifle soldier looks ahead, turns from walls, goes behind scenery and may fire; every 32 frames of his timer he picks a new heading ($3237), and on frames where the frame counter's low five bits are zero he aims at the player ($310A)."
  },
  {
   "address": 12855,
   "type": "line",
   "text": "Gives enemy X a new walking heading ($04A1) and speeds: half the time a diagonal picked by where the player is (up-right or down-right when he is to the right, down-left when he is to the left and level or below, down-right, away from him, when he is to the left and above), half the time the old heading turned a sixteenth either way or kept. The player's offsets are tested as signed bytes, so one more than 127 pixels below counts as above, and in the same x-high half one more than 127 pixels to a side counts as on the other side."
  },
  {
   "address": 12916,
   "type": "side",
   "text": "a player above and to the left gives $0C / 2 = 6, down and to the right: away from him"
  },
  {
   "address": 12938,
   "type": "line",
   "text": "A wandering heading: the current one turned a sixteenth either way or kept, at random (keeping it twice as likely, as the fourth choice, -2, becomes 0)."
  },
  {
   "address": 12956,
   "type": "line",
   "text": "Stores the new heading (0-15) in $04A1 and takes its speeds from $32AF and $32BF."
  },
  {
   "address": 12975,
   "type": "line",
   "text": "X-speed for each of the 16 headings, a sixteenth of a turn apart, clockwise from 0 = up: 0, then 1 for 1-7 (rightward), 0 for 8 (down), -1 for 9-15."
  },
  {
   "address": 12991,
   "type": "line",
   "text": "Y-speed for each of the 16 headings: -1 for 15, 0, 1 and 2, 0 for 3-5 (across), 1 for 6-10, 0 for 11-13, -1 for 14. Speeds are one pixel a frame, so diagonals are as fast in each direction as straight lines."
  },
  {
   "address": 13007,
   "type": "line",
   "text": "Makes enemy X throw a grenade at the player, if both are on the same side of x 256 and a slot is free (else Y = $FF): behaviour $0B, block $93, light blue, six pixels to the thrower's right. Its speeds are the distances to the player divided by 64 ($3537, the signs kept), with two more pixels a frame upward; the gravity in $2EA1 bends that into an arc. Returns the grenade's slot in Y."
  },
  {
   "address": 13027,
   "type": "line",
   "text": "No slot was free, or the thrower and the player are on different sides of x 256: Y = $FF tells the caller nothing was thrown."
  },
  {
   "address": 13030,
   "type": "line",
   "text": "The thrown grenade: slot Y six pixels to the thrower's right at his height, block $93, light blue, behaviour $0B; its speeds come from the distance to the player, a sixty-fourth of it each frame ($3537), signs set by which side he is on."
  },
  {
   "address": 13150,
   "type": "line",
   "text": "The player is to the left and below: the distances are scaled and the x-speed made negative."
  },
  {
   "address": 13167,
   "type": "line",
   "text": "The player is to the right: the y-distance, scaled, and made negative when he is above."
  },
  {
   "address": 13207,
   "type": "line",
   "text": "The player is below: the y-distance is scaled as it is."
  },
  {
   "address": 13210,
   "type": "line",
   "text": "Stores the grenade's speeds, with two more pixels a frame upwards than the aim."
  },
  {
   "address": 13234,
   "type": "line",
   "text": "Fires an enemy's rifle. Only on frames of its timer where (timer AND the fire mask $0504) is 0, which is every 64, 32 or 16 frames by area and loop ($3EB4), every 64 once the gate soldiers have started coming ($2CD1), and only with a free slot. The player's place is classed into one of eight directions from the soldier by the same boxes as $310A (30 pixels across, 20 up and down, with the same wrap of x + 30 past 255 at $33D8); the soldier fires only if his facing is already that direction. The bullet is behaviour 8, block $90, white, from the muzzle offset for that facing ($35F9, $3609), at two pixels a frame straight or one each way diagonally ($3517, $3527). Live, a soldier held at x $E8 with the player level at x $64 fired every bullet to the right, away from him."
  },
  {
   "address": 13254,
   "type": "line",
   "text": "No shot this frame: the fire mask ($0504) kept it back, or no enemy slot was free."
  },
  {
   "address": 13310,
   "type": "line",
   "text": "The player is to the right of the shooter: the shot goes up-right, right or down-right ($34C3) by the player's height, but only when the shooter already faces that way."
  },
  {
   "address": 13359,
   "type": "line",
   "text": "A heading has been chosen: on to the bullet ($34C3)."
  },
  {
   "address": 13362,
   "type": "line",
   "text": "The player is to the left of the shooter: up-left, left or down-left, again only when he already faces that way."
  },
  {
   "address": 13411,
   "type": "line",
   "text": "The player is above, within 30 pixels in x: a shot straight up when the shooter faces up. The tests for the diagonals never pass here, because the caller has already checked x."
  },
  {
   "address": 13458,
   "type": "line",
   "text": "The player is below, within 30 pixels in x: a shot straight down when the shooter faces down; the diagonal tests never pass here either."
  },
  {
   "address": 13507,
   "type": "line",
   "text": "Fires a bullet in heading A from enemy X into free slot Y: speeds from $3517/$3527, the muzzle offset for the heading from $35F9/$3609 added to the shooter's place, behaviour 8, block $90, white, and the shooter turned to face that way."
  },
  {
   "address": 13591,
   "type": "line",
   "text": "Enemy bullet x-speed for each of the 16 facings: 2 across, 1 diagonally, 0 straight up or down."
  },
  {
   "address": 13607,
   "type": "line",
   "text": "Enemy bullet y-speed for each of the 16 facings: -2 up, 2 down, 1 or -1 diagonally, 0 across."
  },
  {
   "address": 13623,
   "type": "line",
   "text": "Divides $FB and $FC by 64 (six right shifts each): turns a distance into a speed for a lobbed grenade or bomb."
  },
  {
   "address": 13635,
   "type": "line",
   "text": "Behaviour 6, a soldier dying: 23 frames from $3558, flickering between his falling frames and the blank block, then the slot is freed ($3570)."
  },
  {
   "address": 13656,
   "type": "line",
   "text": "The dying soldier's frames, read from the second entry (his timer counts up before the read, $3543, and the slot is freed at 24), so he shows 23 frames: $BE and $BF (arms flung out) each alternating with $FF, the blank block, so he flickers as he falls. The first entry is never read."
  },
  {
   "address": 13680,
   "type": "line",
   "text": "Frees enemy slot X: behaviour 0, stopped, parked off the right of the screen (x $164) at its own y ($141C) with the blank block. Called when an enemy leaves the screen ($24B1), a box of grenades is picked up ($2AA1), a dying or shot-down soldier's frames end ($3555, $2855), a freed prisoner has finished waving ($2AD6) and a score sprite's time is up ($2AE6)."
  },
  {
   "address": 13711,
   "type": "line",
   "text": "Sets up the video: banks the BASIC ROM out ($01 bit 0 cleared), points the VIC at its bank 3 ($C000-$FFFF, through CIA 2's port A) and puts the screen at $E000 ($D018 high nibble 8). The character set is chosen per frame by the raster interrupts."
  },
  {
   "address": 13744,
   "type": "line",
   "text": "Turns the player's facing ($04E1, 16 steps) one step towards the direction the joystick points ($04E0), the shorter way round. His bullets fly in the facing, so a sharp change of direction takes a few frames to come round."
  },
  {
   "address": 13744,
   "type": "side",
   "text": "a load overwritten by the next instruction"
  },
  {
   "address": 13773,
   "type": "line",
   "text": "The DEC that turns the player's facing one step anticlockwise, taken when the target is less than half a turn anticlockwise; after the two INCs above it, the net step is clockwise. The facing is then kept in 0-15 (sixteenths)."
  },
  {
   "address": 13785,
   "type": "line",
   "text": "The player's bullet x-speed for each of the 16 facings: up to 8 pixels a frame across."
  },
  {
   "address": 13801,
   "type": "line",
   "text": "The player's bullet y-speed for each of the 16 facings: up to 6 pixels a frame up or down."
  },
  {
   "address": 13817,
   "type": "line",
   "text": "Where a bullet starts, x offset from the shooter for each of the 16 facings, for the player's bullets and the enemies' alike."
  },
  {
   "address": 13833,
   "type": "line",
   "text": "Where a bullet starts, y offset from the shooter for each of the 16 facings."
  },
  {
   "address": 13849,
   "type": "line",
   "text": "What the player's four shot slots (slots 1-4) do, by type: 0 $39C3 empty, ready to fire; 1 $3917 a bullet; 2 $365C a grenade in flight; 3 $36E0 a spark; 4 $371E a grenade's blast. The same routines are behaviours 1-4 in $24D4."
  },
  {
   "address": 13850,
   "type": "line",
   "text": "The high bytes in shot_routines, read as $361A,Y ($364A)."
  },
  {
   "address": 13859,
   "type": "line",
   "text": "Runs the player's shot slots 1-4 (X = 0-3) on every pass of the game logic ($08F7): frees one that has left the play area (y above $1E or from $DC down, or x from $15B on), then calls its routine from $3619 by type ($048E). An empty slot may fire, so slot 4, kept for the grenade, can carry a bullet too."
  },
  {
   "address": 13913,
   "type": "line",
   "text": "An indirect JMP through $FB/$FC, so update_shots can JSR to the shot's routine."
  },
  {
   "address": 13916,
   "type": "line",
   "text": "Shot type 2, the player's grenade in flight. For the first 14 frames of its count, the throw's own frame included, the player's sprite shows the throw ($36DB), unless the stick is pushed, when $3B8E puts a walk frame over it; every 8 frames the grenade's block steps through $36D5 so it seems to rise and fall. It goes behind scenery where the map says. At frame 40 it becomes a blast (type 4): stopped, block $AF, orange."
  },
  {
   "address": 14005,
   "type": "line",
   "text": "The grenade lands at frame 40 and becomes a blast (shot type 4): stopped, in front of the scenery, block $AF, orange ($08)."
  },
  {
   "address": 14037,
   "type": "line",
   "text": "The grenade's blocks, read at frames 8, 16, 24, 32 and 40 of its flight from the second byte ($91, $91, $92, $93, $93): the grenade starts as $93, the smallest ($38A5), is largest at the top of its arc and small again as it lands. The first byte, $92, is never read. Then the player's throwing frames ($36DB)."
  },
  {
   "address": 14043,
   "type": "line",
   "text": "The player's throwing frames, one every four frames of the grenade's count while it is under 15 ($3669): $A4, $A5, $DE, then $98 standing. The fifth byte, another $98, is not read."
  },
  {
   "address": 14048,
   "type": "line",
   "text": "Shot type 3, the spark where a bullet ends: nine frames from $36F6, then the slot is freed."
  },
  {
   "address": 14070,
   "type": "line",
   "text": "A spark's blocks, frame by frame: $94-$97 growing, $96 twice, $94, then $FF, the blank block, twice. Used for the player's bullets and the enemies'."
  },
  {
   "address": 14079,
   "type": "line",
   "text": "Frees shot slot X: type 0, stopped, parked off the right of the screen (x $164) at its own y ($1418), blank."
  },
  {
   "address": 14110,
   "type": "line",
   "text": "Shot type 4, a grenade's blast, 20 frames. Every frame it hits every enemy that a grenade can harm ($2526 bit 1) within 18 pixels across and 22 up or down, on the same side of x 256: a bunker's gun goes to $37B1, anything else to $23E7. So a soldier who walks into the blast while it lasts dies too. Its blocks come from $37AC, a frame every four."
  },
  {
   "address": 14197,
   "type": "line",
   "text": "Next enemy for the blast; after the eleventh, the blast's own animation: four frames to each block of $37AC, gone at frame 20."
  },
  {
   "address": 14219,
   "type": "line",
   "text": "The blast is over: the shot slot is freed, parked off screen (x $64, x-high $FF, y from $1418) with the blank block."
  },
  {
   "address": 14252,
   "type": "line",
   "text": "An explosion's blocks, four frames each: $AF, $AE, $AD, $AF, then $FF blank. Used for the player's grenades and the enemies' explosions."
  },
  {
   "address": 14257,
   "type": "line",
   "text": "A grenade's blast reaches a bunker's gun: 1,000 points and effect 2. The gun becomes an explosion (behaviour $0C) ten pixels higher, the blast moves to the bunker, and the map is changed to the ruin. For the gun aimed down-left (heading $0A) the ruin is stamp 3 at a fixed place in area 1's map ($859A, $382A); for any other gun, stamp 2 at the map cell found from the gun's position ($1711). The playfield is redrawn at once ($3F75)."
  },
  {
   "address": 14371,
   "type": "line",
   "text": "Back to the next enemy for the blast ($3775), X and Y restored."
  },
  {
   "address": 14378,
   "type": "line",
   "text": "The gun of the bunker at the right of area 1's map, facing left (heading $0A): the blast moves to the bunker, the gun becomes an explosion and stamp 3, the ruin, goes over the bunker at $859A (columns 34-39)."
  },
  {
   "address": 14445,
   "type": "line",
   "text": "Behaviour 12, an enemy's explosion (from a thrown grenade, a mortar bomb, a bunker's shell, a bomb, a lorry or a destroyed gun): 20 frames from $37AC, then the slot is freed. It kills the player on touch ($1074)."
  },
  {
   "address": 14501,
   "type": "line",
   "text": "The player throws a grenade, from the space bar: not while dying, not once the area is won (no gate soldiers left to come or alive), not with slot 4 busy and not with none left. The key is read by REMEMBER's routine at $5F6A, which stands where the 1985 code read $DC01; $EF there is the space bar. The grenade (slot 4, type 2, block $93, light blue) leaves the player's position at two pixels a frame straight up; his direction ($04E0) is set to up, so with the stick centred his facing turns that way, and he shows his throwing frame ($A4) until a pushed stick puts a walk frame over it ($3B8E); the count goes down by one and is redrawn, and effect 1 plays."
  },
  {
   "address": 14526,
   "type": "side",
   "text": "REMEMBER's hook: JSR $5F6A, which reads $DC01, in place of the 1985 release's LDA $DC01"
  },
  {
   "address": 14601,
   "type": "line",
   "text": "The operand of the SBC #$01 that takes a grenade for a throw: zeroed by the trainer's unlimited grenades ($45BF)."
  },
  {
   "address": 14614,
   "type": "line",
   "text": "No grenade thrown this frame."
  },
  {
   "address": 14615,
   "type": "line",
   "text": "Shot type 1, the player's bullet, 15 frames. Each frame it tests every enemy a bullet can hit ($2526 bit 0) within 10 pixels across and 12 up or down on the same side of x 256; a hit goes to $23E7 and frees the bullet. Then it looks at the map six pixels above it: a wall turns it into a spark, and it goes behind scenery where the map says. At frame 15 it becomes a spark."
  },
  {
   "address": 14705,
   "type": "line",
   "text": "Next enemy for the bullet; then the map six pixels above it decides whether it hits a wall or goes behind scenery."
  },
  {
   "address": 14763,
   "type": "line",
   "text": "The bullet becomes a spark (shot type 3), stopped, its count reset."
  },
  {
   "address": 14787,
   "type": "line",
   "text": "Shot type 0, an empty slot, which fires a bullet when fire is held. Not while dying or once the area is won. $04DF counts up once for each empty slot on each pass of the game logic from $FF, set when fire is released: the first count makes 0, so a press fires at once; the next bullet comes when it reaches 8, two frames later with all four shot slots empty, three with three, longer with fewer, and then it stops there until fire is let go. So each press gives two bullets. The bullet (type 1, block $90, white) leaves from the muzzle offset for the player's facing ($35F9, $3609) at its speed ($35D9, $35E9)."
  },
  {
   "address": 14887,
   "type": "line",
   "text": "The return, reached after a bullet is fired and when the repeat count ($04DF) is at 8 or between firing values."
  },
  {
   "address": 14888,
   "type": "line",
   "text": "Fire is up, or the player is dying or the area is won: the repeat count goes back to $FF, so the next press fires at once."
  },
  {
   "address": 14894,
   "type": "line",
   "text": "The area is won: no gate soldiers are left to come ($04EF) and none was counted alive this frame ($04F4). Normally that means all twenty have come and gone, but a soldier entering area 1 from a side is not counted on his first frame ($2D08), so the last one can end the area as he appears. Marks the walk ($04F7, which also stops enemies touching the player), draws the gate open ($15BC, which does nothing in area 3) and redraws the playfield, then falls into the walk."
  },
  {
   "address": 14907,
   "type": "line",
   "text": "The walk out through the gate, run on every pass of the game logic in place of the joystick: two pixels a frame left or right until x is $AF, the gate's middle, then up a pixel a frame. At y $5A it sets $04F5, which nothing reads; the main loop ends the area itself at that y ($091C)."
  },
  {
   "address": 14939,
   "type": "line",
   "text": "The walk out from right of x $AF: walking left two pixels a frame to the gate's middle."
  },
  {
   "address": 14957,
   "type": "line",
   "text": "At x $AF he walks straight up a pixel a frame, and at y $5A the area is over."
  },
  {
   "address": 14988,
   "type": "line",
   "text": "The player, on every pass of the game logic ($08F7) while he is not dying. Starts the walk out when the area is won. Otherwise the joystick sets his speeds and the direction he walks ($04E0): up a pixel a frame while he is at y $A4 or lower on the screen, and above that, up scrolls the map instead ($0404 = $FF); at the top of the map ($0403 = 0) nothing scrolls and he walks up while he is at y $6E or lower; down to y $C1; left and right two pixels a frame between x $17 and $141 (his x is always odd). Walking, he takes the shared walk frames ($3CA2) for the joystick's direction, a frame every four. His facing turns towards it ($35B0). Then the map ahead of him, four pixels across or three up or down, is checked ($3BB1)."
  },
  {
   "address": 15036,
   "type": "side",
   "text": "set and never read"
  },
  {
   "address": 15074,
   "type": "line",
   "text": "Joystick down: down a pixel a frame (heading 8) to y $C1."
  },
  {
   "address": 15098,
   "type": "line",
   "text": "Joystick left: two pixels a frame to the left (heading $0C) while x is $18 or more (or past 255), so his x, always odd, stops at $17."
  },
  {
   "address": 15127,
   "type": "line",
   "text": "Joystick right: two pixels a frame to the right (heading 4), not past x $141."
  },
  {
   "address": 15156,
   "type": "line",
   "text": "The four diagonals, read from $DC00 as whole values: up-right (heading 2), down-right (6), down-left ($0A) and up-left ($0E); each also stores its walk table's address in $19/$1A, which nothing reads. With the stick centred the walk is skipped."
  },
  {
   "address": 15172,
   "type": "side",
   "text": "the diagonals' walk-frame pointers go to $19/$1A, which nothing reads"
  },
  {
   "address": 15246,
   "type": "line",
   "text": "The player's walk frame for his heading from the shared table ($3CA2), a new one every four frames, counted in $04E6."
  },
  {
   "address": 15278,
   "type": "line",
   "text": "After the joystick: turns his facing ($35B0), then finds the map cell ahead of him, two of his x-steps and three of his y-steps and scroll-steps away. A wall (terrain bit 0) stops him and the scroll ($3C71). Water or a hole (bit 2) and he falls in ($3C10). Otherwise he goes behind scenery where bit 1 is set."
  },
  {
   "address": 15305,
   "type": "side",
   "text": "x-high flips when x carries past 255 or borrows below 0, told apart from the 127/128 crossing by the overflow flag"
  },
  {
   "address": 15376,
   "type": "line",
   "text": "The player walks into water or a hole: dying with $0503 = 2, effect 4, and his sprite moved on into it, to six of his x-steps and six of his y-steps and scroll-steps from where he stood and 12 pixels lower. The death count ($04E6) is set from A as the sound routine leaves it ($0F when an effect plays, $5F64), not 0, so the fall lasts about 65 frames where a hit lasts 79."
  },
  {
   "address": 15386,
   "type": "side",
   "text": "A is what $500F left: $0F, or 4 when the effect was refused"
  },
  {
   "address": 15455,
   "type": "line",
   "text": "Over terrain bit 1 the player goes behind the scenery ($043D = $FF)."
  },
  {
   "address": 15467,
   "type": "line",
   "text": "Elsewhere he is drawn in front of it ($043D = 0)."
  },
  {
   "address": 15473,
   "type": "line",
   "text": "A wall ahead: the player and the scroll stop, except on the walk out of the area ($04F7), which goes on through."
  },
  {
   "address": 15490,
   "type": "line",
   "text": "The walk, four blocks for each of the eight directions, shared by the player and the soldiers (who are drawn in other colours): $98-$9A up, $9B-$9D down, $D5-$D8 left, $D9-$DC right, $9E, $9F, $DF, $A0 down-right, $A1, $A2, $E0, $A3 down-left, $A6-$A8 and $E1 up-right, $A9-$AB and $E2 up-left."
  },
  {
   "address": 15494,
   "type": "line",
   "text": "The walk down: $9B, $9C, $9D, $9C."
  },
  {
   "address": 15498,
   "type": "line",
   "text": "The walk left: $D5, $D6, $D7, $D8."
  },
  {
   "address": 15502,
   "type": "line",
   "text": "The walk right: $D9, $DA, $DB, $DC."
  },
  {
   "address": 15506,
   "type": "line",
   "text": "The walk down and to the right: $9E, $9F, $DF, $A0."
  },
  {
   "address": 15510,
   "type": "line",
   "text": "The walk down and to the left: $A1, $A2, $E0, $A3."
  },
  {
   "address": 15514,
   "type": "line",
   "text": "The walk up and to the right: $A6, $A7, $A8, $E1."
  },
  {
   "address": 15518,
   "type": "line",
   "text": "The walk up and to the left: $A9, $AA, $AB, $E2."
  },
  {
   "address": 15522,
   "type": "line",
   "text": "The walk frames' address for each even heading, up, up-right, right, down-right, down, down-left, left, up-left: $3C82, $3C9A, $3C8E, $3C92, $3C86, $3C96, $3C8A, $3C9E."
  },
  {
   "address": 15523,
   "type": "line",
   "text": "The high bytes in walk_frame_ptrs, read as $3CA3,Y wherever a walk frame is picked ($2989-$3B98)."
  },
  {
   "address": 15538,
   "type": "line",
   "text": "The end of the last area: clears the slots and puts eleven sprites across the fortress (x, x-high and y from $3D09, $3D14, $3D1F), seven in a row at y $32 and four at y $6E, all block $EE, red. For 255 frames each shows block $EE or, with one chance in four each frame, nothing, so they flicker like fire. Then back to the main loop's next area."
  },
  {
   "address": 15592,
   "type": "line",
   "text": "The ending's flicker, for 255 frames: each of the eleven sprites shows block $EE, or one time in four at random the blank block."
  },
  {
   "address": 15625,
   "type": "line",
   "text": "The ending's eleven sprites, x: $6E to $E6 for the upper row, then $48, $52, $119 and $123 for the lower."
  },
  {
   "address": 15636,
   "type": "line",
   "text": "The ending's eleven sprites, x-high: the last two are past x 255."
  },
  {
   "address": 15647,
   "type": "line",
   "text": "The ending's eleven sprites, y: seven at $32, four at $6E."
  },
  {
   "address": 15658,
   "type": "line",
   "text": "Moves every slot by its speeds. The player (slot 0) moves first and his y is copied into the table the raster interrupts read ($04C2). Each of slots 1-15 has last frame's y copied there, then, if it is in use, moves by its speeds, its y also less the scroll speed ($0404, $FF while the map scrolls, so it slides down a pixel with the scenery)."
  },
  {
   "address": 15683,
   "type": "line",
   "text": "The player's x is stored and his y moves by his y-speed, with no scroll correction; the copy for the raster interrupts ($04C2) follows."
  },
  {
   "address": 15702,
   "type": "line",
   "text": "Slot X, 1-15: last frame's y is copied for the interrupts, then a slot in use ($048D) moves by its x-speed, its x-high flag flipping when x crosses a 256-pixel boundary."
  },
  {
   "address": 15738,
   "type": "line",
   "text": "Slot X's y moves by its y-speed, less the scroll ($0404)."
  },
  {
   "address": 15756,
   "type": "line",
   "text": "Next slot, up to 15."
  },
  {
   "address": 15762,
   "type": "line",
   "text": "35 bytes of code nothing reaches: frees slot X (as $3570 does, for any slot) and jumps back into move_sprites at $3D8C."
  },
  {
   "address": 15797,
   "type": "line",
   "text": "Empties all sixteen slots: each parked off the right of the screen (x $164) at its own y ($1417), stopped, blank, in front, type 0."
  },
  {
   "address": 15840,
   "type": "line",
   "text": "Sets up a life: clears the slots; the player at x $97, y $B4, facing up, block $98, blue, not dying. The map restarts at the first checkpoint at or below the row the screen had reached ($3ED0), with twenty gate soldiers to come ($04EF), the area's tables set ($1427) and the gate drawn shut ($15BC, areas 0 and 1). Area 1's three bunkers are put back whole in its map ($14B5 at $88C0, $859A and $8370), the enemies' fire rate is set for the area and loop ($3EB4), sprite block $FF, the blank one every hidden sprite shows, is zeroed ($3E93), the sprites are sorted, everything already on screen in the spawn list is placed ($109B), and the grenades are topped up to five."
  },
  {
   "address": 15907,
   "type": "line",
   "text": "Looks along the area's list of restart rows for the first that is not ahead of the row the screen had reached ($0403), and puts the map there with the fine scroll at zero, so a death sends the player back to the last restart point he passed."
  },
  {
   "address": 16019,
   "type": "line",
   "text": "Zeroes sprite block $FF ($FFC0-$FFFF), the blank block every sprite falls back to."
  },
  {
   "address": 16048,
   "type": "line",
   "text": "The high byte of each area's map, read by $1427 into $0405: $60, $80, $80, $A0. Areas 1 and 2 share the map at $8000."
  },
  {
   "address": 16052,
   "type": "line",
   "text": "The enemies' fire mask for the area counter's low three bits ($0504, set at each life's start): $3F for the first area (a shot every 64 frames at most), $1F for the second, $0F for every other. Since the counter goes 0, 1, 3, 4, 5, 7, 8 ..., the third area of the first loop fires every 16, then the second loop's areas fire every 16, 16 and 16, and the third loop begins again at 64. At the top of the map each gate soldier sent out sets the mask back to $3F ($2CD1) for the rest of the life."
  },
  {
   "address": 16060,
   "type": "line",
   "text": "Checkpoints, four lists of five map rows: $13, $3D, $61, $83 and the last, $AF for area 0 ($3EBC), $A6 for areas 1 and 2 ($3EC1), $B2 ($3EC6, which no pointer names) and $A6 for area 3 ($3ECB). A life restarts at the first row in the list at or below the row reached. Each area begins the same way: a new area parks the map at row $A5 ($08B8), so play starts at the checkpoint below it, row $AF in area 0 and $A6 in areas 1 and 3 (live)."
  },
  {
   "address": 16065,
   "type": "line",
   "text": "The restart rows of areas 1 and 2: $13, $3D, $61, $83, $A6. Then $3EC6, a list ending $B2 that no pointer names."
  },
  {
   "address": 16075,
   "type": "line",
   "text": "The restart rows of area 3: $13, $3D, $61, $83, $A6."
  },
  {
   "address": 16080,
   "type": "line",
   "text": "Which checkpoint list each area uses: $3EBC, $3EC1, $3EC1, $3ECB."
  },
  {
   "address": 16081,
   "type": "line",
   "text": "The high bytes in restart_lists, read as $3ED1,X ($3E1B)."
  },
  {
   "address": 16088,
   "type": "line",
   "text": "46 bytes of code nothing reaches: a bubble sort of the sprite order ($4B-$5A) by y, swapping neighbours until a pass makes no swap, using $D7 as the flag. The game sorts with the Shell sort at $3F06 instead."
  },
  {
   "address": 16134,
   "type": "line",
   "text": "Sorts the sprite order table $4B-$5A (sixteen slot numbers) by the slots' y, top of the screen first: a Shell sort with gaps 7, 3 and 1. The raster interrupts hand the hardware sprites to the slots in this order, eight at a time, so more than eight sprites share the screen."
  },
  {
   "address": 16142,
   "type": "line",
   "text": "The Shell sort's gap: 15 halved to 7, 3 and 1 ($14); when it reaches 0 the sort is done."
  },
  {
   "address": 16162,
   "type": "line",
   "text": "One pass at the current gap, from position $3D."
  },
  {
   "address": 16168,
   "type": "line",
   "text": "Compares the slots at positions $3F and $3F + gap by y ($042D) and swaps them in the order table when the first is lower on the screen, stepping back by the gap while it swaps."
  },
  {
   "address": 16230,
   "type": "line",
   "text": "Next start position, up to 15 - gap ($C9)."
  },
  {
   "address": 16244,
   "type": "line",
   "text": "Sorted."
  },
  {
   "address": 16245,
   "type": "line",
   "text": "Draws the playfield: copies 21 rows of 40 characters from the map, starting at the row now at the top ($0403, times 40, plus the area's map page $0405), to the screen at $E000. The loop rewrites its own operands (source $3FBF/$3FC0, destination $3FC2/$3FC3)."
  },
  {
   "address": 16316,
   "type": "line",
   "text": "Copies rows of 40 characters from the map to the screen until it reaches screen row 21 ($E348); the LDA and STA operands ($3FBF, $3FC2) are moved on 40 each row."
  },
  {
   "address": 16318,
   "type": "side",
   "text": "source operand, rewritten by draw_playfield"
  },
  {
   "address": 16319,
   "type": "line",
   "text": "The low byte of draw_row's LDA operand, the map row at the top of the screen, $0403 x 40 ($3FAC), moved on 40 a row."
  },
  {
   "address": 16320,
   "type": "line",
   "text": "The map source's high byte, the area's map page added ($3FB9)."
  },
  {
   "address": 16321,
   "type": "side",
   "text": "destination operand, rewritten by draw_playfield"
  },
  {
   "address": 16322,
   "type": "line",
   "text": "The low byte of draw_row's STA operand, the screen, 0 at the top ($3F77), moved on 40 a row until it reads $48 at row 21."
  },
  {
   "address": 16323,
   "type": "line",
   "text": "The screen's high byte, $E0 at the top ($3F7C)."
  },
  {
   "address": 16360,
   "type": "line",
   "text": "The random number generator: a 16-bit state at $0400/$0401, rotated left a bit, mixed by an exclusive-or and an add; returns the new $0400 in A."
  },
  {
   "address": 16383,
   "type": "line",
   "text": "Seeds the generator from the raster line ($D012): $0400 takes the line's low byte and $0401 that byte shifted left, read again while $0401 comes out 0 (a low byte of $00 or $80)."
  },
  {
   "address": 16396,
   "type": "line",
   "text": "Waits for the next frame: until the raster interrupt at the bottom of the play area changes its counter ($040B)."
  },
  {
   "address": 16405,
   "type": "line",
   "text": "Fills the colour RAM with the area's character colour ($40BC, multicolour), then makes the score rows (21 and 23) white."
  },
  {
   "address": 16423,
   "type": "line",
   "text": "Fills the colour RAM from ($FB) up to $DC00 with the playfield's colour from $40BC, then makes rows 21 and 23, the score lines, white."
  },
  {
   "address": 16457,
   "type": "line",
   "text": "Builds the play screen: 24 rows, black border, multicolour characters, background brown ($09) with black and grey as the two shared colours (kept in $04E2-$04E4 for the interrupts), the playfield's colours ($4015) and map ($3F75), the score line ($40C0) on row 21 in white and row 23 blanked, then score, grenades, lives and high score ($136F, $13D7, $13F1, $13A3). All eight sprites on, all multicolour, with light grey and black as their shared colours."
  },
  {
   "address": 16513,
   "type": "line",
   "text": "The score line: copies the 40 characters from $40C0 to screen row 21 ($E348) in white, and blanks row 23 ($E398) in black."
  },
  {
   "address": 16572,
   "type": "line",
   "text": "Character colour of each area's playfield in colour RAM, multicolour on: $0D, $0E, $0D, $0D (green, blue in area 1)."
  },
  {
   "address": 16576,
   "type": "line",
   "text": "The score line under the playfield, 40 characters in the game's alphabet: \"SCORE\", the score's digit spaces and its fixed \"00\", the grenade symbol ($3C) and an equals sign ($3F) before the grenade count's place, \"MEN\", the lives, \"HI\", the high score's spaces and its \"00\"."
  },
  {
   "address": 16616,
   "type": "line",
   "text": "Starts the raster interrupts: the first at line $DF, through the chain at $0406 ($4119), with CIA 1's timer stopped so the KERNAL's own interrupt no longer runs and the keyboard is not scanned."
  },
  {
   "address": 16662,
   "type": "line",
   "text": "The IRQ vector ($0314) points here: a JMP through $0406, which each handler sets to the next."
  },
  {
   "address": 16665,
   "type": "line",
   "text": "Raster interrupt at line $D5, below the playfield (the first time $DF): blanks the screen with an invalid mode (extended colour and bitmap together), hides sprites 0-3 (block $FF), sets the scroll to 7, a black background and the character set at $D000 for the score lines, counts a frame ($040B, for wait_frame) and asks for line $DE."
  },
  {
   "address": 16746,
   "type": "line",
   "text": "Raster interrupt at line $DE: back to text mode for the score lines, with white and red as the shared colours, then the music and sound effects ($5012). Asks for line $1E."
  },
  {
   "address": 16803,
   "type": "line",
   "text": "Four bytes nothing reads: $1E, $2A, $3B, $52."
  },
  {
   "address": 16807,
   "type": "line",
   "text": "Raster interrupt at line $1E, the top of the playfield: the fine scroll from $0402, the playfield's colours ($04E2-$04E4), and the first eight slots in the sort order ($4B-$52) placed on hardware sprites 7 down to 0 (y from $04C2, x, block, colour, x-high and behind-scenery bits). Selects the area's character set (area x 2 into the low nibble of $D018: $C000, $C800, $D000 or $D800) and asks for a line 20 below the fourth sorted slot's top."
  },
  {
   "address": 16862,
   "type": "line",
   "text": "The top interrupt's sprite loop: for each of the first eight slots in the sort order, hardware sprite (7 - n) gets the slot's y, x, block, colour and its x-high and behind-scenery bits."
  },
  {
   "address": 16998,
   "type": "line",
   "text": "Raster interrupt below the first four sorted sprites: reuses hardware sprites 7-4 for sorted slots 8-11 ($53-$56). Asks for the line two above the top of sorted slot 12 ($57)."
  },
  {
   "address": 17259,
   "type": "line",
   "text": "Raster interrupt above the thirteenth sorted sprite: reuses hardware sprites 3-0 for sorted slots 12-15 ($57-$5A). Asks for line $D5."
  },
  {
   "address": 17513,
   "type": "line",
   "text": "One bit for each hardware sprite, 0-7: masks the slots' x-high and behind-scenery flags into $D010 and $D01B."
  },
  {
   "address": 17514,
   "type": "line",
   "text": "Sprite 1's bit, $02: the third band ANDs a slot's x-high and behind-scenery flags with it ($43FF, $440B)."
  },
  {
   "address": 17515,
   "type": "line",
   "text": "Sprite 2's bit, $04."
  },
  {
   "address": 17516,
   "type": "line",
   "text": "Sprite 3's bit, $08."
  },
  {
   "address": 17517,
   "type": "line",
   "text": "Sprite 4's bit, $10."
  },
  {
   "address": 17518,
   "type": "line",
   "text": "Sprite 5's bit, $20."
  },
  {
   "address": 17519,
   "type": "line",
   "text": "Sprite 6's bit, $40."
  },
  {
   "address": 17520,
   "type": "line",
   "text": "Sprite 7's bit, $80, read by the second band ($4294). The eight bytes after it, the same bits inverted ($FE-$7F), are never read."
  },
  {
   "address": 17521,
   "type": "line",
   "text": "The same bits inverted, for clearing one sprite's flag. Nothing reads them."
  },
  {
   "address": 17529,
   "type": "line",
   "text": "86 bytes identical to the end of irq_lower ($43F9-$444E), placing the last two sprites; the byte after them, $29 at $44CF, matches $444F too. Nothing reaches them. How they came to be here is unknown, perhaps an earlier assembly or load."
  },
  {
   "address": 17615,
   "type": "line",
   "text": "Seventeen bytes nothing reads: $29, which still matches irq_lower ($444F) as the copy before it does, then $0F counting down to $02, then $00 and $FF."
  },
  {
   "address": 17632,
   "type": "line",
   "text": "REMEMBER's high-score saver, reached from the JMP at $0A4A after a name has been entered. Puts the KERNAL's interrupt back ($EA31, CIA 1's timer on, raster interrupts off), blanks the screen, banks BASIC and the KERNAL in, silences the SID and saves $0EED-$0F47 (the last rank byte, the names and the scores) to drive 8 as \"@S:COMMANDO HI /REM\" ($083D), replacing the old file. Then restarts the game at $0850. Not part of the 1985 game."
  },
  {
   "address": 17663,
   "type": "line",
   "text": "REMEMBER's save, shared with the menu's R: messages off ($9D), the SID silenced, then the KERNAL's SETLFS, SETNAM and SAVE of $0EED-$0F47 as \"@S:COMMANDO HI /REM\" on drive 8."
  },
  {
   "address": 17668,
   "type": "line",
   "text": "Zeroes the 31 bytes from $D400 to $D41E: every SID register ($D400-$D41C) and the two unused addresses after them."
  },
  {
   "address": 17713,
   "type": "line",
   "text": "REMEMBER's menu, run after the instructions. Clears the screen, puts the KERNAL's vectors back, prints its banner ($4660) and waits for T (trainer) or H (high scores). T asks five questions, each Y or N: unlimited lives ($46D8: makes the DEC of the lives at $0996 and the INC of an extra life at $1363 into LDAs), unlimited grenades ($5F80: zeroes the 3 a box gives at $2A8F and the 1 a throw takes at $3909), no falling into holes and water ($5FA8: fills $3C10-$3C5E with NOPs), no collisions ($5FD0: NOPs over the kill at $1056-$106D) and the C= key's level skip ($7F60: makes the RTS at $5F6D a CMP). Choosing T also points the JMP at $0A4A back at the title ($0883), so a trained game saves no scores. H skips the questions. Then L loads the saved table ($463D) and R saves the table in memory over it ($44FF); either way the game starts at $0850."
  },
  {
   "address": 17788,
   "type": "line",
   "text": "The trainer: points the JMP at $0A4A at the title ($0883), so no scores are saved, then asks about unlimited lives ($46D8) and makes the lives' DEC at $0996 and INC at $1363 into LDAs on Y."
  },
  {
   "address": 17788,
   "type": "side",
   "text": "the trainer: the high-score JMP at $0A4A goes to the title instead of the saver"
  },
  {
   "address": 17828,
   "type": "line",
   "text": "Asks about unlimited grenades ($5F80): Y zeroes the 3 a box gives ($2A8F) and the 1 a throw takes ($3909)."
  },
  {
   "address": 17858,
   "type": "line",
   "text": "Asks about falling into holes and water ($5FA8): Y fills $3C10-$3C5E with NOPs."
  },
  {
   "address": 17892,
   "type": "line",
   "text": "Asks about collisions ($5FD0): Y fills $1056-$106D, the touch test's kill, with NOPs."
  },
  {
   "address": 17926,
   "type": "line",
   "text": "Asks about the C= key's area skip ($7F60): Y makes the RTS at $5F6D a CMP #$DF."
  },
  {
   "address": 17953,
   "type": "line",
   "text": "Asks L or R ($7F88): L loads the saved table ($463D), R saves the table in memory over the file ($44FF) after clearing the screen."
  },
  {
   "address": 17981,
   "type": "line",
   "text": "Loads \"COMMANDO HI /REM\" (the 16 characters from $0840) from drive 8 to $0EED, its saved address, then starts the game at $0850."
  },
  {
   "address": 18015,
   "type": "line",
   "text": "A zero byte after the loader's last JMP, before the banner."
  },
  {
   "address": 18016,
   "type": "line",
   "text": "REMEMBER's banner, three screen lines in screen codes: \"COMMANDO 100% +5 AND HIGHSCORESAVER!\", a rule, and the T and H choices."
  },
  {
   "address": 18136,
   "type": "line",
   "text": "The menu's first trainer question, unlimited lives, one screen line."
  },
  {
   "address": 18176,
   "type": "line",
   "text": "Sixteen zero bytes between the menu's texts and the instructions viewer."
  },
  {
   "address": 18192,
   "type": "line",
   "text": "REMEMBER's instructions viewer, which this copy shows before its menu. Shows the instructions from $4800 a screen at a time: a page of 1,000 characters copied to the screen in reverse video over black colour RAM, so the letters take the background colour, which fades in and out through $47D6. SPACE turns the page; after the last ($47FE) it starts again. RUN/STOP ($4FD0) fades out and goes to the menu ($4531)."
  },
  {
   "address": 18211,
   "type": "line",
   "text": "The viewer's first page: the source pointer $0E/$0F at $4800, and the colour RAM cleared to black."
  },
  {
   "address": 18235,
   "type": "line",
   "text": "Copies a page of 1,000 screen codes from ($0E) to the screen at $0400 with bit 7 flipped (reverse video), fades in ($47B0), waits for SPACE or RUN/STOP ($4FD0), fades out and moves on 1,000 bytes, back to $4800 after the last page ($47FE)."
  },
  {
   "address": 18352,
   "type": "line",
   "text": "Fades the background through twelve colours from $47D6 + X (X = 0 fades in, 12 out), each after a delay loop of 4,096 iterations (about a frame) and a wait until the raster is at line 256 or beyond, so one every frame or two."
  },
  {
   "address": 18390,
   "type": "line",
   "text": "The viewer's fades: in through brown, red, orange, light red to light grey, and out through light grey, grey, orange, dark grey, brown."
  },
  {
   "address": 18414,
   "type": "line",
   "text": "Sixteen zero bytes after the fade colours."
  },
  {
   "address": 18430,
   "type": "line",
   "text": "The end of the instructions, $4FD0: the viewer starts again from the first page when it reaches it."
  },
  {
   "address": 18431,
   "type": "line",
   "text": "The high byte of the instructions' end, $4F, compared with the viewer's pointer ($47A1)."
  },
  {
   "address": 18432,
   "type": "line",
   "text": "The instructions, first page of 1,000 screen codes: the title, \"(C) Japan Capsule Computers (UK) Ltd '85\", and the introduction (\"You are Super Joe, the crack combat soldier of the eighties\", armed with \"an M60 machine gun and six hand-grenades\"; \"Mortars, grenades and dynamite rain from the skies\")."
  },
  {
   "address": 19432,
   "type": "line",
   "text": "The instructions, second page: the rest of the introduction (grenades from \"defeated outposts\", \"your final objective, the fortress\"), the object, and the controls (\"Single Joystick in Port 2\", \"Spacebar to throw Grenade\"), with REMEMBER's own line, \"This is the only 100% version ever!!!\"."
  },
  {
   "address": 20432,
   "type": "line",
   "text": "The viewer's key check: returns the keyboard row ($DC01). RUN/STOP ($7F) instead fades out, clears the screen and jumps to the menu ($4531)."
  },
  {
   "address": 20440,
   "type": "line",
   "text": "RUN/STOP: fades out, blanks the screen, clears it and goes to the menu ($4531)."
  },
  {
   "address": 20466,
   "type": "line",
   "text": "Fourteen zero bytes before the music driver."
  },
  {
   "address": 20480,
   "type": "line",
   "text": "The music driver's entry points, a row of JMPs: $5000 starts tune A ($5F0C), $5003 stops the music ($5F42), $5006 turns sound effects on ($5F48), $5009 turns them off ($5F4E), $500C stops the effect playing ($53CF), $500F requests effect A ($5F56) and $5012, called every frame by the raster interrupt at $416A, plays. The game uses $5000, $5006, $500F and $5012; the driver itself calls $5003 at a tune's end."
  },
  {
   "address": 20483,
   "type": "line",
   "text": "Entry: stops the music ($5F42)."
  },
  {
   "address": 20486,
   "type": "line",
   "text": "Entry: turns the sound effects on ($5F48)."
  },
  {
   "address": 20489,
   "type": "line",
   "text": "Entry: turns the sound effects off ($5F4E); nothing in the game calls it."
  },
  {
   "address": 20492,
   "type": "line",
   "text": "Entry: stops the effect playing ($53CF)."
  },
  {
   "address": 20495,
   "type": "line",
   "text": "Entry: asks for sound effect A ($5F56)."
  },
  {
   "address": 20498,
   "type": "line",
   "text": "Plays one frame of music and effects. Counts the frame ($5525). The state byte $5519 decides: bit 7 set, the music is stopped (with bit 6 as well, the voices are silenced first and the state becomes $80) and only effects run ($53A5); $40 alone, a tune was just started, so every voice's track and pattern positions and note counters are zeroed before it plays."
  },
  {
   "address": 20536,
   "type": "line",
   "text": "Stopped music: with bit 6 of the state the three voices are silenced and the volume set to 15, and the state becomes $80; then only effects play."
  },
  {
   "address": 20562,
   "type": "line",
   "text": "The tempo: $5513 counts down from the tune's speed ($5517) and a tick happens when it is reloaded, every speed + 1 frames (every 3 frames for tunes 0 and 2, every 4 for tune 1). Then each voice in turn, X = 2, 1, 0, with its SID register offset from $54E8."
  },
  {
   "address": 20575,
   "type": "line",
   "text": "One voice's frame. On a tick its track pointer is fetched and its note counter ($54F2) counted down: below zero it reads the next note ($5086), otherwise it checks for the note's release ($5174). Between ticks only the per-frame effects run ($519B)."
  },
  {
   "address": 20608,
   "type": "line",
   "text": "A JMP $538F after an unconditional JMP: nothing reaches it."
  },
  {
   "address": 20611,
   "type": "line",
   "text": "Between ticks: only the per-frame effects ($519B)."
  },
  {
   "address": 20614,
   "type": "line",
   "text": "Reads the voice's track at its position ($54EC): $FF sends the track back to its start, $FE stops the music ($5003, so tune 2 plays once), anything else is a pattern number, whose address comes from $5711 and $573E."
  },
  {
   "address": 20633,
   "type": "line",
   "text": "The track's $FF: back to its start, with the note counter and pattern position reset."
  },
  {
   "address": 20647,
   "type": "line",
   "text": "Another unreachable JMP $538F."
  },
  {
   "address": 20650,
   "type": "line",
   "text": "Reads a note from the pattern at the voice's position ($54EF). The first byte holds the length in ticks less one (bits 0-4, into the counter $54F2) and three flags: bit 6, a rest (no note byte follows; the gate is dropped through $5501); bit 7, a byte follows that sets the instrument ($54FE) or, with its own bit 7 set, a slide ($5520, $52B3); bit 5, hold the note to its end with no early release ($5174). Then the note number ($54FB), whose frequency from $5428 goes to the SID and to $551A/$551D, unless the voice is lent to an effect ($5528)."
  },
  {
   "address": 20711,
   "type": "line",
   "text": "The note's instrument byte goes into $54FE."
  },
  {
   "address": 20714,
   "type": "line",
   "text": "Steps to the note byte."
  },
  {
   "address": 20717,
   "type": "line",
   "text": "Reads the note number into $54FB and looks up its frequency."
  },
  {
   "address": 20760,
   "type": "line",
   "text": "A rest: the gate is dropped through $5501."
  },
  {
   "address": 20763,
   "type": "line",
   "text": "Writes the voice's instrument to the SID: waveform with the gate (or without, for a rest), pulse width and envelope, from the instrument's eight bytes at $5591. Then steps past the note and, at the pattern's $FF, moves the track on."
  },
  {
   "address": 20820,
   "type": "line",
   "text": "After writing the instrument: steps past the note and, at the pattern's $FF, on to the next pattern of the track."
  },
  {
   "address": 20849,
   "type": "line",
   "text": "Done with this voice."
  },
  {
   "address": 20852,
   "type": "line",
   "text": "On a tick within a note: on its last tick (counter 0), unless bit 5 of its length byte says hold, the gate is dropped and attack-decay and sustain-release are zeroed, so the note stops short of the next."
  },
  {
   "address": 20860,
   "type": "line",
   "text": "On the note's last tick, unless its length byte holds bit 5, the gate is dropped and the envelope zeroed."
  },
  {
   "address": 20891,
   "type": "line",
   "text": "The per-frame effects of the voice's instrument, while the voice is its own. Vibrato (byte 5 non-zero, and only on notes of seven ticks or more, length byte bits 0-4 at least 6): the frequency swings up from the note towards the next semitone by a fraction set by byte 5 (the gap halved byte 5 + 1 times), stepping 0, 1, 2, 3, 3, 2, 1, 0 with the frame counter."
  },
  {
   "address": 20940,
   "type": "line",
   "text": "Vibrato: the gap from the note to the next semitone ($542A - $5428), halved byte 5 + 1 times."
  },
  {
   "address": 20964,
   "type": "line",
   "text": "Halves the gap into the 16-bit step at $5508/$5509."
  },
  {
   "address": 21000,
   "type": "line",
   "text": "Adds the step to the note's frequency 0-3 times by the vibrato position."
  },
  {
   "address": 21025,
   "type": "line",
   "text": "Writes the vibrato's frequency to the voice."
  },
  {
   "address": 21040,
   "type": "line",
   "text": "Pulse width. With effect bit 3, byte 6 is added to the width's low byte every frame, with whatever carry the vibrato code leaves (so one more on some frames of instruments 8 and 10, which also have vibrato). Otherwise, with byte 6 non-zero, a sweep: every (byte 6 AND $1F) + 1 frames the width moves by (byte 6 AND $E0), up until its high byte reaches $0E and down until it reaches $08 ($5510 holds the direction). The width is kept in the instrument itself, so every voice playing it shares the sweep."
  },
  {
   "address": 21068,
   "type": "line",
   "text": "The pulse sweep, every (byte 6 AND $1F) + 1 frames."
  },
  {
   "address": 21125,
   "type": "line",
   "text": "The pulse width moves down by the step until its high byte reaches $08."
  },
  {
   "address": 21148,
   "type": "line",
   "text": "Writes the pulse width to the instrument record and the SID."
  },
  {
   "address": 21171,
   "type": "line",
   "text": "A slide, set by a note's extra byte with bit 7 ($5520): bits 1-6 are added to the frequency every frame, or taken away when bit 0 is set."
  },
  {
   "address": 21218,
   "type": "line",
   "text": "A slide up: the step added to the frequency."
  },
  {
   "address": 21242,
   "type": "line",
   "text": "Effect bit 0, a drum: on the frames of the note's first tick the voice plays noise ($80) with the gate off; after that its own waveform, still without the gate, with the frequency's high byte falling by one every frame."
  },
  {
   "address": 21291,
   "type": "line",
   "text": "The drum's first tick: noise with the gate off."
  },
  {
   "address": 21299,
   "type": "line",
   "text": "Writes the drum's waveform."
  },
  {
   "address": 21302,
   "type": "line",
   "text": "Effect bit 1: on notes of four ticks or more (length bits 0-4 at least 3) the frequency's high byte rises by two every other frame."
  },
  {
   "address": 21342,
   "type": "line",
   "text": "Effect bit 2: every other frame the note is played an octave higher (12 semitones), so it trills between the two."
  },
  {
   "address": 21365,
   "type": "line",
   "text": "The octave trill's base note."
  },
  {
   "address": 21368,
   "type": "line",
   "text": "Writes the trill note's frequency."
  },
  {
   "address": 21391,
   "type": "line",
   "text": "After each voice: while an effect is sounding ($5527 bit 7 clear, with effects on), $5528 is cleared, so the voices still to come this frame (1 and 0, the SID's second and first) keep their places in the music without touching the SID. The third voice always plays."
  },
  {
   "address": 21404,
   "type": "line",
   "text": "Lends the SID to the effect: the voices after this one leave their registers alone."
  },
  {
   "address": 21413,
   "type": "line",
   "text": "Plays a frame of the sound effect, if one is on. A new request (bit 6 of $5527) is set up first ($5531). Every (byte 0 AND $0F) + 1 frames the effect steps: voice 1 sounds its note ($5529), which then moves one semitone towards its end note ($552B), and voice 2 the frequency $552C bytes lower in the table, $552C / 2 semitones when $552C is even (effects 0 and 9 have odd values, so voice 2 is given a high byte as its low byte and the next note's low byte as its high) (byte 0's bit 7 leaves both alone, bit 6 voice 1), and either voice's gate can be flipped at each step to retrigger it ($552D bits 7 and 6). When the note has reached the end note the effect stops ($53CF) without sounding it."
  },
  {
   "address": 21428,
   "type": "line",
   "text": "Done with effects this frame."
  },
  {
   "address": 21434,
   "type": "line",
   "text": "Counts frames to the effect's next step."
  },
  {
   "address": 21455,
   "type": "line",
   "text": "Stops the sound effect: gates of voices 1 and 2 off, $5527 = $FF (none)."
  },
  {
   "address": 21470,
   "type": "line",
   "text": "The effect steps its note one semitone towards the end note (DEC, or INC when rising) and writes the note it had before the step to voice 1."
  },
  {
   "address": 21470,
   "type": "side",
   "text": "DEC, or INC for a rising effect: the opcode is rewritten by $5531 ($558D)"
  },
  {
   "address": 21494,
   "type": "line",
   "text": "Voice 2's note, $552C bytes lower in the frequency table."
  },
  {
   "address": 21512,
   "type": "line",
   "text": "Flips voice 1's gate at each step when bit 7 of byte 8 ($552D) asks, so the note restarts every other step."
  },
  {
   "address": 21528,
   "type": "line",
   "text": "Flips voice 2's gate at each step when bit 6 asks."
  },
  {
   "address": 21541,
   "type": "line",
   "text": "Done with the step."
  },
  {
   "address": 21544,
   "type": "line",
   "text": "The SID frequencies of 96 notes, eight octaves of twelve semitones, low byte first; note 0 is $0116. Used by the music, its vibrato and the effects."
  },
  {
   "address": 21545,
   "type": "line",
   "text": "Note 0's high byte, $01: the music, its vibrato and the effects read the high bytes as $5429,Y ($5100, $51E1, $51F6, $5380, $53F0, $5402)."
  },
  {
   "address": 21546,
   "type": "line",
   "text": "Note 1's low byte: the vibrato reads the semitone above as $542A,Y ($51D5)."
  },
  {
   "address": 21547,
   "type": "line",
   "text": "Note 1's high byte and the rest of the frequency table to $54E7: the vibrato reads the semitone above's high byte as $542B,Y ($51DE)."
  },
  {
   "address": 21736,
   "type": "line",
   "text": "The SID register offset of each voice: 0, 7, 14."
  },
  {
   "address": 21739,
   "type": "line",
   "text": "The SID register offset of the voice being played (from $54E8)."
  },
  {
   "address": 21740,
   "type": "line",
   "text": "Each voice's position in its track."
  },
  {
   "address": 21743,
   "type": "line",
   "text": "Each voice's position in its current pattern."
  },
  {
   "address": 21746,
   "type": "line",
   "text": "Each voice's ticks left in its note."
  },
  {
   "address": 21749,
   "type": "line",
   "text": "Each voice's note length byte, with its flags (bits 5-7)."
  },
  {
   "address": 21752,
   "type": "line",
   "text": "Each voice's waveform byte, its instrument's byte 2 as of the last note read (gate bit included, even for a rest or while an effect has the voice), for the release and the drum."
  },
  {
   "address": 21755,
   "type": "line",
   "text": "Each voice's note number."
  },
  {
   "address": 21758,
   "type": "line",
   "text": "Each voice's instrument number."
  },
  {
   "address": 21761,
   "type": "line",
   "text": "$FF, or $FE for a rest: ANDed with the waveform to drop the gate."
  },
  {
   "address": 21762,
   "type": "line",
   "text": "The length byte being read."
  },
  {
   "address": 21763,
   "type": "line",
   "text": "A frequency's low byte, held while the high byte is written."
  },
  {
   "address": 21764,
   "type": "line",
   "text": "Scratch: the voice number, the slide step, or the tune number times 2 while $5F0C finds the tune's record."
  },
  {
   "address": 21765,
   "type": "line",
   "text": "The instrument's waveform byte, on its way to $54F8."
  },
  {
   "address": 21766,
   "type": "line",
   "text": "Vibrato depth, counted down as the gap is halved."
  },
  {
   "address": 21767,
   "type": "line",
   "text": "The instrument's byte 6, the pulse width step and speed."
  },
  {
   "address": 21768,
   "type": "line",
   "text": "The vibrato step, a 16-bit fraction of the gap to the next semitone (with $5509)."
  },
  {
   "address": 21769,
   "type": "line",
   "text": "The vibrato step's high byte ($51ED)."
  },
  {
   "address": 21770,
   "type": "line",
   "text": "The vibrato frequency being built (with $550B)."
  },
  {
   "address": 21771,
   "type": "line",
   "text": "The vibrato frequency's high byte ($51F9-$522A)."
  },
  {
   "address": 21772,
   "type": "line",
   "text": "The vibrato position, 0-3, from the frame counter."
  },
  {
   "address": 21773,
   "type": "line",
   "text": "Each voice's frames to the next pulse width step."
  },
  {
   "address": 21776,
   "type": "line",
   "text": "Each voice's pulse sweep direction: 0 rising, else falling."
  },
  {
   "address": 21779,
   "type": "line",
   "text": "The tempo counter, from the speed down."
  },
  {
   "address": 21780,
   "type": "line",
   "text": "Speed of each tune, frames per tick less one: 2, 3, 2."
  },
  {
   "address": 21783,
   "type": "line",
   "text": "The speed of the tune playing."
  },
  {
   "address": 21784,
   "type": "line",
   "text": "The voice's instrument number times 8, the offset of its record in $5591."
  },
  {
   "address": 21785,
   "type": "line",
   "text": "The music's state: $40 just started, 0 playing, $C0 stop asked, $80 stopped."
  },
  {
   "address": 21786,
   "type": "line",
   "text": "Each voice's frequency, high byte, kept for slides, drums and the rise."
  },
  {
   "address": 21789,
   "type": "line",
   "text": "Each voice's frequency, low byte."
  },
  {
   "address": 21792,
   "type": "line",
   "text": "Each voice's slide: bits 1-6 the step, bit 0 down."
  },
  {
   "address": 21795,
   "type": "line",
   "text": "The voice's instrument effect bits (byte 7): 0 drum, 1 rise, 2 octaves, 3 pulse add."
  },
  {
   "address": 21796,
   "type": "line",
   "text": "The pulse width step, byte 6's top three bits."
  },
  {
   "address": 21797,
   "type": "line",
   "text": "A frame counter, for vibrato and the every-other-frame effects."
  },
  {
   "address": 21798,
   "type": "line",
   "text": "0 while sound effects are on, $FF when $5009 has turned them off."
  },
  {
   "address": 21799,
   "type": "line",
   "text": "The sound effect: $FF none, $40 + n just asked for, n playing."
  },
  {
   "address": 21800,
   "type": "line",
   "text": "$FF while the voice being played may write to the SID, 0 while an effect has it."
  },
  {
   "address": 21801,
   "type": "line",
   "text": "The effect's current note."
  },
  {
   "address": 21802,
   "type": "line",
   "text": "Frames to the effect's next step."
  },
  {
   "address": 21803,
   "type": "line",
   "text": "The note at which the effect stops."
  },
  {
   "address": 21804,
   "type": "line",
   "text": "Voice 2's interval below voice 1, in bytes of the frequency table, two to a semitone."
  },
  {
   "address": 21805,
   "type": "line",
   "text": "Effect flags: bit 7 flips voice 1's gate at each step, bit 6 voice 2's."
  },
  {
   "address": 21806,
   "type": "line",
   "text": "Voice 1's waveform byte, flipped for a retrigger."
  },
  {
   "address": 21807,
   "type": "line",
   "text": "Voice 2's waveform byte."
  },
  {
   "address": 21808,
   "type": "line",
   "text": "The effect's byte 0: bit 7 no frequency steps, bit 6 none for voice 1, bits 4-5 = %10 rising, bits 0-3 the frames per step less one."
  },
  {
   "address": 21809,
   "type": "line",
   "text": "Sets up the sound effect asked for: silences voices 1 and 2, takes the effect number (bits 0-3 of $5527) and its 16-byte record from $55F9. Bytes 1-14 go straight into the SID's registers for voices 1 and 2 ($D400-$D40D: frequency, pulse width, waveform, envelope), and four of them double as the effect's settings: byte 1 the start note, byte 5 and byte 12 the two waveforms, byte 8 the flags and interval. Byte 0 is the mode and speed, byte 15 the end note. Bits 4-5 of byte 0 choose INC or DEC for the step ($53DE)."
  },
  {
   "address": 21876,
   "type": "line",
   "text": "Copies the effect's 14 SID register bytes from its record ($55FA on) into voices 1 and 2."
  },
  {
   "address": 21901,
   "type": "line",
   "text": "Rewrites the step's DEC or INC at $53DE for the effect's direction."
  },
  {
   "address": 21905,
   "type": "line",
   "text": "The thirteen instruments, eight bytes each: pulse width (bytes 0-1, low first, and changed as it sweeps), waveform (byte 2: $41 pulse, $81 noise, $43 pulse with sync, $15 triangle with ring, $21 sawtooth), attack-decay and sustain-release (3, 4), vibrato depth (5), pulse width step and speed (6) and effect bits (7: 1 drum, 2 rise, 4 octaves, 8 pulse add)."
  },
  {
   "address": 21906,
   "type": "line",
   "text": "Instrument byte 1, the pulse width's high byte, read and swept as $5592,Y ($5142, $5273-$52A3)."
  },
  {
   "address": 21907,
   "type": "line",
   "text": "Instrument byte 2, the waveform ($5128, $5133)."
  },
  {
   "address": 21908,
   "type": "line",
   "text": "Instrument byte 3, attack and decay ($5148)."
  },
  {
   "address": 21909,
   "type": "line",
   "text": "Instrument byte 4, sustain and release ($514E)."
  },
  {
   "address": 21910,
   "type": "line",
   "text": "Instrument byte 5, the vibrato depth ($51B9)."
  },
  {
   "address": 21911,
   "type": "line",
   "text": "Instrument byte 6, the pulse sweep's step and speed ($51B3)."
  },
  {
   "address": 21912,
   "type": "line",
   "text": "Instrument byte 7, the effect bits ($51AD); then the twelve instruments after the first, to $55F8."
  },
  {
   "address": 22009,
   "type": "line",
   "text": "The sixteen sound effects, sixteen bytes each (laid out in $5531). The game asks for eight: 0 a box of grenades picked up, 1 a grenade thrown, 2 a bunker destroyed, 4 the player hit or fallen, 5 the jeep, 9 the last area won, 11 a letter shot in the name entry, 12 an extra life. Effects 3, 6, 7, 8, 10 and 13-15 are never asked for."
  },
  {
   "address": 22010,
   "type": "line",
   "text": "Effect byte 1, the start note ($554F), and the first of the fourteen bytes copied into the SID ($5574)."
  },
  {
   "address": 22014,
   "type": "line",
   "text": "Effect byte 5, voice 1's waveform ($5566)."
  },
  {
   "address": 22017,
   "type": "line",
   "text": "Effect byte 8, the flags and voice 2's interval ($555B)."
  },
  {
   "address": 22021,
   "type": "line",
   "text": "Effect byte 12, voice 2's waveform ($556C)."
  },
  {
   "address": 22024,
   "type": "line",
   "text": "Effect byte 15, the end note ($5555); then the fifteen effects after the first, to $56F8."
  },
  {
   "address": 22265,
   "type": "line",
   "text": "The playing tune's three track addresses, low bytes then high, copied from $56FF by $5F0C."
  },
  {
   "address": 22268,
   "type": "line",
   "text": "The high bytes of the playing tune's three track addresses ($5073)."
  },
  {
   "address": 22271,
   "type": "line",
   "text": "The three tunes, six bytes each: the low bytes of the three voices' track addresses, then the high bytes. Tune 0 at $576B, $57AC, $57EC; tune 1 at $5868, $5872, $5874; tune 2 at $587E, $5881, $5884."
  },
  {
   "address": 22289,
   "type": "line",
   "text": "Low bytes of the 45 pattern addresses, by pattern number."
  },
  {
   "address": 22334,
   "type": "line",
   "text": "High bytes of the 45 pattern addresses."
  },
  {
   "address": 22379,
   "type": "line",
   "text": "The first voice of tune 0, the main tune: 64 patterns, 3936 ticks, about 3 min 56 s at 50 frames a second, then starts again."
  },
  {
   "address": 22444,
   "type": "line",
   "text": "The second voice of tune 0, the main tune: 63 patterns, 3936 ticks, about 3 min 56 s at 50 frames a second, then starts again."
  },
  {
   "address": 22508,
   "type": "line",
   "text": "The third voice of tune 0, the main tune: 123 patterns, 3936 ticks, about 3 min 56 s at 50 frames a second, then starts again."
  },
  {
   "address": 22632,
   "type": "line",
   "text": "The first voice of tune 1, the high-score tune: 9 patterns, 768 ticks, about 1 min 01 s at 50 frames a second, then starts again."
  },
  {
   "address": 22642,
   "type": "line",
   "text": "The second voice of tune 1, the high-score tune: 1 pattern, 32 ticks, about 2.6 s at 50 frames a second, then starts again."
  },
  {
   "address": 22644,
   "type": "line",
   "text": "The third voice of tune 1, the high-score tune: 9 patterns, 768 ticks, about 1 min 01 s at 50 frames a second, then starts again."
  },
  {
   "address": 22654,
   "type": "line",
   "text": "The first voice of tune 2, the area-complete tune: 2 patterns, 128 ticks, about 7.7 s at 50 frames a second, then stops the music ($FE)."
  },
  {
   "address": 22657,
   "type": "line",
   "text": "The second voice of tune 2, the area-complete tune: 2 patterns, 128 ticks, about 7.7 s at 50 frames a second, then stops the music ($FE)."
  },
  {
   "address": 22660,
   "type": "line",
   "text": "The third voice of tune 2, the area-complete tune: 2 patterns, 128 ticks, about 7.7 s at 50 frames a second, then stops the music ($FE)."
  },
  {
   "address": 22663,
   "type": "line",
   "text": "Pattern 0: 1 rest over 32 ticks. Played by tune 2 first voice once; tune 2 second voice once; tune 2 third voice once."
  },
  {
   "address": 22665,
   "type": "line",
   "text": "Pattern 7: 50 notes and 2 rests over 256 ticks, instruments 0, 3, 12, notes 44-68. Played by tune 0 first voice 2 times."
  },
  {
   "address": 22778,
   "type": "line",
   "text": "Pattern 8: 30 notes and 3 rests over 128 ticks, instruments 1, 4, notes 50-104. Played by tune 0 second voice 7 times."
  },
  {
   "address": 22849,
   "type": "line",
   "text": "Pattern 10: 30 notes and 3 rests over 128 ticks, instruments 1, 4, notes 53-104. Played by tune 0 second voice 2 times."
  },
  {
   "address": 22920,
   "type": "line",
   "text": "Pattern 9: 33 notes over 128 ticks, instruments 0, 3, 12, notes 44-65. Played by tune 0 first voice once."
  },
  {
   "address": 22994,
   "type": "line",
   "text": "Pattern 12: 41 notes over 128 ticks, instrument 5, notes 56-65. Played by tune 0 first voice 2 times."
  },
  {
   "address": 23078,
   "type": "line",
   "text": "Pattern 15: 23 notes over 128 ticks, instruments 6, 12, 4 slides, notes 44-66. Played by tune 0 first voice 3 times."
  },
  {
   "address": 23133,
   "type": "line",
   "text": "Pattern 16: 10 notes over 32 ticks, instrument 6, notes 57-62. Played by tune 0 first voice 12 times."
  },
  {
   "address": 23155,
   "type": "line",
   "text": "Pattern 17: 12 notes over 64 ticks, instruments 6, 12, 1 slide, notes 44-64. Played by tune 0 first voice 3 times."
  },
  {
   "address": 23185,
   "type": "line",
   "text": "Pattern 18: 25 notes over 128 ticks, instruments 6, 12, 2 slides, notes 44-69. Played by tune 0 first voice 2 times."
  },
  {
   "address": 23245,
   "type": "line",
   "text": "Pattern 19: 16 notes over 64 ticks, instruments 1, 7, notes 55-88. Played by tune 0 first voice 4 times; tune 0 second voice 16 times."
  },
  {
   "address": 23281,
   "type": "line",
   "text": "Pattern 20: 16 notes over 64 ticks, instruments 1, 7, notes 47-85. Played by tune 0 second voice 10 times."
  },
  {
   "address": 23317,
   "type": "line",
   "text": "Pattern 21: 16 notes over 64 ticks, instruments 1, 7, notes 48-93. Played by tune 0 second voice 3 times."
  },
  {
   "address": 23353,
   "type": "line",
   "text": "Pattern 22: 16 notes over 64 ticks, instruments 1, 7, notes 50-95. Played by tune 0 second voice 4 times."
  },
  {
   "address": 23389,
   "type": "line",
   "text": "Pattern 23: 15 notes over 32 ticks, instrument 5, notes 68-70. Played by tune 0 first voice 19 times."
  },
  {
   "address": 23421,
   "type": "line",
   "text": "Pattern 24: 15 notes over 32 ticks, instrument 5, notes 65-67. Played by tune 0 second voice 19 times."
  },
  {
   "address": 23453,
   "type": "line",
   "text": "Pattern 25: 12 notes over 32 ticks, instruments 5, 12, notes 37-47. Played by tune 0 third voice 19 times."
  },
  {
   "address": 23482,
   "type": "line",
   "text": "Pattern 26: 68 notes over 384 ticks, instrument 6, 6 slides, notes 55-69. Played by tune 0 first voice once."
  },
  {
   "address": 23626,
   "type": "line",
   "text": "Pattern 27: 21 notes and 1 rest over 128 ticks, 2 slides, notes 64-77. Played by tune 0 first voice once."
  },
  {
   "address": 23672,
   "type": "line",
   "text": "Pattern 28: 12 notes over 32 ticks, notes 64-76. Played by tune 0 first voice 4 times."
  },
  {
   "address": 23697,
   "type": "line",
   "text": "Pattern 29: 12 notes over 32 ticks, notes 64-76. Played by tune 0 first voice 4 times."
  },
  {
   "address": 23722,
   "type": "line",
   "text": "Pattern 30: 12 notes over 32 ticks, notes 61-73. Played by tune 0 first voice 4 times."
  },
  {
   "address": 23747,
   "type": "line",
   "text": "Pattern 31: 3 notes and 1 rest over 32 ticks, instruments 7, 12, notes 44-104. Played by tune 0 first voice 2 times; tune 0 second voice 2 times; tune 0 third voice 2 times."
  },
  {
   "address": 23757,
   "type": "line",
   "text": "Pattern 1: 8 notes over 32 ticks, instruments 2, 3, notes 21-46. Played by tune 0 third voice 30 times."
  },
  {
   "address": 23779,
   "type": "line",
   "text": "Pattern 2: 8 notes over 32 ticks, instruments 2, 3, notes 22-46. Played by tune 0 third voice 6 times."
  },
  {
   "address": 23801,
   "type": "line",
   "text": "Pattern 3: 8 notes over 32 ticks, instruments 2, 3, notes 16-46. Played by tune 0 third voice 15 times."
  },
  {
   "address": 23823,
   "type": "line",
   "text": "Pattern 4: 8 notes over 32 ticks, instruments 2, 3, notes 24-46. Played by tune 0 third voice 4 times."
  },
  {
   "address": 23845,
   "type": "line",
   "text": "Pattern 5: 8 notes over 32 ticks, instruments 2, 3, notes 25-46. Played by tune 0 third voice 2 times."
  },
  {
   "address": 23867,
   "type": "line",
   "text": "Pattern 6: 8 notes over 32 ticks, instruments 2, 3, notes 19-46. Played by tune 0 third voice 2 times."
  },
  {
   "address": 23889,
   "type": "line",
   "text": "Pattern 11: 8 notes over 32 ticks, instruments 2, 3, notes 26-46. Played by tune 0 third voice 23 times."
  },
  {
   "address": 23911,
   "type": "line",
   "text": "Pattern 13: 8 notes over 32 ticks, instruments 2, 3, notes 18-46. Played by tune 0 third voice 10 times."
  },
  {
   "address": 23933,
   "type": "line",
   "text": "Pattern 14: 8 notes over 32 ticks, instruments 2, 3, notes 25-46. Played by tune 0 third voice 10 times."
  },
  {
   "address": 23955,
   "type": "line",
   "text": "Pattern 32: 12 notes over 64 ticks, instruments 2, 3. It has no $FF of its own and runs on into pattern 33, so played it is 24 notes over 128 ticks. Played by tune 1 third voice 3 times."
  },
  {
   "address": 23988,
   "type": "line",
   "text": "Pattern 33: 12 notes over 64 ticks, instruments 2, 3, notes 26-46. Played by tune 1 third voice once."
  },
  {
   "address": 24021,
   "type": "line",
   "text": "Pattern 34: 12 notes over 64 ticks, instruments 2, 3, notes 25-46. Played by tune 1 third voice once."
  },
  {
   "address": 24054,
   "type": "line",
   "text": "Pattern 35: 12 notes over 64 ticks, instruments 2, 3, notes 21-46. Played by tune 1 third voice 4 times."
  },
  {
   "address": 24087,
   "type": "line",
   "text": "Pattern 36: 8 notes over 96 ticks, instrument 8, notes 57-62. Played by tune 1 first voice 3 times."
  },
  {
   "address": 24105,
   "type": "line",
   "text": "Pattern 37: 5 notes over 32 ticks, notes 54-57. Played by tune 1 first voice once."
  },
  {
   "address": 24116,
   "type": "line",
   "text": "Pattern 38: 4 notes over 32 ticks, notes 52-57. Played by tune 1 first voice 2 times."
  },
  {
   "address": 24125,
   "type": "line",
   "text": "Pattern 39: 15 notes over 128 ticks, notes 52-62. Played by tune 1 first voice once."
  },
  {
   "address": 24156,
   "type": "line",
   "text": "Pattern 40: 16 notes and 2 rests over 128 ticks, notes 50-59. Played by tune 1 first voice 2 times."
  },
  {
   "address": 24191,
   "type": "line",
   "text": "Pattern 41: 8 notes over 32 ticks, instrument 9, notes 45-57. Played by tune 1 second voice once."
  },
  {
   "address": 24209,
   "type": "line",
   "text": "Pattern 42: 19 notes and 1 rest over 96 ticks, instrument 10, notes 52-61. Played by tune 2 first voice once."
  },
  {
   "address": 24250,
   "type": "line",
   "text": "Pattern 43: 19 notes and 1 rest over 96 ticks, instrument 10, notes 49-58. Played by tune 2 second voice once."
  },
  {
   "address": 24291,
   "type": "line",
   "text": "Pattern 44: 19 notes and 1 rest over 96 ticks, instrument 10, notes 45-54. Played by tune 2 third voice once."
  },
  {
   "address": 24332,
   "type": "line",
   "text": "Starts tune A: its speed from $5514, its three track addresses from $56FF into $56F9, all three gates off, full volume, and the state $40, so the next frame resets the voices and plays."
  },
  {
   "address": 24386,
   "type": "line",
   "text": "Asks for the music to stop: state $C0, acted on at the next frame."
  },
  {
   "address": 24392,
   "type": "line",
   "text": "Turns sound effects on ($5526 = 0)."
  },
  {
   "address": 24398,
   "type": "line",
   "text": "Turns sound effects off ($5526 = $FF) and stops the one playing. Nothing in the game calls it."
  },
  {
   "address": 24406,
   "type": "line",
   "text": "Asks for sound effect A: with effects on, $5527 = A + $40 and full volume, returning A = $0F; with them off, $5527 = $FF and A is returned unchanged. The fall into water or a hole keeps that $0F as the death count's start ($3C1A)."
  },
  {
   "address": 24415,
   "type": "line",
   "text": "Marks the request ($40 + n in $5527) and sets the volume to 15."
  },
  {
   "address": 24426,
   "type": "line",
   "text": "REMEMBER's hook in place of the game's LDA $DC01 at $38BE: reads the keyboard row and returns. With the level skip chosen, the RTS at $5F6D becomes CMP #$DF, so the bytes from $5F6D read CMP #$DF / BEQ $5F72 / RTS / JMP $0939: C= ends the area at once. Since $38BE runs only when a grenade could be thrown, the key works only then. In the 1985 release, $5F6A-$5FB1 holds two routines that nothing calls: $5F6A points the KERNAL's interrupt vector ($0314) at $5F81, which plays the music ($5012) from a raster interrupt at line $80 and goes on to $EA31, and $5F96 puts $EA31 back, silences the SID and turns the raster interrupt off."
  },
  {
   "address": 24429,
   "type": "line",
   "text": "The byte REMEMBER's skip question rewrites ($4606): $60, an RTS, as loaded; $C9, a CMP #, when the C= skip is chosen."
  },
  {
   "address": 24429,
   "type": "side",
   "text": "RTS, or CMP #$DF with the level skip: the next byte, $DF (the C= key's row bit), is its operand"
  },
  {
   "address": 24431,
   "type": "line",
   "text": "REMEMBER's area skip, when chosen: C= held goes to the area's end ($0939)."
  },
  {
   "address": 24434,
   "type": "line",
   "text": "The skip: jumps into next_area."
  },
  {
   "address": 24437,
   "type": "line",
   "text": "Eleven zero bytes."
  },
  {
   "address": 24448,
   "type": "line",
   "text": "The menu's question on unlimited grenades."
  },
  {
   "address": 24488,
   "type": "line",
   "text": "The menu's question on not falling into holes and water."
  },
  {
   "address": 24528,
   "type": "line",
   "text": "The menu's question on turning collisions off."
  },
  {
   "address": 24568,
   "type": "line",
   "text": "Eight $20 bytes, screen-code spaces, after the collision question and before area 0's map; the menu copies only the 40 bytes before them ($45E6)."
  },
  {
   "address": 24576,
   "type": "line",
   "text": "Area 0's map (the first area played), rows 0-24 ($00-$18), characters of the set at $C000: the top. Rows 0-6 are the wall across the top of the area, broken by a gap at columns 15-25 where the gate, 15 x 9 characters from column 13, is drawn ($15BC): shut at each life's start, open once row 1 reaches the top of the screen. Below it, open ground with stones and the first sandbag wall, on the right at rows 20-22. Spawn-list entries due as these rows reach the top of the screen: row 0, the green soldier; row 1, the gate opening; row 17, a box of grenades; row 20, a soldier lying in wait. Checkpoint row 19: a life lost with the top of the screen at rows 0-19 restarts with this row at the top."
  },
  {
   "address": 25576,
   "type": "line",
   "text": "Area 0's map (the first area played), rows 25-49 ($19-$31), characters of the set at $C000: open ground with sandbag walls, which stop the player and bullets: on the left at rows 25 and 41, in the middle at row 30, on the right at row 46. Spawn-list entries due as these rows reach the top of the screen: row 25, a soldier lying in wait; row 25, a soldier lying in wait; row 30, a soldier lying in wait; row 38, a box of grenades; row 41, a soldier lying in wait; row 46, a soldier lying in wait; row 46, a soldier lying in wait."
  },
  {
   "address": 26576,
   "type": "line",
   "text": "Area 0's map (the first area played), rows 50-74 ($32-$4A), characters of the set at $C000: a last sandbag wall on the left at row 55, then a field of boulders: three in a row at rows 62-64 and one at rows 70-72. Spawn-list entries due as these rows reach the top of the screen: row 52, a box of grenades; row 55, a soldier lying in wait; row 62, a soldier lying in wait; row 62, a soldier lying in wait; row 62, a soldier lying in wait; row 70, a soldier lying in wait; row 74, a soldier lying in wait. Checkpoint row 61: a life lost with the top of the screen at rows 20-61 restarts with this row at the top."
  },
  {
   "address": 27576,
   "type": "line",
   "text": "Area 0's map (the first area played), rows 75-99 ($4B-$63), characters of the set at $C000: three more boulders, at rows 74-76, 80-82 and 83-85, then at rows 89-98 a wall across the map (terrain 3, solid and drawn over the sprites, in rows 89-93; terrain 1 below), passable only through the arch at columns 18-21, where the player walks behind it (terrain 2). A palm stands against the wall at its left end, columns 0-4. Spawn-list entries due as these rows reach the top of the screen: row 77, a soldier walking in from the left; row 80, a soldier lying in wait; row 83, a soldier lying in wait; row 84, a soldier walking in from the right; row 86, a grenadier who stops to throw; row 87, a soldier walking in from the left; row 91, the motorcycle and sidecar that stops; row 91, a grenadier who stops to throw. Checkpoint row 97: a life lost with the top of the screen at rows 62-97 restarts with this row at the top."
  },
  {
   "address": 28576,
   "type": "line",
   "text": "Area 0's map (the first area played), rows 100-124 ($64-$7C), characters of the set at $C000: palms, a sandbag emplacement at the top right (rows 100-105) where the trench soldier waits, and the top of a grassy outcrop (rows 124-129), whose rock face is a wall. Spawn-list entries due as these rows reach the top of the screen: row 100, a box of grenades; row 102, a soldier in a trench; row 123, a guard; row 123, a guard; row 123, a prisoner."
  },
  {
   "address": 29576,
   "type": "line",
   "text": "Area 0's map (the first area played), rows 125-149 ($7D-$95), characters of the set at $C000: two grassy outcrops (rows 124-129 in the middle, 131-138 on the left), a boulder, palms and a sandbag wall at rows 144-146. Spawn-list entries due as these rows reach the top of the screen: row 126, a soldier running in from the left to jump; row 129, a soldier running in from the left to jump; row 132, a soldier running in from the left to jump; row 142, a box of grenades; row 144, a soldier lying in wait. Checkpoint row 131: a life lost with the top of the screen at rows 98-131 restarts with this row at the top."
  },
  {
   "address": 30576,
   "type": "line",
   "text": "Area 0's map (the first area played), rows 150-174 ($96-$AE), characters of the set at $C000: clumps of palms (rows 149-155 and 169-175), single palms, and an outcrop on the right at rows 157-162. Spawn-list entries due as these rows reach the top of the screen: row 152, a soldier running in from the right to jump; row 155, a soldier running in from the right to jump; row 158, a soldier running in from the right to jump."
  },
  {
   "address": 31576,
   "type": "line",
   "text": "Area 0's map (the first area played), rows 175-199 ($AF-$C7), characters of the set at $C000: the bottom: palms and an outcrop on the right (rows 178-182), with clumps of palms along the bottom edge. The area starts here, with row 175 at the top of the screen: a new area parks the map at row 165 and the life's set-up moves it down to this checkpoint ($3DE0). Checkpoint row 175: a life lost with the top of the screen at rows 132-175 restarts with this row at the top."
  },
  {
   "address": 32576,
   "type": "line",
   "text": "Thirty-two zero bytes after area 0's map, before REMEMBER's text at $7F60."
  },
  {
   "address": 32608,
   "type": "line",
   "text": "The menu's question on the C= key's level skip."
  },
  {
   "address": 32648,
   "type": "line",
   "text": "The menu's last line: L to load the saved high scores, R to reset them."
  },
  {
   "address": 32768,
   "type": "line",
   "text": "Area 1's map (the second area played), rows 0-24 ($00-$18), characters of the set at $C800: the top. Rows 0-6 are the same wall as area 0's, its gap at columns 15-25 closed and opened by the same gate ($15BC). Below, rock faces line the left edge down to row 21 and the right edge down to row 29, and the left bunker (stamp 0, $14B5) is put back at rows 22-30, columns 0-5, at each life's start ($3DE0 at $8370). Spawn-list entries due as these rows reach the top of the screen: row 1, the gate opening. Checkpoint row 19: a life lost with the top of the screen at rows 0-19 restarts with this row at the top. In the 1985 release the reset trap ($085C) overwrites row 0's first nine characters with its signature, and two pixel lines of them show at the top of the screen at the gate."
  },
  {
   "address": 33768,
   "type": "line",
   "text": "Area 1's map (the second area played), rows 25-49 ($19-$31), characters of the set at $C800: open ground. The right bunker (stamp 1) is put back at rows 35-43, columns 34-39 ($859A), and replaced by its ruin when a grenade destroys its gun. Spawn-list entries due as these rows reach the top of the screen: row 27, the left bunker's gun; row 41, the right bunker's gun."
  },
  {
   "address": 34768,
   "type": "line",
   "text": "Area 1's map (the second area played), rows 50-74 ($32-$4A), characters of the set at $C800: the third bunker (stamp 0, rows 56-64, columns 0-5, $88C0), then the river at rows 66-75: water the player falls into (terrain 4, rows 68-74) right across the map, crossed by a wooden bridge whose deck, columns 8-14, is the one way over. Spawn-list entries due as these rows reach the top of the screen: row 58, a grenadier who stops to throw; row 61, a soldier walking in from the right; row 61, the left bunker's gun; row 70, a foxhole. Checkpoint row 61: a life lost with the top of the screen at rows 20-61 restarts with this row at the top."
  },
  {
   "address": 35768,
   "type": "line",
   "text": "Area 1's map (the second area played), rows 75-99 ($4B-$63), characters of the set at $C800: the river's lower bank, a hangar at the left edge (rows 84-91, a wall), and open ground. Spawn-list entries due as these rows reach the top of the screen: row 81, a bomb thrower from the right; row 82, a bomb thrower from the left; row 94, a soldier walking in from the right; row 97, a soldier walking in from the left. Checkpoint row 97: a life lost with the top of the screen at rows 62-97 restarts with this row at the top."
  },
  {
   "address": 36768,
   "type": "line",
   "text": "Area 1's map (the second area played), rows 100-124 ($64-$7C), characters of the set at $C800: a wall right across the map at rows 101-109, passable only through its gap at columns 17-21, behind which the player walks (terrain 2); then the first of the black pits, which are holes the player falls into (terrain 4). Spawn-list entries due as these rows reach the top of the screen: row 104, a grenadier who stops to throw; row 112, a box of grenades; row 116, a foxhole; row 123, a foxhole; row 123, a foxhole; row 123, a foxhole."
  },
  {
   "address": 37768,
   "type": "line",
   "text": "Area 1's map (the second area played), rows 125-149 ($7D-$95), characters of the set at $C800: open ground, rows 125-149, broken by pits at both sides and one in the middle at rows 139-140. Spawn-list entries due as these rows reach the top of the screen: row 131, a foxhole; row 136, a foxhole; row 138, a box of grenades; row 140, a foxhole; row 140, a foxhole; row 147, a foxhole; row 149, a foxhole; row 149, a foxhole. Checkpoint row 131: a life lost with the top of the screen at rows 98-131 restarts with this row at the top."
  },
  {
   "address": 38768,
   "type": "line",
   "text": "Area 1's map (the second area played), rows 150-174 ($96-$AE), characters of the set at $C800: the last two pits, at rows 154-155 and 158-159, then open ground. The area starts here, with row 166 at the top of the screen: the checkpoint below row 165, where a new area parks the map ($3DE0). Spawn-list entries due as these rows reach the top of the screen: row 150, a motorcycle and sidecar crossing; row 155, a foxhole; row 155, the purple vehicle crossing; row 157, a foxhole; row 162, a box of grenades; row 165, a jeep. Checkpoint row 166: a life lost with the top of the screen at rows 132-166 restarts with this row at the top."
  },
  {
   "address": 39768,
   "type": "line",
   "text": "Area 1's map (the second area played), rows 175-199 ($AF-$C7), characters of the set at $C800: the bottom: open ground with stones, rows 175-199."
  },
  {
   "address": 40768,
   "type": "line",
   "text": "192 zero bytes after area 1's map, up to $A000, where area 3's begins."
  },
  {
   "address": 40960,
   "type": "line",
   "text": "Area 3's map (the third area played), rows 0-24 ($00-$18), characters of the set at $D800: the top: the fortress. Its walls fill rows 0-12, with the black doorway at columns 15-25, whose inside (columns 16-24, rows 6-11) the sprites pass behind (terrain 2); the twenty soldiers of the top come out of it (from y $64, $2CBB), and when they are gone the player walks up into it to finish the game ($3A2E). Below it, open ground. Spawn-list entries due as these rows reach the top of the screen: row 2, a soldier lying in wait; row 2, a soldier lying in wait; row 10, a soldier lying in wait; row 10, a soldier lying in wait; row 22, a bomb thrower from the right; row 24, a bomb thrower from the right. Checkpoint row 19: a life lost with the top of the screen at rows 0-19 restarts with this row at the top."
  },
  {
   "address": 41960,
   "type": "line",
   "text": "Area 3's map (the third area played), rows 25-49 ($19-$31), characters of the set at $D800: open ground, and a clump of palms at the left edge from row 42. Spawn-list entries due as these rows reach the top of the screen: row 28, a box of grenades; row 30, a bomb thrower from the left; row 36, a bomb thrower from the left; row 38, a bomb thrower from the left."
  },
  {
   "address": 42960,
   "type": "line",
   "text": "Area 3's map (the third area played), rows 50-74 ($32-$4A), characters of the set at $D800: the palms at the left, a watchtower at the right edge (rows 62-73), and from row 64 the start of the airstrip, a grey road with dashes crossing the map diagonally, down to the right. Spawn-list entries due as these rows reach the top of the screen: row 58, a bomb thrower from the right; row 59, a bomb thrower from the left; row 62, a bomb thrower from the right; row 67, a sniper. Checkpoint row 61: a life lost with the top of the screen at rows 20-61 restarts with this row at the top."
  },
  {
   "address": 43960,
   "type": "line",
   "text": "Area 3's map (the third area played), rows 75-99 ($4B-$63), characters of the set at $D800: the airstrip across the middle of the map, with ground and palms in the corner at bottom left (rows 84-99). Spawn-list entries due as these rows reach the top of the screen: row 76, a box of grenades; row 78, a bomb thrower from the left; row 80, a bomb thrower from the left; row 83, a bomb thrower from the right; row 88, a lorry; row 93, a lorry; row 96, a bomb thrower from the left; row 97, a motorcycle and sidecar crossing. Checkpoint row 97: a life lost with the top of the screen at rows 62-97 restarts with this row at the top."
  },
  {
   "address": 44960,
   "type": "line",
   "text": "Area 3's map (the third area played), rows 100-124 ($64-$7C), characters of the set at $D800: the airstrip, a patch of ground with a palm on it at the right (rows 99-116), and the wing of a camouflaged aircraft at the right edge (rows 118-125). Spawn-list entries due as these rows reach the top of the screen: row 115, a bomb thrower from the left; row 116, a bomb thrower from the right; row 119, a motorcycle and sidecar crossing."
  },
  {
   "address": 45960,
   "type": "line",
   "text": "Area 3's map (the third area played), rows 125-149 ($7D-$95), characters of the set at $D800: the lower edge of the airstrip, then ground with a sandbag wall at the left (rows 139-141) and a clump of palms. Spawn-list entries due as these rows reach the top of the screen: row 131, a box of grenades; row 139, a soldier lying in wait; row 139, a soldier lying in wait; row 146, a bomb thrower from the right. Checkpoint row 131: a life lost with the top of the screen at rows 98-131 restarts with this row at the top."
  },
  {
   "address": 46960,
   "type": "line",
   "text": "Area 3's map (the third area played), rows 150-174 ($96-$AE), characters of the set at $D800: trenches: three bands across the map (rows 152-160, 169-178 and 186-195), each a hole the player falls into (terrain 4), crossed only at its grey gate, 13 columns wide: columns 1-13 in the first band, 15-27 in the second. The area starts here, with row 166 at the top of the screen: the checkpoint below row 165, where a new area parks the map ($3DE0). Spawn-list entries due as these rows reach the top of the screen: row 163, a bomb thrower from the left; row 164, a bomb thrower from the left. Checkpoint row 166: a life lost with the top of the screen at rows 132-166 restarts with this row at the top."
  },
  {
   "address": 47960,
   "type": "line",
   "text": "Area 3's map (the third area played), rows 175-199 ($AF-$C7), characters of the set at $D800: the bottom: the third band of trenches, its gate at columns 21-33, and open ground below it. Spawn-list entries placed as soon as a life starts at row 166, since they lie on its first screen ($109B): row 179, a bomb thrower from the right; row 180, a bomb thrower from the left."
  },
  {
   "address": 48960,
   "type": "line",
   "text": "192 zero bytes after area 3's map, up to $C000, where the video bank and its first character set begin."
  },
  {
   "address": 49152,
   "type": "line",
   "text": "Area 0's character set (the first area played; $D018 = $80: the raster split $41A7 puts area x 2 in its low nibble), glyphs 0-127 of 256, multicolour: pieces of the jungle that the map at $6000 puts together into ground, stones, sandbags, boulders, the wall with its arch, palms and grassy outcrops. The map and the gate's pictures use 116 of these 128 glyphs. The area's terrain table ($178B) classes 84 of the 128 as walls and 28 as scenery the sprites pass behind."
  },
  {
   "address": 50176,
   "type": "line",
   "text": "Area 0's character set, glyphs 128-255: more of the jungle's pieces. The map and the gate's pictures use 109 of them. The terrain table classes 79 of the 128 as walls and 39 as scenery the sprites pass behind. Glyph $E3 ($C718) is one the map never uses. Its last two rows, $C71E-$C71F, are $00 $0A here and $FF $FF in the 1985 release: the only bytes of the maps, character sets and sprites that differ between the two."
  },
  {
   "address": 51200,
   "type": "line",
   "text": "Area 1's character set (the second area played, $D018 = $82), glyphs 0-127, multicolour: the pieces of the map at $8000 and of the bunker stamps ($14E4-$15BB): the river and its bridge, the hangar, the wall with its gap and the black pits; the rock faces are drawn from glyphs 128-255. The map, the gate's pictures and the stamps use 109 of them. Its terrain table ($188B) classes 39 of the 128 as walls, 7 as scenery the sprites pass behind and 20 as water or holes the player falls into."
  },
  {
   "address": 52224,
   "type": "line",
   "text": "Area 1's character set, glyphs 128-255. The map, the gate's pictures and the stamps use 110 of them. The terrain table classes 93 of the 128 as walls and 8 as scenery the sprites pass behind, and none as water."
  },
  {
   "address": 53248,
   "type": "line",
   "text": "The character set at $D000 (area counter 2, $D018 = $84), in the RAM under the I/O area, which the VIC reads whatever the processor port says. The game shows it for all its text: the title's credits, the messages between areas, the name entry and the score lines under the playfield (raster interrupt $4119). Glyphs 0-7 here; space is $20, the digits 0-9 are $21-$2A, the score line's grenade and equals sign $3C and $3F, the letters A-Z $5B-$74 and the name entry's marks and END $75-$78. Glyphs 8-15 ($D040-$D07F) are blank as loaded and become sprite block $41, the name entry's gunsight ($0A57)."
  },
  {
   "address": 53376,
   "type": "line",
   "text": "The text character set from glyph 16 to glyph 127: the digits, the score line's symbols and the letters the game writes with, among scenery pieces. Of the 256 glyphs, 65 are the same as area 1's at the same code: area 2, which would show this set as its scenery, is never played (the area counter skips it, $0939)."
  },
  {
   "address": 54272,
   "type": "line",
   "text": "The text character set, glyphs 128-255. $80-$96 finish a second drawing of the letters A-Z and of the name entry's marks $75 and $76, which starts at $7B: the name entry's flash shows it by adding $20 to the letter shot ($0ABE). $97 and $98, where second drawings of the rub-out and END would fall, hold other pieces; a shot rub-out never flashes ($0D77). The rest are scenery pieces in the style of area 1's, which no screen shows, since area 2 is never played."
  },
  {
   "address": 55296,
   "type": "line",
   "text": "Area 3's character set (the third area played, $D018 = $86), in the RAM under the colour RAM and CIAs, glyphs 0-127, multicolour: pieces of the map at $A000, the fortress, palms, the watchtower, the airstrip, the aircraft and the trenches with their gates. The map uses 111 of them. The terrain table ($1A8B) classes 42 of the 128 as walls, 18 as scenery the sprites pass behind and 28 as trench or hole the player falls into."
  },
  {
   "address": 55336,
   "type": "line",
   "text": "Two things share these addresses. With I/O in, colour RAM row 1, which REMEMBER's menu colours blue ($4558). In the RAM beneath, which the VIC reads, area 3's glyphs 5-9: pieces of the palms, scenery the sprites pass behind (map rows 44-146)."
  },
  {
   "address": 55376,
   "type": "line",
   "text": "With I/O in, colour RAM from row 2, which REMEMBER's menu colours light grey along that row ($455D). Beneath, area 3's glyphs 10-31: more pieces of the palms (scenery, rows 45-150) and the walls $1A and $1B among them, and ground pieces, most of them on the airstrip's edges (rows 64-142) and two, $13 and $1E, scattered over the whole map; $18 and $1D are not on the map."
  },
  {
   "address": 55552,
   "type": "line",
   "text": "With I/O in, colour RAM from row 6, column 16, which REMEMBER's instructions viewer blacks out ($472F). Beneath, area 3's glyphs 32-51: $30, the plain ground, used 3,414 times, with the ground pieces $32 and $33; the airstrip's dashes ($21, $22, $24, rows 74-127); pieces of the trenches' grey gates ($23, $27-$2D, $2F, rows 152-195), with $25 and $26, which also frame the fortress's doorway; and $20, a wall at the right edge of rows 58-61."
  },
  {
   "address": 55706,
   "type": "line",
   "text": "With I/O in, colour RAM row 10 from column 10, written white as the area message types its first line ($128A). Beneath, area 3's glyphs from the third byte of $33 to the first of $3D: ground pieces ($35 and $36 are all over the map), and the first trench pieces the player falls into, $39-$3C (rows 152-186)."
  },
  {
   "address": 55785,
   "type": "line",
   "text": "With I/O in, colour RAM row 12 from column 9, written white for the message's second line ($12A1). Beneath, the rest of area 3's glyph $3D and glyphs $3E and $3F, more trench pieces the player falls into (rows 153-191)."
  },
  {
   "address": 55808,
   "type": "line",
   "text": "With I/O in, colour RAM from row 12, column 32, blacked out by the instructions viewer ($4732). Beneath, area 3's glyphs 64-95: trench pieces the player falls into ($40-$44, $4A-$4E, $50-$55, rows 153-194); $4F, the third trench's gate (rows 187-194); the sandbag wall at the left of rows 139-140 ($56-$5F); and five walls, $45-$49, that the map never uses."
  },
  {
   "address": 56064,
   "type": "line",
   "text": "With I/O in, colour RAM from row 19, column 8, blacked out by the instructions viewer ($4735). Beneath, area 3's glyphs 96-104: the rest of the sandbag wall at rows 140-141 ($61-$67) and $68, solid grey, which the map uses 2,023 times between rows 2 and 177: the airstrip's surface and the grey of the fortress's corners, the watchtower's roof and the trenches' gates."
  },
  {
   "address": 56136,
   "type": "line",
   "text": "With I/O in, colour RAM row 21, the score line's: white at each life's start and on the title ($403F) and at each redraw of the line ($4089). Beneath, area 3's glyphs 105-114: $69, the black-lined crossbar of the trenches' grey gates (rows 155, 173 and 190), the trench pieces $6A-$6D, and the first walls of the aircraft's wing at the right edge (rows 118-119, $6E-$72)."
  },
  {
   "address": 56216,
   "type": "line",
   "text": "With I/O in, colour RAM row 23, under the score line: white at each life's start and on the title ($4042), black at each redraw of the line ($4093). Beneath, area 3's glyphs 115-127: the rest of the aircraft's wing (rows 119-122, columns 35-39), and $79 and $7E, which the map never uses."
  },
  {
   "address": 56320,
   "type": "line",
   "text": "Area 3's character set, glyphs 128-255. The map uses 99 of them. The terrain table classes 98 of the 128 as walls, 21 as scenery the sprites pass behind and 3 as holes."
  },
  {
   "address": 58368,
   "type": "line",
   "text": "Sprite blocks $90-$97 (block = address / 64 in video bank 3), the small things. $90, a dot: every bullet, the player's and the enemies'. $91-$93, a grenade at three sizes, $93 smallest and $91 largest: the player's grenade starts at $93 and rises and falls through them ($36D5), as an enemy's thrown grenade does ($2EC8). $94-$97, the spark a bullet ends in, growing ($36F6)."
  },
  {
   "address": 58692,
   "type": "line",
   "text": "Two things share these addresses. With the KERNAL in, its clear-screen routine, which REMEMBER calls before each of its screens ($4531, $4637, $463D, $4710, $4FE2). In the RAM beneath, which the game's VIC bank shows, the end of sprite block $95 and blocks $96 and $97: the spark a bullet ends in, at its larger sizes ($36F6)."
  },
  {
   "address": 58880,
   "type": "line",
   "text": "Sprite blocks $98-$A3, the walk in four of its eight directions ($3C82), drawn once and shown in blue for the player and in other colours for the soldiers: $98-$9A up ($98 is also the player standing), $9B-$9D down, $9E, $9F and $A0 down and to the right, $A1, $A2 and $A3 down and to the left. The other frames of those walks are $DF and $E0."
  },
  {
   "address": 59648,
   "type": "line",
   "text": "Sprite blocks $A4-$AB: the player throwing a grenade, $A4 and $A5 (with $DE and $98 after them, $36DB), then the walk up and to the right, $A6-$A8, and up and to the left, $A9-$AB (their fourth frames are $E1 and $E2)."
  },
  {
   "address": 60160,
   "type": "line",
   "text": "Sprite block $AC, the last of the seven sprites that make up the title's COMMANDO logo, the right-hand end of its last O ($0FFA), and $AD-$AF, the explosion of a grenade, bomb or shell, shown $AF, $AE, $AD, $AF ($37AC): $AF the smallest, $AE scattered pieces, $AD the largest."
  },
  {
   "address": 60416,
   "type": "line",
   "text": "Sprite blocks $B0-$B7, the vehicles, each two sprites wide: $B0 and $B1, a motorcycle and sidecar riding; $B2/$B3 and $B4/$B5, the two frames of the stopped one whose passenger throws grenades ($2B2F); $B6 and $B7, the purple vehicle that crosses from the left ($1F41)."
  },
  {
   "address": 60928,
   "type": "line",
   "text": "Sprite blocks $B8-$BF: $B8, the player lying dead after a hit; $B9 and $BA, the green soldier walking right; $BB, a box of grenades; $BC and $BD, the score sprites reading 2000 and 1000 ($23E7); $BE and $BF, a soldier falling with his arms flung out ($3558)."
  },
  {
   "address": 61440,
   "type": "line",
   "text": "Sprite blocks $C0-$C7: the guard ($C0, $C1), the prisoner ($C2, $C3), the freed prisoner waving ($C4, $C5) and a soldier leaping to the left ($C6, then $C7, $303D)."
  },
  {
   "address": 61952,
   "type": "line",
   "text": "Sprite blocks $C8-$CF: a soldier lying in wait, facing down ($C8, also the foxhole's soldier standing up), down and to the right ($C9) and down and to the left ($CA) ($2FEE); $CB and $CC, a figure sinking out of sight, used for a soldier shot lying in wait or in his foxhole (behaviour 29) and for the player falling into water or a hole; $CD-$CF, the soldier in a trench and his recoil as the mortar fires."
  },
  {
   "address": 62464,
   "type": "line",
   "text": "Sprite blocks $D0-$DF: the mortar bomb at three sizes, $D0 largest ($2F14), $D2 also the bunker gun's shell; a soldier leaping to the right ($D3, then $D4); the walk left ($D5-$D8) and right ($D9-$DC) of the shared walk table; $DD, the player hit; $DE, the third frame of his throw; $DF, the third frame of the walk down and to the right."
  },
  {
   "address": 63488,
   "type": "line",
   "text": "Sprite blocks $E0-$EF: the last walk frames ($E0 down-left, $E1 up-right, $E2 up-left); the grenadier raising a grenade ($E3) and throwing it ($E4, also his standing frame); the bomb thrower walking ($E5-$E7) and stopped to throw ($E8); his bomb, a stick, falling straight ($E9), down and to the left ($EA) or down and to the right ($EB); the foxhole with its soldier ducked ($EC) and rising ($ED); $EE, the ragged burst the ending shows eleven times in red ($3CB2); $EF, the green soldier walking left."
  },
  {
   "address": 64512,
   "type": "line",
   "text": "Sprite blocks $F0-$F3 and the top of $F4: $F0, the green soldier's second frame walking left; the lorry, $F1 and $F2; the jeep, $F3; and the first of the doors soldiers come out of, $F4, which runs on past $FD30, where the KERNAL's vector table lies in the ROM above."
  },
  {
   "address": 64816,
   "type": "line",
   "text": "With the KERNAL in, its table of default vectors, which REMEMBER's menu copies to $0314-$0333 ($4546). In the RAM beneath, sprite blocks from the middle of $F4 to $FE: the rest of the first door soldiers come out of ($F4) and the second ($F5), the first six of the seven sprites of the COMMANDO logo ($F6-$FB), the bunker guns aimed down and right ($FC) and down and left ($FD), and $FE, a near copy of the logo's $AC that no code shows."
  },
  {
   "address": 65466,
   "type": "line",
   "text": "With the KERNAL in, SETLFS, which REMEMBER calls before its save ($4511) and its load ($4645). Beneath, bytes 58-60 of sprite block $FE."
  },
  {
   "address": 65469,
   "type": "line",
   "text": "With the KERNAL in, SETNAM, which REMEMBER calls with its file's name ($451A, $464E). Beneath, the last three bytes of sprite block $FE."
  }
 ]
}