{
 "schema": 1,
 "platform": "c64",
 "game": "encounter",
 "build": "",
 "source": "regenerator2000 live",
 "regions": {
  "exclude": [
   [
    256,
    511,
    "stack"
   ],
   [
    53248,
    57343,
    "I/O and colour RAM"
   ],
   [
    24576,
    25599,
    "screen RAM"
   ],
   [
    0,
    255,
    "zero page, initialised from the image at $8B00"
   ],
   [
    2048,
    5119,
    "loader residue and unused RAM below the object tables"
   ],
   [
    16384,
    24575,
    "view character buffers, rebuilt every frame"
   ],
   [
    25664,
    26367,
    "view screen buffer B rows 2-17"
   ],
   [
    48638,
    53247,
    "never written: emulator fill pattern"
   ],
   [
    512,
    1023,
    "KERNAL vectors and tape buffer"
   ],
   [
    57344,
    65535,
    "KERNAL ROM"
   ],
   [
    6080,
    7679,
    "unreferenced bytes between the object tables and the shape scripts"
   ],
   [
    16108,
    16383,
    "unreferenced tail after the shape scripts"
   ]
  ],
  "extra": [
   [
    30720,
    32767,
    "character set"
   ],
   [
    25600,
    25663,
    "sprite frame: shot dot"
   ],
   [
    26368,
    26623,
    "sprite frames: gun sight, ground strip, mound; sprite pointers B"
   ],
   [
    26624,
    28647,
    "title and game-over screens, prebuilt, with hidden variables"
   ],
   [
    28672,
    30719,
    "sprite images"
   ]
  ]
 },
 "blocks": [
  {
   "start": 0,
   "end": 2399,
   "type": "Undefined"
  },
  {
   "start": 2400,
   "end": 2428,
   "type": "Code"
  },
  {
   "start": 2429,
   "end": 2655,
   "type": "Byte"
  },
  {
   "start": 2656,
   "end": 5119,
   "type": "Undefined"
  },
  {
   "start": 5120,
   "end": 6143,
   "type": "Byte"
  },
  {
   "start": 6144,
   "end": 7679,
   "type": "Undefined"
  },
  {
   "start": 7680,
   "end": 16107,
   "type": "Byte"
  },
  {
   "start": 16108,
   "end": 16383,
   "type": "Undefined"
  },
  {
   "start": 16384,
   "end": 27143,
   "type": "Byte"
  },
  {
   "start": 27144,
   "end": 27165,
   "type": "Code"
  },
  {
   "start": 27166,
   "end": 32767,
   "type": "Byte"
  },
  {
   "start": 32768,
   "end": 32771,
   "type": "Address"
  },
  {
   "start": 32772,
   "end": 39935,
   "type": "Byte"
  },
  {
   "start": 39936,
   "end": 42975,
   "type": "Code"
  },
  {
   "start": 42976,
   "end": 42991,
   "type": "Byte"
  },
  {
   "start": 42992,
   "end": 43684,
   "type": "Code"
  },
  {
   "start": 43685,
   "end": 43716,
   "type": "Byte"
  },
  {
   "start": 43717,
   "end": 44009,
   "type": "Code"
  },
  {
   "start": 44010,
   "end": 44012,
   "type": "Undefined"
  },
  {
   "start": 44013,
   "end": 48129,
   "type": "Code"
  },
  {
   "start": 48130,
   "end": 48157,
   "type": "Byte"
  },
  {
   "start": 48158,
   "end": 48243,
   "type": "Code"
  },
  {
   "start": 48244,
   "end": 49151,
   "type": "Byte"
  },
  {
   "start": 49152,
   "end": 65411,
   "type": "Undefined"
  },
  {
   "start": 65412,
   "end": 65533,
   "type": "Code"
  },
  {
   "start": 65534,
   "end": 65535,
   "type": "Undefined"
  }
 ],
 "symbols": [
  {
   "address": 1,
   "name": "zpa_01",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 2,
   "name": "zpf_02",
   "type": "ZeroPageField",
   "kind": "auto"
  },
  {
   "address": 3,
   "name": "zpa_03",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 4,
   "name": "zpa_04",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 5,
   "name": "zpa_05",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 6,
   "name": "zpa_06",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 7,
   "name": "zpa_07",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 8,
   "name": "zpa_08",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 9,
   "name": "zpa_09",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 10,
   "name": "zpa_0A",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 11,
   "name": "zpa_0B",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 12,
   "name": "zpa_0C",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 13,
   "name": "zpa_0D",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 14,
   "name": "zpa_0E",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 15,
   "name": "zpa_0F",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 16,
   "name": "zpa_10",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 17,
   "name": "zpa_11",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 18,
   "name": "zpa_12",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 21,
   "name": "zpa_15",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 23,
   "name": "zpa_17",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 26,
   "name": "zpa_1A",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 27,
   "name": "zpa_1B",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 28,
   "name": "zpa_1C",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 29,
   "name": "zpa_1D",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 30,
   "name": "zpa_1E",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 31,
   "name": "zpa_1F",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 32,
   "name": "zpa_20",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 33,
   "name": "zpa_21",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 34,
   "name": "zpa_22",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 35,
   "name": "zpa_23",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 36,
   "name": "zpa_24",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 37,
   "name": "zpa_25",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 38,
   "name": "zpa_26",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 39,
   "name": "zpa_27",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 40,
   "name": "zpa_28",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 41,
   "name": "zpa_29",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 42,
   "name": "zpa_2A",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 43,
   "name": "zpa_2B",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 44,
   "name": "zpa_2C",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 45,
   "name": "zpa_2D",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 46,
   "name": "zpa_2E",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 47,
   "name": "zpa_2F",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 49,
   "name": "zpa_31",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 51,
   "name": "zpa_33",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 53,
   "name": "zpa_35",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 54,
   "name": "zpa_36",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 55,
   "name": "zpa_37",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 56,
   "name": "zpa_38",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 57,
   "name": "zpa_39",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 58,
   "name": "zpp_3A",
   "type": "ZeroPagePointer",
   "kind": "auto"
  },
  {
   "address": 59,
   "name": "zpa_3B",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 60,
   "name": "zpa_3C",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 61,
   "name": "zpa_3D",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 62,
   "name": "zpa_3E",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 63,
   "name": "zpa_3F",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 64,
   "name": "zpa_40",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 65,
   "name": "zpa_41",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 66,
   "name": "zpa_42",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 67,
   "name": "zpa_43",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 68,
   "name": "zpa_44",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 69,
   "name": "zpa_45",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 70,
   "name": "zpa_46",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 71,
   "name": "zpa_47",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 72,
   "name": "zpa_48",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 73,
   "name": "zpa_49",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 75,
   "name": "zpa_4B",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 76,
   "name": "zpa_4C",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 77,
   "name": "zpa_4D",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 78,
   "name": "zpa_4E",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 79,
   "name": "zpa_4F",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 80,
   "name": "zpa_50",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 81,
   "name": "zpa_51",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 84,
   "name": "zpa_54",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 86,
   "name": "zpa_56",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 87,
   "name": "zpa_57",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 88,
   "name": "zpa_58",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 89,
   "name": "zpa_59",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 90,
   "name": "zpa_5A",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 92,
   "name": "zpa_5C",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 93,
   "name": "zpa_5D",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 94,
   "name": "zpa_5E",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 98,
   "name": "zpa_62",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 99,
   "name": "zpa_63",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 101,
   "name": "zpa_65",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 102,
   "name": "zpa_66",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 104,
   "name": "zpa_68",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 105,
   "name": "zpa_69",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 106,
   "name": "zpa_6A",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 107,
   "name": "zpa_6B",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 108,
   "name": "zpa_6C",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 109,
   "name": "zpa_6D",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 110,
   "name": "zpa_6E",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 111,
   "name": "zpa_6F",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 112,
   "name": "zpa_70",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 113,
   "name": "zpa_71",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 114,
   "name": "zpa_72",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 115,
   "name": "zpa_73",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 116,
   "name": "zpa_74",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 117,
   "name": "zpa_75",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 118,
   "name": "zpa_76",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 120,
   "name": "zpa_78",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 122,
   "name": "zpa_7A",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 123,
   "name": "zpa_7B",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 124,
   "name": "zpa_7C",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 125,
   "name": "zpa_7D",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 126,
   "name": "zpa_7E",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 127,
   "name": "zpa_7F",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 128,
   "name": "zpa_80",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 129,
   "name": "zpa_81",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 130,
   "name": "zpa_82",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 131,
   "name": "zpa_83",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 132,
   "name": "zpa_84",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 133,
   "name": "zpa_85",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 134,
   "name": "zpa_86",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 135,
   "name": "zpa_87",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 136,
   "name": "zpa_88",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 137,
   "name": "zpa_89",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 138,
   "name": "zpa_8A",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 139,
   "name": "zpa_8B",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 140,
   "name": "zpa_8C",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 141,
   "name": "zpa_8D",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 142,
   "name": "zpa_8E",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 143,
   "name": "zpa_8F",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 144,
   "name": "zpa_90",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 145,
   "name": "zpa_91",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 146,
   "name": "zpa_92",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 147,
   "name": "zpa_93",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 148,
   "name": "zpa_94",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 154,
   "name": "zpa_9A",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 155,
   "name": "zpa_9B",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 156,
   "name": "zpa_9C",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 157,
   "name": "zpa_9D",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 158,
   "name": "zpa_9E",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 159,
   "name": "zpa_9F",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 160,
   "name": "zpa_A0",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 161,
   "name": "zpa_A1",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 162,
   "name": "zpa_A2",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 163,
   "name": "zpa_A3",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 164,
   "name": "zpa_A4",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 165,
   "name": "zpa_A5",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 166,
   "name": "zpa_A6",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 167,
   "name": "zpa_A7",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 168,
   "name": "zpa_A8",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 169,
   "name": "zpa_A9",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 170,
   "name": "zpa_AA",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 171,
   "name": "zpa_AB",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 172,
   "name": "zpa_AC",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 173,
   "name": "zpa_AD",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 174,
   "name": "zpa_AE",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 175,
   "name": "zpa_AF",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 176,
   "name": "zpa_B0",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 177,
   "name": "zpa_B1",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 178,
   "name": "zpa_B2",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 179,
   "name": "zpa_B3",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 180,
   "name": "zpa_B4",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 187,
   "name": "zpa_BB",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 188,
   "name": "zpa_BC",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 189,
   "name": "zpa_BD",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 190,
   "name": "zpa_BE",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 191,
   "name": "zpa_BF",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 192,
   "name": "zpa_C0",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 197,
   "name": "zpa_C5",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 247,
   "name": "zpp_F7",
   "type": "ZeroPagePointer",
   "kind": "auto"
  },
  {
   "address": 248,
   "name": "zpa_F8",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 249,
   "name": "zpa_F9",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 250,
   "name": "zpa_FA",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 251,
   "name": "zpa_FB",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 252,
   "name": "zpa_FC",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 253,
   "name": "zpp_FD",
   "type": "ZeroPagePointer",
   "kind": "auto"
  },
  {
   "address": 254,
   "name": "zpa_FE",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 255,
   "name": "zpa_FF",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 788,
   "name": "a_0314",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 789,
   "name": "a_0315",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 2400,
   "name": "loader_relocate",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2402,
   "name": "b_0962",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2405,
   "name": "a_0965",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 2408,
   "name": "a_0968",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 2429,
   "name": "loader_residue",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3328,
   "name": "f_0D00",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 5120,
   "name": "view_size_step",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5184,
   "name": "view_size_step_obelisks",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 5216,
   "name": "view_list",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5280,
   "name": "view_list_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 5312,
   "name": "view_octant",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5376,
   "name": "view_octant_obelisks",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 5408,
   "name": "view_bearing_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5472,
   "name": "view_bearing_lo_obelisks",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 5504,
   "name": "obj_bearing_from_player",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5536,
   "name": "obj_bearing_invalid",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5538,
   "name": "a_15A2",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 5539,
   "name": "a_15A3",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 5568,
   "name": "obj_pos_x_frac",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5600,
   "name": "obj_pos_z_frac",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5632,
   "name": "obj_vel_x_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5638,
   "name": "a_1606",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 5664,
   "name": "obj_vel_x_mid",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5670,
   "name": "a_1626",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 5696,
   "name": "obj_vel_x_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5728,
   "name": "obj_vel_z_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5734,
   "name": "a_1666",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 5760,
   "name": "obj_vel_z_mid",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5766,
   "name": "a_1686",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 5792,
   "name": "obj_vel_z_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5824,
   "name": "obj_prev_x_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5856,
   "name": "obj_prev_x_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5888,
   "name": "obj_prev_z_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5920,
   "name": "obj_prev_z_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5952,
   "name": "view_range_code",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 6016,
   "name": "view_range_code_obelisks",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 6048,
   "name": "obj_speed",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6049,
   "name": "a_17A1",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 6050,
   "name": "a_17A2",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 6051,
   "name": "a_17A3",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 6052,
   "name": "a_17A4",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 6053,
   "name": "a_17A5",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 6054,
   "name": "a_17A6",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 6055,
   "name": "a_17A7",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 6072,
   "name": "obj_speed_ring_slots",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 6080,
   "name": "load_residue_after_obj_speed",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7680,
   "name": "shape_obelisk_size31",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7690,
   "name": "shape_obelisk_size30",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7711,
   "name": "shape_obelisk_size29",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7722,
   "name": "shape_obelisk_size28",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7745,
   "name": "shape_obelisk_size27",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7757,
   "name": "shape_obelisk_size26",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7777,
   "name": "shape_obelisk_size25",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7798,
   "name": "shape_obelisk_size24",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7819,
   "name": "shape_obelisk_size23",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7848,
   "name": "shape_obelisk_size22",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7879,
   "name": "shape_obelisk_size21",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7916,
   "name": "shape_obelisk_size20",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7956,
   "name": "shape_obelisk_size19",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7996,
   "name": "shape_obelisk_size18",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8043,
   "name": "shape_obelisk_size17",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8092,
   "name": "shape_obelisk_size16",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8142,
   "name": "shape_obelisk_size15",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8199,
   "name": "shape_obelisk_size14",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8258,
   "name": "shape_obelisk_size13",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8319,
   "name": "shape_obelisk_size12",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8383,
   "name": "shape_obelisk_size12_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8388,
   "name": "shape_obelisk_size11",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8452,
   "name": "shape_obelisk_size11_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8464,
   "name": "shape_obelisk_size10",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8528,
   "name": "shape_obelisk_size10_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8538,
   "name": "shape_obelisk_size09",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8602,
   "name": "shape_obelisk_size09_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8603,
   "name": "shape_obelisk_size08",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8666,
   "name": "shape_obelisk_size07",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8727,
   "name": "shape_obelisk_size06",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8787,
   "name": "shape_obelisk_size05",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8847,
   "name": "shape_obelisk_size04",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8907,
   "name": "shape_obelisk_size03",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8967,
   "name": "shape_obelisk_size02",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9027,
   "name": "shape_obelisk_size01",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9087,
   "name": "shape_obelisk_size00",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9147,
   "name": "shape_shot_size31",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9157,
   "name": "shape_shot_size30",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9178,
   "name": "shape_shot_size29",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9189,
   "name": "shape_shot_size28",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9212,
   "name": "shape_shot_size27",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9224,
   "name": "shape_shot_size26",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9237,
   "name": "shape_shot_size25",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9251,
   "name": "shape_shot_size24",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9272,
   "name": "shape_shot_size23",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9295,
   "name": "shape_shot_size22",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9318,
   "name": "shape_shot_size21",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9342,
   "name": "shape_shot_size20",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9373,
   "name": "shape_shot_size19",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9406,
   "name": "shape_shot_size18",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9440,
   "name": "shape_shot_size17",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9476,
   "name": "shape_shot_size16",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9512,
   "name": "shape_shot_size15",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9555,
   "name": "shape_shot_size14",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9600,
   "name": "shape_shot_size13",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9646,
   "name": "shape_shot_size12",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9691,
   "name": "shape_shot_size11",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9747,
   "name": "shape_shot_size10",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9804,
   "name": "shape_shot_size09",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9868,
   "name": "shape_shot_size09_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9872,
   "name": "shape_shot_size08",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9936,
   "name": "shape_shot_size08_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9942,
   "name": "shape_shot_size07",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10006,
   "name": "shape_shot_size07_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10016,
   "name": "shape_shot_size06",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10080,
   "name": "shape_shot_size06_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10095,
   "name": "shape_shot_size05",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10159,
   "name": "shape_shot_size05_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10185,
   "name": "shape_shot_size04",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10249,
   "name": "shape_shot_size04_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10266,
   "name": "shape_shot_size03",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10330,
   "name": "shape_shot_size03_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10344,
   "name": "shape_shot_size02",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10408,
   "name": "shape_shot_size02_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10420,
   "name": "shape_shot_size01",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10484,
   "name": "shape_shot_size01_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10492,
   "name": "shape_shot_size00",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10556,
   "name": "shape_shot_size00_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10567,
   "name": "shape_saucer_size31",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10577,
   "name": "shape_saucer_size30",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10600,
   "name": "shape_saucer_size29",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10612,
   "name": "shape_saucer_size28",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10637,
   "name": "shape_saucer_size27",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10650,
   "name": "shape_saucer_size26",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10664,
   "name": "shape_saucer_size25",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10679,
   "name": "shape_saucer_size24",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10695,
   "name": "shape_saucer_size23",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10712,
   "name": "shape_saucer_size22",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10730,
   "name": "shape_saucer_size21",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10755,
   "name": "shape_saucer_size20",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10781,
   "name": "shape_saucer_size19",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10809,
   "name": "shape_saucer_size18",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10836,
   "name": "shape_saucer_size17",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10864,
   "name": "shape_saucer_size16",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10894,
   "name": "shape_saucer_size15",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10924,
   "name": "shape_saucer_size14",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10962,
   "name": "shape_saucer_size13",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11002,
   "name": "shape_saucer_size12",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11043,
   "name": "shape_saucer_size11",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11085,
   "name": "shape_saucer_size10",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11132,
   "name": "shape_saucer_size09",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11187,
   "name": "shape_saucer_size08",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11243,
   "name": "shape_saucer_size07",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11300,
   "name": "shape_saucer_size06",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11364,
   "name": "shape_saucer_size05",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11428,
   "name": "shape_saucer_size05_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11434,
   "name": "shape_saucer_size04",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11498,
   "name": "shape_saucer_size04_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11512,
   "name": "shape_saucer_size03",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11576,
   "name": "shape_saucer_size03_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11596,
   "name": "shape_saucer_size02",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11660,
   "name": "shape_saucer_size02_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11691,
   "name": "shape_saucer_size01",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11755,
   "name": "shape_saucer_size01_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11788,
   "name": "shape_saucer_size00",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11852,
   "name": "shape_saucer_size00_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11897,
   "name": "shape_missile_size31",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11907,
   "name": "shape_missile_size30",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11928,
   "name": "shape_missile_size29",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11940,
   "name": "shape_missile_size28",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11966,
   "name": "shape_missile_size27",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11979,
   "name": "shape_missile_size26",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11993,
   "name": "shape_missile_size25",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12016,
   "name": "shape_missile_size24",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12041,
   "name": "shape_missile_size23",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12067,
   "name": "shape_missile_size22",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12094,
   "name": "shape_missile_size21",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12130,
   "name": "shape_missile_size20",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12166,
   "name": "shape_missile_size19",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12203,
   "name": "shape_missile_size18",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12241,
   "name": "shape_missile_size17",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12286,
   "name": "shape_missile_size16",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12327,
   "name": "shape_missile_size15",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12375,
   "name": "shape_missile_size14",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12424,
   "name": "shape_missile_size13",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12480,
   "name": "shape_missile_size12",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12540,
   "name": "shape_missile_size11",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12604,
   "name": "shape_missile_size11_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12606,
   "name": "shape_missile_size10",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12670,
   "name": "shape_missile_size10_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12678,
   "name": "shape_missile_size09",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12742,
   "name": "shape_missile_size09_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12756,
   "name": "shape_missile_size08",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12820,
   "name": "shape_missile_size08_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12827,
   "name": "shape_missile_size07",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12891,
   "name": "shape_missile_size07_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12916,
   "name": "shape_missile_size06",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12980,
   "name": "shape_missile_size06_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13008,
   "name": "shape_missile_size05",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13072,
   "name": "shape_missile_size05_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13104,
   "name": "shape_missile_size04",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13168,
   "name": "shape_missile_size04_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13198,
   "name": "shape_missile_size03",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13262,
   "name": "shape_missile_size03_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13292,
   "name": "shape_missile_size02",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13356,
   "name": "shape_missile_size02_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13385,
   "name": "shape_missile_size01",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13449,
   "name": "shape_missile_size01_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13479,
   "name": "shape_missile_size00",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13543,
   "name": "shape_missile_size00_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13573,
   "name": "shape_fragment_a_size31",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13583,
   "name": "shape_fragment_a_size30",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13593,
   "name": "shape_fragment_a_size29",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13603,
   "name": "shape_fragment_a_size28",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13613,
   "name": "shape_fragment_a_size27",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13624,
   "name": "shape_fragment_a_size26",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13635,
   "name": "shape_fragment_a_size25",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13646,
   "name": "shape_fragment_a_size24",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13657,
   "name": "shape_fragment_a_size23",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13669,
   "name": "shape_fragment_a_size22",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13682,
   "name": "shape_fragment_a_size21",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13695,
   "name": "shape_fragment_a_size20",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13707,
   "name": "shape_fragment_a_size19",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13719,
   "name": "shape_fragment_a_size18",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13738,
   "name": "shape_fragment_a_size17",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13759,
   "name": "shape_fragment_a_size16",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13781,
   "name": "shape_fragment_a_size15",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13800,
   "name": "shape_fragment_a_size14",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13819,
   "name": "shape_fragment_a_size13",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13840,
   "name": "shape_fragment_a_size12",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13865,
   "name": "shape_fragment_a_size11",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13885,
   "name": "shape_fragment_a_size10",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13916,
   "name": "shape_fragment_a_size09",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13943,
   "name": "shape_fragment_a_size08",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13973,
   "name": "shape_fragment_a_size07",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14010,
   "name": "shape_fragment_a_size06",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14038,
   "name": "shape_fragment_a_size05",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14073,
   "name": "shape_fragment_a_size04",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14122,
   "name": "shape_fragment_a_size03",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14173,
   "name": "shape_fragment_a_size02",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14221,
   "name": "shape_fragment_a_size01",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14265,
   "name": "shape_fragment_a_size00",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14316,
   "name": "shape_fragment_b_size31",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14326,
   "name": "shape_fragment_b_size30",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14336,
   "name": "shape_fragment_b_size29",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14346,
   "name": "shape_fragment_b_size28",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14357,
   "name": "shape_fragment_b_size27",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14368,
   "name": "shape_fragment_b_size26",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14380,
   "name": "shape_fragment_b_size25",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14392,
   "name": "shape_fragment_b_size24",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14404,
   "name": "shape_fragment_b_size23",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14417,
   "name": "shape_fragment_b_size22",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14430,
   "name": "shape_fragment_b_size21",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14444,
   "name": "shape_fragment_b_size20",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14458,
   "name": "shape_fragment_b_size19",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14472,
   "name": "shape_fragment_b_size18",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14493,
   "name": "shape_fragment_b_size17",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14514,
   "name": "shape_fragment_b_size16",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14537,
   "name": "shape_fragment_b_size15",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14559,
   "name": "shape_fragment_b_size14",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14581,
   "name": "shape_fragment_b_size13",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14605,
   "name": "shape_fragment_b_size12",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14630,
   "name": "shape_fragment_b_size11",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14654,
   "name": "shape_fragment_b_size10",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14685,
   "name": "shape_fragment_b_size09",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14717,
   "name": "shape_fragment_b_size08",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14752,
   "name": "shape_fragment_b_size07",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14788,
   "name": "shape_fragment_b_size06",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14822,
   "name": "shape_fragment_b_size05",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14864,
   "name": "shape_fragment_b_size04",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14911,
   "name": "shape_fragment_b_size03",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14962,
   "name": "shape_fragment_b_size02",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15019,
   "name": "shape_fragment_b_size01",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15073,
   "name": "shape_fragment_b_size00",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15135,
   "name": "shape_fragment_c_size31",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15145,
   "name": "shape_fragment_c_size30",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15155,
   "name": "shape_fragment_c_size29",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15178,
   "name": "shape_fragment_c_size28",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15201,
   "name": "shape_fragment_c_size27",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15213,
   "name": "shape_fragment_c_size26",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15226,
   "name": "shape_fragment_c_size25",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15240,
   "name": "shape_fragment_c_size24",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15254,
   "name": "shape_fragment_c_size23",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15269,
   "name": "shape_fragment_c_size22",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15285,
   "name": "shape_fragment_c_size21",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15302,
   "name": "shape_fragment_c_size20",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15320,
   "name": "shape_fragment_c_size19",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15338,
   "name": "shape_fragment_c_size18",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15362,
   "name": "shape_fragment_c_size17",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15388,
   "name": "shape_fragment_c_size16",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15415,
   "name": "shape_fragment_c_size15",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15443,
   "name": "shape_fragment_c_size14",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15471,
   "name": "shape_fragment_c_size13",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15500,
   "name": "shape_fragment_c_size12",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15531,
   "name": "shape_fragment_c_size11",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15563,
   "name": "shape_fragment_c_size10",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15603,
   "name": "shape_fragment_c_size09",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15616,
   "name": "f_3D00",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 15645,
   "name": "shape_fragment_c_size08",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15688,
   "name": "shape_fragment_c_size07",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15733,
   "name": "shape_fragment_c_size06",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15779,
   "name": "shape_fragment_c_size05",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15835,
   "name": "shape_fragment_c_size04",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15894,
   "name": "shape_fragment_c_size03",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15958,
   "name": "shape_fragment_c_size03_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15962,
   "name": "shape_fragment_c_size02",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16026,
   "name": "shape_fragment_c_size02_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16033,
   "name": "shape_fragment_c_size01",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16097,
   "name": "shape_fragment_c_size01_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16107,
   "name": "shape_fragment_c_size00",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16384,
   "name": "view_a_chars_00_07",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16448,
   "name": "view_a_chars_08_0f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16512,
   "name": "view_a_chars_10_17",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16576,
   "name": "view_a_chars_18_1f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16640,
   "name": "view_a_chars_20_27",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16704,
   "name": "view_a_chars_28_2f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16768,
   "name": "view_a_chars_30_37",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16832,
   "name": "view_a_chars_38_3f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16896,
   "name": "view_a_chars_40_47",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16960,
   "name": "view_a_chars_48_4f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17024,
   "name": "view_a_chars_50_57",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17088,
   "name": "view_a_chars_58_5f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17152,
   "name": "view_a_chars_60_67",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 17216,
   "name": "view_a_chars_68_6f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17280,
   "name": "view_a_chars_70_77",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17344,
   "name": "view_a_chars_78_7f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17408,
   "name": "view_a_chars_80_87",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 17472,
   "name": "view_a_chars_88_8f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17536,
   "name": "view_a_chars_90_97",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17600,
   "name": "view_a_chars_98_9f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17664,
   "name": "view_a_chars_a0_a7",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 17728,
   "name": "view_a_chars_a8_af",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17792,
   "name": "view_a_chars_b0_b7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17856,
   "name": "view_a_chars_b8_bf",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17920,
   "name": "view_a_chars_c0_c7",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 17984,
   "name": "view_a_chars_c8_cf",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18048,
   "name": "view_a_chars_d0_d7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18112,
   "name": "view_a_chars_d8_df",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18176,
   "name": "view_a_chars_e0_e7",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18240,
   "name": "view_a_chars_e8_ef",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18304,
   "name": "view_a_chars_f0_f7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18368,
   "name": "view_a_chars_f8_ff",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18432,
   "name": "view_a_mirror_chars_00_07",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18496,
   "name": "view_a_mirror_chars_08_0f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18560,
   "name": "view_a_mirror_chars_10_17",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18624,
   "name": "view_a_mirror_chars_18_1f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18688,
   "name": "view_a_mirror_chars_20_27",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18752,
   "name": "view_a_mirror_chars_28_2f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18816,
   "name": "view_a_mirror_chars_30_37",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18880,
   "name": "view_a_mirror_chars_38_3f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18944,
   "name": "view_a_mirror_chars_40_47",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19008,
   "name": "view_a_mirror_chars_48_4f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 19072,
   "name": "view_a_mirror_chars_50_57",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 19136,
   "name": "view_a_mirror_chars_58_5f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 19200,
   "name": "view_a_mirror_chars_60_67",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19264,
   "name": "view_a_mirror_chars_68_6f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 19328,
   "name": "view_a_mirror_chars_70_77",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 19392,
   "name": "view_a_mirror_chars_78_7f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 19456,
   "name": "view_a_mirror_chars_80_87",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19520,
   "name": "view_a_mirror_chars_88_8f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 19584,
   "name": "view_a_mirror_chars_90_97",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 19648,
   "name": "view_a_mirror_chars_98_9f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 19712,
   "name": "view_a_mirror_chars_a0_a7",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19776,
   "name": "view_a_mirror_chars_a8_af",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 19840,
   "name": "view_a_mirror_chars_b0_b7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 19904,
   "name": "view_a_mirror_chars_b8_bf",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 19968,
   "name": "view_a_mirror_chars_c0_c7",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 20032,
   "name": "view_a_mirror_chars_c8_cf",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20096,
   "name": "view_a_mirror_chars_d0_d7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20160,
   "name": "view_a_mirror_chars_d8_df",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20224,
   "name": "view_a_mirror_chars_e0_e7",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 20288,
   "name": "view_a_mirror_chars_e8_ef",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20352,
   "name": "view_a_mirror_chars_f0_f7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20416,
   "name": "view_a_mirror_chars_f8_ff",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20480,
   "name": "view_b_chars_00_07",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 20544,
   "name": "view_b_chars_08_0f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20608,
   "name": "view_b_chars_10_17",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20672,
   "name": "view_b_chars_18_1f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20736,
   "name": "view_b_chars_20_27",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 20800,
   "name": "view_b_chars_28_2f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20864,
   "name": "view_b_chars_30_37",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20928,
   "name": "view_b_chars_38_3f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20992,
   "name": "view_b_chars_40_47",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21056,
   "name": "view_b_chars_48_4f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21120,
   "name": "view_b_chars_50_57",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21184,
   "name": "view_b_chars_58_5f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21248,
   "name": "view_b_chars_60_67",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21312,
   "name": "view_b_chars_68_6f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21376,
   "name": "view_b_chars_70_77",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21440,
   "name": "view_b_chars_78_7f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21504,
   "name": "view_b_chars_80_87",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21568,
   "name": "view_b_chars_88_8f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21632,
   "name": "view_b_chars_90_97",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21696,
   "name": "view_b_chars_98_9f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21760,
   "name": "view_b_chars_a0_a7",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21824,
   "name": "view_b_chars_a8_af",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21888,
   "name": "view_b_chars_b0_b7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21952,
   "name": "view_b_chars_b8_bf",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22016,
   "name": "view_b_chars_c0_c7",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22080,
   "name": "view_b_chars_c8_cf",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22144,
   "name": "view_b_chars_d0_d7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22208,
   "name": "view_b_chars_d8_df",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22272,
   "name": "view_b_chars_e0_e7",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22336,
   "name": "view_b_chars_e8_ef",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22400,
   "name": "view_b_chars_f0_f7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22464,
   "name": "view_b_chars_f8_ff",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22528,
   "name": "view_b_mirror_chars_00_07",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22592,
   "name": "view_b_mirror_chars_08_0f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22656,
   "name": "view_b_mirror_chars_10_17",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22720,
   "name": "view_b_mirror_chars_18_1f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22784,
   "name": "view_b_mirror_chars_20_27",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22848,
   "name": "view_b_mirror_chars_28_2f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22912,
   "name": "view_b_mirror_chars_30_37",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22976,
   "name": "view_b_mirror_chars_38_3f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23040,
   "name": "view_b_mirror_chars_40_47",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23104,
   "name": "view_b_mirror_chars_48_4f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23168,
   "name": "view_b_mirror_chars_50_57",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23232,
   "name": "view_b_mirror_chars_58_5f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23296,
   "name": "view_b_mirror_chars_60_67",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23360,
   "name": "view_b_mirror_chars_68_6f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23424,
   "name": "view_b_mirror_chars_70_77",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23488,
   "name": "view_b_mirror_chars_78_7f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23552,
   "name": "view_b_mirror_chars_80_87",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23616,
   "name": "view_b_mirror_chars_88_8f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23680,
   "name": "view_b_mirror_chars_90_97",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23744,
   "name": "view_b_mirror_chars_98_9f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23808,
   "name": "view_b_mirror_chars_a0_a7",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23872,
   "name": "view_b_mirror_chars_a8_af",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23936,
   "name": "view_b_mirror_chars_b0_b7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24000,
   "name": "view_b_mirror_chars_b8_bf",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24064,
   "name": "view_b_mirror_chars_c0_c7",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24128,
   "name": "view_b_mirror_chars_c8_cf",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24192,
   "name": "view_b_mirror_chars_d0_d7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24256,
   "name": "view_b_mirror_chars_d8_df",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24320,
   "name": "view_b_mirror_chars_e0_e7",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24384,
   "name": "view_b_mirror_chars_e8_ef",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24448,
   "name": "view_b_mirror_chars_f0_f7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24512,
   "name": "view_b_mirror_chars_f8_ff",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24576,
   "name": "screen_a_status_row",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24577,
   "name": "f_6001",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 24596,
   "name": "a_6014",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 24597,
   "name": "a_6015",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 24614,
   "name": "a_6026",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 24615,
   "name": "a_6027",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 24616,
   "name": "screen_a_row01",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24655,
   "name": "f_604F",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 24656,
   "name": "screen_a_view_row02",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24696,
   "name": "screen_a_view_row03",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24736,
   "name": "screen_a_view_row04",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24776,
   "name": "screen_a_view_row05",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24815,
   "name": "f_60EF",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 24816,
   "name": "screen_a_view_row06",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24856,
   "name": "screen_a_view_row07",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24896,
   "name": "screen_a_view_row08",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24936,
   "name": "screen_a_view_row09",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24976,
   "name": "screen_a_view_row10",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25016,
   "name": "screen_a_view_row11",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25056,
   "name": "screen_a_view_row12",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25096,
   "name": "screen_a_view_row13",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25136,
   "name": "screen_a_view_row14",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25176,
   "name": "screen_a_view_row15",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25216,
   "name": "screen_a_view_row16",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25256,
   "name": "screen_a_view_row17",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25296,
   "name": "screen_a_console_row18",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25336,
   "name": "screen_a_console_row19",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25376,
   "name": "screen_a_console_row20",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25416,
   "name": "screen_a_console_row21",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25456,
   "name": "screen_a_console_row22",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25496,
   "name": "screen_a_console_row23",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25536,
   "name": "screen_a_console_row24",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25576,
   "name": "screen_a_unused_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25592,
   "name": "sprite_ptrs_a",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 25594,
   "name": "f_63FA",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 25600,
   "name": "sprite_shot_dot",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25664,
   "name": "screen_b_row01_unused",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25679,
   "name": "f_644F",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 25680,
   "name": "screen_b_view_row02",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25720,
   "name": "screen_b_view_row03",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25760,
   "name": "screen_b_view_row04",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25800,
   "name": "screen_b_view_row05",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25839,
   "name": "f_64EF",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 25840,
   "name": "screen_b_view_row06",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25880,
   "name": "screen_b_view_row07",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25920,
   "name": "screen_b_view_row08",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25960,
   "name": "screen_b_view_row09",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26000,
   "name": "screen_b_view_row10",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26040,
   "name": "screen_b_view_row11",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26080,
   "name": "screen_b_view_row12",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26120,
   "name": "screen_b_view_row13",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26160,
   "name": "screen_b_view_row14",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26200,
   "name": "screen_b_view_row15",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26240,
   "name": "screen_b_view_row16",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26280,
   "name": "screen_b_view_row17",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26320,
   "name": "screen_b_rows18_19_unused",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26368,
   "name": "sprite_gun_sight",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26432,
   "name": "sprite_ground_strip",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26496,
   "name": "sprite_backdrop_cap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26560,
   "name": "screen_b_row24_unused",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26616,
   "name": "sprite_ptrs_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26618,
   "name": "f_67FA",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 26624,
   "name": "title_screen",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26664,
   "name": "title_logo_row1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26704,
   "name": "title_logo_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26744,
   "name": "title_logo_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26784,
   "name": "title_logo_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26824,
   "name": "title_row5_vars",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 26825,
   "name": "a_68C9",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 26826,
   "name": "a_68CA",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 26827,
   "name": "highest_level_reached",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 26864,
   "name": "title_text_by_paul_woakes",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26904,
   "name": "title_row_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26929,
   "name": "key_level_select_tbl",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26937,
   "name": "sprite_colours_1_7",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26944,
   "name": "title_row8_blank",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26984,
   "name": "title_text_copyright_1984",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27024,
   "name": "title_row10_blank",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27064,
   "name": "title_text_novagen_software",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27104,
   "name": "title_row12_blank",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27144,
   "name": "hook_vectors_noop",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 27147,
   "name": "s_6A0B",
   "type": "Subroutine",
   "kind": "auto"
  },
  {
   "address": 27150,
   "name": "s_6A0E",
   "type": "Subroutine",
   "kind": "auto"
  },
  {
   "address": 27153,
   "name": "hook_stub_3",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 27156,
   "name": "hook_stub_4",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 27159,
   "name": "hook_stub_5",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 27162,
   "name": "s_6A1A",
   "type": "Subroutine",
   "kind": "auto"
  },
  {
   "address": 27165,
   "name": "hook_vectors_rts",
   "type": "Return",
   "kind": "user"
  },
  {
   "address": 27166,
   "name": "title_row13_padding",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27184,
   "name": "title_row14_blank",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27224,
   "name": "title_text_score",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27250,
   "name": "title_score_digits",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 27264,
   "name": "title_row16_blank",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27304,
   "name": "title_text_last_score",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27330,
   "name": "title_last_score_digits",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 27344,
   "name": "title_row18_blank",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27384,
   "name": "title_text_high_score",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27410,
   "name": "title_high_score_digits",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 27424,
   "name": "title_skill_names_wide",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 27464,
   "name": "title_row21_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27504,
   "name": "title_text_f5",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27528,
   "name": "title_skill_slot",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 27544,
   "name": "title_row23_blank",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27584,
   "name": "title_text_f7_begin_game",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27648,
   "name": "gameover_screen",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27712,
   "name": "sprite_dots_b1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27776,
   "name": "sprite_dots_b2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27840,
   "name": "sprite_dots_b3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27904,
   "name": "sprite_dots_b4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27968,
   "name": "sprite_dots_b5",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28032,
   "name": "gameover_text_row",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28096,
   "name": "sprite_dots_b7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28160,
   "name": "sprite_dots_b8",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28224,
   "name": "sprite_dots_b9",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28288,
   "name": "sprite_dots_ba",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28352,
   "name": "sprite_dots_bb",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28416,
   "name": "sprite_dots_bc",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28480,
   "name": "sprite_dots_bd",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28544,
   "name": "sprite_dots_be",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28608,
   "name": "sprite_dots_bf",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28672,
   "name": "sprite_dots_c0",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28736,
   "name": "sprite_dots_c1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28800,
   "name": "sprite_dots_c2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28864,
   "name": "sprite_dots_c3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28928,
   "name": "sprite_dots_c4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28992,
   "name": "sprite_dots_c5",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29056,
   "name": "sprite_dots_c6",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29120,
   "name": "sprite_dots_c7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29184,
   "name": "sprite_dots_c8",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29248,
   "name": "sprite_dots_c9",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29312,
   "name": "sprite_saucer_large",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29376,
   "name": "sprite_saucer_large_bumpy",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29440,
   "name": "sprite_saucer_medium",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29504,
   "name": "sprite_saucer_medium_bumpy",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29568,
   "name": "sprite_saucer_domed",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29632,
   "name": "sprite_sphere",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29696,
   "name": "sprite_noise_d0",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29760,
   "name": "sprite_noise_d1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29824,
   "name": "sprite_noise_d2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29888,
   "name": "sprite_noise_d3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29952,
   "name": "sprite_noise_d4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30016,
   "name": "sprite_noise_d5",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30080,
   "name": "sprite_noise_d6",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30144,
   "name": "sprite_noise_d7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30208,
   "name": "sprite_noise_d8",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30272,
   "name": "sprite_noise_d9",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30336,
   "name": "sprite_noise_da",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30400,
   "name": "sprite_noise_db",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30464,
   "name": "sprite_bar_dc",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30528,
   "name": "sprite_blank_dd",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30592,
   "name": "sprite_pixel_de",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30656,
   "name": "sprite_blank_df",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30720,
   "name": "charset_text",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30784,
   "name": "font_08_0f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30848,
   "name": "font_10_17",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30912,
   "name": "font_18_1f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30976,
   "name": "font_20_27",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31040,
   "name": "font_28_2f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31104,
   "name": "font_30_37",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31168,
   "name": "font_38_3f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31232,
   "name": "font_40_47",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31296,
   "name": "font_48_4f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31360,
   "name": "font_50_57",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31424,
   "name": "font_58_5f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31488,
   "name": "font_60_67",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31552,
   "name": "font_68_6f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31616,
   "name": "font_70_77",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31680,
   "name": "font_78_7f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31744,
   "name": "font_80_87",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31808,
   "name": "font_88_8f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31872,
   "name": "font_90_97",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31936,
   "name": "font_98_9f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32000,
   "name": "font_a0_a7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32064,
   "name": "font_a8_af",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32128,
   "name": "font_b0_b7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32192,
   "name": "font_b8_bf",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32256,
   "name": "font_c0_c7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32320,
   "name": "font_c8_cf",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32384,
   "name": "font_d0_d7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32448,
   "name": "font_d8_df",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32512,
   "name": "font_e0_e7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32576,
   "name": "font_e8_ef",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32640,
   "name": "font_f0_f7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32704,
   "name": "font_f8_ff",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32768,
   "name": "reset_vectors_cbm80",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 32769,
   "name": "a_8001",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 32770,
   "name": "a_8002",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 32771,
   "name": "a_8003",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 32784,
   "name": "level_display_records",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 32800,
   "name": "level_display_rec_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32816,
   "name": "level_display_rec_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32832,
   "name": "level_display_rec_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32848,
   "name": "level_display_rec_4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32864,
   "name": "level_display_rec_5",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32880,
   "name": "level_display_rec_6",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32896,
   "name": "level_display_rec_7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32912,
   "name": "level_display_rec_8",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32928,
   "name": "voice3_pitch_loop",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 32960,
   "name": "voice1_seq_select",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 32968,
   "name": "voice1_pitch_loop",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 33024,
   "name": "unused_zero_page_8100",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33056,
   "name": "status_row_template",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33096,
   "name": "console_template_row18",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33136,
   "name": "console_template_row19",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33176,
   "name": "console_template_row20",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33216,
   "name": "console_template_row21",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33256,
   "name": "console_template_row22",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33296,
   "name": "console_template_row23",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33336,
   "name": "console_template_row24",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33376,
   "name": "obj_pos_x_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 33378,
   "name": "a_8262",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 33379,
   "name": "a_8263",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 33383,
   "name": "a_8267",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 33408,
   "name": "obelisk_pos_x_hi",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33472,
   "name": "obj_pos_x_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 33474,
   "name": "a_82C2",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 33475,
   "name": "a_82C3",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 33479,
   "name": "a_82C7",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 33504,
   "name": "obelisk_pos_x_lo",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33568,
   "name": "obj_pos_z_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 33570,
   "name": "a_8322",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 33571,
   "name": "a_8323",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 33575,
   "name": "a_8327",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 33600,
   "name": "obelisk_pos_z_hi",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33664,
   "name": "obj_pos_z_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 33666,
   "name": "a_8382",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 33667,
   "name": "a_8383",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 33671,
   "name": "a_8387",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 33696,
   "name": "obelisk_pos_z_lo",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33760,
   "name": "obj_state",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 33762,
   "name": "a_83E2",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 33763,
   "name": "a_83E3",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 33767,
   "name": "a_83E7",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 33784,
   "name": "a_83F8",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 33792,
   "name": "obj_state_pad",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33856,
   "name": "obj_type",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 33858,
   "name": "a_8442",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 33864,
   "name": "a_8448",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 33880,
   "name": "f_8458",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 33884,
   "name": "f_845C",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 33888,
   "name": "obj_counter_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 33920,
   "name": "obj_counter_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 33952,
   "name": "obj_heading_octant",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 33954,
   "name": "a_84A2",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 33958,
   "name": "a_84A6",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 33984,
   "name": "obj_heading_fine",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 33985,
   "name": "a_84C1",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 33986,
   "name": "a_84C2",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 33990,
   "name": "a_84C6",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 34016,
   "name": "str_skill_names",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34040,
   "name": "unknown_after_skill_names",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34048,
   "name": "reciprocal_tbl",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 34112,
   "name": "reciprocal_tbl_q2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34176,
   "name": "reciprocal_tbl_q3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34240,
   "name": "reciprocal_tbl_q4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34304,
   "name": "atan_tbl",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 34368,
   "name": "atan_tbl_q2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34432,
   "name": "atan_tbl_q3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34496,
   "name": "atan_tbl_q4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34560,
   "name": "hypot_tbl",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 34624,
   "name": "hypot_tbl_q2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34688,
   "name": "hypot_tbl_q3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34752,
   "name": "hypot_tbl_q4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34816,
   "name": "range_to_size_tbl",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 34880,
   "name": "range_to_size_tbl_q2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34944,
   "name": "range_to_size_tbl_q3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35008,
   "name": "range_to_size_tbl_q4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35072,
   "name": "quarter_sine_tbl",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 35136,
   "name": "quarter_sine_tbl_q2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35200,
   "name": "quarter_sine_tbl_q3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35264,
   "name": "quarter_sine_tbl_q4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35328,
   "name": "obelisk_grid_map",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 35392,
   "name": "obelisk_grid_map_q2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35456,
   "name": "obelisk_grid_map_q3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35520,
   "name": "obelisk_grid_map_q4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35584,
   "name": "zero_page_image",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 35648,
   "name": "zero_page_image_42",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35712,
   "name": "zero_page_image_82",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35744,
   "name": "score_bcd",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 35745,
   "name": "f_8BA1",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 35746,
   "name": "f_8BA2",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 35747,
   "name": "f_8BA3",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 35748,
   "name": "high_score_bcd",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 35752,
   "name": "enemies_remaining_bcd",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 35756,
   "name": "points_500",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35760,
   "name": "points_tbl_100_800",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35792,
   "name": "points_tbl_900_1600",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35824,
   "name": "saucer_type_param_tbl",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 35840,
   "name": "enemy_fire_script_start",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 35856,
   "name": "enemy_fire_scripts",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35918,
   "name": "enemy_fire_scripts_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35967,
   "name": "enemy_fire_scripts_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36037,
   "name": "enemy_fire_scripts_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36064,
   "name": "saucer_colour_tbl",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 36080,
   "name": "explosion_colour_tbl",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 36095,
   "name": "a_8CFF",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 36096,
   "name": "range_to_sprite_scale_tbl",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 36160,
   "name": "range_to_sprite_scale_tbl_q2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36224,
   "name": "range_to_sprite_scale_tbl_q3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36288,
   "name": "range_to_sprite_scale_tbl_q4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36352,
   "name": "missile_speed_by_difficulty",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 36416,
   "name": "missile_param_40_by_difficulty",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 36480,
   "name": "missile_param_3f_by_difficulty",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 36544,
   "name": "saucer_behaviour_flags",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 36608,
   "name": "saucer_speed_by_difficulty",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 36672,
   "name": "backdrop_sprite_ptrs",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 36696,
   "name": "backdrop_sprite_variant_angle",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 36697,
   "name": "f_8F59",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 36712,
   "name": "backdrop_sprite_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 36736,
   "name": "tbl_skill_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 36740,
   "name": "tbl_skill_player_speed",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 36744,
   "name": "tbl_skill_enemy_speed",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 36748,
   "name": "tbl_skill_a6",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 36752,
   "name": "tbl_skill_hit_tolerance",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 36756,
   "name": "tbl_skill_obstacle_range",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 36760,
   "name": "tbl_skill_turn_rate",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 36764,
   "name": "tbl_skill_a9",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 36800,
   "name": "colshape_wide_row0",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 36864,
   "name": "colshape_wide_row0_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36928,
   "name": "colshape_wide_row0_c",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36992,
   "name": "colshape_wide_row1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 37056,
   "name": "colshape_wide_row1_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 37120,
   "name": "colshape_wide_row1_c",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 37184,
   "name": "colshape_wide_row2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 37248,
   "name": "colshape_wide_row2_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 37312,
   "name": "colshape_wide_row2_c",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 37376,
   "name": "colshape_wide_row3",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 37440,
   "name": "colshape_wide_row3_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 37504,
   "name": "colshape_wide_row3_c",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 37568,
   "name": "colshape_wide_row4",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 37632,
   "name": "colshape_wide_row4_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 37696,
   "name": "colshape_wide_row4_c",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 37760,
   "name": "colshape_wide_row5",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 37824,
   "name": "colshape_wide_row5_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 37888,
   "name": "colshape_wide_row5_c",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 37952,
   "name": "colshape_wide_row6",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 38016,
   "name": "colshape_wide_row6_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38080,
   "name": "colshape_wide_row6_c",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38144,
   "name": "colshape_wide_row7",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 38208,
   "name": "colshape_wide_row7_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38272,
   "name": "colshape_wide_row7_c",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38400,
   "name": "shape_ptr_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 38464,
   "name": "shape_ptr_lo_40",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38528,
   "name": "shape_ptr_lo_80",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38592,
   "name": "shape_ptr_lo_c0",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38656,
   "name": "shape_ptr_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 38720,
   "name": "shape_ptr_hi_40",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38784,
   "name": "shape_ptr_hi_80",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38848,
   "name": "shape_ptr_hi_c0",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38912,
   "name": "colshape_narrow_row0",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 38976,
   "name": "colshape_narrow_row0_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38986,
   "name": "backdrop_record_lvl0",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39040,
   "name": "colshape_narrow_row1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39104,
   "name": "colshape_narrow_row1_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39114,
   "name": "backdrop_record_lvl1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39168,
   "name": "colshape_narrow_row2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39232,
   "name": "colshape_narrow_row2_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39242,
   "name": "backdrop_record_lvl2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39296,
   "name": "colshape_narrow_row3",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39360,
   "name": "colshape_narrow_row3_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39370,
   "name": "backdrop_record_lvl3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39424,
   "name": "colshape_narrow_row4",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39488,
   "name": "colshape_narrow_row4_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39498,
   "name": "backdrop_record_lvl4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39552,
   "name": "colshape_narrow_row5",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39616,
   "name": "colshape_narrow_row5_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39626,
   "name": "backdrop_record_lvl5",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39680,
   "name": "colshape_narrow_row6",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39744,
   "name": "colshape_narrow_row6_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39754,
   "name": "backdrop_record_lvl6",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39808,
   "name": "colshape_narrow_row7",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39872,
   "name": "colshape_narrow_row7_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39882,
   "name": "backdrop_record_lvl7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39936,
   "name": "init_game",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 39962,
   "name": "b_9C1A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39998,
   "name": "reset_entry",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 40003,
   "name": "b_9C43",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40028,
   "name": "game_over_screen",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 40049,
   "name": "b_9C71",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40074,
   "name": "b_9C8A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40093,
   "name": "game_over_wait_loop",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 40109,
   "name": "b_9CAD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40113,
   "name": "enter_title_screen",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 40116,
   "name": "title_reset_demo_timer",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 40122,
   "name": "title_loop",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 40148,
   "name": "b_9CD4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40158,
   "name": "title_level_key_pressed",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 40186,
   "name": "title_no_level_key",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 40206,
   "name": "b_9D0E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40211,
   "name": "title_fire_start",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 40229,
   "name": "title_check_f7_f5",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 40246,
   "name": "title_show_skill_name",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 40257,
   "name": "b_9D41",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40267,
   "name": "title_debounce",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 40271,
   "name": "b_9D4F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40279,
   "name": "wait_no_key",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 40296,
   "name": "start_game_from_title",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 40314,
   "name": "start_demo",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 40321,
   "name": "delay_x_by_32",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 40323,
   "name": "b_9D83",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40330,
   "name": "reset_to_title_screen",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 40335,
   "name": "b_9D8F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40375,
   "name": "b_9DB7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40380,
   "name": "b_9DBC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40428,
   "name": "pal_check_loop",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 40437,
   "name": "b_9DF5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40450,
   "name": "title_sprite3_setup",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 40483,
   "name": "read_key_column0",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 40497,
   "name": "cassette_motor_toggle",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 40511,
   "name": "b_9E3F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40513,
   "name": "b_9E41",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40515,
   "name": "b_9E43",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40518,
   "name": "start_demo_game",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 40525,
   "name": "b_9E4D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40578,
   "name": "b_9E82",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40607,
   "name": "start_game",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 40621,
   "name": "b_9EAD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40689,
   "name": "b_9EF1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40702,
   "name": "b_9EFE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40763,
   "name": "b_9F3B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40774,
   "name": "b_9F46",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40830,
   "name": "b_9F7E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40868,
   "name": "level_restart_common",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 40890,
   "name": "b_9FBA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40898,
   "name": "b_9FC2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40960,
   "name": "level_start",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 41036,
   "name": "main_loop",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 41054,
   "name": "b_A05E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 41061,
   "name": "b_A065",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 41069,
   "name": "b_A06D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 41075,
   "name": "b_A073",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 41081,
   "name": "b_A079",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 41088,
   "name": "check_player_shots",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 41117,
   "name": "b_A09D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 41150,
   "name": "saucer_fire_light_timeout",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 41165,
   "name": "check_enemy_shots",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 41174,
   "name": "b_A0D6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 41219,
   "name": "main_loop_input",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 41252,
   "name": "abort_to_title",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 41258,
   "name": "check_pause_key",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 41275,
   "name": "pause_loop",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 41295,
   "name": "enemy_explosion_update",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 41332,
   "name": "b_A174",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 41345,
   "name": "wait_raster_192",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 41374,
   "name": "warp_phase_frame",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 41423,
   "name": "b_A1CF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 41450,
   "name": "b_A1EA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 41463,
   "name": "joystick_move_player",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 41471,
   "name": "b_A1FF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 41480,
   "name": "b_A208",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 41489,
   "name": "j_A211",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 41501,
   "name": "b_A21D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 41505,
   "name": "j_A221",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 41517,
   "name": "b_A22D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 41521,
   "name": "engine_sound_select",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 41538,
   "name": "b_A242",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 41544,
   "name": "fire_button_check",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 41557,
   "name": "compute_enemy_bearing",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 41610,
   "name": "state_between_enemies",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 41627,
   "name": "b_A29B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 41630,
   "name": "b_A29E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 41633,
   "name": "open_stargate",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 41731,
   "name": "activate_enemy_behaviour",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 41762,
   "name": "spawn_next_enemy_setup",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 41781,
   "name": "b_A335",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 41798,
   "name": "b_A346",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 41804,
   "name": "b_A34C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 41842,
   "name": "b_A372",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 41863,
   "name": "b_A387",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 41880,
   "name": "b_A398",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 41883,
   "name": "b_A39B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 41893,
   "name": "spawn_homing_missile",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 41986,
   "name": "b_A402",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42005,
   "name": "b_A415",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42017,
   "name": "j_A421",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 42028,
   "name": "spawn_saucer",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 42041,
   "name": "b_A439",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42049,
   "name": "b_A441",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42118,
   "name": "b_A486",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42134,
   "name": "j_A496",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 42189,
   "name": "warp_tone_update",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 42220,
   "name": "state_stargate_open",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42244,
   "name": "b_A504",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42254,
   "name": "b_A50E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42257,
   "name": "j_A511",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 42272,
   "name": "b_A520",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42279,
   "name": "stargate_timeout",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 42311,
   "name": "b_A547",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42319,
   "name": "b_A54F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42322,
   "name": "state_stargate_missed",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42339,
   "name": "saucer_type_burst_fire",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42343,
   "name": "b_A567",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42353,
   "name": "b_A571",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42359,
   "name": "b_A577",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42363,
   "name": "b_A57B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42389,
   "name": "b_A595",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42397,
   "name": "b_A59D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42418,
   "name": "saucer_burst_wait",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 42427,
   "name": "b_A5BB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42439,
   "name": "saucer_type_script_fire",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42451,
   "name": "saucer_reroll_jump",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 42454,
   "name": "saucer_type_default",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42479,
   "name": "b_A5EF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42482,
   "name": "saucer_common_update",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 42502,
   "name": "b_A606",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42511,
   "name": "b_A60F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42517,
   "name": "b_A615",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42542,
   "name": "b_A62E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42579,
   "name": "saucer_tone_from_91",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 42611,
   "name": "b_A673",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42614,
   "name": "saucer_hover_done",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 42628,
   "name": "b_A684",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42643,
   "name": "saucer_reroll_behaviour",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 42713,
   "name": "b_A6D9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42724,
   "name": "j_A6E4",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 42726,
   "name": "saucer_set_speed_and_heading",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 42753,
   "name": "b_A701",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42765,
   "name": "saucer_type_permanent_fire",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42771,
   "name": "state_warp_travel",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42786,
   "name": "warp_travel_start",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 42839,
   "name": "warp_travel_frame",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 42862,
   "name": "b_A76E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42894,
   "name": "b_A78E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42904,
   "name": "level_complete",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42938,
   "name": "b_A7BA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42965,
   "name": "warp_progress_tick",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 42973,
   "name": "b_A7DD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 42976,
   "name": "tbl_warp_sphere_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42984,
   "name": "tbl_warp_speed_by_level",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42992,
   "name": "state_homing_missile",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 43008,
   "name": "b_A800",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 43010,
   "name": "j_A802",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 43025,
   "name": "b_A811",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 43033,
   "name": "b_A819",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 43112,
   "name": "b_A868",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 43135,
   "name": "b_A87F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 43151,
   "name": "update_enemy_motion_vector",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 43156,
   "name": "check_enemy_hit",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 43186,
   "name": "enemy_destroyed",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 43258,
   "name": "b_A8FA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 43269,
   "name": "j_A905",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 43311,
   "name": "b_A92F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 43320,
   "name": "b_A938",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 43362,
   "name": "schedule_next_spawn",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 43375,
   "name": "set_state_between_enemies",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 43383,
   "name": "j_A977",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 43386,
   "name": "enemy_fire_script_step",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 43408,
   "name": "b_A990",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 43416,
   "name": "b_A998",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 43418,
   "name": "spawn_enemy_shot",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 43420,
   "name": "b_A99C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 43431,
   "name": "b_A9A7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 43502,
   "name": "b_A9EE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 43508,
   "name": "b_A9F4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 43510,
   "name": "b_A9F6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 43561,
   "name": "place_object_at_player",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 43576,
   "name": "b_AA38",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 43578,
   "name": "b_AA3A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 43632,
   "name": "set_console_light_colour",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 43663,
   "name": "roll_enemy_count",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 43685,
   "name": "tbl_enemy_behaviour_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43701,
   "name": "tbl_enemy_behaviour_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43717,
   "name": "jmp_player_destroyed",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 43720,
   "name": "main_loop_tail",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 43731,
   "name": "b_AAD3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 43735,
   "name": "b_AAD7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 43764,
   "name": "b_AAF4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 43860,
   "name": "b_AB54",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 43872,
   "name": "j_AB60",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 43888,
   "name": "b_AB70",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 43905,
   "name": "b_AB81",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 43930,
   "name": "player_destroyed",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 43970,
   "name": "b_ABC2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 43984,
   "name": "b_ABD0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44013,
   "name": "game_over_scores",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 44019,
   "name": "b_ABF3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44037,
   "name": "b_AC05",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44050,
   "name": "b_AC12",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44061,
   "name": "b_AC1D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44074,
   "name": "b_AC2A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44080,
   "name": "collide_object_with_obelisk",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 44087,
   "name": "b_AC37",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44213,
   "name": "r_ACB5",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 44214,
   "name": "fire_player_shot",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 44239,
   "name": "b_ACCF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44272,
   "name": "b_ACF0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44325,
   "name": "r_AD25",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 44326,
   "name": "test_object_hits_player",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 44392,
   "name": "b_AD68",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44397,
   "name": "r_AD6D",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 44398,
   "name": "b_AD6E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44405,
   "name": "draw_shape_done",
   "type": "Return",
   "kind": "user"
  },
  {
   "address": 44406,
   "name": "draw_shape",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 44425,
   "name": "b_AD89",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44466,
   "name": "b_ADB2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44472,
   "name": "b_ADB8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44475,
   "name": "b_ADBB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44479,
   "name": "b_ADBF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44481,
   "name": "draw_shape_next_byte",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 44508,
   "name": "b_ADDC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44514,
   "name": "b_ADE2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44522,
   "name": "b_ADEA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44531,
   "name": "draw_shape_skip_row",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 44545,
   "name": "b_AE01",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44549,
   "name": "draw_shape_row_start",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 44572,
   "name": "b_AE1C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44583,
   "name": "draw_shape_edge_byte",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 44592,
   "name": "b_AE30",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44599,
   "name": "draw_shape_edge_alt_byte",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 44616,
   "name": "r_AE48",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 44617,
   "name": "draw_shape_mirrored",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 44626,
   "name": "b_AE52",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44628,
   "name": "draw_shape_mirrored_next_byte",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 44655,
   "name": "b_AE6F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44661,
   "name": "b_AE75",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44671,
   "name": "b_AE7F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44678,
   "name": "draw_shape_mirrored_skip_row",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 44692,
   "name": "b_AE94",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44696,
   "name": "draw_shape_mirrored_row_start",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 44715,
   "name": "b_AEAB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44730,
   "name": "draw_shape_mirrored_edge_byte",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 44737,
   "name": "b_AEC1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44748,
   "name": "draw_shape_mirrored_edge_alt_byte",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 44763,
   "name": "draw_edge_cell",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 44776,
   "name": "b_AEE8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 44949,
   "name": "draw_edge_cell_new_char",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 45094,
   "name": "draw_edge_cell_new_char_last_row",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 45109,
   "name": "alloc_next_char",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 45138,
   "name": "r_B052",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 45139,
   "name": "draw_edge_cell_alt",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 45152,
   "name": "b_B060",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45325,
   "name": "draw_cell_alloc_new_char",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 45473,
   "name": "begin_frame_swap_buffer",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 45484,
   "name": "b_B1AC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45514,
   "name": "b_B1CA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45518,
   "name": "b_B1CE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45548,
   "name": "finish_frame_mirror_ground",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 45556,
   "name": "b_B1F4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45558,
   "name": "b_B1F6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45636,
   "name": "b_B244",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45689,
   "name": "mirror_ground_buffer_b",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 45691,
   "name": "b_B27B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45769,
   "name": "b_B2C9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 45822,
   "name": "irq_status_band",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 45853,
   "name": "irq_view_top_sky",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 45902,
   "name": "irq_horizon_band1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 45940,
   "name": "irq_horizon_band2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 45978,
   "name": "irq_horizon_band3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 46016,
   "name": "irq_ground_mirror_charset",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 46058,
   "name": "irq_console_and_frame_tick",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 46101,
   "name": "irq_frame_tick_voice1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 46118,
   "name": "b_B426",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 46140,
   "name": "b_B43C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 46145,
   "name": "b_B441",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 46148,
   "name": "irq_frame_tick_voice3",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 46154,
   "name": "b_B44A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 46172,
   "name": "b_B45C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 46175,
   "name": "irq_frame_counter_colour_flip",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 46183,
   "name": "b_B467",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 46218,
   "name": "b_B48A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 46272,
   "name": "mul8x8",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 46274,
   "name": "mul8x8_y_entry",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 46280,
   "name": "b_B4C8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 46287,
   "name": "b_B4CF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 46296,
   "name": "turn_player_right",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 46320,
   "name": "turn_player_left",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 46344,
   "name": "player_move_forward",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 46348,
   "name": "player_move_checked",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 46371,
   "name": "b_B523",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 46378,
   "name": "player_move_fixed_speed",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 46399,
   "name": "player_blocked_bump",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 46432,
   "name": "r_B560",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 46433,
   "name": "player_move_free",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 46444,
   "name": "player_move_reverse",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 46468,
   "name": "advance_all_objects",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 46470,
   "name": "b_B586",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 46483,
   "name": "b_B593",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 46493,
   "name": "b_B59D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 46497,
   "name": "compute_object_velocity",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 46535,
   "name": "b_B5C7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 46608,
   "name": "b_B610",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 46684,
   "name": "r_B65C",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 46685,
   "name": "apply_object_velocity",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 46754,
   "name": "object_delta_octant",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 46794,
   "name": "b_B6CA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 46832,
   "name": "b_B6F0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 46855,
   "name": "b_B707",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 46881,
   "name": "b_B721",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 46889,
   "name": "bearing_from_viewer",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 46895,
   "name": "b_B72F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 46905,
   "name": "b_B739",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 46928,
   "name": "b_B750",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 46939,
   "name": "b_B75B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 46950,
   "name": "log_distance_code",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 46975,
   "name": "scan_visible_objects",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 46996,
   "name": "b_B794",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47000,
   "name": "b_B798",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47020,
   "name": "b_B7AC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47035,
   "name": "b_B7BB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47079,
   "name": "b_B7E7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47098,
   "name": "b_B7FA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47110,
   "name": "add_object_to_view_list",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 47142,
   "name": "b_B826",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47145,
   "name": "sort_view_list_by_range",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 47149,
   "name": "b_B82D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47154,
   "name": "b_B832",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47161,
   "name": "b_B839",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47174,
   "name": "b_B846",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47192,
   "name": "r_B858",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 47193,
   "name": "find_gate_in_view_list",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 47195,
   "name": "b_B85B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47208,
   "name": "draw_visible_objects",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 47212,
   "name": "draw_visible_list",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 47218,
   "name": "b_B872",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47258,
   "name": "b_B89A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47270,
   "name": "b_B8A6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47278,
   "name": "r_B8AE",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 47279,
   "name": "b_B8AF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47288,
   "name": "add_score_bcd",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 47329,
   "name": "draw_status_score",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 47344,
   "name": "stamp_digit_pair",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 47364,
   "name": "stamp_digit_low",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 47383,
   "name": "r_B917",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 47384,
   "name": "apply_scene_if_changed",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 47392,
   "name": "apply_scene",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 47399,
   "name": "b_B927",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47462,
   "name": "b_B966",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47473,
   "name": "b_B971",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47484,
   "name": "b_B97C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47498,
   "name": "b_B98A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47505,
   "name": "b_B991",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47509,
   "name": "b_B995",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47525,
   "name": "update_scenery_sprites",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 47527,
   "name": "b_B9A7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47567,
   "name": "scenery_sprite_set_x",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 47608,
   "name": "b_B9F8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47620,
   "name": "draw_stargate_rect",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 47649,
   "name": "b_BA21",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47663,
   "name": "j_BA2F",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 47669,
   "name": "b_BA35",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47682,
   "name": "b_BA42",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47694,
   "name": "b_BA4E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47697,
   "name": "b_BA51",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47701,
   "name": "b_BA55",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47703,
   "name": "b_BA57",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47720,
   "name": "b_BA68",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47722,
   "name": "b_BA6A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47752,
   "name": "b_BA88",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47774,
   "name": "b_BA9E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47811,
   "name": "rect_next_row",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 47820,
   "name": "b_BACC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47840,
   "name": "b_BAE0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47855,
   "name": "b_BAEF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47878,
   "name": "j_BB06",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 47888,
   "name": "b_BB10",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47890,
   "name": "b_BB12",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47899,
   "name": "b_BB1B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47904,
   "name": "b_BB20",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47909,
   "name": "b_BB25",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47929,
   "name": "b_BB39",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47939,
   "name": "b_BB43",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47945,
   "name": "j_BB49",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 47964,
   "name": "b_BB5C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 47970,
   "name": "j_BB62",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 47988,
   "name": "j_BB74",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 47992,
   "name": "b_BB78",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 48000,
   "name": "r_BB80",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 48001,
   "name": "fill_gate_mode_rows",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 48025,
   "name": "patch_rect_edge_cell",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 48056,
   "name": "b_BBB8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 48069,
   "name": "r_BBC5",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 48070,
   "name": "b_BBC6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 48092,
   "name": "b_BBDC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 48099,
   "name": "b_BBE3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 48109,
   "name": "b_BBED",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 48116,
   "name": "b_BBF4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 48122,
   "name": "b_BBFA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 48127,
   "name": "b_BBFF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 48130,
   "name": "tbl_left_edge_mask",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 48134,
   "name": "tbl_edge_mask_pair",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 48150,
   "name": "tbl_frame_cycle_values",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 48158,
   "name": "random_next",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 48172,
   "name": "read_joystick_or_demo",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 48200,
   "name": "b_BC48",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 48243,
   "name": "r_BC73",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 48244,
   "name": "unused_pair_before_octant_table",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 48245,
   "name": "s_BC75",
   "type": "Subroutine",
   "kind": "auto"
  },
  {
   "address": 48246,
   "name": "tbl_octant_from_sign_code",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 48254,
   "name": "mask_solid_shade_char",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 48255,
   "name": "tbl_d018_by_buffer",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 48257,
   "name": "tbl_solid_char_by_shade",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 48261,
   "name": "tbl_pair_and_mask",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 48325,
   "name": "tbl_pair_and_mask_hi",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 48389,
   "name": "tbl_pair_or_pattern",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 48453,
   "name": "tbl_pair_or_pattern_hi",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 48513,
   "name": "tbl_solid_fill_by_shade",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 48517,
   "name": "unused_bytes_after_shade_tables",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 48581,
   "name": "unused_bytes_after_shade_tables_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 48638,
   "name": "uninitialised_ram_a",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 48702,
   "name": "uninitialised_ram_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 48766,
   "name": "uninitialised_ram_c",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 48830,
   "name": "uninitialised_ram_d",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 48894,
   "name": "uninitialised_ram_e",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 48958,
   "name": "uninitialised_ram_f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 49022,
   "name": "uninitialised_ram_g",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 49086,
   "name": "uninitialised_ram_h",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 49150,
   "name": "uninitialised_ram_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 53241,
   "name": "f_CFF9",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55296,
   "name": "f_D800",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55375,
   "name": "f_D84F",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55535,
   "name": "f_D8EF",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55552,
   "name": "f_D900",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55695,
   "name": "f_D98F",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55706,
   "name": "f_D99A",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55808,
   "name": "f_DA00",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55855,
   "name": "f_DA2F",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56015,
   "name": "f_DACF",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56063,
   "name": "f_DAFF",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56064,
   "name": "f_DB00",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56065,
   "name": "f_DB01",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56066,
   "name": "f_DB02",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56067,
   "name": "f_DB03",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56084,
   "name": "f_DB14",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56085,
   "name": "f_DB15",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56086,
   "name": "f_DB16",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56087,
   "name": "f_DB17",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56088,
   "name": "f_DB18",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56135,
   "name": "f_DB47",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 65412,
   "name": "s_FF84",
   "type": "Subroutine",
   "kind": "auto"
  },
  {
   "address": 65439,
   "name": "s_FF9F",
   "type": "Subroutine",
   "kind": "auto"
  }
 ],
 "comments": [
  {
   "address": 2400,
   "type": "line",
   "text": "Last stage of the loader, entered once after the cruncher has expanded the file: a self-modifying page copy that moves the depacked image up by $3000 (page $0D to $3D, then $0C to $3C, wrapping through $FF, until the destination page is $3D again) and jumps to the game init at $9C00. Dead after boot; kept only so the boot chain in orientation.md can be followed."
  },
  {
   "address": 2429,
   "type": "line",
   "text": "Residue of an earlier loader stage (an init that programmed CIA1 timer A to $03F4 and pointed the IRQ vector at $0A5E), partly overwritten during depacking so it no longer decodes as a whole. Nothing in the game references $0900-$13FF; it is not part of the game."
  },
  {
   "address": 5120,
   "type": "line",
   "text": "Per-object size step for the current frame: $8800[view_range_code] (0 = nearest/largest, $1F = smallest, bit 7 set = beyond drawing range). Indexed by object number 0-95; written by scan_visible_objects at $B81F, OR'd with the top 3 bits of obj_type ($8440) at $B87D to form the shape number for draw_visible_objects. Entries 0-63. Load-time content of the whole page $1400-$17FF is a twin of $2400-$27FF (identical in the title snapshot); play overwrites it with these tables."
  },
  {
   "address": 5184,
   "type": "line",
   "text": "view_size_step entries 64-95: the size step of obelisks $40-$5F (object numbers 32-95 are the 64 obelisks, see obelisk_grid_map at $8A00)."
  },
  {
   "address": 5216,
   "type": "line",
   "text": "Display list rebuilt every frame: entry i = object number of the i-th visible object, count in $0F. Filled by scan_visible_objects ($B812), ordered by view_range_code by sort_view_list_by_range ($B82F-$B852), walked by draw_visible_objects ($B874). Entries 0-63."
  },
  {
   "address": 5280,
   "type": "line",
   "text": "view_list entries 64-95 (only reached if more than 64 objects are visible at once)."
  },
  {
   "address": 5312,
   "type": "line",
   "text": "Per-object octant/facing code returned in A by bearing_from_viewer ($B729) this frame, stored at $B7DB/$B806 (X = object). 0 or 7 = straight ahead. Read at $B510 (Y = $2D, the object ahead): values 3 or 4 block the player outright, 0 or 7 (dead ahead) block when its view_range_code is below $43 ($B523-$B528) and at $B881 to build the screen column. Entries 0-63."
  },
  {
   "address": 5376,
   "type": "line",
   "text": "view_octant entries 64-95 (obelisks)."
  },
  {
   "address": 5408,
   "type": "line",
   "text": "Low byte of the bearing to each visible object (Y result of bearing_from_viewer), stored by scan_visible_objects at $B80A; combined with view_octant at $B881-$B892 into the horizontal screen position $12/$04 used by draw_visible_objects. Entries 0-63."
  },
  {
   "address": 5472,
   "type": "line",
   "text": "view_bearing_lo entries 64-95 (obelisks)."
  },
  {
   "address": 5504,
   "type": "line",
   "text": "Per-object 8-bit bearing from the player (16-bit bearing >> 3), written at $AD4C for objects 8-23 by the loop at $AAD7-$AAE4; the previous value ($3A) is compared with the new one against tolerance $57 (tbl_skill_hit_tolerance) at $AD5F-$AD68 to decide whether the object crossed the gun line. Objects 0-31."
  },
  {
   "address": 5536,
   "type": "line",
   "text": "Per-object flag for obj_bearing_from_player: $FF = no usable bearing (object inactive, or its range code outside $80-$BF, set at $AD70), 0 = bearing valid (set at $AD1B when an enemy-shot slot is created, $A3B3 for the missile). Objects 0-31."
  },
  {
   "address": 5538,
   "type": "line",
   "text": "Entry 2 of obj_bearing_invalid (table at $15A0): the slot for the current enemy (saucer or missile), addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 5539,
   "type": "line",
   "text": "Entry 3 of obj_bearing_invalid (table at $15A0): the slot for the stargate, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 5568,
   "type": "line",
   "text": "Object X position, fractional byte below obj_pos_x_lo ($82C0). Objects 0-31; cleared at level start ($9E53), advanced by obj_vel_x_lo in advance_object_position ($B65E)."
  },
  {
   "address": 5600,
   "type": "line",
   "text": "Object Z (depth) position, fractional byte below obj_pos_z_lo ($8380). Objects 0-31; cleared at $9E5C, advanced by obj_vel_z_lo at $B680."
  },
  {
   "address": 5632,
   "type": "line",
   "text": "24-bit X velocity per object, high byte (sign). Velocity = obj_speed ($17A0) x sine/cosine of the heading ($84A0 octant, $84C0 fine) through quarter_sine_tbl ($8900), computed by compute_object_velocity ($B5A1-$B60D), negated when heading bit 2 is set. Added to the position by $B679. Objects 0-31; $1606 (player's shot) is also read directly at $AB06 to place sprite 0."
  },
  {
   "address": 5638,
   "type": "line",
   "text": "Entry 6 of obj_vel_x_hi (table at $1600): the slot for the radar conversion marker, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 5664,
   "type": "line",
   "text": "X velocity middle byte (see obj_vel_x_hi). Written $B5CF, shifted left 3 at $B5DB-$B5E9, added to obj_pos_x_lo at $B66D. $1626 = player's shot, read at $AB03."
  },
  {
   "address": 5670,
   "type": "line",
   "text": "Entry 6 of obj_vel_x_mid (table at $1620): the slot for the radar conversion marker, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 5696,
   "type": "line",
   "text": "X velocity low byte (see obj_vel_x_hi). Written $B5D3, added to obj_pos_x_frac at $B661."
  },
  {
   "address": 5728,
   "type": "line",
   "text": "24-bit Z velocity per object, high byte, from the cosine half of compute_object_velocity ($B610-$B659), negated when (heading+2) bit 2 is set. $1666 = player's shot, read at $AB27."
  },
  {
   "address": 5734,
   "type": "line",
   "text": "Entry 6 of obj_vel_z_hi (table at $1660): the slot for the radar conversion marker, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 5760,
   "type": "line",
   "text": "Z velocity middle byte (see obj_vel_z_hi). Written $B618, added at $B68F. $1686 = player's shot, read at $AB24."
  },
  {
   "address": 5766,
   "type": "line",
   "text": "Entry 6 of obj_vel_z_mid (table at $1680): the slot for the radar conversion marker, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 5792,
   "type": "line",
   "text": "Z velocity low byte (see obj_vel_z_hi). Written $B61C, added at $B683."
  },
  {
   "address": 5824,
   "type": "line",
   "text": "X position high byte before the last move, saved by advance_object_position at $B676; copied back into obj_pos_x_hi at $AC6E when the move ended inside an obelisk cell ($8A00 grid), so obelisks block movement. Objects 0-31."
  },
  {
   "address": 5856,
   "type": "line",
   "text": "X position low byte before the last move (saved $B66A, restored $AC74). Objects 0-31."
  },
  {
   "address": 5888,
   "type": "line",
   "text": "Z position high byte before the last move (saved $B698, restored $AC7A). Objects 0-31."
  },
  {
   "address": 5920,
   "type": "line",
   "text": "Z position low byte before the last move (saved $B68C, restored $AC80). Objects 0-31."
  },
  {
   "address": 5952,
   "type": "line",
   "text": "Per-object range code for the frame from $B766 (hypot_tbl $8700 lookup on the high nibbles of |dx|,|dz| plus $2B<<4), written at $B7E1/$B818 by scan_visible_objects. Sort key of view_list; index into range_to_size_tbl ($8800) and range_to_sprite_scale_tbl ($8D00, read at $BA06 for sprite-drawn objects). Read at $B523 for the object ahead ($2D). Entries 0-63."
  },
  {
   "address": 6016,
   "type": "line",
   "text": "view_range_code entries 64-95 (obelisks)."
  },
  {
   "address": 6048,
   "type": "line",
   "text": "Per-object speed, the multiplier of compute_object_velocity ($B5C9/$B612). $17A0 = player, from tbl_skill_player_speed ($8F84 at $9EB8), set to $20 while pushing against an obstacle ($B52C) and restored from $68 ($B53B). $17A1/$17A4/$17A5 = enemy slots 1,4,5 from tbl_skill_enemy_speed ($8F88). $17A2 = saucer ($8F00[X] at $A6E9) or homing missile ($8E00[X]+$68 at $A3C5). $17A6 = player's shot ($AAF6, then $20). $17B8-$17BF = objects 24-31, fixed $10 ($9F68). Objects 0-31."
  },
  {
   "address": 6049,
   "type": "line",
   "text": "Entry 1 of obj_speed (table at $17A0): the slot for player shot slot 1, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 6050,
   "type": "line",
   "text": "Entry 2 of obj_speed (table at $17A0): the slot for the current enemy (saucer or missile), addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 6051,
   "type": "line",
   "text": "Entry 3 of obj_speed (table at $17A0): the slot for the stargate, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 6052,
   "type": "line",
   "text": "Entry 4 of obj_speed (table at $17A0): the slot for player shot slot 4, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 6053,
   "type": "line",
   "text": "Entry 5 of obj_speed (table at $17A0): the slot for player shot slot 5, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 6054,
   "type": "line",
   "text": "Entry 6 of obj_speed (table at $17A0): the slot for the radar conversion marker, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 6055,
   "type": "line",
   "text": "Entry 7 of obj_speed (table at $17A0): the slot for the warp-in flash, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 6072,
   "type": "line",
   "text": "Speeds of objects 24-31 (the explosion fragments), set to $10 once at game start ($9F68) and left alone, so every fragment flies at the same speed."
  },
  {
   "address": 6080,
   "type": "line",
   "text": "Not referenced by any code found. Leftover of the load-time twin of $2400-$27FF (in the title snapshot $1400-$17FF equals $2400-$27FF byte for byte); the runtime tables above overwrite the rest of the page during play."
  },
  {
   "address": 7680,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 31 (0 = farthest, 31 = nearest), pointer entry 31 of $9600/$9700. 10 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 7690,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 30 (0 = farthest, 31 = nearest), pointer entry 30 of $9600/$9700. 21 bytes: header byte $D0 (first screen row 10, 4 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 7711,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 29 (0 = farthest, 31 = nearest), pointer entry 29 of $9600/$9700. 11 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 7722,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 28 (0 = farthest, 31 = nearest), pointer entry 28 of $9600/$9700. 23 bytes: header byte $D0 (first screen row 10, 4 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 7745,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 27 (0 = farthest, 31 = nearest), pointer entry 27 of $9600/$9700. 12 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 7757,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 26 (0 = farthest, 31 = nearest), pointer entry 26 of $9600/$9700. 20 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 7777,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 25 (0 = farthest, 31 = nearest), pointer entry 25 of $9600/$9700. 21 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 7798,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 24 (0 = farthest, 31 = nearest), pointer entry 24 of $9600/$9700. 21 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 7819,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 23 (0 = farthest, 31 = nearest), pointer entry 23 of $9600/$9700. 29 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 7848,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 22 (0 = farthest, 31 = nearest), pointer entry 22 of $9600/$9700. 31 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 7879,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 21 (0 = farthest, 31 = nearest), pointer entry 21 of $9600/$9700. 37 bytes: header byte $32 (first screen row 7, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 7916,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 20 (0 = farthest, 31 = nearest), pointer entry 20 of $9600/$9700. 40 bytes: header byte $32 (first screen row 7, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 7956,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 19 (0 = farthest, 31 = nearest), pointer entry 19 of $9600/$9700. 40 bytes: header byte $32 (first screen row 7, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 7996,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 18 (0 = farthest, 31 = nearest), pointer entry 18 of $9600/$9700. 47 bytes: header byte $28 (first screen row 6, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 8043,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 17 (0 = farthest, 31 = nearest), pointer entry 17 of $9600/$9700. 49 bytes: header byte $28 (first screen row 6, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 8092,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 16 (0 = farthest, 31 = nearest), pointer entry 16 of $9600/$9700. 50 bytes: header byte $28 (first screen row 6, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 8142,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 15 (0 = farthest, 31 = nearest), pointer entry 15 of $9600/$9700. 57 bytes: header byte $1E (first screen row 5, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 8199,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 14 (0 = farthest, 31 = nearest), pointer entry 14 of $9600/$9700. 59 bytes: header byte $1E (first screen row 5, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 8258,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 13 (0 = farthest, 31 = nearest), pointer entry 13 of $9600/$9700. 61 bytes: header byte $1E (first screen row 5, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 8319,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 12 (0 = farthest, 31 = nearest), pointer entry 12 of $9600/$9700. 69 bytes: header byte $14 (first screen row 4, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 8383,
   "type": "line",
   "text": "Second part of shape_obelisk_size12 (the sub-cell variants of the same rows), 5 bytes to the next script at $20C4."
  },
  {
   "address": 8388,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 11 (0 = farthest, 31 = nearest), pointer entry 11 of $9600/$9700. 76 bytes: header byte $0A (first screen row 3, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 8452,
   "type": "line",
   "text": "Second part of shape_obelisk_size11 (the sub-cell variants of the same rows), 12 bytes to the next script at $2110."
  },
  {
   "address": 8464,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 10 (0 = farthest, 31 = nearest), pointer entry 10 of $9600/$9700. 74 bytes: header byte $0A (first screen row 3, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 8528,
   "type": "line",
   "text": "Second part of shape_obelisk_size10 (the sub-cell variants of the same rows), 10 bytes to the next script at $215A."
  },
  {
   "address": 8538,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 9 (0 = farthest, 31 = nearest), pointer entry 9 of $9600/$9700. 65 bytes: header byte $0A (first screen row 3, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 8602,
   "type": "line",
   "text": "Second part of shape_obelisk_size09 (the sub-cell variants of the same rows), 1 bytes to the next script at $219B."
  },
  {
   "address": 8603,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 8 (0 = farthest, 31 = nearest), pointer entry 8 of $9600/$9700. 63 bytes: header byte $0A (first screen row 3, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 8666,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 7 (0 = farthest, 31 = nearest), pointer entry 7 of $9600/$9700. 61 bytes: header byte $0A (first screen row 3, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 8727,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 6 (0 = farthest, 31 = nearest), pointer entry 6 of $9600/$9700. 60 bytes: header byte $0A (first screen row 3, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 8787,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 5 (0 = farthest, 31 = nearest), pointer entry 5 of $9600/$9700. 60 bytes: header byte $0A (first screen row 3, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 8847,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 4 (0 = farthest, 31 = nearest), pointer entry 4 of $9600/$9700. 60 bytes: header byte $0A (first screen row 3, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 8907,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 3 (0 = farthest, 31 = nearest), pointer entry 3 of $9600/$9700. 60 bytes: header byte $0A (first screen row 3, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 8967,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 2 (0 = farthest, 31 = nearest), pointer entry 2 of $9600/$9700. 60 bytes: header byte $0A (first screen row 3, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 9027,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 1 (0 = farthest, 31 = nearest), pointer entry 1 of $9600/$9700. 60 bytes: header byte $0A (first screen row 3, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 9087,
   "type": "line",
   "text": "Shape script for the black cylindrical obelisk, family 0 size step 0 (0 = farthest, 31 = nearest), pointer entry 0 of $9600/$9700. 60 bytes: header byte $0A (first screen row 3, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 9147,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 31 (0 = farthest, 31 = nearest), pointer entry 63 of $9600/$9700. 10 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 9157,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 30 (0 = farthest, 31 = nearest), pointer entry 62 of $9600/$9700. 21 bytes: header byte $D0 (first screen row 10, 4 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 9178,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 29 (0 = farthest, 31 = nearest), pointer entry 61 of $9600/$9700. 11 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 9189,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 28 (0 = farthest, 31 = nearest), pointer entry 60 of $9600/$9700. 23 bytes: header byte $D0 (first screen row 10, 4 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 9212,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 27 (0 = farthest, 31 = nearest), pointer entry 59 of $9600/$9700. 12 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 9224,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 26 (0 = farthest, 31 = nearest), pointer entry 58 of $9600/$9700. 13 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 9237,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 25 (0 = farthest, 31 = nearest), pointer entry 57 of $9600/$9700. 14 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 9251,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 24 (0 = farthest, 31 = nearest), pointer entry 56 of $9600/$9700. 21 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 9272,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 23 (0 = farthest, 31 = nearest), pointer entry 55 of $9600/$9700. 23 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 9295,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 22 (0 = farthest, 31 = nearest), pointer entry 54 of $9600/$9700. 23 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 9318,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 21 (0 = farthest, 31 = nearest), pointer entry 53 of $9600/$9700. 24 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 9342,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 20 (0 = farthest, 31 = nearest), pointer entry 52 of $9600/$9700. 31 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 9373,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 19 (0 = farthest, 31 = nearest), pointer entry 51 of $9600/$9700. 33 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 9406,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 18 (0 = farthest, 31 = nearest), pointer entry 50 of $9600/$9700. 34 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 9440,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 17 (0 = farthest, 31 = nearest), pointer entry 49 of $9600/$9700. 36 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 9476,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 16 (0 = farthest, 31 = nearest), pointer entry 48 of $9600/$9700. 36 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 9512,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 15 (0 = farthest, 31 = nearest), pointer entry 47 of $9600/$9700. 43 bytes: header byte $32 (first screen row 7, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 9555,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 14 (0 = farthest, 31 = nearest), pointer entry 46 of $9600/$9700. 45 bytes: header byte $32 (first screen row 7, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 9600,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 13 (0 = farthest, 31 = nearest), pointer entry 45 of $9600/$9700. 46 bytes: header byte $32 (first screen row 7, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 9646,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 12 (0 = farthest, 31 = nearest), pointer entry 44 of $9600/$9700. 45 bytes: header byte $32 (first screen row 7, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 9691,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 11 (0 = farthest, 31 = nearest), pointer entry 43 of $9600/$9700. 56 bytes: header byte $28 (first screen row 6, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 9747,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 10 (0 = farthest, 31 = nearest), pointer entry 42 of $9600/$9700. 57 bytes: header byte $28 (first screen row 6, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 9804,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 9 (0 = farthest, 31 = nearest), pointer entry 41 of $9600/$9700. 68 bytes: header byte $1E (first screen row 5, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 9868,
   "type": "line",
   "text": "Second part of shape_shot_size09 (the sub-cell variants of the same rows), 4 bytes to the next script at $2690."
  },
  {
   "address": 9872,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 8 (0 = farthest, 31 = nearest), pointer entry 40 of $9600/$9700. 70 bytes: header byte $1E (first screen row 5, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 9936,
   "type": "line",
   "text": "Second part of shape_shot_size08 (the sub-cell variants of the same rows), 6 bytes to the next script at $26D6."
  },
  {
   "address": 9942,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 7 (0 = farthest, 31 = nearest), pointer entry 39 of $9600/$9700. 74 bytes: header byte $14 (first screen row 4, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 10006,
   "type": "line",
   "text": "Second part of shape_shot_size07 (the sub-cell variants of the same rows), 10 bytes to the next script at $2720."
  },
  {
   "address": 10016,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 6 (0 = farthest, 31 = nearest), pointer entry 38 of $9600/$9700. 79 bytes: header byte $14 (first screen row 4, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 10080,
   "type": "line",
   "text": "Second part of shape_shot_size06 (the sub-cell variants of the same rows), 15 bytes to the next script at $276F."
  },
  {
   "address": 10095,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 5 (0 = farthest, 31 = nearest), pointer entry 37 of $9600/$9700. 90 bytes: header byte $0A (first screen row 3, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 10159,
   "type": "line",
   "text": "Second part of shape_shot_size05 (the sub-cell variants of the same rows), 26 bytes to the next script at $27C9."
  },
  {
   "address": 10185,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 4 (0 = farthest, 31 = nearest), pointer entry 36 of $9600/$9700. 81 bytes: header byte $0A (first screen row 3, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 10249,
   "type": "line",
   "text": "Second part of shape_shot_size04 (the sub-cell variants of the same rows), 17 bytes to the next script at $281A."
  },
  {
   "address": 10266,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 3 (0 = farthest, 31 = nearest), pointer entry 35 of $9600/$9700. 78 bytes: header byte $0A (first screen row 3, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 10330,
   "type": "line",
   "text": "Second part of shape_shot_size03 (the sub-cell variants of the same rows), 14 bytes to the next script at $2868."
  },
  {
   "address": 10344,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 2 (0 = farthest, 31 = nearest), pointer entry 34 of $9600/$9700. 76 bytes: header byte $0A (first screen row 3, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 10408,
   "type": "line",
   "text": "Second part of shape_shot_size02 (the sub-cell variants of the same rows), 12 bytes to the next script at $28B4."
  },
  {
   "address": 10420,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 1 (0 = farthest, 31 = nearest), pointer entry 33 of $9600/$9700. 72 bytes: header byte $0A (first screen row 3, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 10484,
   "type": "line",
   "text": "Second part of shape_shot_size01 (the sub-cell variants of the same rows), 8 bytes to the next script at $28FC."
  },
  {
   "address": 10492,
   "type": "line",
   "text": "Shape script for a shot or warp sphere (player and enemy shots, and the spheres of the warp), family 1 size step 0 (0 = farthest, 31 = nearest), pointer entry 32 of $9600/$9700. 75 bytes: header byte $0A (first screen row 3, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 10556,
   "type": "line",
   "text": "Second part of shape_shot_size00 (the sub-cell variants of the same rows), 11 bytes to the next script at $2947."
  },
  {
   "address": 10567,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 31 (0 = farthest, 31 = nearest), pointer entry 95 of $9600/$9700. 10 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 10577,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 30 (0 = farthest, 31 = nearest), pointer entry 94 of $9600/$9700. 23 bytes: header byte $D0 (first screen row 10, 4 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 10600,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 29 (0 = farthest, 31 = nearest), pointer entry 93 of $9600/$9700. 12 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 10612,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 28 (0 = farthest, 31 = nearest), pointer entry 92 of $9600/$9700. 25 bytes: header byte $D0 (first screen row 10, 4 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 10637,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 27 (0 = farthest, 31 = nearest), pointer entry 91 of $9600/$9700. 13 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 10650,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 26 (0 = farthest, 31 = nearest), pointer entry 90 of $9600/$9700. 14 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 10664,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 25 (0 = farthest, 31 = nearest), pointer entry 89 of $9600/$9700. 15 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 10679,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 24 (0 = farthest, 31 = nearest), pointer entry 88 of $9600/$9700. 16 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 10695,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 23 (0 = farthest, 31 = nearest), pointer entry 87 of $9600/$9700. 17 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 10712,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 22 (0 = farthest, 31 = nearest), pointer entry 86 of $9600/$9700. 18 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 10730,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 21 (0 = farthest, 31 = nearest), pointer entry 85 of $9600/$9700. 25 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 10755,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 20 (0 = farthest, 31 = nearest), pointer entry 84 of $9600/$9700. 26 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 10781,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 19 (0 = farthest, 31 = nearest), pointer entry 83 of $9600/$9700. 28 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 10809,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 18 (0 = farthest, 31 = nearest), pointer entry 82 of $9600/$9700. 27 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 10836,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 17 (0 = farthest, 31 = nearest), pointer entry 81 of $9600/$9700. 28 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 10864,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 16 (0 = farthest, 31 = nearest), pointer entry 80 of $9600/$9700. 30 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 10894,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 15 (0 = farthest, 31 = nearest), pointer entry 79 of $9600/$9700. 30 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 10924,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 14 (0 = farthest, 31 = nearest), pointer entry 78 of $9600/$9700. 38 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 10962,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 13 (0 = farthest, 31 = nearest), pointer entry 77 of $9600/$9700. 40 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 11002,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 12 (0 = farthest, 31 = nearest), pointer entry 76 of $9600/$9700. 41 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 11043,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 11 (0 = farthest, 31 = nearest), pointer entry 75 of $9600/$9700. 42 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 11085,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 10 (0 = farthest, 31 = nearest), pointer entry 74 of $9600/$9700. 47 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 11132,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 9 (0 = farthest, 31 = nearest), pointer entry 73 of $9600/$9700. 55 bytes: header byte $32 (first screen row 7, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 11187,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 8 (0 = farthest, 31 = nearest), pointer entry 72 of $9600/$9700. 56 bytes: header byte $32 (first screen row 7, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 11243,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 7 (0 = farthest, 31 = nearest), pointer entry 71 of $9600/$9700. 57 bytes: header byte $32 (first screen row 7, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 11300,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 6 (0 = farthest, 31 = nearest), pointer entry 70 of $9600/$9700. 64 bytes: header byte $28 (first screen row 6, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 11364,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 5 (0 = farthest, 31 = nearest), pointer entry 69 of $9600/$9700. 70 bytes: header byte $28 (first screen row 6, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 11428,
   "type": "line",
   "text": "Second part of shape_saucer_size05 (the sub-cell variants of the same rows), 6 bytes to the next script at $2CAA."
  },
  {
   "address": 11434,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 4 (0 = farthest, 31 = nearest), pointer entry 68 of $9600/$9700. 78 bytes: header byte $1E (first screen row 5, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 11498,
   "type": "line",
   "text": "Second part of shape_saucer_size04 (the sub-cell variants of the same rows), 14 bytes to the next script at $2CF8."
  },
  {
   "address": 11512,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 3 (0 = farthest, 31 = nearest), pointer entry 67 of $9600/$9700. 84 bytes: header byte $1E (first screen row 5, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 11576,
   "type": "line",
   "text": "Second part of shape_saucer_size03 (the sub-cell variants of the same rows), 20 bytes to the next script at $2D4C."
  },
  {
   "address": 11596,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 2 (0 = farthest, 31 = nearest), pointer entry 66 of $9600/$9700. 95 bytes: header byte $14 (first screen row 4, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 11660,
   "type": "line",
   "text": "Second part of shape_saucer_size02 (the sub-cell variants of the same rows), 31 bytes to the next script at $2DAB."
  },
  {
   "address": 11691,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 1 (0 = farthest, 31 = nearest), pointer entry 65 of $9600/$9700. 97 bytes: header byte $14 (first screen row 4, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 11755,
   "type": "line",
   "text": "Second part of shape_saucer_size01 (the sub-cell variants of the same rows), 33 bytes to the next script at $2E0C."
  },
  {
   "address": 11788,
   "type": "line",
   "text": "Shape script for the enemy saucer, family 2 size step 0 (0 = farthest, 31 = nearest), pointer entry 64 of $9600/$9700. 109 bytes: header byte $0A (first screen row 3, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 11852,
   "type": "line",
   "text": "Second part of shape_saucer_size00 (the sub-cell variants of the same rows), 45 bytes to the next script at $2E79."
  },
  {
   "address": 11897,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 31 (0 = farthest, 31 = nearest), pointer entry 127 of $9600/$9700. 10 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 11907,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 30 (0 = farthest, 31 = nearest), pointer entry 126 of $9600/$9700. 21 bytes: header byte $D0 (first screen row 10, 4 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 11928,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 29 (0 = farthest, 31 = nearest), pointer entry 125 of $9600/$9700. 12 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 11940,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 28 (0 = farthest, 31 = nearest), pointer entry 124 of $9600/$9700. 26 bytes: header byte $D0 (first screen row 10, 4 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 11966,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 27 (0 = farthest, 31 = nearest), pointer entry 123 of $9600/$9700. 13 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 11979,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 26 (0 = farthest, 31 = nearest), pointer entry 122 of $9600/$9700. 14 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 11993,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 25 (0 = farthest, 31 = nearest), pointer entry 121 of $9600/$9700. 23 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 12016,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 24 (0 = farthest, 31 = nearest), pointer entry 120 of $9600/$9700. 25 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 12041,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 23 (0 = farthest, 31 = nearest), pointer entry 119 of $9600/$9700. 26 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 12067,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 22 (0 = farthest, 31 = nearest), pointer entry 118 of $9600/$9700. 27 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 12094,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 21 (0 = farthest, 31 = nearest), pointer entry 117 of $9600/$9700. 36 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 12130,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 20 (0 = farthest, 31 = nearest), pointer entry 116 of $9600/$9700. 36 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 12166,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 19 (0 = farthest, 31 = nearest), pointer entry 115 of $9600/$9700. 37 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 12203,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 18 (0 = farthest, 31 = nearest), pointer entry 114 of $9600/$9700. 38 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 12241,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 17 (0 = farthest, 31 = nearest), pointer entry 113 of $9600/$9700. 45 bytes: header byte $32 (first screen row 7, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 12286,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 16 (0 = farthest, 31 = nearest), pointer entry 112 of $9600/$9700. 41 bytes: header byte $32 (first screen row 7, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 12327,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 15 (0 = farthest, 31 = nearest), pointer entry 111 of $9600/$9700. 48 bytes: header byte $32 (first screen row 7, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 12375,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 14 (0 = farthest, 31 = nearest), pointer entry 110 of $9600/$9700. 49 bytes: header byte $32 (first screen row 7, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 12424,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 13 (0 = farthest, 31 = nearest), pointer entry 109 of $9600/$9700. 56 bytes: header byte $28 (first screen row 6, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 12480,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 12 (0 = farthest, 31 = nearest), pointer entry 108 of $9600/$9700. 60 bytes: header byte $28 (first screen row 6, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 12540,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 11 (0 = farthest, 31 = nearest), pointer entry 107 of $9600/$9700. 66 bytes: header byte $1E (first screen row 5, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 12604,
   "type": "line",
   "text": "Second part of shape_missile_size11 (the sub-cell variants of the same rows), 2 bytes to the next script at $313E."
  },
  {
   "address": 12606,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 10 (0 = farthest, 31 = nearest), pointer entry 106 of $9600/$9700. 72 bytes: header byte $1E (first screen row 5, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 12670,
   "type": "line",
   "text": "Second part of shape_missile_size10 (the sub-cell variants of the same rows), 8 bytes to the next script at $3186."
  },
  {
   "address": 12678,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 9 (0 = farthest, 31 = nearest), pointer entry 105 of $9600/$9700. 78 bytes: header byte $14 (first screen row 4, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 12742,
   "type": "line",
   "text": "Second part of shape_missile_size09 (the sub-cell variants of the same rows), 14 bytes to the next script at $31D4."
  },
  {
   "address": 12756,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 8 (0 = farthest, 31 = nearest), pointer entry 104 of $9600/$9700. 71 bytes: header byte $14 (first screen row 4, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 12820,
   "type": "line",
   "text": "Second part of shape_missile_size08 (the sub-cell variants of the same rows), 7 bytes to the next script at $321B."
  },
  {
   "address": 12827,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 7 (0 = farthest, 31 = nearest), pointer entry 103 of $9600/$9700. 89 bytes: header byte $0A (first screen row 3, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 12891,
   "type": "line",
   "text": "Second part of shape_missile_size07 (the sub-cell variants of the same rows), 25 bytes to the next script at $3274."
  },
  {
   "address": 12916,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 6 (0 = farthest, 31 = nearest), pointer entry 102 of $9600/$9700. 92 bytes: header byte $0A (first screen row 3, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 12980,
   "type": "line",
   "text": "Second part of shape_missile_size06 (the sub-cell variants of the same rows), 28 bytes to the next script at $32D0."
  },
  {
   "address": 13008,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 5 (0 = farthest, 31 = nearest), pointer entry 101 of $9600/$9700. 96 bytes: header byte $0A (first screen row 3, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13072,
   "type": "line",
   "text": "Second part of shape_missile_size05 (the sub-cell variants of the same rows), 32 bytes to the next script at $3330."
  },
  {
   "address": 13104,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 4 (0 = farthest, 31 = nearest), pointer entry 100 of $9600/$9700. 94 bytes: header byte $0A (first screen row 3, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13168,
   "type": "line",
   "text": "Second part of shape_missile_size04 (the sub-cell variants of the same rows), 30 bytes to the next script at $338E."
  },
  {
   "address": 13198,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 3 (0 = farthest, 31 = nearest), pointer entry 99 of $9600/$9700. 94 bytes: header byte $0A (first screen row 3, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13262,
   "type": "line",
   "text": "Second part of shape_missile_size03 (the sub-cell variants of the same rows), 30 bytes to the next script at $33EC."
  },
  {
   "address": 13292,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 2 (0 = farthest, 31 = nearest), pointer entry 98 of $9600/$9700. 93 bytes: header byte $0A (first screen row 3, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13356,
   "type": "line",
   "text": "Second part of shape_missile_size02 (the sub-cell variants of the same rows), 29 bytes to the next script at $3449."
  },
  {
   "address": 13385,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 1 (0 = farthest, 31 = nearest), pointer entry 97 of $9600/$9700. 94 bytes: header byte $0A (first screen row 3, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13449,
   "type": "line",
   "text": "Second part of shape_missile_size01 (the sub-cell variants of the same rows), 30 bytes to the next script at $34A7."
  },
  {
   "address": 13479,
   "type": "line",
   "text": "Shape script for the homing missile, family 3 size step 0 (0 = farthest, 31 = nearest), pointer entry 96 of $9600/$9700. 94 bytes: header byte $0A (first screen row 3, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13543,
   "type": "line",
   "text": "Second part of shape_missile_size00 (the sub-cell variants of the same rows), 30 bytes to the next script at $3505."
  },
  {
   "address": 13573,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 31 (0 = farthest, 31 = nearest), pointer entry 159 of $9600/$9700. 10 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13583,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 30 (0 = farthest, 31 = nearest), pointer entry 158 of $9600/$9700. 10 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13593,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 29 (0 = farthest, 31 = nearest), pointer entry 157 of $9600/$9700. 10 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13603,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 28 (0 = farthest, 31 = nearest), pointer entry 156 of $9600/$9700. 10 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13613,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 27 (0 = farthest, 31 = nearest), pointer entry 155 of $9600/$9700. 11 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13624,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 26 (0 = farthest, 31 = nearest), pointer entry 154 of $9600/$9700. 11 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13635,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 25 (0 = farthest, 31 = nearest), pointer entry 153 of $9600/$9700. 11 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13646,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 24 (0 = farthest, 31 = nearest), pointer entry 152 of $9600/$9700. 11 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13657,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 23 (0 = farthest, 31 = nearest), pointer entry 151 of $9600/$9700. 12 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13669,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 22 (0 = farthest, 31 = nearest), pointer entry 150 of $9600/$9700. 13 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13682,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 21 (0 = farthest, 31 = nearest), pointer entry 149 of $9600/$9700. 13 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13695,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 20 (0 = farthest, 31 = nearest), pointer entry 148 of $9600/$9700. 12 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13707,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 19 (0 = farthest, 31 = nearest), pointer entry 147 of $9600/$9700. 12 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13719,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 18 (0 = farthest, 31 = nearest), pointer entry 146 of $9600/$9700. 19 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13738,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 17 (0 = farthest, 31 = nearest), pointer entry 145 of $9600/$9700. 21 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13759,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 16 (0 = farthest, 31 = nearest), pointer entry 144 of $9600/$9700. 22 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13781,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 15 (0 = farthest, 31 = nearest), pointer entry 143 of $9600/$9700. 19 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13800,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 14 (0 = farthest, 31 = nearest), pointer entry 142 of $9600/$9700. 19 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13819,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 13 (0 = farthest, 31 = nearest), pointer entry 141 of $9600/$9700. 21 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13840,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 12 (0 = farthest, 31 = nearest), pointer entry 140 of $9600/$9700. 25 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13865,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 11 (0 = farthest, 31 = nearest), pointer entry 139 of $9600/$9700. 20 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13885,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 10 (0 = farthest, 31 = nearest), pointer entry 138 of $9600/$9700. 31 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13916,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 9 (0 = farthest, 31 = nearest), pointer entry 137 of $9600/$9700. 27 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13943,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 8 (0 = farthest, 31 = nearest), pointer entry 136 of $9600/$9700. 30 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 13973,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 7 (0 = farthest, 31 = nearest), pointer entry 135 of $9600/$9700. 37 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14010,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 6 (0 = farthest, 31 = nearest), pointer entry 134 of $9600/$9700. 28 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14038,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 5 (0 = farthest, 31 = nearest), pointer entry 133 of $9600/$9700. 35 bytes: header byte $32 (first screen row 7, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14073,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 4 (0 = farthest, 31 = nearest), pointer entry 132 of $9600/$9700. 49 bytes: header byte $32 (first screen row 7, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14122,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 3 (0 = farthest, 31 = nearest), pointer entry 131 of $9600/$9700. 51 bytes: header byte $28 (first screen row 6, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14173,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 2 (0 = farthest, 31 = nearest), pointer entry 130 of $9600/$9700. 48 bytes: header byte $28 (first screen row 6, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14221,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 1 (0 = farthest, 31 = nearest), pointer entry 129 of $9600/$9700. 44 bytes: header byte $28 (first screen row 6, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14265,
   "type": "line",
   "text": "Shape script for explosion fragment kind A (shape $82 in the cycle at $BC16), family 4 size step 0 (0 = farthest, 31 = nearest), pointer entry 128 of $9600/$9700. 51 bytes: header byte $1E (first screen row 5, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14316,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 31 (0 = farthest, 31 = nearest), pointer entry 191 of $9600/$9700. 10 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14326,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 30 (0 = farthest, 31 = nearest), pointer entry 190 of $9600/$9700. 10 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14336,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 29 (0 = farthest, 31 = nearest), pointer entry 189 of $9600/$9700. 10 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14346,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 28 (0 = farthest, 31 = nearest), pointer entry 188 of $9600/$9700. 11 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14357,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 27 (0 = farthest, 31 = nearest), pointer entry 187 of $9600/$9700. 11 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14368,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 26 (0 = farthest, 31 = nearest), pointer entry 186 of $9600/$9700. 12 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14380,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 25 (0 = farthest, 31 = nearest), pointer entry 185 of $9600/$9700. 12 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14392,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 24 (0 = farthest, 31 = nearest), pointer entry 184 of $9600/$9700. 12 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14404,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 23 (0 = farthest, 31 = nearest), pointer entry 183 of $9600/$9700. 13 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14417,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 22 (0 = farthest, 31 = nearest), pointer entry 182 of $9600/$9700. 13 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14430,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 21 (0 = farthest, 31 = nearest), pointer entry 181 of $9600/$9700. 14 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14444,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 20 (0 = farthest, 31 = nearest), pointer entry 180 of $9600/$9700. 14 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14458,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 19 (0 = farthest, 31 = nearest), pointer entry 179 of $9600/$9700. 14 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14472,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 18 (0 = farthest, 31 = nearest), pointer entry 178 of $9600/$9700. 21 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14493,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 17 (0 = farthest, 31 = nearest), pointer entry 177 of $9600/$9700. 21 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14514,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 16 (0 = farthest, 31 = nearest), pointer entry 176 of $9600/$9700. 23 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14537,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 15 (0 = farthest, 31 = nearest), pointer entry 175 of $9600/$9700. 22 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14559,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 14 (0 = farthest, 31 = nearest), pointer entry 174 of $9600/$9700. 22 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14581,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 13 (0 = farthest, 31 = nearest), pointer entry 173 of $9600/$9700. 24 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14605,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 12 (0 = farthest, 31 = nearest), pointer entry 172 of $9600/$9700. 25 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14630,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 11 (0 = farthest, 31 = nearest), pointer entry 171 of $9600/$9700. 24 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14654,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 10 (0 = farthest, 31 = nearest), pointer entry 170 of $9600/$9700. 31 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14685,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 9 (0 = farthest, 31 = nearest), pointer entry 169 of $9600/$9700. 32 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14717,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 8 (0 = farthest, 31 = nearest), pointer entry 168 of $9600/$9700. 35 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14752,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 7 (0 = farthest, 31 = nearest), pointer entry 167 of $9600/$9700. 36 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14788,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 6 (0 = farthest, 31 = nearest), pointer entry 166 of $9600/$9700. 34 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14822,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 5 (0 = farthest, 31 = nearest), pointer entry 165 of $9600/$9700. 42 bytes: header byte $32 (first screen row 7, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14864,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 4 (0 = farthest, 31 = nearest), pointer entry 164 of $9600/$9700. 47 bytes: header byte $32 (first screen row 7, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14911,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 3 (0 = farthest, 31 = nearest), pointer entry 163 of $9600/$9700. 51 bytes: header byte $28 (first screen row 6, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 14962,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 2 (0 = farthest, 31 = nearest), pointer entry 162 of $9600/$9700. 57 bytes: header byte $28 (first screen row 6, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15019,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 1 (0 = farthest, 31 = nearest), pointer entry 161 of $9600/$9700. 54 bytes: header byte $28 (first screen row 6, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15073,
   "type": "line",
   "text": "Shape script for explosion fragment kind B ($A2), family 5 size step 0 (0 = farthest, 31 = nearest), pointer entry 160 of $9600/$9700. 62 bytes: header byte $1E (first screen row 5, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15135,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 31 (0 = farthest, 31 = nearest), pointer entry 223 of $9600/$9700. 10 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15145,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 30 (0 = farthest, 31 = nearest), pointer entry 222 of $9600/$9700. 10 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15155,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 29 (0 = farthest, 31 = nearest), pointer entry 221 of $9600/$9700. 23 bytes: header byte $D0 (first screen row 10, 4 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15178,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 28 (0 = farthest, 31 = nearest), pointer entry 220 of $9600/$9700. 23 bytes: header byte $D0 (first screen row 10, 4 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15201,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 27 (0 = farthest, 31 = nearest), pointer entry 219 of $9600/$9700. 12 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15213,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 26 (0 = farthest, 31 = nearest), pointer entry 218 of $9600/$9700. 13 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15226,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 25 (0 = farthest, 31 = nearest), pointer entry 217 of $9600/$9700. 14 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15240,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 24 (0 = farthest, 31 = nearest), pointer entry 216 of $9600/$9700. 14 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15254,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 23 (0 = farthest, 31 = nearest), pointer entry 215 of $9600/$9700. 15 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15269,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 22 (0 = farthest, 31 = nearest), pointer entry 214 of $9600/$9700. 16 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15285,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 21 (0 = farthest, 31 = nearest), pointer entry 213 of $9600/$9700. 17 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15302,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 20 (0 = farthest, 31 = nearest), pointer entry 212 of $9600/$9700. 18 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15320,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 19 (0 = farthest, 31 = nearest), pointer entry 211 of $9600/$9700. 18 bytes: header byte $50 (first screen row 10, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15338,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 18 (0 = farthest, 31 = nearest), pointer entry 210 of $9600/$9700. 24 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15362,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 17 (0 = farthest, 31 = nearest), pointer entry 209 of $9600/$9700. 26 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15388,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 16 (0 = farthest, 31 = nearest), pointer entry 208 of $9600/$9700. 27 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15415,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 15 (0 = farthest, 31 = nearest), pointer entry 207 of $9600/$9700. 28 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15443,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 14 (0 = farthest, 31 = nearest), pointer entry 206 of $9600/$9700. 28 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15471,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 13 (0 = farthest, 31 = nearest), pointer entry 205 of $9600/$9700. 29 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15500,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 12 (0 = farthest, 31 = nearest), pointer entry 204 of $9600/$9700. 31 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15531,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 11 (0 = farthest, 31 = nearest), pointer entry 203 of $9600/$9700. 32 bytes: header byte $46 (first screen row 9, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15563,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 10 (0 = farthest, 31 = nearest), pointer entry 202 of $9600/$9700. 40 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15603,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 9 (0 = farthest, 31 = nearest), pointer entry 201 of $9600/$9700. 42 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15616,
   "type": "line",
   "text": "Page boundary inside the family-6 fragment shape scripts, referenced only as the destination operand of the loader relocation loop at $0966 (which copied page $0D here before the init moved the scripts down again). The bytes are the middle of shape_fragment_c scripts, not a table of their own."
  },
  {
   "address": 15645,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 8 (0 = farthest, 31 = nearest), pointer entry 200 of $9600/$9700. 43 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15688,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 7 (0 = farthest, 31 = nearest), pointer entry 199 of $9600/$9700. 45 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15733,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 6 (0 = farthest, 31 = nearest), pointer entry 198 of $9600/$9700. 46 bytes: header byte $3C (first screen row 8, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15779,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 5 (0 = farthest, 31 = nearest), pointer entry 197 of $9600/$9700. 56 bytes: header byte $32 (first screen row 7, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15835,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 4 (0 = farthest, 31 = nearest), pointer entry 196 of $9600/$9700. 59 bytes: header byte $32 (first screen row 7, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15894,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 3 (0 = farthest, 31 = nearest), pointer entry 195 of $9600/$9700. 68 bytes: header byte $28 (first screen row 6, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 15958,
   "type": "line",
   "text": "Second part of shape_fragment_c_size03 (the sub-cell variants of the same rows), 4 bytes to the next script at $3E5A."
  },
  {
   "address": 15962,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 2 (0 = farthest, 31 = nearest), pointer entry 194 of $9600/$9700. 71 bytes: header byte $28 (first screen row 6, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 16026,
   "type": "line",
   "text": "Second part of shape_fragment_c_size02 (the sub-cell variants of the same rows), 7 bytes to the next script at $3EA1."
  },
  {
   "address": 16033,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 1 (0 = farthest, 31 = nearest), pointer entry 193 of $9600/$9700. 74 bytes: header byte $28 (first screen row 6, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 16097,
   "type": "line",
   "text": "Second part of shape_fragment_c_size01 (the sub-cell variants of the same rows), 10 bytes to the next script at $3EEB."
  },
  {
   "address": 16107,
   "type": "line",
   "text": "Shape script for explosion fragment kind C ($C2), family 6 size step 0 (0 = farthest, 31 = nearest), pointer entry 192 of $9600/$9700. 1 bytes: header byte $1E (first screen row 5, 2 sub-cell variants), then per row a row byte $01-$1E, fill runs $20-$3F and edge cells $40-$FF or $1F n, ended by $00. Drawn by draw_shape ($AD76)."
  },
  {
   "address": 16384,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $00-$07 (8 bytes each). Bytes 0-7 = character $00, the blank base character (all $00, written by init at $9F46)."
  },
  {
   "address": 16448,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $08-$0F (8 bytes each)."
  },
  {
   "address": 16512,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $10-$17 (8 bytes each)."
  },
  {
   "address": 16576,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $18-$1F (8 bytes each)."
  },
  {
   "address": 16640,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $20-$27 (8 bytes each). Bytes 0-7 = character $20, the $55 dither base character (init $9F46)."
  },
  {
   "address": 16704,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $28-$2F (8 bytes each)."
  },
  {
   "address": 16768,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $30-$37 (8 bytes each)."
  },
  {
   "address": 16832,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $38-$3F (8 bytes each)."
  },
  {
   "address": 16896,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $40-$47 (8 bytes each). Bytes 0-7 = character $40, the $AA dither base character (init $9F46)."
  },
  {
   "address": 16960,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $48-$4F (8 bytes each)."
  },
  {
   "address": 17024,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $50-$57 (8 bytes each)."
  },
  {
   "address": 17088,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $58-$5F (8 bytes each)."
  },
  {
   "address": 17152,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $60-$67 (8 bytes each). Bytes 0-7 = character $60, the solid $FF base character (init $9F46)."
  },
  {
   "address": 17216,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $68-$6F (8 bytes each)."
  },
  {
   "address": 17280,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $70-$77 (8 bytes each)."
  },
  {
   "address": 17344,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $78-$7F (8 bytes each)."
  },
  {
   "address": 17408,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $80-$87 (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 17472,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $88-$8F (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 17536,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $90-$97 (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 17600,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $98-$9F (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 17664,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $A0-$A7 (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 17728,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $A8-$AF (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 17792,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $B0-$B7 (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 17856,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $B8-$BF (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 17920,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $C0-$C7 (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 17984,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $C8-$CF (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 18048,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $D0-$D7 (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 18112,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $D8-$DF (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 18176,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $E0-$E7 (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 18240,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $E8-$EF (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 18304,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $F0-$F7 (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 18368,
   "type": "line",
   "text": "Runtime charset A ($D018=$80 with screen buffer A at $6000, view rows 2-9, multicolour text mode); rebuilt every other frame. Definitions of characters $F8-$FF (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 18432,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $00-$07 of the mirror set: character c here is source character $FF-c (i.e. $FF..$F8) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 18496,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $08-$0F of the mirror set: character c here is source character $FF-c (i.e. $F7..$F0) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 18560,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $10-$17 of the mirror set: character c here is source character $FF-c (i.e. $EF..$E8) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 18624,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $18-$1F of the mirror set: character c here is source character $FF-c (i.e. $E7..$E0) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 18688,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $20-$27 of the mirror set: character c here is source character $FF-c (i.e. $DF..$D8) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 18752,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $28-$2F of the mirror set: character c here is source character $FF-c (i.e. $D7..$D0) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 18816,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $30-$37 of the mirror set: character c here is source character $FF-c (i.e. $CF..$C8) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 18880,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $38-$3F of the mirror set: character c here is source character $FF-c (i.e. $C7..$C0) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 18944,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $40-$47 of the mirror set: character c here is source character $FF-c (i.e. $BF..$B8) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 19008,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $48-$4F of the mirror set: character c here is source character $FF-c (i.e. $B7..$B0) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 19072,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $50-$57 of the mirror set: character c here is source character $FF-c (i.e. $AF..$A8) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 19136,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $58-$5F of the mirror set: character c here is source character $FF-c (i.e. $A7..$A0) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 19200,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $60-$67 of the mirror set: character c here is source character $FF-c (i.e. $9F..$98) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 19264,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $68-$6F of the mirror set: character c here is source character $FF-c (i.e. $97..$90) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 19328,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $70-$77 of the mirror set: character c here is source character $FF-c (i.e. $8F..$88) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 19392,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $78-$7F of the mirror set: character c here is source character $FF-c (i.e. $87..$80) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 19456,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $80-$87 of the mirror set: character c here is source character $FF-c (i.e. $7F..$78) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 19520,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $88-$8F of the mirror set: character c here is source character $FF-c (i.e. $77..$70) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 19584,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $90-$97 of the mirror set: character c here is source character $FF-c (i.e. $6F..$68) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 19648,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $98-$9F of the mirror set: character c here is source character $FF-c (i.e. $67..$60) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 19712,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $A0-$A7 of the mirror set: character c here is source character $FF-c (i.e. $5F..$58) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 19776,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $A8-$AF of the mirror set: character c here is source character $FF-c (i.e. $57..$50) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 19840,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $B0-$B7 of the mirror set: character c here is source character $FF-c (i.e. $4F..$48) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 19904,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $B8-$BF of the mirror set: character c here is source character $FF-c (i.e. $47..$40) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 19968,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $C0-$C7 of the mirror set: character c here is source character $FF-c (i.e. $3F..$38) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 20032,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $C8-$CF of the mirror set: character c here is source character $FF-c (i.e. $37..$30) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 20096,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $D0-$D7 of the mirror set: character c here is source character $FF-c (i.e. $2F..$28) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 20160,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $D8-$DF of the mirror set: character c here is source character $FF-c (i.e. $27..$20) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 20224,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $E0-$E7 of the mirror set: character c here is source character $FF-c (i.e. $1F..$18) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 20288,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $E8-$EF of the mirror set: character c here is source character $FF-c (i.e. $17..$10) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 20352,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $F0-$F7 of the mirror set: character c here is source character $FF-c (i.e. $0F..$08) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 20416,
   "type": "line",
   "text": "Runtime charset A mirror ($D018=$82, selected by irq_ground_mirror_charset at line 130 for view rows 10-17, the ground = reflected sky): byte-reversed copy of charset A made by finish_frame_mirror_ground. Holds characters $F8-$FF of the mirror set: character c here is source character $FF-c (i.e. $07..$00) with its 8 rows in reverse order, copied by the loop at $B244 each frame."
  },
  {
   "address": 20480,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $00-$07 (8 bytes each). Bytes 0-7 = character $00, the blank base character (all $00, written by init at $9F46)."
  },
  {
   "address": 20544,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $08-$0F (8 bytes each)."
  },
  {
   "address": 20608,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $10-$17 (8 bytes each)."
  },
  {
   "address": 20672,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $18-$1F (8 bytes each)."
  },
  {
   "address": 20736,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $20-$27 (8 bytes each). Bytes 0-7 = character $20, the $55 dither base character (init $9F46)."
  },
  {
   "address": 20800,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $28-$2F (8 bytes each)."
  },
  {
   "address": 20864,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $30-$37 (8 bytes each)."
  },
  {
   "address": 20928,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $38-$3F (8 bytes each)."
  },
  {
   "address": 20992,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $40-$47 (8 bytes each). Bytes 0-7 = character $40, the $AA dither base character (init $9F46)."
  },
  {
   "address": 21056,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $48-$4F (8 bytes each)."
  },
  {
   "address": 21120,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $50-$57 (8 bytes each)."
  },
  {
   "address": 21184,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $58-$5F (8 bytes each)."
  },
  {
   "address": 21248,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $60-$67 (8 bytes each). Bytes 0-7 = character $60, the solid $FF base character (init $9F46)."
  },
  {
   "address": 21312,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $68-$6F (8 bytes each)."
  },
  {
   "address": 21376,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $70-$77 (8 bytes each)."
  },
  {
   "address": 21440,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $78-$7F (8 bytes each)."
  },
  {
   "address": 21504,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $80-$87 (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 21568,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $88-$8F (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 21632,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $90-$97 (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 21696,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $98-$9F (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 21760,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $A0-$A7 (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 21824,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $A8-$AF (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 21888,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $B0-$B7 (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 21952,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $B8-$BF (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 22016,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $C0-$C7 (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 22080,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $C8-$CF (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 22144,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $D0-$D7 (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 22208,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $D8-$DF (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 22272,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $E0-$E7 (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 22336,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $E8-$EF (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 22400,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $F0-$F7 (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 22464,
   "type": "line",
   "text": "Runtime charset B ($D018=$94 with screen buffer B at $6400, view rows 2-9, multicolour text mode); rebuilt on alternate frames ($08 odd/even). Definitions of characters $F8-$FF (8 bytes each). Characters $80 and up are allocated upward each frame ($05 = next free code, reset to $80 by begin_frame at $B1B5/$B1D7) and their 8 rows are written by the shape renderers ($AF95/$B10D through ($FD)) from the column-shape tables."
  },
  {
   "address": 22528,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $00-$07 of the mirror set: character c here is source character $FF-c (i.e. $FF..$F8) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 22592,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $08-$0F of the mirror set: character c here is source character $FF-c (i.e. $F7..$F0) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 22656,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $10-$17 of the mirror set: character c here is source character $FF-c (i.e. $EF..$E8) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 22720,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $18-$1F of the mirror set: character c here is source character $FF-c (i.e. $E7..$E0) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 22784,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $20-$27 of the mirror set: character c here is source character $FF-c (i.e. $DF..$D8) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 22848,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $28-$2F of the mirror set: character c here is source character $FF-c (i.e. $D7..$D0) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 22912,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $30-$37 of the mirror set: character c here is source character $FF-c (i.e. $CF..$C8) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 22976,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $38-$3F of the mirror set: character c here is source character $FF-c (i.e. $C7..$C0) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 23040,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $40-$47 of the mirror set: character c here is source character $FF-c (i.e. $BF..$B8) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 23104,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $48-$4F of the mirror set: character c here is source character $FF-c (i.e. $B7..$B0) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 23168,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $50-$57 of the mirror set: character c here is source character $FF-c (i.e. $AF..$A8) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 23232,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $58-$5F of the mirror set: character c here is source character $FF-c (i.e. $A7..$A0) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 23296,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $60-$67 of the mirror set: character c here is source character $FF-c (i.e. $9F..$98) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 23360,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $68-$6F of the mirror set: character c here is source character $FF-c (i.e. $97..$90) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 23424,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $70-$77 of the mirror set: character c here is source character $FF-c (i.e. $8F..$88) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 23488,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $78-$7F of the mirror set: character c here is source character $FF-c (i.e. $87..$80) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 23552,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $80-$87 of the mirror set: character c here is source character $FF-c (i.e. $7F..$78) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 23616,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $88-$8F of the mirror set: character c here is source character $FF-c (i.e. $77..$70) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 23680,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $90-$97 of the mirror set: character c here is source character $FF-c (i.e. $6F..$68) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 23744,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $98-$9F of the mirror set: character c here is source character $FF-c (i.e. $67..$60) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 23808,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $A0-$A7 of the mirror set: character c here is source character $FF-c (i.e. $5F..$58) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 23872,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $A8-$AF of the mirror set: character c here is source character $FF-c (i.e. $57..$50) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 23936,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $B0-$B7 of the mirror set: character c here is source character $FF-c (i.e. $4F..$48) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 24000,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $B8-$BF of the mirror set: character c here is source character $FF-c (i.e. $47..$40) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 24064,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $C0-$C7 of the mirror set: character c here is source character $FF-c (i.e. $3F..$38) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 24128,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $C8-$CF of the mirror set: character c here is source character $FF-c (i.e. $37..$30) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 24192,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $D0-$D7 of the mirror set: character c here is source character $FF-c (i.e. $2F..$28) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 24256,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $D8-$DF of the mirror set: character c here is source character $FF-c (i.e. $27..$20) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 24320,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $E0-$E7 of the mirror set: character c here is source character $FF-c (i.e. $1F..$18) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 24384,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $E8-$EF of the mirror set: character c here is source character $FF-c (i.e. $17..$10) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 24448,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $F0-$F7 of the mirror set: character c here is source character $FF-c (i.e. $0F..$08) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 24512,
   "type": "line",
   "text": "Runtime charset B mirror ($D018=$96, view rows 10-17 of buffer B): byte-reversed copy of charset B made by the loop at $B2C9. Holds characters $F8-$FF of the mirror set: character c here is source character $FF-c (i.e. $07..$00) with its 8 rows in reverse order, copied by the loop at $B2C9 each frame."
  },
  {
   "address": 24576,
   "type": "line",
   "text": "Screen buffer A row 0 = the status row, always displayed (rows 0-1 and 18-24 are shown from this buffer whichever view buffer is active): 7 wide-font score digits at cols 0-13 (drawn from score_bcd by $B8E1/$B8F0), 'L' + level digit at cols 18-21, 'E' + two enemy digits at cols 26-31 (from $8BA8 via $B8F0 at $9FA1/$A332), 'S' + shields digit at cols 36-39: the shield count exists only as the wide-digit code at $6026/$6027 ($80+2n; set to '4' at $9F8B, decremented by 2 at $ABDC, game over when it reaches $80). Initial contents = status_row_template ($8120). Runtime."
  },
  {
   "address": 24616,
   "type": "line",
   "text": "Screen buffer A row 1 (blank spacer between the status row and the view). Runtime."
  },
  {
   "address": 24656,
   "type": "line",
   "text": "Screen buffer A view row 2 (sky half, charset A): cleared to $00 by begin_frame ($B1AC) and filled with dynamically allocated character codes by draw_visible_objects. Runtime."
  },
  {
   "address": 24696,
   "type": "line",
   "text": "Screen buffer A view row 3 (sky half, charset A): cleared to $00 by begin_frame ($B1AC) and filled with dynamically allocated character codes by draw_visible_objects. Runtime."
  },
  {
   "address": 24736,
   "type": "line",
   "text": "Screen buffer A view row 4 (sky half, charset A): cleared to $00 by begin_frame ($B1AC) and filled with dynamically allocated character codes by draw_visible_objects. Runtime."
  },
  {
   "address": 24776,
   "type": "line",
   "text": "Screen buffer A view row 5 (sky half, charset A): cleared to $00 by begin_frame ($B1AC) and filled with dynamically allocated character codes by draw_visible_objects. Runtime."
  },
  {
   "address": 24816,
   "type": "line",
   "text": "Screen buffer A view row 6 (sky half, charset A): cleared to $00 by begin_frame ($B1AC) and filled with dynamically allocated character codes by draw_visible_objects. Runtime."
  },
  {
   "address": 24856,
   "type": "line",
   "text": "Screen buffer A view row 7 (sky half, charset A): cleared to $00 by begin_frame ($B1AC) and filled with dynamically allocated character codes by draw_visible_objects. Runtime."
  },
  {
   "address": 24896,
   "type": "line",
   "text": "Screen buffer A view row 8 (sky half, charset A): cleared to $00 by begin_frame ($B1AC) and filled with dynamically allocated character codes by draw_visible_objects. Runtime."
  },
  {
   "address": 24936,
   "type": "line",
   "text": "Screen buffer A view row 9 (sky half, charset A): cleared to $00 by begin_frame ($B1AC) and filled with dynamically allocated character codes by draw_visible_objects. Runtime."
  },
  {
   "address": 24976,
   "type": "line",
   "text": "Screen buffer A view row 10 (ground half, shown with the mirror charset $4800): written by finish_frame_mirror_ground as the EOR #$FF of view row 9, so it is the vertical reflection of the sky half. Runtime."
  },
  {
   "address": 25016,
   "type": "line",
   "text": "Screen buffer A view row 11 (ground half, shown with the mirror charset $4800): written by finish_frame_mirror_ground as the EOR #$FF of view row 8, so it is the vertical reflection of the sky half. Runtime."
  },
  {
   "address": 25056,
   "type": "line",
   "text": "Screen buffer A view row 12 (ground half, shown with the mirror charset $4800): written by finish_frame_mirror_ground as the EOR #$FF of view row 7, so it is the vertical reflection of the sky half. Runtime."
  },
  {
   "address": 25096,
   "type": "line",
   "text": "Screen buffer A view row 13 (ground half, shown with the mirror charset $4800): written by finish_frame_mirror_ground as the EOR #$FF of view row 6, so it is the vertical reflection of the sky half. Runtime."
  },
  {
   "address": 25136,
   "type": "line",
   "text": "Screen buffer A view row 14 (ground half, shown with the mirror charset $4800): written by finish_frame_mirror_ground as the EOR #$FF of view row 5, so it is the vertical reflection of the sky half. Runtime."
  },
  {
   "address": 25176,
   "type": "line",
   "text": "Screen buffer A view row 15 (ground half, shown with the mirror charset $4800): written by finish_frame_mirror_ground as the EOR #$FF of view row 4, so it is the vertical reflection of the sky half. Runtime."
  },
  {
   "address": 25216,
   "type": "line",
   "text": "Screen buffer A view row 16 (ground half, shown with the mirror charset $4800): written by finish_frame_mirror_ground as the EOR #$FF of view row 3, so it is the vertical reflection of the sky half. Runtime."
  },
  {
   "address": 25256,
   "type": "line",
   "text": "Screen buffer A view row 17 (ground half, shown with the mirror charset $4800): written by finish_frame_mirror_ground as the EOR #$FF of view row 2, so it is the vertical reflection of the sky half. Runtime."
  },
  {
   "address": 25296,
   "type": "line",
   "text": "Screen buffer A row 18: console panel (scanner, warning lights, frames) in charset $7800 codes $D0-$EF; initial contents = console_template row 18 at $8148. Runtime."
  },
  {
   "address": 25336,
   "type": "line",
   "text": "Screen buffer A row 19: console panel (scanner, warning lights, frames) in charset $7800 codes $D0-$EF; initial contents = console_template row 19 at $8170. Runtime."
  },
  {
   "address": 25376,
   "type": "line",
   "text": "Screen buffer A row 20: console panel (scanner, warning lights, frames) in charset $7800 codes $D0-$EF; initial contents = console_template row 20 at $8198. Runtime."
  },
  {
   "address": 25416,
   "type": "line",
   "text": "Screen buffer A row 21: console panel (scanner, warning lights, frames) in charset $7800 codes $D0-$EF; initial contents = console_template row 21 at $81C0. Runtime."
  },
  {
   "address": 25456,
   "type": "line",
   "text": "Screen buffer A row 22: console panel (scanner, warning lights, frames) in charset $7800 codes $D0-$EF; initial contents = console_template row 22 at $81E8. Runtime."
  },
  {
   "address": 25496,
   "type": "line",
   "text": "Screen buffer A row 23: console panel (scanner, warning lights, frames) in charset $7800 codes $D0-$EF; initial contents = console_template row 23 at $8210. Runtime."
  },
  {
   "address": 25536,
   "type": "line",
   "text": "Screen buffer A row 24: console panel (scanner, warning lights, frames) in charset $7800 codes $D0-$EF; initial contents = console_template row 24 at $8238. Runtime."
  },
  {
   "address": 25576,
   "type": "line",
   "text": "16 bytes past the last screen cell of buffer A (unused)."
  },
  {
   "address": 25592,
   "type": "line",
   "text": "Sprite pointers for screen buffer A: sprite 0 = $90 (player's shot dot at $6400, set at $9F2C), sprite 1 = $9C (gun sight at $6700), sprites 2-7 = backdrop frames written by position_backdrop_sprites at $B9F2 from backdrop_sprite_ptrs ($8F40)."
  },
  {
   "address": 25600,
   "type": "line",
   "text": "Sprite frame $90 (64 bytes): the player's shot, a 2x2-pixel dot at the top right (rows 0-1); sprite 0's image (pointer $90 at $63F8/$67F8), positioned from obj_vel_x/z of object 6 at $AB03-$AB21. Lives in the never-displayed rows 0-1 of screen buffer B; authored data (identical in the title snapshot)."
  },
  {
   "address": 25664,
   "type": "line",
   "text": "Rows 0-1 of screen buffer B ($6440-$644F): never displayed, unused."
  },
  {
   "address": 25680,
   "type": "line",
   "text": "Screen buffer B view row 2 (sky half, charset B, $D018=$94): cleared by begin_frame ($B1CE) and filled by draw_visible_objects on alternate frames. Runtime."
  },
  {
   "address": 25720,
   "type": "line",
   "text": "Screen buffer B view row 3 (sky half, charset B, $D018=$94): cleared by begin_frame ($B1CE) and filled by draw_visible_objects on alternate frames. Runtime."
  },
  {
   "address": 25760,
   "type": "line",
   "text": "Screen buffer B view row 4 (sky half, charset B, $D018=$94): cleared by begin_frame ($B1CE) and filled by draw_visible_objects on alternate frames. Runtime."
  },
  {
   "address": 25800,
   "type": "line",
   "text": "Screen buffer B view row 5 (sky half, charset B, $D018=$94): cleared by begin_frame ($B1CE) and filled by draw_visible_objects on alternate frames. Runtime."
  },
  {
   "address": 25840,
   "type": "line",
   "text": "Screen buffer B view row 6 (sky half, charset B, $D018=$94): cleared by begin_frame ($B1CE) and filled by draw_visible_objects on alternate frames. Runtime."
  },
  {
   "address": 25880,
   "type": "line",
   "text": "Screen buffer B view row 7 (sky half, charset B, $D018=$94): cleared by begin_frame ($B1CE) and filled by draw_visible_objects on alternate frames. Runtime."
  },
  {
   "address": 25920,
   "type": "line",
   "text": "Screen buffer B view row 8 (sky half, charset B, $D018=$94): cleared by begin_frame ($B1CE) and filled by draw_visible_objects on alternate frames. Runtime."
  },
  {
   "address": 25960,
   "type": "line",
   "text": "Screen buffer B view row 9 (sky half, charset B, $D018=$94): cleared by begin_frame ($B1CE) and filled by draw_visible_objects on alternate frames. Runtime."
  },
  {
   "address": 26000,
   "type": "line",
   "text": "Screen buffer B view row 10 (ground half, mirror charset $5800): EOR #$FF reflection of view row 9 written by the loop at $B27B. Runtime."
  },
  {
   "address": 26040,
   "type": "line",
   "text": "Screen buffer B view row 11 (ground half, mirror charset $5800): EOR #$FF reflection of view row 8 written by the loop at $B27B. Runtime."
  },
  {
   "address": 26080,
   "type": "line",
   "text": "Screen buffer B view row 12 (ground half, mirror charset $5800): EOR #$FF reflection of view row 7 written by the loop at $B27B. Runtime."
  },
  {
   "address": 26120,
   "type": "line",
   "text": "Screen buffer B view row 13 (ground half, mirror charset $5800): EOR #$FF reflection of view row 6 written by the loop at $B27B. Runtime."
  },
  {
   "address": 26160,
   "type": "line",
   "text": "Screen buffer B view row 14 (ground half, mirror charset $5800): EOR #$FF reflection of view row 5 written by the loop at $B27B. Runtime."
  },
  {
   "address": 26200,
   "type": "line",
   "text": "Screen buffer B view row 15 (ground half, mirror charset $5800): EOR #$FF reflection of view row 4 written by the loop at $B27B. Runtime."
  },
  {
   "address": 26240,
   "type": "line",
   "text": "Screen buffer B view row 16 (ground half, mirror charset $5800): EOR #$FF reflection of view row 3 written by the loop at $B27B. Runtime."
  },
  {
   "address": 26280,
   "type": "line",
   "text": "Screen buffer B view row 17 (ground half, mirror charset $5800): EOR #$FF reflection of view row 2 written by the loop at $B27B. Runtime."
  },
  {
   "address": 26320,
   "type": "line",
   "text": "Rows 18-19 of screen buffer B ($66D0-$66FF): never displayed (the console rows always come from buffer A) and never written; free space."
  },
  {
   "address": 26368,
   "type": "line",
   "text": "Sprite frame $9C: the gun sight, two 7-row brackets [ ] (sprite 1, pointer $9C, X/Y fixed at $9F31/$9F36, expanded per level record). Authored data kept in the never-displayed rows 20-21 of screen buffer B; identical in the title snapshot, so it is loaded, not copied here."
  },
  {
   "address": 26432,
   "type": "line",
   "text": "Sprite frame $9D: a 2-row horizontal bar (row 0 = 18 pixels wide, row 1 = 24). Used as backdrop variant $9D for sprites 5 and 7 (backdrop_sprite_ptrs). Authored data in rows 21-23 of buffer B."
  },
  {
   "address": 26496,
   "type": "line",
   "text": "Sprite frame $9E: a 10-pixel cap on top of three full 24-pixel rows (a flat-topped mound). Used as backdrop variant $9E for sprite 6. Authored data in rows 23-24 of buffer B."
  },
  {
   "address": 26560,
   "type": "line",
   "text": "Rows 24 tail of screen buffer B ($67C0-$67F7): never displayed, holds load residue."
  },
  {
   "address": 26616,
   "type": "line",
   "text": "Sprite pointers for screen buffer B ($D018=$94/$96): sprite 0 = $00 here (unused while buffer B is shown? left as loaded), sprite 1 = $9C gun sight, sprites 2-7 = backdrop frames written at $B9F5 in step with sprite_ptrs_a."
  },
  {
   "address": 26618,
   "type": "line",
   "text": "Sprite pointers 2-7 of screen buffer B: the scenery sprites. update_scenery_sprites ($B9A5) writes the same pointer to $63FA+n and $67FA+n so both screens show the same hills and clouds."
  },
  {
   "address": 26624,
   "type": "line",
   "text": "Title screen, a complete pre-built 1000-byte screen ($6800-$6BE7) in the wide font: ENCOUNTER logo in block glyphs, BY PAUL WOAKES, (c) 1984, NOVAGEN SOFTWARE, SCORE / LAST SCORE / HIGH SCORE with 7-digit values stamped in at runtime, EXPERT ADVANCED NOVICE, F5 <skill>, F7 BEGIN GAME. Shown by writing $AE to $D018. Alphabet in facts.md."
  },
  {
   "address": 26664,
   "type": "line",
   "text": "Title screen row 1: second row of the ENCOUNTER logo, built from console/fill codes $D0/$D1/$F0/$F2."
  },
  {
   "address": 26704,
   "type": "line",
   "text": "Title screen row 2 of the ENCOUNTER logo (fill codes)."
  },
  {
   "address": 26744,
   "type": "line",
   "text": "Title screen row 3 of the ENCOUNTER logo (fill codes)."
  },
  {
   "address": 26784,
   "type": "line",
   "text": "Title screen row 4, last row of the ENCOUNTER logo."
  },
  {
   "address": 26824,
   "type": "line",
   "text": "Title screen row 5, used as variables: $68C8 = saucer heading-choice threshold copied from $68C9 at game start ($9D6D/$9E99, compared with a random byte at $A6EF); $68C9 = its master value ($30); $68CA = save slot for the byte at $A000 during init ($9C07/$9C28); $68CB = compared with the level key value at $9CE3. Rest of the row is wide-font '0' codes."
  },
  {
   "address": 26825,
   "type": "line",
   "text": "Hidden variables in row 5 of the title screen: $68C9 the default heading-alignment chance copied to $68C8 at game start ($9D6A), $68CA a scratch byte the init used for the $A000 save, $68CB the highest level index reached this session, recorded by level_complete ($A798) and compared (with the branch patched out) at $9CE3."
  },
  {
   "address": 26826,
   "type": "line",
   "text": "$68CA: scratch byte where init_game parked the byte it read from $A000 before the page copy ($9C07), and $68CB: the highest level index reached in this session, written by level_complete ($A798) and compared at $9CE3 by the level-select code, whose branch on the result has been replaced by two NOPs. The rest of the row is blank cells."
  },
  {
   "address": 26827,
   "type": "line",
   "text": "Highest level index reached this session (level index form: $70 = level 1 down to $00 = level 8), written by level_complete at $A798 and read by the title loop at $9CE3, where the branch that once limited the number keys to levels already reached is two NOPs. Blank title cells follow to the end of row 5."
  },
  {
   "address": 26864,
   "type": "line",
   "text": "Title screen row 6: 'BY PAUL WOAKES' in the wide font."
  },
  {
   "address": 26904,
   "type": "line",
   "text": "25 colour values, one per title-screen row, stored inside row 7 of the title screen itself. reset_to_title_screen ($9DB7) fills each colour-RAM row with the matching byte; rows given colour 2 (the red background) hide the data rows 5, 7, 13 and 20-21 of the title screen."
  },
  {
   "address": 26929,
   "type": "line",
   "text": "8 key-matrix codes ($C5 values) for keys 8,7,6,5,4,3,2,1, in that order. The title loop at $9CD4 compares the current key against them with X from 7 down to 0; the index found is shifted left 4 (level*16) and stored in $A8, the level-select mechanic. Sits inside row 7 of the title screen."
  },
  {
   "address": 26937,
   "type": "line",
   "text": "Seven sprite colours for sprites 1-7, copied to $D028-$D02E at game start ($9F3B); stored inside row 7 of the title screen after the key table."
  },
  {
   "address": 26944,
   "type": "line",
   "text": "Title screen row 8: blank ($94 codes)."
  },
  {
   "address": 26984,
   "type": "line",
   "text": "Title screen row 9: '(c) 1984' in the wide font ($CE/$CF then $98/$99 (c))."
  },
  {
   "address": 27024,
   "type": "line",
   "text": "Title screen row 10: blank."
  },
  {
   "address": 27064,
   "type": "line",
   "text": "Title screen row 11: 'NOVAGEN SOFTWARE' in the wide font."
  },
  {
   "address": 27104,
   "type": "line",
   "text": "Title screen row 12: blank."
  },
  {
   "address": 27144,
   "type": "line",
   "text": "Seven 3-byte JMP $6A1D vectors sitting in title screen row 13, each called with JSR from a fixed point of the game: $6A08 from game over ($AC2A), $6A0B from $9DAA, $6A0E from the title loop ($9CBA), $6A11 from level start ($9E9F), $6A14 from $AB68, $6A17 from the main loop after the raster wait ($A18E), $6A1A from $AB9A. $6A1D is an RTS, so all seven are currently no-ops: a hook table whose original targets are unknown (possibly removed protection/loader calls)."
  },
  {
   "address": 27147,
   "type": "line",
   "text": "Second of the seven JMP $6A1D stubs (see hook_vectors_noop): $6A0B, $6A0E, $6A11, $6A14, $6A17 and $6A1A are all called from the game and all land on the RTS at $6A1D."
  },
  {
   "address": 27150,
   "type": "line",
   "text": "Third to seventh JMP $6A1D stubs ($6A0E, $6A11, $6A14, $6A17, $6A1A), each three bytes, called from the title loop, the title reset, the game start, the main loop's raster wait, the end of the pass and the death routine; every one lands on the RTS at $6A1D."
  },
  {
   "address": 27153,
   "type": "line",
   "text": "Stubs 3 to 6 of the seven: $6A11 (called from the game start at $9E9F), $6A14 (from the end of the pass at $AB68), $6A17 (from the raster wait at $A18E) and $6A1A. Each is JMP $6A1D, which is RTS, so the calls are no-ops in this build."
  },
  {
   "address": 27156,
   "type": "line",
   "text": "Stubs 4 to 6 ($6A14 from the end of the pass at $AB68, $6A17 from the raster wait at $A18E, $6A1A unreferenced), each JMP $6A1D to the RTS; no-ops in this build."
  },
  {
   "address": 27159,
   "type": "line",
   "text": "Stubs 5 and 6 ($6A17, called from the raster wait at $A18E every pass, and $6A1A, unreferenced): JMP $6A1D to the RTS. No-ops in this build."
  },
  {
   "address": 27165,
   "type": "line",
   "text": "RTS shared by the seven hook vectors above; the rest of row 13 is blank."
  },
  {
   "address": 27166,
   "type": "line",
   "text": "Eighteen blank cells ($94) that finish title-screen row 13 after the RTS at $6A1D. Never executed and never read; the colour table makes the row invisible."
  },
  {
   "address": 27184,
   "type": "line",
   "text": "Title screen row 14: blank."
  },
  {
   "address": 27224,
   "type": "line",
   "text": "Title screen row 15: 'SCORE........' followed by 7 wide digits."
  },
  {
   "address": 27250,
   "type": "line",
   "text": "The 14 cells (7 wide digits) after SCORE on the title screen: copied from the status row ($6000-$600D) at game over ($ABF9-$ABFC) after the previous value is moved down to title_last_score_digits."
  },
  {
   "address": 27264,
   "type": "line",
   "text": "Title screen row 16: blank."
  },
  {
   "address": 27304,
   "type": "line",
   "text": "Title screen row 17: 'LAST SCORE...' followed by 7 wide digits."
  },
  {
   "address": 27330,
   "type": "line",
   "text": "The 14 cells after LAST SCORE: receive the previous title_score_digits at game over ($ABF3-$ABF6)."
  },
  {
   "address": 27344,
   "type": "line",
   "text": "Title screen row 18: blank."
  },
  {
   "address": 27384,
   "type": "line",
   "text": "Title screen row 19: 'HIGH SCORE...' followed by 7 wide digits."
  },
  {
   "address": 27410,
   "type": "line",
   "text": "The 14 cells after HIGH SCORE: rewritten from the status row at $AC1D-$AC24 when the score beats high_score_bcd ($8BA4)."
  },
  {
   "address": 27424,
   "type": "line",
   "text": "Title screen rows 20-21: the three skill names in the wide font, 16 cells each: EXPERT at $6B20, ADVANCED at $6B30, NOVICE at $6B40 (the first 4 cells are blank). The F5 handler at $9D3F copies the 16 cells of skill ($62+1) into title_skill_slot."
  },
  {
   "address": 27464,
   "type": "line",
   "text": "Title screen row 21 after 'NOVICE': blank."
  },
  {
   "address": 27504,
   "type": "line",
   "text": "Title screen row 22: 'F5' then the current skill name slot."
  },
  {
   "address": 27528,
   "type": "line",
   "text": "16 cells in row 22 showing the selected skill name ('NOVICE' at start); rewritten by the F5 handler at $9D45 from title_skill_names_wide."
  },
  {
   "address": 27544,
   "type": "line",
   "text": "Title screen row 23: blank."
  },
  {
   "address": 27584,
   "type": "line",
   "text": "Title screen row 24: 'F7 BEGIN GAME' in the wide font. $6BE8-$6BFF past the screen: unused."
  },
  {
   "address": 27648,
   "type": "line",
   "text": "Game-over screen, a complete pre-built 1000-byte screen ($6C00-$6FE7): GAME OVER in the wide font on row 10, the rest sparse single-bit bytes (a starfield-like scatter). Shown by writing $BE to $D018."
  },
  {
   "address": 27712,
   "type": "line",
   "text": "Sprite frame $B1 ($6C40-$6C7F, rows 1-2 of the game-over screen): 6 scattered single pixels. Frames $B1-$B5 and $B7-$C9 are the dot/star frames used as backdrop sprites by the level-index-0 backdrop record at $9840 (pointers $B1-$C9 with Y $56/$44), giving a field of drifting points."
  },
  {
   "address": 27776,
   "type": "line",
   "text": "Sprite frame $B2 (rows 3-4 of the game-over screen): 4 scattered pixels; a backdrop dot frame (see sprite_dots_b1)."
  },
  {
   "address": 27840,
   "type": "line",
   "text": "Sprite frame $B3 (rows 4-6): 6 scattered pixels; backdrop dot frame."
  },
  {
   "address": 27904,
   "type": "line",
   "text": "Sprite frame $B4 (rows 6-8): 6 scattered pixels; backdrop dot frame."
  },
  {
   "address": 27968,
   "type": "line",
   "text": "Sprite frame $B5 (rows 8-9): 5 scattered pixels; backdrop dot frame."
  },
  {
   "address": 28032,
   "type": "line",
   "text": "Game-over screen row 9 tail and row 10 ($6D90-$6DB7): '  GAME  OVER' centred in the wide font between $D1 console-blank codes. As sprite frame $B6 this is garbage and it is not in any backdrop record."
  },
  {
   "address": 28096,
   "type": "line",
   "text": "Sprite frame $B7 (rows 11-12 of the game-over screen): 8 scattered pixels; backdrop dot frame (see sprite_dots_b1)."
  },
  {
   "address": 28160,
   "type": "line",
   "text": "Sprite frame $B8 (rows 12-14): 7 scattered pixels; backdrop dot frame."
  },
  {
   "address": 28224,
   "type": "line",
   "text": "Sprite frame $B9 (rows 14-16): 10 scattered pixels; backdrop dot frame."
  },
  {
   "address": 28288,
   "type": "line",
   "text": "Sprite frame $BA (rows 16-17): 5 scattered pixels; backdrop dot frame."
  },
  {
   "address": 28352,
   "type": "line",
   "text": "Sprite frame $BB (rows 17-19): 5 scattered pixels; backdrop dot frame."
  },
  {
   "address": 28416,
   "type": "line",
   "text": "Sprite frame $BC (rows 19-20): 7 scattered pixels; backdrop dot frame."
  },
  {
   "address": 28480,
   "type": "line",
   "text": "Sprite frame $BD (rows 21-22): 7 scattered pixels; backdrop dot frame."
  },
  {
   "address": 28544,
   "type": "line",
   "text": "Sprite frame $BE (rows 22-24): 5 scattered pixels; backdrop dot frame."
  },
  {
   "address": 28608,
   "type": "line",
   "text": "Sprite frame $BF (row 24 and the 24 bytes past the screen): 6 scattered pixels; backdrop dot frame."
  },
  {
   "address": 28672,
   "type": "line",
   "text": "Sprite frame $C0: 5-7 scattered single pixels, one of the ten dot/star frames $C0-$C9 used (with $B1-$BF) as backdrop sprites by the level-index-0 backdrop record at $9840. Not a character set: $D018 never selects $7000 (values used: $80/$82/$94/$96/$8E/$AE/$BE)."
  },
  {
   "address": 28736,
   "type": "line",
   "text": "Sprite frame $C1: 5-7 scattered single pixels, one of the ten dot/star frames $C0-$C9 used (with $B1-$BF) as backdrop sprites by the level-index-0 backdrop record at $9840. Not a character set: $D018 never selects $7000 (values used: $80/$82/$94/$96/$8E/$AE/$BE)."
  },
  {
   "address": 28800,
   "type": "line",
   "text": "Sprite frame $C2: 5-7 scattered single pixels, one of the ten dot/star frames $C0-$C9 used (with $B1-$BF) as backdrop sprites by the level-index-0 backdrop record at $9840. Not a character set: $D018 never selects $7000 (values used: $80/$82/$94/$96/$8E/$AE/$BE)."
  },
  {
   "address": 28864,
   "type": "line",
   "text": "Sprite frame $C3: 5-7 scattered single pixels, one of the ten dot/star frames $C0-$C9 used (with $B1-$BF) as backdrop sprites by the level-index-0 backdrop record at $9840. Not a character set: $D018 never selects $7000 (values used: $80/$82/$94/$96/$8E/$AE/$BE)."
  },
  {
   "address": 28928,
   "type": "line",
   "text": "Sprite frame $C4: 5-7 scattered single pixels, one of the ten dot/star frames $C0-$C9 used (with $B1-$BF) as backdrop sprites by the level-index-0 backdrop record at $9840. Not a character set: $D018 never selects $7000 (values used: $80/$82/$94/$96/$8E/$AE/$BE)."
  },
  {
   "address": 28992,
   "type": "line",
   "text": "Sprite frame $C5: 5-7 scattered single pixels, one of the ten dot/star frames $C0-$C9 used (with $B1-$BF) as backdrop sprites by the level-index-0 backdrop record at $9840. Not a character set: $D018 never selects $7000 (values used: $80/$82/$94/$96/$8E/$AE/$BE)."
  },
  {
   "address": 29056,
   "type": "line",
   "text": "Sprite frame $C6: 5-7 scattered single pixels, one of the ten dot/star frames $C0-$C9 used (with $B1-$BF) as backdrop sprites by the level-index-0 backdrop record at $9840. Not a character set: $D018 never selects $7000 (values used: $80/$82/$94/$96/$8E/$AE/$BE)."
  },
  {
   "address": 29120,
   "type": "line",
   "text": "Sprite frame $C7: 5-7 scattered single pixels, one of the ten dot/star frames $C0-$C9 used (with $B1-$BF) as backdrop sprites by the level-index-0 backdrop record at $9840. Not a character set: $D018 never selects $7000 (values used: $80/$82/$94/$96/$8E/$AE/$BE)."
  },
  {
   "address": 29184,
   "type": "line",
   "text": "Sprite frame $C8: 5-7 scattered single pixels, one of the ten dot/star frames $C0-$C9 used (with $B1-$BF) as backdrop sprites by the level-index-0 backdrop record at $9840. Not a character set: $D018 never selects $7000 (values used: $80/$82/$94/$96/$8E/$AE/$BE)."
  },
  {
   "address": 29248,
   "type": "line",
   "text": "Sprite frame $C9: 5-7 scattered single pixels, one of the ten dot/star frames $C0-$C9 used (with $B1-$BF) as backdrop sprites by the level-index-0 backdrop record at $9840. Not a character set: $D018 never selects $7000 (values used: $80/$82/$94/$96/$8E/$AE/$BE)."
  },
  {
   "address": 29312,
   "type": "line",
   "text": "Sprite frame $CA: the saucer disc, largest size (9 rows, full 24 pixels wide). Backdrop variant for sprite 3 (record byte $CA) and the live saucer image seen on sprite 3."
  },
  {
   "address": 29376,
   "type": "line",
   "text": "Sprite frame $CB: saucer disc, large, with an uneven/broken outline (9 rows) - the damaged or alternate-phase large saucer."
  },
  {
   "address": 29440,
   "type": "line",
   "text": "Sprite frame $CC: saucer disc, medium (6 rows)."
  },
  {
   "address": 29504,
   "type": "line",
   "text": "Sprite frame $CD: saucer disc, medium, uneven outline (6 rows)."
  },
  {
   "address": 29568,
   "type": "line",
   "text": "Sprite frame $CE: tall saucer with a dome on top (11 rows)."
  },
  {
   "address": 29632,
   "type": "line",
   "text": "Sprite frame $CF: a full 24x20 filled circle (sphere). Not in any backdrop record found; candidate for the warp-phase spheres or the sun (unknown)."
  },
  {
   "address": 29696,
   "type": "line",
   "text": "Sprite frame $D0: dense pseudo-random dither over all 21 rows, one of 12 such frames $D0-$DB (cloud-of-fire / explosion or warp static; which is unknown, no pointer write to $D0-$DB found yet)."
  },
  {
   "address": 29760,
   "type": "line",
   "text": "Sprite frame $D1: dense pseudo-random dither over all 21 rows, one of 12 such frames $D0-$DB (cloud-of-fire / explosion or warp static; which is unknown, no pointer write to $D0-$DB found yet)."
  },
  {
   "address": 29824,
   "type": "line",
   "text": "Sprite frame $D2: dense pseudo-random dither over all 21 rows, one of 12 such frames $D0-$DB (cloud-of-fire / explosion or warp static; which is unknown, no pointer write to $D0-$DB found yet)."
  },
  {
   "address": 29888,
   "type": "line",
   "text": "Sprite frame $D3: dense pseudo-random dither over all 21 rows, one of 12 such frames $D0-$DB (cloud-of-fire / explosion or warp static; which is unknown, no pointer write to $D0-$DB found yet)."
  },
  {
   "address": 29952,
   "type": "line",
   "text": "Sprite frame $D4: dense pseudo-random dither over all 21 rows, one of 12 such frames $D0-$DB (cloud-of-fire / explosion or warp static; which is unknown, no pointer write to $D0-$DB found yet)."
  },
  {
   "address": 30016,
   "type": "line",
   "text": "Sprite frame $D5: dense pseudo-random dither over all 21 rows, one of 12 such frames $D0-$DB (cloud-of-fire / explosion or warp static; which is unknown, no pointer write to $D0-$DB found yet)."
  },
  {
   "address": 30080,
   "type": "line",
   "text": "Sprite frame $D6: dense pseudo-random dither over all 21 rows, one of 12 such frames $D0-$DB (cloud-of-fire / explosion or warp static; which is unknown, no pointer write to $D0-$DB found yet)."
  },
  {
   "address": 30144,
   "type": "line",
   "text": "Sprite frame $D7: dense pseudo-random dither over all 21 rows, one of 12 such frames $D0-$DB (cloud-of-fire / explosion or warp static; which is unknown, no pointer write to $D0-$DB found yet)."
  },
  {
   "address": 30208,
   "type": "line",
   "text": "Sprite frame $D8: dense pseudo-random dither over all 21 rows, one of 12 such frames $D0-$DB (cloud-of-fire / explosion or warp static; which is unknown, no pointer write to $D0-$DB found yet)."
  },
  {
   "address": 30272,
   "type": "line",
   "text": "Sprite frame $D9: dense pseudo-random dither over all 21 rows, one of 12 such frames $D0-$DB (cloud-of-fire / explosion or warp static; which is unknown, no pointer write to $D0-$DB found yet)."
  },
  {
   "address": 30336,
   "type": "line",
   "text": "Sprite frame $DA: dense pseudo-random dither over all 21 rows, one of 12 such frames $D0-$DB (cloud-of-fire / explosion or warp static; which is unknown, no pointer write to $D0-$DB found yet)."
  },
  {
   "address": 30400,
   "type": "line",
   "text": "Sprite frame $DB: dense pseudo-random dither over all 21 rows, one of 12 such frames $D0-$DB (cloud-of-fire / explosion or warp static; which is unknown, no pointer write to $D0-$DB found yet)."
  },
  {
   "address": 30464,
   "type": "line",
   "text": "Sprite frame $DC: a single 8-pixel bar in row 0, rest blank. Use unknown."
  },
  {
   "address": 30528,
   "type": "line",
   "text": "Sprite frame $DD: all zero (blank sprite)."
  },
  {
   "address": 30592,
   "type": "line",
   "text": "Sprite frame $DE: one pixel at row 0, column 13, rest blank. Use unknown."
  },
  {
   "address": 30656,
   "type": "line",
   "text": "Sprite frame $DF: all zero (blank sprite)."
  },
  {
   "address": 30720,
   "type": "line",
   "text": "Character set 1 at $7800 ($D018 = $8F/$AE/$BE): the small font (digits $00-$09, space $0A, full stop $0B, (c) $0C, A-Z at $0D-$26), scenery patterns $28-$7F, the double-width status font ($80-$CF: digit n at $80+2n, letter n at $9A+2n, each a left/right glyph pair), console panel pieces $D0-$EF and logo fills $F0-$FF. Table in facts.md."
  },
  {
   "address": 30784,
   "type": "line",
   "text": "Charset $7800, glyphs $08-$0F: digits 8-9, $0A space, $0B full stop, $0C (c), $0D-$0F letters A-C."
  },
  {
   "address": 30848,
   "type": "line",
   "text": "Charset $7800, glyphs $10-$17: letters D-K."
  },
  {
   "address": 30912,
   "type": "line",
   "text": "Charset $7800, glyphs $18-$1F: letters L-S."
  },
  {
   "address": 30976,
   "type": "line",
   "text": "Charset $7800, glyphs $20-$27: letters T-Z and $27 a right-hand vertical bar."
  },
  {
   "address": 31040,
   "type": "line",
   "text": "Charset $7800, glyphs $28-$2F: $28 a horizontal line (horizon), $29-$2E cloud/noise textures, $2F blank."
  },
  {
   "address": 31104,
   "type": "line",
   "text": "Charset $7800, glyphs $30-$37: $30-$33 blank, $34-$37 solid/edge blocks. Bytes $7980-$79BF also serve as sprite frame $E6 (a 24x11 oval, backdrop variant for sprites 4 and 5)."
  },
  {
   "address": 31168,
   "type": "line",
   "text": "Charset $7800, glyphs $38-$3F: $38-$3C blank, $3D-$3F fine checker dithers."
  },
  {
   "address": 31232,
   "type": "line",
   "text": "Charset $7800, glyphs $40-$47: $40-$43 blank, $44 a thin diagonal, $45-$47 dither patterns."
  },
  {
   "address": 31296,
   "type": "line",
   "text": "Charset $7800, glyphs $48-$4F: mostly blank; $4B a single pixel, $4C a line, $4D-$4F dither patterns."
  },
  {
   "address": 31360,
   "type": "line",
   "text": "Charset $7800, glyphs $50-$57: $50-$54 blank, $55-$57 dither/diagonal fragments."
  },
  {
   "address": 31424,
   "type": "line",
   "text": "Charset $7800, glyphs $58-$5F: $58-$5A blank, $5B a single pixel, $5C-$5F dither/diagonal fragments."
  },
  {
   "address": 31488,
   "type": "line",
   "text": "Charset $7800, glyphs $60-$67: mostly blank, $66-$67 dither fragments. Bytes $7B00-$7B3F double as sprite frame $EC (a dotted hill outline, backdrop variant for sprite 2)."
  },
  {
   "address": 31552,
   "type": "line",
   "text": "Charset $7800, glyphs $68-$6F: mostly blank, $6E-$6F dither fragments. $7B40-$7B7F = sprite frame $ED (dotted hill, sprite 2 variant)."
  },
  {
   "address": 31616,
   "type": "line",
   "text": "Charset $7800, glyphs $70-$77: mostly blank, $76-$77 dither fragments. $7B80-$7BBF = sprite frame $EE (dotted hill, sprite 2 variant)."
  },
  {
   "address": 31680,
   "type": "line",
   "text": "Charset $7800, glyphs $78-$7F: mostly blank, $7E-$7F dither fragments. $7BC0-$7BFF = sprite frame $EF (dotted hill, sprite 2 variant)."
  },
  {
   "address": 31744,
   "type": "line",
   "text": "Charset $7800, glyphs $80-$87: wide-font digits 0-3, two cells per digit (left half at even code, right half at odd)."
  },
  {
   "address": 31808,
   "type": "line",
   "text": "Charset $7800, glyphs $88-$8F: wide-font digits 4-7."
  },
  {
   "address": 31872,
   "type": "line",
   "text": "Charset $7800, glyphs $90-$97: wide-font digits 8-9, $94 blank cell, $96/$97 the dotted leader used in 'SCORE....'."
  },
  {
   "address": 31936,
   "type": "line",
   "text": "Charset $7800, glyphs $98-$9F: $98/$99 wide (c), $9A/$9B wide A, $9C/$9D wide B, $9E/$9F wide C."
  },
  {
   "address": 32000,
   "type": "line",
   "text": "Charset $7800, glyphs $A0-$A7: wide letters D, E, F, G."
  },
  {
   "address": 32064,
   "type": "line",
   "text": "Charset $7800, glyphs $A8-$AF: wide letters H, I, J, K."
  },
  {
   "address": 32128,
   "type": "line",
   "text": "Charset $7800, glyphs $B0-$B7: wide letters L, M, N, O."
  },
  {
   "address": 32192,
   "type": "line",
   "text": "Charset $7800, glyphs $B8-$BF: wide letters P, Q, R, S."
  },
  {
   "address": 32256,
   "type": "line",
   "text": "Charset $7800, glyphs $C0-$C7: wide letters T, U, V, W."
  },
  {
   "address": 32320,
   "type": "line",
   "text": "Charset $7800, glyphs $C8-$CF: wide letters X, Y, Z ($C8-$CD), $CE blank, $CF a vertical bar."
  },
  {
   "address": 32384,
   "type": "line",
   "text": "Charset $7800, glyphs $D0-$D7: console panel pieces: $D0 solid, $D1 blank, $D2/$D3 diagonal corners, $D4 top half, $D5 diagonal, $D6/$D7 bottom half."
  },
  {
   "address": 32448,
   "type": "line",
   "text": "Charset $7800, glyphs $D8-$DF: console corners and thin frame lines (the scanner and warning-light frames)."
  },
  {
   "address": 32512,
   "type": "line",
   "text": "Charset $7800, glyphs $E0-$E7: frame lines and part-height blocks for the console."
  },
  {
   "address": 32576,
   "type": "line",
   "text": "Charset $7800, glyphs $E8-$EF: rounded block corners for the console lights."
  },
  {
   "address": 32640,
   "type": "line",
   "text": "Charset $7800, glyphs $F0-$F7: $F0-$F3 diagonal fills (ENCOUNTER logo edges), $F4-$F7 solid."
  },
  {
   "address": 32704,
   "type": "line",
   "text": "Charset $7800, glyphs $F8-$FF: solid fill cells (ENCOUNTER logo)."
  },
  {
   "address": 32768,
   "type": "line",
   "text": "Fake cartridge header for reset protection: cold-start vector $9C3E, warm-start vector $9C3E (written by init at $9C30-$9C3B), then the 'CBM80' autostart signature at $8004. The KERNAL reset sees CBM80 at $8004 and jumps through $8000, so RESET restarts the game at $9C3E (jsr $FF84 onward) instead of dropping to BASIC. $8009-$800F unused."
  },
  {
   "address": 32769,
   "type": "line",
   "text": "High byte of the RESET vector ($9C3E), then the warm-start vector $9C3E again at $8002-$8003, then the CBM80 signature at $8004-$8008 (PETSCII C3 C2 CD 38 30) that makes the KERNAL honour them."
  },
  {
   "address": 32770,
   "type": "line",
   "text": "Warm-start (RESTORE) vector, also $9C3E, so RESTORE and RESET behave the same; followed by the CBM80 signature at $8004."
  },
  {
   "address": 32771,
   "type": "line",
   "text": "High byte ($9C) of the warm-start vector; the CBM80 signature begins at the next byte."
  },
  {
   "address": 32784,
   "type": "line",
   "text": "Level display record for level index 0 ($63=$00, key 8 = level 8): 16 bytes copied to zero page $AB-$BA by load_level_display ($B920, Y = $63|$0F downward). +0 -> $AB, +1 -> $AC -> $BB (sky colour, $D021 in IRQ stage 1), +2 -> $AD (ground colour, $D021 at line 130), +3 -> $AE, +4 -> $AF = $D01D sprite X-expand, +5 -> $B0 = $D017 Y-expand, +6 -> $B1 = $D015 sprite enable, +7 -> $B2 -> $BC, +8 -> $B3 -> $BD, +9 -> $B4 -> $BE (horizon band colours), +10..+15 unused."
  },
  {
   "address": 32800,
   "type": "line",
   "text": "Level display record for level index 1 ($63=$10, level 7) (layout as level_display_records)."
  },
  {
   "address": 32816,
   "type": "line",
   "text": "Level display record for level index 2 ($63=$20, level 6) (layout as level_display_records)."
  },
  {
   "address": 32832,
   "type": "line",
   "text": "Level display record for level index 3 ($63=$30, level 5) (layout as level_display_records)."
  },
  {
   "address": 32848,
   "type": "line",
   "text": "Level display record for level index 4 ($63=$40, level 4) (layout as level_display_records)."
  },
  {
   "address": 32864,
   "type": "line",
   "text": "Level display record for level index 5 ($63=$50, level 3) (layout as level_display_records)."
  },
  {
   "address": 32880,
   "type": "line",
   "text": "Level display record for level index 6 ($63=$60, level 2) (layout as level_display_records)."
  },
  {
   "address": 32896,
   "type": "line",
   "text": "Level display record for level index 7 ($63=$70, level 1: the record in use in the play snapshot) (layout as level_display_records)."
  },
  {
   "address": 32912,
   "type": "line",
   "text": "Level display record for level index 8 ($63=$80, sign bit set so load_level_display skips the backdrop-sprite load; which phase uses it is unknown) (layout as level_display_records)."
  },
  {
   "address": 32928,
   "type": "line",
   "text": "Voice 3 pitch sequence for the missile whine: $D40F high bytes stepped once per frame by irq_frame_tick_voice3 ($B44E-$B45C): $49 = position, wraps to $48 when a 0 is met ($48 = 0 turns the effect off). Sequence at +0: 40 30 20 30; a second sequence at +$10: 40 38 30 28 20 28 30 38 (reached with $48 = $10)."
  },
  {
   "address": 32960,
   "type": "line",
   "text": "8 entries indexed by the engine state bits at $A235-$A243 (($6D>>1)&$6D&5, +2 if $1C = 0) giving $93 = start index into voice1_pitch_loop (1 = sequence running, 0 = voice 1 gated off at $B441)."
  },
  {
   "address": 32968,
   "type": "line",
   "text": "Voice 1 frequency-high sequence for the engine/noise sound stepped by irq_frame_tick_voice1 ($B42C-$B43C): $94 = position, 0 = wrap to $93. Bytes: 00 08 FF 00 00 00 F0 F0 C0 ... (from index 1: 08, FF alternating). $80D0-$80FF: a descending series C0/80/40/20/10/08 at 8-byte spacing and $0F at $80FF, not referenced by any code found."
  },
  {
   "address": 33024,
   "type": "line",
   "text": "32 zero bytes, unreferenced."
  },
  {
   "address": 33056,
   "type": "line",
   "text": "40-byte template of the status row in the wide font: '0000000    L1    E25    S4' (digit pairs $80+2n, letters $9A+2n, $D1 blanks). Identical layout to the live status row at $6000. No code reference found: the play screen already holds a copy when the game loads, so this is either the source of a copy made by code not yet disassembled or a build-time duplicate."
  },
  {
   "address": 33096,
   "type": "line",
   "text": "Console panel template, screen row 18 (40 cells of charset $7800 codes $D0-$EF: scanner frame top and light frames). Byte-identical to screen row 18 at $62D0 in the play snapshot; no code reference found (see status_row_template)."
  },
  {
   "address": 33136,
   "type": "line",
   "text": "Console panel template, screen row 19 (40 cells of charset $7800 codes $D0-$EF: light interiors and scanner rim). Byte-identical to screen row 19 at $62F8 in the play snapshot; no code reference found (see status_row_template)."
  },
  {
   "address": 33176,
   "type": "line",
   "text": "Console panel template, screen row 20 (40 cells of charset $7800 codes $D0-$EF: scanner middle row). Byte-identical to screen row 20 at $6320 in the play snapshot; no code reference found (see status_row_template)."
  },
  {
   "address": 33216,
   "type": "line",
   "text": "Console panel template, screen row 21 (40 cells of charset $7800 codes $D0-$EF: scanner middle row). Byte-identical to screen row 21 at $6348 in the play snapshot; no code reference found (see status_row_template)."
  },
  {
   "address": 33256,
   "type": "line",
   "text": "Console panel template, screen row 22 (40 cells of charset $7800 codes $D0-$EF: scanner lower rim and lights). Byte-identical to screen row 22 at $6370 in the play snapshot; no code reference found (see status_row_template)."
  },
  {
   "address": 33296,
   "type": "line",
   "text": "Console panel template, screen row 23 (40 cells of charset $7800 codes $D0-$EF: frame bottoms). Byte-identical to screen row 23 at $6398 in the play snapshot; no code reference found (see status_row_template)."
  },
  {
   "address": 33336,
   "type": "line",
   "text": "Console panel template, screen row 24 (40 cells of charset $7800 codes $D0-$EF: panel base). Byte-identical to screen row 24 at $63C0 in the play snapshot; no code reference found (see status_row_template)."
  },
  {
   "address": 33376,
   "type": "line",
   "text": "Object X position, high byte. Objects 0-31 (0 = player, 1/4/5 = enemy slots, 2 = warp-gate reference, 3 = saucer sprite object, 6 = player's shot, 7 = second sprite object, 8-23 = enemy shots, 24-31 = explosion/short-lived objects). Cleared at level start ($9E4D), player set to $10 ($9E8C); advanced by advance_object_position ($B67C); read by object_delta ($B6AF/$B6B2) for every range/bearing computation."
  },
  {
   "address": 33378,
   "type": "line",
   "text": "Entry 2 of obj_pos_x_hi (table at $8260): the slot for the current enemy (saucer or missile), addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 33379,
   "type": "line",
   "text": "Entry 3 of obj_pos_x_hi (table at $8260): the slot for the stargate, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 33383,
   "type": "line",
   "text": "Entry 7 of obj_pos_x_hi (table at $8260): the slot for the warp-in flash, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 33408,
   "type": "line",
   "text": "X position high byte of the 64 obelisks, object numbers 32-95 (ids $20-$5F as stored in obelisk_grid_map). Read through Y by object_delta ($B6B2) when the grid lookup at $AC4F names an obelisk; not cleared at level start."
  },
  {
   "address": 33472,
   "type": "line",
   "text": "Object X position, low byte (fraction below it in obj_pos_x_frac $15C0). Objects 0-31; cleared $9E50, advanced at $B670."
  },
  {
   "address": 33474,
   "type": "line",
   "text": "Entry 2 of obj_pos_x_lo (table at $82C0): the slot for the current enemy (saucer or missile), addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 33475,
   "type": "line",
   "text": "Entry 3 of obj_pos_x_lo (table at $82C0): the slot for the stargate, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 33479,
   "type": "line",
   "text": "Entry 7 of obj_pos_x_lo (table at $82C0): the slot for the warp-in flash, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 33504,
   "type": "line",
   "text": "X position low byte of obelisks 32-95."
  },
  {
   "address": 33568,
   "type": "line",
   "text": "Object Z (depth) position, high byte. Objects 0-31; player set to $10 at $9E8F; advanced at $B69E; grid cell for collision = (X_hi+8)&$F0 | (Z_hi+8)>>4 at $AC37-$AC4D."
  },
  {
   "address": 33570,
   "type": "line",
   "text": "Entry 2 of obj_pos_z_hi (table at $8320): the slot for the current enemy (saucer or missile), addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 33571,
   "type": "line",
   "text": "Entry 3 of obj_pos_z_hi (table at $8320): the slot for the stargate, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 33575,
   "type": "line",
   "text": "Entry 7 of obj_pos_z_hi (table at $8320): the slot for the warp-in flash, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 33600,
   "type": "line",
   "text": "Z position high byte of obelisks 32-95."
  },
  {
   "address": 33664,
   "type": "line",
   "text": "Object Z position, low byte. Objects 0-31; advanced at $B692."
  },
  {
   "address": 33666,
   "type": "line",
   "text": "Entry 2 of obj_pos_z_lo (table at $8380): the slot for the current enemy (saucer or missile), addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 33667,
   "type": "line",
   "text": "Entry 3 of obj_pos_z_lo (table at $8380): the slot for the stargate, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 33671,
   "type": "line",
   "text": "Entry 7 of obj_pos_z_lo (table at $8380): the slot for the warp-in flash, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 33696,
   "type": "line",
   "text": "Z position low byte of obelisks 32-95."
  },
  {
   "address": 33760,
   "type": "line",
   "text": "Per-object state/lifetime, objects 0-31: 0 = slot free, $FF = permanent (player $83E0, saucer $83E3 at $A2A3, missile $83E2 at $A3CE), otherwise a pass count decremented by tick_object_lifetimes ($B59A) - enemy shots start at $30 ($A9D9), spawned slots at $18 ($ACF0). $83F8 (object 24, the explosion) drives the explosion colour ($A14F-$A15D) and the voice-3 crackle. Cleared at $9FC4."
  },
  {
   "address": 33762,
   "type": "line",
   "text": "Entry 2 of obj_state (table at $83E0): the slot for the current enemy (saucer or missile), addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 33763,
   "type": "line",
   "text": "Entry 3 of obj_state (table at $83E0): the slot for the stargate, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 33767,
   "type": "line",
   "text": "Entry 7 of obj_state (table at $83E0): the slot for the warp-in flash, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 33784,
   "type": "line",
   "text": "Entry 24 of obj_state (table at $83E0): the slot for explosion fragment 0, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 33792,
   "type": "line",
   "text": "64 bytes of $FF after obj_state (objects 32-95 would fall here but obelisks have no state); unreferenced."
  },
  {
   "address": 33856,
   "type": "line",
   "text": "Per-object type byte, objects 0-31: bits 7-5 = shape family OR'd with view_size_step to select the shape number ($B878-$B87D; $E0 = drawn as a sprite via $BA04), bits 1-0 = attribute read at $B89A. Loaded: 21 21 42 E2 21 21 21 E1, 22 x12, 23, 22 x3, A2 82 A2 C2 A2 82 A2 C2. $8442 (saucer/missile object 2) is rewritten to $62 (missile, $A3BC) or $42 (saucer, $A444); enemy shots copy $8448 ($A9B4)."
  },
  {
   "address": 33858,
   "type": "line",
   "text": "Entry 2 of obj_type (table at $8440): the slot for the current enemy (saucer or missile), addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 33864,
   "type": "line",
   "text": "Entry 8 of obj_type (table at $8440): the slot for enemy shot / warp sphere slot 8, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 33880,
   "type": "line",
   "text": "Entry 24 of obj_type (table at $8440): the slot for explosion fragment 0, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 33884,
   "type": "line",
   "text": "Entry 28 of obj_type (table at $8440): the slot for explosion fragment 4, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 33888,
   "type": "line",
   "text": "32 bytes set to 3 per object at level start ($9FC9); no reader found yet (unknown)."
  },
  {
   "address": 33920,
   "type": "line",
   "text": "32 bytes set to 3 per object at level start ($9FCC); no reader found yet (unknown)."
  },
  {
   "address": 33952,
   "type": "line",
   "text": "Per-object heading, high part: bits 2-0 = octant (0-7) of the 11-bit heading whose low 8 bits are obj_heading_fine. Player = $84A0 (turned by turn_player_left/right with carry from $84C0, $B4E8/$B500). Bit 2 selects the sign of the X velocity, bit 1 swaps sine/cosine ($B5B8-$B5C5). Copied into new slots at $ACF8/$A952."
  },
  {
   "address": 33954,
   "type": "line",
   "text": "Entry 2 of obj_heading_octant (table at $84A0): the slot for the current enemy (saucer or missile), addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 33958,
   "type": "line",
   "text": "Entry 6 of obj_heading_octant (table at $84A0): the slot for the radar conversion marker, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 33984,
   "type": "line",
   "text": "Per-object heading, low 8 bits (fine angle). Player = $84C0, advanced by the turn rate $23/$24 (from tbl_skill_turn_rate) each pass while turning. Together with obj_heading_octant it indexes quarter_sine_tbl in compute_object_velocity ($B5A1-$B5A9)."
  },
  {
   "address": 33985,
   "type": "line",
   "text": "Entry 1 of obj_heading_fine (table at $84C0): the slot for player shot slot 1, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 33986,
   "type": "line",
   "text": "Entry 2 of obj_heading_fine (table at $84C0): the slot for the current enemy (saucer or missile), addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 33990,
   "type": "line",
   "text": "Entry 6 of obj_heading_fine (table at $84C0): the slot for the radar conversion marker, addressed directly by the code that handles it rather than through an index."
  },
  {
   "address": 34016,
   "type": "line",
   "text": "Three 8-byte skill names in the small font, indexed by skill $62 (0 EXPERT, 1 ADVANCED, 2 NOVICE): \"  EXPERT\" at $84E0, \"ADVANCED\" at $84E8, \"  NOVICE\" at $84F0. The title screen shows the wide-font copies at $6B20 instead; no reader of this small-font copy was found."
  },
  {
   "address": 34040,
   "type": "line",
   "text": "8 bytes after the skill names (C3 C2 04 16 14 0E 00 41): unreferenced, meaning unknown."
  },
  {
   "address": 34048,
   "type": "line",
   "text": "Reciprocal table: entry y = 65536/(256+y) i.e. 256/(1+y/256), from $FF down to $80. Used by bearing_from_viewer at $B741 (Y = normalised larger delta) to multiply the smaller delta by 1/larger with mul8x8, giving the ratio that atan_tbl converts to an angle. Entries 0-63: $FF..$CD (ratios 1.0..0.8)."
  },
  {
   "address": 34112,
   "type": "line",
   "text": "Entries 64-127: $CC..$AA of reciprocal_tbl."
  },
  {
   "address": 34176,
   "type": "line",
   "text": "Entries 128-191: $AA..$92 of reciprocal_tbl."
  },
  {
   "address": 34240,
   "type": "line",
   "text": "Entries 192-255: $92..$80 of reciprocal_tbl."
  },
  {
   "address": 34304,
   "type": "line",
   "text": "Arctangent table over one octant: entry r (r = small/large delta ratio x 256) = angle 0-255 within the octant; read at $B754 by bearing_from_viewer, mirrored with EOR #$FF when the octant is odd ($B759), then combined with the octant bits from object_delta_octant ($2A) into the 11-bit bearing. Entries 0-63: $00..$4F (near-linear start of atan_tbl)."
  },
  {
   "address": 34368,
   "type": "line",
   "text": "Entries 64-127: $50..$96 of atan_tbl."
  },
  {
   "address": 34432,
   "type": "line",
   "text": "Entries 128-191: $97..$D1 of atan_tbl."
  },
  {
   "address": 34496,
   "type": "line",
   "text": "Entries 192-255: $D2..$FF of atan_tbl (flattening toward 45 degrees)."
  },
  {
   "address": 34560,
   "type": "line",
   "text": "16x16 hypotenuse table: index = (|dz| high nibble)<<4 | (|dx| high nibble), value = approximate sqrt(dx^2+dz^2) in units of 16 (1 at [0,0] to $17 at [15,15]). Read at $B77B by range_code_from_delta (Y built at $B766-$B774), added to $2B<<4 to make view_range_code. Rows 0-3 (|dz| nibble 0-3) of hypot_tbl."
  },
  {
   "address": 34624,
   "type": "line",
   "text": "Rows 4-7 of hypot_tbl."
  },
  {
   "address": 34688,
   "type": "line",
   "text": "Rows 8-11 of hypot_tbl."
  },
  {
   "address": 34752,
   "type": "line",
   "text": "Rows 12-15 of hypot_tbl."
  },
  {
   "address": 34816,
   "type": "line",
   "text": "Range code -> size step: 0 for codes below $91 (closest: drawn full size), rising 1..$1F up to code $E7, $FF (bit 7 = too far, dropped from the view list at $B822) from $E8 on. Read at $B81C by scan_visible_objects, stored in view_size_step. Codes 0-63: all 0 (object at or inside the nearest size step)."
  },
  {
   "address": 34880,
   "type": "line",
   "text": "Codes 64-127: all 0."
  },
  {
   "address": 34944,
   "type": "line",
   "text": "Codes 128-191: 0 up to $90, then 1..$1F rising by one every 1-2 codes."
  },
  {
   "address": 35008,
   "type": "line",
   "text": "Codes 192-255: $15..$1F, then $FF from code $E8 (beyond drawing range)."
  },
  {
   "address": 35072,
   "type": "line",
   "text": "Quarter-wave sine, 256 entries: sin(i/256 x 90 deg) x 255. compute_object_velocity reads sin at Y = heading>>3 ($B5AA) and cos at 255-Y ($B5B3), swapped when heading bit 1 is set. Entries 0-63: 0..$60 (sine near 0 degrees, nearly linear)."
  },
  {
   "address": 35136,
   "type": "line",
   "text": "Entries 64-127: $62..$B4 of quarter_sine_tbl."
  },
  {
   "address": 35200,
   "type": "line",
   "text": "Entries 128-191: $B5..$EB of quarter_sine_tbl."
  },
  {
   "address": 35264,
   "type": "line",
   "text": "Entries 192-255: $EC..$FF of quarter_sine_tbl (near 90 degrees)."
  },
  {
   "address": 35328,
   "type": "line",
   "text": "16x16 map of the playfield, index = X_hi&$F0 | Z_hi>>4 (cell = 16x16 position units): 0 = empty, otherwise the object number ($20-$5F) of the obelisk standing there. 64 obelisks on every other row and column (even/even cells) in a fixed pattern. Read at $AC4F by move_object_with_obstacles: a hit cell names the obelisk whose exact position is compared against tolerance $4F before the move is undone. Rows 0-3 (X high nibble 0-3) of obelisk_grid_map: obelisks $50,$58,$20,$28,$30,$38,$40,$48 on row 0 and $51.. on row 2."
  },
  {
   "address": 35392,
   "type": "line",
   "text": "Rows 4-7 of obelisk_grid_map (obelisks $52-$5A.., $53-$5B..)."
  },
  {
   "address": 35456,
   "type": "line",
   "text": "Rows 8-11 of obelisk_grid_map."
  },
  {
   "address": 35520,
   "type": "line",
   "text": "Rows 12-15 of obelisk_grid_map."
  },
  {
   "address": 35584,
   "type": "line",
   "text": "160-byte initial image of zero page $02-$A1: copied to $02+X (X = $9F..1) by init at $9C43 and again at every game start at $9E82, so every zero-page variable restarts from these values. This block: $02-$41 (e.g. $08 pass counter (bit 0 picks the draw buffer), $09/$0A char-definition page and screen-row limit, $1A = $94 view $D018 base, $23-$25 turn rates, $3B/$3C, $3E)."
  },
  {
   "address": 35648,
   "type": "line",
   "text": "zero_page_image bytes for $42-$81: e.g. $4C=$1F, $4D=$26, $63=$70 (level index), $68=$50 player speed, $6D, $75, $7A, $7C=$60."
  },
  {
   "address": 35712,
   "type": "line",
   "text": "zero_page_image bytes for $82-$A1: e.g. $8E/$8F, $90=$5F highest object number scanned, $93/$94 voice-1 sequencer, $A0/$A1 = 00 (score-add request)."
  },
  {
   "address": 35744,
   "type": "line",
   "text": "Current score, 4 bytes packed BCD, most significant first; 7 digits shown (low nibble of byte 0 leads). add_score_bcd ($B8B8, sed) adds the 4-byte value at $8BA0+X; displayed by $B8E1-$B916. Cleared at $9F7E."
  },
  {
   "address": 35745,
   "type": "line",
   "text": "Score digits 3-4 (BCD, most significant byte first at $8BA0): $8BA1 holds the ten-thousands and thousands, $8BA2 hundreds and tens, $8BA3 the units digit and a trailing zero; add_score_bcd ($B8B8) adds a points-table entry to all four."
  },
  {
   "address": 35746,
   "type": "line",
   "text": "Score digits 5-7: $8BA2 holds the hundreds and tens, $8BA3 the units and a fixed trailing zero, which is why the display always ends in 0."
  },
  {
   "address": 35747,
   "type": "line",
   "text": "Least significant score byte: units digit in the high nibble and a permanently zero low nibble, the seventh displayed digit that never changes."
  },
  {
   "address": 35748,
   "type": "line",
   "text": "High score, 4 bytes BCD: compared with score_bcd at $AC05-$AC0E on game over and replaced by it at $AC12-$AC15 (then copied to the title's HIGH SCORE digits)."
  },
  {
   "address": 35752,
   "type": "line",
   "text": "Enemies remaining as one BCD byte $10-$19 (10-19 per level, computed at $AA92-$AAA1 as $10 | f(A)), shown after 'E' on the status row by $B8F0 (Y=8, called at $9FA1/$A332). $8BA9-$8BAB = 0 so the 4-byte add of X=8 is never used."
  },
  {
   "address": 35756,
   "type": "line",
   "text": "4-byte BCD value 500 (X=$0C for add_score_bcd)."
  },
  {
   "address": 35760,
   "type": "line",
   "text": "Point values for add_score_bcd, 4-byte BCD each: $8BB0 = 100, +4 = 200 ... $8BCC = 800 (value (n+1)x100 at X = $10+4n)."
  },
  {
   "address": 35792,
   "type": "line",
   "text": "Point values 900, 1000, 1100 ... 1600 at $8BD0, $8BD4 ... $8BEC (continuation of points_tbl_100_800; the manual's UFO values run 100-1600)."
  },
  {
   "address": 35824,
   "type": "line",
   "text": "16 bytes indexed by the saucer type/difficulty index X ($7A): read at $A460 and passed to $BC75 when a saucer is spawned. Values 7F/1F/3F/5F/00 (a mask or count); exact meaning unknown."
  },
  {
   "address": 35840,
   "type": "line",
   "text": "16 start offsets (indexed by saucer type $7A, read at $A45B into $7B) into the fire scripts that follow; the script format is [delay, spread] byte pairs ending in $FF, restart-offset. enemy_fire_script_step ($A97A) reads $8C00+$7B+1: $FF -> reload $7B from the next byte, else delay -> $5E and spawn_enemy_shot with the spread byte ($A9DC)."
  },
  {
   "address": 35856,
   "type": "line",
   "text": "Fire scripts (see enemy_fire_script_start): $8C10 '10 00 x3 FF 0F' three shots delay $10 spread 0 then loop; $8C18 fourteen pairs '03 00' (rapid fire) then '10 00 FF 17'; $8C31 '00 00 00 08 30 78 FF 31'; $8C39 three '00 00 00 08 0E 78' groups FF 39."
  },
  {
   "address": 35918,
   "type": "line",
   "text": "Fire scripts continued: $8C4E sixteen pairs '00 40 00 48 ... 00 38' (delay 0 throughout: the burst handler of type 5 fires all sixteen in one pass, the default handler of type 10 one a pass; restart $4D); $8C6F '30 00 FF 6F'; $8C73 '00 00 00 08 00 78 00 10 30 70 FF 73'."
  },
  {
   "address": 35967,
   "type": "line",
   "text": "Fire scripts continued: $8C7F '03 00 03 08 03 78 03 10 03 70 03 18 20 68 FF 7F'; $8C90 '00 00 00 08 0E 78 00 00 00 10 0E 70 00 00 00 18 0E 68 FF 8F'; $8CA4 sixteen pairs '00 60 00 64 ... 00 1C' (dense sweep) FF A3."
  },
  {
   "address": 36037,
   "type": "line",
   "text": "$8CC5-$8CDF: 27 bytes after the last script (00 00 11 12 12 13 14 15 16 16 0E 0E 0E 0F 0F 10 10 11 11 12 13 14 14 15 16 28): not reached by the offsets in enemy_fire_script_start; unknown."
  },
  {
   "address": 36064,
   "type": "line",
   "text": "16 colour bytes (nibble pairs 77 3F 7F DD FF 33 7D 3D, repeated) indexed by saucer type $7A: copied to $A7 at $A44B when a saucer spawns; $A7 feeds $D023 in the frame tick ($B46C) so it is the object colour of the multicolour view."
  },
  {
   "address": 36080,
   "type": "line",
   "text": "16 colour bytes indexed by ($83F8>>1)&$0F, the explosion object's remaining lifetime: 09 09 09 9A 9A 9A A7 A7 A7 71 71 71 71 71 11 11, read at $A15A into $A7 -> $D023. As the counter falls the explosion goes white (1), yellow (7), light red (A), brown (9); $8CFF = $11 white is also loaded into $A7 at $A95D after the loop at $A938-$A95B has placed a group of objects (purpose not established)."
  },
  {
   "address": 36095,
   "type": "line",
   "text": "Last entry ($11, white/white) of explosion_colour_tbl: the colour pair used in the first passes of an explosion, when the fragment lifetime index is highest."
  },
  {
   "address": 36096,
   "type": "line",
   "text": "Range code -> sprite object scale (256 entries): $80 for codes below $90, then falling 7C, 78 ... 08, 07 ... 01 down to 0 at code $E8 and beyond. Read at $BA0A (Y = view_range_code of the object) into $20 and multiplied by $75 at $BA15/$BA23 to get the sprite's vertical size and offset for saucers and other $E0-type objects. Codes 0-63: all $80 (full scale)."
  },
  {
   "address": 36160,
   "type": "line",
   "text": "Codes 64-127: all $80."
  },
  {
   "address": 36224,
   "type": "line",
   "text": "Codes 128-191: $80 to $8F, then 7C..28 falling by 4 then 2."
  },
  {
   "address": 36288,
   "type": "line",
   "text": "Codes 192-255: 27..01 falling by 1 then slower, 0 from $E8."
  },
  {
   "address": 36352,
   "type": "line",
   "text": "64 bytes indexed by the difficulty index $3E: homing-missile speed addend, $8E00[X] + $68 (player speed) -> obj_speed of object 2 at $A3BF-$A3C5 in spawn_homing_missile. Values 0C 18 18 18 1E ... 43 (faster with difficulty)."
  },
  {
   "address": 36416,
   "type": "line",
   "text": "64 bytes indexed by $3E, copied to $40 at $A3A7 by spawn_homing_missile (FF, C0 x7, BC..B5, C0 x16, B0 x4, B4 x4, B8 x24). Used by the missile steering code (meaning of $40 not established: unknown)."
  },
  {
   "address": 36480,
   "type": "line",
   "text": "64 bytes indexed by $3E, copied to $3F at $A3AC by spawn_homing_missile: the 8-byte pattern 1F 0F 1F 3F 03 07 7F 0F repeated (masks, presumably for the missile's random course changes; unknown)."
  },
  {
   "address": 36544,
   "type": "line",
   "text": "64 bytes indexed by X (the saucer's type/difficulty index as left in X by the saucer AI; only the entries reached are used) ($A6BE/$A6CB): low nibble ANDed with a random byte decides whether the saucer changes course; bit 7 set = fixed course from bits 6-4, clear = random course masked by bits 6-4 ($A6CE-$A6E2). Values 97 97 93 33 ... 91 A1 B1 C1 ... C0 90 B0 90 ..."
  },
  {
   "address": 36608,
   "type": "line",
   "text": "64 bytes indexed by X: saucer speed -> obj_speed of object 2 at $A6E6-$A6E9 (saucer_set_speed_and_heading). 0C 12 18 18 1A ... 3D, rising with the index."
  },
  {
   "address": 36672,
   "type": "line",
   "text": "24 sprite pointers for the backdrop sprites 2-7, 4 variants each (index = sprite_slot*4 + variant): loaded from the level's backdrop record ($9840 + level_index*$80, bytes $10-$27) by load_level_display at $B966-$B978; position_backdrop_sprites writes $8F40[slot*4+variant] into sprite_ptrs_a/b ($B9E4-$B9F5) whenever the variant changes. Level 1: EC EF (dotted hills) for sprite 2, CA-CD (saucer discs) for 3, E6/CC/B0/9D/9E/CE for 4-7."
  },
  {
   "address": 36696,
   "type": "line",
   "text": "6 pairs (variant, base angle) for backdrop sprites 2-7 at $8F58+slot*2: even byte = current variant 0-3 (set $FF at $B98A, updated at $B9DB from bits 8-9 of the angle difference), odd byte = base angle from the record (bytes $0A-$0F). position_backdrop_sprites: X pos = base*2 - player heading, so the backdrop scrolls with the heading; variant changes every quarter turn. $8F64-$8F67 unused."
  },
  {
   "address": 36697,
   "type": "line",
   "text": "Remaining 15 entries of backdrop_sprite_variant_angle: per scenery sprite slot, the heading offset at which each of the four images is chosen, loaded from the level backdrop record by apply_scene."
  },
  {
   "address": 36712,
   "type": "line",
   "text": "24 Y positions for the backdrop sprites, index = slot*4 + variant, from record bytes $28-$3F ($B966); written to $D005+2*slot at $B9EB when the variant changes. Level 1: 20 2E 07 31 / 6D x4 / 5C 54 58 60 / 44 44 60 50 / 44 64 60 50 / 64 64 44 50."
  },
  {
   "address": 36736,
   "type": "line",
   "text": "4 bytes indexed by X = skill (0 expert, 1 advanced, 2 novice; index 3 is used by the direct entry at $9E95): at $9EA2-$9EAD the table value goes to $3B only when $A8 = $70 (level 1); on other levels $3B = $30. Values 20 20 05 3F. Meaning of $3B unknown."
  },
  {
   "address": 36740,
   "type": "line",
   "text": "Player speed by skill: 80 50 40 50 -> $68 and obj_speed[0] at $9EB3-$9EB8 (novice = $40 in the snapshot)."
  },
  {
   "address": 36744,
   "type": "line",
   "text": "Speed of enemy slots 1, 4, 5 by skill: AF 7F 6F 7F -> $17A1/$17A4/$17A5 at $9EBB-$9EC4."
  },
  {
   "address": 36748,
   "type": "line",
   "text": "By skill: B0 80 50 60 -> $A6 at $9EC7 (used as the speed of enemy shots at $A9AF: shot speed by skill)."
  },
  {
   "address": 36752,
   "type": "line",
   "text": "By skill: 58 50 4C 50 -> $57 at $9ECC; the bearing tolerance compared at $AD68 when testing whether an enemy crossed the gun line."
  },
  {
   "address": 36756,
   "type": "line",
   "text": "By skill: 98 94 92 94 -> $4F at $9ED1; range threshold compared at $AC6A: an obelisk closer than this blocks the move."
  },
  {
   "address": 36760,
   "type": "line",
   "text": "By skill: 0E 0C 0A 0A -> $25 at $9ED6; per-pass heading increment reloaded into $23/$24 by turn_player_right/left ($B4EB/$B503)."
  },
  {
   "address": 36764,
   "type": "line",
   "text": "By skill: 08 04 00 00 -> $A9 at $9EDB (meaning unknown). $8FA0-$8FBF: 08 04 00 ... C0 C0 C0 55 55 55 00 AA AA AA AA 00 55 55 55, unreferenced."
  },
  {
   "address": 36800,
   "type": "line",
   "text": "Column-shape table for character row 0 of the wide renderer: 192 entries indexed by the shape's column index X ($10); value | $03 indexes the AND mask at $BC85 and OR mask at $BD05 that stamp this row's pixels into the character being built at ($FB)/($FD) ($AEF8 and $AFA5 for row 0, the other rows at +$C0 each). Entries 0-63. Row 0 values run A0 A4 A8 ... E0 (edge selectors), rows 1-7 hold pixel-run codes 00/08/18/38/78/10/30/60."
  },
  {
   "address": 36864,
   "type": "line",
   "text": "colshape_wide_row0 entries 64-127."
  },
  {
   "address": 36928,
   "type": "line",
   "text": "colshape_wide_row0 entries 128-191."
  },
  {
   "address": 36992,
   "type": "line",
   "text": "Column-shape table for character row 1 of the wide renderer: 192 entries indexed by the shape's column index X ($10); value | $03 indexes the AND mask at $BC85 and OR mask at $BD05 that stamp this row's pixels into the character being built at ($FB)/($FD) ($AEF8 and $AFA5 for row 0, the other rows at +$C0 each). Entries 0-63."
  },
  {
   "address": 37056,
   "type": "line",
   "text": "colshape_wide_row1 entries 64-127."
  },
  {
   "address": 37120,
   "type": "line",
   "text": "colshape_wide_row1 entries 128-191."
  },
  {
   "address": 37184,
   "type": "line",
   "text": "Column-shape table for character row 2 of the wide renderer: 192 entries indexed by the shape's column index X ($10); value | $03 indexes the AND mask at $BC85 and OR mask at $BD05 that stamp this row's pixels into the character being built at ($FB)/($FD) ($AEF8 and $AFA5 for row 0, the other rows at +$C0 each). Entries 0-63."
  },
  {
   "address": 37248,
   "type": "line",
   "text": "colshape_wide_row2 entries 64-127."
  },
  {
   "address": 37312,
   "type": "line",
   "text": "colshape_wide_row2 entries 128-191."
  },
  {
   "address": 37376,
   "type": "line",
   "text": "Column-shape table for character row 3 of the wide renderer: 192 entries indexed by the shape's column index X ($10); value | $03 indexes the AND mask at $BC85 and OR mask at $BD05 that stamp this row's pixels into the character being built at ($FB)/($FD) ($AEF8 and $AFA5 for row 0, the other rows at +$C0 each). Entries 0-63."
  },
  {
   "address": 37440,
   "type": "line",
   "text": "colshape_wide_row3 entries 64-127."
  },
  {
   "address": 37504,
   "type": "line",
   "text": "colshape_wide_row3 entries 128-191."
  },
  {
   "address": 37568,
   "type": "line",
   "text": "Column-shape table for character row 4 of the wide renderer: 192 entries indexed by the shape's column index X ($10); value | $03 indexes the AND mask at $BC85 and OR mask at $BD05 that stamp this row's pixels into the character being built at ($FB)/($FD) ($AEF8 and $AFA5 for row 0, the other rows at +$C0 each). Entries 0-63."
  },
  {
   "address": 37632,
   "type": "line",
   "text": "colshape_wide_row4 entries 64-127."
  },
  {
   "address": 37696,
   "type": "line",
   "text": "colshape_wide_row4 entries 128-191."
  },
  {
   "address": 37760,
   "type": "line",
   "text": "Column-shape table for character row 5 of the wide renderer: 192 entries indexed by the shape's column index X ($10); value | $03 indexes the AND mask at $BC85 and OR mask at $BD05 that stamp this row's pixels into the character being built at ($FB)/($FD) ($AEF8 and $AFA5 for row 0, the other rows at +$C0 each). Entries 0-63."
  },
  {
   "address": 37824,
   "type": "line",
   "text": "colshape_wide_row5 entries 64-127."
  },
  {
   "address": 37888,
   "type": "line",
   "text": "colshape_wide_row5 entries 128-191."
  },
  {
   "address": 37952,
   "type": "line",
   "text": "Column-shape table for character row 6 of the wide renderer: 192 entries indexed by the shape's column index X ($10); value | $03 indexes the AND mask at $BC85 and OR mask at $BD05 that stamp this row's pixels into the character being built at ($FB)/($FD) ($AEF8 and $AFA5 for row 0, the other rows at +$C0 each). Entries 0-63."
  },
  {
   "address": 38016,
   "type": "line",
   "text": "colshape_wide_row6 entries 64-127."
  },
  {
   "address": 38080,
   "type": "line",
   "text": "colshape_wide_row6 entries 128-191."
  },
  {
   "address": 38144,
   "type": "line",
   "text": "Column-shape table for character row 7 of the wide renderer: 192 entries indexed by the shape's column index X ($10); value | $03 indexes the AND mask at $BC85 and OR mask at $BD05 that stamp this row's pixels into the character being built at ($FB)/($FD) ($AEF8 and $AFA5 for row 0, the other rows at +$C0 each). Entries 0-63."
  },
  {
   "address": 38208,
   "type": "line",
   "text": "colshape_wide_row7 entries 64-127."
  },
  {
   "address": 38272,
   "type": "line",
   "text": "colshape_wide_row7 entries 128-191."
  },
  {
   "address": 38400,
   "type": "line",
   "text": "Low bytes of the shape-script pointers, indexed by shape number 0-$DF (numbers $E0 and up are sprite objects handled at $BA04). Read at $AD89 by draw_shape ($AD76) into $F7; scripts live in $1E00-$3EFF (copied there from $3E00 by init). Entries 0-63."
  },
  {
   "address": 38464,
   "type": "line",
   "text": "shape_ptr_lo entries $40-$7F."
  },
  {
   "address": 38528,
   "type": "line",
   "text": "shape_ptr_lo entries $80-$BF."
  },
  {
   "address": 38592,
   "type": "line",
   "text": "shape_ptr_lo entries $C0-$DF; $96E0-$96FF zero (shape numbers $E0-$FF are sprites)."
  },
  {
   "address": 38656,
   "type": "line",
   "text": "High bytes of the shape-script pointers (read at $AD8E into $F8), same indexing as shape_ptr_lo; values $1E-$3E. Entries 0-63."
  },
  {
   "address": 38720,
   "type": "line",
   "text": "shape_ptr_hi entries $40-$7F."
  },
  {
   "address": 38784,
   "type": "line",
   "text": "shape_ptr_hi entries $80-$BF."
  },
  {
   "address": 38848,
   "type": "line",
   "text": "shape_ptr_hi entries $C0-$DF; $97E0-$97FF zero."
  },
  {
   "address": 38912,
   "type": "line",
   "text": "Column-shape table for character row 0 of the narrow renderer ($B070/$B11D for row 0, +$80 per row): 74 entries (X = 0-$49) of pixel-run codes 00/08/18/38/78/10/30/60 that, OR $03, index the mask tables $BC85/$BD05. Entries 0-63."
  },
  {
   "address": 38976,
   "type": "line",
   "text": "colshape_narrow_row0 entries 64-73 ($9840-$9849)."
  },
  {
   "address": 38986,
   "type": "line",
   "text": "Backdrop-sprite record for level index 0 (key 8 = level 8), 54 bytes read by load_level_display through ($F7) = $9800 + level_index*$80 + $40 (bytes $0A-$3F of that 64-byte window): +0..+5 base angles of sprites 2-7 (00 10 40 50 9A A4) -> backdrop_sprite_variant_angle odd bytes, +6..+29 sprite pointers, 4 variants per sprite (EC ED EE EF CA CB CC CD E6 E6 CC B0 E6 9D CD B0 CD CD CC CD CD CD CE CC) -> backdrop_sprite_ptrs, +30..+53 Y positions -> backdrop_sprite_y."
  },
  {
   "address": 39040,
   "type": "line",
   "text": "Column-shape table for character row 1 of the narrow renderer ($B070/$B11D for row 0, +$80 per row): 74 entries (X = 0-$49) of pixel-run codes 00/08/18/38/78/10/30/60 that, OR $03, index the mask tables $BC85/$BD05. Entries 0-63."
  },
  {
   "address": 39104,
   "type": "line",
   "text": "colshape_narrow_row1 entries 64-73 ($98C0-$98C9)."
  },
  {
   "address": 39114,
   "type": "line",
   "text": "Backdrop-sprite record for level index 1 (level 7), 54 bytes read by load_level_display through ($F7) = $9800 + level_index*$80 + $40 (bytes $0A-$3F of that 64-byte window): +0..+5 base angles of sprites 2-7 (00 2A 55 7F AA D5) -> backdrop_sprite_variant_angle odd bytes, +6..+29 sprite pointers, 4 variants per sprite (B1 B2 B3 B4 B5 B7 B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9) -> backdrop_sprite_ptrs, +30..+53 Y positions -> backdrop_sprite_y."
  },
  {
   "address": 39168,
   "type": "line",
   "text": "Column-shape table for character row 2 of the narrow renderer ($B070/$B11D for row 0, +$80 per row): 74 entries (X = 0-$49) of pixel-run codes 00/08/18/38/78/10/30/60 that, OR $03, index the mask tables $BC85/$BD05. Entries 0-63."
  },
  {
   "address": 39232,
   "type": "line",
   "text": "colshape_narrow_row2 entries 64-73 ($9940-$9949)."
  },
  {
   "address": 39242,
   "type": "line",
   "text": "Backdrop-sprite record for level index 2 (level 6), 54 bytes read by load_level_display through ($F7) = $9800 + level_index*$80 + $40 (bytes $0A-$3F of that 64-byte window): +0..+5 base angles of sprites 2-7 (00 10 80 90 9A A8) -> backdrop_sprite_variant_angle odd bytes, +6..+29 sprite pointers, 4 variants per sprite (EC ED EE EF CA CB CC CD E6 E6 CC B0 E6 9D CD B0 CD 9E CC B0 CD 9D CE B0) -> backdrop_sprite_ptrs, +30..+53 Y positions -> backdrop_sprite_y."
  },
  {
   "address": 39296,
   "type": "line",
   "text": "Column-shape table for character row 3 of the narrow renderer ($B070/$B11D for row 0, +$80 per row): 74 entries (X = 0-$49) of pixel-run codes 00/08/18/38/78/10/30/60 that, OR $03, index the mask tables $BC85/$BD05. Entries 0-63."
  },
  {
   "address": 39360,
   "type": "line",
   "text": "colshape_narrow_row3 entries 64-73 ($99C0-$99C9)."
  },
  {
   "address": 39370,
   "type": "line",
   "text": "Backdrop-sprite record for level index 3 (level 5), 54 bytes read by load_level_display through ($F7) = $9800 + level_index*$80 + $40 (bytes $0A-$3F of that 64-byte window): +0..+5 base angles of sprites 2-7 (00 10 40 50 9A A4) -> backdrop_sprite_variant_angle odd bytes, +6..+29 sprite pointers, 4 variants per sprite (EC ED EE EF CA CB CC CD E6 E6 CC B0 E6 9D CD B0 CD CD CC CD CD CD CE CC) -> backdrop_sprite_ptrs, +30..+53 Y positions -> backdrop_sprite_y."
  },
  {
   "address": 39424,
   "type": "line",
   "text": "Column-shape table for character row 4 of the narrow renderer ($B070/$B11D for row 0, +$80 per row): 74 entries (X = 0-$49) of pixel-run codes 00/08/18/38/78/10/30/60 that, OR $03, index the mask tables $BC85/$BD05. Entries 0-63."
  },
  {
   "address": 39488,
   "type": "line",
   "text": "colshape_narrow_row4 entries 64-73 ($9A40-$9A49)."
  },
  {
   "address": 39498,
   "type": "line",
   "text": "Backdrop-sprite record for level index 4 (level 4), 54 bytes read by load_level_display through ($F7) = $9800 + level_index*$80 + $40 (bytes $0A-$3F of that 64-byte window): +0..+5 base angles of sprites 2-7 (00 2A 55 7F AA D5) -> backdrop_sprite_variant_angle odd bytes, +6..+29 sprite pointers, 4 variants per sprite (B1 B2 B3 B4 B5 B7 B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9) -> backdrop_sprite_ptrs, +30..+53 Y positions -> backdrop_sprite_y."
  },
  {
   "address": 39552,
   "type": "line",
   "text": "Column-shape table for character row 5 of the narrow renderer ($B070/$B11D for row 0, +$80 per row): 74 entries (X = 0-$49) of pixel-run codes 00/08/18/38/78/10/30/60 that, OR $03, index the mask tables $BC85/$BD05. Entries 0-63."
  },
  {
   "address": 39616,
   "type": "line",
   "text": "colshape_narrow_row5 entries 64-73 ($9AC0-$9AC9)."
  },
  {
   "address": 39626,
   "type": "line",
   "text": "Backdrop-sprite record for level index 5 (level 3), 54 bytes read by load_level_display through ($F7) = $9800 + level_index*$80 + $40 (bytes $0A-$3F of that 64-byte window): +0..+5 base angles of sprites 2-7 (00 FC 80 88 8D 94) -> backdrop_sprite_variant_angle odd bytes, +6..+29 sprite pointers, 4 variants per sprite (EC ED EE EF CA CB CC CD E6 E6 CC B0 E6 9D CD B0 CD 9E CC B0 CD 9D CE B0) -> backdrop_sprite_ptrs, +30..+53 Y positions -> backdrop_sprite_y."
  },
  {
   "address": 39680,
   "type": "line",
   "text": "Column-shape table for character row 6 of the narrow renderer ($B070/$B11D for row 0, +$80 per row): 74 entries (X = 0-$49) of pixel-run codes 00/08/18/38/78/10/30/60 that, OR $03, index the mask tables $BC85/$BD05. Entries 0-63."
  },
  {
   "address": 39744,
   "type": "line",
   "text": "colshape_narrow_row6 entries 64-73 ($9B40-$9B49)."
  },
  {
   "address": 39754,
   "type": "line",
   "text": "Backdrop-sprite record for level index 6 (level 2), 54 bytes read by load_level_display through ($F7) = $9800 + level_index*$80 + $40 (bytes $0A-$3F of that 64-byte window): +0..+5 base angles of sprites 2-7 (00 2A 55 7F AA D5) -> backdrop_sprite_variant_angle odd bytes, +6..+29 sprite pointers, 4 variants per sprite (B1 B2 B3 B4 B5 B7 B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9) -> backdrop_sprite_ptrs, +30..+53 Y positions -> backdrop_sprite_y."
  },
  {
   "address": 39808,
   "type": "line",
   "text": "Column-shape table for character row 7 of the narrow renderer ($B070/$B11D for row 0, +$80 per row): 74 entries (X = 0-$49) of pixel-run codes 00/08/18/38/78/10/30/60 that, OR $03, index the mask tables $BC85/$BD05. Entries 0-63."
  },
  {
   "address": 39872,
   "type": "line",
   "text": "colshape_narrow_row7 entries 64-73 ($9BC0-$9BC9)."
  },
  {
   "address": 39882,
   "type": "line",
   "text": "Backdrop-sprite record for level index 7 (level 1, the one loaded in the play snapshot), 54 bytes read by load_level_display through ($F7) = $9800 + level_index*$80 + $40 (bytes $0A-$3F of that 64-byte window): +0..+5 base angles of sprites 2-7 (00 10 80 90 9A A8) -> backdrop_sprite_variant_angle odd bytes, +6..+29 sprite pointers, 4 variants per sprite (EC ED EE EF CA CB CC CD E6 E6 CC B0 E6 9D CD B0 CD 9E CC B0 CD 9D CE B0) -> backdrop_sprite_ptrs, +30..+53 Y positions -> backdrop_sprite_y."
  },
  {
   "address": 39936,
   "type": "line",
   "text": "Cold entry from the depacker (jumped from $097A, once). Stores $36 in $03 (dead: $03 is overwritten by the zero-page image copy below), saves the byte at $A000 in $68CA, copies 34 pages $3E00-$5FFF down to $1E00-$3FFF through ($F7)->($F9), restores $A000, writes the vector pair $9C3E into $8000-$8003 (cartridge cold/warm vector slots; no CBM80 signature follows so the KERNAL never uses them), calls KERNAL IOINIT, copies the 159-byte zero-page image $8B01-$8B9F to $03-$A1 (X counts $9F..$01, so $02 is not initialised), sets $01=$36 (BASIC ROM out), selects VIC bank 1 ($DD00 bits 0-1 = %10), then jumps to enter_title_screen."
  },
  {
   "address": 39938,
   "type": "side",
   "text": "dead store: $03 is overwritten by the zero-page image copy at $9C43"
  },
  {
   "address": 39982,
   "type": "side",
   "text": "$8000-$8003 = $9C3E,$9C3E: cartridge vector slots, unused without a CBM80 signature"
  },
  {
   "address": 39998,
   "type": "line",
   "text": "Entry taken on a hardware RESET: the CBM80 signature at $8004 makes the KERNAL jump through the vector at $8000, which the init wrote as $9C3E. Skips the one-time relocation above and re-runs IOINIT, the zero-page image copy, banking and VIC bank selection, then goes to the title screen, so RESET restarts the game instead of dropping to BASIC."
  },
  {
   "address": 40028,
   "type": "line",
   "text": "Game over (jumped from $AC2D). SEI, VIC IRQs off, sprites off, SID volume 0, $D016=$08 (40 columns, hires). Fills all 1000 colour RAM cells with light grey ($0F), sets border and background to $0F, then blacks the 18 colour cells at row 10 columns 10-27 ($D99A-$D9AB) so that text of the pre-built game-over screen shows, and selects that screen with $D018=$BE (screen $6C00, charset $7800). Sets $A8=$70 (level index for level 1) and loops 10 times ($FF) over a Y*256*X delay, sampling keyboard column 0 each time: F7 (row bit 3 low, value $F7) jumps straight to start_game_from_title; otherwise falls through to enter_title_screen."
  },
  {
   "address": 40093,
   "type": "line",
   "text": "Ten passes of an X*Y busy delay; F7 pressed during any pass restarts a game at level 1."
  },
  {
   "address": 40113,
   "type": "line",
   "text": "Entry from init and game over: reset_to_title_screen (silence, colour RAM, title screen, PAL check), then fall into the demo-timer reset."
  },
  {
   "address": 40116,
   "type": "line",
   "text": "Sets the 24-bit attract countdown $F7/$F8/$F9 to xx/03/03 (the title loop decrements $F7 every pass; when all three reach zero start_demo runs). Re-entered after every key or skill change."
  },
  {
   "address": 40122,
   "type": "line",
   "text": "Title screen loop. JSR $6A0E is a stub inside the title-screen memory (jmp $6A1D = rts). Calls cassette_motor_toggle and read_key_column0 (result unused here), sets CIA1 DDR A=$FF, runs KERNAL SCNKEY, shows the title screen ($D018=$AE: screen $6800, charset $7800). Compares the key code in $C5 with the 8-entry table at $6931 (keys 8..1, index 0..7); a match sets $A8 = index*16 (level 1 = $70, level 8 = $00), beeps voice 1 (sawtooth $21, freq $0606) and restarts the demo timer. The compare against $68CB (highest level index reached, stored in the title screen's invisible row 5) at $9CE3 is followed by two NOPs: the branch that restricted the keys to levels already completed has been patched out, so any level 1-8 can be selected. No level key: gate voice 1 off, advance the random generator ($BC1E), decrement the attract timer (expired -> start_demo), read the joystick ($BC2C: $6E=0 means fire held). Fire held: title_fire_start waits for release then starts the game. Otherwise $C5=3 (F7) starts the game, $C5=6 (F5) cycles the skill in $62 downward 2,1,0,2.. (0 EXPERT, 1 ADVANCED, 2 NOVICE = default) and copies its 16-cell wide-font name from the hidden strip at $6B20+skill*16 (title rows 20-21, coloured invisibly) to $6B88 (row 22 col 24, the F5 label)."
  },
  {
   "address": 40163,
   "type": "side",
   "text": "compare with highest level reached ($68CB); the following NOP NOP replaced the branch that enforced it"
  },
  {
   "address": 40211,
   "type": "line",
   "text": "Joystick fire on the title: loop with a delay while the button is held; after release (checked twice, 32*X delay between) jump to start_game_from_title. Uses the button state from $BC2C in Z."
  },
  {
   "address": 40229,
   "type": "line",
   "text": "$C5=3 (F7) -> start_game_from_title; $C5=6 (F5) -> cycle skill $62 and show its name; anything else loops."
  },
  {
   "address": 40246,
   "type": "line",
   "text": "Copies 16 wide-font cells of skill name $62 from $6B20+(skill+1)*16-1 downwards into $6B88-$6B97 (title row 22 from column 24)."
  },
  {
   "address": 40267,
   "type": "line",
   "text": "Long busy delay (255*256 iterations) then wait until no key is down ($C5=$40, rescanning with SCNKEY), then back to title_reset_demo_timer. Also the return point after a game is aborted with F1 (jumped from $A127) so the title does not react to the key that ended the game."
  },
  {
   "address": 40296,
   "type": "line",
   "text": "Start a real game: X = skill $62 (column index into the parameter tables at $8F80), copies $68C9 ($30) into $68C8 (chance that a new saucer heading is aligned with the player; the demo uses $20), samples sprite 3's background collision bit ($D01F & 8, sprite 3 was parked at X=503 by reset_to_title_screen) into $C0 (read by the sprite code at $B9CB), then jumps to start_game."
  },
  {
   "address": 40314,
   "type": "line",
   "text": "Attract timer expired: level index $A8=$70 (level 1) and jump to start_demo_game."
  },
  {
   "address": 40321,
   "type": "line",
   "text": "Busy delay: X*32 inner iterations (Y=32 outer, X inner from its entry value). Preserves nothing."
  },
  {
   "address": 40330,
   "type": "line",
   "text": "Shared setup for the title screen (from enter_title_screen and the F1 abort at $A124). SEI; clears all 24 SID registers; sprites off ($D015=0); VIC IRQs off ($D01A=0); volume $0F; voice 1 SR=$F0; $D016=$08. Fills colour RAM ($D800, 25 rows of 40 through ($F7)) with one colour per row from the 25-byte table at $6918 (rows 5,7,8,10,12-14,16,18,20,21,23 are 2 = red on the red background, i.e. invisible: those rows hold hidden data such as $68C8-$68CB and the skill-name strip at $6B20). Border and background = 2 (red), $D018=$AE (title screen at $6800). $A8=$70 (level 1), $1D=$5A=$71=0 ($71=0: not demo). Then a PAL check (pal_check_loop) and title_sprite3_setup."
  },
  {
   "address": 40428,
   "type": "line",
   "text": "PAL check. lda $CFF9,x with X=$19 reads $D012: keeps the last non-zero raster low byte until a zero is read, i.e. the value just before the counter wraps. >= $F0 (the wrap at line 256) retry; >= $30 (PAL, 312 lines: $37) continue; else (NTSC, 263 lines: $06) jmp ($F7) where $F7/$F8 = $DBE8 (past the end of colour RAM): effectively a crash on NTSC machines."
  },
  {
   "address": 40450,
   "type": "line",
   "text": "Sprite 3 parked at X=$1F7 (503, off the visible area), Y=$40, enabled alone, expanded both ways, colour 1 (white); reads $D01F to clear the collision latch. start_game_from_title later samples sprite 3's background-collision bit into $C0."
  },
  {
   "address": 40483,
   "type": "line",
   "text": "Reads keyboard column 0: CIA1 DDR A=$FF, port A=$FE, returns port B in A (rows, active low): $F7 = F7 (bit 3), $EF = F1 (bit 4), $BF = F5 (bit 6). Leaves DDR A=$FF, which is why $BC2C resets it before reading the joystick."
  },
  {
   "address": 40497,
   "type": "line",
   "text": "Manipulates the datasette bits of $01 on each pass of the title and main loops. If the cassette-switch sense bit ($01 bit 4) is set (no button pressed) sets $BF=$10 and $01=$26; if a button is pressed: $BF=0 -> $01=$26, else $01=$06. Both values clear bit 5 (motor line on) while keeping BASIC out, KERNAL and I/O in. Purpose unknown (perhaps winding a tape original past the loader); harmless on disk."
  },
  {
   "address": 40518,
   "type": "line",
   "text": "Demo (attract) start, reached from start_demo with $A8=$70. Clears $84A0 (player heading) and the first 32 entries of the object arrays $8260, $82C0, $8320, $8380 (positions), $15C0-$173F (12 arrays of 32: velocities and sub-pixel parts), reloads the zero-page image $8B01-$8B9F into $03-$A1, sets player X/Y high bytes ($8260, $8320) and $84C0 to $10, uses parameter column X=3 (the demo column of the tables at $8F80) and $68C8=$20, then joins start_game. The demo's joystick input is replayed by $BC2C from the script at ($72) = $7400 while $71 is non-zero."
  },
  {
   "address": 40607,
   "type": "line",
   "text": "Common game start (from start_game_from_title with X=skill, start_demo_game with X=3, and $AB6D). JSR $6A11 is a stub (rts). Loads the per-skill parameters, columns X of the 4-byte tables at $8F80: $3B (initial difficulty, only when $A8=$70 i.e. level 1, else $30) with $3C=$80; $68 = player speed -> also $17A0 (object 0 speed); $17A1/$17A4/$17A5 = speed of the three player shots (objects 1,4,5); $A6 = enemy shot speed; $57; $4F (range threshold used by $AC6A); $25 = turn rate; $A9 = warp speed bonus. $D011=$1B, $D01B=$FD (sprite 1, the gun sight, in front of the background; others behind). JSR $B1A1 (view init). Colour RAM: rows 18-24 dark grey ($0B, console), rows 0-1 white (status). Installs the raster IRQ chain: $0314=$B2FE, $D012=$10, $DC0D=$1F clears the CIA1 interrupt mask (the KERNAL 60 Hz timer IRQ is off during play), acknowledges, $D019/$D01A=1, CLI. Sprite 0 colour white, sprite 0 pointer $63F8=$90 (image at $6400); sprite 1 (gun sight) fixed at X=$A0, Y=$6D; sprite colours 1-7 from the 7-byte table at $6939 ($0F,1,1,1,1,1,1). Writes four 8-byte fill patterns ($00,$55,$AA,$FF) at $4000/$4100/$4200/$4300 and $5000/$5100/$5200/$5300 (purpose unknown; $4000 is also read at $B244) and $17B8-$17BF=$10 (speed of objects 24-31, explosion fragments). Zeroes $17A3, $17A7, $69, $A2, the 7-digit BCD score $8BA0-$8BA3, and draws it (JSR $B8E1). Writes wide-font '4' at $6026/$6027: the status row reads S4 = four shields. $63 = $A8 (current level index). JSR $B920 (loads the 16-byte per-level block at $8010+$63|$0F into $AB-$BA: sprite enable/expand and band colours). JSR $AA8F rolls the enemy count $8BA8 = BCD 10-19 and $B8F0 draws it at row 0 columns 28-31 (E<nn>). Falls into level_restart_common."
  },
  {
   "address": 40724,
   "type": "side",
   "text": "$DC0D=$1F: clear all CIA1 interrupt enables; only the raster IRQ runs during play"
  },
  {
   "address": 40841,
   "type": "side",
   "text": "S4: initial shield count digit at row 0 cols 38-39"
  },
  {
   "address": 40868,
   "type": "line",
   "text": "Per-level reset (also jumped from $ABE7 after the player is destroyed). Clears $33 (missile pending count), $44-$47 (saucer behaviour timers), $91. If $69 (stargate/warp phase flag) was set, restores the level index $63 from $7C (the level saved at the last spawn: a death in the warp returns to the previous level). Clears $69, $A5 (warp progress), $83 (entered-gate flag), object lifetimes $83E0-$83FF, sets $8460-$849F to 3, $58 (time counter, 256-frame units) = $35 = 0, $90=$5F, $4C=$1F, state vector $A3/$A4 = state_between_enemies, $4D=$34 (52-pass delay before the first spawn), border $0B, $A7=7 (enemy colour pair), $AE=1 (firing allowed), then the unexplained bytes at $9FF9 and level_start."
  },
  {
   "address": 40953,
   "type": "line",
   "text": "Seven bytes A9 4B 53 54 41 3A 2A executed in line: LDA #$4B, SRE ($54),Y (illegal: shifts the byte at ($54)+Y and EORs it into A), EOR ($3A,X), ROL A. Read as ASCII they spell 'KSTA:*' preceded by $A9. Meaning unknown; flagged, not explained."
  },
  {
   "address": 40960,
   "type": "line",
   "text": "Level start (also the byte saved/restored by init_game). Console lights: colour 8 (orange) at offset $50 (row 21) and 6 (blue) at offset $A0 (row 23) via the light writer at $AA70. SID: voice 1 freq $1414, voices 2/3 SR=0, voice 1 gate off with SR=$20, $48=$93=$20, pulse widths $0800 on all voices, $D417=$08, volume $0F, $1D=1 (fire cooldown). Falls into main_loop."
  },
  {
   "address": 41036,
   "type": "line",
   "text": "Main loop, once per pass, and a pass takes two frames (jumped back to from $AB97). $B584 ages every object (decrements lifetimes $83E0,x, moves those with a speed). $75 ramps by 8 towards $FF while $76 is set, else towards 0 (warp tone pitch). Decrements the countdowns $5C (fire lock), $5E (enemy fire delay), $78 (spawn delay). If $69 (stargate phase) skip to main_loop_input. Else check_player_shots tests player shot slots 1,4,5 through $AC30 (obelisk grid $8A00); when all three return carry set and the cooldown $1D is 0, $1D=12 and the voice-1 noise burst (freq $1414, AD $36, ctrl $80/$81) plays. $59 counts down the light-blue 'saucer firing' flash on the right console light, restoring blue (6) at row 23. check_enemy_shots: when not warping ($A5=0), objects 8-23 (enemy shots) through $AC30 accumulating carries in $5D; if the last carry is clear and $5A (sound busy) is 0, voice 2 plays a noise burst (freq $1414, AD $36)."
  },
  {
   "address": 41219,
   "type": "line",
   "text": "Second part of the pass: $B77F, $B829, $B868, $B1EC (drawing/collision, other range), cassette_motor_toggle, joystick read ($BC2C -> $6D directions, $6E fire), read_key_column0. F1 ($EF) -> abort_to_title. In demo ($71<>0) F7 also aborts. Otherwise check_pause_key: column 7 ($DC00=$7F) row bit 4 = SPACE ($EF) -> pause_loop: loops reading F1 (abort) and the joystick until a direction is pushed ($6D<>$0F): the joystick, not SPACE, resumes; then $58=0. Continues to enemy_explosion_update."
  },
  {
   "address": 41252,
   "type": "line",
   "text": "F1 during play: reset_to_title_screen then title_debounce."
  },
  {
   "address": 41295,
   "type": "line",
   "text": "While an enemy explosion runs ($83F8, the lifetime of fragment object 24, is non-zero): $A7 = colour pair from $8CF0[(timer/2)&15] (white, yellow/white, pink/yellow, brown/pink, black/brown as it counts down), voice 3 frequency high byte = (timer*2 & 6) | $10 (explosion rumble), $4E advances and selects a 4-byte fragment shape set from $BC16 ($82/$A2/$C2 rotating) copied into the shape numbers of objects 24-31 ($8458-$845F). Then wait_raster_192."
  },
  {
   "address": 41345,
   "type": "line",
   "text": "Frame sync: spins until the raster line is >= $C0 (192, below the 3D view rows), then $B918 (redraw status on level change), $B9A5 (sprites), stub $6A17. $1A alternates $80/$94 with the pass counter $08 (read by the raster IRQ stages at $B321/$B3C4). $B1A1 draws the view. If $A5 (warp progress) is non-zero: warp_phase_frame, else joystick_move_player."
  },
  {
   "address": 41374,
   "type": "line",
   "text": "Warp travel frame: player speed $17A0 = ($A5 * $9C)>>8 + $30 (ramps up with $A5, $9C = per-level warp top speed), then the sound: $A5=$FF (full speed) steady voices 2 and 3 (sawtooth $21, freq $0800 and $1100), else voice 3 noise ($81) with a random frequency ((rnd*rnd)>>8 + 1); voice 2 off. $B508 with A=0 moves the player forward with obelisk collision, then $17A0 is restored to the normal speed $68. Joins the turning code at $A211."
  },
  {
   "address": 41463,
   "type": "line",
   "text": "Normal movement. If $83 set, $2D=0. Joystick bits in $6D are active low: bit 0 up -> $B508 (forward with obelisk collision), bit 1 down -> $B56C (reverse: heading flipped by 4, move, flipped back), bit 3 right -> $B4D8 (heading $84A0:$84C0 += $23, then $23 = turn rate $25) else $23=2, bit 2 left -> $B4F0 likewise with $24. Then engine_sound_select and fire_button_check."
  },
  {
   "address": 41521,
   "type": "line",
   "text": "Not warping: $93 = $80C0[index] where index = (joystick bits 1 and 3 pattern of $6D, 'and #5') | 2 if $1C is zero: 0 or 1 from the 8-byte table. Used by the sound code at $B440-$B460 area (other range); presumably gates the engine noise."
  },
  {
   "address": 41544,
   "type": "line",
   "text": "If firing is allowed ($AE<>0), not in the stargate phase ($69=0) and the button is held ($6E=0), $ACB6 launches a player shot (slots 1, 4, 5)."
  },
  {
   "address": 41557,
   "type": "line",
   "text": "Bearing from the player (object 0) to the enemy (object 2): $B6A2/$B729 return it in A (octant) : Y (fraction); stored in $84A2:$84C2 (the enemy's heading slot, re-set by the behaviour code) and $2F:$39. Object 6 heading $84A6 = (bearing - player heading + 4) & 7, $84C6 its fraction (the radar/sight marker). $B766 -> $31 = range to the enemy. Then dispatches through the state vector ($A3): state_between_enemies, state_stargate_open, state_stargate_missed, state_warp_travel, state_homing_missile or the per-type saucer handlers (table at $AAA5/$AAB5)."
  },
  {
   "address": 41610,
   "type": "line",
   "text": "Default state handler (vector $A3/$A4), reached via jmp ($A3) at $A287. While an enemy explosion runs ($83F8<>0) do nothing. If $69 (all enemies destroyed) -> open_stargate. Else count down $4D (spawn delay): reaching 0 -> spawn_next_enemy_setup; already 0 -> activate_enemy_behaviour when the post-spawn delay $78 has expired (then $76=0, gate object 3 lifetime $83E7=$20, enemy object 2 lifetime $83E2=$FF, and the vector is switched to the saucer handler for type $7A from the lo/hi tables at $AAB5/$AAA5 and entered at once). Otherwise continue the main loop at $AAC8."
  },
  {
   "address": 41633,
   "type": "line",
   "text": "Enemy counter reached zero: the stargate (object 3, lifetime $83E3=$FF) is placed at the last enemy's X rounded to a multiple of 4 ($8262 -> $8263), same Y ($8322 -> $8323), low bytes 0; $76=$FF (warp tone rises), firing off ($AE=0), $4C=0, $15A3=0, $A7=0, $78=$F0 (240 passes), shot shape $8448=$23, voices 2 and 3 set up (AD 0, SR $F0, test bit $10), warp_tone_update, then the state vector becomes state_stargate_open."
  },
  {
   "address": 41762,
   "type": "line",
   "text": "Prepares the next enemy. $4C=0. If the enemy counter $8BA8 is 0 (level replayed after a missed gate) roll a new BCD 10-19 count ($AA8F) and draw it at row 0 columns 28-31. $7C = $63 (level saved for a warp death). $9B = (level-1)*2 from $63 ($63>>3 & $0E xor $0E); forced to $0E once $A2 (level 8 reached) is set and to 2 in demo ($71). Level digit: $6014/$6015 = wide-font digit (level) written to row 0 columns 20-21 (L<n>); $A2 = that code & $10 (set from level 8 on, so all 16 types stay available). $9C = warp top speed: $A7E8[level-1] + skill bonus $A9 ($48 in demo). $8448=$22 (enemy shot shape), $AE=$0E (firing allowed). Then decides what to spawn: if $9E (forced new types after a level up) -> spawn_saucer; else the missile pending counter $33 is decremented (if >1 -> spawn_homing_missile); when it hits 0, or when the time counter $58 >= 24, or with a 1-in-4 random chance while $35 is set, $33 = rnd&3+1 and spawn_homing_missile; otherwise spawn_saucer."
  },
  {
   "address": 41893,
   "type": "line",
   "text": "Homing missile spawn. X=$3E (random value scaled by difficulty, from $AB95): $40 = $8E40[X] (range at which it starts steering), $3F = $8E80[X] (steering randomness mask), $17A2 = $8E00[X] + $68 (missile speed = table + player speed), $15A2=0, $4B=$40, shape $8442=$62, $A7=$33 (colour pair), enemy object 2 lifetime $FF, $41=$0A, $58=$48=0, voices 2/3 off with SR=$C0. Position: rnd&2 plus the player heading decides which axis; the missile appears $78 or $88 units away from the player on one axis and at a random coordinate on the other (positions $8262/$8322 vs player $8260/$8320). State vector = state_homing_missile."
  },
  {
   "address": 42028,
   "type": "line",
   "text": "Saucer spawn. Type $7A: if $9E (2 after a level up) is set, type = $9B + $9E after decrementing (the level's two new types first, in order), else type = ($9F * ($9B+2))>>8 = random in 0..2*level+1 (level 8: 0..15; 16 types in all). Shape $8442=$42, $35=$42, $A7 = colour pair $8CE0[type], voices 2/3 off, $7B = fire-script start $8C00[type] (script at $8C00+), $8BF0[type] passed to $BC75 which is now just RTS. Left console light row 21 = yellow (7): 'saucer present'. Placement: 1 in 4 via place_object_at_player (X=2, random heading offset, random speed 1-16, i.e. near the player), else a random X ($8262) and Y ($8322 = rnd&$E0|$10). Copies object 2's position into object 7 ($8267/$8327/$82C7/$8387). Clears $44-$47 (behaviour timers), $75, $17A2 (speed), sets $76=$FF, gate lifetime $83E7=$FF, $78=$30 (48 passes before the behaviour handler starts)."
  },
  {
   "address": 42189,
   "type": "line",
   "text": "$48=0; voices 2 and 3 frequency high bytes = ((~$75)>>3)+$0F and +$10, control $11 (triangle, gated): the rising/falling stargate tone driven by $75."
  },
  {
   "address": 42220,
   "type": "line",
   "text": "State handler while the stargate is open. warp_tone_update. When $75 has reached $FF: $AD26 (X=0 player, Y=3 gate) tests the gate's position relative to the player; carry set and (negative or < $60) means the player is at the gate: moves forward or back ($2E decides $B56C or $B508), $15A3=0, toggles $83 (entered flag) and sets $78=$30. When $78 expires: $76=0, gate lifetime $83E3=$22, $4D=$4C=$18, $69 = $83: entered -> state_warp_travel, missed -> state_stargate_missed."
  },
  {
   "address": 42322,
   "type": "line",
   "text": "Gate not entered: keep the warp tone until the gate object's lifetime $83E3 runs out, then voices 2/3 off and back to state_between_enemies; the level continues with a fresh enemy count (spawn_next_enemy_setup rolls one when $8BA8=0). No shield is deducted here."
  },
  {
   "address": 42339,
   "type": "line",
   "text": "Behaviour handler for saucer types 5 and 11 (tables $AAB5/$AAA5). First entry ($45=0): $48=0, voice 3 set to triangle-ready (freq hi $30, SR $F0, AD 0), $5E=0. $45 is then decremented from 0, so it counts down from 255 passes, toggling voice 3 gate ($11/$10) every 16 passes. At 0: $1D=$1F, then 16 calls of enemy_fire_script_step in a row (a cloud of fire), enemy object removed ($83E2=0), $4D=$4C=$38, vector back to state_between_enemies. While counting: $44 pause, else re-seed $44 = rnd&$3F with X=$3B and join saucer_set_speed_and_heading."
  },
  {
   "address": 42439,
   "type": "line",
   "text": "Behaviour handler for types 9, 12, 14, 15: fire per script (enemy_fire_script_step), $45=$46=0, then saucer_common_update."
  },
  {
   "address": 42454,
   "type": "line",
   "text": "Behaviour handler for types 0-4, 6, 8, 10. While $47 (approach flag) is set: fire per script; if it fired/was delayed (carry) -> hit test; else $46 counts down and at 0 -> saucer_reroll_behaviour; outside the demo $45=1, $47=0. With $47 clear: saucer_common_update."
  },
  {
   "address": 42482,
   "type": "line",
   "text": "Shared saucer logic. If $58 (256-frame time counter) >= 24 the saucer leaves: lifetime $83E2=0, voices 2/3 off, schedule_next_spawn. Otherwise voice 3 hum: SR $80, AD 0, triangle $11, pitch derived from the range $31. $44 move countdown (the saucer keeps its course) -> hit test. $45 wait countdown: while running the saucer stops ($17A2=0), $48=$10; at 0 for types 0-1 outside the demo with $46 set: $48=0, $91=$FF -> saucer_tone_from_91. With $45=0: if $91 >= $92 (threshold $8FC0[difficulty]) $91 -= 4 and retune, else $47=$FF, $48=$10 and reroll when $46=0."
  },
  {
   "address": 42579,
   "type": "line",
   "text": "Voice 3 pulse tone ($41) with frequency derived from $91 (stored, then complemented and split into hi/lo), then hit test."
  },
  {
   "address": 42643,
   "type": "line",
   "text": "Re-rolls the saucer's behaviour parameters. X = $3B + (rnd|$FC)+1 (difficulty $3B minus 0..3): $92 = $8FC0[X], $44 = rnd&$3F (passes of moving), $45 = rnd&$1F+8 (passes of waiting), $47=$46=0, $48=1. $46 (evasion count) = from rnd & $8EC0[X] nibbles when rnd & mask & $0F is 0 and the range $31 < $F0. Falls into saucer_set_speed_and_heading."
  },
  {
   "address": 42726,
   "type": "line",
   "text": "$17A2 (saucer speed) = $8F00[X] (X = difficulty index). Heading: rnd < $68C8 ($30, demo $20) -> the bearing computed at compute_enemy_bearing ($2F:$39), else a random heading; $B5A1 with X=2 rebuilds the motion vector. Then check_enemy_hit."
  },
  {
   "address": 42765,
   "type": "line",
   "text": "Behaviour handler for types 7 and 13: fire per script every pass it is allowed, no evasion; then check_enemy_hit."
  },
  {
   "address": 42771,
   "type": "line",
   "text": "State handler after entering the stargate. Gate lifetime $83E3: 0 -> warp_travel_frame; 1 -> warp_travel_start; otherwise warp_tone_update and continue."
  },
  {
   "address": 42786,
   "type": "line",
   "text": "$90=$1F, $58=0, $1B=0, voices 2/3 gate off, AD 0, SR $F0; $9A=8 (next sphere slot), $9D = $63 (level saved), $63=$80 (selects the warp colour block at $8090 for $B920), $A7=$77, $83=0."
  },
  {
   "address": 42839,
   "type": "line",
   "text": "Once $A5 >= $40 and every 3 passes ($5E): spawn a sphere in slot $9A (cycles 8..23): place_object_at_player with a random heading offset and speed $14, lifetime $50, shape from tbl_warp_sphere_shapes[rnd&7], $15A0=0. While $58 (256-frame units since warp start) < 4, $A5 counts up (saturating at $FF: full speed); after that $A5 counts down and at 0 -> level_complete."
  },
  {
   "address": 42904,
   "type": "line",
   "text": "Warp survived: $A7=$AE=0, object 2 placed at the player (place_object_at_player X=2, Y=3), $90=$5F, next level index $63 = ($9D-$10)&$70 (16 less per level; $70 = level 1 ... $00 = level 8, wrapping to $70), records it in $68CB when lower (highest level reached, kept in the title screen's hidden row 5 for the level keys), advances the wide-font level digit at $6014/$6015 by one (two INCs per cell), $83=$FF, $9E=2 (the level's two new saucer types are spawned first), $9C=$D0, then schedule_next_spawn."
  },
  {
   "address": 42976,
   "type": "line",
   "text": "8 shape numbers for warp spheres, picked by rnd&7: $23,$23,$23,$22,$22,$22,$21,$21 (three sizes; $21-$23 are also the enemy-shot shapes)."
  },
  {
   "address": 42984,
   "type": "line",
   "text": "8 bytes indexed by level-1: warp top speed $50,$58,$60,$68,$70,$78,$80,$A0, plus the skill bonus $A9 -> $9C (spawn_next_enemy_setup)."
  },
  {
   "address": 42992,
   "type": "line",
   "text": "State handler while a homing missile is live. Left console light row 19 (offset 0 via $AA70) alternates red (2) and pink ($0A) each pass, read back from $DB00. $AD26 (X=0, Y=2) tests the missile against the player: carry clear -> $AB9A (player hit, other range). Missile whine: voices 2 and 3 (triangle $11) with frequencies derived from the range $31 (closer = higher). Weaving while far: when the range $31 is at or above $40 (set per difficulty from $8E40) the heading $84A2:$84C2, just set to the bearing, is moved by the turn $37 (subtracted when $38 is set, added when clear); every $36 passes a new $37 = rnd and $36 = rnd&$3F+1 are picked and $38 is toggled. Below $40 the heading stays the bearing, so the missile flies straight in (live: every recorded missile pass, 675 of them). Then update_enemy_motion_vector and check_enemy_hit."
  },
  {
   "address": 43156,
   "type": "line",
   "text": "Tests the enemy (object 2) against the three player shots (objects 1, 4, 5) with $AD26; a hit (carry clear) -> enemy_destroyed, else continue the main loop at $AAC8."
  },
  {
   "address": 43186,
   "type": "line",
   "text": "Enemy killed by a player shot. $58=0, enemy lifetime cleared, voices 2/3 off, $48=$91=0, $83E2=0. Console lights: row 21 orange (8), row 19 red (2). $5A=$3F, voice 3 explosion noise (AD $0B, SR 0, $81). Score: $A0 = BCD table index ($8BA0+X): missile ($33<>0) -> $0C = 500 points and difficulty ramp $3D=$80; saucer -> type*4+$10 = 100*(type+1) points ($8BB0 table, 100..1600) and $3D=$40; $A1 = level-1 makes $AAC8 add the value level times. Enemy counter $8BA8 decremented in BCD; at 0: $69=$FF (stargate phase) and the shield digit at $6026/$6027 is raised by one unless it is already 9 ($92). Redraws the counter (columns 28-31). Spawns 8 explosion fragments in objects 24-31: lifetime $20, at the enemy's position, headings 0-7, $B5A1 motion vectors; $A7 = $8CFF (white). Then schedule_next_spawn."
  },
  {
   "address": 43362,
   "type": "line",
   "text": "$4C=$FF, $4D = rnd&$1F+8 passes until the next spawn, then the state vector returns to state_between_enemies and the main loop continues at $AAC8."
  },
  {
   "address": 43386,
   "type": "line",
   "text": "Steps the enemy's fire script. If the fire delay $5E is running: carry set, return. Else reads $8C00[$7B+1]: $FF means loop, $7B = $8C00[$7B+2] and carry clear; otherwise it is the new delay $5E, $7B advances to the following spread byte and spawn_enemy_shot fires; carry set. Scripts are (delay, spread) pairs ending in $FF, loop-target, starting at $8C00 + $8C00[type]."
  },
  {
   "address": 43418,
   "type": "line",
   "text": "Fires an enemy shot into the first free slot 8-23 (lifetime $83E0,x = 0). $54=$59=$12 (the light-blue flash time), speed $17A0,x = $A6 (skill table), shape from $8448 ($22/$23), voice 2 noise burst (freq hi $14, AD 8, SR 0, $80/$81), $5A=7, lifetime $30. Heading = the bearing $2F:$39 plus the script's spread byte (bit 7 set: random within the low bits, centred). Position copied from the enemy (object 2), $15A0=0, $B5A1 motion vector, right console light row 23 = light blue ($0E): 'saucer firing'."
  },
  {
   "address": 43561,
   "type": "line",
   "text": "Puts object X at the player's position, heading = player heading + A (signed), speed Y; builds the motion vector ($B5A1), halves the two 16-bit velocity words ($1600/$1620 and $1660/$1680), moves one step ($B65D) and then sets the object's speed to 0. Used for warp spheres, the post-warp enemy and near-player saucer spawns."
  },
  {
   "address": 43632,
   "type": "line",
   "text": "Colour one pair of console lamps. A = colour, X = colour-RAM row offset: 0 = console row 19 (the top lamp on each side), $50 = row 21 (middle lamp), $A0 = row 23 (bottom lamp). Writes A to colour RAM $DAFF+X..$DB03+X (columns 7-11, inside the left lamp frame) and $DB14+X..$DB18+X (columns 28-32, the right frame); those screen cells hold the solid console character $D0, so the colour is the lamp. Callers: level start $A004 (row 21 = 8 orange) and $A00B (row 23 = 6 blue); $A466 row 21 = 7 yellow (saucer launched); $A8CC row 21 = 8 orange again (saucer gone) then $A8D3 row 19 = 2 red; $A7FB/$A800 row 19 = $0A light red / 2 red alternately (the homing-missile flash); $AA22 row 23 = $0E light blue (saucer fires) and $A0C6 puts row 23 back to 6 blue when the flash timer $59 runs out. This is the manual's yellow = saucer present, blue flashing = saucer firing, red flashing = missile."
  },
  {
   "address": 43663,
   "type": "line",
   "text": "Roll the number of enemies for a new level: takes a byte from the random generator $BC1E, mixes it (A + A/4, rotated left four times, low nibble kept) and ORs $10, storing it as BCD in $8BA8, the enemies-remaining counter shown as E<nn> in the status row. Result $10-$1F BCD = 10 to 19 enemies. Called from $9F9A (game start) and $A32B (when the counter has reached zero and the next level begins). Scratch: $FF."
  },
  {
   "address": 43685,
   "type": "line",
   "text": "Enemy behaviour dispatch table, high bytes (16 entries indexed by enemy type $7A; low bytes at $AAB5). Read at $A31A when a new enemy is launched ($A303: object 2 activated, gate slot 7 given lifetime $20): the pair goes to $A3/$A4 and is jumped through with JMP ($A3). Only four distinct targets in the enemy-behaviour block: $A5D6 (types 0-4, 6, 8, 10), $A563 (types 5, 11), $A5C7 (types 9, 12, 14, 15), $A70D (types 7, 13)."
  },
  {
   "address": 43701,
   "type": "line",
   "text": "Low bytes of the enemy behaviour dispatch table (see tbl_enemy_behaviour_hi at $AAA5), 16 entries indexed by enemy type $7A, read at $A315."
  },
  {
   "address": 43717,
   "type": "line",
   "text": "Trampoline for the hit loop below: jump to player_destroyed ($AB9A) when test_object_hits_player returns carry clear for an enemy or enemy shot."
  },
  {
   "address": 43720,
   "type": "line",
   "text": "End-of-pass part of the main loop: every enemy behaviour routine in $A29B-$A977 jumps here and it jumps back to the loop head at $A04C. (1) Pays out a pending score award: while $A1 is non-negative it decrements it and adds the BCD value at $8BA3+$A0 to the score with add_score_bcd ($B8B8), one award per pass. (2) Loops Y = 8..$17 (the enemy and enemy-shot slots) calling test_object_hits_player ($AD26) with X = 0 (the player); carry clear = hit -> player_destroyed via $AAC5. (3) Radar blip (sprite 0): skipped (sprite 0 off, $42 = 0) while $56 or $4C is set. Otherwise object slot 6 is used as a polar-to-cartesian converter: its speed $17A6 = ($31 - $80)/4 (0 when $31 < $80), compute_object_velocity ($B5A1) turns that and the slot's heading $84A6/$84C6 into the velocity vector $1606:$1626 / $1666:$1686; each component >> 2, + $80, scaled by $9E/256 resp. $78/256 (mul8 $B4C0) and offset by $52 resp. $A1 gives sprite 0 X/Y. Inside $80-$C1 x $C4-$F5 (the radar box under the view) sprite 0 is enabled ($D015 bit 0) and its Y kept in $42, else disabled. $17A6 is then restored to $20. (4) $56 = $4C. (5) If $6C = 0: calls $6A14, decrements $6C and jumps to $9E9F (outside this range). (6) Else adds $3D to the 16-bit $3B:$3C (high byte only stored while below $40), clears $3D, takes a random byte r ($BC1E): $9F = NOT (r*r/256) and $3E = (r*r/256) * $3B / 256; purpose of $3B/$3E/$9F unknown. Uses $74 as the loop index."
  },
  {
   "address": 43930,
   "type": "line",
   "text": "Player hit by an enemy or enemy shot (from $AAC5 and $A80E). Calls $6A1A, sets the frame countdown $1D = $3F and plays a noise burst on SID voice 1 (frequency $1414, AD $0B, gate+noise $81), silences voices 2 and 3 ($D40B/$D412 = 0), then until $1D reaches zero (it is decremented by the interrupt) flashes the background colour $D021 through successive bytes of the code at $A800+Y XOR 1, a cheap pseudo-random colour sequence, only while $AA is non-zero. Then the shields digit in the status row ($6026/$6027, the wide-font digit after the S) is decremented by one (wide digit n is code $80+2n); if it was already 0 ($80) falls into game_over_scores, otherwise jumps to $9FA4 to restart the level with one shield fewer. Registers used: $D400/$D401/$D404/$D405/$D40B/$D412/$D021."
  },
  {
   "address": 44010,
   "type": "side",
   "text": "unreachable bytes: JMP $0000 after the JMP above"
  },
  {
   "address": 44013,
   "type": "line",
   "text": "Game over (no shields left). Unless $71 is set (then everything is skipped; meaning of $71 unknown): copies the title screen SCORE line ($6A72, 14 cells = 7 wide-font digits) to the LAST SCORE line ($6AC2), then the status-row score ($6000-$600D) into the SCORE line; compares the 4-byte BCD score $8BA0-$8BA3 with the high score $8BA4-$8BA7 (most significant byte first) and, if the score is higher, copies it over and writes the status-row digits (masked to $80-$BF) into the HIGH SCORE line at $6B12. Then calls $6A08 and jumps to the title screen at $9C5C. The three bytes $4C 00 00 at $ABEA (a JMP $0000) are never executed."
  },
  {
   "address": 44080,
   "type": "line",
   "text": "Test and resolve object X's collision with an obelisk. Returns carry set when nothing happened (object inactive: $83E0,x = 0; no obelisk in its map cell; or the obelisk's range code >= $4F) and carry clear when it collided. Map cell = ((position hi $8260,x + 8) & $F0) | ((position hi $8320,x + 8) >> 4), a 16x16 grid over the two world axes, looked up in the obelisk map $8A00 (0 = empty, else the obelisk's object index $20-$5F, kept in $15). With Y = that obelisk and $1E/$1F = the object's heading, object_delta_octant / bearing_from_viewer / log_distance_code ($B6A2/$B729/$B766) give the range; below $4F the object is put back on its previous position ($16C0/$16E0/$1700/$1720 -> $8260/$82C0/$8320/$8380), its heading $84A0,x:$84C0,x is turned by the relative bearing of the object seen from the obelisk (only the high and middle position bytes are restored, not $15C0/$15E0): new heading = H + 1028 + 4 * ((B - H) mod 512) in 2048ths, H the heading and B the bearing of the object from the obelisk, so a head-on hit comes back reversed and an offset d turns it by 4d (live: all recorded bounces) and compute_object_velocity ($B5A1) is rerun. Callers: $A082/$A089/$A090 for the player's shots (slots 1, 4, 5) and $A0D6 for slots 8-$17; the caller collects the carries in $5D. Scratch: $15, $50, $51, $FF."
  },
  {
   "address": 44214,
   "type": "line",
   "text": "Fire the player's shot (called from $A252 on the fire button). Does nothing while the cooldown $5C is non-zero or while all three shot slots 1, 4 and 5 are active ($83E0,x != 0). Otherwise, if the sound countdown $1D is below $0F, plays the shot noise on SID voice 1 ($1D = $0C, frequency $1414, AD $08, gate+noise $81). The free slot X gets lifetime $83E0,x = $18 passes, the player's heading ($84A0/$84C0 of object 0) and position ($8260/$82C0/$8320/$8380 of object 0), $15A0,x = 0, the cooldown $5C = 8, and compute_object_velocity ($B5A1) sets its velocity from its speed $17A0,x."
  },
  {
   "address": 44326,
   "type": "line",
   "text": "Hit test of object Y (an enemy or enemy shot, slots 8-$17) against the player (X = 0 on entry). Returns carry clear = hit, carry set = miss. An inactive object ($83E0,y = 0) is a miss. Otherwise the absolute bearing of object Y from the player (object_delta_octant $B6A2 and bearing_from_viewer $B729 with $1E/$1F = 0) is stored >> 3 in $1580,y, the previous value kept in $3A, and the range code from log_distance_code ($B766) decides: below $80 = hit; $C0 or more = miss and $15A0,y = $FF (arms the flag); $80-$BF = a hit only when the flag $15A0,y is set and the bearing changed by $57 or more since the last pass (the object crossed the player's position between two passes), else a miss with the flag set. Note: on the inactive-object exit X is still the caller's 0, so $15A0[0] gets $FF instead of $15A0,y. Scratch: $15, $FF."
  },
  {
   "address": 44405,
   "type": "line",
   "text": "RTS used as the end-of-script exit of draw_shape (script byte $00)."
  },
  {
   "address": 44406,
   "type": "line",
   "text": "Draw one scaled object shape into the current draw screen as character cells; called from draw_visible_list ($B8A6/$B8B4), farthest object first. Inputs: X = draw type 0-3 (kept in $06): fill character $0B = $BC81[X] = $00/$20/$40/$60, four static characters whose bitmaps are empty, 01-dither, 10-dither and solid, and texture byte $8E = $BD81[X] = $00/$55/$AA/$FF; Y = shape number = family*32 + size index 0-31 (families 0-6; $8440,x & $E0 gives the family: obelisks 0, shots/drones 1, saucer 2, slots $18-$1F use 4-6; Y >= $E0 is the stargate, drawn by $BA04 instead); $12 = fine horizontal position in 2-pixel units ($80 = screen centre) and $04 = $12/4; $0A = draw screen page minus 1 ($5F for $6000, $63 for $6400: the view is double buffered); $05 and $FD/$FE = next free dynamic character code and its bitmap address; $09 = charset base / $800 (8 = $4000, $0A = $5000). Script pointer $F7/$F8 = $9600[Y] (lo) / $9700[Y] (hi). SCRIPT FORMAT. Byte 0 bits 0-6 = 10 * (first screen row - 1): $0A..$50 = rows 2-9, so the vertical position is baked into each size (small = far = near the horizon); the row pointer $F9/$FA = $0A:00 + 4*(byte0 & $7F) + $28, chosen so that ($F9),Y with Y = $D8 + column addresses the row and Y < $D8 or Y >= 0 means off screen. Every shape exists in four 2-pixel sub-cell shifts, chosen by $12 & 3. Byte 0 bit 7 clear: two variants; shift 1 starts at byte 2, shift 0 at byte (script[1]+1); shifts 2 and 3 use the same two variants drawn right-to-left by draw_shape_mirrored ($AE49), which is only correct for symmetric shapes. Bit 7 set: four variants all drawn left-to-right; shift 3 starts at byte 4, shifts 0/1/2 at script[1]+1, script[2]+1, script[3]+1. Body bytes: $00 = end. $01-$1E (only $01-$0F occur) = start of the next screen row: $F9 += 40, first column = $04 - 11 - n ($02 = $04 + $CD - n); a row starting past column 39 is skipped (draw_shape_skip_row). $20-$3F = run of (n & $1F) fill cells written with $0B, clipped to columns 0-39 (a run reaching column 40 ends the row); $20 writes nothing but still flips the edge side; after a run $03 = type | 4 (edge lies right of the fill), after a row start $03 = type. $40-$FF = one edge cell with profile n from set 1 (draw_edge_cell $AEDB). $1F n = one edge cell with profile n (0-$7F) from set 2 (draw_edge_cell_alt $B053). Each edge cell advances the column by one. The only character codes written are the fills from $BC81 and freshly allocated codes from $05. Scratch: $15 = script index, $02 = column (Y form), $03 = edge context, $F9-$FE."
  },
  {
   "address": 44481,
   "type": "line",
   "text": "Forward (left-to-right) interpreter loop of draw_shape: fetch script byte $15+1 and dispatch: $00 end, >= $40 edge cell ($AE27), $1F edge cell from set 2 ($AE37), $01-$1E row start ($AE05), $20-$3F fill run of n & $1F cells with $0B at ($F9),Y from Y = $02, writing only while Y >= $D8 (column >= 0) and ending the row when Y wraps to 0 (column 40); then $03 = $06 | 4."
  },
  {
   "address": 44531,
   "type": "line",
   "text": "Skip the rest of the current row when it went past the right screen edge: reads script bytes until a $00 (end, RTS) or a row-start byte below $11; a $1F skips its operand byte too."
  },
  {
   "address": 44549,
   "type": "line",
   "text": "Row-start byte n ($01-$1E): column register $02 = $04 + $CD - n (column = $04 - 11 - n), row pointer $F9/$FA += 40 (next screen row); if $02 is not negative the row starts at or beyond column 40 and is skipped, otherwise $03 = $06 (edge lies left of the fill) and the interpreter continues."
  },
  {
   "address": 44583,
   "type": "line",
   "text": "Edge byte n >= $40: if the column is on screen ($02 >= $D8) draw_edge_cell ($AEDB) paints the profile; then the column advances and a wrap to column 40 skips the rest of the row."
  },
  {
   "address": 44599,
   "type": "line",
   "text": "$1F n: the operand n is the set-2 profile; if on screen draw_edge_cell_alt ($B053) paints it, then the column advances as for a set-1 edge."
  },
  {
   "address": 44617,
   "type": "line",
   "text": "Right-to-left variant of the draw_shape interpreter, used for sub-cell shifts 2 and 3 of scripts with byte 0 bit 7 clear ($12 & 3 = 2 starts at byte 2, = 3 at script[1]+1). Same byte format, but: a row start n sets $02 = $04 + $CB + n (column = $04 + n - 13) and columns walk leftwards (DEY); fill runs and edge cells write only while $02 >= $80 (not wrapped past the right edge) and a step below $D8 (left of column 0) skips the rest of the row; the edge-context bit is inverted ($03 = type | 4 after a row start, $03 = type after a run) so the edge profiles are mirrored too. Correct only for left-right symmetric shapes."
  },
  {
   "address": 44628,
   "type": "line",
   "text": "Interpreter loop of draw_shape_mirrored: same dispatch as draw_shape_next_byte with the column stepping down; fill run writes $0B while Y >= $80 and stops the row when Y drops below $D8."
  },
  {
   "address": 44678,
   "type": "line",
   "text": "Mirrored twin of draw_shape_skip_row: skip bytes to the next row start (below $11) or end; $1F skips its operand."
  },
  {
   "address": 44696,
   "type": "line",
   "text": "Mirrored row start: $02 = n + $CB + $04, $F9/$FA += 40; a start left of column 0 ($02 < $D8) skips the row, else $03 = $06 | 4."
  },
  {
   "address": 44730,
   "type": "line",
   "text": "Mirrored edge byte n >= $40: draw_edge_cell if the column is on screen ($02 >= $80), then step left; below column 0 the row is skipped."
  },
  {
   "address": 44748,
   "type": "line",
   "text": "Mirrored $1F n edge: draw_edge_cell_alt with profile n if on screen, then step left."
  },
  {
   "address": 44763,
   "type": "line",
   "text": "Paint one edge cell of a shape at screen cell ($F9),Y with set-1 profile A ($40-$FF, kept in $10). Reads the code already in the cell: if it is a dynamic character (code & $9F != 0, mask at $BC7E) its bitmap at $09*$800 + code*8 ($FB/$FC) is edited in place: for each of the 8 pixel rows the profile row table ($8FC0, $9080, $9140, $9200, $92C0, $9380, $9440, $9500 indexed by the profile, i.e. entries $9000-$95FF) gives a coverage index (0-$78, a multiple of 8), OR $03 (type in bits 0-1, bit 2 = fill lies to the left), and $BC85[i] (AND mask) / $BD05[i] (OR pattern) paint the covered 2-pixel pairs with the type's texture (01/10/11 dither, or clear for type 0) leaving the other pixels as they were. This is how overlapping objects composite. If the cell holds a static character ($00/$20/$40/$60) it continues at draw_edge_cell_new_char ($AF95)."
  },
  {
   "address": 44949,
   "type": "line",
   "text": "Second half of draw_edge_cell for a cell holding a static fill character: $07 = $BD81[old code >> 5] = the texture that was there (sky $00, dithers $55/$AA, solid $FF), the next dynamic code $05 is written to the screen cell and its 8 bitmap rows at ($FD) are built as ($07 AND $BC85[i]) OR $BD05[i], i = set-1 profile row table entry OR $03, then falls into alloc_next_char."
  },
  {
   "address": 45094,
   "type": "line",
   "text": "Shared tail for row 7 of a newly allocated edge character; also the join point from the set-2 version at $B19E. Falls into alloc_next_char."
  },
  {
   "address": 45109,
   "type": "line",
   "text": "Advance the dynamic character allocator after a new edge character. $05 += $20 with the carry folded back in, so the codes run $80, $A0, $C0, $E0, $01, $21, ... $E1, $02, ...: column-major through the eight 32-character pages, skipping the reserved static fills $00/$20/$40/$60 and keeping the used characters at low column numbers so the reflection copy at $B239 only has to copy characters 0..($05 & $1F) of every page. Bitmap pointer: $FE = ($FE + 1) & $F7 (next 256-byte page, wrapping inside the 2 KB charset) and $FD += 8 once every 8 allocations. Also reached from $BBFF (stargate drawing)."
  },
  {
   "address": 45139,
   "type": "line",
   "text": "Twin of draw_edge_cell ($AEDB) for a '$1F n' script byte: profile n (0-$7F, kept in $10) comes from set 2, whose row tables are $9800, $9880, $9900, $9980, $9A00, $9A80, $9B00, $9B80 (entries are indexes into $BC85/$BD05, not all multiples of 8). Edits an existing dynamic character in place with the same mask/pattern scheme, or continues at $B10D (outside this range) to allocate a new one."
  },
  {
   "address": 45325,
   "type": "line",
   "text": "Tail of the column-drawing routine $B053: the view cell at ($F9),Y holds a base char (code AND $9F = 0, tested with $BC7E), so a fresh dynamic char is allocated. $07 = base pixel pattern for that cell from $BD81 indexed by (code<<4 | code>>5); $05 (next char code) is written into the screen cell; then rows 0-6 of the new char are built at ($FD): row r = ($07 AND $BC85[p]) OR $BD05[p], p = row byte r of column shape $10 from the 8 tables $9800,$9880..$9B80, OR $03 (colour bits, 2 in the snapshot). Row 7 and the allocator step ($05 += $20 with wrap so codes cycle $80,$A0,$C0,$E0,$01,$21..; $FE++ inside the 2K charset; $FD += 8 every 8th char) follow at $B026/$B035."
  },
  {
   "address": 45473,
   "type": "line",
   "text": "Start of a new view frame. Called at game start ($9EEA) and once per main-loop pass ($A19B, after $1A was set to display the buffer just finished). Increments the pass/buffer counter $08; its bit 0 selects the draw buffer: 0 = screen $6000 + charset $4000, 1 = screen $6400 + charset $5000. Clears the sky half of the view (rows 2-9, offsets $050-$18F) of that buffer to char $00, then resets the dynamic-character allocator: $05 = $80 (next char code), $FD/$FE = bitmap of char $80 ($4400 or $5400), $09 = charset base/2048 (8 or 10, used at $B063 to locate an existing char's bitmap), $0A = screen page minus 1 ($5F or $63, high-byte base for the row pointers built at $AD9F). The ground half (rows 10-17) is not cleared: $B1EC regenerates it by mirroring."
  },
  {
   "address": 45548,
   "type": "line",
   "text": "End of view drawing, called from $A10C after the object drawing routines. Produces the ground half of the 3D view as a vertical reflection of the sky half in the buffer just drawn ($08 bit 0: 0 = $6000/$4000 here, 1 = $B279 for $6400/$5000). Copies screen rows 2..9 into rows 17..10 with every char code EOR $FF, then byte-reverses charset $4000 into $4800 so char c, rows flipped top-to-bottom, becomes char $FF-c; only slots 0..($05 AND $1F) of each of the eight 32-char page groups are copied, i.e. exactly the chars allocated this frame (see the allocator at $B035). The raster stage at line 130 ($B3C0) switches $D018 to the +$800 charset for rows 10-17, so every object appears reflected in the ground without computing any new pixels."
  },
  {
   "address": 45558,
   "type": "side",
   "text": "screen rows 2..9 -> rows 17..10, char codes EOR $FF"
  },
  {
   "address": 45636,
   "type": "side",
   "text": "charset $4000 byte-reversed into $4800: chars flipped top-to-bottom, order reversed; slots 0..$05&$1F of every 32-char page"
  },
  {
   "address": 45689,
   "type": "line",
   "text": "Second-buffer half of $B1EC: rows 2..9 of screen $6400 copied inverted into its rows 17..10, and charset $5000 byte-reversed into $5800 for slots 0..($05 AND $1F) of every 32-char page group. Returns to the caller of $B1EC."
  },
  {
   "address": 45822,
   "type": "line",
   "text": "Raster IRQ stage 1 of 7, fires at line $10 = 16 (above the picture; armed by stage 7). $D021 = $0B dark grey: the background behind the status row (screen rows 0-1, lines 50-65). $D018 is still $8E (screen $6000, charset $7800 small/wide font) and $D016 = $08 (hi-res) from stage 7. Arms $B31D at line $42 = 66. No game work; restores Y,X,A pushed by the KERNAL entry and RTIs."
  },
  {
   "address": 45853,
   "type": "line",
   "text": "Stage 2, line 66 = first line of view row 2. Four NOPs delay the change towards the row boundary. $D018 = $1A ($80: screen $6000 + charset $4000, or $94: screen $6400 + charset $5000; the buffer completed last frame, chosen at $A199 from $BC7F[$08 AND 1]). $D016 = $18: multicolour text mode on for the view, so the dynamic chars are 2-bit pixels drawn in $D021/$D022/$D023/colour RAM. $D021 = $BB sky colour (this frame's nibble of $AC; $E light blue on level 1). $AA = $FF flags 'raster is inside the 3D view' (tested at $ABC9 before $D021 is flashed from the main loop). Arms $B34E at line $79 = 121."
  },
  {
   "address": 45857,
   "type": "side",
   "text": "$1A = $80 or $94: screen+charset of the buffer completed last frame"
  },
  {
   "address": 45864,
   "type": "side",
   "text": "$18 = multicolour text mode on for the view rows"
  },
  {
   "address": 45902,
   "type": "line",
   "text": "Stage 3, line 121 (last line of row 8, so the change lands at the top of row 9): $D021 = $BC, first horizon band colour (nibble of $B2). Arms $B374 at line $7D = 125."
  },
  {
   "address": 45940,
   "type": "line",
   "text": "Stage 4, line 125: $D021 = $BD, second horizon band colour (nibble of $B3). Arms $B39A at line $80 = 128."
  },
  {
   "address": 45978,
   "type": "line",
   "text": "Stage 5, line 128: $D021 = $BE, third horizon band colour (nibble of $B4; $6 blue on level 1 while bands 1-2 are $E). Stages 3-5 together paint a three-band gradient across screen row 9, the horizon row. Arms $B3C0 at line $82 = 130."
  },
  {
   "address": 46016,
   "type": "line",
   "text": "Stage 6, line 130 = first line of row 10, the top of the ground half. $D018 = $1A OR $02: same screen, charset +$800 ($4800 or $5800), the byte-reversed copy made by $B1EC, so rows 10-17 show the sky-half chars upside down (the ground is a reflection of the sky). $D021 = $AD ground colour ($5 green on level 1; used directly, no nibble split). Arms $B3EA at line $C2 = 194."
  },
  {
   "address": 46020,
   "type": "side",
   "text": "+$800 = the mirrored charset $4800/$5800"
  },
  {
   "address": 46058,
   "type": "line",
   "text": "Stage 7, line 194 = first line of row 18, the console. $D018 = $8E: screen $6000 (both buffers share the status and console rows of $6000) with charset $7800 (small/wide font and console pieces); $D016 = $08 hi-res; $D021 = 0 black; $AA = 0 (outside the view). Re-arms stage 1 ($B2FE at line $10 = 16). Then, once per frame, does the game's timer, sound and colour housekeeping at $B415-$B4BF before RTI. This is the only stage doing work beyond colours: no sprite multiplexing and no music player anywhere in the chain."
  },
  {
   "address": 46064,
   "type": "side",
   "text": "$8E = screen $6000, charset $7800 (font), for console and status"
  },
  {
   "address": 46101,
   "type": "line",
   "text": "Per-frame work inside stage 7, part 1: voice 1 noise sequencer. $1D is a countdown in frames: while non-zero it is decremented and voice 1 is left alone (jump to $B444); on the frame it reaches zero, $94 = $93 and $D405 = 0 (attack/decay). With $1D = 0: if $93 = 0 voice 1 gets $D404 = $01 (gate only, no waveform: silent); otherwise $94 steps through the pitch loop at $80C8 (a 0 byte ends it, restart at index $93), the entry goes to $D401 (voice 1 frequency high) and $D404 = $81 (noise, gate on). So $93 selects a looping noise-pitch pattern in $80C8 (0 = off; 0 in the snapshot). Which game sound uses it: unknown."
  },
  {
   "address": 46140,
   "type": "side",
   "text": "voice 1 noise pitch from table $80C8"
  },
  {
   "address": 46148,
   "type": "line",
   "text": "Stage 7 part 2. $5A: generic frame countdown, decremented to 0 (set at $9E28 and $A0E8). Voice 3 pitch warble: if $48 is non-zero, $49 steps through the table at $80A0 (0 byte = end, restart at index $48) and the entry is written to $D40F (voice 3 frequency high). $48 = $10 in the snapshot selects the 8-step loop 40 38 30 28 20 28 30 38 at $80B0, a slow siren-like wobble; live later it was 0 (off). Which enemy indicator sound this is: unknown; voice 3 is also driven directly by the main loop at $A1B8-$A1E7."
  },
  {
   "address": 46172,
   "type": "side",
   "text": "voice 3 pitch from table $80A0"
  },
  {
   "address": 46175,
   "type": "line",
   "text": "Stage 7 part 3: frame counter and colour flip. $1B++ per frame; $58++ when it wraps (every 256 frames; $58 is cleared when the joystick is idle at $A14D and at $9FD4, and is never read in the disassembled code). Bit 0 of $1B chooses which nibble of the colour-pair bytes is shown this frame: even frames the low nibble, odd frames the high nibble (lsr x4). Writes $D023 from $A7 (object colour: 7 yellow at game start $9FF1, later from the sequence at $8CF0 via $A15D), $D022 from $AB, and the band colours the raster stages consume: $BB = $AC (sky), $BC = $B2, $BD = $B3, $BE = $B4 (horizon bands). A byte whose nibbles differ flickers between two colours at 25 Hz to fake a blend; the level-1 record ($8080: 11 EE 05 08 FA 02 FE EE EE 66, copied to $AB-$BA by $B920) has equal nibbles everywhere, so nothing flickers there. Restores registers and RTIs."
  },
  {
   "address": 46183,
   "type": "side",
   "text": "carry = bit 0 of the frame counter: odd frames use the high nibbles"
  },
  {
   "address": 46272,
   "type": "line",
   "text": "Unsigned 8x8 multiply: A * Y -> 16-bit product, returned as A = high byte, Y = low byte. Scratch: $20 multiplicand, $21 multiplier (shifted out), $22 low byte. Shift-and-add over 8 iterations. Entry $B4C2 takes $20 preset by the caller and Y as the multiplier. Called from the main loop ($A1A4, $A1D5, $A1D9), object code ($AB13, $AB36 ...) and $BA15-$BA2A."
  },
  {
   "address": 46274,
   "type": "line",
   "text": "Alternate entry of mul8x8: $20 already holds the multiplicand, Y is the multiplier. Same result: A = high byte, Y = low byte."
  },
  {
   "address": 46296,
   "type": "line",
   "text": "Turn right. Called from the main loop ($A217) while joystick right is held ($6D bit 3 low). Adds the turn step $23 to the 11-bit angle $84A0:$84C0 entry 0, high byte masked to 3 bits so it wraps mod 2048: the player's heading (entries 1-31 of the same lo/hi tables belong to the other objects and are read indexed at $AC57). Then $23 = $25, so the first pass of a turn moves by 2 ($A21F sets $23 = 2 whenever right is not held) and every later pass by $25 (10 in the snapshot)."
  },
  {
   "address": 46320,
   "type": "line",
   "text": "Turn left, the mirror of $B4D8. Called from $A227 while joystick left is held ($6D bit 2 low). Subtracts the step $24 from the player's heading $84A0:$84C0 (mod 2048) and continues at $B500, which stores the wrapped high byte and sets $24 = $25."
  },
  {
   "address": 46336,
   "type": "side",
   "text": "Tail of the turn-left routine entered at $B4F0: stores the wrapped heading octant and reloads the turn step $24 from $25."
  },
  {
   "address": 46344,
   "type": "line",
   "text": "Move the player (object 0) forward one step, joystick up. Sets the motion direction $2E=0 (octant offset, forward) and falls into player_move_checked. Called from $A1EC (warp/high-speed mode, unconditional) and $A205 (joystick bit 0 clear). Player cruise speed is $17A0 (= $68, set per skill from $8F84)."
  },
  {
   "address": 46348,
   "type": "line",
   "text": "Move the player in direction $2E (0 = forward, 4 = reverse) unless the nearby object blocks the way. $2D = index of the object that scan_visible_objects found within 4 high-byte units of the player this pass (0 = none). Its bearing octant $14C0,y (0..7 relative to the player's heading) is XORed with $2E: result 0 or 7 = the object lies within +-45 degrees of the direction of travel, so if its log-distance $1740,y < $43 (threshold, $90 in the snapshot) the move is refused and player_blocked_bump plays the bump; result 3 or 4 = the object is directly behind, the player moves at a fixed speed $20 instead of $68 (temporarily written to $17A0); any other octant, or no nearby object = normal move via compute_object_velocity + apply_object_velocity with X=0 and the bump timer $1C cleared. Obelisks (objects $20-$5F) and objects $18-$1F are the only ones that can be in $2D."
  },
  {
   "address": 46378,
   "type": "line",
   "text": "Nearby object is behind the player: move object 0 at the fixed speed $20 (saved cruise speed $68 is restored to $17A0 afterwards), clearing the bump timer $1C."
  },
  {
   "address": 46399,
   "type": "line",
   "text": "Player ran into the nearby obstacle: no movement. If the bump timer $1C is zero, start it and the voice-1 sound timer $1D at $2C (44 frames) and gate a noise burst on SID voice 1 (freq $1414, AD $0A, control $80 then $81 = noise gated). $1C != 0 also switches the engine-sound table index at $A23C."
  },
  {
   "address": 46433,
   "type": "line",
   "text": "No obstacle ahead: clear the bump timer $1C, compute object 0's velocity from its heading and speed $17A0 and add it to its position."
  },
  {
   "address": 46444,
   "type": "line",
   "text": "Move the player backwards (joystick down, $A20E). Sets direction $2E=4, flips the heading octant $84A0 by 4 (180 degrees), runs player_move_checked (so the obstacle test looks behind the player), then flips the heading back. The speed is the same cruise speed as forward."
  },
  {
   "address": 46468,
   "type": "line",
   "text": "Per-pass motion of the non-player objects 1..$1F (called from $A04C at the top of the play loop; obelisks $20-$5F never move). For each object whose state byte $83E0,x is nonzero (active) and whose speed $17A0,x is nonzero, add its stored velocity to its position (apply_object_velocity). Then, if the state is not $FF (permanent), decrement it: for shots (objects 1,4,5 start at $18) and other timed objects $83E0 is a lifetime in passes; reaching 0 deactivates them. Velocity is not recomputed here; whoever changes an object's heading calls compute_object_velocity."
  },
  {
   "address": 46497,
   "type": "line",
   "text": "Turn object X's heading and speed into a 24-bit velocity vector. Heading is an 11-bit angle: octant $84A0,x (0-7, clockwise from +Y = 'north') and fine angle $84C0,x. Index Y = octant bit0:fine>>1 reads the quarter-wave sine table $8900 (256 entries, 0..$FF); $0D = sin, $0E = $8900[~Y] = cos; octant bit 1 swaps them, octant bit 2 negates X, octants 2-5 negate Y. Each is multiplied by speed $17A0,x (mul8 at $B4C0) and shifted left 3, giving X velocity in $1600 (hi) $1620 (mid) $1640 (lo) and Y velocity in $1660/$1680/$16A0, sign-extended. Called for the player each move, for shots when fired ($AD22), for the saucer when it turns ($ACB1)."
  },
  {
   "address": 46685,
   "type": "line",
   "text": "Add object X's velocity to its position. Position is 24-bit per axis: X = $8260 (hi) $82C0 (mid) $15C0 (lo), Y = $8320 (hi) $8380 (mid) $15E0 (lo); the high byte wraps so the plain is a 256x256 torus in high-byte units (obelisks sit on a 32-unit grid). Before adding, the old mid/hi bytes are saved in $16E0/$16C0 (X) and $1720/$1700 (Y) so the enemy avoidance at $AC6E can undo the move."
  },
  {
   "address": 46754,
   "type": "line",
   "text": "Relative position of object X as seen from object Y, using the hi and mid position bytes (16-bit per axis). Computes dx = X.x - Y.x and dy = X.y - Y.y, takes absolute values and records the signs in $2C (bit 2 = dx negative, bit 1 = dy negative); if |dx| > |dy| the two are swapped and bit 0 set. Output: $28/$29 = the larger component (hi/lo), $26/$27 = the smaller, $2C = sign/swap code, $2A = A = bearing octant 0-7 (clockwise from +Y) via the remap table $BC76. A zero vector gets $29 forced to 1. Must precede bearing_from_viewer and log_distance_code. Callers: visibility scan (Y=0 player), saucer aiming $A25D (X=0,Y=2: bearing of the player from the saucer), enemy steering $AC61, hit test $AD38."
  },
  {
   "address": 46889,
   "type": "line",
   "text": "Finish the bearing after object_delta_octant. Normalises the larger delta until its high byte has bit 7 set, counting down Y from 15: $2B = 15 - shifts = log2 magnitude class (used by log_distance_code). The next 8 bits of the larger delta index the reciprocal table $8500, multiplied by the smaller delta's high byte (mul8 $B4C0) and doubled gives the ratio 0..255, clamped to $FF; $8600[ratio] is the arctangent within the octant (0..$FF = 0..45 degrees), mirrored (EOR $FF) for odd octants. From this 11-bit absolute bearing ($2A:atan) the viewer's heading $1E (octant) / $1F (fine) is subtracted. Returns A = relative octant 0-7 (0 = 0..45 degrees right of the heading, 7 = 45..0 degrees left; 0 or 7 means 'in the 90-degree field of view'), Y = fine angle within it. Callers set $1E/$1F to the player's heading or to 0 for an absolute bearing."
  },
  {
   "address": 46950,
   "type": "line",
   "text": "Range of the object measured by object_delta_octant / bearing_from_viewer as a logarithmic code: 16 * $2B (log2 magnitude class of the larger delta) + $8700[(larger hi & $F0) | (smaller hi >> 4)], the second term (1..$17) being the hypotenuse correction for the ratio of the two normalised components. Small = near, large = far; stored per object in $1740,x and used by the size table $8800, the draw sort, the collision test ($43) and the enemy steering ($4F)."
  },
  {
   "address": 46975,
   "type": "line",
   "text": "Build the list of objects in the player's field of view; called once per pass from $A103 before the sort and the draw. Sets the viewer heading $1E/$1F from the player's $84A0/$84C0, clears the count $0F and the near-object index $2D, then walks X from $90 (highest object index, $5F = 96 objects) down to 1, skipping inactive objects ($83E0,x = 0) and those farther than $60 high-byte units on either axis (wrap-aware). For the remaining objects it calls object_delta_octant with Y=0. Objects X >= $18 (the eight slots $18-$1F and the 64 obelisks $20-$5F) that are within 4 units on both axes are recorded in $2D as the collision candidate for the player's move, with their bearing octant in $14C0,x and range in $1740,x, even when out of view. Otherwise the coarse octant minus the heading octant must be 0, 1 or 7 before the exact bearing_from_viewer is computed; a result of 0 or 7 adds the object to the list at $B806. Note object 0 is never listed."
  },
  {
   "address": 47040,
   "type": "side",
   "text": "objects $18-$5F only: within 4 units on both axes -> this is the obstacle the player may bump ($2D)"
  },
  {
   "address": 47110,
   "type": "line",
   "text": "Object X is in view: $14C0,x = bearing octant (0 or 7), $1520,x = fine bearing (together the 9-bit screen X used by draw_visible_list), append X to the list $1460[1..$0F], $1740,x = log range, $1400,x = $8800[range] = shape size index 0 (nearest) .. $1F (farthest); $FF means too far to draw and the object is dropped from the list again."
  },
  {
   "address": 47145,
   "type": "line",
   "text": "Selection sort of the visible-object list $1460[1..$0F] by log range $1740 so that entry 1 is the nearest and entry $0F the farthest: for each end position Y from $0F down to 2 the farthest remaining object is found and swapped into position Y. Temporaries: $17 = outer position, $15 = position of the current farthest, $10 = its object index. Lets draw_visible_list paint far-to-near (painter's algorithm)."
  },
  {
   "address": 47193,
   "type": "line",
   "text": "Stargate mode ($83 != 0): search the visible list for object 3 (the exit gate, shape family $E0, activated at $A2A1 when the level's last enemy dies). If found, draw the list as usual up to and including the gate; if not, jump to $BB81 which fills the view for the gate phase when the gate is not on screen."
  },
  {
   "address": 47208,
   "type": "line",
   "text": "Draw everything in view; called from $A109 after the sort. If the stargate flag $83 is set only objects behind object 3 and object 3 itself are drawn (find_gate_in_view_list); otherwise fall into draw_visible_list."
  },
  {
   "address": 47212,
   "type": "line",
   "text": "Paint the sorted view list farthest-first. For each object X = $1460[i], i = $0F down to 1: shape number Y = ($8440,x & $E0) | $1400,x, i.e. the object's shape family (obelisk $00, shots/drones $20, saucer $40, gates $E0) plus the size index chosen by range; screen X $12 = ($14C0,x bit 0 : $1520,x >> 1) EOR $80 so the centre of the view is $80; $04 = $12 / 4; $8F = object index; draw mode X = $8440,x & 3 (index into $BC81 colour/mode table for the shape drawer at $AD76). If the saucer (object 2) is drawn its $04 column is also kept in $65 (read by code outside the disassembly, unknown). Object 3 (stargate) in stargate mode ($83 != 0) is the last thing drawn; nearer objects are skipped. $11 = list position."
  },
  {
   "address": 47252,
   "type": "side",
   "text": "saucer: remember its screen column in $65"
  },
  {
   "address": 47279,
   "type": "side",
   "text": "object 3 = stargate: in gate mode draw it and stop"
  },
  {
   "address": 47288,
   "type": "line",
   "text": "Add a points value to the score. Score is 4 bytes of BCD at $8BA0-$8BA3, most significant first (7 digits shown: low nibble of $8BA0 then 6 digits); high score at $8BA4-$8BA7, enemies-remaining counter (BCD, shown as E<nn>) at $8BA8. X = offset of the value to add, in the same 4-byte BCD layout: $8BAC = 500 and $8BB0 + 4*n = (n+1)*100 for n = 0..15, i.e. 100..1600 points. Called from $AAD0 with X = $A0 while the award count $A1 (set at $A905/$A90A: $A0 = enemy type $7A * 4 + $10, $A1 = $9B / 2) is non-negative, so one enemy is worth ($A1+1) times its base value. Runs in decimal mode with CLD at the end."
  },
  {
   "address": 47329,
   "type": "line",
   "text": "Game start (from $9F86, after the four packed-BCD score bytes $8BA0-$8BA3 were zeroed): stamps the seven-digit score into status row 0 of screen $6000, columns 0-13, in the wide font. Y = 0 = index into the BCD counters at $8BA0 (most significant byte first, its high nibble unused), X = 0 = screen column. One low-nibble digit (stamp_digit_low) then three digit pairs (stamp_digit_pair); Y ends at 4, X at 14. Live at level 1 start the row reads 0000000. Writes only the $6000 status row (row 0 of the $6400 buffer is not written here)."
  },
  {
   "address": 47344,
   "type": "line",
   "text": "Stamps both BCD digits of $8BA0,Y into status row 0 ($6000) at columns X (high nibble) and X+2 (low nibble) as wide-font digits: digit n = code $80+2n in the left cell, $81+2n in the right cell. X += 4, Y += 1 on exit. Callers: draw_status_score (three times, score digits) and the level start at $9FA1 with Y = 8, X = $1C, which writes the enemies-remaining counter $8BA8 into the E field at columns 28-31 (live: E11; $8BA8 = $11 BCD, set by $AA8F from the random generator as $10-$19)."
  },
  {
   "address": 47364,
   "type": "line",
   "text": "Stamps only the low BCD nibble of $8BA0,Y as one wide-font digit at status-row columns X and X+1 (codes $80+2n / $81+2n), then X += 2, Y += 1 and returns through the rts at $B917. First digit of draw_status_score; also the tail of stamp_digit_pair."
  },
  {
   "address": 47384,
   "type": "line",
   "text": "Main loop, once per pass (from $A188, after the raster wait): if the scene index $63 differs from the last applied one $66, records it in $66 and falls into apply_scene; otherwise returns at once (live: 75 hits in 4 s, apply_scene 0)."
  },
  {
   "address": 47392,
   "type": "line",
   "text": "Applies the scene selected by $63 (a multiple of 16; the level start at $9F93 sets $63 = $A8 = level*16, live level 1: $70). 1) Copies the 16-byte scene block $8010+$63..+$0F into zero page $AB-$BA and pushes the VIC sprite settings from it: $AF -> $D01D (X expand), $B0 -> $D017 (Y expand), $B1 -> $D015 (enable); the raster band colours for the IRQ chain: $AC -> $BB, $B2 -> $BC, $B3 -> $BD, $B4 -> $BE ($AD, read by the IRQ at $B3CB as the ground colour, stays in $AD; $AB, $B5-$BA: unknown). Level 1 block ($8080): 11 EE 05 08 FA 02 FE EE EE 66 = sky $EE, ground 5, view colour 8. 2) If $63 bit 7 is clear, copies the 64-byte scenery record at $9840 + $63*8 (level 1: $9BC0) through ($F7): bytes $28-$3F -> $8F68 (sprite Y per sprite 2-7 x frame 0-3), $10-$27 -> $8F40 (sprite pointer values, same layout), $0A-$0F -> $8F59,$8F5B..$8F63 (panorama position of sprites 2-7), and sets the frame caches $8F58,$8F5A..$8F62 to $FF so update_scenery_sprites reloads every pointer. 3) Fills colour RAM of the view rows 2-17 ($D850-$DACF, four 160-byte strips) with $AE, the character colour of the 3D view. Callers: level start $9F97, apply_scene_if_changed."
  },
  {
   "address": 47525,
   "type": "line",
   "text": "Main loop, once per pass (from $A18B): scrolls the six panorama sprites 2-7 (sprite 2 = hill/ground strip at the horizon, Y $6D = 109; sprites 3-7 = cloud shapes, Y $44-$64) against the 16-bit view offset at $84A0 (hi) / $84C0 (lo), which changes live while the view turns. For X = 10,8,..,0 (sprite 2+X/2): D = 2*$8F59,X - offset. Low byte of D -> $D004+X (sprite X position); bit 8 is collected in $FF and written to $D010 at the end (shifted left twice: sprites 2-7). When bit 8 is set and the low byte is >= $A0 (X >= 416, off the right edge) the position is reduced by zp $C0 (0 or 8, set at $9D75 from sprite 3's $D01F bit; purpose unknown) and the frame advanced by one. Frame = bits 1-2 of the high byte of D (bits 9-10 of D), i.e. one of 4 images per 512 units of turn; it is cached in $8F58,X and only when it changes the sprite pointer $8F40[4*(X/2)+frame] is written to both screen buffers' pointer tables ($63FA+X/2 and $67FA+X/2) and the Y from $8F68[same index] to $D005+X. Level 1 images: sprite 2 frames $EC-$EF (hill strips at $7B00-$7BFF), sprite 3 $CA-$CD (clouds $7280-$737F), sprites 4-7 mix $E6/$CC/$CD/$CE/$9D/$9E/$B0 (clouds and ground strips; $B0 = $6C00). Sprites 0 (radar dot) and 1 (gun sight) are not touched here."
  },
  {
   "address": 47540,
   "type": "side",
   "text": "only the high byte of the offset here: $84A0"
  },
  {
   "address": 47602,
   "type": "side",
   "text": "sprite pointer into both screen buffers"
  },
  {
   "address": 47620,
   "type": "line",
   "text": "Shape drawer branch for shape numbers >= $E0 (jumped to from $AD86; the gate family per $B868's list, i.e. the stargate seen as a rectangle). Enters with the shape drawer's X already applied: $0B = solid char code of the shade, $8E = its fill pattern (from $BC81/$BD81). Size: $20 = $8D00[$1740[object $8F]] is a scale factor for the 8x8 multiply at $B4C2; $75 = signed apparent size: $75 >= 0 gives height $6B = (2*$75*$20)/256 and width 0, $75 < 0 gives width $6A = ((2*$75)&$FF)*$20/256 and full height $6B = ($FE*$20)/256. $7D = height in pixel rows (min 1), $7E = height in char rows, $7F = half width in pixel pairs (2-pixel columns). Edges from the object's screen centre $12 (pixel pairs, +$30 bias, $80 = middle of the view): left $7F = $12-$7F-$30 (min 0), right $81 = $12+$7F-$31 (max $9F, 160 pairs = 40 columns); $80/$82 = the same in char columns. If the right edge is off the left of the screen -> fill_gate_mode_rows. Then walks 8 char rows upward from the horizon row (row 9 of the draw buffer: $F9/$FA = ($0A+2)*256+$68) for $8A = 0..7: left and right edge cells are patched by patch_rect_edge_cell with masks from tbl_left_edge_mask / tbl_edge_mask_pair (the latter when both edges share a cell) ANDed with the shade; interior cells get the solid char $0B; at the top row ($8A = $7E) only the bottom $7D&7 pixel rows are painted ($8B = 7-($7D&7), $8C/$8D = row-within-cell limits). Gate mode $83 != 0 inverts the masks: everything except the rectangle (cells left and right of it, rows above it) is painted with the shade, the hole itself is left as it was, and rows above the top are filled by the $BB62 loop. Live: 0 hits during level 1 play (no gate open)."
  },
  {
   "address": 47701,
   "type": "side",
   "text": "clamp right edge to pair $9F = column 39"
  },
  {
   "address": 47757,
   "type": "side",
   "text": "both edges in one cell: combined mask"
  },
  {
   "address": 47811,
   "type": "line",
   "text": "Row loop of draw_stargate_rect: $8A counts char rows 0-7 from the horizon row upward; exits after 8 rows."
  },
  {
   "address": 47888,
   "type": "side",
   "text": "gate mode: paint the columns outside the rectangle"
  },
  {
   "address": 47970,
   "type": "side",
   "text": "gate mode: paint every row above the rectangle"
  },
  {
   "address": 48001,
   "type": "line",
   "text": "Gate mode only ($83 != 0; returns at once otherwise). Fills all eight sky rows (rows 2-9 of the draw buffer $0A, 40 columns each) with char $40, the solid shade-2 (50 % dither) cell: the view when the gate rectangle is not on screen. Jumped to from the object drawer at $B865 and from draw_stargate_rect when the rectangle is off the left edge."
  },
  {
   "address": 48025,
   "type": "line",
   "text": "Paints part of one screen cell for draw_stargate_rect. In: A = AND mask (pixel pairs to keep), X = OR pattern (shade limited to the pairs to paint), Y = column, ($F9) = row pointer, rows $8D+1..$8C of the 8-row cell. If the cell holds a solid shade char (code & $9F == 0: $00/$20/$40/$60, tested through mask_solid_shade_char) a new dynamic character is allocated: the cell gets the next free code $05, its bitmap at ($FD) is written top to bottom with the solid fill byte tbl_solid_fill_by_shade[code>>5] for rows outside the range and (fill & mask | pattern) inside, then jumps to $B035 to advance the allocator ($05, $FD/$FE). Otherwise the cell is already a dynamic char and its bitmap at $09*$800 + code*8 (charset $4000 or $5000 of the current buffer) is edited in place for the rows in range."
  },
  {
   "address": 48070,
   "type": "side",
   "text": "solid cell: allocate a dynamic char and rebuild it"
  },
  {
   "address": 48130,
   "type": "line",
   "text": "4 bytes 00 C0 F0 FC: AND mask that keeps the pixel pairs to the left of pair n (n = left edge & 3) in a cell, used by draw_stargate_rect for the left edge cell (EOR $83 inverts it in gate mode)."
  },
  {
   "address": 48134,
   "type": "line",
   "text": "16 bytes, index = left_pair*4 + right_pair: AND mask keeping the pixel pairs outside [left, right] when both edges of the rectangle fall in the same cell (rows: left 0: 3F 0F 03 00, left 1: FF CF C3 C0, left 2: FF FF F3 F0, left 3: FF FF FF FC). The first four entries double as the plain right-edge masks (keep pairs right of pair n) used when the edges are in different cells."
  },
  {
   "address": 48150,
   "type": "line",
   "text": "8 bytes 82 A2 C2 A2 82 A2 C2 A2, a 4-step ring. Each main-loop pass $A174 copies the 4 entries starting at (frame counter $4E & 3) to $8458-$845B and $845C-$845F. No read of $8458/$845C found in the disassembly: what the values drive is unknown (they look like wide-font/half-page codes but that is a guess)."
  },
  {
   "address": 48158,
   "type": "line",
   "text": "8-bit pseudo-random generator: shifts the seed $70 right by one and feeds bit 0 XOR bit 3 of the old value into bit 7 (a linear feedback shift register; the entry carry does not matter). Returns the new seed in A. Callers: the title loop $9CFF (once per pass, so the seed depends on how long the title sat) and $AA8F, which turns it into the number of enemies for the level, $8BA8 = $10 | (mix & $0F), i.e. 10-19 in BCD. Live: 76 hits in 4 s of level 1 play, once per main-loop pass, so there is a third caller that the cross-references do not show yet."
  },
  {
   "address": 48162,
   "type": "side",
   "text": "feedback bit = bit 0 xor bit 3 of the old seed"
  },
  {
   "address": 48172,
   "type": "line",
   "text": "Input for the pass. Sets CIA1 DDR A to all inputs and reads $DC00 = joystick port 2 (keys are not read here; the pause/abort keys are scanned at $A12A through $DC01). Normal play ($71 = 0): $6D = bits 0-3 = up, down, left, right (active low, $0F = centred), $6E = bit 4 = fire (0 = pressed, 1 = released); returns with Z set when fire is pressed (the title loop at $9D0E/$9D16/$9D1E uses that). Demo mode ($71 != 0, the value the zero-page image starts with is $10): the port is ignored and $6D/$6E come from a recorded script: $6F counts passes down, and at zero the next record (joystick byte in the same bit layout, then a pass count -> $6F) is read from ($72/$73), which advances by 2. The script starts at $7400 ($72/$73 = $7400 in the zero-page image; first records: $FF for 70 passes = idle, $FB for 9 = left, $FE for 7 = up). Callers: title loop $9D0E/$9D16/$9D1E, main loop $A112 and $A142 (the resume-from-pause wait, which needs $6D = $0F). Live: 75 hits in 4 s."
  },
  {
   "address": 48177,
   "type": "side",
   "text": "joystick port 2: bits 0-3 direction, bit 4 fire, active low"
  },
  {
   "address": 48200,
   "type": "side",
   "text": "demo replay: (joystick byte, pass count) records from ($72)"
  },
  {
   "address": 48244,
   "type": "line",
   "text": "2 bytes $00 $60, no reference found in the disassembly; unknown."
  },
  {
   "address": 48245,
   "type": "line",
   "text": "$60 (RTS): spawn_saucer ($A42C) reads $8BF0[type] and jumps here for every saucer type in this build, so the per-type hook does nothing; probably a stub left where a routine once was."
  },
  {
   "address": 48246,
   "type": "line",
   "text": "8 bytes 00 01 03 02 07 06 04 05: read at $B723 with Y = $2C, the 3-bit code the bearing routine at $B6C0 builds while reducing a (dx, dy) pair (bit 2 preset at $B6C6, bit 1 = dy negative, bit 0 = magnitudes swapped); gives $2A = the octant number of the bearing, used for the radar and aiming."
  },
  {
   "address": 48254,
   "type": "line",
   "text": "1 byte $9F: BIT-test mask for a screen character code in the 3D view. Code & $9F == 0 means one of the four solid shade cells $00, $20, $40, $60 (bits 5-6 = shade 0-3), anything else is a dynamically allocated character whose bitmap can be edited. Used at $AEE0, $B058 and patch_rect_edge_cell."
  },
  {
   "address": 48255,
   "type": "line",
   "text": "2 bytes $80 $94: the $D018 value of each draw buffer, picked by pass counter $08 & 1 into $1A at $A196 once the buffer is complete. $80 = screen $6000 + charset $4000, $94 = screen $6400 + charset $5000. The raster IRQs use $1A (OR #$02 for the mirrored charset at +$800 on the ground rows)."
  },
  {
   "address": 48257,
   "type": "line",
   "text": "4 bytes 00 20 40 60: screen code of the solid cell for shade 0-3 (black, 50 % dither odd pixels, 50 % dither even pixels, solid). Read at $AD78 with X = draw mode ($8440,object & 3) into $0B, the fill character the shape drawer and draw_stargate_rect write for fully covered cells."
  },
  {
   "address": 48261,
   "type": "line",
   "text": "64 bytes: AND masks for editing a view character bitmap, 4 identical bytes per group (the index is group*4 + shade, so one group serves all four shades). Groups 0-15: 0,1 = FF (nothing), 2 = FC (pixel pair 3, rightmost), 3 = 3F (pair 0), 4 = F3 (pair 2), 5 = CF (pair 1), 6 = F0 (pairs 2-3), 7 = 0F (pairs 0-1), 8 = CF, 9 = F3, 10 = CC (pairs 1,3), 11 = 33 (pairs 0,2), 12-13 = C3 (pairs 1-2), 14 = C0 (pairs 1-3), 15 = 03 (pairs 0-2). A cleared bit is a pixel that the matching entry of tbl_pair_or_pattern paints. Read by the shape drawer at $AF00-$B0DC with X/Y = a coverage code."
  },
  {
   "address": 48325,
   "type": "line",
   "text": "64 bytes: groups 16-31 of tbl_pair_and_mask (index group*4 + shade, 4 identical bytes per group). 16 = 3F (pair 0), 17 = FC (pair 3), 18-19 = 3C (pairs 0,3), 20 = 33, 21 = CC, 22 = 30 (pairs 0,2,3), 23 = 0C (pairs 0,1,3), 24 = 0F, 25 = F0, 26 = 0C, 27 = 30, 28 = 03 (pairs 0-2), 29 = C0 (pairs 1-3), 30-31 = 00 (whole cell)."
  },
  {
   "address": 48389,
   "type": "line",
   "text": "64 bytes: OR patterns paired with tbl_pair_and_mask, index group*4 + shade. Entry = the pixel pairs of the group filled with the shade: shade 0 = 00, shade 1 = the $55 dither, shade 2 = the $AA dither, shade 3 = solid, so each group is 00, m&55, m&AA, m where m = NOT the AND mask. Groups 0-15, e.g. group 2 = 00 01 02 03, group 3 = 00 40 80 C0, group 14 = 00 15 2A 3F."
  },
  {
   "address": 48453,
   "type": "line",
   "text": "60 bytes: groups 16-30 of tbl_pair_or_pattern (group 31 is tbl_solid_fill_by_shade, which follows). Group 27 shade 3 is $8F where the AND mask $30 implies $CF: a one-bit slip in the original data (group 22, same mask, has $CF)."
  },
  {
   "address": 48513,
   "type": "line",
   "text": "4 bytes 00 55 AA FF: bitmap byte of a solid cell of shade 0-3, also group 31 of tbl_pair_or_pattern. Read at $AD7D into $8E (the fill pattern the shape drawer and draw_stargate_rect paint with) and by patch_rect_edge_cell / $AF9A / $B112 to reconstruct the bitmap of a solid cell before editing it."
  },
  {
   "address": 48517,
   "type": "line",
   "text": "64 bytes: $4C then zeros. Present in the loaded image (not the emulator's RAM fill pattern) but no code references anything from $BD85 to $BDFD; unknown, probably padding."
  },
  {
   "address": 48581,
   "type": "line",
   "text": "57 bytes: zeros to $BDFA, then $40 $99 $00 at $BDFB-$BDFD. No references; unknown."
  },
  {
   "address": 48638,
   "type": "line",
   "text": "$BDFE-$BFFF is never written or read by the game: it still holds the emulator's power-on fill pattern (4 x $00, 4 x $FF, with the odd random bit at $BED1, $BF5D, $BF9C, $BFFC). Not game data. This symbol covers $BDFE-$BE3D."
  },
  {
   "address": 48702,
   "type": "line",
   "text": "Uninitialised RAM, continued (see uninitialised_ram_a): emulator fill pattern, never touched by the game."
  },
  {
   "address": 48766,
   "type": "line",
   "text": "Uninitialised RAM, continued (see uninitialised_ram_a): emulator fill pattern, never touched by the game."
  },
  {
   "address": 48830,
   "type": "line",
   "text": "Uninitialised RAM, continued (see uninitialised_ram_a): emulator fill pattern, never touched by the game."
  },
  {
   "address": 48894,
   "type": "line",
   "text": "Uninitialised RAM, continued (see uninitialised_ram_a): emulator fill pattern, never touched by the game."
  },
  {
   "address": 48958,
   "type": "line",
   "text": "Uninitialised RAM, continued (see uninitialised_ram_a): emulator fill pattern, never touched by the game."
  },
  {
   "address": 49022,
   "type": "line",
   "text": "Uninitialised RAM, continued (see uninitialised_ram_a): emulator fill pattern, never touched by the game."
  },
  {
   "address": 49086,
   "type": "line",
   "text": "Uninitialised RAM, continued (see uninitialised_ram_a): emulator fill pattern, never touched by the game."
  },
  {
   "address": 49150,
   "type": "line",
   "text": "Last two bytes of the uninitialised block; $C000 onward is outside the game image."
  }
 ]
}