{
 "schema": 1,
 "platform": "c64",
 "game": "ghostbusters",
 "build": "",
 "source": "regenerator2000 live",
 "regions": {
  "exclude": [
   [
    256,
    511,
    "stack"
   ],
   [
    53248,
    57343,
    "I/O and colour RAM"
   ],
   [
    21504,
    22527,
    "screen RAM"
   ],
   [
    16384,
    24575,
    "the video bank's screens and graphics: the start-up at $6000 clears all of it and builds it again, so the bytes the one-load image carries there are the conversion's leftovers"
   ]
  ],
  "extra": [
   [
    22528,
    24575,
    "character set"
   ]
  ]
 },
 "blocks": [
  {
   "start": 0,
   "end": 511,
   "type": "Undefined"
  },
  {
   "start": 512,
   "end": 13055,
   "type": "Byte"
  },
  {
   "start": 13056,
   "end": 13397,
   "type": "Code"
  },
  {
   "start": 13398,
   "end": 13400,
   "type": "Byte"
  },
  {
   "start": 13401,
   "end": 13520,
   "type": "Screencode Text"
  },
  {
   "start": 13521,
   "end": 13560,
   "type": "Byte"
  },
  {
   "start": 13561,
   "end": 13859,
   "type": "Code"
  },
  {
   "start": 13860,
   "end": 13987,
   "type": "PETSCII Text"
  },
  {
   "start": 13988,
   "end": 14174,
   "type": "Byte"
  },
  {
   "start": 14175,
   "end": 14182,
   "type": "Address"
  },
  {
   "start": 14183,
   "end": 14361,
   "type": "Byte"
  },
  {
   "start": 14362,
   "end": 14489,
   "type": "Word"
  },
  {
   "start": 14490,
   "end": 14493,
   "type": "Screencode Text"
  },
  {
   "start": 14494,
   "end": 14557,
   "type": "Byte"
  },
  {
   "start": 14558,
   "end": 15323,
   "type": "PETSCII Text"
  },
  {
   "start": 15324,
   "end": 15707,
   "type": "Code"
  },
  {
   "start": 15708,
   "end": 16312,
   "type": "Byte"
  },
  {
   "start": 16313,
   "end": 16380,
   "type": "PETSCII Text"
  },
  {
   "start": 16381,
   "end": 16383,
   "type": "Byte"
  },
  {
   "start": 16384,
   "end": 24575,
   "type": "Undefined"
  },
  {
   "start": 24576,
   "end": 25383,
   "type": "Code"
  },
  {
   "start": 25384,
   "end": 25384,
   "type": "Byte"
  },
  {
   "start": 25385,
   "end": 25658,
   "type": "Code"
  },
  {
   "start": 25659,
   "end": 25666,
   "type": "Byte"
  },
  {
   "start": 25667,
   "end": 26863,
   "type": "PETSCII Text"
  },
  {
   "start": 26864,
   "end": 28641,
   "type": "Byte"
  },
  {
   "start": 28642,
   "end": 36239,
   "type": "Code"
  },
  {
   "start": 36240,
   "end": 36245,
   "type": "Byte"
  },
  {
   "start": 36246,
   "end": 36518,
   "type": "Code"
  },
  {
   "start": 36519,
   "end": 36534,
   "type": "Byte"
  },
  {
   "start": 36535,
   "end": 36944,
   "type": "Code"
  },
  {
   "start": 36945,
   "end": 36962,
   "type": "Byte"
  },
  {
   "start": 36963,
   "end": 37563,
   "type": "Code"
  },
  {
   "start": 37564,
   "end": 37856,
   "type": "Byte"
  },
  {
   "start": 37857,
   "end": 40377,
   "type": "Code"
  },
  {
   "start": 40378,
   "end": 40387,
   "type": "Byte"
  },
  {
   "start": 40388,
   "end": 40399,
   "type": "PETSCII Text"
  },
  {
   "start": 40400,
   "end": 42842,
   "type": "Byte"
  },
  {
   "start": 42843,
   "end": 42990,
   "type": "Word"
  },
  {
   "start": 42991,
   "end": 43730,
   "type": "Byte"
  },
  {
   "start": 43731,
   "end": 43740,
   "type": "Screencode Text"
  },
  {
   "start": 43741,
   "end": 43794,
   "type": "Byte"
  },
  {
   "start": 43795,
   "end": 45932,
   "type": "PETSCII Text"
  },
  {
   "start": 45933,
   "end": 45988,
   "type": "Word"
  },
  {
   "start": 45989,
   "end": 45993,
   "type": "Byte"
  },
  {
   "start": 45994,
   "end": 45996,
   "type": "Screencode Text"
  },
  {
   "start": 45997,
   "end": 45999,
   "type": "Byte"
  },
  {
   "start": 46000,
   "end": 46067,
   "type": "PETSCII Text"
  },
  {
   "start": 46068,
   "end": 49151,
   "type": "Byte"
  },
  {
   "start": 49152,
   "end": 51199,
   "type": "Undefined"
  },
  {
   "start": 51200,
   "end": 51233,
   "type": "Code"
  },
  {
   "start": 51234,
   "end": 51503,
   "type": "Byte"
  },
  {
   "start": 51504,
   "end": 52735,
   "type": "Undefined"
  },
  {
   "start": 52736,
   "end": 52949,
   "type": "Code"
  },
  {
   "start": 52950,
   "end": 52953,
   "type": "Byte"
  },
  {
   "start": 52954,
   "end": 53119,
   "type": "Undefined"
  },
  {
   "start": 53120,
   "end": 53131,
   "type": "Code"
  },
  {
   "start": 53132,
   "end": 57343,
   "type": "Undefined"
  },
  {
   "start": 57344,
   "end": 59483,
   "type": "Byte"
  },
  {
   "start": 59484,
   "end": 59647,
   "type": "Undefined"
  },
  {
   "start": 59648,
   "end": 59902,
   "type": "Byte"
  },
  {
   "start": 59903,
   "end": 59903,
   "type": "Undefined"
  },
  {
   "start": 59904,
   "end": 60106,
   "type": "Byte"
  },
  {
   "start": 60107,
   "end": 60159,
   "type": "Undefined"
  },
  {
   "start": 60160,
   "end": 60280,
   "type": "Byte"
  },
  {
   "start": 60281,
   "end": 61439,
   "type": "Undefined"
  },
  {
   "start": 61440,
   "end": 61567,
   "type": "Byte"
  },
  {
   "start": 61568,
   "end": 62028,
   "type": "Code"
  },
  {
   "start": 62029,
   "end": 62032,
   "type": "Byte"
  },
  {
   "start": 62033,
   "end": 62167,
   "type": "Code"
  },
  {
   "start": 62168,
   "end": 62179,
   "type": "Byte"
  },
  {
   "start": 62180,
   "end": 62305,
   "type": "Code"
  },
  {
   "start": 62306,
   "end": 62321,
   "type": "Byte"
  },
  {
   "start": 62322,
   "end": 62679,
   "type": "Code"
  },
  {
   "start": 62680,
   "end": 62697,
   "type": "Byte"
  },
  {
   "start": 62698,
   "end": 62717,
   "type": "Word"
  },
  {
   "start": 62718,
   "end": 65535,
   "type": "Byte"
  }
 ],
 "symbols": [
  {
   "address": 0,
   "name": "cpu_ddr",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 1,
   "name": "cpu_port",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 2,
   "name": "game_flags",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 3,
   "name": "restart_count",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 4,
   "name": "scroller_pos_lo",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5,
   "name": "scroller_pos_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6,
   "name": "random",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7,
   "name": "account_lfsr",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8,
   "name": "tick",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9,
   "name": "frame_counter",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10,
   "name": "zp_unused_0A",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11,
   "name": "ptr_a",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 12,
   "name": "ptr_a_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 13,
   "name": "copy_src",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14,
   "name": "copy_src_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 15,
   "name": "copy_dst",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 16,
   "name": "copy_dst_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 17,
   "name": "fire_prev",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 18,
   "name": "zp_unused_12",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20,
   "name": "restart_timer",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21,
   "name": "type_speed",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 22,
   "name": "type_count",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 23,
   "name": "key_char",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 24,
   "name": "key_last",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 25,
   "name": "key_code",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 26,
   "name": "road_pos",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 27,
   "name": "drive_speed",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 28,
   "name": "drive_speed_frac",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 29,
   "name": "sprite_mc1",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 30,
   "name": "sprite_mc2",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 31,
   "name": "route_last_cell",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 32,
   "name": "game_mode",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 33,
   "name": "lyric_ptr",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 34,
   "name": "lyric_ptr_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 35,
   "name": "tmp_23",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 36,
   "name": "tmp_24",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 37,
   "name": "tmp_25",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 38,
   "name": "tmp_26",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 39,
   "name": "tmp_27",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 40,
   "name": "tmp_28",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 41,
   "name": "tmp_29",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 42,
   "name": "tmp_2A",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 43,
   "name": "sprite_shape",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 44,
   "name": "sprite_shape_1",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 45,
   "name": "sprite_shape_2",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 46,
   "name": "sprite_shape_3",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 47,
   "name": "sprite_shape_4",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 48,
   "name": "sprite_shape_5",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 49,
   "name": "sprite_shape_6",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50,
   "name": "sprite_shape_7",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 51,
   "name": "joystick",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 52,
   "name": "joystick_copy",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 53,
   "name": "zp_unused_35",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 54,
   "name": "zp_unused_36",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55,
   "name": "zp_unused_37",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 56,
   "name": "cursor_col",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 57,
   "name": "cursor_row",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 58,
   "name": "game_state",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 59,
   "name": "bg_colour",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 60,
   "name": "pk_rate_mask",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 61,
   "name": "men_left",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 62,
   "name": "backpack_power",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 63,
   "name": "zp_unused_3F",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 69,
   "name": "idle_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 70,
   "name": "idle_lo",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 71,
   "name": "pause_flags",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 72,
   "name": "text_colour",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 73,
   "name": "ticker_fine",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 74,
   "name": "ticker_len",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 75,
   "name": "ticker_pos",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 76,
   "name": "report_shown",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 77,
   "name": "msg_page",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 78,
   "name": "text_ptr",
   "type": "ZeroPagePointer",
   "kind": "user"
  },
  {
   "address": 79,
   "name": "text_ptr_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 80,
   "name": "input_index",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 81,
   "name": "start_balance",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 82,
   "name": "start_balance_mid",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 83,
   "name": "start_balance_lo",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 84,
   "name": "final_balance",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 85,
   "name": "final_balance_mid",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 86,
   "name": "final_balance_lo",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 87,
   "name": "balance",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 88,
   "name": "balance_mid",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 89,
   "name": "balance_lo",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 90,
   "name": "pk_energy_lo",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 91,
   "name": "pk_energy_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 92,
   "name": "car",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 93,
   "name": "shop_page",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 94,
   "name": "shop_active",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 95,
   "name": "forklift_pos",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 96,
   "name": "item_carried",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 97,
   "name": "item_slot",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 98,
   "name": "car_load",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 99,
   "name": "car_lateral",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 100,
   "name": "steer_request",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 101,
   "name": "vacuum_flash",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 102,
   "name": "route_len",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 103,
   "name": "drive_target",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 104,
   "name": "bait_down",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 105,
   "name": "bait_left",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 106,
   "name": "traps_owned",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 107,
   "name": "traps_empty",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 108,
   "name": "ghosts_stored",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 109,
   "name": "equipment",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 110,
   "name": "building",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 111,
   "name": "roamer_meet",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 115,
   "name": "roamer_slot_s0",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 116,
   "name": "roamer_slot_s1",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 117,
   "name": "vacuum_count",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 119,
   "name": "man_walk",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 120,
   "name": "man_walk_2",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 121,
   "name": "anim_step",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 122,
   "name": "trap_height",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 123,
   "name": "men_bob_timer",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 124,
   "name": "delay_timer",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 125,
   "name": "slimer_dir",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 126,
   "name": "slimer_side",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 128,
   "name": "mm_building",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 129,
   "name": "zuul_phase",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 130,
   "name": "mus_track_pos",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 133,
   "name": "mus_pattern_pos",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 136,
   "name": "mus_duration",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 137,
   "name": "mus_duration_1",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 138,
   "name": "mus_duration_2",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 139,
   "name": "mus_note",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 142,
   "name": "mus_event",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 145,
   "name": "mus_control",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 148,
   "name": "mus_instrument",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 151,
   "name": "lyric_index",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 152,
   "name": "sfx_busy",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 153,
   "name": "zp_unused_99",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 154,
   "name": "lyric_scroll",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 155,
   "name": "zp_unused_9B",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 158,
   "name": "loader_ptr",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 159,
   "name": "loader_ptr_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 160,
   "name": "sprite_pos",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 161,
   "name": "sprite_pos_1",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 162,
   "name": "sprite_pos_2",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 163,
   "name": "sprite_pos_3",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 164,
   "name": "sprite_pos_4",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 165,
   "name": "sprite_pos_5",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 166,
   "name": "sprite_pos_6",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 167,
   "name": "sprite_pos_7",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 168,
   "name": "sprite_pos_8",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 169,
   "name": "sprite_pos_9",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 170,
   "name": "sprite_pos_10",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 171,
   "name": "sprite_pos_11",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 172,
   "name": "sprite_pos_12",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 173,
   "name": "sprite_pos_13",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 174,
   "name": "sprite_pos_14",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 175,
   "name": "sprite_pos_15",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 176,
   "name": "sprite_goal",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 177,
   "name": "sprite_goal_1",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 178,
   "name": "sprite_goal_2",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 179,
   "name": "sprite_goal_3",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 180,
   "name": "sprite_goal_4",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 181,
   "name": "sprite_goal_5",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 182,
   "name": "sprite_goal_6",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 184,
   "name": "sprite_goal_8",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 185,
   "name": "sprite_goal_9",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 186,
   "name": "sprite_goal_10",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 187,
   "name": "sprite_goal_11",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 188,
   "name": "sprite_goal_12",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 189,
   "name": "sprite_goal_13",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 190,
   "name": "sprite_goal_14",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 191,
   "name": "sprite_goal_15",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 192,
   "name": "map_sprite_shape",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 196,
   "name": "map_sprite_shape_4",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 200,
   "name": "bldg_state",
   "type": "ZeroPageField",
   "kind": "user"
  },
  {
   "address": 207,
   "name": "bldg_state_7",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 208,
   "name": "bldg_state_8",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 210,
   "name": "bldg_state_zuul",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 215,
   "name": "bldg_state_15",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 220,
   "name": "tmp_dc",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 221,
   "name": "mus_tmp_dd",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 222,
   "name": "mus_tmp_de",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 223,
   "name": "mus_tmp_df",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 224,
   "name": "mus_tmp_e0",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 225,
   "name": "mus_sid_offset",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 226,
   "name": "frame_flag",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 227,
   "name": "mus_track_ptr",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 228,
   "name": "mus_track_ptr_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 229,
   "name": "mus_pattern_ptr",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 230,
   "name": "mus_pattern_ptr_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 231,
   "name": "sfx_ptr",
   "type": "ZeroPagePointer",
   "kind": "user"
  },
  {
   "address": 232,
   "name": "sfx_ptr_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 233,
   "name": "sfx_vector",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 234,
   "name": "sfx_vector_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 235,
   "name": "speech_busy",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 236,
   "name": "zp_unused_EC",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 245,
   "name": "speech_frame_ptr",
   "type": "ZeroPagePointer",
   "kind": "user"
  },
  {
   "address": 246,
   "name": "speech_frame_ptr_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 247,
   "name": "speech_pitch_ptr",
   "type": "ZeroPagePointer",
   "kind": "user"
  },
  {
   "address": 248,
   "name": "speech_pitch_ptr_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 249,
   "name": "speech_ptr",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 250,
   "name": "speech_ptr_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 251,
   "name": "speech_level_ptr",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 252,
   "name": "speech_level_ptr_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 253,
   "name": "speech_half_a",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 254,
   "name": "speech_half_b",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 255,
   "name": "speech_gap",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 512,
   "name": "car_pic_compact",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 768,
   "name": "car_pic_compact_p2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 792,
   "name": "car_pic_compact_0318",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 793,
   "name": "car_pic_compact_0319",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1024,
   "name": "car_pic_compact_p3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 1280,
   "name": "car_pic_hearse",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2048,
   "name": "car_pic_wagon",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2560,
   "name": "car_pic_wagon_p3",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 2816,
   "name": "car_pic_hiperf",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3584,
   "name": "small_car_compact",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3680,
   "name": "small_car_hearse",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3776,
   "name": "small_car_wagon",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3872,
   "name": "small_car_hiperf",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3968,
   "name": "zuul_charset",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 4096,
   "name": "zuul_charset_p2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 5120,
   "name": "zuul_charset_p3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 5504,
   "name": "zuul_screen_map",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 6344,
   "name": "zuul_screen_row21",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 6384,
   "name": "zuul_temple_map",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7224,
   "name": "zuul_climb_row21",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 7264,
   "name": "zuul_colours",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 8104,
   "name": "bldg_charset",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9112,
   "name": "bldg_screen_map",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9952,
   "name": "bldg_colours",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10792,
   "name": "bldg_colours_row21",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 10832,
   "name": "map_charset",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 11856,
   "name": "map_charset_p2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12368,
   "name": "facade_chars_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12600,
   "name": "facade_chars_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12808,
   "name": "facade_chars_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13056,
   "name": "zuul_climb_scroll",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13058,
   "name": "j_3302",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 13304,
   "name": "b_33F8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13318,
   "name": "b_3406",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13329,
   "name": "b_3411",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13346,
   "name": "b_3422",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13380,
   "name": "b_3444",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13398,
   "name": "tower_row_ends",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13401,
   "name": "tower_rows",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13521,
   "name": "tower_row_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13561,
   "name": "road_scroll_left",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13578,
   "name": "b_350A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13678,
   "name": "r_356E",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 13679,
   "name": "road_scroll_right",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13697,
   "name": "b_3581",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13797,
   "name": "r_35E5",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 13798,
   "name": "place_car_picture",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13800,
   "name": "place_car_picture_at",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13804,
   "name": "b_35EC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13827,
   "name": "b_3603",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13848,
   "name": "b_3618",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 13856,
   "name": "idx_logo_stripes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13860,
   "name": "scroller_text",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13988,
   "name": "custom_glyphs",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14100,
   "name": "logo_stripe_colours",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14109,
   "name": "vic_init_table",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14155,
   "name": "key_col_masks",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14163,
   "name": "key_row_selects",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14171,
   "name": "small_car_chars",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14175,
   "name": "small_car_ptrs",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14176,
   "name": "small_car_ptrs_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14183,
   "name": "map_street_signs",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14194,
   "name": "map_sign_row2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14205,
   "name": "map_sign_row3",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14216,
   "name": "map_sign_row4",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14227,
   "name": "map_sprite_frames",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14235,
   "name": "drive_sprite_frames",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14243,
   "name": "drive_sprite_pos",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14251,
   "name": "drive_sprite_pos_4_7",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14259,
   "name": "map_sprite_start",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14260,
   "name": "map_sprite_start_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14275,
   "name": "map_sprite_goal",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14276,
   "name": "map_sprite_goal_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14283,
   "name": "map_roamer_goal",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14291,
   "name": "map_grid",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14292,
   "name": "map_grid_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14294,
   "name": "map_grid_next",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14301,
   "name": "map_grid_rows",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14303,
   "name": "map_street_windows",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14304,
   "name": "map_street_windows_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14313,
   "name": "crossing_x",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14314,
   "name": "crossing_x_list",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14320,
   "name": "crossing_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14321,
   "name": "crossing_y_list",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14326,
   "name": "crossing_steps",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14327,
   "name": "crossing_steps_dy",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14334,
   "name": "gate_trigger_points",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14335,
   "name": "gate_trigger_points_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14338,
   "name": "zuul_door_points",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14339,
   "name": "zuul_door_points_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14342,
   "name": "vacuum_y_by_car",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14346,
   "name": "bldg_sprite_frames",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14354,
   "name": "top_sprite_frames",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14362,
   "name": "state_handlers",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14363,
   "name": "state_handlers_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14490,
   "name": "zuul_label",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14493,
   "name": "zuul_label_last",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14494,
   "name": "key_chars",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14558,
   "name": "txt_car_compact",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14626,
   "name": "txt_car_hearse",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14698,
   "name": "txt_car_wagon",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14774,
   "name": "txt_car_hiperf",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14852,
   "name": "txt_pk_energy",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14870,
   "name": "msg_no_traps",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14912,
   "name": "msg_men_out",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14968,
   "name": "msg_no_bait",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14985,
   "name": "msg_discharged",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15024,
   "name": "msg_mm_alert",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15045,
   "name": "msg_mm_damage",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15137,
   "name": "msg_mayor_award",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15199,
   "name": "msg_car_full",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15232,
   "name": "msg_crossed_streams",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15324,
   "name": "sfx_stop",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15337,
   "name": "sfx_tick",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15363,
   "name": "b_3C03",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15366,
   "name": "b_3C06",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15386,
   "name": "b_3C1A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15399,
   "name": "b_3C27",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15402,
   "name": "j_3C2A",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 15408,
   "name": "r_3C30",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 15409,
   "name": "sfx_run",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15443,
   "name": "b_3C53",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15451,
   "name": "sfx_call_handler",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15457,
   "name": "sfx_fetch",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15470,
   "name": "b_3C6E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15474,
   "name": "sfx_cmd_wait",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15486,
   "name": "sfx_gate_on",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15498,
   "name": "sfx_cmd_gate_note",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15501,
   "name": "sfx_cmd_note",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15524,
   "name": "sfx_cmd_sub",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15544,
   "name": "sfx_sub_adsr",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15557,
   "name": "sfx_sub_slide",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15564,
   "name": "sfx_sub_loop",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15583,
   "name": "r_3CDF",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 15584,
   "name": "sfx_cmd_trill",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15592,
   "name": "sfx_cmd_count",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15600,
   "name": "sfx_cmd_pulse",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15614,
   "name": "sfx_cmd_wave",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15631,
   "name": "sfx_cmd_bend",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15641,
   "name": "b_3D19",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15652,
   "name": "sfx_start",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15704,
   "name": "b_3D58",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15707,
   "name": "sfx_nop",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15708,
   "name": "sfx_durations",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15724,
   "name": "unused_bitmasks",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15732,
   "name": "sfx_waveforms",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15747,
   "name": "sfx_handlers_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15762,
   "name": "sfx_handlers_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15778,
   "name": "sfx_sub_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15786,
   "name": "sfx_sub_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15796,
   "name": "sfx_script_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15801,
   "name": "sfx_script_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15806,
   "name": "sfx_scripts",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15866,
   "name": "sfx_note_freq_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15962,
   "name": "sfx_freq_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16058,
   "name": "bldg_colour_addr_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16078,
   "name": "bldg_colour_addr_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16098,
   "name": "bldg_state_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16102,
   "name": "bldg_sprite_goal",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16110,
   "name": "bldg_sprite_goal_4_7",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16112,
   "name": "bldg_goal_s6_x",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 16113,
   "name": "bldg_goal_s6_y",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 16118,
   "name": "bldg_sprite_pos",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16126,
   "name": "bldg_sprite_pos_4_7",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16134,
   "name": "map_avenue_signs",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16173,
   "name": "map_block_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16313,
   "name": "txt_status_report",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16381,
   "name": "unused_3FFD",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17984,
   "name": "f_4640",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 17985,
   "name": "f_4641",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 17986,
   "name": "f_4642",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 18240,
   "name": "f_4740",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 18241,
   "name": "f_4741",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 18242,
   "name": "f_4742",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 20224,
   "name": "f_4F00",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 20225,
   "name": "f_4F01",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 20226,
   "name": "f_4F02",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 20480,
   "name": "f_5000",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 20481,
   "name": "f_5001",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 20482,
   "name": "f_5002",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21504,
   "name": "f_5400",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21530,
   "name": "f_541A",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21544,
   "name": "f_5428",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21584,
   "name": "f_5450",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21589,
   "name": "f_5455",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21610,
   "name": "f_546A",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21624,
   "name": "f_5478",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21629,
   "name": "f_547D",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21663,
   "name": "f_549F",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21664,
   "name": "f_54A0",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21669,
   "name": "f_54A5",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21703,
   "name": "f_54C7",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21704,
   "name": "f_54C8",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21743,
   "name": "f_54EF",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21744,
   "name": "f_54F0",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21760,
   "name": "f_5500",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21783,
   "name": "f_5517",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21784,
   "name": "f_5518",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21823,
   "name": "f_553F",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21824,
   "name": "f_5540",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21837,
   "name": "f_554D",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21863,
   "name": "f_5567",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21864,
   "name": "f_5568",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21903,
   "name": "f_558F",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21904,
   "name": "f_5590",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21943,
   "name": "f_55B7",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21944,
   "name": "f_55B8",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21964,
   "name": "f_55CC",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21967,
   "name": "a_55CF",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 21983,
   "name": "f_55DF",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 21984,
   "name": "f_55E0",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22016,
   "name": "f_5600",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22023,
   "name": "f_5607",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22024,
   "name": "f_5608",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22063,
   "name": "f_562F",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22064,
   "name": "f_5630",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22103,
   "name": "f_5657",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22104,
   "name": "f_5658",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22143,
   "name": "f_567F",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22144,
   "name": "f_5680",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22183,
   "name": "f_56A7",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22184,
   "name": "f_56A8",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22208,
   "name": "f_56C0",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22223,
   "name": "f_56CF",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22224,
   "name": "f_56D0",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22258,
   "name": "f_56F2",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22263,
   "name": "f_56F7",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22264,
   "name": "f_56F8",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22298,
   "name": "f_571A",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22304,
   "name": "f_5720",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22318,
   "name": "f_572E",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22338,
   "name": "f_5742",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22344,
   "name": "f_5748",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22345,
   "name": "f_5749",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22383,
   "name": "f_576F",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22384,
   "name": "f_5770",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22385,
   "name": "f_5771",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22403,
   "name": "a_5783",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 22404,
   "name": "a_5784",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 22405,
   "name": "a_5785",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 22406,
   "name": "a_5786",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 22414,
   "name": "f_578E",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22464,
   "name": "f_57C0",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22520,
   "name": "a_57F8",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 22525,
   "name": "a_57FD",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 22527,
   "name": "a_57FF",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 22648,
   "name": "f_5878",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22744,
   "name": "f_58D8",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 22912,
   "name": "f_5980",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 23040,
   "name": "f_5A00",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 23144,
   "name": "f_5A68",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 23344,
   "name": "f_5B30",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 24568,
   "name": "f_5FF8",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 24576,
   "name": "cold_start",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 24618,
   "name": "b_602A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 24640,
   "name": "b_6040",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 24656,
   "name": "b_6050",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 24668,
   "name": "b_605C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 24671,
   "name": "b_605F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 24692,
   "name": "b_6074",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 24738,
   "name": "b_60A2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 24760,
   "name": "b_60B8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 24771,
   "name": "b_60C3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 24784,
   "name": "b_60D0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 24803,
   "name": "b_60E3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 24819,
   "name": "b_60F3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 24843,
   "name": "rle_unpack",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 24858,
   "name": "b_611A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 24875,
   "name": "b_612B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 24882,
   "name": "b_6132",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 24899,
   "name": "rle_next_source",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 24905,
   "name": "r_6149",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 24906,
   "name": "rle_next_dest",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 24912,
   "name": "r_6150",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 24913,
   "name": "build_mirrored_sprites",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 24915,
   "name": "b_6153",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 24986,
   "name": "draw_title_screen",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 25014,
   "name": "b_61B6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25036,
   "name": "b_61CC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25062,
   "name": "b_61E6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25078,
   "name": "b_61F6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25117,
   "name": "b_621D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25119,
   "name": "b_621F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25156,
   "name": "b_6244",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25244,
   "name": "b_629C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25251,
   "name": "b_62A3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25254,
   "name": "b_62A6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25262,
   "name": "b_62AE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25275,
   "name": "b_62BB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25277,
   "name": "b_62BD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25349,
   "name": "title_loop",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 25351,
   "name": "b_6307",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25384,
   "name": "name_entered_flag",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 25385,
   "name": "title_frame_work",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 25419,
   "name": "b_634B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25427,
   "name": "b_6353",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25443,
   "name": "b_6363",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25451,
   "name": "b_636B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25466,
   "name": "b_637A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25474,
   "name": "b_6382",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25477,
   "name": "b_6385",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25494,
   "name": "b_6396",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25503,
   "name": "b_639F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25512,
   "name": "b_63A8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25519,
   "name": "silence_sid",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 25523,
   "name": "b_63B3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25530,
   "name": "lyric_timer_tick",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 25556,
   "name": "b_63D4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25558,
   "name": "r_63D6",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 25559,
   "name": "music_skip_ahead",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 25561,
   "name": "b_63D9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25616,
   "name": "b_6410",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25619,
   "name": "b_6413",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25633,
   "name": "b_6421",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25637,
   "name": "nmi_restore_handler",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25657,
   "name": "b_6439",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 25659,
   "name": "lyric_split_lines",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25667,
   "name": "lyric_text",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26354,
   "name": "lyric_text_part2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26864,
   "name": "lyric_line_times",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26976,
   "name": "title_charset_logo",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27472,
   "name": "title_charset_sign",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28336,
   "name": "logo_map_row0",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 28366,
   "name": "logo_map_row1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 28396,
   "name": "logo_map_row2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 28426,
   "name": "no_ghost_sign_map",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28642,
   "name": "start_game",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 28652,
   "name": "game_frame_loop",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 28675,
   "name": "frame_timers_and_steer",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 28689,
   "name": "b_7011",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 28703,
   "name": "b_701F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 28708,
   "name": "frame_drive_fine_scroll",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 28748,
   "name": "frame_flash_sprite2",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 28760,
   "name": "b_7058",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 28769,
   "name": "frame_read_input",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 28784,
   "name": "b_7070",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 28812,
   "name": "frame_idle_timer",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 28834,
   "name": "j_70A2",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 28836,
   "name": "b_70A4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 28842,
   "name": "b_70AA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 28858,
   "name": "frame_pause_key",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 28870,
   "name": "b_70C6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 28887,
   "name": "b_70D7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 28910,
   "name": "frame_pause_gate",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 28931,
   "name": "b_7103",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 28934,
   "name": "frame_colour_buildings",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 28944,
   "name": "b_7110",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 28952,
   "name": "b_7118",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 28985,
   "name": "b_7139",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 28988,
   "name": "b_713C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29002,
   "name": "b_714A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29003,
   "name": "b_714B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29005,
   "name": "b_714D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29033,
   "name": "b_7169",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29045,
   "name": "frame_status_report",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 29058,
   "name": "b_7182",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29080,
   "name": "b_7198",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29092,
   "name": "b_71A4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29105,
   "name": "b_71B1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29111,
   "name": "b_71B7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29121,
   "name": "b_71C1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29124,
   "name": "b_71C4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29133,
   "name": "b_71CD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29174,
   "name": "frame_ticker_scroll",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 29212,
   "name": "b_721C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29225,
   "name": "b_7229",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29236,
   "name": "b_7234",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29259,
   "name": "b_724B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29265,
   "name": "b_7251",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29282,
   "name": "b_7262",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29293,
   "name": "frame_pk_balance_line",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 29338,
   "name": "b_729A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29361,
   "name": "b_72B1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29373,
   "name": "frame_type_message",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 29393,
   "name": "b_72D1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29395,
   "name": "b_72D3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29407,
   "name": "b_72DF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29430,
   "name": "b_72F6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29436,
   "name": "b_72FC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29466,
   "name": "b_731A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29501,
   "name": "b_733D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29504,
   "name": "b_7340",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29511,
   "name": "frame_line_input",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 29559,
   "name": "b_7377",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29574,
   "name": "b_7386",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29577,
   "name": "b_7389",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29586,
   "name": "b_7392",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29590,
   "name": "b_7396",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29593,
   "name": "frame_shop_credit",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 29599,
   "name": "b_739F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29629,
   "name": "frame_building_timers",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 29638,
   "name": "b_73C6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29644,
   "name": "b_73CC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29670,
   "name": "b_73E6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29678,
   "name": "b_73EE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29680,
   "name": "b_73F0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29683,
   "name": "frame_pk_rise",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 29708,
   "name": "frame_spawn_haunts",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 29719,
   "name": "b_7417",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29721,
   "name": "b_7419",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29731,
   "name": "b_7423",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29742,
   "name": "b_742E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29747,
   "name": "b_7433",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29757,
   "name": "b_743D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29761,
   "name": "b_7441",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29782,
   "name": "b_7456",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29791,
   "name": "b_745F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29805,
   "name": "frame_dispatch_state",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 29822,
   "name": "st00_interview_start",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29851,
   "name": "b_749B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29858,
   "name": "b_74A2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29871,
   "name": "b_74AF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29883,
   "name": "st01_name_entered",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29885,
   "name": "b_74BD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29901,
   "name": "j_74CD",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 29912,
   "name": "st02_account_answer",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29930,
   "name": "b_74EA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29946,
   "name": "b_74FA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 29957,
   "name": "st03_account_number",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30013,
   "name": "b_753D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 30020,
   "name": "st04_invalid_wait",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30024,
   "name": "j_7548",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 30044,
   "name": "b_755C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 30047,
   "name": "st05_reask_account",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30066,
   "name": "st06_vehicle_clear",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30078,
   "name": "st07_vehicle_list",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30090,
   "name": "st08_you_have",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30114,
   "name": "st09_show_balance",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30128,
   "name": "st0A_vehicle_prompt",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30143,
   "name": "b_75BF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 30146,
   "name": "st0B_car_options",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 30167,
   "name": "b_75D7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 30229,
   "name": "petscii_to_screen",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 30237,
   "name": "b_761D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 30244,
   "name": "r_7624",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 30245,
   "name": "st0B_vehicle_choice",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30283,
   "name": "j_764B",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 30290,
   "name": "b_7652",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 30293,
   "name": "j_7655",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 30296,
   "name": "j_7658",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 30305,
   "name": "st0C_build_car",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30311,
   "name": "build_car_charset",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 30335,
   "name": "b_767F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 30352,
   "name": "b_7690",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 30367,
   "name": "b_769F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 30396,
   "name": "j_76BC",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 30399,
   "name": "st0D_draw_car",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30405,
   "name": "st0E_shop_page",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30442,
   "name": "b_76EA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 30464,
   "name": "b_7700",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 30477,
   "name": "b_770D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 30497,
   "name": "b_7721",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 30537,
   "name": "st0F_shop_forklift",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30539,
   "name": "b_774B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 30615,
   "name": "b_7797",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 30647,
   "name": "b_77B7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 30682,
   "name": "b_77DA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 30723,
   "name": "b_7803",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 30730,
   "name": "shop_fire_at_shelf",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 30791,
   "name": "b_7847",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 30816,
   "name": "shop_forklift_stick",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 30829,
   "name": "b_786D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 30849,
   "name": "b_7881",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 30866,
   "name": "b_7892",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 30894,
   "name": "b_78AE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 30913,
   "name": "j_78C1",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 30936,
   "name": "shop_fire_at_car",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 30967,
   "name": "b_78F7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 30973,
   "name": "b_78FD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 30976,
   "name": "b_7900",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31027,
   "name": "b_7933",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31038,
   "name": "shop_paint_item_in_car",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 31058,
   "name": "b_7952",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31075,
   "name": "b_7963",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31101,
   "name": "b_797D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31130,
   "name": "b_799A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31153,
   "name": "j_79B1",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 31176,
   "name": "b_79C8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31210,
   "name": "b_79EA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31246,
   "name": "b_7A0E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31323,
   "name": "shop_keys",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 31342,
   "name": "b_7A6E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31345,
   "name": "b_7A71",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31385,
   "name": "b_7A99",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31388,
   "name": "st10_map_setup",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31390,
   "name": "b_7A9E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31415,
   "name": "b_7AB7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31445,
   "name": "st11_draw_map",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31493,
   "name": "b_7B05",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31510,
   "name": "b_7B16",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31512,
   "name": "b_7B18",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31523,
   "name": "b_7B23",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31538,
   "name": "b_7B32",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31567,
   "name": "b_7B4F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31578,
   "name": "b_7B5A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31629,
   "name": "b_7B8D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31659,
   "name": "st12_city_map",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31661,
   "name": "b_7BAD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31694,
   "name": "b_7BCE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31702,
   "name": "b_7BD6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31714,
   "name": "b_7BE2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31732,
   "name": "b_7BF4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31744,
   "name": "b_7C00",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31770,
   "name": "b_7C1A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31786,
   "name": "b_7C2A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31790,
   "name": "map_zuul_meeting",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 31792,
   "name": "b_7C30",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31811,
   "name": "b_7C43",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31826,
   "name": "b_7C52",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31837,
   "name": "b_7C5D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31866,
   "name": "b_7C7A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31868,
   "name": "b_7C7C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31877,
   "name": "map_move_sprites",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 31885,
   "name": "b_7C8D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31898,
   "name": "b_7C9A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31910,
   "name": "b_7CA6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31917,
   "name": "map_logo_on_streets",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 31919,
   "name": "b_7CAF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31933,
   "name": "b_7CBD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31950,
   "name": "b_7CCE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31964,
   "name": "j_7CDC",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 31972,
   "name": "b_7CE4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31978,
   "name": "b_7CEA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 31992,
   "name": "b_7CF8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32009,
   "name": "b_7D09",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32023,
   "name": "j_7D17",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 32031,
   "name": "b_7D1F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32035,
   "name": "map_building_under_logo",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 32057,
   "name": "b_7D39",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32127,
   "name": "b_7D7F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32148,
   "name": "b_7D94",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32150,
   "name": "b_7D96",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32153,
   "name": "b_7D99",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32163,
   "name": "j_7DA3",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 32170,
   "name": "map_roamer_contact",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32172,
   "name": "b_7DAC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32224,
   "name": "b_7DE0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32246,
   "name": "b_7DF6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32249,
   "name": "b_7DF9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32255,
   "name": "map_gatekeepers_wander",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32265,
   "name": "b_7E09",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32267,
   "name": "b_7E0B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32279,
   "name": "b_7E17",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32284,
   "name": "b_7E1C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32296,
   "name": "b_7E28",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32338,
   "name": "b_7E52",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32341,
   "name": "map_fire_select",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32369,
   "name": "b_7E71",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32372,
   "name": "b_7E74",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32394,
   "name": "b_7E8A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32413,
   "name": "b_7E9D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32425,
   "name": "b_7EA9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32439,
   "name": "b_7EB7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32451,
   "name": "b_7EC3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32458,
   "name": "b_7ECA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32469,
   "name": "b_7ED5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32472,
   "name": "map_marshmallow_check",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 32553,
   "name": "map_route_dots",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 32608,
   "name": "b_7F60",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32624,
   "name": "map_bait_key",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 32646,
   "name": "b_7F86",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32710,
   "name": "b_7FC6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32713,
   "name": "st13_drive_setup",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32717,
   "name": "b_7FCD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32752,
   "name": "b_7FF0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32760,
   "name": "b_7FF8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32769,
   "name": "st13_drive_setup_tail",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 32795,
   "name": "b_801B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32822,
   "name": "st14_drive_screen",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32835,
   "name": "b_8043",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32857,
   "name": "b_8059",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32883,
   "name": "st15_driving",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32920,
   "name": "b_8098",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32924,
   "name": "b_809C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32943,
   "name": "b_80AF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32975,
   "name": "b_80CF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32978,
   "name": "b_80D2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 32984,
   "name": "j_80D8",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 33019,
   "name": "b_80FB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33025,
   "name": "b_8101",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33035,
   "name": "b_810B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33049,
   "name": "b_8119",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33075,
   "name": "b_8133",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33089,
   "name": "b_8141",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33148,
   "name": "b_817C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33164,
   "name": "b_818C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33166,
   "name": "b_818E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33229,
   "name": "b_81CD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33237,
   "name": "b_81D5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33245,
   "name": "b_81DD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33258,
   "name": "b_81EA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33268,
   "name": "b_81F4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33275,
   "name": "b_81FB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33307,
   "name": "b_821B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33315,
   "name": "b_8223",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33353,
   "name": "b_8249",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33378,
   "name": "b_8262",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33393,
   "name": "b_8271",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33401,
   "name": "st16_arrive_clear",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33410,
   "name": "b_8282",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33417,
   "name": "b_8289",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33433,
   "name": "b_8299",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33455,
   "name": "st17_draw_building",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33485,
   "name": "b_82CD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33518,
   "name": "b_82EE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33568,
   "name": "b_8320",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33580,
   "name": "b_832C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33588,
   "name": "b_8334",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33618,
   "name": "b_8352",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33642,
   "name": "b_836A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33684,
   "name": "b_8394",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33696,
   "name": "b_83A0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33741,
   "name": "b_83CD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33745,
   "name": "b_83D1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33762,
   "name": "b_83E2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33823,
   "name": "b_841F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33831,
   "name": "b_8427",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33847,
   "name": "b_8437",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33863,
   "name": "b_8447",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33873,
   "name": "b_8451",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33889,
   "name": "b_8461",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33908,
   "name": "b_8474",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 33975,
   "name": "b_84B7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34020,
   "name": "b_84E4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34027,
   "name": "b_84EB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34034,
   "name": "st18_carry_trap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34082,
   "name": "b_8522",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34091,
   "name": "st19_place_man1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34143,
   "name": "b_855F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34146,
   "name": "st1A_place_man2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34200,
   "name": "b_8598",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34203,
   "name": "st1B_streams_on",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34213,
   "name": "b_85A5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34233,
   "name": "b_85B9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34239,
   "name": "b_85BF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34248,
   "name": "b_85C8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34260,
   "name": "b_85D4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34271,
   "name": "b_85DF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34306,
   "name": "b_8602",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34325,
   "name": "b_8615",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34334,
   "name": "b_861E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34398,
   "name": "b_865E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34407,
   "name": "j_8667",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 34434,
   "name": "b_8682",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34450,
   "name": "b_8692",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34461,
   "name": "b_869D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34464,
   "name": "st1C_trap_open",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34520,
   "name": "b_86D8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34527,
   "name": "b_86DF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34558,
   "name": "b_86FE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34561,
   "name": "b_8701",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34564,
   "name": "st1D_slimer_escapes",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34569,
   "name": "j_8709",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 34601,
   "name": "j_8729",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 34608,
   "name": "b_8730",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34610,
   "name": "b_8732",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34638,
   "name": "b_874E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34645,
   "name": "b_8755",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34651,
   "name": "st1E_slimer_caught",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34692,
   "name": "b_8784",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34708,
   "name": "st1F_trap_closes",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34723,
   "name": "b_87A3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34735,
   "name": "b_87AF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34777,
   "name": "b_87D9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34779,
   "name": "b_87DB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34793,
   "name": "b_87E9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34804,
   "name": "b_87F4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34820,
   "name": "b_8804",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34840,
   "name": "b_8818",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34851,
   "name": "men_walk_to_trap",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 34871,
   "name": "b_8837",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34874,
   "name": "b_883A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34892,
   "name": "b_884C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34930,
   "name": "b_8872",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34933,
   "name": "st20_men_to_trap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34963,
   "name": "b_8893",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34966,
   "name": "st21_men_to_car",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34979,
   "name": "b_88A3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34995,
   "name": "b_88B3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 34998,
   "name": "st22_ghq_restock",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35036,
   "name": "st23_ghq_men_out",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35056,
   "name": "b_88F0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35082,
   "name": "b_890A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35090,
   "name": "b_8912",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35106,
   "name": "b_8922",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35109,
   "name": "st24_mm_gathering",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35111,
   "name": "b_8927",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35130,
   "name": "b_893A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35150,
   "name": "b_894E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35170,
   "name": "b_8962",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35181,
   "name": "b_896D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35184,
   "name": "st25_mm_stomps",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35216,
   "name": "b_8990",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35289,
   "name": "b_89D9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35292,
   "name": "st26_mm_baited",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35328,
   "name": "b_8A00",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35331,
   "name": "st27_roamers_return",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35333,
   "name": "b_8A05",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35346,
   "name": "b_8A12",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35357,
   "name": "b_8A1D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35369,
   "name": "b_8A29",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35372,
   "name": "st28_zuul_street_setup",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35378,
   "name": "b_8A32",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35395,
   "name": "b_8A43",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35434,
   "name": "zuul_next_man",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 35456,
   "name": "zuul_man_control",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 35464,
   "name": "b_8A88",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35470,
   "name": "b_8A8E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35526,
   "name": "b_8AC6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35563,
   "name": "b_8AEB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35565,
   "name": "b_8AED",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35571,
   "name": "b_8AF3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35574,
   "name": "zuul_street_outcome",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 35584,
   "name": "b_8B00",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35591,
   "name": "st29_zuul_street",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35624,
   "name": "b_8B28",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35645,
   "name": "b_8B3D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35677,
   "name": "b_8B5D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35703,
   "name": "b_8B77",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35717,
   "name": "b_8B85",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35775,
   "name": "st2A_zuul_pause",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35784,
   "name": "b_8BC8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35788,
   "name": "b_8BCC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35797,
   "name": "st2B_zuul_climb",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35826,
   "name": "b_8BF2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35840,
   "name": "b_8C00",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35868,
   "name": "b_8C1C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35871,
   "name": "st2C_close_portal",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35913,
   "name": "b_8C49",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35936,
   "name": "b_8C60",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35953,
   "name": "b_8C71",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 35956,
   "name": "st2D_end_foreclosed",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35974,
   "name": "st2E_end_good_try",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35990,
   "name": "st2F_print_name",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35996,
   "name": "st30_end_zuul_took_city",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36004,
   "name": "st31_end_credit_text",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36012,
   "name": "st32_end_credit_limit",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36030,
   "name": "st33_end_account_text",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36038,
   "name": "st34_end_account_number",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36074,
   "name": "st35_end_write_down",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36086,
   "name": "st36_end_congratulations",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36102,
   "name": "st37_print_name",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36108,
   "name": "st38_end_portal_closed",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36120,
   "name": "st39_end_speech",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36130,
   "name": "b_8D22",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36137,
   "name": "st3A_wait_restart",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36150,
   "name": "b_8D36",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36154,
   "name": "st3B_start_balance_text",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36162,
   "name": "st3C_show_start_balance",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36164,
   "name": "b_8D44",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36189,
   "name": "st3D_end_balance_text",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36197,
   "name": "st3E_show_end_balance",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36223,
   "name": "st3F_to_end_speech",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36230,
   "name": "next_state",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 36237,
   "name": "stay_in_state",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 36240,
   "name": "unused_8d90",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36246,
   "name": "end_page_setup",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 36257,
   "name": "b_8DA1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36281,
   "name": "speak_phrase",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 36293,
   "name": "b_8DC5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36301,
   "name": "b_8DCD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36316,
   "name": "b_8DDC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36318,
   "name": "b_8DDE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36338,
   "name": "b_8DF2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36358,
   "name": "b_8E06",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36385,
   "name": "b_8E21",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36391,
   "name": "b_8E27",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36444,
   "name": "b_8E5C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36458,
   "name": "b_8E6A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36460,
   "name": "b_8E6C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36470,
   "name": "raster_irq",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36490,
   "name": "b_8E8A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36500,
   "name": "b_8E94",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36507,
   "name": "b_8E9B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36519,
   "name": "ball_hop_steps",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 36535,
   "name": "irq_lyric_split",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 36545,
   "name": "b_8EC1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36552,
   "name": "b_8EC8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36561,
   "name": "b_8ED1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36564,
   "name": "irq_game",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 36574,
   "name": "b_8EDE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36589,
   "name": "b_8EED",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36626,
   "name": "b_8F12",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36628,
   "name": "b_8F14",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36671,
   "name": "b_8F3F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36675,
   "name": "b_8F43",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36689,
   "name": "b_8F51",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36736,
   "name": "b_8F80",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36800,
   "name": "j_8FC0",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 36824,
   "name": "quiet_cias",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 36866,
   "name": "init_game_vars",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 36868,
   "name": "init_game_vars_n",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 36883,
   "name": "b_9013",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36904,
   "name": "b_9028",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36915,
   "name": "b_9033",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36944,
   "name": "rts_delay",
   "type": "Return",
   "kind": "user"
  },
  {
   "address": 36945,
   "name": "init_values_33",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 36963,
   "name": "trim_leading_spaces",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 36965,
   "name": "b_9065",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36975,
   "name": "b_906F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36977,
   "name": "b_9071",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 36991,
   "name": "r_907F",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 36992,
   "name": "place_proton_streams",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 37003,
   "name": "b_908B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 37062,
   "name": "b_90C6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 37064,
   "name": "b_90C8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 37079,
   "name": "b_90D7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 37094,
   "name": "j_90E6",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 37102,
   "name": "account_encode",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 37124,
   "name": "b_9104",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 37126,
   "name": "b_9106",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 37154,
   "name": "b_9122",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 37158,
   "name": "b_9126",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 37197,
   "name": "b_914D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 37205,
   "name": "account_decode",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 37215,
   "name": "b_915F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 37222,
   "name": "b_9166",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 37225,
   "name": "b_9169",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 37257,
   "name": "b_9189",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 37259,
   "name": "b_918B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 37277,
   "name": "b_919D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 37286,
   "name": "account_lfsr_step",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 37302,
   "name": "account_name_sum",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 37308,
   "name": "b_91BC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 37320,
   "name": "singalong_ball_step",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 37372,
   "name": "b_91FC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 37387,
   "name": "b_920B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 37394,
   "name": "b_9212",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 37405,
   "name": "b_921D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 37429,
   "name": "b_9235",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 37485,
   "name": "b_926D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 37532,
   "name": "singalong_ball_reset",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 37564,
   "name": "singalong_ball_script",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 37857,
   "name": "music_play_off",
   "type": "Return",
   "kind": "user"
  },
  {
   "address": 37858,
   "name": "music_restart",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 37860,
   "name": "b_93E4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 37872,
   "name": "music_play",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 37878,
   "name": "j_93F6",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 37914,
   "name": "b_941A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 37917,
   "name": "b_941D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 37920,
   "name": "b_9420",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 37937,
   "name": "b_9431",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 37940,
   "name": "b_9434",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38009,
   "name": "b_9479",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38011,
   "name": "b_947B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38017,
   "name": "b_9481",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38031,
   "name": "b_948F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38064,
   "name": "b_94B0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38066,
   "name": "b_94B2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38118,
   "name": "b_94E6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38140,
   "name": "b_94FC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38143,
   "name": "j_94FF",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 38175,
   "name": "j_951F",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 38198,
   "name": "b_9536",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38219,
   "name": "b_954B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38248,
   "name": "j_9568",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 38267,
   "name": "b_957B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38284,
   "name": "j_958C",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 38290,
   "name": "r_9592",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 38291,
   "name": "music_voice3_busy",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 38306,
   "name": "b_95A2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38308,
   "name": "r_95A4",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 38309,
   "name": "clear_sprite_state",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 38315,
   "name": "b_95AB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38329,
   "name": "clear_screen",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 38333,
   "name": "b_95BD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38372,
   "name": "b_95E4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38378,
   "name": "r_95EA",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 38379,
   "name": "draw_map_building_row",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 38391,
   "name": "b_95F7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38395,
   "name": "b_95FB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38407,
   "name": "b_9607",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38438,
   "name": "b_9626",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38453,
   "name": "r_9635",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 38454,
   "name": "money_subtract",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 38480,
   "name": "b_9650",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38484,
   "name": "money_compare",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 38500,
   "name": "money_add",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 38528,
   "name": "b_9680",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38530,
   "name": "print_lyric_line",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 38534,
   "name": "b_9686",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38553,
   "name": "b_9699",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38563,
   "name": "b_96A3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38569,
   "name": "b_96A9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38578,
   "name": "b_96B2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38591,
   "name": "b_96BF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38601,
   "name": "r_96C9",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 38602,
   "name": "read_joystick_port1",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 38631,
   "name": "r_96E7",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 38632,
   "name": "scan_keyboard",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 38667,
   "name": "b_970B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38703,
   "name": "b_972F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38737,
   "name": "b_9751",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38741,
   "name": "r_9755",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 38742,
   "name": "bottom_scroller_text",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 38748,
   "name": "b_975C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38764,
   "name": "b_976C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38772,
   "name": "b_9774",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38786,
   "name": "b_9782",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38795,
   "name": "b_978B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38801,
   "name": "b_9791",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38811,
   "name": "b_979B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38817,
   "name": "bottom_scroller_logo_sprite",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 38864,
   "name": "b_97D0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38904,
   "name": "b_97F8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38936,
   "name": "b_9818",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38939,
   "name": "b_981B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38962,
   "name": "blank_leading_zero_digit",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 38972,
   "name": "r_983C",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 38973,
   "name": "restore_sprites_4_7",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 38975,
   "name": "b_983F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 38993,
   "name": "reset_sprite_home",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 38999,
   "name": "b_9857",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39006,
   "name": "b_985E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39019,
   "name": "b_986B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39029,
   "name": "b_9875",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39039,
   "name": "b_987F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39049,
   "name": "b_9889",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39059,
   "name": "b_9893",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39061,
   "name": "pk_add_hundreds",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39063,
   "name": "pk_add_hundreds_carry",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39097,
   "name": "b_98B9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39108,
   "name": "b_98C4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39114,
   "name": "b_98CA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39121,
   "name": "b_98D1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39139,
   "name": "b_98E3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39145,
   "name": "b_98E9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39147,
   "name": "stream_x_at_slimer",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39151,
   "name": "b_98EF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39178,
   "name": "b_990A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39192,
   "name": "slimer_side_of_streams",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39194,
   "name": "b_991A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39204,
   "name": "b_9924",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39211,
   "name": "streams_confine_slimer",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39232,
   "name": "b_9940",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39238,
   "name": "b_9946",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39240,
   "name": "b_9948",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39263,
   "name": "b_995F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39266,
   "name": "b_9962",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39276,
   "name": "j_996C",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 39282,
   "name": "slimer_move",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39308,
   "name": "b_998C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39316,
   "name": "b_9994",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39330,
   "name": "b_99A2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39338,
   "name": "b_99AA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39351,
   "name": "bcd_to_ascii",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39372,
   "name": "ticker_start_message",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39390,
   "name": "b_99DE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39402,
   "name": "b_99EA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39408,
   "name": "b_99F0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39417,
   "name": "b_99F9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39424,
   "name": "r_9A00",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 39425,
   "name": "sprite_at_target",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39435,
   "name": "r_9A0B",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 39436,
   "name": "slimer_flap_frame",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39446,
   "name": "place_trap",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39463,
   "name": "b_9A27",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39477,
   "name": "trap_beam_sprites",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39489,
   "name": "b_9A41",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39491,
   "name": "b_9A43",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39515,
   "name": "b_9A5B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39542,
   "name": "b_9A76",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39562,
   "name": "bust_check_slimer_present",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39589,
   "name": "r_9AA5",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 39590,
   "name": "slimer_update",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39606,
   "name": "b_9AB6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39641,
   "name": "r_9AD9",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 39642,
   "name": "fire_edge",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39651,
   "name": "step_all_sprites",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39653,
   "name": "b_9AE5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39663,
   "name": "man_target_from_stick",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39665,
   "name": "man_target_from_bits",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39675,
   "name": "b_9AFB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39683,
   "name": "b_9B03",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39691,
   "name": "b_9B0B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39699,
   "name": "r_9B13",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 39700,
   "name": "clamp_man_target",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39708,
   "name": "b_9B1C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39714,
   "name": "b_9B22",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39724,
   "name": "b_9B2C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39730,
   "name": "b_9B32",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39733,
   "name": "animate_both_men",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39739,
   "name": "b_9B3B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39748,
   "name": "animate_man",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39774,
   "name": "b_9B5E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39785,
   "name": "b_9B69",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39791,
   "name": "b_9B6F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39816,
   "name": "b_9B88",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39821,
   "name": "j_9B8D",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 39824,
   "name": "build_first_last_name",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39828,
   "name": "b_9B94",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39838,
   "name": "b_9B9E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39850,
   "name": "j_9BAA",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 39865,
   "name": "b_9BB9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39867,
   "name": "b_9BBB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39875,
   "name": "b_9BC3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39884,
   "name": "j_9BCC",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 39907,
   "name": "b_9BE3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39918,
   "name": "select_message",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39924,
   "name": "b_9BF4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39926,
   "name": "b_9BF6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39944,
   "name": "in_range",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39955,
   "name": "b_9C13",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39956,
   "name": "r_9C14",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 39957,
   "name": "all_sprites_at_targets",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39959,
   "name": "b_9C17",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 39970,
   "name": "r_9C22",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 39971,
   "name": "step_sprite_3",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39973,
   "name": "step_sprite_toward_target",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39992,
   "name": "b_9C38",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40007,
   "name": "b_9C47",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40014,
   "name": "b_9C4E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40031,
   "name": "b_9C5F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40046,
   "name": "b_9C6E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40053,
   "name": "r_9C75",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 40054,
   "name": "sprite_y_distance",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40066,
   "name": "r_9C82",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 40067,
   "name": "input_reset",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 40072,
   "name": "input_add_char",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 40079,
   "name": "print_char",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 40094,
   "name": "b_9C9E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40104,
   "name": "b_9CA8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40111,
   "name": "b_9CAF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40170,
   "name": "b_9CEA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40176,
   "name": "r_9CF0",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 40177,
   "name": "set_balance_10000",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40188,
   "name": "account_parse_digits",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 40198,
   "name": "b_9D06",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40207,
   "name": "b_9D0F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40227,
   "name": "r_9D23",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 40228,
   "name": "money_to_text",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 40269,
   "name": "hex_digits_to_text",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 40273,
   "name": "bytes_to_digits",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 40275,
   "name": "b_9D53",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 40308,
   "name": "blank_leading_zeros",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 40310,
   "name": "j_9D76",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 40341,
   "name": "r_9D95",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 40342,
   "name": "copy_6_pages",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 40346,
   "name": "copy_pages",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 40361,
   "name": "copy_pages_down",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 40378,
   "name": "pk_rate_masks",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 40388,
   "name": "ghq_sign_text",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 40400,
   "name": "facade_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 40404,
   "name": "cornice_chars",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 40468,
   "name": "window_char_bitmaps",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 40652,
   "name": "window_char_codes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 40700,
   "name": "window_cell_offsets",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 40724,
   "name": "window_code_offsets",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 40728,
   "name": "window_bitmap_offsets",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 40732,
   "name": "facade_map_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 40736,
   "name": "facade_map_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 40740,
   "name": "facade_chars_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 40744,
   "name": "facade_chars_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 40748,
   "name": "facade_map_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40960,
   "name": "bldg_front1_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40968,
   "name": "bldg_front2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 41188,
   "name": "bldg_front3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 41408,
   "name": "bldg_attr",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 41428,
   "name": "car_price_mid",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 41432,
   "name": "car_price_high",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 41436,
   "name": "item_price",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 41444,
   "name": "slimer_reward",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 41460,
   "name": "note_freq",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 41461,
   "name": "note_freq_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 41462,
   "name": "note_freq_next_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 41463,
   "name": "note_freq_next_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 41652,
   "name": "voice_sid_offset",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 41655,
   "name": "voice_track_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 41658,
   "name": "voice_track_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 41661,
   "name": "track_voice1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 41771,
   "name": "track_voice2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 41881,
   "name": "track_voice3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 41991,
   "name": "music_patterns",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42843,
   "name": "pattern_ptrs",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42844,
   "name": "pattern_ptrs_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42991,
   "name": "instr_table",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42992,
   "name": "instr_pw_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42993,
   "name": "instr_wave",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42994,
   "name": "instr_ad",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42995,
   "name": "instr_sr",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42996,
   "name": "instr_vibrato",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43063,
   "name": "map_block_type_init",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43093,
   "name": "block_shape_offset",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43101,
   "name": "block_row_offset",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43105,
   "name": "block_screen_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43135,
   "name": "block_screen_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43165,
   "name": "car_colour_mc2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43169,
   "name": "car_colour_scene",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43173,
   "name": "mm_path_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43205,
   "name": "mm_path_x",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43237,
   "name": "mm_path_frame",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43269,
   "name": "mm_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43271,
   "name": "mm_shapes_3",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 43273,
   "name": "mm_step_shape_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43277,
   "name": "mm_step_shape_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43281,
   "name": "mm_step_bob",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43285,
   "name": "row40_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43311,
   "name": "row40_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43337,
   "name": "sprite_colour",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43400,
   "name": "shop_sprite_start",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43406,
   "name": "cargo_slot_base",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43410,
   "name": "drive_sprite_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43414,
   "name": "drive_flash_colour",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43418,
   "name": "stream_offset",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43420,
   "name": "stream_offset_2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43422,
   "name": "bust_tbl_a99e",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43424,
   "name": "trap_hitbox",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43426,
   "name": "trap_hitbox_size",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43428,
   "name": "bob_offset",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43432,
   "name": "item_flag",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43440,
   "name": "warn_needs",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43444,
   "name": "bldg_next_stage",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43448,
   "name": "dir_dx",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43456,
   "name": "dir_dy",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43464,
   "name": "stream_shape",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43466,
   "name": "bust_shapes",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 43470,
   "name": "shop_sprite_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43566,
   "name": "cargo_slot_pos",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43662,
   "name": "shop_row_slot",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43674,
   "name": "car_capacity",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43678,
   "name": "car_top_speed",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43682,
   "name": "forklift_x",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43686,
   "name": "shelf_sprite_pos",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43696,
   "name": "shop_last_stop",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43699,
   "name": "shelf_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43723,
   "name": "unused_flags_copy",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 43731,
   "name": "credit_banner",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43741,
   "name": "unused_aadd",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 43749,
   "name": "row_x10",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43775,
   "name": "car_picture_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43779,
   "name": "car_picture_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43783,
   "name": "picture_col_char",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 43795,
   "name": "txt_intro",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 44000,
   "name": "txt_ask_account",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 44026,
   "name": "txt_new_franchise",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 44179,
   "name": "txt_ask_account_no",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 44209,
   "name": "txt_invalid_account",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 44233,
   "name": "txt_vehicle_list",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 44366,
   "name": "txt_you_have",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 44378,
   "name": "txt_vehicle_help",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 44380,
   "name": "txt_press_space_line",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 44418,
   "name": "txt_press_keys_line",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 44498,
   "name": "txt_shop_page1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 44781,
   "name": "txt_shop_page2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 45064,
   "name": "txt_shop_page3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 45353,
   "name": "txt_end_foreclosed",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 45497,
   "name": "txt_end_good_try",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 45507,
   "name": "txt_end_portal_open",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 45599,
   "name": "txt_end_credit",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 45689,
   "name": "txt_end_new_account",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 45720,
   "name": "txt_end_write_down",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 45762,
   "name": "txt_end_congrats",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 45796,
   "name": "txt_end_portal_closed",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 45891,
   "name": "txt_starting_balance",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 45912,
   "name": "txt_ending_balance",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 45933,
   "name": "text_page_ptrs",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 45934,
   "name": "text_page_ptrs_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 45989,
   "name": "car_options_page",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 45993,
   "name": "txt_empty",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 45994,
   "name": "map_ghq_label",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 45997,
   "name": "auto_joystick",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 46000,
   "name": "txt_go_to_zuul",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 46068,
   "name": "status_msg_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 46078,
   "name": "status_msg_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 46088,
   "name": "packed_sprites",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 47112,
   "name": "packed_sprites_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 48136,
   "name": "packed_sprites_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 49144,
   "name": "packed_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 49151,
   "name": "a_BFFF",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 51200,
   "name": "oneload_handover",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 51217,
   "name": "b_C811",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 51234,
   "name": "oneload_pad",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 51248,
   "name": "page3_image",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 52736,
   "name": "tape_turbo_loader",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 52775,
   "name": "b_CE27",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 52780,
   "name": "b_CE2C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 52788,
   "name": "b_CE34",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 52824,
   "name": "b_CE58",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 52828,
   "name": "tape_store_lo",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 52829,
   "name": "tape_store_hi",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 52872,
   "name": "b_CE88",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 52875,
   "name": "b_CE8B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 52889,
   "name": "tape_read_byte",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 52891,
   "name": "b_CE9B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 52904,
   "name": "tape_read_bit",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 52929,
   "name": "tape_load_fail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 52935,
   "name": "b_CEC7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 52950,
   "name": "tape_bit_buffer",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 52951,
   "name": "tape_checksum",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 52952,
   "name": "tape_end_address",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 52953,
   "name": "tape_end_address_hi",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 53120,
   "name": "tape_load_chain",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55296,
   "name": "f_D800",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55336,
   "name": "f_D828",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55376,
   "name": "f_D850",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55416,
   "name": "f_D878",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55456,
   "name": "f_D8A0",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55496,
   "name": "f_D8C8",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55536,
   "name": "f_D8F0",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55552,
   "name": "f_D900",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55576,
   "name": "f_D918",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55616,
   "name": "f_D940",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55629,
   "name": "f_D94D",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55656,
   "name": "f_D968",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55696,
   "name": "f_D990",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55736,
   "name": "f_D9B8",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55756,
   "name": "f_D9CC",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55759,
   "name": "a_D9CF",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 55776,
   "name": "f_D9E0",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55808,
   "name": "f_DA00",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55816,
   "name": "f_DA08",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55856,
   "name": "f_DA30",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55896,
   "name": "f_DA58",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55918,
   "name": "f_DA6E",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55920,
   "name": "f_DA70",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55936,
   "name": "f_DA80",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55976,
   "name": "f_DAA8",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56000,
   "name": "f_DAC0",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56016,
   "name": "f_DAD0",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56040,
   "name": "f_DAE8",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56050,
   "name": "f_DAF2",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56056,
   "name": "f_DAF8",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56090,
   "name": "f_DB1A",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56096,
   "name": "f_DB20",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56110,
   "name": "f_DB2E",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56130,
   "name": "f_DB42",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56136,
   "name": "f_DB48",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56137,
   "name": "f_DB49",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56175,
   "name": "f_DB6F",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56176,
   "name": "f_DB70",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56177,
   "name": "f_DB71",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56256,
   "name": "f_DBC0",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 57344,
   "name": "car_charset_save",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58368,
   "name": "car_charset_save_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58880,
   "name": "pixel_mask_table",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59136,
   "name": "pixel_mirror_table",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59392,
   "name": "item_shift_buffer",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59608,
   "name": "ticker_window_base",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59648,
   "name": "ticker_buffer",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59666,
   "name": "ticker_patch_power",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59667,
   "name": "ticker_patch_power_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59684,
   "name": "ticker_patch_traps",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59688,
   "name": "ticker_scroll_source",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59701,
   "name": "ticker_patch_men",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59903,
   "name": "line_input_base",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59904,
   "name": "line_input_buffer",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59924,
   "name": "text_buffer",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59925,
   "name": "text_buffer_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59927,
   "name": "text_buffer_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59944,
   "name": "map_slot_table",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59974,
   "name": "map_sprite_pos_save",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59975,
   "name": "map_sprite_pos_save_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59978,
   "name": "map_keymaster_pos",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59979,
   "name": "map_keymaster_pos_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59982,
   "name": "map_roamer_pos_save",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59986,
   "name": "map_roamer_pos_save_6",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59990,
   "name": "map_sprite_target_save",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59991,
   "name": "map_sprite_target_save_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59994,
   "name": "map_keymaster_target",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59995,
   "name": "map_keymaster_target_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59998,
   "name": "map_roamer_target_save",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60006,
   "name": "ball_x",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60007,
   "name": "ball_y",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60008,
   "name": "ball_x_high",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60009,
   "name": "ball_script_ptr",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60010,
   "name": "ball_script_ptr_hi",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60011,
   "name": "ball_hop_step",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60012,
   "name": "ball_x_speed",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60013,
   "name": "ball_saved_a",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60014,
   "name": "ball_saved_y",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60015,
   "name": "ball_saved_x",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60017,
   "name": "ball_hold",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60018,
   "name": "scratch_ea72",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60019,
   "name": "pal_flag",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60020,
   "name": "building_pick_index",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60021,
   "name": "music_voice_index",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60022,
   "name": "message_colour",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60023,
   "name": "bust_flag_ea77",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60024,
   "name": "bust_count_ea78",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60025,
   "name": "bust_count_ea79",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60026,
   "name": "speech_cue_flag",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60027,
   "name": "sfx_command",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60028,
   "name": "sfx_saved_x",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60029,
   "name": "sfx_control",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60030,
   "name": "sfx_wobble",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60031,
   "name": "sfx_loop_count",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60032,
   "name": "sfx_release_tick",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60033,
   "name": "sfx_duration",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60034,
   "name": "sid_volume",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60035,
   "name": "sfx_freq_hi",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60036,
   "name": "sfx_sweep",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60038,
   "name": "sfx_note",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60039,
   "name": "title_unused_ea87",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60040,
   "name": "drive_flag_ea88",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60041,
   "name": "ball_script_byte",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60042,
   "name": "speech_row_save",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60082,
   "name": "start_key",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60083,
   "name": "player_name",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60103,
   "name": "account_digits",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60104,
   "name": "account_digits_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60105,
   "name": "account_digits_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60106,
   "name": "account_digits_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60160,
   "name": "unused_text_buffer",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61440,
   "name": "speech_wave_buffer",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61568,
   "name": "speech_call",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61571,
   "name": "nmi_play_forward",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61573,
   "name": "speech_fwd_index",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61591,
   "name": "nmi_forward_done",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61604,
   "name": "nmi_play_backward",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61606,
   "name": "speech_back_index",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61624,
   "name": "nmi_backward_done",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61635,
   "name": "nmi_silence_start",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61657,
   "name": "nmi_silence",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61665,
   "name": "nmi_speech_stop",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61681,
   "name": "nmi_period_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61682,
   "name": "b_F0F2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 61713,
   "name": "speech_period_job",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61715,
   "name": "nmi_chunk_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61728,
   "name": "speech_next_chunk",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61733,
   "name": "speech_start_chunk",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61736,
   "name": "b_F128",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 61752,
   "name": "speech_decoder_job",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61754,
   "name": "speech_period_nothing",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61756,
   "name": "speech_voiced_period",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61771,
   "name": "speech_voiced_pitch",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61780,
   "name": "speech_unvoiced_period",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61806,
   "name": "speech_window_restart",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61822,
   "name": "speech_set_stop",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61828,
   "name": "speech_set_pause",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61839,
   "name": "speech_decode_type1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61842,
   "name": "speech_decode_type0",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61845,
   "name": "speech_decode_type3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61851,
   "name": "speech_decode_type2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61854,
   "name": "speech_switch_or_blend",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61878,
   "name": "speech_blend_first",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61884,
   "name": "speech_read_frame",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61885,
   "name": "speech_frame_flags",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61896,
   "name": "b_F1C8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 61963,
   "name": "b_F20B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 61988,
   "name": "b_F224",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 61994,
   "name": "b_F22A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 62023,
   "name": "b_F247",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 62029,
   "name": "speech_voiced_lengths",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62033,
   "name": "speech_pause_frame",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62043,
   "name": "speech_next_frame",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62054,
   "name": "r_F266",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 62055,
   "name": "speech_decode_2bit",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62068,
   "name": "speech_decode_2bit_body",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62097,
   "name": "b_F291",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 62114,
   "name": "speech_2bit_byte",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62122,
   "name": "j_F2AA",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 62163,
   "name": "b_F2D3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 62164,
   "name": "speech_decode_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62168,
   "name": "speech_2bit_levels",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62180,
   "name": "speech_decode_4bit",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62205,
   "name": "b_F2FD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 62221,
   "name": "j_F30D",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 62231,
   "name": "b_F317",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 62232,
   "name": "speech_4bit_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62236,
   "name": "speech_pitch_step",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62256,
   "name": "speech_read_pitch",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62298,
   "name": "b_F35A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 62306,
   "name": "speech_slopes",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62322,
   "name": "speech_decode_1bit",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62350,
   "name": "b_F38E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 62360,
   "name": "b_F398",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 62367,
   "name": "j_F39F",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 62377,
   "name": "b_F3A9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 62378,
   "name": "speech_1bit_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62382,
   "name": "speech_unpack_bits",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62390,
   "name": "b_F3B6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 62403,
   "name": "speech_unpack_bits_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62416,
   "name": "b_F3D0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 62429,
   "name": "b_F3DD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 62434,
   "name": "speech_decode_2bit_fixed",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62460,
   "name": "speech_crossfade",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62486,
   "name": "b_F416",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 62487,
   "name": "speech_xf_src_new",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62491,
   "name": "speech_xf_src_old",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62495,
   "name": "speech_xf_dest",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62510,
   "name": "speech_command",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62559,
   "name": "speech_status",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62572,
   "name": "r_F46C",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 62573,
   "name": "speech_stop",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62581,
   "name": "speech_set_base",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62590,
   "name": "speech_timer_start",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62614,
   "name": "speech_find_phrase",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62680,
   "name": "speech_unused_f4d8",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62682,
   "name": "speech_period_handler",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62683,
   "name": "speech_play_start",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62684,
   "name": "speech_half_length",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62685,
   "name": "speech_gap_length",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62686,
   "name": "speech_chunks_left",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62687,
   "name": "speech_periods_reload",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62688,
   "name": "speech_periods_left",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62689,
   "name": "speech_chunk_length",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62690,
   "name": "speech_window_step",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62691,
   "name": "speech_new_half",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62692,
   "name": "speech_pitch_count",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62693,
   "name": "speech_pitch",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62694,
   "name": "speech_pitch_slope",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62695,
   "name": "speech_data_base",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62696,
   "name": "speech_data_base_hi",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62697,
   "name": "speech_unused_f4e9",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62698,
   "name": "speech_phrase_table",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62718,
   "name": "speech_pitch_phrase0",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62756,
   "name": "speech_pitch_phrase1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62808,
   "name": "speech_pitch_phrase2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62848,
   "name": "speech_pitch_phrase3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62934,
   "name": "speech_pitch_phrase4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63112,
   "name": "speech_frames_phrase0",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63164,
   "name": "speech_frames_phrase1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63216,
   "name": "speech_frames_phrase2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63244,
   "name": "speech_frames_phrase3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63324,
   "name": "speech_frames_phrase4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63336,
   "name": "speech_samples_p0_p1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63848,
   "name": "speech_samples_gap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63856,
   "name": "speech_samples_p1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64048,
   "name": "speech_samples_p2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64448,
   "name": "speech_samples_p3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64659,
   "name": "speech_samples_p3_fc93",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64738,
   "name": "speech_samples_p3_fce2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64789,
   "name": "speech_samples_p3_fd15",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64931,
   "name": "speech_samples_p3_fda3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64948,
   "name": "speech_samples_p4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 65436,
   "name": "unused_ff9c",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 65530,
   "name": "nmi_vector",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 65532,
   "name": "reset_vector",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 65534,
   "name": "irq_vector",
   "type": "UserDefined",
   "kind": "user"
  }
 ],
 "comments": [
  {
   "address": 0,
   "type": "line",
   "text": "6510 data direction register: $2F, written by the cold start ($6026) and $8FFA (also by the unused loader, $CE03). Never read."
  },
  {
   "address": 1,
   "type": "line",
   "text": "6510 port: $35 in the game (RAM at $A000 and $E000, I/O at $D000), $34 while the cold start copies the character ROM ($608E-$60B4); read back by $608A/$60B0 and the speech player ($F45F)."
  },
  {
   "address": 2,
   "type": "line",
   "text": "Game flags: 0 on the title, $80 from the first game frame ($707F), $FF at the end of a game ($8D24). Bit 7 set with bit 6 clear stops the bottom scroller ($9756); exactly $80 lets the joystick through ($7064); the $C0 branch at $7094-$70A0 is never reached."
  },
  {
   "address": 3,
   "type": "line",
   "text": "Counter of the unreachable re-initialise branch ($7094-$709A, counts to 8); zeroed at $7082 when a game starts. Otherwise unused."
  },
  {
   "address": 4,
   "type": "line",
   "text": "Bottom scroller position, low byte of 10 bits with $05: counted down by $975C each frame; bits 0-2 are the fine scroll ($97E2), the rest the character offset into scroller_text ($3624). Zeroed at game start ($7084)."
  },
  {
   "address": 5,
   "type": "line",
   "text": "High bits of the bottom scroller position (with $04), counted at $9764/$976A, read at $9766/$9770 and by $97A8 for the logo sprite X."
  },
  {
   "address": 6,
   "type": "line",
   "text": "Random byte: shifted left each game IRQ with bit 0 = bit 7 XOR bit 4 ($8ED4-$8EDC), bumped at start-up ($619D). Read for haunted-building picks ($740C, $98B4), the wanderers ($7DFF), Roamer x ($8113), the Slimer ($86C3, $9AC5)."
  },
  {
   "address": 7,
   "type": "line",
   "text": "Check-byte shift register of the account number: seeded from the balance and stepped by account_lfsr_step ($91A6) name-sum times ($9104-$91B3)."
  },
  {
   "address": 8,
   "type": "line",
   "text": "Tick counter: incremented by the IRQ ($8EDE, twice in one frame of eight on PAL) and on the title by lyric_timer_tick ($63BA). Paces the music (every 4th tick), typing ($72D7), lyric cues and several animations ($8A90, $8B7A). Zeroed at $62F7."
  },
  {
   "address": 9,
   "type": "line",
   "text": "Frame counter of the game loop, incremented at $70F2; paces the PK rise ($73C6/$73FB), building recolouring ($7110), map sprite speed ($7C85) and more."
  },
  {
   "address": 10,
   "type": "line",
   "text": "Not used: no instruction reads or writes it (cleared with the rest of $02-$FE by the cold start, $6040)."
  },
  {
   "address": 11,
   "type": "line",
   "text": "General pointer, low byte (with $0C): the packed source of rle_unpack ($610B), the car picture source ($7667), the screen cell of the building recolouring ($711D) and of place_car_picture ($35FA), the route cell ($7F38)."
  },
  {
   "address": 12,
   "type": "line",
   "text": "High byte of ptr_a ($0B)."
  },
  {
   "address": 13,
   "type": "line",
   "text": "Source pointer of the page copies (copy_pages $9D9A, copy_pages_down $9DA9), the facade/colour copies ($832C, $83D1), the small car ($8461), zuul_climb_scroll ($3444) and the play messages ($99DE). Low byte; high byte $0E."
  },
  {
   "address": 14,
   "type": "line",
   "text": "High byte of copy_src ($0D)."
  },
  {
   "address": 15,
   "type": "line",
   "text": "Destination pointer of the page copies and building drawing ($9D9C, $8334, $8376, $83D3), map block rows ($9629), $8C4B. Low byte; high byte $10."
  },
  {
   "address": 16,
   "type": "line",
   "text": "High byte of copy_dst ($0F)."
  },
  {
   "address": 17,
   "type": "line",
   "text": "Previous state of the fire button (bit 4 of $33) for edge detection: fire_edge ($9ADA-$9AE0); the driving code keeps one per Roamer sprite at $11,X with X = 0 and 2 ($81AA), so $13 is the second."
  },
  {
   "address": 18,
   "type": "line",
   "text": "Not used (between fire_prev $11 and its second copy $13; X is only 0 or 2 at $81AA)."
  },
  {
   "address": 20,
   "type": "line",
   "text": "Tested by $70F8: when non-zero it would count down and re-initialise the game; nothing writes it except the cold start clearing it, so it stays 0."
  },
  {
   "address": 21,
   "type": "line",
   "text": "Typing speed of the text engine: 0 prints a line at once, 3 is slow with a click per character ($72CB-$7300); also enables word wrap ($9CD6). Set by the interview and page states ($74A9-$7591, $8DB6)."
  },
  {
   "address": 22,
   "type": "line",
   "text": "Characters left to type this frame: $27 when type_speed is 0, else 0 ($72D1), counted down at $7340."
  },
  {
   "address": 23,
   "type": "line",
   "text": "Character of the key just pressed (from key_chars $389E), 0 when none; written by scan_keyboard, cleared by its readers (SPACE $20 on the title $6385 and in play $7188, typed input $734B/$7381, bait B $7F70)."
  },
  {
   "address": 24,
   "type": "line",
   "text": "Last key character seen by scan_keyboard ($9746/$9753), for no auto-repeat: a key is reported in $17 only when it differs."
  },
  {
   "address": 25,
   "type": "line",
   "text": "Key matrix index (column x 8 + row) of the lowest key held, $FF for none ($96FD/$972D): $20 F1, $28 F3, $3F RUN/STOP; read by the title ($6399), the NMI ($6426), the pause ($70C0) and $8D29."
  },
  {
   "address": 26,
   "type": "line",
   "text": "Driving scene: the road position, += speed fraction/16 each frame; each wrap past $7F adds 1 to the distance $66; the lane dashes are drawn at y $1A and $1A+$7F ($8084-$80D8)."
  },
  {
   "address": 27,
   "type": "line",
   "text": "Driving scene: the car speed, rising by 1 a frame to the car maximum, falling at the end ($802B-$80D6, $8185)."
  },
  {
   "address": 28,
   "type": "line",
   "text": "Driving scene: speed accumulator, += $1B each frame ($8078-$80B7)."
  },
  {
   "address": 29,
   "type": "line",
   "text": "Sprite multicolour 1, written to $D025 by the game IRQ ($8FAC); set per scene ($773B shop, $7B81 map)."
  },
  {
   "address": 30,
   "type": "line",
   "text": "Sprite multicolour 2, written to $D026 by the game IRQ ($8FB1); set per scene ($7731, $7B83, $84AE)."
  },
  {
   "address": 31,
   "type": "line",
   "text": "The last screen cell the route was drawn on while the logo moves on the map ($7F64/$7F68), so each new cell counts once in $66."
  },
  {
   "address": 32,
   "type": "line",
   "text": "0 on the title, 1 when the game is entered (start_game $6FE2), 2 from the first game frame ($707B). Chooses the IRQ path ($8E56), music restart and volume ($942A, $947B), speech handling ($8DBD, $8E06)."
  },
  {
   "address": 33,
   "type": "line",
   "text": "Pointer to the next lyric line (low; high $22): $6443 at start ($6288), advanced by print_lyric_line ($9682-$96BD)."
  },
  {
   "address": 34,
   "type": "line",
   "text": "High byte of lyric_ptr ($21)."
  },
  {
   "address": 35,
   "type": "line",
   "text": "Scratch byte used by very many routines ($23-$29 are the game's work area): output pointer of rle_unpack with $24, colour pointer of zuul_climb_scroll and place_car_picture, BCD amounts for money_add ($9664: $25 $24 $23), in_range limits ($9C08 compares with $23/$24), stream X, row counters."
  },
  {
   "address": 36,
   "type": "line",
   "text": "Scratch, often the high byte of a pointer at $23 (rle_unpack output, colour RAM rows) or a second argument ($9C08 upper limit, money_add middle byte)."
  },
  {
   "address": 37,
   "type": "line",
   "text": "Scratch: the account number work byte N high ($90EE, $9155), money_add's high byte, loop counters, the random copy in the wanderers ($7E01), place_car_picture's character code."
  },
  {
   "address": 38,
   "type": "line",
   "text": "Scratch: the account check byte ($90EE), place_car_picture's row offset ($35E8), the vacuum y ($819A), row counters ($83CB)."
  },
  {
   "address": 39,
   "type": "line",
   "text": "Scratch: the account number work byte N low, facade and window style numbers ($8361, $83AA), random bits for the wanderers ($7E05)."
  },
  {
   "address": 40,
   "type": "line",
   "text": "Scratch: account bit work ($9162/$9176), the count of active Roamers ($9853), shop sprite work ($79A6-$7A08)."
  },
  {
   "address": 41,
   "type": "line",
   "text": "Scratch: account bit counter ($9120-$913E), the key saved by the status report ($718A), shop work ($79AB-$79DA)."
  },
  {
   "address": 42,
   "type": "line",
   "text": "Scratch written by the shop ($79AF/$79B1) and never read."
  },
  {
   "address": 43,
   "type": "line",
   "text": "Shape numbers of the 8 sprites ($2B-$32), put in the sprite pointers $57F8+n by the game IRQ ($8F93), which also picks each colour by shape. Set per scene from $3793, $379B, $380A, $3812 and by the animations."
  },
  {
   "address": 44,
   "type": "line",
   "text": "Shape number of sprite 1 (sprite_shape+1)."
  },
  {
   "address": 45,
   "type": "line",
   "text": "Shape number of sprite 2 (sprite_shape+2)."
  },
  {
   "address": 46,
   "type": "line",
   "text": "Shape number of sprite 3 (sprite_shape+3)."
  },
  {
   "address": 47,
   "type": "line",
   "text": "Shape number of sprite 4 (sprite_shape+4)."
  },
  {
   "address": 48,
   "type": "line",
   "text": "Shape number of sprite 5 (sprite_shape+5)."
  },
  {
   "address": 49,
   "type": "line",
   "text": "Shape number of sprite 6 (sprite_shape+6)."
  },
  {
   "address": 50,
   "type": "line",
   "text": "Shape number of sprite 7 (sprite_shape+7)."
  },
  {
   "address": 51,
   "type": "line",
   "text": "Joystick in control port 1: bits 0-4 of $DC01 (up, down, left, right, fire; 0 = pressed), $1F idle; written by read_joystick_port1 ($96DB), forced to $1F unless game_flags = $80 ($706C)."
  },
  {
   "address": 52,
   "type": "line",
   "text": "Set to $1F with $33 at $706E and by the initial values ($9007); nothing reads it."
  },
  {
   "address": 53,
   "type": "line",
   "text": "Initialised from $9051 ($0F) by init_game_vars ($9007) and otherwise never read or written."
  },
  {
   "address": 54,
   "type": "line",
   "text": "Initialised to 0 by init_game_vars ($9007); never used otherwise."
  },
  {
   "address": 55,
   "type": "line",
   "text": "Initialised to $0F ($9007), zeroed by clear_screen ($95D8); nothing reads it."
  },
  {
   "address": 56,
   "type": "line",
   "text": "Text engine cursor column (print_char $9C8F); input stops at column $25 ($7377). Set by the page states."
  },
  {
   "address": 57,
   "type": "line",
   "text": "Text engine cursor row (print_char, row address from $AAE5 at $9CB5)."
  },
  {
   "address": 58,
   "type": "line",
   "text": "The game state $00-$3F: the index into state_handlers ($381A) that frame_dispatch_state ($746D) jumps through; also tested by many per-frame routines (play is $12-$29)."
  },
  {
   "address": 59,
   "type": "line",
   "text": "Background colour written to $D021 by the game IRQ ($8FA7): 8 at start, $0C on the map, drive and building screens ($7ADD, $7FD7, $8290)."
  },
  {
   "address": 60,
   "type": "line",
   "text": "PK rise mask from pk_rate_masks ($9DBA) by the thousands digit: $3F below 1000 down to $01 ($72C7); ANDed with the frame counter to pace the PK rise ($73F7) and the map sprites ($7C87)."
  },
  {
   "address": 61,
   "type": "line",
   "text": "Ghostbusters still able to work, 3 at each visit to GHQ ($88C0, $8A5A); a slimed man costs 1 ($871C); two are needed to go to a building ($7EA9). Printed in the status report."
  },
  {
   "address": 62,
   "type": "line",
   "text": "Backpack power in BCD, $99 when recharged at GHQ ($88C4); emptied by crossing the streams ($8690); tested before a bust ($7EB7) and printed in the status report ($71D2)."
  },
  {
   "address": 63,
   "type": "line",
   "text": "Six bytes $3F-$44, initialised to 0 from $9051 by init_game_vars ($9007) and never read or written otherwise."
  },
  {
   "address": 69,
   "type": "line",
   "text": "Idle timer high byte: counted every 256 frames at $70AE, set to $80 on reaching 4, which blanks the screen ($6FFB); cleared by any joystick or key ($96E3, $974A)."
  },
  {
   "address": 70,
   "type": "line",
   "text": "Idle timer low byte, counted at $70AA; cleared with $45 by input ($96E5, $974C)."
  },
  {
   "address": 71,
   "type": "line",
   "text": "Pause: bit 7 set = paused by RUN/STOP in play (toggled at $70CA/$70E7), which stops the loop ($70EE) and the music ($93F0); bit 6 is the key-held latch."
  },
  {
   "address": 72,
   "type": "line",
   "text": "Colour of the text engine's characters (print_char $9CD0), from $EA76 ($72E6) or white for typed input ($737F); 0 also enables word wrap."
  },
  {
   "address": 73,
   "type": "line",
   "text": "Fine scroll of the bottom ticker, decreased by 2 a frame ($7206/$7208), written to $D016 by the IRQ ($8EF6)."
  },
  {
   "address": 74,
   "type": "line",
   "text": "Characters in the ticker buffer $E900 (the message and the status report append, $99F3, $71BA); cleared when it has scrolled off ($7245)."
  },
  {
   "address": 75,
   "type": "line",
   "text": "Ticker window end / message showing: set to 1 by ticker_start_message ($99FE), advanced as the text scrolls ($7212, $722B), 0 when none; a new message waits while it is non-zero ($99CC)."
  },
  {
   "address": 76,
   "type": "line",
   "text": "1 while the status report is in the ticker ($7190), so SPACE cannot add another; cleared at $7247."
  },
  {
   "address": 77,
   "type": "line",
   "text": "Text page being typed (select_message $9BF9), 0 = nothing to type ($72D3); cleared when done ($72F2) and by $7A88."
  },
  {
   "address": 78,
   "type": "line",
   "text": "Typewriter pointer to the next character of the page (low; high $4F), from text_page_ptrs by select_message ($9C00), read at $72EA."
  },
  {
   "address": 79,
   "type": "line",
   "text": "High byte of text_ptr ($4E)."
  },
  {
   "address": 80,
   "type": "line",
   "text": "Typed-line index: 1 = empty ($9C85), advanced by input_add_char; non-zero means line input is open ($7347); 0 when RETURN ends it ($7390)."
  },
  {
   "address": 81,
   "type": "line",
   "text": "The balance the game started with, 3 BCD bytes $51-$53 (from $57-$59 at $759D-$7595): at Zuul a smaller balance forecloses ($7C45); swapped with the final balance for the end texts ($8D48)."
  },
  {
   "address": 82,
   "type": "line",
   "text": "Middle BCD byte of start_balance ($51), written at $7599."
  },
  {
   "address": 83,
   "type": "line",
   "text": "Low BCD byte of start_balance ($51), written at $7595."
  },
  {
   "address": 84,
   "type": "line",
   "text": "Copy of the balance at the end of a game, 3 BCD bytes $54-$56 ($8D46), put back into $57-$59 by $8D65-$8D6F for the account number text."
  },
  {
   "address": 85,
   "type": "line",
   "text": "Middle byte of final_balance ($54), read at $8D69."
  },
  {
   "address": 86,
   "type": "line",
   "text": "Low byte of final_balance ($54), read at $8D6D."
  },
  {
   "address": 87,
   "type": "line",
   "text": "The money, 6 BCD digits $57 (highest) $58 $59: money_subtract/compare/add ($9636-$9681), printed by money_to_text ($9D24), encoded in the account number ($90EE); set to $10000 at $74EC."
  },
  {
   "address": 88,
   "type": "line",
   "text": "Middle BCD byte of the balance (thousands and hundreds)."
  },
  {
   "address": 89,
   "type": "line",
   "text": "Low BCD byte of the balance (tens and units; zeroed when an account is decoded, $748C/$750A)."
  },
  {
   "address": 90,
   "type": "line",
   "text": "City PK energy, low two BCD digits (with $5B): +1 per step of the steady rise ($7405), carried by pk_add_hundreds ($98E5); printed on row 24 ($728B)."
  },
  {
   "address": 91,
   "type": "line",
   "text": "City PK energy, high two BCD digits: sets the PK rate ($72BD), sends the Keymaster and Gatekeeper to Zuul at $50 ($7BF8), capped at 99 ($98A2/$98E7)."
  },
  {
   "address": 92,
   "type": "line",
   "text": "The car bought, 0 compact, 1 hearse, 2 station wagon, 3 high-performance ($7601/$7607); also the car shown by SPACE on the vehicle page. Picks the pictures, capacity, speed and vacuum height."
  },
  {
   "address": 93,
   "type": "line",
   "text": "Equipment shop page: 0 monitoring, 1 capture, 2 storage ($7A82); read at $76D6-$7A7E."
  },
  {
   "address": 94,
   "type": "line",
   "text": "Non-zero while in the shop ($7744): the credit display ($7399); cleared at $7A8A/$7ACD."
  },
  {
   "address": 95,
   "type": "line",
   "text": "Shop forklift position: bits 2-4 the shelf row, bits 0-1 0 at the shelves and 1 at the car ($7761-$78D6)."
  },
  {
   "address": 96,
   "type": "line",
   "text": "Item on the forklift (shelf row + 3), 0 = none ($7835, $785C)."
  },
  {
   "address": 97,
   "type": "line",
   "text": "Car slot of the carried item, from $AA8E by page ($7842, $785E)."
  },
  {
   "address": 98,
   "type": "line",
   "text": "Items loaded into the car ($7927); at the car's capacity ($AA9A by car) CAR IS LOADED TO CAPACITY ($78E8)."
  },
  {
   "address": 99,
   "type": "line",
   "text": "Driving scene: the car's lateral position (9-100), moved by road_scroll_left/right ($34F9/$356F); ($63 AND 3)*2 is the $D016 fine scroll ($702A); $64 at the start ($8038)."
  },
  {
   "address": 100,
   "type": "line",
   "text": "Driving scene: steering request, $FF left or $01 right ($80F9/$8109), applied one step a frame by $7011 and counted back to 0."
  },
  {
   "address": 101,
   "type": "line",
   "text": "Driving scene: non-zero while the vacuum sprite flashes; counted by $810B with bit 7 set; drives sprite 2's colour cycle ($704C). Cleared at $8280."
  },
  {
   "address": 102,
   "type": "line",
   "text": "Length of the route drawn on the map (cells, $7F6A, max 255); on the drive the distance covered, counted up to $67 ($808C-$80E5). 0 = no route."
  },
  {
   "address": 103,
   "type": "line",
   "text": "Distance the drive must cover: route length + 5 ($8001); read at $808E-$8181."
  },
  {
   "address": 104,
   "type": "line",
   "text": "1 while bait has been put down on the map ($7F8C); with bait down the Marshmallow Man is stopped ($895B)."
  },
  {
   "address": 105,
   "type": "line",
   "text": "Dollops of bait owned: +5 per bait bought ($793C), -1 when put down ($7F86); 0 gives SORRY, NO BAIT ($7F7A)."
  },
  {
   "address": 106,
   "type": "line",
   "text": "Ghost traps bought ($792F); refilled as empty traps at GHQ ($88BA)."
  },
  {
   "address": 107,
   "type": "line",
   "text": "Empty traps ($7931, $88BC, -1 per capture $87D9); none left: NO EMPTY TRAPS ($7E9D). Printed in the status report."
  },
  {
   "address": 108,
   "type": "line",
   "text": "Ghosts in the laser confinement system (up to 9, $87D5); emptied at GHQ ($88B8)."
  },
  {
   "address": 109,
   "type": "line",
   "text": "Equipment owned, one bit per item bought ($7925): bit 5 ghost vacuum ($81C7), bit 6 laser confinement ($87C9), others the detectors ($7D79, $A9B0) and $9AAC."
  },
  {
   "address": 110,
   "type": "line",
   "text": "The building selected on the map (0-19, $11 GHQ, $0A Zuul) ($7D82, $7E6B, $7E88); picks the building screen ($82BF-$8356)."
  },
  {
   "address": 111,
   "type": "line",
   "text": "Driving scene: four slots, the route length at which each Roamer met on the map will appear ($7DAA writes; $8119 compares with $66; $FF once used, $8129/$8139)."
  },
  {
   "address": 115,
   "type": "line",
   "text": "Which roamer_meet slot the Roamer in sprite 0 came from ($812D), read at $823A."
  },
  {
   "address": 116,
   "type": "line",
   "text": "Which roamer_meet slot the Roamer in sprite 1 came from ($813D)."
  },
  {
   "address": 117,
   "type": "line",
   "text": "Driving scene: two countdowns ($75/$76, one per Roamer sprite) of 32 frames while a caught Roamer is sucked into the car ($8213, $822D)."
  },
  {
   "address": 119,
   "type": "line",
   "text": "Walking step and facing of the two men ($77,X, X = 0/1): bit 0 facing left, bits 1-2 the step (animate_man $9B44-$9B88); bit 0 also places the trap ($9A16)."
  },
  {
   "address": 120,
   "type": "line",
   "text": "Walking step and facing of the second man ($77,X with X = 1), written at $8C11 and $9B6D."
  },
  {
   "address": 121,
   "type": "line",
   "text": "Animation step 0-5 of the proton streams ($9080-$90E4) and the trap's light ($9A35-$9A47); also counted at $8797."
  },
  {
   "address": 122,
   "type": "line",
   "text": "Height counter of the trap's light: 0 at start ($9087), +3 a frame, $9C ends it ($86B3, $875E, $9A4E)."
  },
  {
   "address": 123,
   "type": "line",
   "text": "Delay $7F while the men bob after a capture ($8766), counted at $8804/$8808, frames by it ($883A)."
  },
  {
   "address": 124,
   "type": "line",
   "text": "Delay counter: counted down to 0 by the frame loop ($700F); set by states that wait (e.g. $7538, $84DF = $7F, $8BC3 the climb from $FE) and read as a step counter (zuul_climb_scroll, $8970 the stomp, $89BC)."
  },
  {
   "address": 125,
   "type": "line",
   "text": "Direction 0-7 of the Slimer's next step (slimer_move $9972), turned at random ($9ACE), set by the streams ($996F, $99B4)."
  },
  {
   "address": 126,
   "type": "line",
   "text": "For X = 1, 0: $FF when the Slimer is left of stream X, else 0 ($9925), compared at $9951 to catch it crossing."
  },
  {
   "address": 128,
   "type": "line",
   "text": "Map slot of the building chosen for the Marshmallow Man as PK crosses a thousand from 5000 ($98D6); read at $7ED8, $7EE8, $89CF."
  },
  {
   "address": 129,
   "type": "line",
   "text": "0 normally; 1 once the Keymaster and Gatekeeper have met at Zuul ($7C58/$7C5F): stops the PK rise ($73F3) and changes the map."
  },
  {
   "address": 130,
   "type": "line",
   "text": "Music: position in each voice's track list, $82-$84 for voices 1-3 ($93E6, $94FA, $9420); $82 also sets the fade ($9471)."
  },
  {
   "address": 133,
   "type": "line",
   "text": "Music: position in the current pattern for each voice, $85-$87 ($9440-$94EE, $63F7)."
  },
  {
   "address": 136,
   "type": "line",
   "text": "Music: duration counter of each voice, $88-$8A; negative ($FF) = voice stopped ($6293, $8DAB, $901A); counted every 4th tick ($940F)."
  },
  {
   "address": 137,
   "type": "line",
   "text": "Duration counter of voice 1+1."
  },
  {
   "address": 138,
   "type": "line",
   "text": "Duration counter of voice 2+1."
  },
  {
   "address": 139,
   "type": "line",
   "text": "Music: current note number of each voice, $8B-$8D ($9492), for the vibrato ($9538)."
  },
  {
   "address": 142,
   "type": "line",
   "text": "Music: current event byte of each voice, $8E-$90 ($9448): bits 0-4 duration, bit 5 hold the gate, bit 6 rest ($948D, $9501, $955E)."
  },
  {
   "address": 145,
   "type": "line",
   "text": "Music: control register value (waveform) of each voice's instrument, $91-$93 ($94EA), written with the gate cleared at the end of a note ($950C)."
  },
  {
   "address": 148,
   "type": "line",
   "text": "Music: instrument number of each voice, $94-$96 (low nibble of an event's extra byte, $9461, $640D); indexes the 8-byte records at $A7EF ($94B4, $951F)."
  },
  {
   "address": 151,
   "type": "line",
   "text": "Title: index into lyric_line_times ($68F0), 0-$70 ($62F9, $63D4, $63BC)."
  },
  {
   "address": 152,
   "type": "line",
   "text": "Non-zero ($FF) while a sound effect owns SID voice 3 (sfx_start $3D49); cleared by sfx_stop and at the end of an effect ($3BE6, $3C58); music_voice3_busy ($9593) keeps the music off voice 3."
  },
  {
   "address": 153,
   "type": "line",
   "text": "Not used: no reference (zeroed by the cold start and init_game_vars)."
  },
  {
   "address": 154,
   "type": "line",
   "text": "Title: lyric scroll counter, +$10 per cue ($63D2), down 1 per frame ($634F); low 3 bits the fine scroll the IRQ puts in $D011 ($8E8E)."
  },
  {
   "address": 155,
   "type": "line",
   "text": "Three bytes $9B-$9D that no instruction references (zeroed by the cold start and init_game_vars)."
  },
  {
   "address": 158,
   "type": "line",
   "text": "Pointer of the unused loader at $CEC1 (STA ($9E),Y filling memory from $0202, then a KERNAL reset); nothing in the game runs it."
  },
  {
   "address": 159,
   "type": "line",
   "text": "High byte of loader_ptr ($9E), written at $CEC3/$CECF by the unused loader."
  },
  {
   "address": 160,
   "type": "line",
   "text": "Sprite positions: x,y pairs for sprites 0-7 ($A0-$AF; x in half pixels, the IRQ doubles it, $8ED4). Set per scene from $37A3, $37B3, $3EF6 and moved toward sprite_goal ($9C25)."
  },
  {
   "address": 161,
   "type": "line",
   "text": "Sprite position byte 1: sprite 1//2, x if even else y."
  },
  {
   "address": 162,
   "type": "line",
   "text": "Sprite position byte 2: sprite 2//2, x if even else y."
  },
  {
   "address": 163,
   "type": "line",
   "text": "Sprite position byte 3: sprite 3//2, x if even else y."
  },
  {
   "address": 164,
   "type": "line",
   "text": "Sprite position byte 4: sprite 4//2, x if even else y."
  },
  {
   "address": 165,
   "type": "line",
   "text": "Sprite position byte 5: sprite 5//2, x if even else y."
  },
  {
   "address": 166,
   "type": "line",
   "text": "Sprite position byte 6: sprite 6//2, x if even else y."
  },
  {
   "address": 167,
   "type": "line",
   "text": "Sprite position byte 7: sprite 7//2, x if even else y."
  },
  {
   "address": 168,
   "type": "line",
   "text": "Sprite position byte 8: sprite 8//2, x if even else y."
  },
  {
   "address": 169,
   "type": "line",
   "text": "Sprite position byte 9: sprite 9//2, x if even else y."
  },
  {
   "address": 170,
   "type": "line",
   "text": "Sprite position byte 10: sprite 10//2, x if even else y."
  },
  {
   "address": 171,
   "type": "line",
   "text": "Sprite position byte 11: sprite 11//2, x if even else y."
  },
  {
   "address": 172,
   "type": "line",
   "text": "Sprite position byte 12: sprite 12//2, x if even else y."
  },
  {
   "address": 173,
   "type": "line",
   "text": "Sprite position byte 13: sprite 13//2, x if even else y."
  },
  {
   "address": 174,
   "type": "line",
   "text": "Sprite position byte 14: sprite 14//2, x if even else y."
  },
  {
   "address": 175,
   "type": "line",
   "text": "Sprite position byte 15: sprite 15//2, x if even else y."
  },
  {
   "address": 176,
   "type": "line",
   "text": "Sprite targets: x,y pairs for sprites 0-7 ($B0-$BF), which step_sprite_toward_target ($9C25) moves sprite_pos toward."
  },
  {
   "address": 177,
   "type": "line",
   "text": "Sprite target byte 1."
  },
  {
   "address": 178,
   "type": "line",
   "text": "Sprite target byte 2."
  },
  {
   "address": 179,
   "type": "line",
   "text": "Sprite target byte 3."
  },
  {
   "address": 180,
   "type": "line",
   "text": "Sprite target byte 4."
  },
  {
   "address": 181,
   "type": "line",
   "text": "Sprite target byte 5."
  },
  {
   "address": 182,
   "type": "line",
   "text": "Sprite target byte 6."
  },
  {
   "address": 184,
   "type": "line",
   "text": "Sprite target byte 8."
  },
  {
   "address": 185,
   "type": "line",
   "text": "Sprite target byte 9."
  },
  {
   "address": 186,
   "type": "line",
   "text": "Sprite target byte 10."
  },
  {
   "address": 187,
   "type": "line",
   "text": "Sprite target byte 11."
  },
  {
   "address": 188,
   "type": "line",
   "text": "Sprite target byte 12."
  },
  {
   "address": 189,
   "type": "line",
   "text": "Sprite target byte 13."
  },
  {
   "address": 190,
   "type": "line",
   "text": "Sprite target byte 14."
  },
  {
   "address": 191,
   "type": "line",
   "text": "Sprite target byte 15."
  },
  {
   "address": 192,
   "type": "line",
   "text": "City map: shape numbers of the 8 map sprites ($C0-$C7, from $3793 at $7AB5), copied to sprite_shape when the map is drawn; 0 = sprite inactive ($7C90). $C4-$C7 are the Roamers ($9849)."
  },
  {
   "address": 196,
   "type": "line",
   "text": "Map sprite 4 shape (0 = inactive)."
  },
  {
   "address": 200,
   "type": "line",
   "text": "City map: state byte of each of the 20 buildings ($C8-$DB): high nibble an age timer, bits 2-3 the kind, bits 0-1 the colour ($73BD, $7D39); $xF haunted; $C8 = marked for the Marshmallow Man ($98DB)."
  },
  {
   "address": 207,
   "type": "line",
   "text": "State of building 7; init_game_vars sets it to $1F (haunted at the start, $9043)."
  },
  {
   "address": 208,
   "type": "line",
   "text": "State of building 8; set to $1C at game start ($9047)."
  },
  {
   "address": 210,
   "type": "line",
   "text": "State of building 10, Zuul; set to $0F (flashing red) in the Zuul phase ($7C83)."
  },
  {
   "address": 215,
   "type": "line",
   "text": "State of building 15; set to $14 at game start ($904B)."
  },
  {
   "address": 220,
   "type": "line",
   "text": "Scratch of the music player (a frequency low byte, volume, $9468-$956E), the IRQ (the sprites' 9th x bits, $8EFA-$8F88), the scroller ($9775) and music_skip_ahead ($63FB)."
  },
  {
   "address": 221,
   "type": "line",
   "text": "Music scratch: the event byte ($944A), vibrato step high byte ($9552); also the logo sprite X in $97AE."
  },
  {
   "address": 222,
   "type": "line",
   "text": "Music scratch: gate mask ($9444/$94B0) and vibrato phase ($9536); also $97BB."
  },
  {
   "address": 223,
   "type": "line",
   "text": "Music scratch: instrument control value ($94BF), vibrato frequency low ($9557)."
  },
  {
   "address": 224,
   "type": "line",
   "text": "Music scratch: the saved voice index ($94B6), vibrato depth and frequency high ($9528-$9576)."
  },
  {
   "address": 225,
   "type": "line",
   "text": "Music: the SID register offset of the voice being played (0, 7, 14) ($93FC); also the raster-wrap flag while speech plays ($8DF0, $8E14)."
  },
  {
   "address": 226,
   "type": "line",
   "text": "Set to 1 by the game IRQ ($8FB8) once a frame; the main loop waits for it and clears it ($6FEC/$6FF2); $861E/$8627 too."
  },
  {
   "address": 227,
   "type": "line",
   "text": "Music: pointer to the current voice's track list (low; high $E4), $9408, read ($E3),Y at $9422 and $63E9."
  },
  {
   "address": 228,
   "type": "line",
   "text": "High byte of mus_track_ptr ($E3)."
  },
  {
   "address": 229,
   "type": "line",
   "text": "Music: pointer to the current pattern (low; high $E6), from $A75B ($9439), read ($E5),Y at $9446-$94F0."
  },
  {
   "address": 230,
   "type": "line",
   "text": "High byte of mus_pattern_ptr ($E5)."
  },
  {
   "address": 231,
   "type": "line",
   "text": "Sound effect script pointer, low byte (high $E8), from sfx_start ($3D51), advanced by sfx_fetch ($3C66) and the loop ($3CD7)."
  },
  {
   "address": 232,
   "type": "line",
   "text": "High byte of the sound effect pointer; 0 = no effect playing (sfx_tick $3BE9, sfx_start $3D26)."
  },
  {
   "address": 233,
   "type": "line",
   "text": "Jump vector (low; high $EA) to the sound effect command handler, set at $3C3F/$3CAE, used by JMP ($00E9)."
  },
  {
   "address": 234,
   "type": "line",
   "text": "High byte of sfx_vector ($E9)."
  },
  {
   "address": 235,
   "type": "line",
   "text": "Non-zero while speech plays: counted up by speak_phrase ($8DBA), cleared at $8E41; the raster IRQ does nothing meanwhile ($8E7C)."
  },
  {
   "address": 236,
   "type": "line",
   "text": "Nine bytes $EC-$F4 that no instruction references (zeroed by the cold start); the speech player starts at $F5."
  },
  {
   "address": 245,
   "type": "line",
   "text": "Speech: pointer to the frame list of the phrase (low; high $F6), set at $F4C8, advanced by 4 per record ($F25B)."
  },
  {
   "address": 246,
   "type": "line",
   "text": "High byte of speech_frame_ptr ($F5)."
  },
  {
   "address": 247,
   "type": "line",
   "text": "Speech: pointer to the pitch list (low; high $F8), set at $F4B2, advanced at $F33C/$F354."
  },
  {
   "address": 248,
   "type": "line",
   "text": "High byte of speech_pitch_ptr ($F7)."
  },
  {
   "address": 249,
   "type": "line",
   "text": "Speech: pointer to the phrase table and then the sample chunk being decoded (low; high $FA), $F1E7-$F4A9."
  },
  {
   "address": 250,
   "type": "line",
   "text": "High byte of speech_ptr ($F9)."
  },
  {
   "address": 251,
   "type": "line",
   "text": "Speech: pointer into the level tables (low; high $FC = $F2), set at $F27E, read ($FB),Y at $F288-$F2C7."
  },
  {
   "address": 252,
   "type": "line",
   "text": "Page of the speech level tables, $F2 ($F449)."
  },
  {
   "address": 253,
   "type": "line",
   "text": "Speech: half-period sample counter, from speech_half_length ($F08E, $F101)."
  },
  {
   "address": 254,
   "type": "line",
   "text": "Speech: second half-period counter ($F0AF, $F103)."
  },
  {
   "address": 255,
   "type": "line",
   "text": "Speech: silent gap length of a pitch period ($F0CE-$F457), counted down by the NMI ($F0D9)."
  },
  {
   "address": 512,
   "type": "line",
   "text": "Car picture 0, the compact, first page: 768 bytes $0200-$04FF of multicolour characters, 6 columns of 16 characters (128 bytes a column) = the left half of the car's top view on the vehicle page. $7667 copies the 768 bytes to $5A00 (chars $40-$9F) and the same columns mirrored through $E700, last first, to $5D00 (chars $A0-$FF); $35E6 places them. Pointer: $AAFF/$AB03. This page (the two outer columns) is blank; the conversion's stub at $C800 clears $0200-$02FF before $6000 anyway, so the picture is unaffected (rendered in the simulator: work/agent2/cars.png)."
  },
  {
   "address": 768,
   "type": "line",
   "text": "Car picture 0 (compact, starts $0200), second page: columns 2-3 of the left half. The whole page $0300-$03FF, KERNAL vectors included, is what the conversion's stub copies from $C830 at start-up; nothing uses the vectors once the KERNAL is banked out ($01 = $35)."
  },
  {
   "address": 792,
   "type": "line",
   "text": "Two bytes of the compact's picture (column 2) that the unused loader at $CE00 would overwrite with an NMI vector ($CE10-$CE15, STA $0318/$0319 = $CEC1). $CE00 never ran in the simulator; in the game they are graphics."
  },
  {
   "address": 793,
   "type": "line",
   "text": "Second byte of the pair the unused loader at $CE00 would write ($CE15); in the game a byte of the compact's picture, column 2."
  },
  {
   "address": 1024,
   "type": "line",
   "text": "Car picture 0 (compact, starts $0200), third page: columns 4-5, the middle of the car. $7690 reads this page's second half first when it builds the mirrored right side."
  },
  {
   "address": 1280,
   "type": "line",
   "text": "Car picture 1, the 1963 hearse: 768 bytes $0500-$07FF, 6 columns x 16 multicolour characters, left half of the top view (the only car whose outermost columns are not blank). Copied and mirrored by $7667 (pointer $AAFF/$AB03)."
  },
  {
   "address": 2048,
   "type": "line",
   "text": "Car picture 2, the station wagon: 768 bytes $0800-$0AFF, 6 columns x 16 multicolour characters, left half of the top view; its first page (two outer columns) is blank. Copied and mirrored by $7667."
  },
  {
   "address": 2560,
   "type": "line",
   "text": "Car picture 2 (station wagon, starts $0800), third page: columns 4-5, the middle of the car. The only reference by address is a JSR $0A00 among the bytes at $CF80-$CF8B (JSR $CE00, JSR $0A00, JSR $CE00, JSR $0E00), a leftover chain for the unused loader at $CE00 that nothing runs; in this game $0A00 is graphics, never executed."
  },
  {
   "address": 2816,
   "type": "line",
   "text": "Car picture 3, the high-performance car: 768 bytes $0B00-$0DFF, 6 columns x 16 multicolour characters, left half of the top view; its first page is blank. Copied and mirrored by $7667."
  },
  {
   "address": 3584,
   "type": "line",
   "text": "Small car pictures, one per car, 96 bytes each: 12 multicolour characters (4 wide, 3 high: chars $40-$4B) of the car parked at the kerb on the building screens. $8451 copies the one for car $5C (pointer table $375F) to $5A00 and puts chars $40-$4B at row 18-20, column 34-37 ($56F2), coloured from $A8A1. This one: the compact."
  },
  {
   "address": 3680,
   "type": "line",
   "text": "Small car picture 1, the hearse: 96 bytes, 12 characters (4 x 3), see $0E00. Read by $8461 through $375F."
  },
  {
   "address": 3776,
   "type": "line",
   "text": "Small car picture 2, the station wagon: 96 bytes, 12 characters (4 x 3), see $0E00."
  },
  {
   "address": 3872,
   "type": "line",
   "text": "Small car picture 3, the high-performance car: 96 bytes, 12 characters (4 x 3), see $0E00."
  },
  {
   "address": 3968,
   "type": "line",
   "text": "Character set of the Zuul building screen (building $0A): 6 pages $0F80-$157F copied by copy_6_pages ($82C5-$82D5) to $5A00, chars $40-$FF (multicolour). The screen maps use codes $4C-$F9. Draws the church, Zuul's tower and the Marshmallow Man."
  },
  {
   "address": 4096,
   "type": "line",
   "text": "Zuul building character set (starts $0F80), bytes $1000-$13FF: chars $56-$D5 of the Zuul screen."
  },
  {
   "address": 5120,
   "type": "line",
   "text": "Zuul building character set (starts $0F80), bytes $1400-$157F: chars $D6-$FF; the maps use up to $F9 ($154F)."
  },
  {
   "address": 5504,
   "type": "line",
   "text": "Zuul building screen: 21 rows x 40 screen codes ($1580-$18C7) copied to $5400-$5747 by copy_pages_down ($82E6-$82FA, from $1880 down). Colours in the low nibbles of $1C60."
  },
  {
   "address": 6344,
   "type": "line",
   "text": "A 22nd row (40 bytes) after the Zuul screen map: nothing reads it (the copy takes 21 rows; no reference by address, not read in any simulator run). The map's author kept 22 rows."
  },
  {
   "address": 6384,
   "type": "line",
   "text": "The top of Zuul's tower, the temple with the stairs and the two stone dogs: 21 rows x 40 screen codes ($18F0-$1C37). In the climb (state at $8BD5) zuul_climb_scroll ($3300) scrolls the screen down one row per step and puts row $7C of this map on row 0 while $7C counts from 20 to 0, after the repeating tower rows ($3459); colours from the high nibbles of $1C60. Seen in the simulator (work/agent2/climb.png)."
  },
  {
   "address": 7224,
   "type": "line",
   "text": "A 22nd row (40 bytes) after the tower map: never read ($3300 stops at row 20, $7C < $15)."
  },
  {
   "address": 7264,
   "type": "line",
   "text": "Colour map of the Zuul screens, 21 rows x 40 ($1C60-$1FA7), two maps in one: the low nibble is the colour of the building screen at $1580 (copied as is to colour RAM $D800 by $831C-$8340, $0A replaced by the facade colour), the high nibble the colour of the tower rows at $18F0 ($3449 shifts it down)."
  },
  {
   "address": 8104,
   "type": "line",
   "text": "Character set of the ordinary building screen: chars $40-$BD ($1FA8-$2397, 126 characters) of the street, pavement, walls and door. copy_6_pages ($82B7-$82D5) copies 6 pages from here to $5A00, so chars $BE-$FF get the start of the screen map, unused; facades ($5BD0), windows ($5B30) and cornices ($5A68) overwrite parts of it per building."
  },
  {
   "address": 9112,
   "type": "line",
   "text": "Ordinary building screen: 21 rows x 40 screen codes ($2398-$26DF), copied to $5400-$5747 by copy_pages_down ($82D8-$82FA, from $2698 down). Codes $4C-$BD."
  },
  {
   "address": 9952,
   "type": "line",
   "text": "Colour map of the ordinary building screen, 21 rows x 40 ($26E0-$2A27), copied to colour RAM $D800-$DB47 by $830A-$8340 with every $0A replaced by the building's facade colour ($9DD0 by the building's style)."
  },
  {
   "address": 10792,
   "type": "line",
   "text": "A 22nd row (40 bytes, all $0F) after the building colour map: never read (the copy takes 21 rows; not read in any simulator run)."
  },
  {
   "address": 10832,
   "type": "line",
   "text": "City map character set: 6 pages $2A50-$304F copied by state $11 ($7AEE-$7AFE) to $5A00, chars $40-$FF (multicolour): the buildings, streets, street and avenue signs of the map."
  },
  {
   "address": 11856,
   "type": "line",
   "text": "City map character set (starts $2A50), bytes $2E50-$304F: chars $C0-$FF."
  },
  {
   "address": 12368,
   "type": "line",
   "text": "Facade characters for lower-facade style 1 (29 characters, $3050-$3137, codes $7A-$96 of facade map $9F2C). The three styles are overlapping windows into one pool: copy_pages ($8404-$841C) copies 512 bytes from $3050, $3138 or $3208 (table $9F24/$9F28) to $5BD0, chars $7A-$B9, of which the maps use the first 29, 26 and 31."
  },
  {
   "address": 12600,
   "type": "line",
   "text": "Facade characters for style 2 (26 characters, $3138-$3207, codes $7A-$93 of facade map $A008); see $3050."
  },
  {
   "address": 12808,
   "type": "line",
   "text": "Facade characters for style 3 (31 characters, $3208-$32FF, codes $7A-$98 of facade map $A0E4). The 512-byte copy from here also takes in the code at $3300-$3407 as characters $9B-$B9, which no map uses."
  },
  {
   "address": 13056,
   "type": "line",
   "text": "One step of the climb up Zuul's tower (called from $8BD5 while $7C counts down from $FE): moves screen rows 0-20 ($5400-$5747) and their colour RAM down one row, 40 columns, unrolled, then fills row 0. While $7C >= 21 row 0 is one of three repeating tower rows ($3459, picked by $7C AND 3; a value with AND 3 = 3 is first decremented, so 3 of every 4 counts scroll) with colours $34D1; below 21 it is row $7C of the temple map $18F0 (row offset $A915/$A92F) with colours from the high nibbles of $1C60 ($3422-$3455). Reads $7C, may DEC it; uses $0D/$0E and $23/$24."
  },
  {
   "address": 13398,
   "type": "line",
   "text": "End offsets of the three repeating tower rows inside tower_rows ($3459): $27, $4F, $77 (40 x n + 39), read at $340B with X = $7C AND 3 (0-2), then counted down with the screen column."
  },
  {
   "address": 13401,
   "type": "line",
   "text": "Three rows of 40 screen codes ($3459-$34D0) of Zuul's tower below the temple (blank sky on the left, the wall, windows), repeated in turn by zuul_climb_scroll ($3417) while $7C >= 21."
  },
  {
   "address": 13521,
   "type": "line",
   "text": "Colour RAM values for a repeating tower row, 40 bytes ($34D1-$34F8): $0E (light blue sky) for columns 0-12, then 8 and $0E for the wall and windows; written to $D800 by $3411."
  },
  {
   "address": 13561,
   "type": "line",
   "text": "Driving scene, steering left one step (called from frame_timers_and_steer at $7017): DEC $63, the car's lateral position; every fourth step ($63 AND 3 = 3) the 13-character-wide road window at column $63/4 (rows 4-20, $54A0-$56F7) moves one character left, unrolled. The fine part is the $D016 scroll set at $7024."
  },
  {
   "address": 13679,
   "type": "line",
   "text": "Driving scene, steering right one step (called from $701F): INC $63; every fourth step ($63 AND 3 = 0) the 13-character road window at column $63/4 (rows 4-20) moves one character right, copied from its right end ($63/4 + 12) down."
  },
  {
   "address": 13798,
   "type": "line",
   "text": "Puts the 12 x 16 car picture on the screen: entry $35E6 starts at row offset $12 (screen $54B2), entry $35E8 takes the offset in A; column X (0-11) gets 16 consecutive character codes from $AB07,x ($40, $50 ... $F0), one per row, at $54A0 + offset + X + 40 x row, with colour RAM 8 (multicolour black). Called from the vehicle page ($75D2), $76BF and $803C."
  },
  {
   "address": 13800,
   "type": "line",
   "text": "Entry of place_car_picture ($35E6) with the screen offset from $54A0 in A instead of $12; called from $803C."
  },
  {
   "address": 13856,
   "type": "line",
   "text": "Not a table: an operand inside place_car_picture (the CPX #$0C / BCC / RTS at $361F-$3623). The symbol exists because bottom_scroller_logo_sprite reads $3620,Y at $9818 with Y = $F4-$FB, which lands on logo_stripe_colours ($3714-$371B)."
  },
  {
   "address": 13860,
   "type": "line",
   "text": "The bottom row's scrolling text, 128 PETSCII characters in a loop, read by bottom_scroller_text ($9782): codes $5B-$62 are the ACTIVISION logo glyphs (chars $1B-$22 after AND $3F), then PRESS F1 OR F3 TO START, GHOSTBUSTERS with $63 $66 (chars $23, $26: a small TM), DESIGNED BY DAVID CRANE, COPYRIGHT 1984. Spaces print as char 0."
  },
  {
   "address": 13988,
   "type": "line",
   "text": "Character shapes copied by the cold start ($60B8) over chars $1B-$2A of the text set at $58D8 (128 bytes, $36A4-$3723): $1B-$22 the ACTIVISION logo (8 characters), $23 T and $26 M of the TM mark, $24 '$', $25 '%', $27 the apostrophe, $28 '!' (so '(' in the text prints as '!'). The last two 'characters' of the copy, $29 and $2A, are the logo stripe colours ($3714) and the start of the VIC table ($371C-$3723): junk shapes no text uses."
  },
  {
   "address": 14100,
   "type": "line",
   "text": "Colours of sprite 7 (the Activision logo in the scroller) for raster lines $F4-$FB: 8 8 7 7 5 5 6 0 (orange, yellow, green, blue), read at $9818 through $3620,Y. The same 8 bytes are copied as glyph $29 by the cold start; $371C is one more byte of that copy only (glyph $2A's first row)."
  },
  {
   "address": 14109,
   "type": "line",
   "text": "The 47 VIC-II register values $D000-$D02E written by the cold start ($602A): sprites all at 0, $D011 = $0B (screen off), $D012 = $37, $D016 = 8, $D018 = $56 (screen $5400, characters $5800 in bank 1), border/background and multicolours, sprite colours. Its last byte, $374B = 1 ($D02E), doubles as the first key column mask."
  },
  {
   "address": 14155,
   "type": "line",
   "text": "Keyboard scan column bit masks 1, 2, 4 ... $80 (8 bytes), ANDed with $DC01 by scan_keyboard ($971F) and ORed at $816D/$8176 (driving). Its first byte is also the last VIC init value."
  },
  {
   "address": 14163,
   "type": "line",
   "text": "Keyboard row select values $FE, $FD ... $7F written to $DC00 by scan_keyboard ($9716), also ANDed at $825C/$826B."
  },
  {
   "address": 14171,
   "type": "line",
   "text": "The four character codes $40-$43 of the small car's top row, placed at row 18 column 34 ($8474); +4 and +8 give the rows below."
  },
  {
   "address": 14175,
   "type": "line",
   "text": "Addresses of the four small car pictures ($0E00, $0E60, $0EC0, $0F20), word per car, read at $8455/$845A with X = car x 2."
  },
  {
   "address": 14176,
   "type": "line",
   "text": "High byte of each small-car pointer (small_car_ptrs + 1), the operand of LDA $3760,X at $845A; not a separate table."
  },
  {
   "address": 14183,
   "type": "line",
   "text": "The four street signs of the city map, 4 rows x 11 screen codes of the map charset (PARK AVE, CHURCH ST, UNION ST, BROADWAY), drawn by state $11 ($7B32-$7B44) at the left of the map rows."
  },
  {
   "address": 14194,
   "type": "line",
   "text": "Second street sign (11 codes), read at $7B38; see map_street_signs."
  },
  {
   "address": 14205,
   "type": "line",
   "text": "Third street sign (11 codes), read at $7B3E; see map_street_signs."
  },
  {
   "address": 14216,
   "type": "line",
   "text": "Fourth street sign (11 codes), read at $7B44; see map_street_signs."
  },
  {
   "address": 14227,
   "type": "line",
   "text": "Sprite frame numbers for the 8 sprites of the city map (logo halves, Keymaster, Gatekeeper, Roamers), copied to $C0-$C7 by state $10 ($7AB2)."
  },
  {
   "address": 14235,
   "type": "line",
   "text": "Sprite frame numbers of the 8 sprites in the driving scene (00 00 04 05 0C x4), copied to $2B-$32 by state $14 ($8063)."
  },
  {
   "address": 14243,
   "type": "line",
   "text": "Starting x,y of the 8 sprites of the driving scene, 16 bytes: $37A3-$37AA to $A0-$A7 ($8059) and $37AB-$37B2 to $A8-$AF ($805E)."
  },
  {
   "address": 14251,
   "type": "line",
   "text": "Second half of drive_sprite_pos: x,y of sprites 4-7 in the driving scene (Roamers at x $36/$6D), read at $805E."
  },
  {
   "address": 14259,
   "type": "line",
   "text": "Starting x,y of the 8 map sprites (16 bytes), copied to $EA46 at $7A9E and used by reset_sprite_home ($986B) to send a sprite back."
  },
  {
   "address": 14260,
   "type": "line",
   "text": "The y half of map_sprite_start (operand base of LDA $37B4,X at $9875); not a separate table."
  },
  {
   "address": 14275,
   "type": "line",
   "text": "Target x,y of the 8 map sprites (16 bytes; Roamers aim at Zuul, $62/$7A), copied to $EA56 at $7AA4 and by reset_sprite_home ($987F)."
  },
  {
   "address": 14276,
   "type": "line",
   "text": "The y half of map_sprite_goal (LDA $37C4,X at $9889); not a separate table."
  },
  {
   "address": 14283,
   "type": "line",
   "text": "Second half of map_sprite_goal: the Roamers' (sprites 4-7) target x,y, read alone at $7BA0 when the map is drawn."
  },
  {
   "address": 14291,
   "type": "line",
   "text": "The city grid in sprite coordinates, 22 bytes: five avenue x windows (lo, hi pairs $1B-$1F, $37-$3B, $53-$57, $6F-$73, $8B-$8F) at $37D3, then row limits 00 00 and four street y windows ($40-$44, $68-$6C, $90-$94, $B8-$BC) and FF FF at $37DD. The logo turns onto an avenue or street inside a window (map_logo_on_streets, $7CB1/$7CEC); a building's rectangle is from one avenue window to the next and one row limit to the next ($7D46-$7D5C)."
  },
  {
   "address": 14292,
   "type": "line",
   "text": "High ends of the avenue windows (map_grid + 1, CMP $37D4,X at $7CB6); not a separate table."
  },
  {
   "address": 14294,
   "type": "line",
   "text": "map_grid + 3: the next avenue's high end, the right edge of a building column (CMP $37D6,Y at $7D4B)."
  },
  {
   "address": 14301,
   "type": "line",
   "text": "Row limits of the map grid: 00 00, then the street windows at $37DF, the last pair FF FF (never matched by a street test); read as building rows at $7D57."
  },
  {
   "address": 14303,
   "type": "line",
   "text": "Street y windows (lo at $37DF, hi at $37E0), 4 pairs and FF FF, read by map_logo_on_streets ($7CEC/$7CF1)."
  },
  {
   "address": 14304,
   "type": "line",
   "text": "High ends of the street windows (CMP $37E0,X at $7CF1) and the building row's lower limit ($7D5C); part of map_grid."
  },
  {
   "address": 14313,
   "type": "line",
   "text": "The x of the avenue crossings for the wandering Keymaster and Gatekeeper: $37EA-$37EE five avenues ($1D, $39, $55, $71, $8D) with a copy of the neighbour at each end ($37E9 = $39, $37EF = $71), so a step off the edge turns back. Read at $7E0B/$7E39 and by map_marshmallow_check ($7EF2)."
  },
  {
   "address": 14314,
   "type": "line",
   "text": "The five avenue x coordinates proper (crossing_x + 1), searched at $7E0B and indexed by column at $7EF2."
  },
  {
   "address": 14320,
   "type": "line",
   "text": "The y of the street crossings: $37F1-$37F4 four streets ($42, $6A, $92, $BA) with the neighbour copied at each end ($37F0 = $6A, $37F5 = $92). Read at $7E1C/$7E4A and $7F08."
  },
  {
   "address": 14321,
   "type": "line",
   "text": "The four street y coordinates proper (crossing_y + 1), searched at $7E1C, indexed by row at $7F08."
  },
  {
   "address": 14326,
   "type": "line",
   "text": "Steps (dx, dy) in crossing indices for the four directions a wanderer picks from the random byte: (0,+1), (+1,0), (0,-1), (-1,0); read at $7E35/$7E46."
  },
  {
   "address": 14327,
   "type": "line",
   "text": "The dy half of crossing_steps (ADC $37F7,Y at $7E46); not a separate table."
  },
  {
   "address": 14334,
   "type": "line",
   "text": "Points (x,y) at which the Keymaster (x = 0) and Gatekeeper (x = 2) turn for Zuul once PK is 5000 or more: ($65,$6A) and ($65,$92), compared at $7C0E/$7C15."
  },
  {
   "address": 14335,
   "type": "line",
   "text": "The y half of gate_trigger_points (CMP $37FF,X at $7C15)."
  },
  {
   "address": 14338,
   "type": "line",
   "text": "Where the Keymaster and Gatekeeper stand at Zuul, (x,y) pairs ($61,$86) and ($65,$87): their target from $7C1A, and both on it ($7C30) ends the map: the Zuul phase, or the foreclosure when the balance is below the starting one ($7C2E)."
  },
  {
   "address": 14339,
   "type": "line",
   "text": "The y half of zuul_door_points (LDA $3803,X at $7C22)."
  },
  {
   "address": 14342,
   "type": "line",
   "text": "Per car ($5C), the y the ghost vacuum pulls Roamers to in the driving scene (the car's roof): $78, $70, $6C, $76, read at $8197."
  },
  {
   "address": 14346,
   "type": "line",
   "text": "Sprite frame numbers of the 8 sprites on a building screen (19 19 19 19 0A 0E 0E 37), copied to $2B-$32 at $84B7."
  },
  {
   "address": 14354,
   "type": "line",
   "text": "Sprite frame numbers set at the top of Zuul's tower after the climb (19 19 19 19 00 16 17 00), copied to $2B-$32 at $8C00."
  },
  {
   "address": 14362,
   "type": "line",
   "text": "The game's state table: 64 words, the handler of each state $00-$3F ($3A), read at $7471/$7476 by frame_dispatch_state and jumped to. $00-$05 interview and account, $06-$0D vehicle page, $0E-$0F shop, $10-$12 city map, $13-$15 driving, $16 onwards buildings, busting, Marshmallow Man, Zuul and the endings (handlers $747E-$8D7F). Typed as words to leave the handlers' labels to their ranges."
  },
  {
   "address": 14363,
   "type": "line",
   "text": "High byte of each state handler (state_handlers + 1), LDA $381B,X at $7476."
  },
  {
   "address": 14490,
   "type": "line",
   "text": "ZUUL in screen codes ($1A $15 $15 $0C), put on map row 11 at $55CC by $7B5A (three) and $7B74 (the L)."
  },
  {
   "address": 14493,
   "type": "line",
   "text": "The L of zuul_label, read alone by LDA $389D at $7B74 and written to $55CF."
  },
  {
   "address": 14494,
   "type": "line",
   "text": "Keyboard table, 64 entries by column x 8 + row: the PETSCII character each key gives, $21 for keys the game ignores, $2F for the function keys and RUN/STOP (codes kept in $19, character ignored). Read by scan_keyboard ($9726/$9739)."
  },
  {
   "address": 14558,
   "type": "line",
   "text": "Text page 20 (pointer at $B36D): 1. COMPACT: $2000 / CARRIES 5 ITEMS OF CARGO / TOP SPEED 75 MPH. PETSCII, $9B sets column 27, $0D new line, $FF end; typed by the text engine on the car picture."
  },
  {
   "address": 14626,
   "type": "line",
   "text": "Text page 21: 2. 1963 HEARSE: $4800, CARRIES 9 ITEMS OF CARGO, TOP SPEED 90 MPH."
  },
  {
   "address": 14698,
   "type": "line",
   "text": "Text page 22: 3. STATION WAGON: $6000, CARRIES 11 ITEMS OF CARGO, TOP SPEED 110 MPH."
  },
  {
   "address": 14774,
   "type": "line",
   "text": "Text page 23: 4. HIGH-PERFORMANCE: $15000, CARRIES 7 ITEMS OF CARGO, TOP SPEED 160 MPH (no space before the $: it fills the column)."
  },
  {
   "address": 14852,
   "type": "line",
   "text": "CITY'S PK ENERGY: (18 characters, no end mark), written to row 24 by frame_pk_balance_line ($729A)."
  },
  {
   "address": 14870,
   "type": "line",
   "text": "Play message 0 (table $B3F4/$B3FE, shown by $99CC): YOU HAVE NO EMPTY TRAPS. GO BACK TO GHQ. $FF-terminated."
  },
  {
   "address": 14912,
   "type": "line",
   "text": "Play message 1: YOUR BACKUP MEN ARE ALL OUT OF ACTION. GO BACK TO GHQ."
  },
  {
   "address": 14968,
   "type": "line",
   "text": "Play message 2: SORRY, NO BAIT."
  },
  {
   "address": 14985,
   "type": "line",
   "text": "Play message 3: BACKPACKS DISCHARGED. GO BACK TO GHQ."
  },
  {
   "address": 15024,
   "type": "line",
   "text": "Play message 4: -MARSHMALLOW ALERT-"
  },
  {
   "address": 15045,
   "type": "line",
   "text": "Play message 5: MARSHMALLOW MAN DID $4000 WORTH OF DAMAGE. THAT AMOUNT WILL BE DEDUCTED FROM YOUR BALANCE."
  },
  {
   "address": 15137,
   "type": "line",
   "text": "Play message 6: MAYOR AWARDS YOU $2000 FOR AVERTING MARSHMALLOW CATASTROPHE."
  },
  {
   "address": 15199,
   "type": "line",
   "text": "Play message 7: YOUR CAR IS LOADED TO CAPACITY."
  },
  {
   "address": 15232,
   "type": "line",
   "text": "Play message 8: YOU CROSSED THE STREAMS((( FORTUNATELY YOUR BACKPACKS SHORTED OUT IN TIME. GO BACK TO GHQ. The ((( print as !!! (glyph $28)."
  },
  {
   "address": 15324,
   "type": "line",
   "text": "Stops the voice-3 sound effect at once: script pointer high byte $E8 = 0 (idle), $D412 = 0 (gate and waveform off), wait counter $EA81 = 0, and $98 = 0 so the music may use voice 3 again (music_voice3_busy $9593). Called from the shop ($786D) and $863A/$8677."
  },
  {
   "address": 15337,
   "type": "line",
   "text": "Sound-effect player, once per frame from the raster IRQ ($8FBD). Idle while $E8 = 0. Counts the wait $EA81 down: at 0 it runs the script (sfx_run $3C31); when it equals $EA80 the gate is released ($D412 = $EA7D); $EA80 is only ever $FF ($3D4B), so that release never comes from here. Then the trill: while $EA7E is non-zero it is negated each frame and voice 3's frequency high byte is $EA83 + $EA7E + 1, alternating above and below; the slide: $EA84 positive raises $EA83 by 1 a frame, negative lowers it ($D40F)."
  },
  {
   "address": 15409,
   "type": "line",
   "text": "Runs script commands until one that waits: fetches a byte (sfx_fetch), low nibble = command 1-15 (0 = end: $EA81, $E8 and $98 cleared), high nibble = its argument; jumps to the handler from $3D84/$3D93 through the vector $E9/$EA with the byte in A (and $EA7B). Commands 1-3 end the frame, 4 and above continue with the next byte. Handlers: 1 wait, 2 gate note, 5 sub-commands, 6 note, 7 trill, A count, B pulse width, C waveform, D bend; 3, 4, 8, 9, E, F do nothing ($3D5B)."
  },
  {
   "address": 15451,
   "type": "line",
   "text": "JMP ($00E9) with A = the command byte $EA7B: calls the handler sfx_run picked."
  },
  {
   "address": 15457,
   "type": "line",
   "text": "Returns the next script byte in A: LDA ($E7,X) with X = 0, then advances the pointer $E7/$E8; X is preserved in $EA7C."
  },
  {
   "address": 15474,
   "type": "line",
   "text": "Command 1: wait. $EA81 = sfx_durations[high nibble] frames ($3D5C). Also the first half of command 2."
  },
  {
   "address": 15486,
   "type": "line",
   "text": "Sets the wait (sfx_cmd_wait) and turns the gate on: $D412 = $EA7D OR 1."
  },
  {
   "address": 15498,
   "type": "line",
   "text": "Command 2: wait by the high nibble, gate on, then falls into command 6 (sfx_cmd_note) with the next byte as the note."
  },
  {
   "address": 15501,
   "type": "line",
   "text": "Command 6: the next script byte is a note number (0-95, C0-B7): voice 3 frequency from $3E5A (low) and $3DFA (high), the high byte also kept in $EA83 for trills and slides; the note in $EA86."
  },
  {
   "address": 15524,
   "type": "line",
   "text": "Command 5: a sub-command chosen by the high nibble AND 7 through $3DA2/$3DAA and $E9/$EA: 0 ADSR ($3CB8), 1 slide ($3CC5), 2 loop ($3CCC), 3-7 nothing."
  },
  {
   "address": 15544,
   "type": "line",
   "text": "Sub-command 0: the next two script bytes go to voice 3's attack/decay ($D413) and sustain/release ($D414)."
  },
  {
   "address": 15557,
   "type": "line",
   "text": "Sub-command 1: the whole command byte goes to $EA84, the slide: $15 (bit 7 clear) raises the pitch each frame, $95 lowers it (sfx_tick)."
  },
  {
   "address": 15564,
   "type": "line",
   "text": "Sub-command 2: the next byte is a negative offset; $EA7F is counted down and, until it reaches 0, the script pointer moves back by the offset (plus the $FF carry), repeating the commands before it. $EA7F comes from command A."
  },
  {
   "address": 15584,
   "type": "line",
   "text": "Command 7: $EA7E = high nibble, the trill width in frequency high-byte steps (0 = off)."
  },
  {
   "address": 15592,
   "type": "line",
   "text": "Command A: $EA7F = high nibble, the repeat count for the loop sub-command."
  },
  {
   "address": 15600,
   "type": "line",
   "text": "Command B: pulse width of voice 3, high nibble to $D411, the next byte to $D410."
  },
  {
   "address": 15614,
   "type": "line",
   "text": "Command C: control register of voice 3 = sfx_waveforms[high nibble] ($3D74) to $D412; $EA7D = the same with the gate bit clear."
  },
  {
   "address": 15631,
   "type": "line",
   "text": "Command D: adds the high nibble, sign-extended from the command byte's bit 7, to the frequency high byte $EA83 and $D40F."
  },
  {
   "address": 15652,
   "type": "line",
   "text": "Starts sound effect Y (0-4) on voice 3 unless one is playing ($E8 non-zero): wait 1, ADSR, pulse, frequency and control of voice 3 cleared, $EA7D/$EA7E/$EA84 = 0, $98 = $EA80 = $FF (voice 3 taken from the music), pointer $E7/$E8 from $3DB4/$3DB9. X is preserved. Called with Y = 0 at $8218 (a Roamer vacuumed into the car), 2 at $7867 (the shop's forklift), 3 at $867C. Effects 1 and 4 are never started (no other caller in the image)."
  },
  {
   "address": 15707,
   "type": "line",
   "text": "RTS: the handler of the unused commands 3, 4, 8, 9, E, F and sub-commands 3-7."
  },
  {
   "address": 15708,
   "type": "line",
   "text": "Wait lengths in frames for commands 1 and 2, by high nibble: 2 4 6 8 12 16 18 20 24 28 32 36 40 48 0 64."
  },
  {
   "address": 15724,
   "type": "line",
   "text": "Eight bytes $FE $FD $FB $F7 $EF $DF $BF $7F (one bit clear each): nothing reads them (sfx_durations is indexed 0-15 only; no other reference by address; never read in the simulator runs)."
  },
  {
   "address": 15732,
   "type": "line",
   "text": "Voice 3 control values for command C, by high nibble: $10-$15, $20-$23, $40-$43, $80, $81 (triangle, sawtooth, pulse, noise, with gate/sync/ring bits). $3D83 also sits where the handler-low table's unused entry 0 would be."
  },
  {
   "address": 15747,
   "type": "line",
   "text": "Low bytes of the command handlers, indexed by command 1-15 ($3D84-$3D92; index 0 is sfx_waveforms' last byte, never used as a handler): read at $3C3C."
  },
  {
   "address": 15762,
   "type": "line",
   "text": "High bytes of the command handlers for commands 1-15 ($3D93-$3DA1), read at $3C41; index 0 is the low table's last entry."
  },
  {
   "address": 15778,
   "type": "line",
   "text": "Low bytes of the eight sub-command handlers of command 5 (ADSR $3CB8, slide $3CC5, loop $3CCC, then $3D5B x5), read at $3CAB; high bytes at $3DAA."
  },
  {
   "address": 15786,
   "type": "line",
   "text": "High bytes of the eight sub-command handlers ($3DAA-$3DB1), read at $3CB0. $3DB2-$3DB3 after it are two zero bytes nothing reads."
  },
  {
   "address": 15796,
   "type": "line",
   "text": "Low bytes of the five effect scripts ($3DBE, $3DC8, $3DD6, $3DE1, $3DED), read by sfx_start at $3D4E; high bytes at $3DB9."
  },
  {
   "address": 15801,
   "type": "line",
   "text": "High bytes of the five effect scripts, read at $3D53."
  },
  {
   "address": 15806,
   "type": "line",
   "text": "The five sound-effect scripts (commands in sfx_run): 0 (vacuum) ADSR $90/$F1, slide down, note 64, noise, wait 36, end; 1 ADSR, pulse, trill 1, note 67 for 8 frames, slide up then down, wait 8; 2 (forklift) pulse, trill 1, note 45 for 64 frames; 3 slide down, trill 2, note 72 for 64 frames; 4 noise with trill 2 and a 15-times loop of triangle bursts. 1 and 4 are never started."
  },
  {
   "address": 15866,
   "type": "line",
   "text": "High bytes of voice 3 frequencies for notes 0-95 (C0-B7), read at $3C9A: the same NTSC equal-tempered values as the music's table $A1F4, split in two."
  },
  {
   "address": 15962,
   "type": "line",
   "text": "Low bytes of the note frequencies (notes 0-95), read at $3C94."
  },
  {
   "address": 16058,
   "type": "line",
   "text": "City map: low bytes of the colour RAM address of each of the 20 buildings (top-left cell), read by frame_colour_buildings ($711A); high bytes at $3ECE (ORed with $D8)."
  },
  {
   "address": 16078,
   "type": "line",
   "text": "High bytes (0-3, ORed with $D8) of the 20 buildings' colour RAM addresses, read at $711F."
  },
  {
   "address": 16098,
   "type": "line",
   "text": "The 4 map colours of a building by its state AND 3 (0 green, 1 purple, 2 white, 3 red), read at $7139."
  },
  {
   "address": 16102,
   "type": "line",
   "text": "Building screen sprite targets: $3EE6-$3EED to $B0-$B7 (sprites 0-3) and $3EEE-$3EF5 to $B8-$BF (sprites 4-7), copied at $84C6/$84CB when the building screen starts."
  },
  {
   "address": 16110,
   "type": "line",
   "text": "Targets x,y of sprites 4-7 on the building screen (to $B8-$BF at $84CB); its $3EF0/$3EF1 are also read alone at $8552/$8557 to reset sprite 6's target."
  },
  {
   "address": 16112,
   "type": "line",
   "text": "Sprite 6's target x on a building screen, reloaded into $BC at $8552; part of bldg_sprite_goal_4_7."
  },
  {
   "address": 16113,
   "type": "line",
   "text": "Sprite 6's target y, reloaded into $BD at $8557; part of bldg_sprite_goal_4_7."
  },
  {
   "address": 16118,
   "type": "line",
   "text": "Starting x,y of the 8 sprites on a building screen: $3EF6-$3EFD to $A0-$A7 ($84BC), $3EFE-$3F05 to $A8-$AF ($84C1)."
  },
  {
   "address": 16126,
   "type": "line",
   "text": "Starting x,y of sprites 4-7 on a building screen, read at $84C1."
  },
  {
   "address": 16134,
   "type": "line",
   "text": "Row 0 of the city map, 40 screen codes of the map charset (the avenue signs 1ST-5TH), written by state $11 at $7B4F. Its last byte is also the first of map_block_shapes."
  },
  {
   "address": 16173,
   "type": "line",
   "text": "City map block shapes: 7 kinds x 20 screen codes (5 wide, 4 rows; $3F2D-$3FB8), drawn by draw_map_building_row ($9626) at offset $A855[kind] + $A85D[row]. Kind 0 is the flattened block the Marshmallow Man leaves ($89D3), 1-6 the buildings; offset $8C for a kind 7 would read the status text, but no code sets 7."
  },
  {
   "address": 16313,
   "type": "line",
   "text": "The status report shown on SPACE in play: BACKPACK POWER AT XX% OF MAXIMUM... X EMPTY TRAPS... X MEN LEFT... ($FF end at $3FFC), copied as screen codes by $71A4 and the X figures patched in."
  },
  {
   "address": 16381,
   "type": "line",
   "text": "Three bytes after the status report ($FF $AA $AA) that nothing reads (no reference; not read in any simulator run). $4000 onwards is the rebuilt video bank."
  },
  {
   "address": 24576,
   "type": "line",
   "text": "Cold start, the game's first instruction; RUN/STOP+RESTORE also lands here (nmi_restore_handler). SEI, stack $FF, screen blanked, CIAs quietened ($8FD8); NMI vector $FFFA = $6425, IRQ vector $FFFE = $8E76; $01 = $35 (RAM at $A000/$E000, I/O in), $00 = $2F; the 47 VIC registers $D000-$D02E from the table at $371D; VIC bank 1 ($DD00 bits 0-1 = %10); zero page $02-$FE cleared; $4000-$5FFF cleared. Builds two 256-byte lookup tables: $E700 = the byte with its four 2-bit multicolour pixels in reverse order (a horizontal mirror), $E600 = each pixel pair with either bit set turned into %11 (x OR its bit-pairs swapped). Copies the character ROM's upper-case set, $D008-$D3FF, to $5808 (char 0 left alone) with CHAREN off, then 128 bytes from $36A4 over chars $1B-$2A (the ACTIVISION logo glyphs, and '(' drawn as '!'), and the letter O's shape over the digit 0 ($5878 -> $5980). Colour RAM cleared to 0, row 24 set to white; the 120-byte line buffer $EB00-$EB77 filled with spaces, $EB78 = $FF. Then falls into rle_unpack."
  },
  {
   "address": 24843,
   "type": "line",
   "text": "Run-length unpacker: rebuilds the video bank from the packed stream at $B408 (pointer $0B/$0C) into $4000 onwards (pointer $23/$24). A byte other than $11 is copied; $11 is followed by a count and stands for that many zero bytes (a count of 0 means 256). Stops when the source pointer reaches $BFF8 or beyond (the test is only low byte >= $F8 with high byte >= $BF). Continues at build_mirrored_sprites."
  },
  {
   "address": 24899,
   "type": "line",
   "text": "rle_unpack's helper: advance the packed-stream pointer $0B/$0C by one byte."
  },
  {
   "address": 24906,
   "type": "line",
   "text": "rle_unpack's helper: advance the output pointer $23/$24 by one byte."
  },
  {
   "address": 24913,
   "type": "line",
   "text": "Makes left-facing copies of eight sprite shapes after unpacking: the four shapes at $4640-$473F go to $4F00-$4FFF and the four at $4740-$483F to $5000-$50FF, each 3-byte row written with its bytes in reverse order and every byte passed through the mirror table $E700, so each copy is the multicolour shape flipped left to right. Steps X down by 3 from $FC, skipping the 64th (padding) byte of each shape; stops when X passes zero. (Both areas are in the rebuilt video bank.)"
  },
  {
   "address": 24986,
   "type": "line",
   "text": "Title setup, continuing the cold start: initialises zero page $33-$DB and silences sprites and SID ($9002), bumps $06, silences the SID again (silence_sid); clears the screen $5400-$57FF to char 0 and colour RAM to $09 (multicolour, white), rows 2-4 to $0A (multicolour, red); copies the title's 192 characters $6960-$6F5F to $5A00-$5FFF (chars $40-$FF); draws the GHOSTBUSTERS logo (logo_map_row0-2, 3 rows of 30 at row 2 column 5) and the no-ghost sign (no_ghost_sign_map, 12 rows of 18 at row 6 column 11); colours the lyric window (rows 20 and 24 white, rows 21-22 red). Sprite 1 multicolour, sprite 0 pointer $0D ($4340), both at X $40 Y $80. Lyric pointer $21/$22 = $6443 (lyric_text), music reset ($93E2, $88-$8A = $FF, $929C). Measures the last raster line: $EA73 = $FF if its low byte is $14 or more (PAL, 312 lines) and $00 otherwise (NTSC). Raster IRQ at line $B8, screen on (D011 $18, D016 $1B multicolour), background colours 1 white and 2 red; speaks phrases 1 and 3 ($8DB9), then zeroes the tick $08 and the lyric index $97, resets the music again and enables interrupts."
  },
  {
   "address": 25349,
   "type": "line",
   "text": "The title screen's main loop, once per frame: waits for raster line $28 on the top half, then puts D011 ($18), D016 ($1B) and the background colours back after the IRQ's lower split, and jumps over the name_entered_flag byte to title_frame_work."
  },
  {
   "address": 25384,
   "type": "line",
   "text": "Flag, a byte kept in the code: 0 in the image, set to 1 at $74CA once a name has been typed and copied to $EAB3; read at $7485. With F3 at the title and this flag set, the interview is skipped: the stored name and account are decoded again ($9155) and play goes straight to vehicle selection (seen in the simulator). With the flag clear F3 runs the full interview like F1. Neither the cold start nor RESTORE clears it, so it lasts until the machine is reset."
  },
  {
   "address": 25385,
   "type": "line",
   "text": "Title loop body: reads the joystick ($96CA) and keyboard ($96E8), plays the tune ($93F0), $91C8, and ticks the lyric timer (lyric_timer_tick); on PAL ($EA73 set) one frame in eight does $91C8 and the tick twice, 9 ticks per 8 frames, about 56 a second against 60 on an NTSC machine, so the song keeps nearly the same tempo. Scrolls the lyric window while $9A counts down: when $9A&7 reaches 7 rows 21-22 ($5748) move up to rows 20-21 and row 22 is cleared, when $9A&15 reaches 0 the next lyric line is printed on row 22 ($9682). SPACE ($17 = $20) when no scroll is running speaks phrase 1 ($8DB9 with A = 1). F1 or F3 (key code $19 = $20 or $28) stores the key in $EAB2, silences the SID and jumps to start_game; anything else loops to title_loop."
  },
  {
   "address": 25519,
   "type": "line",
   "text": "Writes zero to all 32 SID registers $D400-$D41F (volume off, all voices silent). Called from the title setup, on leaving the title, and at $8DB1."
  },
  {
   "address": 25530,
   "type": "line",
   "text": "Advances the title's tick counter $08 and cues the lyrics: while the lyric index $97 is below $70, when $08 equals lyric_line_times[$97] the index moves on, and if that entry is not zero $9A gets $10 added, starting a 16-step scroll that ends with the next line printed. A zero entry matches when $08 wraps to 0, so it only waits out one lap of 256 ticks. Called once a frame from title_frame_work (twice in one frame of eight on PAL) and from $8E21 while speech plays."
  },
  {
   "address": 25559,
   "type": "line",
   "text": "A silent copy of the tune sequencer's note stepping ($93F0): for each of the three voices (X = 2..0) it counts down the duration $88,x, and when it runs out reads the next note event through the voice's track list ($A2B7/$A2BA, index $82,x) and pattern ($A75B/$A75C table, offset $85,x): the event's low five bits are the next duration, it is one byte long plus one for each of bits 7 and 6, and with bit 7 set the low nibble of the byte two on goes to $94,x; an $FF after it ends the pattern (offset 0, next track entry). It writes no SID register and, unlike $93F0, does not test for a stopped voice or the track list's $FF. Called only from $8E1E, when $08&3 is 0 while digitised speech plays on the title, so the tune keeps its place and resumes in step with the lyrics."
  },
  {
   "address": 25637,
   "type": "line",
   "text": "NMI handler (vector $FFFA set at cold_start): if the key code $19 is $3F (RUN/STOP held) it blanks the screen, clears $EAB2 and restarts at cold_start (RUN/STOP + RESTORE); otherwise it returns at once. The speech player points the NMI at $F0C3 while it runs and $8E2F puts $6425 back."
  },
  {
   "address": 25659,
   "type": "line",
   "text": "Eight raster lines ($EE $EF $EF $EF $EB $EC $ED $EE), indexed by $9A&7, the lyric window's fine-scroll step. The IRQ ($8EB7-$8ECB) waits for the chosen line and writes D011 = $1B, ending the scrolled band that began at raster $C1 (where D011 = $18 OR $9A) so that the bottom rows (the copyright and Activision lines) stay still."
  },
  {
   "address": 25667,
   "type": "line",
   "text": "Lyrics of the theme song for the bouncing-ball sing-along, PETSCII, one line per $0D, 53 lines counting the first, which is a single space; $FF at $68EF ends it and the printer ($9682) goes back to $6443. Letters print as screen codes (minus $40); '(' prints as '!' because the title charset replaces char $28 (the 'GHOSTBUSTERS(' and 'I AIN'T 'FRAID OF NO GHOST(' lines). Each line is printed on row 22 of the title screen and scrolled up; the pointer is $21/$22. This part runs from 'IF THERE'S SOMETHING STRANGE' to the line before the first 'YEAH!'."
  },
  {
   "address": 26354,
   "type": "line",
   "text": "Second half of lyric_text (which starts at $6443): from 'YEAH!  YEAH!  YEAH!  YEAH!' through the closing 'WHO YOU GONNA CALL? / GHOSTBUSTERS!' refrains, up to the $FF end mark at $68EF."
  },
  {
   "address": 26864,
   "type": "line",
   "text": "112 cue times for the lyric lines, read by lyric_timer_tick with index $97 ($00-$6F): the value of the tick counter $08 at which the next line scrolls in. 53 non-zero entries, one per lyric line; each $00 entry is a wait of one full lap of $08 (256 ticks) between cues."
  },
  {
   "address": 26976,
   "type": "line",
   "text": "Title character set, multicolour, 8 bytes a character, copied by draw_title_screen to $5A00 as characters $40-$FF; this part, $6960-$6B4F, is chars $40-$7D, the letters of the GHOSTBUSTERS logo (placed by logo_map_row0-2). Pixel pairs: %01 white (D022), %10 red (D023), %11 the colour RAM's colour ($0A, red, on the logo rows 2-4; $09, white, elsewhere)."
  },
  {
   "address": 27472,
   "type": "line",
   "text": "Title character set continued (starts at $6960): chars $7E-$E9, $6B50-$6EAF, the no-ghost sign (the ghost in white inside the red circle and bar), placed by no_ghost_sign_map; char $7E is the blank background inside the sign's box."
  },
  {
   "address": 28336,
   "type": "line",
   "text": "GHOSTBUSTERS logo screen map, first row: 30 character codes copied to screen $5455 (row 2, column 5) by draw_title_screen. The same page copy also puts $6EB0-$6F5F into the charset as chars $EA-$FF, which the title never shows."
  },
  {
   "address": 28366,
   "type": "line",
   "text": "GHOSTBUSTERS logo screen map, second row: 30 character codes for screen $547D (row 3, column 5)."
  },
  {
   "address": 28396,
   "type": "line",
   "text": "GHOSTBUSTERS logo screen map, third row: 30 character codes for screen $54A5 (row 4, column 5)."
  },
  {
   "address": 28426,
   "type": "line",
   "text": "No-ghost sign screen map: 12 rows of 18 character codes ($7E-$E9), copied by draw_title_screen to screen $54FB onwards (rows 6-17, columns 11-28), 40 bytes apart on screen."
  },
  {
   "address": 28642,
   "type": "line",
   "text": "Leaves the title for the game: sets the mode $20 to 1 (0 on the title), D011 = $1B, clears screen and colour RAM ($95B9), then falls into game_frame_loop."
  },
  {
   "address": 28652,
   "type": "line",
   "text": "Top of the game's per-frame loop, jumped back to from $8D8D: waits for the frame flag $E2 (set to 1 by the IRQ at $8FB8) and clears it, turns the screen on, or blanks it while $45 bit 7 is set ($45 is counted up at $70AE and set to $80 on reaching 4, and cleared by joystick input at $96E3), clears D011's raster bit 8, sets the border black (Y is 0 on both paths), then continues at $7000 with the per-frame work."
  },
  {
   "address": 28675,
   "type": "line",
   "text": "Per-frame work, part 1 (loop top at $6FEC): stores the $D011 and border values chosen above, counts the delay timer $7C down to 0 (set by the states that pause, e.g. $7538 after INVALID ACCOUNT NUMBER), and applies the steering request $64 of the driving scene one step per frame: negative calls $34F9 (dec $63, road shifted one character every 4 steps) and counts up to 0, positive calls $356F (inc $63) and counts down."
  },
  {
   "address": 28708,
   "type": "line",
   "text": "Only in state $15 (driving): sets $D016's fine X scroll to ($63 AND 3)*2 from the car's lateral position $63, puts the x of sprites 2 and 3 ($A4, $A6) at $63+$1E and their y ($A5, $A7) from $A992 indexed by the car bought ($5C: 0 compact, 1 hearse, 2 wagon, 3 high-performance)."
  },
  {
   "address": 28748,
   "type": "line",
   "text": "While $65 is non-zero (counted by the driving code at $810B), cycles sprite 2's colour $D029 through $A996 (blue, light blue, cyan, white) in a triangle wave: ($65 AND $1F) folded to 0-15, divided by 4."
  },
  {
   "address": 28769,
   "type": "line",
   "text": "Reads the joystick ($96CA, into $33) and forces $33 and $34 to $1F (nothing pressed) unless $02 is exactly $80; then scans the keyboard ($96E8). On the first frame after the title ($20 = 1) it sets $20 = 2 and $02 = $80, zeroes $03-$05 and runs the game initialiser $9004 with X = $11 (the start-of-game variables from $9051 into $33-$44, $45-$DB zeroed, state $3A = 0), then returns to the loop top."
  },
  {
   "address": 28812,
   "type": "line",
   "text": "Every 256 frames ($08 = 0): with $02 bit 7 set (always, once the game has started) counts the idle timer $46/$45 up; when $45 reaches 4 (about 262,000 frames, some 87 minutes at 50 Hz, with no input: $96E3 and $974A clear it) it becomes $80 and $6FFB blanks the screen. The other branch ($7094-$70A7: $02 bit 7 clear, count $03 to 8, then $02 = $C0 and re-initialise with X = $0B) has no way in: $02 is $80 from the first frame on and $FF at the end ($8D24), and it never ran in the simulator."
  },
  {
   "address": 28858,
   "type": "line",
   "text": "RUN/STOP pause, in states below $2A: when the key code $19 is $3F (RUN/STOP) in states $12 and above (play), toggles $47 bit 7 (paused) once per press (bit 6 is the key-held latch) and silences the SID ($D418 = 0); otherwise clears the latch and, if not paused, restores the volume from $EA82. Seen live: PK energy stops rising while paused and resumes after a second press."
  },
  {
   "address": 28910,
   "type": "line",
   "text": "While paused ($47 bit 7) nothing below runs. Otherwise counts the frame counter $09 and, when $14 is non-zero, counts it down and re-initialises the game at 0 ($70A2). No instruction writes $14 by name, the indexed writers found do not reach it, and it stayed 0 in every simulator run: a dormant restart timer."
  },
  {
   "address": 28934,
   "type": "line",
   "text": "States $12 (map) and $24 only: recolours five of the twenty buildings per frame (index ($09 AND 3)+16, then down by 4), all twenty in four frames. The colour RAM address is $3EBA/$3ECE (lo/hi OR $D8); buildings 0-3 and 16-19 are 5x2 cells, 4-15 5x4. The colour is $3EE2[state AND 3] (multicolour: 0 green, 1 purple, 2 white, 3 red) from the building's state byte $C8+x; red alternates with green every 16 frames (the flashing haunted building). Finally paints the ZUUL and GHQ labels white ($D9CC-$D9CF, $DB2E-$DB30)."
  },
  {
   "address": 29045,
   "type": "line",
   "text": "SPACE in play (states $12-$29, key $17 = $20, no report showing, $4C = 0): builds the status report in the ticker buffer $E900: the text at $3FB9 (BACKPACK POWER AT XX% OF MAXIMUM... X EMPTY TRAPS... X MEN LEFT...) in screen codes, then patches in backpack power $3E (two BCD digits, leading zero blanked by $9832), empty traps $6B and men left $3D (one digit each). $4C = 1 stops a second report until the first has scrolled off. Seen live on the map."
  },
  {
   "address": 29174,
   "type": "line",
   "text": "The bottom-line ticker, in states $12 and above while a message is in $E900 ($4B non-zero): decrements $49 by 2 each frame (the IRQ reads it at $8EF6, apparently for the fine scroll) and steps the text one character every 4 frames ($4B = window end); at 120 characters shifts the buffer down by 40. Copies 40 characters ending at $4B to row 24 ($5770), blanks past the $FF end, and clears $4A/$4B/$4C when the end has scrolled off. The 'AND #$00' at $7202 makes a frame-rate test that is always true."
  },
  {
   "address": 29293,
   "type": "line",
   "text": "States $12-$29 when no ticker message is showing: row 24 shows CITY'S PK ENERGY: (text $3A04) with the PK energy $5B/$5A as four digits at $5783-$5786 (leading zero blanked) and the balance ($9D24 formats $57-$59 as $nnnnnn into $EA14) at $578E. The second test of state < $2A at $72A6 can never fail."
  },
  {
   "address": 29373,
   "type": "line",
   "text": "Sets the PK rate mask $3C from $9DBA by the thousands digit of the PK energy ($3F below 1000, $1F, $0F, $07, $03, then $01), then types the current message ($4D non-zero, text at ($4E), set up by $9BEE): one character each frame whose $08 AND $15 is 0 ($15 = 0 prints up to 40 at once), $FF ends it. With $15 >= 3 each printable character sounds a click on SID voice 3 (pulse, $3412). $48 = $EA76 is the text colour. Returns to the loop top while typing, so the state handler waits for the message."
  },
  {
   "address": 29511,
   "type": "line",
   "text": "Typed-line input, active while $50 is non-zero ($9C83 sets it to 1): each key in $17 clicks voice 3; RETURN stores a 0 terminator at $E9FF+$50 and ends input ($50 = 0); DEL ($7F) backs up one character unless at the first; any other key is printed in white and stored at $E9FF+$50 ($9C88) while the cursor column $38 is below $25. The buffer is $EA00 on; nothing limits the length except the column. Returns to the loop top while input is open."
  },
  {
   "address": 29593,
   "type": "line",
   "text": "In the shop ($5E non-zero): draws --CREDIT-- (screen codes at $AAD3) at the top right ($541A), a row of dashes under it ($546A), and prints the balance ($9D24, message $80 = the $EA14 buffer) at row 1 column 28, every frame."
  },
  {
   "address": 29629,
   "type": "line",
   "text": "States $12 and above, every 256 frames ($09 = 0): ages each building's state $C8+x (high nibble a timer, bits 2-3 the kind, bits 0-1 the colour). A timer that wraps moves the building on via $A9B4 by kind: kind 0 to $14 (kind 1), kind 1 to $1C (kind 3), kind 2 to $F8, kind 3 to $1F (haunted, red); each stage lasts 15 ticks (3,840 frames). One already at $FF (haunted, unanswered) is cleared and adds 300 to the PK energy ($9895 with 3): the escaped Slimer. Tested in the simulator: $FF poked into a building gave +300. Live (work/verify/t4-escape.js): a building set to $10 reached $14 after 3839 frames, $1C after 7679, $1F (red) after 11519 and escaped (+300 PK, state 0) after 15359."
  },
  {
   "address": 29683,
   "type": "line",
   "text": "Unless the game is in the Zuul phase ($81), adds 1 to the PK energy ($5A, BCD, carried into $5B by $9897) every 64 frames below 1000, every 32 in the 1000s, every 16 from 2000 on (mask $3C OR $0F against $09). Seen live: 7 to 11 in 300 frames at the start."
  },
  {
   "address": 29708,
   "type": "line",
   "text": "Unless in the Zuul phase: when no building is in the first stage (a non-zero state with low nibble below 4), starts 1, 2 or 3 new ones (more as the PK thousands digit rises, counted from $3C): each is the ($23 = random $06, rotated per pick)-th free building, skipping GHQ (index $11), Zuul ($0A) and entries of $EA28 that are 0, and gets state $10."
  },
  {
   "address": 29805,
   "type": "line",
   "text": "Runs the handler for the game state $3A: JMP through the word table at $381A (state*2). Handlers end at $8D86 (next state) or $8D8D (stay), both back to the loop top."
  },
  {
   "address": 29822,
   "type": "line",
   "text": "State $00. If the game was started with F3 ($EAB2 = $28) and a name has been typed in an earlier game ($6328 = 1), decodes the stored account number ($9155; a zero result becomes $10000) and skips the interview to state 6. Otherwise prints message 1 (the franchise form, STATE YOUR NAME- LAST,FIRST:) slowly ($15 = 3), clears the input buffer $EA00-$EA13 and opens line input. Tested in the simulator: F3 on a first game gives the interview; with $6328 poked to 1 it goes to vehicle selection with $10000."
  },
  {
   "address": 29883,
   "type": "line",
   "text": "State $01: copies the typed name (20 bytes of $EA00) to $EAB3, sets $6328 = 1 (a name exists, for F3 next time; the byte lives in the code area and survives RUN/STOP-RESTORE), prints message 2 DO YOU HAVE AN ACCOUNT? and opens input."
  },
  {
   "address": 29912,
   "type": "line",
   "text": "State $02: the first typed character. Y: message 4 WHAT IS YOUR ACCOUNT NUMBER?, input, state 3. N: balance $57 = $01 ($10000 in BCD), message 3 (the bank advances $10000), state 6. Anything else: state 4's code at $7548."
  },
  {
   "address": 29957,
   "type": "line",
   "text": "State $03: converts the typed digits ($9CFC, into $23-$26) and keeps them at $EAC7-$EACA, decodes them ($9155, the routine the ready64 article names as decode-and-check) into the balance $57-$59. A zero balance means invalid: message 5 INVALID ACCOUNT NUMBER. at row $0F, delay $7C = $BF frames, state 4; otherwise state 6."
  },
  {
   "address": 30020,
   "type": "line",
   "text": "State $04: waits for the delay $7C to run out, then (also entered at $7548 from a bad Y/N answer) prints message $0C (the text at $EB00, a page of spaces at run time) from row $0D, instantly ($15 = 0), erasing the answer, and goes to state 5."
  },
  {
   "address": 30047,
   "type": "line",
   "text": "State $05: cursor to row $0C, slow typing, and back to asking DO YOU HAVE AN ACCOUNT? (sets state 1 and joins state 1 after its name copy, at $74CD, which moves on to state 2)."
  },
  {
   "address": 30066,
   "type": "line",
   "text": "State $06: clears the screen ($95B9), cursor to row 1 column 1, next state. Every return to the vehicle page (a key other than 1-4 or SPACE, or a car the balance cannot pay for) starts here."
  },
  {
   "address": 30078,
   "type": "line",
   "text": "State $07: prints message 6, GHOSTBUSTING VEHICLE SELECTION: and the four cars with prices, at once ($15 = 0)."
  },
  {
   "address": 30090,
   "type": "line",
   "text": "State $08: prints message 7 (YOU HAVE) slowly and saves the balance $57-$59 as the starting balance $51-$53, which the end of the game compares against ($7C43)."
  },
  {
   "address": 30114,
   "type": "line",
   "text": "State $09: formats the balance ($9D24) into $EA14, strips leading spaces ($9063) and prints it (message $80, white)."
  },
  {
   "address": 30128,
   "type": "line",
   "text": "State $0A: prints message 8 (PRESS SPACE BAR TO VIEW CAR OPTIONS ... GO AHEAD:), sets the car shown by SPACE ($5C) to 0 and opens input. The three bytes at $75BF are state $0B's jump back to state 6."
  },
  {
   "address": 30146,
   "type": "line",
   "text": "State $0B's SPACE branch: draws car $5C's picture ($7667 builds its characters, $95B9 clears the screen, $35E6 places them), writes the two instruction lines from $AD5C and $AD82 on rows 21-22 in black, sets multicolours ($D022 white, $D023 from $A89D by car), prints the car's description (message $B3A5[$5C] = $14-$17: cargo and top speed) and cycles $5C to the next car; each SPACE shows the next of the four."
  },
  {
   "address": 30229,
   "type": "line",
   "text": "Converts the PETSCII character in A to a screen code: space ($20) becomes 0, $40 and above lose $40, the rest pass. Used for the ticker line and the vehicle page's instructions."
  },
  {
   "address": 30245,
   "type": "line",
   "text": "State $0B: the typed line's first character. Below '1': SPACE shows the next car ($75C2), anything else back to state 6. '1'-'4': car $5C = 0-3, price from $A1D4 (hundreds/thousands BCD) and $A1D8 (ten-thousands); if the balance covers it ($9654) it is paid ($9636, BCD subtract: POKE 38454,96 makes it an RTS, so nothing is ever paid for), screen cleared, next state. Too dear, or '5' and above: back to state 6."
  },
  {
   "address": 30305,
   "type": "line",
   "text": "State $0C: builds the bought car's character set ($7667) and moves on."
  },
  {
   "address": 30311,
   "type": "line",
   "text": "Builds the car picture for car $5C in character memory: copies 768 bytes from $AAFF/$AB03 (pages $0200, $0500, $0800, $0B00 for the four cars) to $5A00-$5CFF, then the same 768 bytes again in reverse 128-byte blocks through the table at $E700 (built at run time; it reverses the order of the four 2-bit pixels in a byte) to $5D00-$5FFF: the picture is 12 columns of 16 characters, of which the image holds 6 and the other 6 are their mirror image. Seen in the simulator: the shop shows a full, symmetrical car."
  },
  {
   "address": 30399,
   "type": "line",
   "text": "State $0D: places the car picture's characters on the screen ($35E6: twelve columns from $54B2, colour 8) and moves on."
  },
  {
   "address": 30405,
   "type": "line",
   "text": "State $0E: sets up shop page $5D (0 monitoring, 1 capture, 2 storage): multicolours, message 9+$5D (the page text), instant typing; fills the five shelves $2E-$32 from $AAB3 (8 bytes a page; item codes $33-$3A), leaving empty any item whose bit in $6D ($A9A8) shows it was bought; forklift and shelf sprite positions from $AAA6 and $A988; multicolour sprites; $5E = 1 (the credit display)."
  },
  {
   "address": 30537,
   "type": "line",
   "text": "State $0F, the shop each frame: eases every sprite toward its target by up to 3 pixels ($9C23), widens sprites 1-2, and places the forklift and the carried item from its position $5F (bits 2-4 the shelf row, bits 0-1 0 at the shelves and 1 at the car), the item carried $60 (shelf row + 3, 0 for none) and its car slot $61; a trap's slot moves up by 3 per trap bought ($6A). With nothing carried the column bits are cleared every frame ($775D), so the forklift only reaches the car with an item. The shelf items are sprites 3-7, their frame numbers the item codes $33-$3A."
  },
  {
   "address": 30730,
   "type": "line",
   "text": "Fire pressed at the shelves: with nothing carried, picks up the item on the forklift's shelf ($60 = row+3, car slot $61 from $AA8E by page); carrying the item from this same shelf, puts it back."
  },
  {
   "address": 30816,
   "type": "line",
   "text": "While any sprite is still moving ($9C15) starts sound effect 2 on voice 3 ($3D24) and ignores the stick; otherwise silences voice 3 ($3BDC) and reads it: right moves to the car (kept only while carrying), left back to the shelves, and at the shelves with nothing carried down/up change shelf row, capped by $AAB0 per page (3, 3, 1 items)."
  },
  {
   "address": 30936,
   "type": "line",
   "text": "Fire at the car: when the car already holds its capacity ($62 >= $AA9A[$5C]: 5, 9, 11, 7) shows YOUR CAR IS LOADED TO CAPACITY. ($99CC, 7). Otherwise, carrying an item and at rest, buys it if the balance covers the price $A1DC[item-$33] (hundreds, BCD: $400, $800, $800, $400, $600, $600, $500, $8000): pays ($9636), sets its bit in $6D, counts the load $62; a trap ($38) adds to traps owned $6A and empty traps $6B, bait ($36) adds 5 dollops to $69. Item $37 has a price ($600) but is on no shelf."
  },
  {
   "address": 31038,
   "type": "line",
   "text": "Paints the bought item into the car picture: takes the carried sprite's shape (pointer $57F8+$60, data at $4000+ptr*64), shifts it right by (x-$57) AND 3 pixel pairs into $E800, and ORs it through the mask table $E600 into the car's character data at $5A00+ (address from the sprite's position); then parks the sprite off screen at its shelf and empties the shelf unless the item is a trap, which can be bought again."
  },
  {
   "address": 31323,
   "type": "line",
   "text": "Shop keys: E ends shopping, but only once a trap has been bought ($6A, TRAPS -REQUIRED-), to the next state; 1-3 switch to another page: sets state $0D and increments it at once, so page set-up $0E runs without redrawing the car, after clearing $4D, $5E and the forklift variables; other keys are ignored."
  },
  {
   "address": 31388,
   "type": "line",
   "text": "State $10, leaving the shop for the map: sprite positions $EA46-$EA55 from $37B3 and targets $EA56-$EA65 from $37C3 (sprites 4-7, the Roamers, aimed at Zuul, $62/$7A), sprite frames $C0-$C7 from $3793; copies the car picture $5A00-$5FFF to $E000-$E5FF ($9D96, 6 pages) for later, clears the music player's voice state $82-$8A ($93E2), clears the screen."
  },
  {
   "address": 31445,
   "type": "line",
   "text": "State $11: draws the city map: copies the map character set from $2A50-$304F to $5A00-$5FFF ($9D96), colour RAM to $0D (multicolour green), multicolours yellow and black; draws the thirty map pieces ($95EB with X = 29-0 and Y = 3-0; screen addresses $A861/$A87F, shapes by $EA28), a row of character $A9 in blue on row 21, the street signs (4 rows of 11 characters from $3767) and the avenue signs (row 0 from $3F06), the ZUUL ($389A, row 11) and GHQ ($B3AA, row 20) labels in white; copies the map sprites' frames, positions and targets from $C0, $EA46, $EA4E, $EA56, $37CB into $2B, $A0, $A8, $B0, $B8."
  },
  {
   "address": 31659,
   "type": "line",
   "text": "State $12, the city map each frame, part 1: saves the Roamers' positions (sprites 4-7) to $EA46; a Roamer that reaches its target $EA56 (Zuul) adds 100 PK ($9895 with 1) and is restarted ($9851). Faces each Roamer left or right (frame 8 or 9) by its target. From PK 5000 ($5B >= $50) the Keymaster and Gatekeeper (sprites 2, 3) are sent to Zuul ($3802) when they pass the point $37FE, and from 9500 wherever they are. Live: a Roamer placed next to Zuul added 100 (work/verify/t3-roamer-zuul.js); from 5000 the two met at Zuul at PK 8495-9999 in eight runs, from 9500 within 188 frames (work/verify/t6b-keymaster-spread.js, t6-keymaster.js)."
  },
  {
   "address": 31790,
   "type": "line",
   "text": "When sprites 2 and 3 both stand on Zuul ($3802-$3805), once ($81 = 0): a balance below the starting one ($51-$53) goes to state $2D (the foreclosure ending); otherwise $81 = 1, the Zuul phase: GO TO ZUUL! SNEAK PAST THE MARSHMALLOW MAN... ($99CC, 9), $7C = $FF, sprites 0-1 (the logo) are sent to $63/$92 by themselves. On that frame every building state is zeroed, on each later one set to 1, and Zuul's ($D2) to $0F (red, flashing). An equal balance counts as enough: only a smaller one forecloses."
  },
  {
   "address": 31877,
   "type": "line",
   "text": "Moves the map sprites 2 pixels toward their targets ($9C25) on frames where $09 AND $3C is 0 (faster as PK rises): sprites 2-7 when active ($C0+n); sprites 0-1, the logo, only in the Zuul phase."
  },
  {
   "address": 31917,
   "type": "line",
   "text": "Outside the Zuul phase, the logo (sprite 0 at $A0/$A1) follows the joystick along the streets only: on one of the five avenues ($37D3 pairs, x) up/down move it between y $43 and $BA and snap x onto the avenue; on one of the four streets ($37DF pairs, y; a fifth pair is $FF, never matched) left/right move it between x $1E and $8D and snap y onto the street."
  },
  {
   "address": 32035,
   "type": "line",
   "text": "Sprite 1 follows the logo. For each building whose rectangle ($37D3 columns, $37DD rows; they overlap, so on a street both the building above and the one below qualify, and the lower index wins) holds the logo: $6E = that building; its colour bits show its kind if the matching instrument is owned ($A9B0 in $6D: the PK energy detector for kinds 1 and 3, the marshmallow sensor for kind 2), else 0; a haunted one ($xF) stays red, and a kind-3 building with the detector owned turns haunted ($1F) at once. Buildings not under the logo lose colours 1 and 2 (a low nibble of $0C or more is kept): by this code the pink and white warnings show only on the building the logo is at. Live (work/verify/t2-warnings.js): building 15 at $34 turned $35 (purple) with the detector and the logo beside it, stayed $34 without the detector or with only the sensor, and went back to $34 when the logo left; a Marshmallow building $C8 turned $CA (white) only with the sensor; building 8 at $3C became $1F with the detector."
  },
  {
   "address": 32170,
   "type": "line",
   "text": "A Roamer (sprites 4-7) within about 8 pixels across and 13-17 down of the logo stops where it is and, if not already marked, records the route length $66 (at least 1) in $6F-$72, the distance at which it is met on the drive (live: poking $6F put a Roamer on the road, work/verify/t13-vacuum.js). For sprites 2-3 the branch is three NOPs: an action removed."
  },
  {
   "address": 32255,
   "type": "line",
   "text": "The Keymaster and Gatekeeper (sprites 2, 3) at a street crossing ($37EA five x, $37F1 four y) pick the next crossing north, east, south or west from two bits of the random byte $06 ($37F6/$37F7 steps into $37E9/$37F0): they wander the grid."
  },
  {
   "address": 32341,
   "type": "line",
   "text": "In the Zuul phase, once the logo reaches Zuul ($63/$92) and $7C has run out: building $0A, state $16 (the drive). Otherwise fire picks the building under the logo ($6E; stick held down means the one below the street, +4). GHQ ($11) always goes; Zuul only in the Zuul phase; any other building needs empty traps ($6B, else NO EMPTY TRAPS), two men ($3D, else BACKUP MEN ARE ALL OUT OF ACTION) and backpack power ($3E, else BACKPACKS DISCHARGED); none of this tests whether the building is haunted. No route drawn ($66 = 0): state $16, else state $13."
  },
  {
   "address": 32472,
   "type": "line",
   "text": "When the marshmallow building $80 (chosen by $98D6 as PK crosses a thousand from 5000) has aged to $F8-$FB: clears it, sends the Roamers (sprites 4-7) to four points around it ($37EA/$37F1 by its column and row), clears the bait flag $68, shows -MARSHMALLOW ALERT- ($99CC, 4) and goes to state $24. The pick sets the building to $C8, so the alert comes 769-1024 frames after it. Because $68 is cleared here, bait put down before the alert is wasted; B during state $24 counts (live, work/verify/t7-marshmallow.js). A building replaced in $80 by a newer pick before its alert stays $F8 for good (stage 2 ages into $F8 again, $A9B4), live: work/verify/t17-mm-orphan.js."
  },
  {
   "address": 32553,
   "type": "line",
   "text": "Draws the route: the screen cell under the logo ($547C + row table $A915/$A92F, column (x-$1D)/4), if empty, gets the dot character $40 in colour 0 (black); each new cell counts the route length $66 up (stops at 255). $1F remembers the last cell."
  },
  {
   "address": 32624,
   "type": "line",
   "text": "B on the map: with no bait ($69 = 0) shows SORRY, NO BAIT.; otherwise takes one dollop and, if no bait is down ($68 = 0), draws it (characters $41-$42, colour 3) under the logo and sends the Roamers (sprites 4-7) to the four corners around it. With bait already down the dollop is used up for nothing (seen in the simulator: 5 to 4 to 3 with $68 staying 1)."
  },
  {
   "address": 32713,
   "type": "line",
   "text": "State $13, setting up the drive: clears the sprite frames $2B-$32, clears the screen, text row $3B = $0C, multicolours for the car ($A89D); if bait was put down ($68) clears the flag and saves the Roamers' targets to $EA4E; route length $66 + 5 (at most 255) onward (continues past $8000)."
  },
  {
   "address": 32769,
   "type": "line",
   "text": "State $13, second half (the first half is at $7FC9): route length + 5 goes to $67, the distance the drive must cover; $66 (distance covered) = 0. Copies the six pages $E000-$E5FF (the car picture with the bought items painted in, saved there by state $10) back to the character set at $5A00-$5FFF. Speed $1B, its fraction $1C, the road position $1A and the key $17 are zeroed; next state."
  },
  {
   "address": 32822,
   "type": "line",
   "text": "State $14, the driving screen: car lateral position $63 = 100 (right lane); draws the car picture from column 25 ($35E8 with A = $63/4); colour RAM all 8 (multicolour, black); sprites 4-7 double height ($D017 = $F0) and behind the background ($D01B = $F0); sprite frames $2B-$32 from $379B (0, 0, 4, 5, then 12 for the four lane dashes), positions $A0-$AF from $37A3/$37AB. Leaves by JSR $8D86, not JMP: the return address is never pulled, so every drive leaves the stack pointer 2 lower (seen in the simulator: $FF before, $FD after, never restored until the cold start)."
  },
  {
   "address": 32883,
   "type": "line",
   "text": "State $15, the drive, each frame. Speed: $1C += $1B, the road position $1A += $1C/16, and each wrap past $7F adds 1 to the distance $66 (up to $67); the lane dashes (sprites 4-7) are placed at y $1A and $1A+$7F. Until the distance is reached the speed rises by 1 a frame to the car's top speed ($AA9E by car $5C), afterwards it falls to 0. Stick left/right steer ($64 = $FF/$01, applied at $7011) between lateral positions 9 and 100; on arrival the car steers back to 100. Roamers met: when a slot $6F-$72 (the route length recorded on the map, $7DAA) equals the distance, a Roamer appears as sprite 0 or 1 (whichever is free; $73/$74 remember the slot) at a random x from $06, facing frame 8 or 9, doubled in size, heading for y $F0 (off the top); with neither free the slot is retried at the next distance. With the ghost vacuum owned ($6D bit 5), a new press of fire ($11+x) while the Roamer is within x -$20..+$10 of the vacuum (sprite 2, $A4) retargets it to the vacuum ($A4-4, y $3806 by car); on reaching it the countdown $75/$76 runs 32 frames with sound 0 ($3D24), the Roamer flickering and shrinking (x-expand off at 16, y at 8), then it vanishes and $9851 restarts that Roamer on the map. A Roamer not caught flies off the top (y >= $E0). $65 is kept counting with bit 7 set (the vacuum's colour cycle, $704C). Next state ($16) when the distance is reached and the car has stopped. Live (work/verify/t13-vacuum.js): a Roamer put on the road by poking $6F was pulled in on fire, counted 32 frames and restarted on the map; without the vacuum the same fire did nothing."
  },
  {
   "address": 33401,
   "type": "line",
   "text": "State $16, arriving at a building: clears the screen, sprite positions $A0-$AF, the vacuum flash $65 and the Roamer slots $6F-$72; background colour $3B = $0C (grey, written to $D021 by the IRQ), $D022 = 0, colour RAM all 9 (multicolour white); distance $66 = 0; next state."
  },
  {
   "address": 33455,
   "type": "line",
   "text": "State $17, draws the scene for building $6E with the screen blanked: the scene character set, six pages from $1FA8 ($0F80 for Zuul, building $0A) to $5A00-$5FFF (for the ordinary scene the six pages run on into the screen map, so characters $BE-$FF are the map's own bytes); the screen map rows 0-20 from $2398-$26DF ($1580-$18C7 for Zuul) to $5400-$5747; the colour map from $26E0-$2A27 ($1C60-$1FA7 for Zuul) to $D800-$DB47 with every $0A replaced by the building's colour $9DD0[attr AND 3] ($0A, $08, $09, $0D). From the attribute byte bldg_attr ($A1C0+$6E): bits 4-5 pick a window style (four windows of 24 characters at $5430, offsets $9EFC, tiles $9ECC from $9F14; 112 bytes of window glyphs from $9E14+$9F18 to chars $66-$73), bits 6-7 an entrance (10 rows of 22 characters from $9F1C/$9F20 to $5520, colour 9, and 512 bytes of glyphs from $9F24/$9F28 to chars $7A-$B9), bits 2-3 a 16-byte detail from $9DD4 to chars $4D-$4E. GHQ (building $11) gets GHOSTBUSTERS ($9DC4) in red on row 8. The bought car is parked at the bottom right (96 bytes of glyphs from $375F by car to chars $40-$4B, 3 rows of 4 characters from $375B at $56F2, colour $A8A1 by car). Sprites: all single size, multicolour except sprite 4, frames $380A, positions $3EF6/$3EFE, targets $3EE6/$3EEE. GHQ goes to state $22, Zuul to state $28; any other building sets the delay $7C = $7F and goes on to $18."
  },
  {
   "address": 34034,
   "type": "line",
   "text": "State $18, man 1 (sprite 5) carries the trap: both men walk ($9B35), every sprite eases 1 pixel toward its target ($9AE3), the stick moves man 1's target ($9AEF with X = 0, kept inside x $20-$8C by $9B14), the trap (sprite 7) follows beside him ($9A16). Only when the building's state $C8+$6E has kind bits 2-3 = %11 (a Slimer is there) does a new press of fire ($9ADA) set the trap down (target y $BF = man's y + 1) and go on to $19. Otherwise the Slimer moves ($9AA6) and $9A8A sends the men home once the delay $7C has run out if there is no Slimer."
  },
  {
   "address": 34091,
   "type": "line",
   "text": "State $19, man 1 is walked into position with the stick; a new press of fire plants him in the firing stance (frame $16 or $17, bit 0 kept: the way he faces) and sends man 2 (sprite 6) to ($90,$C7), where man 1 started ($3EF0). The Slimer keeps moving ($9AA6) and the no-Slimer exit ($9A8A) still applies."
  },
  {
   "address": 34146,
   "type": "line",
   "text": "State $1A, man 2 (sprite 6) walks under the stick ($9AEF with X = 2); a new press of fire plants him in the firing stance (frame $16/$17), computes the stream end points ($98EB) and which side of each man the Slimer is ($9918, into $7E/$7F), and switches the streams on (next state)."
  },
  {
   "address": 34203,
   "type": "line",
   "text": "State $1B, both streams on. The Slimer moves ($9AA6) and, while the backpacks have power ($3E), reacts to the streams ($992B, not examined here); the streams are drawn with sprites 0-3 ($9080). While the men are 12 or more pixels apart the stick only closes the gap: right moves the left-hand man right, left moves the right-hand man left (the masks at $B3AD ORed with the stick; checked in the simulator). Crossing the streams: when man 1 faces right (frame $16) and man 2 left ($17), or the mirror of that, and they are closer than $2A minus a quarter of their height difference, the game freezes 64 frames, then the backpacks are emptied ($3E = 0), both men fall (frame $18), men left $3D drops by 2, message 8 YOU CROSSED THE STREAMS..., and the Slimer, target (0,0), escapes (state $1D, no speech: $EA7A = 0). Seen in the simulator: 3 men to 1. Otherwise a new press of fire opens the trap ($8667: men back to standing frames, sound 3 on voice 3, next state); every 16 frames ($09) the power $3E drops by 1 (BCD), and when it reaches 0 message 3 BACKPACKS DISCHARGED is shown and the trap opens by itself."
  },
  {
   "address": 34464,
   "type": "line",
   "text": "State $1C, the trap is open: sprites 0-3 show the trap's light (shapes $A9CA + the step $79, 0-5), $7A rises by 3 a frame. If the Slimer (sprite 4, $A8/$A9) is inside the box around sprite 0 given by trap_hitbox/trap_hitbox_size (x -8..+7, y -12..+3) it is caught: state $1E. If $7A reaches $9C first, the trap has missed: the light goes off, the Slimer is aimed at man 1 or man 2 (random bit 1 of $06), $EA7A = 1 (speech 2 when he gets there) and state $1D."
  },
  {
   "address": 34564,
   "type": "line",
   "text": "State $1D, the Slimer on the loose: sprites ease toward their targets; when the Slimer reaches a man's position ($BA/$BB or $BC/$BD) that man is slimed (frame $18), men left $3D drops by 1, and the Slimer is sent to the edge $A99E ($00 or $A8). When it reaches either edge x: the building's state $C8+$6E = 0 (no longer haunted), PK energy +300 ($9895 with 3), phrase 2 is spoken if $EA7A is set (a slimed man; not after crossed streams), and back to the map (state $11). Seen in the simulator: a missed trap cost one man, played phrase 2 and added 300."
  },
  {
   "address": 34651,
   "type": "line",
   "text": "State $1E, the Slimer caught in the trap's light: animates the light ($9A35), the Slimer follows sprite 0 and flickers ($9A0C). When $7A reaches $9C: delay $7B = $7F, sprites 1-3 off, sprite 0 and the Slimer both aimed at the trap ($AE/$AF), $EA88 = 0, next state."
  },
  {
   "address": 34708,
   "type": "line",
   "text": "State $1F: the light and the Slimer sink into the trap. When sprite 0 arrives: trap frame $38 (closed, full), sprite 0 and the Slimer hidden, $EA88 = 1; with the laser confinement system owned ($6D bit 6) and fewer than 10 ghosts stored, stored ghosts $6C + 1, else one empty trap fewer ($6B - 1); reward: if the building has a Slimer (kind %11) the high nibble of its state (how long it has been haunted, 0-15) indexes slimer_reward ($A1E4: $1000, $1000, $900 ... $300) and the building is cleared, else the last entry ($300); added to the balance ($9664, hundreds). Meanwhile the men bob ($A9A4 offsets, frames by $7B) for $7F frames; then all sprites but 5-7 are switched off, phrase 1 is spoken ($8DB9) and the men walk to the trap ($8823). Seen in the simulator: $2500 to $3000 for a building at state $BF ($500), empty traps 3 to 2, phrase 1. Laser confinement live (work/verify/t18-laser.js): stored 0 -> 1 and 9 -> 10 with the empty traps unchanged; at 10 an empty trap was used."
  },
  {
   "address": 34851,
   "type": "line",
   "text": "Sends man 1 to the trap ($AE/$AF) and man 2 to 18 pixels right of it ($BA-$BD), then the next state: $20 from state $1F; $9A8A also jumps here after setting state $1F, which is how the men leave a building with no Slimer. The LDA/BEQ of $EA88 at $8832 branches to the next instruction either way: a test with nothing left in it."
  },
  {
   "address": 34933,
   "type": "line",
   "text": "State $20, the men walk to the trap ($9B35 with $0E, sprites eased 1 pixel); when man 1 (sprite 5) is at it, both are sent to ($A8,$C7), the car, and the next state."
  },
  {
   "address": 34966,
   "type": "line",
   "text": "State $21, the men walk to the car with man 1 carrying the trap ($9A16); when both men stand on their targets, back to the map (state $11)."
  },
  {
   "address": 34998,
   "type": "line",
   "text": "State $22, at GHQ (building $11): stored ghosts $6C = 0, empty traps $6B = traps owned $6A, men $3D = 3, backpack power $3E = 99 (BCD); all sprites cleared ($95A5), man 1 placed at ($5A,$A8) and sent to ($CF,$C7); next state. Seen in the simulator: 1 man, 1 empty trap and power 10 became 3, 3 and 99."
  },
  {
   "address": 35036,
   "type": "line",
   "text": "State $23, three men leave GHQ: sprites 5-7 all use man 1's walking frame; when one reaches x $70 the next is started at ($5A,$A8) toward ($A8,$C7); when every sprite is at its target, back to the map (state $11)."
  },
  {
   "address": 35109,
   "type": "line",
   "text": "State $24, Marshmallow alert on the map (from $7ED8): the Roamers (sprites 4-7) move toward the four points around the building; each that arrives takes its piece of the Marshmallow Man (frame mm_shapes, $A905). While any is still on the way the map runs as usual (jumps to $7F29). With all four there: delay $7C = $FF, and with bait down ($68) the bait is used up and state $26 (averted), otherwise state $25 (he stomps). Live (work/verify/t7-marshmallow.js): B 20 frames after the alert gave state $26 and $2500 -> $4500; no B gave $25 and $10000 -> $6000 with the block flattened."
  },
  {
   "address": 35184,
   "type": "line",
   "text": "State $25, the Marshmallow Man stomps the building, one step every 8 frames of the delay $7C: legs from mm_step_shape_a/b, height from $B9 and mm_step_bob. At four points of the delay ($7C AND $3F = $20) the building $80 is marked destroyed ($EA28+$80 = 0) and redrawn one stage further ($95EB with X = $80, Y = 0-3). When $7C runs out: message 5 (MARSHMALLOW MAN DID $4000 WORTH OF DAMAGE...), $4000 taken from the balance ($9636, stops at 0), the Roamers' targets restored ($983D), state $27."
  },
  {
   "address": 35292,
   "type": "line",
   "text": "State $26, bait down when the Marshmallow Man formed: two of his sprites take the frames $2F and $30; when the delay $7C runs out, message 6 (MAYOR AWARDS YOU $2000...), $2000 added ($9664), the Roamers' targets restored ($983D), next state ($27)."
  },
  {
   "address": 35331,
   "type": "line",
   "text": "State $27, after a Marshmallow Man: sprites 4-7 move 1 pixel a frame toward their targets; when all four stand on them, their targets are set from $EA5E-$EA65 and play resumes on the map (state $12)."
  },
  {
   "address": 35372,
   "type": "line",
   "text": "State $28, the street outside Zuul (entered from state $17 for building $0A): clears all sprites and $77, delay $7C = 0; sprites 0-3 become the Marshmallow Man (frames mm_shapes, double size, hi-res), sprites 4-7 multicolour; men $3D = 3, $EA78 = 2 (men still to get in), $EA79 = 2 (men he may catch before the attempt fails); the first man starts at the car ($8A6A); next state."
  },
  {
   "address": 35434,
   "type": "line",
   "text": "Puts the next man (sprite 5) at the car ($A8,$C7) and sends him to ($60,$C0); $EA77 = 1 (walking in by himself)."
  },
  {
   "address": 35456,
   "type": "line",
   "text": "The man under the player's control in front of Zuul: target x kept within $20-$8C. Every 4th tick, above y $B9, a sprite collision among sprites 0-3 and 5 ($D01E AND $2F: the Marshmallow Man and the man) means he is caught: sent off to ($30,$E5), frame $18, $EA79 and men $3D - 1, phrase 3 spoken, delay $7C = $2F, $EA77 = $FF. Otherwise, above the pavement line (target y below $AA) only the doorway, x $5B-$5E, lets him in: $EA78 and $3D - 1, the Marshmallow Man's sprites 0 and 2 change frame ($2F, $30), delay $7C = $3F, and the next man comes from the car; elsewhere y is held at $AA. The bottom limit is $C8."
  },
  {
   "address": 35574,
   "type": "line",
   "text": "State $29's exits: both men in ($EA78 = 0): delay $7C = $CF, sprites cleared, next state ($2A, the climb); two men caught ($EA79 = 0): state $2E, the GOOD TRY ending."
  },
  {
   "address": 35591,
   "type": "line",
   "text": "State $29, sneaking past the Marshmallow Man, each frame. While the delay $7C runs nothing moves but him. $EA77 < 0 (man caught): he walks off, then the next man comes ($8A6A); $EA77 > 0: he walks in from the car and control starts ($EA77 = 0) when he reaches ($60,$C0); $EA77 = 0: the stick moves him ($9AEF) and $8A80 checks the catch and the door. The Marshmallow Man (sprites 0-3, a 2 x 2 block of doubled sprites) walks to and fro along 32 steps (mm_path_x, mm_path_y, frames mm_path_frame: the low nibble for sprite 3, the high nibble for sprite 1), one step every 2 ticks of $08. The read of $D01E at $8B77 clears the collision latch."
  },
  {
   "address": 35775,
   "type": "line",
   "text": "State $2A: until the delay $7C runs out, blanks the status line, row 22 ($5770); then $7C = $FF and the next state."
  },
  {
   "address": 35797,
   "type": "line",
   "text": "State $2B, climbing Zuul: each frame the screen rows scroll down one ($3300), so the building seems to slide past; in the last 25 frames of the delay $7C the two men (sprites 5-6, frames $3812, x $5E and $84) rise into view from the bottom, y = (25 - $7C) * 8 - $1B. When $7C runs out: $7C = $FF, next state."
  },
  {
   "address": 35871,
   "type": "line",
   "text": "State $2C, the men fire at the portal: backpack power $3E = 1 and the streams drawn ($9080); as the delay $7C runs down from $8F, one row per 16 frames of an 8-character strip at column 22, rows 8-16 is filled with character $A8, covering the portal from the top. At $7C = $10 phrase 4 is spoken. At 0: $5000 added to the balance ($9664) and the win pages (state $36). Nothing can go wrong here: two men inside is a win."
  },
  {
   "address": 35956,
   "type": "line",
   "text": "State $2D (from $7C2E: the Keymaster and Gatekeeper met at Zuul with a balance below the starting one): end page set-up ($8D96), page $0D THE KEYMASTER AND GATEKEEPER ARRIVED AT ZUUL... THE BANK HAS FORECLOSED, $EA7A set (phrase 3 at the end), then the balances: state $3B."
  },
  {
   "address": 35974,
   "type": "line",
   "text": "State $2E (two men caught at Zuul): end page set-up, $EA7A = 0, page $0E GOOD TRY , next state."
  },
  {
   "address": 35990,
   "type": "line",
   "text": "State $2F: the player's name as FIRST LAST from the LAST,FIRST typed at $EAB3 ($9B90, into $EA14, printed as page 0), next state."
  },
  {
   "address": 35996,
   "type": "line",
   "text": "State $30: page $0F ,BUT YOU FAILED TO CLOSE THE PORTAL TO THE SPIRIT WORLD AND ZUUL HAS TAKEN OVER YOUR CITY., then the credit pages ($31)."
  },
  {
   "address": 36004,
   "type": "line",
   "text": "State $31: page $10 YOU MADE MORE MONEY THAN YOU STARTED WITH, SO THE BANK WILL RAISE YOUR CREDIT LIMIT TO. Reached from both the win and the GOOD TRY pages, never from the foreclosure."
  },
  {
   "address": 36012,
   "type": "line",
   "text": "State $32: the new credit limit is the balance with its last two digits dropped ($59 = 0, so it is a whole number of hundreds): formatted ($9D24, $9063) and printed (page $80, the $EA14 buffer)."
  },
  {
   "address": 36030,
   "type": "line",
   "text": "State $33: page $11 YOUR NEW ACCOUNT NUMBER IS."
  },
  {
   "address": 36038,
   "type": "line",
   "text": "State $34: encodes the balance and name into the account number at $EAC7-$EACA ($90EE), prints its 4 bytes as 8 digits ($9D4D with A = 4, page $80). Those bytes survive to the next game, where F3 decodes them (state $00). Seen in the simulator: 65110700 for a balance of $7500 with the name SPENGLER."
  },
  {
   "address": 36074,
   "type": "line",
   "text": "State $35: page $12 . WRITE THIS NUMBER DOWN FOR FUTURE PLAY., then state $39."
  },
  {
   "address": 36086,
   "type": "line",
   "text": "State $36, the win: end page set-up ($8D96), $EA7A = 0, page $18 CONGRATULATIONS! THANKS TO YOU, next state."
  },
  {
   "address": 36102,
   "type": "line",
   "text": "State $37: the player's name as FIRST LAST ($9B90), next state."
  },
  {
   "address": 36108,
   "type": "line",
   "text": "State $38: page $19 THE PORTAL TO THE SPIRIT WORLD HAS BEEN CLOSED. YOU EARN A $5000 REWARD FROM THE CITY. ALSO, then state $31 (the credit and account pages)."
  },
  {
   "address": 36120,
   "type": "line",
   "text": "State $39, every ending meets here: phrase 3 if $EA7A is set (only after the foreclosure page); $02 = $FF, so the joystick is ignored from now on ($7061); next state."
  },
  {
   "address": 36137,
   "type": "line",
   "text": "State $3A, the last: waits for F1 or F3 (key code $19 = $20 or $28), then SEI and a jump to the cold start $6000. The cold start keeps $6328 and $EAC7-$EACA, so F3 then skips the interview and starts with the account just shown."
  },
  {
   "address": 36154,
   "type": "line",
   "text": "State $3B (after the foreclosure page): page $1A STARTING BALANCE:."
  },
  {
   "address": 36162,
   "type": "line",
   "text": "State $3C: keeps the balance $57-$59 in $54-$56, puts the starting balance $51-$53 in its place, formats and prints it (page $80)."
  },
  {
   "address": 36189,
   "type": "line",
   "text": "State $3D: page $1B ENDING BALANCE:."
  },
  {
   "address": 36197,
   "type": "line",
   "text": "State $3E: restores the balance from $54-$56, formats and prints it (page $80)."
  },
  {
   "address": 36223,
   "type": "line",
   "text": "State $3F: on to state $39 (speech, then wait for F1/F3)."
  },
  {
   "address": 36230,
   "type": "line",
   "text": "Common end of a state handler that is finished: clears the key $17, advances the state $3A by one, falls into stay_in_state. The NOP at $8D8C is a byte left over."
  },
  {
   "address": 36237,
   "type": "line",
   "text": "Common end of every state handler and of the per-frame steps: JMP to the frame loop $6FEC, which waits for the next frame."
  },
  {
   "address": 36240,
   "type": "line",
   "text": "Six bytes ($0C $06 $00 $DF $EC $28) between next_state and end_page_setup that no instruction reads, writes or reaches (opcodes.py --refs for each; never touched in the simulator): unused."
  },
  {
   "address": 36246,
   "type": "line",
   "text": "Set-up for the end pages: background colour $3B = 8, clears the screen ($95B9) and the sprite positions $A0-$AF, stops the tune ($93E2, voices $88-$8A = $FF), silences the SID ($63AF), typing speed $15 = 3."
  },
  {
   "address": 36281,
   "type": "line",
   "text": "Speaks phrase A with the digitised-speech player at $F080 (A = phrase to start; A = $FF polls it, result bit 0 set while it is still speaking). IRQs off, $EB counted up (the raster IRQ does nothing while it is non-zero), SID voices gated off, volume 7. In the game ($20 non-zero) character $FF is made solid ($5FF8-$5FFF) and rows 22-24 filled with it in black; on the title row 24 is saved to $EA8A and blanked, and while it speaks, once per frame (raster wrap, $E1), the tune's silent stepping ($63D7), the lyric tick ($63BA) and $91C8 keep the title in time. Afterwards: NMI vector back to $6425, volume from $EA82, $EB = 0, raster IRQ at $B8 re-armed, IRQs on, rows 22-24 blanked in white (game) or row 24 restored (title). Phrases used: 1 then 3 at start-up ($62ED, $62F2); 1 for SPACE on the title ($6393) and a Slimer trapped ($8820); 2 a man slimed ($874B); 3 a man caught at Zuul ($8AB9) and the foreclosure ending ($8D1F); 4 at the portal ($8C5A). Seen in the simulator: 1 after a catch, 2 after a miss, 3 at the foreclosure, 4 at the portal."
  },
  {
   "address": 36470,
   "type": "line",
   "text": "The raster IRQ ($FFFE), at raster $B8. Does nothing but acknowledge while speech plays ($EB) or if the VIC did not raise it. Title ($20 = 0): at raster $C1 writes $D011 = $18 OR the lyric scroll $9A, runs $9756, then the lower split (irq_lyric_split). Game: steps the random byte $06, counts the tick $08 (twice in one frame of eight on PAL, $EA73), runs $9756, then irq_game."
  },
  {
   "address": 36519,
   "type": "line",
   "text": "The title's bouncing ball: the vertical step for each of the 16 frames of one hop, -3 -3 -3 -2 -2 -2 -1 0 0 +1 +2 +2 +2 +3 +3 +3 (sum 0), indexed by $EA6B and added to the ball's y $EA67 at $9235. Sits between two parts of the IRQ handler."
  },
  {
   "address": 36535,
   "type": "line",
   "text": "Title IRQ, second split: waits for the raster line lyric_split_lines[$9A AND 7] and writes $D011 = $1B, ending the lyric window's fine scroll; runs $97A1 (sprite 7 at y $F2) and leaves."
  },
  {
   "address": 36564,
   "type": "line",
   "text": "Game IRQ. Random byte $06: shifted left, the new bit 0 = old bit 7 XOR bit 4. In states $12 and above, at raster $DF: $D016 fine scroll from the ticker's $49, and the bottom bar's background and sprite colours set to blue (6), black in states $2A-$2C. All sprite x to 0, then at raster $EC background and sprites 0-1 black; $97A1. Then the next frame's sprites: all 8 on, $D016 multicolour, for each sprite x = $A0+2n doubled plus 1 (the 9th bits collected in $D010), y = $A1+2n, pointer $57F8+n = frame $2B+n, colour sprite_colour[frame]; background $D021 = $3B, sprite multicolours $1D/$1E. Sets the frame flag $E2 for the main loop, plays the tune ($93F0) and the sound effects ($3BE9). Leaves through $8FC0: acknowledge, next IRQ at raster $B8."
  },
  {
   "address": 36824,
   "type": "line",
   "text": "Called once by the cold start: all CIA interrupts off, timers A stopped, port B of both CIAs input and port A output, SID volume 0, $00 = $2F, VIC bank 1 ($DD00 = 2: $4000-$7FFF). Ends with the RTS at $9001."
  },
  {
   "address": 36866,
   "type": "line",
   "text": "Cold-start and new-game variable set-up (called from the start-up at $619A): copies the 18 initial values at $9051 into $33-$44 (joystick $33 = $1F, $3C = $3F the PK rate mask, $3E = $99 the backpack figure, ...), then with interrupts off clears $45-$DB, sets $88-$8A = $FF (all three music voices stopped, $93F0), turns every sprite off ($D015 = 0), zeroes the sprite positions $D000-$D00F and SID voice registers $D400-$D40F, copies the 30 building kinds $A837-$A854 into the map table $EA28-$EA45, sets sprites 0-1 multicolour ($D01C = 3), $CF = $1F, $D0 = $1C, $D7 = $14, and clears the screen ($95B9)."
  },
  {
   "address": 36868,
   "type": "line",
   "text": "Second entry of init_game_vars ($9002) with X = the number of initial values to copy minus one: $70A4 enters with X = $0B, so only $33-$3E are reset from $9051 and $3F-$44 keep their values; everything after (clearing $45-$DB, sprites, SID, building table, screen) is the same."
  },
  {
   "address": 36944,
   "type": "line",
   "text": "A bare RTS that the raster interrupt calls as a timing pad: JSR plus RTS is 12 cycles, and $8F19/$8F1C and $8F56/$8F59/$8F5C call it two and three times in a row after waiting for a raster line, before rewriting colour registers. Also the last instruction of init_game_vars."
  },
  {
   "address": 36945,
   "type": "line",
   "text": "Initial values for zero page $33-$44, copied by init_game_vars ($9002, all 18) or its second entry ($9004, the first X+1): $1F $1F $0F $00 $0F $08 $01 $00 $08 $3F $03 $99 then six zeros. $33 = $1F is the idle joystick reading ($96CA), $3C = $3F the PK rate mask of the first thousand ($9DBA), $3E = $99 the value the proton-stream code tests ($9080)."
  },
  {
   "address": 36963,
   "type": "line",
   "text": "Left-justifies the text buffer $EA14 (terminated by $FF): skips the leading spaces ($20) and moves the rest, terminator included, to the start of the buffer. Used after money_to_text ($9D24) at $75A5, $8CB3, $8D52 and $8D74, so the balance prints as \"$2500\" with no gap."
  },
  {
   "address": 36992,
   "type": "line",
   "text": "Places the two proton streams during a bust (called from $85A8, $8622, $8C23): sprites 0-3 double height ($D017 = $0F), $7A = 0; for each man (X = 0: sprite 5 at $AA/$AB, streams in sprites 0 and 2; X = 2: sprite 6 at $AC/$AD, sprites 1 and 3) the lower stream sprite goes at the man's X plus $A99A[facing] and his Y - $29, the upper one a further $A99C[facing] across and $28 up, current and target positions both ($A0-$A7, $B0-$B7); facing is bit 0 of $77/$78. Then steps the stream animation counter $79 through 0-5 and sets the stream shapes $2B-$2E to $A9C8[facing] + $79, or to $3E itself when $3E is 0. Seen live: the zigzag streams from both men while fire is held. The two runs of three NOPs at $90D1 and $90DB (inside a TYA/PHA, LDY #4 ... PLA/TAY frame) look like a removed call."
  },
  {
   "address": 37102,
   "type": "line",
   "text": "Account number from the balance, run once at the end of a winning game ($8CC6): $25 = $57 and $27 = $58 (the balance in hundreds, BCD; the tens and units in $59 are dropped), $23 = the name's byte sum (account_name_sum $91B6). Check byte: ($25 + $27) mod 256, 1 if that is 0, stepped name-sum times through account_lfsr_step ($91A6; a sum of 0 steps 256 times), into $26. The 24-bit number N = $25:$26:$27 is then shifted out low bit first into the 32-bit $EAC7-$EACA ($EAC7 lowest), a 0 bit inserted after every third bit, so each nibble holds one octal digit 0-7 of N. The caller prints $EAC7, $EAC8, $EAC9, $EACA as two digits each ($9D4D), so the eight digits the player sees are N's octal digits in pairs, lowest pair first: o1 o0 o3 o2 o5 o4 o7 o6. Worked through in Python (work/agent6/acct.py): SPENGLER with $123,400 gives 64105104, VENKMAN,PETER with the same balance 64405104."
  },
  {
   "address": 37205,
   "type": "line",
   "text": "Checks an account number against the name and yields the balance (called at $748E for F3's replay and at $7520 after the number is typed): reads the eight nibbles of $EAC7-$EACA most significant first ($EACA high nibble, low nibble, then $EAC9 ... $EAC7), keeps the low three bits of each (bit 3 is shifted out unchecked, so a typed 8 reads as 0 and 9 as 1) into the 24-bit $25 (high), $26, $27; recomputes the check byte from $25 + $27 and the name sum exactly as account_encode ($90EE) does; if it differs from $26, $25 and $27 are zeroed. Leaves $57 = $25 and $58 = $27 (the balance in hundreds); $59 is not touched. A zero result is what the caller treats as INVALID ACCOUNT NUMBER. Tested in the simulator by typing: VENKMAN,PETER with 64405104 gives $123400, with 64485184 also $123400, with 64405105 the number is refused. Nothing checks that $25 and $27 are valid BCD: ANDY with 777 gives $57 = $FC and the vehicle page shows YOU HAVE $?<0000."
  },
  {
   "address": 37286,
   "type": "line",
   "text": "One step of the account check byte's 8-bit shift register at $07 (ASL/EOR/ASL/EOR/ASL/ASL/EOR, then ASL and ROL $07): $07 moves left one bit and the new bit 0 is bit 3 XOR bit 4 XOR bit 5 XOR bit 7 of the old value, a maximal-length register (x^8 + x^6 + x^5 + x^4 + 1). From any non-zero value it repeats after 255 steps (checked in Python over all 256 values), so the 256 steps a name sum of 0 gives equal one step; 0 would stay 0, which is why both callers force a zero seed to 1."
  },
  {
   "address": 37302,
   "type": "line",
   "text": "Adds the 20 bytes of the name buffer $EAB3-$EAC6 (the typed name as PETSCII, zero-padded, copied from $EA00 at $74BB) into $23, modulo 256. The number of check-register steps in account_encode ($90EE) and account_decode ($9155)."
  },
  {
   "address": 37320,
   "type": "line",
   "text": "One step of the bouncing ball of the title's sing-along (called from the title loop at $6301, $6332, $6345 and $8E24; A, X and Y are saved in $EA6D-$EA6F and returned): sprite 0 on ($D015 = 1). At the start of each 16-step hop ($EA6B = 0), once the hold count $EA71 runs out, it reads the next byte of the script at $92BC through the pointer $EA69/$EA6A: below $80, bit 6 cleared, the X speed for the hop ($EA6C); $80 and above, a hold of (byte AND $7F) extra hops in place, and $BF (or $FF) also returns the ball to X = 0. At the end ($93E1) the pointer sticks on the last byte. Y moves by the 16 steps of $8EA7 (-3 up to +3, a parabola); X ($EA66, bit 8 in $EA68) wraps to 0 past $157. Writes sprites 0 and 1's X, Y and the X high bits in $D010."
  },
  {
   "address": 37532,
   "type": "line",
   "text": "Puts the sing-along ball back to the start (called from $6299 and $62FE): X = 0 ($EA66, $EA68), Y = $BA ($EA67), hop step $EA6B and hold $EA71 zero, script pointer $EA69/$EA6A = $92BC."
  },
  {
   "address": 37564,
   "type": "line",
   "text": "The sing-along ball's script, 293 bytes read one per hop by singalong_ball_step ($91C8): a byte below $80 is the X step per frame for one 16-frame hop (bit 6 ignored, so $40 is a hop on the spot), a byte of $80 or more holds the ball for (byte AND $7F) extra hops, and $BF also sends it back to the left edge. The last byte, $93E0, is $BF, re-read for ever once the song is over. The timing of the words on screen is not in this table."
  },
  {
   "address": 37857,
   "type": "line",
   "text": "The RTS music_play ($93F0) branches to at $93F2 when $47 bit 7 is set: the tune is paused and no SID register is written that frame."
  },
  {
   "address": 37858,
   "type": "line",
   "text": "Starts the tune again from its beginning on all three voices: zeroes each voice's track position $82-$84, pattern position $85-$87 and duration counter $88-$8A, so the next pass of music_play ($93F0) reads the first note. Called when a voice's track ends and $20 is non-zero ($942E), and from $628E, $62FB, $7ACF, $8DA6."
  },
  {
   "address": 37872,
   "type": "line",
   "text": "The music player, called once a frame from the raster IRQ ($8FBA) and from $632F. Returns at once while $47 bit 7 is set. For each voice (X = 2..0; SID register offset $A2B4,x = 0, 7, 14, kept in $E1): on every fourth frame ($08 AND 3 = 0) it counts the voice's duration $88,x down (a negative $88 means stopped) and, when it runs out, reads the next event: the pattern number from the voice's track list ($A2B7/$A2BA,x at position $82,x; $FF ends the track, which stops the voice or, when $20 is set, restarts the tune via $93E2), the pattern address from $A75B, and at position $85,x the event byte (bits 0-4 duration, bit 6 a rest with the gate off, bit 7 an extra byte follows: low nibble the instrument $94,x, high nibble the volume for $D418, 15 meaning a fade computed from 109 minus voice 1's track position, halved when $20 is set) and the note number, whose frequency comes from the table at $A1F4. Instrument settings (pulse width, control, attack/decay, sustain/release) come from the 8-byte records at $A7EF. Between events it drops the gate unless bit 5 of the event was set and silences the envelope at the end of the note, and on every frame it adds vibrato (depth $A7F4 of the instrument, a triangle from $08) to notes longer than 4. Voice 3 is left alone while $98 is set (music_voice3_busy, $9593)."
  },
  {
   "address": 38291,
   "type": "line",
   "text": "Returns A = $FF (Z clear) when the music player must not write the SID for the voice it is on: $98 is non-zero and the voice index $EA75 is 2 (SID voice 3, which the game's sound effects use); otherwise A = 0. Called four times from music_play ($93F0)."
  },
  {
   "address": 38309,
   "type": "line",
   "text": "Clears the eight sprites' software state (called from $7AD5, $88C6 and $8AFA): positions $A0-$AF, targets $B0-$BF, shape numbers $2B-$32, and the walking frame $77."
  },
  {
   "address": 38329,
   "type": "line",
   "text": "Clears the text screen rows 0-23 at $5400-$57BF to character 0 and their colour RAM $D800-$DBBF to 0 (black), leaving the bottom row with its scroller alone; $37 = 0. When the game state $3A is $11 or more, colours row 22 ($DB70-$DB96, 39 cells) white, the line the play screens print messages on. Called from nine places, among them init_game_vars."
  },
  {
   "address": 38379,
   "type": "line",
   "text": "Draws one character row (Y = 0-3) of the building in city-map slot X (0-29) (called from $7B18, which draws all 30 slots, and $89D6): five characters from the shape table $3F2D at kind offset $A855[$EA28,x] (20 per kind) plus row offset $A85D[Y] (5 per row), to the slot's screen address from the split table $A861/$A87F plus Y*40. Skips rows 0-1 of slots 0-3 and 29 and rows 2-3 of slots 16-21. X and Y are preserved."
  },
  {
   "address": 38454,
   "type": "line",
   "text": "Subtracts the BCD amount $25 (high), $24, $23 from the balance $57 (high), $58, $59 in decimal mode; if the balance would go below zero it becomes 0. Called from $7652 and $791D (buying the car and the equipment) and $8983 (the $4000 charge that follows the message $4000 DAMAGE, set up at $8974-$8981). The online cheat POKE 38454,96 turns its first byte into RTS: tested in the simulator, the hearse is then free and the balance stays $10000; by the same token the $4000 damage charge at $8983 is not taken either (live, work/verify/t20-poke-mm.js: $10000 stayed $10000 through a stomp, $6000 without the poke)."
  },
  {
   "address": 38484,
   "type": "line",
   "text": "Compares the balance $57/$58/$59 with the BCD amount $25/$24/$23 by a decimal subtraction whose result is thrown away: carry set when the balance is at least the amount. Called from $7646 and $7918, before a purchase."
  },
  {
   "address": 38500,
   "type": "line",
   "text": "Adds the BCD amount $25 (high), $24, $23 to the balance $57, $58, $59; on overflow past 999999 sets $57 and $58 to $99 and leaves $59 as it is. Called from $8801, $89F7 and $8C6E (payments during play)."
  },
  {
   "address": 38530,
   "type": "line",
   "text": "Prints the next line of the sing-along lyrics on screen row 22 ($5770) (called from the title loop at $6382): characters from the pointer $21/$22, a space becoming character 0 and letters losing $40 to become screen codes, up to $0D or 40 characters, the rest of the row blanked, and the pointer advanced past the line. The end mark $FF sets the pointer back to $6443, the start of the lyrics, and prints nothing."
  },
  {
   "address": 38602,
   "type": "line",
   "text": "Reads the joystick in control port 1: port A all outputs and high ($DC02 = $DC00 = $FF, so no keyboard row is selected), port B inputs ($DC03 = 0), then $33 = $DC01 AND $1F (bits 0 up, 1 down, 2 left, 3 right, 4 fire, active low; $1F = at rest). Any movement or fire clears $45 and $46, the counters that blank the screen when nobody plays. Called from $6329, $6396, $7061."
  },
  {
   "address": 38632,
   "type": "line",
   "text": "Keyboard scan (called from $632C and $7070). Does nothing if $DC01 or $DC00 read anything but $FF with all rows released (a joystick in either port is active). Otherwise tests all 64 keys, index = column (the $DC01 bit, mask $374B) * 8 + row (the $DC00 value $3753), and keeps in $19 the lowest index held whose entry in the key table $389E is not $21 ($FF when none): F1 is $20, F3 $28, RUN/STOP $3F. The key's character from $389E goes to $17 and $18 and clears $45/$46, but only when it differs from $18 (no auto-repeat); none held, or a key whose entry is $2F (the function keys, RUN/STOP), sets $18 = 0 instead."
  },
  {
   "address": 38742,
   "type": "line",
   "text": "The scrolling bottom row (called from the raster IRQ at $8EA1 and $8EED, on every screen): unless $02 has bit 7 set and bit 6 clear, counts the 10-bit position $04/$05 down by one; then writes 40 characters of the 128-character loop at $3624 (the Activision logo characters, PRESS F1 OR F3 TO START, GHOSTBUSTERS, DESIGNED BY DAVID CRANE, COPYRIGHT 1984) starting at character 127 - (position / 8), to row 24 at $57C0, spaces as 0 and codes of $40 and above AND $3F. The fine scroll (position AND 7) is set by bottom_scroller_logo_sprite ($97A1)."
  },
  {
   "address": 38817,
   "type": "line",
   "text": "Bottom-band raster work (called from the IRQ at $8ECE and $8F6E): puts sprite 7 (shape $3B, colour 2, Y = $F2) at X = position $04/$05 minus $3B8 so that it travels with the Activision logo in the scrolling row, enabling it alone ($D015 = $80) or hiding it when that X is $200 or more; waits for raster $F2, then sets the fine scroll ($D016 low bits = $04 AND 7, 38 columns off, multicolour off) and clears $D011's bits 6-7; makes sprite 7 single-colour and behind the characters and, for raster lines $F4-$FB, changes its colour line by line from $3714 (8 8 7 7 5 5 6 0: orange, yellow, green, blue), the rainbow stripes of the logo; then puts $D01C and $D01B back."
  },
  {
   "address": 38962,
   "type": "line",
   "text": "Replaces a leading ASCII '0' in $23 by 0 (a blank): used after bcd_to_ascii ($99B7) at $71D7 and $7280 so that a two-digit figure prints as \" 7\" rather than \"07\"."
  },
  {
   "address": 38973,
   "type": "line",
   "text": "Restores sprites 4-7 from the copies kept in $EA4E-$EA55 and $C4-$C7 (called from $8986 and $89FA): targets $B8-$BF = $EA4E-$EA55 and shape numbers $2F-$32 = $C4-$C7."
  },
  {
   "address": 38993,
   "type": "line",
   "text": "Sends sprite X/2 back to its starting place (called from $7BCB after a sprite has reached its goal and PK has gone up by 100, and from $8242): $28 = how many of $C4-$C7 are non-zero; the saved position $EA46,x/$EA47,x and saved target $EA56,x/$EA57,x are set from $37B3,x/$37B4,x and $37C3,x/$37C4,x, and when the game state $3A is $12 the live position $A0,x and target $B0,x too. Ends with CLD for its caller, which ran pk_add_hundreds in decimal mode."
  },
  {
   "address": 39061,
   "type": "line",
   "text": "Adds A hundreds to the city's PK energy, the four BCD digits $5A (low two) and $5B (high two): sets decimal mode and clears carry, then pk_add_hundreds_carry ($9897). Called with A = 1 at $7BC8 and A = 3 at $73DF."
  },
  {
   "address": 39063,
   "type": "line",
   "text": "PK energy addition with decimal mode and carry already set by the caller ($7409 adds 0 with the carry from incrementing $5A, the steady rise): $5B = $5B + A + C. A carry out of $5B caps PK at 9999 ($5A = $5B = $99). When the thousands digit has changed and PK is now 5000 or more, it picks a building: from the random byte $06, X = its low nibble raised to at least 4, stepping on until the map slot $EA28,x holds a building and X is not 10; then $80 = X and that building's state $C8,x = $C8. Tested live: taking PK from 4998 past 5000 marked building 9. Ends with CLD."
  },
  {
   "address": 39147,
   "type": "line",
   "text": "For each man (sprite 5 at $AA/$AB into $23, sprite 6 at $AC/$AD into $24): the X his proton stream reaches at the Slimer's height, the man's X plus (man's Y - Slimer's Y $A9) / 4, negated when the man's shape number $30/$31 minus $0E is odd (facing left). Used by slimer_side_of_streams ($9918) and streams_confine_slimer ($992B); called from $858F and $9ABC."
  },
  {
   "address": 39192,
   "type": "line",
   "text": "Records on which side of each stream the Slimer is: for X = 1, 0, $7E,x = $FF when the Slimer's X $A8 is less than the stream's X $23,x, else 0. Called from $8592 and by streams_confine_slimer when a stream is out of reach."
  },
  {
   "address": 39211,
   "type": "line",
   "text": "Keeps the Slimer between the streams (called from $85A2): with the streams' X in $23/$24 ($98EB) and the men's Y in $25/$26, if the two streams are within 6 pixels of each other the Slimer's direction becomes 6 (straight down). For each stream: if the man is $60 or more below the Slimer the stream does not reach it, and the routine re-records the sides and returns ($9918); otherwise a Slimer that has moved across the stream from the side recorded in $7E,x is put back on the stream's X and turned away from it (direction 0, right, or 4, left). The direction is stored in $7D."
  },
  {
   "address": 39282,
   "type": "line",
   "text": "Moves the Slimer (sprite 4, $A8/$A9) one step in direction $7D (0-7: right, up-right, up, up-left, left, down-left, down, down-right; steps $A9B8/$A9C0,x) and keeps it in the box X $48-$8F, Y $30-$6F: at an edge it is put back inside and the direction is turned half round (+4). The target $B8/$B9 is set to the new position. Called from $9AB9."
  },
  {
   "address": 39351,
   "type": "line",
   "text": "Splits the BCD byte in A into two ASCII digits: $23 = the tens ('0'-'9'), $24 = the units. Called from $71D4, $71E4, $71EE, $727D, $728D (the play screen's figures)."
  },
  {
   "address": 39372,
   "type": "line",
   "text": "Starts one of the ten play-screen messages, X = 0-9 (split pointer table $B3F4/$B3FE: NO EMPTY TRAPS, BACKUP MEN OUT OF ACTION, NO BAIT, BACKPACKS DISCHARGED, MARSHMALLOW ALERT, $4000 DAMAGE, MAYOR AWARDS $2000, CAR LOADED TO CAPACITY, CROSSED THE STREAMS, GO TO ZUUL), unless one is already showing ($4B non-zero): copies it to $E900 as screen codes (space to 0, letters minus $40) with its $FF end mark, counts its characters in $4A, sets $4B = 1. Called from eleven places."
  },
  {
   "address": 39425,
   "type": "line",
   "text": "Z set when sprite X/2's position $A0,x/$A1,x equals its target $B0,x/$B1,x. Called from $887F (and $87B1, $8912, $8B31, $8B51 by address)."
  },
  {
   "address": 39436,
   "type": "line",
   "text": "Sets bit 0 of the Slimer's shape number $2F from bit 3 of the pass counter $09, so it alternates between two shapes every eight passes. Called from $8786 and $886F."
  },
  {
   "address": 39446,
   "type": "line",
   "text": "Puts the trap (sprite 7, $AE/$AF and its target $BE/$BF) at the first man's feet: X = his X $AA minus 6, plus 12 when he faces right ($77 bit 0 clear), Y = his Y $AB minus 7. Called from $8502 and $889E."
  },
  {
   "address": 39477,
   "type": "line",
   "text": "Arranges sprites 0-3 as a column above the trap (sprite 7 at $AE/$AF), called from $86B0 and $875B: steps the counter $79 through 0-5 and sets the four shapes $2B-$2E to $A9CA-$A9CD plus $79; all four at the trap's X; from the height counter $7A (mirrored above $48 as $9C - $7A, so it grows and then shrinks) the sprites' Y are spread upwards from the trap's Y - $15. Live: it ran 129 times in 300 frames after the trap was sprung from agent5-beams.json (work/verify/t19-letters-trap.js)."
  },
  {
   "address": 39562,
   "type": "line",
   "text": "During a bust (called from $8525, $8531 and $8568): if the building's state $C8,x (X = the building $6E) still has both bits 2-3 set, returns. Otherwise blanks the Slimer's shape ($2F = 0) and, unless $7C is set, discards its caller's return address, sets the game state $3A = $1F and jumps to $8823."
  },
  {
   "address": 39590,
   "type": "line",
   "text": "The Slimer's per-pass work during a bust (called from $8522, $852E, $8565, $859B and $86A0): sprite 4 in front of the background when $6D bit 1 is set, behind it otherwise ($D01B bit 4); moves it (slimer_move $9972), recomputes the streams' X at its height ($98EB), and every fourth pass ($09 AND 3 = 0) turns its direction $7D by the random bit $06 AND 1 and sets its shape $2F to $0A plus another random bit. Live (work/verify/t16-intensifier.js): $D01B = $10 without the image intensifier, $00 with it; the frame pictures show the Slimer cut by a window without it."
  },
  {
   "address": 39642,
   "type": "line",
   "text": "Fire-button edge test: A = the fire bit of the joystick ($33 AND $10), compared with the previous one in $11 (Z set when unchanged), then stored in $11. Called from $7E74, $850F, $8541, $857E and $865E."
  },
  {
   "address": 39651,
   "type": "line",
   "text": "Moves all eight sprites one pixel toward their targets: step_sprite_toward_target ($9C25) with A = 2 for X = $0E, $0C ... 0 (sprites 7 to 0). Called from ten places between $84F7 and $88EB ($84F7, $852B, $8562, $85A5, $86A3, $8704, $8794, $887A, $889B, $88EB), the code that runs the scene at a haunted building."
  },
  {
   "address": 39663,
   "type": "line",
   "text": "Moves the target of man X/2 (sprite 5 at X = 0, sprite 6 at X = 2; $BA,x/$BB,x) one pixel for the joystick $33: right +X, left -X, down +Y, up -Y. Called from $84FC, $8536, $856D and $8B71. A second entry at $9AF1 takes the direction bits in A instead (from $85CA)."
  },
  {
   "address": 39665,
   "type": "line",
   "text": "Second entry of man_target_from_stick ($9AEF): the direction bits come in A instead of from the joystick $33 (active low: bit 3 clear moves the target of man X/2 right, bit 2 left, bit 1 down, bit 0 up), kept in $24. Called from $85CA."
  },
  {
   "address": 39700,
   "type": "line",
   "text": "Keeps the target of man X/2 ($BA,x/$BB,x) on the pavement: X between $20 and $8C, Y between $AA and $C8. Called from $84FF, $8539, $8570 and $85CD."
  },
  {
   "address": 39733,
   "type": "line",
   "text": "Walking animation of both men: $23 = A, the shape number to use when standing, then animate_man ($9B44) for the second man (X = 1, sprite 6) and the first (X = 0, sprite 5). Called from $84F4, $853E, $8877 and $8898."
  },
  {
   "address": 39748,
   "type": "line",
   "text": "Walking animation of man X (0 or 1; Y = 2X indexes his sprite's X/Y): on every other pass, while his X differs from his target's, bit 0 of $77,x becomes his facing (1 when the target is to the left) and his step ($77,x bits 1-2) advances. His shape $30,x is then $23 OR facing when he stands on his target, else $77,x + $0E. Called from animate_both_men and from $857B, $88E2, $8B45, $8B65."
  },
  {
   "address": 39824,
   "type": "line",
   "text": "Turns the name as typed, LAST,FIRST, into FIRST LAST in the text buffer $EA14: clears $EA14-$EA27, copies what follows the comma in $EAB3-$EAC6, adds a space after it, then the leading letters A-Z of the name (stopping at the comma or any non-letter), ends it with $FF and selects message $80 (the buffer, select_message $9BEE). A name with no comma gives a space and the name. Called from $8C96 and $8D06 (the end-of-game texts)."
  },
  {
   "address": 39918,
   "type": "line",
   "text": "Selects message A for the interview and end-of-game text engine: $EA76 = 1 when bit 7 of A is set (read at $72E3), else 0; $4D = A; the text pointer $4E/$4F from the table $B36D at 2*A (bit 7 dropped): 0 the buffer $EA14, 1 the interview's opening, 2 DO YOU HAVE AN ACCOUNT?, 4 WHAT IS YOUR ACCOUNT NUMBER?, 5 INVALID ACCOUNT NUMBER., 6 the vehicle page, ... $11 YOUR NEW ACCOUNT NUMBER IS. Called from 29 places."
  },
  {
   "address": 39944,
   "type": "line",
   "text": "Carry set when $23 <= A < $24, clear otherwise. Called from $7DBC, $7DD1, $81C2, $86EF."
  },
  {
   "address": 39957,
   "type": "line",
   "text": "Compares all eight sprites' positions $A0-$AF with their targets $B0-$BF: Z set (and A = 0) when every sprite has arrived, Z clear at the first difference. Called from $7860 and $7900."
  },
  {
   "address": 39971,
   "type": "line",
   "text": "step_sprite_toward_target ($9C25) with A = 3: at most 2 pixels a pass. Called from $774B and $80A2."
  },
  {
   "address": 39973,
   "type": "line",
   "text": "Moves sprite X/2's position $A0,x/$A1,x toward its target $B0,x/$B1,x, each axis on its own, by the distance or A - 1, whichever is less. The distance is taken as an unsigned difference, so when the target lies below the position (a negative difference) the step is always A - 1, and a target one or two pixels away is overshot and approached again from the other side. Called from sprite code at $7C97, $8929, $8A07, $8B2C, $8B4C, $8B6C and eight times a pass by $9AE3."
  },
  {
   "address": 40054,
   "type": "line",
   "text": "The distance |$B1,x - $A1,x| between sprite X/2's Y and its target's Y, in A. Nothing calls it: no JSR, JMP or address to $9C76 in the image (byte scan), and it never ran in the simulator."
  },
  {
   "address": 40067,
   "type": "line",
   "text": "Empties the typed-line buffer: the input index $50 = 1, so the next character goes to $EA00. Called from $74B5, $74D2, $74FF, $75B9, $760F, before each answer is typed."
  },
  {
   "address": 40072,
   "type": "line",
   "text": "Stores the typed character A at $E9FF + $50 (the buffer $EA00 on), advances $50 and echoes it through print_char ($9C8F). Called from $736D and $7383 (the typing code of the interview and shop)."
  },
  {
   "address": 40079,
   "type": "line",
   "text": "Prints one character of the text engine at column $38, row $39 of the screen at $5400 (row address from $AAE5, row * 10, times 4), in colour $48 in the matching colour RAM: 0 prints nothing; $80 and above sets the column to A AND $3F; $0D moves to column 1 of the next row; otherwise a space becomes 0, codes of $40 and above lose $40, and the column advances. When $15 is set and $48 is 0, a space at column 32 or beyond also starts a new row (word wrap). Called from $733D and input_add_char."
  },
  {
   "address": 40177,
   "type": "line",
   "text": "Sets the balance to $10,000 ($57 = 1, $58 = $59 = 0). Nothing calls it: no JSR, JMP or address to $9CF1 in the image (byte scan), and it never ran in the simulator; the interview does the same inline at $74EA."
  },
  {
   "address": 40188,
   "type": "line",
   "text": "Turns the typed account number at $EA00 into four bytes: for up to eight characters, stopping at a 0 byte, the low nibble of each is shifted into the 32-bit $23 (high) ... $26 (low), so a shorter number is right-aligned with leading zeros. The character itself is not checked: '8' gives 8, '9' 9, 'A' 1, 'L' $C The line input lets letters through: LEFTY typed as the number for the name LEFTY packed to $000C5649 and gave $860000, as the cheat lists say (live, work/verify/t19-letters-trap.js). Called from $7505, which copies $23-$26 to $EAC7-$EACA for account_decode ($9155)."
  },
  {
   "address": 40228,
   "type": "line",
   "text": "Writes the balance $57/$58/$59 as text into $EA14: a '0', the six BCD digits and $FF; leading zeros become spaces (keeping the last digit) and a '$' goes in front of the first digit left, so $002500 becomes \"   $2500\". Called from $72AC, $73AD, $75A2, $8CB0, $8D4F, $8D71; trim_leading_spaces ($9063) usually follows."
  },
  {
   "address": 40269,
   "type": "line",
   "text": "Writes A bytes from $23 on as digit characters, each nibble OR $30 (a nibble above 9 would give : to ?), into the text buffer from $EA14, ending with $FF: the entry of bytes_to_digits ($9D51) with Y = 0. Called only with A = 4 from $8CDF, to print the new account number $EAC7-$EACA as eight digits, each 0-7 by construction."
  },
  {
   "address": 40273,
   "type": "line",
   "text": "Writes $27 bytes from $23 on as two digit characters each (high nibble then low, OR $30) into $EA14 from position Y, then $FF. BCD bytes give decimal digits."
  },
  {
   "address": 40308,
   "type": "line",
   "text": "Replaces the leading '0' characters of the text in $EA14 by spaces, stopping at the first other character, at a '.', or at the last digit before the $FF end, so a zero still prints one 0. Returns X = the position of the first character kept."
  },
  {
   "address": 40342,
   "type": "line",
   "text": "Copies 1536 bytes (six pages) from the pointer $0D/$0E to $0F/$10, ascending: copy_pages ($9D9A) with X = 5, Y = 0. Called from $7AC8, $7AFE, $82D5 (screens and character sets)."
  },
  {
   "address": 40346,
   "type": "line",
   "text": "Copies X + 1 pages from ($0D) to ($0F), starting at offset Y, ascending, stepping the pointers' high bytes. Entered at $841C with X = 1 to copy two pages of facade characters to $5BD0."
  },
  {
   "address": 40361,
   "type": "line",
   "text": "Copies downwards from ($0D),Y to ($0F),Y: Y counts down to 0 on each page, then both high bytes go down one, for X + 1 pages. Called from $82FA with X = 3, Y = $47: the building screen's 840 characters from $2698 (or $1880 for building 10) to $5400-$5747."
  },
  {
   "address": 40378,
   "type": "line",
   "text": "Ten rate masks, one per thousand of PK energy ($5B's high digit, read at $72C4 into $3C): $3F $1F $0F $07 $03 then $01. $73F7 raises PK by 1 when the pass counter $09 AND ($3C OR $0F) is 0, so PK creeps up once every 64 passes below 1000, every 32 below 2000 and every 16 from there on; $7C87 uses $3C as it is."
  },
  {
   "address": 40388,
   "type": "line",
   "text": "GHOSTBUSTERS in PETSCII, 12 characters, written by $8425 (AND $3F, in red) to row 8 of the building screen at $554D when the building is 17: the sign over GHQ's door."
  },
  {
   "address": 40400,
   "type": "line",
   "text": "Four colours for a building's walls (orange $0A replaced by entry $A1C0,x AND 3): $0A light red, $08 orange, $09 brown, $0D light green. Read at $8305 while $8328 copies the building's colour map to $D800."
  },
  {
   "address": 40404,
   "type": "line",
   "text": "Four sets of 16 bytes, the bitmaps of characters $4D-$4E, copied to $5A68 by $8447 for bits 2-3 of the building's $A1C0 entry. Set 0 ($9DD4-$9DE3) is never read, because a 0 there skips the copy."
  },
  {
   "address": 40468,
   "type": "line",
   "text": "Character bitmaps for the building's windows, 112 bytes (14 characters, $66-$73) copied to $5B30 by $8394: from offset $9F18[n] for window style n of the building's $A1C0 entry (bits 4-5): style 1 uses $9E14-$9E83 and style 2 $9E5C-$9ECB, overlapping by 40 bytes."
  },
  {
   "address": 40652,
   "type": "line",
   "text": "Character codes of one window, 24 per style (4 wide, 6 tall), written by $8373 at the offsets $9EFC into each of the four windows: style 1 at $9ECC, style 2 at $9EE4 (offsets from $9F14)."
  },
  {
   "address": 40700,
   "type": "line",
   "text": "The screen offsets of a window's 24 cells, 4 across and 6 down (0-3, $28-$2B, ... $C8-$CB), added at $836C to the window's start ($5430 plus 6 columns per window)."
  },
  {
   "address": 40724,
   "type": "line",
   "text": "Per window style (0-3), the offset of its character codes in window_char_codes ($9ECC): -, 0, $18, $30. Style 0 means no change; style 3 is used by no building in $A1C0 and would read the offsets table."
  },
  {
   "address": 40728,
   "type": "line",
   "text": "Per window style (0-3), the offset of its bitmaps in window_char_bitmaps ($9E14): -, 0, $48, $B8. Style 3 is used by no building."
  },
  {
   "address": 40732,
   "type": "line",
   "text": "Low bytes of the lower-facade character maps, per style 0-3 from bits 6-7 of the building's $A1C0 entry, read at $83AF (high bytes at $9F20): -, $9F2C, $A008, $A0E4. Each map is 10 rows of 22 characters written at $5520 on (rows 7-16, columns 8-29), in colour 9."
  },
  {
   "address": 40736,
   "type": "line",
   "text": "High bytes of the lower-facade character maps (lows at $9F1C), read at $83B4: -, $9F, $A0, $A0."
  },
  {
   "address": 40740,
   "type": "line",
   "text": "Low bytes of the addresses of the two pages of characters that go with each lower-facade style, read at $8406 (high bytes at $9F28): -, $3050, $3138, $3208; copied to $5BD0 by copy_pages ($9D9A)."
  },
  {
   "address": 40744,
   "type": "line",
   "text": "High bytes of the lower-facade character pages (lows at $9F24), read at $840B: -, $30, $31, $32."
  },
  {
   "address": 40748,
   "type": "line",
   "text": "Lower-facade style 1: 220 character codes, 10 rows of 22 ($9F2C-$A007; the last 8 bytes are past $A000), copied to rows 7-16, columns 8-29 of the building screen by $83D1 when bits 6-7 of the building's $A1C0 entry are 1 (buildings 2, 9, 13, 14, 16, 18, 21, 22, 23)."
  },
  {
   "address": 40960,
   "type": "line",
   "text": "Last 8 bytes of building front 1, whose 22x10 screen-code layout starts at $9F2C (entry 1 of the pointer pair $9F1C/$9F20); these are row 9, columns 14-21. Copied to the screen by the building-scene drawer at $83D1."
  },
  {
   "address": 40968,
   "type": "line",
   "text": "Building front 2: 220 screen codes, 22 columns x 10 rows, of the game's own characters (rendered from the character set at $5800: a front with a doorway and steps). Chosen when bits 6-7 of bldg_attr ($A1C0,x) are 2; $83AF takes its address from $9F1C/$9F20 and the loop at $83D1 copies it row by row to the screen from $5520 (row 7, column 8), colour RAM 9."
  },
  {
   "address": 41188,
   "type": "line",
   "text": "Building front 3: 220 screen codes, 22 x 10, drawn like bldg_front2 by $83D1 when bits 6-7 of bldg_attr are 3 (rendered: a brick front with a large double door). The haunted building of the saved bust state (destination 7, $A1C7 = $C1) uses it."
  },
  {
   "address": 41408,
   "type": "line",
   "text": "One attribute byte for each of the 20 destinations (index $6E, 0-19, the same index as the per-building state $C8,x). Bits 6-7: which building front to draw (0 none, 1-3 via $9F1C/$9F20; read at $83A2). Bits 2-3: which 16-byte block of $9DD4 is copied to $5A68 (redefining two characters; $8439). Bits 0-1: index into $9DD0 ($82FF, and $8358). Read only by the building-scene set-up at $82FF-$8440."
  },
  {
   "address": 41428,
   "type": "line",
   "text": "Vehicle prices, middle BCD byte (hundreds and thousands), one per vehicle 1-4: $20, $48, $60, $50. With car_price_high this gives $2,000, $4,800, $6,000 and $15,000. Read at $7638 (key '1'-'4' minus '1', AND 3) into $24 before the purchase check at $9654."
  },
  {
   "address": 41432,
   "type": "line",
   "text": "Vehicle prices, top BCD byte (ten-thousands): 0, 0, 0, 1; the high-performance car is the only one over $9,999. Read at $763D into $25."
  },
  {
   "address": 41436,
   "type": "line",
   "text": "Equipment prices in hundreds of dollars (BCD), by item number 0-7 (the shelf sprite shape minus $33): PK energy detector $400, image intensifier $800, marshmallow sensor $800, ghost bait $400, item 4 $600, traps $600, ghost vacuum $500, laser confinement system $8,000 ($80). Read at $790D into $24 for the purchase at $9654. Item 4 is on no shelf (see shelf_shapes)."
  },
  {
   "address": 41444,
   "type": "line",
   "text": "Payment for a trapped Slimer in hundreds of dollars (BCD), 16 steps: $1,000, $1,000, $900 ... $300, $300. Read at $87F8 in st1F_trap_closes (state $1F) with the building's timer, the high nibble of $C8,x, when its stage bits 2-3 are 3, else with index 15 ($300); $9664 adds it to the balance. So the fee falls the longer the building has been haunted. Live (work/verify/t8-reward.js, state poked before the trap closed): $1F paid $1000, $2F $900, $5F $800, $AF $500, $FF $300, $1C $1000, $6C $700, $00 and $34 $300."
  },
  {
   "address": 41460,
   "type": "line",
   "text": "Music note frequency table: 96 words, low byte first, SID frequency values for notes C0 to B7 in equal temperament tuned to the NTSC clock ($010C for C0, $FD2E for B7). Indexed by note number x 2: $9496/$94A0 set a voice's pitch ($D400/$D401,y), $953D-$955C take this note and the next for vibrato."
  },
  {
   "address": 41461,
   "type": "line",
   "text": "High bytes of the note_freq words, read as $A1F5,y at $94A0 (pitch) and $9548/$9559 (vibrato); the table starts at $A1F4."
  },
  {
   "address": 41462,
   "type": "line",
   "text": "note_freq seen one note higher: the vibrato code at $953D reads $A1F6,y (and $A1F7,y) to take the step to the next semitone; not a separate table."
  },
  {
   "address": 41463,
   "type": "line",
   "text": "High byte of the next note's frequency for the vibrato step at $9545 ($A1F7,y); part of note_freq."
  },
  {
   "address": 41652,
   "type": "line",
   "text": "Music driver: the SID register offset of voices 1-3 (0, 7, 14), read at $93F9 into $E1 and used as Y for $D400-$D406,y."
  },
  {
   "address": 41655,
   "type": "line",
   "text": "Music driver: low bytes of each voice's track list ($A2BD, $A32B, $A399), read at $9405 and $63DD into $E3."
  },
  {
   "address": 41658,
   "type": "line",
   "text": "Music driver: high bytes of the three track lists ($A2, $A3, $A3), read at $940A and $63E2 into $E4."
  },
  {
   "address": 41661,
   "type": "line",
   "text": "Track list of voice 1 (the melody): 109 pattern numbers, each an index into pattern_ptrs, ended by $FF. The driver at $9420 reads it at $82,x and on $FF stops the voice ($88,x = $FF). Uses patterns 0-37."
  },
  {
   "address": 41771,
   "type": "line",
   "text": "Track list of voice 2 (the bass line): 109 pattern numbers (40-57, 51 and 52 never used), $FF-terminated."
  },
  {
   "address": 41881,
   "type": "line",
   "text": "Track list of voice 3 (percussion and fills): 109 pattern numbers (60-70; pattern 65 repeated), $FF-terminated."
  },
  {
   "address": 41991,
   "type": "line",
   "text": "The theme tune's 71 patterns (numbers 0-70; 38, 39, 58, 59 are null in pattern_ptrs), 852 bytes, packed back to back. An event is a control byte: bits 0-4 the length in driver ticks (the driver starts new events on every fourth call, when $08 AND 3 is 0, $9401); bit 6 a rest (one byte); otherwise a note number (index into note_freq) follows, and when bit 7 is set a third byte gives the instrument (low nibble, instr_table) and the master volume (high nibble; $F fades with $82 at the end). Bit 5 ties the note (no gate-off, $9503). $FF ends a pattern. Parsed by $9446-$94F4."
  },
  {
   "address": 42843,
   "type": "line",
   "text": "Music: address of each pattern, 74 words indexed by pattern number x 2 (read at $9436/$943B and $63ED/$63F2). Entries 38, 39, 58, 59 and 71-73 are zero (no pattern); 51 ($A67D) and 52 ($A684) are valid patterns that no track list plays."
  },
  {
   "address": 42844,
   "type": "line",
   "text": "High byte of each pattern_ptrs word, read as $A75C,y at $943B and $63F2."
  },
  {
   "address": 42991,
   "type": "line",
   "text": "Music instruments: 9 records of 8 bytes, indexed by instrument x 8 ($94BC): +0/+1 pulse width ($D402/$D403), +2 waveform and gate ($D404), +3 attack/decay, +4 sustain/release, +5 vibrato depth as a shift count (0 none; $9525), +6/+7 unused. Instrument 3 is noise (the drum), 1, 5, 6 and 8 sawtooth, 0, 2, 4 and 7 pulse. Patterns use 1, 2, 3, 5, 6, 7 and 8."
  },
  {
   "address": 42992,
   "type": "line",
   "text": "Instrument field +1, pulse width high, read as $A7F0,x at $94D4 (instr_table starts at $A7EF)."
  },
  {
   "address": 42993,
   "type": "line",
   "text": "Instrument field +2, the SID control byte (waveform and gate), read as $A7F1,x at $94BC/$94C6 and ANDed with $DE to release the gate on rests."
  },
  {
   "address": 42994,
   "type": "line",
   "text": "Instrument field +3, attack/decay, read as $A7F2,x at $94DA into $D405,y."
  },
  {
   "address": 42995,
   "type": "line",
   "text": "Instrument field +4, sustain/release, read as $A7F3,x at $94E0 into $D406,y."
  },
  {
   "address": 42996,
   "type": "line",
   "text": "Instrument field +5, vibrato depth (how many times the semitone step is halved), read as $A7F4,y at $9525; 0 turns vibrato off."
  },
  {
   "address": 43063,
   "type": "line",
   "text": "City map: the starting type (1-6) of each of the 30 map blocks, copied to the working copy $EA28-$EA45 at game start ($9033). $95EB draws a block from its type via block_shape_offset."
  },
  {
   "address": 43093,
   "type": "line",
   "text": "City map: offset of each block type's 20-character shape (5 x 4) in the table at $3F2D: 0, $14, $28 ... $8C, for types 0-7 ($9615). The same bytes read with Y = row 0-3 ($961D), then doubled, give 0, 40, 80, 120: the screen offsets of the block's four rows. One table, two uses."
  },
  {
   "address": 43101,
   "type": "line",
   "text": "City map: offset of each of a block's four rows inside its 5 x 4 shape (0, 5, 10, 15), added at $9619."
  },
  {
   "address": 43105,
   "type": "line",
   "text": "City map: low bytes of the screen address ($53xx-$57xx) of the top-left of each of the 30 map blocks, read at $9607; high bytes in block_screen_hi."
  },
  {
   "address": 43135,
   "type": "line",
   "text": "City map: high bytes of the 30 block screen addresses, read at $960C."
  },
  {
   "address": 43165,
   "type": "line",
   "text": "Per vehicle (index $5C, 0-3): the character multicolour 2 ($D023) on the vehicle and shop pages: cyan, blue, blue, purple. Read at $75FB, $76CC and $7FE0."
  },
  {
   "address": 43169,
   "type": "line",
   "text": "Per vehicle: a colour (cyan, white, blue, purple) ORed with 8 and written to colour RAM at $DAF2-$DB45 by $846B, the car drawn in the building scene."
  },
  {
   "address": 43173,
   "type": "line",
   "text": "The Marshmallow Man's path on the Zuul street, 32 steps: the y position of his top sprites (+$2A for the bottom pair). Read at $8B89 in st29_zuul_street with the frame counter $08 / 2 folded to 0-31-0, so he walks to and fro."
  },
  {
   "address": 43205,
   "type": "line",
   "text": "The Marshmallow Man's x position for each of the 32 steps on the Zuul street (from $40 up to $57 and back to $55); +$18 for the right-hand pair. Read at $8B97 in st29_zuul_street."
  },
  {
   "address": 43237,
   "type": "line",
   "text": "The Marshmallow Man's per-step frame on the Zuul street: low nibble + $2E gives a sprite shape ($8BA9), high nibble a second value used below $8BB1. Read at $8BA5 in st29_zuul_street."
  },
  {
   "address": 43269,
   "type": "line",
   "text": "Four sprite shapes, $2B-$2E (shapes 43-46: the Marshmallow Man's head and body, as rendered), copied to the sprite shape variables $2B-$2E by $8A43 (Zuul street set-up) and $8B15/$8B1A (st29_zuul_street), and to $2F+Y by $8946 (his arrival on the map)."
  },
  {
   "address": 43271,
   "type": "line",
   "text": "Third entry of mm_shapes ($A905), shape $2D, read on its own by $8B1A into $2D."
  },
  {
   "address": 43273,
   "type": "line",
   "text": "The Marshmallow Man's leg shapes while he stomps a building ($2C, $2C, $31, $31), indexed by (step / 8) AND 3 at $8998 in st25_mm_stomps, into $30."
  },
  {
   "address": 43277,
   "type": "line",
   "text": "Second set of leg shapes for the stomp ($2E, $32, $32, $2E), read at $899D in st25_mm_stomps into $32."
  },
  {
   "address": 43281,
   "type": "line",
   "text": "Vertical bob of the stomp (0, 2, 4, 3), subtracted from the y position at $89AE in st25_mm_stomps."
  },
  {
   "address": 43285,
   "type": "line",
   "text": "Low bytes of row x 40 for rows 0-25, the offset of a screen row; read at $7F32 and $8C38."
  },
  {
   "address": 43311,
   "type": "line",
   "text": "High bytes of row x 40 for rows 0-25, read at $7F3A and $8C40."
  },
  {
   "address": 43337,
   "type": "line",
   "text": "Sprite colour for each sprite shape number 0-62, read at $8F99 as the sprite update loop writes a shape to the pointer $57F8,x and its colour to $D027,x."
  },
  {
   "address": 43400,
   "type": "line",
   "text": "Equipment shop: starting x, y of sprites 0-2 (the forklift: $28,$52 / $10,$52 / $10,$52), copied to the position variables $A0-$A5 and targets $B0-$B5 at $7721."
  },
  {
   "address": 43406,
   "type": "line",
   "text": "Per vehicle: the offset of its 24 bytes in cargo_slot_pos (0, $18, $30, $48), read at $779F."
  },
  {
   "address": 43410,
   "type": "line",
   "text": "Driving scene: per vehicle, the y position given to sprites 2 and 3 ($A5/$A7) at $7045: $86, $87, $84, $94."
  },
  {
   "address": 43414,
   "type": "line",
   "text": "Driving scene: colour cycle for sprite 2 ($D029): blue, light blue, cyan, white; indexed at $705B by ($65 AND $1F) folded and divided by 4 while $65 is non-zero."
  },
  {
   "address": 43418,
   "type": "line",
   "text": "Busting: x offsets of a man's proton stream sprites from the man, by facing (bit 0 of $77,x): +8/-8 ($9097) and +9/-9 ($909F)."
  },
  {
   "address": 43420,
   "type": "line",
   "text": "Second pair of stream_offset ($A99A): +9/-9 by facing, added at $909F for the second stream sprite."
  },
  {
   "address": 43422,
   "type": "line",
   "text": "The two screen edges an escaping Slimer is sent to, x = 0 and $A8: st1D_slimer_escapes reads one at $871E as the Slimer's target and compares at $8734; when it arrives the building is cleared and PK rises by 300."
  },
  {
   "address": 43424,
   "type": "line",
   "text": "A box around sprite 0's position $A0/$A1 for the range test at $9C08: x - 8 to x + 8 and y - 12 to y + 4, set up at $86E2/$86E8 in the bust to test whether the Slimer is over the trap."
  },
  {
   "address": 43426,
   "type": "line",
   "text": "Width and height of the box in trap_hitbox ($A9A0): $10, $10, added at $86E8 to the box start."
  },
  {
   "address": 43428,
   "type": "line",
   "text": "A +1/-1 wobble (0, 1, -1, 0), indexed by ($7B / 4) AND 3 at $8843 in the bust and added to the sprite positions $AB-$AF."
  },
  {
   "address": 43432,
   "type": "line",
   "text": "Equipment flag bit for each item 0-7, kept in $6D: PK detector $01, image intensifier $02, marshmallow sensor $04, bait $08, item 4 none, traps none (they are counted, not flagged), vacuum $20, laser $40. Set when bought ($7920); $76F7 hides a shelf item already owned."
  },
  {
   "address": 43440,
   "type": "line",
   "text": "Which equipment flag lets the player see a building's warning, by its stage bits 2-3: none, PK detector ($01), marshmallow sensor ($04), PK detector. Read at $7D74; without the flag the building shows as normal. Only the buildings whose rectangle holds the logo (map_building_under_logo $7D23) show the colour, so a warning is seen only while the logo is on a street beside the building. Live (work/verify/t2-warnings.js)."
  },
  {
   "address": 43444,
   "type": "line",
   "text": "The state a building takes when its timer (the high nibble of $C8,x) runs out, by its current stage bits 2-3: $14, $1C, $F8, $1F. Read at $73EB."
  },
  {
   "address": 43448,
   "type": "line",
   "text": "x step for each of 8 directions (0 east, counting anticlockwise): +1, +1, 0, -1, -1, -1, 0, +1. Read at $9979 with the direction in $7D."
  },
  {
   "address": 43456,
   "type": "line",
   "text": "y step for the 8 directions: 0, -1, -1, -1, 0, +1, +1, +1; read at $9981 and the result held between $32 and $6E."
  },
  {
   "address": 43464,
   "type": "line",
   "text": "Busting: the first sprite shape of a proton stream, by facing: $19 (shapes 25-30 as drawn) or $3C (the mirrored copies built at $6151); plus the animation step $79, read at $90E0."
  },
  {
   "address": 43466,
   "type": "line",
   "text": "Busting: base sprite shapes for sprites 0-3 ($25, $1F, $1F, $1F), plus the animation step $79, stored to $2B-$2E by $9A43; $87A7 reads the first."
  },
  {
   "address": 43470,
   "type": "line",
   "text": "Equipment shop: 96 bytes of sprite y positions. Read at $7771/$77DA with X = forklift stop $5F x 2 (into $B1, the forklift's target), and at $7A39 with X = a multiple of 8 (into $A1,y). So it holds interleaved lists at two strides; the exact layout is not established."
  },
  {
   "address": 43566,
   "type": "line",
   "text": "Equipment shop: positions of the cargo slots in the car, 24 bytes per vehicle (offset from cargo_slot_base), read at $77B7 with the forklift stop $5F and $61; stored to $B0,y as a sprite target."
  },
  {
   "address": 43662,
   "type": "line",
   "text": "Equipment shop: 4 bytes per page ($5D x 4 + row, $783F), giving $61, the offset into a vehicle's cargo_slot_pos: page 1 0-3, page 2 0, 4-6, page 3 0, 7."
  },
  {
   "address": 43674,
   "type": "line",
   "text": "Items of cargo each vehicle carries: 5, 9, 11, 7. $78EA compares the count loaded ($62) and, when full, shows status message 7 (YOUR CAR IS LOADED TO CAPACITY)."
  },
  {
   "address": 43678,
   "type": "line",
   "text": "Driving: the speed limit of each vehicle ($60, $70, $80, $A0), the cap on $1B at $80C5; the manual gives 75, 90, 110, 160 mph."
  },
  {
   "address": 43682,
   "type": "line",
   "text": "Equipment shop: the forklift's target x for the two sides, by bit 0 of the stop $5F ($28 or $4C, $777B); the last two bytes ($4C, $4C) are not read."
  },
  {
   "address": 43686,
   "type": "line",
   "text": "Equipment shop: x, y of the five shelf item sprites (x $14, y $52, $72, $92, $AB, $C2), copied to $A6-$AF and $B6-$BF at $770D."
  },
  {
   "address": 43696,
   "type": "line",
   "text": "Equipment shop: the last forklift stop on each page (9, 9, 1), compared with $5F at $78CB."
  },
  {
   "address": 43699,
   "type": "line",
   "text": "Equipment shop: the sprite shape on each shelf, 8 bytes per page, first 5 used ($76EA with Y = page x 8 + 4 down to page x 8): page 1 $33-$35 (detector, intensifier, sensor), page 2 $36, $38, $39 (bait, traps, vacuum), page 3 $3A (laser). Shape $37, item 4 ($600 in item_price, no flag), is on no page: an item that cannot be bought. Bytes 5-7 of each page are never read."
  },
  {
   "address": 43723,
   "type": "line",
   "text": "Eight bytes (0, 1, 2, 4, 8, 0, $20, $40) that repeat item_flag shifted by one entry. Not read in any simulator run, and no indexed read found reaches them (shelf_shapes stops at $AAC7); apparently unused."
  },
  {
   "address": 43731,
   "type": "line",
   "text": "'--CREDIT--' in screen codes, copied to row 0, columns 26-35 ($541A) by $739F and a row of dashes two rows below, when $5E is set."
  },
  {
   "address": 43741,
   "type": "line",
   "text": "Eight bytes ($02, $09, $10, $17, $10 x 4) with no reader found: not read in any simulator run, and no instruction addresses them. Purpose unknown."
  },
  {
   "address": 43749,
   "type": "line",
   "text": "Screen row start / 4 for rows 0-25 (row x 10). The typewriter text printer at $9CB7 shifts it left twice into $5400 + row x 40 for the character and $D800 + row x 40 for its colour."
  },
  {
   "address": 43775,
   "type": "line",
   "text": "Per vehicle: high byte of its picture data, $0200, $0500, $0800, $0B00, read at $7669 (low bytes in car_picture_lo)."
  },
  {
   "address": 43779,
   "type": "line",
   "text": "Per vehicle: low byte of the picture address (all 0), read at $7670."
  },
  {
   "address": 43783,
   "type": "line",
   "text": "First character code of each of the 12 columns of a 12 x 16 character picture window ($40, $50 ... $F0): $35FC fills each column with 16 consecutive codes from here, starting at screen $54B2, colour 8. Drawn by the routine at $35E6, called from the vehicle page ($75D2) and $76BF."
  },
  {
   "address": 43795,
   "type": "line",
   "text": "Text page 1: the letterhead (GHOSTBUSTERS / FOR PROFESSIONAL / PARANORMAL / INVESTIGATIONS / AND ELIMINATIONS / -WE'RE READY TO BELIEVE YOU-) and the name prompt ending LAST,FIRST:. Pages are PETSCII typed out by $72EA and $9C8F: $0D starts a new line, a byte $80-$BF moves to column (byte AND $3F), $00 prints nothing (a pause), $FF ends the page."
  },
  {
   "address": 44000,
   "type": "line",
   "text": "Text page 2: DO YOU HAVE AN ACCOUNT?"
  },
  {
   "address": 44026,
   "type": "line",
   "text": "Text page 3, after N: IN THAT CASE, WELCOME TO YOUR NEW BUSINESS, three $00 pauses, then the bank's $10000 advance and GOOD LUCK."
  },
  {
   "address": 44179,
   "type": "line",
   "text": "Text page 4: WHAT IS YOUR ACCOUNT NUMBER? (seen in the simulator after answering Y, work/verify/t11-account.js)."
  },
  {
   "address": 44209,
   "type": "line",
   "text": "Text page 5: INVALID ACCOUNT NUMBER."
  },
  {
   "address": 44233,
   "type": "line",
   "text": "Text page 6: GHOSTBUSTING VEHICLE SELECTION and the four cars with their prices, the prices set at column 27 by the byte $9B."
  },
  {
   "address": 44366,
   "type": "line",
   "text": "Text page 7: YOU HAVE, followed on screen by the balance."
  },
  {
   "address": 44378,
   "type": "line",
   "text": "Text page 8: the vehicle page's instructions (PRESS SPACE BAR..., PRESS 1,2,3 OR 4..., PRESS RETURN..., GO AHEAD:)."
  },
  {
   "address": 44380,
   "type": "line",
   "text": "The 36 characters PRESS SPACE BAR TO VIEW CAR OPTIONS. inside page 8, also copied straight to row 17 ($5749) by $75DF when the options are redrawn."
  },
  {
   "address": 44418,
   "type": "line",
   "text": "The 36 characters PRESS 1,2,3 OR 4 TO PURCHASE CAR. inside page 8, copied to row 18 ($5771) by $75E8."
  },
  {
   "address": 44498,
   "type": "line",
   "text": "Text page 9, shop page 1: MONITORING EQUIPMENT with the PK energy detector $400, image intensifier $800, marshmallow sensor $800, two empty shelf lines, and the forklift instructions."
  },
  {
   "address": 44781,
   "type": "line",
   "text": "Text page 10, shop page 2: CAPTURE EQUIPMENT, ghost bait $400, TRAPS -REQUIRED- $600, ghost vacuum $500."
  },
  {
   "address": 45064,
   "type": "line",
   "text": "Text page 11, shop page 3: STORAGE EQUIPMENT, portable laser confinement system $8000."
  },
  {
   "address": 45353,
   "type": "line",
   "text": "Text page 13, the losing ending: the Keymaster and Gatekeeper arrived at Zuul and the bank has foreclosed. Seen in the simulator after the Keymaster and Gatekeeper met with $2500 against a start of $10000 (work/verify/t14-endings.js)."
  },
  {
   "address": 45497,
   "type": "line",
   "text": "Text page 14: GOOD TRY. Shown when the Marshmallow Man catches two men on the Zuul street; the pages that follow give the credit limit and a new account number, as a win does."
  },
  {
   "address": 45507,
   "type": "line",
   "text": "Text page 15: ...BUT YOU FAILED TO CLOSE THE PORTAL TO THE SPIRIT WORLD AND ZUUL HAS TAKEN OVER YOUR CITY."
  },
  {
   "address": 45599,
   "type": "line",
   "text": "Text page 16: YOU MADE MORE MONEY THAN YOU STARTED WITH, SO THE BANK WILL RAISE YOUR CREDIT LIMIT TO (the amount follows)."
  },
  {
   "address": 45689,
   "type": "line",
   "text": "Text page 17: YOUR NEW ACCOUNT NUMBER IS (the number follows)."
  },
  {
   "address": 45720,
   "type": "line",
   "text": "Text page 18: . WRITE THIS NUMBER DOWN FOR FUTURE PLAY."
  },
  {
   "address": 45762,
   "type": "line",
   "text": "Text page 24: CONGRATULATIONS( THANKS TO YOU, - the character '(' is drawn as an exclamation mark by the game's character set ($5800 + $28 x 8)."
  },
  {
   "address": 45796,
   "type": "line",
   "text": "Text page 25, the winning ending: THE PORTAL TO THE SPIRIT WORLD HAS BEEN CLOSED. YOU EARN A $5000 REWARD FROM THE CITY. ALSO,"
  },
  {
   "address": 45891,
   "type": "line",
   "text": "Text page 26: STARTING BALANCE:"
  },
  {
   "address": 45912,
   "type": "line",
   "text": "Text page 27: ENDING BALANCE:"
  },
  {
   "address": 45933,
   "type": "line",
   "text": "Addresses of the 28 text pages, by page number x 2, read at $9BFD/$9C02 by $9BEE (A = page, bit 7 set also sets $EA76) into the typewriter pointer $4E/$4F. Page 0 is at $EA14 and page 12 at $EB00 (built in RAM at run time), pages 20-23 are the car options at $38DE-$39B6, page 19 is the empty page at $B3A9, the rest are in this range."
  },
  {
   "address": 45934,
   "type": "line",
   "text": "High bytes of the text_page_ptrs words, read as $B36E,x at $9C02."
  },
  {
   "address": 45989,
   "type": "line",
   "text": "Text page number of each vehicle's options (20-23), read at $7609 and passed to $9BEE when SPACE steps through the cars."
  },
  {
   "address": 45993,
   "type": "line",
   "text": "Text page 19: a lone $FF, a page that ends at once."
  },
  {
   "address": 45994,
   "type": "line",
   "text": "'GHQ' in screen codes, written under the GHQ block of the city map ($572E) by $7B60."
  },
  {
   "address": 45997,
   "type": "line",
   "text": "Two joystick readings made up by the game, $07 (right) and $0B (left); $85BF reads the first and third (X = 2, 0), EORs them with $0C to swap left and right when needed and ORs in the player's $33, then man_target_from_bits ($9AF1, from $85CA) moves the man. The middle byte is not read."
  },
  {
   "address": 46000,
   "type": "line",
   "text": "Status message 9: GO TO ZUUL( SNEAK PAST THE MARSHMALLOW MAN AND CLOSE THE PORTAL... , shown by $99CC through status_msg_lo/hi; '(' is drawn as '!'."
  },
  {
   "address": 46068,
   "type": "line",
   "text": "Low bytes of the ten status-line messages shown by $99CC (X = message): $3A16, $3A40, $3A78, $3A89, $3AB0, $3AC5, $3B21, $3B5F, $3B80 and txt_go_to_zuul."
  },
  {
   "address": 46078,
   "type": "line",
   "text": "High bytes of the ten status-line message addresses, read at $99D5."
  },
  {
   "address": 46088,
   "type": "line",
   "text": "The run-length packed sprite shapes: the cold start's unpacker at $610B reads from here to $BFF7 and writes 3,800 bytes to $4000-$4ED7, sprite shapes 0-59 (shape n at $4000 + n x 64). A byte $11 is followed by a count of zero bytes to write (0 meaning 256); every other byte is copied. Shape 59 gets only its first 8 rows."
  },
  {
   "address": 47112,
   "type": "line",
   "text": "Second kilobyte of packed_sprites ($B408-$BFF7): the run-length stream of the sprite shapes continues."
  },
  {
   "address": 48136,
   "type": "line",
   "text": "Third part of packed_sprites, to $BFF7 where the unpacker's end test at $610D stops."
  },
  {
   "address": 49144,
   "type": "line",
   "text": "Eight bytes after the end of packed_sprites that the unpacker never reads (it stops when the source reaches $BFF8). They continue shape 59's pattern (FF FF F8, FF FF F8, F8 6D), so the stream was cut short or this is leftover; nothing else reads them."
  },
  {
   "address": 49151,
   "type": "line",
   "text": "Named only by the dead tape loader: STA $BFFF at $CE5B, which never runs. The game itself neither reads nor writes this byte; its value $6D is leftover."
  },
  {
   "address": 51200,
   "type": "line",
   "text": "The conversion's hand-over to the game, called once by the stub at $033C after the one-file load (orientation.md): SEI; masks every CIA 1 and CIA 2 interrupt ($7F to $DC0D and $DD0D) and reads both interrupt registers to clear what is pending; copies the 256 bytes at $C830 to $0300-$03FF and zeroes $0200-$02FF, putting back the two pages the load had to overwrite; then JMP $6000, the game's cold start, never returning. Nothing in the game calls it (no instruction names $C800)."
  },
  {
   "address": 51234,
   "type": "line",
   "text": "Fourteen $FF bytes between oneload_handover and its page image; no instruction names them and no simulator run reads them. Filler."
  },
  {
   "address": 51248,
   "type": "line",
   "text": "Page image copied to $0300-$03FF by oneload_handover ($C811): $0300-$0313 zero, $0314/$0315 = $0A00, $0316/$0317 = $2F0B, $0318/$0319 = $352D, then 230 bytes that look like graphics (runs of $AA, $0F, $03, $BA...). It is what the conversion found in that page. Nothing in the game uses it: no instruction names $0300-$03FF, the IRQ and NMI go through $FFFE/$FFFA with the KERNAL banked out, and the simulator's read maps (title to the end of a game) show no read of $0300-$03FF."
  },
  {
   "address": 52736,
   "type": "line",
   "text": "A turbo tape loader left in memory, never executed in this image: no instruction jumps to $CE00-$CED5 (only $CF80, itself never reached) and the simulator never ran it. What it would do: $00 = $2F, $01 = $06 (cassette motor on), screen off ($D011 = $0B), NMI vector $0318 = $CEC1 (RESTORE while loading wipes memory), CIA 2 timer A latch $0118; syncs on 256 one-bits, then a zero, then the byte $33; reads a 2-byte start address into the store at $CE5B (self-modified), a 2-byte end address into $CED8/$CED9, then data bytes up to and including the end address with an XOR checksum in $CED7; a matching checksum byte calls the KERNAL at $FC93, $FDA3 (IOINIT) and $FD15, CLI and returns; a mismatch goes to tape_load_fail ($CEC1). Which program this loader originally fetched is not known."
  },
  {
   "address": 52827,
   "type": "side",
   "text": "store address, self-modified from the block header at $CE43/$CE49 and stepped at $CE8B/$CE93"
  },
  {
   "address": 52828,
   "type": "line",
   "text": "Operand of the dead loader's STA $BFFF at $CE5B, the load address: written from the header at $CE43, compared with the end address at $CE64, and stepped at $CE8B. The loop from here stores each byte, updates the checksum, and stops when this address reaches tape_end_address."
  },
  {
   "address": 52829,
   "type": "line",
   "text": "High byte of the dead loader's store address (header byte 2, $CE49), stepped at $CE93 when the low byte wraps, compared at $CE6C."
  },
  {
   "address": 52889,
   "type": "line",
   "text": "Part of the dead tape loader: reads 8 bits, most significant first, through tape_read_bit into $CED6 and returns the byte in A."
  },
  {
   "address": 52904,
   "type": "line",
   "text": "Part of the dead tape loader: waits for a pulse on the cassette read line (CIA 1 interrupt flag bit 4, the FLAG input, in $DC0D), then shifts CIA 2's timer A underflow flag (bit 0 of $DD0D) into the carry: 1 when more than $0118 cycles have passed since the previous pulse, a long pulse; restarts the timer ($DD0E = $11) and flips the border colour (EOR 5) for the familiar loading stripes."
  },
  {
   "address": 52929,
   "type": "line",
   "text": "Part of the dead tape loader, reached on a checksum mismatch and installed as the NMI (RESTORE) handler at $CE10: stores $02 into every byte from $0202 upward (pointer $9E/$9F) flashing the border, then JMP $FCE2 (the KERNAL's reset). The fill reaches its own loop at $CEC7 on the way, and $02 is a JAM opcode, so in practice it would stop the processor before the reset. An anti-tamper wipe."
  },
  {
   "address": 52950,
   "type": "line",
   "text": "Dead tape loader variable: the byte being assembled by tape_read_byte ($CE9E ROL, $CEA4 read)."
  },
  {
   "address": 52951,
   "type": "line",
   "text": "Dead tape loader variable: XOR of the data bytes loaded (cleared at $CE29, updated at $CE5E-$CE61, compared with the block's last byte at $CE78)."
  },
  {
   "address": 52952,
   "type": "line",
   "text": "Dead tape loader variable, 2 bytes: the block's end address from its header ($CE4F, $CE55), compared with the store address at $CE67/$CE6F."
  },
  {
   "address": 52953,
   "type": "line",
   "text": "High byte of tape_end_address (header byte 4, written at $CE55, compared at $CE6F)."
  },
  {
   "address": 53120,
   "type": "line",
   "text": "Four calls never executed and named by no instruction: JSR $CE00 (tape_turbo_loader), JSR $0A00, JSR $CE00, JSR $0E00, then a $00 byte (BRK): load a block and run it, twice. Together with the $0A00 IRQ vector in page3_image it looks like the remains of the original tape loading sequence; what $0A00 and $0E00 held then is not known (in this image they are part of the game)."
  },
  {
   "address": 57344,
   "type": "line",
   "text": "Six pages holding characters $40-$FF of the character set at $5A00-$5FFF, that is the car picture with the bought equipment painted in: saved there when leaving the shop (st10_map_setup, $7AC8 through $9D96) and copied back to $5A00 at the start of each drive ($8007-$8027), because the map's character set replaces it in between. Runtime storage: the image's bytes here are only the machine's power-on pattern."
  },
  {
   "address": 58368,
   "type": "line",
   "text": "Second part of car_charset_save ($E000-$E5FF): its pages 5 and 6, characters $C0-$FF of the saved car picture."
  },
  {
   "address": 58880,
   "type": "line",
   "text": "256-byte table built by cold_start ($6074-$6088): for each byte, every multicolour pixel pair with either bit set made %11, so AND with it keeps a shape's pixels and AND with its inverse clears the background under them. Read by shop_paint_item_in_car ($79EE) to cut the item's shape into the car picture."
  },
  {
   "address": 59136,
   "type": "line",
   "text": "256-byte table built by cold_start ($606C): each byte with its four 2-bit pixels in reverse order, a left-right mirror of multicolour graphics. Read by build_mirrored_sprites ($6156-$6183) for the sprites that face both ways and by build_car_charset ($76A2) for the car's right half."
  },
  {
   "address": 59392,
   "type": "line",
   "text": "92 bytes: the carried item's sprite shape shifted right to its pixel position in the car, 4 bytes per row for 23 rows, written by shop_paint_item_in_car ($79CA-$79DC) and read back at $79EA/$79F7 to paint it into the car's characters. The simulator saw rows 0-20 read ($E800-$E853); $E854-$E85B are written only."
  },
  {
   "address": 59608,
   "type": "line",
   "text": "Not a variable: frame_ticker_scroll reads $E8D8,X with X from 40 up ($723A, $7257), which is ticker_buffer ($E900) + X - 40, the text window whose right edge is at $4B. No instruction reads or writes $E85C-$E8FF itself; in the image it is the power-on pattern."
  },
  {
   "address": 59648,
   "type": "line",
   "text": "The bottom-line ticker's text in screen codes, ended by $FF: a message copied in by ticker_start_message ($99F0/$99F9) or the status report built by frame_status_report ($719E-$71C4, with the backpack figure patched at $E912/$E913, empty traps at $E924, men left at $E935 relative to its end); frame_ticker_scroll shifts it down by 40 ($721C) once 120 characters have scrolled. The simulator saw $E900-$E969 used."
  },
  {
   "address": 59666,
   "type": "line",
   "text": "Not a separate variable: frame_status_report writes the two digits of the backpack power at $E912,X and $E913,X, X being the report's length less $43, which lands on the XX of BACKPACK POWER AT XX% in ticker_buffer."
  },
  {
   "address": 59667,
   "type": "line",
   "text": "Second digit of the backpack power in the status report text ($71DF, $E913,X); see ticker_patch_power."
  },
  {
   "address": 59684,
   "type": "line",
   "text": "Where frame_status_report writes the number of empty traps into the report text in ticker_buffer ($71E9, $E924,X, X = report length less $43)."
  },
  {
   "address": 59688,
   "type": "line",
   "text": "Not a separate variable: frame_ticker_scroll copies ticker_buffer from $E928,X down to $E900,X ($721C) when the window reaches 120 characters, dropping the 40 that have scrolled off."
  },
  {
   "address": 59701,
   "type": "line",
   "text": "Where frame_status_report writes the number of men left into the report text in ticker_buffer ($71F3, $E935,X, X = report length less $43)."
  },
  {
   "address": 59903,
   "type": "line",
   "text": "Not a variable: frame_line_input ($738D) and input_add_char ($9C8A) store at $E9FF + $50, and $50 starts at 1, so the typed line begins at line_input_buffer ($EA00); nothing writes $E9FF itself."
  },
  {
   "address": 59904,
   "type": "line",
   "text": "The typed line of the interview and shop (name, yes/no, account number, vehicle number), PETSCII ended by 0: cleared for 20 bytes by st00_interview_start ($74AF), filled by input_add_char ($9C8A) and frame_line_input ($738D, the 0), read by st01_name_entered (20 bytes to $EAB3), st02_account_answer ($74D8), st0B_vehicle_choice ($7625) and account_parse_digits ($9D06). The length is limited only by the cursor column (below $25), so a long line can run past $EA13 into text_buffer."
  },
  {
   "address": 59924,
   "type": "line",
   "text": "20-byte text buffer, ended by $FF, printed as message $80/0 through select_message: the balance as text (money_to_text $9D24, bytes_to_digits $9D51, blank_leading_zeros $9D74, trim_leading_spaces $9063), the name as FIRST LAST (build_first_last_name $9B90, which clears all of $EA14-$EA27) and the PK and balance line (frame_pk_balance_line $72B1)."
  },
  {
   "address": 59925,
   "type": "line",
   "text": "Offset 1 of text_buffer: blank_leading_zeros reads $EA15,X ($9D76) and money_to_text writes digits from $EA15 ($9D49)."
  },
  {
   "address": 59927,
   "type": "line",
   "text": "Offset 3 of text_buffer: money_to_text writes the $FF end mark at $EA17,Y ($9D40, Y = 7, so at $EA1E)."
  },
  {
   "address": 59944,
   "type": "line",
   "text": "30 bytes, one per map piece: the building shape drawn there, 0 for none. Set by init_game_vars_n ($9036) and at $89D3; read by st11_draw_map's draw_map_building_row ($9611), frame_spawn_haunts ($7449), map_fire_select ($7EC5) and pk_add_hundreds_carry ($98C5) to pick a building. Index 10 is Zuul and $11 GHQ (per those routines)."
  },
  {
   "address": 59974,
   "type": "line",
   "text": "16 bytes, a copy of the map sprites' positions $A0-$AF (two bytes per sprite, as in $A0/$A1): set from $37B3 by st10_map_setup ($7AA1) and reset_sprite_home ($986E), kept up to date by st12_city_map ($7BAF/$7BB4) and map_building_under_logo ($7D25/$7D2F, the logo), restored into $A0 by st11_draw_map ($7B91) and restore_sprites_4_7 ($983F)."
  },
  {
   "address": 59975,
   "type": "line",
   "text": "Second byte of sprite 0's saved position in map_sprite_pos_save (as $A1), written at $7BAF, $7D2F and $9878."
  },
  {
   "address": 59978,
   "type": "line",
   "text": "Saved positions of sprites 2 and 3 (the Keymaster and Gatekeeper) within map_sprite_pos_save, 4 bytes as $A4-$A7: written by st12_city_map ($7C07, X = 2 and 0) and by map_zuul_meeting ($7C37) once both stand on Zuul."
  },
  {
   "address": 59979,
   "type": "line",
   "text": "Second byte of each of sprites 2 and 3's saved positions (as $A5/$A7), written at $7C02."
  },
  {
   "address": 59982,
   "type": "line",
   "text": "Sprites 4-7's slot in map_sprite_pos_save (the Roamers), 8 bytes: their positions, copied back to $A8 by st11_draw_map ($7B96); but when bait was put down, st13_drive_setup stores the Roamers' targets here ($7FF2) and restore_sprites_4_7 ($983F) copies $EA4E-$EA55 back into the targets $B8-$BF. The same bytes serve both."
  },
  {
   "address": 59986,
   "type": "line",
   "text": "Sprites 6-7's half of the Roamers' slot at $EA4E: restore_sprites_4_7 copies $EA52-$EA55 to $BC-$BF ($9844)."
  },
  {
   "address": 59990,
   "type": "line",
   "text": "16 bytes, a copy of the map sprites' targets $B0-$BF (two bytes per sprite): from $37C3 at st10_map_setup ($7AA7) and reset_sprite_home ($9882); the logo's own position at map_building_under_logo ($7D28/$7D32); compared with the positions by st12_city_map ($7BB7/$7BBE) to see a Roamer arrive; restored into $B0 by st11_draw_map ($7B9B)."
  },
  {
   "address": 59991,
   "type": "line",
   "text": "Second byte of sprite 0's saved target in map_sprite_target_save, written at $7D32 and $988C, compared at $7BBE."
  },
  {
   "address": 59994,
   "type": "line",
   "text": "Saved targets of sprites 2 and 3 within map_sprite_target_save: set with the targets $B4-$B7 by st12_city_map ($7C1F, sending them to Zuul) and by map_gatekeepers_wander ($7E3E, the next street crossing)."
  },
  {
   "address": 59995,
   "type": "line",
   "text": "Second byte of each of sprites 2 and 3's saved targets, set at $7C27 and $7E4F."
  },
  {
   "address": 59998,
   "type": "line",
   "text": "Sprites 4-7's saved targets within map_sprite_target_save: $8A1D copies these 8 bytes back into $B8-$BF (the Roamers' targets) and returns to the map, state $12."
  },
  {
   "address": 60006,
   "type": "line",
   "text": "Sing-along ball: X position, low byte (bit 8 in ball_x_high $EA68); stepped by the hop's speed in singalong_ball_step ($9251, $9267), wraps to 0 past $157, zeroed by singalong_ball_reset ($929E)."
  },
  {
   "address": 60007,
   "type": "line",
   "text": "Sing-along ball: Y position, moved by the 16-step bounce table at $8EA7 ($9239-$923C); $BA after singalong_ball_reset ($92A3)."
  },
  {
   "address": 60008,
   "type": "line",
   "text": "Sing-along ball: bit 8 of the X position (with ball_x), ORed into the sprite X high bits for sprites 0 and 1 ($9283); zeroed by singalong_ball_reset."
  },
  {
   "address": 60009,
   "type": "line",
   "text": "Sing-along ball: pointer to the next byte of the hop script at $92BC, low byte here and high byte at $EA6A; stepped at $9215/$921A, set by singalong_ball_reset ($92B3/$92B8), sticks on the last byte ($93E1)."
  },
  {
   "address": 60010,
   "type": "line",
   "text": "High byte of ball_script_ptr (the hop script pointer), stepped at $921A when the low byte wraps."
  },
  {
   "address": 60011,
   "type": "line",
   "text": "Sing-along ball: step 0-15 within the current hop, the index into the bounce table ($91D6); a new script byte is read when it is 0. Zeroed by singalong_ball_reset."
  },
  {
   "address": 60012,
   "type": "line",
   "text": "Sing-along ball: X speed for the current hop, the script byte with bit 6 cleared ($9212), added to ball_x each step ($924E)."
  },
  {
   "address": 60013,
   "type": "line",
   "text": "singalong_ball_step's saved A, X and Y ($EA6D, $EA6F, $EA6E: stored at $91C8-$91CE, restored at $9292-$9298). $EA70 after them is named by no instruction and never touched in the simulator: unused."
  },
  {
   "address": 60014,
   "type": "line",
   "text": "singalong_ball_step's saved Y ($91CE, restored at $9298)."
  },
  {
   "address": 60015,
   "type": "line",
   "text": "singalong_ball_step's saved X ($91CB, restored at $9295). The byte after it, $EA70, is unused."
  },
  {
   "address": 60017,
   "type": "line",
   "text": "Sing-along ball: hops still to wait in place, from a script byte of $80 or more (AND $7F, $920D); counted down at $91DB; zeroed by singalong_ball_reset ($92AE)."
  },
  {
   "address": 60018,
   "type": "line",
   "text": "Scratch byte with two users: pk_add_hundreds_carry keeps the PK thousands digit (high nibble of $5B) before the addition in it ($989C) to see it change ($98A8), and saves X in it while picking a building ($98B1/$98DD); $861B-$8629 use it as a count of 64 raster interrupts, calling $9080 on each."
  },
  {
   "address": 60019,
   "type": "line",
   "text": "$FF on a PAL machine, $00 on NTSC: set by draw_title_screen ($62BD) from the last raster line; read by title_frame_work ($6338) and the raster IRQ ($8EE0) to run the tune's tick twice in one frame of eight on PAL."
  },
  {
   "address": 60020,
   "type": "line",
   "text": "pk_add_hundreds_carry's search index when PK reaches a new thousand at 5000 or more: starts at the random byte $06 ($98B6) and is incremented ($98CA) until map_slot_table holds a building at (index AND $0F, at least 4) that is not Zuul (10)."
  },
  {
   "address": 60021,
   "type": "line",
   "text": "The voice music_play is working on, 0-2 ($93F6); music_voice3_busy ($9599) compares it with 2 so that the music leaves SID voice 3 to the sound effects while $98 is set."
  },
  {
   "address": 60022,
   "type": "line",
   "text": "Text colour flag of the current message: select_message sets 1 when bit 7 of the message number is set, else 0 ($9BF6); frame_type_message copies it to $48, the colour it prints with ($72E3)."
  },
  {
   "address": 60023,
   "type": "line",
   "text": "Busting-scene flag, meaning not settled: 1 at $8A7C (the routine at $8A6A that also places sprites through $AA/$AB and $BA/$BB), $FF at $8AC2 after a man is lost, 0 at $8B58; tested at $8B1F."
  },
  {
   "address": 60024,
   "type": "line",
   "text": "Busting-scene counter: 2 at $8A5E; $8AE1 decrements it together with the men-left count $3D; $8B0B branches away when it is 0. Its partner is $EA79."
  },
  {
   "address": 60025,
   "type": "line",
   "text": "Busting-scene counter: 2 at $8A61; $8AB2 decrements it with the men-left count $3D and then plays speech phrase 3 ($8AB9); $8B10 branches away when it is 0. Its partner is $EA78."
  },
  {
   "address": 60026,
   "type": "line",
   "text": "Flag that makes two points of the play code speak: set to 1 at $86D2 and to $3B at $8C80, cleared at $8658, $8C8B and $8CFB; when non-zero, $8744 plays speech phrase 2 (just after adding 300 PK at $873F) and $8D18 plays phrase 3."
  },
  {
   "address": 60027,
   "type": "line",
   "text": "Sound-effect interpreter on SID voice 3 ($3BE9 on): the command byte just read from the effect's data ($3C34); its low nibble picks the handler from the tables at $3D83/$3D92 ($3C3C), and handlers read it back ($3C5B, $3CC5)."
  },
  {
   "address": 60028,
   "type": "line",
   "text": "Sound-effect interpreter: X saved while fetching the next data byte through ($E7) ($3C61/$3C6E)."
  },
  {
   "address": 60029,
   "type": "line",
   "text": "Sound-effect interpreter: the voice 3 control value with the gate bit clear ($3D0B, from the table at $3D74), written to $D412 to release the note when the duration reaches the release point ($3BFA) and with the gate set to start one ($3C81). Zeroed when an effect starts ($3D3F)."
  },
  {
   "address": 60030,
   "type": "line",
   "text": "Sound-effect interpreter: a frequency wobble; each tick it is negated and added to the current frequency into $D40F ($3C06-$3C17), so the pitch alternates up and down. Set from a command's high nibble ($3CE4), zeroed when an effect starts ($3D42)."
  },
  {
   "address": 60031,
   "type": "line",
   "text": "Sound-effect interpreter: repeat counter of a loop command ($3CCC): decremented at $3CCF, and while it is not 0 the data pointer ($E7) is moved back by the byte that follows. Set from a command's high nibble ($3CEC)."
  },
  {
   "address": 60032,
   "type": "line",
   "text": "Sound-effect interpreter: the duration value at which the note's gate is released ($3BF5 compares sfx_duration with it); $FF (never) when an effect starts ($3D4B)."
  },
  {
   "address": 60033,
   "type": "line",
   "text": "Sound-effect interpreter: ticks left in the current step, counted down each tick ($3BED); at 0 the next command is read ($3C03). Set from the table at $3D5C by a command's high nibble ($3C7A), 1 when an effect starts ($3D2C), 0 to stop ($3BE3, $3C53)."
  },
  {
   "address": 60034,
   "type": "line",
   "text": "The value last written to $D418 (volume and filter mode) by music_play ($9483), kept so that it can be put back after the RUN/STOP pause silences the SID (frame_pause_key $70CE) and after speech ($8E39), and by frame_type_message ($730B-$7314)."
  },
  {
   "address": 60035,
   "type": "line",
   "text": "Sound-effect interpreter: voice 3's frequency high byte ($D40F), set from the note table at $3DFA ($3CA0), moved by sweeps ($3C21/$3C27), relative steps ($3D1A) and the wobble ($3C14). $EA85 after it is named by no instruction: unused."
  },
  {
   "address": 60036,
   "type": "line",
   "text": "Sound-effect interpreter: frequency sweep direction, positive = up one step per tick, negative = down ($3C1A-$3C27); set by a command ($3CC8), zeroed when an effect starts ($3D45). $EA85 after it is named by no instruction and never touched in the simulator."
  },
  {
   "address": 60038,
   "type": "line",
   "text": "Sound-effect interpreter: the note number of the last note command ($3C90), the index into the frequency tables $3E5A/$3DFA; written only."
  },
  {
   "address": 60039,
   "type": "line",
   "text": "Set to 0 by draw_title_screen ($62D4) and read by nothing (no instruction names it, and no simulator run reads it). The disassembler's KERNAL name for $EA87 (scan keyboard) does not apply: here it is RAM."
  },
  {
   "address": 60040,
   "type": "line",
   "text": "A flag with no effect: 0 at $877E, 1 at $87C6, and the only read, LDA $EA88 / BEQ $8837 at $8832, branches to the next instruction either way. A left-over."
  },
  {
   "address": 60041,
   "type": "line",
   "text": "Sing-along ball: the script byte just read ($91F1), kept so that BIT can test its bit 6 ($91F5)."
  },
  {
   "address": 60042,
   "type": "line",
   "text": "40 bytes: the bottom screen row at $57C0 (row 24 of the $5400 screen), saved and blanked by the speech routine $8DB9 when $20 is 0, as on the title ($8DDE-$8DE7), and put back after the phrase ($8E6A-$8E6F)."
  },
  {
   "address": 60082,
   "type": "line",
   "text": "The function key that started the game: $20 for F1, $28 for F3 (title_frame_work $639F); zeroed by nmi_restore_handler ($6433); read by st00_interview_start ($747E) to skip the interview on F3."
  },
  {
   "address": 60083,
   "type": "line",
   "text": "The player's name as typed (LAST,FIRST), 20 bytes of PETSCII padded with zeros, copied from line_input_buffer by st01_name_entered ($74C0); summed by account_name_sum ($91BC) for the account number's check, and turned into FIRST LAST by build_first_last_name ($9BA3-$9BD0). It survives RESTORE, which is what lets F3 reuse it."
  },
  {
   "address": 60103,
   "type": "line",
   "text": "The account number, 4 bytes, one octal digit in each nibble: filled from the typed digits by st03_account_number ($750E-$751D) or by account_encode ($9114-$9149) at a win; read by account_decode ($915F) and printed at the end of a winning game ($8CC9-$8CD8). $EAC7 is the lowest byte."
  },
  {
   "address": 60104,
   "type": "line",
   "text": "Second byte of account_digits (written at $7513 and $9117, shifted at $912D/$9147, printed at $8CCE)."
  },
  {
   "address": 60105,
   "type": "line",
   "text": "Third byte of account_digits (written at $7518 and $911A, shifted at $912A/$9144, printed at $8CD3)."
  },
  {
   "address": 60106,
   "type": "line",
   "text": "Fourth and highest byte of account_digits (written at $751D and $911D, shifted at $9127/$9141, printed at $8CD8); account_decode reads its high nibble first."
  },
  {
   "address": 60160,
   "type": "line",
   "text": "121 bytes that cold_start fills with 120 spaces ($20) and an $FF end mark ($60E9-$60F7), the shape of a text buffer; no other instruction names $EB00-$EB78, and none of the simulator runs (title, interview, shop, map, drive, bust, Zuul, the winning ending) reads it. Initialised but unused in this version."
  },
  {
   "address": 61440,
   "type": "line",
   "text": "The speech player's waveform buffer, 128 bytes of $D418 values times two (a sample is written as 2 x volume, 0-$1E, and halved by LSR when played): the decoders write the next chunk into the half not playing ($00-$3F or $40-$7F, chosen by bit 6 of speech_play_start), and speech_crossfade writes blends into $20-$3F or $60-$7F. Played by the NMI handlers at $F083/$F0A4 through their self-modified LDA $F000. Runtime storage: the image holds whatever the last decode left ($0E/$10 bytes, one-bit samples)."
  },
  {
   "address": 61568,
   "type": "line",
   "text": "The speech player's entry point, JMP speech_command ($F42E). Called by the game's speech routine $8DB9 (A = phrase 1-4, then A = $FF in a loop until the phrase has ended, so the game waits for it). A = 0-$FC: play that phrase; $FF: return the status (bit 0 set while playing); $FE: stop; $FD: set the data base address from X/Y. The player (speech data included, $F000-$FF9B) runs from the NMI of CIA 2 timer B and writes 4-bit samples to the SID volume register $D418; research.md credits the game's speech to Electronic Speech Systems."
  },
  {
   "address": 61571,
   "type": "line",
   "text": "Speech NMI, first part of a pitch period: writes the next buffer byte / 2 to $D418 (LDA $F000 with its low byte at $F085 self-modified, stepped forward), acknowledges CIA 2 ($DD0D read by CMP), counts $FD down; at 0 switches the NMI vector to nmi_play_backward and starts it from the same position ($F0A6 = $F085)."
  },
  {
   "address": 61573,
   "type": "line",
   "text": "Low byte of the LDA $F000 at $F084: the buffer position being played forward, set from speech_play_start at each period ($F0FB) and incremented per sample ($F092)."
  },
  {
   "address": 61591,
   "type": "line",
   "text": "End of the forward half: NMI vector low byte = $A4 (nmi_play_backward), backward position = the forward one."
  },
  {
   "address": 61604,
   "type": "line",
   "text": "Speech NMI, second part of a pitch period: plays the same samples in reverse order (LDA $F000 with the low byte at $F0A6 decremented), counting $FE down; at the end goes to the silence (nmi_silence_start, vector $C3) when the period has a gap ($FF non-zero), else straight to nmi_period_end. Playing each chunk forward and then backward makes a symmetric pulse from half the data."
  },
  {
   "address": 61606,
   "type": "line",
   "text": "Low byte of the LDA $F000 at $F0A5: the buffer position being played backward (set at $F09F, decremented at $F0B3)."
  },
  {
   "address": 61624,
   "type": "line",
   "text": "End of the backward half: with a gap ($FF non-zero) the next NMI is nmi_silence_start, otherwise the period ends at once."
  },
  {
   "address": 61635,
   "type": "line",
   "text": "Speech NMI: the silent gap that completes a voiced pitch period (its length $FF, from speech_gap_length, sets the pitch), and the whole period of a pause frame. Writes the mid level 7 to $D418 once (LDA #$0E / LSR), then leaves the counting to nmi_silence ($F0D9); at the end, nmi_period_end. Also the first NMI after speech_command starts a phrase."
  },
  {
   "address": 61657,
   "type": "line",
   "text": "Speech NMI during a gap: acknowledges CIA 2 and counts $FF down, writing nothing; at 0 goes on to nmi_period_end ($F0F1)."
  },
  {
   "address": 61665,
   "type": "line",
   "text": "Speech NMI after the last frame (vector set through speech_period_handler = $E1 by $F17E): stops CIA 2 timer B ($DD0F = $90, so no further NMI) and leaves $D418 at 7. From then on speech_status reports bit 0 clear."
  },
  {
   "address": 61681,
   "type": "line",
   "text": "Start of the next pitch period (entered from the NMI handlers): NMI vector low byte from speech_period_handler, forward index from speech_play_start, $FD = $FE = speech_half_length, $FF = speech_gap_length; counts speech_periods_left up and, while it has not wrapped, jumps through the self-modified JMP at $F110 to the per-period work of the frame type (rti only, $F13C voiced, $F154 unvoiced); when it wraps, saves X and Y and calls speech_next_chunk."
  },
  {
   "address": 61713,
   "type": "line",
   "text": "Low byte of the JMP $F13A at $F110, set per frame type: $3A = nothing (pause frames, $F253), $3C = speech_voiced_period ($F23C), $54 = speech_unvoiced_period ($F216)."
  },
  {
   "address": 61715,
   "type": "line",
   "text": "Periods for this chunk used up: call speech_next_chunk with X and Y saved, then return from the NMI."
  },
  {
   "address": 61728,
   "type": "line",
   "text": "Called from the NMI when a chunk's periods are used up: counts speech_chunks_left up and at 0 reads the next frame record (speech_read_frame). Entry $F125 (speech_start_chunk) goes on: speech_periods_left = speech_periods_reload, X = the buffer half not playing, then JMP through the self-modified JMP at $F137 to the decoder of the frame's type, which fills that half."
  },
  {
   "address": 61733,
   "type": "line",
   "text": "Entry used by speech_command ($F459) to set up the first chunk of a phrase: reads the first frame record ($F1BC) and decodes it; see speech_next_chunk."
  },
  {
   "address": 61752,
   "type": "line",
   "text": "Low byte of the JMP at $F137, set per frame: $8F type 1 (1-bit samples, $F18F), $9B type 2 (4-bit samples, $F19B), $92 type 0 and $95 type 3 (2-bit samples, $F192/$F195), $84 a pause frame ($F184), $7E after the last frame ($F17E, stop)."
  },
  {
   "address": 61754,
   "type": "line",
   "text": "Per-period work for pause frames: none (PLA, RTI)."
  },
  {
   "address": 61756,
   "type": "line",
   "text": "Per-period work for voiced frames (types 2 and 3), from the NMI: unless the played waveform is already the new chunk, blends it halfway toward it again (speech_crossfade), then steps the pitch (speech_pitch_step). X and Y saved."
  },
  {
   "address": 61771,
   "type": "line",
   "text": "Voiced period: pitch step, restore X and Y, return from the NMI."
  },
  {
   "address": 61780,
   "type": "line",
   "text": "Per-period work for unvoiced frames (types 0 and 1), from the NMI: slides the played window along the chunk, start + speech_window_step and length - speech_window_step, until the length is $10, then starts again from the whole chunk (length speech_chunk_length). There is no gap between periods ($FF = 0), so this is noise-like sound with no pitch."
  },
  {
   "address": 61806,
   "type": "line",
   "text": "Unvoiced window at its minimum: back to the start of the chunk's half with the full length."
  },
  {
   "address": 61822,
   "type": "line",
   "text": "Decoder slot used after the last frame: speech_period_handler = $E1, so the next period is nmi_speech_stop."
  },
  {
   "address": 61828,
   "type": "line",
   "text": "Decoder slot for a pause frame: speech_period_handler = $C3 (the silence handler) and a gap of $80 samples, so each period is 128 samples of level 7."
  },
  {
   "address": 61839,
   "type": "line",
   "text": "Decoder slot for type 1 frames: JMP speech_decode_1bit ($F372)."
  },
  {
   "address": 61842,
   "type": "line",
   "text": "Decoder slot for type 0 frames: JMP speech_decode_2bit_fixed ($F3E2). No frame of the five phrases has type 0 (simulator, all five played)."
  },
  {
   "address": 61845,
   "type": "line",
   "text": "Decoder slot for type 3 frames: 2-bit samples with a chosen scale (speech_decode_2bit, $F267), then the same switch or blend as type 2. No frame of the five phrases has type 3 (simulator, all five played)."
  },
  {
   "address": 61851,
   "type": "line",
   "text": "Decoder slot for type 2 frames: 4-bit samples (speech_decode_4bit, $F2E4) into the idle half."
  },
  {
   "address": 61854,
   "type": "line",
   "text": "After a voiced chunk is decoded: if bit 4 of the frame's first byte ($F1BD) is still set, clears it and switches playback straight to the new chunk (speech_play_start = speech_new_half), so only a frame's first chunk can cut in; otherwise blends toward it (speech_crossfade). Then steps the pitch."
  },
  {
   "address": 61878,
   "type": "line",
   "text": "Voiced chunk without a hard switch: blend, then pitch step."
  },
  {
   "address": 61884,
   "type": "line",
   "text": "Reads the next 4-byte frame record through ($F5) unless the previous frame's first byte (kept as the operand at $F1BD) had bit 5 set, which marks the last frame: then the decoder slot becomes speech_set_stop. Byte 0: bit 7-6 the voiced chunk length (8, 16, 24 or 32 samples via $F24D), bit 6 also the unvoiced length ($40 or $20), bit 5 last frame, bit 4 hard switch, bits 3-0 give 16 - n periods per chunk (speech_periods_reload). Byte 1: bits 7-3 give 32 - n chunks in the frame (speech_chunks_left), bit 2 a pause frame (no samples), bits 1-0 the type (0, 1 unvoiced; 2, 3 voiced). Bytes 2-3: the samples, as an offset from speech_data_base. Sets the per-period job and the decoder slot, then advances ($F5) by 4 (speech_next_frame)."
  },
  {
   "address": 61885,
   "type": "line",
   "text": "Operand of the LDA #$00 at $F1BC: the current frame's first byte (written at $F1CC), so that the next call can test its last-frame bit; bit 4 is cleared by speech_switch_or_blend after use; zeroed by speech_find_phrase ($F4D4)."
  },
  {
   "address": 62029,
   "type": "line",
   "text": "Half-waveform lengths of voiced frames, by bits 7-6 of the frame's first byte: 8, 16, 24, 32 samples ($F234)."
  },
  {
   "address": 62033,
   "type": "line",
   "text": "A frame with bit 2 of byte 1 set: no samples; per-period job none ($3A), decoder slot speech_set_pause ($84)."
  },
  {
   "address": 62043,
   "type": "line",
   "text": "Advances the frame pointer $F5/$F6 by 4, to the next record."
  },
  {
   "address": 62055,
   "type": "line",
   "text": "2-bit decoder with a chosen scale (type 3, unused by the five phrases): writes speech_half_length samples into the idle half starting at X; the chunk's first byte picks one of the level tables at $F2D4 + 4 x (bits 1-0) (1: $0C-$12, 2: $08-$14, 3: $02-$1A; 0 would take code bytes at $F2D4) and supplies three samples, then four samples per byte, low bits first. Keeps the half in speech_new_half. The stop value is written into the CPX at $F2D3."
  },
  {
   "address": 62068,
   "type": "line",
   "text": "Entry shared with speech_decode_2bit_fixed: A = the first byte, the level table picked from its low 2 bits."
  },
  {
   "address": 62114,
   "type": "line",
   "text": "Operand of the LDA #$00 at $F2A1: the data byte being unpacked by the 2-bit decoder (written at $F274 and $F295)."
  },
  {
   "address": 62164,
   "type": "line",
   "text": "Operand of the CPX #$00 at $F2D3: where the 2-bit decoders stop (X start + length, written at $F26A and $F3E8). The bytes from $F2D4 are also level table 0 in speech_decode_2bit."
  },
  {
   "address": 62168,
   "type": "line",
   "text": "The 2-bit decoders' level tables, 4 entries each (doubled volumes): scale 1 $0C $0E $10 $12 (volume 6-9), scale 2 $08 $0C $10 $14 (4-10), scale 3 $02 $0A $12 $1A (1-13). Used by types 0 and 3 only, which no phrase in this image uses."
  },
  {
   "address": 62180,
   "type": "line",
   "text": "4-bit decoder (type 2, the voiced frames): writes speech_half_length samples into the idle half starting at X, two per data byte: high nibble, then low nibble, each doubled (AND $1E) so that the LSR at play time gives volume 0-15. Keeps the half in speech_new_half; the stop value goes into the CPX at $F317."
  },
  {
   "address": 62232,
   "type": "line",
   "text": "Operand of the CPX #$00 at $F317: where speech_decode_4bit stops (written at $F2E7)."
  },
  {
   "address": 62236,
   "type": "line",
   "text": "Once per voiced period: counts the pitch record's periods ($F4E4) up; while running, adds the slope speech_pitch_slope to the pitch speech_pitch and sets the gap speech_gap_length = pitch / 2; when it wraps, reads the next 2-byte pitch record through ($F7): byte 0 AND $FE the new pitch; byte 1 high nibble 16 - n periods, low nibble the slope's index into speech_slopes ($F362)."
  },
  {
   "address": 62256,
   "type": "line",
   "text": "Next pitch record: pitch, count, slope, then advance ($F7) by 2 and set the gap."
  },
  {
   "address": 62306,
   "type": "line",
   "text": "Pitch slopes by the low nibble of a pitch record's second byte: -12, -10, -8, -6, -4, -2, -1, 0, +1, +2, +4, +6, +8, +10, +12, +14 added to the doubled pitch each period, so the pitch glides."
  },
  {
   "address": 62322,
   "type": "line",
   "text": "1-bit decoder (type 1, the unvoiced frames): sets speech_play_start = the idle half and speech_half_length = speech_chunk_length, then writes one sample per bit, $0E or $10 (volume 7 or 8), low bit first, 8 per data byte (the first byte gives fewer), until the stop value at $F3AA. A two-level noise: enough for hiss sounds like S and SH."
  },
  {
   "address": 62378,
   "type": "line",
   "text": "Operand of the CPX #$00 at $F3A9: where speech_decode_1bit stops (written at $F378)."
  },
  {
   "address": 62382,
   "type": "line",
   "text": "Writes four one-bit samples from A (low bit first; the rest kept in Y) into the buffer at X. Entry $F3C3 writes the current sample and then three more from Y."
  },
  {
   "address": 62403,
   "type": "line",
   "text": "Second entry of speech_unpack_bits: stores A, then three more bits from Y."
  },
  {
   "address": 62434,
   "type": "line",
   "text": "2-bit decoder with the fixed scale 1 (type 0, unused by the five phrases): sets speech_play_start and speech_half_length = speech_chunk_length like the 1-bit decoder, forces the level-table bits of the first byte to 1, and joins speech_decode_2bit at $F274."
  },
  {
   "address": 62460,
   "type": "line",
   "text": "Blends the waveform being played (at speech_play_start) with the newly decoded chunk (at speech_new_half), sample by sample, (a + b + 1) / 2, into the quarter $20 or $60 of the buffer not in use, over speech_half_length samples, and makes that the one played. Called once per voiced period, it moves the sound halfway to the new chunk each time: a smooth change of waveform. The self-modified operands $F417, $F41B and $F41F are the three low bytes."
  },
  {
   "address": 62487,
   "type": "line",
   "text": "Low byte of the LDA $F000,X at $F416: the new chunk (speech_new_half, $F407)."
  },
  {
   "address": 62491,
   "type": "line",
   "text": "Low byte of the ADC $F000,X at $F41A: the waveform being played (speech_play_start, $F401)."
  },
  {
   "address": 62495,
   "type": "line",
   "text": "Low byte of the STA $F000,X at $F41E: the blend's destination, $20 or $60 ($F413), which becomes speech_play_start ($F42A)."
  },
  {
   "address": 62510,
   "type": "line",
   "text": "The command dispatcher behind speech_call: $FF returns the status; $FE stops the timer ($F46D); $FD stores X/Y as the data base ($F475); any other A is a phrase number: finds it (speech_find_phrase), stops any speech, and unless the KERNAL ROM is switched in (status negative) starts it: speech_play_start = 0, $FC = $F2 (the level tables' page), NMI vector $FFFA/$FFFB = $F0C3, a one-sample gap ($FF = 1), the first chunk decoded (speech_start_chunk), CIA 2 timer B started (speech_timer_start). Returns the status. A phrase number above 4 reads past the table (the game passes 1-4 only)."
  },
  {
   "address": 62559,
   "type": "line",
   "text": "Status for the caller: A = $80 (negative) when bit 1 of $01 (HIRAM) is set, that is with the KERNAL ROM in and the NMI vector not the player's; otherwise bit 0 of $DD0F, 1 while CIA 2 timer B runs (a phrase is playing)."
  },
  {
   "address": 62573,
   "type": "line",
   "text": "Stops CIA 2 timer B ($DD0F = $90), ending the NMIs, and returns the status."
  },
  {
   "address": 62581,
   "type": "line",
   "text": "Command $FD: X/Y (low/high) become speech_data_base. The game never sends it; the base in the image, $F4EA, is used."
  },
  {
   "address": 62590,
   "type": "line",
   "text": "Starts CIA 2 timer B for the speech NMI: $DD0F = $91 (start, force load, continuous), latch $0065, so an NMI every 102 cycles, 9,659 Hz on PAL (985,248 / 102) and 10,027 Hz on NTSC, which plays speech about 4 % higher and faster; enables its interrupt ($DD0D = $82) and clears pending flags."
  },
  {
   "address": 62614,
   "type": "line",
   "text": "Looks phrase A up in the table at speech_data_base (4 bytes per phrase, pointer ($F9)): the first word + base is the pitch list, into $F7/$F8; the second word + base the frame list, into $F5/$F6; pitch counter $F4E4 = $FF so the first period reads a pitch record; speech_frame_flags = 0."
  },
  {
   "address": 62680,
   "type": "line",
   "text": "Two bytes ($00, $FF) between the player's code and its variables that no instruction names and no phrase reads: unused."
  },
  {
   "address": 62682,
   "type": "line",
   "text": "Low byte of the NMI handler each pitch period starts with (copied into $FFFA at $F0F2): $83 play the waveform (nmi_play_forward, set at $F1F1), $C3 silence (a pause frame, $F186), $E1 stop (after the last frame, $F180)."
  },
  {
   "address": 62683,
   "type": "line",
   "text": "Where in speech_wave_buffer the waveform being played starts (low byte): its bit 6 picks the half, so the decoders fill the other one. Set to 0 by speech_command ($F444), by the decoders ($F372, $F3E2), by the hard switch ($F1B0), by speech_crossfade ($F42A) and moved by the unvoiced window ($F169)."
  },
  {
   "address": 62684,
   "type": "line",
   "text": "Samples in the waveform's half, played forward then backward each period ($FD/$FE reload at $F0FE): 8-32 for voiced frames ($F237), the window length for unvoiced ones ($F15F, $F179, $F37E, $F3EE)."
  },
  {
   "address": 62685,
   "type": "line",
   "text": "Samples of silence ending each period ($FF reload at $F105): pitch / 2 for voiced frames (speech_pitch_step $F32C/$F35E), 0 for unvoiced ones ($F219), $80 for pauses ($F18B). The longer the gap, the lower the voice."
  },
  {
   "address": 62686,
   "type": "line",
   "text": "Chunks left in the current frame, counted up to 0 (32 - n from the frame record's second byte, $F1DC; incremented at $F120)."
  },
  {
   "address": 62687,
   "type": "line",
   "text": "Periods each chunk is played, as a count up to 0: $F0 OR the low nibble of the frame's first byte ($F1D1), copied into speech_periods_left at each chunk ($F12B)."
  },
  {
   "address": 62688,
   "type": "line",
   "text": "Periods left of the current chunk, counted up once per period by nmi_period_end ($F10B); at 0 the next chunk is decoded."
  },
  {
   "address": 62689,
   "type": "line",
   "text": "Unvoiced frames: the chunk's length in samples, $40 or $20 by bit 6 of the frame's first byte ($F20B), and the full window length ($F176)."
  },
  {
   "address": 62690,
   "type": "line",
   "text": "Unvoiced frames: how far the window slides each period, speech_chunk_length / 8 ($F211; read at $F15C, $F166)."
  },
  {
   "address": 62691,
   "type": "line",
   "text": "Start (low byte) of the half holding the chunk just decoded ($F26D, $F2EA); speech_voiced_period compares it with speech_play_start to see whether a blend is still needed."
  },
  {
   "address": 62692,
   "type": "line",
   "text": "Periods left for the current pitch record, counted up to 0 ($F31C): 16 - the high nibble of its second byte ($F346); $FF after speech_find_phrase so the first period reads a record."
  },
  {
   "address": 62693,
   "type": "line",
   "text": "The doubled pitch value: the gap is half of it. From a pitch record's first byte ($F337), plus speech_pitch_slope each period ($F328)."
  },
  {
   "address": 62694,
   "type": "line",
   "text": "Signed change of speech_pitch per period, from speech_slopes by the record's low nibble ($F351)."
  },
  {
   "address": 62695,
   "type": "line",
   "text": "Base address of the speech data, low byte here and high byte at $F4E8: $F4EA in the image, where speech_phrase_table is. Every pointer in the data is an offset from it (added at $F1E4, $F49E, $F4AF, $F4C5). Changeable by command $FD, which the game never sends."
  },
  {
   "address": 62696,
   "type": "line",
   "text": "High byte of speech_data_base ($F4)."
  },
  {
   "address": 62697,
   "type": "line",
   "text": "One byte ($FF) before the phrase table, named by no instruction: unused."
  },
  {
   "address": 62698,
   "type": "line",
   "text": "Five phrases, 4 bytes each: the pitch list's offset and the frame list's offset from speech_data_base ($F4EA). Phrase 0: pitch $F4FE, frames $F688; 1: $F524, $F6BC; 2: $F558, $F6F0; 3: $F580, $F70C; 4: $F5D6, $F75C. The game asks for 1-4 only (phrase 1 from $62ED, $6393 and $8820; 2 from $874B; 3 from $62F2, $8AB9 and $8D1F; 4 from $8C5A), so phrase 0 is never heard. Lengths in the simulator (PAL): 0.95, 1.61, 1.33, 2.69 and 2.23 seconds."
  },
  {
   "address": 62718,
   "type": "line",
   "text": "Pitch lists, 2-byte records read by speech_pitch_step: byte 0 AND $FE the doubled pitch (gap = half of it, in samples), byte 1 high nibble 16 - n voiced periods, low nibble the slope (speech_slopes). Phrase 0's list, $F4FE-$F523 (19 records in the simulator)."
  },
  {
   "address": 62756,
   "type": "line",
   "text": "Pitch list of phrase 1, $F524-$F557 (26 records read in the simulator)."
  },
  {
   "address": 62808,
   "type": "line",
   "text": "Pitch list of phrase 2, $F558-$F57F; its last record read, at $F580, is also phrase 3's first."
  },
  {
   "address": 62848,
   "type": "line",
   "text": "Pitch list of phrase 3, $F580-$F5D5 (44 records read, the last at $F5D6 being phrase 4's first)."
  },
  {
   "address": 62934,
   "type": "line",
   "text": "Pitch list of phrase 4, $F5D6-$F687, the longest (90 records read in the simulator; the last read, at $F688, is really the first frame record: the phrase ends before it matters)."
  },
  {
   "address": 63112,
   "type": "line",
   "text": "Frame lists, 4-byte records read by speech_read_frame (flags and chunk length; periods and chunks, pause, type; sample offset from $F4EA). Phrase 0: 13 frames, $F688-$F6BB; it starts with the same sample blocks as phrase 1 ($F768, $F800, $F778...), a shorter version of it."
  },
  {
   "address": 63164,
   "type": "line",
   "text": "Frame list of phrase 1: 13 frames, $F6BC-$F6EF. Phrase 1 is the one the title plays on SPACE, the \"Ghostbusters!\" the manual describes."
  },
  {
   "address": 63216,
   "type": "line",
   "text": "Frame list of phrase 2: 7 frames, $F6F0-$F70B."
  },
  {
   "address": 63244,
   "type": "line",
   "text": "Frame list of phrase 3: 20 frames, $F70C-$F75B; the same two sample blocks ($FBC0, $FC70) alternate four times in it, a repeated syllable."
  },
  {
   "address": 63324,
   "type": "line",
   "text": "Frame list of phrase 4: 3 long voiced frames, $F75C-$F767."
  },
  {
   "address": 63336,
   "type": "line",
   "text": "Sample data, $F768-$FF9B: 1-bit chunks for unvoiced frames, 4-bit (two samples a byte) for voiced ones, addressed by the frame records. Phrases 0 and 1 share $F768-$F8C7; phrase 0 also reads $F8C0-$F967."
  },
  {
   "address": 63848,
   "type": "line",
   "text": "Eight bytes ($F968-$F96F) between phrase 0's samples and phrase 1's second block that no phrase reads (simulator, all five phrases played)."
  },
  {
   "address": 63856,
   "type": "line",
   "text": "Samples of phrase 1's last voiced frame, $F970-$FA2F."
  },
  {
   "address": 64048,
   "type": "line",
   "text": "Samples of phrase 2, $FA30-$FBBF."
  },
  {
   "address": 64448,
   "type": "line",
   "text": "Samples of phrase 3, $FBC0-$FDB3."
  },
  {
   "address": 64659,
   "type": "line",
   "text": "Inside phrase 3's samples. The label is only there because the dead tape loader calls the KERNAL at $FC93 ($CE7D); with the ROM switched in that call goes to the KERNAL, not to these bytes."
  },
  {
   "address": 64738,
   "type": "line",
   "text": "Inside phrase 3's samples; labelled only because tape_load_fail jumps to the KERNAL's reset at $FCE2 ($CED3), which is ROM, not these bytes."
  },
  {
   "address": 64789,
   "type": "line",
   "text": "Inside phrase 3's samples; labelled only because the dead tape loader calls the KERNAL at $FD15 ($CE83), which is ROM, not these bytes."
  },
  {
   "address": 64931,
   "type": "line",
   "text": "Last part of phrase 3's samples ($FDA3-$FDB3); labelled only because the dead tape loader calls the KERNAL's IOINIT at $FDA3 ($CE80), which is ROM, not these bytes."
  },
  {
   "address": 64948,
   "type": "line",
   "text": "Samples of phrase 4, $FDB4-$FF9B: three voiced frames of 4-bit data."
  },
  {
   "address": 65436,
   "type": "line",
   "text": "94 bytes after the speech data: $FF x 17, then bytes that look like multicolour graphics ($55, $AA, $FC patterns, $01 $04 $10 $40...). No instruction names $FF9C-$FFF9, no simulator run reads it, and play-map.vsf holds the same bytes as entry.vsf: unused, a left-over."
  },
  {
   "address": 65530,
   "type": "line",
   "text": "The hardware NMI vector (RAM, the KERNAL being banked out): $6425 (nmi_restore_handler) from cold_start ($600E/$6013) and again after speech ($8E31/$8E36); $F0C3 while the speech player runs ($F44B/$F452), whose handlers change the low byte every few samples ($F099, $F0BE, $F0D4, $F0F5). The image's $A4A3 here is never used: cold_start writes the vector before any NMI can occur."
  },
  {
   "address": 65532,
   "type": "line",
   "text": "The RESET vector's RAM copy: a reset always reads the KERNAL ROM (which the reset itself switches in), so these bytes ($A6A5 in the image) are never used; no instruction names them."
  },
  {
   "address": 65534,
   "type": "line",
   "text": "The hardware IRQ vector: $8E76 (the raster IRQ) from cold_start ($6018/$601D), before interrupts are enabled; the image's $92A7 is never used. Written only there."
  }
 ]
}