{
 "schema": 1,
 "platform": "c64",
 "game": "master-of-magic",
 "build": "Remember's crack, release 15: cracked from tape, docs by HOK, +2 trainer by Jack Alien; one file, M.OF MAGIC+2/REM, on a disk named C64.COM. The game starts at $07F9 and runs with no trainer option taken",
 "source": "regenerator2000 live",
 "regions": {
  "exclude": [
   [
    256,
    511,
    "stack"
   ],
   [
    53248,
    57343,
    "I/O and colour RAM"
   ],
   [
    1024,
    2047,
    "screen RAM"
   ],
   [
    58303,
    58303,
    "BASIC ROM entry the game calls (RAM initialisation, from $0809); the RAM beneath is title data, counted under its own labels"
   ],
   [
    58692,
    58692,
    "KERNAL ROM entry the game calls (clear screen, from $0806); the RAM beneath is title data"
   ],
   [
    59953,
    59953,
    "KERNAL ROM interrupt exit the play and title handlers jump to; the RAM beneath is title data"
   ],
   [
    65490,
    65490,
    "KERNAL ROM entry the game calls (CHROUT); the RAM beneath is title data"
   ]
  ],
  "extra": [
   [
    12288,
    14335,
    "character set"
   ]
  ]
 },
 "blocks": [
  {
   "start": 0,
   "end": 2040,
   "type": "Undefined"
  },
  {
   "start": 2041,
   "end": 2049,
   "type": "Byte"
  },
  {
   "start": 2050,
   "end": 12114,
   "type": "Code"
  },
  {
   "start": 12115,
   "end": 12287,
   "type": "Undefined"
  },
  {
   "start": 12288,
   "end": 14911,
   "type": "Byte"
  },
  {
   "start": 14912,
   "end": 15306,
   "type": "Code"
  },
  {
   "start": 15307,
   "end": 16687,
   "type": "Byte"
  },
  {
   "start": 16688,
   "end": 16839,
   "type": "PETSCII Text"
  },
  {
   "start": 16840,
   "end": 16856,
   "type": "Byte"
  },
  {
   "start": 16857,
   "end": 17799,
   "type": "Undefined"
  },
  {
   "start": 17800,
   "end": 17929,
   "type": "Lo/Hi Address"
  },
  {
   "start": 17930,
   "end": 18758,
   "type": "PETSCII Text"
  },
  {
   "start": 18759,
   "end": 18791,
   "type": "Byte"
  },
  {
   "start": 18792,
   "end": 18807,
   "type": "Lo/Hi Address"
  },
  {
   "start": 18808,
   "end": 19458,
   "type": "Byte"
  },
  {
   "start": 19459,
   "end": 19494,
   "type": "Address"
  },
  {
   "start": 19495,
   "end": 20389,
   "type": "Byte"
  },
  {
   "start": 20390,
   "end": 20401,
   "type": "Lo/Hi Address"
  },
  {
   "start": 20402,
   "end": 20445,
   "type": "PETSCII Text"
  },
  {
   "start": 20446,
   "end": 20729,
   "type": "Byte"
  },
  {
   "start": 20730,
   "end": 22301,
   "type": "PETSCII Text"
  },
  {
   "start": 22302,
   "end": 22366,
   "type": "Byte"
  },
  {
   "start": 22367,
   "end": 22422,
   "type": "Lo/Hi Address"
  },
  {
   "start": 22423,
   "end": 22473,
   "type": "PETSCII Text"
  },
  {
   "start": 22474,
   "end": 22481,
   "type": "Lo/Hi Address"
  },
  {
   "start": 22482,
   "end": 22492,
   "type": "Byte"
  },
  {
   "start": 22493,
   "end": 22498,
   "type": "Word"
  },
  {
   "start": 22499,
   "end": 23131,
   "type": "Byte"
  },
  {
   "start": 23132,
   "end": 23334,
   "type": "PETSCII Text"
  },
  {
   "start": 23335,
   "end": 24131,
   "type": "Code"
  },
  {
   "start": 24132,
   "end": 24137,
   "type": "Word"
  },
  {
   "start": 24138,
   "end": 32767,
   "type": "Byte"
  },
  {
   "start": 32768,
   "end": 32771,
   "type": "Address"
  },
  {
   "start": 32772,
   "end": 32776,
   "type": "Byte"
  },
  {
   "start": 32777,
   "end": 36761,
   "type": "PETSCII Text"
  },
  {
   "start": 36762,
   "end": 36863,
   "type": "Byte"
  },
  {
   "start": 36864,
   "end": 40959,
   "type": "Byte"
  },
  {
   "start": 40960,
   "end": 42239,
   "type": "Byte"
  },
  {
   "start": 42240,
   "end": 42303,
   "type": "Byte"
  },
  {
   "start": 42304,
   "end": 43007,
   "type": "Byte"
  },
  {
   "start": 43008,
   "end": 43095,
   "type": "Undefined"
  },
  {
   "start": 43096,
   "end": 43519,
   "type": "Byte"
  },
  {
   "start": 43520,
   "end": 43647,
   "type": "Undefined"
  },
  {
   "start": 43648,
   "end": 44007,
   "type": "Byte"
  },
  {
   "start": 44008,
   "end": 44023,
   "type": "Undefined"
  },
  {
   "start": 44024,
   "end": 44031,
   "type": "Byte"
  },
  {
   "start": 44032,
   "end": 45055,
   "type": "Byte"
  },
  {
   "start": 45056,
   "end": 46079,
   "type": "Undefined"
  },
  {
   "start": 46080,
   "end": 48959,
   "type": "Byte"
  },
  {
   "start": 48960,
   "end": 49151,
   "type": "Undefined"
  },
  {
   "start": 49152,
   "end": 49966,
   "type": "Code"
  },
  {
   "start": 49967,
   "end": 49970,
   "type": "Byte"
  },
  {
   "start": 49971,
   "end": 50158,
   "type": "Word"
  },
  {
   "start": 50159,
   "end": 50356,
   "type": "Byte"
  },
  {
   "start": 50357,
   "end": 50362,
   "type": "Lo/Hi Address"
  },
  {
   "start": 50363,
   "end": 50368,
   "type": "Lo/Hi Address"
  },
  {
   "start": 50369,
   "end": 50374,
   "type": "Lo/Hi Address"
  },
  {
   "start": 50375,
   "end": 50456,
   "type": "Lo/Hi Address"
  },
  {
   "start": 50457,
   "end": 52162,
   "type": "Byte"
  },
  {
   "start": 52163,
   "end": 52198,
   "type": "Code"
  },
  {
   "start": 52199,
   "end": 52223,
   "type": "Undefined"
  },
  {
   "start": 52224,
   "end": 53223,
   "type": "Byte"
  },
  {
   "start": 53224,
   "end": 57343,
   "type": "Undefined"
  },
  {
   "start": 57344,
   "end": 65343,
   "type": "Byte"
  },
  {
   "start": 65344,
   "end": 65535,
   "type": "Undefined"
  }
 ],
 "symbols": [
  {
   "address": 0,
   "name": "cpu_port_ddr",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 1,
   "name": "cpu_port",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 20,
   "name": "demo_rec_ptr",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21,
   "name": "demo_rec_ptr_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 99,
   "name": "work_ptr",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 100,
   "name": "work_ptr_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 155,
   "name": "ptr_a",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 156,
   "name": "ptr_a_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 157,
   "name": "ptr_b",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 158,
   "name": "ptr_b_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 187,
   "name": "ray_cell",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 197,
   "name": "kernal_key_held",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 204,
   "name": "kernal_cursor_switch",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 247,
   "name": "ray_px",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 248,
   "name": "ray_py",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 249,
   "name": "ray_map_ptr",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 250,
   "name": "ray_map_ptr_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 251,
   "name": "music_track_ptr",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 252,
   "name": "music_track_ptr_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 253,
   "name": "music_pattern_ptr",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 254,
   "name": "music_pattern_ptr_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 255,
   "name": "ray_step_index",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 653,
   "name": "kernal_shift_keys",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 678,
   "name": "kernal_pal_flag",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 788,
   "name": "irq_vector",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 789,
   "name": "irq_vector_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 896,
   "name": "ray_number",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 897,
   "name": "ray_length",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 898,
   "name": "ray_pattern_pos",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 899,
   "name": "rng_index_rom_e000",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 900,
   "name": "rng_index_rom_e800",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 901,
   "name": "rng_save_x",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 902,
   "name": "rng_save_y",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 903,
   "name": "input_fire",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 904,
   "name": "input_x",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 905,
   "name": "input_y",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 906,
   "name": "scratch_a",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 907,
   "name": "view_restart",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 908,
   "name": "turn_ray_loop",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 909,
   "name": "sprite_bg_collisions",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 910,
   "name": "scratch_b",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 911,
   "name": "scratch_c",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 912,
   "name": "scratch_d",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 913,
   "name": "scratch_e",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 914,
   "name": "scratch_f",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 915,
   "name": "scratch_g",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 916,
   "name": "mux_first_object",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 917,
   "name": "menu_line_ptr",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 918,
   "name": "menu_line_ptr_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 919,
   "name": "menu_line_count",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 920,
   "name": "menu_cursor_prev",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 921,
   "name": "menu_cursor",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 922,
   "name": "move_speed",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 923,
   "name": "pickup_item",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 924,
   "name": "move_countdown",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 927,
   "name": "sweep_ray_count",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 928,
   "name": "frame_counter",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 929,
   "name": "frame_of_last_move",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 930,
   "name": "pickup_weight",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 931,
   "name": "msg_column",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 932,
   "name": "msg_work_column",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 933,
   "name": "msg_string_index",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 934,
   "name": "msg_colour",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 935,
   "name": "current_object",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 936,
   "name": "second_object",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 937,
   "name": "menu_count_items_here",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 938,
   "name": "menu_count_wearable",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 939,
   "name": "menu_count_containers",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 940,
   "name": "menu_count_worn",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 941,
   "name": "menu_count_hands_full",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 942,
   "name": "menu_count_creatures_here",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 943,
   "name": "action_time",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 944,
   "name": "msgwin_corner",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 945,
   "name": "msgwin_corner_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 946,
   "name": "msgwin_width",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 947,
   "name": "msgwin_height",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 948,
   "name": "msgwin_bottom_line",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 949,
   "name": "msgwin_bottom_line_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 951,
   "name": "irq_band",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 953,
   "name": "step_opens_door",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 954,
   "name": "step_monster",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 955,
   "name": "bar_units",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 956,
   "name": "clock_divider",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 957,
   "name": "menu_count_drinkable",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 958,
   "name": "menuwin_item_width",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 959,
   "name": "menuwin_capacity",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 960,
   "name": "menuwin_per_row",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 961,
   "name": "menuwin_bottom_row",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 962,
   "name": "menuwin_second_row",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 963,
   "name": "spell_upkeep_ticks",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 964,
   "name": "spell_upkeep_hundreds",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 965,
   "name": "menuwin_corner",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 966,
   "name": "menuwin_corner_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 967,
   "name": "game_over_code",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 968,
   "name": "wander_timer",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 969,
   "name": "rebuild_ray_count",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 970,
   "name": "pic_object",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 971,
   "name": "pic_slot",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 972,
   "name": "pic_tall",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 973,
   "name": "pic_rows",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 974,
   "name": "menu_blink",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 975,
   "name": "footstep_request",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 976,
   "name": "footstep_countdown",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 977,
   "name": "music_on",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 978,
   "name": "music_key_held",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 979,
   "name": "demo_mode",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 980,
   "name": "demo_rec_addr",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 981,
   "name": "demo_rec_addr_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 982,
   "name": "demo_input_code",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 983,
   "name": "demo_repeats_left",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 984,
   "name": "demo_ended",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 985,
   "name": "demo_request",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 986,
   "name": "scroller_ntsc_divider",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 987,
   "name": "music_ntsc_divider",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1037,
   "name": "screen_mind_bar",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1047,
   "name": "screen_body_bar",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 1056,
   "name": "screen_clock_hours_tens",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1057,
   "name": "screen_clock_hours",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1059,
   "name": "screen_clock_minutes_tens",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1060,
   "name": "screen_clock_minutes",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1062,
   "name": "screen_clock_seconds_tens",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1063,
   "name": "screen_clock_seconds",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1229,
   "name": "screen_player_cell",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1984,
   "name": "screen_title_scroller",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2040,
   "name": "screen_sprite_pointers",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2041,
   "name": "entry",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2048,
   "name": "entry_sta_ddr",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2050,
   "name": "entry_rom_init",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2072,
   "name": "restart",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 2084,
   "name": "main_loop",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 2119,
   "name": "dispatch_lo",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 2120,
   "name": "dispatch_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 2121,
   "name": "main_loop_run_world",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2129,
   "name": "game_over",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 2156,
   "name": "b_086C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2166,
   "name": "game_over_wait",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 2187,
   "name": "b_088B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2218,
   "name": "b_08AA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2221,
   "name": "b_08AD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2224,
   "name": "verb_walk",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 2233,
   "name": "verb_run",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 2252,
   "name": "run_world",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 2257,
   "name": "b_08D1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2285,
   "name": "b_08ED",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2302,
   "name": "b_08FE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2324,
   "name": "b_0914",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2327,
   "name": "b_0917",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2340,
   "name": "new_game",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 2380,
   "name": "b_094C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2448,
   "name": "b_0990",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2478,
   "name": "close_all_doors",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2488,
   "name": "b_09B8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2506,
   "name": "b_09CA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2517,
   "name": "new_game_windows",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2584,
   "name": "setup_play_screen",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2633,
   "name": "b_0A49",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2666,
   "name": "b_0A6A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2686,
   "name": "new_game_start",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 2751,
   "name": "player_move_tick",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 2762,
   "name": "b_0ACA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2789,
   "name": "b_0AE5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2792,
   "name": "j_0AE8",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 2804,
   "name": "b_0AF4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2820,
   "name": "r_0B04",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 2821,
   "name": "view_refresh",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 2836,
   "name": "b_0B14",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2853,
   "name": "view_cast_ray",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 2868,
   "name": "b_0B34",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2884,
   "name": "b_0B44",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2908,
   "name": "b_0B5C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2953,
   "name": "j_0B89",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 2985,
   "name": "b_0BA9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2995,
   "name": "b_0BB3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 2998,
   "name": "b_0BB6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3028,
   "name": "b_0BD4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3041,
   "name": "b_0BE1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3070,
   "name": "b_0BFE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3078,
   "name": "b_0C06",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3103,
   "name": "b_0C1F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3108,
   "name": "j_0C24",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 3133,
   "name": "b_0C3D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3172,
   "name": "b_0C64",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3190,
   "name": "r_0C76",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 3191,
   "name": "view_record_cell",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3217,
   "name": "b_0C91",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3220,
   "name": "input_poll",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3257,
   "name": "b_0CB9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3265,
   "name": "b_0CC1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3270,
   "name": "input_read",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 3281,
   "name": "b_0CD1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3285,
   "name": "b_0CD5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3289,
   "name": "b_0CD9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3293,
   "name": "b_0CDD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3318,
   "name": "b_0CF6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3327,
   "name": "b_0CFF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3339,
   "name": "b_0D0B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3349,
   "name": "b_0D15",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3358,
   "name": "r_0D1E",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 3359,
   "name": "player_sprite_init",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3396,
   "name": "player_step",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3409,
   "name": "b_0D51",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3424,
   "name": "j_0D60",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 3445,
   "name": "b_0D75",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3471,
   "name": "b_0D8F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3478,
   "name": "b_0D96",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3488,
   "name": "player_cross_right",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 3501,
   "name": "b_0DAD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3522,
   "name": "b_0DC2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3524,
   "name": "b_0DC4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3566,
   "name": "b_0DEE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3574,
   "name": "player_cross_left",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 3592,
   "name": "b_0E08",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3613,
   "name": "b_0E1D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3615,
   "name": "b_0E1F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3657,
   "name": "b_0E49",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3665,
   "name": "player_cross_down",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 3684,
   "name": "b_0E64",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3708,
   "name": "b_0E7C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3710,
   "name": "b_0E7E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3750,
   "name": "b_0EA6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3762,
   "name": "b_0EB2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3779,
   "name": "player_cross_up",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 3798,
   "name": "b_0ED6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3822,
   "name": "b_0EEE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3824,
   "name": "b_0EF0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3864,
   "name": "b_0F18",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3876,
   "name": "b_0F24",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3893,
   "name": "delay",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3895,
   "name": "b_0F37",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3897,
   "name": "b_0F39",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3909,
   "name": "view_clear_cells",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3911,
   "name": "b_0F47",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3928,
   "name": "view_draw_cells",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3944,
   "name": "b_0F68",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3946,
   "name": "b_0F6A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3984,
   "name": "b_0F90",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 3989,
   "name": "player_bounce",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3999,
   "name": "b_0F9F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4009,
   "name": "r_0FA9",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 4010,
   "name": "view_find_visible",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4014,
   "name": "b_0FAE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4027,
   "name": "b_0FBB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4029,
   "name": "b_0FBD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4068,
   "name": "b_0FE4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4079,
   "name": "draw_entity_sprites",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4096,
   "name": "view_figures_body",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 4108,
   "name": "j_100C",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 4116,
   "name": "b_1014",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4208,
   "name": "b_1070",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4253,
   "name": "b_109D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4265,
   "name": "b_10A9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4281,
   "name": "b_10B9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4326,
   "name": "j_10E6",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 4333,
   "name": "b_10ED",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4348,
   "name": "b_10FC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4358,
   "name": "menu_clear",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4377,
   "name": "b_1119",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4379,
   "name": "b_111B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4409,
   "name": "b_1139",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4433,
   "name": "menu_add_entry",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4463,
   "name": "b_116F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4478,
   "name": "b_117E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4481,
   "name": "j_1181",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 4486,
   "name": "b_1186",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4501,
   "name": "b_1195",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4504,
   "name": "r_1198",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 4505,
   "name": "b_1199",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4511,
   "name": "b_119F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4514,
   "name": "main_menu",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4549,
   "name": "b_11C5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4572,
   "name": "b_11DC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4604,
   "name": "b_11FC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4613,
   "name": "b_1205",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4627,
   "name": "b_1213",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4641,
   "name": "b_1221",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4660,
   "name": "b_1234",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4678,
   "name": "b_1246",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4692,
   "name": "b_1254",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4715,
   "name": "b_126B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4731,
   "name": "b_127B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4747,
   "name": "b_128B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4751,
   "name": "main_menu_conditions",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4776,
   "name": "b_12A8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4795,
   "name": "b_12BB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4818,
   "name": "b_12D2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4826,
   "name": "b_12DA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4836,
   "name": "b_12E4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4844,
   "name": "b_12EC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4859,
   "name": "b_12FB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4869,
   "name": "b_1305",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4871,
   "name": "b_1307",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4890,
   "name": "b_131A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4896,
   "name": "menu_choose",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4911,
   "name": "b_132F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4922,
   "name": "b_133A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4942,
   "name": "j_134E",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 4962,
   "name": "b_1362",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4979,
   "name": "b_1373",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4990,
   "name": "b_137E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 4998,
   "name": "b_1386",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5011,
   "name": "b_1393",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5043,
   "name": "b_13B3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5055,
   "name": "b_13BF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5061,
   "name": "b_13C5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5076,
   "name": "b_13D4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5088,
   "name": "b_13E0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5094,
   "name": "b_13E6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5112,
   "name": "b_13F8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5123,
   "name": "b_1403",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5136,
   "name": "b_1410",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5154,
   "name": "b_1422",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5165,
   "name": "b_142D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5175,
   "name": "j_1437",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 5192,
   "name": "b_1448",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5223,
   "name": "j_1467",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 5228,
   "name": "b_146C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5241,
   "name": "b_1479",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5251,
   "name": "menu_colour_slot",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5262,
   "name": "b_148E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5278,
   "name": "pictures_clear_all",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5280,
   "name": "b_14A0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5290,
   "name": "b_14AA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5315,
   "name": "picture_slot_clear",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5363,
   "name": "b_14F3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5365,
   "name": "b_14F5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5367,
   "name": "b_14F7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5397,
   "name": "picture_show",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5415,
   "name": "b_1527",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5419,
   "name": "b_152B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5430,
   "name": "j_1536",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 5431,
   "name": "b_1537",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5438,
   "name": "b_153E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5452,
   "name": "b_154C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5453,
   "name": "b_154D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5466,
   "name": "b_155A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5491,
   "name": "b_1573",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5506,
   "name": "b_1582",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5548,
   "name": "b_15AC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5563,
   "name": "b_15BB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5601,
   "name": "b_15E1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5603,
   "name": "b_15E3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5623,
   "name": "b_15F7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5634,
   "name": "b_1602",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5668,
   "name": "b_1624",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5670,
   "name": "b_1626",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5690,
   "name": "b_163A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5701,
   "name": "b_1645",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5735,
   "name": "b_1667",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5737,
   "name": "b_1669",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5778,
   "name": "j_1692",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 5781,
   "name": "pictures_update",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5783,
   "name": "b_1697",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5804,
   "name": "b_16AC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5840,
   "name": "b_16D0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5845,
   "name": "b_16D5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5872,
   "name": "b_16F0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5874,
   "name": "b_16F2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5892,
   "name": "b_1704",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5904,
   "name": "b_1710",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5914,
   "name": "b_171A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5921,
   "name": "j_1721",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 5937,
   "name": "b_1731",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5944,
   "name": "b_1738",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5953,
   "name": "picture_sync_feature",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5988,
   "name": "b_1764",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 5999,
   "name": "b_176F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6015,
   "name": "b_177F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6041,
   "name": "j_1799",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 6044,
   "name": "r_179C",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 6045,
   "name": "read_input_demo",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6054,
   "name": "b_17A6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6061,
   "name": "b_17AD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6094,
   "name": "b_17CE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6107,
   "name": "b_17DB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6115,
   "name": "b_17E3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6128,
   "name": "b_17F0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6150,
   "name": "demo_rec_stick",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 6167,
   "name": "b_1817",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6171,
   "name": "b_181B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6185,
   "name": "b_1829",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6189,
   "name": "b_182D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6224,
   "name": "b_1850",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6232,
   "name": "demo_rec_new_run",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 6243,
   "name": "b_1863",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6270,
   "name": "b_187E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6280,
   "name": "demo_replay",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 6299,
   "name": "b_189B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6309,
   "name": "demo_replay_apply",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 6330,
   "name": "b_18BA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6350,
   "name": "b_18CE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6370,
   "name": "b_18E2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6382,
   "name": "b_18EE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6394,
   "name": "b_18FA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6406,
   "name": "r_1906",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 6407,
   "name": "demo_replay_next",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 6415,
   "name": "b_190F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6439,
   "name": "b_1927",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6473,
   "name": "music_frame",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6489,
   "name": "b_1959",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6492,
   "name": "verb_pick_up",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6519,
   "name": "b_1977",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6530,
   "name": "b_1982",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6575,
   "name": "b_19AF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6676,
   "name": "b_1A14",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6697,
   "name": "b_1A29",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6700,
   "name": "j_1A2C",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 6703,
   "name": "r_1A2F",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 6704,
   "name": "verb_inventory",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6731,
   "name": "b_1A4B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6751,
   "name": "j_1A5F",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 6775,
   "name": "b_1A77",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6795,
   "name": "j_1A8B",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 6809,
   "name": "b_1A99",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6844,
   "name": "b_1ABC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6872,
   "name": "b_1AD8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6889,
   "name": "b_1AE9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6893,
   "name": "verb_put_down",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6931,
   "name": "b_1B13",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 6963,
   "name": "b_1B33",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7010,
   "name": "b_1B62",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7013,
   "name": "j_1B65",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 7065,
   "name": "b_1B99",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7068,
   "name": "r_1B9C",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 7069,
   "name": "verb_open",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7103,
   "name": "door_open",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7115,
   "name": "b_1BCB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7130,
   "name": "b_1BDA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7138,
   "name": "b_1BE2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7153,
   "name": "b_1BF1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7162,
   "name": "b_1BFA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7170,
   "name": "b_1C02",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7184,
   "name": "b_1C10",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7192,
   "name": "b_1C18",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7207,
   "name": "b_1C27",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7216,
   "name": "r_1C30",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 7217,
   "name": "verb_close",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7248,
   "name": "player_centre_if_on",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7260,
   "name": "b_1C5C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7300,
   "name": "r_1C84",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 7301,
   "name": "door_close",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7316,
   "name": "b_1C94",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7331,
   "name": "b_1CA3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7339,
   "name": "b_1CAB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7354,
   "name": "b_1CBA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7363,
   "name": "b_1CC3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7371,
   "name": "b_1CCB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7385,
   "name": "b_1CD9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7393,
   "name": "b_1CE1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7408,
   "name": "b_1CF0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7417,
   "name": "j_1CF9",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 7424,
   "name": "verb_wear",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7464,
   "name": "b_1D28",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7498,
   "name": "b_1D4A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7533,
   "name": "b_1D6D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7536,
   "name": "j_1D70",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 7562,
   "name": "r_1D8A",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 7563,
   "name": "verb_take_off",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7593,
   "name": "b_1DA9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7598,
   "name": "b_1DAE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7643,
   "name": "b_1DDB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7683,
   "name": "b_1E03",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7686,
   "name": "j_1E06",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 7712,
   "name": "r_1E20",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 7713,
   "name": "verb_put_in",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7748,
   "name": "b_1E44",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7777,
   "name": "b_1E61",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7797,
   "name": "b_1E75",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7832,
   "name": "b_1E98",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7880,
   "name": "b_1EC8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7915,
   "name": "b_1EEB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7931,
   "name": "b_1EFB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7934,
   "name": "j_1EFE",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 7956,
   "name": "r_1F14",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 7957,
   "name": "verb_take_out",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7982,
   "name": "b_1F2E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 7990,
   "name": "b_1F36",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8039,
   "name": "b_1F67",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8135,
   "name": "b_1FC7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8138,
   "name": "r_1FCA",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 8139,
   "name": "verb_look_in",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8147,
   "name": "b_1FD3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8190,
   "name": "b_1FFE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8215,
   "name": "b_2017",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8278,
   "name": "b_2056",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8308,
   "name": "b_2074",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8336,
   "name": "b_2090",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8353,
   "name": "b_20A1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8356,
   "name": "r_20A4",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 8357,
   "name": "verb_swap",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8380,
   "name": "passages_all",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8382,
   "name": "b_20BE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8396,
   "name": "passage_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8428,
   "name": "b_20EC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8431,
   "name": "b_20EF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8449,
   "name": "j_2101",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 8467,
   "name": "r_2113",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 8468,
   "name": "direction_from_delta",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8493,
   "name": "b_212D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8513,
   "name": "b_2141",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8541,
   "name": "b_215D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8559,
   "name": "b_216F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8567,
   "name": "b_2177",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8571,
   "name": "b_217B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8581,
   "name": "j_2185",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 8596,
   "name": "b_2194",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8603,
   "name": "direction_towards",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8638,
   "name": "b_21BE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8662,
   "name": "b_21D6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8680,
   "name": "b_21E8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8705,
   "name": "b_2201",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8709,
   "name": "creatures_tick",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8711,
   "name": "b_2207",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8717,
   "name": "b_220D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8744,
   "name": "b_2228",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8750,
   "name": "creature_step",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8760,
   "name": "b_2238",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8791,
   "name": "b_2257",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8841,
   "name": "b_2289",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8879,
   "name": "b_22AF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8913,
   "name": "b_22D1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8946,
   "name": "b_22F2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 8967,
   "name": "r_2307",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 8968,
   "name": "creature_decide",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 8976,
   "name": "b_2310",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9000,
   "name": "b_2328",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9008,
   "name": "b_2330",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9016,
   "name": "b_2338",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9019,
   "name": "j_233B",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 9032,
   "name": "b_2348",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9038,
   "name": "j_234E",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 9041,
   "name": "j_2351",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 9054,
   "name": "b_235E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9060,
   "name": "j_2364",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 9063,
   "name": "creature_arm_pursuit",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9083,
   "name": "b_237B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9089,
   "name": "creature_chase",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 9131,
   "name": "b_23AB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9135,
   "name": "creature_flee",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 9169,
   "name": "b_23D1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9173,
   "name": "creature_go_home",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 9205,
   "name": "b_23F5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9209,
   "name": "creature_attack_player",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 9257,
   "name": "b_2429",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9280,
   "name": "b_2440",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9315,
   "name": "b_2463",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9345,
   "name": "j_2481",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 9385,
   "name": "b_24A9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9420,
   "name": "player_body_hit",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9438,
   "name": "b_24DE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9453,
   "name": "j_24ED",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 9457,
   "name": "player_protection",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9477,
   "name": "b_2505",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9497,
   "name": "b_2519",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9517,
   "name": "b_252D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9537,
   "name": "b_2541",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9555,
   "name": "b_2553",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9573,
   "name": "r_2565",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 9574,
   "name": "creature_choose_move",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9609,
   "name": "b_2589",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9614,
   "name": "j_258E",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 9639,
   "name": "exits_table_page",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9641,
   "name": "b_25A9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9665,
   "name": "j_25C1",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 9683,
   "name": "b_25D3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9721,
   "name": "b_25F9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9741,
   "name": "b_260D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9745,
   "name": "b_2611",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9767,
   "name": "play_irq_install",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9811,
   "name": "play_irq",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 9821,
   "name": "play_irq_return",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 9830,
   "name": "play_irq_dispatch",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 9842,
   "name": "b_2672",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 9845,
   "name": "irq_band0",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 10078,
   "name": "irq_band1",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 10149,
   "name": "b_27A5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10152,
   "name": "b_27A8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10158,
   "name": "irq_band2",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 10371,
   "name": "sum_held_weight",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10373,
   "name": "b_2885",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10407,
   "name": "b_28A7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10413,
   "name": "b_28AD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10414,
   "name": "clear_message_window",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10426,
   "name": "b_28BA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10430,
   "name": "b_28BE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10449,
   "name": "b_28D1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10461,
   "name": "message_new_line",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10480,
   "name": "j_28F0",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 10482,
   "name": "j_28F2",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 10513,
   "name": "b_2911",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10528,
   "name": "b_2920",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10539,
   "name": "b_292B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10541,
   "name": "b_292D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10561,
   "name": "print_message",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10565,
   "name": "j_2945",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 10596,
   "name": "b_2964",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10611,
   "name": "b_2973",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10631,
   "name": "b_2987",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10642,
   "name": "j_2992",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 10667,
   "name": "b_29AB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10683,
   "name": "b_29BB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10701,
   "name": "b_29CD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10710,
   "name": "b_29D6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10717,
   "name": "b_29DD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10723,
   "name": "b_29E3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10737,
   "name": "print_full_stop",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10748,
   "name": "verb_attack",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10763,
   "name": "b_2A0B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10812,
   "name": "b_2A3C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10847,
   "name": "b_2A5F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10882,
   "name": "b_2A82",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10887,
   "name": "b_2A87",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10900,
   "name": "r_2A94",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 10901,
   "name": "j_2A95",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 10926,
   "name": "b_2AAE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10943,
   "name": "b_2ABF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10953,
   "name": "j_2AC9",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 10975,
   "name": "b_2ADF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 10997,
   "name": "b_2AF5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11051,
   "name": "b_2B2B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11074,
   "name": "b_2B42",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11102,
   "name": "r_2B5E",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 11103,
   "name": "attack_special_roll",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11128,
   "name": "b_2B78",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11148,
   "name": "b_2B8C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11164,
   "name": "b_2B9C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11166,
   "name": "random_byte",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11207,
   "name": "print_via_chrout",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11213,
   "name": "j_2BCD",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 11226,
   "name": "b_2BDA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11229,
   "name": "r_2BDD",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 11230,
   "name": "draw_mind_body_bars",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11239,
   "name": "j_2BE7",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 11255,
   "name": "b_2BF7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11273,
   "name": "j_2C09",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 11295,
   "name": "b_2C1F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11299,
   "name": "j_2C23",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 11315,
   "name": "b_2C33",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11333,
   "name": "j_2C45",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 11344,
   "name": "advance_clock",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11350,
   "name": "b_2C56",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11371,
   "name": "b_2C6B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11392,
   "name": "b_2C80",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11413,
   "name": "b_2C95",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11434,
   "name": "b_2CAA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11455,
   "name": "b_2CBF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11475,
   "name": "r_2CD3",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 11476,
   "name": "verb_examine",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11507,
   "name": "b_2CF3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11509,
   "name": "b_2CF5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11525,
   "name": "b_2D05",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11544,
   "name": "j_2D18",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 11567,
   "name": "b_2D2F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11614,
   "name": "verb_drink",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11622,
   "name": "b_2D66",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11640,
   "name": "b_2D78",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11663,
   "name": "b_2D8F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11710,
   "name": "b_2DBE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11729,
   "name": "b_2DD1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11735,
   "name": "b_2DD7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11758,
   "name": "b_2DEE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11764,
   "name": "b_2DF4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11774,
   "name": "b_2DFE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11781,
   "name": "j_2E05",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 11794,
   "name": "b_2E12",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11807,
   "name": "b_2E1F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11811,
   "name": "verb_cast",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11819,
   "name": "b_2E2B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11867,
   "name": "b_2E5B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11920,
   "name": "b_2E90",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11937,
   "name": "b_2EA1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11952,
   "name": "b_2EB0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 11986,
   "name": "b_2ED2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12020,
   "name": "b_2EF4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12029,
   "name": "b_2EFD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12057,
   "name": "b_2F19",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 12065,
   "name": "r_2F21",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 12066,
   "name": "verb_uncast",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12114,
   "name": "r_2F52",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 12288,
   "name": "charset_top",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12296,
   "name": "cs_letters",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12504,
   "name": "cs_bar_labels",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12520,
   "name": "cs_glyphs_1d_1f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12544,
   "name": "cs_space",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12552,
   "name": "cs_bar_cells",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12624,
   "name": "cs_punctuation",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12672,
   "name": "cs_digits",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12760,
   "name": "cs_glyphs_3b_3f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12800,
   "name": "cs_window_frame",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12912,
   "name": "cs_glyphs_4e_4f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12928,
   "name": "cs_pool_tiles",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 12960,
   "name": "cs_blank_54_5f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13056,
   "name": "cs_tiles_60_63",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13088,
   "name": "cs_blank_64_6f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13184,
   "name": "cs_pedestal_tiles",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13216,
   "name": "cs_blank_74_7d",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13296,
   "name": "cs_rock_unseen",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13312,
   "name": "cs_dungeon_tiles",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13696,
   "name": "cs_passage_tiles",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13728,
   "name": "cs_tiles_b4_bf",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13824,
   "name": "cs_item_figures",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 13952,
   "name": "cs_creature_figures",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14032,
   "name": "cs_blank_da_ef",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14208,
   "name": "cs_door_tiles",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14336,
   "name": "spr_player_dot",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14339,
   "name": "a_3803",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 14342,
   "name": "a_3806",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 14345,
   "name": "a_3809",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 14400,
   "name": "spr_view_objects",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14592,
   "name": "f_3900",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 14656,
   "name": "spr_view_objects_5_7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14848,
   "name": "top_spr0_x",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14849,
   "name": "top_spr0_y",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14850,
   "name": "top_spr1_x",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14851,
   "name": "top_spr1_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14852,
   "name": "top_spr2_x",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14853,
   "name": "top_spr2_y",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14854,
   "name": "top_spr3_x",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14855,
   "name": "top_spr3_y",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14856,
   "name": "top_spr4_x",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14857,
   "name": "top_spr4_y",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14858,
   "name": "top_spr5_x",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14859,
   "name": "top_spr5_y",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14860,
   "name": "top_spr6_x",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14861,
   "name": "top_spr6_y",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14862,
   "name": "top_spr7_x",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14863,
   "name": "top_spr7_y",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14864,
   "name": "top_spr_enable",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14865,
   "name": "top_spr_expand_y",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14866,
   "name": "top_spr_priority",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14867,
   "name": "top_spr_multicolour",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14868,
   "name": "top_spr_expand_x",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14869,
   "name": "top_spr0_colour",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14870,
   "name": "top_spr1_colour",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14871,
   "name": "top_spr2_colour",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14872,
   "name": "top_spr3_colour",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14873,
   "name": "top_spr4_colour",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14874,
   "name": "top_spr5_colour",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14875,
   "name": "top_spr6_colour",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14876,
   "name": "top_spr7_colour",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14880,
   "name": "pic_spr0_x",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14881,
   "name": "pic_spr0_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 14882,
   "name": "pic_spr1_x",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14883,
   "name": "pic_spr1_y",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14884,
   "name": "pic_spr2_x",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14885,
   "name": "pic_spr2_y",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14886,
   "name": "pic_spr3_x",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14887,
   "name": "pic_spr3_y",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14888,
   "name": "pic_spr4_x",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14889,
   "name": "pic_spr4_y",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14890,
   "name": "pic_spr5_x",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14891,
   "name": "pic_spr5_y",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14892,
   "name": "pic_spr6_x",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14893,
   "name": "pic_spr6_y",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14894,
   "name": "pic_spr7_x",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14895,
   "name": "pic_spr7_y",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14896,
   "name": "pic_spr_enable",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14909,
   "name": "pic_spr_x_msb",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14912,
   "name": "spell_upkeep",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 14968,
   "name": "r_3A78",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 14969,
   "name": "menu_layout_normal",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 14995,
   "name": "menu_layout_spells",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15021,
   "name": "menu_add_entity",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15047,
   "name": "spell_hit_creature",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15059,
   "name": "b_3AD3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15077,
   "name": "b_3AE5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15126,
   "name": "r_3B16",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 15127,
   "name": "choose_creature_in_sight",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15135,
   "name": "b_3B1F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15148,
   "name": "b_3B2C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15183,
   "name": "b_3B4F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15203,
   "name": "drop_possessions",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15205,
   "name": "b_3B65",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15233,
   "name": "b_3B81",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 15239,
   "name": "wanderers_new_goals",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15289,
   "name": "r_3BB9",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 15290,
   "name": "random_destination",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15307,
   "name": "ray_pattern_start",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15335,
   "name": "ray_wall_bit",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15343,
   "name": "ray_pixel_mask",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15351,
   "name": "ray_steps",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15400,
   "name": "ray_steps_7_13",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15449,
   "name": "ray_steps_14_20",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15498,
   "name": "ray_steps_21_27",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15547,
   "name": "view_scroll_dst",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15611,
   "name": "scenery_objects",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15616,
   "name": "view_scroll_src",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15685,
   "name": "view_cell_map_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15806,
   "name": "view_cell_map_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15927,
   "name": "view_cell_tile",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16048,
   "name": "obj_in_view",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16112,
   "name": "obj_start_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16176,
   "name": "obj_start_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16240,
   "name": "obj_where_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16241,
   "name": "where_armour",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 16242,
   "name": "where_helmet",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 16256,
   "name": "where_ring_10",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 16257,
   "name": "where_ring_11",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 16304,
   "name": "obj_where_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16305,
   "name": "where_armour_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 16306,
   "name": "where_helmet_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 16320,
   "name": "where_ring_10_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 16321,
   "name": "where_ring_11_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 16368,
   "name": "obj_px",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16432,
   "name": "obj_py",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16496,
   "name": "obj_glyph",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16560,
   "name": "obj_heading",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16624,
   "name": "obj_heading_steps",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16688,
   "name": "verb_strings",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16840,
   "name": "menu_line_values",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16848,
   "name": "menu_line_values_tail",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16857,
   "name": "monitor_leftover",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17800,
   "name": "noun_name_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 17864,
   "name": "noun_name_lo_pedestal",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17865,
   "name": "noun_name_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 17929,
   "name": "noun_name_hi_pedestal",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 17930,
   "name": "name_n",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 17932,
   "name": "name_armour",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 17939,
   "name": "name_helmet",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 17946,
   "name": "name_dagger",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 17953,
   "name": "name_backpack",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 17962,
   "name": "name_sword",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 17968,
   "name": "name_axe",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 17972,
   "name": "name_potion",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 17979,
   "name": "name_ring",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 17984,
   "name": "name_amulet",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 17991,
   "name": "name_mace",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 17996,
   "name": "name_scroll",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 18003,
   "name": "name_shield",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 18010,
   "name": "name_orc",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 18014,
   "name": "name_wizard",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 18021,
   "name": "name_skeleton",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 18030,
   "name": "name_hellhound",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 18040,
   "name": "name_bat",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 18044,
   "name": "name_spider",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 18051,
   "name": "name_snake",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 18057,
   "name": "name_vampire",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 18065,
   "name": "name_minotaur",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 18074,
   "name": "name_pedestal",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 18083,
   "name": "msg_nothing",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18093,
   "name": "msg_equals_unused",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18098,
   "name": "msg_too_heavy",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18134,
   "name": "msg_thelric_parting",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18286,
   "name": "msg_empty",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18287,
   "name": "msg_you_are_carrying",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18306,
   "name": "msg_in_right_hand",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18328,
   "name": "msg_in_left_hand_wearing",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18369,
   "name": "msg_no_free_hand",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18384,
   "name": "msg_put",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18390,
   "name": "msg_in",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18395,
   "name": "msg_from",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18402,
   "name": "msg_in_the",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18411,
   "name": "msg_you_can_see",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18425,
   "name": "msg_with",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18432,
   "name": "msg_nothing_to_fight_with",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18471,
   "name": "msg_fist",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18476,
   "name": "msg_you_missed",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18489,
   "name": "msg_you_hit",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18499,
   "name": "msg_you_killed_it",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18515,
   "name": "msg_already_dead",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18536,
   "name": "msg_swap_hands",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18549,
   "name": "msg_the",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18555,
   "name": "msg_attacked_you_with_its",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18580,
   "name": "msg_he_missed",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18592,
   "name": "msg_he_hit",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18601,
   "name": "msg_youre_dead",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18617,
   "name": "msg_spell_failed",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18693,
   "name": "msg_at",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18698,
   "name": "msg_you_killed_the",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18715,
   "name": "msg_only_clothes",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18740,
   "name": "msg_door",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18746,
   "name": "msg_power_unused",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18752,
   "name": "msg_comma",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18755,
   "name": "msg_full_stop",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18757,
   "name": "msg_space_unused",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 18759,
   "name": "compass_from_step",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18775,
   "name": "step_bits",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18784,
   "name": "bit_masks",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18792,
   "name": "move_order_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18800,
   "name": "move_order_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18808,
   "name": "move_order_n",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 18816,
   "name": "move_order_ne",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 18824,
   "name": "move_order_e",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 18832,
   "name": "move_order_se",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 18840,
   "name": "move_order_s",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 18848,
   "name": "move_order_sw",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 18856,
   "name": "move_order_w",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 18864,
   "name": "move_order_nw",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 18872,
   "name": "move_no_go",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 18873,
   "name": "creature_back_dir",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18937,
   "name": "opposite_dir",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18945,
   "name": "weight",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19009,
   "name": "is_container",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19073,
   "name": "is_wearable",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19074,
   "name": "wearable_armour",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 19075,
   "name": "wearable_helmet",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 19089,
   "name": "wearable_ring16",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 19090,
   "name": "wearable_ring17",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 19137,
   "name": "object_state",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19155,
   "name": "state_ring_of_dexterity",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 19162,
   "name": "state_scroll_25",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 19201,
   "name": "is_weapon",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19265,
   "name": "is_drinkable",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19329,
   "name": "creature_speed",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19393,
   "name": "creature_tick",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19457,
   "name": "right_hand",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 19458,
   "name": "left_hand",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 19459,
   "name": "verb_handlers",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19460,
   "name": "verb_handlers_high",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19495,
   "name": "verb_ticks",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19514,
   "name": "verb_offset",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19535,
   "name": "last_seen_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19599,
   "name": "last_seen_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19630,
   "name": "creature_goal_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19632,
   "name": "last_seen_hi_creatures",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 19661,
   "name": "creature_goal_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19663,
   "name": "creature_goal_lo_creatures",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 19692,
   "name": "creature_fleeing",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19694,
   "name": "creature_goal_hi_creatures",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 19723,
   "name": "creature_chasing",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19725,
   "name": "creature_fleeing_creatures",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 19754,
   "name": "creature_mode_timer",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19756,
   "name": "creature_chasing_creatures",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 19785,
   "name": "creature_temper",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19787,
   "name": "creature_mode_timer_creatures",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 19818,
   "name": "creature_temper_creatures",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 19849,
   "name": "strength",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19911,
   "name": "defence",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 19972,
   "name": "defence_vampire61",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 19973,
   "name": "to_hit",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19974,
   "name": "to_hit_1",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 20037,
   "name": "weapon_damage",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 20101,
   "name": "body_start",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 20165,
   "name": "body_strength",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 20229,
   "name": "mind_start",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 20294,
   "name": "mind_power",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 20326,
   "name": "natural_weapon",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 20359,
   "name": "natural_weapon_creatures",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20390,
   "name": "natural_weapon_name_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 20396,
   "name": "natural_weapon_name_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 20402,
   "name": "nw_name_null",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 20407,
   "name": "nw_name_hands",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 20413,
   "name": "nw_name_claws",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 20419,
   "name": "nw_name_teeth",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 20425,
   "name": "nw_name_sting",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 20431,
   "name": "nw_name_fireball",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 20446,
   "name": "natural_weapon_damage",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 20450,
   "name": "creature_closes_door",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 20452,
   "name": "attack_pause_creatures",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20481,
   "name": "creature_opens_doors",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 20483,
   "name": "closes_door_creatures",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20514,
   "name": "opens_doors_creatures",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20545,
   "name": "distance_from_player",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 20609,
   "name": "view_distance",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 20664,
   "name": "view_distance_rows_5_10",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20730,
   "name": "play_screen_frame",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20944,
   "name": "desc_no_features",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 20972,
   "name": "desc_potion_of_healing",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21027,
   "name": "desc_backpack",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21070,
   "name": "desc_sapphire_warning",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21139,
   "name": "desc_blue_stone",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21190,
   "name": "desc_long_blade",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21228,
   "name": "desc_reversed_label",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21274,
   "name": "desc_pungent",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21312,
   "name": "desc_orcanian_intellect",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21342,
   "name": "desc_riddle",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21486,
   "name": "desc_dagger_of_death_lore",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 21572,
   "name": "desc_wizard_heals",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21625,
   "name": "desc_amulet",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21675,
   "name": "desc_heavy_protection",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21729,
   "name": "desc_dagger_of_death",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21785,
   "name": "desc_protection_from_evil",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21828,
   "name": "desc_ring_of_dexterity",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21868,
   "name": "desc_shield",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21903,
   "name": "desc_made_of_wood",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21923,
   "name": "desc_east_wind",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22008,
   "name": "desc_fortes_fortuna",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 22041,
   "name": "desc_orc",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 22074,
   "name": "desc_harmless_wizard",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 22107,
   "name": "desc_skeleton",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 22134,
   "name": "desc_hellhound",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 22169,
   "name": "desc_minotaur",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 22225,
   "name": "desc_mace",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 22250,
   "name": "desc_pedestal",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 22302,
   "name": "description_of",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22366,
   "name": "description_of_pedestal",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22367,
   "name": "desc_ptr_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22395,
   "name": "desc_ptr_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22423,
   "name": "spell_name_magic_missile",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 22437,
   "name": "spell_name_fireball",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 22446,
   "name": "spell_name_magical_shield",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 22461,
   "name": "spell_name_energy_drain",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 22474,
   "name": "spell_name_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22478,
   "name": "spell_name_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22482,
   "name": "sustained_spell",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 22483,
   "name": "shield_protection",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 22484,
   "name": "spell_power",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 22485,
   "name": "spell_cost",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22489,
   "name": "spell_upkeep_interval",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22493,
   "name": "band_colour_copy_params",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22499,
   "name": "slot_bitmap_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22511,
   "name": "slot_bitmap_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22523,
   "name": "slot_screen_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22535,
   "name": "slot_screen_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22547,
   "name": "slot_colour_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22559,
   "name": "slot_colour_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22571,
   "name": "picture_of",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22635,
   "name": "picture_of_features",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22639,
   "name": "picture_tall",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22703,
   "name": "picture_tall_features",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22707,
   "name": "slot_holder",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22708,
   "name": "slot_holder_1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22719,
   "name": "slot_of",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22783,
   "name": "slot_of_features",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 22787,
   "name": "pic_bitmap_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22818,
   "name": "pic_bitmap_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22849,
   "name": "pic_screen_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22880,
   "name": "pic_screen_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22911,
   "name": "pic_colour_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22942,
   "name": "pic_colour_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22973,
   "name": "slot_dead_sprite",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22985,
   "name": "sprite_slot",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22993,
   "name": "dead_sprite_x",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23004,
   "name": "creature_footsteps",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23005,
   "name": "dead_sprite_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23017,
   "name": "dead_sprite_x_msb",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23029,
   "name": "feature_count_shut_doors",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 23030,
   "name": "feature_count_open_doors",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 23031,
   "name": "feature_count_stairs_b0",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 23032,
   "name": "feature_count_stairs_b3",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 23033,
   "name": "feature_shown_shut_doors",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 23034,
   "name": "feature_shown_open_doors",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 23035,
   "name": "feature_shown_stairs_b0",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 23036,
   "name": "feature_shown_stairs_b3",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 23037,
   "name": "footsteps_creatures",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23068,
   "name": "creature_footstep_countdown",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23132,
   "name": "msg_ending",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23335,
   "name": "title_screen",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 23400,
   "name": "b_5B68",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 23482,
   "name": "title_wait_loop",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 23495,
   "name": "b_5BC7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 23519,
   "name": "b_5BDF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 23537,
   "name": "b_5BF1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 23550,
   "name": "b_5BFE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 23563,
   "name": "title_leave",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 23672,
   "name": "b_5C78",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 23679,
   "name": "b_5C7F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 23698,
   "name": "title_instructions",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 23749,
   "name": "copy_block",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 23787,
   "name": "b_5CEB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 23797,
   "name": "b_5CF5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 23803,
   "name": "b_5CFB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 23816,
   "name": "title_irq",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23826,
   "name": "j_5D12",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 23832,
   "name": "b_5D18",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 23840,
   "name": "title_irq_scroller",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 23907,
   "name": "title_irq_picture",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 23980,
   "name": "title_scroll_step",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 23998,
   "name": "b_5DBE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 24021,
   "name": "b_5DD5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 24062,
   "name": "b_5DFE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 24076,
   "name": "b_5E0C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 24085,
   "name": "b_5E15",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 24100,
   "name": "b_5E24",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 24104,
   "name": "r_5E28",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 24105,
   "name": "wait_fire_press",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 24118,
   "name": "b_5E36",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 24132,
   "name": "title_colour_params",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24138,
   "name": "title_irq_half",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 24139,
   "name": "title_fine_scroll",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 24140,
   "name": "title_text_ptr",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 24141,
   "name": "title_text_ptr_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 24142,
   "name": "unused_5e4e",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24576,
   "name": "pic01_armour_top_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24624,
   "name": "pic02_orc_top_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24672,
   "name": "pic03_helmet_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24720,
   "name": "pic04_wizard_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24768,
   "name": "pic05_minotaur_top_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24816,
   "name": "pic06_vampire_top_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24864,
   "name": "pic_sheet_bitmap_unused_row00",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24896,
   "name": "pic01_armour_top_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24944,
   "name": "pic02_orc_top_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24992,
   "name": "pic03_helmet_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25040,
   "name": "pic04_wizard_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25088,
   "name": "pic05_minotaur_top_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25136,
   "name": "pic06_vampire_top_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25184,
   "name": "pic_sheet_bitmap_unused_row01",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25216,
   "name": "pic01_armour_top_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25264,
   "name": "pic02_orc_top_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25312,
   "name": "pic03_helmet_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25360,
   "name": "pic04_wizard_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25408,
   "name": "pic05_minotaur_top_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25456,
   "name": "pic06_vampire_top_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25504,
   "name": "pic_sheet_bitmap_unused_row02",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25536,
   "name": "pic01_armour_top_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25584,
   "name": "pic02_orc_top_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25632,
   "name": "pic03_helmet_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25680,
   "name": "pic04_wizard_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25728,
   "name": "pic05_minotaur_top_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25776,
   "name": "pic06_vampire_top_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25824,
   "name": "pic_sheet_bitmap_unused_row03",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25856,
   "name": "pic07_armour_legs_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25904,
   "name": "pic08_orc_legs_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25952,
   "name": "pic09_door_top_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26000,
   "name": "pic10_stairs_top_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26048,
   "name": "pic11_minotaur_legs_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26096,
   "name": "pic12_vampire_cloak_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26144,
   "name": "pic_sheet_bitmap_unused_row04",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26176,
   "name": "pic07_armour_legs_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26224,
   "name": "pic08_orc_legs_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26272,
   "name": "pic09_door_top_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26320,
   "name": "pic10_stairs_top_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26368,
   "name": "pic11_minotaur_legs_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26416,
   "name": "pic12_vampire_cloak_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26464,
   "name": "pic_sheet_bitmap_unused_row05",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26496,
   "name": "pic07_armour_legs_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26544,
   "name": "pic08_orc_legs_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26592,
   "name": "pic09_door_top_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26640,
   "name": "pic10_stairs_top_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26688,
   "name": "pic11_minotaur_legs_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26736,
   "name": "pic12_vampire_cloak_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26784,
   "name": "pic_sheet_bitmap_unused_row06",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26816,
   "name": "pic07_armour_legs_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26864,
   "name": "pic08_orc_legs_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26912,
   "name": "pic09_door_top_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26960,
   "name": "pic10_stairs_top_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27008,
   "name": "pic11_minotaur_legs_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27056,
   "name": "pic12_vampire_cloak_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27104,
   "name": "pic_sheet_bitmap_unused_row07",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27136,
   "name": "pic13_skeleton_top_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27184,
   "name": "pic14_shield_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27232,
   "name": "pic15_door_bottom_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27280,
   "name": "pic16_stairs_steps_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27328,
   "name": "pic17_dagger_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27376,
   "name": "pic18_hellhound_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27424,
   "name": "pic_sheet_bitmap_unused_row08",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27456,
   "name": "pic13_skeleton_top_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27504,
   "name": "pic14_shield_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27552,
   "name": "pic15_door_bottom_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27600,
   "name": "pic16_stairs_steps_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27648,
   "name": "pic17_dagger_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27696,
   "name": "pic18_hellhound_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27744,
   "name": "pic_sheet_bitmap_unused_row09",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27776,
   "name": "pic13_skeleton_top_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27824,
   "name": "pic14_shield_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27872,
   "name": "pic15_door_bottom_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27920,
   "name": "pic16_stairs_steps_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27968,
   "name": "pic17_dagger_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28016,
   "name": "pic18_hellhound_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28064,
   "name": "pic_sheet_bitmap_unused_row10",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28096,
   "name": "pic13_skeleton_top_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28144,
   "name": "pic14_shield_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28192,
   "name": "pic15_door_bottom_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28240,
   "name": "pic16_stairs_steps_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28288,
   "name": "pic17_dagger_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28336,
   "name": "pic18_hellhound_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28384,
   "name": "pic_sheet_bitmap_unused_row11",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28416,
   "name": "pic19_skeleton_legs_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28464,
   "name": "pic20_backpack_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28512,
   "name": "pic21_sword_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28560,
   "name": "pic22_axe_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28608,
   "name": "pic23_potion_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28656,
   "name": "pic24_ring_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28704,
   "name": "pic_sheet_bitmap_unused_row12",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28736,
   "name": "pic19_skeleton_legs_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28784,
   "name": "pic20_backpack_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28832,
   "name": "pic21_sword_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28880,
   "name": "pic22_axe_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28928,
   "name": "pic23_potion_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28976,
   "name": "pic24_ring_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29024,
   "name": "pic_sheet_bitmap_unused_row13",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29056,
   "name": "pic19_skeleton_legs_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29104,
   "name": "pic20_backpack_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29152,
   "name": "pic21_sword_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29200,
   "name": "pic22_axe_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29248,
   "name": "pic23_potion_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29296,
   "name": "pic24_ring_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29344,
   "name": "pic_sheet_bitmap_unused_row14",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29376,
   "name": "pic19_skeleton_legs_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29424,
   "name": "pic20_backpack_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29472,
   "name": "pic21_sword_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29520,
   "name": "pic22_axe_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29568,
   "name": "pic23_potion_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29616,
   "name": "pic24_ring_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29664,
   "name": "pic_sheet_bitmap_unused_row15",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29696,
   "name": "pic25_bat_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29744,
   "name": "pic26_amulet_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29792,
   "name": "pic27_spider_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29840,
   "name": "pic28_mace_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29888,
   "name": "pic29_snake_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29936,
   "name": "pic30_scroll_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29984,
   "name": "pic_sheet_bitmap_unused_row16",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30016,
   "name": "pic25_bat_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30064,
   "name": "pic26_amulet_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30112,
   "name": "pic27_spider_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30160,
   "name": "pic28_mace_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30208,
   "name": "pic29_snake_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30256,
   "name": "pic30_scroll_bitmap_row2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30304,
   "name": "pic_sheet_bitmap_unused_row17",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30336,
   "name": "pic25_bat_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30384,
   "name": "pic26_amulet_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30432,
   "name": "pic27_spider_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30480,
   "name": "pic28_mace_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30528,
   "name": "pic29_snake_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30576,
   "name": "pic30_scroll_bitmap_row3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30624,
   "name": "pic_sheet_bitmap_unused_row18",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30656,
   "name": "pic25_bat_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30704,
   "name": "pic26_amulet_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30752,
   "name": "pic27_spider_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30800,
   "name": "pic28_mace_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30848,
   "name": "pic29_snake_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30896,
   "name": "pic30_scroll_bitmap_row4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30944,
   "name": "pic_sheet_bitmap_unused_row19",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30976,
   "name": "pic_sheet_screen_row00",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31016,
   "name": "pic_sheet_screen_row01",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31056,
   "name": "pic_sheet_screen_row02",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31096,
   "name": "pic_sheet_screen_row03",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31136,
   "name": "pic_sheet_screen_row04",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31176,
   "name": "pic_sheet_screen_row05",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31216,
   "name": "pic_sheet_screen_row06",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31256,
   "name": "pic_sheet_screen_row07",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31296,
   "name": "pic_sheet_screen_row08",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31336,
   "name": "pic_sheet_screen_row09",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31376,
   "name": "pic_sheet_screen_row10",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31416,
   "name": "pic_sheet_screen_row11",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31456,
   "name": "pic_sheet_screen_row12",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31496,
   "name": "pic_sheet_screen_row13",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31536,
   "name": "pic_sheet_screen_row14",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31576,
   "name": "pic_sheet_screen_row15",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31616,
   "name": "pic_sheet_screen_row16",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31656,
   "name": "pic_sheet_screen_row17",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31696,
   "name": "pic_sheet_screen_row18",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31736,
   "name": "pic_sheet_screen_row19",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31776,
   "name": "pic_sheet_colour_row00",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31816,
   "name": "pic_sheet_colour_row01",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31856,
   "name": "pic_sheet_colour_row02",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31896,
   "name": "pic_sheet_colour_row03",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31936,
   "name": "pic_sheet_colour_row04",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31976,
   "name": "pic_sheet_colour_row05",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32016,
   "name": "pic_sheet_colour_row06",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32056,
   "name": "pic_sheet_colour_row07",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32096,
   "name": "pic_sheet_colour_row08",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32136,
   "name": "pic_sheet_colour_row09",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32176,
   "name": "pic_sheet_colour_row10",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32216,
   "name": "pic_sheet_colour_row11",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32256,
   "name": "pic_sheet_colour_row12",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32296,
   "name": "pic_sheet_colour_row13",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32336,
   "name": "pic_sheet_colour_row14",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32376,
   "name": "pic_sheet_colour_row15",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32416,
   "name": "pic_sheet_colour_row16",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32456,
   "name": "pic_sheet_colour_row17",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32496,
   "name": "pic_sheet_colour_row18",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32536,
   "name": "pic_sheet_colour_row19",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32576,
   "name": "unused_7f40",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32768,
   "name": "cbm80_cold_start",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32770,
   "name": "cbm80_warm_start",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32772,
   "name": "cbm80_signature",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32777,
   "name": "title_scroller_text",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33678,
   "name": "controls_screen_text",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33975,
   "name": "instructions_page1_text",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34535,
   "name": "instructions_page2_text",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34963,
   "name": "instructions_page3_text",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35611,
   "name": "instructions_page4_text",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36273,
   "name": "instructions_page5_text",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36762,
   "name": "unused_8f9a",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36864,
   "name": "dungeon_map",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36992,
   "name": "map_row_01",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 37120,
   "name": "map_row_02",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 37248,
   "name": "map_row_03",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 37376,
   "name": "map_row_04",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 37504,
   "name": "map_row_05",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 37632,
   "name": "map_row_06",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 37760,
   "name": "map_row_07",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 37888,
   "name": "map_row_08",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38016,
   "name": "map_row_09",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38144,
   "name": "map_row_10",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38272,
   "name": "map_row_11",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38400,
   "name": "map_row_12",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38528,
   "name": "map_row_13",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38656,
   "name": "map_row_14",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38784,
   "name": "map_row_15",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38912,
   "name": "map_row_16",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39040,
   "name": "map_row_17",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39168,
   "name": "map_row_18",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39296,
   "name": "map_row_19",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39424,
   "name": "map_row_20",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39552,
   "name": "map_row_21",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39680,
   "name": "map_row_22",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39808,
   "name": "map_row_23",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39936,
   "name": "map_row_24",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40064,
   "name": "map_row_25",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40192,
   "name": "map_row_26",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40320,
   "name": "map_row_27",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40448,
   "name": "map_row_28",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40576,
   "name": "map_row_29",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40704,
   "name": "map_row_30",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40832,
   "name": "map_row_31",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40960,
   "name": "tile_exits_door_opener",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 41216,
   "name": "tile_exits",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 41280,
   "name": "tile_exits_40",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 41344,
   "name": "tile_exits_80",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 41408,
   "name": "tile_exits_c0",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 41472,
   "name": "tile_glyph_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 41536,
   "name": "tile_glyph_lo_40",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 41600,
   "name": "tile_glyph_lo_80",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 41664,
   "name": "tile_glyph_lo_c0",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 41728,
   "name": "tile_glyph_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 41792,
   "name": "tile_glyph_hi_40",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 41856,
   "name": "tile_glyph_hi_80",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 41920,
   "name": "tile_glyph_hi_c0",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 41984,
   "name": "tile_colour",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 42048,
   "name": "tile_colour_40",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42111,
   "name": "tile_colour_unseen",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 42112,
   "name": "tile_colour_80",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42176,
   "name": "tile_colour_c0",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42240,
   "name": "sprite_dead_label",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42304,
   "name": "demo_random_state",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 42305,
   "name": "demo_random_state_2",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 42306,
   "name": "demo_input_start",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42307,
   "name": "demo_input",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 43096,
   "name": "band2_colour_image",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 43648,
   "name": "band2_screen_matrix",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 44024,
   "name": "band2_sprite_pointers",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 44032,
   "name": "title_colour_image",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 46080,
   "name": "band2_bitmap_row_16",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 46400,
   "name": "band2_bitmap_row_17",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 46720,
   "name": "band2_bitmap_row_18",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 47040,
   "name": "band2_bitmap_row_19",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 47360,
   "name": "band2_bitmap_row_20",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 47680,
   "name": "band2_bitmap_row_21",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 48000,
   "name": "band2_bitmap_row_22",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 48320,
   "name": "band2_bitmap_row_23",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 48640,
   "name": "band2_bitmap_row_24",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 49152,
   "name": "music_init",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 49155,
   "name": "music_stop",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 49158,
   "name": "music_play",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 49175,
   "name": "b_C017",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 49196,
   "name": "b_C02C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 49219,
   "name": "b_C043",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 49222,
   "name": "music_play_voices",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 49235,
   "name": "b_C053",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 49268,
   "name": "music_unreached_c074",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 49271,
   "name": "b_C077",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 49274,
   "name": "music_next_note",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 49293,
   "name": "b_C08D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 49307,
   "name": "music_unreached_c09b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 49310,
   "name": "music_read_note",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 49354,
   "name": "b_C0CA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 49379,
   "name": "b_C0E3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 49417,
   "name": "b_C109",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 49420,
   "name": "music_set_instrument",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 49501,
   "name": "b_C15D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 49504,
   "name": "music_release",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 49535,
   "name": "music_effects",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 49576,
   "name": "b_C1A8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 49600,
   "name": "b_C1C0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 49636,
   "name": "j_C1E4",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 49661,
   "name": "b_C1FD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 49676,
   "name": "music_pulse",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 49704,
   "name": "b_C228",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 49761,
   "name": "b_C261",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 49784,
   "name": "b_C278",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 49807,
   "name": "music_drum",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 49856,
   "name": "b_C2C0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 49864,
   "name": "b_C2C8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 49867,
   "name": "music_slide",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 49911,
   "name": "music_octave",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 49934,
   "name": "b_C30E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 49937,
   "name": "j_C311",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 49960,
   "name": "music_next_voice",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 49966,
   "name": "r_C32E",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 49967,
   "name": "music_freq_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 49968,
   "name": "music_freq_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 49969,
   "name": "music_freq_lo_up",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 49970,
   "name": "music_freq_hi_up",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 49971,
   "name": "music_freq_note02",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 49991,
   "name": "music_freq_octave1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50015,
   "name": "music_freq_octave2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50039,
   "name": "music_freq_octave3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50063,
   "name": "music_freq_octave4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50087,
   "name": "music_freq_octave5",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50111,
   "name": "music_freq_octave6",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50135,
   "name": "music_freq_octave7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50159,
   "name": "music_voice_reg",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50162,
   "name": "music_cur_reg",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50163,
   "name": "music_track_pos",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50165,
   "name": "music_track_pos_v3",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50166,
   "name": "music_pattern_pos",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50169,
   "name": "music_ticks_left",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50172,
   "name": "music_note_flags",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50175,
   "name": "music_control",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50178,
   "name": "music_note",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50181,
   "name": "music_instrument",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50184,
   "name": "music_gate_mask",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50185,
   "name": "music_note_flags_tmp",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50186,
   "name": "music_freq_lo_tmp",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50187,
   "name": "music_x_save",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50188,
   "name": "music_control_tmp",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50189,
   "name": "music_vib_depth",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50190,
   "name": "music_pulse_speed",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50191,
   "name": "music_vib_step_lo",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50192,
   "name": "music_vib_step_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50193,
   "name": "music_vib_freq_lo",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50194,
   "name": "music_vib_freq_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50195,
   "name": "music_vib_phase",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50196,
   "name": "music_pulse_timer",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50199,
   "name": "music_pulse_dir",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50202,
   "name": "music_tick_count",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50203,
   "name": "music_speed",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50204,
   "name": "music_instr_offset",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50205,
   "name": "music_state",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50206,
   "name": "music_freq_hi_now",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50209,
   "name": "music_freq_lo_now",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50212,
   "name": "music_fx",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50213,
   "name": "music_pulse_step",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50214,
   "name": "music_frame_count",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50215,
   "name": "music_instruments",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50216,
   "name": "music_instr_pulse_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50217,
   "name": "music_instr_control",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50218,
   "name": "music_instr_ad",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50219,
   "name": "music_instr_sr",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50220,
   "name": "music_instr_vibrato",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50221,
   "name": "music_instr_pulse_speed",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50222,
   "name": "music_instr_fx",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50223,
   "name": "music_instr_01",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50231,
   "name": "music_instr_02",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50239,
   "name": "music_instr_03",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50247,
   "name": "music_instr_04",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50255,
   "name": "music_instr_05",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50263,
   "name": "music_instr_06",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50271,
   "name": "music_instr_07",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50279,
   "name": "music_instr_08",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50287,
   "name": "music_instr_09",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50295,
   "name": "music_instr_10",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50303,
   "name": "music_instr_11",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50311,
   "name": "music_instr_12",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50319,
   "name": "music_instr_13",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50327,
   "name": "music_instr_14",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50335,
   "name": "music_instr_15",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50343,
   "name": "music_instr_16",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50351,
   "name": "music_track_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50354,
   "name": "music_track_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50357,
   "name": "music_tunes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50363,
   "name": "music_tune_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50369,
   "name": "music_tune_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50375,
   "name": "music_pattern_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50416,
   "name": "music_pattern_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50457,
   "name": "music_track_t0_v1",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50481,
   "name": "music_track_t0_v1_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50491,
   "name": "music_track_t0_v1_c",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50512,
   "name": "music_track_t0_v1_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50529,
   "name": "music_track_t0_v2",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50586,
   "name": "music_track_t0_v2_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50624,
   "name": "music_track_t0_v2_c",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50688,
   "name": "music_track_t0_v2_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50705,
   "name": "music_track_t0_v3",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50757,
   "name": "music_track_t0_v3_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50768,
   "name": "music_track_t0_v3_c",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50813,
   "name": "music_track_t0_v3_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50830,
   "name": "music_track_t1_v1",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50835,
   "name": "music_track_t1_v2",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50837,
   "name": "music_track_t1_v3",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50841,
   "name": "music_track_t2_v1",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50853,
   "name": "music_track_t2_v2",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50866,
   "name": "music_track_t2_v3",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50879,
   "name": "music_pattern_00",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50882,
   "name": "music_pattern_39",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50886,
   "name": "music_pattern_01",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50889,
   "name": "music_pattern_40",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50936,
   "name": "music_pattern_02",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50961,
   "name": "music_pattern_30",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50986,
   "name": "music_pattern_03",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 51035,
   "name": "music_pattern_38",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 51042,
   "name": "music_pattern_32",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 51048,
   "name": "music_pattern_37",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 51090,
   "name": "music_pattern_32_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 51139,
   "name": "music_pattern_33",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 51187,
   "name": "music_pattern_33_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 51228,
   "name": "music_pattern_05",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 51258,
   "name": "music_pattern_06",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 51274,
   "name": "music_pattern_10",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 51306,
   "name": "music_pattern_10_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 51364,
   "name": "music_pattern_11",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 51380,
   "name": "music_pattern_12",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 51396,
   "name": "music_pattern_13",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 51412,
   "name": "music_pattern_15",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 51439,
   "name": "music_pattern_17",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 51479,
   "name": "music_pattern_17_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 51507,
   "name": "music_pattern_18",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 51541,
   "name": "music_pattern_18_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 51576,
   "name": "music_pattern_19",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 51638,
   "name": "music_pattern_20",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 51660,
   "name": "music_pattern_23",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 51715,
   "name": "music_pattern_24",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 51766,
   "name": "music_pattern_25",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 51820,
   "name": "music_pattern_26",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 51875,
   "name": "music_pattern_27",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 51913,
   "name": "music_pattern_28",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 51951,
   "name": "music_pattern_29",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 51961,
   "name": "music_pattern_09",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 51981,
   "name": "music_pattern_22",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 52001,
   "name": "music_pattern_31",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 52021,
   "name": "music_pattern_34",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 52041,
   "name": "music_pattern_35",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 52053,
   "name": "music_pattern_36",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 52058,
   "name": "music_pattern_04",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 52072,
   "name": "music_pattern_07",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 52086,
   "name": "music_pattern_08",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 52100,
   "name": "music_pattern_14",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 52114,
   "name": "music_pattern_16",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 52129,
   "name": "music_pattern_21",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 52163,
   "name": "music_start_tune",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 52175,
   "name": "b_CBCF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 52193,
   "name": "music_request_stop",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 52224,
   "name": "title_screen_matrix",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55296,
   "name": "f_D800",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55552,
   "name": "f_D900",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55808,
   "name": "f_DA00",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56064,
   "name": "f_DB00",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56256,
   "name": "f_DBC0",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 57344,
   "name": "rom_bytes_e000",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 57408,
   "name": "title_bitmap_row00",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58303,
   "name": "rom_basic_init_ram",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 58304,
   "name": "title_bitmap_row03",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58692,
   "name": "rom_clear_screen",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 58693,
   "name": "title_bitmap_row04",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59392,
   "name": "rom_bytes_e800",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 59456,
   "name": "title_bitmap_row06",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59953,
   "name": "rom_irq_exit",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 60224,
   "name": "title_bitmap_row09",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61184,
   "name": "title_bitmap_row12",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61440,
   "name": "rom_bytes_f000",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 61504,
   "name": "title_bitmap_row13",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62144,
   "name": "title_bitmap_row15",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63104,
   "name": "title_bitmap_row18",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64064,
   "name": "title_bitmap_row21",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64704,
   "name": "title_bitmap_row23",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 65490,
   "name": "rom_chrout",
   "type": "Subroutine",
   "kind": "user"
  }
 ],
 "comments": [
  {
   "address": 0,
   "type": "line",
   "text": "6510 data-direction register. The entry code writes $2F to it (LDA #$2F at $07FE, STA $00 at $0800; bits 0-3 and 5 outputs); nothing else in the game touches it."
  },
  {
   "address": 1,
   "type": "line",
   "text": "6510 processor port, the memory banking. The entry sets $37 ($0802) and the restart at $0818 clears bit 0 (AND #$FE), leaving $36 for the whole game: BASIC ROM out so $A000-$BFFF is the game's RAM, I/O and the KERNAL ROM in (CHROUT, the $EA31 interrupt exit, and the ROM bytes $2B9E reads as random numbers). $0002-$0013 are not used by the game's code."
  },
  {
   "address": 20,
   "type": "line",
   "text": "Demonstration recorder and player ($179D): low byte of a pointer to the current input record, copied from $03D4 each time a record is read or written ($17B3, $17F5, $182D, $1927)."
  },
  {
   "address": 21,
   "type": "line",
   "text": "High byte of the input-record pointer at $14, copied from $03D5 ($17B8-$192F); the records live at $A543-$A7FF. $0016-$0054 are not used by the game's code."
  },
  {
   "address": 99,
   "type": "line",
   "text": "Low byte of a pointer (with $64) used by four routines: the new-game setup walks it over the map $9000-$9FFF closing every door ($09AE-$09D3); $1695 walks it over the view window at $0400 counting door and passage tiles for the scenery pictures ($16E8-$1734); the block copy $5CC5 reads its parameter block through it and then writes the destination through it; the title interrupt reads the scroller text through it ($5E01-$5E22)."
  },
  {
   "address": 100,
   "type": "line",
   "text": "High byte of the pointer at $63: $90-$9F during the map walk, $04 for the view-window scan, the destination's high byte in $5CC5, $80-$83 for the title scroller text. $0065-$009A are not used by the game's code."
  },
  {
   "address": 155,
   "type": "line",
   "text": "Pointer A, low byte (with $9C), the game's main address register, set up afresh by each user: the screen address in the view scroll ($0D44) and view draw ($0F58), the menu window ($1106, $1151, $1320, $1483) and the message window ($28AE-$2941); the glyph copied into a view sprite ($1092: $3000 + 8 x glyph); a map address in OPEN and CLOSE ($1B9D-$1CF9), the passage-tile test ($20CC) and a monster's step ($2566); the picture copy's source ($1515); the string in $2BC7; the block copy's source ($5CC5)."
  },
  {
   "address": 156,
   "type": "line",
   "text": "Pointer A, high byte (see $9B). $1483 and $1106 add $D4 to it to reach the colour RAM cell under a screen cell of the menu window, and $1483 takes the $D4 off again afterwards."
  },
  {
   "address": 157,
   "type": "line",
   "text": "Pointer B, low byte (with $9E): mostly the colour-RAM twin of pointer A (screen address + $D400) in the view scroll, view draw, menu and message windows; also the view sprite being filled ($0FEF: $3840 + 64 per slot), the tile glyph the ray tests ($0C41, from $A200/$A300), the picture copy's destination ($1515), a monster's list of preferred headings ($2566, from $4968/$4970) and the block copy's end address ($5CC5)."
  },
  {
   "address": 158,
   "type": "line",
   "text": "Pointer B, high byte (see $9D): $D8-$DB when it follows colour RAM, $38-$39 for the view sprites, $30-$37 for a tile glyph, $49 for a heading list."
  },
  {
   "address": 187,
   "type": "line",
   "text": "Ray caster: index (0-120) of the view cell the current ray has reached in the 11 x 11 view arrays $3D45/$3DBE/$3E37. Starts at 60, the centre and the player's own cell ($0B70); +1/-1 when the ray crosses into the tile right/left, +11/-11 down/up ($0BAA-$0C1F); $0C77 records the cell under it. $00BC-$00C4 are not used by the game's code."
  },
  {
   "address": 197,
   "type": "line",
   "text": "KERNAL: matrix code (8 x row + column) of the key held: its scan in $EA31, which band 0 of the play interrupt ends in, writes 64 to $CB and then the key found ($EA8C, $EAC9) and copies $CB here ($EB28, in the emulator's kernal-901227-03.bin). The game reads it: $24 M toggles the music ($0C94); $1D H up, $1C B down, $3C SPACE fire ($0CFF-$0D19); $15 F ends a recording ($17AD); on the title $11 R with CTRL starts one ($5BC1). $00C6-$00CB are not used by the game's code."
  },
  {
   "address": 204,
   "type": "line",
   "text": "KERNAL cursor switch: set to 1 by the entry ($080E) and never read by the game. The KERNAL interrupt skips its cursor blink while it is non-zero ($EA34 LDA $CC / BNE in kernal-901227-03.bin), so the $EA31 exit of the play interrupt never flashes a cursor into the game screen. $00CD-$00E1 are not used by the game's code."
  },
  {
   "address": 247,
   "type": "line",
   "text": "Ray caster: the ray's pixel column 0-7 inside its tile, starting at the player's $3FF0 ($0B5C). Stepping past 7 or below 0 wraps it and moves $F9/$FA and $BB one tile right or left ($0BE8-$0C1F). Indexes the pixel masks $3BE7/$3BEF of the sight test."
  },
  {
   "address": 248,
   "type": "line",
   "text": "Ray caster: the ray's pixel row 0-7 inside its tile, from the player's $4030 ($0B61). Wrapping moves $F9/$FA by $80 (one map row) and $BB by 11 ($0B92-$0BDB); it is the glyph row read by the sight test ($0C4B)."
  },
  {
   "address": 249,
   "type": "line",
   "text": "Two uses. Ray caster: low byte of the map address of the tile the ray is in, from the player's $3F70 ($0B66); $0C77 stores it per view cell in $3D45. Message printer $2941: low byte of the string being printed (X on entry, $2941), advanced word by word."
  },
  {
   "address": 250,
   "type": "line",
   "text": "High byte of $F9: the ray's map address ($90-$9F, from $3FB0, stored in $3DBE) or, in $2941, the string's high byte (Y on entry)."
  },
  {
   "address": 251,
   "type": "line",
   "text": "Music driver play routine ($C006): low byte of the current voice's track pointer (its list of pattern numbers), loaded from $C4AF + voice ($C062); read at $C07D for the next pattern, $FF looping the track and $FE stopping the tune."
  },
  {
   "address": 252,
   "type": "line",
   "text": "Music driver: high byte of the track pointer, from $C4B2 + voice ($C067)."
  },
  {
   "address": 253,
   "type": "line",
   "text": "Music driver: low byte of the current pattern's pointer, from $C4C7 + pattern number ($C09F); the note, duration and instrument bytes are read through it ($C0B1-$C14F)."
  },
  {
   "address": 254,
   "type": "line",
   "text": "Music driver: high byte of the pattern pointer, from $C4F0 + pattern number ($C0A4)."
  },
  {
   "address": 255,
   "type": "line",
   "text": "Ray caster: index into the step table $3BF7 of the current ray's next step. Set to the ray's pattern start from $3BCB ($0B7C), advanced per step, and reset to that start every 7 steps ($0C38), so a ray repeats its 7-step pattern."
  },
  {
   "address": 653,
   "type": "line",
   "text": "KERNAL: the SHIFT/Commodore/CTRL flags of its keyboard scan, which ORs in 1 for either SHIFT, 2 for the Commodore key and 4 for CTRL (key table $EB81, $EAC1 in kernal-901227-03.bin); the game only reads it. In play ($0CEA) 1 makes the horizontal input +1, right, and 2 makes it -1, left, as the controls screen documents; on the title 4 (CTRL alone) with R starts a recording ($5BBA-$5BCC). $028E-$02A5 are not used by the game."
  },
  {
   "address": 678,
   "type": "line",
   "text": "KERNAL: its video-standard flag, set at reset from the raster interrupt flag ($FF63-$FF68 in kernal-901227-03.bin; its timer setup at $FDDD treats non-zero as PAL); 1 in the PAL snapshots. The game only reads it: when it is 0, an NTSC machine at 60 frames a second, $1949 skips every sixth music tick ($03DB) and the title scroller every second step ($5DAC, $03DA). $02A7-$02E5 are not used by the game."
  },
  {
   "address": 788,
   "type": "line",
   "text": "KERNAL IRQ vector, low byte (with $0315): the KERNAL's interrupt entry jumps through it. The game sets it to the play interrupt $2653 ($2627), to the title interrupt $5D08 ($5B90), and back to the KERNAL's $EA31 while it rebuilds a screen ($5B27, $5C19)."
  },
  {
   "address": 789,
   "type": "line",
   "text": "KERNAL IRQ vector, high byte: $26, $5D or $EA. $0316-$0354 are not used by the game (the BRK and NMI vectors at $0316-$0319 keep the KERNAL's values)."
  },
  {
   "address": 896,
   "type": "line",
   "text": "Ray caster ($0B25): the ray being cast, 0-27, one of 28 directions; +1 per call, wrapping at 28, and indexing $3BCB for its step pattern. A turn step casts six rays ($08CC); $0B05 casts 30 at once, starting it at $1B so the first is ray 0. 0 at game start ($0929)."
  },
  {
   "address": 897,
   "type": "line",
   "text": "Ray caster: steps the current ray has taken. The ray ends at 56 ($38) steps or at the first opaque pixel ($0C69-$0C71); $0C77 records no cell once it is 56."
  },
  {
   "address": 898,
   "type": "line",
   "text": "Ray caster: position 0-6 in the ray's 7-step pattern; at 7 it returns to 0 and $FF goes back to the pattern's start ($0C26-$0C3B)."
  },
  {
   "address": 899,
   "type": "line",
   "text": "Random numbers ($2B9E): offset into the KERNAL ROM at $E000, +1 per number. With $0384 it is the generator's whole state: a recording stores the pair at $A540/$A541 ($5BD3) and the demonstration loads it back ($5DF2), so the replay meets the same luck."
  },
  {
   "address": 900,
   "type": "line",
   "text": "Random numbers ($2B9E): offset into the KERNAL ROM at $E800, -3 per number. The number is ROM[$F000 + ROM[$E000 + $0383]] EOR ROM[$E800 + $0384]; with $01 = $36 the CPU reads the ROM, not the title data in the RAM beneath."
  },
  {
   "address": 901,
   "type": "line",
   "text": "Random numbers: $2B9E keeps the caller's X here ($2B9E) and restores it on exit ($2BC0)."
  },
  {
   "address": 902,
   "type": "line",
   "text": "Random numbers: $2B9E keeps the caller's Y here ($2BA1) and restores it on exit ($2BC3)."
  },
  {
   "address": 903,
   "type": "line",
   "text": "Input ($0CC6): 1 while fire on joystick port 2 or SPACE ($0D15) is held, else 0. The demonstration writes recorded fire into it ($18AE). Read by the menu ($133A, $137E), the move loop ($0904), the title and every wait for fire."
  },
  {
   "address": 904,
   "type": "line",
   "text": "Input: horizontal direction, $FF left, 0, 1 right, from joystick port 2 ($0CD5-$0CE4), then SHIFT (1) and the Commodore key ($FF) override it ($0CEA). The move adds it to the player's $3FF0 ($0D60); a wall collision flips its sign ($0F95); in a menu it moves the cursor one item ($13A1)."
  },
  {
   "address": 905,
   "type": "line",
   "text": "Input: vertical direction, $FF up, 0, 1 down, from joystick port 2, then H ($FF) and B (1) override it ($0CFF). The move adds it to the player's $4030 ($0D7E); flipped by a wall collision; in a menu it moves the cursor a row ($13E6); down (B) on the controls screen shows the instructions ($5C82)."
  },
  {
   "address": 906,
   "type": "line",
   "text": "Scratch byte shared by many routines: the game-over wait's low count ($0882-$0893); a row counter in the view scroll ($0E79-$0F1B); the saved index in the view draw ($0F6F); the sprite enable bit being placed by the multiplexer ($0FF4-$10CF); the column distance in the heading finder ($219B); the monster being stepped ($225F-$22F5); damage in a monster's attack ($2481-$24D0) and the player's ($2B08-$2B49); the alternative tried in a monster's step ($2569-$2614)."
  },
  {
   "address": 907,
   "type": "line",
   "text": "Set to 1 when the player moves into another tile ($0DA0, $0DF6, $0E51, $0EC3) and by the rebuild $0B05. The next ray ($0B34) clears it, restarts the sweep count $039F and empties the view arrays ($0F45), whose cells are relative to the tile the player was in."
  },
  {
   "address": 908,
   "type": "line",
   "text": "Turn step ($08CC): counts 0-5 while the step casts one ray ($0B25) and ticks every monster ($2205) six times, before the clock, spell upkeep, player's move and sprites."
  },
  {
   "address": 909,
   "type": "line",
   "text": "Sprite-to-background collisions of the top and menu bands: band 2 of the play interrupt ORs $D01F into it every frame ($27BB; band 0 reads $D01F only to clear it). Bit 0 means the player's dot, sprite 0, touched a wall pixel: the move then reverses the direction for one step ($0AD3, $0F95), and fire cannot end the move while it is set ($091C)."
  },
  {
   "address": 910,
   "type": "line",
   "text": "Scratch byte: the sprite enable mask the multiplexer builds ($1001-$10FC, then $3A10); the game-over wait's middle count ($0885, $0898); names printed so far in INVENTORY ($1A96-$1ADD); the row distance in the heading finder ($21BE-$21FE, $212D); cleared by a monster's step ($256F)."
  },
  {
   "address": 911,
   "type": "line",
   "text": "Scratch byte: the game-over wait's top count, which returns to the title at 10 ($089D-$08A5); low byte of player - $CD - object map address in the multiplexer ($1023-$1061); the item in INVENTORY ($1AAD); the larger distance in the heading finder ($211F-$2177); low byte of the 'from' address given to it ($2384, $23B2, $23D8)."
  },
  {
   "address": 912,
   "type": "line",
   "text": "Scratch byte: high byte of the multiplexer's map-address difference, made into a row offset ($102B-$1073); names printed so far in LOOK IN ($2053-$2095); the smaller distance in the heading finder ($2133-$217B); high byte of the 'from' address given to it ($238A, $23B8, $23DE)."
  },
  {
   "address": 913,
   "type": "line",
   "text": "Scratch byte: sprite register offset (2 x slot) of the next multiplexed sprite ($0FF9-$10D5); low byte of the 'to' map address given to the heading finder ($2390, $23BE, $23E4; read at $21A3, $21D9)."
  },
  {
   "address": 914,
   "type": "line",
   "text": "Scratch byte: the object's column offset ($1046) and then the glyph row count of the sprite copy ($10B6-$10C8) in the multiplexer; in the heading finder the high byte of the 'to' address made into a row ($2396-$21E8), then the 4-bit case that indexes the heading table $4947 ($2116-$2194)."
  },
  {
   "address": 915,
   "type": "line",
   "text": "Scratch byte: the sprite slot 0-6 the multiplexer is filling, which stops at 7 ($0FFC-$10ED); in the heading finder the ratio of the larger to the smaller distance ($215F-$2185, $20 when the smaller is 0), 2 or more meaning mostly straight."
  },
  {
   "address": 916,
   "type": "line",
   "text": "Sprite multiplexer ($0FEF): the object (1-63) to consider first. Each call gives sprites 1-7 to the first seven objects in view ($3EB0) from here, wrapping 63 to 1, and saves where it stopped ($1102), so more than seven take turns. 1 at game start ($09E7)."
  },
  {
   "address": 917,
   "type": "line",
   "text": "Menu window: low byte (with $0396) of the screen address where $1151 prints the next line; set to the window's corner $03C5 by $1106 and advanced by the item width $03BE per line ($1186)."
  },
  {
   "address": 918,
   "type": "line",
   "text": "Menu window: high byte of the next line's screen address ($0395), from $03C6."
  },
  {
   "address": 919,
   "type": "line",
   "text": "Menu window: lines printed so far, 0 after $1106 clears the window. $1151 stores each line's value at $41C8 + this count and prints nothing once it equals the capacity $03BF; handlers test it for an empty list ($19B9, $1B33)."
  },
  {
   "address": 920,
   "type": "line",
   "text": "Menu cursor: the item it was on before the last move ($1393), put back if the move lands on an empty cell ($143F)."
  },
  {
   "address": 921,
   "type": "line",
   "text": "Menu cursor: index of the highlighted item, 0 = the first line ($132C); moved by the stick ($13A8-$1434); on fire $147C returns $41C8 + this."
  },
  {
   "address": 922,
   "type": "line",
   "text": "Turn steps per pixel the player moves: 2 for WALK ($08B0), 1 for RUN ($08B9); reloads the countdown $039C. The menu never offers WALK, so in practice it is 1."
  },
  {
   "address": 923,
   "type": "line",
   "text": "PICK UP ($195C): the item 1-32 being checked; those on the player's tile are listed with their pictures."
  },
  {
   "address": 924,
   "type": "line",
   "text": "Countdown to the player's next pixel of movement: $0ABF decrements it every turn step and moves the player at 0, reloading it from $039A. 1 at game start ($09E4). $039D-$039E are not used."
  },
  {
   "address": 927,
   "type": "line",
   "text": "Rays cast in the current sweep of the view, 1-29. At 29 ($0B4A) the sweep is drawn into the view window ($0F58), the objects in view are found again ($0FAA) and the view arrays are emptied for the next sweep ($0F45). Cleared with $038B."
  },
  {
   "address": 928,
   "type": "line",
   "text": "Frame counter: +1 per frame in band 2 of the play interrupt ($27B8). The move loop waits for it to change ($0914, $0ACA, $0AF1), so the player moves at most one pixel a frame."
  },
  {
   "address": 929,
   "type": "line",
   "text": "Frame counter value at the player's last pixel of movement ($0AFC); $0ACA waits for $03A0 to differ from it."
  },
  {
   "address": 930,
   "type": "line",
   "text": "PICK UP: the load total. Starts at the chosen item's weight ($4A01, $19EF); $2883 adds everything the player carries, with the contents of carried containers, and everything inside the chosen item. 70 or more ($1A03) refuses it with the message at $46B2."
  },
  {
   "address": 931,
   "type": "line",
   "text": "Message window: column 0-26 of the bottom line where the next word goes; 0 after a scroll ($293D) or a clear ($28D9)."
  },
  {
   "address": 932,
   "type": "line",
   "text": "Message printer ($2941): first the column the next word would end at, to decide whether to scroll first ($2976), then the column being written ($29A1)."
  },
  {
   "address": 933,
   "type": "line",
   "text": "Message printer: index of the next byte of the current word in the string at $F9/$FA ($295E-$29BE)."
  },
  {
   "address": 934,
   "type": "line",
   "text": "Message printer: colour of the characters it writes ($29AD). A byte below $20 in a string sets it to that byte's low nibble ($29E3), so the $10 before every verb prints the verb in black. 1, white, at game start ($09ED)."
  },
  {
   "address": 935,
   "type": "line",
   "text": "The object an action is about: the item or creature chosen in a submenu (PICK UP, PUT DOWN, WEAR, TAKE OFF, PUT IN, TAKE OUT, LOOK IN, ATTACK, EXAMINE, DRINK, a spell's target), the spell chosen in CAST ($2E4D), the monster attacking ($2404); elsewhere a loop's saved index ($16B3, $177F)."
  },
  {
   "address": 936,
   "type": "line",
   "text": "A second object or an amount: the container chosen in PUT IN ($1EAC), each item found in LOOK IN ($2065), the weapon in the right hand for ATTACK, 0 bare-handed ($2A95), the weapon an attacking monster carries ($2422-$245A), the damage passed to the spell hit $3AC7 ($3AC7)."
  },
  {
   "address": 937,
   "type": "line",
   "text": "Menu builder ($128F): items 1-32 on the player's tile; PICK UP is offered when non-zero ($11B7)."
  },
  {
   "address": 938,
   "type": "line",
   "text": "Menu builder: carried items that can be worn ($4A81) and are not worn ($4AC1 = 0); WEAR when non-zero."
  },
  {
   "address": 939,
   "type": "line",
   "text": "Menu builder: carried containers ($4A41); TAKE OUT and LOOK IN when non-zero, PUT IN too if a hand is full."
  },
  {
   "address": 940,
   "type": "line",
   "text": "Menu builder: carried items being worn ($4AC1 = 2); TAKE OFF when non-zero."
  },
  {
   "address": 941,
   "type": "line",
   "text": "Menu builder: hands holding something, 0-2 ($4C01, $4C02 not $FF); PUT DOWN and SWAP when non-zero."
  },
  {
   "address": 942,
   "type": "line",
   "text": "Menu builder: creatures $21-$3F on the player's tile, dead ones too ($1305-$131D); ATTACK when non-zero."
  },
  {
   "address": 943,
   "type": "line",
   "text": "Turn steps the chosen verb still takes: $4C27 + option on each choice ($0833); the step loop at $08CC counts it down ($090E) and returns to the menu at 0. For WALK and RUN it is 0 and the loop runs until fire."
  },
  {
   "address": 944,
   "type": "line",
   "text": "Message window: low byte of its top-left screen address, $5C ($09FC): $045C, row 2 column 12."
  },
  {
   "address": 945,
   "type": "line",
   "text": "Message window: high byte of the top-left address, $04 ($0A01)."
  },
  {
   "address": 946,
   "type": "line",
   "text": "Message window: width in characters, 27 ($0A06)."
  },
  {
   "address": 947,
   "type": "line",
   "text": "Message window: height in rows, 8 ($0A0B); a scroll moves rows 1-7 up one."
  },
  {
   "address": 948,
   "type": "line",
   "text": "Message window: low byte of the bottom line's address, $74 ($0A10): $0574, row 9 column 12, where text is written before the window scrolls."
  },
  {
   "address": 949,
   "type": "line",
   "text": "Message window: high byte of the bottom line's address, $05 ($0A15). $03B6 is not used."
  },
  {
   "address": 951,
   "type": "line",
   "text": "Play interrupt: which band the next interrupt is: 0 at raster $28 (top band), 1 at $8E (menu band), 2 at $B6 (picture band); set to 0 when the interrupt is installed ($2649). $03B8 is not used."
  },
  {
   "address": 953,
   "type": "line",
   "text": "Monster step ($2566): 1 when the heading taken is open only through a door (passable in the monster's table but not in $A100, $25C6); the monster then opens the door ($1BBF) and marks it to be closed behind it ($4FE2)."
  },
  {
   "address": 954,
   "type": "line",
   "text": "Monster step: the monster's index kept across the door calls ($25E5-$260D)."
  },
  {
   "address": 955,
   "type": "line",
   "text": "Status line ($2BDE): units left to draw while it draws the M bar (mind $4F46 x 2) and the B bar (body $4EC5 + 1, x 2): a full cell, glyph $29, per 8 units, then glyph $21 + the rest."
  },
  {
   "address": 956,
   "type": "line",
   "text": "Clock: counts turn steps down from 8; at 0 $2C50 adds a second to the clock on the top line ($0420-$0427). 4 at game start ($09F5)."
  },
  {
   "address": 957,
   "type": "line",
   "text": "Menu builder: carried items that can be drunk ($4B41); DRINK when non-zero."
  },
  {
   "address": 958,
   "type": "line",
   "text": "Menu window: characters per item, 10 for the main menu ($3A79) and 20 for the spell menu ($3A93); lines advance by it, so items fill each 40-column row left to right."
  },
  {
   "address": 959,
   "type": "line",
   "text": "Menu window: items it holds, 16 or 8: $1106 clears that many, $1151 stops printing there, the cursor cannot pass it."
  },
  {
   "address": 960,
   "type": "line",
   "text": "Menu window: items per screen row, 4 or 2: the cursor's step for up and down ($1407, $1431)."
  },
  {
   "address": 961,
   "type": "line",
   "text": "Menu window: first item of the bottom row, 12 or 6: down is refused from there ($13F0)."
  },
  {
   "address": 962,
   "type": "line",
   "text": "Menu window: first item of the second row, 4 or 2: up is refused before it ($141A)."
  },
  {
   "address": 963,
   "type": "line",
   "text": "Spell upkeep ($3A40): turn steps counted to 100 while a lasting spell ($57D2) is in force; by $57D9 the only lasting spell is MAGICAL SHIELD. Cleared by UNCAST ($2F3B)."
  },
  {
   "address": 964,
   "type": "line",
   "text": "Spell upkeep: hundreds of turn steps; when it reaches the spell's interval ($57D9 + spell, 1 for MAGICAL SHIELD) the player loses a point of mind ($3A66) and it restarts, so the shield costs one mind per 100 turn steps; with no mind left the spell ends ($2F22)."
  },
  {
   "address": 965,
   "type": "line",
   "text": "Menu window: low byte of its top-left screen address, $E0 ($09D7): $05E0, row 12 column 0."
  },
  {
   "address": 966,
   "type": "line",
   "text": "Menu window: high byte of the top-left address, $05 ($09DC)."
  },
  {
   "address": 967,
   "type": "line",
   "text": "0 while the game runs. 1 when the player dies ($24E7) or a demonstration or recording ends ($17C5-$191D); $7B when the amulet is put down on the pedestal's tile ($1B96). The main loop ($0827, $084C) and the menu ($1332) stop on it; $7B selects the ending text and tune 2."
  },
  {
   "address": 968,
   "type": "line",
   "text": "Counts turn steps to 50 ($3B87); then creatures $22, $23, $2A, $2B, $2E, $33 and $35 get new random destinations ($4CAE/$4CCD)."
  },
  {
   "address": 969,
   "type": "line",
   "text": "View rebuild ($0B05): counts the 30 rays it casts at once (every direction and two more)."
  },
  {
   "address": 970,
   "type": "line",
   "text": "Picture strip ($1515): the object being shown ($155E), then its picture number from $582B ($15C5)."
  },
  {
   "address": 971,
   "type": "line",
   "text": "Picture strip: the slot 0-11 the picture goes in ($1561)."
  },
  {
   "address": 972,
   "type": "line",
   "text": "Picture strip: the object's size flag passed in A (its $586F): 0 one slot, four character rows; non-zero two slots, eight rows ($1515)."
  },
  {
   "address": 973,
   "type": "line",
   "text": "Picture strip: character rows to copy, 4 or 8 ($1518-$1524)."
  },
  {
   "address": 974,
   "type": "line",
   "text": "Menu cursor: blink timer 0-29; the highlighted item is coloured 0 (black) at 0 and 1 (white) at 20 ($1344-$1370)."
  },
  {
   "address": 975,
   "type": "line",
   "text": "Set to 1 for one noise burst on voice 1, a footstep: by the player every third pixel moved ($0D5D) and by a monster in view with a $59DC flag every third step ($2254). Band 1 of the interrupt plays it and clears it, when the music is off ($2778)."
  },
  {
   "address": 976,
   "type": "line",
   "text": "Counts the player's moving steps down from 3; at 0 a footstep ($03CF). 1 at game start ($09EA)."
  },
  {
   "address": 977,
   "type": "line",
   "text": "1 while the music plays: band 1 of the interrupt calls $1949 every frame ($2773); 0 lets the footstep noises through. Set by $2627 and at the end of a game ($0866), toggled by M ($0CA4)."
  },
  {
   "address": 978,
   "type": "line",
   "text": "M key debounce: 1 while M is held ($0CA1), so a press toggles the music once."
  },
  {
   "address": 979,
   "type": "line",
   "text": "Input source: 0 play; 1 recording, started by CTRL+R on the title ($5BCE): every input goes into the demonstration buffer; 2 the demonstration, started when the title scroller has run ($5BE9): input comes from the buffer ($179D)."
  },
  {
   "address": 980,
   "type": "line",
   "text": "Demonstration buffer: low byte of the current record's address (with $03D5), $42 at game start ($0A7E); it is advanced before use, so the first record is $A543."
  },
  {
   "address": 981,
   "type": "line",
   "text": "Demonstration buffer: high byte, $A5 at game start; reaching $A8 ends a recording or the demonstration ($17E6, $1867, $1912)."
  },
  {
   "address": 982,
   "type": "line",
   "text": "Demonstration: the current record's input: bit 0 right, 1 left, 2 down, 3 up, $F fire, $E end. A record is this code in the high nibble and a repeat count 0-15 in the low nibble."
  },
  {
   "address": 983,
   "type": "line",
   "text": "Demonstration: plays left of the current record; $FF means read the next one ($189B, $193A)."
  },
  {
   "address": 984,
   "type": "line",
   "text": "Set when a demonstration ends, by fire, its end record or the buffer's end: the game then goes straight back to the title ($0876) without the game-over wait."
  },
  {
   "address": 985,
   "type": "line",
   "text": "Title: set to 2 by the title interrupt when the scroller has run once ($5DEF); the title loop then starts the demonstration ($5BE4)."
  },
  {
   "address": 986,
   "type": "line",
   "text": "Title scroller on NTSC ($02A6 = 0): counts down from 2 and the step that reaches 0 is skipped ($5DB1), so every second step is dropped. 1 at the entry ($0815)."
  },
  {
   "address": 987,
   "type": "line",
   "text": "Music on NTSC: counts down from 6 and the tick that reaches 0 is skipped ($194E), keeping PAL tempo at 60 frames a second. $03DC-$03FF are left over from the crack's decruncher (same bytes as at the entry) and not used."
  },
  {
   "address": 1037,
   "type": "line",
   "text": "Screen row 0, columns 13-20: the M (mind) bar, 8 cells drawn by $2BDE from the player's mind $4F46 (glyphs $21-$29)."
  },
  {
   "address": 1047,
   "type": "line",
   "text": "Screen row 0, columns 23-30: the B (body) bar, 8 cells drawn by $2BDE from the player's body strength $4EC5."
  },
  {
   "address": 1056,
   "type": "line",
   "text": "Clock on the status line, tens of hours: '0'-'9', back to '0' after 99 hours ($2CBF-$2CD0)."
  },
  {
   "address": 1057,
   "type": "line",
   "text": "Clock: units of hours ($2CAF-$2CC4)."
  },
  {
   "address": 1059,
   "type": "line",
   "text": "Clock: tens of minutes, '0'-'5' ($2C9A-$2CAC)."
  },
  {
   "address": 1060,
   "type": "line",
   "text": "Clock: units of minutes ($2C85-$2C97)."
  },
  {
   "address": 1062,
   "type": "line",
   "text": "Clock: tens of seconds, '0'-'5' ($2C70-$2C82)."
  },
  {
   "address": 1063,
   "type": "line",
   "text": "Clock: units of seconds, +1 every 8 turn steps ($2C5B, $03BC)."
  },
  {
   "address": 1229,
   "type": "line",
   "text": "The view window's centre cell, row 5 column 5: the player's tile. When it holds a door ($F0-$FF) the menu offers OPEN (bit 0 clear) or CLOSE (bit 0 set) ($11E5)."
  },
  {
   "address": 1984,
   "type": "line",
   "text": "Screen row 24: the title's scrolling line; the title interrupt writes 40 characters of the story text here with colour 7 ($5E15)."
  },
  {
   "address": 2040,
   "type": "line",
   "text": "Sprite pointers of the screen at $0400, $07F8-$07FF: $E0-$E7 ($0A6B), so band 0's sprites take their shapes from $3800-$39FF; sprite 0 is set again at $0D40. Until the game sets them, $07F9-$07FF hold the entry code."
  },
  {
   "address": 2041,
   "type": "line",
   "text": "Entry: the game's first instruction, where the crack's trainer jumps (JMP $07F9). At load these seven bytes are 78 D8 A2 FF 9A A9 2F: SEI, CLD, LDX #$FF, TXS (an empty stack), LDA #$2F, followed by the STA $00 at $0800. They lie in the sprite-pointer bytes of the top band's screen ($0400), and new_game overwrites them with the pointers $E0-$E7 ($0A66 loop), so every snapshot taken in play shows E1-E7 here (typed as bytes for that reason). Runs once per power-on: the reset and RESTORE vectors of the CBM80 block at $8000 point at restart ($0818), not here."
  },
  {
   "address": 2048,
   "type": "line",
   "text": "Two bytes that held 85 00 at load: the entry's STA $00, which puts the $2F loaded at $07FE into the 6510's data direction register. BASIC's RAM initialisation, called at $0809, then stores a zero at the bottom of BASIC memory (STA ($2B),Y at $E419 in the ROM, $2B/$2C from MEMBOT), which replaces the $85: entry-07f9.vsf has 85 here, every later snapshot 00. The instruction has run by then and nothing executes these bytes again."
  },
  {
   "address": 2050,
   "type": "line",
   "text": "Entry, continued: $01 = $37 (BASIC, I/O and KERNAL visible), JSR $E544 (KERNAL: clear the screen), JSR $E3BF (BASIC: initialise its RAM and zero page), $CC = 1 (the KERNAL interrupt, which the play interrupt ends in, then never flashes a cursor: $EA34 skips the blink while $CC is non-zero), and $03DB = $03DA = 1, the NTSC frame-skip counters of the play music tick ($1949, reloaded with 6) and of the title interrupt ($5DB1, reloaded with 2); both count only when $02A6 = 0, an NTSC machine. Set once per power-on. Falls into restart."
  },
  {
   "address": 2072,
   "type": "line",
   "text": "Restart: where the entry falls through, where the game-over wait jumps, and the target of both CBM80 vectors ($8000 cold, $8002 warm), so a reset or RESTORE lands here too (the KERNAL's $FCE2 and $FE47 test for CBM80 and JMP through them). Clears bit 0 of $01 ($37 becomes $36: BASIC ROM out, so the game's data under it at $A000-$BFFF reads as RAM), runs the title, story scroller, demonstration and controls screen (JSR $5B27: it returns when a game is to start, after the controls screen; with $03D3 = 2 when the scroller has run and the demonstration is to be played by the main loop; or with $03D3 = 1, the input recorder, after CTRL+R on the title), sets up a new game (JSR $0924) and falls into main_loop. The stack pointer is not reset here."
  },
  {
   "address": 2084,
   "type": "line",
   "text": "Main loop, once per menu choice: redraws the M(ind) and B(ody) bars (JSR $2BDE); if the game is over ($03C7 non-zero) goes to game_over; otherwise the menu (JSR $11A2) returns the chosen verb number in A (0 WALK .. 17 UNCAST). $4C27+verb, the number of world passes the action lasts, goes to $03AF (0 for WALK and RUN, which last until fire); $4C3A+verb (twice the verb) indexes the handler table at $4C03, and the handler's address is written into the operand of the JSR at $0846 ($0847/$0848), which then calls it: a self-modifying dispatch. The operand in the snapshot is $08B9, RUN, the last verb chosen."
  },
  {
   "address": 2119,
   "type": "line",
   "text": "Low byte of the dispatch JSR's operand (the instruction at $0846), rewritten at $083D with the low byte of the chosen verb's handler from $4C03,x. $46 at load, when the instruction reads JSR $0846, a call to itself that the main loop never lets run; $B9 in the snapshot (RUN, $08B9)."
  },
  {
   "address": 2120,
   "type": "line",
   "text": "High byte of the dispatch JSR's operand, rewritten at $0843 from $4C04,x, the handler table's high bytes. $08 at load and in the snapshot, where RUN ($08B9) was the last verb chosen."
  },
  {
   "address": 2121,
   "type": "line",
   "text": "After the verb's handler returns: runs the world for the action's time (JSR $08CC, run_world), then goes round main_loop again while the game is not over ($03C7 = 0)."
  },
  {
   "address": 2129,
   "type": "line",
   "text": "Game over ($03C7 non-zero). $7B is the win, set at $1B96 when the amulet (object $15) is put down while the player stands on the pedestal's map cell $9677: the ending at $5A5C ('WITH A SUDDEN FLASH OF CRIMSEN LIGHT THELRIC APPEARS...') is printed in the message window and tune 2 starts (JSR $C000, A = 2; HVSC's third tune, 'Game beaten'). Any other value, 1 for a death ($24E7, body strength below zero) or for a game stopped by the demonstration or the input recorder, starts tune 1 (HVSC's 'Game Over (You're dead)'). Both set $03D1 = 1 so the interrupt plays it."
  },
  {
   "address": 2166,
   "type": "line",
   "text": "Waits before going back to the title. If the demonstration ended the game ($03D8 set at $1892, $18CA or $1920: fire pressed during it, its end code, or the end of its buffer) it restarts at once. Otherwise it waits 256 rounds of the delay routine (JSR $0F35, A = $FF: about 1.7 s on PAL), clears a 24-bit count ($038A/$038E/$038F) and polls the stick and keys (JSR $179D) until fire, when it waits for the release (JSR $5E29) and restarts, or until the count reaches $0A0000, 655,360 polls (about 135 cycles each: roughly a minute and a half on PAL by the cycle count, not measured), when it restarts anyway."
  },
  {
   "address": 2224,
   "type": "line",
   "text": "WALK handler, verb 0: $039A = 2, so the player's movement tick ($0ABF) runs on every second world pass instead of every pass, and clears the picture strip (JSR $149E); unlike RUN it prints nothing. Nothing in this build offers it: the main menu builder ($11B4-$1288) adds verbs 1-17 only, each with an immediate string pointer, and no code loads WALK's string at $4130 (byte scan of the image). Only the handler table's entry 0 ($4C03) points here."
  },
  {
   "address": 2233,
   "type": "line",
   "text": "RUN handler, verb 1: $039A = 1, so the movement tick ($0ABF) runs on every world pass; clears the picture strip (JSR $149E) and prints 'RUN' ($4136, its first byte $10 sets text colour 0) and then '.' and a new line (JSR $29F1) in the message window. Its time in $4C27 is 0, so run_world keeps the player moving until fire is pressed."
  },
  {
   "address": 2252,
   "type": "line",
   "text": "Runs the world after a verb, one pass per round: six times one ray of the line-of-sight view (JSR $0B25) followed by the creatures' timers and actions (JSR $2205; $038C counts the six); $3B87 (every 50th pass, new random map destinations for seven creatures); the M and B bars ($2BDE); an immediate return if the game is over; the game clock ($2C50: one second per 8 passes, so the clock counts passes and stands still in the menu); the active spell's mind drain ($3A40); only while WALK or RUN runs ($03AF = 0) the player's movement tick ($0ABF) and the picture strip ($1695); the sprites of the visible objects and creatures ($0FEF); and $20BC, which moves any creature, then the player, standing on map cell $B1, $A3 or $B2 by 32 map cells. Then, if fire is down ($0387), it waits for the next frame and returns to the menu unless the player's sprite is touching a wall (bit 0 of $038D), which keeps it going; otherwise WALK and RUN go round until fire, and any other verb until $03AF, its time in passes, has counted down to 0. Only the movement tick polls the input in this loop, so only WALK and RUN can see fire here: a timed verb always runs its full count (live, INVENTORY: 12 passes with fire held and without)."
  },
  {
   "address": 2340,
   "type": "line",
   "text": "New game, part 1 (called from restart): zeroes the game-over flag $03C7, the ray index $0380 and ray count $039F, $03D8 (demonstration ended), the new-cell flag $038B, the spell-drain counters $03C3/$03C4, the top band's sprite expand, priority and multicolour images $3A11-$3A14 and the bottom band's sprite enable $3A30. Then, for y = 0-63 (0 the player, 1-32 objects, 33-63 creatures): map address back to the starting one ($3EF0/$3F30 into $3F70/$3FB0), in-cell pixel 4,4 ($3FF0/$4030, the cell's middle), $40B0 = $FF (no movement direction), $4AC1 = 0 (neither worn nor in a container), the action timer $4BC1 = 0, body strength $4EC5 = its starting value $4E85, mind $4F46 = the maximum $4F05 (only entry 0's is shown, as the M bar), the footstep counter $5A1C = 1, and $4CEC,y = $4D0B,y = 0. Those two are creature-only tables (read with y = $21-$3F: the pursuit flags set at $237D/$2377 when a creature sees the player), so the 64-byte loops clear $4CEC-$4D4A: their own entries ($4D0D-$4D4A) and also $4CEE-$4D0C, every creature's wander-destination high byte ($4CCD,y, set by $3B87), and $4CEC-$4CED, the destination low bytes ($4CAE,y) of creatures $3E and $3F. All of that loads as zero, so only a restarted game notices. Then $4ADA = 1 (object $19, a scroll, starts in a container: its address is $0007, the backpack), no picture slot holds a bottom-band sprite ($59BD-$59C8 = $FF), no spell is active ($57D2 = $FF), the shield's defence bonus is off ($57D3 = 0), and both hands are empty ($4C02 left, $4C01 right = $FF)."
  },
  {
   "address": 2478,
   "type": "line",
   "text": "New game, part 2: closes every door in the dungeon map. Walks $9000-$9FFF through the pointer $63/$64 and clears bit 0 of every byte from $F0 to $FF that has it set; those characters are the door cells, and OPEN ($1BBF) sets bit 0 to open one. At load every door is already closed, so this matters for the second and later games."
  },
  {
   "address": 2517,
   "type": "line",
   "text": "New game, part 3: the menu's first screen cell $03C5/$03C6 = $05E0 (row 12, column 0), the main menu's layout values $03BE-$03C2 (JSR $3A79), the movement tick due on the first pass ($039C = 1), the entity-sprite scan starting at entry 1 ($0394 = 1), the player's footstep counter $03D0 = 1, text colour white ($03A6 = 1), the view cells cleared (JSR $0F45), the clock's first second after 4 passes ($03BC = 4; $2C50 reloads 8), and the message window: top left $03B0/$03B1 = $045C (row 2, column 12), 27 columns ($03B2), 8 rows ($03B3), printing on its bottom row at $03B4/$03B5 = $0574 (row 9). The LDA #$08 at $09F8 is dead: LDA #$5C replaces it at once."
  },
  {
   "address": 2584,
   "type": "line",
   "text": "New game, part 4, the play screen: multicolour characters on ($D016 bit 4), $D018 = $1C (screen $0400, characters $3000 in VIC bank 0), border blue ($D020 = 6), background yellow ($D021 = 7), character multicolours dark grey and grey ($D022 = $0B, $D023 = $0C). Prints the frame through CHROUT (JSR $2BC7 with the string at $50FA: clear screen, the top line with the M and B labels, the bars and the clock's digits, the window borders), then CHROUT $08, which sets bit 7 of $0291 so the KERNAL's scan ($EB54) no longer flips the character set on SHIFT+Commodore, both being movement keys. Clears the top band's sprite shapes $3800-$39FF, draws the player's dot into sprite 0's (rows 0-3 of $3800: $60 $F0 $F0 $60, a 4 x 4 dot in its top left corner), points sprites 0-7 at $E0-$E7 ($07F8-$07FF, shapes $3800-$39FF), marks the bottom band's eight sprites free ($59C9-$59D0 = $FF) and points them all at $94 ($ABF8-$ABFF, the shape at $A500, which spells DEAD)."
  },
  {
   "address": 2686,
   "type": "line",
   "text": "New game, part 5: the input recorder and demonstration player's state, pointer $03D4/$03D5 = $A542 (its entries are read and written from $A543 on), current input code $03D6 = 7 (a code no stick position makes, so the first input starts a new entry) and repeat count $03D7 = $FF; tune 0 starts (JSR $C000, A = 0; by HVSC's order its 'Main Theme'); the player's sprite (JSR $0D1F); the first view (JSR $0B05); the play raster interrupt (JSR $2627: $0314 = $2653, music on); the message window cleared (JSR $28AE) and Thelric's parting words printed ($46D6, 'AS YOU LEAVE THELRIC SAYS...IF YOU DO NOT BRING ME THE AMULET OF IMMORTALITY...'), then the empty string at $476E (its first byte is the terminator) and a scroll of the window (JSR $28DD); colour RAM $DA58-$DBFE from $A858-$A9FE (JSR $5CC5 with the six-byte descriptor at $57DD: source, end, destination), the bottom rows' colours; and an empty picture strip (JSR $149E)."
  },
  {
   "address": 2751,
   "type": "line",
   "text": "The player's movement tick, called on every world pass while WALK or RUN runs. Counts $039C down and acts only when it reaches 0, reloading it from $039A (1 for RUN: every pass; 2 for WALK: every other pass). Waits until the frame counter $03A0 has moved on from the frame of the previous tick ($03A1); then, with interrupts off, if the player's sprite touched the background graphics since then (bit 0 of $038D, where band 2 of the interrupt collects $D01F) clears the flag and reverses the step direction (JSR $0F95), else reads the stick and keys (JSR $179D). Moves the player one pixel (JSR $0D44), clears $038D, waits for the next frame, notes it in $03A1 and clears $038D again, so the next tick judges only frames drawn with the new position. Walls are found by the VIC's sprite-background collision, not by reading the map."
  },
  {
   "address": 2821,
   "type": "line",
   "text": "Rebuilds the whole view at once: at the start of a game and after PICK UP, PUT DOWN, OPEN and CLOSE ($1A2C, $1B99, $1BBB, $1CFC), when doors or objects have changed. Sets the ray index $0380 to 27 so the next ray is ray 0, sets $038B so the sweep restarts, and casts 30 rays (JSR $0B25, $03C9 counting); the 29th draws the completed view and finds what is visible. Then places the sprites of the visible objects and creatures (JSR $0FEF)."
  },
  {
   "address": 2853,
   "type": "line",
   "text": "Casts one ray of the line-of-sight view. The ray index $0380 steps through 0-27, 28 directions clockwise from straight up. After the player has entered a new cell ($038B set) the sweep restarts: $039F = 0 and the view cells are cleared (JSR $0F45). $039F counts rays; on the 29th the view gathered so far is drawn (JSR $0F58), the visible entities found (JSR $0FAA) and the cells cleared for the next sweep. The ray starts at the player's exact pixel (in-cell x/y from $3FF0/$4030 into $F7/$F8, map address $3F70/$3FB0 into $F9/$FA, view index $BB = 60, the centre of the 11 x 11 window), records the player's cell (JSR $0C77), then takes up to 56 one-pixel steps ($0381) repeating the ray's seven-step pattern at $3BF7 + $3BCB[ray] (0 up, 1 down, 2 left, 3 right, $FF pause; $0382 is the position in it). A step into another cell moves the map address by 1 or $80 (the map is 128 cells wide) and the view index by 1 or 11, and records that cell. After each step the pixel is tested on the cell's character glyph ($A200/$A300 point into the character set at $3000, $3BEF holds the pixel-pair masks): a pair of value %10, or %11 in a character whose colour ($A400) is $0F (every closed door, $F0-$FE even, has it), stops the ray. No pattern moves more than 5 pixels per axis in 7 steps, so a ray reaches at most 5 cells out and stays inside the window."
  },
  {
   "address": 3191,
   "type": "line",
   "text": "Records the cell a ray has reached, unless the ray's step count $0381 has reached 56 ($38): the map byte there (a character code) into $3E37[$BB] and its map address into $3D45[$BB] (low) and $3DBE[$BB] (high), $BB being the cell's index in the 11 x 11 view. Returns with Y = 0."
  },
  {
   "address": 3220,
   "type": "line",
   "text": "Reads the player's input, with the M key first (called only from $179D). M ($C5 = $24, the KERNAL's current key) toggles the music flag $03D1 once per press ($03D2 remembers that M is down until another key or none is seen). Switching off stops the tune: JSR $C003 asks the driver to stop and JSR $C006 runs it once, which silences the three voices; switching on restarts tune 0 (JSR $C000, A = 0). The play interrupt plays the music while $03D1 is set and the footstep noise ($03CF) only while it is clear. Falls into input_read."
  },
  {
   "address": 3270,
   "type": "line",
   "text": "Reads joystick port 2 ($DC00, active low: bit 0 up, 1 down, 2 left, 3 right, 4 fire) into $0389 (y: -1 up, +1 down), $0388 (x: -1 left, +1 right) and $0387 (fire: 1 pressed), then lets the keyboard override, from the KERNAL's scan: $028D = 1 (SHIFT alone) sets x = +1 and $028D = 2 (the Commodore key alone) x = -1; $C5 = $1D (H) sets y = -1, $1C (B) y = +1 and $3C (SPACE) fire = 1. Only one of H, B and SPACE can count at a time, since $C5 holds a single key. B being 'down' is what the controls screen ($5C82) tests for its instructions."
  },
  {
   "address": 3359,
   "type": "line",
   "text": "Shows the player as sprite 0 of the top band (called once, from new_game): bit 0 of the sprite-enable image $3A10 set, X = $3E + in-cell x ($3FF0) into $3A00, Y = $58 + in-cell y ($4030) into $3A01, which puts the dot in the middle of the view's centre cell for in-cell 4,4; colour 7, yellow, into $3A15, and the pointer $E0 (the dot at $3800) into $07F8. The interrupt copies $3A00-$3A1C to the VIC in band 0."
  },
  {
   "address": 3396,
   "type": "line",
   "text": "Moves the player one pixel by the direction in $0388/$0389 (diagonals too). While moving, every third step ($03D0 counts 3) sets $03CF, the footstep sound the interrupt plays when the music is off. Adds x to the in-cell x $3FF0: reaching 8 or -1 means the next cell to the right or left (player_cross_right, player_cross_left); sprite 0's X image $3A00 = $3E + in-cell x. Then the same for y and $4030 (player_cross_down, player_cross_up), sprite 0's Y image $3A01 = $58 + in-cell y. The dot therefore stays in the view's centre cell while the map scrolls under it."
  },
  {
   "address": 3488,
   "type": "line",
   "text": "The player has stepped into the cell to the right: $038B = 1 (restart the view sweep), map address ($3F70/$3FB0) + 1, in-cell x = 0, and the 11 x 11 view window (columns 0-10 of rows 0-10, screen from $0400 through $9B/$9C and colour RAM from $D800 through $9D/$9E) scrolled one cell left; column 10 gets the unseen character $7F in its colour ($A47F). Back into player_step at $0D75."
  },
  {
   "address": 3574,
   "type": "line",
   "text": "The player has stepped into the cell to the left: $038B = 1, map address - 1 (borrowing into $3FB0), in-cell x = 7, and the view window scrolled one cell right (each row's columns 9 down to 0 moved up by one); column 0 gets the unseen character $7F. Back into player_step at $0D75."
  },
  {
   "address": 3665,
   "type": "line",
   "text": "The player has stepped into the cell below: $038B = 1, map address + $80 (one map row, 128 cells), in-cell y = 0, and the view window scrolled up one row: rows 1-10 copied to rows 0-9 through the offset tables $3D00 (source column + 40) and $3CBB (destination column), ten rows counted in $038A; row 10 gets the unseen character $7F. Back into player_step at $0D96."
  },
  {
   "address": 3779,
   "type": "line",
   "text": "The player has stepped into the cell above: $038B = 1, map address - $80, in-cell y = 7, and the view window scrolled down one row: rows 9 up to 0 copied one row lower, starting at row 9 ($0568/$D968) and counting $038A from 9 down; row 0 gets the unseen character $7F. Back into player_step at $0D96."
  },
  {
   "address": 3893,
   "type": "line",
   "text": "Busy-wait delay of A + 1 rounds, each 5 x 256 turns of a DEX loop: 6,438 cycles a round, about 6.5 ms on PAL plus whatever the interrupts take. Called with A = 5 by the menu and the title's fire waits, 1 in the menu cursor's blink, $1E after a menu move and $FF (about 1.7 s) before the game-over wait. Returns with A = $FF, X = 0, Y = 0."
  },
  {
   "address": 3909,
   "type": "line",
   "text": "Marks all 121 cells of the view as unseen: $7F into the cell characters $3E37 and into the map addresses $3D45/$3DBE, giving the address $7F7F, which no entity ever has."
  },
  {
   "address": 3928,
   "type": "line",
   "text": "Draws the view the rays have gathered: for each of the 121 cells, rows 0-10 and columns 0-10 of the screen at $0400 (row stride 40) get the character from $3E37 and colour RAM gets that character's colour from $A400; $038A keeps the cell index while X is borrowed for the colour lookup."
  },
  {
   "address": 3989,
   "type": "line",
   "text": "Reverses each non-zero part of the step direction, $0388 and $0389 (EOR #$FE turns +1 into -1 and -1 into +1), so the next step takes the player back out of the wall his sprite has touched."
  },
  {
   "address": 4010,
   "type": "line",
   "text": "Finds what the player can see, after each full sweep: clears $3EB0 (seen) and $5041 (distance) for entries 1-63, then for every one of the 121 view cells and every entry whose map address ($3F70/$3FB0) equals the cell's ($3D45/$3DBE) sets $3EB0 = 1, $5041 = the cell's distance from the centre ($5081: 8 x the distance in cells, rounded, and 1 for the player's own cell) and $4C4F/$4C8F = the player's map address, the place where that entity last saw him (read back at $238D). Carried objects (address $00xx) never match a cell."
  },
  {
   "address": 4079,
   "type": "line",
   "text": "Shows up to seven of the visible objects and creatures as sprites 1-7 of the top band (continues to $1105). The scan starts at entry $0394 and goes round 1-63, so when more than seven are visible each gets its turn. For each entry with $3EB0 set: its sprite's enable bit ($038A, shifted each time) is ORed into $038E, which starts with the player's bit and ends in $3A10; its X ($3A02+2n) = 59 + 8 dx + in-cell x and Y ($3A03+2n) = 85 + 8 dy + in-cell y, with dx, dy its cell offset from the player worked out from the two map addresses (constants $CD, 16 and the 128-cell row); its colour ($3A16+n) = $A400 of its figure character ($4070); and the figure's eight glyph bytes (from $3000 + 8 x character) are copied into the sprite's shape at $3840 + $40 n. Stops after seven or when the scan is back where it began, and saves where to start next time in $0394."
  },
  {
   "address": 4096,
   "type": "line",
   "text": "VIEW-WINDOW FIGURES, second half. The routine starts at $0FEF; this label sits on the page edge, inside the LDA #$01 at $0FFF, only so that the ledger's wall at $1000 leaves no part of the routine without an owner. From $100C it loops over objects and creatures 1-63, starting with the one saved in $0394 and wrapping from 63 to 1, and makes each one in the line of sight ($3EB0,x set) one of hardware sprites 1-7 of the top band. Its enable bit ($038A: 2, rolled left for each figure) is ORed into $038E. With d = player position - $CD - object position (16 bits in $038F/$0390; 128 map cells a row), X = $53 + 8 x (16 - (d AND $7F)) + $3FF0,x and Y = $C5 + 8 x (16 - (d >> 7)) + $4030,x, 8-bit, go to $3A02/$3A03 + 2n: that is X = 60 + 8dx + fine x (59 + 8dx from dx = +3 on, where the carry out of ADC #$53 stops reaching the next ADC) and Y = 86 + 8dy + fine y for a figure dx cells right of and dy cells below the player. Its colour, $A400 indexed by its glyph $4070,x, goes to $3A16 + n, and the glyph's 8 bytes in the character set ($3000 + 8 x glyph) are copied into the left byte of rows 0-7 of sprite block $3840 + 64n (pointers $E1-$E7). Stops after 7 figures or once round the list; the next start goes to $0394, so when more than 7 are in sight they take turns, and the enable mask, bit 0 (the player's dot) always on, goes to $3A10."
  },
  {
   "address": 4100,
   "type": "side",
   "text": "sprite 1's shape block, $3840 (pointer $E1); each next one 64 bytes on"
  },
  {
   "address": 4108,
   "type": "side",
   "text": "in the line of sight? (flags set by $0FAA)"
  },
  {
   "address": 4125,
   "type": "side",
   "text": "player position less $CD, then less the object's"
  },
  {
   "address": 4179,
   "type": "side",
   "text": "no CLC follows: this carry goes into the next ADC"
  },
  {
   "address": 4229,
   "type": "side",
   "text": "the figure's glyph"
  },
  {
   "address": 4233,
   "type": "side",
   "text": "colour of that glyph"
  },
  {
   "address": 4270,
   "type": "side",
   "text": "glyph bytes at $3000 + 8 x glyph"
  },
  {
   "address": 4281,
   "type": "side",
   "text": "8 glyph bytes into the sprite's left column, 3 bytes apart"
  },
  {
   "address": 4326,
   "type": "side",
   "text": "next object; 63 wraps to 1"
  },
  {
   "address": 4348,
   "type": "side",
   "text": "enable mask into the top band's $D015 image"
  },
  {
   "address": 4358,
   "type": "line",
   "text": "MENU CLEAR: blanks the menu area and empties the list of entries. Fills $03BF slots of $03BE characters from screen address $03C5/$03C6 ($05E0, text row 12) with spaces and the same cells of colour RAM ($D400 above the screen address) with 1, white; then points the next-entry address $0395/$0396 at the first slot and sets the entry count $0397 to 0. Either layout covers rows 12-15: 16 slots of 10 characters, four to a row (set by $3A79: the main menu and every submenu but one), or 8 slots of 20, two to a row ($3A93, the CAST menu). Called before each menu is built, and by the chooser $1320 on its way out."
  },
  {
   "address": 4373,
   "type": "side",
   "text": "colour RAM: $D400 above the screen address"
  },
  {
   "address": 4433,
   "type": "line",
   "text": "MENU ADD ENTRY: adds one option to the menu being built. In: A = the value the chooser $1320 returns if it is picked (a verb number, an object or creature number, a spell number, or $FF for -NOTHING-), X/Y = address (low, high) of its zero-terminated PETSCII name. A is stored at $41C8 + the entry count $0397 first, even when the menu is already full ($0397 = $03BF): then it lands one past the slots and nothing is drawn. Otherwise the name is copied into the next slot ($0395/$0396) as screen codes: bytes $00-$1F (the $10 that starts each verb string) are skipped, and by the signed test so are $A0-$FF; $40-$7F lose $40; copying stops at the zero or after $03BE characters. Then the slot address moves on by $03BE and $0397 counts the entry."
  },
  {
   "address": 4440,
   "type": "side",
   "text": "stored before the full test"
  },
  {
   "address": 4467,
   "type": "side",
   "text": "signed tests: $00-$1F and $A0-$FF are skipped"
  },
  {
   "address": 4507,
   "type": "side",
   "text": "INC leaves the carry alone: this tests CMP #$20's carry"
  },
  {
   "address": 4514,
   "type": "line",
   "text": "MAIN MENU: offers the options that fit the moment and returns the one chosen, 1-17 in A, numbered as the verb strings at $4130: 1 RUN, 2 PICK UP, 3 PUT DOWN, 4 INVENTORY, 5 OPEN, 6 CLOSE, 7 WEAR, 8 TAKE OFF, 9 PUT IN, 10 TAKE OUT, 11 LOOK IN, 12 ATTACK, 13 SWAP, 14 EXAMINE, 15 DRINK, 16 CAST, 17 UNCAST (0, WALK, is never offered). First redraws the picture strip ($149E empties it, $1695 shows what is in sight), counts the situation ($128F) and clears the menu ($1106); then adds with $1151, in this order: RUN always; PICK UP if an object lies on the player's cell; PUT DOWN and SWAP if either hand holds something; INVENTORY always; OPEN or CLOSE if the glyph under the player ($04CD, the centre of the view window) is a door, $F0-$FF: bit 0 clear (shut) gives OPEN, set gives CLOSE; WEAR if a wearable object is held; TAKE OFF if something is worn; if a container is carried, PUT IN (only with something in hand), TAKE OUT and LOOK IN; ATTACK if a creature shares the player's cell; EXAMINE always; DRINK if a potion is carried; CAST if no lasting spell is in force ($57D2 = $FF), else UNCAST (only MAGICAL SHIELD lasts, by $57D9, so while it is up nothing else can be cast). So a new game's menu is RUN INVENTORY EXAMINE CAST and options appear as the game goes on. Ends in the chooser $1320, whose result it returns."
  },
  {
   "address": 4581,
   "type": "side",
   "text": "glyph under the player: centre of the 11 x 11 view"
  },
  {
   "address": 4584,
   "type": "side",
   "text": "signed test: $F0-$FF pass as doors, and so would $00-$6F"
  },
  {
   "address": 4588,
   "type": "side",
   "text": "door bit 0: 0 shut (OPEN), 1 open (CLOSE)"
  },
  {
   "address": 4715,
   "type": "side",
   "text": "lasting spell in force; $FF none"
  },
  {
   "address": 4751,
   "type": "line",
   "text": "MAIN MENU CONDITIONS: counts what the main menu's options depend on. Zeroes $03A9-$03AE and $03BD. For objects 1-32: one at the player's map position ($3F70/$3FB0 equal to entry 0's) counts in $03A9 (PICK UP); one carried by the player (position 0: a position below $40 is the number of whoever holds it, so things in the backpack do not count) counts in $03AA if wearable ($4A81) and loose ($4AC1 = 0, in a hand: WEAR), in $03AB if a container ($4A41; among objects 1-32 only the backpack: PUT IN, TAKE OUT, LOOK IN), in $03AC if worn ($4AC1 = 2: TAKE OFF) and in $03BD if drinkable ($4B41, the potions: DRINK). $03AD counts the hands holding something ($4C01 right, $4C02 left; $FF is empty: PUT DOWN, SWAP, PUT IN). $03AE counts creatures 33-63 on the player's cell, dead or alive (ATTACK)."
  },
  {
   "address": 4776,
   "type": "side",
   "text": "objects 1-32 on the player's cell"
  },
  {
   "address": 4795,
   "type": "side",
   "text": "position 0: carried by the player"
  },
  {
   "address": 4869,
   "type": "side",
   "text": "creatures 33-63 on the player's cell, alive or dead"
  },
  {
   "address": 4896,
   "type": "line",
   "text": "MENU CHOOSER, used by the main menu and every submenu: the player picks a slot with the stick and fire, and its value from $41C8 comes back in A. The cursor starts on slot 0 ($0399 = 0; $9B/$9C = its screen address, from $03C5/$03C6), so the main menu opens on RUN. Waits for fire to be released, then loops: the cursor slot blinks, colour 0 (black) for 20 passes and 1 (white) for 10 (counter $03CE; $1483 does the colouring), each pass waiting $0F35 with A = 1 and reading the input through $179D. Stick right or left moves one slot (as far as index $03BF, back to 0), down or up one row, 40 characters and $03C0 slots (down while the index is below $03C1, up from $03C2 on); x is tested before y. A move onto a slot whose first character is a space is refused ($0398 keeps the old index); each accepted move waits $0F35 with A = $1E before the next. Fire, or the game ending ($03C7), leaves: waits $0F35 with A = 5 and for fire to be released, clears the menu ($1106) and returns $41C8 + slot. Nothing here advances the clock ($2C50 runs only in the step loop, at $08ED), which is why the clock stops while a menu is up."
  },
  {
   "address": 4911,
   "type": "side",
   "text": "wait for fire to be released"
  },
  {
   "address": 4942,
   "type": "side",
   "text": "one pass of the blink loop"
  },
  {
   "address": 5032,
   "type": "side",
   "text": "right: allowed up to index $03BF, one past the last slot"
  },
  {
   "address": 5175,
   "type": "side",
   "text": "first character a space: an empty slot, refuse the move"
  },
  {
   "address": 5215,
   "type": "side",
   "text": "auto-repeat delay after a move"
  },
  {
   "address": 5223,
   "type": "side",
   "text": "chosen: wait for fire to be released"
  },
  {
   "address": 5247,
   "type": "side",
   "text": "the chosen slot's value"
  },
  {
   "address": 5251,
   "type": "line",
   "text": "MENU COLOUR SLOT: colours the menu slot whose screen address is in $9B/$9C by writing A to its $03BE colour-RAM bytes, $D400 above the screen address. The chooser uses 0, black, for the cursor and 1, white, to put a slot back. $9C is restored afterwards; X and Y are overwritten."
  },
  {
   "address": 5278,
   "type": "line",
   "text": "PICTURES CLEAR ALL: empties the picture strip at the bottom of the screen. Clears all 12 slots through $14C3 (bitmap blanked, slot freed, any DEAD sprite removed), marks objects 1-67 ($58C0-$5902: objects, creatures and the four feature pseudo-objects $40-$43) as having no picture ($FF) and zeroes the counts of door and staircase pictures shown ($59F9-$59FC). Called when a game starts ($0ABB), by the main menu before it redraws the strip, by WALK and RUN, and by the handlers that build object and creature submenus."
  },
  {
   "address": 5290,
   "type": "side",
   "text": "objects 1-67: no picture"
  },
  {
   "address": 5315,
   "type": "line",
   "text": "PICTURE SLOT CLEAR: blanks picture slot X (0-11; X is kept). Its 4 character rows of 48 bitmap bytes, from $57E3/$57EF,x and $140 apart, are set to 0, the black background, so its colours need no clearing; $58B3,x = 0 marks it free. If a DEAD sprite sits on it ($59BD,x not $FF), that sprite's bit ($4960) is cleared from the bottom band's sprite enable mask $3A30 and both links, $59BD,x and $59C9 for the sprite, are set to $FF. A tall picture needs a call for each of its two slots."
  },
  {
   "address": 5332,
   "type": "side",
   "text": "a DEAD sprite on this slot?"
  },
  {
   "address": 5363,
   "type": "side",
   "text": "4 character rows of 48 bitmap bytes to 0"
  },
  {
   "address": 5397,
   "type": "line",
   "text": "PICTURE SHOW: puts object X's picture into the picture strip. In: X = object or creature (1-63, or $40-$43 for door and staircase pictures; X is kept), A = its tall flag ($586F,x). The strip has 12 slots in six columns at text columns 2, 8, 14, 20, 26 and 32, each an upper slot (even number, rows 17-20) over a lower one (odd, rows 21-24); $58B3 holds each slot's object, 0 = free. A short picture (6 x 4 cells) takes the first free slot, a tall one (6 x 8, $03CD = 8) the first free upper slot whose lower slot is free as well; with none free it returns and the object stays without a picture. Records $58B3 (both slots when tall) and $58BF,x = slot. A dead creature (33-63 with bit 7 of its body strength $4EC5,x set) also gets a free bottom-band sprite ($59C9 = $FF; there are 8) showing the word DEAD (shape $A500), placed from $59D1/$59DD with the X high bit from $59E9 for the slot, and switched on in $3A30/$3A3D. Then copies picture $582B,x out of the picture sheet: screen colours ($5941/$5960 to $57FB/$5807, in the $A800 matrix), colour RAM ($597F/$599E to $5813/$581F) and bitmap ($5903/$5922 to $57E3/$57EF), $03CD rows of each."
  },
  {
   "address": 5419,
   "type": "side",
   "text": "find a free slot (only upper slots for a tall picture)"
  },
  {
   "address": 5476,
   "type": "side",
   "text": "creatures only, 33-63"
  },
  {
   "address": 5484,
   "type": "side",
   "text": "body strength bit 7 set: dead"
  },
  {
   "address": 5569,
   "type": "side",
   "text": "object to picture number"
  },
  {
   "address": 5579,
   "type": "side",
   "text": "copy the screen colours, 6 bytes a row"
  },
  {
   "address": 5646,
   "type": "side",
   "text": "copy the colour RAM, 6 bytes a row"
  },
  {
   "address": 5713,
   "type": "side",
   "text": "copy the bitmap, 48 bytes a row, rows $140 apart"
  },
  {
   "address": 5781,
   "type": "line",
   "text": "PICTURES UPDATE: brings the picture strip up to date with what is in sight. For objects and creatures 1-63: one in sight ($3EB0,x set) with no picture ($58BF,x = $FF) gets one ($1515); one out of sight that has one loses it: the slot is cleared, the lower slot too if the picture is tall ($14C3), and $58BF,x = $FF. Then counts four kinds of glyph among the 121 cells of the 11 x 11 view window at $0400 (cells out of sight hold $7F): door glyphs $F0-$FF with bit 0 clear (shut) in $59F5, with bit 0 set and bit 1 clear (open) in $59F6, glyph $B0 in $59F7 and glyph $B3 in $59F8; then $1741 adds or removes door pictures (picture 9) and staircase pictures (picture 10) towards one per glyph counted. Called by the main menu and after each step of movement ($08FB)."
  },
  {
   "address": 5783,
   "type": "side",
   "text": "in sight?"
  },
  {
   "address": 5850,
   "type": "side",
   "text": "count door and staircase glyphs in the view window"
  },
  {
   "address": 5874,
   "type": "side",
   "text": "glyph at this view cell"
  },
  {
   "address": 5904,
   "type": "side",
   "text": "glyph $B0: shown as picture 10, the staircase"
  },
  {
   "address": 5914,
   "type": "side",
   "text": "glyph $B3: shown as picture 10 too"
  },
  {
   "address": 5942,
   "type": "side",
   "text": "feature kinds 0-3"
  },
  {
   "address": 5953,
   "type": "line",
   "text": "PICTURE SYNC FEATURE: makes the pictures shown for feature kind Y match the number counted in the view window ($59F5,y). Kinds: 0 shut door glyph, 1 open door glyph, 2 glyph $B0, 3 glyph $B3; each is drawn as pseudo-object $40-$43 ($3CFB,y), numbers used here only to index the picture tables (pictures 9, 9, 10, 10: a door and a staircase; the noun table's $40 is PEDESTAL, a different use of the number). Y is kept. While the count shown ($59F9,y) is lower, it adds one and shows the kind's picture ($1515); while higher, it takes one off, finds a slot holding that pseudo-object ($58B3) and clears it, and its lower slot too if the picture is tall ($58AF,y: the tall flags of $40-$43, $586F + $40; all four are tall). A picture that found no free slot still counts as shown."
  },
  {
   "address": 5974,
   "type": "side",
   "text": "the kind's pseudo-object, $40-$43"
  },
  {
   "address": 6045,
   "type": "line",
   "text": "READ INPUT, through the demonstration's player and recorder. Calls $0C94 (M toggles the music; joystick port 2 and the keys into $0387 fire, $0388 x, $0389 y), then acts on $03D3. 0, a normal game: returns. 2, the demonstration (set by the title code at $5BE9): real fire ends it ($03C7 = 1, $03D8 = 1, $03D3 = 0); otherwise the input is replaced from the recording through $03D4/$03D5 (bytes $A543-$A7FF, the random seed they need in $A540/$A541): each byte holds a code in its high nibble, played n + 1 times for the low nibble n; code bits 1 right, 2 left, 4 down, 8 up, $F fire, $E the end, which ends the demonstration as running into $A800 does. 1, recording (set by the title code at $5BCE, on $028D = 4 with key $11: probably CTRL+R): the real input is appended to the same buffer in the same form, a fire press as one $FA; F (key $15) writes the end mark $EF and ends the game ($03C7 = 1); a full buffer stops the recording. So the demonstration is replayed joystick input, and the recorder that made it is still in the game."
  },
  {
   "address": 6048,
   "type": "side",
   "text": "0 play, 1 recording, 2 demonstration"
  },
  {
   "address": 6061,
   "type": "side",
   "text": "key F ($15) ends the recording"
  },
  {
   "address": 6094,
   "type": "side",
   "text": "fire pressed while recording"
  },
  {
   "address": 6099,
   "type": "side",
   "text": "fire already recorded and still held: nothing to add"
  },
  {
   "address": 6128,
   "type": "side",
   "text": "record a fire press as $FA: code $F, played 11 times"
  },
  {
   "address": 6150,
   "type": "line",
   "text": "Demo recorder, fire not pressed (from $17D1): packs the stick that $0CC6 read into a state nibble built on the stack: bit 0 right ($0388 = +1), bit 1 left ($0388 = -1), bit 2 down ($0389 = +1), bit 3 up ($0389 = -1), 0 when centred. If it equals the current run's state $03D6 and the current entry's count (its low nibble, reached through $03D4/$03D5) is below 15, the count goes up by one and it returns; a full count or a new state goes on to demo_rec_new_run."
  },
  {
   "address": 6153,
   "type": "side",
   "text": "stick x: +1 right sets bit 0, -1 left sets bit 1"
  },
  {
   "address": 6171,
   "type": "side",
   "text": "stick y: +1 down sets bit 2, -1 up sets bit 3"
  },
  {
   "address": 6202,
   "type": "side",
   "text": "same state as the current run?"
  },
  {
   "address": 6209,
   "type": "side",
   "text": "count already 15 (16 polls): start another run with the same state"
  },
  {
   "address": 6224,
   "type": "side",
   "text": "one more poll in this run"
  },
  {
   "address": 6232,
   "type": "line",
   "text": "Demo recorder, start a new run with the state in A: saves it in $03D6 and moves the pointer $03D4/$03D5 on a byte. At $A800, the end of the buffer (the bitmap band's screen matrix starts there), recording stops instead: $03D3 = 0, $03C7 = 1 ends the game (the store is made twice) and the last entry is overwritten with $EF, the end marker. Otherwise the new entry is the state times 16, a count of 0 (one input poll)."
  },
  {
   "address": 6247,
   "type": "side",
   "text": "pointer reached $A800: the buffer is full"
  },
  {
   "address": 6265,
   "type": "side",
   "text": "$EF: end marker over the last entry"
  },
  {
   "address": 6270,
   "type": "side",
   "text": "new entry: state in the high nibble, count 0"
  },
  {
   "address": 6280,
   "type": "line",
   "text": "Demo replayer, reached from $17AA when $03D3 is neither 0 nor 1 (it is 2 during the demonstration): a real fire press ($0387, from $0CC6) ends the demonstration, with $03C7 = 1 stopping the game loop, $03D8 = 1 sending the main loop straight back to the title ($0876) and $03D3 = 0. Otherwise, while $03D7 holds repeats it counts one off and replays the current state (demo_replay_apply); at $FF it fetches the next entry (demo_replay_next)."
  },
  {
   "address": 6280,
   "type": "side",
   "text": "a real fire press ends the demonstration"
  },
  {
   "address": 6299,
   "type": "side",
   "text": "$FF: current entry used up"
  },
  {
   "address": 6309,
   "type": "line",
   "text": "Demo replayer, feeds the current state $03D6 to the game in place of the stick: $F holds fire ($0387 = 1) with the stick centred; $E is the end marker ($03C7 = 1, $03D3 = 0, $03D8 = 1: the demonstration is over); any other value sets $0388 from bits 0 (+1) and 1 (-1) and $0389 from bits 2 (+1) and 3 (-1), 0 where neither bit is set, and leaves fire as $0CC6 read it (released, or demo_replay would have ended the demonstration)."
  },
  {
   "address": 6312,
   "type": "side",
   "text": "state $F: fire"
  },
  {
   "address": 6330,
   "type": "side",
   "text": "state $E: end of the recording"
  },
  {
   "address": 6407,
   "type": "line",
   "text": "Demo replayer, next entry: moves $03D4/$03D5 on a byte. At $A800, the end of the buffer, the demonstration ends as though fire had been pressed ($03D3 = 0, $03C7 = 1, $03D8 = 1, $0387 = 1). Otherwise it splits the entry: its count minus one into $03D7 (so an entry lasts count + 1 input polls, and $FF means it is used up) and its high nibble into $03D6, then jumps to demo_replay_apply."
  },
  {
   "address": 6418,
   "type": "side",
   "text": "past the end of the buffer ($A800)"
  },
  {
   "address": 6451,
   "type": "side",
   "text": "count - 1 = repeats still to come"
  },
  {
   "address": 6461,
   "type": "side",
   "text": "high nibble = the state"
  },
  {
   "address": 6473,
   "type": "line",
   "text": "Plays one frame of the music: jumps to $C006, the music driver's per-frame routine, which steps the current tune and writes the SID, or finishes a stop that $C003 asked for. On an NTSC machine ($02A6 = 0; the KERNAL's CINT sets it non-zero at $FF68 only when raster line $137 exists) it counts $03DB down from 6 and skips every sixth call, probably so that the tune keeps its PAL tempo. Called once a frame by the play interrupt's band 1 ($27A8) while $03D1, the M key's music switch, is set, and by the title interrupt ($5D5D)."
  },
  {
   "address": 6473,
   "type": "side",
   "text": "$02A6: 0 on NTSC, non-zero on PAL (KERNAL CINT)"
  },
  {
   "address": 6478,
   "type": "side",
   "text": "NTSC: one call in six skipped"
  },
  {
   "address": 6489,
   "type": "side",
   "text": "music driver: play one frame"
  },
  {
   "address": 6492,
   "type": "line",
   "text": "PICK UP (menu option 2; offered when an object lies on the player's tile; costs 5 turns of the loop at $08CC, from $4C27). With both hands full ($4C01 and $4C02 not $FF) it prints NO FREE HAND. and stops. Otherwise it lists each object 1-32 whose location $3F70/$3FB0 is the player's map address, with its picture, then -NOTHING-, and waits for a choice ($1320). The choice is echoed as PICK UP <name>. and weighed: its weight ($4A01) plus everything the player holds or wears, everything inside those and everything inside it ($2883). At 70 or more it prints YOU CANNOT CARRY THAT MUCH WEIGHT. and leaves it; otherwise it becomes carried (location 0/0) in the right hand if that is empty, else the left. Every path but -NOTHING- ends by redrawing the view ($0B05)."
  },
  {
   "address": 6506,
   "type": "side",
   "text": "NO FREE HAND. ($47C1)"
  },
  {
   "address": 6533,
   "type": "side",
   "text": "object's location = the player's tile?"
  },
  {
   "address": 6590,
   "type": "side",
   "text": "-NOTHING- returns $FF"
  },
  {
   "address": 6610,
   "type": "side",
   "text": "echo: PICK UP <name>."
  },
  {
   "address": 6636,
   "type": "side",
   "text": "the chosen object's weight..."
  },
  {
   "address": 6642,
   "type": "side",
   "text": "...plus what the player holds or wears, with contents"
  },
  {
   "address": 6647,
   "type": "side",
   "text": "...plus what is inside the chosen object"
  },
  {
   "address": 6659,
   "type": "side",
   "text": "limit 70; BMI is signed, so 198-255 would pass (all objects weigh 131)"
  },
  {
   "address": 6663,
   "type": "side",
   "text": "YOU CANNOT CARRY THAT MUCH WEIGHT. ($46B2)"
  },
  {
   "address": 6676,
   "type": "side",
   "text": "location 0/0: carried by the player"
  },
  {
   "address": 6684,
   "type": "side",
   "text": "right hand if empty, else the left"
  },
  {
   "address": 6704,
   "type": "line",
   "text": "INVENTORY (option 4, always offered; 12 turns): prints YOU ARE CARRYING <the right-hand object $4C01, or -NOTHING-> IN YOUR RIGHT HAND, <the left-hand object $4C02> IN YOUR LEFT HAND, AND YOU ARE WEARING <every other object 1-32 whose location is 0/0, separated by commas, or NOTHING BUT YOUR CLOTHES>. and shows a picture of each object it names. Worn here means carried and not in a hand: the state byte $4AC1 is not read, and the contents of a container are not listed (LOOK IN lists them). Changes nothing but the message window and the picture strip."
  },
  {
   "address": 6707,
   "type": "side",
   "text": "YOU ARE CARRYING ($476F)"
  },
  {
   "address": 6751,
   "type": "side",
   "text": " IN YOUR RIGHT HAND, ($4782)"
  },
  {
   "address": 6795,
   "type": "side",
   "text": " IN YOUR LEFT HAND, AND YOU ARE WEARING ($4798)"
  },
  {
   "address": 6809,
   "type": "side",
   "text": "not a hand object, but at location 0/0: worn"
  },
  {
   "address": 6837,
   "type": "side",
   "text": "comma between names ($4940)"
  },
  {
   "address": 6882,
   "type": "side",
   "text": "NOTHING BUT YOUR CLOTHES ($491B)"
  },
  {
   "address": 6893,
   "type": "line",
   "text": "PUT DOWN (option 3, offered when a hand holds something; 4 turns): lists the right-hand and left-hand objects with their pictures, then -NOTHING-. The chosen object is laid on the player's tile (its location becomes his map address), its hand is emptied ($FF) and PUT DOWN <name>. is printed. The game is won here: the AMULET (object $15) put down while the player stands on map address $9677, the pedestal's tile beside the pool, sets $03C7 = $7B, which the main loop ($0851) turns into the ending. Redraws the view ($0B05) unless -NOTHING- was chosen; with both hands empty it returns at once."
  },
  {
   "address": 6985,
   "type": "side",
   "text": "laid on the player's tile"
  },
  {
   "address": 6997,
   "type": "side",
   "text": "empty the hand it came from"
  },
  {
   "address": 7016,
   "type": "side",
   "text": "echo: PUT DOWN <name>."
  },
  {
   "address": 7042,
   "type": "side",
   "text": "the AMULET (object $15)?"
  },
  {
   "address": 7046,
   "type": "side",
   "text": "on map address $9677, the pedestal's tile?"
  },
  {
   "address": 7060,
   "type": "side",
   "text": "won: the main loop shows the ending"
  },
  {
   "address": 7069,
   "type": "line",
   "text": "OPEN (option 5, offered when the view window's centre cell $04CD, the tile the player stands on, shows a closed door; 8 turns): points $9B/$9C at the player's map tile, opens the door there (door_open), prints OPEN DOOR. and redraws the view ($0B05). The message does not depend on a door having been found."
  },
  {
   "address": 7082,
   "type": "side",
   "text": "OPEN ($415B) DOOR ($4934)."
  },
  {
   "address": 7103,
   "type": "line",
   "text": "Opens the door at the map tile ($9B/$9C) by setting bit 0 on it and on its other half. A door is two adjacent tiles, $F0-$FF, one each side of the door: $F0 and $F4 have the other half a map row below (+$80), $F2 and $F6 a row above (-$80), $F8 and $FC one tile to the right, $FA and $FE one tile to the left. Bit 0 set means open, so an open door or any other tile is left alone; bit 2 makes no difference here. $9B/$9C is left on the other half when that is above or to the left. Called by OPEN for the player's tile and by the creature mover ($2600), so creatures open doors too."
  },
  {
   "address": 7107,
   "type": "side",
   "text": "closed, other half a row below"
  },
  {
   "address": 7119,
   "type": "side",
   "text": "+$80: the next map row"
  },
  {
   "address": 7130,
   "type": "side",
   "text": "closed, other half a row above"
  },
  {
   "address": 7142,
   "type": "side",
   "text": "-$80: the map row above"
  },
  {
   "address": 7162,
   "type": "side",
   "text": "closed, other half to the right"
  },
  {
   "address": 7184,
   "type": "side",
   "text": "closed, other half to the left"
  },
  {
   "address": 7217,
   "type": "line",
   "text": "CLOSE (option 6, offered when the view window's centre cell $04CD shows an open door; 8 turns): points $9B/$9C at the player's map tile and closes the door there (door_close, which also puts the player in the middle of his tile and redraws the view), then prints CLOSE DOOR."
  },
  {
   "address": 7230,
   "type": "side",
   "text": "CLOSE ($4161) DOOR ($4934)."
  },
  {
   "address": 7248,
   "type": "line",
   "text": "Adds Y to the map pointer $9B/$9C (and leaves it there); if that is the player's tile ($3F70/$3FB0) it puts him in the middle of it: his position within the tile ($3FF0, $4030) becomes 4,4 and sprite 0, his dot in the view window, moves to X $42, Y $5C ($3A00/$3A01, which band 0 copies to the VIC). door_close calls it for both tiles of the door, so a player standing in a doorway that shuts, whoever shuts it, is centred on his tile; why is not established (probably to keep his dot clear of the closed door's graphics)."
  },
  {
   "address": 7260,
   "type": "side",
   "text": "the player's tile?"
  },
  {
   "address": 7274,
   "type": "side",
   "text": "middle of the tile: 4,4"
  },
  {
   "address": 7282,
   "type": "side",
   "text": "sprite 0 X = $3E + position"
  },
  {
   "address": 7291,
   "type": "side",
   "text": "sprite 0 Y = $58 + position"
  },
  {
   "address": 7301,
   "type": "line",
   "text": "Closes the door at the map tile ($9B/$9C), the mirror of door_open: on $F1/$F5 (other half a row below), $F3/$F7 (a row above), $F9/$FD (to the right) and $FB/$FF (to the left) it clears bit 0 on both halves; any other tile is left alone. Before and after, player_centre_if_on centres the player if he stands on this tile or on the other half, and it ends by redrawing the view ($0B05). Called by CLOSE and by the creature mover ($25F4), which shuts a door on the move after a creature opened it ($4FE2)."
  },
  {
   "address": 7303,
   "type": "side",
   "text": "centre the player if he is on this tile"
  },
  {
   "address": 7308,
   "type": "side",
   "text": "open, other half a row below"
  },
  {
   "address": 7331,
   "type": "side",
   "text": "open, other half a row above"
  },
  {
   "address": 7363,
   "type": "side",
   "text": "open, other half to the right"
  },
  {
   "address": 7385,
   "type": "side",
   "text": "open, other half to the left"
  },
  {
   "address": 7417,
   "type": "side",
   "text": "centre the player if he is on the other half"
  },
  {
   "address": 7424,
   "type": "line",
   "text": "WEAR (option 7, offered when a hand holds something wearable; 10 turns): lists each hand's object whose wearable flag $4A81 is set (the armour, the helmet, the backpack, the rings and the amulet), with its picture, then -NOTHING-. The chosen object gets state 2, worn ($4AC1), stays carried (location 0/0), leaves its hand ($FF), and WEAR <name>. is printed. Nothing limits how many objects are worn or of which kind."
  },
  {
   "address": 7437,
   "type": "side",
   "text": "wearable?"
  },
  {
   "address": 7515,
   "type": "side",
   "text": "state 2: worn"
  },
  {
   "address": 7539,
   "type": "side",
   "text": "echo: WEAR <name>."
  },
  {
   "address": 7563,
   "type": "line",
   "text": "TAKE OFF (option 8, offered when something is worn; 10 turns): clears the menu band, then with both hands full prints NO FREE HAND. and stops. Otherwise it lists every object 1-32 that is carried (location 0/0) and worn (state 2 in $4AC1), with its picture, then -NOTHING-; the chosen one goes back to state 0 and into the right hand if that is empty, else the left, and TAKE OFF <name>. is printed."
  },
  {
   "address": 7580,
   "type": "side",
   "text": "NO FREE HAND. ($47C1)"
  },
  {
   "address": 7608,
   "type": "side",
   "text": "worn (state 2)?"
  },
  {
   "address": 7665,
   "type": "side",
   "text": "state 0: an ordinary held object"
  },
  {
   "address": 7689,
   "type": "side",
   "text": "echo: TAKE OFF <name>."
  },
  {
   "address": 7713,
   "type": "line",
   "text": "PUT IN (option 9, offered when a container is carried and a hand holds something; 5 turns): lists both hands' objects, then -NOTHING-, and prints PUT <name> IN; then lists every carried object (location 0/0: held or worn) that is a container ($4A41; in this game only the backpack) other than the one being put in. On a container the object leaves its hand, gets state 1 ($4AC1) and the container's number as its location ($3F70; $3FB0 stays 0), and the container's name ends the message; on -NOTHING- the message ends -NOTHING-. and nothing moves. No capacity limit is checked."
  },
  {
   "address": 7800,
   "type": "side",
   "text": "PUT <name> IN"
  },
  {
   "address": 7842,
   "type": "side",
   "text": "a container ($4A41)..."
  },
  {
   "address": 7847,
   "type": "side",
   "text": "...other than the object being put in"
  },
  {
   "address": 7902,
   "type": "side",
   "text": "cancelled: the message ends -NOTHING-."
  },
  {
   "address": 7934,
   "type": "side",
   "text": "state 1: inside a container"
  },
  {
   "address": 7939,
   "type": "side",
   "text": "location = the container's number ($3FB0 stays 0)"
  },
  {
   "address": 7957,
   "type": "line",
   "text": "TAKE OUT (option 10, offered when a container is carried; 5 turns): with both hands full it prints NO FREE HAND. and stops. Otherwise it lists every object 1-32 in state 1 ($4AC1, inside a container) whose container is carried by the player (the container's location is 0/0), with its picture, then -NOTHING-. The choice is announced as TAKE OUT <name> FROM <container>., then gets state 0 and location 0/0 and goes into the right hand if that is empty, else the left."
  },
  {
   "address": 7971,
   "type": "side",
   "text": "NO FREE HAND. ($47C1)"
  },
  {
   "address": 7990,
   "type": "side",
   "text": "inside a container (state 1)..."
  },
  {
   "address": 7997,
   "type": "side",
   "text": "...which the player carries (location 0/0)"
  },
  {
   "address": 8064,
   "type": "side",
   "text": "TAKE OUT <name> FROM <container>."
  },
  {
   "address": 8114,
   "type": "side",
   "text": "state 0, location 0/0: carried"
  },
  {
   "address": 8139,
   "type": "line",
   "text": "LOOK IN (option 11, offered when a container is carried; 10 turns): lists every carried object (location 0/0) that is a container ($4A41), then -NOTHING-. For the chosen one it prints LOOK IN <name>. and then IN THE <name> YOU CAN SEE <each object in state 1 whose location $3F70 is that container, separated by commas, or -NOTHING->., showing their pictures. Changes nothing. The routine runs on past $2000 to its RTS at $20A4."
  },
  {
   "address": 8157,
   "type": "side",
   "text": "a container?"
  },
  {
   "address": 8357,
   "type": "line",
   "text": "SWAP, menu option 13 (handler from the $4C03 table; its $4C27 entry makes the tick loop at $08CC run 3 ticks after it). Prints 'SWAP HANDS.' ($4868), starts a new message line ($28DD) and exchanges the object numbers in $4C01 (right hand) and $4C02 (left hand); $FF is an empty hand. Nothing is checked: two empty hands swap too, and the 3 ticks pass with the creatures moving. The right hand is the one ATTACK fights with ($2A73), so SWAP is how a weapon carried in the left hand is brought into use."
  },
  {
   "address": 8380,
   "type": "line",
   "text": "Once per game tick (from the tick loop at $0901): runs the passage check $20CC for every creature, entries $21-$3F, and then for the player, entry 0. Objects (entries 1-$20) are never moved this way. Dead creatures are checked as well; there is no body strength test."
  },
  {
   "address": 8396,
   "type": "line",
   "text": "Passage check for entry X: reads the map tile under its position ($3F70/$3FB0,x, through $9B/$9C). Tile $B1 adds $20 to the position, $B2 subtracts $20, $A3 adds $20. The map at $9000 is 128 cells wide in four 32-column sections, so $20 is the same row and column one section over. Only the cell changes; the fine position $3FF0/$4030 is kept. In the map each of the seven $B1 tiles lands on a $B3 with a $B2 beside it and each $B2 on a $B0 with a $B1 beside it: two-way links between neighbouring sections, probably stairs (the picture strip counts $B0 and $B3 tiles in view as features, $16DA, and the picture sheet holds a staircase). The one $A3, at $9718, drops one way into $9738. After a $B1 or $B2 move the $A3 test at $2101 compares the new position's low byte instead of the tile, so a landing with low byte $A3 would move a second time; no link in this map lands on one."
  },
  {
   "address": 8428,
   "type": "side",
   "text": "A is now the new position's low byte, not the tile"
  },
  {
   "address": 8449,
   "type": "side",
   "text": "tile $A3, or a low byte of $A3 after a $B1/$B2 move"
  },
  {
   "address": 8468,
   "type": "line",
   "text": "Turns a displacement into a compass direction. In: $038A = dx, $038E = dy, sign-magnitude (bit 7 set = negative, magnitude 0-127; y grows southwards). Builds an index in $0392: bit 1 when dx >= 0, bit 2 when dy >= 0, bit 0 when |dy| > |dx| (the larger magnitude goes to $038F, the smaller to $0390), bit 3 when the larger is at least twice the smaller (the quotient is counted in $0393; a smaller of 0 is taken as a quotient of $20, straight). Returns A = $4947,index: 0 N, 1 NE, 2 E, 3 SE, 4 S, 5 SW, 6 W, 7 NW, so a target within about 26.6 degrees of an axis is approached straight and anything else diagonally; A = $FF when dx and dy are both 0."
  },
  {
   "address": 8603,
   "type": "line",
   "text": "Direction from one map cell to another. In: $038F/$0390 = the 'from' address and $0391/$0392 = the 'to' address (low/high). The column is the low 7 bits of the address and the row is the address shifted right 7 (the map is 128 bytes wide), so dx = to column - from column and dy = to row - from row, kept sign-magnitude in $038A and $038E; $2114 then returns A = 0-7 (N NE E SE S SW W NW) or $FF for the same cell. Overwrites $038A and $038E-$0393. Used by the chase ($2381), flee ($23AF) and go-home ($23D5) behaviours."
  },
  {
   "address": 8709,
   "type": "line",
   "text": "Creature clock, called six times per game tick by the tick loop at $08CC. Returns at once when the game is over ($03C7 non-zero), so the rest stop moving as soon as the player dies. For each creature Y = $21-$3F that is alive (body strength $4EC5,y not negative) it counts $4BC1,y up by one; when the count equals the creature's move period $4B81,y (3 for the minotaur and two hellhounds, up to 25 for the wizard; the table is never written) the count restarts at 0 and the creature takes one sub-step ($222E). So a creature gets 6/period sub-steps a tick; a cell costs it 9 of them, the decision and 8 moves, and every creature keeps moving whether or not the player can see it."
  },
  {
   "address": 8750,
   "type": "line",
   "text": "One sub-step, 1/8 of a cell, for creature Y. With no direction ($40B0,y = $FF) it decides one instead ($2308). Otherwise, if the creature makes footsteps ($59DC,y: orcs, wizard, skeletons, vampires, minotaur) and is in view ($3EB0,y), every third sub-step (countdown $5A1C,y) asks band 1 of the interrupt for a footstep noise ($03CF = 1). Then it moves by the direction's bits in $4957 (1 north, 2 south, 4 west, 8 east): the fine y $4030,x or fine x $3FF0,x runs 0-7 around the centre 4 and, when it wraps, the position $3F70/$3FB0 moves one row ($80) or one column. After 8 sub-steps ($40F0,x) the creature is at the centre of the next cell and the direction is dropped ($FF), so it decides again at its next sub-step. Direction 8, standing after an attack, has no bits: it only counts the 8 sub-steps."
  },
  {
   "address": 8968,
   "type": "line",
   "text": "Decision for creature Y at a cell centre. If it is in view ($3EB0,y) it re-arms its pursuit ($2367). If it stands on the player's cell and is not timid ($4D49,y bit 7 clear) it attacks ($23F9). Otherwise: with the flee flag $4CEC,y it counts the pursuit timer $4D2A,y down (the flag drops when the timer is already 0) and flees ($23AF); with the chase flag $4D0B,y the same countdown, then it chases ($2381); with neither it goes home ($23D5). The timer is reloaded at every decision made in view, so it counts decisions, about one per cell moved, since the creature lost sight of the player: 0 for the bats and one snake, 1 hellhounds, 6 orcs, 10 spiders, 20 skeletons, 30 vampires, 60 the wizard and the minotaur, 12 the timid snake."
  },
  {
   "address": 8992,
   "type": "side",
   "text": "bit 7 set: timid, never attacks"
  },
  {
   "address": 9063,
   "type": "line",
   "text": "Arms creature Y's pursuit while it is in view: the timer $4D2A,y = its behaviour byte $4D49,y AND $7F, and bit 7 of the byte picks the mode: set = flee ($4CEC,y = 1; only the first snake, entry $3B, has it), clear = chase ($4D0B,y = 1). The other flag is left as it is; $4D49 is never written, so a creature only ever raises one of the two."
  },
  {
   "address": 9089,
   "type": "line",
   "text": "Chase: heads creature Y for $4C4F/$4C8F,y, where the player stood when it last had him in view (written by the sight check at $0FAA). Once on that cell it carries on in the direction it last moved (the opposite of its back direction $49B9,y, through $49F9): that is its search. The direction goes to $2566, which picks an open exit."
  },
  {
   "address": 9135,
   "type": "line",
   "text": "Flee: the direction from the player's last seen position $4C4F/$4C8F,y to creature Y, straight away from that cell, goes to $2566. A creature standing on that very cell goes home instead ($23D5)."
  },
  {
   "address": 9173,
   "type": "line",
   "text": "Go home: heads creature Y for its lair $4CAE,y (low) / $4CCD,y (high); on the lair cell it returns with no direction, so it stands and decides again at every sub-step. But the new-game set-up at $0924 clears 64 bytes from $4CEC for the 31-entry flee flags and so zeroes every lair's high byte ($4CEE-$4D0C) and the low bytes of the last two ($4CEC, $4CED): in play every lair is in page 0, north of the whole map ($9000-$9FFF), and a creature going home heads north towards its starting column ($4CAE holds the start positions' low bytes) and never arrives. Seven wanderers ($22 $23 $2A $2B $2E $33 $35) are given a random map cell as lair every 50 ticks instead ($3B87)."
  },
  {
   "address": 9209,
   "type": "line",
   "text": "Creature Y attacks the player (from $2310: it stands on his cell and is not timid). It then stands for 8 sub-steps (direction 8, count preset from $4FC3,y, which is 0 for every creature, $4FE4-$5002). Prints 'THE <name> ATTACKED YOU WITH ITS <weapon>.': the weapon is the highest-numbered object 1-$20 it carries (position $00yy) with the weapon flag $4B01 set, damage mask $4E45; without one, its natural weapon by type $4F66,y (HANDS, CLAWS, TEETH, STING, FIREBALL SPELL, names at $4FA6/$4FAC, masks $4FDE 1 3 3 3 15). To hit, (random 0-31) + skill $4E05,y, minus 8 while the magical shield is up ($57D3), adjusted by what the player carries ($24F1), must reach the player's defence $4DC7 (40; a signed compare): 'HE MISSED.' or 'HE HIT.'. Damage = (random AND the mask) + strength $4D89,y / 8, applied at $24CC. Returns Y = the creature."
  },
  {
   "address": 9420,
   "type": "line",
   "text": "Takes the damage in $038A from the player's body strength $4EC5 (entry 0 of the body array). This is the trainer's unlimited body strength patch point: its SBC $038A at $24D0 becomes NOP / SBC #$00. A negative result is death: 'YOU+RE DEAD...' ($48A9), $03C7 = 1 (the game-over flag the main loop tests; it then starts tune 1) and the M and B bars are redrawn ($2BDE). A body strength of exactly 0 is still alive."
  },
  {
   "address": 9424,
   "type": "side",
   "text": "trainer patch point: becomes NOP / SBC #$00"
  },
  {
   "address": 9457,
   "type": "line",
   "text": "Adjusts a creature's to-hit roll in A for what the player carries. Each test wants the object's wearable flag $4A81,x to be 1 (it always is for these objects) and its position to be $0000, held by the player in a hand or worn, but not in the backpack: armour (object 1) -5, helmet (2) -2, ring $10 (the blue stone) +8, ring $11 ('PROTECTION FROM EVIL') -4. So armour or a helmet carried in a hand protects as well as when worn, and the blue-stone ring makes the player easier to hit. The shield test (-3 for objects $1E-$20 in the right hand $4C01 or the left $4C02) needs X to equal $1E, $1F and $20 at once, so it never subtracts: shields give no protection. Changes X."
  },
  {
   "address": 9544,
   "type": "side",
   "text": "never equal: X is $1E here"
  },
  {
   "address": 9562,
   "type": "side",
   "text": "never equal: X is $1E here"
  },
  {
   "address": 9574,
   "type": "line",
   "text": "Sets creature Y moving. In: A = preferred direction 0-7. Reads the tile under the creature and its exits from a 256-entry table (bit d = may leave in direction d): $A000 for a creature that opens doors ($5001,y = 1, patched in at $25A7), else $A100, where closed doors block. Tries the first six of the eight candidates listed at $4968/$4970 (d, d-1, d+1, d-2, d+2, d-3), skipping the way it came ($49B9,y); if none is open it turns back the way it came, unchecked. Stores the direction in $40B0,y, 0 in $40F0,y and the new back direction in $49B9,y. If it opened a door at its last decision ($4FE2,y) it now closes the door at its cell ($1C85); if the move leaves through a closed door ($A100 forbids it) it opens that door ($1BBF) and sets $4FE2,y. Returns Y = the creature."
  },
  {
   "address": 9637,
   "type": "side",
   "text": "operand high byte at $25A7 is patched: $A000 or $A100"
  },
  {
   "address": 9639,
   "type": "line",
   "text": "High byte of the operand of LDA $A100,Y at $25A5: $2583 or $258B stores $A0 or $A1 here, so a creature that opens doors reads its exits from $A000 and the others from $A100. Both tables are loaded data (unchanged since the loader's hand-over), one byte per tile code, and differ only for the closed door tiles $F0, $F2 ... $FE. They lie in the part of the bitmap area that the bottom band never shows (with the vertical scroll of 3 in $D011, band 2 starts in bitmap row 16, $B400)."
  },
  {
   "address": 9670,
   "type": "side",
   "text": "always the no-doors table: a closed door ahead?"
  },
  {
   "address": 9755,
   "type": "side",
   "text": "no candidate open: go back the way it came"
  },
  {
   "address": 9767,
   "type": "line",
   "text": "Installs the play-screen interrupt; called once, from the play set-up at $0A9D. With interrupts off it points the KERNAL's IRQ vector $0314/$0315 at $2653, clears the raster compare's high bit ($D011 bit 7), sets the first compare line to $28 (40), enables the VIC raster interrupt ($D01A bit 0), starts at band 0 ($03B7 = 0) and turns the music on ($03D1 = 1), then allows interrupts again."
  },
  {
   "address": 9811,
   "type": "line",
   "text": "The play-screen interrupt, entered from the KERNAL's IRQ entry through $0314, so A, X and Y are already on the stack. Writes the VIC's interrupt flags back to $D019 to acknowledge them; a raster interrupt goes on to the band dispatch ($2666), anything else (by its $DC0D read, a CIA 1 interrupt) leaves at once through $265D without the KERNAL. Three raster bands a frame, counted in $03B7: band 0 at line $28 (the text screen at the top), band 1 at $8E (the menu band and the sound), band 2 at $B6 (the picture strip, in bitmap mode)."
  },
  {
   "address": 9821,
   "type": "line",
   "text": "Common exit of the play interrupt, for a non-raster interrupt and for bands 1 and 2: reads $DC0D, which acknowledges any CIA 1 interrupt, then pulls Y, X and A as the KERNAL's entry pushed them and returns (RTI). Only band 0 leaves through the KERNAL's handler ($EA31), so its keyboard scan and jiffy clock run once a frame."
  },
  {
   "address": 9830,
   "type": "line",
   "text": "Picks the band from $03B7: 0 = band 0 ($2675), 1 = band 1 ($275E), any other value = band 2 ($27AE)."
  },
  {
   "address": 9845,
   "type": "line",
   "text": "Band 0, raster line $28 (40), above the text area: sets up the top of the screen (view window, message window, M and B bars and clock) and the menu band below it. Next interrupt at line $8E ($03B7 = 1). Reads $D01F and throws the value away, by its use to empty the sprite-background collision latch so that band 2 collects only the top band's collisions. $D018 = $1D (screen $0400, characters $3000), text mode ($D011 bit 5 cleared, and bit 7), VIC bank 0 ($DD02 and $DD00 bits 0-1 = %11), background yellow ($D021 = 7). Copies the top band's sprite registers from $3A00-$3A1C: positions to $D000-$D00F, then $D015 enable, $D017, $D01B priority, $D01C multicolour, $D01D, colours $D027-$D02E; then writes 0 to $D017, $D01D and $D010, so the copies of $3A11 and $3A14 never take effect and no top-band sprite is expanded or placed beyond x = 255. Leaves through the KERNAL's handler ($EA31)."
  },
  {
   "address": 9853,
   "type": "side",
   "text": "read and discarded: empties the collision latch"
  },
  {
   "address": 10066,
   "type": "side",
   "text": "undoes the $3A11 copy"
  },
  {
   "address": 10069,
   "type": "side",
   "text": "undoes the $3A14 copy"
  },
  {
   "address": 10078,
   "type": "line",
   "text": "Band 1, raster line $8E (142), the menu band: next interrupt at line $B6 ($03B7 = 2) and background colour 8 ($D021; the palette's orange, brown on screen). With the music on ($03D1, toggled by the M key at $0C94) it calls $1949, the tune's per-frame update ($C006). With it off, a footstep asked for in $03CF (by $0D44 as the player walks, or by $222E for a walking creature in view) is played once: the request is cleared and voice 1 gets volume 15 ($D418), frequency $1000, attack/decay $00, sustain/release $53 and the noise waveform with the gate set and cleared again two instructions later ($81 then $80). While the music plays a request stays pending. Leaves through $265D."
  },
  {
   "address": 10144,
   "type": "side",
   "text": "gate cleared again straight after being set"
  },
  {
   "address": 10158,
   "type": "line",
   "text": "Band 2, raster line $B6 (182), the picture strip at the bottom; runs on to $2880. Next interrupt at line $28, band 0 of the next frame ($03B7 = 0). Counts the frame in $03A0 (waited on at $0914, $0ACA and $0AF1). ORs $D01F, the sprite-background collisions latched since band 0, into $038D: bit 0, the player's figure (sprite 0) touching foreground pixels of the view window's characters (by that use, a wall), is what makes the movement code at $0AD3 turn the player back. VIC bank 2 ($DD00 bits 0-1 = %01, $8000-$BFFF), bitmap mode on ($D011 bit 5), $D018 = $A8 (screen matrix $A800, bitmap $A000), background black. Sprites: positions from $3A20-$3A2F, enable $3A30, no priority or multicolour, all colour $0A (light red), x high bits $3A3D, all expanded both ways; all eight pointers ($ABF8-$ABFF, set to $94 at $0A76) show $A500, a sprite that reads DEAD. Leaves through $265D."
  },
  {
   "address": 10171,
   "type": "side",
   "text": "collisions since band 0"
  },
  {
   "address": 10371,
   "type": "line",
   "text": "Adds up the weight of everything entity Y holds, into $03A2: for each object 1-$20 that is held ($3FB0,x = 0) by Y ($3F70,x = Y) it adds the object's weight $4A01,x and then calls itself with that object as Y, so the contents of a held container (the backpack) count too. X and Y come back unchanged. PICK UP calls it for the player (Y = 0) and for the object being picked up ($19F4, $19FA) and refuses at 70 or more ($1A03). A total past 255 would run into the BRK at $28AD; all 32 objects together weigh 131, so it cannot."
  },
  {
   "address": 10394,
   "type": "side",
   "text": "carry = the total passed 255"
  },
  {
   "address": 10413,
   "type": "line",
   "text": "Trap for a weight total that carried past 255: BRK, which the KERNAL passes to its own warm start through $0316 ($FE66) with BASIC switched out. Unreachable in play: every object in the game together weighs 131."
  },
  {
   "address": 10414,
   "type": "line",
   "text": "Clears the message window: writes spaces over its $03B3 rows (8) of $03B2 columns (27), starting at the top-left screen address $03B0/$03B1 ($045C: row 2, column 12), leaves colour RAM alone, and puts the cursor column $03A3 back to 0. Called once, by the play-screen setup at $0AA0."
  },
  {
   "address": 10461,
   "type": "line",
   "text": "Starts a new line in the message window: moves rows 1-7 up one row, characters and colour RAM alike (27 columns from $03B0/$03B1, colour RAM = screen + $D400), fills the bottom row with spaces in colour 1 (white) and sets the cursor column $03A3 to 0. Called after most messages, directly or through $29F1. Uses $9B/$9C and $9D/$9E as the screen and colour RAM pointers."
  },
  {
   "address": 10480,
   "type": "line",
   "text": "Row loop: copy each character of the row below (Y + 40) and its colour up into this row, for the window's 27 columns."
  },
  {
   "address": 10513,
   "type": "line",
   "text": "Row done: both pointers one screen row (40) on; the INX INX / CPX $03B3 / DEX pattern stops once height - 1 rows have moved up (with a height of 1 it would only stop when X wrapped round, 256 rows later; the game always uses 8)."
  },
  {
   "address": 10539,
   "type": "line",
   "text": "Blank the bottom row: spaces, colour 1 (white), then the cursor back to column 0."
  },
  {
   "address": 10561,
   "type": "line",
   "text": "Prints a zero-terminated PETSCII message (X = low byte, Y = high byte of its address) into the message window, a word at a time on the bottom row ($03B4/$03B5 = $0574) from the cursor column $03A3. Each word is measured first; if it would end past the last column (width $03B2 = 27) a new line is started ($28DD). Codes $40-$9F are shifted down by $40 to screen codes and every character gets the current colour $03A6 in colour RAM. A byte $01-$1F (or $A0-$FF) is a colour code: its low nibble becomes $03A6, so the $10 that starts every verb prints it in black. A space only moves the cursor on. The cursor column stays in $03A3, so consecutive calls continue one line. Uses $F9/$FA as the text pointer. A word longer than 27 characters would never fit and scroll for ever (the game's longest, at $52F7, has 15)."
  },
  {
   "address": 10565,
   "type": "line",
   "text": "Next word: point $9B/$9C at the print line and $9D/$9E at its colour RAM, copy the cursor column to $03A4, and count the word's characters ($21-$A0) from the text pointer; a word of 255 characters makes it give up and return."
  },
  {
   "address": 10611,
   "type": "line",
   "text": "Word measured: $03A4 is now the column its last character would take. If that is not left of the width $03B2, start a new line first and measure again from column 0."
  },
  {
   "address": 10631,
   "type": "line",
   "text": "The word fits: print it from the cursor column, one character at a time, until a space, a colour code or the terminating zero."
  },
  {
   "address": 10683,
   "type": "line",
   "text": "A space: the cursor moves one column on, the text pointer moves past the word and the space, and the next word is measured."
  },
  {
   "address": 10710,
   "type": "line",
   "text": "The terminating zero: keep the cursor column in $03A3 for the next message and return."
  },
  {
   "address": 10717,
   "type": "line",
   "text": "A colour code: step the text pointer over it and make its low nibble the colour $03A6. The pointer moves one byte from the word's start, so a code in the middle of a word would print that word's earlier letters twice; the game's text has codes only at the start of a string or after a space."
  },
  {
   "address": 10737,
   "type": "line",
   "text": "Ends a sentence in the message window: prints \".\" (the string at $4943) with $2941, then starts a new line with $28DD. Called after nearly every message the game prints."
  },
  {
   "address": 10748,
   "type": "line",
   "text": "ATTACK, menu option 12 (handler table $4C03; the tick loop then runs 10 ticks, $4C27): prints \"ATTACK \", clears the menu ($1106) and the picture strip ($149E) and offers every live creature ($21-$3F, body $4EC5 not negative) standing on the player's own square, plus -NOTHING-. The weapon is whatever the right hand $4C01 holds: an empty hand fights as FIST (object 0), anything that is not a weapon ($4B01,x = 0) refuses with \"-NOTHING IN RIGHT HAND TO FIGHT WITH-\". Prints \"<creature> WITH <weapon>.\", then rolls to hit and for damage (from $2AC9)."
  },
  {
   "address": 10763,
   "type": "line",
   "text": "Creature loop, $21-$3F: listed when its map address ($3F70/$3FB0) is the player's and it is alive, with its noun ($4588/$45C9) and its picture ($586F,x through $1515)."
  },
  {
   "address": 10847,
   "type": "line",
   "text": "A creature was chosen: keep it in $03A7, print its name and \" WITH \" ($47F9), then look at the right hand ($4C01) for the weapon."
  },
  {
   "address": 10882,
   "type": "line",
   "text": "Right hand empty ($4C01 = $FF): the weapon is the fist, object 0 (damage mask 1, $4E45)."
  },
  {
   "address": 10887,
   "type": "line",
   "text": "Right hand holds something that is not a weapon: \"-NOTHING IN RIGHT HAND TO FIGHT WITH-\" on a line of its own, and no attack (the 10 ticks still pass)."
  },
  {
   "address": 10901,
   "type": "line",
   "text": "Weapon in $03A8. A target already dead would get \"IT IS ALREADY DEAD.\" ($4853); from this menu, which lists only live creatures, that cannot happen."
  },
  {
   "address": 10926,
   "type": "line",
   "text": "Print the weapon's name, FIST ($4827) for object 0 or its noun, and end the sentence."
  },
  {
   "address": 10953,
   "type": "line",
   "text": "To-hit roll: (random AND 31) + the player's skill $4E05 (25), + 8 while the Ring of Dexterity (object $12) is worn ($4AD3 = $4AC1+$12 = 2), passed through $2B5F for special weapons. A hit when the total minus the target's defence $4DC7,x has bit 7 clear; otherwise \"YOU MISSED.\" ($482C, white)."
  },
  {
   "address": 10962,
   "type": "side",
   "text": "+ player's attack skill (25)"
  },
  {
   "address": 10965,
   "type": "side",
   "text": "state of object $12, the Ring of Dexterity: 2 = worn"
  },
  {
   "address": 10981,
   "type": "side",
   "text": "target's defence"
  },
  {
   "address": 10997,
   "type": "line",
   "text": "A hit: \"YOU HIT.\" ($4839, blue), then the damage $038A = (random AND the weapon's mask $4E45,x) + the player's strength $4D89 / 8 (18 / 8 = 2): fist 2-3, dagger 2-5, sword, axe or mace 2-9. The Dagger of Death (object 6) against the minotaur ($3F) does 30 instead."
  },
  {
   "address": 11013,
   "type": "side",
   "text": "weapon's damage mask: 1 fist, 3 dagger, 7 sword/axe/mace"
  },
  {
   "address": 11019,
   "type": "side",
   "text": "player's strength (18), /8 below"
  },
  {
   "address": 11051,
   "type": "line",
   "text": "The wooden dagger (object 5, \"IT IS MADE OF WOOD\") against either vampire ($3D or $3E): damage 30."
  },
  {
   "address": 11074,
   "type": "line",
   "text": "Take the damage off the creature's body $4EC5,x. A borrow means it went below zero: its possessions fall to its square ($3B63) and \"YOU KILLED IT.\" ($4843) is printed; the body is left at the wrapped, negative value."
  },
  {
   "address": 11103,
   "type": "line",
   "text": "Weapon-against-creature adjustments to the to-hit total in A (weapon $03A8, target X); returns the total in A. Of its three tests only the last can pass: (1) a mace ($16 or $17) against creatures $28-$2F would add 8, but the test needs the weapon to be $16 and $17 at once; (2) the wooden dagger (5) against the vampires would take $4E04 (60, vampire 1's defence), but needs X to be $3D and $3E at once; (3) the Dagger of Death (6) against the minotaur ($3F) replaces the total with $4E06 = $85, exactly the minotaur's defence, so that attack always hits."
  },
  {
   "address": 11111,
   "type": "side",
   "text": "never passes: A is $16 here, so it is never $17 (dead code to $2B77)"
  },
  {
   "address": 11128,
   "type": "line",
   "text": "Second test, dead: the wooden dagger (5) against a vampire. The two CPX need X to be $3D and $3E at once, so $2B87-$2B8B never run."
  },
  {
   "address": 11139,
   "type": "side",
   "text": "never passes: X is $3D here, so it is never $3E"
  },
  {
   "address": 11148,
   "type": "line",
   "text": "Third test, live: the Dagger of Death (6) against the minotaur ($3F) takes $4E06 ($85) as the total, equal to the minotaur's defence, so the hit is certain."
  },
  {
   "address": 11164,
   "type": "line",
   "text": "Pull the total, replaced or not, back into A and return."
  },
  {
   "address": 11166,
   "type": "line",
   "text": "Pseudo-random byte in A, read from the KERNAL ROM (banked in: $01 = $36 in play): A = ROM[$F000 + ROM[$E000 + i]] EOR ROM[$E800 + j], with i = $0383 and j = $0384; then i goes up by 1 and j down by 3. X and Y are kept ($0385/$0386). Since i + 1 and j - 3 leave (j + 3i) mod 256 unchanged, the output repeats every 256 calls; the title seeds i and j from $A540/$A541 ($F8/$18) whenever its scroller starts over ($5DF2), and every snapshot from the demonstration on is on that one 256-byte cycle. The three ROM pages it reads are identical in KERNAL revisions 901227-01, -02 and -03 (VICE's ROM files)."
  },
  {
   "address": 11188,
   "type": "side",
   "text": "i + 1"
  },
  {
   "address": 11191,
   "type": "side",
   "text": "j - 3 (three DECs)"
  },
  {
   "address": 11207,
   "type": "line",
   "text": "Prints a zero-terminated string (X = low byte, Y = high byte of its address) through the KERNAL's CHROUT ($FFD2), so its PETSCII control codes (clear screen, colours, cursor moves) work. Used for the play screen's frame at $50FA (the M and B labels, the empty bars, the 00:00;00 clock and the message window's border; from $0A3D) and, on the title, for the controls screen $838E and the instruction pages $84B7, $86E7, $8893, $8B1B and $8DB1 ($5C7C-$5CBE). Uses $9B/$9C as the pointer."
  },
  {
   "address": 11230,
   "type": "line",
   "text": "Draws the two strength bars on the top line: M for mind ($4F46) in cells $040D-$0414 and B for body ($4EC5) in $0417-$041E, in eighths of a cell: glyph $29 is a full cell, $22-$28 one to seven eighths, $21 an empty cell, and the cell after each bar ($0415, $041F) is written empty too. Mind shows 2 eighths per point (30 = 7 1/2 cells); body shows 2 x (body + 1) eighths, so a dead player (body negative) shows an empty bar. Called by the main loop every turn ($0824), the tick loop ($08E4), on the player's death ($24EA), after DRINK ($2E1F) and after a failed CAST ($2E7F). Values above 32 are never reached (the maxima are 30)."
  },
  {
   "address": 11239,
   "type": "line",
   "text": "M bar: while 8 or more eighths remain draw a full cell; the remainder, 0-7, becomes the glyph $21 + remainder."
  },
  {
   "address": 11255,
   "type": "line",
   "text": "Full M cell ($29), move to the next cell and take 8 eighths off."
  },
  {
   "address": 11273,
   "type": "line",
   "text": "Fill the rest of the M bar with the empty glyph $21, up to and including the ninth cell $0415."
  },
  {
   "address": 11295,
   "type": "line",
   "text": "B bar from 2 x (body + 1) eighths; a body of -1 or less (dead), or 127 and more, was turned into 0 just before."
  },
  {
   "address": 11299,
   "type": "line",
   "text": "B bar: full cells while 8 or more eighths remain, then the partial glyph $21 + remainder."
  },
  {
   "address": 11315,
   "type": "line",
   "text": "Full B cell ($29), next cell, 8 eighths fewer."
  },
  {
   "address": 11333,
   "type": "line",
   "text": "Fill the rest of the B bar with $21, up to and including the ninth cell $041F."
  },
  {
   "address": 11344,
   "type": "line",
   "text": "The game clock, called once per game tick by the tick loop ($08ED), so it stands still while the menu waits. $03BC counts 8 ticks to a clock second (4 for the first one of a new game, $09F5). Each second it counts up the digit characters on the top line: seconds $0426/$0427 (00-59), minutes $0423/$0424 (00-59), hours $0420/$0421 (00-99); after 99:59;59 the display goes back to 00:00;00. How long a tick is in real time is not established: the tick loop waits for the frame only while walking or running ($0ABF)."
  },
  {
   "address": 11350,
   "type": "line",
   "text": "A clock second: reload the divider with 8 and add one to the units of seconds ($0427)."
  },
  {
   "address": 11371,
   "type": "line",
   "text": "Units of seconds passed 9: back to 0, carry into the tens of seconds ($0426, which go up to 5)."
  },
  {
   "address": 11392,
   "type": "line",
   "text": "Tens of seconds passed 5: back to 0, carry into the units of minutes ($0424)."
  },
  {
   "address": 11413,
   "type": "line",
   "text": "Units of minutes passed 9: back to 0, carry into the tens of minutes ($0423, up to 5)."
  },
  {
   "address": 11434,
   "type": "line",
   "text": "Tens of minutes passed 5: back to 0, carry into the units of hours ($0421)."
  },
  {
   "address": 11455,
   "type": "line",
   "text": "Units of hours passed 9: back to 0 and one more ten of hours ($0420); when that passes 9 it goes back to 0, so the clock wraps at 100 hours."
  },
  {
   "address": 11476,
   "type": "line",
   "text": "EXAMINE, menu option 14 (then 10 ticks): clears the menu and the picture strip and lists, with their pictures, the PEDESTAL (noun $40) when the player stands on its square $9677, everything the player holds (in a hand or worn: $3FB0 and $3F70 both 0; the backpack's contents are not listed) and everything on the player's square, dead creatures included; then -NOTHING-. For the choice it prints \"EXAMINE <name>.\" and the description: $571E,x gives its number and $575F/$577B the address of its text (e.g. the pedestal's \"A RAISED GOLDEN PLATFORM, THICKLY COVERED WITH DUST\"). -NOTHING- prints nothing."
  },
  {
   "address": 11507,
   "type": "line",
   "text": "List entities 1-$3F: first the check for something the player holds, then for something on the player's square."
  },
  {
   "address": 11525,
   "type": "line",
   "text": "Not held by the player: listed when its map address ($3F70/$3FB0) is the player's."
  },
  {
   "address": 11567,
   "type": "line",
   "text": "Something chosen ($03A7): \"EXAMINE <name>.\", then its description through $571E,x (description number) and $575F/$577B (text address lows and highs), and the sentence ends."
  },
  {
   "address": 11614,
   "type": "line",
   "text": "DRINK, menu option 15 (then 10 ticks): lists the potions (objects with $4B41,x set: $0B-$0F) the player holds, not those in the backpack, prints \"DRINK <name>.\" for the choice and uses it up. Effects by object number: $0B and $0F (\"POTION OF HEALING\") add 8-15 to the body $4EC5, up to the maximum $4E85; $0C (label \"ALUMROF ECNEGILLETNI ARTXE\", EXTRA INTELLIGENCE FORMULA backwards) adds 8-15 to the mind $4F46, up to $4F05; $0D (\"IT SMELLS PUNGENT, THERE IS NO LABEL\") halves the body; $0E (\"POTION OF ORCANIAN INTELLECT\") halves the mind. Then the hand that held it is emptied and the bars are redrawn ($2BDE)."
  },
  {
   "address": 11663,
   "type": "line",
   "text": "A potion chosen ($03A7): \"DRINK <name>.\", then it leaves the game: $3FB0 = 0 (held) and holder $3F70 = $FF, which is no entity."
  },
  {
   "address": 11710,
   "type": "line",
   "text": "Healing, objects $0B and $0F: body + 8 + (random AND 7), no more than the maximum body $4E85."
  },
  {
   "address": 11729,
   "type": "line",
   "text": "Store the healed body strength."
  },
  {
   "address": 11735,
   "type": "line",
   "text": "Object $0C, the mind potion: mind + 8 + (random AND 7), no more than the maximum mind $4F05."
  },
  {
   "address": 11758,
   "type": "line",
   "text": "Store the restored mind."
  },
  {
   "address": 11764,
   "type": "line",
   "text": "Object $0D: the body strength is halved."
  },
  {
   "address": 11768,
   "type": "side",
   "text": "the crack's body trainer makes this $AD, LDA $4EC5"
  },
  {
   "address": 11774,
   "type": "line",
   "text": "Object $0E, \"POTION OF ORCANIAN INTELLECT\": the mind is halved."
  },
  {
   "address": 11778,
   "type": "side",
   "text": "the crack's mind trainer makes this $AD, LDA $4F46"
  },
  {
   "address": 11781,
   "type": "line",
   "text": "Empty whichever hand held the potion ($4C01 right, $4C02 left, $FF = empty), then redraw the M and B bars."
  },
  {
   "address": 11811,
   "type": "line",
   "text": "CAST, menu option 16 (then 20 ticks; the menu offers it only while no spell is sustained, $57D2 = $FF, $126B): shows the four spell names ($57CA/$57CE) and -NOTHING- in the two-column spell layout ($3A93, normal layout back with $3A79), prints \"CAST <spell>\" and compares the mind $4F46 with the cost $57D5,x (6, 10, 1, 5). Too little: the mind drops to 0 and \"THE SPELL DID NOT WORK PROPERLY BECAUSE YOU DID NOT HAVE ENOUGH MIND POWER\". Otherwise the cost is paid first, then: 0 MAGIC MISSILE at a creature in sight, damage 15, power 20; 3 ENERGY DRAIN at a creature in sight, damage 7, power 60; 1 FIREBALL on every creature in sight within two squares, damage 15, power 60; 2 MAGICAL SHIELD makes $57D3 = 8 and stays up ($57D2 = 2) until uncast. Damage goes through $3AC7."
  },
  {
   "address": 11819,
   "type": "line",
   "text": "Add the four spell names to the menu, with the values 0-3."
  },
  {
   "address": 11867,
   "type": "line",
   "text": "A spell chosen ($03A7): print \"CAST \" and its name, then test the mind against the cost $57D5,x with CMP / BPL (the sign of the difference)."
  },
  {
   "address": 11920,
   "type": "line",
   "text": "Enough mind: pay the cost. The SBC has no SEC before it, but the CMP above left the carry set (mind at least the cost), so the subtraction is exact. A spell with an upkeep interval ($57D9,x not 0: only the shield) becomes the sustained spell $57D2, which swaps CAST for UNCAST in the menu."
  },
  {
   "address": 11923,
   "type": "side",
   "text": "the crack's mind trainer makes this NOP / SBC #$00"
  },
  {
   "address": 11937,
   "type": "line",
   "text": "Magical shield (2): $57D3 = 8, which every monster's attack roll loses ($2491); end the sentence."
  },
  {
   "address": 11952,
   "type": "line",
   "text": "Magic missile (0): \" AT \", a live creature in sight chosen with $3B17 (the mind is already paid, -NOTHING- wastes it), then $3AC7 with damage 15 and power 20."
  },
  {
   "address": 11986,
   "type": "line",
   "text": "Energy drain (3): \" AT \", a live creature in sight chosen with $3B17, then $3AC7 with damage 7 and power 60."
  },
  {
   "address": 12020,
   "type": "line",
   "text": "Fireball (1): end the sentence, then $3AC7 with damage 15 and power 60 on every creature $21-$3F in sight ($3EB0,x) whose distance $5041,x is below 17 (8 per square): the player's own square, the eight round it and the four two squares away in a straight line. The player is not hurt."
  },
  {
   "address": 12066,
   "type": "line",
   "text": "UNCAST, menu option 17 (then 10 ticks; offered only while a spell is sustained), also called by $3A75 when the shield's upkeep finds no mind left: prints \"UNCAST <spell>.\" for the spell in $57D2, clears the upkeep counters $03C3/$03C4, sets $57D2 to $FF (no spell) and, for the shield (2), sets the attack roll penalty $57D3 back to 0."
  },
  {
   "address": 12288,
   "type": "line",
   "text": "Character set of the top and menu bands, 256 glyphs of 8 bytes to $37FF: band 0 sets $D018 = $1D in VIC bank 0 (characters at $3000). Loaded with the game and never written (the same in entry-07f9.vsf). Screen codes are glyph numbers, and the map's bytes are glyph numbers too. Glyph $00, the '@' position, is a solid block; the groups that follow are labelled."
  },
  {
   "address": 12296,
   "type": "line",
   "text": "Glyphs $01-$1A: the letters A-Z at their screen-code places. The game's text is upper-case PETSCII, brought to these codes by subtracting $40 (the menus at $1151, the messages at $2941)."
  },
  {
   "address": 12504,
   "type": "line",
   "text": "Glyphs $1B and $1C: an inverse M and B in a frame, the labels of the mind and body bars on the status line (PETSCII [ and \\ in the screen frame string at $50FA)."
  },
  {
   "address": 12520,
   "type": "line",
   "text": "Glyphs $1D-$1F: a 5, a 7 and a C crossed by a bar, in normal video. None of the game's own strings (messages $46B3-$4930, descriptions $51D1-$5704, the frame at $50FA) uses them; the title's text is shown in another character set."
  },
  {
   "address": 12544,
   "type": "line",
   "text": "Glyph $20: the space, blank; $1106, $28AE and $28DD clear the menu and message windows with it."
  },
  {
   "address": 12552,
   "type": "line",
   "text": "Glyphs $21-$29: the cells of the status bars, drawn inverted: $21 is solid (an empty cell, and the black status line and the solid row 11 below the windows); $22-$29 open 1 to 8 eighths of a channel three pixels high. $2BDE draws 8 cells a bar, so a bar holds 64 units."
  },
  {
   "address": 12624,
   "type": "line",
   "text": "Glyphs $2A-$2F: $2A blank; $2B an apostrophe at the '+' position (the game writes YOU+RE); $2C comma, $2D minus, $2E full stop, $2F slash."
  },
  {
   "address": 12672,
   "type": "line",
   "text": "Glyphs $30-$3A: the digits 0-9 and the colon drawn inverted, like the bar cells, so on the status line (colour 0 on the yellow background) the clock ($0420-$0427, advanced by $2C50) reads as yellow figures on black."
  },
  {
   "address": 12760,
   "type": "line",
   "text": "Glyphs $3B-$3F: $3B an inverted dot, the clock's separator between minutes and seconds ($0425, a ';' in the frame string); $3C a thin hook; $3D =, $3E >, $3F ?."
  },
  {
   "address": 12800,
   "type": "line",
   "text": "Glyphs $40-$4D: the message window's frame, printed by the frame string at $50FA: $40 top-left corner, $41 and $42 top edge, $43 top-right corner, $44 and $45 right edge, $46 bottom-right corner, $47 and $48 bottom edge, $49 and $4A the bottom-left corner, $4B-$4D left edge."
  },
  {
   "address": 12912,
   "type": "line",
   "text": "Glyph $4E blank; glyph $4F a 2 in normal video, which appears only in the map's last cells ($9FFD-$9FFE)."
  },
  {
   "address": 12928,
   "type": "line",
   "text": "Glyphs $50-$53, multicolour map tiles in blue: $50 open water, $51-$53 water with a shore; they draw the small pool beside the pedestal ($95F5-$95F6) and larger ones in map rows 22-28."
  },
  {
   "address": 12960,
   "type": "line",
   "text": "Glyphs $54-$5F: blank (all zero)."
  },
  {
   "address": 13056,
   "type": "line",
   "text": "Glyphs $60-$63, multicolour map tiles: $60 a small yellow mark under a wall line (three in map row 20; what it depicts is unknown), $61 and $63 floor with water at one side, $62 blank."
  },
  {
   "address": 13088,
   "type": "line",
   "text": "Glyphs $64-$6F: blank."
  },
  {
   "address": 13184,
   "type": "line",
   "text": "Glyphs $70-$73, multicolour map tiles: $70 a yellow block on the floor, the pedestal's tile at $9677 where putting down the amulet wins ($1B86); $71-$73 the water beside it ($9675-$9676)."
  },
  {
   "address": 13216,
   "type": "line",
   "text": "Glyphs $74-$7D: blank."
  },
  {
   "address": 13296,
   "type": "line",
   "text": "Glyph $7E: solid rock, 1565 of the map's 4096 cells. Glyph $7F: solid too, the view window's 'not seen' cell that fills everything the rays have not reached ($0F45, $0DD6). Both have colour $08 in $A400, so they show black."
  },
  {
   "address": 13312,
   "type": "line",
   "text": "Glyphs $80-$B9: the dungeon's floor and wall tiles, multicolour. Floor is pixel pair %01 and walls are lines of pair %10 along a tile's edges ($91, the commonest, all floor; $81 a wall along the top; $83 top and bottom; $90 the left side); the curved cave pieces $8D-$8F, $9D, $9F and $AD-$AF fill their outer corners with %11 in black. The ray caster ($0C4F) stops at %10, so the walls block sight. The map never uses $93, $94, $9E (blank) or $A4."
  },
  {
   "address": 13696,
   "type": "line",
   "text": "Glyphs $B0-$B3: the ends of the passages. Whoever stands on $B1 (or on $A3) is moved 32 map columns right, on $B2 32 columns left ($20CC, for the creatures and the player); $B0 and $B3 are counted for the scenery pictures ($1710-$171E)."
  },
  {
   "address": 13728,
   "type": "line",
   "text": "Glyphs $B4-$BF: $B4-$B7 more wall pieces, $B8 and $B9 black diagonal corners; $BA-$BF are not in the map ($BC a comb pattern, the rest blank)."
  },
  {
   "address": 13824,
   "type": "line",
   "text": "Glyphs $C0-$CF: the items' small figures, shown as sprites in the view window ($4070 of each item): $C0 sword, $C1 dagger, $C2 axe, $C3 amulet, $C4 shield, $C5 mace, $C6 potion, $C7 ring, $C8 scroll, $CA backpack, $CB armour, $CC helmet. $C9 (a round bag) and $CE are figures no object uses; $CD and $CF are blank."
  },
  {
   "address": 13952,
   "type": "line",
   "text": "Glyphs $D0-$D9: the creatures' figures ($4070): $D0 orc, $D1 hellhound, $D2 vampire, $D4 snake, $D5 spider, $D6 bat, $D7 minotaur, $D8 wizard, $D9 skeleton; $D3, a figure with raised arms, is used by no object."
  },
  {
   "address": 14032,
   "type": "line",
   "text": "Glyphs $DA-$EF: blank."
  },
  {
   "address": 14208,
   "type": "line",
   "text": "Glyphs $F0-$FF: door tiles, multicolour. Bit 0 set = open; the door's other half lies below ($F0, $F4), above ($F2, $F6), right ($F8, $FC) or left ($FA, $FE), and OPEN and CLOSE change both halves ($1BBF, $1C85). The new-game setup closes every door ($09AE)."
  },
  {
   "address": 14336,
   "type": "line",
   "text": "Shape of sprite 0 (pointer $E0 at $07F8) in the top band: the player's dot in the view window. The new-game setup clears $3800-$39FF ($0A45-$0A50) and writes rows 0-3 of its first byte column: $60, $F0, $F0, $60, a round dot four pixels wide; row 0 is $3800."
  },
  {
   "address": 14339,
   "type": "line",
   "text": "Sprite 0, row 1, first byte: $F0 ($0A59), the dot's second row."
  },
  {
   "address": 14342,
   "type": "line",
   "text": "Sprite 0, row 2, first byte: $F0 ($0A5E), the dot's third row."
  },
  {
   "address": 14345,
   "type": "line",
   "text": "Sprite 0, row 3, first byte: $60 ($0A63), the dot's last row; the rest of sprite 0, to $383F, stays zero."
  },
  {
   "address": 14400,
   "type": "line",
   "text": "Shapes of sprites 1-3 (pointers $E1-$E3), 64 bytes each from $3840: objects in the view window. The multiplexer $0FEF copies a visible object's glyph ($3000 + 8 x its $4070) into rows 0-7 of the first byte column ($10B4-$10CD, every third byte); the rest stays zero."
  },
  {
   "address": 14592,
   "type": "line",
   "text": "Shape of sprite 4 (pointer $E4), the fourth object slot of the view window; filled like sprites 1-3 and cleared with them at a new game ($0A4C clears $3900-$39FF)."
  },
  {
   "address": 14656,
   "type": "line",
   "text": "Shapes of sprites 5-7 (pointers $E5-$E7), $3940-$39FF: the last three object slots of the view window, filled like sprites 1-4."
  },
  {
   "address": 14848,
   "type": "line",
   "text": "Sprite registers for band 0 (the top band), copied to the VIC each frame by the play interrupt ($26A2-$274D): $3A00-$3A0F go to $D000-$D00F. This byte is sprite 0's X, the player's dot: $3E + the player's pixel column $3FF0 ($0D27, $0D75, $1C72)."
  },
  {
   "address": 14849,
   "type": "line",
   "text": "Band 0 image of $D001: the player's dot Y, $58 + the player's pixel row $4030 ($0D30, $0D96, $1C7B)."
  },
  {
   "address": 14850,
   "type": "line",
   "text": "Band 0 image of $D002, sprite 1 X. The multiplexer writes sprites 1-7's X at $3A02 + 2 x slot ($105B): $53 + 8 x (16 - the column offset) + the object's pixel column, 8 bits (band 0 clears $D010)."
  },
  {
   "address": 14851,
   "type": "line",
   "text": "Band 0 image of $D003, sprite 1 Y. The multiplexer writes sprites 1-7's Y at $3A03 + 2 x slot ($1082): $C5 + 8 x (16 - the row offset) + the object's pixel row."
  },
  {
   "address": 14852,
   "type": "line",
   "text": "Band 0 image of $D004: sprite 2 X, the second object slot, written by $105B."
  },
  {
   "address": 14853,
   "type": "line",
   "text": "Band 0 image of $D005: sprite 2 Y, the second object slot, written by $1082."
  },
  {
   "address": 14854,
   "type": "line",
   "text": "Band 0 image of $D006: sprite 3 X (third object slot)."
  },
  {
   "address": 14855,
   "type": "line",
   "text": "Band 0 image of $D007: sprite 3 Y (third object slot)."
  },
  {
   "address": 14856,
   "type": "line",
   "text": "Band 0 image of $D008: sprite 4 X (fourth object slot)."
  },
  {
   "address": 14857,
   "type": "line",
   "text": "Band 0 image of $D009: sprite 4 Y (fourth object slot)."
  },
  {
   "address": 14858,
   "type": "line",
   "text": "Band 0 image of $D00A: sprite 5 X (fifth object slot)."
  },
  {
   "address": 14859,
   "type": "line",
   "text": "Band 0 image of $D00B: sprite 5 Y (fifth object slot)."
  },
  {
   "address": 14860,
   "type": "line",
   "text": "Band 0 image of $D00C: sprite 6 X (sixth object slot)."
  },
  {
   "address": 14861,
   "type": "line",
   "text": "Band 0 image of $D00D: sprite 6 Y (sixth object slot)."
  },
  {
   "address": 14862,
   "type": "line",
   "text": "Band 0 image of $D00E: sprite 7 X (seventh and last object slot)."
  },
  {
   "address": 14863,
   "type": "line",
   "text": "Band 0 image of $D00F: sprite 7 Y (seventh and last object slot)."
  },
  {
   "address": 14864,
   "type": "line",
   "text": "Band 0 image of $D015, sprite enable: bit 0 the player's dot, always on ($0D1F-$0D24); bits 1-7 the objects the multiplexer placed (the mask from $038E, $10FF)."
  },
  {
   "address": 14865,
   "type": "line",
   "text": "Band 0 image of $D017, Y expansion: 0 from the new-game setup ($093B) and never set; band 0 also clears $D017 itself right after copying it ($2752)."
  },
  {
   "address": 14866,
   "type": "line",
   "text": "Band 0 image of $D01B, sprite priority: 0 from the new-game setup ($093E) and never changed."
  },
  {
   "address": 14867,
   "type": "line",
   "text": "Band 0 image of $D01C, sprite multicolour: 0 ($0941), so the view-window sprites are single-colour."
  },
  {
   "address": 14868,
   "type": "line",
   "text": "Band 0 image of $D01D, X expansion: 0 ($0944); band 0 clears $D01D itself after copying it ($2755)."
  },
  {
   "address": 14869,
   "type": "line",
   "text": "Band 0 image of $D027: the player's dot colour, 7, yellow ($0D39)."
  },
  {
   "address": 14870,
   "type": "line",
   "text": "Band 0 image of $D028, sprite 1's colour. The multiplexer writes sprites 1-7's colours at $3A16 + slot ($108F): the $A400 entry of the object's glyph."
  },
  {
   "address": 14871,
   "type": "line",
   "text": "Band 0 image of $D029: sprite 2's colour (second object slot)."
  },
  {
   "address": 14872,
   "type": "line",
   "text": "Band 0 image of $D02A: sprite 3's colour (third object slot)."
  },
  {
   "address": 14873,
   "type": "line",
   "text": "Band 0 image of $D02B: sprite 4's colour (fourth object slot)."
  },
  {
   "address": 14874,
   "type": "line",
   "text": "Band 0 image of $D02C: sprite 5's colour (fifth object slot)."
  },
  {
   "address": 14875,
   "type": "line",
   "text": "Band 0 image of $D02D: sprite 6's colour (sixth object slot)."
  },
  {
   "address": 14876,
   "type": "line",
   "text": "Band 0 image of $D02E: sprite 7's colour (seventh object slot). $3A1D-$3A1F are not used."
  },
  {
   "address": 14880,
   "type": "line",
   "text": "Sprite registers for band 2, the picture strip, copied by the play interrupt ($27EA-$2875): $3A20-$3A2F go to $D000-$D00F. Sprite n's X is at $3A20 + 2n, set from the slot's $59D1 when a dead creature's picture is shown ($15B2)."
  },
  {
   "address": 14881,
   "type": "line",
   "text": "Band 2 image of $D001; sprite n's Y is at $3A21 + 2n, from the picture slot's $59DD ($15B8)."
  },
  {
   "address": 14882,
   "type": "line",
   "text": "Band 2 image of $D002: X of the second DEAD mark sprite."
  },
  {
   "address": 14883,
   "type": "line",
   "text": "Band 2 image of $D003: Y of the second DEAD mark sprite."
  },
  {
   "address": 14884,
   "type": "line",
   "text": "Band 2 image of $D004: X of DEAD mark sprite 2."
  },
  {
   "address": 14885,
   "type": "line",
   "text": "Band 2 image of $D005: Y of DEAD mark sprite 2."
  },
  {
   "address": 14886,
   "type": "line",
   "text": "Band 2 image of $D006: X of DEAD mark sprite 3."
  },
  {
   "address": 14887,
   "type": "line",
   "text": "Band 2 image of $D007: Y of DEAD mark sprite 3."
  },
  {
   "address": 14888,
   "type": "line",
   "text": "Band 2 image of $D008: X of DEAD mark sprite 4."
  },
  {
   "address": 14889,
   "type": "line",
   "text": "Band 2 image of $D009: Y of DEAD mark sprite 4."
  },
  {
   "address": 14890,
   "type": "line",
   "text": "Band 2 image of $D00A: X of DEAD mark sprite 5."
  },
  {
   "address": 14891,
   "type": "line",
   "text": "Band 2 image of $D00B: Y of DEAD mark sprite 5."
  },
  {
   "address": 14892,
   "type": "line",
   "text": "Band 2 image of $D00C: X of DEAD mark sprite 6."
  },
  {
   "address": 14893,
   "type": "line",
   "text": "Band 2 image of $D00D: Y of DEAD mark sprite 6."
  },
  {
   "address": 14894,
   "type": "line",
   "text": "Band 2 image of $D00E: X of DEAD mark sprite 7."
  },
  {
   "address": 14895,
   "type": "line",
   "text": "Band 2 image of $D00F: Y of DEAD mark sprite 7."
  },
  {
   "address": 14896,
   "type": "line",
   "text": "Band 2 image of $D015: a bit per sprite in use over the picture strip, set when a dead creature's picture is placed ($158D) and cleared with its slot ($14E1); 0 at a new game ($0947). Band 2 gives all eight sprites colour $0A, double size, and the one shape at $A500 (pointers $94 at $ABF8), which spells DEAD. $3A31-$3A3C are not used."
  },
  {
   "address": 14909,
   "type": "line",
   "text": "Band 2 image of $D010, bit 8 of each sprite's X over the picture strip: set or cleared per sprite from the slot's $59E9 ($1593-$15A9)."
  },
  {
   "address": 14912,
   "type": "line",
   "text": "Upkeep of a sustained spell, called once per game tick by the tick loop ($08F0); nothing happens while $57D2 is $FF. Otherwise $03C3 counts ticks to 100 and $03C4 counts those hundreds up to the spell's interval $57D9,x (1 for the shield); each time both are full, one point comes off the mind $4F46. When the mind would drop below 0 it is held at 0 and the spell is uncast ($2F22). So the shield costs 1 mind point to cast and then 1 per 100 ticks (12.5 clock seconds)."
  },
  {
   "address": 14950,
   "type": "side",
   "text": "the crack's mind trainer makes this $AD, LDA $4F46"
  },
  {
   "address": 14969,
   "type": "line",
   "text": "Sets the menu band to its normal layout: 16 slots ($03BF) of 10 characters ($03BE), 4 to a row ($03C0); the stick moves down only from slots below 12 ($03C1) and up only from slot 4 on ($03C2). Called by the play setup ($09DF) and by CAST when the spell menu is done ($2E50)."
  },
  {
   "address": 14995,
   "type": "line",
   "text": "Sets the menu band to the spell layout CAST uses: 8 slots of 20 characters, 2 to a row, down only from slots below 6, up only from slot 2 on; wide enough for spell names of up to 14 characters (\"MAGICAL SHIELD\"). $3A79 restores the normal layout."
  },
  {
   "address": 15021,
   "type": "line",
   "text": "Adds entity X (object or creature) to the current menu: its noun from $4588/$45C9 as the text and X as the value returned when it is chosen ($1151), and its picture to the strip in the bottom band ($1515 with its size flag $586F,x). X is kept. Used by EXAMINE, DRINK and the target menu $3B17."
  },
  {
   "address": 15047,
   "type": "line",
   "text": "A spell's effect on creature $03A7, with the damage in X and the power in $57D4: nothing if it is already dead. It hits when 31 + power minus its defence $4DC7,x has bit 7 clear. Both calls to the random routine ($3AD3, $3AE5) are wasted: the LDA #$1F at $3AD6 replaces the first byte and the second is never read. So a spell never misses what it can hit and never hits what it cannot: power 20 (magic missile) fails every time against vampire 1 (defence 60) and the minotaur ($85), power 60 only against the minotaur. The damage comes off the body $4EC5,x; if that borrows, the body becomes $FF, its possessions drop ($3B63) and \"YOU KILLED THE <name>.\" is printed. A miss prints nothing."
  },
  {
   "address": 15059,
   "type": "line",
   "text": "Alive: the to-hit test, a fixed 31 + power against the creature's defence."
  },
  {
   "address": 15062,
   "type": "side",
   "text": "LDA, not AND: the random byte just fetched is thrown away"
  },
  {
   "address": 15077,
   "type": "line",
   "text": "The spell hits: the damage comes off the body; a borrow means the creature is killed."
  },
  {
   "address": 15127,
   "type": "line",
   "text": "Target menu for MAGIC MISSILE and ENERGY DRAIN: clears the menu and the picture strip, lists every live creature ($21-$3F, body not negative) in sight ($3EB0,x, set by the view code at $0FCF) with its picture, and -NOTHING-. Prints the chosen creature's name, or \"-NOTHING-\", ends the sentence and returns the choice in X ($FF for -NOTHING-)."
  },
  {
   "address": 15183,
   "type": "line",
   "text": "A creature chosen: print its name, end the sentence and return it in X."
  },
  {
   "address": 15203,
   "type": "line",
   "text": "A creature has died: every object (1-$20) it held ($3FB0 = 0 and holder $3F70 = X) is put down on the creature's square (its own $3F70/$3FB0) with its state $4AC1 set to 0 (loose), where the player can pick it up. Called by ATTACK ($2B51) and by the spells ($3AFC)."
  },
  {
   "address": 15239,
   "type": "line",
   "text": "Called once per game tick by the tick loop ($08E1): every 50 ticks ($03C8 counts them) the seven wandering creatures get a new random destination from $3BBA: the orcs $22 and $23, the skeletons $2A and $2B, the hellhound $2E and the bats $33 and $35. The other creatures keep theirs."
  },
  {
   "address": 15290,
   "type": "line",
   "text": "Gives creature X a random destination, the map address it walks towards when it is neither chasing nor fleeing ($23D5): low byte $4CAE,x = a random byte, high byte $4CCD,x = $90 + (random AND 15), so anywhere in the map $9000-$9FFF, rock included. The two tables are indexed by the creature number, so their entries are at $4CCF-$4CED and $4CEE-$4D0C; the new-game setup at $0924 clears 64 bytes from $4CEC, which zeroes every creature's high byte, so only these seven wanderers ever head for a square inside the map."
  },
  {
   "address": 15307,
   "type": "line",
   "text": "Ray caster: 28 bytes, one per ray: the offset (7 x ray, $00-$BD) of the ray's 7-step pattern in $3BF7, read at $0B7C and again every 7 steps at $0C38."
  },
  {
   "address": 15335,
   "type": "line",
   "text": "Ray caster: 8 bytes indexed by the ray's pixel column $F7: 80 80 20 20 08 08 02 02, the high bit of the multicolour pixel pair under it. A tile's glyph row masked with $3BEF and equal to this, pair %10, stops the ray in any tile ($0C64)."
  },
  {
   "address": 15343,
   "type": "line",
   "text": "Ray caster: 8 bytes indexed by $F7: C0 C0 30 30 0C 0C 03 03, both bits of the pixel pair under the ray ($0C57). In a tile whose $A400 colour is $0F (most door tiles, the pedestal's) a pair of %11 stops the ray too ($0C5F)."
  },
  {
   "address": 15351,
   "type": "line",
   "text": "Ray caster: the rays' step patterns, 28 x 7 bytes to $3CBA; step codes 0 up, 1 down, 2 left, 3 right, $FF stay (the ray moves by pixels, $0B8D-$0C1F). A ray repeats its pattern for 56 steps; the pauses keep every ray about 40 pixels, five tiles, long, so the view is round. This part: rays 0-6, from north (per 7 steps, ray 0 five up) turning towards east (ray 6 one up, five right)."
  },
  {
   "address": 15400,
   "type": "line",
   "text": "Ray step patterns for rays 7-13 (see $3BF7): ray 7 due east (five right), turning south to ray 13 (five down, one right)."
  },
  {
   "address": 15449,
   "type": "line",
   "text": "Ray step patterns for rays 14-20 (see $3BF7): ray 14 due south (five down), turning west to ray 20 (five left, one down)."
  },
  {
   "address": 15498,
   "type": "line",
   "text": "Ray step patterns for rays 21-27 (see $3BF7): ray 21 due west (five left), turning north to ray 27 (five up, one left), which closes the fan next to ray 0."
  },
  {
   "address": 15547,
   "type": "line",
   "text": "69 bytes counting 0 to 68 ($3CBB-$3CFF). The view scroll uses the first 11, columns 0-10 of a screen row, with the same columns one row down from $3D00, to move the view window's rows up ($0E7E-$0E90) or down ($0EF0-$0F02) when the player enters the tile below or above; entries 64-67 serve at $3CFB."
  },
  {
   "address": 15611,
   "type": "line",
   "text": "Entries 64-68 of the counting table at $3CBB: $3CFB-$3CFE hold $40-$43, read at $1756 and $1772 as the object numbers whose pictures stand for the scenery counted in view ($59F5-$59F8: closed doors, open doors, tile $B0, tile $B3). $3CFF, 68, is not read here."
  },
  {
   "address": 15616,
   "type": "line",
   "text": "69 bytes counting $28 to $6C ($3D00-$3D44): column offsets of the next screen row (40-50 for the view's 11 columns). The view scroll reads $3D00-$3D0A with $3CBB; the entries after them are not read."
  },
  {
   "address": 15685,
   "type": "line",
   "text": "View arrays, one entry per view cell: 121 = 11 x 11 row by row, cell 60 the player's own tile. The rays fill them during a sweep ($0C77): this one the low byte of the cell's map address, $3DBE the high byte, $3E37 the tile. $7F in all three is a cell no ray reached ($0F45 refills them at every sweep). $0FAA matches the objects' places against these addresses. Runs to $3DBD."
  },
  {
   "address": 15806,
   "type": "line",
   "text": "View arrays: high byte of each view cell's map address ($90-$9F, or $7F not seen), 121 entries to $3E36 (see $3D45)."
  },
  {
   "address": 15927,
   "type": "line",
   "text": "View arrays: the tile each view cell showed the rays, $7F if none reached it; 121 entries to $3EAF. At the end of a sweep $0F58 copies them to the view window at $0400 (11 x 11, colours from $A400), which is why the window shows only what is in the line of sight."
  },
  {
   "address": 16048,
   "type": "line",
   "text": "Per-object arrays, 64 entries each (0 the player, $01-$20 items, $21-$3F creatures), $3EB0-$412F. This one: 1 if the object's map address was among the view cells of the last sweep, else 0 ($0FAA, which also has each such object note where the player stood, $4C4F/$4C8F). Read by the view sprites ($100C), the pictures ($1697), a creature's reaction ($2308), its footsteps ($223D), the spell targets ($3B1F) and the fireball ($2EFD). Entry 0 is never set."
  },
  {
   "address": 16112,
   "type": "line",
   "text": "Each object's starting place, low byte (with $3F30), coded like $3F70: a map address, or the holder's number when $3F30 is 0 (the player starts at $947B; a scroll, $19, in the backpack; many items with a creature). Copied to $3F70 at every new game ($094C) and read nowhere else."
  },
  {
   "address": 16176,
   "type": "line",
   "text": "Each object's starting place, high byte: $90-$9F on the map, 0 when it starts held by another object; copied to $3FB0 at every new game ($0952)."
  },
  {
   "address": 16240,
   "type": "line",
   "text": "Where each object is now, low byte (with $3FB0). With $3FB0 = $90-$9F, the low byte of its map address (128 tiles a row, 32 rows; the tile is the byte there). With $3FB0 = 0, the object holding it: 0 the player, 7 the backpack (the only container), $21-$3F a creature; $FF a drunk potion ($2DB3). Changed by moves ($0DA5-$0ECE, $2279-$22E8), the passage tiles ($20CC), the item verbs and a dying creature's drop ($3B63)."
  },
  {
   "address": 16241,
   "type": "line",
   "text": "$3F70 entry of object 1, the armour. The monster-hit adjustment reads it with $3FB1 ($24F8): when the player has it, worn or not, 5 comes off a monster's roll to hit."
  },
  {
   "address": 16242,
   "type": "line",
   "text": "$3F70 entry of object 2, the helmet: read at $250C; when the player has it, 2 comes off a monster's roll."
  },
  {
   "address": 16256,
   "type": "line",
   "text": "$3F70 entry of object $10, a ring: read at $2520; when the player has it, 8 is added to a monster's roll, so monsters hit more often."
  },
  {
   "address": 16257,
   "type": "line",
   "text": "$3F70 entry of object $11, a ring: read at $2534; when the player has it, 4 comes off a monster's roll."
  },
  {
   "address": 16304,
   "type": "line",
   "text": "Where each object is now, high byte: $90-$9F, the high byte of its map address, or 0 when another object holds it (see $3F70). Carried by the player means both bytes 0."
  },
  {
   "address": 16305,
   "type": "line",
   "text": "$3FB0 entry of the armour, object 1, read at $24FD with $3F71."
  },
  {
   "address": 16306,
   "type": "line",
   "text": "$3FB0 entry of the helmet, object 2, read at $2511 with $3F72."
  },
  {
   "address": 16320,
   "type": "line",
   "text": "$3FB0 entry of ring $10, read at $2525 with $3F80."
  },
  {
   "address": 16321,
   "type": "line",
   "text": "$3FB0 entry of ring $11, read at $2539 with $3F81."
  },
  {
   "address": 16368,
   "type": "line",
   "text": "Each object's pixel column 0-7 inside its tile; 4, the middle, at a new game ($0979). The player's follows the joystick ($0D60, its dot at X = $3E + it) and wraps into the next tile left or right ($0DA0, $0DF6); a creature's follows its heading ($22B5-$22E2). Added into the object's sprite X ($1055)."
  },
  {
   "address": 16432,
   "type": "line",
   "text": "Each object's pixel row 0-7 inside its tile; 4 at a new game ($097C). The player's follows the joystick ($0D82) and wraps into the tile above or below ($0E51, $0EC3); a creature's follows its heading ($2269-$229B); added into the sprite Y ($107C). $1C50, used by CLOSE, puts the player back to 4, 4 ($1C6A)."
  },
  {
   "address": 16496,
   "type": "line",
   "text": "Each object's small figure, a glyph number: the multiplexer copies glyph $3000 + 8 x it into a view sprite and colours the sprite from $A400 ($1085-$1092). Items $C0-$CC, creatures $D0-$D9 (see $3600, $3680); the player's $7F is never drawn this way. Never written: loaded data."
  },
  {
   "address": 16560,
   "type": "line",
   "text": "A creature's heading: 0-7 = N, NE, E, SE, S, SW, W, NW (the step bits at $4957), 8 standing to fight ($2401), $FF choose again ($2302, after a tile's width of steps; every object at a new game, $095A). The step routine stores the heading it picks ($25D7). The player and items stay $FF."
  },
  {
   "address": 16624,
   "type": "line",
   "text": "A creature's pixel steps along its heading, +1 a step ($22F8); at 8 it chooses again. Zeroed when a heading is picked ($25DC); set to $4FC3 + creature when it stops to fight ($23FC), so it stands for 8 minus that. The player's and items' entries are never used."
  },
  {
   "address": 16688,
   "type": "line",
   "text": "The menu verbs, each a $10 byte (a colour code: black, when the message printer prints it) and a zero-terminated PETSCII word: WALK $4130, RUN $4136, PICK UP $413B, PUT DOWN $4145, INVENTORY $4150, OPEN $415B, CLOSE $4161, WEAR $4168, TAKE OFF $416F, PUT IN $417A, TAKE OUT $4182, LOOK IN $418D, ATTACK $4197, SWAP $41A0, EXAMINE $41A6, DRINK $41B0, CAST $41B8, UNCAST $41BF. Reached only through immediate operands (LDX #$36 / LDY #$41 for RUN): the menu builder $11A2 lists them and the handlers print them. Nothing prints WALK, so that option is never offered."
  },
  {
   "address": 16840,
   "type": "line",
   "text": "The value of each line of the menu window: $1151 stores A at $41C8 + line (the option number in the main menu, an object or spell number in a submenu, $FF for -NOTHING-) and $147F returns the chosen line's. With the 16-item window it can use 17 bytes, $41C8-$41D8, over the start of the loaded code after it that nothing calls (entry-07f9.vsf: 77 43 A9 01 2C A9 03 85)."
  },
  {
   "address": 16848,
   "type": "line",
   "text": "Lines 8-16 of menu_line_values ($41C8): menu_add_entry ($1151) stores each line's value at $41C8 + line before it tests for a full window, so with the 16-line layout (menu_layout_normal) the stores reach $41D7, and $41D8 takes every entry a full list cannot show (the list's -NOTHING- included). Written only when a list is longer than 8 lines; as loaded the nine bytes are the start of the leftover monitor code that follows (STA $93 ends at $41D0, then LDA #$80, STA $020A, JSR $4DEE)."
  },
  {
   "address": 16857,
   "type": "line",
   "text": "Leftover code, never run: 943 bytes ($41D9-$4587) of a machine-code monitor that was in memory when the game was saved and survives between the game's verb strings and its noun tables. Recognisable parts: a load/save/verify command that collects a quoted file name at $0230 (length $B7, device $BA) and calls KERNAL internals ($F3D5, $F5AF, $F68F, $ED09, $EE13...); a command dispatch on the letters T C F M H E D I A (from $4377); and an A command that packs a mnemonic with SBC #$3F and five rotates, as Supermon-style monitors do. Its JSRs and table reads land in the game's own tables ($4956, $4966, $49C2, $4A13, $4DEE, $4F59, $4F99...), so it cannot run in this layout, and nothing in the game refers to any address in it (absolute operands, immediate address pairs and every pointer table checked). Left untyped; recommended for exclusion from coverage."
  },
  {
   "address": 17800,
   "type": "line",
   "text": "Noun names, low bytes of the pointers: 65 entries ($4588-$45C8) indexed by entity number, 0 the player, 1-32 the objects, 33-63 the creatures, 64 the PEDESTAL; high bytes at noun_name_hi ($45C9). Every message or menu line that names a thing does LDA noun_name_lo,X / LDY noun_name_hi,X and calls print_message or menu_add_entry (35 reads of each: PICK UP, INVENTORY, PUT DOWN, WEAR, the attack reports, EXAMINE, DRINK, menu_add_entity...). One string serves every entity of a kind (four DAGGERs, five ORCs, seven BATs), so the player cannot tell them apart by name. Entry 0 points at 'N' ($460A); no read with X = 0 was found."
  },
  {
   "address": 17864,
   "type": "line",
   "text": "Entry 64 of noun_name_lo: the low byte of the PEDESTAL's name ($469A). verb_examine loads it directly (LDX $45C8 at $2CE8) when it adds entity $40 to the EXAMINE menu, which it does only while the player stands on map address $9677, beside the pool."
  },
  {
   "address": 17865,
   "type": "line",
   "text": "Noun names, high bytes of the pointers for entities 0-63 (64 follows at $4609): all $46, the strings lying at $460A-$46A2. Paired with noun_name_lo ($4588)."
  },
  {
   "address": 17929,
   "type": "line",
   "text": "Entry 64 of noun_name_hi, the PEDESTAL's ($46), loaded directly by verb_examine (LDY $4609 at $2CEB)."
  },
  {
   "address": 17930,
   "type": "line",
   "text": "The one-letter string 'N', where entry 0 (the player) of the noun tables points; no code found prints it."
  },
  {
   "address": 17932,
   "type": "line",
   "text": "Noun 'ARMOUR', entity 1 only."
  },
  {
   "address": 17939,
   "type": "line",
   "text": "Noun 'HELMET', entity 2 only."
  },
  {
   "address": 17946,
   "type": "line",
   "text": "Noun 'DAGGER', shared by entities 3-6: two plain daggers, 5 the dagger of wood and 6 the DAGGER OF DEATH, told apart only by their EXAMINE texts."
  },
  {
   "address": 17953,
   "type": "line",
   "text": "Noun 'BACKPACK', entity 7, the only container."
  },
  {
   "address": 17962,
   "type": "line",
   "text": "Noun 'SWORD', shared by entities 8 and 9."
  },
  {
   "address": 17968,
   "type": "line",
   "text": "Noun 'AXE', entity 10."
  },
  {
   "address": 17972,
   "type": "line",
   "text": "Noun 'POTION', shared by the five potions, entities 11-15; what each does depends only on its number (verb_drink)."
  },
  {
   "address": 17979,
   "type": "line",
   "text": "Noun 'RING', shared by the five rings, entities 16-20."
  },
  {
   "address": 17984,
   "type": "line",
   "text": "Noun 'AMULET', entity 21: the Amulet of Immortality, which wins the game when put down on map address $9677 (verb_put_down)."
  },
  {
   "address": 17991,
   "type": "line",
   "text": "Noun 'MACE', shared by entities 22 and 23."
  },
  {
   "address": 17996,
   "type": "line",
   "text": "Noun 'SCROLL', shared by the six scrolls, entities 24-29."
  },
  {
   "address": 18003,
   "type": "line",
   "text": "Noun 'SHIELD', shared by entities 30-32."
  },
  {
   "address": 18010,
   "type": "line",
   "text": "Noun 'ORC', shared by creatures 33-37."
  },
  {
   "address": 18014,
   "type": "line",
   "text": "Noun 'WIZARD', creature 38 (Leggoless, by the scroll text desc_wizard_heals)."
  },
  {
   "address": 18021,
   "type": "line",
   "text": "Noun 'SKELETON', shared by creatures 39-44."
  },
  {
   "address": 18030,
   "type": "line",
   "text": "Noun 'HELLHOUND', shared by creatures 45-48."
  },
  {
   "address": 18040,
   "type": "line",
   "text": "Noun 'BAT', shared by creatures 49-55."
  },
  {
   "address": 18044,
   "type": "line",
   "text": "Noun 'SPIDER', shared by creatures 56-58."
  },
  {
   "address": 18051,
   "type": "line",
   "text": "Noun 'SNAKE', shared by creatures 59 and 60."
  },
  {
   "address": 18057,
   "type": "line",
   "text": "Noun 'VAMPIRE', shared by creatures 61 and 62."
  },
  {
   "address": 18065,
   "type": "line",
   "text": "Noun 'MINOTAUR', creature 63."
  },
  {
   "address": 18074,
   "type": "line",
   "text": "Noun 'PEDESTAL', entry 64: not an object but the fixed map cell $9677, named only in the EXAMINE menu."
  },
  {
   "address": 18083,
   "type": "line",
   "text": "'-NOTHING-': the cancel line every submenu ends with (menu_add_entry with A = $FF), and the word INVENTORY prints for an empty hand. Choosing it prints it only in ATTACK ($2A52), a spell's target menu (choose_creature_in_sight, $3B42) and PUT IN's container menu ($1EDE); the other submenus return silently."
  },
  {
   "address": 18093,
   "type": "line",
   "text": "' = ' in white ($11): unused, nothing refers to $46AD (no immediate address pair, pointer or table entry)."
  },
  {
   "address": 18098,
   "type": "line",
   "text": "Green 'YOU CANNOT CARRY THAT MUCH WEIGHT.': PICK UP ($1A07) when the object, what is inside it and everything the player holds weigh 70 or more."
  },
  {
   "address": 18134,
   "type": "line",
   "text": "Red: Thelric's parting words at the start of every game, printed by the new-game code at $0AA3: 'AS YOU LEAVE THELRIC SAYS...IF YOU DO NOT BRING ME THE AMULET OF IMMORTALITY AND PLACE IT ON THE PEDESTAL BY THIS POOL, YOU WILL NEVER RETURN HOME...'."
  },
  {
   "address": 18286,
   "type": "line",
   "text": "An empty string (only the terminator), printed straight after Thelric's words ($0AAA); print_message prints nothing for it."
  },
  {
   "address": 18287,
   "type": "line",
   "text": "Red 'YOU ARE CARRYING ': INVENTORY's opening ($1A33), then the right hand's object or -NOTHING-."
  },
  {
   "address": 18306,
   "type": "line",
   "text": "' IN YOUR RIGHT HAND, ' (INVENTORY, $1A5F), then the left hand's object or -NOTHING-."
  },
  {
   "address": 18328,
   "type": "line",
   "text": "' IN YOUR LEFT HAND, AND YOU ARE WEARING ' (INVENTORY, $1A8B), then the worn objects joined by msg_comma, or msg_only_clothes."
  },
  {
   "address": 18369,
   "type": "line",
   "text": "Green 'NO FREE HAND.': PICK UP, TAKE OFF and TAKE OUT with both hands full ($196A, $1D9C, $1F23)."
  },
  {
   "address": 18384,
   "type": "line",
   "text": "Black 'PUT ': PUT IN's report ($1E78), PUT <object> IN <container>."
  },
  {
   "address": 18390,
   "type": "line",
   "text": "' IN ' between the object and the container in PUT IN's report ($1E8C)."
  },
  {
   "address": 18395,
   "type": "line",
   "text": "' FROM ' in TAKE OUT's report ($1F94): TAKE OUT <object> FROM <container>."
  },
  {
   "address": 18402,
   "type": "line",
   "text": "Red 'IN THE ': LOOK IN's report ($2031), IN THE <container> YOU CAN SEE <contents>."
  },
  {
   "address": 18411,
   "type": "line",
   "text": "' YOU CAN SEE ' in LOOK IN's report ($2045), then the contents joined by msg_comma."
  },
  {
   "address": 18425,
   "type": "line",
   "text": "' WITH ' in the player's attack report ($2A6C): ATTACK <creature> WITH <weapon, or FIST>."
  },
  {
   "address": 18432,
   "type": "line",
   "text": "Green '-NOTHING IN RIGHT HAND TO FIGHT WITH-': ATTACK when the right hand holds something that is not a weapon ($2A8A); an empty right hand fights with the FIST instead."
  },
  {
   "address": 18471,
   "type": "line",
   "text": "'FIST': the weapon named when the player attacks with an empty right hand ($2AB5); the fist is entry 0 of weapon_damage."
  },
  {
   "address": 18476,
   "type": "line",
   "text": "White 'YOU MISSED.' ($2AEA): the player's roll fell short of the creature's defence."
  },
  {
   "address": 18489,
   "type": "line",
   "text": "Blue 'YOU HIT.' ($2AF5): the player's roll reached the creature's defence."
  },
  {
   "address": 18499,
   "type": "line",
   "text": "Green 'YOU KILLED IT.' ($2B54): the player's blow took the creature's body strength below 0."
  },
  {
   "address": 18515,
   "type": "line",
   "text": "Green 'IT IS ALREADY DEAD.' ($2AA3): ATTACK on a dead creature; unreachable, the ATTACK menu lists only live ones."
  },
  {
   "address": 18536,
   "type": "line",
   "text": "Black 'SWAP HANDS.': menu_swap's report ($20A5)."
  },
  {
   "address": 18549,
   "type": "line",
   "text": "Red 'THE ' opening a creature's attack report (creature_attack_player, $2407): THE <creature> ATTACKED YOU WITH ITS <weapon>."
  },
  {
   "address": 18555,
   "type": "line",
   "text": "Red ' ATTACKED YOU WITH ITS ' ($241B), then the weapon the creature holds or its natural weapon (natural_weapon_name_lo)."
  },
  {
   "address": 18580,
   "type": "line",
   "text": "White 'HE MISSED.' ($249C): a creature's roll fell short of the player's defence."
  },
  {
   "address": 18592,
   "type": "line",
   "text": "Blue 'HE HIT.' ($24A9): a creature's roll reached the player's defence."
  },
  {
   "address": 18601,
   "type": "line",
   "text": "Green 'YOU+RE DEAD...' ('+' is this character set's apostrophe): the player's body strength went below 0 (player_body_hit, $24DE); the game ends ($03C7 = 1)."
  },
  {
   "address": 18617,
   "type": "line",
   "text": "Green 'THE SPELL DID NOT WORK PROPERLY BECAUSE YOU DID NOT HAVE ENOUGH MIND POWER' (verb_cast, $2E85): the spell cost more than the mind left, which is then set to 0."
  },
  {
   "address": 18693,
   "type": "line",
   "text": "' AT ' after the spell's name when MAGIC MISSILE or ENERGY DRAIN asks for a target (verb_cast, $2EB4 and $2ED6)."
  },
  {
   "address": 18698,
   "type": "line",
   "text": "Green 'YOU KILLED THE ' (spell_hit_creature, $3AFF), then the creature's name: a spell killed it."
  },
  {
   "address": 18715,
   "type": "line",
   "text": "'NOTHING BUT YOUR CLOTHES': INVENTORY's ending when nothing is worn ($1AE2)."
  },
  {
   "address": 18740,
   "type": "line",
   "text": "' DOOR' after the verb in 'OPEN DOOR.' and 'CLOSE DOOR.' (verb_open $1BB1, verb_close $1C45)."
  },
  {
   "address": 18746,
   "type": "line",
   "text": "'POWER': unused, nothing refers to $493A (no immediate address pair, pointer or table entry)."
  },
  {
   "address": 18752,
   "type": "line",
   "text": "', ' between the worn objects in INVENTORY ($1AB5) and between the contents in LOOK IN ($206D)."
  },
  {
   "address": 18755,
   "type": "line",
   "text": "'.': print_full_stop ($29F1) prints it and starts a new line; it ends almost every report."
  },
  {
   "address": 18757,
   "type": "line",
   "text": "' ' (a single space): unused, nothing refers to $4945."
  },
  {
   "address": 18759,
   "type": "line",
   "text": "Compass direction for the class of a step (dx, dy) that direction_from_delta ($2114) builds in $0392 and reads back here ($2197): bit 0 set when |dy| > |dx|, bit 1 when dx >= 0, bit 2 when dy >= 0, bit 3 when the larger is at least twice the smaller (or the smaller is 0). 16 entries, values 0-7: 0 north (up the map: the address $80 lower), 1 north-east, 2 east, 3 south-east, 4 south, 5 south-west, 6 west, 7 north-west. A step within a factor of two of a diagonal gives the diagonal, otherwise the larger axis."
  },
  {
   "address": 18775,
   "type": "line",
   "text": "What each direction 0-8 does to a moving creature, one bit per unit step (creature_step, $225B, with the direction from $40B0): bit 0 up (fine y $4030 down, past 0 the map address - $80), bit 1 down, bit 2 left (fine x $3FF0 down, past 0 the address - 1), bit 3 right. 01 09 08 0A 02 06 04 05 for N NE E SE S SW W NW, and 00 for direction 8, the stand-still a creature is given when it strikes."
  },
  {
   "address": 18784,
   "type": "line",
   "text": "The eight single-bit masks 1, 2, 4 ... $80. creature_choose_move tests bit d of a tile's exit mask with it (can the creature leave that way in direction d); the picture strip uses it for sprite n's bit in the band-2 enable and X-MSB copies $3A30/$3A3D (picture_show, picture_slot_clear)."
  },
  {
   "address": 18792,
   "type": "line",
   "text": "Low bytes of the eight rows of move_order, one per wanted direction 0-7; creature_choose_move ($258E) puts the row for its direction in $9D/$9E. Highs at move_order_hi."
  },
  {
   "address": 18800,
   "type": "line",
   "text": "High bytes of the move_order row pointers (all $49); lows at move_order_lo ($4968)."
  },
  {
   "address": 18808,
   "type": "line",
   "text": "Order in which creature_choose_move tries directions when it wants to go north (0): 0 7 1 6 2 5 3 4, that is the wanted one, then alternately one step anticlockwise and one clockwise. Only the first six are tried ($2617 stops at 6), so 3 and 4 never are; a direction is passed over if it is the way back ($49B8) or the creature's tile has no exit that way. When none of the six will do, it turns back the way it came."
  },
  {
   "address": 18816,
   "type": "line",
   "text": "Try order when heading north-east (1): 1 0 2 7 3 6, then 4 5, never tried."
  },
  {
   "address": 18824,
   "type": "line",
   "text": "Try order when heading east (2): 2 1 3 0 4 7, then 5 6, never tried."
  },
  {
   "address": 18832,
   "type": "line",
   "text": "Try order when heading south-east (3): 3 2 4 1 5 0, then 6 7, never tried."
  },
  {
   "address": 18840,
   "type": "line",
   "text": "Try order when heading south (4): 4 3 5 2 6 1, then 7 0, never tried."
  },
  {
   "address": 18848,
   "type": "line",
   "text": "Try order when heading south-west (5): 5 4 6 3 7 2, then 0 1, never tried."
  },
  {
   "address": 18856,
   "type": "line",
   "text": "Try order when heading west (6): 6 5 7 4 0 3, then 1 2, never tried."
  },
  {
   "address": 18864,
   "type": "line",
   "text": "Try order when heading north-west (7): 7 6 0 5 1 4, then 2 3, never tried."
  },
  {
   "address": 18872,
   "type": "line",
   "text": "creature_choose_move's working byte: first the direction the creature must not take, its last step reversed (from creature_back_dir, $259D), then the reverse of the direction it chooses (from opposite_dir, $25BB), which it stores back into creature_back_dir ($25DF)."
  },
  {
   "address": 18873,
   "type": "line",
   "text": "Per creature (index 33-63, live bytes $49DA-$49F8, zero at load): the reverse of its last step's direction, which creature_choose_move avoids next time unless nothing else is open. creature_chase ($23A0) turns it round again through opposite_dir to keep the creature going the same way once it has reached the place it last saw the player. Entries 0-32 are unused zeros."
  },
  {
   "address": 18937,
   "type": "line",
   "text": "The opposite of each direction 0-7: 4 5 6 7 0 1 2 3 (creature_choose_move $25BB and $261E, creature_chase $23A4)."
  },
  {
   "address": 18945,
   "type": "line",
   "text": "Weight of each object 1-32, added up by sum_held_weight ($2890, which also counts what is inside a held container); PICK UP ($19EC) refuses with msg_too_heavy when the object, its contents and everything the player holds come to 70 or more. ARMOUR 40, HELMET 5, DAGGERs 3, BACKPACK 2, SWORDs 6, AXE 8, POTIONs 1, RINGs 0, AMULET 1, MACEs 8, SCROLLs 0, SHIELDs 10 (131 in all). The player (0) and the creatures (33-63) are given 100, which nothing reads."
  },
  {
   "address": 19009,
   "type": "line",
   "text": "Non-zero for a container: the BACKPACK (7), and entry 0, the player, which is never read (the objects he holds carry holder 0 in their position). main_menu_conditions ($12D2) counts held containers to offer PUT IN, TAKE OUT and LOOK IN; PUT IN ($1EA2) and LOOK IN ($1FDD) list them. Only 1-32 are read; the rest are 0."
  },
  {
   "address": 19073,
   "type": "line",
   "text": "Non-zero for an object that can be worn: ARMOUR, HELMET, BACKPACK, the five RINGs and the AMULET. WEAR ($1D0D, $1D2F) offers a hand's object only if it is set; main_menu_conditions ($12C5) offers WEAR when a held wearable object is not worn yet. player_protection also reads entries 1, 2, 16 and 17 (a_4A82 onwards) where a worn test might be expected. The byte here, entry 0, is 0."
  },
  {
   "address": 19074,
   "type": "line",
   "text": "Entry 1 of is_wearable, the ARMOUR's (1). player_protection reads it (LDX $4A82) together with the armour's position: whenever the armour is with the player, in a hand or worn, a creature's roll is 5 lower; the worn state in object_state is not tested."
  },
  {
   "address": 19075,
   "type": "line",
   "text": "Entry 2 of is_wearable, the HELMET's: with the player, held or worn, 2 off a creature's roll (player_protection, LDX $4A83). The bytes after it are entries 3-15, of which only the BACKPACK's (7) is set."
  },
  {
   "address": 19089,
   "type": "line",
   "text": "Entry 16 of is_wearable, RING 16's (the one with the translucent blue stone, by its EXAMINE text the sapphire the cursed-scroll text warns of): with the player, held or worn, a creature's roll is 8 higher (player_protection, LDX $4A91)."
  },
  {
   "address": 19090,
   "type": "line",
   "text": "Entry 17 of is_wearable, RING 17's (-PROTECTION FROM EVIL-): with the player, held or worn, a creature's roll is 4 lower (player_protection, LDX $4A92). The bytes after it are entries 18-63: RINGs 18-20 and the AMULET set, the rest 0."
  },
  {
   "address": 19137,
   "type": "line",
   "text": "Where each object 1-32 is, beyond its holder: 0 loose (on the floor, in a hand or held by a creature), 1 inside the container whose number is in its $3F70 entry (PUT IN sets it, TAKE OUT and drop_possessions clear it, LOOK IN and TAKE OUT list these), 2 worn by the player (WEAR sets it, TAKE OFF clears it, main_menu_conditions counts it to offer TAKE OFF). The new-game set-up zeroes all 64 ($095F) and then sets entry 25 (state_scroll_25)."
  },
  {
   "address": 19155,
   "type": "line",
   "text": "Entry 18 of object_state, RING 18's (-RING OF DEXTERITY-): the player's attack adds 8 to his roll while it is 2, worn (LDX $4AD3 at $2AD5). The bytes after it are entries 19-24."
  },
  {
   "address": 19162,
   "type": "line",
   "text": "Entry 25 of object_state, SCROLL 25's (-FORTES FORTUNA JUVAT-): the new-game set-up stores 1 here ($098B), so the scroll starts inside the BACKPACK (its starting position $0007 names holder 7). The bytes after it are entries 26-63."
  },
  {
   "address": 19201,
   "type": "line",
   "text": "Non-zero for a weapon: DAGGERs 3-6, SWORDs 8-9, the AXE (10) and MACEs 22-23. The player can ATTACK only with a weapon in the right hand ($2A7A; anything else gives msg_nothing_to_fight_with, an empty hand the FIST); a creature strikes with the highest-numbered weapon it holds (creature_attack_player, $2438), else with its natural weapon."
  },
  {
   "address": 19265,
   "type": "line",
   "text": "Non-zero for the five POTIONs (11-15): DRINK ($2D70) lists the held objects with it set and main_menu_conditions ($12E4) counts them to offer DRINK. What each does depends on its number (verb_drink, $2DB6): 11 and 15 add 8-15 body points up to body_start, 12 adds 8-15 mind points up to mind_start, 13 halves the body strength, 14 halves the mind power."
  },
  {
   "address": 19329,
   "type": "line",
   "text": "Per creature (33-63, live bytes $4BA2-$4BC0): how many calls of creatures_tick (six per game tick) pass between its actions, each a 1/8-cell step or a new decision (creatures_tick compares creature_tick with it, $221B). ORCs 6-9, WIZARD 25, SKELETONs 5-6, HELLHOUNDs 3-4, BATs 5-10, SPIDERs 4-6, SNAKEs 14, VAMPIREs 5, MINOTAUR 3; lower is faster. Entries 0-32 are leftover monitor code, never read."
  },
  {
   "address": 19393,
   "type": "line",
   "text": "Per creature (33-63, live bytes $4BE2-$4C00): counts creatures_tick calls up to creature_speed ($2212-$2218), then restarts at 0 as the creature acts. Zeroed for all 64 at a new game ($0962); a dead creature (body strength negative) stops counting."
  },
  {
   "address": 19457,
   "type": "line",
   "text": "The object in the player's right hand, $FF for none. ATTACK fights with it (the FIST when empty); PICK UP, TAKE OFF and TAKE OUT fill it first; WEAR, PUT IN, PUT DOWN, DRINK and SWAP take from it. player_protection's shield test at $2541 (CPX #$1E, then #$1F, then #$20, each followed by BNE) can never pass, so a SHIELD held here protects nothing."
  },
  {
   "address": 19458,
   "type": "line",
   "text": "The object in the player's left hand, $FF for none; it is filled when the right hand is full, and both full gives msg_no_free_hand. The same impossible shield test reads it at $2553."
  },
  {
   "address": 19459,
   "type": "line",
   "text": "Handler address for each main-menu option 0-17: WALK $08B0, RUN $08B9, PICK UP, PUT DOWN, INVENTORY, OPEN, CLOSE, WEAR, TAKE OFF, PUT IN, TAKE OUT, LOOK IN, ATTACK, SWAP, EXAMINE, DRINK, CAST, UNCAST. The main loop doubles the option through verb_offset and copies the entry into the operand of its JSR at $0846 (self-modifying: this byte read at $083A, the high byte at $0840). WALK is never offered by main_menu."
  },
  {
   "address": 19460,
   "type": "line",
   "text": "verb_handlers read one byte on (LDA $4C04,X at $0840) for each handler's high byte; the 35 bytes from here run from WALK's high byte to UNCAST's."
  },
  {
   "address": 19495,
   "type": "line",
   "text": "Game ticks each main-menu option takes: the main loop ($0830) copies it to $03AF before calling the handler, then runs the monsters, the clock and the spells ($08CC) for exactly that many ticks, even when the handler refused or -NOTHING- was chosen. The fire test at $0904 cannot end a timed action early: the input is polled in the tick loop only by the movement tick $0ABF, which runs only when $03AF is 0, and the menu returns after fire is released ($146C), so $0387 stays 0 (live: INVENTORY took its 12 ticks with fire held and without). WALK 0, RUN 0 (both last until fire is pressed), PICK UP 5, PUT DOWN 4, INVENTORY 12, OPEN 8, CLOSE 8, WEAR 10, TAKE OFF 10, PUT IN 5, TAKE OUT 5, LOOK IN 10, ATTACK 10, SWAP 3, EXAMINE 10, DRINK 10, CAST 20, UNCAST 10, and a 19th entry, 2, for an option 18 that does not exist."
  },
  {
   "address": 19514,
   "type": "line",
   "text": "Twice the option number (0, 2, 4 ... 40) for options 0-20, the main loop's index into verb_handlers ($0836). Only 0-17 have handlers; entries 18-20 would index past the table."
  },
  {
   "address": 19535,
   "type": "line",
   "text": "Low byte of the player's map address at the last sweep in which this entity was in his view window: view_find_visible ($0FD5) writes it for every entity 1-63 in view, and only creatures 33-63 are read, creature_chase ($238D) heading for that place and creature_flee ($23AF) away from it. As loaded, entries 0-32 are leftover monitor code (rewritten for objects that come into view, never read); entries 33-63 ($4C70-$4C8E) are 0."
  },
  {
   "address": 19599,
   "type": "line",
   "text": "High byte of last_seen_lo's map address (view_find_visible $0FDB; read at $2393 and $23B5). Like the creature arrays after it, its creature entries lie 33 bytes on, at last_seen_hi_creatures ($4CB0); the 31 bytes from here are its entries 0-30, leftover monitor code at load, rewritten for objects in view and never read."
  },
  {
   "address": 19630,
   "type": "line",
   "text": "Per creature (33-63, live bytes at creature_goal_lo_creatures, $4CCF): low byte of the map address it walks towards when it is neither chasing nor fleeing (creature_go_home, $23E1); random_destination ($3BBD) re-rolls it every 50 ticks for the seven wanderers (creatures 34, 35, 42, 43, 46, 51, 53). These creature arrays sit only 31 bytes apart, so each base's first bytes belong to the array before: the two here are last_seen_hi entries 31-32."
  },
  {
   "address": 19632,
   "type": "line",
   "text": "Entries 33-61 of last_seen_hi, the creatures' (62-63 follow at $4CCD-$4CCE, under creature_goal_hi's label); 0 at load."
  },
  {
   "address": 19661,
   "type": "line",
   "text": "Per creature (33-63, live bytes at creature_goal_hi_creatures, $4CEE): high byte of creature_goal_lo's map address (read by creature_go_home at $23E7, written only by random_destination at $3BC7, which gives $90-$9F). The two bytes here are last_seen_hi entries 62-63."
  },
  {
   "address": 19663,
   "type": "line",
   "text": "Entries 33-61 of creature_goal_lo: as loaded, each creature's own starting low byte (the same as its $3EF0 entry), until random_destination re-rolls a wanderer's; 62-63 follow at $4CEC-$4CED."
  },
  {
   "address": 19692,
   "type": "line",
   "text": "Per creature (33-63, live bytes at creature_fleeing_creatures, $4D0D): non-zero while it runs from where it last saw the player (creature_flee). creature_arm_pursuit sets it ($237D) when the player is in view and the creature's temper has bit 7 set; creature_decide clears it ($2342) when creature_mode_timer has run out. The two bytes here are creature_goal_lo entries 62-63 (VAMPIRE 62, MINOTAUR): 0 as loaded, and zeroed at every new game by the set-up's STA $4CEC,Y for Y = 0-63 ($0965), which also runs over all of creature_goal_hi's creature entries."
  },
  {
   "address": 19694,
   "type": "line",
   "text": "Entries 33-61 of creature_goal_hi: 0 as loaded and zeroed again at every new game (the set-up's STA $4CEC,Y runs over them), so only the seven wanderers ever get a real page. With a high byte of 0 direction_towards gets a target row of 0 or 1, above every map row, so an idle creature that does not wander always heads north, towards its starting column, rather than round a lair."
  },
  {
   "address": 19723,
   "type": "line",
   "text": "Per creature (33-63, live bytes at creature_chasing_creatures, $4D2C): non-zero while it heads for where it last saw the player (creature_chase). creature_arm_pursuit sets it ($2377) when the player is in view and the creature's temper has bit 7 clear; creature_decide clears it ($2358) when creature_mode_timer has run out. The two bytes here are creature_goal_hi entries 62-63."
  },
  {
   "address": 19725,
   "type": "line",
   "text": "Entries 33-61 of creature_fleeing (62-63 at $4D2A-$4D2B); 0 at load and zeroed at every new game ($0965)."
  },
  {
   "address": 19754,
   "type": "line",
   "text": "Per creature (33-63, live bytes at creature_mode_timer_creatures, $4D4B): moves left in its chase or flight. creature_arm_pursuit reloads it with temper bits 0-6 ($236C) at every decision made while the player is in view; creature_decide counts it down ($234B for a flight, $2361 for a chase) and ends the mode when it is 0. The two bytes here are creature_fleeing entries 62-63."
  },
  {
   "address": 19756,
   "type": "line",
   "text": "Entries 33-61 of creature_chasing (62-63 at $4D49-$4D4A); 0 at load and zeroed at every new game ($0968)."
  },
  {
   "address": 19785,
   "type": "line",
   "text": "Per creature (33-63, values at creature_temper_creatures, $4D6A): bit 7 set = it flees when it sees the player and never attacks (creature_decide tests it at $2320); bits 0-6 = how many moves its chase or flight lasts after the player was last in view (creature_arm_pursuit, $2367-$236F). The two bytes here are creature_chasing entries 62-63."
  },
  {
   "address": 19787,
   "type": "line",
   "text": "Entries 33-63 of creature_mode_timer; 0 at load."
  },
  {
   "address": 19818,
   "type": "line",
   "text": "Entries 33-63 of creature_temper: ORCs 6, WIZARD 60, SKELETONs 20, HELLHOUNDs 1, BATs 0 (they follow only while they see the player), SPIDERs 10, SNAKE 59 $8C (flees for 12 moves and never attacks, the only timid creature), SNAKE 60 0, VAMPIREs 30, MINOTAUR 60."
  },
  {
   "address": 19849,
   "type": "line",
   "text": "Strength of the player (entry 0, 18, read at $2B0B) and each creature (33-63, read at $24BF): a hit does the weapon's damage plus strength / 8. ORCs 10-18, WIZARD 30, SKELETONs 15-19, HELLHOUNDs 5, BATs 2, SPIDERs 10, SNAKEs 3, VAMPIRE 61 40. The next table, defence, starts only $3E on, so VAMPIRE 62's strength and the MINOTAUR's are defence's first two bytes ($4DC7-$4DC8: 40 and 21). Entries 1-32 are leftover monitor code."
  },
  {
   "address": 19911,
   "type": "line",
   "text": "What an attacker's roll must reach to hit (CMP then BPL, a hit when the difference has bit 7 clear): the player's (entry 0, 40, at $2497) and each creature's (33-63: at $2AE5 for the player's blows, $3ADF for spells). ORCs 20-30, WIZARD 40, SKELETONs 15-25, HELLHOUNDs 15-20, BATs 10-15, SPIDERs 35, SNAKEs 50; VAMPIRE 61's is defence_vampire61 ($4E04); VAMPIRE 62's and the MINOTAUR's are the first two bytes of to_hit ($4E05-$4E06). Entries 0-1 double as strength 62-63; 2-32 are leftover monitor code."
  },
  {
   "address": 19972,
   "type": "line",
   "text": "Entry 61 of defence, VAMPIRE 61's: 60, which the player's roll (25 + 0-31) reaches only with the RING OF DEXTERITY worn. attack_special_roll would load it as the roll for the DAGGER OF WOOD against a VAMPIRE (LDA $4E04 at $2B88), but its test (CPX #$3D, BNE, CPX #$3E, BNE) can never pass."
  },
  {
   "address": 19973,
   "type": "line",
   "text": "Added to an attacker's random 0-31 to make its roll: the player's (entry 0, 25, at $2AD2) and each creature's (33-63, at $248D). This byte is also entry 62 of defence, so VAMPIRE 62's defence is the player's 25. The creatures' values follow in to_hit_1's bytes."
  },
  {
   "address": 19974,
   "type": "line",
   "text": "Entry 1 of to_hit (an object's, unused) and entry 63 of defence: the MINOTAUR's defence, $85 (133), which no roll reaches, except that attack_special_roll (LDA $4E06 at $2B98) makes it the roll itself when the player strikes the MINOTAUR with the DAGGER OF DEATH (object 6), so that blow always hits. The bytes after it are to_hit entries 2-63: 2-32 leftover monitor code, then ORCs 15-25, WIZARD 20, SKELETONs 15-28, HELLHOUNDs 22-25, BATs 18-21, SPIDERs 30-35, SNAKEs 20, VAMPIREs 36 and 38, MINOTAUR 45."
  },
  {
   "address": 20037,
   "type": "line",
   "text": "Damage mask of each weapon, by object number, with entry 0 the FIST: a hit does (random AND mask) + the attacker's strength / 8. FIST 1, DAGGERs 3, SWORDs, AXE and MACEs 7, every other object 0. Read at $2B05 for the player (X = weapon, 0 for the fist) and $245D for a creature's weapon. The player's blow does 30 instead with the DAGGER OF DEATH (6) on the MINOTAUR and the DAGGER OF WOOD (5) on a VAMPIRE ($2B18-$2B3F). Entries 33-63 are 0."
  },
  {
   "address": 20101,
   "type": "line",
   "text": "Starting and largest body strength: copied into body_strength at every new game ($096B); the player's (30) is also the ceiling for the healing potions ($2DC9). ORCs 12-15, WIZARD 20, SKELETONs 20, HELLHOUNDs 10-15, BATs 1-6, SPIDERs 10-15, SNAKEs 20, VAMPIREs 50, MINOTAUR 50. Entries 1-32 are leftover monitor code (objects have no body strength)."
  },
  {
   "address": 20165,
   "type": "line",
   "text": "Current body strength: entry 0 the player's (the B bar), 33-63 the creatures'; bit 7 set = dead. A creature's blow subtracts at player_body_hit ($24D0, the trainer's body patch point) and the game ends when it goes negative (msg_youre_dead); the player's blows subtract at $2B49 (a wrapped negative result = killed) and a spell kill stores $FF ($3AF9). Potions 11 and 15 add 8-15 up to body_start, potion 13 halves it ($2DF8). Filled for all 64 from body_start at a new game; entries 1-32 are copies of leftover bytes, never read."
  },
  {
   "address": 20229,
   "type": "line",
   "text": "Starting and largest mind power: copied into mind_power at every new game ($0971) and the ceiling for potion 12 ($2DE6). Only entry 0, the player's 30, means anything: entries 1-63 ($4F06-$4F44) are leftover monitor data, a 6502 disassembler's addressing-mode table (the Apple II monitor's format table in nibble-swapped form), and the byte after them, $4F45, is part of the same leftover."
  },
  {
   "address": 20294,
   "type": "line",
   "text": "Current mind power; only entry 0, the player's, is used: the M bar (draw_mind_body_bars), spell costs (verb_cast, $2E93; too little sets it to 0 at $2E7C), the shield's upkeep (spell_upkeep, $3A66), potion 12 adding 8-15 up to mind_start and potion 14 halving it ($2E02). The new-game loop fills all 64 from mind_start, $41 bytes back (not $40); entries 1-63 are never read. Its entries 32-63 lie under natural_weapon's label."
  },
  {
   "address": 20326,
   "type": "line",
   "text": "Per creature (33-63, values at natural_weapon_creatures, $4F87): what it fights with when it holds no weapon, an index 0-5 into natural_weapon_name_lo/hi and natural_weapon_damage (creature_attack_player, $2466 and $247A). The 33 bytes from here to $4F86 are mind_power entries 32-63 and one unused byte."
  },
  {
   "address": 20359,
   "type": "line",
   "text": "Entries 33-63 of natural_weapon: ORCs, SKELETONs and the MINOTAUR 1 (HANDS); the WIZARD 5 (FIREBALL SPELL); HELLHOUNDs, BATs and VAMPIREs 3 (TEETH); SPIDERs and SNAKEs 4 (STING). 0 (NULL) and 2 (CLAWS) are never used."
  },
  {
   "address": 20390,
   "type": "line",
   "text": "Low bytes of the six natural weapons' names (NULL, HANDS, CLAWS, TEETH, STING, FIREBALL SPELL), printed after msg_attacked_you_with_its when the attacker holds no weapon ($246D); highs at natural_weapon_name_hi."
  },
  {
   "address": 20396,
   "type": "line",
   "text": "High bytes of the six natural weapon name pointers (all $4F); lows at natural_weapon_name_lo ($4FA6)."
  },
  {
   "address": 20402,
   "type": "line",
   "text": "Natural weapon 0, 'NULL' (damage mask 0): no creature has it."
  },
  {
   "address": 20407,
   "type": "line",
   "text": "Natural weapon 1, 'HANDS' (damage mask 1): the ORCs', SKELETONs' and MINOTAUR's."
  },
  {
   "address": 20413,
   "type": "line",
   "text": "Natural weapon 2, 'CLAWS' (damage mask 3): no creature has it."
  },
  {
   "address": 20419,
   "type": "line",
   "text": "Natural weapon 3, 'TEETH' (damage mask 3): the HELLHOUNDs', BATs' and VAMPIREs'. creature_attack_player also reads this address as a per-creature table (LDA $4FC3,Y at $23F9, the step count put in $40F0 when a creature strikes); its creature entries are attack_pause_creatures ($4FE4-$5002)."
  },
  {
   "address": 20425,
   "type": "line",
   "text": "Natural weapon 4, 'STING' (damage mask 3): the SPIDERs' and SNAKEs'."
  },
  {
   "address": 20431,
   "type": "line",
   "text": "Natural weapon 5, 'FIREBALL SPELL' (damage mask 15, the largest of any attack): the WIZARD's, so the scroll's 'KIND OLD WIZARD' attacks with fireballs."
  },
  {
   "address": 20446,
   "type": "line",
   "text": "Damage mask of each natural weapon (a hit does random AND mask + strength / 8; creature_attack_player $247E): NULL 0, HANDS 1, CLAWS 3, TEETH 3; STING 3 and FIREBALL SPELL 15 follow at $4FE2-$4FE3."
  },
  {
   "address": 20450,
   "type": "line",
   "text": "Per creature (33-63, live bytes at closes_door_creatures, $5003): set when a move of its went through a shut door, which creature_choose_move opened (door_open, $2600; flag set at $260A); at its next move creature_choose_move clears the flag ($25EF) and closes the door at the creature's cell (door_close, $25F4). The two bytes here are natural_weapon_damage entries 4-5: STING 3, FIREBALL SPELL 15."
  },
  {
   "address": 20452,
   "type": "line",
   "text": "Entries 33-61 of the per-creature table creature_attack_player reads at $4FC3,Y (62-63 at $5001-$5002): the step count a creature's move counter $40F0 restarts from when it strikes, with direction 8 (stand), so 8 minus it steps pass before its next decision. All 0: every creature waits the full 8 steps."
  },
  {
   "address": 20481,
   "type": "line",
   "text": "Per creature (33-63, live bytes at opens_doors_creatures, $5022): non-zero if it can open doors. creature_choose_move ($257C) then patches exits_table_page to take its exits from tile_exits_door_opener ($A000, shut doors passable) instead of tile_exits ($A100), and opens a door it steps through. The two bytes here are the attack pause entries 62-63, both 0."
  },
  {
   "address": 20483,
   "type": "line",
   "text": "Entries 33-63 of creature_closes_door; 0 at load."
  },
  {
   "address": 20514,
   "type": "line",
   "text": "Entries 33-63 of creature_opens_doors: 1 for the ORCs, the WIZARD, the SKELETONs, the VAMPIREs and the MINOTAUR; 0 for the HELLHOUNDs, BATs, SPIDERs and SNAKEs."
  },
  {
   "address": 20545,
   "type": "line",
   "text": "How far each entity (1-63) is from the player: view_distance's value for the view cell it stands on (8 per cell, 1 on the player's own cell), 0 when it is not in view; view_find_visible clears 1-63 ($0FB1) and refills it ($0FE1) at every sweep. FIREBALL (verb_cast, $2F02) burns the creatures in sight with a value below 17: the player's cell, the eight around it and the four two cells away in a straight line. Entry 0 is not used."
  },
  {
   "address": 20609,
   "type": "line",
   "text": "Distance from the centre of the 11 x 11 view window for each of its 121 cells, row by row (cell n is at row n / 11, column n mod 11, as the cell list at $3D45/$3DBE): about 8 x the distance in cells, rounded (a few cells a unit off), with the centre 1 so that 0 can mean out of view; 8 beside the player, 12 diagonally, 40 at the middle of an edge, 57 in a corner. view_find_visible ($0FDE) copies a visible entity's value into distance_from_player. This label covers rows 0-4, the cells above the player."
  },
  {
   "address": 20664,
   "type": "line",
   "text": "Rows 5-10 of view_distance: the player's own row (the centre cell, value 1, is $50BD) and the five rows below it."
  },
  {
   "address": 20730,
   "type": "line",
   "text": "The play screen's fixed frame, printed once through the KERNAL's CHROUT by print_via_chrout ($0A39) as a game starts: clear screen and black, then row 0 with the M and B labels ('[' and '\\', screen codes $1B and $1C, an inverse M and B in this character set), solid blocks where the two bars go and '00:00;00' for the clock (hours:minutes;seconds, redrawn by draw_mind_body_bars and advance_clock); rows 1-10 the message window's border (PETSCII $60-$6D, screen codes $40-$4D: corners, edges and their decorated variants), placed with cursor-down, cursor-left and HOME; row 11 forty solid blocks ('!', screen code $21, a full cell in this character set)."
  },
  {
   "address": 20944,
   "type": "line",
   "text": "EXAMINE text 0 (red, like all 28): 'NO DISTINGUISHING FEATURES', for DAGGERs 3-4, the SWORDs, the AXE, RINGs 19-20 and every BAT, SPIDER, SNAKE and VAMPIRE."
  },
  {
   "address": 20972,
   "type": "line",
   "text": "EXAMINE text 1: 'THERE IS A LABEL ON IT WHICH SAYS -POTION OF HEALING-', for POTIONs 11 and 15; true, verb_drink gives them 8-15 body points."
  },
  {
   "address": 21027,
   "type": "line",
   "text": "EXAMINE text 2: 'IT IS QUITE LARGE AND HAS SHOULDER STRAPS', for the BACKPACK (7)."
  },
  {
   "address": 21070,
   "type": "line",
   "text": "EXAMINE text 3: 'THE WRITING ON IT SAYS -THE SAPPHIRE IS CURSED, IT BRINGS BAD LUCK-'. Never shown: no entry of description_of is 3. The warning fits RING 16 (the blue stone), which does make creatures' rolls 8 higher while the player has it (player_protection)."
  },
  {
   "address": 21139,
   "type": "line",
   "text": "EXAMINE text 4: 'IT HAS A LARGE TRANSLUCENT BLUE STONE FIXED TO IT', for RING 16, the cursed one."
  },
  {
   "address": 21190,
   "type": "line",
   "text": "EXAMINE text 5: 'IT HAS A SHARP EDGE AND A LONG BLADE'. Never shown: no entry of description_of is 5 (by its words a sword's; the SWORDs show text 0)."
  },
  {
   "address": 21228,
   "type": "line",
   "text": "EXAMINE text 6: 'THE LABEL READS...ALUMROF ECNEGILLETNI ARTXE' ('EXTRA INTELLIGENCE FORMULA' backwards), for POTION 12, which adds 8-15 mind points."
  },
  {
   "address": 21274,
   "type": "line",
   "text": "EXAMINE text 7: 'IT SMELLS PUNGENT, THERE IS NO LABEL', for POTION 13, which halves the body strength."
  },
  {
   "address": 21312,
   "type": "line",
   "text": "EXAMINE text 8: 'POTION OF ORCANIAN INTELLECT', for POTION 14, which halves the mind power."
  },
  {
   "address": 21342,
   "type": "line",
   "text": "EXAMINE text 9: 'FIND PROTECTION FOR YOUR HEALTH, GATHER POTIONS FOR YOUR STEALTH, GO UP AND EAST TO FIND YOUR TREASURE, BEWARE THE MINOTAUR OR BE HIS PLEASURE', for SCROLL 24."
  },
  {
   "address": 21486,
   "type": "line",
   "text": "EXAMINE text 10: 'THE DAGGER OF DEATH IS A SPECIAL KIND, WHEN USED ON THE MINOTAUR IT WEAKENS HIS MIND', for SCROLLs 26 and 29. The code never touches the MINOTAUR's mind: the DAGGER OF DEATH always hits him and takes 30 body points (attack_special_roll; $2B1B-$2B28)."
  },
  {
   "address": 21572,
   "type": "line",
   "text": "EXAMINE text 11: 'THE KIND OLD WIZARD LEGGOLESS WILL HEAL YOUR WOUNDS', for SCROLL 27. No healing by the WIZARD was found: he chases the player for 60 moves and strikes with a FIREBALL SPELL (natural weapon 5); only POTIONs 11 and 15 raise the player's body strength."
  },
  {
   "address": 21625,
   "type": "line",
   "text": "EXAMINE text 12: 'A MYSTICAL GLOW SURROUNDS THIS VALUABLE TREASURE', for the AMULET (21)."
  },
  {
   "address": 21675,
   "type": "line",
   "text": "EXAMINE text 13: 'IT IS HEAVY AND WILL PROVIDE GOOD PROTECTION IF WORN', for the ARMOUR and the HELMET; they take 5 and 2 off a creature's roll whenever the player has them, worn or not (player_protection)."
  },
  {
   "address": 21729,
   "type": "line",
   "text": "EXAMINE text 14: 'THE WORDS -DAGGER OF DEATH- ARE INSCRIBED ON THE BLADE', for DAGGER 6."
  },
  {
   "address": 21785,
   "type": "line",
   "text": "EXAMINE text 15: '-PROTECTION FROM EVIL- IS INSCRIBED ON IT', for RING 17 (4 off a creature's roll)."
  },
  {
   "address": 21828,
   "type": "line",
   "text": "EXAMINE text 16: '-RING OF DEXTERITY- IS INSCRIBED ON IT', for RING 18 (8 on the player's roll while worn)."
  },
  {
   "address": 21868,
   "type": "line",
   "text": "EXAMINE text 17: 'A STRONG LEATHER HAND HELD SHIELD', for SHIELDs 30-32; held, a shield protects nothing, player_protection's shield test being unpassable."
  },
  {
   "address": 21903,
   "type": "line",
   "text": "EXAMINE text 18: 'IT IS MADE OF WOOD', for DAGGER 5, the dagger of wood."
  },
  {
   "address": 21923,
   "type": "line",
   "text": "EXAMINE text 19: 'IT READS -AS SURELY AS THE EAST WIND BLOWS, THE DAGGER OF WOOD IS THE VAMPIRES FOE-', for SCROLL 28; the DAGGER OF WOOD does 30 to a VAMPIRE ($2B2B-$2B3F)."
  },
  {
   "address": 22008,
   "type": "line",
   "text": "EXAMINE text 20: 'IT READS -FORTES FORTUNA JUVAT-' (fortune favours the brave), for SCROLL 25, which starts inside the BACKPACK."
  },
  {
   "address": 22041,
   "type": "line",
   "text": "EXAMINE text 21: 'A LARGE DIM-WITTED CAVE DWELLER', for the ORCs (33-37)."
  },
  {
   "address": 22074,
   "type": "line",
   "text": "EXAMINE text 22: 'A SHORT HARMLESS LOOKING WIZARD', for the WIZARD (38), who attacks with a FIREBALL SPELL."
  },
  {
   "address": 22107,
   "type": "line",
   "text": "EXAMINE text 23: 'A CHAOTIC UNDEAD CREATURE', for the SKELETONs (39-44)."
  },
  {
   "address": 22134,
   "type": "line",
   "text": "EXAMINE text 24: 'IT IS A FIERCE SABRE TOOTHED WOLF', for the HELLHOUNDs (45-48)."
  },
  {
   "address": 22169,
   "type": "line",
   "text": "EXAMINE text 25: 'IT IS AN ENORMOUS GRUESOME LOOKING HALF BULL, HALF MAN', for the MINOTAUR (63)."
  },
  {
   "address": 22225,
   "type": "line",
   "text": "EXAMINE text 26: 'GOOD FOR CRUSHING BONES', for the MACEs (22-23); the extra 8 against skeletons that attack_special_roll seems meant to give never comes (its test at $2B63 cannot pass)."
  },
  {
   "address": 22250,
   "type": "line",
   "text": "EXAMINE text 27: 'A RAISED GOLDEN PLATFORM, THICKLY COVERED WITH DUST', for the PEDESTAL (64)."
  },
  {
   "address": 22302,
   "type": "line",
   "text": "EXAMINE text number (0-27) of each entity 0-63: verb_examine ($2D4C) looks it up and prints the text at desc_ptr_lo/hi. Kinds share texts, and text 0 'NO DISTINGUISHING FEATURES' serves the plain DAGGERs, the SWORDs, the AXE, RINGs 19-20 and every BAT, SPIDER, SNAKE and VAMPIRE. Texts 3 (the cursed-sapphire warning) and 5 (the long blade) are chosen by no entity, so they are never shown. Entry 64, the PEDESTAL's, follows at $575E."
  },
  {
   "address": 22366,
   "type": "line",
   "text": "Entry 64 of description_of: 27, the PEDESTAL's text (desc_pedestal)."
  },
  {
   "address": 22367,
   "type": "line",
   "text": "Low bytes of the 28 EXAMINE texts' addresses ($51D0-$56EA), indexed by description_of's number (verb_examine, $2D50); highs at desc_ptr_hi."
  },
  {
   "address": 22395,
   "type": "line",
   "text": "High bytes of the 28 EXAMINE text addresses ($51-$56; verb_examine, $2D53); lows at desc_ptr_lo ($575F)."
  },
  {
   "address": 22423,
   "type": "line",
   "text": "Spell 0, 'MAGIC MISSILE' (cost 6): 15 body points off one creature in sight, spell power 20 (spell_hit_creature)."
  },
  {
   "address": 22437,
   "type": "line",
   "text": "Spell 1, 'FIREBALL' (cost 10): 15 off every creature in sight with distance_from_player below 17, power 60."
  },
  {
   "address": 22446,
   "type": "line",
   "text": "Spell 2, 'MAGICAL SHIELD' (cost 1, then 1 mind point per 100 ticks): 8 off every creature's attack roll (shield_protection) until it is uncast or the mind runs out."
  },
  {
   "address": 22461,
   "type": "line",
   "text": "Spell 3, 'ENERGY DRAIN' (cost 5): 7 body points off one creature in sight, power 60."
  },
  {
   "address": 22474,
   "type": "line",
   "text": "Low bytes of the four spell names (CAST's menu $2E2D, its report $2E65, UNCAST's report $2F2C); highs at spell_name_hi."
  },
  {
   "address": 22478,
   "type": "line",
   "text": "High bytes of the four spell name pointers (all $57); lows at spell_name_lo ($57CA)."
  },
  {
   "address": 22482,
   "type": "line",
   "text": "The spell in force, $FF for none; only the MAGICAL SHIELD (2) stays in force (its spell_upkeep_interval is non-zero). While it is set the main menu offers UNCAST instead of CAST ($126B/$127B); spell_upkeep ($3A40) drains mind for it; verb_uncast names it and sets $FF ($2F46). $FF at a new game ($099C)."
  },
  {
   "address": 22483,
   "type": "line",
   "text": "Subtracted from every creature's attack roll ($2491): 8 while the MAGICAL SHIELD is up (verb_cast, $2EA7), 0 otherwise (verb_uncast $2F4F, new game $09A1)."
  },
  {
   "address": 22484,
   "type": "line",
   "text": "Power of the spell being applied, added to spell_hit_creature's fixed roll of 31 ($3AD9) against the target's defence: 20 for MAGIC MISSILE ($2EC9), 60 for ENERGY DRAIN ($2EEB) and FIREBALL ($2F10). Never reset: 0 as loaded, $14 in the play snapshot."
  },
  {
   "address": 22485,
   "type": "line",
   "text": "Mind cost of each spell 0-3: MAGIC MISSILE 6, FIREBALL 10, MAGICAL SHIELD 1, ENERGY DRAIN 5 (verb_cast compares at $2E75 and pays at $2E93, before any target is chosen)."
  },
  {
   "address": 22489,
   "type": "line",
   "text": "For each spell 0-3, hundreds of ticks per mind point of upkeep while it stays in force, 0 for a spell that does not last: only the MAGICAL SHIELD has one (1). verb_cast ($2E99) makes a spell with a non-zero entry the sustained_spell; spell_upkeep ($3A5C) counts against it."
  },
  {
   "address": 22493,
   "type": "line",
   "text": "Parameters for copy_block ($5CC5) as three words: start $A858, end $A9FF (not copied), destination $DA58. They restore the picture band's colour RAM (row 15 on, the colours of the two pillars framing the strip) from its image at $A858 when a game starts ($0AB4)."
  },
  {
   "address": 22499,
   "type": "line",
   "text": "Low bytes of each picture slot's bitmap address (12 slots): slot 2k is the upper and 2k+1 the lower 6 x 4-cell box of column k, at text columns 2, 8, 14, 20, 26 and 32, rows 17-20 and 21-24 of the $A000 bitmap ($B550, $BA50, $B580 ...). picture_show copies a picture there ($165B) and picture_slot_clear blanks it ($14C5); highs at slot_bitmap_hi."
  },
  {
   "address": 22511,
   "type": "line",
   "text": "High bytes of the 12 slot bitmap addresses: $B5 / $BA for the upper / lower box of columns 0-3, $B6 / $BB for columns 4-5."
  },
  {
   "address": 22523,
   "type": "line",
   "text": "Low bytes of each slot's address in the band's screen matrix ($AAAA, $AB4A, $AAB0 ...: the same boxes at $A800 + row x 40 + column), where picture_show ($15D5) puts each cell's two screen colours; highs at slot_screen_hi."
  },
  {
   "address": 22535,
   "type": "line",
   "text": "High bytes of the slot screen-matrix addresses: $AA for an upper slot, $AB for a lower one."
  },
  {
   "address": 22547,
   "type": "line",
   "text": "Low bytes of each slot's colour-RAM address (the screen offsets again, in $D800), where picture_show ($1618) puts each cell's third colour; highs at slot_colour_hi."
  },
  {
   "address": 22559,
   "type": "line",
   "text": "High bytes of the slot colour-RAM addresses: $DA for an upper slot, $DB for a lower one."
  },
  {
   "address": 22571,
   "type": "line",
   "text": "Picture number (0-30) shown for each entity 0-63 (picture_show, $15C1): ARMOUR 1, HELMET 3, DAGGERs 17, BACKPACK 20, SWORDs 21, AXE 22, POTIONs 23, RINGs 24, AMULET 26, MACEs 28, SCROLLs 30, SHIELDs 14, ORCs 2, WIZARD 4, SKELETONs 13, HELLHOUNDs 18, BATs 25, SPIDERs 27, SNAKEs 29, VAMPIREs 6, MINOTAUR 5; the player's entry, never pictured, 0. The four view features follow at picture_of_features."
  },
  {
   "address": 22635,
   "type": "line",
   "text": "Entries 64-67 of picture_of, the pseudo-entities picture_sync_feature shows for what is in the view window: shut door 9, open door 9 (the same shut door), stairs $B0 10, stairs $B3 10."
  },
  {
   "address": 22639,
   "type": "line",
   "text": "Height flag of each entity's picture, passed to picture_show in A: 0 = one 6 x 4-cell slot, 1 = 6 x 8 cells, an upper slot and the lower one below it (the picture sheet's next row down holds the lower half). Tall: the ARMOUR, ORCs, SKELETONs, VAMPIREs and the MINOTAUR. Read at $16A3, $19A9 and by every submenu that pictures what it lists; the features' entries follow at picture_tall_features."
  },
  {
   "address": 22703,
   "type": "line",
   "text": "Entries 64-67 of picture_tall: all 1, the door and stair pictures are tall; picture_sync_feature ($1789) reads them to clear both slots of one."
  },
  {
   "address": 22707,
   "type": "line",
   "text": "The entity shown in each of the 12 slots, 0 = free: picture_show stores X in the slot it takes ($154E), picture_slot_clear stores 0 ($14D1), picture_sync_feature searches it for a feature's picture. This byte is slot 0's."
  },
  {
   "address": 22708,
   "type": "line",
   "text": "Slots 1-11 of slot_holder; picture_show also writes a tall picture's entity into its lower slot through this address (STA $58B4,Y at $1557)."
  },
  {
   "address": 22719,
   "type": "line",
   "text": "The slot showing each entity 0-63, $FF = none: written by picture_show ($155B), reset by pictures_update ($16D2) and, for entities 1-67, by pictures_clear_all ($14AC). The features' entries follow at slot_of_features."
  },
  {
   "address": 22783,
   "type": "line",
   "text": "Entries 64-67 of slot_of, for the door and stair pseudo-entities: written by picture_show and pictures_clear_all but never read (picture_sync_feature finds their slots through slot_holder)."
  },
  {
   "address": 22787,
   "type": "line",
   "text": "Low bytes of each picture's bitmap source (31 pictures, 0-30): picture 0 at $B400, 1-30 in a sheet at $6000, six pictures a row 48 bytes apart, rows $500 (4 cell rows) apart; picture_show ($1651) copies 48 bytes a cell row from there. Highs at pic_bitmap_hi."
  },
  {
   "address": 22818,
   "type": "line",
   "text": "High bytes of the 31 picture bitmap sources: $B4 for picture 0, then $60, $65, $6A, $6F, $74 for the sheet's five rows."
  },
  {
   "address": 22849,
   "type": "line",
   "text": "Low bytes of each picture's screen-colour source: $7900 + sheet row x $A0 + column x 6 in a 40-column matrix (picture 0 at $AA80); picture_show copies 6 bytes a cell row ($15CB). Highs at pic_screen_hi."
  },
  {
   "address": 22880,
   "type": "line",
   "text": "High bytes of the 31 picture screen-colour sources ($AA for picture 0, then $79-$7B)."
  },
  {
   "address": 22911,
   "type": "line",
   "text": "Low bytes of each picture's colour-RAM source: $7C20 + sheet row x $A0 + column x 6 (picture 0 at $A880, in the band's colour image); picture_show copies 6 bytes a cell row ($160E). Highs at pic_colour_hi."
  },
  {
   "address": 22942,
   "type": "line",
   "text": "High bytes of the 31 picture colour-RAM sources ($A8 for picture 0, then $7C-$7E)."
  },
  {
   "address": 22973,
   "type": "line",
   "text": "The sprite (0-7) that marks the picture in each of the 12 slots DEAD, $FF = none: picture_show gives a free sprite to a dead creature's picture ($1587) and picture_slot_clear frees it ($14ED). All $FF at a new game ($0992)."
  },
  {
   "address": 22985,
   "type": "line",
   "text": "For each of the 8 band-2 sprites, the slot it marks, $FF = free (picture_show $1583, picture_slot_clear $14F0; all $FF from $0A71, where the sprite pointers are set)."
  },
  {
   "address": 22993,
   "type": "line",
   "text": "Sprite X (low 8 bits) for a DEAD marker on each slot, the same for upper and lower: 40, 88, 136, 184, 232 and 24 for columns 0-5, the last with bit 8 set (dead_sprite_x_msb); picture_show copies it to $3A20 + 2n ($15AF). This label covers slots 0-10; slot 11's is the next byte."
  },
  {
   "address": 23004,
   "type": "line",
   "text": "Per creature (33-63, live bytes at footsteps_creatures, $59FD): non-zero if its steps can be heard. While such a creature is in the view window, creature_step ($2238) counts its creature_footstep_countdown and every third step asks for the band-1 noise ($03CF = 1). This byte is also slot 11's DEAD sprite X (24, in dead_sprite_x)."
  },
  {
   "address": 23005,
   "type": "line",
   "text": "Sprite Y for a DEAD marker on each slot: $C2 on an upper slot, $E2 on a lower one; picture_show copies it to $3A21 + 2n ($15B5)."
  },
  {
   "address": 23017,
   "type": "line",
   "text": "X bit 8 for a DEAD marker on each slot: set only for column 5 (slots 10 and 11), when picture_show ORs the sprite's bit into the band-2 X-MSB copy $3A3D ($159E)."
  },
  {
   "address": 23029,
   "type": "line",
   "text": "Shut door cells (characters $F0-$FF with bit 0 clear) in the 11 x 11 view window, counted by pictures_update at every move ($16FE); feature 0 of picture_sync_feature, which reads the four counts as $59F5,Y ($1741)."
  },
  {
   "address": 23030,
   "type": "line",
   "text": "Open doors in view: door characters with bit 0 set and bit 1 clear, so one of each open pair (pictures_update, $170A)."
  },
  {
   "address": 23031,
   "type": "line",
   "text": "Stair characters $B0 in view (pictures_update, $1714)."
  },
  {
   "address": 23032,
   "type": "line",
   "text": "Stair characters $B3 in view (pictures_update, $171E)."
  },
  {
   "address": 23033,
   "type": "line",
   "text": "How many shut-door pictures the strip shows: picture_sync_feature adds or removes pictures of pseudo-entity $40 until this equals feature_count_shut_doors (the four shown counts are read as $59F9,Y); 0 after pictures_clear_all ($14B6)."
  },
  {
   "address": 23034,
   "type": "line",
   "text": "How many open-door pictures (pseudo-entity $41, the same door picture) the strip shows; 0 after pictures_clear_all."
  },
  {
   "address": 23035,
   "type": "line",
   "text": "How many $B0 stair pictures (pseudo-entity $42) the strip shows; 0 after pictures_clear_all."
  },
  {
   "address": 23036,
   "type": "line",
   "text": "How many $B3 stair pictures (pseudo-entity $43) the strip shows; 0 after pictures_clear_all."
  },
  {
   "address": 23037,
   "type": "line",
   "text": "Entries 33-63 of creature_footsteps: 1 for the ORCs, WIZARD, SKELETONs, HELLHOUNDs, VAMPIREs and MINOTAUR; 0 for the BATs, SPIDERs and SNAKEs, which move silently."
  },
  {
   "address": 23068,
   "type": "line",
   "text": "Per creature (33-63 used; all 64 set to 1 at a new game, $0981): counts the steps of a creature with footsteps while it is in view; at 0 it restarts at 3 and asks for the footstep noise ($03CF = 1), so every third step is heard (creature_step, $2242-$2254). The noise plays in band 1 only while the music is off."
  },
  {
   "address": 23132,
   "type": "line",
   "text": "Black: the ending, printed by the main loop ($0858) once the AMULET has been put down on map address $9677 ($03C7 = $7B), before it starts tune 2 ('Game beaten' by the HVSC list): 'WITH A SUDDEN FLASH OF CRIMSEN LIGHT THELRIC APPEARS.  HE SAYS -THANK YOU FOR SAVING MY LIFE, I WILL NOW RETURN YOU TO YOUR WORLD. FARE YE WELL.- AS IF BY MAGIC, YOU APPEAR IN THE CAVE WHERE YOU BEGAN.' (CRIMSEN as spelled)."
  },
  {
   "address": 23335,
   "type": "line",
   "text": "Title screen, story scroller and the way into a game, called by the restart at $0818 before every game. Gives $0314 back to the KERNAL ($EA31) and turns the raster interrupt off, blanks the screen, switches all sprites off, points the story scroller at its text ($5E4C/$5E4D = $8009), makes border and background black, prints CHR$(8) (SHIFT and C= may no longer switch the character set) and CHR$(147) (clears the text screen at $0400) through CHROUT, clears colour RAM to black and fills it with the picture's colours from $AC00-$AFFE (copy_block with the parameters at $5E44), starts tune 0, the main theme (music_init with A = 0), installs title_irq ($5D08) for raster $30 with $5E4A = 0 and turns the screen on. Clears $03D3 (what the game about to start does with the controls: 0 play, 1 record a demonstration, 2 play the demonstration back) and $03D9 (a pass of the story has ended), then waits in title_wait_loop."
  },
  {
   "address": 23482,
   "type": "line",
   "text": "Title loop. CTRL held on its own with R ($028D = 4 and key code $C5 = $11) waits for CTRL to be let go, sets $03D3 = 1 (the game about to start records the controls as a demonstration) and saves the random seed $0383/$0384 at $A540/$A541, the head of the demonstration buffer. When the story has scrolled through once ($03D9 set by title_scroll_step) it sets $03D3 = 2 (the game plays the demonstration back). Otherwise it polls the controls ($179D: joystick port 2 and keys; M switches the music) and on fire or SPACE ($0387) waits 5 units ($0F35), waits for the release, waits 5 more and leaves with $03D3 = 0."
  },
  {
   "address": 23563,
   "type": "line",
   "text": "Leaving the title: blanks the screen, stops the music (music_stop, then music_play to silence it at once), gives $0314 back to the KERNAL ($EA31) and sets up the character screen the play screen's top band uses: multicolour character mode, 40 columns, $D018 = $1D (screen $0400, characters $3000), bitmap mode off, VIC bank 0 ($DD00 bits 0-1 = %11), raster interrupt off; border light blue, background black, $D022 red, $D023 light grey; screen on. With $03D3 non-zero (recording or playing back a demonstration) it returns at once and the game starts. Otherwise it prints the controls page from $838E (CHROUT loop $2BC7) and polls: B or the stick pulled down ($0389 = 1) goes to title_instructions, fire starts the game after a whole press (wait_fire_press)."
  },
  {
   "address": 23698,
   "type": "line",
   "text": "The instructions reached with B from the controls page: five pages printed through CHROUT from $84B7 (HOW TO CONTROL THE GAME), $86E7 (THE DISPLAY), $8893 (TO PLAY THE GAME), $8B1B (USING MAGIC) and $8DB1 (MAGICAL OR PHYSICAL COMBAT), each ended by a whole press of fire (wait_fire_press); after the fifth the game starts."
  },
  {
   "address": 23749,
   "type": "line",
   "text": "Block copy. X/Y (low, high) point at a 6-byte parameter block of three addresses, low byte first: source start (to $9B/$9C), source end (to $9D/$9E) and destination (to $63/$64). Copies a byte at a time, upwards, until the source pointer equals the end, so the end byte itself is not copied. Callers: title_screen with $5E44 ($AC00-$AFFE into colour RAM at $D800) and $0AB8 in the game setup with $57DD ($A858-$A9FE into colour RAM at $DA58). Changes A, X, Y, $63/$64 and $9B-$9E."
  },
  {
   "address": 23816,
   "type": "line",
   "text": "Title raster interrupt, entered through $0314 from the KERNAL's $FF48 with A, X and Y already pushed. Acknowledges the VIC ($D019 written back). An interrupt without the raster flag, which can only be CIA 1's timer, returns straight away without reading $DC0D: the CIA keeps asking and the handler is re-entered until the scroller half's KERNAL exit reads $DC0D (traced, not observed). Two halves alternate on $5E4A: 0 the picture half at raster $30 (title_irq_picture), 1 the scroller half at raster $EE (title_irq_scroller, reached through a JMP to the next instruction at $5D1D)."
  },
  {
   "address": 23840,
   "type": "line",
   "text": "Scroller half of title_irq, at raster $EE (inside character row 23): hires character mode in VIC bank 0 (multicolour and bitmap off, $D018 = $1D: screen $0400, characters $3000, $DD00 bits 0-1 = %11), next interrupt at raster $30 with $5E4A = 0, 38 columns with the fine scroll $5E4B as $D016's X scroll so the story in row 24 ($07C0) slides left; then one frame of music ($1949, which calls music_play) and out through the KERNAL's $EA31 (jiffy clock, keyboard scan, $DC0D read)."
  },
  {
   "address": 23907,
   "type": "line",
   "text": "Picture half of title_irq, at raster $30 (just above the display window): VIC bank 3 ($DD00 bits 0-1 = %00), next interrupt at raster $EE, multicolour bitmap mode with $D018 = $38 (screen matrix $CC00, title_screen_matrix; bitmap $E000-$FF3F in the RAM under the KERNAL), 40 columns and no X scroll, $5E4A = 1; then two steps of the story (title_scroll_step twice, two pixels a frame) and returns without the KERNAL."
  },
  {
   "address": 23980,
   "type": "line",
   "text": "One pixel of the story scroller, called twice a frame by the picture half. On NTSC ($02A6 = 0) the countdown $03DA, reloaded with 2, skips every second call, so the story moves one pixel a frame there (60 a second) against two on PAL (100 a second). Decrements the fine scroll $5E4B; below 0 it becomes 7, the text pointer $5E4C/$5E4D moves on a character and row 24 is redrawn: 40 bytes from the pointer to $07C0-$07E7, those from $40 to $BF less $40 (PETSCII letters to screen codes), the rest unchanged, all yellow ($DBC0-$DBE7 = 7). When the pointer reaches $8366, after 861 characters (68.9 s on PAL), it goes back to $8009, $03D9 = 2 tells title_wait_loop to start the demonstration, and the random seed $0383/$0384 is reloaded from $A540/$A541 ($F8, $18), so the demonstration starts from the seed its recording started from. Only this end of a whole pass reloads the seed: a game started from the title keeps the seed the last game or demonstration left."
  },
  {
   "address": 24105,
   "type": "line",
   "text": "Waits for a whole press of fire or SPACE: polls the controls ($179D) until $0387 is set, waits 5 units ($0F35), polls until it is released, waits 5 more. Used by the controls and instruction pages and at the end of a game ($08AA)."
  },
  {
   "address": 24132,
   "type": "line",
   "text": "copy_block parameters for the title picture's colours: source $AC00 (title_colour_image), end $AFFF (not copied), destination $D800. The 1,023 bytes go to colour RAM, whose low nibbles give each character cell's colour for bit pair %11 of the multicolour bitmap at $E000."
  },
  {
   "address": 24138,
   "type": "line",
   "text": "Which half of title_irq comes next: 0 the picture half at raster $30 (set by title_screen and by the scroller half), 1 the scroller half at raster $EE (set by the picture half)."
  },
  {
   "address": 24139,
   "type": "line",
   "text": "Story scroller's fine X scroll, counting 7 down to 0, put into $D016 bits 0-2 by the scroller half; below 0 it goes back to 7 and the text moves on a character. title_screen does not reset it, so a new title starts at the offset the last one stopped at."
  },
  {
   "address": 24140,
   "type": "line",
   "text": "Story scroller's text pointer, low byte (high byte at $5E4D): the address of the leftmost of the 40 characters in row 24. Set to $8009 by title_screen, one character on per 8 pixels, back to $8009 after $8365."
  },
  {
   "address": 24141,
   "type": "line",
   "text": "High byte of the story scroller's text pointer: $80 at the start of the story ($8009), $83 at its end ($8365)."
  },
  {
   "address": 24142,
   "type": "line",
   "text": "UNUSED, $5E4E-$5FFF: 434 bytes of $00 between the title code's variables ($5E4A-$5E4D) and the picture sheet at $6000. Loaded with the game and identical at the hand-over and in play; no instruction, pointer table or block copy found refers to them (the picture pointer tables all point at $6000 and above)."
  },
  {
   "address": 24576,
   "type": "line",
   "text": "PICTURE SHEET, $6000-$7F3F: the large pictures of the bottom strip, stored as one multicolour bitmap image 40 cells wide and 20 cell rows tall in the VIC's own layout: bitmap $6000-$78FF (320 bytes a cell row), screen colours $7900-$7C1F and colour-RAM nybbles $7C20-$7F3F (40 bytes a cell row). Five bands of four cell rows, each holding six pictures of 6 x 4 cells (24 x 32 multicolour pixels) side by side in cell columns 0-35; columns 36-39 are empty. The pictures are numbered 1-30 across and down: the number is the index into the pointer tables $5903/$5922 (bitmap), $5941/$5960 (screen) and $597F/$599E (colour), whose entry 0 (object 0, which the strip never draws: $1695 starts at object 1) points into the display memory instead ($B400, $AA80, $A880). $1515 copies one picture into a free slot of the strip (bitmap $A000, screen $A800, colour RAM $D800, cell rows 17-24; twelve slots, six across in two rows): 6 cells wide and 4 cell rows tall, or 8 for an object whose size flag $586F,x is 1, which takes the picture below it in the sheet as its lower half. Object x's picture number is $582B,x, for the objects $01-$20, the creatures $21-$3F and, under $40-$43, the strip's door and stair counters. Loaded with the game: identical at the hand-over and in play, and no store found aims at it. Picture 1, armour top (sheet band 0, picture column 0): bitmap, cell row 1 of 4, $6000-$602F, 6 cells x 8 lines = 48 bytes. Shows a suit of plate armour, upper half: breastplate and shoulder plates in light blue with dark grey and white. Used for object $01 (ARMOUR). Big: drawn 6 x 8 cells, with picture 7 (armour legs) under it as its lower half. Its other bitmap rows are at $6140, $6280 and $63C0 (320 bytes apart); its colours are at $7900 (screen) and $7C20 (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 24624,
   "type": "line",
   "text": "Picture 2, orc top (sheet band 0, picture column 1): bitmap, cell row 1 of 4, $6030-$605F, 6 cells x 8 lines = 48 bytes. Shows an orc, head and torso: a hulking green figure shaded in brown. Used for objects $21-$25 (ORC); the picture the demonstration shows. Big: drawn 6 x 8 cells, with picture 8 (orc legs) under it as its lower half. Its other bitmap rows are at $6170, $62B0 and $63F0 (320 bytes apart); its colours are at $7906 (screen) and $7C26 (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 24672,
   "type": "line",
   "text": "Picture 3, helmet (sheet band 0, picture column 2): bitmap, cell row 1 of 4, $6060-$608F, 6 cells x 8 lines = 48 bytes. Shows a visored helmet, dark grey and light blue with a grey visor. Used for object $02 (HELMET). Drawn on its own, 6 x 4 cells. Its other bitmap rows are at $61A0, $62E0 and $6420 (320 bytes apart); its colours are at $790C (screen) and $7C2C (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 24720,
   "type": "line",
   "text": "Picture 4, wizard (sheet band 0, picture column 3): bitmap, cell row 1 of 4, $6090-$60BF, 6 cells x 8 lines = 48 bytes. Shows a hooded wizard in dark grey robes with yellow eyes, holding a brown staff. Used for object $26 (WIZARD). Drawn on its own, 6 x 4 cells. Its other bitmap rows are at $61D0, $6310 and $6450 (320 bytes apart); its colours are at $7912 (screen) and $7C32 (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 24768,
   "type": "line",
   "text": "Picture 5, minotaur top (sheet band 0, picture column 4): bitmap, cell row 1 of 4, $60C0-$60EF, 6 cells x 8 lines = 48 bytes. Shows the minotaur, upper half: a horned brown creature raising a sword. Used for object $3F (MINOTAUR). Big: drawn 6 x 8 cells, with picture 11 (minotaur legs) under it as its lower half. Its other bitmap rows are at $6200, $6340 and $6480 (320 bytes apart); its colours are at $7918 (screen) and $7C38 (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 24816,
   "type": "line",
   "text": "Picture 6, vampire top (sheet band 0, picture column 5): bitmap, cell row 1 of 4, $60F0-$611F, 6 cells x 8 lines = 48 bytes. Shows a vampire, upper half: a hooded figure in a dark grey cloak with a red mouth, reaching out a light grey clawed hand. Used for objects $3D-$3E (VAMPIRE). Big: drawn 6 x 8 cells, with picture 12 (vampire cloak) under it as its lower half. Its other bitmap rows are at $6230, $6370 and $64B0 (320 bytes apart); its colours are at $791E (screen) and $7C3E (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 24864,
   "type": "line",
   "text": "Picture sheet bitmap, cell row 0 (band 0, row 1 of 4), cell columns 36-39, $6120-$613F (32 bytes): outside the six picture columns, never copied to the strip; all zero."
  },
  {
   "address": 24896,
   "type": "line",
   "text": "Picture 1, armour top: bitmap, cell row 2 of 4, $6140-$616F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 24944,
   "type": "line",
   "text": "Picture 2, orc top: bitmap, cell row 2 of 4, $6170-$619F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 24992,
   "type": "line",
   "text": "Picture 3, helmet: bitmap, cell row 2 of 4, $61A0-$61CF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 25040,
   "type": "line",
   "text": "Picture 4, wizard: bitmap, cell row 2 of 4, $61D0-$61FF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 25088,
   "type": "line",
   "text": "Picture 5, minotaur top: bitmap, cell row 2 of 4, $6200-$622F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 25136,
   "type": "line",
   "text": "Picture 6, vampire top: bitmap, cell row 2 of 4, $6230-$625F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 25184,
   "type": "line",
   "text": "Picture sheet bitmap, cell row 1 (band 0, row 2 of 4), cell columns 36-39, $6260-$627F (32 bytes): outside the six picture columns, never copied to the strip; all zero."
  },
  {
   "address": 25216,
   "type": "line",
   "text": "Picture 1, armour top: bitmap, cell row 3 of 4, $6280-$62AF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 25264,
   "type": "line",
   "text": "Picture 2, orc top: bitmap, cell row 3 of 4, $62B0-$62DF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 25312,
   "type": "line",
   "text": "Picture 3, helmet: bitmap, cell row 3 of 4, $62E0-$630F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 25360,
   "type": "line",
   "text": "Picture 4, wizard: bitmap, cell row 3 of 4, $6310-$633F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 25408,
   "type": "line",
   "text": "Picture 5, minotaur top: bitmap, cell row 3 of 4, $6340-$636F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 25456,
   "type": "line",
   "text": "Picture 6, vampire top: bitmap, cell row 3 of 4, $6370-$639F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 25504,
   "type": "line",
   "text": "Picture sheet bitmap, cell row 2 (band 0, row 3 of 4), cell columns 36-39, $63A0-$63BF (32 bytes): outside the six picture columns, never copied to the strip; all zero."
  },
  {
   "address": 25536,
   "type": "line",
   "text": "Picture 1, armour top: bitmap, cell row 4 of 4, $63C0-$63EF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 25584,
   "type": "line",
   "text": "Picture 2, orc top: bitmap, cell row 4 of 4, $63F0-$641F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 25632,
   "type": "line",
   "text": "Picture 3, helmet: bitmap, cell row 4 of 4, $6420-$644F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 25680,
   "type": "line",
   "text": "Picture 4, wizard: bitmap, cell row 4 of 4, $6450-$647F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 25728,
   "type": "line",
   "text": "Picture 5, minotaur top: bitmap, cell row 4 of 4, $6480-$64AF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 25776,
   "type": "line",
   "text": "Picture 6, vampire top: bitmap, cell row 4 of 4, $64B0-$64DF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 25824,
   "type": "line",
   "text": "Picture sheet bitmap, cell row 3 (band 0, row 4 of 4), cell columns 36-39, $64E0-$64FF (32 bytes): outside the six picture columns, never copied to the strip; all zero."
  },
  {
   "address": 25856,
   "type": "line",
   "text": "Picture 7, armour legs (sheet band 1, picture column 0): bitmap, cell row 1 of 4, $6500-$652F, 6 cells x 8 lines = 48 bytes. Shows the legs of the plate armour, light blue and dark grey. Lower half of picture 1 (armour top): drawn only under it, never on its own. Its other bitmap rows are at $6640, $6780 and $68C0 (320 bytes apart); its colours are at $79A0 (screen) and $7CC0 (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 25904,
   "type": "line",
   "text": "Picture 8, orc legs (sheet band 1, picture column 1): bitmap, cell row 1 of 4, $6530-$655F, 6 cells x 8 lines = 48 bytes. Shows the orc's legs, green and brown. Lower half of picture 2 (orc top): drawn only under it, never on its own. Its other bitmap rows are at $6670, $67B0 and $68F0 (320 bytes apart); its colours are at $79A6 (screen) and $7CC6 (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 25952,
   "type": "line",
   "text": "Picture 9, door top (sheet band 1, picture column 2): bitmap, cell row 1 of 4, $6560-$658F, 6 cells x 8 lines = 48 bytes. Shows a door, upper half: brown cross-braced planks in a grey stone frame. Used for the strip's two door counters, drawn under the indices $40 and $41 (entries 0 and 1 of $3CFB; elsewhere $40 is the pedestal, map tile $70 at $9677, which has no picture of its own): $16DA counts the door characters $F0-$FF in the 11 x 11 view window (OPEN's $1BBF sets their bit 0 in both halves of a door, CLOSE's $1C85 clears it), those with bit 0 clear (closed) for $40 and those with bit 0 set and bit 1 clear (the first half of an open door) for $41, and $1741 shows one door picture for each. Big: drawn 6 x 8 cells, with picture 15 (door bottom) under it as its lower half. Its other bitmap rows are at $66A0, $67E0 and $6920 (320 bytes apart); its colours are at $79AC (screen) and $7CCC (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 26000,
   "type": "line",
   "text": "Picture 10, stairs top (sheet band 1, picture column 3): bitmap, cell row 1 of 4, $6590-$65BF, 6 cells x 8 lines = 48 bytes. Shows a staircase, upper half: grey stone walls with brown handrails either side of a dark opening. Used for the strip's two stair counters, drawn under the indices $42 and $43 (entries 2 and 3 of $3CFB): $16DA counts the characters $B0 and $B3 in the 11 x 11 view window and $1741 shows one staircase picture for each; the map pairs them as $B0 $B1 and $B2 $B3, the second pair 32 columns right of the first in the same rows (probably the two ends of a stairway between levels). Big: drawn 6 x 8 cells, with picture 16 (stairs steps) under it as its lower half. Its other bitmap rows are at $66D0, $6810 and $6950 (320 bytes apart); its colours are at $79B2 (screen) and $7CD2 (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 26048,
   "type": "line",
   "text": "Picture 11, minotaur legs (sheet band 1, picture column 4): bitmap, cell row 1 of 4, $65C0-$65EF, 6 cells x 8 lines = 48 bytes. Shows the minotaur's legs and hooves, brown and orange. Lower half of picture 5 (minotaur top): drawn only under it, never on its own. Its other bitmap rows are at $6700, $6840 and $6980 (320 bytes apart); its colours are at $79B8 (screen) and $7CD8 (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 26096,
   "type": "line",
   "text": "Picture 12, vampire cloak (sheet band 1, picture column 5): bitmap, cell row 1 of 4, $65F0-$661F, 6 cells x 8 lines = 48 bytes. Shows the lower part of the vampire's cloak, dark grey. Lower half of picture 6 (vampire top): drawn only under it, never on its own. Its other bitmap rows are at $6730, $6870 and $69B0 (320 bytes apart); its colours are at $79BE (screen) and $7CDE (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 26144,
   "type": "line",
   "text": "Picture sheet bitmap, cell row 4 (band 1, row 1 of 4), cell columns 36-39, $6620-$663F (32 bytes): outside the six picture columns, never copied to the strip; all zero."
  },
  {
   "address": 26176,
   "type": "line",
   "text": "Picture 7, armour legs: bitmap, cell row 2 of 4, $6640-$666F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 26224,
   "type": "line",
   "text": "Picture 8, orc legs: bitmap, cell row 2 of 4, $6670-$669F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 26272,
   "type": "line",
   "text": "Picture 9, door top: bitmap, cell row 2 of 4, $66A0-$66CF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 26320,
   "type": "line",
   "text": "Picture 10, stairs top: bitmap, cell row 2 of 4, $66D0-$66FF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 26368,
   "type": "line",
   "text": "Picture 11, minotaur legs: bitmap, cell row 2 of 4, $6700-$672F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 26416,
   "type": "line",
   "text": "Picture 12, vampire cloak: bitmap, cell row 2 of 4, $6730-$675F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 26464,
   "type": "line",
   "text": "Picture sheet bitmap, cell row 5 (band 1, row 2 of 4), cell columns 36-39, $6760-$677F (32 bytes): outside the six picture columns, never copied to the strip; all zero."
  },
  {
   "address": 26496,
   "type": "line",
   "text": "Picture 7, armour legs: bitmap, cell row 3 of 4, $6780-$67AF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 26544,
   "type": "line",
   "text": "Picture 8, orc legs: bitmap, cell row 3 of 4, $67B0-$67DF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 26592,
   "type": "line",
   "text": "Picture 9, door top: bitmap, cell row 3 of 4, $67E0-$680F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 26640,
   "type": "line",
   "text": "Picture 10, stairs top: bitmap, cell row 3 of 4, $6810-$683F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 26688,
   "type": "line",
   "text": "Picture 11, minotaur legs: bitmap, cell row 3 of 4, $6840-$686F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 26736,
   "type": "line",
   "text": "Picture 12, vampire cloak: bitmap, cell row 3 of 4, $6870-$689F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 26784,
   "type": "line",
   "text": "Picture sheet bitmap, cell row 6 (band 1, row 3 of 4), cell columns 36-39, $68A0-$68BF (32 bytes): outside the six picture columns, never copied to the strip; all zero."
  },
  {
   "address": 26816,
   "type": "line",
   "text": "Picture 7, armour legs: bitmap, cell row 4 of 4, $68C0-$68EF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 26864,
   "type": "line",
   "text": "Picture 8, orc legs: bitmap, cell row 4 of 4, $68F0-$691F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 26912,
   "type": "line",
   "text": "Picture 9, door top: bitmap, cell row 4 of 4, $6920-$694F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 26960,
   "type": "line",
   "text": "Picture 10, stairs top: bitmap, cell row 4 of 4, $6950-$697F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 27008,
   "type": "line",
   "text": "Picture 11, minotaur legs: bitmap, cell row 4 of 4, $6980-$69AF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 27056,
   "type": "line",
   "text": "Picture 12, vampire cloak: bitmap, cell row 4 of 4, $69B0-$69DF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 27104,
   "type": "line",
   "text": "Picture sheet bitmap, cell row 7 (band 1, row 4 of 4), cell columns 36-39, $69E0-$69FF (32 bytes): outside the six picture columns, never copied to the strip; all zero."
  },
  {
   "address": 27136,
   "type": "line",
   "text": "Picture 13, skeleton top (sheet band 2, picture column 0): bitmap, cell row 1 of 4, $6A00-$6A2F, 6 cells x 8 lines = 48 bytes. Shows a skeleton, upper half: white skull and ribs, holding a light blue sword with a yellow hilt. Used for objects $27-$2C (SKELETON). Big: drawn 6 x 8 cells, with picture 19 (skeleton legs) under it as its lower half. Its other bitmap rows are at $6B40, $6C80 and $6DC0 (320 bytes apart); its colours are at $7A40 (screen) and $7D60 (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 27184,
   "type": "line",
   "text": "Picture 14, shield (sheet band 2, picture column 1): bitmap, cell row 1 of 4, $6A30-$6A5F, 6 cells x 8 lines = 48 bytes. Shows a heraldic shield quartered blue and red, with a yellow cross and a light grey rim. Used for objects $1E-$20 (SHIELD). Drawn on its own, 6 x 4 cells. Its other bitmap rows are at $6B70, $6CB0 and $6DF0 (320 bytes apart); its colours are at $7A46 (screen) and $7D66 (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 27232,
   "type": "line",
   "text": "Picture 15, door bottom (sheet band 2, picture column 2): bitmap, cell row 1 of 4, $6A60-$6A8F, 6 cells x 8 lines = 48 bytes. Shows the door's lower half, with a light blue ring handle. Lower half of picture 9 (door top): drawn only under it, never on its own. Its other bitmap rows are at $6BA0, $6CE0 and $6E20 (320 bytes apart); its colours are at $7A4C (screen) and $7D6C (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 27280,
   "type": "line",
   "text": "Picture 16, stairs steps (sheet band 2, picture column 3): bitmap, cell row 1 of 4, $6A90-$6ABF, 6 cells x 8 lines = 48 bytes. Shows the staircase's steps, dark grey and grey. Lower half of picture 10 (stairs top): drawn only under it, never on its own. Its other bitmap rows are at $6BD0, $6D10 and $6E50 (320 bytes apart); its colours are at $7A52 (screen) and $7D72 (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 27328,
   "type": "line",
   "text": "Picture 17, dagger (sheet band 2, picture column 4): bitmap, cell row 1 of 4, $6AC0-$6AEF, 6 cells x 8 lines = 48 bytes. Shows a small dagger: white blade, brown and yellow hilt. Used for objects $03-$06 (DAGGER), all four daggers alike. Drawn on its own, 6 x 4 cells. Its other bitmap rows are at $6C00, $6D40 and $6E80 (320 bytes apart); its colours are at $7A58 (screen) and $7D78 (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 27376,
   "type": "line",
   "text": "Picture 18, hellhound (sheet band 2, picture column 5): bitmap, cell row 1 of 4, $6AF0-$6B1F, 6 cells x 8 lines = 48 bytes. Shows the head of a hellhound: a dark grey and brown hound with a long snout, bared white teeth. Used for objects $2D-$30 (HELLHOUND). Drawn on its own, 6 x 4 cells. Its other bitmap rows are at $6C30, $6D70 and $6EB0 (320 bytes apart); its colours are at $7A5E (screen) and $7D7E (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 27424,
   "type": "line",
   "text": "Picture sheet bitmap, cell row 8 (band 2, row 1 of 4), cell columns 36-39, $6B20-$6B3F (32 bytes): outside the six picture columns, never copied to the strip; all zero except $6B20 = $C0: two pixels in bit pair 11 (dark grey from $7D84) at the top left of column 36, next to the hellhound (picture 18), a stray dot that is never copied."
  },
  {
   "address": 27456,
   "type": "line",
   "text": "Picture 13, skeleton top: bitmap, cell row 2 of 4, $6B40-$6B6F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 27504,
   "type": "line",
   "text": "Picture 14, shield: bitmap, cell row 2 of 4, $6B70-$6B9F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 27552,
   "type": "line",
   "text": "Picture 15, door bottom: bitmap, cell row 2 of 4, $6BA0-$6BCF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 27600,
   "type": "line",
   "text": "Picture 16, stairs steps: bitmap, cell row 2 of 4, $6BD0-$6BFF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 27648,
   "type": "line",
   "text": "Picture 17, dagger: bitmap, cell row 2 of 4, $6C00-$6C2F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 27696,
   "type": "line",
   "text": "Picture 18, hellhound: bitmap, cell row 2 of 4, $6C30-$6C5F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 27744,
   "type": "line",
   "text": "Picture sheet bitmap, cell row 9 (band 2, row 2 of 4), cell columns 36-39, $6C60-$6C7F (32 bytes): outside the six picture columns, never copied to the strip; all zero."
  },
  {
   "address": 27776,
   "type": "line",
   "text": "Picture 13, skeleton top: bitmap, cell row 3 of 4, $6C80-$6CAF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 27824,
   "type": "line",
   "text": "Picture 14, shield: bitmap, cell row 3 of 4, $6CB0-$6CDF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 27872,
   "type": "line",
   "text": "Picture 15, door bottom: bitmap, cell row 3 of 4, $6CE0-$6D0F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 27920,
   "type": "line",
   "text": "Picture 16, stairs steps: bitmap, cell row 3 of 4, $6D10-$6D3F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 27968,
   "type": "line",
   "text": "Picture 17, dagger: bitmap, cell row 3 of 4, $6D40-$6D6F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 28016,
   "type": "line",
   "text": "Picture 18, hellhound: bitmap, cell row 3 of 4, $6D70-$6D9F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 28064,
   "type": "line",
   "text": "Picture sheet bitmap, cell row 10 (band 2, row 3 of 4), cell columns 36-39, $6DA0-$6DBF (32 bytes): outside the six picture columns, never copied to the strip; all zero."
  },
  {
   "address": 28096,
   "type": "line",
   "text": "Picture 13, skeleton top: bitmap, cell row 4 of 4, $6DC0-$6DEF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 28144,
   "type": "line",
   "text": "Picture 14, shield: bitmap, cell row 4 of 4, $6DF0-$6E1F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 28192,
   "type": "line",
   "text": "Picture 15, door bottom: bitmap, cell row 4 of 4, $6E20-$6E4F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 28240,
   "type": "line",
   "text": "Picture 16, stairs steps: bitmap, cell row 4 of 4, $6E50-$6E7F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 28288,
   "type": "line",
   "text": "Picture 17, dagger: bitmap, cell row 4 of 4, $6E80-$6EAF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 28336,
   "type": "line",
   "text": "Picture 18, hellhound: bitmap, cell row 4 of 4, $6EB0-$6EDF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 28384,
   "type": "line",
   "text": "Picture sheet bitmap, cell row 11 (band 2, row 4 of 4), cell columns 36-39, $6EE0-$6EFF (32 bytes): outside the six picture columns, never copied to the strip; all zero."
  },
  {
   "address": 28416,
   "type": "line",
   "text": "Picture 19, skeleton legs (sheet band 3, picture column 0): bitmap, cell row 1 of 4, $6F00-$6F2F, 6 cells x 8 lines = 48 bytes. Shows the skeleton's leg bones, white. Lower half of picture 13 (skeleton top): drawn only under it, never on its own. Its other bitmap rows are at $7040, $7180 and $72C0 (320 bytes apart); its colours are at $7AE0 (screen) and $7E00 (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 28464,
   "type": "line",
   "text": "Picture 20, backpack (sheet band 3, picture column 1): bitmap, cell row 1 of 4, $6F30-$6F5F, 6 cells x 8 lines = 48 bytes. Shows a backpack, blue and light blue with a brown strap. Used for object $07 (BACKPACK). Drawn on its own, 6 x 4 cells. Its other bitmap rows are at $7070, $71B0 and $72F0 (320 bytes apart); its colours are at $7AE6 (screen) and $7E06 (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 28512,
   "type": "line",
   "text": "Picture 21, sword (sheet band 3, picture column 2): bitmap, cell row 1 of 4, $6F60-$6F8F, 6 cells x 8 lines = 48 bytes. Shows a long sword with blood on the blade. Used for objects $08-$09 (SWORD). Drawn on its own, 6 x 4 cells. Its other bitmap rows are at $70A0, $71E0 and $7320 (320 bytes apart); its colours are at $7AEC (screen) and $7E0C (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 28560,
   "type": "line",
   "text": "Picture 22, axe (sheet band 3, picture column 3): bitmap, cell row 1 of 4, $6F90-$6FBF, 6 cells x 8 lines = 48 bytes. Shows a battle axe with a grey head and brown haft, blood on the blade. Used for object $0A (AXE). Drawn on its own, 6 x 4 cells. Its other bitmap rows are at $70D0, $7210 and $7350 (320 bytes apart); its colours are at $7AF2 (screen) and $7E12 (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 28608,
   "type": "line",
   "text": "Picture 23, potion (sheet band 3, picture column 4): bitmap, cell row 1 of 4, $6FC0-$6FEF, 6 cells x 8 lines = 48 bytes. Shows a potion: a green flask giving off many-coloured vapour. Used for objects $0B-$0F (POTION). Drawn on its own, 6 x 4 cells. Its other bitmap rows are at $7100, $7240 and $7380 (320 bytes apart); its colours are at $7AF8 (screen) and $7E18 (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 28656,
   "type": "line",
   "text": "Picture 24, ring (sheet band 3, picture column 5): bitmap, cell row 1 of 4, $6FF0-$701F, 6 cells x 8 lines = 48 bytes. Shows a ring: a gold band with a light blue stone. Used for objects $10-$14 (RING). Drawn on its own, 6 x 4 cells. Its other bitmap rows are at $7130, $7270 and $73B0 (320 bytes apart); its colours are at $7AFE (screen) and $7E1E (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 28704,
   "type": "line",
   "text": "Picture sheet bitmap, cell row 12 (band 3, row 1 of 4), cell columns 36-39, $7020-$703F (32 bytes): outside the six picture columns, never copied to the strip; all zero."
  },
  {
   "address": 28736,
   "type": "line",
   "text": "Picture 19, skeleton legs: bitmap, cell row 2 of 4, $7040-$706F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 28784,
   "type": "line",
   "text": "Picture 20, backpack: bitmap, cell row 2 of 4, $7070-$709F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 28832,
   "type": "line",
   "text": "Picture 21, sword: bitmap, cell row 2 of 4, $70A0-$70CF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 28880,
   "type": "line",
   "text": "Picture 22, axe: bitmap, cell row 2 of 4, $70D0-$70FF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 28928,
   "type": "line",
   "text": "Picture 23, potion: bitmap, cell row 2 of 4, $7100-$712F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 28976,
   "type": "line",
   "text": "Picture 24, ring: bitmap, cell row 2 of 4, $7130-$715F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 29024,
   "type": "line",
   "text": "Picture sheet bitmap, cell row 13 (band 3, row 2 of 4), cell columns 36-39, $7160-$717F (32 bytes): outside the six picture columns, never copied to the strip; all zero."
  },
  {
   "address": 29056,
   "type": "line",
   "text": "Picture 19, skeleton legs: bitmap, cell row 3 of 4, $7180-$71AF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 29104,
   "type": "line",
   "text": "Picture 20, backpack: bitmap, cell row 3 of 4, $71B0-$71DF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 29152,
   "type": "line",
   "text": "Picture 21, sword: bitmap, cell row 3 of 4, $71E0-$720F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 29200,
   "type": "line",
   "text": "Picture 22, axe: bitmap, cell row 3 of 4, $7210-$723F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 29248,
   "type": "line",
   "text": "Picture 23, potion: bitmap, cell row 3 of 4, $7240-$726F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 29296,
   "type": "line",
   "text": "Picture 24, ring: bitmap, cell row 3 of 4, $7270-$729F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 29344,
   "type": "line",
   "text": "Picture sheet bitmap, cell row 14 (band 3, row 3 of 4), cell columns 36-39, $72A0-$72BF (32 bytes): outside the six picture columns, never copied to the strip; all zero."
  },
  {
   "address": 29376,
   "type": "line",
   "text": "Picture 19, skeleton legs: bitmap, cell row 4 of 4, $72C0-$72EF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 29424,
   "type": "line",
   "text": "Picture 20, backpack: bitmap, cell row 4 of 4, $72F0-$731F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 29472,
   "type": "line",
   "text": "Picture 21, sword: bitmap, cell row 4 of 4, $7320-$734F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 29520,
   "type": "line",
   "text": "Picture 22, axe: bitmap, cell row 4 of 4, $7350-$737F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 29568,
   "type": "line",
   "text": "Picture 23, potion: bitmap, cell row 4 of 4, $7380-$73AF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 29616,
   "type": "line",
   "text": "Picture 24, ring: bitmap, cell row 4 of 4, $73B0-$73DF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 29664,
   "type": "line",
   "text": "Picture sheet bitmap, cell row 15 (band 3, row 4 of 4), cell columns 36-39, $73E0-$73FF (32 bytes): outside the six picture columns, never copied to the strip; all zero."
  },
  {
   "address": 29696,
   "type": "line",
   "text": "Picture 25, bat (sheet band 4, picture column 0): bitmap, cell row 1 of 4, $7400-$742F, 6 cells x 8 lines = 48 bytes. Shows a bat with its wings spread, dark grey and grey. Used for objects $31-$37 (BAT). Drawn on its own, 6 x 4 cells. Its other bitmap rows are at $7540, $7680 and $77C0 (320 bytes apart); its colours are at $7B80 (screen) and $7EA0 (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 29744,
   "type": "line",
   "text": "Picture 26, amulet (sheet band 4, picture column 1): bitmap, cell row 1 of 4, $7430-$745F, 6 cells x 8 lines = 48 bytes. Shows an amulet: a yellow chain with an orange and red pendant. Used for object $15 (AMULET), the only amulet in the object list. Drawn on its own, 6 x 4 cells. Its other bitmap rows are at $7570, $76B0 and $77F0 (320 bytes apart); its colours are at $7B86 (screen) and $7EA6 (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 29792,
   "type": "line",
   "text": "Picture 27, spider (sheet band 4, picture column 2): bitmap, cell row 1 of 4, $7460-$748F, 6 cells x 8 lines = 48 bytes. Shows a spider hanging from a thread, brown body and grey legs. Used for objects $38-$3A (SPIDER). Drawn on its own, 6 x 4 cells. Its other bitmap rows are at $75A0, $76E0 and $7820 (320 bytes apart); its colours are at $7B8C (screen) and $7EAC (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 29840,
   "type": "line",
   "text": "Picture 28, mace (sheet band 4, picture column 3): bitmap, cell row 1 of 4, $7490-$74BF, 6 cells x 8 lines = 48 bytes. Shows a flail: a brown handle, a grey chain and a spiked ball. Used for objects $16-$17, which the noun table calls MACE. Drawn on its own, 6 x 4 cells. Its other bitmap rows are at $75D0, $7710 and $7850 (320 bytes apart); its colours are at $7B92 (screen) and $7EB2 (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 29888,
   "type": "line",
   "text": "Picture 29, snake (sheet band 4, picture column 4): bitmap, cell row 1 of 4, $74C0-$74EF, 6 cells x 8 lines = 48 bytes. Shows a green snake rearing up, mouth open. Used for objects $3B-$3C (SNAKE). Drawn on its own, 6 x 4 cells. Its other bitmap rows are at $7600, $7740 and $7880 (320 bytes apart); its colours are at $7B98 (screen) and $7EB8 (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 29936,
   "type": "line",
   "text": "Picture 30, scroll (sheet band 4, picture column 5): bitmap, cell row 1 of 4, $74F0-$751F, 6 cells x 8 lines = 48 bytes. Shows a rolled parchment scroll, grey. Used for objects $18-$1D (SCROLL). Drawn on its own, 6 x 4 cells. Its other bitmap rows are at $7630, $7770 and $78B0 (320 bytes apart); its colours are at $7B9E (screen) and $7EBE (colour RAM), 6 bytes a row, 40 apart."
  },
  {
   "address": 29984,
   "type": "line",
   "text": "Picture sheet bitmap, cell row 16 (band 4, row 1 of 4), cell columns 36-39, $7520-$753F (32 bytes): outside the six picture columns, never copied to the strip; all zero."
  },
  {
   "address": 30016,
   "type": "line",
   "text": "Picture 25, bat: bitmap, cell row 2 of 4, $7540-$756F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 30064,
   "type": "line",
   "text": "Picture 26, amulet: bitmap, cell row 2 of 4, $7570-$759F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 30112,
   "type": "line",
   "text": "Picture 27, spider: bitmap, cell row 2 of 4, $75A0-$75CF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 30160,
   "type": "line",
   "text": "Picture 28, mace: bitmap, cell row 2 of 4, $75D0-$75FF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 30208,
   "type": "line",
   "text": "Picture 29, snake: bitmap, cell row 2 of 4, $7600-$762F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 30256,
   "type": "line",
   "text": "Picture 30, scroll: bitmap, cell row 2 of 4, $7630-$765F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 30304,
   "type": "line",
   "text": "Picture sheet bitmap, cell row 17 (band 4, row 2 of 4), cell columns 36-39, $7660-$767F (32 bytes): outside the six picture columns, never copied to the strip; all zero."
  },
  {
   "address": 30336,
   "type": "line",
   "text": "Picture 25, bat: bitmap, cell row 3 of 4, $7680-$76AF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 30384,
   "type": "line",
   "text": "Picture 26, amulet: bitmap, cell row 3 of 4, $76B0-$76DF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 30432,
   "type": "line",
   "text": "Picture 27, spider: bitmap, cell row 3 of 4, $76E0-$770F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 30480,
   "type": "line",
   "text": "Picture 28, mace: bitmap, cell row 3 of 4, $7710-$773F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 30528,
   "type": "line",
   "text": "Picture 29, snake: bitmap, cell row 3 of 4, $7740-$776F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 30576,
   "type": "line",
   "text": "Picture 30, scroll: bitmap, cell row 3 of 4, $7770-$779F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 30624,
   "type": "line",
   "text": "Picture sheet bitmap, cell row 18 (band 4, row 3 of 4), cell columns 36-39, $77A0-$77BF (32 bytes): outside the six picture columns, never copied to the strip; all zero."
  },
  {
   "address": 30656,
   "type": "line",
   "text": "Picture 25, bat: bitmap, cell row 4 of 4, $77C0-$77EF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 30704,
   "type": "line",
   "text": "Picture 26, amulet: bitmap, cell row 4 of 4, $77F0-$781F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 30752,
   "type": "line",
   "text": "Picture 27, spider: bitmap, cell row 4 of 4, $7820-$784F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 30800,
   "type": "line",
   "text": "Picture 28, mace: bitmap, cell row 4 of 4, $7850-$787F (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 30848,
   "type": "line",
   "text": "Picture 29, snake: bitmap, cell row 4 of 4, $7880-$78AF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 30896,
   "type": "line",
   "text": "Picture 30, scroll: bitmap, cell row 4 of 4, $78B0-$78DF (48 bytes, 6 cells x 8 lines), 320 bytes below the row above it."
  },
  {
   "address": 30944,
   "type": "line",
   "text": "Picture sheet bitmap, cell row 19 (band 4, row 4 of 4), cell columns 36-39, $78E0-$78FF (32 bytes): outside the six picture columns, never copied to the strip; all zero."
  },
  {
   "address": 30976,
   "type": "line",
   "text": "SCREEN-COLOUR PLANE of the picture sheet, $7900-$7C1F (800 bytes, 40 a cell row): one byte a cell, high nybble the colour of bit pair 01 and low nybble that of bit pair 10 in its 4 x 8 multicolour cell; $15CB copies a picture's six-byte runs into the strip's screen matrix at $A800. Picture sheet screen colours, cell row 0 (band 0, row 1 of 4), $7900-$7927: 6 bytes for each of pictures 1 armour top $7900, 2 orc top $7906, 3 helmet $790C, 4 wizard $7912, 5 minotaur top $7918, 6 vampire top $791E; then 4 zero bytes for the empty cell columns 36-39 ($7924-$7927)."
  },
  {
   "address": 31016,
   "type": "line",
   "text": "Picture sheet screen colours, cell row 1 (band 0, row 2 of 4), $7928-$794F: 6 bytes for each of pictures 1 armour top $7928, 2 orc top $792E, 3 helmet $7934, 4 wizard $793A, 5 minotaur top $7940, 6 vampire top $7946; then 4 zero bytes for the empty cell columns 36-39 ($794C-$794F)."
  },
  {
   "address": 31056,
   "type": "line",
   "text": "Picture sheet screen colours, cell row 2 (band 0, row 3 of 4), $7950-$7977: 6 bytes for each of pictures 1 armour top $7950, 2 orc top $7956, 3 helmet $795C, 4 wizard $7962, 5 minotaur top $7968, 6 vampire top $796E; then 4 zero bytes for the empty cell columns 36-39 ($7974-$7977)."
  },
  {
   "address": 31096,
   "type": "line",
   "text": "Picture sheet screen colours, cell row 3 (band 0, row 4 of 4), $7978-$799F: 6 bytes for each of pictures 1 armour top $7978, 2 orc top $797E, 3 helmet $7984, 4 wizard $798A, 5 minotaur top $7990, 6 vampire top $7996; then 4 zero bytes for the empty cell columns 36-39 ($799C-$799F)."
  },
  {
   "address": 31136,
   "type": "line",
   "text": "Picture sheet screen colours, cell row 4 (band 1, row 1 of 4), $79A0-$79C7: 6 bytes for each of pictures 7 armour legs $79A0, 8 orc legs $79A6, 9 door top $79AC, 10 stairs top $79B2, 11 minotaur legs $79B8, 12 vampire cloak $79BE; then 4 zero bytes for the empty cell columns 36-39 ($79C4-$79C7)."
  },
  {
   "address": 31176,
   "type": "line",
   "text": "Picture sheet screen colours, cell row 5 (band 1, row 2 of 4), $79C8-$79EF: 6 bytes for each of pictures 7 armour legs $79C8, 8 orc legs $79CE, 9 door top $79D4, 10 stairs top $79DA, 11 minotaur legs $79E0, 12 vampire cloak $79E6; then 4 zero bytes for the empty cell columns 36-39 ($79EC-$79EF)."
  },
  {
   "address": 31216,
   "type": "line",
   "text": "Picture sheet screen colours, cell row 6 (band 1, row 3 of 4), $79F0-$7A17: 6 bytes for each of pictures 7 armour legs $79F0, 8 orc legs $79F6, 9 door top $79FC, 10 stairs top $7A02, 11 minotaur legs $7A08, 12 vampire cloak $7A0E; then 4 zero bytes for the empty cell columns 36-39 ($7A14-$7A17)."
  },
  {
   "address": 31256,
   "type": "line",
   "text": "Picture sheet screen colours, cell row 7 (band 1, row 4 of 4), $7A18-$7A3F: 6 bytes for each of pictures 7 armour legs $7A18, 8 orc legs $7A1E, 9 door top $7A24, 10 stairs top $7A2A, 11 minotaur legs $7A30, 12 vampire cloak $7A36; then 4 zero bytes for the empty cell columns 36-39 ($7A3C-$7A3F)."
  },
  {
   "address": 31296,
   "type": "line",
   "text": "Picture sheet screen colours, cell row 8 (band 2, row 1 of 4), $7A40-$7A67: 6 bytes for each of pictures 13 skeleton top $7A40, 14 shield $7A46, 15 door bottom $7A4C, 16 stairs steps $7A52, 17 dagger $7A58, 18 hellhound $7A5E; then 4 bytes for cell columns 36-39 ($7A64-$7A67), zero except $7A64 = $E8, the colour of the stray dot at $6B20."
  },
  {
   "address": 31336,
   "type": "line",
   "text": "Picture sheet screen colours, cell row 9 (band 2, row 2 of 4), $7A68-$7A8F: 6 bytes for each of pictures 13 skeleton top $7A68, 14 shield $7A6E, 15 door bottom $7A74, 16 stairs steps $7A7A, 17 dagger $7A80, 18 hellhound $7A86; then 4 zero bytes for the empty cell columns 36-39 ($7A8C-$7A8F)."
  },
  {
   "address": 31376,
   "type": "line",
   "text": "Picture sheet screen colours, cell row 10 (band 2, row 3 of 4), $7A90-$7AB7: 6 bytes for each of pictures 13 skeleton top $7A90, 14 shield $7A96, 15 door bottom $7A9C, 16 stairs steps $7AA2, 17 dagger $7AA8, 18 hellhound $7AAE; then 4 zero bytes for the empty cell columns 36-39 ($7AB4-$7AB7)."
  },
  {
   "address": 31416,
   "type": "line",
   "text": "Picture sheet screen colours, cell row 11 (band 2, row 4 of 4), $7AB8-$7ADF: 6 bytes for each of pictures 13 skeleton top $7AB8, 14 shield $7ABE, 15 door bottom $7AC4, 16 stairs steps $7ACA, 17 dagger $7AD0, 18 hellhound $7AD6; then 4 zero bytes for the empty cell columns 36-39 ($7ADC-$7ADF)."
  },
  {
   "address": 31456,
   "type": "line",
   "text": "Picture sheet screen colours, cell row 12 (band 3, row 1 of 4), $7AE0-$7B07: 6 bytes for each of pictures 19 skeleton legs $7AE0, 20 backpack $7AE6, 21 sword $7AEC, 22 axe $7AF2, 23 potion $7AF8, 24 ring $7AFE; then 4 zero bytes for the empty cell columns 36-39 ($7B04-$7B07)."
  },
  {
   "address": 31496,
   "type": "line",
   "text": "Picture sheet screen colours, cell row 13 (band 3, row 2 of 4), $7B08-$7B2F: 6 bytes for each of pictures 19 skeleton legs $7B08, 20 backpack $7B0E, 21 sword $7B14, 22 axe $7B1A, 23 potion $7B20, 24 ring $7B26; then 4 zero bytes for the empty cell columns 36-39 ($7B2C-$7B2F)."
  },
  {
   "address": 31536,
   "type": "line",
   "text": "Picture sheet screen colours, cell row 14 (band 3, row 3 of 4), $7B30-$7B57: 6 bytes for each of pictures 19 skeleton legs $7B30, 20 backpack $7B36, 21 sword $7B3C, 22 axe $7B42, 23 potion $7B48, 24 ring $7B4E; then 4 zero bytes for the empty cell columns 36-39 ($7B54-$7B57)."
  },
  {
   "address": 31576,
   "type": "line",
   "text": "Picture sheet screen colours, cell row 15 (band 3, row 4 of 4), $7B58-$7B7F: 6 bytes for each of pictures 19 skeleton legs $7B58, 20 backpack $7B5E, 21 sword $7B64, 22 axe $7B6A, 23 potion $7B70, 24 ring $7B76; then 4 zero bytes for the empty cell columns 36-39 ($7B7C-$7B7F)."
  },
  {
   "address": 31616,
   "type": "line",
   "text": "Picture sheet screen colours, cell row 16 (band 4, row 1 of 4), $7B80-$7BA7: 6 bytes for each of pictures 25 bat $7B80, 26 amulet $7B86, 27 spider $7B8C, 28 mace $7B92, 29 snake $7B98, 30 scroll $7B9E; then 4 zero bytes for the empty cell columns 36-39 ($7BA4-$7BA7)."
  },
  {
   "address": 31656,
   "type": "line",
   "text": "Picture sheet screen colours, cell row 17 (band 4, row 2 of 4), $7BA8-$7BCF: 6 bytes for each of pictures 25 bat $7BA8, 26 amulet $7BAE, 27 spider $7BB4, 28 mace $7BBA, 29 snake $7BC0, 30 scroll $7BC6; then 4 zero bytes for the empty cell columns 36-39 ($7BCC-$7BCF)."
  },
  {
   "address": 31696,
   "type": "line",
   "text": "Picture sheet screen colours, cell row 18 (band 4, row 3 of 4), $7BD0-$7BF7: 6 bytes for each of pictures 25 bat $7BD0, 26 amulet $7BD6, 27 spider $7BDC, 28 mace $7BE2, 29 snake $7BE8, 30 scroll $7BEE; then 4 zero bytes for the empty cell columns 36-39 ($7BF4-$7BF7)."
  },
  {
   "address": 31736,
   "type": "line",
   "text": "Picture sheet screen colours, cell row 19 (band 4, row 4 of 4), $7BF8-$7C1F: 6 bytes for each of pictures 25 bat $7BF8, 26 amulet $7BFE, 27 spider $7C04, 28 mace $7C0A, 29 snake $7C10, 30 scroll $7C16; then 4 zero bytes for the empty cell columns 36-39 ($7C1C-$7C1F)."
  },
  {
   "address": 31776,
   "type": "line",
   "text": "COLOUR-RAM PLANE of the picture sheet, $7C20-$7F3F (800 bytes, 40 a cell row): one byte a cell, the colour of bit pair 11 (values 0-15, the high nybble always 0); $160E copies a picture's six-byte runs into colour RAM at $D800. Bit pair 00 is the strip's background, black ($D021 = 0 from $27E7). Picture sheet colour-RAM nybbles, cell row 0 (band 0, row 1 of 4), $7C20-$7C47: 6 bytes for each of pictures 1 armour top $7C20, 2 orc top $7C26, 3 helmet $7C2C, 4 wizard $7C32, 5 minotaur top $7C38, 6 vampire top $7C3E; then 4 zero bytes for the empty cell columns 36-39 ($7C44-$7C47)."
  },
  {
   "address": 31816,
   "type": "line",
   "text": "Picture sheet colour-RAM nybbles, cell row 1 (band 0, row 2 of 4), $7C48-$7C6F: 6 bytes for each of pictures 1 armour top $7C48, 2 orc top $7C4E, 3 helmet $7C54, 4 wizard $7C5A, 5 minotaur top $7C60, 6 vampire top $7C66; then 4 zero bytes for the empty cell columns 36-39 ($7C6C-$7C6F)."
  },
  {
   "address": 31856,
   "type": "line",
   "text": "Picture sheet colour-RAM nybbles, cell row 2 (band 0, row 3 of 4), $7C70-$7C97: 6 bytes for each of pictures 1 armour top $7C70, 2 orc top $7C76, 3 helmet $7C7C, 4 wizard $7C82, 5 minotaur top $7C88, 6 vampire top $7C8E; then 4 zero bytes for the empty cell columns 36-39 ($7C94-$7C97)."
  },
  {
   "address": 31896,
   "type": "line",
   "text": "Picture sheet colour-RAM nybbles, cell row 3 (band 0, row 4 of 4), $7C98-$7CBF: 6 bytes for each of pictures 1 armour top $7C98, 2 orc top $7C9E, 3 helmet $7CA4, 4 wizard $7CAA, 5 minotaur top $7CB0, 6 vampire top $7CB6; then 4 zero bytes for the empty cell columns 36-39 ($7CBC-$7CBF)."
  },
  {
   "address": 31936,
   "type": "line",
   "text": "Picture sheet colour-RAM nybbles, cell row 4 (band 1, row 1 of 4), $7CC0-$7CE7: 6 bytes for each of pictures 7 armour legs $7CC0, 8 orc legs $7CC6, 9 door top $7CCC, 10 stairs top $7CD2, 11 minotaur legs $7CD8, 12 vampire cloak $7CDE; then 4 zero bytes for the empty cell columns 36-39 ($7CE4-$7CE7)."
  },
  {
   "address": 31976,
   "type": "line",
   "text": "Picture sheet colour-RAM nybbles, cell row 5 (band 1, row 2 of 4), $7CE8-$7D0F: 6 bytes for each of pictures 7 armour legs $7CE8, 8 orc legs $7CEE, 9 door top $7CF4, 10 stairs top $7CFA, 11 minotaur legs $7D00, 12 vampire cloak $7D06; then 4 zero bytes for the empty cell columns 36-39 ($7D0C-$7D0F)."
  },
  {
   "address": 32016,
   "type": "line",
   "text": "Picture sheet colour-RAM nybbles, cell row 6 (band 1, row 3 of 4), $7D10-$7D37: 6 bytes for each of pictures 7 armour legs $7D10, 8 orc legs $7D16, 9 door top $7D1C, 10 stairs top $7D22, 11 minotaur legs $7D28, 12 vampire cloak $7D2E; then 4 zero bytes for the empty cell columns 36-39 ($7D34-$7D37)."
  },
  {
   "address": 32056,
   "type": "line",
   "text": "Picture sheet colour-RAM nybbles, cell row 7 (band 1, row 4 of 4), $7D38-$7D5F: 6 bytes for each of pictures 7 armour legs $7D38, 8 orc legs $7D3E, 9 door top $7D44, 10 stairs top $7D4A, 11 minotaur legs $7D50, 12 vampire cloak $7D56; then 4 zero bytes for the empty cell columns 36-39 ($7D5C-$7D5F)."
  },
  {
   "address": 32096,
   "type": "line",
   "text": "Picture sheet colour-RAM nybbles, cell row 8 (band 2, row 1 of 4), $7D60-$7D87: 6 bytes for each of pictures 13 skeleton top $7D60, 14 shield $7D66, 15 door bottom $7D6C, 16 stairs steps $7D72, 17 dagger $7D78, 18 hellhound $7D7E; then 4 bytes for cell columns 36-39 ($7D84-$7D87), zero except $7D84 = $0B, the colour of the stray dot at $6B20."
  },
  {
   "address": 32136,
   "type": "line",
   "text": "Picture sheet colour-RAM nybbles, cell row 9 (band 2, row 2 of 4), $7D88-$7DAF: 6 bytes for each of pictures 13 skeleton top $7D88, 14 shield $7D8E, 15 door bottom $7D94, 16 stairs steps $7D9A, 17 dagger $7DA0, 18 hellhound $7DA6; then 4 zero bytes for the empty cell columns 36-39 ($7DAC-$7DAF)."
  },
  {
   "address": 32176,
   "type": "line",
   "text": "Picture sheet colour-RAM nybbles, cell row 10 (band 2, row 3 of 4), $7DB0-$7DD7: 6 bytes for each of pictures 13 skeleton top $7DB0, 14 shield $7DB6, 15 door bottom $7DBC, 16 stairs steps $7DC2, 17 dagger $7DC8, 18 hellhound $7DCE; then 4 zero bytes for the empty cell columns 36-39 ($7DD4-$7DD7)."
  },
  {
   "address": 32216,
   "type": "line",
   "text": "Picture sheet colour-RAM nybbles, cell row 11 (band 2, row 4 of 4), $7DD8-$7DFF: 6 bytes for each of pictures 13 skeleton top $7DD8, 14 shield $7DDE, 15 door bottom $7DE4, 16 stairs steps $7DEA, 17 dagger $7DF0, 18 hellhound $7DF6; then 4 zero bytes for the empty cell columns 36-39 ($7DFC-$7DFF)."
  },
  {
   "address": 32256,
   "type": "line",
   "text": "Picture sheet colour-RAM nybbles, cell row 12 (band 3, row 1 of 4), $7E00-$7E27: 6 bytes for each of pictures 19 skeleton legs $7E00, 20 backpack $7E06, 21 sword $7E0C, 22 axe $7E12, 23 potion $7E18, 24 ring $7E1E; then 4 zero bytes for the empty cell columns 36-39 ($7E24-$7E27)."
  },
  {
   "address": 32296,
   "type": "line",
   "text": "Picture sheet colour-RAM nybbles, cell row 13 (band 3, row 2 of 4), $7E28-$7E4F: 6 bytes for each of pictures 19 skeleton legs $7E28, 20 backpack $7E2E, 21 sword $7E34, 22 axe $7E3A, 23 potion $7E40, 24 ring $7E46; then 4 zero bytes for the empty cell columns 36-39 ($7E4C-$7E4F)."
  },
  {
   "address": 32336,
   "type": "line",
   "text": "Picture sheet colour-RAM nybbles, cell row 14 (band 3, row 3 of 4), $7E50-$7E77: 6 bytes for each of pictures 19 skeleton legs $7E50, 20 backpack $7E56, 21 sword $7E5C, 22 axe $7E62, 23 potion $7E68, 24 ring $7E6E; then 4 zero bytes for the empty cell columns 36-39 ($7E74-$7E77)."
  },
  {
   "address": 32376,
   "type": "line",
   "text": "Picture sheet colour-RAM nybbles, cell row 15 (band 3, row 4 of 4), $7E78-$7E9F: 6 bytes for each of pictures 19 skeleton legs $7E78, 20 backpack $7E7E, 21 sword $7E84, 22 axe $7E8A, 23 potion $7E90, 24 ring $7E96; then 4 zero bytes for the empty cell columns 36-39 ($7E9C-$7E9F)."
  },
  {
   "address": 32416,
   "type": "line",
   "text": "Picture sheet colour-RAM nybbles, cell row 16 (band 4, row 1 of 4), $7EA0-$7EC7: 6 bytes for each of pictures 25 bat $7EA0, 26 amulet $7EA6, 27 spider $7EAC, 28 mace $7EB2, 29 snake $7EB8, 30 scroll $7EBE; then 4 zero bytes for the empty cell columns 36-39 ($7EC4-$7EC7)."
  },
  {
   "address": 32456,
   "type": "line",
   "text": "Picture sheet colour-RAM nybbles, cell row 17 (band 4, row 2 of 4), $7EC8-$7EEF: 6 bytes for each of pictures 25 bat $7EC8, 26 amulet $7ECE, 27 spider $7ED4, 28 mace $7EDA, 29 snake $7EE0, 30 scroll $7EE6; then 4 zero bytes for the empty cell columns 36-39 ($7EEC-$7EEF)."
  },
  {
   "address": 32496,
   "type": "line",
   "text": "Picture sheet colour-RAM nybbles, cell row 18 (band 4, row 3 of 4), $7EF0-$7F17: 6 bytes for each of pictures 25 bat $7EF0, 26 amulet $7EF6, 27 spider $7EFC, 28 mace $7F02, 29 snake $7F08, 30 scroll $7F0E; then 4 zero bytes for the empty cell columns 36-39 ($7F14-$7F17)."
  },
  {
   "address": 32536,
   "type": "line",
   "text": "Picture sheet colour-RAM nybbles, cell row 19 (band 4, row 4 of 4), $7F18-$7F3F: 6 bytes for each of pictures 25 bat $7F18, 26 amulet $7F1E, 27 spider $7F24, 28 mace $7F2A, 29 snake $7F30, 30 scroll $7F36; then 4 zero bytes for the empty cell columns 36-39 ($7F3C-$7F3F)."
  },
  {
   "address": 32576,
   "type": "line",
   "text": "UNUSED, $7F40-$7FFF: 192 bytes of $00 after the picture sheet's colour-RAM plane (which ends at $7F3F), up to the CBM80 header at $8000. Loaded with the game; no instruction or pointer table found refers to them."
  },
  {
   "address": 32768,
   "type": "line",
   "text": "CBM80 HEADER, $8000-$8008, word 1: the cold-start vector, $0818, the game's restart (the title and demonstration, then a new game). With the signature at $8004 in place the KERNAL's reset routine jumps through this word instead of starting BASIC, so a reset restarts the game (live, features.md). Loaded with the game; no game code reads or writes $8000-$8008. The game's own title code takes its text from $8009, straight after the header, so the header is probably part of the original layout rather than the crack's."
  },
  {
   "address": 32770,
   "type": "line",
   "text": "CBM80 header word 2: the warm-start vector, also $0818. The KERNAL's NMI handler finds the signature and jumps through this word when RESTORE is pressed, so RESTORE restarts the game at the title rather than breaking into BASIC (live, features.md)."
  },
  {
   "address": 32772,
   "type": "line",
   "text": "CBM80 signature: $C3 $C2 $CD $38 $30, that is C, B and M with bit 7 set, then 8 and 0: the five bytes the KERNAL compares at reset and on RESTORE to decide that a cartridge is present and take the vectors at $8000/$8002. The game is not a cartridge; the signature is only there to catch reset and RESTORE."
  },
  {
   "address": 32777,
   "type": "line",
   "text": "TITLE SCROLLER TEXT, $8009-$838D (901 bytes): upper-case PETSCII (letters $41-$5A, space, comma, full stop, slash), no terminator. The title's $5DAC shows 40 characters from the pointer $5E4C/$5E4D (set to $8009 at $5B48) on the bottom text line, screen $07C0 in colour 7 (yellow, $DBC0), subtracting $40 from codes $40-$BF (its test is BMI on the difference) to make screen codes, and moves the pointer on one character each time the fine scroll $5E4B passes 0. When the pointer reaches $8366 it goes back to $8009 and sets $03D9 = 2, and the title loop ($5BE4) then starts the demonstration: one pass of this text is how long the title lasts unless fire is pressed. Content: 40 spaces ($8009-$8030), so the text enters an empty line from the right; the story ($8031-$82D0: a deep black pool, the hand of Thelric the Master of Magic, the lost Amulet of Immortality); \"PRESS FIRE OR SPACE TO BEGIN.\" ($82D9); \"PRESS M FOR MUSIC ON/OFF.\" ($82FD; M does switch the music off and on, live); \"PROGRAMMED BY RICHARD DARLING, ART BY JAMES WILSON, MUSIC BY ROB HUBBARD.\" ($831D-$8365), the game's own credits; then 40 spaces so that it leaves to the left. The last of them, $838D, is never shown: the window's right edge reaches $8365 + 39 = $838C at most."
  },
  {
   "address": 33678,
   "type": "line",
   "text": "CONTROLS SCREEN TEXT, $838E-$84B6 (297 bytes): PETSCII with control codes, ended by the $00 at $84B6. $5C78 prints it through CHROUT ($2BC7, X/Y = $838E) when the title loop is left by fire or SPACE ($03D3 = 0; the demonstration and the joystick recorder leave it with 2 and 1 and skip this screen), on screen $0400 with the game's character set at $3000. $93 clears the screen; $05 white: \"THE GAME IS CONTROLLED BY A / JOYSTICK IN PORT Z OR THE KEYS,\", where the screen shows the game's glyph for Z, drawn much like a 2; the set draws its digits reversed, probably why the text has Z ($5A); $9E yellow: \"H=UP B=DOWN <-=LEFT SHIFT=RIGHT\", where $5F (the left-arrow code) prints glyph $1F, the Commodore logo in the game's set, for the Commodore key, and \"SPACE=FIRE\"; $9F cyan: \"THE GRAPHIC DISPLAY SHOWS AN OVERHEAD VIEW OF YOU AND YOUR SURROUNDINGS, ALL YOUR OPTIONS ARE SHOWN ON THE MENU IN THE CENTRE OF THE SCREEN.\"; $05 white: \"FIRE TO START OR B FOR INSTRUCTIONS.\" Lines are separated by two $0D. $5C7F then polls $179D: $0389 = 1 (B, or the stick pulled down) prints the five instruction pages from $84B7, fire starts the game."
  },
  {
   "address": 33975,
   "type": "line",
   "text": "INSTRUCTIONS PAGE 1 of 5, \"HOW TO CONTROL THE GAME\", $84B7-$86E6 (560 bytes): PETSCII, ended by the $00 at $86E6. Printed by $5C92 through $2BC7 when B or stick-down is pressed on the controls screen; $5E29 then waits for fire to be pressed and released. $93 clear, $05 white title, $9E yellow text: a menu appears across the middle of the screen listing the options you have at that time; the flashing cursor starts on the first option, RUN; the joystick or the keyboard moves it; fire or SPACE executes the highlighted command; some options lead to other menus, and either way you come back to the main menu when the command has finished. $05 white: \"PRESS FIRE TO CONTINUE\". Laid out for the 40-column screen: lines are padded with spaces and words split exactly at the wrap (\"WILL\" / \"BE\")."
  },
  {
   "address": 34535,
   "type": "line",
   "text": "INSTRUCTIONS PAGE 2 of 5, \"THE DISPLAY\", $86E7-$8892 (428 bytes): PETSCII, ended by the $00 at $8892; printed by $5C9C after page 1. White title, yellow text: the window at the top right tells you what is going on; the top left corner is an accurate representation of what you can see, with you as the yellow circle in the centre; the display at the bottom shows large pictures of any important things (the strip drawn from the picture sheet at $6000); mind and body strength and the game time are at the top right. White \"PRESS FIRE TO CONTINUE\"."
  },
  {
   "address": 34963,
   "type": "line",
   "text": "INSTRUCTIONS PAGE 3 of 5, \"TO PLAY THE GAME\", $8893-$8B1A (648 bytes): PETSCII, ended by the $00 at $8B1A; printed by $5CA6. White title, yellow text: select RUN to move the man round the rooms with the joystick or keys, and press fire or SPACE to get back to the menu; to open a door you must be directly in front of it; to pick up an object you must appear to be on top of it; INVENTORY tells you what you carry in each hand and what you wear, such as a backpack; an attack uses the weapon in your right hand. White \"PRESS FIRE TO CONTINUE\"."
  },
  {
   "address": 35611,
   "type": "line",
   "text": "INSTRUCTIONS PAGE 4 of 5, \"USING MAGIC\", $8B1B-$8DB0 (662 bytes): PETSCII, ended by the $00 at $8DB0; printed by $5CB0. White title, yellow text, each spell's name in cyan ($9F): MAGIC MISSILE, a fiery arrow at any live target in sight, serious damage if it hits but a high chance of missing; FIREBALL, a fireball of 15 foot radius round you that burns anyone in the area except you; ENERGY DRAIN, at any creature in sight, an instant loss of some of its body strength; MAGICAL SHIELD, a shielding over your skin against attack that lasts until it is uncast and continually reduces your mind power. White \"PRESS FIRE TO CONTINUE\"."
  },
  {
   "address": 36273,
   "type": "line",
   "text": "INSTRUCTIONS PAGE 5 of 5, \"MAGICAL OR PHYSICAL COMBAT\", $8DB1-$8F99 (489 bytes): PETSCII, ended by the $00 at $8F99; printed by $5CBA, the last page, after which $5CC4 returns and the game starts. White title, yellow text: every living creature, you included, has a body strength; an attack scores a hit or a miss, partly by luck and partly by how well the defender is protected and how skilled the attacker is; a hit reduces the defender's body strength by an amount that depends on the weapon used. Cyan: \"FIND THE REST OUT FOR YOURSELF...\"; white: \"PRESS FIRE TO BEGIN THE GAME.\""
  },
  {
   "address": 36762,
   "type": "line",
   "text": "UNUSED, $8F9A-$8FFF: 102 bytes of $00 after the last instruction page's terminator ($8F99), up to $9000. Loaded with the game; no instruction or pointer table found refers to them."
  },
  {
   "address": 36864,
   "type": "line",
   "text": "Dungeon map, $9000-$9FFF; this is row 0. 32 rows of 128 cells, one byte per cell: a character code of the top band's set at $3000, which the view window shows unchanged (colour from tile_colour, $A400), so the 11x11 window is an opening onto this map. Cell (row r, column c) is at $9000 + r*$80 + c, two rows per page; north is up the screen. The 128 columns hold four levels of 32 side by side (level 1: columns 0-31, 2: 32-63, 3: 64-95, 4: 96-127), and a staircase moves whoever steps onto its trigger half exactly 32 columns, to the same row of the next or previous level ($20CC). Every position the game keeps is an address in this map: the player's, each creature's and each object's ($3F70/$3FB0; a high byte of $00 means carried by entry nn instead) and the creatures' destinations ($4CAE/$4CCD). Codes: $7E rock and $7F (the view's unseen fill, also used for a few rock cells) are solid black; $91 is open floor; the other codes from $80 to $B9 are floor cells with mid-grey wall lines along some edges (room walls and corners, corridors, dead ends, cave edges); $B0 $B1 and $B2 $B3 are staircases and $A3 a one-way drop; $50-$53 and $70-$73 are pool water and its rim, $70 being the pedestal; $F0-$FF are doors, each door two cells facing each other across a wall: bit 0 set = open; bit 3 clear = the other half is a row away, set = one cell across; bit 1 clear = below or to the right, set = above or to the left; bit 2 only picks the glyph (a door in a room wall, or at the end of a narrow passage). Only OPEN ($1BBF), CLOSE ($1C85) and the new game's door reset ($09AE) write to the map. One-cell strips of floor walled in by rock run down column 0 (rows 0-12 and 31), column 64 (rows 0 and 28-31) and column 96 (every row); nothing reaches them. Row 0 itself: rock carrying the digit glyphs 1 ($900F), 3 ($9051) and 4 ($9071), which label levels 1, 3 and 4 and are never in sight; the north wall of level 2's hall; the first caves of level 4, where a bat (entry $34) starts at $9078."
  },
  {
   "address": 36992,
   "type": "line",
   "text": "Map row 1 ($9080-$90FF). Level 1: rock. Level 2: the first floor row of the hall that fills the whole level; a scroll (entry $1D) lies at $90A1. Level 3: a corridor closed at its west end (column 64, $87) runs east to the first of three stacked staircases, $B0 $B1 at $90C9-$90CA; stepping onto $90CA moves you to $90EA on level 4. Level 4: that staircase's twin, $B2 $B3 at $90E9-$90EA (stepping onto $90E9 returns you to $90C9), opening east into the caves."
  },
  {
   "address": 37120,
   "type": "line",
   "text": "Map row 2 ($9100-$917F). Level 1: rock. Level 2: hall floor with free-standing wall segments. Level 3: the second stacked staircase, $B0 $B1 at $9149-$914A, at the east end of another corridor closed at column 64; a spider (entry $38) starts on $9149, and $914A leads to $916A. Level 4: its twin, $B2 $B3 at $9169-$916A ($9169 leads back to $9149), and caves where an orc (entry $24) starts at $917D."
  },
  {
   "address": 37248,
   "type": "line",
   "text": "Map row 3 ($9180-$91FF). Level 1: rock. Level 2: hall. Level 3: the third stacked staircase, $B0 $B1 at $91C9-$91CA ($91CA leads to $91EA); its corridor, unlike those of rows 1 and 2, turns south at column 64 ($B5), so it is the only one of the three that leads on into level 3. Level 4: its twin, $B2 $B3 at $91E9-$91EA ($91E9 leads back to $91C9), and caves."
  },
  {
   "address": 37376,
   "type": "line",
   "text": "Map row 4 ($9200-$927F). Level 1: rock. Level 2: hall floor. Level 3: rock except the corridor running south down column 64 ($84) from the staircase corridor of row 3 to the rooms. Level 4: caves (columns 110-127)."
  },
  {
   "address": 37504,
   "type": "line",
   "text": "Map row 5 ($9280-$92FF). Level 1: rock. Level 2: hall; a skeleton (entry $2A) and a hellhound (entry $2F) start side by side at $92A7 and $92A8. Level 3: the column-64 corridor in rock. Level 4: caves, where two bats (entries $32 and $33) start on the same cell, $92F6, and a third (entry $37) at $92F3."
  },
  {
   "address": 37632,
   "type": "line",
   "text": "Map row 6 ($9300-$937F). Level 1: the north wall of a block of small rooms and winding corridors that fills columns 22-31 down to row 17. Level 2: hall. Level 3: the north wall of the rooms that fill columns 67-88 down to row 19, beside the column-64 corridor. Level 4: caves; a hellhound (entry $30) starts at $936D and a skeleton (entry $27) at $9374."
  },
  {
   "address": 37760,
   "type": "line",
   "text": "Map row 7 ($9380-$93FF). Level 1: a corridor from column 11 east to column 22, where it turns south down the west side of the north-east block (an orc, entry $23, starts in it at $9390); the closed door $F0 at $9399 in the south wall of a small room, whose other half is $F6 at $9419 just below. Level 2: hall. Level 3: rooms. Level 4: caves; the view window position in play-run.vsf was centred on $93F8 in this row."
  },
  {
   "address": 37888,
   "type": "line",
   "text": "Map row 8 ($9400-$947F). Level 1: the door pair's lower half $F6 at $9419 (head of a north-south passage), and a second door across a wall inside the north-east block, $F8 at $941D with its partner $FA at $941E. Level 2: hall; a skeleton (entry $29) starts at $9434. Level 3: rooms; a skeleton (entry $28) starts at $944A, along a room's north wall. Level 4: caves; the player starts here, at $947B (column 123), four rows above and four columns east of the pedestal."
  },
  {
   "address": 38016,
   "type": "line",
   "text": "Map row 9 ($9480-$94FF). Level 1: the corridor down column 11 and the north-east block; an orc (entry $22) starts at $949B. Level 2: hall. Level 3: two closed doors in the south walls of rooms, $F0 at $94CA (column 74) and $F0 at $94D6 (column 86), each over its partner in row 10; a ring (entry $11) lies at $94D8. Level 4: caves."
  },
  {
   "address": 38144,
   "type": "line",
   "text": "Map row 10 ($9500-$957F). Level 1: corridors, a small room at columns 12-15 and the north-east block; cells of $7F (the unseen fill, black like rock) fill most of columns 17-22 in rows 10-13, in the rock between them. Level 2: hall. Level 3: the lower halves of the two doors above, $F2 at $954A and $F2 at $9556. Level 4: caves."
  },
  {
   "address": 38272,
   "type": "line",
   "text": "Map row 11 ($9580-$95FF). Level 1: three short north-south passages at columns 3-5 above a room, a spider (entry $3A) at $9589, more $7F cells at columns 17-21, and a minotaur (entry $3F) at $959B. Level 2: a staircase $B0 $B1 at $95A4-$95A5; stepping onto $95A5 moves you to $95C5 on level 3. Level 3: two staircases side by side: $B0 $B1 at $95C2-$95C3 ($95C3 leads to $95E3, level 4) and $B2 $B3 at $95C4-$95C5 ($95C4 leads back to $95A4, level 2). Level 4: the staircase $B2 $B3 at $95E2-$95E3 ($95E2 leads back to $95C2), then a passage east into the western cave; a scroll (entry $18) at $95F4 beside the pool, whose top half ($51 $53) is at $95F5-$95F6."
  },
  {
   "address": 38400,
   "type": "line",
   "text": "Map row 12 ($9600-$967F). Level 1: three closed doors side by side at the feet of the passages of row 11, $F4 at $9603-$9605 over their partners in row 13 (a vampire, entry $3D, starts on $9603); $7F cells at columns 17-21; and at $961F, the east end of a winding dead-end corridor, the amulet (entry $15), the object the game is won with. Level 2: hall. Level 3: three closed doors, $F0 at $964A, $9652 and $9656, over their partners in row 13. Level 4: a $7F cell at $9662; the pool's lower half ($71 $73) at $9675-$9676 and beside it the pedestal cell $70 at $9677: putting the amulet down while standing on $9677 wins the game ($1B82)."
  },
  {
   "address": 38528,
   "type": "line",
   "text": "Map row 13 ($9680-$96FF). Level 1: the lower halves of the three doors, $F2 at $9683-$9685, in the north wall of the rooms and corridors that fill the west of the level (columns 0-15, down to row 30); $7F cells at columns 17-22. Level 2: hall. Level 3: the lower halves $F2 at $96CA, $96D2 and $96D6 of the three doors above; a ring (entry $10) lies at $96C8. Level 4: the western cave and the pool's surroundings; a spider (entry $39) starts at $96E7 and a bat (entry $31) at $96F5."
  },
  {
   "address": 38656,
   "type": "line",
   "text": "Map row 14 ($9700-$977F). Level 1: the wizard (entry $26) starts at $9704; in the north-east block a corridor runs from a corner at column 23 to a door at columns 27-28 ($FC at $971B, partner $FA at $971C), and on it, at $9718, the one-way drop $A3: stepping onto it moves you 32 columns east, to $9738, open floor in level 2's hall. Level 2: hall; an orc (entry $25) starts at $9723 and a skeleton (entry $2C) at $9731. Level 3: a closed door $F0 at $9756 over its partner $F6 in row 15. Level 4: the western cave; the backpack (entry $07) lies at $976C."
  },
  {
   "address": 38784,
   "type": "line",
   "text": "Map row 15 ($9780-$97FF). Level 1: rooms. Level 2: hall. Level 3: the door half $F6 at $97D6 (head of a north-south passage). Level 4: the western cave, and at $97FC (column 124) the closed door $F4, foot of a north-south passage, whose partner $F2 is at $987C; the demonstration opens this door (demo.vsf holds $F5/$F3 here)."
  },
  {
   "address": 38912,
   "type": "line",
   "text": "Map row 16 ($9800-$987F). Level 1: rooms; a scroll (entry $1B) lies at $9803. Level 2: hall. Level 3: a vampire (entry $3E) starts at $9847 and a closed door $F0 sits at $984A over its partner $F6 in row 17. Level 4: the lower half $F2 of the door pair, at $987C."
  },
  {
   "address": 39040,
   "type": "line",
   "text": "Map row 17 ($9880-$98FF). Level 1: rooms, and the south wall of the north-east block. Level 2: hall. Level 3: the door half $F6 at $98CA. Level 4: caves south of the pool; a snake (entry $3C) starts at $98F6."
  },
  {
   "address": 39168,
   "type": "line",
   "text": "Map row 18 ($9900-$997F). Level 1: rooms; a closed door $F4 at $9906 (foot of a north-south passage) over its partner $F2 at $9986. Level 2: hall. Level 3: rooms. Level 4: caves (columns 115-127)."
  },
  {
   "address": 39296,
   "type": "line",
   "text": "Map row 19 ($9980-$99FF). Level 1: the door half $F2 at $9986. Level 2: hall. Level 3: a staircase $B0 $B1 at $99D7-$99D8 on the rooms' east side; stepping onto $99D8 moves you to $99F8 on level 4. Level 4: its twin $B2 $B3 at $99F7-$99F8 ($99F7 leads back to $99D7); a bat (entry $36) starts at $99FA."
  },
  {
   "address": 39424,
   "type": "line",
   "text": "Map row 20 ($9A00-$9A7F). Level 1: rooms; a skeleton (entry $2B) starts at $9A03 and a snake (entry $3B) at $9A06. Level 2: hall. Level 3: the north wall of a hall (rows 20-27) with three small yellow marks on it, the code $60 at $9A44, $9A48 and $9A52 (a wall cell whose mark, colour $0F, also blocks sight). Level 4: caves."
  },
  {
   "address": 39552,
   "type": "line",
   "text": "Map row 21 ($9A80-$9AFF). Level 1: a potion (entry $0E) lies at $9A88; a closed door $F0 at $9A8D over its partner $F2 at $9B0D. Level 2: hall. Level 3: the hall. Level 4: caves."
  },
  {
   "address": 39680,
   "type": "line",
   "text": "Map row 22 ($9B00-$9B7F). Level 1: the door half $F2 at $9B0D in the north wall of a long room (columns 5-21, rows 22-24). Level 2: hall; a hellhound (entry $2D) starts at $9B30. Level 3: the hall, with the top of its pool ($51 $53) at $9B51-$9B52. Level 4: the southern end of the caves; a potion (entry $0B) lies at $9B7B."
  },
  {
   "address": 39808,
   "type": "line",
   "text": "Map row 23 ($9B80-$9BFF). Level 1: the long room's floor and a $7F cell at $9B9F (column 31 holds $7F in rows 23-26). Level 2: the rim of the large pool ($52 $52 at $9BAA-$9BAB). Level 3: the hall's pool ($61 rim, $50 water, $53 rim at $9BD0-$9BD3); an orc (entry $21) starts at $9BC8. Level 4: the last cave cells (a bat, entry $35, starts at $9BF9) and a $7F cell at $9BFF."
  },
  {
   "address": 39936,
   "type": "line",
   "text": "Map row 24 ($9C00-$9C7F). Level 1: a closed door $F0 at $9C0D in the long room's south wall, over its partner $F6 at $9C8D, and at the room's east end the staircase $B0 $B1 at $9C14-$9C15: stepping onto $9C15 moves you to $9C35 on level 2. Level 2: the large pool (water $50 at $9C2A-$9C2B), a hellhound (entry $2E) at $9C2D, and the staircase $B2 $B3 at $9C34-$9C35 ($9C34 leads back to $9C14). Level 3: the hall's pool ($9C50-$9C53). Level 4: two cave cells, the southern tip."
  },
  {
   "address": 40064,
   "type": "line",
   "text": "Map row 25 ($9C80-$9CFF). Level 1: the door half $F6 at $9C8D; rooms to column 13. Level 2: the large pool, water at $9CA9-$9CAC between rim cells. Level 3: the bottom of the hall's pool ($71 $73 at $9CD1-$9CD2). Level 4: rock."
  },
  {
   "address": 40192,
   "type": "line",
   "text": "Map row 26 ($9D00-$9D7F). Level 1: rooms, and two dead-end stubs at columns 18 and 21 ($88) off the corridor of row 27. Level 2: the large pool at its widest, water $50 at $9D28-$9D2D with rim cells $61 and $63 either side. Level 3: the hall. Level 4: rock."
  },
  {
   "address": 40320,
   "type": "line",
   "text": "Map row 27 ($9D80-$9DFF). Level 1: the south wall of a room (columns 1-12) and a corridor along columns 13-21. Level 2: the large pool ($71 rim, water $50 at $9DA9-$9DAD, $63 rim). Level 3: the hall's south wall. Level 4: rock."
  },
  {
   "address": 40448,
   "type": "line",
   "text": "Map row 28 ($9E00-$9E7F). Level 1: a corridor along columns 1-13 and four dead-end stubs ($88) at columns 18-21 above the corridor of row 29. Level 2: the bottom of the large pool ($72 $72 $71 $50 $73 at $9E29-$9E2D). Level 3: rock beside the column-64 strip. Level 4: rock."
  },
  {
   "address": 40576,
   "type": "line",
   "text": "Map row 29 ($9E80-$9EFF). Level 1: two corridors, columns 1-12 (closed at its east end, $85) and 13-21. Level 2: hall. Level 3: rock. Level 4: rock."
  },
  {
   "address": 40704,
   "type": "line",
   "text": "Map row 30 ($9F00-$9F7F). Level 1: the southernmost corridor, columns 0-13 (corners $B4 and $B7). Level 2: the hall's last floor row; a scroll (entry $1A) lies at $9F25. Level 3: rock. Level 4: rock."
  },
  {
   "address": 40832,
   "type": "line",
   "text": "Map row 31 ($9F80-$9FFF), the last. Level 1: rock (with the walled-in floor cell of column 0). Level 2: the hall's south wall. Level 3: rock. Level 4: rock, ending in the four bytes 5A 4F 4F 4D at $9FFC-$9FFF: glyph $4F draws a 2, the others a blank and a border piece; sealed in rock and never in sight, by their look a leftover mark from making the map."
  },
  {
   "address": 40960,
   "type": "line",
   "text": "Exits for door-opening creatures: one byte per character code ($00-$FF), indexed by the tile a creature stands on; bit n set lets it step out in direction n, 0 north then clockwise (1 north-east, 2 east, 3 south-east, 4 south, 5 south-west, 6 west, 7 north-west; the bit masks are at $4960, the opposite directions at $49F9). Identical to tile_exits at $A100 except for the closed doors $F0, $F2, $F4, $F6, $F8, $FA, $FC and $FE, which here also allow the direction through the door (e.g. $F0: $D7 here, $C7 there; the extra bit is south). The creature mover $2566 reads this table instead of $A100 when the creature's flag $5001,y is set: $2581 writes $A0 into $25A7, the operand high byte of its LDA $A100,y, and $2589 writes $A1 back otherwise. When $A100 ($25C6) then refuses the chosen direction, the creature opens the door ($2600 calls $1BBF) and closes it behind it on its next move ($25F4 calls $1C85). Entries for codes $00-$50 and for the marker figures $C0-$EF are 0. The table sits in the top rows of the bottom band's bitmap page, which the screen never shows."
  },
  {
   "address": 41216,
   "type": "line",
   "text": "Exits for every other creature: the table the mover $2566 reads by default, and the one it always checks a chosen direction against ($25C6). One byte per character code, bit n = may step out of a cell holding that code in direction n (0 north, clockwise to 7 north-west); closed doors refuse the direction through the door. The player's own moves are checked another way: a collision of the player's sprite with wall, rock or door pixels in the view ($D01F collected into $038D) makes $0AD3-$0ADF call $0F95, which reverses the direction of travel ($0388/$0389). This first quarter, codes $00-$3F (the text characters; the map holds only the digit labels $31, $33, $34, sealed in rock), is all 0."
  },
  {
   "address": 41280,
   "type": "line",
   "text": "tile_exits for codes $40-$7F: 0 for the window-border pieces, the blank glyphs, open water $50, rock $7E and the unseen fill $7F; directions away from the water for the pool rim ($51 $E3, $52 $C7, $53 $8F, $71 $F8, $72 $7C, $73 $3E) and its fringe cells ($61 $1F, $63 $F1); $7C for the wall mark $60, like a north wall; $FF for the pedestal $70, open in every direction."
  },
  {
   "address": 41344,
   "type": "line",
   "text": "tile_exits for codes $80-$BF, the dungeon's building blocks: each entry allows every direction that does not cross a wall line drawn in the glyph, e.g. open floor $91 $FF, north wall $81 $7C, north-west corner $80 $1C, east-west corridor $83 $44, north-south corridor $84 $11, the dead ends $85-$88 one direction each, and the cave edges ($8D-$8F, $9D, $9F, $AD-$AF, $B8, $B9) the same way. The staircase halves that move you ($B1, $B2) allow only the way back ($40 west, $04 east), the halves you land on ($B0, $B3) east and west ($44); the drop $A3 is an east-west corridor ($44). $BA-$BF are unused, 0."
  },
  {
   "address": 41408,
   "type": "line",
   "text": "tile_exits for codes $C0-$FF: 0 for the marker figures $C0-$EF, which are never map tiles; then the doors, where an open door (odd code) allows the way through and a closed one (even) refuses it: $F0 $C7 (door in the south wall, south refused), $F2 $7C (north wall), $F4 $01 and $F6 $10 (the foot and the head of a north-south passage: only back along it), $F8 $F1 (east wall), $FA $1F (west wall), $FC $40 and $FE $04 (the two ends of an east-west passage); the odd codes equal the even ones' values in tile_exits_door_opener."
  },
  {
   "address": 41472,
   "type": "line",
   "text": "Low byte of each character code's glyph address in the top band's set, $3000 + 8 x code, for the line-of-sight test: $0C41 loads it, with the high byte from $A300 at $0C46, into the pointer $9D/$9E, so that ($9D),y reads pixel row y of the glyph of the tile the ray is crossing. The values run $00, $08 ... $F8 and repeat every 32 codes; this quarter covers codes $00-$3F, the text characters."
  },
  {
   "address": 41536,
   "type": "line",
   "text": "tile_glyph_lo for codes $40-$7F (window borders, pool, wall mark, rock and the unseen fill): the 32-entry run $00-$F8 twice, for glyphs $3200-$33FF."
  },
  {
   "address": 41600,
   "type": "line",
   "text": "tile_glyph_lo for codes $80-$BF (walls, corridors, cave edges, staircases, the drop): $00-$F8 twice, for glyphs $3400-$35FF."
  },
  {
   "address": 41664,
   "type": "line",
   "text": "tile_glyph_lo for codes $C0-$FF (marker figures and doors): $00-$F8 twice, for glyphs $3600-$37FF."
  },
  {
   "address": 41728,
   "type": "line",
   "text": "High byte of each character code's glyph address ($3000 + 8 x code), the partner of tile_glyph_lo, read into $9E by the line-of-sight test at $0C46. This quarter: $30 for codes $00-$1F and $31 for $20-$3F."
  },
  {
   "address": 41792,
   "type": "line",
   "text": "tile_glyph_hi for codes $40-$7F: $32 for $40-$5F, $33 for $60-$7F."
  },
  {
   "address": 41856,
   "type": "line",
   "text": "tile_glyph_hi for codes $80-$BF: $34 for $80-$9F, $35 for $A0-$BF."
  },
  {
   "address": 41920,
   "type": "line",
   "text": "tile_glyph_hi for codes $C0-$FF: $36 for $C0-$DF, $37 for $E0-$FF."
  },
  {
   "address": 41984,
   "type": "line",
   "text": "Colour-RAM value for each character code, used wherever a map tile is drawn or tested: the view window copy writes it to $D800 beside the screen code ($0F73); the line-of-sight test ($0C4F) treats a value of exactly $0F as making the tile's '11' pixel pairs opaque (in the map: the closed doors and the wall mark $60); and it colours each creature's or object's marker sprite in the view ($1089, glyph code from $4070,x). The top band is multicolour text ($D016 bit 4 set at $0A18), so values $08-$0F give a multicolour cell whose '11' pairs take colour value-8, '01' pairs being $D022 (dark grey, the floor) and '10' pairs $D023 (mid grey, the walls). This quarter, codes $00-$3F, is all $06 (hi-res blue), which only the digit labels in the map's rock use."
  },
  {
   "address": 42048,
   "type": "line",
   "text": "tile_colour for codes $40-$7E: $0E (multicolour, '11' blue) for the pool codes $50-$53, $71-$73 and the fringe cells $61, $63; $0F for the wall mark $60 (its yellow '11' dot opaque to sight) and the pedestal $70 (no '11' pixels, so no effect); $08 ('11' black) for rock $7E; $06 for the window-border pieces $40-$4F. Codes the map never holds carry leftovers: $A477-$A47D read as 6502 code (STA $D001, LDA #$00, STA $0810), by their look bytes left in memory when the table was made."
  },
  {
   "address": 42111,
   "type": "line",
   "text": "tile_colour of code $7F, the view window's unseen fill: $08, so its all-'11' glyph is black. The view scrollers read this entry directly when they fill a newly exposed row or column with $7F ($0DDA, $0E35, $0EB6, $0F28), as the window-drawing routine $0F58 reads it through the table for cells the rays did not reach."
  },
  {
   "address": 42112,
   "type": "line",
   "text": "tile_colour for codes $80-$BF. Most of these glyphs use only the floor and wall pairs, so only bit 3 (multicolour on) matters and the low bits vary freely; the cave edges ($8D-$8F, $9D, $9F, $AD-$AF, $B8, $B9) are $08, their '11' pairs being black rock, and the staircases' yellow steps are background pixels. Several entries carry high nibbles colour RAM ignores ($87 $E8, $8C $A9, $95 $2C, $99 $8D, $9C $A9, $A6 $A9, $AB $8D, $AC $28); none equals $0F, so none turns opaque by accident, and the two that are $0F ($A7, $B4) have no '11' pixels."
  },
  {
   "address": 42176,
   "type": "line",
   "text": "tile_colour for codes $C0-$FF. The marker figures $C0-$CC (objects) and $D0-$D9 (creatures) give their marker sprite's colour ($01 white, $07 yellow, $03 cyan, $00 black). Codes no marker or tile uses hold leftovers: $CD $15, $CF $ED, and $A4DB-$A4EF, which read as 6502 code (JMP $570A, JMP $5716, RTS, STA $C0E3, TAX, LDA #$01, STA $CF33,X, TXA, RTS, LDX #$00, LDA). Then the doors $F0-$FF: $0F for every closed door, so its yellow '11' leaf blocks sight; an open door's glyph has no '11' pixels, so its assorted value ($0F, $0C, $E8, $0B, $0A) shows nothing."
  },
  {
   "address": 42240,
   "type": "line",
   "text": "Sprite block $94 of VIC bank 2 ($8000 + $94 x 64): the word DEAD, 24 x 7 pixels in rows 0-6 ($A500-$A514), rows 7-20 empty. All eight bottom-band sprite pointers ($ABF8-$ABFF) are set to $94 by $0A66-$0A7C, so every band-2 sprite shows it. When a creature's picture is drawn in the picture strip ($1515) and its $4EC5 byte has bit 7 set (by its use, dead: $3AF7 stores $FF there when body strength runs out), a free sprite is enabled over that slot (position from $59D1/$59DD/$59E9) in light red ($0A), double width and height ($2858-$287D): the picture is labelled DEAD."
  },
  {
   "address": 42304,
   "type": "line",
   "text": "The random-number state the recorded demonstration was made with, first byte: the value of $0383 (the index $2B9E reads $E000,x with, stepped +1 per number) when CTRL+R on the title screen started the recording ($5BD6), put back before every replay when the title scroller ends ($5DF2), so the dungeon's random events repeat exactly: $F8."
  },
  {
   "address": 42305,
   "type": "line",
   "text": "Second byte of the demonstration's random state: $0384, the index $2B9E reads $E800,y with (stepped -3 per number), saved at $5BDC and restored at $5DF8: $18."
  },
  {
   "address": 42306,
   "type": "line",
   "text": "Where the demonstration's input pointer $03D4/$03D5 starts ($0A7E-$0A85 set it to $A542 for every game). The recorder and the player both step the pointer before they write or read, and the first recorded state can never equal the initial state 7 in $03D6, so this byte ($0F) is never used; the stream begins at $A543."
  },
  {
   "address": 42307,
   "type": "line",
   "text": "The recorded demonstration: joystick input as run-length bytes, written by the recorder ($17AD-$1887, when $03D3 = 1) and replayed into $0387-$0389 by $1888-$1946 (when $03D3 = 2), one step per call of the input routine $179D. Each byte: high nibble = stick bits (1 east, 2 west, 4 south, 8 north, 0 none; $F = fire, $E = end), low nibble = polls - 1. The recorder stores each fire press as $FA (fire for 11 polls) and records nothing while fire stays held. This recording holds 5,308 polls of play (moves through the dungeon and the menus, 46 fire presses) to $A767, then 151 idle bytes $0F (16 polls each); the end byte $EF at $A7FF is what the recorder writes over its last byte when the buffer runs out at the limit $A800 ($1864-$187B; the limit is tested at $17E6, $1867 and the player's $1912), so by the idle run before it the recording was left to fill the buffer. F ($C5 = $15) ends a recording early."
  },
  {
   "address": 43096,
   "type": "line",
   "text": "Colour-RAM image of screen rows 15-24 ($A858 stands for colour RAM $DA58, row 15 column 0): the new-game setup copies $A858-$A9FE there ($0AB8 calls $5CC5 with the descriptor at $57DD; $A9FF is not copied). Only columns 0-1 and 38-39 of rows 17-24 ($A8A8-$A9E7) are non-zero: the '11' colours of the two skull-and-snake pillars at the ends of the bottom band ($01, $02, $05, $08, $09, $0B, $0C, $0D, $0F). The zeros set rows 15-16 and the picture slots to black until $1515 writes a picture's colours. The block lies in rows 2-12 of the band-2 screen matrix page, rows the screen never shows."
  },
  {
   "address": 43648,
   "type": "line",
   "text": "Screen matrix of the bottom band, rows 16-24 (VIC bank 2; band 2's interrupt sets $D018 = $A8 at $27E0, so matrix $A800 and bitmap $A000): each byte gives a bitmap cell's '01' colour (high nibble) and '10' colour (low nibble), its '11' colour coming from colour RAM. Only these rows are shown, because band 2 begins at raster $B6, inside character row 16; the page's upper rows hold other data. Row 16 ($AA80-$AAA7) is 0, the black strip under the menu band. In rows 17-24, columns 0-1 and 38-39 hold the pillars' colours (loaded, never changed) and columns 2-37 are the twelve picture slots, six cells wide and four rows high, six across in rows 17-20 and six in rows 21-24: $1515 copies a picture's colours in (slot destinations $57FB/$5807) and they stay behind when the picture goes, since $14C3 clears only the bitmap. Picture 0, the player's, which is never drawn, names $AA80 as its matrix source."
  },
  {
   "address": 44024,
   "type": "line",
   "text": "Sprite pointers of the bottom band's screen matrix ($A800 + $3F8): the new-game loop at $0A66-$0A7C sets all eight to $94, sprite_dead_label at $A500 ($8000 + $94 x 64); 0 in the loaded image."
  },
  {
   "address": 44032,
   "type": "line",
   "text": "Colour-RAM image of the title picture, 40 x 25 cells ($AC00-$AFE7; the rest is 0). The title setup copies $AC00-$AFFE to $D800 once ($5B82 calls $5CC5 with the descriptor at $5E44; $AFFF is not copied). The picture is a multicolour bitmap in VIC bank 3, shown by the title interrupt's upper phase ($5D63-$5D96: bitmap mode, $D018 = $38, so bitmap $E000 and matrix $CC00); each byte here is a cell's '11' colour: yellow $07 and brown $09 for the logo lettering in rows 0-10, dark grey $0B and white $01 for the cave, red $02 and blue $06 for the figure at columns 8-10, rows 13-17. Rows 23-24 are 0: from raster $EE the interrupt switches to text mode in bank 0 (screen $0400, characters $3000) for the scroller in row 24, whose colour $5E1A writes as yellow."
  },
  {
   "address": 46080,
   "type": "line",
   "text": "Bitmap row 16 of the bottom band ($A000 + 16 x 320), all 0. Band 2 begins at raster $B6, a few lines into character row 16, so the rest of this row shows as the black strip between the menu band and the pictures. Picture 0, the player's, which is never drawn, names $B400 as its bitmap source."
  },
  {
   "address": 46400,
   "type": "line",
   "text": "Bitmap row 17 ($B540-$B67F), the top row of the picture strip. Columns 0-1 ($B540-$B54F) and 38-39 ($B670-$B67F): the upper half of the skull that tops each pillar, loaded and never changed (the two pillars show the same picture, encoded with different colour choices). Columns 2-37 ($B550-$B66F): the top pixel rows of the six upper picture slots, drawn by $1515 from a picture's bitmap (slot destinations $57E3/$57EF) and cleared by $14C3; empty in the loaded image."
  },
  {
   "address": 46720,
   "type": "line",
   "text": "Bitmap row 18 ($B680-$B7BF): the lower half of each skull (columns 0-1 and 38-39); columns 2-37 ($B690-$B7AF) the second character row of the upper picture slots."
  },
  {
   "address": 47040,
   "type": "line",
   "text": "Bitmap row 19 ($B7C0-$B8FF): the top of each pillar's wooden pole and the snake's first coil round it (columns 0-1 and 38-39); columns 2-37 ($B7D0-$B8EF) the third character row of the upper picture slots."
  },
  {
   "address": 47360,
   "type": "line",
   "text": "Bitmap row 20 ($B900-$BA3F): pole and snake coil on each pillar (columns 0-1 and 38-39); columns 2-37 ($B910-$BA2F) the bottom character row of the upper six picture slots."
  },
  {
   "address": 47680,
   "type": "line",
   "text": "Bitmap row 21 ($BA40-$BB7F): pole and snake on each pillar; columns 2-37 ($BA50-$BB6F) the top character row of the lower six picture slots (the odd-numbered slots; a picture eight rows high takes an upper slot and the lower one beneath it)."
  },
  {
   "address": 48000,
   "type": "line",
   "text": "Bitmap row 22 ($BB80-$BCBF): pole and snake on each pillar; columns 2-37 ($BB90-$BCAF) the second character row of the lower picture slots."
  },
  {
   "address": 48320,
   "type": "line",
   "text": "Bitmap row 23 ($BCC0-$BDFF): the foot of each pole with the snake's body; columns 2-37 ($BCD0-$BDEF) the third character row of the lower picture slots."
  },
  {
   "address": 48640,
   "type": "line",
   "text": "Bitmap row 24 ($BE00-$BF3F), the band's last: the snake's head with its open red mouth at the foot of each pillar (columns 0-1 and 38-39); columns 2-37 ($BE10-$BF2F) the bottom character row of the lower picture slots. The bitmap ends at $BF3F; $BF40-$BFFF is unused."
  },
  {
   "address": 49152,
   "type": "line",
   "text": "Music entry: start tune A (0 the main theme, 1 death, 2 won: the songs 1-3 of HVSC's Master_of_Magic.sid, 'Main Theme', 'Game Over (You're dead)' and 'Game beaten'). Jumps to music_start_tune ($CBC3). Called with A = 0 by the title ($5B8C), the start of every game ($0A94) and the M key ($0CBB); with A = 1 at the end of a game lost or of the demonstration ($086E) and with A = 2 at the end of a game won, $03C7 = $7B ($0861)."
  },
  {
   "address": 49155,
   "type": "line",
   "text": "Music entry: stop. Jumps to music_request_stop ($CBE1), which sets the state $C41D to $C0; the next music_play silences all three voices. Called by the M key ($0CB0), by title_leave ($5C13) and by music_next_note when a track reaches its $FE ($C087)."
  },
  {
   "address": 49158,
   "type": "line",
   "text": "Music entry: play one frame. Called once a frame through $1949, which on NTSC drops every sixth call to keep the PAL tempo: from title_irq's scroller half on the title, and in play from the menu band at raster $8E while $03D1 is on; also called straight after music_stop to silence at once. Counts frames in $C426, then acts on the state $C41D: $00 plays; $40 (set by music_start_tune) zeroes each voice's track position, pattern position, length counter and note, and the frame counter, sets $00 and plays; $C0 (set by music_stop) clears the three voices' control registers (waveform and gate off), sets the volume to 15 and the state to $80; $80 returns at once."
  },
  {
   "address": 49222,
   "type": "line",
   "text": "Plays the three voices, SID voice 3 first (X = 2, 1, 0; the voice's register offset from $C3EF into $C3F2). The tempo counter $C41A counts down and is reloaded from $C41B (1), and a tick, when notes move on, is the frame on which it equals $C41B: every second frame, 25 ticks a second on PAL. On a tick a voice whose length counter $C3F9 runs out (goes below 0) reads its next note (music_next_note); otherwise it goes through music_release and the effects. Between ticks only the effects (music_effects) run."
  },
  {
   "address": 49268,
   "type": "line",
   "text": "JMP $C328 that is never executed: it follows the JMP $C160 above and nothing jumps or branches to it."
  },
  {
   "address": 49274,
   "type": "line",
   "text": "A voice's next note, on the tick its length counter runs out. Reads the voice's track, through ($FB) = its address from $C4AF/$C4B2, at its track position $C3F3: $FF sends the track back to its start (track position, pattern position and length counter 0) and reads again; $FE stops the music (music_stop, then returns without playing the remaining voices this frame); any other value is the number of the pattern being played, 0-40, whose address comes from music_pattern_lo/hi ($C4C7/$C4F0) into ($FD)."
  },
  {
   "address": 49307,
   "type": "line",
   "text": "JMP $C328 that is never executed: it follows the JMP $C07A above and nothing jumps or branches to it."
  },
  {
   "address": 49310,
   "type": "line",
   "text": "Reads a note from the pattern at the voice's pattern position $C3F6. First byte (into $C3FC and $C409): bits 0-4 the length in ticks less 1 (into the length counter $C3F9: 1-32 ticks, 0.04-1.28 s on PAL); bit 5 no release at the end (tied into the next note); bit 6 a rest: the byte stands alone and the voice's instrument is rewritten with the gate off for that length; bit 7 an instrument number follows (into $C405). Then the note number (into $C402), 0-95 for C0-B7, whose frequency from music_freq_lo/hi goes to the voice's frequency registers and to $C421/$C41E. Also sets the master volume $D418 on every note read: $75 less voice 3's track position ($C3F5), at most 15, which fades tune 0 out as its voice 3 goes through positions $67-$75."
  },
  {
   "address": 49420,
   "type": "line",
   "text": "Writes the voice's instrument ($C405; 8 bytes each in music_instruments, $C427 + 8n) to the SID: the control byte ANDed with the gate mask $C408 ($FF, or $FE for a rest) to $D404 + voice offset and kept in $C3FF, the pulse width to $D402/$D403, attack/decay and sustain/release to $D405/$D406. Then steps past the note; if the next byte is $FF the pattern has ended: pattern position 0, track position + 1."
  },
  {
   "address": 49504,
   "type": "line",
   "text": "On a tick while a note sounds: in its last tick (length counter 0), unless bit 5 of the note's first byte is set, turns the gate off and sets attack/decay and sustain/release to 0, so the note dies at the fastest release rate before the next one starts."
  },
  {
   "address": 49535,
   "type": "line",
   "text": "Every frame, the effects of the voice's instrument: fx flags (instrument byte 7) into $C424, pulse speed (byte 6) into $C40E, vibrato depth (byte 5) into $C40D. Vibrato, when the depth is not 0: the frequency becomes the note's plus phase x (the next semitone's - the note's) / 2^(depth+1), the phase running 0, 1, 2, 3, 3, 2, 1, 0 with the frame counter $C426, a wobble upwards only; on notes of 4 ticks or fewer the phase is not added and the note's own frequency is written."
  },
  {
   "address": 49676,
   "type": "line",
   "text": "Pulse width effects. fx bit 3: the pulse speed is added to the instrument's pulse width low byte every frame and written to $D402 (there is no CLC, so a carry left from the vibrato can add one more). Otherwise, with a pulse speed other than 0, a sweep: every (speed AND $1F) + 1 frames (timer $C414 per voice) the 12-bit pulse width moves by speed AND $E0, up until its high nibble reaches $E, then down until it reaches 8 (direction $C417 per voice); the value goes to $D402/$D403 and back into the instrument, which keeps it for the next time it plays."
  },
  {
   "address": 49807,
   "type": "line",
   "text": "fx bit 0, the drum: while the frequency high byte $C41E and the length counter are both non-zero, in the note's first tick the waveform is noise with the gate off ($80); after that the frequency high byte drops by one every frame, with the instrument's own waveform and the gate off. Instruments 4, 7, 14 and 16 also have the octave arpeggio, which rewrites the frequency after this every frame, so only instrument 11's pitch actually falls."
  },
  {
   "address": 49867,
   "type": "line",
   "text": "fx bit 1, a fall at the end of long notes: on notes of 17 ticks or more, while the length counter is below 18, on every odd frame (frame counter $C426) the frequency high byte $C41E is written to the SID and lowered by one, until it is 0. Only instrument 12 has it (pattern 20, tune 0); its vibrato writes the note's own frequency every frame first, so the voice alternates frame by frame between the note and the falling pitch."
  },
  {
   "address": 49911,
   "type": "line",
   "text": "fx bit 2, an octave arpeggio: on 7 frames out of 8 (frame counter AND 7 not 0) the voice plays the note an octave up (note + 12), on the eighth the note itself. Pattern 34 plays note 91 (G7) with instrument 16, and note 103 lies past the 96-entry table: its frequency is read from the driver's variables at $C3FD/$C3FE."
  },
  {
   "address": 49960,
   "type": "line",
   "text": "Next voice (X down to 0), then returns to the caller of music_play."
  },
  {
   "address": 49967,
   "type": "line",
   "text": "Note frequency table: 96 notes from C0 (note 0) to B7 (note 95), two bytes each, low byte first; the driver reads note n's low byte at $C32F + 2n. Tuned for PAL (985,248 Hz): A4, note 57, is $1D46 = 440.1 Hz, and notes 0-94 lie within 3.2 cents of equal temperament; an NTSC machine plays them about 65 cents (two thirds of a semitone) sharp. This byte: the low byte of C0 ($0116, 16.3 Hz)."
  },
  {
   "address": 49968,
   "type": "line",
   "text": "High byte of note 0, C0; the driver reads note n's high byte at $C330 + 2n (note start and octave effect)."
  },
  {
   "address": 49969,
   "type": "line",
   "text": "Low byte of note 1, C#0; the vibrato reads $C331 + 2n, the low byte of the semitone above the note playing."
  },
  {
   "address": 49970,
   "type": "line",
   "text": "High byte of note 1, C#0 ($0127); the vibrato reads $C332 + 2n, the high byte of the semitone above the note playing."
  },
  {
   "address": 49971,
   "type": "line",
   "text": "Frequency table, notes 2-11: D0 ($0138, 18.3 Hz on PAL) to B0 ($020E, 30.9 Hz), low byte first. Octave 0 is never played: the patterns use notes 17 (F1) to 93 (A7)."
  },
  {
   "address": 49991,
   "type": "line",
   "text": "Frequency table, octave 1: notes 12-23, C1 ($022D, 32.7 Hz on PAL) to B1 ($041B, 61.7 Hz), low byte first."
  },
  {
   "address": 50015,
   "type": "line",
   "text": "Frequency table, octave 2: notes 24-35, C2 ($045A, 65.4 Hz on PAL) to B2 ($0837, 123.5 Hz), low byte first."
  },
  {
   "address": 50039,
   "type": "line",
   "text": "Frequency table, octave 3: notes 36-47, C3 ($08B4, 130.8 Hz on PAL) to B3 ($106E, 247.0 Hz), low byte first."
  },
  {
   "address": 50063,
   "type": "line",
   "text": "Frequency table, octave 4: notes 48-59, C4 ($1168, 261.7 Hz on PAL) to B4 ($20DC, 494.0 Hz), low byte first. A4, note 57, is $1D46 = 440.1 Hz, the pitch the table is built on."
  },
  {
   "address": 50087,
   "type": "line",
   "text": "Frequency table, octave 5: notes 60-71, C5 ($22D0, 523.4 Hz on PAL) to B5 ($41B8, 988.0 Hz), low byte first."
  },
  {
   "address": 50111,
   "type": "line",
   "text": "Frequency table, octave 6: notes 72-83, C6 ($45A0, 1046.7 Hz on PAL) to B6 ($8370, 1976.0 Hz), low byte first."
  },
  {
   "address": 50135,
   "type": "line",
   "text": "Frequency table, octave 7: notes 84-95, C7 ($8B40, 2093.4 Hz on PAL) to A#7 ($F820, 3730.2 Hz), low byte first, and a last entry, note 95 = $FD2E, that is 3,806 Hz on PAL, 65 cents flat of B7 (a PAL B7 would need 67,280, more than 16 bits hold) and B7 exactly at the NTSC clock. The highest note the patterns play is 93, A7 (tune 0, pattern 32)."
  },
  {
   "address": 50159,
   "type": "line",
   "text": "SID register offset of each voice, indexed by X: 0, 7, 14 ($D400, $D407, $D40E: voices 1, 2, 3)."
  },
  {
   "address": 50162,
   "type": "line",
   "text": "Register offset of the voice being played (copied from music_voice_reg), the Y for its SID writes."
  },
  {
   "address": 50163,
   "type": "line",
   "text": "Track position of each voice (3 bytes, X = 0-2 for SID voices 1-3): the index in the voice's track of the pattern being played; + 1 as soon as a pattern's last note has been read (the $FF behind it seen), 0 at a tune start and when the track loops."
  },
  {
   "address": 50165,
   "type": "line",
   "text": "Track position of SID voice 3, the third byte of music_track_pos. music_read_note sets the volume from it, $75 less the position and at most 15, which fades tune 0 out as its voice 3 goes from position $67 to $75: volume 14 from 4:28.5 on PAL, 1 from 5:20.0, 0 from 5:21.9 (HVSC gives the song 5:21), then back to 15 at 5:23.9 over the closing rests (timings from running the driver in a 6502 simulator)."
  },
  {
   "address": 50166,
   "type": "line",
   "text": "Pattern position of each voice (3 bytes): offset of the next byte to read in the pattern being played; 0 when a pattern ends."
  },
  {
   "address": 50169,
   "type": "line",
   "text": "Length counter of each voice (3 bytes): ticks left of the note sounding, from bits 0-4 of its first byte, counted down each tick; below 0 the next note is read."
  },
  {
   "address": 50172,
   "type": "line",
   "text": "First byte of the note sounding on each voice (3 bytes): bits 0-4 length, bit 5 tie, bit 6 rest, bit 7 instrument given; read again by the release, vibrato, drum and slide."
  },
  {
   "address": 50175,
   "type": "line",
   "text": "Control byte (waveform and gate) last written to each voice from its instrument (3 bytes); the release and the drum write it back with the gate bit cleared."
  },
  {
   "address": 50178,
   "type": "line",
   "text": "Note number (0-95) sounding on each voice (3 bytes); the vibrato and the octave effect look up its frequency again every frame."
  },
  {
   "address": 50181,
   "type": "line",
   "text": "Instrument number (0-16) of each voice (3 bytes), set by a note with bit 7 and kept until the next; a tune start does not reset it, and every voice's first note in the three tunes sets one."
  },
  {
   "address": 50184,
   "type": "line",
   "text": "Gate mask ANDed into the instrument's control byte when it is written: $FF for a note, $FE (gate off) for a rest."
  },
  {
   "address": 50185,
   "type": "line",
   "text": "Working copy of the first byte of the note being read, tested for bit 6 (rest) and bit 7 (instrument follows)."
  },
  {
   "address": 50186,
   "type": "line",
   "text": "Working copy of the low byte of a frequency being written (note start and octave effect)."
  },
  {
   "address": 50187,
   "type": "line",
   "text": "Saves the voice index X while X indexes the instrument table or holds the register offset; music_start_tune uses it as scratch for 2 x the tune number."
  },
  {
   "address": 50188,
   "type": "line",
   "text": "Working copy of the instrument's control byte, stored to music_control after the SID write."
  },
  {
   "address": 50189,
   "type": "line",
   "text": "Vibrato depth of the voice's instrument (byte 5), used as a shift count: the step is a semitone / 2^(depth+1); counted down by the shift loop."
  },
  {
   "address": 50190,
   "type": "line",
   "text": "Pulse speed of the voice's instrument (byte 6): with fx bit 3 the amount added to the pulse low byte each frame; otherwise bits 0-4 the sweep period in frames less 1 and bits 5-7 the step."
  },
  {
   "address": 50191,
   "type": "line",
   "text": "Vibrato step, low byte: the next semitone's frequency less the note's, shifted right depth + 1 times."
  },
  {
   "address": 50192,
   "type": "line",
   "text": "Vibrato step, high byte."
  },
  {
   "address": 50193,
   "type": "line",
   "text": "Frequency built by the vibrato, low byte: the note's plus phase x step."
  },
  {
   "address": 50194,
   "type": "line",
   "text": "Frequency built by the vibrato, high byte."
  },
  {
   "address": 50195,
   "type": "line",
   "text": "Vibrato phase for this frame, 0-3: the frame counter AND 7, folded (4-7 become 3-0)."
  },
  {
   "address": 50196,
   "type": "line",
   "text": "Pulse sweep timer of each voice (3 bytes): counts frames down; below 0 it is reloaded with the pulse speed AND $1F and the pulse width takes a step."
  },
  {
   "address": 50199,
   "type": "line",
   "text": "Pulse sweep direction of each voice (3 bytes): 0 up, 1 down; turns when the pulse width's high nibble reaches $E going up or 8 going down."
  },
  {
   "address": 50202,
   "type": "line",
   "text": "Tempo counter: counts down every frame, reloaded from music_speed below 0; the frame on which it equals music_speed is a tick, when notes move on."
  },
  {
   "address": 50203,
   "type": "line",
   "text": "Tempo, frames per tick less 1. Never written: always 1, a tick every second frame (25 a second on PAL) in all three tunes."
  },
  {
   "address": 50204,
   "type": "line",
   "text": "Offset of the voice's instrument in music_instruments (instrument x 8), for the effects."
  },
  {
   "address": 50205,
   "type": "line",
   "text": "Driver state: $00 playing; $40 a tune has just been started (music_play resets the voices); $C0 stop requested (music_play silences the SID); $80 stopped (music_play does nothing)."
  },
  {
   "address": 50206,
   "type": "line",
   "text": "Frequency high byte each voice's note started on (3 bytes); the drum and the slide count it down and write it to the SID."
  },
  {
   "address": 50209,
   "type": "line",
   "text": "Frequency low byte each voice's note started on (3 bytes); written by music_read_note, never read."
  },
  {
   "address": 50212,
   "type": "line",
   "text": "fx flags of the voice's instrument (byte 7): bit 0 drum, bit 1 slide, bit 2 octave, bit 3 pulse low-byte add."
  },
  {
   "address": 50213,
   "type": "line",
   "text": "Pulse sweep step for this frame: the pulse speed AND $E0."
  },
  {
   "address": 50214,
   "type": "line",
   "text": "Frame counter, + 1 on every music_play call, stopped or not, and 0 at a tune start; paces the vibrato (AND 7), the slide (bit 0) and the octave effect (AND 7)."
  },
  {
   "address": 50215,
   "type": "line",
   "text": "Instrument table: 17 instruments of 8 bytes, instrument n at $C427 + 8n: 0 pulse width low, 1 pulse width high, 2 control (waveform and gate), 3 attack/decay, 4 sustain/release, 5 vibrato depth, 6 pulse speed, 7 fx flags. The pulse bytes of instruments 3, 10, 12 and 13 change as they play (sweeps are written back). This byte: instrument 0's pulse width low, $00."
  },
  {
   "address": 50216,
   "type": "line",
   "text": "Instrument byte 1, pulse width high (read at $C428 + 8n); instrument 0: $02, a pulse width of $0200 (12.5 %)."
  },
  {
   "address": 50217,
   "type": "line",
   "text": "Instrument byte 2, the control register: waveform and gate; instrument 0: $41, pulse with the gate on."
  },
  {
   "address": 50218,
   "type": "line",
   "text": "Instrument byte 3, attack/decay; instrument 0: $49 (attack 4, decay 9)."
  },
  {
   "address": 50219,
   "type": "line",
   "text": "Instrument byte 4, sustain/release; instrument 0: $6C (sustain 6, release 12)."
  },
  {
   "address": 50220,
   "type": "line",
   "text": "Instrument byte 5, vibrato depth (0 none); instrument 0: 2, steps of an eighth of a semitone."
  },
  {
   "address": 50221,
   "type": "line",
   "text": "Instrument byte 6, pulse speed; instrument 0: 0, no pulse effect."
  },
  {
   "address": 50222,
   "type": "line",
   "text": "Instrument byte 7, fx flags (bit 0 drum, 1 slide, 2 octave arpeggio, 3 pulse low-byte add); instrument 0: 0. Instrument 0 plays the held G3 of pattern 29 (tune 0, voice 1)."
  },
  {
   "address": 50223,
   "type": "line",
   "text": "Instrument 1: pulse width $07A0, pulse ($41), attack/decay $59, sustain/release $6C, vibrato depth 2; plays in patterns 10, 13, 19, 36 (tunes 0, 1)."
  },
  {
   "address": 50231,
   "type": "line",
   "text": "Instrument 2: pulse width $0100, pulse ($41), attack/decay $78, sustain/release $8C, vibrato depth 3; never selected by any pattern."
  },
  {
   "address": 50239,
   "type": "line",
   "text": "Instrument 3: pulse width $0100 (pulse width as loaded; it changes as the instrument plays), pulse ($41), attack/decay $0B, sustain/release $00, pulse low byte + 16 a frame; plays in patterns 4, 7, 8, 14, 16, 23, 24, 25, 26, 27, 28, 33, 36 (tunes 0, 2)."
  },
  {
   "address": 50247,
   "type": "line",
   "text": "Instrument 4: pulse width $0100, noise ($81), attack/decay $0A, sustain/release $09, drum, octave arpeggio; plays in patterns 4, 7, 8, 14, 16, 32, 38 (tunes 0, 1, 2)."
  },
  {
   "address": 50255,
   "type": "line",
   "text": "Instrument 5: pulse width $0100, pulse ($41), attack/decay $79, sustain/release $C0, vibrato depth 2; plays in patterns 5, 10, 17 (tune 0)."
  },
  {
   "address": 50263,
   "type": "line",
   "text": "Instrument 6: pulse width $0800, pulse ($41), attack/decay $09, sustain/release $30, vibrato depth 2, octave arpeggio; plays in patterns 6, 12, 13, 15, 18, 19 (tunes 0, 1)."
  },
  {
   "address": 50271,
   "type": "line",
   "text": "Instrument 7: pulse width $0800, triangle ($11), attack/decay $0F, sustain/release $0F, drum, octave arpeggio; plays in patterns 2, 3, 9, 19, 22, 31, 34, 36, 39, 40 (tunes 0, 1, 2)."
  },
  {
   "address": 50279,
   "type": "line",
   "text": "Instrument 8: pulse width $0800, triangle ($11), attack/decay $0B, sustain/release $00, octave arpeggio; plays in patterns 9, 23, 24, 31 (tunes 0, 2)."
  },
  {
   "address": 50287,
   "type": "line",
   "text": "Instrument 9: pulse width $0800, triangle ($11), attack/decay $0A, sustain/release $A0, vibrato depth 2; plays in patterns 10, 17, 32, 33 (tune 0)."
  },
  {
   "address": 50295,
   "type": "line",
   "text": "Instrument 10: pulse width $0800 (pulse width as loaded; it changes as the instrument plays), pulse ($41), attack/decay $78, sustain/release $50, vibrato depth 2, pulse sweep of 64 every 2 frames; plays in patterns 1, 2, 3, 10, 11, 18, 30 (tune 0)."
  },
  {
   "address": 50303,
   "type": "line",
   "text": "Instrument 11: pulse width $0200, pulse ($41), attack/decay $08, sustain/release $06, drum; plays in patterns 37, 38 (tune 1)."
  },
  {
   "address": 50311,
   "type": "line",
   "text": "Instrument 12: pulse width $0400 (pulse width as loaded; it changes as the instrument plays), pulse ($41), attack/decay $0C, sustain/release $20, vibrato depth 1, slide, pulse low byte + 121 a frame; plays in pattern 20 (tune 0)."
  },
  {
   "address": 50319,
   "type": "line",
   "text": "Instrument 13: pulse width $0900 (pulse width as loaded; it changes as the instrument plays), pulse ($41), attack/decay $0F, sustain/release $F0, pulse sweep of 64 every 2 frames; plays in patterns 21, 36 (tune 0)."
  },
  {
   "address": 50327,
   "type": "line",
   "text": "Instrument 14: pulse width $0800, triangle with ring modulation ($15), attack/decay $0A, sustain/release $09, drum, octave arpeggio; plays in patterns 22, 35 (tunes 0, 1, 2)."
  },
  {
   "address": 50335,
   "type": "line",
   "text": "Instrument 15: pulse width $0800, pulse ($41), attack/decay $03, sustain/release $50, octave arpeggio; plays in patterns 25, 26 (tune 0)."
  },
  {
   "address": 50343,
   "type": "line",
   "text": "Instrument 16: pulse width $0800, triangle with ring modulation ($15), attack/decay $05, sustain/release $0A, drum, octave arpeggio; plays in pattern 34 (tune 0)."
  },
  {
   "address": 50351,
   "type": "line",
   "text": "Low bytes of the three track addresses of the tune playing (voices 1-3), copied from music_tunes by music_start_tune; the snapshot holds tune 0's, $C519, $C561 and $C611."
  },
  {
   "address": 50354,
   "type": "line",
   "text": "High bytes of the three track addresses of the tune playing (voices 1-3)."
  },
  {
   "address": 50357,
   "type": "line",
   "text": "Tune table, 6 bytes a tune (the three track addresses, lows then highs, voices 1-3), read by music_start_tune at $C4B5 + 6A. This entry: tune 0, the main theme (HVSC song 1, 'Main Theme'), tracks $C519, $C561 and $C611."
  },
  {
   "address": 50363,
   "type": "line",
   "text": "Tune table entry for tune 1, death (HVSC song 2, 'Game Over (You're dead)'): tracks $C68E, $C693 and $C695."
  },
  {
   "address": 50369,
   "type": "line",
   "text": "Tune table entry for tune 2, won (HVSC song 3, 'Game beaten'): tracks $C699, $C6A5 and $C6B2."
  },
  {
   "address": 50375,
   "type": "line",
   "text": "Pattern address table, low bytes of patterns 0-40 (a split table: the 41 high bytes follow at $C4F0); music_next_note looks up the pattern number from the track here."
  },
  {
   "address": 50416,
   "type": "line",
   "text": "Pattern address table, high bytes of patterns 0-40."
  },
  {
   "address": 50457,
   "type": "line",
   "text": "Track of tune 0, the main theme, SID voice 1: 71 pattern numbers (0 x4, 27, 29 x2, 5, 6, 5, 6, 5, 10, 11 x2, 12 x2, 13, 15, 17 x2, 18 x2, 19, 20 x4, 23, 25, 27, 29 x3, 1, 2 x2, 3, 30 x2, 32, 5, 6, 5, 10, 19, 18 x2, 15, 17 x2, 20 x4, 0 x16), then $FF: back to the start. One pass is 8400 ticks, 5:36.0 on PAL."
  },
  {
   "address": 50481,
   "type": "line",
   "text": "Tune 0, SID voice 1, track positions 24-33 from 1:49.4 on PAL (tick 2736, where all three voices change together): patterns 20 x4, 23, 25, 27, 29 x3."
  },
  {
   "address": 50491,
   "type": "line",
   "text": "Tune 0, SID voice 1, track positions 34-54 from 3:02.4 on PAL (tick 4560, where all three voices change together): patterns 1, 2 x2, 3, 30 x2, 32, 5, 6, 5, 10, 19, 18 x2, 15, 17 x2, 20 x4."
  },
  {
   "address": 50512,
   "type": "line",
   "text": "Tune 0, SID voice 1, track positions 55-70 from 5:05.3 on PAL (tick 7632, the ending): patterns 0 x16 then $FF, back to the start. Voice 1 is silent from here."
  },
  {
   "address": 50529,
   "type": "line",
   "text": "Track of tune 0, the main theme, SID voice 2: 175 pattern numbers (9 x8, 22 x4, 9 x2, 34 x2, 9 x2, 34 x2, 9 x10, 34 x2, 9 x7, 34 x2, 9 x2, 34 x2, 9 x12, 22 x16, 9 x5, 22, 9 x5, 22, 9 x4, 22 x6, 9 x4, 31 x4, 9 x6, 22 x2, 9 x4, 31 x4, 22 x4, 31 x8, 9, 22, 9, 22, 9 x8, 22 x16, 35 x8, 0 x8), then $FF: back to the start. One pass is 8400 ticks, 5:36.0 on PAL."
  },
  {
   "address": 50586,
   "type": "line",
   "text": "Tune 0, SID voice 2, track positions 57-94 from 1:49.4 on PAL (tick 2736, where all three voices change together): patterns 22 x16, 9 x5, 22, 9 x5, 22, 9 x4, 22 x6."
  },
  {
   "address": 50624,
   "type": "line",
   "text": "Tune 0, SID voice 2, track positions 95-158 from 3:02.4 on PAL (tick 4560, where all three voices change together): patterns 9 x4, 31 x4, 9 x6, 22 x2, 9 x4, 31 x4, 22 x4, 31 x8, 9, 22, 9, 22, 9 x8, 22 x16."
  },
  {
   "address": 50688,
   "type": "line",
   "text": "Tune 0, SID voice 2, track positions 159-174 from 5:05.3 on PAL (tick 7632, the ending): patterns 35 x8, 0 x8 then $FF, back to the start. The last voice to fall silent, at 5:20.6."
  },
  {
   "address": 50705,
   "type": "line",
   "text": "Track of tune 0, the main theme, SID voice 3: 124 pattern numbers (0 x4, 28, 7 x4, 4 x2, 7 x2, 4 x2, 7 x2, 4 x2, 7 x2, 8 x4, 7 x2, 4 x2, 14, 16 x2, 4 x2, 7 x2, 4 x2, 7 x2, 8 x8, 7 x4, 21 x2, 24, 26, 28, 7 x6, 4 x2, 7 x2, 8 x2, 14 x2, 33, 4 x2, 7 x2, 4 x2, 7 x2, 8 x4, 7 x4, 8 x8, 16 x2, 4 x2, 7 x2, 4 x2, 7 x2, 21 x2, 36 x2, 0 x14), then $FF: back to the start. One pass is 8400 ticks, 5:36.0 on PAL."
  },
  {
   "address": 50757,
   "type": "line",
   "text": "Tune 0, SID voice 3, track positions 52-62 from 1:49.4 on PAL (tick 2736, where all three voices change together): patterns 21 x2, 24, 26, 28, 7 x6."
  },
  {
   "address": 50768,
   "type": "line",
   "text": "Tune 0, SID voice 3, track positions 63-107 from 3:02.4 on PAL (tick 4560, where all three voices change together): patterns 4 x2, 7 x2, 8 x2, 14 x2, 33, 4 x2, 7 x2, 4 x2, 7 x2, 8 x4, 7 x4, 8 x8, 16 x2, 4 x2, 7 x2, 4 x2, 7 x2, 21 x2."
  },
  {
   "address": 50813,
   "type": "line",
   "text": "Tune 0, SID voice 3, track positions 108-123 from 5:05.3 on PAL (tick 7632, the ending): patterns 36 x2, 0 x14 then $FF, back to the start. Voice 3 falls silent at 5:09.1; its track position drives the fade: volume 14 once it reaches 103 (4:28.5), 0 at 117 (5:21.9)."
  },
  {
   "address": 50830,
   "type": "line",
   "text": "Track of tune 1, death, SID voice 1: 4 pattern numbers (38, 37, 0 x2), then $FE: the music stops. One pass is 288 ticks, 11.52 s on PAL."
  },
  {
   "address": 50835,
   "type": "line",
   "text": "Track of tune 1, death, SID voice 2: 1 pattern number (35), then $FF: back to the start. One pass is 48 ticks, 1.92 s on PAL. It repeats until voice 1 or 3 reaches its $FE."
  },
  {
   "address": 50837,
   "type": "line",
   "text": "Track of tune 1, death, SID voice 3: 3 pattern numbers (19, 36, 0), then $FE: the music stops. One pass is 288 ticks, 11.52 s on PAL."
  },
  {
   "address": 50841,
   "type": "line",
   "text": "Track of tune 2, won, SID voice 1: 11 pattern numbers (39, 40, 0, 3, 0, 2 x2, 0 x2, 36 x2), then $FE: the music stops. One pass is 576 ticks, 23.04 s on PAL."
  },
  {
   "address": 50853,
   "type": "line",
   "text": "Track of tune 2, won, SID voice 2: 12 pattern numbers (9 x2, 35, 31 x2, 35, 9 x2, 35 x3, 0), then $FE: the music stops. One pass is 576 ticks, 23.04 s on PAL."
  },
  {
   "address": 50866,
   "type": "line",
   "text": "Track of tune 2, won, SID voice 3: 12 pattern numbers (4 x2, 36, 8 x2, 36, 7 x2, 36 x4), then $FE: the music stops. One pass is 576 ticks, 23.04 s on PAL."
  },
  {
   "address": 50879,
   "type": "line",
   "text": "Pattern 0 ($C6BF-$C6C1, 3 bytes with the closing $FF): notes with their length in ticks: rest 32; rest 16; 48 ticks, 1.92 s on PAL; no instrument of its own (the voice's last one). Played by tune 0 voice 1 x20; tune 0 voice 2 x8; tune 0 voice 3 x18; tune 1 voice 1 x2; tune 1 voice 3; tune 2 voice 1 x4; tune 2 voice 2. Silence: the opening and closing bars of tune 0 and the ends of tunes 1 and 2."
  },
  {
   "address": 50882,
   "type": "line",
   "text": "Pattern 39 ($C6C2-$C6C5, 4 bytes with the closing $FF): notes with their length in ticks: [instrument 7] C6 4; 4 ticks, 0.16 s on PAL; instrument 7. Played by tune 2 voice 1. Followed by pattern 40 it is pattern 1 with instrument 7 in place of 10."
  },
  {
   "address": 50886,
   "type": "line",
   "text": "Pattern 1 ($C6C6-$C6F7, 50 bytes with the closing $FF): 24 notes, notes G4 to C6; 96 ticks, 3.84 s on PAL; instrument 10. Played by tune 0 voice 1."
  },
  {
   "address": 50889,
   "type": "line",
   "text": "Pattern 40 ($C6C9-$C6F7, 47 bytes with the closing $FF): 23 notes, notes G4 to A#5; 92 ticks, 3.68 s on PAL; no instrument of its own (the voice's last one). Played by tune 2 voice 1. Starts 3 bytes into pattern 1, whose data it shares to the $FF at $C6F7: pattern 1 without its first note."
  },
  {
   "address": 50936,
   "type": "line",
   "text": "Pattern 2 ($C6F8-$C710, 25 bytes with the closing $FF): 12 notes, notes D5 to D6; 48 ticks, 1.92 s on PAL; no instrument of its own (the voice's last one). Played by tune 0 voice 1 x2; tune 2 voice 1 x2."
  },
  {
   "address": 50961,
   "type": "line",
   "text": "Pattern 30 ($C711-$C729, 25 bytes with the closing $FF): 12 notes, notes A#4 to A#5; 48 ticks, 1.92 s on PAL; no instrument of its own (the voice's last one). Played by tune 0 voice 1 x2."
  },
  {
   "address": 50986,
   "type": "line",
   "text": "Pattern 3 ($C72A-$C75A, 49 bytes with the closing $FF): 24 notes, notes A#4 to D#6; 96 ticks, 3.84 s on PAL; no instrument of its own (the voice's last one). Played by tune 0 voice 1; tune 2 voice 1."
  },
  {
   "address": 51035,
   "type": "line",
   "text": "Pattern 38 ($C75B-$C761, 7 bytes with the closing $FF): notes with their length in ticks: [instrument 4] E3 8; [instrument 11] G7 4; 12 ticks, 0.48 s on PAL; instruments 4, 11. Played by tune 1 voice 1. Followed by pattern 37 it is pattern 32 with instrument 11 in place of 9."
  },
  {
   "address": 51042,
   "type": "line",
   "text": "Pattern 32 ($C762-$C7C2, 97 bytes with the closing $FF): 47 notes, notes E3 to A7; 192 ticks, 7.68 s on PAL; instruments 4, 9. Played by tune 0 voice 1."
  },
  {
   "address": 51048,
   "type": "line",
   "text": "Pattern 37 ($C768-$C7C2, 91 bytes with the closing $FF): 45 notes, notes G4 to A7; 180 ticks, 7.20 s on PAL; no instrument of its own (the voice's last one). Played by tune 1 voice 1. Starts 6 bytes into pattern 32, whose data it shares to the $FF at $C7C2: pattern 32 without its first two notes."
  },
  {
   "address": 51090,
   "type": "line",
   "text": "Shared second half of patterns 32 (from its tick 96) and 37 (from its tick 84): the arpeggio figure an octave lower, G6 against a repeated G4, down to G5, to the $FF at $C7C2. The instrument is 9 in pattern 32 and 11 in tune 1's pattern 38 + 37."
  },
  {
   "address": 51139,
   "type": "line",
   "text": "Pattern 33 ($C7C3-$C81B, 89 bytes with the closing $FF): 43 notes, notes G1 to G#6; 192 ticks, 7.68 s on PAL; instruments 3, 9. Played by tune 0 voice 3."
  },
  {
   "address": 51187,
   "type": "line",
   "text": "Pattern 33's second half, from tick 112: the first half's instrument 9 figure an octave lower, G5 against a repeated G4, ending B4 G4 G4 G4, to the $FF at $C81B."
  },
  {
   "address": 51228,
   "type": "line",
   "text": "Pattern 5 ($C81C-$C839, 30 bytes with the closing $FF): 14 notes, notes C4 to C5; 96 ticks, 3.84 s on PAL; instrument 5. Played by tune 0 voice 1 x5."
  },
  {
   "address": 51258,
   "type": "line",
   "text": "Pattern 6 ($C83A-$C849, 16 bytes with the closing $FF): notes with their length in ticks: [instrument 6] G6 16; F6 16; D6 8; D#6 8; D6 16; C6 16; B5 16; 96 ticks, 3.84 s on PAL; instrument 6. Played by tune 0 voice 1 x3."
  },
  {
   "address": 51274,
   "type": "line",
   "text": "Pattern 10 ($C84A-$C8A3, 90 bytes with the closing $FF): 42 notes, notes B3 to G6; 288 ticks, 11.52 s on PAL; instruments 5, 1, 9, 10. Played by tune 0 voice 1 x2."
  },
  {
   "address": 51306,
   "type": "line",
   "text": "Pattern 10 from tick 104: instrument 9 (triangle with vibrato) G6 D#6 D6 F6 D#6 C6 A#5 G6 D#6 D6 F6 D#6 D6 D#5, instrument 10 G5 D5 D#5 F5 D#5 C5 A#4 from tick 200, instrument 9 again G6 D#6 D6 F6 D#6 C6 from tick 248, to the $FF at $C8A3."
  },
  {
   "address": 51364,
   "type": "line",
   "text": "Pattern 11 ($C8A4-$C8B3, 16 bytes with the closing $FF): notes with their length in ticks: [instrument 10] F5 8; F5 4; D5 4; C5 8; D#5 8; D5 8; A#4 8; 48 ticks, 1.92 s on PAL; instrument 10. Played by tune 0 voice 1 x2."
  },
  {
   "address": 51380,
   "type": "line",
   "text": "Pattern 12 ($C8B4-$C8C3, 16 bytes with the closing $FF): notes with their length in ticks: [instrument 6] G6 8; G6 4; D#6 4; D6 8; F6 8; D#6 8; C6 8; 48 ticks, 1.92 s on PAL; instrument 6. Played by tune 0 voice 1 x2."
  },
  {
   "address": 51396,
   "type": "line",
   "text": "Pattern 13 ($C8C4-$C8D3, 16 bytes with the closing $FF): notes with their length in ticks: D6 8; [instrument 1] D4 4; D#4 4; D4 8; C4 8; D4 8; A#3 8; 48 ticks, 1.92 s on PAL; instrument 1 (the first note keeps the voice's last instrument). Played by tune 0 voice 1."
  },
  {
   "address": 51412,
   "type": "line",
   "text": "Pattern 15 ($C8D4-$C8EE, 27 bytes with the closing $FF): 12 notes, notes C4 to G4; 192 ticks, 7.68 s on PAL; instrument 6. Played by tune 0 voice 1 x2."
  },
  {
   "address": 51439,
   "type": "line",
   "text": "Pattern 17 ($C8EF-$C932, 68 bytes with the closing $FF): 32 notes, notes C5 to D7; 192 ticks, 7.68 s on PAL; instruments 5, 9. Played by tune 0 voice 1 x4."
  },
  {
   "address": 51479,
   "type": "line",
   "text": "Pattern 17 from tick 104: instrument 9 (triangle with vibrato) D7 B6 A6 C7 B6 G6 D7 B6 A6 B6 C7 B6 G6, to the $FF at $C932."
  },
  {
   "address": 51507,
   "type": "line",
   "text": "Pattern 18 ($C933-$C977, 69 bytes with the closing $FF): 30 notes and 2 rests, notes A#3 to A#6; 192 ticks, 7.68 s on PAL; instruments 6, 10. Played by tune 0 voice 1 x4."
  },
  {
   "address": 51541,
   "type": "line",
   "text": "Pattern 18's second half, from tick 96: the first half's phrase again (instrument 6 A#6, instrument 10 D#6 F6 D#6 D6 C6 D6 D#6) ending on a held G6 instead of A#5, a rest, and the same rising run A#3 D#4 A#4 D#5 A#5 D#6 of 2-tick notes, to the $FF at $C977."
  },
  {
   "address": 51576,
   "type": "line",
   "text": "Pattern 19 ($C978-$C9B5, 62 bytes with the closing $FF): 28 notes, notes G3 to G6; 192 ticks, 7.68 s on PAL; instruments 6, 7, 1. Played by tune 0 voice 1 x2; tune 1 voice 3."
  },
  {
   "address": 51638,
   "type": "line",
   "text": "Pattern 20 ($C9B6-$C9CB, 22 bytes with the closing $FF): 10 notes, notes C#6 to G#6; 192 ticks, 7.68 s on PAL; instrument 12. Played by tune 0 voice 1 x8."
  },
  {
   "address": 51660,
   "type": "line",
   "text": "Pattern 23 ($C9CC-$CA02, 55 bytes with the closing $FF): 26 notes, notes G4 to C6; 288 ticks, 11.52 s on PAL; instruments 8, 3. Played by tune 0 voice 1."
  },
  {
   "address": 51715,
   "type": "line",
   "text": "Pattern 24 ($CA03-$CA35, 51 bytes with the closing $FF): 24 notes, notes C3 to C5; 288 ticks, 11.52 s on PAL; instruments 8, 3. Played by tune 0 voice 3."
  },
  {
   "address": 51766,
   "type": "line",
   "text": "Pattern 25 ($CA36-$CA6B, 54 bytes with the closing $FF): 25 notes, notes G2 to G6; 288 ticks, 11.52 s on PAL; instruments 3, 15. Played by tune 0 voice 1."
  },
  {
   "address": 51820,
   "type": "line",
   "text": "Pattern 26 ($CA6C-$CAA2, 55 bytes with the closing $FF): 26 notes, notes G3 to G5; 288 ticks, 11.52 s on PAL; instruments 15, 3. Played by tune 0 voice 3."
  },
  {
   "address": 51875,
   "type": "line",
   "text": "Pattern 27 ($CAA3-$CAC8, 38 bytes with the closing $FF): 18 notes, notes C3 to C4; 192 ticks, 7.68 s on PAL; instrument 3. Played by tune 0 voice 1 x2."
  },
  {
   "address": 51913,
   "type": "line",
   "text": "Pattern 28 ($CAC9-$CAEE, 38 bytes with the closing $FF): 18 notes, notes F2 to F3; 192 ticks, 7.68 s on PAL; instrument 3. Played by tune 0 voice 3 x2."
  },
  {
   "address": 51951,
   "type": "line",
   "text": "Pattern 29 ($CAEF-$CAF8, 10 bytes with the closing $FF): notes with their length in ticks: [instrument 0] G3 32 tied; G3 16 tied; G3 32 tied; G3 16 tied; 96 ticks, 3.84 s on PAL; instrument 0. Played by tune 0 voice 1 x5."
  },
  {
   "address": 51961,
   "type": "line",
   "text": "Pattern 9 ($CAF9-$CB0C, 20 bytes with the closing $FF): notes with their length in ticks: [instrument 7] G2 8; [instrument 8] C5 8; C4 8; [instrument 7] G2 8; [instrument 8] C5 8; C4 4; [instrument 7] G2 4; 48 ticks, 1.92 s on PAL; instruments 7, 8. Played by tune 0 voice 2 x81; tune 2 voice 2 x4."
  },
  {
   "address": 51981,
   "type": "line",
   "text": "Pattern 22 ($CB0D-$CB20, 20 bytes with the closing $FF): notes with their length in ticks: [instrument 7] G2 8; [instrument 14] C6 8; C4 8; [instrument 7] G2 8; [instrument 14] C6 8; C4 4; [instrument 7] G2 4; 48 ticks, 1.92 s on PAL; instruments 7, 14. Played by tune 0 voice 2 x52."
  },
  {
   "address": 52001,
   "type": "line",
   "text": "Pattern 31 ($CB21-$CB34, 20 bytes with the closing $FF): notes with their length in ticks: [instrument 7] G2 8; [instrument 8] A#5 8; A#4 8; [instrument 7] G2 8; [instrument 8] A#5 8; A#4 4; [instrument 7] G2 4; 48 ticks, 1.92 s on PAL; instruments 7, 8. Played by tune 0 voice 2 x16; tune 2 voice 2 x2."
  },
  {
   "address": 52021,
   "type": "line",
   "text": "Pattern 34 ($CB35-$CB48, 20 bytes with the closing $FF): notes with their length in ticks: [instrument 7] G2 8; [instrument 16] G7 8; G7 8; [instrument 7] G2 8; [instrument 16] G7 8; G7 4; [instrument 7] G2 4; 48 ticks, 1.92 s on PAL; instruments 7, 16. Played by tune 0 voice 2 x10. Instrument 16's octave effect on G7 reads past the frequency table (music_octave)."
  },
  {
   "address": 52041,
   "type": "line",
   "text": "Pattern 35 ($CB49-$CB54, 12 bytes with the closing $FF): notes with their length in ticks: rest 8; [instrument 14] C6 8; C4 8; rest 8; C6 8; C4 8; 48 ticks, 1.92 s on PAL; instrument 14. Played by tune 0 voice 2 x8; tune 1 voice 2; tune 2 voice 2 x5."
  },
  {
   "address": 52053,
   "type": "line",
   "text": "Pattern 36 ($CB55-$CB59, 5 bytes with the closing $FF): notes with their length in ticks: C2 32 tied; C2 16; 48 ticks, 1.92 s on PAL; no instrument of its own (the voice's last one). Played by tune 0 voice 3 x2; tune 1 voice 3; tune 2 voice 1 x2; tune 2 voice 3 x6."
  },
  {
   "address": 52058,
   "type": "line",
   "text": "Pattern 4 ($CB5A-$CB67, 14 bytes with the closing $FF): notes with their length in ticks: [instrument 3] C2 16; [instrument 4] A#3 8; [instrument 3] C3 8; F2 8; G2 8; 48 ticks, 1.92 s on PAL; instruments 3, 4. Played by tune 0 voice 3 x22; tune 2 voice 3 x2."
  },
  {
   "address": 52072,
   "type": "line",
   "text": "Pattern 7 ($CB68-$CB75, 14 bytes with the closing $FF): notes with their length in ticks: [instrument 3] G1 16; [instrument 4] A#3 8; [instrument 3] G2 8; C2 8; D2 8; 48 ticks, 1.92 s on PAL; instruments 3, 4. Played by tune 0 voice 3 x40; tune 2 voice 3 x2."
  },
  {
   "address": 52086,
   "type": "line",
   "text": "Pattern 8 ($CB76-$CB83, 14 bytes with the closing $FF): notes with their length in ticks: [instrument 3] D#2 16; [instrument 4] A#3 8; [instrument 3] D#3 8; G#2 8; A#2 8; 48 ticks, 1.92 s on PAL; instruments 3, 4. Played by tune 0 voice 3 x26; tune 2 voice 3 x2."
  },
  {
   "address": 52100,
   "type": "line",
   "text": "Pattern 14 ($CB84-$CB91, 14 bytes with the closing $FF): notes with their length in ticks: [instrument 3] A#1 16; [instrument 4] A#3 8; [instrument 3] A#2 8; D#2 8; F2 8; 48 ticks, 1.92 s on PAL; instruments 3, 4. Played by tune 0 voice 3 x3."
  },
  {
   "address": 52114,
   "type": "line",
   "text": "Pattern 16 ($CB92-$CBA0, 15 bytes with the closing $FF): notes with their length in ticks: [instrument 3] D#2 16; [instrument 4] A#3 16; [instrument 3] A#1 16; C2 32; [instrument 4] D4 16; 96 ticks, 3.84 s on PAL; instruments 3, 4. Played by tune 0 voice 3 x4."
  },
  {
   "address": 52129,
   "type": "line",
   "text": "Pattern 21 ($CBA1-$CBC2, 34 bytes with the closing $FF): 16 notes, notes F1 to F2; 384 ticks, 15.36 s on PAL; instrument 13. Played by tune 0 voice 3 x4."
  },
  {
   "address": 52163,
   "type": "line",
   "text": "Starts tune A (from music_init): copies the tune's 6-byte entry at music_tunes + 6A ($C4B5: three track address lows, then three highs) to $C4AF-$C4B4 and sets the state $C41D to $40, so the next music_play resets the voices and plays from the top. A is not checked: 3 and above would read the pattern table as track addresses."
  },
  {
   "address": 52193,
   "type": "line",
   "text": "Stop request (from music_stop): state $C41D = $C0; the next music_play silences all three voices and sets $80, stopped."
  },
  {
   "address": 52224,
   "type": "line",
   "text": "Title picture's screen matrix: 1,000 bytes, one per character cell of the bitmap at $E000 (row r at $CC00 + 40r), read by the VIC in bank 3 through $D018 = $38 (title_irq_picture): the high nibble colours bit pair %01, the low nibble bit pair %10. 543 cells carry a high nibble of $E, light blue, that none of their pixels uses; the common values are $E8 (orange), $E9 (brown), $E7 (yellow), $E1 (white) and $91 (brown and white). Rows 23 and 24 ($CF98-$CFE7) are all 0. Loaded with the game; no code writes it. The sprite pointers that would follow at $CFF8-$CFFF are unused: the title shows no sprites."
  },
  {
   "address": 57344,
   "type": "line",
   "text": "Title picture: a multicolour bitmap of 8,000 bytes, $E000-$FF3F, in the RAM under the KERNAL ROM. The VIC reads it in bank 3 ($D018 = $38, title_irq_picture); the CPU, with $01 = $36, sees the KERNAL ROM at these addresses instead, and the label is named for the one CPU read: the random routine's LDA $E000,X at $2BAA takes ROM bytes $E000-$E0FF, not the picture. 25 rows of 40 cells of 8 bytes, row r at $E000 + 320r; each byte is four double-wide pixels: %00 the black background, %01 and %10 the colours in title_screen_matrix ($CC00), %11 colour RAM (filled from $AC00). Loaded with the game; no code writes it. This label's own bytes, cells 0-7 of row 0 ($E000-$E03F): the first flourishes at the top left of the logo."
  },
  {
   "address": 57408,
   "type": "line",
   "text": "Title picture, from cell 8 of row 0 to the end of row 2 ($E040-$E3BE; $E3BF, BASIC's RAM initialisation entry, is excluded): the upper half of the logo's THE MASTER OF in yellow and orange on black."
  },
  {
   "address": 58304,
   "type": "line",
   "text": "Title picture, row 3 and cells 0-8 of row 4 ($E3C0-$E543; $E544, the KERNAL's screen clear entry, is excluded): the lower half of THE MASTER OF in yellow and orange, and the dark grey edge of the cave roof at the right (cells 33-37)."
  },
  {
   "address": 58693,
   "type": "line",
   "text": "Title picture, from cell 8 (byte 5) of row 4 to cell 15 of row 6 ($E545-$E7FF): the foot of THE MASTER OF, the top of MAGIC and the cave's outline in dark grey on both sides, with white and brown rock at the right."
  },
  {
   "address": 59392,
   "type": "line",
   "text": "Title picture, cells 16-23 of row 6 ($E800-$E83F): part of the top of MAGIC in yellow and orange. The label is named for the random routine's EOR $E800,Y at $2BB1, which reads the KERNAL ROM's bytes $E800-$E8FF, not the picture."
  },
  {
   "address": 59456,
   "type": "line",
   "text": "Title picture, from cell 24 of row 6 to the end of row 8 ($E840-$EB3F; $EA31, the KERNAL's interrupt exit, is excluded): the upper part of MAGIC in yellow and orange between the cave walls in dark grey, white and brown."
  },
  {
   "address": 60224,
   "type": "line",
   "text": "Title picture, rows 9-11 ($EB40-$EEFF): the foot of MAGIC and its yellow flourishes, the dark grey back wall of the cave with white highlights, and the explorer's brown hair at cells 8-9 of row 11."
  },
  {
   "address": 61184,
   "type": "line",
   "text": "Title picture, cells 0-31 of row 12 ($EF00-$EFFF): the explorer's light red face (cell 9) and the cave walls in dark grey, brown and white."
  },
  {
   "address": 61440,
   "type": "line",
   "text": "Title picture, cells 32-39 of row 12 ($F000-$F03F): cave rock at the right edge in dark grey, brown and white. The label is named for the random routine's LDA $F000,X at $2BAE, which reads the KERNAL ROM's bytes $F000-$F0FF, not the picture."
  },
  {
   "address": 61504,
   "type": "line",
   "text": "Title picture, rows 13-14 ($F040-$F2BF): the explorer's red jacket (cells 8-10) and his arm held out with what is probably a torch, yellow specks spreading over the dark pool (cells 11-21), brown and white rock to the right."
  },
  {
   "address": 62144,
   "type": "line",
   "text": "Title picture, rows 15-17 ($F2C0-$F67F): the explorer's blue trousers (cells 8-9) at the edge of the pool, yellow specks and the top of a white ripple ring on the black water (row 17, cells 15-18), brown rock and white-lit stalagmites."
  },
  {
   "address": 63104,
   "type": "line",
   "text": "Title picture, rows 18-20 ($F680-$FA3F): the explorer's feet (row 18), the rest of the ripple, and the cave floor in brown, dark grey and white."
  },
  {
   "address": 64064,
   "type": "line",
   "text": "Title picture, rows 21-22 ($FA40-$FCBF): the bottom of the cave floor, dark grey and white rock with brown to the left; the last rows of the picture that show."
  },
  {
   "address": 64704,
   "type": "line",
   "text": "Title picture, rows 23-24 ($FCC0-$FF3F): 597 of the 640 bitmap bytes are non-zero, but these cells' screen matrix and colour RAM entries are all 0, so the rows show black; row 24 lies under the story, which title_irq_scroller shows in character mode from raster $EE. The 192 bytes after the bitmap, $FF40-$FFFF, are not part of the picture and are never displayed."
  }
 ]
}