{
 "schema": 1,
 "platform": "c64",
 "game": "space-rogue",
 "part": "title",
 "build": "",
 "source": "regenerator2000 live",
 "regions": {
  "exclude": [
   [
    256,
    511,
    "stack"
   ],
   [
    53248,
    57343,
    "I/O and colour RAM"
   ],
   [
    1024,
    8191,
    "left from the boot: the text screen ($0400-$07E7) and BOOT, the BASIC program at $0801 that started the loader, with its variables; colours_to_ram stages colours at $0C00-$0FFF"
   ],
   [
    16384,
    26623,
    "the $4000 display buffer: the bitmap, the screen matrix at $6000 and the colours at $6400, filled by unpack_picture and draw_shape"
   ],
   [
    49152,
    59391,
    "the $C000 display buffer: the bitmap (under the I/O from $D000), the screen matrix at $E000 and the colours at $E400; BOOT's 40-byte loader at $C000 is drawn over"
   ],
   [
    64768,
    64847,
    "RAM under the KERNAL written before the title runs: $FD02 holds $08 (what wrote it is not traced) and $FD30-$FD4F a copy of the KERNAL's default vectors (IRQ $EA31, BRK $FE66, NMI $FE47 and the I/O routines); the title never reads them"
   ]
  ],
  "extra": []
 },
 "blocks": [
  {
   "start": 0,
   "end": 8191,
   "type": "Undefined"
  },
  {
   "start": 8192,
   "end": 8200,
   "type": "Code"
  },
  {
   "start": 8201,
   "end": 8208,
   "type": "Byte"
  },
  {
   "start": 8209,
   "end": 8211,
   "type": "Code"
  },
  {
   "start": 8212,
   "end": 8219,
   "type": "Byte"
  },
  {
   "start": 8220,
   "end": 8222,
   "type": "Code"
  },
  {
   "start": 8223,
   "end": 8229,
   "type": "Byte"
  },
  {
   "start": 8230,
   "end": 8232,
   "type": "Code"
  },
  {
   "start": 8233,
   "end": 8242,
   "type": "Byte"
  },
  {
   "start": 8243,
   "end": 8711,
   "type": "Code"
  },
  {
   "start": 8712,
   "end": 8712,
   "type": "Undefined"
  },
  {
   "start": 8713,
   "end": 9010,
   "type": "Code"
  },
  {
   "start": 9011,
   "end": 9152,
   "type": "Undefined"
  },
  {
   "start": 9153,
   "end": 9445,
   "type": "Code"
  },
  {
   "start": 9446,
   "end": 9495,
   "type": "Undefined"
  },
  {
   "start": 9496,
   "end": 9606,
   "type": "Code"
  },
  {
   "start": 9607,
   "end": 9698,
   "type": "Undefined"
  },
  {
   "start": 9699,
   "end": 9708,
   "type": "Address"
  },
  {
   "start": 9709,
   "end": 10122,
   "type": "Code"
  },
  {
   "start": 10123,
   "end": 10124,
   "type": "Undefined"
  },
  {
   "start": 10125,
   "end": 10274,
   "type": "Word"
  },
  {
   "start": 10275,
   "end": 10540,
   "type": "Code"
  },
  {
   "start": 10541,
   "end": 10548,
   "type": "Undefined"
  },
  {
   "start": 10549,
   "end": 10612,
   "type": "Code"
  },
  {
   "start": 10613,
   "end": 10616,
   "type": "Undefined"
  },
  {
   "start": 10617,
   "end": 11980,
   "type": "Code"
  },
  {
   "start": 11981,
   "end": 11988,
   "type": "Byte"
  },
  {
   "start": 11989,
   "end": 12000,
   "type": "Word"
  },
  {
   "start": 12001,
   "end": 12101,
   "type": "Code"
  },
  {
   "start": 12102,
   "end": 12109,
   "type": "Byte"
  },
  {
   "start": 12110,
   "end": 12121,
   "type": "Word"
  },
  {
   "start": 12122,
   "end": 12136,
   "type": "Code"
  },
  {
   "start": 12137,
   "end": 12144,
   "type": "Byte"
  },
  {
   "start": 12145,
   "end": 12147,
   "type": "Code"
  },
  {
   "start": 12148,
   "end": 16383,
   "type": "Byte"
  },
  {
   "start": 16384,
   "end": 26623,
   "type": "Undefined"
  },
  {
   "start": 26624,
   "end": 43263,
   "type": "Byte"
  },
  {
   "start": 43264,
   "end": 44031,
   "type": "Undefined"
  },
  {
   "start": 44032,
   "end": 49151,
   "type": "Byte"
  },
  {
   "start": 49152,
   "end": 60159,
   "type": "Undefined"
  },
  {
   "start": 60160,
   "end": 60359,
   "type": "Byte"
  },
  {
   "start": 60360,
   "end": 60415,
   "type": "Undefined"
  },
  {
   "start": 60416,
   "end": 60615,
   "type": "Byte"
  },
  {
   "start": 60616,
   "end": 65529,
   "type": "Undefined"
  },
  {
   "start": 65530,
   "end": 65535,
   "type": "Byte"
  }
 ],
 "symbols": [
  {
   "address": 1,
   "name": "zp_port",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 16,
   "name": "block_source",
   "type": "ZeroPagePointer",
   "kind": "user"
  },
  {
   "address": 17,
   "name": "zpa_11",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 18,
   "name": "shown_matrix",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 20,
   "name": "block_width",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21,
   "name": "block_height",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 25,
   "name": "dissolve_from",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 27,
   "name": "dissolve_to",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 29,
   "name": "dissolve_lfsr",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 30,
   "name": "drawing_page",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 32,
   "name": "cursor_row",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 33,
   "name": "cursor_column",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 34,
   "name": "window_left",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 35,
   "name": "window_right",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 48,
   "name": "source",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 49,
   "name": "zpa_31",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 50,
   "name": "dest",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 51,
   "name": "zpa_33",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 52,
   "name": "column_offset",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 53,
   "name": "zpa_35",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 58,
   "name": "shown_page",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60,
   "name": "key",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 61,
   "name": "frame_count",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 64,
   "name": "ground_y",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 65,
   "name": "zpa_41",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 66,
   "name": "mountains_y",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 67,
   "name": "zpa_43",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 68,
   "name": "dust_small_y",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 69,
   "name": "zpa_45",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 70,
   "name": "legs_y",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 71,
   "name": "zpa_47",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 72,
   "name": "ship_y",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 73,
   "name": "zpa_49",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 74,
   "name": "dust_big_y",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 75,
   "name": "zpa_4B",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 76,
   "name": "dust_count",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 77,
   "name": "frames_left",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 78,
   "name": "shape_mode",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 79,
   "name": "shape_column",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 80,
   "name": "shape_line",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 81,
   "name": "zpa_51",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 82,
   "name": "shape_row",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 96,
   "name": "shape_data",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 97,
   "name": "zpa_61",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 98,
   "name": "shape_mask",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 99,
   "name": "zpa_63",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 100,
   "name": "shape_width",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 101,
   "name": "shape_bytes",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 102,
   "name": "block_stride",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 103,
   "name": "shape_height",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 104,
   "name": "shape_lines",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 112,
   "name": "freq_mask",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 113,
   "name": "drone_mask",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 114,
   "name": "drone_target",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 115,
   "name": "zpa_73",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 116,
   "name": "drone_freq",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 117,
   "name": "zpa_75",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 118,
   "name": "drone_level",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 128,
   "name": "fx_start",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 129,
   "name": "zpa_81",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 130,
   "name": "fx_step",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 131,
   "name": "zpa_83",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 132,
   "name": "fx_freq",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 133,
   "name": "zpa_85",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 134,
   "name": "fx_attack_decay",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 135,
   "name": "fx_sustain_release",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 136,
   "name": "fx_waveform",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 137,
   "name": "fx_length",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 138,
   "name": "fx_release_at",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 139,
   "name": "fx_frames_left",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 140,
   "name": "fx_repeats",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 232,
   "name": "zpa_E8",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 788,
   "name": "irq_vector",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 789,
   "name": "a_0315",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 790,
   "name": "brk_vector",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 791,
   "name": "a_0317",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 792,
   "name": "nmi_vector",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 793,
   "name": "a_0319",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 4096,
   "name": "f_1000",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 7845,
   "name": "a_1EA5",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 8192,
   "name": "title_start",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8201,
   "name": "name_space",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8209,
   "name": "load_rogue",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8212,
   "name": "name_rogue",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8220,
   "name": "load_ship",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8223,
   "name": "name_ship",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8230,
   "name": "load_credits",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8233,
   "name": "name_credits",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8243,
   "name": "title_screen",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8258,
   "name": "io_in",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8269,
   "name": "io_out",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8280,
   "name": "load_inline",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8302,
   "name": "b_206E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8315,
   "name": "b_207B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8355,
   "name": "b_20A3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8365,
   "name": "load_name_length",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8367,
   "name": "load_name_lo",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8369,
   "name": "load_name_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8376,
   "name": "load_to_lo",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8378,
   "name": "load_to_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8388,
   "name": "saved_source_lo",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8392,
   "name": "saved_source_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8396,
   "name": "wait_key",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8399,
   "name": "b_20CF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8411,
   "name": "clear_key",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8416,
   "name": "pause",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8420,
   "name": "b_20E4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8421,
   "name": "b_20E5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8441,
   "name": "b_20F9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8444,
   "name": "print_char",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8456,
   "name": "saved_x",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8458,
   "name": "saved_y",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8462,
   "name": "print_char_body",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8471,
   "name": "b_2117",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8478,
   "name": "b_211E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8485,
   "name": "b_2125",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8497,
   "name": "b_2131",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8554,
   "name": "row_offset_lo",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8561,
   "name": "row_offset_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8567,
   "name": "b_2177",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8568,
   "name": "glyph_lo",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8569,
   "name": "glyph_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8571,
   "name": "cell_lo",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8572,
   "name": "cell_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8579,
   "name": "rub_out",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 8593,
   "name": "b_2191",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8603,
   "name": "new_line",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 8619,
   "name": "b_21AB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8645,
   "name": "b_21C5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8646,
   "name": "scroll_from_lo",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8647,
   "name": "scroll_from_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8650,
   "name": "scroll_to_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8659,
   "name": "b_21D3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8670,
   "name": "b_21DE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8692,
   "name": "b_21F4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8693,
   "name": "clear_row_lo",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8694,
   "name": "clear_row_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8703,
   "name": "b_21FF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8711,
   "name": "r_2207",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 8712,
   "name": "scroll_count",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8713,
   "name": "setup_irq",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8804,
   "name": "ignore_interrupt",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8805,
   "name": "irq",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8810,
   "name": "irq_body",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8833,
   "name": "b_2281",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8847,
   "name": "scan_keys",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8897,
   "name": "b_22C1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8907,
   "name": "b_22CB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8919,
   "name": "b_22D7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8937,
   "name": "b_22E9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8959,
   "name": "b_22FF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8966,
   "name": "b_2306",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8976,
   "name": "b_2310",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8983,
   "name": "b_2317",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8993,
   "name": "b_2321",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9007,
   "name": "b_232F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9011,
   "name": "key_last",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9012,
   "name": "key_delay",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9013,
   "name": "key_repeat",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9014,
   "name": "modifier_masks",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9022,
   "name": "ctrl_up",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9023,
   "name": "rshift_up",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9024,
   "name": "lshift_up",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9025,
   "name": "key_codes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9089,
   "name": "key_codes_shifted",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9153,
   "name": "sound_init",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9194,
   "name": "start_effect",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9256,
   "name": "r_2428",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 9257,
   "name": "sound_frame",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9311,
   "name": "b_245F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9347,
   "name": "b_2483",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9359,
   "name": "b_248F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9371,
   "name": "b_249B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9382,
   "name": "b_24A6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9394,
   "name": "b_24B2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9445,
   "name": "r_24E5",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 9446,
   "name": "effect_freq_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9450,
   "name": "a_24EA",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 9451,
   "name": "effect_freq_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9455,
   "name": "a_24EF",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 9456,
   "name": "effect_step_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9461,
   "name": "effect_step_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9466,
   "name": "effect_attack_decay",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9471,
   "name": "effect_sustain_release",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9476,
   "name": "effect_waveform",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9481,
   "name": "effect_length",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9485,
   "name": "a_250D",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 9486,
   "name": "effect_release_at",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9491,
   "name": "effect_repeats",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9496,
   "name": "airlock_sound",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9501,
   "name": "alarm_sound",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9506,
   "name": "explosion_sound",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9518,
   "name": "noise_burst",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9523,
   "name": "rumble_sound",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9525,
   "name": "play_effect",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 9534,
   "name": "b_253E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9544,
   "name": "r_2548",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 9545,
   "name": "distress_call",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9555,
   "name": "b_2553",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9556,
   "name": "morse_at_lo",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9557,
   "name": "morse_at_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9564,
   "name": "b_255C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9574,
   "name": "b_2566",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9587,
   "name": "morse_jsr_lo",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9588,
   "name": "morse_jsr_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9597,
   "name": "b_257D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9606,
   "name": "r_2586",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 9607,
   "name": "morse_text",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9694,
   "name": "morse_symbols",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9699,
   "name": "morse_routines",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9700,
   "name": "f_25E4",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 9709,
   "name": "morse_dot",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9718,
   "name": "morse_dash",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9727,
   "name": "morse_gap",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9731,
   "name": "silence_18",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9735,
   "name": "silence_4",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9739,
   "name": "tone",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9745,
   "name": "silence",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 9749,
   "name": "b_2615",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9763,
   "name": "colours_and_matrix",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9766,
   "name": "copy_matrix",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9780,
   "name": "b_2634",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9782,
   "name": "copy_matrix_from",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9785,
   "name": "copy_matrix_to",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9799,
   "name": "copy_4000_colours",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9805,
   "name": "copy_c000_colours",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9811,
   "name": "copy_shown_colours",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9817,
   "name": "copy_4000_to_c000",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9823,
   "name": "copy_c000_to_4000",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9829,
   "name": "copy_shown",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9835,
   "name": "b_266B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9845,
   "name": "b_2675",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9847,
   "name": "copy_from",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9850,
   "name": "copy_to",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9864,
   "name": "column_offset_of",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9875,
   "name": "row_address",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9890,
   "name": "row_saved_x",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9892,
   "name": "white_colours",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9908,
   "name": "b_26B4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9910,
   "name": "white_colours_page",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9925,
   "name": "put_colour_block",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9950,
   "name": "b_26DE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9953,
   "name": "b_26E1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9956,
   "name": "colour_block_lo",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9957,
   "name": "colour_block_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9972,
   "name": "b_26F4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9986,
   "name": "b_2702",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9994,
   "name": "put_matrix_block",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10006,
   "name": "b_2716",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10026,
   "name": "b_272A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10029,
   "name": "b_272D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10032,
   "name": "matrix_block_lo",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10033,
   "name": "matrix_block_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10046,
   "name": "b_273E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10059,
   "name": "b_274B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10066,
   "name": "build_line_table",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10075,
   "name": "b_275B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10077,
   "name": "b_275D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10097,
   "name": "b_2771",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10123,
   "name": "line_offset_lo",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10124,
   "name": "line_offset_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10125,
   "name": "char_row_offsets",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 10126,
   "name": "f_278E",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 10175,
   "name": "colour_rows",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 10176,
   "name": "f_27C0",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 10225,
   "name": "matrix_rows",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 10226,
   "name": "f_27F2",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 10275,
   "name": "bitmap_mode",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10316,
   "name": "show_c000_colours",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10322,
   "name": "show_4000_colours",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10328,
   "name": "show_drawn_colours",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10334,
   "name": "show_c000",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10337,
   "name": "show_4000",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10340,
   "name": "show_drawn",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10380,
   "name": "b_288C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10404,
   "name": "b_28A4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10417,
   "name": "clear_drawing",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10420,
   "name": "clear_4000",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10433,
   "name": "b_28C1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10435,
   "name": "clear_page",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10446,
   "name": "dissolve_in",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10449,
   "name": "dissolve_in_matrix",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10481,
   "name": "b_28F1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10516,
   "name": "dissolve_pixel",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10532,
   "name": "b_2924",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10541,
   "name": "pixel_masks",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 10545,
   "name": "pixel_keep_masks",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 10549,
   "name": "dissolve_out",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10569,
   "name": "b_2949",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10604,
   "name": "b_296C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10613,
   "name": "pixel_clear_masks",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 10617,
   "name": "unpack_picture",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10629,
   "name": "j_2985",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 10642,
   "name": "b_2992",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10652,
   "name": "b_299C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10661,
   "name": "b_29A5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10670,
   "name": "b_29AE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10694,
   "name": "b_29C6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10711,
   "name": "colours_to_ram",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10737,
   "name": "b_29F1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10739,
   "name": "colours_from",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10742,
   "name": "colours_stage_to",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10760,
   "name": "b_2A08",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10762,
   "name": "colours_stage_from",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10765,
   "name": "colours_to",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10781,
   "name": "draw_shape",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10807,
   "name": "b_2A37",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10817,
   "name": "b_2A41",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10830,
   "name": "b_2A4E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10841,
   "name": "b_2A59",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10860,
   "name": "b_2A6C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10865,
   "name": "b_2A71",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10869,
   "name": "r_2A75",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 10870,
   "name": "b_2A76",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10885,
   "name": "b_2A85",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10909,
   "name": "b_2A9D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10913,
   "name": "b_2AA1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10936,
   "name": "b_2AB8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10943,
   "name": "plain_lines",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 10976,
   "name": "b_2AE0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10979,
   "name": "plain_cell_lo",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10980,
   "name": "plain_cell_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10990,
   "name": "b_2AEE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10995,
   "name": "b_2AF3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11004,
   "name": "b_2AFC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11012,
   "name": "b_2B04",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11017,
   "name": "masked_lines",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 11056,
   "name": "b_2B30",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11061,
   "name": "mask_read_lo",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11062,
   "name": "mask_read_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11066,
   "name": "mask_write_lo",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11067,
   "name": "mask_write_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11080,
   "name": "b_2B48",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11085,
   "name": "b_2B4D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11094,
   "name": "b_2B56",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11105,
   "name": "b_2B61",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11113,
   "name": "b_2B69",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11118,
   "name": "title_loop",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 11121,
   "name": "title_showing",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 11236,
   "name": "b_2BE4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11239,
   "name": "key_waiting",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11244,
   "name": "stage_engine",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11248,
   "name": "b_2BF0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11268,
   "name": "b_2C04",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11274,
   "name": "b_2C0A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11286,
   "name": "r_2C16",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 11287,
   "name": "stage_rise",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11291,
   "name": "b_2C1B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11297,
   "name": "b_2C21",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11303,
   "name": "b_2C27",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11309,
   "name": "b_2C2D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11319,
   "name": "b_2C37",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11329,
   "name": "b_2C41",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11341,
   "name": "r_2C4D",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 11342,
   "name": "stage_legs",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11346,
   "name": "b_2C52",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11352,
   "name": "b_2C58",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11358,
   "name": "b_2C5E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11364,
   "name": "b_2C64",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11373,
   "name": "b_2C6D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11384,
   "name": "b_2C78",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11398,
   "name": "r_2C86",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 11399,
   "name": "stage_climb",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11403,
   "name": "b_2C8B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11409,
   "name": "b_2C91",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11415,
   "name": "b_2C97",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11421,
   "name": "b_2C9D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11430,
   "name": "b_2CA6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11438,
   "name": "b_2CAE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11444,
   "name": "b_2CB4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11450,
   "name": "b_2CBA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11456,
   "name": "b_2CC0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11470,
   "name": "b_2CCE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11473,
   "name": "b_2CD1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11477,
   "name": "b_2CD5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11483,
   "name": "b_2CDB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11489,
   "name": "b_2CE1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11495,
   "name": "b_2CE7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11504,
   "name": "b_2CF0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11515,
   "name": "b_2CFB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11526,
   "name": "b_2D06",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11537,
   "name": "b_2D11",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11548,
   "name": "b_2D1C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11566,
   "name": "b_2D2E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11572,
   "name": "b_2D34",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11578,
   "name": "b_2D3A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11584,
   "name": "b_2D40",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11593,
   "name": "b_2D49",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11604,
   "name": "b_2D54",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11615,
   "name": "b_2D5F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11626,
   "name": "b_2D6A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11637,
   "name": "b_2D75",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11651,
   "name": "r_2D83",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 11652,
   "name": "show_credits",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11673,
   "name": "b_2D99",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11699,
   "name": "b_2DB3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11713,
   "name": "r_2DC1",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 11714,
   "name": "frame_first",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11731,
   "name": "frame_still",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11748,
   "name": "frame_dust",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11771,
   "name": "frame_logo",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11791,
   "name": "draw_scenery",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11873,
   "name": "draw_legs",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11918,
   "name": "draw_dust_small",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11981,
   "name": "dust_order_small",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 11989,
   "name": "dust_frames_small",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 11990,
   "name": "f_2ED6",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 11995,
   "name": "dust_colours_small",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 11996,
   "name": "f_2EDC",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 12001,
   "name": "draw_ship",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12046,
   "name": "draw_dust_big",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12102,
   "name": "dust_order_big",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12110,
   "name": "dust_frames_big",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12111,
   "name": "f_2F4F",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 12116,
   "name": "dust_colours_big",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12117,
   "name": "f_2F55",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 12122,
   "name": "title_exit",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 12137,
   "name": "name_intro",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12145,
   "name": "to_intro",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12148,
   "name": "title_padding",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12288,
   "name": "picture_credits",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13215,
   "name": "picture_credits_row5",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14184,
   "name": "picture_credits_row11",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14335,
   "name": "picture_credits_row13",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15330,
   "name": "picture_credits_row19",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15960,
   "name": "picture_credits_matrix",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16246,
   "name": "picture_credits_unused",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16553,
   "name": "a_40A9",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 24327,
   "name": "f_5F07",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 24576,
   "name": "f_6000",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 26624,
   "name": "shape_mountains",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 27584,
   "name": "shape_mountains_line24",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28544,
   "name": "shape_mountains_colours",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28784,
   "name": "shape_mountains_mask",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29744,
   "name": "shape_mountains_mask24",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30704,
   "name": "shape_plain",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31664,
   "name": "shape_plain_line24",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32624,
   "name": "shape_plain_line48",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32768,
   "name": "shape_plain_8000",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33584,
   "name": "shape_plain_line72",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33904,
   "name": "shape_plain_colours",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34304,
   "name": "shape_dust_small0",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34624,
   "name": "shape_dust_small1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34944,
   "name": "shape_dust_small2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35264,
   "name": "shape_dust_big0",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36064,
   "name": "shape_dust_big1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36864,
   "name": "shape_dust_big2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 37664,
   "name": "shape_ship",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38552,
   "name": "shape_ship_line24",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39440,
   "name": "shape_ship_line48",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39736,
   "name": "shape_ship_colours",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39995,
   "name": "shape_ship_mask",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40883,
   "name": "shape_ship_mask24",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40960,
   "name": "shape_ship_mask_a000",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 41771,
   "name": "shape_ship_mask48",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42067,
   "name": "shape_legs",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42619,
   "name": "shape_legs_mask",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 43171,
   "name": "ship_unused",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 44032,
   "name": "picture_rogue",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 44826,
   "name": "picture_rogue_row8",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 45288,
   "name": "picture_rogue_row13",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 46101,
   "name": "picture_rogue_row19",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 46499,
   "name": "picture_rogue_matrix",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 46642,
   "name": "picture_rogue_unused",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 46848,
   "name": "picture_space",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 47783,
   "name": "picture_space_row12",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 48760,
   "name": "picture_space_row24",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 48768,
   "name": "picture_space_matrix",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 48980,
   "name": "picture_space_unused",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 49321,
   "name": "a_C0A9",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 54214,
   "name": "f_D3C6",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 57984,
   "name": "f_E280",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 59392,
   "name": "f_E800",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 60160,
   "name": "line_table_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60416,
   "name": "line_table_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 65280,
   "name": "f_FF00",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 65466,
   "name": "KERNAL_SETLFS",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 65469,
   "name": "KERNAL_SETNAM",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 65493,
   "name": "KERNAL_LOAD",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 65530,
   "name": "cpu_vectors",
   "type": "UserDefined",
   "kind": "user"
  }
 ],
 "comments": [
  {
   "address": 1,
   "type": "line",
   "text": "The processor port: the title runs with $34 (all RAM, its pictures and shapes under the ROMs) and banks the I/O and the KERNAL in ($36) for the hardware, the loads and the interrupt"
  },
  {
   "address": 16,
   "type": "line",
   "text": "The block copiers' source pointer: draw_shape points it at a shape's colours, one screen-matrix row for every 8 pixel lines, and put_matrix_block copies from it"
  },
  {
   "address": 17,
   "type": "line",
   "text": "The block copiers' source, high byte"
  },
  {
   "address": 18,
   "type": "line",
   "text": "The shown buffer's screen matrix page, $60 or $E0 ($28A4)"
  },
  {
   "address": 20,
   "type": "line",
   "text": "The block copiers' width in bytes: draw_shape sets it to the shape's width before put_matrix_block"
  },
  {
   "address": 21,
   "type": "line",
   "text": "The block copiers' height in character rows. draw_shape sets it to the shape's height in lines divided by 8, rounded up ($2A2F), takes one off each time the lines it skips above the screen reach a new character row ($2A61), and clips it to the rows left below the shape's first ($2A8C). It counts from the shape's first line, so a shape that starts part-way down a character row covers one row more than it colours: the Sunracer's 56 lines from line 92 cover 8 rows and get 7"
  },
  {
   "address": 25,
   "type": "line",
   "text": "dissolve_in's source: the drawing buffer's page"
  },
  {
   "address": 27,
   "type": "line",
   "text": "The dissolves' destination: the shown buffer's page"
  },
  {
   "address": 29,
   "type": "line",
   "text": "The high seven bits of the dissolves' 15-bit shift register, Y holding the low eight: bits 0-4 pick a page of the 8 KB bitmap, bits 5-6 the pixel pair in the byte. It starts at $7FFF, shifts right with taps $60 into this byte, and stops when it comes back, so every nonzero value comes once"
  },
  {
   "address": 30,
   "type": "line",
   "text": "The drawing buffer's page, $40 or $C0: draw_shape and unpack_picture draw there, and show_drawn shows it"
  },
  {
   "address": 32,
   "type": "line",
   "text": "The cursor's character row, 0-24, for print_char, which nothing in the title calls"
  },
  {
   "address": 33,
   "type": "line",
   "text": "The cursor's column, 0-39, for print_char"
  },
  {
   "address": 34,
   "type": "line",
   "text": "The text window's left column, where print_char's new line starts"
  },
  {
   "address": 35,
   "type": "line",
   "text": "The text window's right column: a character that would go past it starts a new line first"
  },
  {
   "address": 48,
   "type": "line",
   "text": "The unpacker's and dissolve_in's source pointer; load_inline uses it to read its inline name and puts the caller's value back"
  },
  {
   "address": 49,
   "type": "line",
   "text": "The source pointer's high byte"
  },
  {
   "address": 50,
   "type": "line",
   "text": "The unpacker's and the dissolves' destination pointer"
  },
  {
   "address": 51,
   "type": "line",
   "text": "The destination pointer's high byte"
  },
  {
   "address": 52,
   "type": "line",
   "text": "Column \u00d7 8, the column's offset within a bitmap row (column_offset_of), low byte"
  },
  {
   "address": 53,
   "type": "line",
   "text": "The column's offset, high byte (0 or 1)"
  },
  {
   "address": 58,
   "type": "line",
   "text": "The shown buffer's page, $40 or $C0"
  },
  {
   "address": 60,
   "type": "line",
   "text": "The key the interrupt last saw, its low seven bits; $FF when none is waiting"
  },
  {
   "address": 61,
   "type": "line",
   "text": "Counted up by the interrupt once a frame; nothing in the title reads it"
  },
  {
   "address": 64,
   "type": "line",
   "text": "The plain's top pixel line, a 16-bit position: 120 at the start, moved down as the ship climbs (draw_scenery)"
  },
  {
   "address": 65,
   "type": "line",
   "text": "The plain's line, high byte"
  },
  {
   "address": 66,
   "type": "line",
   "text": "The mountains' top pixel line: 72 at the start, moved down with the plain"
  },
  {
   "address": 67,
   "type": "line",
   "text": "The mountains' line, high byte"
  },
  {
   "address": 68,
   "type": "line",
   "text": "The small dust's top pixel line: 136 at the start, moved down with the scenery"
  },
  {
   "address": 69,
   "type": "line",
   "text": "The small dust's line, high byte"
  },
  {
   "address": 70,
   "type": "line",
   "text": "The legs' top pixel line: 144 at the start, rising with the ship and then faster as they fold"
  },
  {
   "address": 71,
   "type": "line",
   "text": "The legs' line, high byte"
  },
  {
   "address": 72,
   "type": "line",
   "text": "The Sunracer's top pixel line: 96 at the start, rising until it is above the screen (negative)"
  },
  {
   "address": 73,
   "type": "line",
   "text": "The ship's line, high byte, $FF once it is above the top"
  },
  {
   "address": 74,
   "type": "line",
   "text": "The large dust's top pixel line: 144 at the start, moved down with the scenery"
  },
  {
   "address": 75,
   "type": "line",
   "text": "The large dust's line, high byte"
  },
  {
   "address": 76,
   "type": "line",
   "text": "The dust's frame count, 0-7, stepped by draw_dust_small and read by both dust routines"
  },
  {
   "address": 77,
   "type": "line",
   "text": "The frames a stage still has to draw, or the pauses show_credits still has to wait"
  },
  {
   "address": 78,
   "type": "line",
   "text": "draw_shape's mode: bit 7 draws through the mask, bit 6 stamps the colours ($C0 for the mountains and the ship, $40 for the plain, $80 for the legs and the dust)"
  },
  {
   "address": 79,
   "type": "line",
   "text": "draw_shape's column, the X it was called with"
  },
  {
   "address": 80,
   "type": "line",
   "text": "The shape's top pixel line as draw_shape goes down it, low byte"
  },
  {
   "address": 81,
   "type": "line",
   "text": "The line's high byte: negative while the line is above the screen"
  },
  {
   "address": 82,
   "type": "line",
   "text": "The character row of the shape's first line on the screen, for the colours"
  },
  {
   "address": 96,
   "type": "line",
   "text": "The shape's bytes, a pointer stepped a line at a time"
  },
  {
   "address": 97,
   "type": "line",
   "text": "The shape's pointer, high byte"
  },
  {
   "address": 98,
   "type": "line",
   "text": "The shape's mask, a pointer stepped with it"
  },
  {
   "address": 99,
   "type": "line",
   "text": "The mask's pointer, high byte"
  },
  {
   "address": 100,
   "type": "line",
   "text": "The shape's width in bytes, one per cell across: the step from line to line"
  },
  {
   "address": 101,
   "type": "line",
   "text": "draw_shape's copy of the width, the bytes it draws on each line"
  },
  {
   "address": 102,
   "type": "line",
   "text": "put_matrix_block's step through its source from row to row: draw_shape sets it to the shape's width"
  },
  {
   "address": 103,
   "type": "line",
   "text": "The shape's height in pixel lines"
  },
  {
   "address": 104,
   "type": "line",
   "text": "The lines draw_shape still has to draw, cut to what the screen shows"
  },
  {
   "address": 112,
   "type": "line",
   "text": "ANDed with every frequency the effect player writes; sound_init sets it to $FF"
  },
  {
   "address": 113,
   "type": "line",
   "text": "The second sound's enable mask, ANDed in before it plays: sound_init sets it to zero, the title sets it to $FF as the Sunracer's engine starts ($2BFE) and back to zero for the credits ($2D86) and on a key ($2F5C)"
  },
  {
   "address": 114,
   "type": "line",
   "text": "The second sound's target frequency, low byte: zero in the title ($2BA9)"
  },
  {
   "address": 115,
   "type": "line",
   "text": "The second sound's target frequency, high byte: zero at the start of each showing ($2BAB), then one more at each step of the lift-off, held at $FF, so the engine's note climbs"
  },
  {
   "address": 116,
   "type": "line",
   "text": "The second sound's frequency, low byte, stepped up by 2 a frame until it reaches the target; zeroed at the start of each showing ($2BA5)"
  },
  {
   "address": 117,
   "type": "line",
   "text": "The second sound's frequency, high byte"
  },
  {
   "address": 118,
   "type": "line",
   "text": "The second sound's sustain level, in the high nybble: $FF at the start of each showing ($2BAF), then two less at each step of the lift-off, down to zero, so the engine fades as it climbs"
  },
  {
   "address": 128,
   "type": "line",
   "text": "The effect's starting frequency, low byte (start_effect copies it from effect_freq_lo)"
  },
  {
   "address": 129,
   "type": "line",
   "text": "The effect's starting frequency, high byte"
  },
  {
   "address": 130,
   "type": "line",
   "text": "The effect's frequency step per frame, low byte"
  },
  {
   "address": 131,
   "type": "line",
   "text": "The effect's frequency step, high byte"
  },
  {
   "address": 132,
   "type": "line",
   "text": "The playing note's frequency, low byte"
  },
  {
   "address": 133,
   "type": "line",
   "text": "The playing note's frequency, high byte"
  },
  {
   "address": 134,
   "type": "line",
   "text": "The effect's attack and decay, for voice 1's $D405"
  },
  {
   "address": 135,
   "type": "line",
   "text": "The effect's sustain and release, for $D406"
  },
  {
   "address": 136,
   "type": "line",
   "text": "The effect's control byte for voice 1, waveform and gate ($81 noise, $41 pulse)"
  },
  {
   "address": 137,
   "type": "line",
   "text": "How many frames each repeat of the effect's note lasts"
  },
  {
   "address": 138,
   "type": "line",
   "text": "The frames-left count at which the note's gate is released"
  },
  {
   "address": 139,
   "type": "line",
   "text": "Frames left of the note playing; zero between notes"
  },
  {
   "address": 140,
   "type": "line",
   "text": "Repeats of the note still to start; $FF, negative, once the effect has finished"
  },
  {
   "address": 232,
   "type": "line",
   "text": "Not a variable: the operand of BIT $E8 at $22E8, a byte scan_keys branches into as an INX ($22EB)"
  },
  {
   "address": 788,
   "type": "line",
   "text": "The KERNAL's IRQ vector, pointed at irq_body ($226A) so the interrupt also works while the KERNAL is banked in for a load"
  },
  {
   "address": 789,
   "type": "line",
   "text": "The IRQ vector's high byte"
  },
  {
   "address": 790,
   "type": "line",
   "text": "The BRK vector, pointed at the RTI at $2264"
  },
  {
   "address": 791,
   "type": "line",
   "text": "The BRK vector's high byte"
  },
  {
   "address": 792,
   "type": "line",
   "text": "The KERNAL's NMI vector, pointed at the RTI at $2264, so RESTORE does nothing"
  },
  {
   "address": 793,
   "type": "line",
   "text": "The NMI vector's high byte"
  },
  {
   "address": 4096,
   "type": "line",
   "text": "colours_to_ram's patched STA at $29F4 and LDA at $2A08 were left here, the page after its $0C00-$0FFF staging buffer, after its one run at the start"
  },
  {
   "address": 7845,
   "type": "line",
   "text": "Not data: BIT $1EA5 at $2863 hides LDA $1E (show_drawn, $2864) in its operand"
  },
  {
   "address": 8192,
   "type": "line",
   "text": "TITLE's first instruction, where BOOT's loader jumps: sets up the interrupt and the line table, loads SPACE, ROGUE, SHIP and CREDITS, clears the $4000 bitmap, turns the multicolour bitmap on with white colours and starts the lift-off (title_loop)"
  },
  {
   "address": 8201,
   "type": "line",
   "text": "load_inline's argument: load to $B700, then the file name \"SPACE\" and a zero"
  },
  {
   "address": 8209,
   "type": "line",
   "text": "Loads \"ROGUE\" to $AC00"
  },
  {
   "address": 8212,
   "type": "line",
   "text": "load_inline's argument: load to $AC00, then the file name \"ROGUE\" and a zero"
  },
  {
   "address": 8220,
   "type": "line",
   "text": "Loads \"SHIP\" to $6800"
  },
  {
   "address": 8223,
   "type": "line",
   "text": "load_inline's argument: load to $6800, then the file name \"SHIP\" and a zero"
  },
  {
   "address": 8230,
   "type": "line",
   "text": "Loads \"CREDITS\" to $3000"
  },
  {
   "address": 8233,
   "type": "line",
   "text": "load_inline's argument: load to $3000, then the file name \"CREDITS\" and a zero"
  },
  {
   "address": 8243,
   "type": "line",
   "text": "With the files in: clears the $4000 bitmap, sets the bitmap mode, shows the empty $4000 buffer with its colours, makes the colour RAM white and jumps to title_loop"
  },
  {
   "address": 8258,
   "type": "line",
   "text": "Banks the I/O and the KERNAL in ($01 low bits %110, RAM at $A000), keeping A"
  },
  {
   "address": 8269,
   "type": "line",
   "text": "Banks all RAM in ($01 low bits %100), keeping A"
  },
  {
   "address": 8280,
   "type": "line",
   "text": "Loads the file named after the JSR: two bytes of load address (low, high), then the name ending in a zero, and returns past the zero. LOAD runs from device 8 with secondary address 0, so the file goes to that address whatever its header says, and is retried until the KERNAL reports no error; the caller's $30/$31 are kept in the patched loads at $20C3 and $20C7"
  },
  {
   "address": 8365,
   "type": "line",
   "text": "The name's length, patched in by $208E"
  },
  {
   "address": 8367,
   "type": "line",
   "text": "The name's address, low byte, patched in by $2096"
  },
  {
   "address": 8369,
   "type": "line",
   "text": "The name's address, high byte, patched in by $209D"
  },
  {
   "address": 8376,
   "type": "line",
   "text": "The load address's low byte, patched in by $2072"
  },
  {
   "address": 8378,
   "type": "line",
   "text": "The load address's high byte, patched in by $2078"
  },
  {
   "address": 8388,
   "type": "line",
   "text": "The caller's $30, patched in by $205A and put back on the way out"
  },
  {
   "address": 8392,
   "type": "line",
   "text": "The caller's $31, patched in by $205F"
  },
  {
   "address": 8396,
   "type": "line",
   "text": "Clears any key waiting, waits for the interrupt to put one in key ($3C), clears it again and returns it in A; nothing in the title calls it"
  },
  {
   "address": 8411,
   "type": "line",
   "text": "Sets key ($3C) to $FF: none waiting"
  },
  {
   "address": 8416,
   "type": "line",
   "text": "A wait of about 0.86 seconds that a key ends early (the key stays in $3C). clear_key leaves A at $FF, so the caller's A makes no difference: the 26-cycle loop always runs 255 + 254 + ... + 1 = 32,640 times (848,640 cycles), and the interrupt adds its share. The title's callers pass A = 0"
  },
  {
   "address": 8444,
   "type": "line",
   "text": "Prints the character in A at the cursor, keeping A, the flags, and X and Y (put back by the patched loads at $2107 and $2109). The title never prints: it has no font loaded, and nothing calls this or the routines below it"
  },
  {
   "address": 8456,
   "type": "line",
   "text": "The caller's X, patched in by $2101"
  },
  {
   "address": 8458,
   "type": "line",
   "text": "The caller's Y, patched in by $20FE"
  },
  {
   "address": 8462,
   "type": "line",
   "text": "Draws character A (bit 7 ignored) into the drawing buffer at the cursor: RETURN ($0D) starts a new line, $08 and $7F rub out the character before the cursor, and a character that would pass the window's right edge starts a new line first. Its 8 bytes would come from a font at $F200, which the title never loads"
  },
  {
   "address": 8554,
   "type": "line",
   "text": "The cursor row's offset in a bitmap, low byte, patched in from char_row_offsets ($2156); the ADC adds the column's offset to it"
  },
  {
   "address": 8561,
   "type": "line",
   "text": "The cursor row's offset, high byte, ORed with the drawing buffer's page ($215E)"
  },
  {
   "address": 8568,
   "type": "line",
   "text": "The character's address in FONT, low byte, patched in by $2144"
  },
  {
   "address": 8569,
   "type": "line",
   "text": "The character's address in FONT, high byte: built from character \u00d7 8 and then $F2 added ($214C)"
  },
  {
   "address": 8571,
   "type": "line",
   "text": "The bitmap cell's address, low byte, patched in by $216B"
  },
  {
   "address": 8572,
   "type": "line",
   "text": "The bitmap cell's address, high byte, patched in by $2172"
  },
  {
   "address": 8579,
   "type": "line",
   "text": "Rubs out the character before the cursor: prints a space at the cursor, steps back two columns, prints another and steps back one, leaving the cursor a column to the left (the BPL at $218F lands on the next instruction either way)"
  },
  {
   "address": 8603,
   "type": "line",
   "text": "Moves the cursor to the window's left column on the next row. Past row 24 it scrolls the drawing buffer's rows 1-24 up a character row instead (7,680 bytes) and clears only the first 64 bytes of the bottom row, 8 of its 40 cells: $21EF loads Y = 1 where the 320-byte row needs 2"
  },
  {
   "address": 8646,
   "type": "line",
   "text": "new_line's scroll source, low byte, set to $40 (row 1 starts 320 bytes in)"
  },
  {
   "address": 8647,
   "type": "line",
   "text": "new_line's scroll source page, the drawing buffer's plus one, stepped on each page"
  },
  {
   "address": 8650,
   "type": "line",
   "text": "new_line's scroll destination page, the drawing buffer's own, stepped on each page"
  },
  {
   "address": 8693,
   "type": "line",
   "text": "The bottom row's address, low byte, set to zero"
  },
  {
   "address": 8694,
   "type": "line",
   "text": "The bottom row's page, the drawing buffer's plus $1E (row 24 starts 7,680 bytes in)"
  },
  {
   "address": 8712,
   "type": "line",
   "text": "The byte counter new_line's two loops count down"
  },
  {
   "address": 8713,
   "type": "line",
   "text": "With interrupts off, points every vector at the title's own handlers: a raster interrupt at line $50 with CIA1's interrupts off; the NMI and BRK vectors at the RTI at $2264 (it also writes that address to $FFFC, which a reset never reads from RAM); the KERNAL's IRQ vector ($0314) at irq_body and the hardware one ($FFFE) at irq. Then clears the key, sets up the SID (sound_init) and banks all RAM in. The title's first call ($2000)"
  },
  {
   "address": 8804,
   "type": "line",
   "text": "An RTI: the NMI (RESTORE) and BRK do nothing"
  },
  {
   "address": 8805,
   "type": "line",
   "text": "The raster interrupt as the hardware vector enters it, with all RAM banked in: pushes A, X and Y as the KERNAL's entry would and goes on into irq_body"
  },
  {
   "address": 8810,
   "type": "line",
   "text": "The raster interrupt as $0314 enters it, the KERNAL having pushed the registers: saves $01, banks the I/O in, acknowledges the raster, scans the keyboard (a new or repeating key goes to key without bit 7), counts the frame in $3D, runs the effect player and returns"
  },
  {
   "address": 8847,
   "type": "line",
   "text": "Scans the keyboard matrix itself; returns C set with a key's code in A when a key is new or repeating, C clear otherwise. CTRL and the two SHIFTs are read first and masked out of their rows; the first key held, row 7 down to row 0 and bit 7 down to bit 0 within a row, is numbered 8 \u00d7 the row's place + the bit's and looked up in key_codes, or key_codes_shifted with either SHIFT, CTRL keeping only the low five bits. A held key repeats 36 frames after it went down, then every 6. Port A is left an input"
  },
  {
   "address": 8936,
   "type": "line",
   "text": "BIT $E8 hides an INX ($E8) at $22E9: the first pass skips it and the BCS at $22EB lands on it, so X counts the row's released keys from bit 7 down to the one held"
  },
  {
   "address": 9011,
   "type": "line",
   "text": "The last key's number, $FF for none"
  },
  {
   "address": 9012,
   "type": "line",
   "text": "Frames left before a held key first repeats: 30 from a new key"
  },
  {
   "address": 9013,
   "type": "line",
   "text": "Frames left before the next repeat: 6"
  },
  {
   "address": 9014,
   "type": "line",
   "text": "For each row in scan order (7 down to 0), the bits of its modifier keys, ORed in so they never count as a key: CTRL in row 7, right SHIFT in row 6, left SHIFT in row 1"
  },
  {
   "address": 9022,
   "type": "line",
   "text": "CTRL's bit from row 7, zero while it is held"
  },
  {
   "address": 9023,
   "type": "line",
   "text": "Right SHIFT's bit from row 6, zero while it is held"
  },
  {
   "address": 9024,
   "type": "line",
   "text": "Left SHIFT's bit from row 1, zero while it is held"
  },
  {
   "address": 9025,
   "type": "line",
   "text": "The 64 keys' codes in scan order (row 7 bit 7 first): ASCII for letters (lower case), digits and punctuation, $0D for RETURN, $7F for DEL, $08 for the left-arrow key, $1B for F1, $09 and $0A for the cursor keys, and $80 for the keys with no code, which arrive as 0 since the interrupt keeps seven bits. The title only checks for any key"
  },
  {
   "address": 9089,
   "type": "line",
   "text": "The same with a SHIFT held: capitals, the symbols over the digits, $0B for cursor up and $08 for cursor left"
  },
  {
   "address": 9153,
   "type": "line",
   "text": "Silences the SID's three voices, turns the filter off and the volume up (15), and sets up the effect player and the masks"
  },
  {
   "address": 9194,
   "type": "line",
   "text": "Starts sound effect A (0-4; others are ignored) on voice 1, copying its settings from the effect tables to $80-$8C with interrupts off; only play_effect calls it, and nothing in the title plays an effect"
  },
  {
   "address": 9257,
   "type": "line",
   "text": "The effect player, run by the interrupt every frame: starts each repeat of the effect's note (frequency, envelope, waveform, gate), moves the frequency by the step each frame, releases the gate at the release point and silences the note when its frames run out. With no effect playing it plays a second sound: its frequency ($74/$75) slides up 2 a frame towards the target ($72/$73), and while drone_mask lets it through, voice 1 sounds it as noise at the level in $76, gated on and off on alternate frames. The title starts no effect; this second sound is the Sunracer's engine, which climbs and fades as the ship lifts off"
  },
  {
   "address": 9446,
   "type": "line",
   "text": "Each effect's starting frequency, low byte, for effects 0-4"
  },
  {
   "address": 9450,
   "type": "line",
   "text": "Effect 4's starting frequency, low byte, set by tone ($2618)"
  },
  {
   "address": 9451,
   "type": "line",
   "text": "Each effect's starting frequency, high byte: $10, $18, $01, $80, and effect 4's"
  },
  {
   "address": 9455,
   "type": "line",
   "text": "Effect 4's starting frequency, high byte, set by tone ($261B)"
  },
  {
   "address": 9456,
   "type": "line",
   "text": "Each effect's frequency step per frame, low byte"
  },
  {
   "address": 9461,
   "type": "line",
   "text": "Each effect's step, high byte: effect 0 falls by $80 a frame, effect 1 rises by $80, effect 2 falls by 2, effect 3 rises by $600, effect 4 holds"
  },
  {
   "address": 9466,
   "type": "line",
   "text": "Each effect's attack and decay"
  },
  {
   "address": 9471,
   "type": "line",
   "text": "Each effect's sustain and release"
  },
  {
   "address": 9476,
   "type": "line",
   "text": "Each effect's waveform with the gate: noise ($81) for effects 0, 2 and 3, pulse ($41) for 1 and 4"
  },
  {
   "address": 9481,
   "type": "line",
   "text": "Each effect's note length in frames: 32, 48, 128, 32, and effect 4's"
  },
  {
   "address": 9485,
   "type": "line",
   "text": "Effect 4's note length, set by tone and silence ($2615)"
  },
  {
   "address": 9486,
   "type": "line",
   "text": "The frames-left count at which each effect releases its gate"
  },
  {
   "address": 9491,
   "type": "line",
   "text": "How many notes each effect plays: three for effect 1, one for the rest"
  },
  {
   "address": 9496,
   "type": "line",
   "text": "Plays effect 3, rising noise, and waits for it: the intro's airlock sound, which the title carries in its copy of the library and never calls"
  },
  {
   "address": 9501,
   "type": "line",
   "text": "Plays effect 1, three rising tones: the intro's alert, never called here"
  },
  {
   "address": 9506,
   "type": "line",
   "text": "Plays effect 0, two 18-frame silences and effect 0 again: the intro's explosion, never called here"
  },
  {
   "address": 9518,
   "type": "line",
   "text": "Plays effect 0, falling noise; only explosion_sound calls it"
  },
  {
   "address": 9523,
   "type": "line",
   "text": "Plays effect 2, noise falling slowly for 128 frames: the intro's rumble, never called here"
  },
  {
   "address": 9525,
   "type": "line",
   "text": "Plays effect A and waits until it has finished or a key is pressed; if a key is already waiting it plays nothing"
  },
  {
   "address": 9545,
   "type": "line",
   "text": "Sends morse_text with tones (the elements' routines in morse_routines) until its closing zero or a key, which is then cleared: the intro's distress beacon. Nothing in the title calls it, so its patched operands still hold the file's $FF00"
  },
  {
   "address": 9556,
   "type": "line",
   "text": "The Morse character's address, low byte, patched in and stepped"
  },
  {
   "address": 9557,
   "type": "line",
   "text": "The Morse character's address, high byte"
  },
  {
   "address": 9587,
   "type": "line",
   "text": "The element routine's address, low byte, patched into this JSR from morse_routines"
  },
  {
   "address": 9588,
   "type": "line",
   "text": "The element routine's address, high byte"
  },
  {
   "address": 9607,
   "type": "line",
   "text": "The distress call, SOS SOS PLAY ULTIMA SOS SOS: $AE a dot and $AD a dash, $A7 a short gap between the letters of SOS, $A0 a gap between the other letters and $AF a gap between words (the five codes are morse_symbols)"
  },
  {
   "address": 9694,
   "type": "line",
   "text": "The five Morse characters distress_call looks up, in morse_routines' order: dot, dash, gap, word gap, short gap"
  },
  {
   "address": 9699,
   "type": "line",
   "text": "The Morse elements' routines, a word each: morse_dot, morse_dash, morse_gap, silence_18 and silence_4"
  },
  {
   "address": 9700,
   "type": "line",
   "text": "morse_routines read from one byte on, for the high bytes (Y = 2 \u00d7 the element)"
  },
  {
   "address": 9709,
   "type": "line",
   "text": "A dot: a 2-frame tone and 2 frames of silence"
  },
  {
   "address": 9718,
   "type": "line",
   "text": "A dash: a 6-frame tone and 2 frames of silence"
  },
  {
   "address": 9727,
   "type": "line",
   "text": "The gap between letters: 6 frames of silence"
  },
  {
   "address": 9731,
   "type": "line",
   "text": "18 frames of silence (effect 4 at frequency 0): the gap between Morse words and the pause in explosion_sound"
  },
  {
   "address": 9735,
   "type": "line",
   "text": "4 frames of silence, the gap between the letters of SOS"
  },
  {
   "address": 9739,
   "type": "line",
   "text": "A tone at frequency $3864 lasting A frames"
  },
  {
   "address": 9745,
   "type": "line",
   "text": "A frames of silence: effect 4 at frequency 0"
  },
  {
   "address": 9763,
   "type": "line",
   "text": "Copies the colours to the colour RAM, then runs copy_matrix; nothing calls it"
  },
  {
   "address": 9766,
   "type": "line",
   "text": "Copies 8 pages, a buffer's $2000-$27FF (screen matrix and colours), from page A ORed with $12 to the same place in the other buffer. Only dissolve_in calls it, with A = $1E, which makes the source $E000 whichever buffer is shown"
  },
  {
   "address": 9782,
   "type": "line",
   "text": "copy_matrix's source page, patched in and stepped"
  },
  {
   "address": 9785,
   "type": "line",
   "text": "copy_matrix's destination page, the source's with bit 7 flipped"
  },
  {
   "address": 9799,
   "type": "line",
   "text": "Copies the $4000 buffer's picture to the $C000 buffer and the colours to the colour RAM; nothing calls it"
  },
  {
   "address": 9805,
   "type": "line",
   "text": "Copies the $C000 buffer's picture to the $4000 buffer and the colours to the colour RAM; nothing calls it"
  },
  {
   "address": 9811,
   "type": "line",
   "text": "Copies the shown buffer's picture to the drawing buffer (copy_shown) and its colours to the colour RAM; nothing in the title calls it"
  },
  {
   "address": 9817,
   "type": "line",
   "text": "Copies the $4000 buffer's picture, bitmap, screen matrix and colours ($28 pages), to the $C000 buffer; only copy_4000_colours, which nothing calls, runs it"
  },
  {
   "address": 9823,
   "type": "line",
   "text": "Copies the $C000 buffer's picture to the $4000 buffer; only copy_c000_colours runs it"
  },
  {
   "address": 9829,
   "type": "line",
   "text": "Copies the shown buffer's picture to the drawing buffer; never run in the title, so its patched operands still hold $FF00"
  },
  {
   "address": 9847,
   "type": "line",
   "text": "The picture copy's source page, patched in and stepped"
  },
  {
   "address": 9848,
   "type": "line",
   "text": "The snapshot shows this STA's page left at $68, after a copy to the $4000 buffer"
  },
  {
   "address": 9850,
   "type": "line",
   "text": "The picture copy's destination page, patched in and stepped"
  },
  {
   "address": 9864,
   "type": "line",
   "text": "Sets $34/$35 to column A \u00d7 8"
  },
  {
   "address": 9875,
   "type": "line",
   "text": "Returns character row A's offset in the drawing buffer, low byte in A and high in Y (with the buffer's page ORed in), X = 0; the caller's X is put back in the LDX at $26A1. Nothing in the title calls it"
  },
  {
   "address": 9890,
   "type": "line",
   "text": "row_address's caller's X, patched in by $2693"
  },
  {
   "address": 9892,
   "type": "line",
   "text": "Fills the colour RAM, $D800-$DBFF, with 1 (white), interrupts off: called once at the start ($203C), so every picture's third colour is white, whatever colours its file carries"
  },
  {
   "address": 9910,
   "type": "line",
   "text": "The page of white_colours' STA, stepped from $D8; the snapshot shows it left at $DC"
  },
  {
   "address": 9925,
   "type": "line",
   "text": "Copies a block, $14 bytes wide and $15 rows high, from ($10) into the colour RAM at column X of row Y (colour_rows), the source advancing by the width each row; nothing in the title calls it"
  },
  {
   "address": 9956,
   "type": "line",
   "text": "put_colour_block's destination, low byte, patched in and stepped by 40"
  },
  {
   "address": 9957,
   "type": "line",
   "text": "put_colour_block's destination, high byte"
  },
  {
   "address": 9994,
   "type": "line",
   "text": "Copies a block, $14 bytes wide and $15 rows high, from ($10) into the drawing buffer's screen matrix at column X of row Y (matrix_rows), the source advancing by block_stride ($66) each row; entered at $270E for the $C000 buffer and $2712 for the $4000 one. draw_shape uses it to stamp a shape's colours"
  },
  {
   "address": 10032,
   "type": "line",
   "text": "put_matrix_block's destination, low byte, patched in and stepped by 40"
  },
  {
   "address": 10033,
   "type": "line",
   "text": "put_matrix_block's destination, high byte"
  },
  {
   "address": 10066,
   "type": "line",
   "text": "Builds the pixel-line table at $EB00 (low bytes) and $EC00 (high): for each of the 200 lines, (line / 8) \u00d7 320 + line mod 8. The title's second call ($2003); draw_shape reads it"
  },
  {
   "address": 10123,
   "type": "line",
   "text": "The offset build_line_table is working on, low byte; it leaves $1F40 (8,000) in the pair"
  },
  {
   "address": 10124,
   "type": "line",
   "text": "The offset build_line_table is working on, high byte"
  },
  {
   "address": 10125,
   "type": "line",
   "text": "Each character row's offset in a bitmap, 320 \u00d7 the row, a word each for rows 0-24 (print_char, row_address: neither runs in the title)"
  },
  {
   "address": 10126,
   "type": "line",
   "text": "char_row_offsets read from one byte on, for the high bytes (X = 2 \u00d7 the row)"
  },
  {
   "address": 10175,
   "type": "line",
   "text": "Each row's address in the colour RAM, $D800 + 40 \u00d7 the row, a word each (put_colour_block, never called here)"
  },
  {
   "address": 10176,
   "type": "line",
   "text": "colour_rows read from one byte on, for the high bytes"
  },
  {
   "address": 10225,
   "type": "line",
   "text": "Each row's offset from a buffer's page to its screen matrix, $2000 + 40 \u00d7 the row, a word each (put_matrix_block)"
  },
  {
   "address": 10226,
   "type": "line",
   "text": "matrix_rows read from one byte on, for the high bytes"
  },
  {
   "address": 10275,
   "type": "line",
   "text": "Turns the multicolour bitmap on ($D011 bit 5, $D016 bit 4), with the bitmap at the start of the VIC's bank and the screen matrix $2000 into it ($D018 = $80), and the background black. Its read-modify-write of $D011 also writes back bit 7, which reads as bit 8 of the beam's line and writes bit 8 of the raster compare: run while the beam is on line 256 or later, it moves the interrupt from line $50 to $150 (336), which no frame reaches, and the interrupt stops for good"
  },
  {
   "address": 10316,
   "type": "line",
   "text": "Shows the $C000 buffer and copies its colours to the colour RAM; nothing calls it"
  },
  {
   "address": 10322,
   "type": "line",
   "text": "Shows the $4000 buffer and copies its colours to the colour RAM: called once at the start ($2039), just before white_colours makes them all white"
  },
  {
   "address": 10328,
   "type": "line",
   "text": "Shows the drawing buffer (show_drawn) and copies its colours to the colour RAM; nothing in the title calls it"
  },
  {
   "address": 10334,
   "type": "line",
   "text": "Shows the $C000 buffer (the VIC's bank 3, CIA2 port A bits 0-1 = 0) and makes $4000 the drawing buffer. The BITs that follow hide two more entries in their operands, show_4000 (LDA #$40) and show_drawn (LDA $1E). Sets $3A to the shown buffer's page, $12 to its screen matrix's and $1E to the other buffer's"
  },
  {
   "address": 10336,
   "type": "line",
   "text": "BIT $40A9: its operand is LDA #$40, show_4000's entry"
  },
  {
   "address": 10337,
   "type": "line",
   "text": "Shows the $4000 buffer (the VIC's bank 1, CIA2 port A bits 0-1 = %10) and makes $C000 the drawing buffer; the LDA #$40 here is the operand of the BIT at $2860"
  },
  {
   "address": 10339,
   "type": "line",
   "text": "BIT $1EA5: its operand is LDA $1E, show_drawn's entry"
  },
  {
   "address": 10340,
   "type": "line",
   "text": "Shows the drawing buffer, the shown one becoming the drawing buffer: the flip after each frame of the animation is drawn; the LDA $1E here is the operand of the BIT at $2863"
  },
  {
   "address": 10417,
   "type": "line",
   "text": "Clears the drawing buffer's bitmap, 32 pages; the BITs that follow hide entries for the $4000 buffer ($28B4) and the $C000 one ($28B7). Only clear_4000 is called"
  },
  {
   "address": 10419,
   "type": "line",
   "text": "BIT $40A9: its operand is LDA #$40, clear_4000's entry"
  },
  {
   "address": 10420,
   "type": "line",
   "text": "Clears the $4000 buffer's bitmap ($4000-$5FFF), called once at the start ($2033); the LDA #$40 here is the operand of the BIT at $28B3"
  },
  {
   "address": 10422,
   "type": "line",
   "text": "BIT $C0A9: its operand is LDA #$C0, an entry at $28B7 for the $C000 buffer"
  },
  {
   "address": 10435,
   "type": "line",
   "text": "The page clear_drawing's STA writes, patched in and stepped; the snapshot shows it left at $60"
  },
  {
   "address": 10446,
   "type": "line",
   "text": "Brings the drawing buffer's picture onto the shown one a pixel pair at a time in a scattered order, after copying its colours to the colour RAM and its screen matrix to the shown buffer (copy_matrix); a 15-bit shift register visits every pixel pair of the 8 KB bitmap once (dissolve_lfsr). The title enters 3 bytes in, at dissolve_in_matrix ($28D1), so the colour RAM stays white"
  },
  {
   "address": 10449,
   "type": "line",
   "text": "dissolve_in without its first step, the colours: the title's dissolves come in here, so the colour RAM stays white"
  },
  {
   "address": 10516,
   "type": "line",
   "text": "The pixel pair from the drawing buffer, patched into this ORA by $290B"
  },
  {
   "address": 10541,
   "type": "line",
   "text": "The four pixel pairs of a multicolour byte, left to right"
  },
  {
   "address": 10545,
   "type": "line",
   "text": "The bits each pixel pair leaves alone, the complements of pixel_masks"
  },
  {
   "address": 10549,
   "type": "line",
   "text": "Fades the shown picture to black a pixel pair at a time, in the shift register's scattered order: the credits fade out this way ($2DA7)"
  },
  {
   "address": 10613,
   "type": "line",
   "text": "The complements of pixel_masks again, for dissolve_out"
  },
  {
   "address": 10617,
   "type": "line",
   "text": "Unpacks the picture packed at page A into the drawing buffer: a byte below $80 is a count and the next byte is repeated that many times; $80 plus a count is followed by that many bytes to copy; a zero is followed by the border colour, which is stored too, written to $D020, and ends it. A whole picture is a buffer's bitmap, its screen matrix at +$2000 and its colours at +$2400"
  },
  {
   "address": 10711,
   "type": "line",
   "text": "Copies the shown buffer's colours (its +$2400) to the colour RAM: first to $0C00 with all RAM banked in, then on to $D800 with the I/O in, since the RAM under the KERNAL and the colour RAM cannot both be seen at once. In the title it runs once, from show_4000_colours at the start"
  },
  {
   "address": 10739,
   "type": "line",
   "text": "colours_to_ram's source page, the shown buffer's plus $24, stepped"
  },
  {
   "address": 10742,
   "type": "line",
   "text": "colours_to_ram's staging page, from $0C, stepped"
  },
  {
   "address": 10762,
   "type": "line",
   "text": "The staging page read back, from $0C, stepped"
  },
  {
   "address": 10765,
   "type": "line",
   "text": "The colour RAM page written, from $D8, stepped"
  },
  {
   "address": 10781,
   "type": "line",
   "text": "Draws a shape from SHIP into the drawing buffer at column X and pixel line A \u00d7 256 + Y (A negative while the shape is above the screen). The shape is $64 bytes a line, one byte per cell across, $67 lines high, from ($60). With $4E bit 7 set it is drawn through its mask at ($62): each screen byte keeps only the pixels the mask leaves clear and takes the shape's; otherwise its bytes are stored over the screen. With bit 6 set its colours are stamped first, a screen-matrix row from ($10) for every 8 lines (put_matrix_block). Lines above the top are skipped and lines past line 199 cut off"
  },
  {
   "address": 10807,
   "type": "line",
   "text": "Skips the lines above the screen one at a time, stepping the shape, the mask and, every eighth line, the colours, until the line is on the screen or the shape has run out"
  },
  {
   "address": 10870,
   "type": "line",
   "text": "Clips the height to the lines left above line 200 and the colour rows to the 25 the screen has"
  },
  {
   "address": 10913,
   "type": "line",
   "text": "Bit 6 of $4E: stamps the shape's colours over its rows of the screen matrix"
  },
  {
   "address": 10936,
   "type": "line",
   "text": "Bit 7 of $4E: draws through the mask (masked_lines); otherwise stores the bytes (plain_lines)"
  },
  {
   "address": 10943,
   "type": "line",
   "text": "Stores each visible line of the shape over the screen: the line's address from the line table plus the column's offset, ORed with the drawing buffer's page, patched into the STA, which steps 8 bytes, a cell, for each byte"
  },
  {
   "address": 10979,
   "type": "line",
   "text": "The screen byte plain_lines writes, low byte, patched in from the line table and stepped a cell at a time"
  },
  {
   "address": 10980,
   "type": "line",
   "text": "The screen byte's high byte; the snapshot shows the STA left at $5F07, in the $4000 buffer"
  },
  {
   "address": 11017,
   "type": "line",
   "text": "Draws each visible line through the mask: the screen byte ANDed with the mask byte inverted, then ORed with the shape's byte"
  },
  {
   "address": 11061,
   "type": "line",
   "text": "The screen byte masked_lines reads, low byte, patched in with the STA's"
  },
  {
   "address": 11062,
   "type": "line",
   "text": "The screen byte masked_lines reads, high byte; the snapshot shows it left at $D3C6, in the $C000 buffer"
  },
  {
   "address": 11066,
   "type": "line",
   "text": "The screen byte masked_lines writes back, the same address as the AND's, low byte"
  },
  {
   "address": 11067,
   "type": "line",
   "text": "The screen byte masked_lines writes back, high byte"
  },
  {
   "address": 11118,
   "type": "line",
   "text": "The title's main loop: clears the key, then shows the lift-off over and over until a key is pressed, when it goes to title_exit"
  },
  {
   "address": 11121,
   "type": "line",
   "text": "One showing: puts the scenery, the legs, the ship and the dust back at their starting lines, the dust at its first frame and the engine's note at zero and full level, draws the first frame and dissolves it in; then the stages, each followed by a check for a key: the engine starting, the rise, the legs folding, the climb and the credits"
  },
  {
   "address": 11236,
   "type": "line",
   "text": "A key: go to title_exit"
  },
  {
   "address": 11239,
   "type": "line",
   "text": "Z clear when a key is waiting ($3C is not $FF)"
  },
  {
   "address": 11244,
   "type": "line",
   "text": "Six frames of the Sunracer standing on the plain; then the engine starts (drone_mask $FF) and twelve frames of dust blow out under it, the engine's note rising a step a frame"
  },
  {
   "address": 11287,
   "type": "line",
   "text": "24 frames: the ship and its legs rise a pixel line a frame, the engine's note rising and its level falling"
  },
  {
   "address": 11342,
   "type": "line",
   "text": "12 frames: the ship rises two lines a frame and the legs four, folding up into it"
  },
  {
   "address": 11399,
   "type": "line",
   "text": "The ship climbs off the top of the screen while the planet falls away: from here the frames are drawn over ROGUE, the Space Rogue logo, without the legs. 12 frames with the ship up 2 lines and the scenery down 1, then 12 with the scenery down 2"
  },
  {
   "address": 11562,
   "type": "line",
   "text": "Then 48 frames with the ship up 2 lines and the scenery down 3: the scenery is past the bottom of the screen and the ship past the top before they end"
  },
  {
   "address": 11652,
   "type": "line",
   "text": "Silences the engine, unpacks CREDITS and dissolves it in, leaves it up for 24 pauses of about 0.86 seconds (about 21 seconds), fades it out and waits 6 more pauses on the black screen"
  },
  {
   "address": 11714,
   "type": "line",
   "text": "The first frame, drawn over SPACE: the scenery, the legs and the ship, dissolved in rather than flipped"
  },
  {
   "address": 11731,
   "type": "line",
   "text": "A frame of the ship standing, over SPACE: the scenery, the legs and the ship, then the flip"
  },
  {
   "address": 11748,
   "type": "line",
   "text": "A frame of the lift-off over SPACE: the scenery, the legs, the small dust at its next frame, the ship and the large dust, then the flip"
  },
  {
   "address": 11771,
   "type": "line",
   "text": "A frame of the climb over ROGUE: the scenery, the small dust, the ship and the large dust, then the flip"
  },
  {
   "address": 11791,
   "type": "line",
   "text": "Draws the mountains (40 cells by 48 lines through their mask, with colours) at the line in $42/$43 and the plain under them (40 by 80, stored over the screen, with colours) at the line in $40/$41"
  },
  {
   "address": 11873,
   "type": "line",
   "text": "Draws the landing legs, 23 cells by 24 lines through their mask, at column 9 and the line in $46/$47"
  },
  {
   "address": 11918,
   "type": "line",
   "text": "Steps the dust's frame counter (0-7) and draws the small dust cloud's frame for it, 10 cells by 32 lines with itself as the mask, at column 15 and the line in $44/$45"
  },
  {
   "address": 11981,
   "type": "line",
   "text": "The small dust's frame for each count 0-7, as an offset into dust_frames_small: frames 0, 1, 2, 0, 2, 1, 0, 2"
  },
  {
   "address": 11989,
   "type": "line",
   "text": "The small dust's three frames in SHIP, a word each: $8600, $8740, $8880"
  },
  {
   "address": 11990,
   "type": "line",
   "text": "dust_frames_small read from one byte on, for the high bytes"
  },
  {
   "address": 11995,
   "type": "line",
   "text": "A colour address for each small dust frame, the next frame's start: draw_dust_small sets it but leaves bit 6 of $4E clear, so it is never used"
  },
  {
   "address": 11996,
   "type": "line",
   "text": "dust_colours_small read from one byte on, for the high bytes"
  },
  {
   "address": 12001,
   "type": "line",
   "text": "Draws the Sunracer, 37 cells by 56 lines through its mask and with its colours, at column 1 and the line in $48/$49"
  },
  {
   "address": 12046,
   "type": "line",
   "text": "Draws the large dust cloud's frame for the same count, 25 cells by 32 lines with itself as the mask, at column 8 and the line in $4A/$4B"
  },
  {
   "address": 12102,
   "type": "line",
   "text": "The large dust's frame for each count 0-7, the same order as the small dust's"
  },
  {
   "address": 12110,
   "type": "line",
   "text": "The large dust's three frames in SHIP, a word each: $89C0, $8CE0, $9000"
  },
  {
   "address": 12111,
   "type": "line",
   "text": "dust_frames_big read from one byte on, for the high bytes"
  },
  {
   "address": 12116,
   "type": "line",
   "text": "A colour address for each large dust frame, never used (bit 6 of $4E is clear)"
  },
  {
   "address": 12117,
   "type": "line",
   "text": "dust_colours_big read from one byte on, for the high bytes"
  },
  {
   "address": 12122,
   "type": "line",
   "text": "A key ends the title: silences the engine, puts up CREDITS at once and loads INTRO over SHIP at $6800 while it shows, then jumps to it"
  },
  {
   "address": 12137,
   "type": "line",
   "text": "load_inline's argument: load to $6800, then the file name \"INTRO\" and a zero"
  },
  {
   "address": 12145,
   "type": "line",
   "text": "With INTRO in, jumps to its start, $6800"
  },
  {
   "address": 12148,
   "type": "line",
   "text": "Zeros to the end of TITLE; never read"
  },
  {
   "address": 12288,
   "type": "line",
   "text": "CREDITS, loaded here at the start ($2026): the credits page, packed for unpack_picture with a bitmap and a screen matrix but no colours. \u00a91989 Origin; programming by Paul Neurath, Mark \"Adam\" Baum, Steven Muchow, Ned Lerner and John Miles; produced by Dallas Snell; associate producer Alan Gardner; graphic design by Denis Loubet, Keith Berdak and Jeff Dee; additional material by Warren Spector"
  },
  {
   "address": 13215,
   "type": "line",
   "text": "CREDITS's stream from +$075B in the buffer, part-way through bitmap row 5"
  },
  {
   "address": 14184,
   "type": "line",
   "text": "CREDITS's stream from +$0EF5 in the buffer, near the end of bitmap row 11"
  },
  {
   "address": 14335,
   "type": "line",
   "text": "CREDITS's stream from bitmap row 13 (+$1040)"
  },
  {
   "address": 15330,
   "type": "line",
   "text": "CREDITS's stream from +$18E8, near the end of bitmap row 19"
  },
  {
   "address": 15960,
   "type": "line",
   "text": "CREDITS's stream for the screen matrix (+$2000), then a zero at $3F74 and the border colour, black"
  },
  {
   "address": 16246,
   "type": "line",
   "text": "The rest of CREDITS after its stream; never read"
  },
  {
   "address": 16553,
   "type": "line",
   "text": "Not data: BIT $40A9 at $2860 and at $28B3 hides LDA #$40, the entries show_4000 ($2861) and clear_4000 ($28B4)"
  },
  {
   "address": 24327,
   "type": "line",
   "text": "In the $4000 buffer's bitmap: where plain_lines' patched STA was left, the last byte of the plain it stored"
  },
  {
   "address": 24576,
   "type": "line",
   "text": "The $4000 buffer's screen matrix ($6000-$63E7); clear_drawing's patched STA at $28C1 was left pointing here after clearing the bitmap below"
  },
  {
   "address": 26624,
   "type": "line",
   "text": "SHIP, loaded here at the start ($201C), holds the animation's shapes. The mountains first: 40 cells by 48 lines, a line of 40 bytes after another, lines 0-23 here. (copy_matrix's STA and colours_to_ram's LDA were left pointing here, and to_intro jumps here once INTRO has replaced SHIP)"
  },
  {
   "address": 27584,
   "type": "line",
   "text": "The mountains' lines 24-47"
  },
  {
   "address": 28544,
   "type": "line",
   "text": "The mountains' colours: six rows of 40 screen-matrix bytes, stamped by draw_shape"
  },
  {
   "address": 28784,
   "type": "line",
   "text": "The mountains' mask, lines 0-23: a bit set wherever the mountains cover the stars"
  },
  {
   "address": 29744,
   "type": "line",
   "text": "The mountains' mask, lines 24-47"
  },
  {
   "address": 30704,
   "type": "line",
   "text": "The plain under the mountains, 40 cells by 80 lines, stored over the screen without a mask: lines 0-23"
  },
  {
   "address": 31664,
   "type": "line",
   "text": "The plain's lines 24-47"
  },
  {
   "address": 32624,
   "type": "line",
   "text": "The plain's lines 48-50 and the first bytes of line 51"
  },
  {
   "address": 32768,
   "type": "line",
   "text": "The plain from $8000 on, the rest of line 51 to line 71"
  },
  {
   "address": 33584,
   "type": "line",
   "text": "The plain's lines 72-79"
  },
  {
   "address": 33904,
   "type": "line",
   "text": "The plain's colours: ten rows of 40 screen-matrix bytes"
  },
  {
   "address": 34304,
   "type": "line",
   "text": "The small dust cloud, 10 cells by 32 lines, frame 0 (each frame is its own mask)"
  },
  {
   "address": 34624,
   "type": "line",
   "text": "The small dust cloud's frame 1"
  },
  {
   "address": 34944,
   "type": "line",
   "text": "The small dust cloud's frame 2"
  },
  {
   "address": 35264,
   "type": "line",
   "text": "The large dust cloud, 25 cells by 32 lines, frame 0"
  },
  {
   "address": 36064,
   "type": "line",
   "text": "The large dust cloud's frame 1"
  },
  {
   "address": 36864,
   "type": "line",
   "text": "The large dust cloud's frame 2"
  },
  {
   "address": 37664,
   "type": "line",
   "text": "The Sunracer, 37 cells by 56 lines: lines 0-23"
  },
  {
   "address": 38552,
   "type": "line",
   "text": "The Sunracer's lines 24-47"
  },
  {
   "address": 39440,
   "type": "line",
   "text": "The Sunracer's lines 48-55"
  },
  {
   "address": 39736,
   "type": "line",
   "text": "The Sunracer's colours: seven rows of 37 screen-matrix bytes"
  },
  {
   "address": 39995,
   "type": "line",
   "text": "The Sunracer's mask, lines 0-23"
  },
  {
   "address": 40883,
   "type": "line",
   "text": "The Sunracer's mask, lines 24-25 and the start of line 26"
  },
  {
   "address": 40960,
   "type": "line",
   "text": "The Sunracer's mask from $A000 on, the rest of line 26 to line 47"
  },
  {
   "address": 41771,
   "type": "line",
   "text": "The Sunracer's mask, lines 48-55"
  },
  {
   "address": 42067,
   "type": "line",
   "text": "The landing legs, 23 cells by 24 lines"
  },
  {
   "address": 42619,
   "type": "line",
   "text": "The legs' mask"
  },
  {
   "address": 43171,
   "type": "line",
   "text": "The rest of SHIP after the legs' mask; never read"
  },
  {
   "address": 44032,
   "type": "line",
   "text": "ROGUE, loaded here at the start ($2011): the Space Rogue logo and \"by Paul Neurath\" over a star field, packed with a bitmap and a screen matrix but no colours; the background of the climb (frame_logo)"
  },
  {
   "address": 44826,
   "type": "line",
   "text": "ROGUE's stream from +$0B34, near the end of bitmap row 8"
  },
  {
   "address": 45288,
   "type": "line",
   "text": "ROGUE's stream from bitmap row 13 (+$1040)"
  },
  {
   "address": 46101,
   "type": "line",
   "text": "ROGUE's stream from +$18E8, near the end of bitmap row 19"
  },
  {
   "address": 46499,
   "type": "line",
   "text": "ROGUE's stream for the screen matrix (+$2000), then a zero at $B630 and the border colour, black"
  },
  {
   "address": 46642,
   "type": "line",
   "text": "The rest of ROGUE after its stream; never read"
  },
  {
   "address": 46848,
   "type": "line",
   "text": "SPACE, loaded here at the start ($2006): the star field, packed for unpack_picture, the background of the animation's first frames. It holds a bitmap and a screen matrix but no colours"
  },
  {
   "address": 47783,
   "type": "line",
   "text": "SPACE's stream from +$0F08 in the buffer, the second cell of bitmap row 12"
  },
  {
   "address": 48760,
   "type": "line",
   "text": "SPACE's stream from +$1E7E, part-way through bitmap row 24, and the unused bytes after the bitmap"
  },
  {
   "address": 48768,
   "type": "line",
   "text": "SPACE's stream for the screen matrix (+$2000), the stars' colours, ending at $BF53 with a zero and the border colour"
  },
  {
   "address": 48980,
   "type": "line",
   "text": "The rest of SPACE after its stream; never read"
  },
  {
   "address": 49321,
   "type": "line",
   "text": "Not data: BIT $C0A9 at $28B6 hides LDA #$C0, clear_drawing's entry for the $C000 buffer ($28B7), which nothing calls"
  },
  {
   "address": 57984,
   "type": "line",
   "text": "In the $C000 buffer's screen matrix: where put_matrix_block's patched STA at $272F was left by the last colours it stamped"
  },
  {
   "address": 59392,
   "type": "line",
   "text": "Past the $C000 buffer's colours: copy_matrix's patched LDA at $2634 was left pointing here after its last copy from the $C000 buffer"
  },
  {
   "address": 60160,
   "type": "line",
   "text": "The pixel-line table's low bytes, lines 0-199: each line's offset in a bitmap, (line / 8) \u00d7 320 + line mod 8, built at the start (build_line_table); draw_shape finds each line of a shape through it"
  },
  {
   "address": 60416,
   "type": "line",
   "text": "The pixel-line table's high bytes, ORed with the drawing buffer's page when used"
  },
  {
   "address": 65280,
   "type": "line",
   "text": "No table here: $FF00 is the placeholder the TITLE file carries in the operands patched before use. The snapshot still shows it in those never run: print_char's ($2177, $217A), new_line's ($21C5, $21C8, $21F4), distress_call's ($2553, $2572), copy_shown's ($2675, $2678) and put_colour_block's ($26E3)"
  },
  {
   "address": 65466,
   "type": "line",
   "text": "The KERNAL's SETLFS: file number A, device X, secondary address Y"
  },
  {
   "address": 65469,
   "type": "line",
   "text": "The KERNAL's SETNAM: the name's length in A, its address in X (low) and Y (high)"
  },
  {
   "address": 65493,
   "type": "line",
   "text": "The KERNAL's LOAD: A = 0 to load, X and Y the address used when the secondary address is 0; carry set on an error"
  },
  {
   "address": 65530,
   "type": "line",
   "text": "The hardware vectors in the RAM under the KERNAL, written by setup_irq: NMI and reset at the RTI ($2264; a reset banks the KERNAL in and never reads these), IRQ at irq ($2265)"
  }
 ]
}