{
 "schema": 1,
 "platform": "c64",
 "game": "speedball-2",
 "part": "intro",
 "build": "Mirrorsoft's 1991 disk release, speedball_2[mirrorsoft_1991].g64 from the C64 Preservation Project's 10th Anniversary Collection on the Internet Archive (SHA-256 c379e7c1\u20264dc4)",
 "source": "regenerator2000 live",
 "regions": {
  "exclude": [
   [
    256,
    511,
    "stack"
   ],
   [
    53248,
    55295,
    "I/O and colour RAM"
   ],
   [
    55808,
    57343,
    "I/O and colour RAM"
   ],
   [
    0,
    255,
    "zero page: the intro's pointers and counters, set before use; at the start it still holds the last unpacker"
   ],
   [
    31365,
    46847,
    "zeros the last unpacker writes after the disc's pictures, never read"
   ],
   [
    46848,
    49151,
    "the fade's table and a picture's two colour layers, built and unpacked there before use"
   ],
   [
    51311,
    53247,
    "the screen at $C800, its sprite pointers and the disc's two sprite buffers, all cleared or drawn before use; intro_start below them runs once and the screen covers it"
   ],
   [
    55808,
    57343,
    "zeros under the I/O chips after the letter sprites, never read"
   ],
   [
    57344,
    65535,
    "the pictures' bitmap and the title's characters, unpacked there before use; at the start it holds what the load left"
   ]
  ],
  "extra": [],
  "edges": [
   0,
   256,
   512,
   1024,
   2048,
   4096,
   16384,
   32768,
   40960,
   49152,
   53248,
   57344
  ]
 },
 "blocks": [
  {
   "start": 0,
   "end": 511,
   "type": "Undefined"
  },
  {
   "start": 512,
   "end": 1574,
   "type": "Code"
  },
  {
   "start": 1575,
   "end": 3779,
   "type": "Byte"
  },
  {
   "start": 3780,
   "end": 3845,
   "type": "Code"
  },
  {
   "start": 3846,
   "end": 3853,
   "type": "Word"
  },
  {
   "start": 3854,
   "end": 3948,
   "type": "Code"
  },
  {
   "start": 3949,
   "end": 3956,
   "type": "Byte"
  },
  {
   "start": 3957,
   "end": 4167,
   "type": "Code"
  },
  {
   "start": 4168,
   "end": 4169,
   "type": "Byte"
  },
  {
   "start": 4170,
   "end": 4202,
   "type": "Code"
  },
  {
   "start": 4203,
   "end": 4218,
   "type": "Word"
  },
  {
   "start": 4219,
   "end": 4687,
   "type": "Code"
  },
  {
   "start": 4688,
   "end": 4696,
   "type": "Byte"
  },
  {
   "start": 4697,
   "end": 4760,
   "type": "Code"
  },
  {
   "start": 4761,
   "end": 4768,
   "type": "Word"
  },
  {
   "start": 4769,
   "end": 5192,
   "type": "Code"
  },
  {
   "start": 5193,
   "end": 5226,
   "type": "Byte"
  },
  {
   "start": 5227,
   "end": 5264,
   "type": "Code"
  },
  {
   "start": 5265,
   "end": 5272,
   "type": "Word"
  },
  {
   "start": 5273,
   "end": 5330,
   "type": "Code"
  },
  {
   "start": 5331,
   "end": 5334,
   "type": "Byte"
  },
  {
   "start": 5335,
   "end": 5370,
   "type": "Code"
  },
  {
   "start": 5371,
   "end": 5374,
   "type": "Word"
  },
  {
   "start": 5375,
   "end": 5836,
   "type": "Code"
  },
  {
   "start": 5837,
   "end": 5890,
   "type": "Word"
  },
  {
   "start": 5891,
   "end": 6137,
   "type": "Code"
  },
  {
   "start": 6138,
   "end": 6217,
   "type": "Byte"
  },
  {
   "start": 6218,
   "end": 6345,
   "type": "Code"
  },
  {
   "start": 6346,
   "end": 6483,
   "type": "Byte"
  },
  {
   "start": 6484,
   "end": 7240,
   "type": "Code"
  },
  {
   "start": 7241,
   "end": 7338,
   "type": "Byte"
  },
  {
   "start": 7339,
   "end": 7534,
   "type": "Code"
  },
  {
   "start": 7535,
   "end": 7605,
   "type": "Byte"
  },
  {
   "start": 7606,
   "end": 7783,
   "type": "Code"
  },
  {
   "start": 7784,
   "end": 7804,
   "type": "Byte"
  },
  {
   "start": 7805,
   "end": 7867,
   "type": "Code"
  },
  {
   "start": 7868,
   "end": 7875,
   "type": "Word"
  },
  {
   "start": 7876,
   "end": 8191,
   "type": "Code"
  },
  {
   "start": 8192,
   "end": 8203,
   "type": "Byte"
  },
  {
   "start": 8204,
   "end": 8321,
   "type": "Code"
  },
  {
   "start": 8322,
   "end": 8386,
   "type": "Byte"
  },
  {
   "start": 8387,
   "end": 8496,
   "type": "Code"
  },
  {
   "start": 8497,
   "end": 31364,
   "type": "Byte"
  },
  {
   "start": 31365,
   "end": 49151,
   "type": "Undefined"
  },
  {
   "start": 49152,
   "end": 51199,
   "type": "Byte"
  },
  {
   "start": 51200,
   "end": 51310,
   "type": "Code"
  },
  {
   "start": 51311,
   "end": 55295,
   "type": "Undefined"
  },
  {
   "start": 55296,
   "end": 55807,
   "type": "Byte"
  },
  {
   "start": 55808,
   "end": 65411,
   "type": "Undefined"
  },
  {
   "start": 65412,
   "end": 65412,
   "type": "Code"
  },
  {
   "start": 65413,
   "end": 65417,
   "type": "Undefined"
  },
  {
   "start": 65418,
   "end": 65418,
   "type": "Code"
  },
  {
   "start": 65419,
   "end": 65535,
   "type": "Undefined"
  }
 ],
 "symbols": [
  {
   "address": 0,
   "name": "zpa_00",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1,
   "name": "zpa_01",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 2,
   "name": "zpa_02",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 3,
   "name": "zpa_03",
   "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": "zpp_0A",
   "type": "ZeroPagePointer",
   "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": 20,
   "name": "zpa_14",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 21,
   "name": "zpa_15",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 22,
   "name": "zpa_16",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 23,
   "name": "zpa_17",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 24,
   "name": "zpa_18",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 25,
   "name": "zpa_19",
   "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": 148,
   "name": "zpa_94",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 157,
   "name": "zpa_9D",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 186,
   "name": "zpa_BA",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 204,
   "name": "zpa_CC",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 512,
   "name": "music_init",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 519,
   "name": "b_0207",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 533,
   "name": "b_0215",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 605,
   "name": "music_play",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 611,
   "name": "b_0263",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 641,
   "name": "b_0281",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 647,
   "name": "b_0287",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 649,
   "name": "music_voice",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 663,
   "name": "b_0297",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 671,
   "name": "music_note",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 695,
   "name": "b_02B7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 703,
   "name": "b_02BF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 760,
   "name": "b_02F8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 779,
   "name": "b_030B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 782,
   "name": "b_030E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 822,
   "name": "b_0336",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 825,
   "name": "b_0339",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 914,
   "name": "b_0392",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 939,
   "name": "b_03AB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 956,
   "name": "voice_effects",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 961,
   "name": "b_03C1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 964,
   "name": "b_03C4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1025,
   "name": "b_0401",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1049,
   "name": "b_0419",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1066,
   "name": "b_042A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1095,
   "name": "b_0447",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1118,
   "name": "b_045E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1141,
   "name": "b_0475",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1152,
   "name": "j_0480",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 1168,
   "name": "b_0490",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1188,
   "name": "b_04A4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1190,
   "name": "j_04A6",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 1211,
   "name": "b_04BB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1219,
   "name": "b_04C3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1243,
   "name": "j_04DB",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 1264,
   "name": "b_04F0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1272,
   "name": "j_04F8",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 1275,
   "name": "b_04FB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1293,
   "name": "j_050D",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 1311,
   "name": "b_051F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1326,
   "name": "b_052E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1334,
   "name": "b_0536",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1350,
   "name": "b_0546",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1371,
   "name": "b_055B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1405,
   "name": "b_057D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1408,
   "name": "j_0580",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 1411,
   "name": "j_0583",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 1417,
   "name": "b_0589",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1432,
   "name": "b_0598",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1441,
   "name": "r_05A1",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 1442,
   "name": "track_next",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 1457,
   "name": "j_05B1",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 1484,
   "name": "b_05CC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1496,
   "name": "b_05D8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1509,
   "name": "b_05E5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1540,
   "name": "b_0604",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1553,
   "name": "b_0611",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 1562,
   "name": "j_061A",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 1575,
   "name": "fade_speed",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1576,
   "name": "music_on",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1577,
   "name": "fade_volume",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1578,
   "name": "fade_delay",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1579,
   "name": "tick_count",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1580,
   "name": "speed_index",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1581,
   "name": "voice_reg",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1582,
   "name": "new_instrument",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1583,
   "name": "note_ad",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1584,
   "name": "note_sr",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1585,
   "name": "pulse_step",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1586,
   "name": "pulse_top",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1587,
   "name": "pulse_bottom",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1588,
   "name": "slide_down",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1589,
   "name": "track_byte",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1590,
   "name": "pitch_down",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1591,
   "name": "arp_step",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1592,
   "name": "unused_0638",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 1630,
   "name": "tune_header",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1638,
   "name": "tune_speeds",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1646,
   "name": "voice_regs",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1649,
   "name": "voice_instr8",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1652,
   "name": "track_pos",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1655,
   "name": "block_on",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1658,
   "name": "block_count",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1661,
   "name": "block_start",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1664,
   "name": "pattern_pos",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1667,
   "name": "pattern_num",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1670,
   "name": "repeat_count",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1673,
   "name": "note_head",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1676,
   "name": "note_timer",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1679,
   "name": "waveform",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1682,
   "name": "note",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1685,
   "name": "effect_done",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1688,
   "name": "instrument",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1691,
   "name": "gate_mask",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1694,
   "name": "pulse_dir",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1697,
   "name": "slide",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1700,
   "name": "unused_06a4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 1703,
   "name": "instr_spare",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1706,
   "name": "effect_spare",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1724,
   "name": "freq_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1727,
   "name": "freq_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1730,
   "name": "note_byte",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1733,
   "name": "pulse_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1736,
   "name": "pulse_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1739,
   "name": "effect_flags",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1742,
   "name": "effect_len",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1745,
   "name": "effect_count",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1748,
   "name": "track_start",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1751,
   "name": "voice_mute",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1754,
   "name": "freq_table_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1850,
   "name": "freq_table_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1946,
   "name": "instruments",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2048,
   "name": "instruments_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2058,
   "name": "instruments_2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2170,
   "name": "pattern_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2213,
   "name": "pattern_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2256,
   "name": "patterns",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2260,
   "name": "pattern_01",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2322,
   "name": "pattern_02",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2385,
   "name": "pattern_0d",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2405,
   "name": "pattern_16",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2415,
   "name": "pattern_1a",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2448,
   "name": "pattern_28",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2479,
   "name": "pattern_1b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2538,
   "name": "pattern_23",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2599,
   "name": "pattern_05",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2603,
   "name": "pattern_07",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2652,
   "name": "pattern_04",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2667,
   "name": "pattern_0e",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2686,
   "name": "pattern_0f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2700,
   "name": "pattern_11",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2711,
   "name": "pattern_15",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2757,
   "name": "pattern_0b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2768,
   "name": "pattern_18",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2787,
   "name": "pattern_1d",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2798,
   "name": "pattern_1f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2817,
   "name": "pattern_21",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2858,
   "name": "pattern_22",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2893,
   "name": "pattern_25",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2906,
   "name": "pattern_27",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2913,
   "name": "pattern_06",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2950,
   "name": "pattern_08",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2991,
   "name": "pattern_09",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3034,
   "name": "pattern_0a",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3049,
   "name": "pattern_10",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3088,
   "name": "pattern_12",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3146,
   "name": "pattern_13",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3176,
   "name": "pattern_14",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3210,
   "name": "pattern_17",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3230,
   "name": "pattern_19",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3241,
   "name": "pattern_1c",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3266,
   "name": "pattern_1e",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3331,
   "name": "pattern_20",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3397,
   "name": "pattern_26",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3410,
   "name": "pattern_24",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3451,
   "name": "pattern_2a",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3455,
   "name": "pattern_29",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3459,
   "name": "tunes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3491,
   "name": "tracks",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3741,
   "name": "letters_x",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3749,
   "name": "letters_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3757,
   "name": "letters_ptrs",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3765,
   "name": "letters_colour",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3773,
   "name": "letters_msb",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 3774,
   "name": "letters_mc",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 3775,
   "name": "letters_wide",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 3776,
   "name": "letters_mc1",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 3777,
   "name": "letters_mc2",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 3778,
   "name": "letters_fade",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 3779,
   "name": "letters_obj",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 3780,
   "name": "letters_init",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3782,
   "name": "b_0EC6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3829,
   "name": "letters_message",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3846,
   "name": "letters_messages",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3854,
   "name": "letters_fade_out",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3860,
   "name": "letters_show_mc",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3885,
   "name": "letters_show",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3893,
   "name": "b_0F35",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3949,
   "name": "letters_xs",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3957,
   "name": "letters_frame",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3975,
   "name": "b_0F87",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3988,
   "name": "b_0F94",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4025,
   "name": "b_0FB9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4043,
   "name": "b_0FCB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4051,
   "name": "b_0FD3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4070,
   "name": "b_0FE6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4097,
   "name": "b_1001",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4136,
   "name": "b_1028",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4168,
   "name": "screens_obj",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 4169,
   "name": "screens_blank",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 4170,
   "name": "screens_init",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4186,
   "name": "screens_message",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4203,
   "name": "screens_messages",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4219,
   "name": "screens_jobs",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 4268,
   "name": "show_arch",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 4276,
   "name": "show_towers",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 4308,
   "name": "show_picture",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 4324,
   "name": "b_10E4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4329,
   "name": "j_10E9",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 4397,
   "name": "b_112D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4408,
   "name": "b_1138",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4445,
   "name": "b_115D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4494,
   "name": "b_118E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4501,
   "name": "title_screen",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 4512,
   "name": "b_11A0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4517,
   "name": "j_11A5",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 4632,
   "name": "blank_screen",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 4643,
   "name": "b_1223",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4648,
   "name": "j_1228",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 4688,
   "name": "scroll_ptr",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 4689,
   "name": "scroll_ptr_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 4690,
   "name": "scroll_fine",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 4691,
   "name": "scroll_half",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 4692,
   "name": "scroll_colour",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 4693,
   "name": "scroll_speed",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 4694,
   "name": "scroll_target",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 4695,
   "name": "scroll_pause",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 4696,
   "name": "scroll_obj",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 4697,
   "name": "scroller_init",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4744,
   "name": "scroller_message",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4761,
   "name": "scroller_messages",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4769,
   "name": "scroller_stop",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 4775,
   "name": "scroller_start",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 4820,
   "name": "b_12D4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4854,
   "name": "r_12F6",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 4855,
   "name": "scroll_speed_now",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 4862,
   "name": "scroller_frame",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 4871,
   "name": "b_1307",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4887,
   "name": "b_1317",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4890,
   "name": "b_131A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4910,
   "name": "b_132E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4985,
   "name": "r_1379",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 4986,
   "name": "scroll_codes",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 4994,
   "name": "b_1382",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5018,
   "name": "b_139A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5037,
   "name": "j_13AD",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 5049,
   "name": "b_13B9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5067,
   "name": "b_13CB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5083,
   "name": "b_13DB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5095,
   "name": "b_13E7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5106,
   "name": "b_13F2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5115,
   "name": "scroller_raster",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 5169,
   "name": "raster_restore",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 5193,
   "name": "scroll_speeds",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5209,
   "name": "scroll_pauses",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5225,
   "name": "music_obj",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5226,
   "name": "music_fading",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5227,
   "name": "music_obj_init",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5248,
   "name": "music_message",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5265,
   "name": "music_messages",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5273,
   "name": "music_stop",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 5284,
   "name": "music_start",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 5304,
   "name": "music_fade",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 5315,
   "name": "music_faded",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 5328,
   "name": "b_14D0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5331,
   "name": "disc_obj",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5332,
   "name": "disc_step",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5333,
   "name": "disc_busy",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5334,
   "name": "disc_fade",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5335,
   "name": "disc_init",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5354,
   "name": "disc_message",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 5371,
   "name": "disc_messages",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5375,
   "name": "disc_fade_out",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 5381,
   "name": "disc_start",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 5409,
   "name": "disc_clear",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 5436,
   "name": "disc_off",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 5445,
   "name": "disc_wait",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 5451,
   "name": "b_154B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5481,
   "name": "disc_raster",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 5578,
   "name": "b_15CA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5585,
   "name": "b_15D1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5591,
   "name": "b_15D7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5595,
   "name": "j_15DB",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 5665,
   "name": "b_1621",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5726,
   "name": "b_165E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5742,
   "name": "b_166E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5806,
   "name": "b_16AE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5836,
   "name": "r_16CC",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 5837,
   "name": "disc_pictures",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5883,
   "name": "disc_buffers",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5887,
   "name": "disc_buffers_2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5891,
   "name": "fade_out",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5893,
   "name": "b_1705",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5927,
   "name": "j_1727",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 5970,
   "name": "b_1752",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5973,
   "name": "j_1755",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 5980,
   "name": "b_175C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5984,
   "name": "fade_chars",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5986,
   "name": "b_1762",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6001,
   "name": "b_1771",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6016,
   "name": "b_1780",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6031,
   "name": "b_178F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6049,
   "name": "fade_bitmap",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6051,
   "name": "b_17A3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6072,
   "name": "b_17B8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6093,
   "name": "b_17CD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6114,
   "name": "b_17E2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6138,
   "name": "colour_ramp",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 6154,
   "name": "ramp_unused",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 6170,
   "name": "colour_rank",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 6186,
   "name": "colour_darker",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 6202,
   "name": "colour_darker_mc",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 6218,
   "name": "intro_main",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 6221,
   "name": "b_184D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6237,
   "name": "intro_setup",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6281,
   "name": "b_1889",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6330,
   "name": "b_18BA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6346,
   "name": "raster_owner",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6347,
   "name": "raster_base",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6348,
   "name": "raster_index",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6349,
   "name": "raster_count",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6350,
   "name": "raster_owners",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6382,
   "name": "raster_lines",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6414,
   "name": "raster_lo",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6446,
   "name": "raster_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6478,
   "name": "raster_new_count",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6479,
   "name": "raster_swap",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6480,
   "name": "frame_busy",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6481,
   "name": "frame_d011",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6482,
   "name": "frame_d016",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6483,
   "name": "frame_d018",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6484,
   "name": "raster_init",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6522,
   "name": "raster_start",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6568,
   "name": "raster_add",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6583,
   "name": "b_19B7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6591,
   "name": "b_19BF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6599,
   "name": "b_19C7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6612,
   "name": "b_19D4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6638,
   "name": "b_19EE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6668,
   "name": "b_1A0C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6695,
   "name": "b_1A27",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6726,
   "name": "b_1A46",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6741,
   "name": "j_1A55",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 6754,
   "name": "b_1A62",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6769,
   "name": "b_1A71",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6781,
   "name": "b_1A7D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6796,
   "name": "b_1A8C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6826,
   "name": "b_1AAA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6852,
   "name": "b_1AC4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6882,
   "name": "b_1AE2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6891,
   "name": "raster_remove",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6923,
   "name": "b_1B0B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6952,
   "name": "b_1B28",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6964,
   "name": "b_1B34",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6969,
   "name": "r_1B39",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 6970,
   "name": "b_1B3A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6994,
   "name": "raster_dispatch",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7091,
   "name": "b_1BB3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7109,
   "name": "b_1BC5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7121,
   "name": "j_1BD1",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 7132,
   "name": "frame_top",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7162,
   "name": "b_1BFA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7229,
   "name": "b_1C3D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7235,
   "name": "raster_null",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7241,
   "name": "obj_handler_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7257,
   "name": "obj_handler_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7273,
   "name": "obj_frame_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7289,
   "name": "obj_frame_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7305,
   "name": "obj_count",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7306,
   "name": "job_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7322,
   "name": "job_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7338,
   "name": "job_count",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7339,
   "name": "objects_init",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7348,
   "name": "object_add",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7378,
   "name": "b_1CD2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7381,
   "name": "object_set_frame",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 7394,
   "name": "job_add",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 7412,
   "name": "r_1CF4",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 7413,
   "name": "object_stop",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7429,
   "name": "object_send",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7447,
   "name": "r_1D17",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 7448,
   "name": "objects_frame",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7455,
   "name": "b_1D1F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7478,
   "name": "r_1D36",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 7479,
   "name": "job_run",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7485,
   "name": "b_1D3D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7505,
   "name": "b_1D51",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7528,
   "name": "call_frame",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7531,
   "name": "call_job",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7534,
   "name": "no_frame",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7535,
   "name": "vic_defaults",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7582,
   "name": "bit_masks",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7590,
   "name": "key_rows",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7598,
   "name": "unused_1dae",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7606,
   "name": "wait_frame",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7613,
   "name": "b_1DBD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7622,
   "name": "r_1DC6",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 7623,
   "name": "fill_06",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7625,
   "name": "b_1DC9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7633,
   "name": "b_1DD1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7646,
   "name": "copy_0a",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7648,
   "name": "b_1DE0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7658,
   "name": "b_1DEA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7664,
   "name": "b_1DF0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7677,
   "name": "fill_range",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7679,
   "name": "b_1DFF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7687,
   "name": "b_1E07",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7700,
   "name": "copy_range",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7702,
   "name": "b_1E16",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7712,
   "name": "b_1E20",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7718,
   "name": "b_1E26",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7731,
   "name": "unpack_list",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7737,
   "name": "b_1E39",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7772,
   "name": "b_1E5C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7777,
   "name": "irq_ack",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7783,
   "name": "nmi_return",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7784,
   "name": "key_held",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7792,
   "name": "key_new",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7800,
   "name": "stick_2",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7801,
   "name": "stick_1",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7802,
   "name": "press_2",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7803,
   "name": "press_1",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7804,
   "name": "input_obj",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7805,
   "name": "input_init",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7851,
   "name": "input_message",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7868,
   "name": "input_messages",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7876,
   "name": "input_stop",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7882,
   "name": "input_read",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7892,
   "name": "input_wait",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7902,
   "name": "wait_fire",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7915,
   "name": "b_1EEB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7933,
   "name": "r_1EFD",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 7934,
   "name": "read_input",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7996,
   "name": "b_1F3C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8049,
   "name": "j_1F71",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 8053,
   "name": "b_1F75",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8100,
   "name": "b_1FA4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8134,
   "name": "b_1FC6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8168,
   "name": "b_1FE8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8171,
   "name": "j_1FEB",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 8192,
   "name": "keys_port2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8198,
   "name": "keys_port1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8204,
   "name": "load_game",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 8236,
   "name": "b_202C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8322,
   "name": "loader_code",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8375,
   "name": "game_name",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8387,
   "name": "unpack",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8391,
   "name": "b_20C7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8407,
   "name": "b_20D7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8427,
   "name": "b_20EB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8441,
   "name": "b_20F9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8447,
   "name": "b_20FF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8454,
   "name": "b_2106",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8468,
   "name": "b_2114",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8483,
   "name": "b_2123",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8494,
   "name": "b_212E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8497,
   "name": "scroll_text",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9356,
   "name": "title_chars_map",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9569,
   "name": "arch_list",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9582,
   "name": "arch_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10606,
   "name": "arch_bitmap_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11630,
   "name": "arch_bitmap_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12654,
   "name": "arch_bitmap_4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13678,
   "name": "arch_bitmap_5",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14454,
   "name": "arch_screen",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15082,
   "name": "arch_colour",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15535,
   "name": "towers_list",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15548,
   "name": "towers_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16384,
   "name": "towers_bitmap_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17408,
   "name": "towers_bitmap_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18432,
   "name": "towers_bitmap_4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 19456,
   "name": "towers_bitmap_5",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20422,
   "name": "towers_screen",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21037,
   "name": "towers_colour",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21395,
   "name": "title_charset",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22419,
   "name": "title_charset_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22533,
   "name": "disc_picture_00",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22917,
   "name": "disc_picture_01",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23301,
   "name": "disc_picture_02",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23685,
   "name": "disc_picture_03",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24069,
   "name": "disc_picture_04",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24453,
   "name": "disc_picture_05",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24837,
   "name": "disc_picture_06",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25221,
   "name": "disc_picture_07",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25605,
   "name": "disc_picture_08",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25989,
   "name": "disc_picture_09",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26373,
   "name": "disc_picture_10",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26757,
   "name": "disc_picture_11",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27141,
   "name": "disc_picture_12",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27525,
   "name": "disc_picture_13",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27909,
   "name": "disc_picture_14",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28293,
   "name": "disc_picture_15",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28677,
   "name": "disc_picture_16",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29061,
   "name": "disc_picture_17",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29445,
   "name": "disc_picture_18",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29829,
   "name": "disc_picture_19",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30213,
   "name": "disc_picture_20",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30597,
   "name": "disc_picture_21",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30981,
   "name": "disc_picture_22",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 46848,
   "name": "f_B700",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 49152,
   "name": "scroller_font",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50176,
   "name": "scroller_font_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 51200,
   "name": "intro_start",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 51290,
   "name": "b_C85A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 51456,
   "name": "f_C900",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 51712,
   "name": "f_CA00",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 51968,
   "name": "f_CB00",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 52120,
   "name": "f_CB98",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 52121,
   "name": "f_CB99",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 52159,
   "name": "a_CBBF",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 52160,
   "name": "f_CBC0",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 52161,
   "name": "f_CBC1",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 52199,
   "name": "a_CBE7",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 52216,
   "name": "f_CBF8",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 52217,
   "name": "a_CBF9",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 52218,
   "name": "a_CBFA",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 52219,
   "name": "a_CBFB",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 52220,
   "name": "a_CBFC",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 52221,
   "name": "a_CBFD",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 52224,
   "name": "f_CC00",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 52320,
   "name": "f_CC60",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 52416,
   "name": "f_CCC0",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 52512,
   "name": "f_CD20",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55296,
   "name": "letter_sprites",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 55808,
   "name": "f_DA00",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56064,
   "name": "f_DB00",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56216,
   "name": "f_DB98",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56217,
   "name": "f_DB99",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56255,
   "name": "a_DBBF",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 56256,
   "name": "f_DBC0",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56257,
   "name": "f_DBC1",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56295,
   "name": "a_DBE7",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 65412,
   "name": "KERNAL_IOINIT",
   "type": "Predefined",
   "kind": "system"
  },
  {
   "address": 65418,
   "name": "KERNAL_RESTOR",
   "type": "Predefined",
   "kind": "system"
  }
 ],
 "comments": [
  {
   "address": 512,
   "type": "line",
   "text": "Starts tune A (0 or 1; the intro only ever starts tune 0): copies the tune's 16 bytes from tunes + 16 x A to tune_header ($065E-$066D). For each voice (X = 2, 1, 0) clears its mute flag, block flag and pattern position, writes 0 to its SID control and sustain-release registers, sets its note timer to 1, its instrument to $FF (none) and its track position to $FF, and reads its first track entry (track_next). Then the tick counter and fade delay to 0, no filter ($D417 = 0), volume 15, the fade's volume 16, no fade (fade_speed = $FF) and music_on = $FF."
  },
  {
   "address": 605,
   "type": "line",
   "text": "The music's frame step: the music object's frame routine, run from the frame-top interrupt. Does nothing while music_on is clear. While a fade runs (fade_speed not $FF) the volume fade_volume drops by one into $D418 every fade_speed + 1 frames, and at 0 the music stops (music_on = 0). Then each voice in turn (music_voice), and the tick counter: when it passes zero it is reloaded from the tune's eight speeds in turn, so a tick lasts speed + 1 frames."
  },
  {
   "address": 610,
   "type": "line",
   "text": "music_on clear: the music is stopped."
  },
  {
   "address": 649,
   "type": "line",
   "text": "One voice's frame (X = 2, 1, 0; Y and voice_reg = its SID offset 0, 7 or 14). On a tick (tick_count 0) its note timer counts down, and at 0 the next note is read (music_note); on other frames only the instrument's effects run (voice_effects)."
  },
  {
   "address": 671,
   "type": "line",
   "text": "The voice's note timer ran out: its next note. Pattern number $FE (the track ended) silences the three voices and stops the music; $FF (the track jumps back) restarts the pattern and reads the next track entry. Otherwise the pattern's address is $08D0 plus pattern_lo/pattern_hi. A note's first byte holds its length in ticks (bits 0-5), bit 6 to hold the gate off for the note (the voice releases) and bit 7 when a second byte follows: an instrument number ($00-$7F) or a slide ($80-$BF down, $C0-$FF up, by bits 0-5 a frame). Then the note itself: bits 0-6 index the frequency tables; bit 7 plays it legato, the new pitch with the voice's registers as they are and no new attack."
  },
  {
   "address": 825,
   "type": "line",
   "text": "A new note with a new instrument: loads the instrument's eight bytes (instruments) into the voice: waveform, effect flags, pulse width, effect length, attack-decay and sustain-release into the SID, and the pulse width into both pulse registers."
  },
  {
   "address": 914,
   "type": "line",
   "text": "Steps past the note; at the pattern's $FF end the position goes back to 0 and the entry's repeat count runs down, reading the next track entry (track_next) when it reaches 0."
  },
  {
   "address": 939,
   "type": "line",
   "text": "A voice with its mute flag set is skipped. Otherwise a new note restarts the effect counter and turns the filter off ($D417 = 0)."
  },
  {
   "address": 956,
   "type": "line",
   "text": "Every frame, the instrument's effects. Pulse sweep: when the instrument's byte 5 is not zero the pulse width moves by it each frame, up until its high byte reaches the high nibble of byte 6, then down to the low nibble, and back."
  },
  {
   "address": 1066,
   "type": "line",
   "text": "A slide moves the frequency by its step each frame, up for $C0 and over, down below."
  },
  {
   "address": 1118,
   "type": "line",
   "text": "Effect flag 1 ($02), alternate notes: on odd frames the note named by the instrument's byte 13 (bit 7 set: the note plus bits 0-6; clear: that note itself), on even frames the note."
  },
  {
   "address": 1168,
   "type": "line",
   "text": "Effect flag 2 ($04), drum: odd frames play noise ($81) instead of the instrument's waveform, the gate goes off after the note's first two ticks, and the frequency's high byte drops by one a frame down to 0."
  },
  {
   "address": 1219,
   "type": "line",
   "text": "Effect flag 3 ($08), arpeggio: the note changes every frame through the instrument's bytes 9-12, four in turn."
  },
  {
   "address": 1243,
   "type": "line",
   "text": "Effect flag 4 ($10): the waveform is the instrument's byte 8 while its effect length (byte 7) runs, then its own."
  },
  {
   "address": 1275,
   "type": "line",
   "text": "Effect flag 5 ($20), pitch sequence: while the effect length runs, the note follows the instrument's bytes 9 onward, one a frame: $80-$BF adds bits 0-5 to the note, $C0-$FF takes them off, below $80 is a note; then back to the note."
  },
  {
   "address": 1350,
   "type": "line",
   "text": "Writes the voice: on a new note's first frame the waveform with the gate off (a hard restart), then the waveform with the gate mask, and the frequency. Counts the effect length down (effect_done = $FF at its end) and the effect counter up."
  },
  {
   "address": 1411,
   "type": "line",
   "text": "The next voice, and after the last, the tick counter."
  },
  {
   "address": 1442,
   "type": "line",
   "text": "Reads voice X's next track entry, from tracks plus the tune's offset for the voice. An entry is a repeat count and a pattern number. $FD sets fade_speed from the next byte (a fade written into the tune) and reads on. $FE (stop) and $FF (jump: the next byte is the track position to go back to) go into pattern_num for music_note to act on. A count with bit 6 set opens a block of entries played (count and $3F) times, which a $40 byte closes."
  },
  {
   "address": 1575,
   "type": "line",
   "text": "The fade's speed: $FF for none, otherwise the volume drops by one every fade_speed + 1 frames. A track's $FD sets it, and so does fire in the intro (the music object's message 2 sets 8)."
  },
  {
   "address": 1576,
   "type": "line",
   "text": "$FF while the music plays; 0 once it has stopped, at the end of a fade or of a track ending with $FE."
  },
  {
   "address": 1577,
   "type": "line",
   "text": "The volume during a fade, from 16 down; each step writes it to $D418."
  },
  {
   "address": 1578,
   "type": "line",
   "text": "Frames to the fade's next step."
  },
  {
   "address": 1579,
   "type": "line",
   "text": "Frames to the next tick: notes and track entries are read only when it is 0."
  },
  {
   "address": 1580,
   "type": "line",
   "text": "Which of the tune's eight speeds gives the next tick's length; counts 7 down to 0 and round."
  },
  {
   "address": 1581,
   "type": "line",
   "text": "The SID register offset of the voice being played: 0, 7 or 14."
  },
  {
   "address": 1582,
   "type": "line",
   "text": "The instrument a note's second byte names; $FF when it names none."
  },
  {
   "address": 1583,
   "type": "line",
   "text": "The new instrument's attack and decay, for $D405."
  },
  {
   "address": 1584,
   "type": "line",
   "text": "The new instrument's sustain and release, for $D406."
  },
  {
   "address": 1585,
   "type": "line",
   "text": "The pulse sweep's step a frame, the instrument's byte 5."
  },
  {
   "address": 1586,
   "type": "line",
   "text": "The pulse sweep's upper limit for the pulse width's high byte: the high nibble of the instrument's byte 6."
  },
  {
   "address": 1587,
   "type": "line",
   "text": "Its lower limit: the low nibble of byte 6."
  },
  {
   "address": 1588,
   "type": "line",
   "text": "A downward slide's step, bits 0-5 of the slide byte."
  },
  {
   "address": 1589,
   "type": "line",
   "text": "The track byte being read."
  },
  {
   "address": 1590,
   "type": "line",
   "text": "A pitch sequence's step down, bits 0-5 of its byte."
  },
  {
   "address": 1591,
   "type": "line",
   "text": "The arpeggio's step this frame: the effect counter and 3."
  },
  {
   "address": 1592,
   "type": "line",
   "text": "38 bytes (values 0-5) that nothing in the intro reads."
  },
  {
   "address": 1630,
   "type": "line",
   "text": "The playing tune's 16 bytes, copied from tunes by music_init: the three tracks' offsets from tracks, low bytes here and high bytes at $0661, two bytes nothing reads ($0664, $0665) and, at $0666, the eight speeds in ticks."
  },
  {
   "address": 1638,
   "type": "line",
   "text": "The tune's eight tick lengths, used in turn from the last (speed_index)."
  },
  {
   "address": 1646,
   "type": "line",
   "text": "Each voice's offset in the SID: 0, 7 and 14."
  },
  {
   "address": 1649,
   "type": "line",
   "text": "Each voice's instrument number times 8, its offset into the instruments."
  },
  {
   "address": 1652,
   "type": "line",
   "text": "Each voice's position in its track."
  },
  {
   "address": 1655,
   "type": "line",
   "text": "$FF while a voice is inside a repeated block of its track."
  },
  {
   "address": 1658,
   "type": "line",
   "text": "The block's repeats still to play."
  },
  {
   "address": 1661,
   "type": "line",
   "text": "The track position the block starts at."
  },
  {
   "address": 1664,
   "type": "line",
   "text": "Each voice's position in its pattern."
  },
  {
   "address": 1667,
   "type": "line",
   "text": "Each voice's pattern number, or $FE or $FF from its track."
  },
  {
   "address": 1670,
   "type": "line",
   "text": "How many more times the voice plays its pattern."
  },
  {
   "address": 1673,
   "type": "line",
   "text": "The note's first byte: length, gate-off and second-byte bits."
  },
  {
   "address": 1676,
   "type": "line",
   "text": "Ticks left of the note."
  },
  {
   "address": 1679,
   "type": "line",
   "text": "The voice's waveform and gate, for its control register."
  },
  {
   "address": 1682,
   "type": "line",
   "text": "The note being played, an index into the frequency tables."
  },
  {
   "address": 1685,
   "type": "line",
   "text": "$FF once the note's effect length has run out."
  },
  {
   "address": 1688,
   "type": "line",
   "text": "The voice's instrument, $FF at the start for none."
  },
  {
   "address": 1691,
   "type": "line",
   "text": "$FF, or $FE to hold the gate off: ANDed with the waveform."
  },
  {
   "address": 1694,
   "type": "line",
   "text": "The pulse sweep's direction: 0 up, 1 down."
  },
  {
   "address": 1697,
   "type": "line",
   "text": "The note's slide byte, 0 for none."
  },
  {
   "address": 1700,
   "type": "line",
   "text": "Three bytes nothing reads."
  },
  {
   "address": 1703,
   "type": "line",
   "text": "The instrument's last byte, copied here at each new instrument and never read."
  },
  {
   "address": 1706,
   "type": "line",
   "text": "Set to 0 at each new note and never read; the 15 bytes after it are not used either."
  },
  {
   "address": 1724,
   "type": "line",
   "text": "Each voice's frequency, low byte ($06BF the high byte), before it is written to the SID."
  },
  {
   "address": 1727,
   "type": "line",
   "text": "The frequency's high byte."
  },
  {
   "address": 1730,
   "type": "line",
   "text": "The note byte as read, bit 7 for a legato note; an instrument change writes the instrument here, so the registers load."
  },
  {
   "address": 1733,
   "type": "line",
   "text": "The pulse width, low byte ($06C8 the high byte)."
  },
  {
   "address": 1736,
   "type": "line",
   "text": "The pulse width's high byte."
  },
  {
   "address": 1739,
   "type": "line",
   "text": "The instrument's effect flags (its byte 3)."
  },
  {
   "address": 1742,
   "type": "line",
   "text": "Frames left of the instrument's effect length."
  },
  {
   "address": 1745,
   "type": "line",
   "text": "Frames since the note started."
  },
  {
   "address": 1748,
   "type": "line",
   "text": "Each voice's first track position less one ($FF), copied in by music_init."
  },
  {
   "address": 1751,
   "type": "line",
   "text": "A voice's mute flag: when set, the player leaves the voice alone. The intro only ever clears it."
  },
  {
   "address": 1754,
   "type": "line",
   "text": "The SID frequency of each of 96 notes, low bytes: C0 ($0116, 16.4 Hz on a PAL machine) up by semitones to A#7 ($F80F); the 96th, B7, would not fit in 16 bits and is $FFCF."
  },
  {
   "address": 1850,
   "type": "line",
   "text": "The frequencies' high bytes."
  },
  {
   "address": 1946,
   "type": "line",
   "text": "14 instruments of eight bytes, then eight more each at $080A: 0 attack-decay, 1 sustain-release, 2 waveform, 3 effect flags (bit 1 alternate notes, 2 drum, 3 arpeggio, 4 effect waveform, 5 pitch sequence), 4 pulse width (both bytes), 5 pulse sweep step, 6 pulse sweep limits, 7 effect length in frames. Instrument 0 is silent."
  },
  {
   "address": 2048,
   "type": "line",
   "text": "The instruments' first halves, continued past the memory map's $0800 line: the last two bytes of instrument 12 and all of instrument 13."
  },
  {
   "address": 2058,
   "type": "line",
   "text": "The instruments' second eight bytes: 8 the effect waveform, 9-12 the arpeggio or the pitch sequence, 13 the alternate note, 14 not read, 15 copied to instr_spare. Every instrument ends $FF."
  },
  {
   "address": 2170,
   "type": "line",
   "text": "The 43 patterns' offsets from $08D0, low bytes; the high bytes are at pattern_hi. Patterns 3 and $0C, which no track plays, are $FFFF: one byte before pattern $00."
  },
  {
   "address": 2213,
   "type": "line",
   "text": "The patterns' offsets, high bytes."
  },
  {
   "address": 2256,
   "type": "line",
   "text": "The patterns, $08D0-$0D82, in no order of their numbers: notes as music_note reads them, each pattern ending $FF. This first one is pattern $00, a rest: one note of 48 ticks on instrument 0, the silent one; voices 1 and 3 of tune 0 play it."
  },
  {
   "address": 2260,
   "type": "line",
   "text": "Pattern $01: 22 notes, 96 ticks; tune 0, voice 1."
  },
  {
   "address": 2322,
   "type": "line",
   "text": "Pattern $02: 23 notes, 96 ticks; tune 0, voice 1."
  },
  {
   "address": 2385,
   "type": "line",
   "text": "Pattern $0D: 7 notes, 48 ticks; tune 0, voice 1."
  },
  {
   "address": 2405,
   "type": "line",
   "text": "Pattern $16: 4 notes, 48 ticks; tune 0, voice 1."
  },
  {
   "address": 2415,
   "type": "line",
   "text": "Pattern $1A: 12 notes, 96 ticks; tune 0, voice 1."
  },
  {
   "address": 2448,
   "type": "line",
   "text": "Pattern $28: 11 notes, 48 ticks; tune 0, voice 1."
  },
  {
   "address": 2479,
   "type": "line",
   "text": "Pattern $1B: 21 notes, 96 ticks; tune 0, voice 1."
  },
  {
   "address": 2538,
   "type": "line",
   "text": "Pattern $23: 22 notes, 96 ticks; tune 0, voice 1."
  },
  {
   "address": 2599,
   "type": "line",
   "text": "Pattern $05: 1 note, 24 ticks; tune 0, voices 1 and 2 and 3."
  },
  {
   "address": 2603,
   "type": "line",
   "text": "Pattern $07: 20 notes, 48 ticks; tune 0, voice 2."
  },
  {
   "address": 2652,
   "type": "line",
   "text": "Pattern $04: 5 notes, 12 ticks; tune 0, voices 2 and 3."
  },
  {
   "address": 2667,
   "type": "line",
   "text": "Pattern $0E: 8 notes, 36 ticks; tune 0, voice 2."
  },
  {
   "address": 2686,
   "type": "line",
   "text": "Pattern $0F: 5 notes, 36 ticks; tune 0, voice 2."
  },
  {
   "address": 2700,
   "type": "line",
   "text": "Pattern $11: 4 notes, 12 ticks; tune 0, voice 2."
  },
  {
   "address": 2711,
   "type": "line",
   "text": "Pattern $15: 19 notes, 48 ticks; tune 0, voice 2."
  },
  {
   "address": 2757,
   "type": "line",
   "text": "Pattern $0B: 4 notes, 12 ticks; tune 0, voice 2."
  },
  {
   "address": 2768,
   "type": "line",
   "text": "Pattern $18: 8 notes, 24 ticks; tune 0, voice 2."
  },
  {
   "address": 2787,
   "type": "line",
   "text": "Pattern $1D: 4 notes, 12 ticks; tune 0, voice 2."
  },
  {
   "address": 2798,
   "type": "line",
   "text": "Pattern $1F: 8 notes, 24 ticks; tune 0, voice 2."
  },
  {
   "address": 2817,
   "type": "line",
   "text": "Pattern $21: 15 notes, 48 ticks; tune 0, voice 2."
  },
  {
   "address": 2858,
   "type": "line",
   "text": "Pattern $22: 15 notes, 48 ticks; tune 0, voice 2."
  },
  {
   "address": 2893,
   "type": "line",
   "text": "Pattern $25: 5 notes, 48 ticks; tune 0, voice 2."
  },
  {
   "address": 2906,
   "type": "line",
   "text": "Pattern $27: 2 notes, 12 ticks; tune 0, voice 2."
  },
  {
   "address": 2913,
   "type": "line",
   "text": "Pattern $06: 16 notes, 48 ticks; tune 0, voice 3."
  },
  {
   "address": 2950,
   "type": "line",
   "text": "Pattern $08: 18 notes, 96 ticks; tune 0, voice 3."
  },
  {
   "address": 2991,
   "type": "line",
   "text": "Pattern $09: 18 notes, 96 ticks; tune 0, voice 3."
  },
  {
   "address": 3034,
   "type": "line",
   "text": "Pattern $0A: 6 notes, 48 ticks; tune 0, voice 3."
  },
  {
   "address": 3049,
   "type": "line",
   "text": "Pattern $10: 16 notes, 96 ticks; tune 0, voice 3."
  },
  {
   "address": 3088,
   "type": "line",
   "text": "Pattern $12: 20 notes, 96 ticks; tune 0, voice 3."
  },
  {
   "address": 3146,
   "type": "line",
   "text": "Pattern $13: 10 notes, 48 ticks; tune 0, voice 3."
  },
  {
   "address": 3176,
   "type": "line",
   "text": "Pattern $14: 15 notes, 48 ticks; tune 0, voice 3."
  },
  {
   "address": 3210,
   "type": "line",
   "text": "Pattern $17: 9 notes, 48 ticks; tune 0, voice 3."
  },
  {
   "address": 3230,
   "type": "line",
   "text": "Pattern $19: 4 notes, 24 ticks; tune 0, voice 3."
  },
  {
   "address": 3241,
   "type": "line",
   "text": "Pattern $1C: 8 notes, 36 ticks; tune 0, voice 3."
  },
  {
   "address": 3266,
   "type": "line",
   "text": "Pattern $1E: 26 notes, 96 ticks; tune 0, voice 3."
  },
  {
   "address": 3331,
   "type": "line",
   "text": "Pattern $20: 22 notes, 96 ticks; tune 0, voice 3."
  },
  {
   "address": 3397,
   "type": "line",
   "text": "Pattern $26: 5 notes, 48 ticks; tune 0, voice 3."
  },
  {
   "address": 3410,
   "type": "line",
   "text": "Pattern $24: 18 notes, 96 ticks; tune 0, voice 3."
  },
  {
   "address": 3451,
   "type": "line",
   "text": "Pattern $2A: 1 note, 3 ticks; tune 1, voices 1 and 3."
  },
  {
   "address": 3455,
   "type": "line",
   "text": "Pattern $29: 1 note, 3 ticks; tune 1, voice 2."
  },
  {
   "address": 3459,
   "type": "line",
   "text": "Two tunes of 16 bytes (tune_header). Tune 0, the intro's: tracks at offsets $00, $4A and $A2, every speed 1 (a tick every two frames). Tune 1, which nothing starts: three tracks of one pattern each ($2A, $29, $2A) that end with $FE."
  },
  {
   "address": 3491,
   "type": "line",
   "text": "The tracks: tune 0's three voices at $0DA3, $0DED and $0E45, each a list of repeat counts and patterns with repeated blocks ($42 ... $40) that ends $FF 00, so the tune loops; tune 1's three at $0E91."
  },
  {
   "address": 3741,
   "type": "line",
   "text": "The eight letter sprites' X positions (low byte); the ninth bit of each is in letters_msb."
  },
  {
   "address": 3749,
   "type": "line",
   "text": "Their Y positions."
  },
  {
   "address": 3757,
   "type": "line",
   "text": "Their sprite frames: $60-$67 ($D800-$D9FF)."
  },
  {
   "address": 3765,
   "type": "line",
   "text": "Their colours."
  },
  {
   "address": 3773,
   "type": "line",
   "text": "The X positions' ninth bits, for $D010."
  },
  {
   "address": 3774,
   "type": "line",
   "text": "Which letters are multicolour ($D01C)."
  },
  {
   "address": 3775,
   "type": "line",
   "text": "Which letters are twice as wide ($D01D)."
  },
  {
   "address": 3776,
   "type": "line",
   "text": "The first sprite multicolour ($D025)."
  },
  {
   "address": 3777,
   "type": "line",
   "text": "The second ($D026)."
  },
  {
   "address": 3778,
   "type": "line",
   "text": "The fade's step: 0-$0F fading in through the brightness ramp, $0F shown, $10-$1F fading out, $20 off."
  },
  {
   "address": 3779,
   "type": "line",
   "text": "The letters object's number (0)."
  },
  {
   "address": 3780,
   "type": "line",
   "text": "Sets up the letters object (object 0), the eight sprites that spell SPEEDBALL above the pictures: every letter at 0,0 with frame $7F and colour 3, no ninth bits, sprite multicolours 11 and 1; registers its message handler (letters_message) and keeps its number."
  },
  {
   "address": 3829,
   "type": "line",
   "text": "The letters' messages, through letters_messages: 0 and 3 fade the letters out, 1 makes them multicolour and fades them in where they are (no message 1 is ever sent), 2 places and fades them in."
  },
  {
   "address": 3846,
   "type": "line",
   "text": "The four message routines of the letters object."
  },
  {
   "address": 3854,
   "type": "line",
   "text": "Message 0: starts the fade out (letters_fade = $10)."
  },
  {
   "address": 3860,
   "type": "line",
   "text": "Message 1, never sent: every letter multicolour, none wide, the fade from 0 and the frame routine letters_frame."
  },
  {
   "address": 3885,
   "type": "line",
   "text": "Message 2: stops whatever the letters were doing (object_stop), then puts the eight letters along the top at Y $3C, X from letters_xs doubled (the carry into the ninth bits), frames $60-$67, colour 1 (white), none multicolour, letters 2 and 6 (EE and LL) twice as wide, and starts the fade in with the frame routine letters_frame."
  },
  {
   "address": 3949,
   "type": "line",
   "text": "The eight letters' X positions, halved: S, P, EE, D, B, A, LL, and an eighth, a star, at 400: past the right edge, never seen."
  },
  {
   "address": 3957,
   "type": "line",
   "text": "The letters' frame routine. At fade step $20 turns the sprites off and stops (object_stop). At step $0F (shown) writes the sprites' positions, frames and colours as they are. Otherwise steps the fade: below $10 a level rising to 15, from $10 one falling to 0; each colour is shown as the colour of its own brightness or of the level, whichever is darker (colour_rank, colour_ramp), so the letters fade in and out through the ramp."
  },
  {
   "address": 4168,
   "type": "line",
   "text": "The screens object's number (1)."
  },
  {
   "address": 4169,
   "type": "line",
   "text": "1 while nothing has been shown yet, so the first screen appears without a fade; every later change fades the screen out first (fade_out)."
  },
  {
   "address": 4170,
   "type": "line",
   "text": "Sets up the screens object (object 1), which shows the intro's three screens: registers its message handler (screens_message) and sets screens_blank."
  },
  {
   "address": 4186,
   "type": "line",
   "text": "The screens' messages, through screens_messages: each queues a job (job_add), since a screen takes several frames to draw. 0 and 7 blank the screen (blank_screen), 1 the SPEEDBALL 2 title (title_screen), 2 the arch picture (show_arch), 3 the towers picture (show_towers); 4, 5 and 6, never sent, would treat the packed title characters at $5393 as a picture list."
  },
  {
   "address": 4203,
   "type": "line",
   "text": "The eight message routines of the screens object."
  },
  {
   "address": 4219,
   "type": "line",
   "text": "Messages 0 to 3 and 7: queue blank_screen, title_screen, show_arch or show_towers as a job."
  },
  {
   "address": 4247,
   "type": "line",
   "text": "Messages 4, 5 and 6: queue the jobs at $10BC, $10C4 and $10CC."
  },
  {
   "address": 4268,
   "type": "line",
   "text": "The job that shows the arch picture (arch_list), in multicolour."
  },
  {
   "address": 4276,
   "type": "line",
   "text": "The job that shows the towers picture (towers_list), in multicolour."
  },
  {
   "address": 4284,
   "type": "line",
   "text": "The jobs of messages 4, 5 and 6, which are never sent: each would pass the packed title characters at $5393 to show_picture as a picture list, the third in hires."
  },
  {
   "address": 4308,
   "type": "line",
   "text": "Shows a bitmap picture: X/Y the address of its list of packed streams (unpack_list), carry set for hires. Fades the screen out first unless nothing was shown yet. Clears the screen and colour RAM above the scroller (rows 0-22) to black, turns on the bitmap ($D011 = $3B, bitmap at $E000 and screen at $C800 by $D018 = $28, multicolour unless the carry was set), unpacks the bitmap to $E000 and the picture's two colour layers to $BC00 (screen) and $B800 (colour RAM), still hidden, then reveals it from the middle outwards: 20 frames, each copying two more columns of colours, column 19 - n and 20 + n, into the screen and colour RAM."
  },
  {
   "address": 4501,
   "type": "line",
   "text": "The job that shows the SPEEDBALL 2 title, in multicolour characters: fades the screen out first unless nothing was shown yet, blacks out colour RAM, sets character mode (screen $C800, characters $F800), multicolours 9 (brown) and 8 (orange), unpacks the screen from title_chars_map to $C800 and the characters from title_charset to $F800, and colours the top eight rows $0F (multicolour, yellow): the gold logo."
  },
  {
   "address": 4632,
   "type": "line",
   "text": "The job that blanks the screen: fades it out first unless nothing was shown yet, blacks out colour RAM above the scroller and sets character mode."
  },
  {
   "address": 4643,
   "type": "line",
   "text": "Nothing was shown yet: no fade, and the flag is cleared."
  },
  {
   "address": 4688,
   "type": "line",
   "text": "The scroll text's read position, low byte; the high byte is at $1251."
  },
  {
   "address": 4689,
   "type": "line",
   "text": "The scroll text's read position, high byte."
  },
  {
   "address": 4690,
   "type": "line",
   "text": "The scroller's fine position in sixteenths of a pixel: the speed is taken off it each frame, and when it goes below 0 it gains $80 (eight pixels) and the text moves a column. Bits 4-6 are the horizontal scroll at line $EA."
  },
  {
   "address": 4691,
   "type": "line",
   "text": "Which half of the current glyph goes in next: 0 the left column, 1 the right."
  },
  {
   "address": 4692,
   "type": "line",
   "text": "The text's colour, set by $40-$4F codes in the text."
  },
  {
   "address": 4693,
   "type": "line",
   "text": "The scroller's speed in sixteenths of a pixel a frame; it moves by one a frame towards scroll_target."
  },
  {
   "address": 4694,
   "type": "line",
   "text": "The speed the text asks for ($50-$5F codes, through scroll_speeds)."
  },
  {
   "address": 4695,
   "type": "line",
   "text": "Frames left of a pause ($60-$6F codes, through scroll_pauses): the scroller stands still meanwhile."
  },
  {
   "address": 4696,
   "type": "line",
   "text": "The scroller object's number (2)."
  },
  {
   "address": 4697,
   "type": "line",
   "text": "Sets up the scroller object (object 2): the text from its start (scroll_text), colour 3 (cyan), speed $20 (two pixels a frame), no pause; registers its message handler (scroller_message)."
  },
  {
   "address": 4744,
   "type": "line",
   "text": "The scroller's messages, through scroller_messages: 0 and 3 stop it (object_stop), 1 starts it (scroller_start), 2 jumps its speed to the target at once. The scroll text sends these to the scroller with $70-$7F codes."
  },
  {
   "address": 4761,
   "type": "line",
   "text": "The four message routines of the scroller object."
  },
  {
   "address": 4769,
   "type": "line",
   "text": "Messages 0 and 3: stops the scroller (object_stop): no frame routine, no raster entry."
  },
  {
   "address": 4775,
   "type": "line",
   "text": "Message 1: replaces the scroller's raster entries with one at line $EA (scroller_raster). It then loads line $FB and raster_restore's address as if to add a second entry, but the call is missing, so none is added. Sets the frame routine scroller_frame, clears rows 23 and 24 of the screen and their colours, and reads the codes at the start of the text."
  },
  {
   "address": 4855,
   "type": "line",
   "text": "Message 2: the speed becomes the target at once."
  },
  {
   "address": 4862,
   "type": "line",
   "text": "The scroller's frame routine. During a pause only counts it down. Otherwise eases the speed a step towards the target and takes it off scroll_fine; when that runs out, moves rows 23 and 24 (characters and colours) a column left and writes the next half glyph in column 39: glyph x 4 + half on row 23, two more on row 24, in scroll_colour. After a glyph's right half the text moves on (it starts again after its last byte, at $248C) and any codes there are acted on (scroll_codes)."
  },
  {
   "address": 4986,
   "type": "line",
   "text": "Reads the text's codes up to its next glyph (bytes $00-$3F are glyphs): $40-$4F set the colour, $50-$5F the target speed (scroll_speeds), $60-$6F a pause (scroll_pauses), $70-$7F send message 0-15 to the scroller itself, and $80-$FF send the next byte as a message to object 0-127 (object_send): that is how the text runs the intro."
  },
  {
   "address": 5115,
   "type": "line",
   "text": "The scroller's raster handler, at line $EA, above the text's two rows: horizontal scroll from scroll_fine, 38 columns, hires characters from $C000 (scroller_font) on the screen at $C800, written after a delay of nine NOPs. Then starts CIA 2's timer B (one shot, $05 in its latch's high byte) with its NMI on. nmi_return returns without reading $DD0D, the read that would release the line, so CIA 2 keeps the NMI line held low, and RESTORE, which pulls the same line, makes no new NMI."
  },
  {
   "address": 5169,
   "type": "line",
   "text": "A raster handler nothing installs (see scroller_start): acknowledges the VIC and puts back the default $D011, $D016 and $D018."
  },
  {
   "address": 5193,
   "type": "line",
   "text": "The speeds of codes $50-$5F, in quarter pixels a frame (scroller_frame multiplies by 4): 0 to 8 pixels."
  },
  {
   "address": 5209,
   "type": "line",
   "text": "The pauses of codes $60-$6F in frames: 0, 6, 12, 25, 50 (one second) ... 200, then 255."
  },
  {
   "address": 5225,
   "type": "line",
   "text": "The music object's number (3)."
  },
  {
   "address": 5226,
   "type": "line",
   "text": "1 once fire has asked for the music to fade out."
  },
  {
   "address": 5227,
   "type": "line",
   "text": "Sets up the music object (object 3): tune 0 ready (music_init) and its message handler (music_message)."
  },
  {
   "address": 5248,
   "type": "line",
   "text": "The music's messages, through music_messages: 0 stops it (volume 0, object_stop), 1 starts tune 0 (music_start), 2 fades it out (music_fade), 3 asks whether a fade has finished (music_faded)."
  },
  {
   "address": 5265,
   "type": "line",
   "text": "The four message routines of the music object."
  },
  {
   "address": 5273,
   "type": "line",
   "text": "Message 0: volume 0 and the music object stopped."
  },
  {
   "address": 5284,
   "type": "line",
   "text": "Message 1: no fade asked, tune 0 from its start (music_init), and the music's step (music_play) as the frame routine."
  },
  {
   "address": 5304,
   "type": "line",
   "text": "Message 2, sent on fire: fade_speed 8 (the volume drops a step every nine frames, nearly three seconds to silence) and music_fading set."
  },
  {
   "address": 5315,
   "type": "line",
   "text": "Message 3: A = 1 when a fade was asked and the music has stopped, else 0."
  },
  {
   "address": 5331,
   "type": "line",
   "text": "The disc object's number (4)."
  },
  {
   "address": 5332,
   "type": "line",
   "text": "The disc's animation step, 0-45: steps 0-22 play its 23 pictures forwards and 23-45 back again."
  },
  {
   "address": 5333,
   "type": "line",
   "text": "1 while the job that clears the disc's sprite buffers runs."
  },
  {
   "address": 5334,
   "type": "line",
   "text": "The disc's fade step, as letters_fade."
  },
  {
   "address": 5335,
   "type": "line",
   "text": "Sets up the disc object (object 4): the spinning disc with a 2 on it that turns in the middle of the screen. Step 0, not busy; registers its message handler (disc_message)."
  },
  {
   "address": 5354,
   "type": "line",
   "text": "The disc's messages, through disc_messages: 0 fades it out (disc_fade_out), 1 starts it (disc_start)."
  },
  {
   "address": 5371,
   "type": "line",
   "text": "The two message routines of the disc object."
  },
  {
   "address": 5375,
   "type": "line",
   "text": "Message 0: starts the fade out (disc_fade = $10)."
  },
  {
   "address": 5381,
   "type": "line",
   "text": "Message 1: removes the disc's raster entry, queues the job disc_clear and waits for it (disc_wait as the frame routine)."
  },
  {
   "address": 5409,
   "type": "line",
   "text": "The job that clears the disc's sprite buffers, $CC00-$CFFF."
  },
  {
   "address": 5436,
   "type": "line",
   "text": "The job that turns the sprites off after the disc has faded out."
  },
  {
   "address": 5445,
   "type": "line",
   "text": "The disc's frame routine while disc_clear runs; when it is done, drops the frame routine, starts the fade in and adds the disc's raster entry at line $55 (disc_raster)."
  },
  {
   "address": 5481,
   "type": "line",
   "text": "The disc's raster handler, at line $55, below the letters: reuses sprites 0-5 as the disc, two across and three down at X $A0 and $B8 and Y $69, $7E and $93, hires and single size. Fades it in and out through the brightness ramp to white (at the end of a fade out it queues disc_off and stops). Shows one of two buffers, frames $30-$35 ($CC00) or $38-$3D ($CE00), changing every two frames, and fills the hidden one with the next picture from disc_pictures: half of its 384 bytes on even frames, half on odd. So the disc turns a picture every two frames, 23 pictures there and back."
  },
  {
   "address": 5726,
   "type": "line",
   "text": "The four instructions' operands are written above: the picture's address and the buffer's."
  },
  {
   "address": 5742,
   "type": "line",
   "text": "Odd frames: the picture's second half, bytes $C0-$17F, into the hidden buffer from $C0; then the next step, 0 after 45."
  },
  {
   "address": 5806,
   "type": "line",
   "text": "The operands are written above."
  },
  {
   "address": 5837,
   "type": "line",
   "text": "The addresses of the disc's 23 pictures, each six sprites of 64 bytes, $180 apart from $5805 to $7905."
  },
  {
   "address": 5883,
   "type": "line",
   "text": "The two sprite buffers the pictures are copied into: $CC00 and $CE00."
  },
  {
   "address": 5887,
   "type": "line",
   "text": "The same buffers, from their second half ($CCC0, $CEC0)."
  },
  {
   "address": 5891,
   "type": "line",
   "text": "Fades the screen to black in 16 frames: builds a table at $B700 that darkens both halves of a byte a step (colour_darker), then each frame darkens the background colours $D021-$D023 and, in bitmap mode, colour RAM and the screen's colours (fade_bitmap); in character mode colour RAM only (fade_chars)."
  },
  {
   "address": 5984,
   "type": "line",
   "text": "One fade step in character mode: every colour RAM cell above the scroller (rows 0-22) a step darker through colour_darker_mc, which keeps the multicolour bit."
  },
  {
   "address": 6049,
   "type": "line",
   "text": "One fade step in bitmap mode: both colours of every screen cell and its colour RAM a step darker (rows 0-22), through the table at $B700."
  },
  {
   "address": 6138,
   "type": "line",
   "text": "The 16 colours from dark to light: black, dark grey, brown, red, blue, light blue, purple, light red, orange, grey, green, yellow, light grey, cyan, light green, white."
  },
  {
   "address": 6154,
   "type": "line",
   "text": "A second ramp, eight colours each twice, that nothing reads."
  },
  {
   "address": 6170,
   "type": "line",
   "text": "Each colour's place in colour_ramp: black 0 ... white 15."
  },
  {
   "address": 6186,
   "type": "line",
   "text": "Each colour's next darker colour, in a chain from white through light green, cyan, light grey, yellow, green, grey, orange, light red, purple, light blue, blue, red, brown and dark grey to black."
  },
  {
   "address": 6202,
   "type": "line",
   "text": "The same for colour RAM in character mode: colours 0-7 fade through 1, 3, 7, 5, 4, 6, 2 to 0, and 8-15 (multicolour) through the same chain with the multicolour bit kept."
  },
  {
   "address": 6218,
   "type": "line",
   "text": "The intro proper, from intro_start: sets everything up (intro_setup), then runs queued jobs (job_run) until the input object sets go_flag ($20): fire was pressed and the music has faded out. Then interrupts off, the screen off, and the load of the game (load_game)."
  },
  {
   "address": 6237,
   "type": "line",
   "text": "Blanks the screen, empties the object and raster lists (objects_init, raster_init), clears go_flag and sets up the six objects in order, which numbers them: letters 0, screens 1, scroller 2, music 3, disc 4, input 5. Writes the VIC's registers from vic_defaults and keeps $D011, $D016 and $D018 as the frame's defaults. Sends the first messages: the title screen, the scroller's start, the music's start, and the input's wait for fire. Runs the jobs until none is left (the title is drawn), then starts the raster interrupts (raster_start). From there the scroll text runs the show."
  },
  {
   "address": 6346,
   "type": "line",
   "text": "The object that raster_add files a new entry under."
  },
  {
   "address": 6347,
   "type": "line",
   "text": "Which half of the raster list is live: entries from 0 or from 16. Changes are made in the other half and swapped in at the top of the next frame."
  },
  {
   "address": 6348,
   "type": "line",
   "text": "The entry the dispatcher is on."
  },
  {
   "address": 6349,
   "type": "line",
   "text": "The live half's number of entries."
  },
  {
   "address": 6350,
   "type": "line",
   "text": "Each entry's object, 32 entries (two halves of 16)."
  },
  {
   "address": 6382,
   "type": "line",
   "text": "Each entry's raster line, sorted in each half."
  },
  {
   "address": 6414,
   "type": "line",
   "text": "Each entry's handler, low byte."
  },
  {
   "address": 6446,
   "type": "line",
   "text": "Each entry's handler, high byte."
  },
  {
   "address": 6478,
   "type": "line",
   "text": "The other half's number of entries, after a change."
  },
  {
   "address": 6479,
   "type": "line",
   "text": "1 when the other half has changed and is to be swapped in at the next frame's top."
  },
  {
   "address": 6480,
   "type": "line",
   "text": "1 while the objects' frame routines run, so that a frame-top interrupt that comes before they end does not start them again."
  },
  {
   "address": 6481,
   "type": "line",
   "text": "The value of $D011 at each frame's top; $1952 is $D016's and $1953 $D018's. The screens change them."
  },
  {
   "address": 6482,
   "type": "line",
   "text": "$D016 at each frame's top."
  },
  {
   "address": 6483,
   "type": "line",
   "text": "$D018 at each frame's top."
  },
  {
   "address": 6484,
   "type": "line",
   "text": "Empties the raster list: no entries in either half, the live half from 0, and entry 0 a harmless one (line 0, raster_null, owner $FF)."
  },
  {
   "address": 6522,
   "type": "line",
   "text": "Starts the raster interrupts: the dispatcher (raster_dispatch) as the IRQ handler, two lines before the first entry's, and raster interrupts on."
  },
  {
   "address": 6568,
   "type": "line",
   "text": "Adds a raster entry: A the line, X/Y the handler, raster_owner its object. At most 15. Writes the live half into the other with the new entry in its place by line, and asks for the swap; when a swap is waiting already, inserts it into the other half as it stands ($1A55)."
  },
  {
   "address": 6741,
   "type": "line",
   "text": "A swap is waiting: inserts the new entry into the other half in place."
  },
  {
   "address": 6891,
   "type": "line",
   "text": "Removes every raster entry of object A: copies the live half's other entries into the other half and asks for the swap; when a swap is waiting already, filters the other half in place."
  },
  {
   "address": 6994,
   "type": "line",
   "text": "The IRQ handler two lines before each entry's line: points the IRQ vector at the entry's handler and the raster compare at its line, enables interrupts and waits in a run of NOPs, so the handler's interrupt comes with almost no jitter. The handler returns into the NOPs; then the next entry two lines before its line, or after the last, frame_top at line 255."
  },
  {
   "address": 7132,
   "type": "line",
   "text": "The IRQ handler at line 255, once a frame: swaps in the other half of the raster list if it changed, sets up the first entry, counts frame_count ($05) up, puts back the default $D011, $D016 and $D018, and, with interrupts on again, runs every object's frame routine (objects_frame) unless the last frame's are still running."
  },
  {
   "address": 7235,
   "type": "line",
   "text": "A raster handler that only acknowledges the VIC: the harmless entry 0 that raster_init leaves."
  },
  {
   "address": 7241,
   "type": "line",
   "text": "Each object's message handler, low bytes (15 objects at most; $1C59 the high bytes)."
  },
  {
   "address": 7257,
   "type": "line",
   "text": "The message handlers' high bytes."
  },
  {
   "address": 7273,
   "type": "line",
   "text": "Each object's frame routine, low bytes ($1C79 the high bytes); no_frame when it has none."
  },
  {
   "address": 7289,
   "type": "line",
   "text": "The frame routines' high bytes."
  },
  {
   "address": 7305,
   "type": "line",
   "text": "How many objects there are."
  },
  {
   "address": 7306,
   "type": "line",
   "text": "The queued jobs, low bytes, the next first (16 at most; $1C9A the high bytes)."
  },
  {
   "address": 7322,
   "type": "line",
   "text": "The jobs' high bytes."
  },
  {
   "address": 7338,
   "type": "line",
   "text": "How many jobs are queued."
  },
  {
   "address": 7339,
   "type": "line",
   "text": "No objects and no jobs."
  },
  {
   "address": 7348,
   "type": "line",
   "text": "Adds an object with X/Y its message handler and no frame routine; returns its number in A, or $FF when there are 15 already."
  },
  {
   "address": 7381,
   "type": "line",
   "text": "Gives object A the frame routine X/Y."
  },
  {
   "address": 7394,
   "type": "line",
   "text": "Queues the job X/Y, to run from the main loop (job_run); at most 16."
  },
  {
   "address": 7413,
   "type": "line",
   "text": "Stops object A: no frame routine and its raster entries removed (raster_remove)."
  },
  {
   "address": 7429,
   "type": "line",
   "text": "Sends message A to object X: jumps to its message handler with A unchanged."
  },
  {
   "address": 7448,
   "type": "line",
   "text": "Runs each object's frame routine in turn, with A the object's number."
  },
  {
   "address": 7479,
   "type": "line",
   "text": "Runs the first queued job, if any, waits for the frame to end (wait_frame), then takes it off the queue with interrupts held off."
  },
  {
   "address": 7528,
   "type": "line",
   "text": "Jumps to the frame routine at $0C."
  },
  {
   "address": 7531,
   "type": "line",
   "text": "Jumps to the job at $1E."
  },
  {
   "address": 7534,
   "type": "line",
   "text": "The empty frame routine: returns."
  },
  {
   "address": 7535,
   "type": "line",
   "text": "The 47 values intro_setup writes to the VIC, $D000-$D02E: sprites off and at 0, the screen off, $D016 $18, $D018 $2E, sprites multicolour, black border and background, multicolours 9 and 8, sprite multicolours 11 and 1, sprites grey (12)."
  },
  {
   "address": 7582,
   "type": "line",
   "text": "The bits 1, 2, 4 ... 128 by number: read_input takes a key's column bit and the joystick bit the key sets from here."
  },
  {
   "address": 7590,
   "type": "line",
   "text": "The values for $DC00 that select keyboard rows 0-7, one low bit each."
  },
  {
   "address": 7598,
   "type": "line",
   "text": "Eight bytes nothing reads: $02, $08, $20, $80, then $03, $0C, $30, $C0."
  },
  {
   "address": 7606,
   "type": "line",
   "text": "Waits out lines 256 and over, then waits until the frame counter changes (frame_top, line 255) or the raster reaches line 256: in effect, for the bottom of the frame."
  },
  {
   "address": 7623,
   "type": "line",
   "text": "A fill that nothing calls: A from ($06) up to ($08)."
  },
  {
   "address": 7646,
   "type": "line",
   "text": "A copy that nothing calls: from ($0A) to ($06) until ($06) reaches ($08)."
  },
  {
   "address": 7677,
   "type": "line",
   "text": "Fills memory with A from ($16) up to, not including, ($18)."
  },
  {
   "address": 7700,
   "type": "line",
   "text": "A copy that nothing calls: from ($1A) to ($16) until ($16) reaches ($18)."
  },
  {
   "address": 7731,
   "type": "line",
   "text": "Unpacks a list of streams: ($28) points at a count, then for each stream its source and its destination, four bytes; each is unpacked in turn (unpack)."
  },
  {
   "address": 7777,
   "type": "line",
   "text": "The interrupt handler intro_start installs before the scheduler starts: acknowledges CIA 1 and the VIC and returns."
  },
  {
   "address": 7783,
   "type": "line",
   "text": "The NMI handler: returns, without acknowledging CIA 2 (see scroller_raster)."
  },
  {
   "address": 7784,
   "type": "line",
   "text": "The keyboard's eight rows as read, a bit for each key held."
  },
  {
   "address": 7792,
   "type": "line",
   "text": "The keys pressed since the last read."
  },
  {
   "address": 7800,
   "type": "line",
   "text": "Joystick 2 (bit 0 up, 1 down, 2 left, 3 right, 4 fire), with its keys from keys_port2 added."
  },
  {
   "address": 7801,
   "type": "line",
   "text": "Joystick 1, with the keys from keys_port1."
  },
  {
   "address": 7802,
   "type": "line",
   "text": "Joystick 2's bits that were not set at the last read: new presses."
  },
  {
   "address": 7803,
   "type": "line",
   "text": "Joystick 1's new presses."
  },
  {
   "address": 7804,
   "type": "line",
   "text": "The input object's number (5)."
  },
  {
   "address": 7805,
   "type": "line",
   "text": "Sets up the input object (object 5): clears the key state, reads the sticks once (read_input) and registers its message handler (input_message)."
  },
  {
   "address": 7851,
   "type": "line",
   "text": "The input's messages, through input_messages: 0 and 3 stop it, 1 reads the sticks every frame (read_input as its frame routine), 2 waits for fire (wait_fire)."
  },
  {
   "address": 7868,
   "type": "line",
   "text": "The four message routines of the input object."
  },
  {
   "address": 7876,
   "type": "line",
   "text": "Messages 0 and 3: stops the input object."
  },
  {
   "address": 7882,
   "type": "line",
   "text": "Message 1, never sent: read_input every frame."
  },
  {
   "address": 7892,
   "type": "line",
   "text": "Message 2: wait_fire every frame."
  },
  {
   "address": 7902,
   "type": "line",
   "text": "The input's frame routine in the intro: once the music has faded out after fire (music_faded), sets go_flag for intro_main to load the game. Reads the sticks and keys (read_input), and fire on either joystick, or SPACE or /, fades the music out (music_fade)."
  },
  {
   "address": 7934,
   "type": "line",
   "text": "Reads joystick 2 ($DC00) and joystick 1 ($DC01), bits set for directions and fire. When a key is down and joystick 1 is still, scans the keyboard's eight rows into key_held and key_new and adds the keys of keys_port2 and keys_port1 to the joysticks' bits. The new presses go into press_2 and press_1."
  },
  {
   "address": 7996,
   "type": "line",
   "text": "No key, or joystick 1 moving: the key state is cleared."
  },
  {
   "address": 8098,
   "type": "line",
   "text": "The key tables: six keys for each joystick, in bit order. The loop runs from 6, one past each table's end, so it also reads $2006 and $200C; the bits it sets that way (bit 6) are never tested."
  },
  {
   "address": 8171,
   "type": "line",
   "text": "The new presses: bits set now and not at the last read."
  },
  {
   "address": 8192,
   "type": "line",
   "text": "The keys that act as joystick 2, in the stick's bit order, each 8 x row + column of the keyboard matrix: I up, M down, J left, K right, SPACE fire, and RETURN bit 5. The game gives joystick 2 the same keys."
  },
  {
   "address": 8198,
   "type": "line",
   "text": "The keys that act as joystick 1: A up, Z down, comma left, full stop right, / fire, F1 bit 5."
  },
  {
   "address": 8204,
   "type": "line",
   "text": "Loads the game: interrupts, screen and sprites off, sound off, CIA interrupts off; copies loader_code to $0400; banks the KERNAL in ($01 = $36), puts its vectors back (RESTOR) and resets the CIAs (IOINIT); points the IRQ at the loader's border handler ($0429) and the NMI at a return ($0434); turns CIA 1's timer interrupt on, the cursor off ($CC), KERNAL messages off ($9D), device 8 ($BA); keeps $02A1 on the stack and clears it; points the LOAD vector at the KERNAL's own routine ($F4A5); and jumps to $0400."
  },
  {
   "address": 8322,
   "type": "line",
   "text": "The loader, copied to $0400-$04FF and run there: SETNAM with SPDBALL ($0435, 7 characters), SETLFS with file 8, device 8, secondary address 1 (load to the file's own address), LOAD, again until it succeeds; then interrupts off, $02A1 back, $01 = $35 and a jump to $0812, the loaded file's first unpacker. Its interrupt handler ($0429, here $20AB) acknowledges CIA 1 and steps the border colour, which draws the coloured stripes while the game loads."
  },
  {
   "address": 8363,
   "type": "line",
   "text": "$0429 when copied: BIT $DC0D, INC $D020, then the registers off the stack and RTI; that RTI, $0434 (here $20B6), is the NMI handler too."
  },
  {
   "address": 8375,
   "type": "line",
   "text": "The file name SPDBALL, then TURBO, which nothing reads."
  },
  {
   "address": 8387,
   "type": "line",
   "text": "Unpacks the stream at ($21) to ($23): a byte below $80 is followed by that many plus one bytes to copy as they are; a byte from $80 copies the next byte's count of bytes from 256 less it back in what was written so far; a count of 0 ends the stream. The game's own unpacker reads the same format."
  },
  {
   "address": 8497,
   "type": "line",
   "text": "The scroll text, $2131-$248B, which also runs the intro. Bytes $00-$3F are glyphs of scroller_font: 1-26 the letters, $20 a space, digits and punctuation at their ASCII places, 0 the copyright sign, $3B and $3C an X and a II with serifs (NATION XII). Codes: $40-$4F colour, $50-$5F speed, $60-$6F pause, $70-$7F a message to the scroller, $80+n then m message m to object n (scroll_codes). It opens with SPEEDBALL 2 over the title and IMAGEWORKS PRESENTS A BITMAP BROTHERS GAME, then shows the arch (screens message 2) for YEAR: 2095 and brings the letters in, the towers (message 3) for YEAR: 2100 and starts the disc, the arch again for the copyright, the towers for the C64 credits and PRESS FIRE; then it blanks the screen, fades the disc and the letters out, shows the title and starts again."
  },
  {
   "address": 9356,
   "type": "line",
   "text": "The title screen's characters, packed (unpack): 920 bytes for the 23 rows of the screen at $C800, of which the top eight draw the gold SPEEDBALL 2."
  },
  {
   "address": 9569,
   "type": "line",
   "text": "The arch picture's list for unpack_list: three streams, its screen colours ($3876 to $BC00), colour RAM ($3AEA to $B800) and bitmap ($256E to $E000)."
  },
  {
   "address": 9582,
   "type": "line",
   "text": "The arch picture's bitmap, packed: 8000 bytes for $E000-$FF3F. A great arch over the stadium's pitch, shown for the story's first part and the copyright."
  },
  {
   "address": 10606,
   "type": "line",
   "text": "The arch's packed bitmap, continued."
  },
  {
   "address": 11630,
   "type": "line",
   "text": "The arch's packed bitmap, further on."
  },
  {
   "address": 12654,
   "type": "line",
   "text": "The arch's packed bitmap, its fourth kilobyte."
  },
  {
   "address": 13678,
   "type": "line",
   "text": "The arch's packed bitmap, its end, to $3875."
  },
  {
   "address": 14454,
   "type": "line",
   "text": "The arch picture's screen colours, packed: 1000 bytes for $BC00-$BFE7, two colours for each cell."
  },
  {
   "address": 15082,
   "type": "line",
   "text": "The arch picture's colour RAM, packed: 1000 bytes for $B800-$BBE7."
  },
  {
   "address": 15535,
   "type": "line",
   "text": "The towers picture's list for unpack_list: its screen colours ($4FC6 to $BC00), colour RAM ($522D to $B800) and bitmap ($3CBC to $E000)."
  },
  {
   "address": 15548,
   "type": "line",
   "text": "The towers picture's bitmap, packed: 8000 bytes for $E000-$FF3F. A city of towers, shown for the story's second part and the C64 credits."
  },
  {
   "address": 16384,
   "type": "line",
   "text": "The towers' packed bitmap, continued."
  },
  {
   "address": 17408,
   "type": "line",
   "text": "The towers' packed bitmap, further on."
  },
  {
   "address": 18432,
   "type": "line",
   "text": "The towers' packed bitmap, its fourth kilobyte."
  },
  {
   "address": 19456,
   "type": "line",
   "text": "The towers' packed bitmap, its end, to $4FC5."
  },
  {
   "address": 20422,
   "type": "line",
   "text": "The towers picture's screen colours, packed, for $BC00-$BFE7."
  },
  {
   "address": 21037,
   "type": "line",
   "text": "The towers picture's colour RAM, packed, for $B800-$BBE7."
  },
  {
   "address": 21395,
   "type": "line",
   "text": "The title screen's characters, packed: 2040 bytes for $F800-$FFF7, the pieces of the gold logo."
  },
  {
   "address": 22419,
   "type": "line",
   "text": "The title's packed characters, their last 114 bytes."
  },
  {
   "address": 22533,
   "type": "line",
   "text": "The disc's 23 pictures, $5805-$7A84, each six sprites of 64 bytes (two across, three down): half a turn of the disc with its 2, from the front (0) through edge on (11) to the back (22, the 2 reversed). Played forwards and back, they look like a disc that keeps turning. Picture 0, the front."
  },
  {
   "address": 22917,
   "type": "line",
   "text": "The disc's picture 1."
  },
  {
   "address": 23301,
   "type": "line",
   "text": "The disc's picture 2."
  },
  {
   "address": 23685,
   "type": "line",
   "text": "The disc's picture 3."
  },
  {
   "address": 24069,
   "type": "line",
   "text": "The disc's picture 4."
  },
  {
   "address": 24453,
   "type": "line",
   "text": "The disc's picture 5."
  },
  {
   "address": 24837,
   "type": "line",
   "text": "The disc's picture 6."
  },
  {
   "address": 25221,
   "type": "line",
   "text": "The disc's picture 7."
  },
  {
   "address": 25605,
   "type": "line",
   "text": "The disc's picture 8."
  },
  {
   "address": 25989,
   "type": "line",
   "text": "The disc's picture 9."
  },
  {
   "address": 26373,
   "type": "line",
   "text": "The disc's picture 10."
  },
  {
   "address": 26757,
   "type": "line",
   "text": "The disc's picture 11, edge on."
  },
  {
   "address": 27141,
   "type": "line",
   "text": "The disc's picture 12."
  },
  {
   "address": 27525,
   "type": "line",
   "text": "The disc's picture 13."
  },
  {
   "address": 27909,
   "type": "line",
   "text": "The disc's picture 14."
  },
  {
   "address": 28293,
   "type": "line",
   "text": "The disc's picture 15."
  },
  {
   "address": 28677,
   "type": "line",
   "text": "The disc's picture 16."
  },
  {
   "address": 29061,
   "type": "line",
   "text": "The disc's picture 17."
  },
  {
   "address": 29445,
   "type": "line",
   "text": "The disc's picture 18."
  },
  {
   "address": 29829,
   "type": "line",
   "text": "The disc's picture 19."
  },
  {
   "address": 30213,
   "type": "line",
   "text": "The disc's picture 20."
  },
  {
   "address": 30597,
   "type": "line",
   "text": "The disc's picture 21."
  },
  {
   "address": 30981,
   "type": "line",
   "text": "The disc's picture 22, the back: the 2 reversed."
  },
  {
   "address": 49152,
   "type": "line",
   "text": "The scroller's font: 64 glyphs, each four characters (two across, two down; glyph g is characters 4g to 4g + 3), $C000-$C7FF. Glyphs 1-26 are A-Z, 0 the copyright sign, 48-57 the digits, 59 and 60 the X and II of NATION XII; those the text does not use are blank."
  },
  {
   "address": 50176,
   "type": "line",
   "text": "The font's second half: glyphs 32-63, the space, punctuation and digits."
  },
  {
   "address": 51200,
   "type": "line",
   "text": "The intro's first instruction, where the last unpacker jumps: interrupts off, the stack reset, $01 = $35 (I/O in, BASIC and KERNAL out), VIC bank 3 ($C000-$FFFF, $DD00 bits 0-1 clear), the NMI vector at nmi_return and the IRQ vector at irq_ack, raster and CIA interrupts off and acknowledged, border black, screen off, every SID register written $FF then 0 and the volume 15. Then intro_main. The screen at $C800 later covers these bytes."
  },
  {
   "address": 55296,
   "type": "line",
   "text": "The eight letter sprites, frames $60-$67 in the VIC's bank ($D800-$D9FF, RAM under the I/O chips, which the VIC reads and the processor never does here): S, P, EE, D, B, A, LL, and a star that letters_xs places off the screen."
  }
 ]
}