{
 "schema": 1,
 "platform": "c64",
 "game": "darkman",
 "build": "PAL original, two-sided G64; level 1 load in play",
 "source": "regenerator2000 live",
 "part": "level6",
 "regions": {
  "exclude": [
   [
    256,
    511,
    "stack"
   ],
   [
    53248,
    57343,
    "I/O and colour RAM"
   ],
   [
    0,
    2591,
    "Loader and resident code"
   ],
   [
    39680,
    48895,
    "Not loaded by this level"
   ],
   [
    65520,
    65535,
    "Loader and resident code"
   ]
  ],
  "extra": [],
  "edges": [
   0,
   256,
   512,
   1024,
   2048,
   4096,
   16384,
   32768,
   40960,
   49152,
   53248,
   57344
  ],
  "elsewhere": [
   [
    0,
    2591,
    "Loader and resident code"
   ],
   [
    39680,
    48895,
    "Not loaded by this level"
   ],
   [
    65520,
    65535,
    "Loader and resident code"
   ]
  ]
 },
 "blocks": [
  {
   "start": 2592,
   "end": 2594,
   "type": "Code"
  },
  {
   "start": 2595,
   "end": 2602,
   "type": "Code"
  },
  {
   "start": 2603,
   "end": 2603,
   "type": "Byte"
  },
  {
   "start": 2604,
   "end": 2665,
   "type": "Byte"
  },
  {
   "start": 2666,
   "end": 2679,
   "type": "Byte"
  },
  {
   "start": 2680,
   "end": 2693,
   "type": "Byte"
  },
  {
   "start": 2694,
   "end": 2707,
   "type": "Byte"
  },
  {
   "start": 2708,
   "end": 2721,
   "type": "Byte"
  },
  {
   "start": 2722,
   "end": 2735,
   "type": "Byte"
  },
  {
   "start": 2736,
   "end": 2749,
   "type": "Byte"
  },
  {
   "start": 2750,
   "end": 2763,
   "type": "Byte"
  },
  {
   "start": 2764,
   "end": 2777,
   "type": "Byte"
  },
  {
   "start": 2778,
   "end": 2853,
   "type": "Byte"
  },
  {
   "start": 2854,
   "end": 2923,
   "type": "Byte"
  },
  {
   "start": 2924,
   "end": 2993,
   "type": "Byte"
  },
  {
   "start": 2994,
   "end": 3063,
   "type": "Byte"
  },
  {
   "start": 3064,
   "end": 3133,
   "type": "Byte"
  },
  {
   "start": 3134,
   "end": 3203,
   "type": "Byte"
  },
  {
   "start": 3204,
   "end": 3273,
   "type": "Byte"
  },
  {
   "start": 3274,
   "end": 3343,
   "type": "Byte"
  },
  {
   "start": 3344,
   "end": 3413,
   "type": "Byte"
  },
  {
   "start": 3414,
   "end": 3483,
   "type": "Byte"
  },
  {
   "start": 3484,
   "end": 3553,
   "type": "Byte"
  },
  {
   "start": 3554,
   "end": 3623,
   "type": "Byte"
  },
  {
   "start": 3624,
   "end": 3693,
   "type": "Byte"
  },
  {
   "start": 3694,
   "end": 3763,
   "type": "Byte"
  },
  {
   "start": 3764,
   "end": 3833,
   "type": "Byte"
  },
  {
   "start": 3834,
   "end": 3847,
   "type": "Byte"
  },
  {
   "start": 3848,
   "end": 3917,
   "type": "Byte"
  },
  {
   "start": 3918,
   "end": 3937,
   "type": "Byte"
  },
  {
   "start": 3938,
   "end": 3938,
   "type": "Byte"
  },
  {
   "start": 3939,
   "end": 3939,
   "type": "Byte"
  },
  {
   "start": 3940,
   "end": 3940,
   "type": "Byte"
  },
  {
   "start": 3941,
   "end": 3941,
   "type": "Byte"
  },
  {
   "start": 3942,
   "end": 4121,
   "type": "Code"
  },
  {
   "start": 4122,
   "end": 4191,
   "type": "Byte"
  },
  {
   "start": 4192,
   "end": 4211,
   "type": "Byte"
  },
  {
   "start": 4212,
   "end": 4212,
   "type": "Byte"
  },
  {
   "start": 4213,
   "end": 4213,
   "type": "Byte"
  },
  {
   "start": 4214,
   "end": 4552,
   "type": "Code"
  },
  {
   "start": 4553,
   "end": 4553,
   "type": "Byte"
  },
  {
   "start": 4554,
   "end": 4565,
   "type": "Byte"
  },
  {
   "start": 4566,
   "end": 4567,
   "type": "Byte"
  },
  {
   "start": 4568,
   "end": 4685,
   "type": "Code"
  },
  {
   "start": 4686,
   "end": 4686,
   "type": "Byte"
  },
  {
   "start": 4687,
   "end": 4746,
   "type": "Byte"
  },
  {
   "start": 4747,
   "end": 4747,
   "type": "Code"
  },
  {
   "start": 4748,
   "end": 4938,
   "type": "Byte"
  },
  {
   "start": 4939,
   "end": 5037,
   "type": "Code"
  },
  {
   "start": 5038,
   "end": 5038,
   "type": "Byte"
  },
  {
   "start": 5039,
   "end": 5396,
   "type": "Code"
  },
  {
   "start": 5397,
   "end": 5411,
   "type": "Byte"
  },
  {
   "start": 5412,
   "end": 5537,
   "type": "Code"
  },
  {
   "start": 5538,
   "end": 5569,
   "type": "Byte"
  },
  {
   "start": 5570,
   "end": 5573,
   "type": "Byte"
  },
  {
   "start": 5574,
   "end": 5725,
   "type": "Code"
  },
  {
   "start": 5726,
   "end": 5815,
   "type": "Byte"
  },
  {
   "start": 5816,
   "end": 5817,
   "type": "Byte"
  },
  {
   "start": 5818,
   "end": 5924,
   "type": "Code"
  },
  {
   "start": 5925,
   "end": 5925,
   "type": "Byte"
  },
  {
   "start": 5926,
   "end": 6171,
   "type": "Code"
  },
  {
   "start": 6172,
   "end": 6203,
   "type": "Byte"
  },
  {
   "start": 6204,
   "end": 6235,
   "type": "Byte"
  },
  {
   "start": 6236,
   "end": 6752,
   "type": "Code"
  },
  {
   "start": 6753,
   "end": 6784,
   "type": "Byte"
  },
  {
   "start": 6785,
   "end": 6816,
   "type": "Byte"
  },
  {
   "start": 6817,
   "end": 7087,
   "type": "Code"
  },
  {
   "start": 7088,
   "end": 7101,
   "type": "Byte"
  },
  {
   "start": 7102,
   "end": 7243,
   "type": "Code"
  },
  {
   "start": 7244,
   "end": 7291,
   "type": "Byte"
  },
  {
   "start": 7292,
   "end": 7560,
   "type": "Code"
  },
  {
   "start": 7561,
   "end": 7666,
   "type": "Byte"
  },
  {
   "start": 7667,
   "end": 7667,
   "type": "Byte"
  },
  {
   "start": 7668,
   "end": 7668,
   "type": "Byte"
  },
  {
   "start": 7669,
   "end": 7774,
   "type": "Code"
  },
  {
   "start": 7775,
   "end": 7806,
   "type": "Byte"
  },
  {
   "start": 7807,
   "end": 7838,
   "type": "Byte"
  },
  {
   "start": 7839,
   "end": 7839,
   "type": "Code"
  },
  {
   "start": 7840,
   "end": 7840,
   "type": "Byte"
  },
  {
   "start": 7841,
   "end": 7841,
   "type": "Byte"
  },
  {
   "start": 7842,
   "end": 7921,
   "type": "Byte"
  },
  {
   "start": 7922,
   "end": 8040,
   "type": "Code"
  },
  {
   "start": 8041,
   "end": 8041,
   "type": "Byte"
  },
  {
   "start": 8042,
   "end": 8096,
   "type": "Code"
  },
  {
   "start": 8097,
   "end": 8097,
   "type": "Byte"
  },
  {
   "start": 8098,
   "end": 8098,
   "type": "Byte"
  },
  {
   "start": 8099,
   "end": 8099,
   "type": "Byte"
  },
  {
   "start": 8100,
   "end": 8100,
   "type": "Byte"
  },
  {
   "start": 8101,
   "end": 8101,
   "type": "Byte"
  },
  {
   "start": 8102,
   "end": 8102,
   "type": "Byte"
  },
  {
   "start": 8103,
   "end": 8103,
   "type": "Byte"
  },
  {
   "start": 8104,
   "end": 8104,
   "type": "Byte"
  },
  {
   "start": 8105,
   "end": 8105,
   "type": "Byte"
  },
  {
   "start": 8106,
   "end": 8106,
   "type": "Byte"
  },
  {
   "start": 8107,
   "end": 8107,
   "type": "Byte"
  },
  {
   "start": 8108,
   "end": 8301,
   "type": "Code"
  },
  {
   "start": 8302,
   "end": 8302,
   "type": "Byte"
  },
  {
   "start": 8303,
   "end": 8303,
   "type": "Byte"
  },
  {
   "start": 8304,
   "end": 8304,
   "type": "Byte"
  },
  {
   "start": 8305,
   "end": 8306,
   "type": "Byte"
  },
  {
   "start": 8307,
   "end": 8307,
   "type": "Byte"
  },
  {
   "start": 8308,
   "end": 8308,
   "type": "Byte"
  },
  {
   "start": 8309,
   "end": 8340,
   "type": "Byte"
  },
  {
   "start": 8341,
   "end": 8341,
   "type": "Code"
  },
  {
   "start": 8342,
   "end": 8345,
   "type": "Byte"
  },
  {
   "start": 8346,
   "end": 9715,
   "type": "Code"
  },
  {
   "start": 9716,
   "end": 9719,
   "type": "Byte"
  },
  {
   "start": 9720,
   "end": 10636,
   "type": "Code"
  },
  {
   "start": 10637,
   "end": 10640,
   "type": "Byte"
  },
  {
   "start": 10641,
   "end": 11054,
   "type": "Code"
  },
  {
   "start": 11055,
   "end": 11055,
   "type": "Byte"
  },
  {
   "start": 11056,
   "end": 11056,
   "type": "Byte"
  },
  {
   "start": 11057,
   "end": 11286,
   "type": "Code"
  },
  {
   "start": 11287,
   "end": 11971,
   "type": "Code"
  },
  {
   "start": 11972,
   "end": 11972,
   "type": "Byte"
  },
  {
   "start": 11973,
   "end": 12404,
   "type": "Code"
  },
  {
   "start": 12405,
   "end": 12427,
   "type": "Code"
  },
  {
   "start": 12428,
   "end": 13291,
   "type": "Code"
  },
  {
   "start": 13292,
   "end": 13295,
   "type": "Byte"
  },
  {
   "start": 13296,
   "end": 20981,
   "type": "Code"
  },
  {
   "start": 20982,
   "end": 20982,
   "type": "Byte"
  },
  {
   "start": 20983,
   "end": 21461,
   "type": "Code"
  },
  {
   "start": 21462,
   "end": 21462,
   "type": "Byte"
  },
  {
   "start": 21463,
   "end": 21574,
   "type": "Code"
  },
  {
   "start": 21575,
   "end": 21575,
   "type": "Byte"
  },
  {
   "start": 21576,
   "end": 21576,
   "type": "Byte"
  },
  {
   "start": 21577,
   "end": 21621,
   "type": "Code"
  },
  {
   "start": 21622,
   "end": 21645,
   "type": "Byte"
  },
  {
   "start": 21646,
   "end": 21841,
   "type": "Code"
  },
  {
   "start": 21842,
   "end": 21854,
   "type": "Code"
  },
  {
   "start": 21855,
   "end": 22176,
   "type": "Code"
  },
  {
   "start": 22177,
   "end": 22177,
   "type": "Byte"
  },
  {
   "start": 22178,
   "end": 22178,
   "type": "Byte"
  },
  {
   "start": 22179,
   "end": 22179,
   "type": "Byte"
  },
  {
   "start": 22180,
   "end": 22344,
   "type": "Code"
  },
  {
   "start": 22345,
   "end": 22348,
   "type": "Byte"
  },
  {
   "start": 22349,
   "end": 22412,
   "type": "Byte"
  },
  {
   "start": 22413,
   "end": 22413,
   "type": "Byte"
  },
  {
   "start": 22414,
   "end": 22592,
   "type": "Code"
  },
  {
   "start": 22593,
   "end": 22593,
   "type": "Byte"
  },
  {
   "start": 22594,
   "end": 22808,
   "type": "Code"
  },
  {
   "start": 22809,
   "end": 22818,
   "type": "Byte"
  },
  {
   "start": 22819,
   "end": 22819,
   "type": "Byte"
  },
  {
   "start": 22820,
   "end": 22835,
   "type": "Byte"
  },
  {
   "start": 22836,
   "end": 22836,
   "type": "Byte"
  },
  {
   "start": 22837,
   "end": 22837,
   "type": "Byte"
  },
  {
   "start": 22838,
   "end": 22878,
   "type": "Code"
  },
  {
   "start": 22879,
   "end": 22879,
   "type": "Byte"
  },
  {
   "start": 22880,
   "end": 22880,
   "type": "Byte"
  },
  {
   "start": 22881,
   "end": 22881,
   "type": "Code"
  },
  {
   "start": 22882,
   "end": 22882,
   "type": "Byte"
  },
  {
   "start": 22883,
   "end": 22900,
   "type": "Byte"
  },
  {
   "start": 22901,
   "end": 22918,
   "type": "Byte"
  },
  {
   "start": 22919,
   "end": 22919,
   "type": "Byte"
  },
  {
   "start": 22920,
   "end": 22985,
   "type": "Code"
  },
  {
   "start": 22986,
   "end": 22986,
   "type": "Byte"
  },
  {
   "start": 22987,
   "end": 22987,
   "type": "Byte"
  },
  {
   "start": 22988,
   "end": 23092,
   "type": "Code"
  },
  {
   "start": 23093,
   "end": 23118,
   "type": "Byte"
  },
  {
   "start": 23119,
   "end": 23355,
   "type": "Code"
  },
  {
   "start": 23356,
   "end": 23356,
   "type": "Byte"
  },
  {
   "start": 23357,
   "end": 23357,
   "type": "Byte"
  },
  {
   "start": 23358,
   "end": 23358,
   "type": "Byte"
  },
  {
   "start": 23359,
   "end": 23359,
   "type": "Byte"
  },
  {
   "start": 23360,
   "end": 23360,
   "type": "Byte"
  },
  {
   "start": 23361,
   "end": 23361,
   "type": "Byte"
  },
  {
   "start": 23362,
   "end": 23623,
   "type": "Code"
  },
  {
   "start": 23624,
   "end": 23624,
   "type": "Byte"
  },
  {
   "start": 23625,
   "end": 24282,
   "type": "Code"
  },
  {
   "start": 24283,
   "end": 24360,
   "type": "Byte"
  },
  {
   "start": 24361,
   "end": 24361,
   "type": "Byte"
  },
  {
   "start": 24362,
   "end": 24362,
   "type": "Byte"
  },
  {
   "start": 24363,
   "end": 24636,
   "type": "Code"
  },
  {
   "start": 24637,
   "end": 24637,
   "type": "Byte"
  },
  {
   "start": 24638,
   "end": 24649,
   "type": "Byte"
  },
  {
   "start": 24650,
   "end": 24661,
   "type": "Byte"
  },
  {
   "start": 24662,
   "end": 24727,
   "type": "Code"
  },
  {
   "start": 24728,
   "end": 24860,
   "type": "Code"
  },
  {
   "start": 24861,
   "end": 24861,
   "type": "Byte"
  },
  {
   "start": 24862,
   "end": 24862,
   "type": "Byte"
  },
  {
   "start": 24863,
   "end": 24863,
   "type": "Byte"
  },
  {
   "start": 24864,
   "end": 24864,
   "type": "Byte"
  },
  {
   "start": 24865,
   "end": 25118,
   "type": "Code"
  },
  {
   "start": 25119,
   "end": 25119,
   "type": "Byte"
  },
  {
   "start": 25120,
   "end": 25120,
   "type": "Byte"
  },
  {
   "start": 25121,
   "end": 25121,
   "type": "Byte"
  },
  {
   "start": 25122,
   "end": 25122,
   "type": "Byte"
  },
  {
   "start": 25123,
   "end": 25152,
   "type": "Byte"
  },
  {
   "start": 25153,
   "end": 25182,
   "type": "Byte"
  },
  {
   "start": 25183,
   "end": 25200,
   "type": "Byte"
  },
  {
   "start": 25201,
   "end": 25340,
   "type": "Code"
  },
  {
   "start": 25341,
   "end": 25579,
   "type": "Code"
  },
  {
   "start": 25580,
   "end": 25580,
   "type": "Byte"
  },
  {
   "start": 25581,
   "end": 25581,
   "type": "Byte"
  },
  {
   "start": 25582,
   "end": 25672,
   "type": "Code"
  },
  {
   "start": 25673,
   "end": 25673,
   "type": "Byte"
  },
  {
   "start": 25674,
   "end": 25976,
   "type": "Code"
  },
  {
   "start": 25977,
   "end": 25977,
   "type": "Byte"
  },
  {
   "start": 25978,
   "end": 25985,
   "type": "Byte"
  },
  {
   "start": 25986,
   "end": 25993,
   "type": "Byte"
  },
  {
   "start": 25994,
   "end": 26002,
   "type": "Code"
  },
  {
   "start": 26003,
   "end": 26039,
   "type": "Code"
  },
  {
   "start": 26040,
   "end": 26040,
   "type": "Byte"
  },
  {
   "start": 26041,
   "end": 26041,
   "type": "Byte"
  },
  {
   "start": 26042,
   "end": 26042,
   "type": "Byte"
  },
  {
   "start": 26043,
   "end": 26043,
   "type": "Byte"
  },
  {
   "start": 26044,
   "end": 26051,
   "type": "Byte"
  },
  {
   "start": 26052,
   "end": 26082,
   "type": "Code"
  },
  {
   "start": 26083,
   "end": 26083,
   "type": "Byte"
  },
  {
   "start": 26084,
   "end": 26084,
   "type": "Code"
  },
  {
   "start": 26085,
   "end": 26099,
   "type": "Code"
  },
  {
   "start": 26100,
   "end": 26135,
   "type": "Code"
  },
  {
   "start": 26136,
   "end": 26136,
   "type": "Byte"
  },
  {
   "start": 26137,
   "end": 26254,
   "type": "Code"
  },
  {
   "start": 26255,
   "end": 26255,
   "type": "Byte"
  },
  {
   "start": 26256,
   "end": 26256,
   "type": "Byte"
  },
  {
   "start": 26257,
   "end": 26257,
   "type": "Byte"
  },
  {
   "start": 26258,
   "end": 26258,
   "type": "Byte"
  },
  {
   "start": 26259,
   "end": 26322,
   "type": "Byte"
  },
  {
   "start": 26323,
   "end": 26323,
   "type": "Byte"
  },
  {
   "start": 26324,
   "end": 26324,
   "type": "Byte"
  },
  {
   "start": 26325,
   "end": 26828,
   "type": "Code"
  },
  {
   "start": 26829,
   "end": 26840,
   "type": "Byte"
  },
  {
   "start": 26841,
   "end": 26841,
   "type": "Byte"
  },
  {
   "start": 26842,
   "end": 27315,
   "type": "Code"
  },
  {
   "start": 27316,
   "end": 28965,
   "type": "Code"
  },
  {
   "start": 28966,
   "end": 28976,
   "type": "Code"
  },
  {
   "start": 28977,
   "end": 29171,
   "type": "Code"
  },
  {
   "start": 29172,
   "end": 29251,
   "type": "Byte"
  },
  {
   "start": 29252,
   "end": 29530,
   "type": "Byte"
  },
  {
   "start": 29531,
   "end": 29651,
   "type": "Byte"
  },
  {
   "start": 29652,
   "end": 29707,
   "type": "Byte"
  },
  {
   "start": 29708,
   "end": 29709,
   "type": "Byte"
  },
  {
   "start": 29710,
   "end": 29710,
   "type": "Byte"
  },
  {
   "start": 29711,
   "end": 29711,
   "type": "Byte"
  },
  {
   "start": 29712,
   "end": 29712,
   "type": "Byte"
  },
  {
   "start": 29713,
   "end": 29713,
   "type": "Byte"
  },
  {
   "start": 29714,
   "end": 29714,
   "type": "Byte"
  },
  {
   "start": 29715,
   "end": 30058,
   "type": "Code"
  },
  {
   "start": 30059,
   "end": 30185,
   "type": "Byte"
  },
  {
   "start": 30186,
   "end": 30280,
   "type": "Code"
  },
  {
   "start": 30281,
   "end": 30350,
   "type": "Byte"
  },
  {
   "start": 30351,
   "end": 30420,
   "type": "Byte"
  },
  {
   "start": 30421,
   "end": 30490,
   "type": "Byte"
  },
  {
   "start": 30491,
   "end": 30560,
   "type": "Byte"
  },
  {
   "start": 30561,
   "end": 30630,
   "type": "Byte"
  },
  {
   "start": 30631,
   "end": 30700,
   "type": "Byte"
  },
  {
   "start": 30701,
   "end": 30770,
   "type": "Byte"
  },
  {
   "start": 30771,
   "end": 30840,
   "type": "Byte"
  },
  {
   "start": 30841,
   "end": 30910,
   "type": "Byte"
  },
  {
   "start": 30911,
   "end": 30980,
   "type": "Byte"
  },
  {
   "start": 30981,
   "end": 31050,
   "type": "Byte"
  },
  {
   "start": 31051,
   "end": 31120,
   "type": "Byte"
  },
  {
   "start": 31121,
   "end": 31190,
   "type": "Byte"
  },
  {
   "start": 31191,
   "end": 31260,
   "type": "Byte"
  },
  {
   "start": 31261,
   "end": 31387,
   "type": "Code"
  },
  {
   "start": 31388,
   "end": 31509,
   "type": "Code"
  },
  {
   "start": 31510,
   "end": 31510,
   "type": "Byte"
  },
  {
   "start": 31511,
   "end": 31511,
   "type": "Byte"
  },
  {
   "start": 31512,
   "end": 31512,
   "type": "Byte"
  },
  {
   "start": 31513,
   "end": 31513,
   "type": "Byte"
  },
  {
   "start": 31514,
   "end": 31514,
   "type": "Byte"
  },
  {
   "start": 31515,
   "end": 31575,
   "type": "Code"
  },
  {
   "start": 31576,
   "end": 31576,
   "type": "Byte"
  },
  {
   "start": 31577,
   "end": 31691,
   "type": "Code"
  },
  {
   "start": 31692,
   "end": 31692,
   "type": "Byte"
  },
  {
   "start": 31693,
   "end": 31902,
   "type": "Code"
  },
  {
   "start": 31903,
   "end": 32202,
   "type": "Byte"
  },
  {
   "start": 32203,
   "end": 32502,
   "type": "Byte"
  },
  {
   "start": 32503,
   "end": 32656,
   "type": "Byte"
  },
  {
   "start": 32657,
   "end": 32662,
   "type": "Byte"
  },
  {
   "start": 32663,
   "end": 32789,
   "type": "Code"
  },
  {
   "start": 32790,
   "end": 32790,
   "type": "Byte"
  },
  {
   "start": 32791,
   "end": 32828,
   "type": "Byte"
  },
  {
   "start": 32829,
   "end": 32830,
   "type": "Byte"
  },
  {
   "start": 32831,
   "end": 32942,
   "type": "Code"
  },
  {
   "start": 32943,
   "end": 33006,
   "type": "Code"
  },
  {
   "start": 33007,
   "end": 33007,
   "type": "Code"
  },
  {
   "start": 33008,
   "end": 33111,
   "type": "Code"
  },
  {
   "start": 33112,
   "end": 33112,
   "type": "Code"
  },
  {
   "start": 33113,
   "end": 33153,
   "type": "Code"
  },
  {
   "start": 33154,
   "end": 37761,
   "type": "Byte"
  },
  {
   "start": 37762,
   "end": 37806,
   "type": "Code"
  },
  {
   "start": 37807,
   "end": 37986,
   "type": "Code"
  },
  {
   "start": 37987,
   "end": 37987,
   "type": "Byte"
  },
  {
   "start": 37988,
   "end": 37988,
   "type": "Byte"
  },
  {
   "start": 37989,
   "end": 38011,
   "type": "Byte"
  },
  {
   "start": 38012,
   "end": 38034,
   "type": "Byte"
  },
  {
   "start": 38035,
   "end": 38035,
   "type": "Byte"
  },
  {
   "start": 38036,
   "end": 38199,
   "type": "Code"
  },
  {
   "start": 38200,
   "end": 38335,
   "type": "Byte"
  },
  {
   "start": 38336,
   "end": 38471,
   "type": "Byte"
  },
  {
   "start": 38472,
   "end": 38511,
   "type": "Byte"
  },
  {
   "start": 38512,
   "end": 38568,
   "type": "Code"
  },
  {
   "start": 38569,
   "end": 38569,
   "type": "Byte"
  },
  {
   "start": 38570,
   "end": 38570,
   "type": "Byte"
  },
  {
   "start": 38571,
   "end": 38718,
   "type": "Code"
  },
  {
   "start": 38719,
   "end": 38898,
   "type": "Byte"
  },
  {
   "start": 38899,
   "end": 38899,
   "type": "Byte"
  },
  {
   "start": 38900,
   "end": 39025,
   "type": "Byte"
  },
  {
   "start": 39026,
   "end": 39028,
   "type": "Byte"
  },
  {
   "start": 39029,
   "end": 39051,
   "type": "Byte"
  },
  {
   "start": 39052,
   "end": 39057,
   "type": "Byte"
  },
  {
   "start": 39058,
   "end": 39187,
   "type": "Byte"
  },
  {
   "start": 39188,
   "end": 39387,
   "type": "Byte"
  },
  {
   "start": 39388,
   "end": 39587,
   "type": "Byte"
  },
  {
   "start": 39588,
   "end": 39679,
   "type": "Byte"
  },
  {
   "start": 48896,
   "end": 49151,
   "type": "Byte"
  },
  {
   "start": 49152,
   "end": 49215,
   "type": "Byte"
  },
  {
   "start": 49216,
   "end": 49975,
   "type": "Byte"
  },
  {
   "start": 49976,
   "end": 50111,
   "type": "Byte"
  },
  {
   "start": 50112,
   "end": 50247,
   "type": "Byte"
  },
  {
   "start": 50248,
   "end": 50255,
   "type": "Byte"
  },
  {
   "start": 50256,
   "end": 50335,
   "type": "Byte"
  },
  {
   "start": 50336,
   "end": 51199,
   "type": "Byte"
  },
  {
   "start": 51200,
   "end": 52199,
   "type": "Byte"
  },
  {
   "start": 52200,
   "end": 52215,
   "type": "Byte"
  },
  {
   "start": 52216,
   "end": 52223,
   "type": "Byte"
  },
  {
   "start": 52224,
   "end": 53223,
   "type": "Byte"
  },
  {
   "start": 53224,
   "end": 53239,
   "type": "Byte"
  },
  {
   "start": 53240,
   "end": 53247,
   "type": "Byte"
  },
  {
   "start": 53248,
   "end": 54271,
   "type": "Byte"
  },
  {
   "start": 54272,
   "end": 55215,
   "type": "Byte"
  },
  {
   "start": 55216,
   "end": 55295,
   "type": "Byte"
  },
  {
   "start": 55296,
   "end": 55423,
   "type": "Byte"
  },
  {
   "start": 55424,
   "end": 55551,
   "type": "Byte"
  },
  {
   "start": 55552,
   "end": 55743,
   "type": "Byte"
  },
  {
   "start": 55744,
   "end": 55807,
   "type": "Byte"
  },
  {
   "start": 55808,
   "end": 55935,
   "type": "Byte"
  },
  {
   "start": 55936,
   "end": 56063,
   "type": "Byte"
  },
  {
   "start": 56064,
   "end": 56127,
   "type": "Byte"
  },
  {
   "start": 56128,
   "end": 56319,
   "type": "Byte"
  },
  {
   "start": 56320,
   "end": 56383,
   "type": "Byte"
  },
  {
   "start": 56384,
   "end": 56511,
   "type": "Byte"
  },
  {
   "start": 56512,
   "end": 56639,
   "type": "Byte"
  },
  {
   "start": 56640,
   "end": 56959,
   "type": "Byte"
  },
  {
   "start": 56960,
   "end": 57343,
   "type": "Byte"
  },
  {
   "start": 57344,
   "end": 58367,
   "type": "Byte"
  },
  {
   "start": 58368,
   "end": 58623,
   "type": "Byte"
  },
  {
   "start": 58624,
   "end": 58815,
   "type": "Byte"
  },
  {
   "start": 58816,
   "end": 59199,
   "type": "Byte"
  },
  {
   "start": 59200,
   "end": 59583,
   "type": "Byte"
  },
  {
   "start": 59584,
   "end": 60607,
   "type": "Byte"
  },
  {
   "start": 60608,
   "end": 61567,
   "type": "Byte"
  },
  {
   "start": 61568,
   "end": 61759,
   "type": "Byte"
  },
  {
   "start": 61760,
   "end": 62335,
   "type": "Byte"
  },
  {
   "start": 62336,
   "end": 63359,
   "type": "Byte"
  },
  {
   "start": 63360,
   "end": 63423,
   "type": "Byte"
  },
  {
   "start": 63424,
   "end": 63679,
   "type": "Byte"
  },
  {
   "start": 63680,
   "end": 63727,
   "type": "Byte"
  },
  {
   "start": 63728,
   "end": 63959,
   "type": "Byte"
  },
  {
   "start": 63960,
   "end": 63999,
   "type": "Byte"
  },
  {
   "start": 64000,
   "end": 64047,
   "type": "Byte"
  },
  {
   "start": 64048,
   "end": 64087,
   "type": "Byte"
  },
  {
   "start": 64088,
   "end": 64143,
   "type": "Byte"
  },
  {
   "start": 64144,
   "end": 64199,
   "type": "Byte"
  },
  {
   "start": 64200,
   "end": 64263,
   "type": "Byte"
  },
  {
   "start": 64264,
   "end": 64319,
   "type": "Byte"
  },
  {
   "start": 64320,
   "end": 64367,
   "type": "Byte"
  },
  {
   "start": 64368,
   "end": 64639,
   "type": "Byte"
  },
  {
   "start": 64640,
   "end": 64687,
   "type": "Byte"
  },
  {
   "start": 64688,
   "end": 64959,
   "type": "Byte"
  },
  {
   "start": 64960,
   "end": 65007,
   "type": "Byte"
  },
  {
   "start": 65008,
   "end": 65023,
   "type": "Byte"
  },
  {
   "start": 65024,
   "end": 65407,
   "type": "Byte"
  },
  {
   "start": 65408,
   "end": 65471,
   "type": "Byte"
  },
  {
   "start": 65472,
   "end": 65519,
   "type": "Byte"
  }
 ],
 "symbols": [
  {
   "address": 2592,
   "name": "level_entry",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 2595,
   "name": "nmi_handler",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 2603,
   "name": "nmi_flag",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2604,
   "name": "spare_0a2c",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2666,
   "name": "slot_frame",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2680,
   "name": "slot_colour",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2694,
   "name": "slot_multicolour",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2708,
   "name": "slot_anim",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2722,
   "name": "slot_phase",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2736,
   "name": "slot_walk",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2750,
   "name": "slot_hurt",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2764,
   "name": "slot_state",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2778,
   "name": "spare_0ada",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2854,
   "name": "obj_type",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2924,
   "name": "obj_counter",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2994,
   "name": "obj_flag",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3064,
   "name": "obj_energy",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3134,
   "name": "obj_variant",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3204,
   "name": "obj_flag_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3274,
   "name": "obj_left_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3344,
   "name": "obj_left_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3414,
   "name": "obj_right_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3484,
   "name": "obj_right_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3554,
   "name": "obj_x_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3624,
   "name": "obj_x_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3694,
   "name": "obj_y_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3764,
   "name": "obj_y_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3834,
   "name": "slot_object",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3848,
   "name": "obj_slot",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3918,
   "name": "spare_0f4e",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3938,
   "name": "scan_dx_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3939,
   "name": "scan_dx_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3940,
   "name": "scan_dy_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3941,
   "name": "scan_dy_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3942,
   "name": "scan_next_object",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3945,
   "name": "scan_objects",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4109,
   "name": "saved_x_100d",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 4122,
   "name": "obj_active",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4192,
   "name": "spare_1060",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4212,
   "name": "hit_flag_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4213,
   "name": "hit_flag_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4214,
   "name": "player_hit_test",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4553,
   "name": "queue_count",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4554,
   "name": "slot_queue",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4566,
   "name": "spare_11d6",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4568,
   "name": "update_objects",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4643,
   "name": "patched_jsr_1223",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 4680,
   "name": "saved_index_1248",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 4686,
   "name": "current_object",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4687,
   "name": "object_behaviours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4747,
   "name": "behave_free",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4748,
   "name": "drop_rise_steps",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4939,
   "name": "behave_drop_rise",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5038,
   "name": "drop_rise_scratch",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5039,
   "name": "behave_map_switch",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5093,
   "name": "behave_follow_object_y",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5142,
   "name": "behave_light_start",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5177,
   "name": "behave_light_blink",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5228,
   "name": "behave_enemy_shot",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5375,
   "name": "behave_colour_6",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5386,
   "name": "behave_colour_1",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5397,
   "name": "vpatrol_frames",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5412,
   "name": "behave_vertical_patrol",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5452,
   "name": "saved_y_154c",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5538,
   "name": "radial_shot_steps",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5570,
   "name": "radial_shot_step",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5574,
   "name": "behave_radial_shot",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5653,
   "name": "saved_y_1615",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5726,
   "name": "flash_frames",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5816,
   "name": "spare_16b8",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5818,
   "name": "behave_flashing_hazard",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5858,
   "name": "saved_y_16e2",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5875,
   "name": "slot_right_of_player",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5892,
   "name": "slot_off_player_height",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5925,
   "name": "recoil",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5926,
   "name": "behave_attack_left",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6024,
   "name": "attack_left_frame_a",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6032,
   "name": "attack_left_step_a",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6047,
   "name": "attack_left_frame_b",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6055,
   "name": "attack_left_step_b",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6147,
   "name": "attack_left_step_c",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6167,
   "name": "attack_left_frame_c",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6172,
   "name": "walk_left_frames_0",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 6204,
   "name": "walk_left_frames_1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 6236,
   "name": "behave_walk_left",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6508,
   "name": "behave_attack_right",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6606,
   "name": "attack_right_frame_a",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6614,
   "name": "attack_right_step_a",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6629,
   "name": "attack_right_frame_b",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6637,
   "name": "attack_right_step_b",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6728,
   "name": "attack_right_step_c",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6748,
   "name": "attack_right_frame_c",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6753,
   "name": "walk_right_frames_0",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 6785,
   "name": "walk_right_frames_1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 6817,
   "name": "behave_walk_right",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7088,
   "name": "pickup_frames",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7102,
   "name": "behave_energy_pickup",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7158,
   "name": "saved_y_1bf6",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7240,
   "name": "saved_y_1c48",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7242,
   "name": "saved_x_1c4a",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7244,
   "name": "pickup_bob_steps",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7292,
   "name": "behave_score_pickup",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7341,
   "name": "saved_x_1cad",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7354,
   "name": "saved_y_1cba",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7356,
   "name": "saved_x_1cbc",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7358,
   "name": "behave_flash_frame",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7390,
   "name": "behave_lobbed_shot",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7561,
   "name": "lobbed_shot_steps",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7667,
   "name": "follow_limit",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7668,
   "name": "spare_1df4",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7669,
   "name": "slot_follow",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7775,
   "name": "follow_frames_high",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7807,
   "name": "follow_frames_low",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7839,
   "name": "behave_none",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7840,
   "name": "map_probe_x_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7841,
   "name": "map_probe_x_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7842,
   "name": "digit_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7922,
   "name": "set_map_cells",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7935,
   "name": "main_loop",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8035,
   "name": "energy_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8041,
   "name": "area_trigger_done",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8042,
   "name": "area_trigger",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8097,
   "name": "scroll_x_fine",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8098,
   "name": "scroll_y_fine",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8099,
   "name": "spare_1fa3",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8100,
   "name": "joystick",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8101,
   "name": "joystick_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8102,
   "name": "unused_1fa6",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8103,
   "name": "screen_buffer",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8104,
   "name": "saved_camera_y_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8105,
   "name": "saved_camera_y_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8106,
   "name": "saved_camera_x_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8107,
   "name": "saved_camera_x_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8108,
   "name": "scroll_step",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8292,
   "name": "patched_jsr_2064",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8302,
   "name": "scroll_direction",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8303,
   "name": "scroll_steps",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8304,
   "name": "scroll_phase",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8305,
   "name": "spare_2071",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8307,
   "name": "scroll_spare_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8308,
   "name": "scroll_spare_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8309,
   "name": "scroll_routines",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8341,
   "name": "scroll_none",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8342,
   "name": "fine_x_right_values",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8346,
   "name": "scroll_right_fine",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8392,
   "name": "scroll_right",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8445,
   "name": "scroll_right_colours",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8456,
   "name": "scroll_right_finish",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8471,
   "name": "scroll_right_copy_a",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8498,
   "name": "scroll_right_copy_b",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8531,
   "name": "shift_left_to_c8",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8647,
   "name": "copy_limit_21c7",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8651,
   "name": "shift_left_to_cc",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8767,
   "name": "copy_limit_223f",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8771,
   "name": "draw_right_column",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9691,
   "name": "step_map_column",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9716,
   "name": "fine_y_down_values",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9720,
   "name": "scroll_down_fine",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9766,
   "name": "scroll_down",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9820,
   "name": "scroll_down_colours",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9831,
   "name": "scroll_down_finish",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9846,
   "name": "scroll_down_copy_b",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9873,
   "name": "scroll_down_copy_a",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9906,
   "name": "shift_up_to_c8",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10016,
   "name": "copy_limit_2720",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10020,
   "name": "shift_up_to_cc",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10130,
   "name": "copy_limit_2792",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10134,
   "name": "draw_bottom_row_a",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10253,
   "name": "patched_table_280d",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10260,
   "name": "patched_table_2814",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10309,
   "name": "patched_table_2845",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10325,
   "name": "patched_table_2855",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10332,
   "name": "patched_table_285c",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10373,
   "name": "draw_bottom_row_b",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10492,
   "name": "patched_table_28fc",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10499,
   "name": "patched_table_2903",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10548,
   "name": "patched_table_2934",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10564,
   "name": "patched_table_2944",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10571,
   "name": "patched_table_294b",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10612,
   "name": "step_map_row",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10637,
   "name": "fine_y_up_values",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 10641,
   "name": "scroll_up_fine",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10687,
   "name": "scroll_up",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10741,
   "name": "scroll_up_colours",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10752,
   "name": "scroll_up_finish",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10767,
   "name": "scroll_up_copy_b",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10794,
   "name": "scroll_up_copy_a",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10827,
   "name": "shift_down_to_c8",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10937,
   "name": "copy_limit_2ab9",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10941,
   "name": "shift_down_to_cc",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11051,
   "name": "copy_limit_2b2b",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11055,
   "name": "row_table_select",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 11056,
   "name": "row_shift",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 11057,
   "name": "draw_top_row_a",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11111,
   "name": "call_placeholder",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11171,
   "name": "patched_table_2ba3",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11178,
   "name": "patched_table_2baa",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11225,
   "name": "patched_table_2bd9",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11241,
   "name": "patched_table_2be9",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11248,
   "name": "patched_table_2bf0",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11287,
   "name": "draw_top_row_b",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11401,
   "name": "patched_table_2c89",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11408,
   "name": "patched_table_2c90",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11455,
   "name": "patched_table_2cbf",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11471,
   "name": "patched_table_2ccf",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11478,
   "name": "patched_table_2cd6",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11517,
   "name": "back_map_row",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11540,
   "name": "scroll_right_up",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11618,
   "name": "scroll_ru_colours",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11629,
   "name": "scroll_ru_finish",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11644,
   "name": "scroll_ru_copy_a",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11671,
   "name": "scroll_ru_copy_b",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11744,
   "name": "shift_ru_to_c8",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11854,
   "name": "copy_limit_2e4e",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11858,
   "name": "shift_ru_to_cc",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11968,
   "name": "copy_limit_2ec0",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11972,
   "name": "scroll_hold",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 11973,
   "name": "scroll_left_up",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12051,
   "name": "scroll_lu_colours",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12062,
   "name": "scroll_lu_finish",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12077,
   "name": "scroll_lu_copy_a",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12104,
   "name": "scroll_lu_copy_b",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12177,
   "name": "shift_lu_to_c8",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12287,
   "name": "copy_limit_2fff",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 12291,
   "name": "shift_lu_to_cc",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12401,
   "name": "copy_limit_3071",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 12405,
   "name": "dead_copy_3075",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12428,
   "name": "scroll_left_down",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12506,
   "name": "scroll_ld_colours",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12517,
   "name": "scroll_ld_finish",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12532,
   "name": "scroll_ld_copy_a",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12559,
   "name": "scroll_ld_copy_b",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12632,
   "name": "shift_ld_to_c8",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12742,
   "name": "copy_limit_31c6",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 12746,
   "name": "shift_ld_to_cc",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12856,
   "name": "copy_limit_3238",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 12860,
   "name": "scroll_right_down",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12938,
   "name": "scroll_rd_colours",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12949,
   "name": "scroll_rd_finish",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12964,
   "name": "scroll_rd_copy_a",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12991,
   "name": "scroll_rd_copy_b",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13064,
   "name": "shift_rd_to_c8",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13174,
   "name": "copy_limit_3376",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 13178,
   "name": "shift_rd_to_cc",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13288,
   "name": "copy_limit_33e8",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 13292,
   "name": "fine_x_left_values",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13296,
   "name": "scroll_left_fine",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13342,
   "name": "scroll_left",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13395,
   "name": "scroll_left_colours",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13406,
   "name": "scroll_left_finish",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13421,
   "name": "scroll_left_copy_a",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13448,
   "name": "scroll_left_copy_b",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13481,
   "name": "shift_right_to_c8",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13597,
   "name": "copy_limit_351d",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 13601,
   "name": "shift_right_to_cc",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13717,
   "name": "copy_limit_3595",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 13721,
   "name": "draw_left_column",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 14639,
   "name": "back_map_column",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 14662,
   "name": "colour_buffer_from_cc",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15364,
   "name": "colour_buffer_from_cc_part_2",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 16066,
   "name": "colour_buffer_from_cc_part_3",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 16768,
   "name": "colour_buffer_from_cc_part_4",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 17470,
   "name": "colour_buffer_from_cc_part_5",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 17822,
   "name": "colour_buffer_from_c8",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 18524,
   "name": "colour_buffer_from_c8_part_2",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 19226,
   "name": "colour_buffer_from_c8_part_3",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 19928,
   "name": "colour_buffer_from_c8_part_4",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 20630,
   "name": "colour_buffer_from_c8_part_5",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 20982,
   "name": "light_flag",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 20983,
   "name": "level_setup",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21414,
   "name": "draw_panel",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21462,
   "name": "contact_scratch",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21463,
   "name": "player_contact",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21575,
   "name": "hurt_guard",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21576,
   "name": "energy",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21577,
   "name": "player_hurt",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21590,
   "name": "take_energy",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21613,
   "name": "saved_y_546d",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21615,
   "name": "saved_x_546f",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21617,
   "name": "behave_none_18",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21618,
   "name": "behave_none_19",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21619,
   "name": "behave_none_20",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21620,
   "name": "behave_none_21",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21621,
   "name": "behave_none_22",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21622,
   "name": "drop_frames",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21646,
   "name": "behave_falling_object",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21705,
   "name": "saved_y_54c9",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21707,
   "name": "saved_x_54cb",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21753,
   "name": "behave_falling_burst",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21838,
   "name": "saved_y_554e",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21840,
   "name": "saved_x_5550",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21842,
   "name": "unused_key_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21855,
   "name": "banner_sprites",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 22084,
   "name": "banner_row",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 22121,
   "name": "banner_pointers",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 22128,
   "name": "banner_pointers_tail",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 22177,
   "name": "banner_flag",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22178,
   "name": "banner_timer",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22179,
   "name": "banner_done",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22180,
   "name": "banner_step_exit",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 22181,
   "name": "banner_step",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 22345,
   "name": "bar_masks",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22349,
   "name": "bar_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22413,
   "name": "bar_steps",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22414,
   "name": "draw_bar",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 22550,
   "name": "add_digits",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 22593,
   "name": "add_temp",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22594,
   "name": "draw_score",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 22613,
   "name": "draw_digit",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 22651,
   "name": "game_over_screen",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 22809,
   "name": "game_over_text",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22819,
   "name": "player_state",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22820,
   "name": "player_state_table",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22836,
   "name": "player_prev_x",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22837,
   "name": "player_prev_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22838,
   "name": "player_update",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 22873,
   "name": "patched_jsr_5959",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 22879,
   "name": "map_scratch_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22880,
   "name": "map_scratch_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22881,
   "name": "player_state_none",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 22882,
   "name": "anim_index",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22883,
   "name": "walk_frames_left",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22901,
   "name": "walk_frames_right",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22919,
   "name": "anim_toggle",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22920,
   "name": "walk_anim_left",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 22953,
   "name": "walk_anim_right",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 22986,
   "name": "facing",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22987,
   "name": "player_tile_column",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22988,
   "name": "punch_frames",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 23025,
   "name": "player_punch",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 23056,
   "name": "strike_frames",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 23093,
   "name": "strike_arc",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23119,
   "name": "player_strike",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 23356,
   "name": "strike_delay",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23357,
   "name": "strike_timer",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23358,
   "name": "crouch_flag",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23359,
   "name": "crouch_delay",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23360,
   "name": "punch_delay",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23361,
   "name": "jump_delay",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23362,
   "name": "player_climb",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 23487,
   "name": "player_crouch",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 23524,
   "name": "saved_y_5be4",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 23526,
   "name": "saved_x_5be6",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 23587,
   "name": "crouch_frames",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 23624,
   "name": "punch_timer",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23625,
   "name": "player_walk",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 23983,
   "name": "saved_y_5daf",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 23985,
   "name": "saved_x_5db1",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 24052,
   "name": "saved_y_5df4",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 24054,
   "name": "saved_x_5df6",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 24073,
   "name": "stand_frame",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 24092,
   "name": "player_fall",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 24264,
   "name": "fall_frame",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 24283,
   "name": "jump_arc",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24361,
   "name": "jump_index",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24362,
   "name": "draw_state_override",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24363,
   "name": "player_jump",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 24618,
   "name": "jump_frame",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 24637,
   "name": "climb_dir",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24638,
   "name": "climb_frames_up",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24650,
   "name": "climb_frames_down",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24662,
   "name": "climb_frame_up",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 24695,
   "name": "climb_frame_down",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 24728,
   "name": "clear_sprite_list",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 24775,
   "name": "sort_sprites",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 24861,
   "name": "player_frame",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24862,
   "name": "frame_sprite_2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24863,
   "name": "frame_sprite_0",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24864,
   "name": "frame_sprite_1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24865,
   "name": "player_draw",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 25020,
   "name": "object_damaged",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 25065,
   "name": "saved_x_61e9",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 25117,
   "name": "saved_x_621d",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 25119,
   "name": "finale_flag",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25120,
   "name": "ending_flag",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25121,
   "name": "finale_fall_timer",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25122,
   "name": "ending_delay",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25123,
   "name": "knocked_frames_0",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25153,
   "name": "follow_frames_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25183,
   "name": "knocked_frames_1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25201,
   "name": "behave_knocked_down",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 25282,
   "name": "revive_enemy",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 25341,
   "name": "select_screen",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 25363,
   "name": "irq_mid",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 25574,
   "name": "saved_a_63e6",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 25576,
   "name": "saved_x_63e8",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 25578,
   "name": "saved_y_63ea",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 25580,
   "name": "irq_counter",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25581,
   "name": "irq_toggle",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25582,
   "name": "irq_bottom",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 25667,
   "name": "saved_a_6443",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 25669,
   "name": "saved_x_6445",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 25671,
   "name": "saved_y_6447",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 25673,
   "name": "paused",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25674,
   "name": "attack_sprite_offset",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 25734,
   "name": "irq_top",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 25962,
   "name": "saved_a_656a",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 25964,
   "name": "saved_x_656c",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 25966,
   "name": "saved_y_656e",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 25968,
   "name": "delay",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 25977,
   "name": "cycle_out_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25978,
   "name": "cycle_table_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25986,
   "name": "cycle_table_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25994,
   "name": "unused_cycle_tick",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 26003,
   "name": "unused_cycle_step",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 26040,
   "name": "cycle_index",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26041,
   "name": "cycle_delay",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26042,
   "name": "cycle_out_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26043,
   "name": "cycle_out_c",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26044,
   "name": "cycle_table_c",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26052,
   "name": "random_byte",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 26069,
   "name": "patched_branch_65d5",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 26083,
   "name": "random_seed",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26084,
   "name": "disabled_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 26085,
   "name": "unused_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 26100,
   "name": "fill_screen",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 26118,
   "name": "fill_colour",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 26136,
   "name": "key_code",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26137,
   "name": "read_keys",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 26255,
   "name": "spare_668f",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26256,
   "name": "key_row_select",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26257,
   "name": "key_row",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26258,
   "name": "key_bits",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26259,
   "name": "key_table",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26323,
   "name": "multiplex_index",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26324,
   "name": "multiplex_limit",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26325,
   "name": "multiplex_sprites",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 26829,
   "name": "sprite_bit_masks",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26841,
   "name": "colour_pending",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26842,
   "name": "copy_colour_mid",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 27316,
   "name": "colour_copy_b",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 28263,
   "name": "colour_copy_b_part_2",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 28966,
   "name": "colour_buffer_dispatch",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 28977,
   "name": "fill_colour_top",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 29172,
   "name": "colour_buffer_mid",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 29252,
   "name": "colour_buffer",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 29531,
   "name": "spare_735b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 29652,
   "name": "wipe_lengths",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 29708,
   "name": "wipe_lengths_tail",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 29710,
   "name": "wipe_length_left",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 29711,
   "name": "wipe_line_start_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 29712,
   "name": "wipe_line_start_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 29713,
   "name": "wipe_flag",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 29714,
   "name": "spare_7412",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 29715,
   "name": "screen_wipe",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 29804,
   "name": "saved_x_746c",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 29806,
   "name": "saved_y_746e",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 29873,
   "name": "pause_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 29912,
   "name": "show_ending",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 29970,
   "name": "saved_y_7512",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 30059,
   "name": "ending_text",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 30186,
   "name": "ending_screen",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 30281,
   "name": "obj_init_type",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 30351,
   "name": "obj_init_counter",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 30421,
   "name": "obj_init_flag",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 30491,
   "name": "obj_init_energy",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 30561,
   "name": "obj_init_variant",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 30631,
   "name": "obj_init_flag_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 30701,
   "name": "obj_init_left_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 30771,
   "name": "obj_init_left_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 30841,
   "name": "obj_init_right_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 30911,
   "name": "obj_init_right_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 30981,
   "name": "obj_init_x_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 31051,
   "name": "obj_init_x_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 31121,
   "name": "obj_init_y_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 31191,
   "name": "obj_init_y_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 31261,
   "name": "load_objects",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 31388,
   "name": "player_map_lookup",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 31510,
   "name": "player_x",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 31511,
   "name": "player_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 31512,
   "name": "timer_digits",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 31513,
   "name": "timer_digit_tens",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 31514,
   "name": "timer_digit_hundreds",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 31515,
   "name": "draw_timer",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 31555,
   "name": "draw_timer_digit",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 31576,
   "name": "timer_phase",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 31577,
   "name": "timer_tick",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 31675,
   "name": "timer_expired",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 31692,
   "name": "timer_state",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 31693,
   "name": "timer_graphics_on",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 31798,
   "name": "timer_graphics_off",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 31903,
   "name": "timer_picture_off",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 32203,
   "name": "timer_picture_on",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 32503,
   "name": "map_row_pointers",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 32657,
   "name": "map_row_pointers_tail",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 32663,
   "name": "draw_first_screen",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 32790,
   "name": "tile_row",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 32791,
   "name": "first_row_chars",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 32829,
   "name": "first_row_tail",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 32831,
   "name": "draw_tile",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 32889,
   "name": "saved_x_8079",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 32891,
   "name": "saved_y_807b",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 32893,
   "name": "draw_tile_right_half",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 32939,
   "name": "saved_x_80ab",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 32941,
   "name": "saved_y_80ad",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 32943,
   "name": "blocked_left",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 33007,
   "name": "unreached_rts_80ef",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 33008,
   "name": "blocked_left_part_2",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 33048,
   "name": "blocked_right",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 33112,
   "name": "unreached_rts_8158",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 33113,
   "name": "blocked_right_part_2",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 33154,
   "name": "level_map",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 34178,
   "name": "level_map_part_2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 35202,
   "name": "level_map_part_3",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 36226,
   "name": "level_map_part_4",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 37250,
   "name": "level_map_part_5",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 37762,
   "name": "finale_sink",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 37807,
   "name": "finale_step",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 37912,
   "name": "draw_continue_text",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 37987,
   "name": "continue_count",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 37988,
   "name": "briefing_done",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 37989,
   "name": "continue_text",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 38012,
   "name": "credits_text",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 38035,
   "name": "continue_flag",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 38036,
   "name": "continue_screen",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 38200,
   "name": "text_shapes_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 38336,
   "name": "text_shapes_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 38472,
   "name": "spare_9648",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 38512,
   "name": "swap_shapes",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 38569,
   "name": "briefing_skip",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 38570,
   "name": "briefing_index",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 38571,
   "name": "show_briefing",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 38634,
   "name": "saved_y_96ea",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 38719,
   "name": "briefing_text",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 38899,
   "name": "briefing_last_break",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 38900,
   "name": "tile_top_chars",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39026,
   "name": "spare_9872",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39029,
   "name": "unused_continue_text",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39052,
   "name": "unused_credit_text",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39058,
   "name": "tile_bottom_chars",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39188,
   "name": "panel_chars",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39388,
   "name": "panel_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39588,
   "name": "leftover_keyboard_tail",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 48896,
   "name": "char_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 49152,
   "name": "shape_blank",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 49216,
   "name": "enemy_shapes_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 49976,
   "name": "char_shapes_text_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50112,
   "name": "char_shapes_text_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50248,
   "name": "char_shape_137",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50256,
   "name": "char_shapes_digits",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50336,
   "name": "enemy_shapes_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 51200,
   "name": "screen_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 52200,
   "name": "screen_a_tail",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 52216,
   "name": "sprite_pointers_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 52224,
   "name": "screen_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 53224,
   "name": "screen_b_tail",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 53240,
   "name": "sprite_pointers_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 53248,
   "name": "play_charset_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 54272,
   "name": "play_charset_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 55216,
   "name": "play_charset_blank",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 55296,
   "name": "unreferenced_shapes_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 55424,
   "name": "pickup_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 55552,
   "name": "burst_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 55744,
   "name": "map_shot_shape",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 55808,
   "name": "vpatrol_banner_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 55936,
   "name": "flash_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 56064,
   "name": "score_pickup_shape",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 56128,
   "name": "flash_hazard_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 56320,
   "name": "light_shape",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 56384,
   "name": "burst_shapes_late",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 56512,
   "name": "enemy_shot_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 56640,
   "name": "end_picture_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 56960,
   "name": "fall_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 57344,
   "name": "player_shapes_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 58368,
   "name": "player_shapes_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 58624,
   "name": "climb_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 58816,
   "name": "walk_right_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 59200,
   "name": "walk_left_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 59584,
   "name": "attack_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60608,
   "name": "attack_shapes_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 61568,
   "name": "shapes_unreferenced",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 61760,
   "name": "shapes_before_banner",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 62336,
   "name": "banner_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 63360,
   "name": "shape_blank_de",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 63424,
   "name": "panel_bitmap",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 63680,
   "name": "panel_picture_0",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 63728,
   "name": "panel_bitmap_1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 63960,
   "name": "timer_cells",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64000,
   "name": "panel_picture_1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64048,
   "name": "panel_bitmap_2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64088,
   "name": "score_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64144,
   "name": "panel_bitmap_3",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64200,
   "name": "bar_chars",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64264,
   "name": "panel_bitmap_4",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64320,
   "name": "panel_picture_2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64368,
   "name": "panel_bitmap_5",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64640,
   "name": "panel_picture_3",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64688,
   "name": "panel_bitmap_6",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64960,
   "name": "panel_picture_4",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 65008,
   "name": "panel_bitmap_7",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 65024,
   "name": "jump_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 65408,
   "name": "falling_object_shape",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 65472,
   "name": "spare_ffc0",
   "type": "Field",
   "kind": "user"
  }
 ],
 "comments": [
  {
   "address": 2592,
   "type": "line",
   "text": "Entry of the level 6 file. Jumps to the main loop at $1EFF, which runs the setup $51F7 and then repeats from $1F02: the disabled check $65E4, the object scan $0F69, the energy bar $578E, the check $1F63, the trigger $1F6A, the banner step $56A5, the score $5842, the timer $7BBB and $7B1B and the pause check $74B1. The loop starts again at $1EFF after the continue screen, and ends through the sound silence $B828 and a jump to the resident loader at $0404."
  },
  {
   "address": 2595,
   "type": "line",
   "text": "The NMI handler (the setup $51F7 points the NMI vector $FFFA/$FFFB here): saves A, sets the NMI flag $0A2B to 1, restores A and returns with RTI. The main loop reads the flag at $1F54."
  },
  {
   "address": 2603,
   "type": "line",
   "text": "Set to 1 by the NMI handler at $0A23; cleared by the setup $51F7 and read by the main loop at $1F54."
  },
  {
   "address": 2604,
   "type": "line",
   "text": "62 zero bytes between nmi_flag ($0A2B) and slot_frame ($0A6A) ($0A2C-$0A69), no reader."
  },
  {
   "address": 2666,
   "type": "line",
   "text": "Sprite pointer value of each slot, 14 bytes ($0A6A-$0A77); written by $1076 and $1DF5 and by the behaviours, and copied by $66D5 into the pointer tables."
  },
  {
   "address": 2680,
   "type": "line",
   "text": "Sprite colour of each slot, 14 bytes; written by $1DF5 and the behaviours and copied to $D02A-$D02E by $66D5."
  },
  {
   "address": 2694,
   "type": "line",
   "text": "1 when a slot's sprite is multicolour, 14 bytes; set by $1DF5 and the behaviours and copied into $D01C by $66D5."
  },
  {
   "address": 2708,
   "type": "line",
   "text": "Animation counter of each slot, 14 bytes; counted down by the behaviours $1524, $15C6, $16BA and $1BBE as their step or frame counter; cleared by $7A84."
  },
  {
   "address": 2722,
   "type": "line",
   "text": "Walk phase of each slot, 14 bytes, which picks the frame from the tables read by $1DF5; cleared by $1076 when it hits."
  },
  {
   "address": 2736,
   "type": "line",
   "text": "Walk counter of each slot, 14 bytes: the walking behaviours $185C and $1AA1 set it to half a random byte when it is zero and move the slot only while it is non-zero; nothing counts it down in the traced code. Cleared by $7A87."
  },
  {
   "address": 2750,
   "type": "line",
   "text": "Hurt timer of each slot, 14 bytes: set to 10 by $1076 and cleared by $7A8A."
  },
  {
   "address": 2764,
   "type": "line",
   "text": "State of each slot (14 bytes, of which the first 11 are used): 0 free, otherwise the type copied from $0B26 by $0F69; the state picks the behaviour in the table at $124F. $1076 sets 1 or 2 on a hit and $61BC sets $10; 7 is handled by $1DF5."
  },
  {
   "address": 2778,
   "type": "line",
   "text": "76 zero bytes between slot_state ($0ACC-$0AD9) and obj_type ($0B26) ($0ADA-$0B25), no reader."
  },
  {
   "address": 2854,
   "type": "line",
   "text": "Type and state of each of the 70 objects; 0 means no object, and the value is copied into the slot state $0ACC when the object takes a slot. Copied from $7649 by $7A1D; $61BC sets $10."
  },
  {
   "address": 2924,
   "type": "line",
   "text": "Counter of each object, used by the behaviours as a timer, step or saved state; copied from $768F by $7A1D, cleared by $1076 on a hit, and set by $61BC to the slot's old state (the entry after the object, $0B6D, is set to $FE)."
  },
  {
   "address": 2994,
   "type": "line",
   "text": "Flag of each object; copied from $76D5 by $7A1D and used by the behaviours."
  },
  {
   "address": 3064,
   "type": "line",
   "text": "Energy of each object (hits it can take), counted down by $61BC; copied from $771B by $7A1D."
  },
  {
   "address": 3134,
   "type": "line",
   "text": "Variant flag of each object, 0 or 1 (a second set of frames); copied from $7761 by $7A1D and read by $1076, $1DF5 and $61BC."
  },
  {
   "address": 3204,
   "type": "line",
   "text": "A second flag of each object; copied from $77A7 by $7A1D, and $1076 sets a non-zero one to 2 when the object is hit."
  },
  {
   "address": 3274,
   "type": "line",
   "text": "Left limit of the object's walk, low byte; copied from $77ED by $7A1D and read by $1076."
  },
  {
   "address": 3344,
   "type": "line",
   "text": "Left limit of the object's walk, high byte; copied from $7833."
  },
  {
   "address": 3414,
   "type": "line",
   "text": "Right limit of the object's walk, low byte; copied from $7879."
  },
  {
   "address": 3484,
   "type": "line",
   "text": "Right limit of the object's walk, high byte; copied from $78BF."
  },
  {
   "address": 3554,
   "type": "line",
   "text": "World X of each object, low byte; copied from $7905 and kept up to date by the behaviours and by $1076 (which also writes the entry after the hit object)."
  },
  {
   "address": 3624,
   "type": "line",
   "text": "World X of each object, high byte; copied from $794B."
  },
  {
   "address": 3694,
   "type": "line",
   "text": "World Y of each object, low byte; copied from $7991."
  },
  {
   "address": 3764,
   "type": "line",
   "text": "World Y of each object, high byte; copied from $79D7. $1F6A writes 3 into the entries of objects 41 to 44 and $93AF adds 1 to those of objects 52 and 53."
  },
  {
   "address": 3834,
   "type": "line",
   "text": "The object each of the slots holds (14 bytes), set by $0F69 and read by $11D8 and $1DF5."
  },
  {
   "address": 3848,
   "type": "line",
   "text": "The slot each object holds, for the 70 objects; set by $0F69 and cleared by $7A1D. $1DF5 reads it one entry back ($0F07,Y) for the slot of the previous object."
  },
  {
   "address": 3918,
   "type": "line",
   "text": "20 zero bytes between obj_slot ($0F08-$0F4D) and scan_dx_lo ($0F62) ($0F4E-$0F61), no reader."
  },
  {
   "address": 3938,
   "type": "line",
   "text": "Scratch of $0F69: the object's X minus the camera X, low byte."
  },
  {
   "address": 3939,
   "type": "line",
   "text": "Scratch of $0F69: the object's X minus the camera X, high byte."
  },
  {
   "address": 3940,
   "type": "line",
   "text": "Scratch of $0F69: the object's Y minus the camera Y, low byte."
  },
  {
   "address": 3941,
   "type": "line",
   "text": "Scratch of $0F69: the object's Y minus the camera Y, high byte."
  },
  {
   "address": 3942,
   "type": "line",
   "text": "Short hop for the object scan: the beq at $0F6E (an object of type 0) cannot reach the release code at $0FF7, so it lands here and jumps there. Reached only from scan_objects ($0F69)."
  },
  {
   "address": 3945,
   "type": "line",
   "text": "Scans the 70 objects, last to first (X from $45), against the camera ($CB/$CC across, $D9/$DA down). An object with type $0B26 of 0, or outside the window (from 26 pixels left of the camera to less than $015A right of it, and $14 to $D6 below the camera's top) is released: if it holds a slot, that slot's state $0ACC is cleared, its height $CD,X is set to $FE and the object's flag $101A is cleared. An object inside the window that has no slot takes the first free slot of the 11 ($0ACC zero), which gets the object's X and Y in $79/$B1 and $95/$CD and its state from the type, and $0EFA and $0F08 link slot and object; the whole scan ends if no slot is free. Called once per pass by the main loop at $1F05."
  },
  {
   "address": 4109,
   "type": "line",
   "text": "Holds the object index saved by $0FFC: the immediate operand of the LDX at $100C."
  },
  {
   "address": 4122,
   "type": "line",
   "text": "1 for each object that holds a slot, 70 bytes; set and cleared by $0F69 and cleared by $7A1D."
  },
  {
   "address": 4192,
   "type": "line",
   "text": "20 zero bytes between obj_active ($101A-$105F) and hit_flag_a ($1074) ($1060-$1073), no reader."
  },
  {
   "address": 4212,
   "type": "line",
   "text": "Set to 1 by $1076 when it lands a hit, which makes further calls of $1076 return at once; cleared by the player state routines."
  },
  {
   "address": 4213,
   "type": "line",
   "text": "Set to 1 by $1076 on a hit, with $1074; $61BC reads it to take 2 instead of 1 from the object's energy."
  },
  {
   "address": 4214,
   "type": "line",
   "text": "For slot X (object Y), tests whether the player's punch or strike hits it. It returns at once when a hit was already scored this frame ($1074 or $1075 set), when neither the punch timer $5C48 nor the strike timer $5B3D is running, or when the slot's state $0ACC is not 1, 2, 14 or 15; the slot's screen height $A3,X must be at most $17 lines above or 9 lines below the player's $7B17 and its screen X within 25 pixels in front of the player's $7B16, on the side given by the facing $59CA. On a hit it pushes the object 9 pixels along the map in that direction unless it is already at its limit ($0D56/$0D9C to the right, $0CCA/$0D10 to the left), copies the new X to the slot and to the next object too, sets the slot to state 1 (player facing right) or 2 (facing left) with a frame in $0A6A that depends on the variant $0C3E, starts the hurt timer $0ABE with 10, sets $1074 and $1075 and calls $61BC. Called by $11D8 for every slot that is not in state 7."
  },
  {
   "address": 4553,
   "type": "line",
   "text": "Number of state 7 slots queued in $11CA by $11D8."
  },
  {
   "address": 4554,
   "type": "line",
   "text": "List of the slots in state 7 found by $11D8 (ended by $FF), handled after the others by $1DF5."
  },
  {
   "address": 4566,
   "type": "line",
   "text": "2 zero bytes between slot_queue ($11CA-$11D5) and update_objects ($11D8) ($11D6-$11D7), no reader."
  },
  {
   "address": 4568,
   "type": "line",
   "text": "Per-frame object update, skipped while the game is paused ($6449). Goes through the 11 slots: a slot in state 7 is only queued in the list at $11CA (count in $11C9); for the others, while the raster is above line $B4, it runs the hit test $1076 and then the behaviour for the slot's state, through the table at $124F and a call whose operand is rewritten at $1223/$1224, with the slot's object in Y and in $124E. The list is ended with $FF and each queued slot then goes through $1DF5. Called by the top interrupt at $654F."
  },
  {
   "address": 4643,
   "type": "line",
   "text": "Low byte of the address in the JSR at $1222 (high byte at $1224), rewritten by $1216 and $121C with the behaviour for the slot's state from the table at $124F; the $2B67 the file holds is only a placeholder."
  },
  {
   "address": 4680,
   "type": "line",
   "text": "Holds the queue index saved by $1239: the immediate operand of the LDX at $1247."
  },
  {
   "address": 4686,
   "type": "line",
   "text": "The object of the slot being handled by $11D8 (the Y register for the hit test and the behaviours), kept here because the hit test and the behaviours change Y."
  },
  {
   "address": 4687,
   "type": "line",
   "text": "Table of 30 behaviour routines, one word each, indexed by the slot state in $0ACC: 0 $128B behave_free, 1 $185C behave_walk_left, 2 $1AA1 behave_walk_right, 3 $1BBE behave_energy_pickup, 4 $1C7C behave_score_pickup, 5 $1CBE behave_flash_frame, 6 $1CDE behave_lobbed_shot, 7 $1DF5 slot_follow, 8 $1E9F behave_none, 9 $16BA behave_flashing_hazard, 10 $1524 behave_vertical_patrol, 11 $15C6 behave_radial_shot, 12 $14FF behave_colour_6, 13 $150A behave_colour_1, 14 $196C behave_attack_right, 15 $1726 behave_attack_left, 16 $6271 behave_knocked_down, 17 $146C behave_enemy_shot, 18 to 22 $5471 to $5475 behave_none_18 to behave_none_22, 23 $548E behave_falling_object, 24 $54F9 behave_falling_burst, 25 $1416 behave_light_start, 26 $1439 behave_light_blink, 27 $13E5 behave_follow_object_y, 28 $13AF behave_map_switch, 29 $134B behave_drop_rise. $11D8 copies the word into the operand of the call at $1222."
  },
  {
   "address": 4747,
   "type": "line",
   "text": "Behaviour for state 0 (entry 0 of the table at $124F): a lone RTS, so a slot in state 0 does nothing."
  },
  {
   "address": 4748,
   "type": "line",
   "text": "95 pairs of bytes read by behaviour $134B, indexed by the object's counter $0B6C (steps of 2, up to $BC): the sprite pointer $0A6A and a signed number of lines added to the slot's Y. Pairs 0 to 6: pointer $6A, 0 lines; 7 to 10: $6A, 4 lines down; 11 to 18: $6A, 3; 19 to 26: $6A, 2; 27 to 34: $6A, 1; 35 to 93: $6B and $70 alternating every second pair, 1 line up; 94: $70, 5 lines up. The lines down and the lines up each add up to 64. The last byte ($134A, $FF) is not read."
  },
  {
   "address": 4939,
   "type": "line",
   "text": "Behaviour for state $1D (entry 29 of the table at $124F), the type of objects 58 to 63 of the table at $7649. Makes the slot multicolour ($0A86) with colour $0B ($0A78) and runs the contact test $53D7: on contact it calls $5449 to hurt the player. It then adds 2 to the object's counter $0B6C (back to 0 at $BE) and reads the pair of bytes at that index in $128C: the first is the sprite pointer $0A6A, the second a signed number of lines added to the slot's Y ($95/$CD) and written to the object ($0E6E/$0EB4). So over 95 frames it waits 7, drops 64 lines and rises the same 64 lines again."
  },
  {
   "address": 5038,
   "type": "line",
   "text": "Scratch of $134B: for a negative step of the table $128C, the step with its sign removed, which is then subtracted from the slot's Y ($95/$CD)."
  },
  {
   "address": 5039,
   "type": "line",
   "text": "Behaviour for state $1C (entry 28 of the table at $124F), the type of object 57 of the table at $7649. Makes the slot single-colour ($0A86 = 0) with colour 1 ($0A78). While the object's energy $0BF8 is non-zero it shows pointer 0 and returns. Otherwise it shows pointer $67 and runs the contact test $53D7: on contact it sets the object's energy to 1, calls $1EF2 with A=0 (which writes 0 into the four level map bytes that the setup $51F7 filled with 1), sets the banner flag $56A1 to 1 and the banner timer $56A2 to $C8, which starts the banner."
  },
  {
   "address": 5093,
   "type": "line",
   "text": "Behaviour for state $1B (entry 27 of the table at $124F), the type of objects 52 and 53 of the table at $7649, the two that $93AF moves down at the end of the level. Copies the object's Y ($0E6E/$0EB4) to the slot's Y ($95/$CD) and leaves the slot's X alone. Makes the slot multicolour with colour $0B and picks the pointer: for an object whose flag $0BB2 is zero $CB, or $CC once the finale flag $621F is set, and for one whose flag is non-zero $CD. Only the table at $124F reaches it: the RTS at $13E4 before it is the end of the previous routine."
  },
  {
   "address": 5142,
   "type": "line",
   "text": "Behaviour for state $19 (entry 25 of the table at $124F). While the flag $51F6 is zero it runs the contact test $53D7 and on contact sets the flag to 1; the LDA #$09 at $1427 is overwritten by the next instruction. The slot is always multicolour ($0A86) with colour 6 ($0A78) and pointer $70. No object in the table at $7649 has type $19."
  },
  {
   "address": 5177,
   "type": "line",
   "text": "Behaviour for state $1A (entry 26 of the table at $124F). Makes the slot single-colour with colour 1 and pointer $FC. While the flag $51F6 is non-zero it counts the slot's phase $0AA2 down from $0D to 0 (restarting at $0E) and takes pointer $FC for phases below 7 and $FD for 7 and up, so the shape changes every 7 frames. No object in the table at $7649 has type $1A."
  },
  {
   "address": 5228,
   "type": "line",
   "text": "Behaviour for state $11 (entry 17 of the table at $124F): the shot of a walking enemy, the object two entries after the one that fires it (objects 6, 9, 12, 19, 26 and 56 of the table at $7649). Makes the slot multicolour with colour $0B and pointer 0 (nothing to see). While the object's counter $0B6C is zero it only copies the X of the object two before it ($0DE0, $0E26) to this object and to the slot. The attacks $1726 and $196C set the counter to $32; the shot then counts it down, runs the contact test $53D7 (on contact it calls $5449 and clears the counter) and moves the slot 5 pixels a frame right with pointer $73, or left with pointer $74 when $0CCA of the object is non-zero (the attacks set $0CCC for it). It clears the counter when the slot has left the screen."
  },
  {
   "address": 5375,
   "type": "line",
   "text": "Behaviour for state 12 (entry 12 of the table at $124F): only makes the slot multicolour ($0A86) with colour 6 ($0A78); the pointer stays as it was. No object in the table at $7649 has type 12."
  },
  {
   "address": 5386,
   "type": "line",
   "text": "Behaviour for state 13 (entry 13 of the table at $124F): only makes the slot multicolour ($0A86) with colour 1 ($0A78); the pointer stays as it was. No object in the table at $7649 has type 13."
  },
  {
   "address": 5397,
   "type": "line",
   "text": "Sprite pointers of behaviour $1524: $68 seven times and $69 eight times, indexed by the slot's $0A94 (14 down to 0), so it shows $69 for eight steps and then $68 for seven."
  },
  {
   "address": 5412,
   "type": "line",
   "text": "Behaviour for state 10 (entry 10 of the table at $124F). Makes the slot multicolour with colour 0, counts its $0A94 down from 14 to 0 (a value of $0F or more, or 0, restarts at $0F) and takes the pointer from the table $1515 by it. It then moves the slot 2 lines a frame between two heights: with the object's counter $0B6C at 0 it goes up until its Y ($95/$CD) equals the pair $0CCA/$0D10 and sets the counter to 1; with the counter at 1 it goes down until Y equals $0D56/$0D9C and sets it to 0. The new Y is written to $0E6E/$0EB4. There is no contact test. No object in the table at $7649 has type 10."
  },
  {
   "address": 5452,
   "type": "line",
   "text": "Holds the Y register saved by $1541: the immediate operand of the LDY at $154B, which gives Y back after the table lookup."
  },
  {
   "address": 5538,
   "type": "line",
   "text": "The eight steps of behaviour $15C6, 4 bytes each (X change low and high, Y change low and high, 16-bit and signed), chosen by the slot's $0A94: up (0,-4), up and right (4,-4), right (4,0), down and right (4,4), down (0,4), down and left (-4,4), left (-4,0), up and left (-4,-4)."
  },
  {
   "address": 5570,
   "type": "line",
   "text": "The step that $15C6 has chosen, copied from $15A2: X change low and high, Y change low and high, added to the slot's X ($79/$B1) and Y ($95/$CD)."
  },
  {
   "address": 5574,
   "type": "line",
   "text": "Behaviour for state 11 (entry 11 of the table at $124F). Makes the slot multicolour with colour $0B and pointer $67 and runs the contact test $53D7: on contact it calls $5449 and restarts at $1635. Otherwise, while the object's counter $0B6C is non-zero, it counts it down and adds one of eight steps to the slot's position (the table $15A2, chosen by the slot's $0A94, copied to $15C2-$15C5). At $1635 it sets the counter to $1E, steps $0A94 on (0 to 7) and puts the slot at the position of the object before this one ($0DE1, $0E27, $0E6D, $0EB3). So it starts from the object before it every 30 frames and flies 4 pixels a frame in the next of eight directions. No object in the table at $7649 has type 11."
  },
  {
   "address": 5653,
   "type": "line",
   "text": "Holds the Y register saved by $15ED: the immediate operand of the LDY at $1614, which gives Y back after the table lookup."
  },
  {
   "address": 5726,
   "type": "line",
   "text": "The 90 sprite pointers of the flashing hazard of behaviour $16BA, indexed by the slot's counter $0A94: $6F ten times, $6E ten times, $6D sixteen times, $6E three times and $6F three times (42 steps with a picture), then 48 zeros for which the behaviour skips the contact test. The two zero bytes after it ($16B8-$16B9) are not read."
  },
  {
   "address": 5816,
   "type": "line",
   "text": "2 zero bytes between flash_frames ($165E-$16B7) and behave_flashing_hazard ($16BA) ($16B8-$16B9), no reader."
  },
  {
   "address": 5818,
   "type": "line",
   "text": "Behaviour for state 9 (entry 9 of the table at $124F), the type of objects 47, 50 and 64 of the table at $7649. Makes the slot multicolour ($0A86) with colour $0B ($0A78), counts its counter $0A94 down from $59 to 0 (a value of $5A or more, or 0, restarts it at $59) and takes the sprite pointer $0A6A from the table $165E by that counter, so the hazard shows for 42 of every 90 steps. When the pointer is not zero it runs the contact test $53D7, and when that returns non-zero it calls $5449 to hurt the player. It does not move the slot."
  },
  {
   "address": 5858,
   "type": "line",
   "text": "Holds the Y register saved by $16D7: the immediate operand of the LDY at $16E1, which gives Y back after the table lookup."
  },
  {
   "address": 5875,
   "type": "line",
   "text": "Returns A=1 when slot X is at or to the right of the player on the screen (its screen X high byte $BF,X is non-zero, or its screen X $87,X is not below the player's $7B16) and A=0 when it is to the left. Called by the walking behaviours $185C and $1AA1 (at $1921 and $1B65)."
  },
  {
   "address": 5892,
   "type": "line",
   "text": "Returns A=0 when slot X is about level with the player and A=1 when it is not: the slot's screen height $A3,X is compared with the player's $7B17, and the answer is 0 when they are equal, when the slot is less than 10 lines above the player and when it is less than $1C lines below him. Called by the walking and attack behaviours ($17B0, $1891, $19F6 and $1AD6)."
  },
  {
   "address": 5925,
   "type": "line",
   "text": "Hit recoil counter, counted down by $6313; while it is running (and $5447 is zero) the joystick bytes $1FA4/$1FA5 are not refreshed, so the direction that an attack forced stays. $5449 sets it to 3; irq_top keeps the player's sprites 0 and 1 white while it is non-zero."
  },
  {
   "address": 5926,
   "type": "line",
   "text": "Behaviour for state 15 (entry 15 of the table at $124F): the attack of a walking enemy that faces left, entered from $185C with the object's counter $0B6C at $19. Calls $9382 first and makes the slot multicolour. By the variant $0C3E it writes the frames and distances into six operands of its own code ($1788, $1790, $179F, $17A7, $1803, $1817; variant 1 in brackets). At counter 0 it returns to state 1. Counting down: at 4 frame 5 ($14) and 8 (6) pixels right; at $0E frame 7 ($17) and 6 (0) pixels left, and if the player is level ($1704) and up to 27 pixels left of the slot it forces the joystick left ($1FA4), sets the recoil $1725 to 4 and calls $5456; if the object's flag $0BB2 is set it clears it and starts the shot two objects on (counter $32, X of the slot, direction $0CCC set to 1); at $12 it moves 2 (6) pixels left and sets the phase $0AA2 to 2; at $18 it takes frame 5 ($14)."
  },
  {
   "address": 6024,
   "type": "line",
   "text": "Frame (sprite pointer) that $1726 gives the slot when its counter reaches 4: the operand of the LDA at $1787, set to 5 or, for variant 1, $14 at $1756 and $1735."
  },
  {
   "address": 6032,
   "type": "line",
   "text": "Distance in pixels that $1726 moves the slot right when its counter reaches 4: the operand of the ADC at $178F, set to 8 or, for variant 1, 6 at $175B and $173A."
  },
  {
   "address": 6047,
   "type": "line",
   "text": "Frame (sprite pointer) that $1726 gives the slot when its counter reaches $0E: the operand of the LDA at $179E, set to 7 or, for variant 1, $17 at $1760 and $173F."
  },
  {
   "address": 6055,
   "type": "line",
   "text": "Distance in pixels that $1726 moves the slot left when its counter reaches $0E: the operand of the SBC at $17A6, set to 6 or, for variant 1, 0 at $1765 and $1744."
  },
  {
   "address": 6147,
   "type": "line",
   "text": "Distance in pixels that $1726 moves the slot left when its counter reaches $12: the operand of the SBC at $1802, set to 2 or, for variant 1, 6 at $176A and $1749."
  },
  {
   "address": 6167,
   "type": "line",
   "text": "Frame (sprite pointer) that $1726 gives the slot when its counter reaches $18: the operand of the LDA at $1816, set to 5 or, for variant 1, $14 at $176F and $174E."
  },
  {
   "address": 6172,
   "type": "line",
   "text": "Sprite pointers of the walk to the left for variant 0: $05 eight times, $06 eight times, and the same again, indexed by the phase $0AA2 (0 to $1F); read by behaviour $185C."
  },
  {
   "address": 6204,
   "type": "line",
   "text": "Sprite pointers of the walk to the left for variant 1: $14 eight times, $15 eight times, and the same again, indexed by the phase $0AA2 (0 to $1F); read by behaviour $185C."
  },
  {
   "address": 6236,
   "type": "line",
   "text": "Behaviour for state 1 (entry 1 of the table at $124F): an enemy walking left. Calls $9382 first; the slot is multicolour with colour 9. When the object's second flag $0C84 is neither 0 nor 2 it only shows the standing frame $05 ($14 for variant $0C3E non-zero) and returns. Otherwise, with $0A10 zero and the player level ($1704) and up to 26 pixels left of the slot, it starts the attack: state 15, counter $0B6C $19. While the hurt timer $0ABE runs it only counts it down. If the object two on has type $11 and a zero counter ($0B6E), the slot is on screen at a height of $64 to $BD and a random byte ($65C4) is below $14, it sets the flag $0BB2 and attacks too. At its left limit ($0CCA/$0D10) it turns to state 2. When the walk counter $0AB0 is zero it takes half a random byte and turns when the slot is left of the player ($16F3); otherwise it moves 1 pixel left (X $79/$B1, also written to this object and the next) and steps the phase $0AA2 through 0 to $1F for the frame from $181C (variant 0) or $183C."
  },
  {
   "address": 6508,
   "type": "line",
   "text": "Behaviour for state 14 (entry 14 of the table at $124F): the attack of a walking enemy that faces right, entered from $1AA1 with the object's counter $0B6C at $19. The same as $1726 the other way round: it calls $9382 first, writes frames and distances into six operands of its own code ($19CE, $19D6, $19E5, $19ED, $1A48, $1A5C; variant 1 in brackets) and at counter 0 returns to state 2. At 4 frame 2 ($10) and 8 (6) pixels left; at $0E frame 4 ($13) and 6 (0) pixels right, and if the player is level and up to 27 pixels right of the slot it forces the joystick right ($1FA4), sets the recoil $1725 to 4 and calls $5456; a set flag $0BB2 starts the shot two objects on with direction 0; at $12 it moves 2 (6) pixels right and sets the phase $0AA2 to 2; at $18 it takes frame 2 ($10)."
  },
  {
   "address": 6606,
   "type": "line",
   "text": "Frame (sprite pointer) that $196C gives the slot when its counter reaches 4: the operand of the LDA at $19CD, set to 2 or, for variant 1, $10 at $199C and $197B."
  },
  {
   "address": 6614,
   "type": "line",
   "text": "Distance in pixels that $196C moves the slot left when its counter reaches 4: the operand of the SBC at $19D5, set to 8 or, for variant 1, 6 at $19A1 and $1980."
  },
  {
   "address": 6629,
   "type": "line",
   "text": "Frame (sprite pointer) that $196C gives the slot when its counter reaches $0E: the operand of the LDA at $19E4, set to 4 or, for variant 1, $13 at $19A6 and $1985."
  },
  {
   "address": 6637,
   "type": "line",
   "text": "Distance in pixels that $196C moves the slot right when its counter reaches $0E: the operand of the ADC at $19EC, set to 6 or, for variant 1, 0 at $19AB and $198A."
  },
  {
   "address": 6728,
   "type": "line",
   "text": "Distance in pixels that $196C moves the slot right when its counter reaches $12: the operand of the ADC at $1A47, set to 2 or, for variant 1, 6 at $19B0 and $198F."
  },
  {
   "address": 6748,
   "type": "line",
   "text": "Frame (sprite pointer) that $196C gives the slot when its counter reaches $18: the operand of the LDA at $1A5B, set to 2 or, for variant 1, $10 at $19B5 and $1994."
  },
  {
   "address": 6753,
   "type": "line",
   "text": "Sprite pointers of the walk to the right for variant 0: $02 eight times, $03 eight times, and the same again, indexed by the phase $0AA2 (0 to $1F); read by behaviour $1AA1."
  },
  {
   "address": 6785,
   "type": "line",
   "text": "Sprite pointers of the walk to the right for variant 1: $10 eight times, $11 eight times, and the same again, indexed by the phase $0AA2 (0 to $1F); read by behaviour $1AA1."
  },
  {
   "address": 6817,
   "type": "line",
   "text": "Behaviour for state 2 (entry 2 of the table at $124F): an enemy walking right, the mirror of $185C. Calls $9382 first and makes the slot multicolour with colour 9; with the object's second flag $0C84 neither 0 nor 2 it only shows the standing frame $02 ($10 for variant 1). With $0A10 zero and the player level ($1704) and up to 26 pixels right of the slot it starts the attack: state 14 with the counter $0B6C at $19; the same random shot test as $185C can start it too. At its right limit ($0D56/$0D9C) it turns to state 1. When the walk counter $0AB0 is zero it takes half a random byte and turns when the slot is right of the player ($16F3); otherwise it moves 1 pixel right and steps the phase $0AA2 through 0 to $1F, taking the frame from $1A61 (variant 0) or $1A81."
  },
  {
   "address": 7088,
   "type": "line",
   "text": "Sprite pointers of behaviour $1BBE: $62 seven times and $63 seven times, indexed by the slot's $0A94 (11 down to 0); the last two bytes are never read."
  },
  {
   "address": 7102,
   "type": "line",
   "text": "Behaviour for state 3 (entry 3 of the table at $124F): a pickup that gives energy (object 69 of the table at $7649). Makes the slot multicolour with colour 2. When the object's energy $0BF8 is non-zero (taken) the pointer is 0 and nothing else happens. Otherwise the pointer comes from $1BB0 by the slot's $0A94 (11 down to 0) and the slot bobs: the object's counter $0B6C steps by 2 round the 24 heights of $1C4C, which are added to the slot's Y and written to $0E6E/$0EB4. On contact ($53D7) it sets the object's energy to 1, adds $0A to the player's energy $5448 (at most $21) and plays sound effect $10 through $B0EE."
  },
  {
   "address": 7158,
   "type": "line",
   "text": "Holds the Y register saved by $1BEB: the immediate operand of the LDY at $1BF5, which gives Y back after the table lookup."
  },
  {
   "address": 7240,
   "type": "line",
   "text": "Holds the Y register saved by $1C3F: the immediate operand of the LDY at $1C47."
  },
  {
   "address": 7242,
   "type": "line",
   "text": "Holds the X register saved by $1C3C: the immediate operand of the LDX at $1C49."
  },
  {
   "address": 7244,
   "type": "line",
   "text": "The 24 heights of the bobbing of behaviour $1BBE, signed 16-bit values added to the slot's Y each frame, chosen by the object's counter $0B6C (steps of 2): 0, 0, -1, -1, -2, -2, -3, -3, -2, -2, -1, -1 and the same with the opposite signs, so the pickup rises 18 lines and comes back."
  },
  {
   "address": 7292,
   "type": "line",
   "text": "Behaviour for state 4 (entry 4 of the table at $124F): a pickup that gives points (objects 65 to 68 of the table at $7649). Makes the slot multicolour with colour 3. When the object's energy $0BF8 is non-zero (taken) the pointer is 0; otherwise it is $6C and the contact test $53D7 runs: on contact the object's energy becomes 1, 5 is added to score digit 4 through $5816 (500 points, going by the digit positions described there) and sound effect $0C plays through $B0EE."
  },
  {
   "address": 7341,
   "type": "line",
   "text": "Holds the X register saved by $1CA2: the immediate operand of the LDX at $1CAC."
  },
  {
   "address": 7354,
   "type": "line",
   "text": "Holds the Y register saved by $1CB1: the immediate operand of the LDY at $1CB9."
  },
  {
   "address": 7356,
   "type": "line",
   "text": "Holds the X register saved by $1CAE: the immediate operand of the LDX at $1CBB."
  },
  {
   "address": 7358,
   "type": "line",
   "text": "Behaviour for state 5 (entry 5 of the table at $124F). Makes the slot multicolour with colour 9; while the object's counter $0B6C is non-zero it counts it down and shows pointer $6B, otherwise pointer $6A. This routine never sets the counter; in the object list the type 5 object stands directly before the type 6 object, whose behaviour $1CDE sets the counter of the object before it to 7 when it restarts. No object in the table at $7649 has type 5 or 6."
  },
  {
   "address": 7390,
   "type": "line",
   "text": "Behaviour for state 6 (entry 6 of the table at $124F). Makes the slot multicolour and runs the contact test $53D7: on contact it calls $5449 and restarts at $1D54. Otherwise colour 2 and pointer $67; the object's counter $0B6C, stepped each frame, runs through the table $1D89: from 4 to $33 the slot moves 4 pixels left, and each table value of $5A or more is a sprite pointer while a smaller one is added to the slot's Y (written to the object too). At $6A, or on contact, $1D54 clears the counter, sets the counter of the object before it ($0B6B) to 7, and puts the slot and the object $16 pixels left of and 1 line above that object."
  },
  {
   "address": 7561,
   "type": "line",
   "text": "106 bytes read by behaviour $1CDE, indexed by its counter $0B6C after the step, and by $54F9 from $1DBD. A value of $5A or more is a sprite pointer, a smaller one a number of lines added to the slot's Y. Indexes 0 to 3: pointers $7B, $7C, $7B, $7C; 4 to 13: 0; 14 to 51: 0 to 5 lines, growing; 52 to 105: the burst frames $72 (6), $71 (6), $64 (5), $65 (5), $66 (5), $64 (5), $65 (5), $66 (5), $71 (6), $72 (6)."
  },
  {
   "address": 7667,
   "type": "line",
   "text": "The frame limit that $1DF5 compares the previous slot's frame with: 5, or $14 for variant $0C3E non-zero."
  },
  {
   "address": 7668,
   "type": "line",
   "text": "1 zero byte between follow_limit ($1DF3) and slot_follow ($1DF5) ($1DF4), no reader."
  },
  {
   "address": 7669,
   "type": "line",
   "text": "Behaviour for a slot in state 7 (entry 7 of the table at $124F), run by $11D8 after the other slots with the slot in X and its object in Y. Makes the slot multicolour ($0A86) with colour 9 ($0A78) and copies the object's position ($0DE2/$0E28 across, $0E6E/$0EB4 down) to the slot ($79/$B1, $95/$CD). It then picks the sprite pointer $0A6A from the slot of the previous object ($0F07,Y): from the table at $6241 by that slot's phase $0AA2 when it is in state $10, otherwise from $1E7F when its frame is below the limit in $1DF3 (5, or $14 for variant $0C3E non-zero) and from $1E5F when not. Probably the lower sprite of a two-sprite enemy that follows the upper one."
  },
  {
   "address": 7775,
   "type": "line",
   "text": "Sprite pointers $0C, $0D, $0E and $0F, eight each, indexed by the phase $0AA2 of the previous slot: the frame $1DF5 gives a state 7 slot when the previous slot's frame is at or above the limit $1DF3."
  },
  {
   "address": 7807,
   "type": "line",
   "text": "Sprite pointers $08, $09, $0A and $0B, eight each, indexed by the phase $0AA2 of the previous slot: the frame $1DF5 gives a state 7 slot when the previous slot's frame is below the limit $1DF3."
  },
  {
   "address": 7839,
   "type": "line",
   "text": "Behaviour for state 8 (entry 8 of the table at $124F): a lone RTS, so a slot in state 8 does nothing. No object in the table at $7649 has type 8."
  },
  {
   "address": 7840,
   "type": "line",
   "text": "Low byte of the 16-bit sum camera X ($CB/$CC) minus $86 plus the player's screen X ($7B16), stored by the code at $7A9C; read by the trigger $1F6A and the finale step $93AF."
  },
  {
   "address": 7841,
   "type": "line",
   "text": "High byte of the 16-bit map position whose low byte is $1EA0; read by $1F6A and $93AF."
  },
  {
   "address": 7842,
   "type": "line",
   "text": "Shapes of the digits 0 to 9, 8 bytes each; $5855 and $7B43 copy them to the panel, and $9670 swaps them with the block at $C450."
  },
  {
   "address": 7922,
   "type": "line",
   "text": "Writes A into four bytes of the level map, at $852F, $856F, $85AF and $85EF (64 bytes apart). Called by the setup $51F7 at $530A with A=1 and by the behaviour $13AF at $13D7 with A=0."
  },
  {
   "address": 7935,
   "type": "line",
   "text": "The level's main loop. It runs the setup $51F7, then from $1F02 on every pass the disabled check $65E4, the object scan $0F69, the energy bar $578E, the check $1F63, the trigger $1F6A, the banner step $56A5, the score $5842, the timer $7BBB and $7B1B and the pause check $74B1. It then shows the ending screen $75EA and leaves when the ending flag $6220 is set, or when $0A11 is set and the key code $6618 is $20; when the energy $5448 is zero (and $0A11 is clear) it shows the game over screen $587B and, when $0A12 (the credits) is not zero, the continue screen $9494, which sends the loop back to $1EFF if fire was pressed ($9493); and when the NMI flag $0A2B is set it shows the game over screen and leaves. It leaves through SEI, the sound silence $B828 and a jump to the resident loader at $0404."
  },
  {
   "address": 8035,
   "type": "line",
   "text": "Reads the energy $5448 and then branches to the next instruction whichever way it comes out ($1F66 is a bne to $1F68), and returns, so it has no effect. Called by the main loop at $1F0B."
  },
  {
   "address": 8041,
   "type": "line",
   "text": "Set to 1 by $1F6A when it has fired, so that it runs only once; cleared by the setup $51F7."
  },
  {
   "address": 8042,
   "type": "line",
   "text": "Runs once (flag $1F69): when the player's map position $1EA1/$1EA0 is below $010A and the camera height $DA/$D9 is below $0113, it sets $1F69 to 1 and writes 3 into the high Y byte ($0EDD to $0EE0) of objects 41 to 44. Returns at once otherwise. Called by the main loop at $1F0E."
  },
  {
   "address": 8097,
   "type": "line",
   "text": "Horizontal fine scroll (6 at the start), ORed into the low bits of $D016 by the top interrupt $6486."
  },
  {
   "address": 8098,
   "type": "line",
   "text": "Vertical fine scroll (6 at the start), ORed into $D011 by the top interrupt $6486."
  },
  {
   "address": 8099,
   "type": "line",
   "text": "1 zero byte between scroll_y_fine ($1FA2) and joystick ($1FA4) ($1FA3), no reader."
  },
  {
   "address": 8100,
   "type": "line",
   "text": "Joystick port 2 ($DC00) as last read by $6313; bit 0 up, 1 down, 2 left, 3 right, 4 fire, clear when pressed. $FF at the start; $93AF overwrites it with $F7 or $FF during the finale."
  },
  {
   "address": 8101,
   "type": "line",
   "text": "CIA 1 port B ($DC01) as last read by $6313."
  },
  {
   "address": 8102,
   "type": "line",
   "text": "Cleared by the setup $51F7 ($5293); nothing in the traced code reads it."
  },
  {
   "address": 8103,
   "type": "line",
   "text": "Which of the two screen matrices is on show: 0 selects $CC00 and 1 selects $C800 (through $62FD); the scroll routines build the other one and flip this at the end. Cleared by the setup."
  },
  {
   "address": 8104,
   "type": "line",
   "text": "The camera height low byte ($D9) as scroll_step ($1FAC) saved it at $1FB4."
  },
  {
   "address": 8105,
   "type": "line",
   "text": "The camera height high byte ($DA) as scroll_step ($1FAC) saved it at $1FB9."
  },
  {
   "address": 8106,
   "type": "line",
   "text": "The camera X low byte ($CB) as scroll_step ($1FAC) saved it at $1FBE."
  },
  {
   "address": 8107,
   "type": "line",
   "text": "The camera X high byte ($CC) as scroll_step ($1FAC) saved it at $1FC3."
  },
  {
   "address": 8108,
   "type": "line",
   "text": "Called by the bottom interrupt $63EE unless the banner flag $56A1 is set. While the game is paused ($6449) it only reads the keyboard through $6619 into $6618. Otherwise it saves the camera ($CB/$CC across, $D9/$DA down) in $1FAA/$1FAB and $1FA8/$1FA9 and the player's screen position in $5934/$5935, then either goes on with the scroll in $206E for the steps left in $206F, or picks a new direction from the player's screen position: right at X $DC or more, left below $64, up above Y $41 and down at $87 or more (corners combine them), stores it in $206E, sets $206F to $0B and clears $2070 and $2EC4. The scroll routine for the direction comes from the table at $2075 through a call whose operand is rewritten at $2064/$2065; a frame with no scroll to make reads the keyboard instead."
  },
  {
   "address": 8292,
   "type": "line",
   "text": "Low byte of the address in the JSR at $2063 (high byte at $2065), rewritten by $205A and $2060 with the scroll routine for the direction from the table at $2075."
  },
  {
   "address": 8302,
   "type": "line",
   "text": "Scroll direction chosen by $1FAC (0 none, 1 down, 2 up, 4 right, 5 right and down, 6 right and up, 8 left, 9 left and down, 10 left and up)."
  },
  {
   "address": 8303,
   "type": "line",
   "text": "Frames of scrolling still to run for the direction in $206E; set to $0B when a scroll starts and counted down by $1FAC. Cleared by the setup."
  },
  {
   "address": 8304,
   "type": "line",
   "text": "Phase 0 to 3 of the scroll step, advanced by $1FAC each frame; picks which part of the screen shift the scroll routines do."
  },
  {
   "address": 8305,
   "type": "line",
   "text": "2 zero bytes between scroll_phase ($2070) and scroll_spare_a ($2073) ($2071-$2072), no reader."
  },
  {
   "address": 8307,
   "type": "line",
   "text": "Cleared by the setup $51F7 ($52D2 and $539E); nothing in the traced code reads it."
  },
  {
   "address": 8308,
   "type": "line",
   "text": "Cleared by the setup $51F7 after scroll_spare_a ($2073); nothing in the traced code reads it."
  },
  {
   "address": 8309,
   "type": "line",
   "text": "Table of 16 routine addresses indexed by the scroll direction in $206E times 2: 1 down $2626 (scroll_down), 2 up $29BF (scroll_up), 4 right $20C8 (scroll_right), 5 right and down $323C (scroll_right_down), 6 right and up $2D14 (scroll_right_up), 8 left $341E (scroll_left), 9 left and down $308C (scroll_left_down), 10 left and up $2EC5 (scroll_left_up); the other entries point at an RTS ($2095, scroll_none). $1FAC copies the word into the operand of the call at $2063."
  },
  {
   "address": 8341,
   "type": "line",
   "text": "A lone RTS: the routine that the entries of the scroll table at $2075 for the directions without a scroll (0, 3, 7 and the unused ones) point at."
  },
  {
   "address": 8342,
   "type": "line",
   "text": "The fine horizontal scroll values for the four phases of a scroll to the right: 4, 2, 0, 6 (read by $209A)."
  },
  {
   "address": 8346,
   "type": "line",
   "text": "Sets the fine horizontal scroll $1FA1 from the table at $2096 (4, 2, 0, 6) for the phase in $2070 and returns the phase in Y. When $1FA1 already holds that value, or when 10 or more steps are left ($206F) and $1FA1 is 0, it restores the camera X ($CB/$CC) from $1FAA/$1FAB and the player's X $7B16 from $5934 instead, so that step does not move the view. Called by $20C8, $2D14 and $326B."
  },
  {
   "address": 8392,
   "type": "line",
   "text": "Scroll direction 4, view to the right (entry 4 of the table at $2075). Moves the camera X ($CB/$CC) on 2 and the player's screen X $7B16 back 2, takes the fine scroll from $209A and runs the work of the phase it returns: phase 0 shifts the left columns of the screen one character left ($2117), 1 shifts the rest and draws the new right column ($2132), 2 builds the colours ($20FD), 3 copies the colours to colour RAM and flips the buffers ($2108)."
  },
  {
   "address": 8445,
   "type": "line",
   "text": "Phase 2 of a scroll to the right: jumps to $459E when the buffer flag $1FA7 is 0 and to $3946 when it is 1. Both build the colour buffer from $71F4 (screen rows 10 to 18) from the matrix just made (from $C990 or $CD90 on) through the character colours at $BF00, and return to the caller of $20FD. Called from $20F5."
  },
  {
   "address": 8456,
   "type": "line",
   "text": "Phase 3 of a scroll to the right: $7131 fills colour RAM for screen rows 0 to 9 from the matrix just made, $68DA copies the buffer's rows 10 to 12 to colour RAM from $D990 and sets $68D9 so that the interrupt copies rows 13 to 18 ($6AB4), then the buffer flag $1FA7 is flipped so that the new matrix is shown. Called from $20F9."
  },
  {
   "address": 8471,
   "type": "line",
   "text": "Phase 0 of a scroll to the right: shifts columns 0 to $13 of the screen one character left into the other matrix, with $2153 (into $C800) when the buffer flag $1FA7 is 0 and $21CB (into $CC00) when it is 1. It first stores the loop limit $14 in the operand $21C7 or $223F. Called from $20E5."
  },
  {
   "address": 8498,
   "type": "line",
   "text": "Phase 1 of a scroll to the right: shifts columns $14 to $25 one character left into the other matrix ($2153 for $C800 when $1FA7 is 0, $21CB for $CC00 when it is 1, with the loop limit $26 stored in $21C7 or $223F) and then draws the new right column with $2243. Called from $20ED."
  },
  {
   "address": 8531,
   "type": "line",
   "text": "Copies the matrix at $CC00 one character to the left into $C800, 19 rows of 40, for the columns from Y up to the limit in the operand at $21C7: each pass copies column Y+1 of every row to column Y. Called from $2123 and $213E."
  },
  {
   "address": 8647,
   "type": "line",
   "text": "The loop limit of $2153: the operand of the CPY at $21C6 (the file holds $26). $2117 stores $14 here and $2132 stores $26."
  },
  {
   "address": 8651,
   "type": "line",
   "text": "Copies the matrix at $C800 one character to the left into $CC00, 19 rows of 40, for the columns from Y up to the limit in the operand at $223F. Called from $212E and $214C."
  },
  {
   "address": 8767,
   "type": "line",
   "text": "The loop limit of $21CB: the operand of the CPY at $223E (the file holds $26). $2117 stores $14 here and $2132 stores $26."
  },
  {
   "address": 8771,
   "type": "line",
   "text": "Draws the new right-hand column (column $26, 19 rows) of the matrix that is being made ($C800 when $1FA7 is 0, otherwise $CC00) from the level map. It reads 10 tiles down from the map pointer $A1/$A2 plus 20 columns, each as a two by two block through the tables $97F4 (top row) and $9892 (bottom row), taking the left or right character by the half-column flag $AF; when the half-row flag $BD is non-zero it starts with the bottom row of the first tile. Unless $2EC4 is set it then steps $AF on, adding 1 to the map pointer when it wraps. Called from $2141, $214F, $2DAE, $2DD0 and others."
  },
  {
   "address": 9691,
   "type": "line",
   "text": "Steps the half-column flag $AF on by one and, when it reaches 2, sets it to 0 and adds 1 to the map pointer $A1/$A2 (one tile to the right). Called by the diagonal scrolls to the right ($2DB1, $2DD3, $32D9, $32FB)."
  },
  {
   "address": 9716,
   "type": "line",
   "text": "The fine vertical scroll values for the four phases of a scroll downwards: 4, 2, 0, 6 (read by $25F8)."
  },
  {
   "address": 9720,
   "type": "line",
   "text": "Sets the fine vertical scroll $1FA2 from the table at $25F4 (4, 2, 0, 6) for the phase in $2070 and returns the phase in Y. When $1FA2 already holds that value, or when 10 or more steps are left ($206F) and $1FA2 is 0, it restores the camera Y ($D9/$DA) from $1FA8/$1FA9 and the player's Y $7B17 from $5935 instead. Called by $2626 and the diagonal scrolls that move down ($30B8, $3268)."
  },
  {
   "address": 9766,
   "type": "line",
   "text": "Scroll direction 1, view downwards (entry 1 of the table at $2075). Moves the camera Y ($D9/$DA) on 2 and the player's screen Y $7B17 back 2, takes the fine scroll from $25F8 and runs the phase's work: 0 shifts columns 0 to $10 up a row and draws the new bottom row ($2691), 1 shifts columns $11 to $26 ($2676), 2 builds the colours ($265C), 3 copies the colours and flips the buffers ($2667)."
  },
  {
   "address": 9820,
   "type": "line",
   "text": "Phase 2 of a scroll downwards: jumps to $459E when the buffer flag $1FA7 is 0 and to $3946 when it is 1, which build the colour buffer from $71F4 from the matrix just made (the same as $20FD). Called from $2654."
  },
  {
   "address": 9831,
   "type": "line",
   "text": "Phase 3 of a scroll downwards: fills colour RAM rows 0 to 9 ($7131), copies rows 10 to 12 of the colour buffer and asks the interrupt for rows 13 to 18 ($68DA), then flips the buffer flag $1FA7 (the same as $2108). Called from $2658."
  },
  {
   "address": 9846,
   "type": "line",
   "text": "Phase 1 of a scroll downwards: shifts columns $26 down to $11 of the screen up one row into the other matrix, with $26B2 (into $C800) when $1FA7 is 0 and $2724 (into $CC00) when it is 1. It first stores the loop limit $10 in the operand $2720 or $2792. Called from $264C."
  },
  {
   "address": 9873,
   "type": "line",
   "text": "Phase 0 of a scroll downwards: shifts columns $10 down to 0 up one row into the other matrix ($26B2 into $C800 when $1FA7 is 0, $2724 into $CC00 when it is 1, with the loop limit $FF stored in $2720 or $2792) and then draws the new bottom row into it ($2885 for $C800, $2796 for $CC00). Called from $2644."
  },
  {
   "address": 9906,
   "type": "line",
   "text": "Copies the matrix at $CC00 up one row into $C800, 19 rows, for the columns from Y down to the limit in the operand at $2720: row 0 of the column comes from row 1, and so on to row 17 from row 18. Called from $2682 and $269D."
  },
  {
   "address": 10016,
   "type": "line",
   "text": "The loop limit of $26B2: the operand of the CPY at $271F (the file holds $FF). $2691 stores $FF here and $2676 stores $10."
  },
  {
   "address": 10020,
   "type": "line",
   "text": "Copies the matrix at $C800 up one row into $CC00, 19 rows, for the columns from Y down to the limit in the operand at $2792. Called from $268D and $26AB."
  },
  {
   "address": 10130,
   "type": "line",
   "text": "The loop limit of $2724: the operand of the CPY at $2791 (the file holds $FF). $2691 stores $FF here and $2676 stores $10."
  },
  {
   "address": 10134,
   "type": "line",
   "text": "Draws the new bottom row (row 18) of tiles from the level map into the matrix at $CC00. The map position is the pointer $A1/$A2 plus $0280 (ten tile rows), plus 1 when the half-column flag $AF plus 1 reaches 2, stored in $93/$94; $2B30 gets that half-column state and $2B2F the half-row state $BD minus 1 (1, with the position moved 64 tiles back, when that is negative). $2B2F picks the character table $97F4 (0) or $9892, whose address is stored in the operands of the five loads below ($280D, $2814, $2845, $2855, $285C and the byte after each). It writes 40 characters from $CED0, or 39 when $2B30 is 1 (the second character of the first tile first). Unless $2EC4 is set it then steps $BD on, adding $40 to the map pointer when it wraps. Called from $26AE, $3151 and $3301."
  },
  {
   "address": 10253,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $280C (high byte at $280E), rewritten by $2796 ($27D3-$27FB) with $97F4 or $9892."
  },
  {
   "address": 10260,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2813 (high byte at $2815), rewritten by $2796 ($27D3-$27FB) with $97F4 or $9892."
  },
  {
   "address": 10309,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2844 (high byte at $2846), rewritten by $2796 ($27D3-$27FB) with $97F4 or $9892."
  },
  {
   "address": 10325,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2854 (high byte at $2856), rewritten by $2796 ($27D3-$27FB) with $97F4 or $9892."
  },
  {
   "address": 10332,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $285B (high byte at $285D), rewritten by $2796 ($27D3-$27FB) with $97F4 or $9892."
  },
  {
   "address": 10373,
   "type": "line",
   "text": "The same as $2796 for the matrix at $C800: draws the new bottom row from $CAD0, and its table address operands are $28FC, $2903, $2934, $2944 and $294B. Called from $26A0, $312F and $32DF."
  },
  {
   "address": 10492,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $28FB (high byte at $28FD), rewritten by $2885 ($28C2-$28EA) with $97F4 or $9892."
  },
  {
   "address": 10499,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2902 (high byte at $2904), rewritten by $2885 ($28C2-$28EA) with $97F4 or $9892."
  },
  {
   "address": 10548,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2933 (high byte at $2935), rewritten by $2885 ($28C2-$28EA) with $97F4 or $9892."
  },
  {
   "address": 10564,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2943 (high byte at $2945), rewritten by $2885 ($28C2-$28EA) with $97F4 or $9892."
  },
  {
   "address": 10571,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $294A (high byte at $294C), rewritten by $2885 ($28C2-$28EA) with $97F4 or $9892."
  },
  {
   "address": 10612,
   "type": "line",
   "text": "Steps the half-row flag $BD on by one and, when it reaches 2, sets it to 0 and adds $40 to the map pointer $A1/$A2 (one row of 64 tiles down). Called by the diagonal scrolls ($2DB4, $2DD6, $2F65, $2F87 and others)."
  },
  {
   "address": 10637,
   "type": "line",
   "text": "The fine vertical scroll values for the four phases of a scroll upwards: 2, 4, 6, 0 (read by $2991)."
  },
  {
   "address": 10641,
   "type": "line",
   "text": "Sets the fine vertical scroll $1FA2 from the table at $298D (2, 4, 6, 0) for the phase in $2070 and returns the phase in Y. When $1FA2 already holds that value, or when 10 or more steps are left ($206F) and $1FA2 is 6, it restores the camera Y ($D9/$DA) from $1FA8/$1FA9 and the player's Y $7B17 from $5935 instead. Called by $29BF, $2D14 and $2EC5."
  },
  {
   "address": 10687,
   "type": "line",
   "text": "Scroll direction 2, view upwards (entry 2 of the table at $2075). Moves the camera Y ($D9/$DA) back 2 and the player's screen Y $7B17 on 2, takes the fine scroll from $2991 and runs the phase's work: 0 shifts columns 0 to $10 down a row and draws the new top row ($2A2A), 1 shifts columns $11 to $26 ($2A0F), 2 builds the colours ($29F5), 3 copies the colours and flips the buffers ($2A00)."
  },
  {
   "address": 10741,
   "type": "line",
   "text": "Phase 2 of a scroll upwards: jumps to $459E when the buffer flag $1FA7 is 0 and to $3946 when it is 1, which build the colour buffer from $71F4 from the matrix just made (the same as $20FD). Called from $29ED."
  },
  {
   "address": 10752,
   "type": "line",
   "text": "Phase 3 of a scroll upwards: fills colour RAM rows 0 to 9 ($7131), copies rows 10 to 12 of the colour buffer and asks the interrupt for rows 13 to 18 ($68DA), then flips the buffer flag $1FA7 (the same as $2108). Called from $29F1."
  },
  {
   "address": 10767,
   "type": "line",
   "text": "Phase 1 of a scroll upwards: shifts columns $26 down to $11 of the screen down one row into the other matrix, with $2A4B (into $C800) when $1FA7 is 0 and $2ABD (into $CC00) when it is 1. It first stores the loop limit $10 in the operand $2AB9 or $2B2B. Called from $29E5."
  },
  {
   "address": 10794,
   "type": "line",
   "text": "Phase 0 of a scroll upwards: shifts columns $10 down to 0 down one row into the other matrix ($2A4B into $C800 when $1FA7 is 0, $2ABD into $CC00 when it is 1, with the loop limit $FF stored in $2AB9 or $2B2B) and then draws the new top row into it ($2C17 for $C800, $2B31 for $CC00). Called from $29DD."
  },
  {
   "address": 10827,
   "type": "line",
   "text": "Copies the matrix at $CC00 down one row into $C800, 19 rows, for the columns from Y down to the limit in the operand at $2AB9: row 18 of the column comes from row 17, and so on to row 1 from row 0. Called from $2A1B and $2A36."
  },
  {
   "address": 10937,
   "type": "line",
   "text": "The loop limit of $2A4B: the operand of the CPY at $2AB8 (the file holds $FF). $2A2A stores $FF here and $2A0F stores $10."
  },
  {
   "address": 10941,
   "type": "line",
   "text": "Copies the matrix at $C800 down one row into $CC00, 19 rows, for the columns from Y down to the limit in the operand at $2B2B. Called from $2A26 and $2A44."
  },
  {
   "address": 11051,
   "type": "line",
   "text": "The loop limit of $2ABD: the operand of the CPY at $2B2A (the file holds $FF). $2A2A stores $FF here and $2A0F stores $10."
  },
  {
   "address": 11055,
   "type": "line",
   "text": "Set by the row drawing routines $2796, $2885, $2B31 and $2C17 to the half-row state of the row they draw (the half-row flag $BD minus 1, or 1 when that is negative): 0 picks the character table $97F4 (top characters of the tiles), 1 picks $9892 (bottom characters)."
  },
  {
   "address": 11056,
   "type": "line",
   "text": "Set by the row drawing routines $2796, $2885, $2B31 and $2C17 to the half-column state of the row they draw (the half-column flag $AF plus 1, or 0 when that reaches 2): 0 builds the row from the first character of the first tile, 1 starts with its second character and ends one character earlier."
  },
  {
   "address": 11057,
   "type": "line",
   "text": "Draws the new top row (row 0) of tiles from the level map into the matrix at $CC00. The map position is the pointer $A1/$A2, plus 1 when the half-column flag $AF plus 1 reaches 2, stored in $93/$94; $2B30 gets that half-column state and $2B2F the half-row state $BD minus 1 (1, with the position moved 64 tiles back, when that is negative). $2B2F picks the character table $97F4 (0) or $9892, whose address is stored in the operands of the five loads below ($2BA3, $2BAA, $2BD9, $2BE9, $2BF0 and the byte after each). It writes 40 characters from $CC00, or 39 when $2B30 is 1. Unless $2EC4 is set it then steps $BD back, subtracting $40 from the map pointer when it goes below 0. Called from $2A47, $2DD9 and $2F8A."
  },
  {
   "address": 11111,
   "type": "line",
   "text": "Not a routine entry: the operand of the calls at $1222, $2063 and $5958 as the file stores it ($2B67), which each of them overwrites from a table (at $124F, $2075 and $5924) before the call is made. The bytes the file holds here ($2F 2B A2 92) are the operand of the STX at $2B66 and the LDX #$92 at $2B69 inside draw_top_row_a, not an instruction of their own; started here they would decode as a stray RLA and JAM."
  },
  {
   "address": 11171,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2BA2 (high byte at $2BA4), rewritten by $2B31 ($2B69-$2B91) with $97F4 or $9892."
  },
  {
   "address": 11178,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2BA9 (high byte at $2BAB), rewritten by $2B31 ($2B69-$2B91) with $97F4 or $9892."
  },
  {
   "address": 11225,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2BD8 (high byte at $2BDA), rewritten by $2B31 ($2B69-$2B91) with $97F4 or $9892."
  },
  {
   "address": 11241,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2BE8 (high byte at $2BEA), rewritten by $2B31 ($2B69-$2B91) with $97F4 or $9892."
  },
  {
   "address": 11248,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2BEF (high byte at $2BF1), rewritten by $2B31 ($2B69-$2B91) with $97F4 or $9892."
  },
  {
   "address": 11287,
   "type": "line",
   "text": "The same as $2B31 for the matrix at $C800: draws the new top row from $C800, and its table address operands are $2C89, $2C90, $2CBF, $2CCF and $2CD6. Called from $2A39, $2DB7 and $2F68."
  },
  {
   "address": 11401,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2C88 (high byte at $2C8A), rewritten by $2C17 ($2C4F-$2C77) with $97F4 or $9892."
  },
  {
   "address": 11408,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2C8F (high byte at $2C91), rewritten by $2C17 ($2C4F-$2C77) with $97F4 or $9892."
  },
  {
   "address": 11455,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2CBE (high byte at $2CC0), rewritten by $2C17 ($2C4F-$2C77) with $97F4 or $9892."
  },
  {
   "address": 11471,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2CCE (high byte at $2CD0), rewritten by $2C17 ($2C4F-$2C77) with $97F4 or $9892."
  },
  {
   "address": 11478,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2CD5 (high byte at $2CD7), rewritten by $2C17 ($2C4F-$2C77) with $97F4 or $9892."
  },
  {
   "address": 11517,
   "type": "line",
   "text": "Steps the half-row flag $BD back by one and, when it goes below 0, sets it to 1 and subtracts $40 from the map pointer $A1/$A2 (one row of 64 tiles up). Called by the diagonal scrolls ($2DAB, $2DBA, $2DCD, $2DDC, $2F5C and others)."
  },
  {
   "address": 11540,
   "type": "line",
   "text": "Scroll direction 6, view to the right and upwards (entry 6 of the table at $2075). Moves the camera X on 2 and Y back 2 and the player's screen position the other way (X back 2, Y on 2), takes both fine scrolls ($2991, $209A) and runs the phase's work: 0 ($2D7C) and 1 ($2D97) shift the screen one row down and one column left and draw the new column and row, 2 builds the colours ($2D62), 3 copies them and flips the buffers ($2D6D)."
  },
  {
   "address": 11618,
   "type": "line",
   "text": "Phase 2 of the right-and-up scroll: jumps to $459E when the buffer flag $1FA7 is 0 and to $3946 when it is 1, which build the colour buffer from $71F4 from the matrix just made (the same as $20FD). Called from $2D5A."
  },
  {
   "address": 11629,
   "type": "line",
   "text": "Phase 3 of the right-and-up scroll: fills colour RAM rows 0 to 9 ($7131), copies rows 10 to 12 of the colour buffer and asks the interrupt for rows 13 to 18 ($68DA), then flips the buffer flag $1FA7 (the same as $2108). Called from $2D5E."
  },
  {
   "address": 11644,
   "type": "line",
   "text": "Phase 0 of the right-and-up scroll: shifts columns 0 to $16 one row down and one column left into the other matrix, with $2DE0 (into $C800) when $1FA7 is 0 and $2E52 (into $CC00) when it is 1. It first stores the loop limit $17 in the operand $2E4E or $2EC0. Called from $2D4A."
  },
  {
   "address": 11671,
   "type": "line",
   "text": "Phase 1 of the right-and-up scroll: shifts columns $17 to $25 one row down and one column left into the other matrix ($2DE0 into $C800 when $1FA7 is 0, $2E52 into $CC00 when it is 1, with the loop limit $26). It then sets $2EC4 so that the drawing routines leave the map position alone and steps it itself: half a row back ($2CFD), the right column ($2243), half a column on ($25DB), half a row on ($2974), the top row ($2C17 for $C800, $2B31 for $CC00) and half a row back again ($2CFD). Called from $2D52."
  },
  {
   "address": 11744,
   "type": "line",
   "text": "Copies the matrix at $CC00 into $C800 shifted one row down and one column left, 19 rows, for the columns from Y up to the limit in the operand at $2E4E: row r+1 of column Y comes from row r of column Y+1. Called from $2D88 and $2DA3."
  },
  {
   "address": 11854,
   "type": "line",
   "text": "The loop limit of $2DE0: the operand of the CPY at $2E4D (the file holds $26). $2D7C stores $17 here and $2D97 stores $26."
  },
  {
   "address": 11858,
   "type": "line",
   "text": "Copies the matrix at $C800 into $CC00 shifted one row down and one column left, 19 rows, for the columns from Y up to the limit in the operand at $2EC0. Called from $2D93 and $2DC5."
  },
  {
   "address": 11968,
   "type": "line",
   "text": "The loop limit of $2E52: the operand of the CPY at $2EBF (the file holds $26). $2D7C stores $17 here and $2D97 stores $26."
  },
  {
   "address": 11972,
   "type": "line",
   "text": "Cleared by $1FAC when a new scroll starts and set to 1 by the second phase of the diagonal scrolls (for example $2D97). While it is non-zero the routines $2243, $2796, $2885, $2B31 and $2C17 do not step the map pointer $A1/$A2 and the flags $AF and $BD, and the diagonal scroll steps them itself."
  },
  {
   "address": 11973,
   "type": "line",
   "text": "Scroll direction 10, view to the left and upwards (entry 10 of the table at $2075). Moves the camera X and Y back 2 and the player's screen X and Y on 2, takes both fine scrolls ($2991, $33F0) and runs the phase's work: 0 ($2F2D) and 1 ($2F48) shift the screen one row down and one column right and draw the new column and row, 2 builds the colours ($2F13), 3 copies them and flips the buffers ($2F1E)."
  },
  {
   "address": 12051,
   "type": "line",
   "text": "Phase 2 of the left-and-up scroll: jumps to $459E when the buffer flag $1FA7 is 0 and to $3946 when it is 1, which build the colour buffer $71F4-$735A from the matrix just made (the same as $20FD)."
  },
  {
   "address": 12062,
   "type": "line",
   "text": "Phase 3 of the left-and-up scroll: fills colour RAM rows 0 to 9 ($7131), copies rows 10 to 12 of the colour buffer and asks the interrupt for rows 13 to 18 ($68DA), then flips the buffer flag $1FA7 (the same as $2108)."
  },
  {
   "address": 12077,
   "type": "line",
   "text": "Phase 0 of the left-and-up scroll: shifts columns $25 down to $0F one row down and one column right into the other matrix, with $2F91 (into $C800) when $1FA7 is 0 and $3003 (into $CC00) when it is 1. It first stores the loop limit $0E in the operand $2FFF or $3071."
  },
  {
   "address": 12104,
   "type": "line",
   "text": "Phase 1 of the left-and-up scroll: shifts columns $0E down to 0 one row down and one column right into the other matrix ($2F91 into $C800 when $1FA7 is 0, $3003 into $CC00 when it is 1, with the loop limit $FF). It then sets $2EC4 so that the drawing routines leave the map position alone and steps it itself: half a row back ($2CFD), the left column ($3599), half a column back ($392F), half a row on ($2974), the top row ($2C17 for $C800, $2B31 for $CC00) and half a row back again ($2CFD)."
  },
  {
   "address": 12177,
   "type": "line",
   "text": "Copies the matrix at $CC00 into $C800 shifted one row down and one column right, 19 rows, for the columns from Y down to the limit in the operand at $2FFF: row r+1 of column Y+1 comes from row r of column Y."
  },
  {
   "address": 12287,
   "type": "line",
   "text": "The loop limit of $2F91: the operand of the CPY at $2FFE (the file holds $FF). $2F2D stores $0E here and $2F48 stores $FF."
  },
  {
   "address": 12291,
   "type": "line",
   "text": "Copies the matrix at $C800 into $CC00 shifted one row down and one column right, 19 rows, for the columns from Y down to the limit in the operand at $3071."
  },
  {
   "address": 12401,
   "type": "line",
   "text": "The loop limit of $3003: the operand of the CPY at $3070 (the file holds $FF). $2F2D stores $0E here and $2F48 stores $FF."
  },
  {
   "address": 12405,
   "type": "line",
   "text": "No caller: nothing calls, jumps or branches to it, and the routine before it ends in an RTS. A copy of the end of scroll_lu_copy_b ($2F79-$2F8D): it sets $2EC4 to 1, then steps the map half a row back ($2CFD), draws the left column ($3599), steps half a column back ($392F), half a row on ($2974), draws the top row ($2B31) and steps half a row back again; without an RTS it runs on into scroll_left_down at $308C."
  },
  {
   "address": 12428,
   "type": "line",
   "text": "Scroll direction 9, view to the left and downwards (entry 9 of the table at $2075). Moves the camera X ($CB/$CC) back 2 and Y ($D9/$DA) on 2 and the player's screen position the other way (X on 2, Y back 2), takes both fine scrolls ($25F8, $33F0) and runs the work of the phase that $33F0 returns: 0 ($30F4) and 1 ($310F) shift the screen one row up and one column right and draw the new column and row, 2 builds the colours ($30DA), 3 copies them and flips the buffers ($30E5)."
  },
  {
   "address": 12506,
   "type": "line",
   "text": "Phase 2 of the left-and-down scroll: jumps to $459E when the buffer flag $1FA7 is 0 and to $3946 when it is 1, which build the colour buffer $71F4-$735A from the matrix just made (the same as $20FD)."
  },
  {
   "address": 12517,
   "type": "line",
   "text": "Phase 3 of the left-and-down scroll: fills colour RAM rows 0 to 9 ($7131), copies rows 10 to 12 of the colour buffer and asks the interrupt for rows 13 to 18 ($68DA), then flips the buffer flag $1FA7 (the same as $2108)."
  },
  {
   "address": 12532,
   "type": "line",
   "text": "Phase 0 of the left-and-down scroll: shifts columns $25 down to $0F one row up and one column right into the other matrix ($3158 into $C800 when $1FA7 is 0, $31CA into $CC00 when it is 1, with the loop limit $0E stored in $31C6 or $3238)."
  },
  {
   "address": 12559,
   "type": "line",
   "text": "Phase 1 of the left-and-down scroll: shifts columns $0E down to 0 one row up and one column right into the other matrix ($3158 into $C800 when $1FA7 is 0, $31CA into $CC00 when it is 1, with the loop limit $FF). It then sets $2EC4 so that the drawing routines leave the map position alone and steps it itself: half a row on ($2974), the left column ($3599), half a column back ($392F), half a row back ($2CFD), the bottom row ($2885 for $C800, $2796 for $CC00) and half a row on again ($2974)."
  },
  {
   "address": 12632,
   "type": "line",
   "text": "Copies the matrix at $CC00 into $C800 shifted one row up and one column right (rows 1 to 18 of the source into rows 0 to 17), for the columns from Y down to the limit in the operand at $31C6: the character at row r+1, column Y goes to row r, column Y+1."
  },
  {
   "address": 12742,
   "type": "line",
   "text": "The loop limit of $3158: the operand of the CPY at $31C5 (the file holds $FF). $30F4 stores $0E here and $310F stores $FF."
  },
  {
   "address": 12746,
   "type": "line",
   "text": "Copies the matrix at $C800 into $CC00 shifted one row up and one column right (rows 1 to 18 of the source into rows 0 to 17), for the columns from Y down to the limit in the operand at $3238."
  },
  {
   "address": 12856,
   "type": "line",
   "text": "The loop limit of $31CA: the operand of the CPY at $3237 (the file holds $FF). $30F4 stores $0E here and $310F stores $FF."
  },
  {
   "address": 12860,
   "type": "line",
   "text": "Scroll direction 5, view to the right and downwards (entry 5 of the table at $2075). Moves the camera X on 2 and Y on 2 and the player's screen position back 2 in both, takes both fine scrolls ($25F8, $209A) and runs the work of the phase that $209A returns: 0 ($32A4) and 1 ($32BF) shift the screen one row up and one column left and draw the new column and row, 2 builds the colours ($328A), 3 copies them and flips the buffers ($3295)."
  },
  {
   "address": 12938,
   "type": "line",
   "text": "Phase 2 of the right-and-down scroll: jumps to $459E when the buffer flag $1FA7 is 0 and to $3946 when it is 1, which build the colour buffer $71F4-$735A from the matrix just made (the same as $20FD)."
  },
  {
   "address": 12949,
   "type": "line",
   "text": "Phase 3 of the right-and-down scroll: fills colour RAM rows 0 to 9 ($7131), copies rows 10 to 12 of the colour buffer and asks the interrupt for rows 13 to 18 ($68DA), then flips the buffer flag $1FA7 (the same as $2108)."
  },
  {
   "address": 12964,
   "type": "line",
   "text": "Phase 0 of the right-and-down scroll: shifts columns 0 to $16 one row up and one column left into the other matrix ($3308 into $C800 when $1FA7 is 0, $337A into $CC00 when it is 1, with the loop limit $17 stored in $3376 or $33E8)."
  },
  {
   "address": 12991,
   "type": "line",
   "text": "Phase 1 of the right-and-down scroll: shifts columns $17 to $25 one row up and one column left into the other matrix ($3308 into $C800 when $1FA7 is 0, $337A into $CC00 when it is 1, with the loop limit $26). It then sets $2EC4 so that the drawing routines leave the map position alone and steps it itself: half a row on ($2974), the right column ($2243), half a column on ($25DB), half a row back ($2CFD), the bottom row ($2885 for $C800, $2796 for $CC00) and half a row on again ($2974)."
  },
  {
   "address": 13064,
   "type": "line",
   "text": "Copies the matrix at $CC00 into $C800 shifted one row up and one column left (rows 1 to 18 of the source into rows 0 to 17), for the columns from Y up to the limit in the operand at $3376: the character at row r+1, column Y+1 goes to row r, column Y."
  },
  {
   "address": 13174,
   "type": "line",
   "text": "The loop limit of $3308: the operand of the CPY at $3375 (the file holds $26). $32A4 stores $17 here and $32BF stores $26."
  },
  {
   "address": 13178,
   "type": "line",
   "text": "Copies the matrix at $C800 into $CC00 shifted one row up and one column left (rows 1 to 18 of the source into rows 0 to 17), for the columns from Y up to the limit in the operand at $33E8."
  },
  {
   "address": 13288,
   "type": "line",
   "text": "The loop limit of $337A: the operand of the CPY at $33E7 (the file holds $26). $32A4 stores $17 here and $32BF stores $26."
  },
  {
   "address": 13292,
   "type": "line",
   "text": "The fine horizontal scroll values for the four phases of a scroll to the left: 2, 4, 6, 0 (read by $33F0)."
  },
  {
   "address": 13296,
   "type": "line",
   "text": "Sets the fine horizontal scroll $1FA1 from the table at $33EC (2, 4, 6, 0) for the phase in $2070 and returns the phase in Y. When $1FA1 already holds that value, or when 10 or more steps are left ($206F) and $1FA1 is 6, it restores the camera X ($CB/$CC) from $1FAA/$1FAB and the player's X $7B16 from $5934 instead. Called by $2EC5, $308C and $341E."
  },
  {
   "address": 13342,
   "type": "line",
   "text": "Scroll direction 8, view to the left (entry 8 of the table at $2075). Moves the camera X ($CB/$CC) back 2 and the player's screen X $7B16 on 2, takes the fine scroll from $33F0 and runs the work of the phase it returns: phase 0 shifts the right columns of the screen one character right ($346D), 1 shifts the rest and draws the new left column ($3488), 2 builds the colours ($3453), 3 copies the colours to colour RAM and flips the buffers ($345E)."
  },
  {
   "address": 13395,
   "type": "line",
   "text": "Phase 2 of a scroll to the left: jumps to $459E when the buffer flag $1FA7 is 0 and to $3946 when it is 1, which build the colour buffer $71F4-$735A from the matrix just made (the same as $20FD)."
  },
  {
   "address": 13406,
   "type": "line",
   "text": "Phase 3 of a scroll to the left: fills colour RAM rows 0 to 9 ($7131), copies rows 10 to 12 of the colour buffer and asks the interrupt for rows 13 to 18 ($68DA), then flips the buffer flag $1FA7 (the same as $2108)."
  },
  {
   "address": 13421,
   "type": "line",
   "text": "Phase 0 of a scroll to the left: shifts columns $26 down to $12 of the screen one character right into the other matrix ($34A9 into $C800 when $1FA7 is 0, $3521 into $CC00 when it is 1, with the loop limit $11 stored in $351D or $3595)."
  },
  {
   "address": 13448,
   "type": "line",
   "text": "Phase 1 of a scroll to the left: shifts columns $11 down to 0 one character right into the other matrix ($34A9 into $C800 when $1FA7 is 0, $3521 into $CC00 when it is 1, with the loop limit $FF) and then draws the new left column ($3599)."
  },
  {
   "address": 13481,
   "type": "line",
   "text": "Copies the matrix at $CC00 one character to the right into $C800, 19 rows of 40, for the columns from Y down to the limit in the operand at $351D: the character at row r, column Y goes to column Y+1."
  },
  {
   "address": 13597,
   "type": "line",
   "text": "The loop limit of $34A9: the operand of the CPY at $351C (the file holds $FF). $346D stores $11 here and $3488 stores $FF."
  },
  {
   "address": 13601,
   "type": "line",
   "text": "Copies the matrix at $C800 one character to the right into $CC00, 19 rows of 40, for the columns from Y down to the limit in the operand at $3595."
  },
  {
   "address": 13717,
   "type": "line",
   "text": "The loop limit of $3521: the operand of the CPY at $3594 (the file holds $FF). $346D stores $11 here and $3488 stores $FF."
  },
  {
   "address": 13721,
   "type": "line",
   "text": "Draws the new left-hand column (column 0, 19 rows) of the matrix that is being made ($C800 when $1FA7 is 0, otherwise $CC00) from the level map. It reads 10 tiles down from the map pointer $A1/$A2, $40 tiles to a row, each as a two by two block through the tables $97F4 (top row) and $9892 (bottom row), taking the left or right character by the half-column flag $AF; when the half-row flag $BD is non-zero it starts with the bottom row of the first tile. Unless $2EC4 is set it then steps $AF back by one, subtracting 1 from the map pointer when it wraps. Called by the left scrolls ($2F48, $310F, $3488)."
  },
  {
   "address": 14639,
   "type": "line",
   "text": "Steps the half-column flag $AF back by one and, when it goes below 0, sets it to 1 and subtracts 1 from the map pointer $A1/$A2 (one tile to the left). Called by the diagonal scrolls to the left ($2F62, $2F84, $3129, $314B)."
  },
  {
   "address": 14662,
   "type": "line",
   "text": "Builds the colour buffer $71F4-$735A from the matrix at $CC00: for rows 10 to 18, columns 0 to 38 of each (351 characters, from $CD90 to $CEF6), it looks the character up in the colour table $BF00 and stores the colour in the buffer, 40 bytes to a row. Entered by a jump when the buffer flag $1FA7 is 1, from the phase 2 routines of the scrolls ($20FD and the others) and from the dispatch at $7126."
  },
  {
   "address": 15364,
   "type": "line",
   "text": "Part 2 of the unrolled colour lookup from the matrix at $CC00: the characters of screen rows 12 and 13, 39 each from $CDE0 and $CE08, looked up in the colour table $BF00 and stored in the buffer from $7244 and $726C."
  },
  {
   "address": 16066,
   "type": "line",
   "text": "Part 3 of the unrolled colour lookup from the matrix at $CC00: the characters of screen rows 14 and 15, 39 each from $CE30 and $CE58, looked up in the colour table $BF00 and stored in the buffer from $7294 and $72BC."
  },
  {
   "address": 16768,
   "type": "line",
   "text": "Part 4 of the unrolled colour lookup from the matrix at $CC00: the characters of screen rows 16 and 17, 39 each from $CE80 and $CEA8, looked up in the colour table $BF00 and stored in the buffer from $72E4 and $730C."
  },
  {
   "address": 17470,
   "type": "line",
   "text": "Last part of the unrolled colour lookup from the matrix at $CC00: the characters of screen row 18, 39 from $CED0 to $CEF6, looked up in the colour table $BF00 and stored in the buffer from $7334 to $735A, then the RTS at $459D."
  },
  {
   "address": 17822,
   "type": "line",
   "text": "Builds the colour buffer $71F4-$735A from the matrix at $C800: for rows 10 to 18, columns 0 to 38 of each (351 characters, from $C990 to $CAF6), it looks the character up in the colour table $BF00 and stores the colour in the buffer, 40 bytes to a row. Entered by a jump when the buffer flag $1FA7 is 0, from the phase 2 routines of the scrolls ($20FD and the others) and from the dispatch at $7126."
  },
  {
   "address": 18524,
   "type": "line",
   "text": "Part 2 of the unrolled colour lookup from the matrix at $C800: the characters of screen rows 12 and 13, 39 each from $C9E0 and $CA08, looked up in the colour table $BF00 and stored in the buffer from $7244 and $726C."
  },
  {
   "address": 19226,
   "type": "line",
   "text": "Part 3 of the unrolled colour lookup from the matrix at $C800: the characters of screen rows 14 and 15, 39 each from $CA30 and $CA58, looked up in the colour table $BF00 and stored in the buffer from $7294 and $72BC."
  },
  {
   "address": 19928,
   "type": "line",
   "text": "Part 4 of the unrolled colour lookup from the matrix at $C800: the characters of screen rows 16 and 17, 39 each from $CA80 and $CAA8, looked up in the colour table $BF00 and stored in the buffer from $72E4 and $730C."
  },
  {
   "address": 20630,
   "type": "line",
   "text": "Last part of the unrolled colour lookup from the matrix at $C800: the characters of screen row 18, 39 from $CAD0 to $CAF6, looked up in the colour table $BF00 and stored in the buffer from $7334 to $735A, then the RTS at $51F5."
  },
  {
   "address": 20982,
   "type": "line",
   "text": "Cleared by the setup $51F7. Set to 1 by behaviour $1416 when the player touches its object (the behaviour then stops testing); while it is set, behaviour $1439 changes its sprite pointer between $FC and $FD every 7 frames. No object in the table at $7649 has the types $19 and $1A that use them."
  },
  {
   "address": 20983,
   "type": "line",
   "text": "Level setup, called first by the main loop at $1EFF. Switches interrupts off, banks the ROMs out ($01=$35), selects video bank 3 and the screen at $CC00 ($D018=$30) with extended colour and multicolour on, sets the timer digits $7B18-$7B1A (5 in $7B1A only when $0A10 is set) and the energy $5448 to $21, clears the flags ($56A1, $56A3, $6222, $6220, $7411, $6449, $621F, $1F69, $68D9, $51F6, $0A2B, $206F), the sprite priority and expand registers and $002A-$0100, turns all sprites on, ORs $08 into the 256 bytes at $BF00 and fills $0010-$0077 with $FF. It sets the player's screen position $7B16/$7B17 to $74,$82, the camera to X $00A4 and Y $046C and the map pointer $A1/$A2 to $9083, types the briefing ($96AB, with the shape swap $9670), draws the panel ($53A6), sets four map bytes ($1EF2), loads the objects ($7A1D) and the first screen ($7F97), starts the music ($B0C8), points the NMI at $0A23 and the IRQ at $6313, sets the raster compare to line $82 and enables the raster interrupt with CLI."
  },
  {
   "address": 21414,
   "type": "line",
   "text": "Copies the status panel under the playfield: the 200 characters at $9914 to $CEF7 and their colours at $99DC to $DAF7, clears the 40 characters at $CFC0 and $DBC0, then draws the timer picture through $7BCD when $0A10 is set and through $7C36 when it is clear. Called by the setup $51F7 (twice), the game over screen $587B and the continue screen $9494."
  },
  {
   "address": 21462,
   "type": "line",
   "text": "Scratch of $53D7, $80AF and $8118: the height that the player's screen Y $7B17 is compared with (the player's Y plus $0E, or the slot's height $A3,X minus $15)."
  },
  {
   "address": 21463,
   "type": "line",
   "text": "Contact test of slot X (a slot's sprite against the player). Heights: when the player is crouching ($5B3E non-zero) the slot's screen height $A3,X must be within 9 of the player's Y plus $0E, otherwise within $17 below or $0B above the player's $7B17. Across: the slot's high X byte $BF,X must be 0 and its screen X $87,X within $13 of the player's $7B16. Returns A=0 for no contact and a non-zero A (the distance across, or the slot's X when level with the player) for contact. Called by the behaviours ($1350, $1486 and others), which then call $5449."
  },
  {
   "address": 21575,
   "type": "line",
   "text": "Frames of protection after a hit, counted down by $6313; set to 3 by $5449; while it is non-zero the joystick is read even if the recoil runs."
  },
  {
   "address": 21576,
   "type": "line",
   "text": "The player's energy, $21 at the start of the level; the bar at $578E shows it. The main loop at $1F37 goes to the game over screen when it is zero."
  },
  {
   "address": 21577,
   "type": "line",
   "text": "Hurts the player. Returns at once while the hurt guard $5447 is non-zero; otherwise sets $5447 and the recoil $1725 to 3 and goes on into $5456."
  },
  {
   "address": 21590,
   "type": "line",
   "text": "Takes 1 from the energy $5448 unless it is already zero, and plays sound effect 4 through $B0EE, keeping X and Y in the operands at $546F and $546D. Entered from $5449 and called by the behaviours at $17D9 and $1A1E, which set their own recoil."
  },
  {
   "address": 21613,
   "type": "line",
   "text": "Holds the Y register saved by $5464: the immediate operand of the LDY at $546C."
  },
  {
   "address": 21615,
   "type": "line",
   "text": "Holds the X register saved by $5461: the immediate operand of the LDX at $546E."
  },
  {
   "address": 21617,
   "type": "line",
   "text": "Behaviour for state $12 (entry 18 of the table at $124F): a lone RTS, so a slot in state $12 does nothing. No object in the table at $7649 has type $12."
  },
  {
   "address": 21618,
   "type": "line",
   "text": "Behaviour for state $13 (entry 19 of the table at $124F): a lone RTS, so a slot in state $13 does nothing. No object in the table at $7649 has type $13."
  },
  {
   "address": 21619,
   "type": "line",
   "text": "Behaviour for state $14 (entry 20 of the table at $124F): a lone RTS, so a slot in state $14 does nothing. No object in the table at $7649 has type $14."
  },
  {
   "address": 21620,
   "type": "line",
   "text": "Behaviour for state $15 (entry 21 of the table at $124F): a lone RTS, so a slot in state $15 does nothing. No object in the table at $7649 has type $15."
  },
  {
   "address": 21621,
   "type": "line",
   "text": "Behaviour for state $16 (entry 22 of the table at $124F): a lone RTS, so a slot in state $16 does nothing. No object in the table at $7649 has type $16."
  },
  {
   "address": 21622,
   "type": "line",
   "text": "Sprite pointers of behaviour $548E for the counter values 1 to 23: $01 seven times (counter 1 to 7), $1F eight times and $69 eight times; the byte for counter 0 is never read."
  },
  {
   "address": 21646,
   "type": "line",
   "text": "Behaviour for state 23 (entry 23 of the table at $124F), reached for the five objects of type $17 (45, 46, 48, 49 and 51). The contact test $53D7 hurts the player ($5449). Pointer $FE, colour 5, single-colour. The object's counter $0B6C counts up to its flag $0BB2: below $18 the pointer comes from $5476 by the counter; from $18 on the slot falls 3 lines a frame (3 is added to its height $95,X/$CD,X, which is also written to $0E6E/$0EB4). When the counter reaches the flag, slot and object become state $18 with the counter at 0 and sound effect $14 plays."
  },
  {
   "address": 21705,
   "type": "line",
   "text": "Holds the Y register saved by $54C0: the immediate operand of the LDY at $54C8."
  },
  {
   "address": 21707,
   "type": "line",
   "text": "Holds the X register saved by $54BD: the immediate operand of the LDX at $54CA."
  },
  {
   "address": 21753,
   "type": "line",
   "text": "Behaviour for state 24 (entry 24 of the table at $124F), which $548E switches to when its fall ends. The contact test $53D7 hurts the player ($5449). Multicolour, colour 2. The object's counter $0B6C counts up to $35 while the pointer comes from $1DBD by the counter (the burst frames at the end of the table $1D89). Then it clears the counter and the pointer, puts the slot and the object back at the height $0CCA/$0D10, makes both state $17 again and plays sound effect $20."
  },
  {
   "address": 21838,
   "type": "line",
   "text": "Holds the Y register saved by $5545: the immediate operand of the LDY at $554D."
  },
  {
   "address": 21840,
   "type": "line",
   "text": "Holds the X register saved by $5542: the immediate operand of the LDX at $554F."
  },
  {
   "address": 21842,
   "type": "line",
   "text": "No caller: nothing calls, jumps to or branches to it. Reads CIA 1 port B ($DC01) and, when it holds $7F (only bit 7 clear), sets $0A11 to 1, the flag that the main loop tests at $1F2B and $1F3C; otherwise it changes nothing. Returns with RTS."
  },
  {
   "address": 21855,
   "type": "line",
   "text": "Called by the top interrupt at $64CB while the banner flag $56A1 is set. Turns on all eight sprites as multicolour (colour 1, multicolours $0B and $0F), sets the X positions of sprites 0-3 and 4-7 to $87, $9F, $B7 and $CF and loops on the raster line ($D012) until it reaches $96. Below line $62 it sets heights $3C and $51 and the pointers $CE-$D5 through $5644; from line $62 to $91 heights $66 and $7B and the pointers $D6-$DD; from line $92 on it uses six sprites at height $9B in colour 2 with pointers $68 and $75-$7B and X positions $6A to $E2. Probably draws a large picture across the screen."
  },
  {
   "address": 22084,
   "type": "line",
   "text": "Sets the heights of sprites 0-3 ($D001-$D007) to A and of sprites 4-7 ($D009-$D00F) to A plus $15, then falls into banner_pointers ($5669) with the pointer X. Called by banner_sprites at $55C3 and $55D1."
  },
  {
   "address": 22121,
   "type": "line",
   "text": "Sets the eight sprite pointers in both screens' tables ($CFF8-$CFFF and $CBF8-$CBFF) to X, X+1, up to X+7. Reached by falling through from banner_row ($5644)."
  },
  {
   "address": 22128,
   "type": "line",
   "text": "Entry in the middle of banner_pointers: sets the pointers of sprites 1 to 7 ($CFF9-$CFFF and $CBF9-$CBFF) to X, X+1, up to X+6. Called by banner_sprites at $55F5 with X=$75."
  },
  {
   "address": 22177,
   "type": "line",
   "text": "1 while the banner at $555F is on; the top interrupt $6486 and the bottom interrupt $63EE read it and $56A5 clears it at the end. Set to 1 by behaviour $13AF when the player touches its object."
  },
  {
   "address": 22178,
   "type": "line",
   "text": "Frames of the banner left, counted down by $56A5; $C8 starts it. Set to $C8 by behaviour $13AF."
  },
  {
   "address": 22179,
   "type": "line",
   "text": "Set to 1 by $56A5 once the banner has run; the banner step does nothing after that. Cleared by the setup."
  },
  {
   "address": 22180,
   "type": "line",
   "text": "The RTS that the early exits of banner_step ($56A5) branch to, just before it."
  },
  {
   "address": 22181,
   "type": "line",
   "text": "Called by the main loop at $1F11. Returns at once when $56A3 is set or the banner flag $56A1 is clear. When the timer $56A2 holds $C8 it blacks the colour RAM of the playfield ($D800-$DAF7); it counts $56A2 down and when it reaches 1 puts the colours back from the screen matrix on show ($1FA7 picks $C800 or $CC00) through the table at $BF00, sets $56A3 and clears $56A1. Behaviour $13AF sets $56A1 and $56A2."
  },
  {
   "address": 22345,
   "type": "line",
   "text": "The four masks $FC, $F0, $C0 and $00 that $578E uses to take pixels off the end of the energy bar."
  },
  {
   "address": 22349,
   "type": "line",
   "text": "64 bytes of shapes for the eight characters of the energy bar, built by $578E and copied to $FAC8."
  },
  {
   "address": 22413,
   "type": "line",
   "text": "Counter of $578E: starts at the energy $5448 and counts up to $21, one step for each mask it applies."
  },
  {
   "address": 22414,
   "type": "line",
   "text": "Builds the energy bar: fills 8 characters of the panel ($CF59 on, colour 5 at $DB59) with the code $1D, writes a striped pattern into the eight character shapes at $574D, masks off 2 pixels for each step by which the energy $5448 is below $21 (mask table at $5749) and copies the 64 bytes at $574D to the character set at $FAC8. Called by the main loop at $1F08."
  },
  {
   "address": 22550,
   "type": "line",
   "text": "Adds A to the decimal digit $0A00+X and carries towards the more significant digits (X counting down) until a digit does not overflow; keeps Y. Digit 6 is the units, so the 4 and 8 added to digit 5 by $61BC are 40 and 80 points."
  },
  {
   "address": 22593,
   "type": "line",
   "text": "Scratch of $5816: the amount to add, then the carry to the next digit."
  },
  {
   "address": 22594,
   "type": "line",
   "text": "Draws the seven digits from $0A00 on into the panel's character shapes at $FA58 (8 bytes each, from the digit shapes at $1EA2) through $5855. Called by the main loop at $1F14."
  },
  {
   "address": 22613,
   "type": "line",
   "text": "Copies the 8-byte shape of digit $0A00+X from $1EA2 to the pointer $85/$86 and moves the pointer on 8 bytes; keeps X. Called seven times by $5842."
  },
  {
   "address": 22651,
   "type": "line",
   "text": "The game over screen, called by the main loop at $1F41 when the energy $5448 is zero and $0A11 is clear, and at $1F59 when the NMI flag $0A2B is set. Runs the wipe $7413, stops the sound ($B828), switches to the text screen, swaps the character shapes ($9670), clears the screen and fills colour RAM with 9, writes \"GAME OVER\" from $5919 at $CD50 (adding $66 to each code, a space becomes 0), waits through six long delays ($6570) and puts the shapes back and redraws the panel ($9670, $53A6)."
  },
  {
   "address": 22809,
   "type": "line",
   "text": "\"GAME OVER\" in screen codes, ended by $FF; written by $587B at $CD50."
  },
  {
   "address": 22819,
   "type": "line",
   "text": "The player's state: 1 standing or walking, 2 falling, 3 jumping, 4 climbing, 5 punching, 6 crouching, 7 a strike. Read by $5936 and $6121."
  },
  {
   "address": 22820,
   "type": "line",
   "text": "Table of the eight state routines, one word each, indexed by the player's state $5923: 0 $5961 player_state_none (an RTS), 1 $5C49 player_walk, 2 $5E1C player_fall, 3 $5F2B player_jump, 4 $5B42 player_climb, 5 $59F1 player_punch, 6 $5BBF player_crouch, 7 $5A4F player_strike. $5936 copies the word into the operand of the call at $5958."
  },
  {
   "address": 22836,
   "type": "line",
   "text": "The player's screen X ($7B16) before this frame's move, saved by $5936 and $1FAC."
  },
  {
   "address": 22837,
   "type": "line",
   "text": "The player's screen Y ($7B17) before this frame's move, saved by $5936 and $1FAC."
  },
  {
   "address": 22838,
   "type": "line",
   "text": "Called from the top interrupt at $64F8 each frame. Unless the game is paused ($6449) it saves the player's screen position in $5934/$5935 and runs the routine for the player's state $5923 (table at $5924, through a call whose operand is rewritten at $5959/$595A); it then draws the player's frames with $6121, also while paused."
  },
  {
   "address": 22873,
   "type": "line",
   "text": "Low byte of the address in the JSR at $5958 (high byte at $595A), rewritten by $594F and $5955 with the routine for the player's state from the table at $5924."
  },
  {
   "address": 22879,
   "type": "line",
   "text": "Scratch of $7A9C: the low byte of the 16-bit value it works on (camera minus a constant, plus the player's position), shifted right with the high byte $5960."
  },
  {
   "address": 22880,
   "type": "line",
   "text": "Scratch of $7A9C: the high byte of the 16-bit value it works on, shifted right 4 times (across) or 3 times (down) by $7A9C."
  },
  {
   "address": 22881,
   "type": "line",
   "text": "A lone RTS: the routine of player state 0 (entry 0 of the table at $5924), which does nothing."
  },
  {
   "address": 22882,
   "type": "line",
   "text": "Index of the current walk or climb frame, stepped by $5988, $59A9, $6056 and $6077."
  },
  {
   "address": 22883,
   "type": "line",
   "text": "The 18 sprite pointer values of the left-facing walk ($9D to $A2, three each), read by $5988 and $5C49."
  },
  {
   "address": 22901,
   "type": "line",
   "text": "The 18 sprite pointer values of the right-facing walk ($97 to $9C, three each), read by $59A9 and $5C49."
  },
  {
   "address": 22919,
   "type": "line",
   "text": "Toggled by $5988, $59A9, $6056 and $6077 so that the frame index advances on every second call."
  },
  {
   "address": 22920,
   "type": "line",
   "text": "Steps the left-facing walk animation: toggles $5987 and, on every other call, advances the index $5962 through the 18 frames at $5963, and on every call puts the frame in $611D. Called by $5C49."
  },
  {
   "address": 22953,
   "type": "line",
   "text": "The same for the right-facing walk: advances $5962 through the 18 frames at $5975 and puts the frame in $611D. Called by $5C49."
  },
  {
   "address": 22986,
   "type": "line",
   "text": "1 when the player faces left, 0 when he faces right."
  },
  {
   "address": 22987,
   "type": "line",
   "text": "The map column under the player (the Y that $7A9C returns), kept by $5C49 at $5D02 for the ladder tests at $5D23."
  },
  {
   "address": 22988,
   "type": "line",
   "text": "Sets the three sprite pointers in $611E, $611F and $6120 for the punch: $90, $B4, $BE when the player faces right ($59CA zero) and $91, $B5, $BF when he faces left. Called by $59F1 and $5C49."
  },
  {
   "address": 23025,
   "type": "line",
   "text": "Player state 5, punching (entry 5 of the table at $5924). While the punch timer $5C48 is non-zero it counts it down each frame and sets the punch frames through $59CC. When it has run out the state holds until fire ($1FA4 bit 4) is released, then returns to state 1 with the punch delay $5B40 set to 6."
  },
  {
   "address": 23056,
   "type": "line",
   "text": "Sets the three sprite pointers in $611E, $611F and $6120 for the strike: $8C, $A3, $B0 when the player faces right and $8D, $B1, $BB when he faces left. Called by $5A4F, $5BBF, $5C49 and $5F2B."
  },
  {
   "address": 23093,
   "type": "line",
   "text": "Table of the 13 height steps of state 7, signed 16-bit values: -6 up to +6, read by $5A4F through the index $5F29."
  },
  {
   "address": 23119,
   "type": "line",
   "text": "Player state 7, a strike or hop (entry 7 of the table at $5924). Adds the next step of the table at $5A35 (indexed by $5F29, two bytes a step) to the player's height $7B17; when the table is used up, or from index $0F on when the tile below is solid, it returns to state 1 (strike timer $5B3D and crouch flag $5B3E cleared, crouch delay $5B3F set to 10). It moves 2 pixels in the direction he faces ($59CA; left through $80AF, right through $8118, stopped by the map ends and solid tiles), puts frame $9B or $A1 in $611D and counts the strike timer $5B3D down with the strike frames ($5A10), setting the strike delay $5B3C to 10 when it runs out."
  },
  {
   "address": 23356,
   "type": "line",
   "text": "Set to 10 by $5A4F and $5F2B when the strike timer $5B3D runs out and counted down by them while it is zero. Nothing else in the traced code reads it."
  },
  {
   "address": 23357,
   "type": "line",
   "text": "Frames left of the strike; the hit test $1076, $6121 and $644A read it."
  },
  {
   "address": 23358,
   "type": "line",
   "text": "Non-zero while the player is crouching; $6121 and the contact test read it."
  },
  {
   "address": 23359,
   "type": "line",
   "text": "Delay before the player can crouch or strike from state 1: set to 10 when a strike or a crouch ends, to 4 when a climb ends and to 0 when a jump ends; counted down by $5C49."
  },
  {
   "address": 23360,
   "type": "line",
   "text": "Frames before the next punch can start: set to 6 when a punch ends ($59F1) and counted down by $5C49."
  },
  {
   "address": 23361,
   "type": "line",
   "text": "Delay before the next jump can start: set to 10 on every frame of a climb ($5B42) and counted down by $5C49, which starts a jump only when it is zero."
  },
  {
   "address": 23362,
   "type": "line",
   "text": "Player state 4, climbing (entry 4 of the table at $5924). Sets the jump delay $5B41 to 10. With up held ($1FA4 bit 0) it takes 1 off the player's height $7B17, sets the climb direction $603D to 1 and steps the frame with $6056; with down held (bit 1) it adds 1, sets $603D to 0 and steps the frame with $6077. It then looks at the tile one row below ($7A9C): while that is the ladder tile $0E or $0D the state stays 4. Otherwise it returns to state 1, sets the crouch delay $5B3F to 4, puts the standing frame $9A (facing right) or $A0 (left) in $611D and, if $603D is 1, adds 2 to the height $7B17."
  },
  {
   "address": 23487,
   "type": "line",
   "text": "Player state 6, crouching (entry 6 of the table at $5924). Fire ($1FA4 bit 4) starts a strike: state 7, index $5F29 cleared, strike timer $5B3D set to $0E, strike frames ($5A10) and sound effect 0 through $B0EE. With down released it returns to state 1 with the crouch delay $5B3F set to 10 and the crouch flag $5B3E cleared. While down is held, and the recoil $1725 is not running, left and right turn him ($59CA) and the crouch frames ($5C23) are set."
  },
  {
   "address": 23524,
   "type": "line",
   "text": "Holds the Y register saved by $5BDB: the immediate operand of the LDY at $5BE3."
  },
  {
   "address": 23526,
   "type": "line",
   "text": "Holds the X register saved by $5BD8: the immediate operand of the LDX at $5BE5."
  },
  {
   "address": 23587,
   "type": "line",
   "text": "Sets the three sprite pointers in $611E, $611F and $6120 for the crouch: $92, $B6, $C0 when the player faces right and $93, $B7, $C1 when he faces left. Called by $5BBF and $5C49."
  },
  {
   "address": 23624,
   "type": "line",
   "text": "Frames left of the punch; the hit test $1076, $6121 and $644A read it."
  },
  {
   "address": 23625,
   "type": "line",
   "text": "Player state 1, standing and walking (entry 1 of the table at $5924). Counts down the jump delay $5B41, clears the hit flags $1074/$1075 and the strike timer $5B3D, then moves 2 pixels left or right from the joystick $1FA4 (bits 2 and 3): it sets the facing $59CA, steps the walk animation ($5988, $59A9) unless the recoil $1725 runs, and is stopped by a blocker ($80AF, $8118), by the ends of the map (map X $1EA0/$1EA1 below $0072 or from $0398 on) and by a solid tile (1 to $0C; the player's X is put back from $5934). It then goes to state 2 when the tile below is empty or $0E and up, and otherwise starts a climb (state 4: up held with the ladder tile $0E at the player's column, or down held with the ladder-top tile $0D below while the area trigger flag $1F69 is clear), a jump (up held, state 3, when $5B41 is zero), a strike (down and fire, state 7) or a crouch (down, state 6) when $5B3F is zero, a punch (fire, state 5, when $5B40 is zero), or with the stick centred shows the standing frame ($5E09)."
  },
  {
   "address": 23983,
   "type": "line",
   "text": "Holds the Y register saved by $5DA6: the immediate operand of the LDY at $5DAE."
  },
  {
   "address": 23985,
   "type": "line",
   "text": "Holds the X register saved by $5DA3: the immediate operand of the LDX at $5DB0."
  },
  {
   "address": 24052,
   "type": "line",
   "text": "Holds the Y register saved by $5DEB: the immediate operand of the LDY at $5DF3."
  },
  {
   "address": 24054,
   "type": "line",
   "text": "Holds the X register saved by $5DE8: the immediate operand of the LDX at $5DF5."
  },
  {
   "address": 24073,
   "type": "line",
   "text": "Puts the standing frame in $611D: $9A when the player faces right and $A0 when he faces left. Called by $5C49 and $5E1C."
  },
  {
   "address": 24092,
   "type": "line",
   "text": "Player state 2, falling (entry 2 of the table at $5924). Clears the hit flag $1074, moves left and right from the joystick as in state 1 (facing $59CA, blockers $80AF/$8118, map ends, solid tiles; no walk animation), then lowers him by 3 lines a frame (2 from line $82, none from line $97) and, when the tile below is solid, returns to state 1 with the standing frame ($5E09); otherwise it shows the falling frame ($602A)."
  },
  {
   "address": 24264,
   "type": "line",
   "text": "Puts the falling frame in $611D: $7A when the player faces right and $7B when he faces left. Called by $5E1C."
  },
  {
   "address": 24283,
   "type": "line",
   "text": "Table of the 39 height steps of the jump, signed 16-bit values, two bytes each, read by $5F2B through the index $5F29: from -4 at the start to +4 near the end."
  },
  {
   "address": 24361,
   "type": "line",
   "text": "Index into the jump and strike height tables ($5EDB, $5A35), two bytes a step; cleared when a jump or a strike starts ($5C49, $5BBF) and stepped by $5F2B and $5A4F."
  },
  {
   "address": 24362,
   "type": "line",
   "text": "When non-zero, the state $6121 draws this frame instead of $5923; cleared by $6121 after use."
  },
  {
   "address": 24363,
   "type": "line",
   "text": "Player state 3, a jump (entry 3 of the table at $5924). Adds the next step of the table at $5EDB (indexed by $5F29) to the player's height $7B17. When the table is used up, or from index $29 on when the tile below is solid, it returns to state 1 (draw override $5F2A set to 3, strike timer $5B3D and crouch delay $5B3F cleared). It steers left and right from the joystick as in state 1 (facing $59CA, blockers $80AF/$8118, map ends, solid tiles), counts a running strike timer down with the strike frames ($5A10), and shows the jump frame ($602A)."
  },
  {
   "address": 24618,
   "type": "line",
   "text": "Puts the jump frame in $611D: $F8 when the player faces right and $F9 when he faces left. Called by $5D59 when a jump starts and by $5F2B at the end of every frame of the jump."
  },
  {
   "address": 24637,
   "type": "line",
   "text": "1 while the player climbs up and 0 while he climbs down; set by $5B42 and by $5C49 when a climb starts, and read by $5B42 at the end of a climb."
  },
  {
   "address": 24638,
   "type": "line",
   "text": "Twelve sprite pointer values of the climb upwards ($94 to $96), indexed by $5962 in $6056."
  },
  {
   "address": 24650,
   "type": "line",
   "text": "Twelve sprite pointer values of the climb downwards ($94 to $96), indexed by $5962 in $6077."
  },
  {
   "address": 24662,
   "type": "line",
   "text": "Advances the climb frame upwards: toggles $5987 and, on every other call, steps $5962 through 12, and on every call puts the frame from the table at $603E in $611D. Called by $5B42."
  },
  {
   "address": 24695,
   "type": "line",
   "text": "Advances the climb frame downwards: toggles $5987, which decides whether $5962 steps on through 12, and on every call puts the frame from the table at $604A in $611D. Called by $5B42."
  },
  {
   "address": 24728,
   "type": "line",
   "text": "Fills with $FF the entries of the sorted sprite list at $0010 that each of the 11 slots used last frame (their positions are in $02-$0C). Called by the middle interrupt at $63BF."
  },
  {
   "address": 24775,
   "type": "line",
   "text": "Turns each slot's world position ($79/$B1 across, $95/$CD down) into a screen position by subtracting the camera ($CB/$CC and $D9/$DA): across into $87,X and $BF,X, down into $A3,X and $DB,X. A slot off the screen (X of $0150 or more, or height outside $23 to $C7) gets place 0; one on the screen goes to the first free place from its height / 2 in the list at $0010, and its place is kept in $02,X. Ends the list with $64 in $78. Called by the top interrupt at $64D6, before the multiplexer $66D5."
  },
  {
   "address": 24861,
   "type": "line",
   "text": "Sprite pointer value of the player's main frame, used by $6121 in every case."
  },
  {
   "address": 24862,
   "type": "line",
   "text": "Sprite pointer for the player's sprite 2 while he punches, strikes or crouches; read by $6121."
  },
  {
   "address": 24863,
   "type": "line",
   "text": "Sprite pointer for the player's sprite 0 while he punches, strikes or crouches; read by $6121."
  },
  {
   "address": 24864,
   "type": "line",
   "text": "Sprite pointer for the player's sprite 1 while he punches, strikes or crouches; read by $6121."
  },
  {
   "address": 24865,
   "type": "line",
   "text": "Writes the player's three sprite pointers into both screens' tables ($CFF8-$CFFA and $CBF8-$CBFA). The state drawn is $5923, or the value in $5F2A when that is non-zero (which it then clears). For states 2 and 3 sprite 2 gets $611D and sprites 0 and 1 get that plus 2 and plus 4 more, for state 4 the pointers are $611D (sprite 2), plus $24 (sprite 0) and plus $2E (sprite 1); while the punch timer $5C48, the crouch flag $5B3E or the strike timer $5B3D is set they come from $611E (sprite 2), $611F (sprite 0) and $6120 (sprite 1), and otherwise sprite 0 gets $611D, sprite 1 that plus $0D and sprite 2 that minus $17. Called by $5936."
  },
  {
   "address": 25020,
   "type": "line",
   "text": "Called by the hit test $1076 (at $1142 and $11C5) with X the slot and Y the object. Takes 2 (when $1075 is set) or 1 from the object's energy $0BF8 and adds 4 to the score digit 5 ($5816); when the energy is already zero it instead sets the finale flag $621F and the timer $6221 to $16 for an object of variant 1 ($0C3E), and otherwise copies the slot's state to the object's counter $0B6C, sets the slot ($0ACC) and the object ($0B26) to state $10 and the next object's counter $0B6D to $FE. In both cases it then adds 8 to the score digit 5."
  },
  {
   "address": 25065,
   "type": "line",
   "text": "Holds the slot index saved by $61DE: the immediate operand of the LDX at $61E8."
  },
  {
   "address": 25117,
   "type": "line",
   "text": "Holds the slot index saved by $6212: the immediate operand of the LDX at $621C."
  },
  {
   "address": 25119,
   "type": "line",
   "text": "Set to 1 by $61BC when an object of variant 1 is beaten; while it is set $6313 stops reading the joystick and $93AF steers the player. Cleared by the setup."
  },
  {
   "address": 25120,
   "type": "line",
   "text": "Set to 1 by $93AF at the end of the finale; the main loop at $1F20 then shows the ending screen $75EA. Cleared by the setup."
  },
  {
   "address": 25121,
   "type": "line",
   "text": "Set to $16 by $61BC when the finale starts and counted down by $93AF; while it runs, objects 52 and 53 move down 1 pixel a frame."
  },
  {
   "address": 25122,
   "type": "line",
   "text": "Frames before the ending screen: $93AF starts it at $C8 once the player has reached map position $01BE and counts it down. Cleared by the setup."
  },
  {
   "address": 25123,
   "type": "line",
   "text": "Sprite pointers of behaviour $6271 for variant 0, indexed by the phase $0AA2 (0 to $1D): the shape $18 for phases 0 to 9, then 0 for the other twenty."
  },
  {
   "address": 25153,
   "type": "line",
   "text": "Sprite pointers $19, $1A and $1B, ten each, indexed by the phase $0AA2 of the previous slot: the frame $1DF5 gives a state 7 slot when the previous slot is in state $10. The extent is the run of the pattern."
  },
  {
   "address": 25183,
   "type": "line",
   "text": "Sprite pointers of behaviour $6271 for variant 1: the shape $18 for phases 0 to 5, then 0 for the next twelve (18 bytes in all). The phase can run to $1D, which would read the code after it; no variant 1 enemy gets here, since $61BC turns its defeat into the finale."
  },
  {
   "address": 25201,
   "type": "line",
   "text": "Behaviour for state $10 (entry 16 of the table at $124F), which $61BC gives an enemy whose energy has run out. Colour 9, multicolour. The next object's counter $0B6D, which $61BC sets to $FE, counts down by 1 each frame; when it is zero the routine goes on into $62C2 and the enemy gets up again. The phase $0AA2 (which the hit test $1076 has just cleared) steps with that counter: at $1E or more it counts up to $1D, below that down to 0. The pointer comes from $625F (variant 1) or $6223 by the phase: ten frames of the shape $18, then 0, so the enemy shows for ten frames, vanishes, and shows again for the ten frames before it gets up."
  },
  {
   "address": 25282,
   "type": "line",
   "text": "Reached by the branch at $627E from behave_knocked_down when the next object's counter $0B6D has counted down to zero. Sets the object's energy $0BF8 to 3 and gives slot and object their old state again: the counter $0B6C holds the state that $61BC saved there, and a value of 3 or more (14 or 15) has $0D taken off to give 1 or 2. It then sets the walking pointer: for state 1, $05 ($14 for variant 1); for state 2, $02 ($10 for variant 1). A knocked-down enemy gets up and walks again."
  },
  {
   "address": 25341,
   "type": "line",
   "text": "Sets the screen matrix bits of $D018 to $30 (screen at $CC00) when $1FA7 is zero and to $20 ($C800) when it is not, keeping the other bits. Called by the top interrupt at $64AF."
  },
  {
   "address": 25363,
   "type": "line",
   "text": "Raster interrupt 2 of 3 (vector $6313), on line $C5 (set by $6486). Saves A, X and Y in the operands at $63E6, $63E8 and $63EA, moves sprites 3-7 to line $0A, clears all sprite pointers $CFF8-$CFFF and $CBF8-$CBFF, turns the sprites off, writes $D018 for screen $CC00 and ORs $4F into $D011 for the panel, and acknowledges the interrupt. It counts down the hurt guard $5447 and the recoil $1725, reads joystick port 2 ($DC00, $DC01) into $1FA4 and $1FA5 unless the recoil is running or the finale flag $621F is set, sets the character set bits of $D018 to 8, runs the sprite list clear $6098, the timer $7B59 and the finale step $93AF, and toggles $63ED (counting $63EC down on every second frame). It sets line $CD and the vector $63EE for the next interrupt."
  },
  {
   "address": 25574,
   "type": "line",
   "text": "Holds the A register saved by irq_mid at $6313: the immediate operand of the LDA at $63E5."
  },
  {
   "address": 25576,
   "type": "line",
   "text": "Holds the X register saved by irq_mid at $6316: the immediate operand of the LDX at $63E7."
  },
  {
   "address": 25578,
   "type": "line",
   "text": "Holds the Y register saved by irq_mid at $6319: the immediate operand of the LDY at $63E9."
  },
  {
   "address": 25580,
   "type": "line",
   "text": "Counted down on every second frame by $6313 while it is not zero; nothing else in the traced code reads it."
  },
  {
   "address": 25581,
   "type": "line",
   "text": "Toggled between 0 and 1 by $6313 on every frame."
  },
  {
   "address": 25582,
   "type": "line",
   "text": "Raster interrupt 3 of 3 (vector $63EE), on line $CD (set by $6313). Saves A, X and Y in the operands at $6443, $6445 and $6447, ORs $2F into $D011 and $17 into $D016 and writes them back after 18 NOPs, which switches the status panel on (bitmap mode, multicolour), acknowledges the interrupt, sets raster line 0 and the vector $6486, clears bit 6 of $D011 and calls the scroll step $1FAC unless the banner flag $56A1 is set. It then restores A, X and Y and returns."
  },
  {
   "address": 25667,
   "type": "line",
   "text": "Holds the A register saved by irq_bottom at $63EE: the immediate operand of the LDA at $6442."
  },
  {
   "address": 25669,
   "type": "line",
   "text": "Holds the X register saved by irq_bottom at $63F1: the immediate operand of the LDX at $6444."
  },
  {
   "address": 25671,
   "type": "line",
   "text": "Holds the Y register saved by irq_bottom at $63F4: the immediate operand of the LDY at $6446."
  },
  {
   "address": 25673,
   "type": "line",
   "text": "1 while the game is paused ($74B1); the interrupts and routines skip the moving parts while it is set. Also set by the wipe $7413."
  },
  {
   "address": 25674,
   "type": "line",
   "text": "Moves sprite 0 ($D000) by 8 pixels along X while the punch timer $5C48 runs, or sprite 1 ($D002) while the strike timer $5B3D runs, to the right when the player faces right ($59CA zero) and to the left otherwise; does nothing when neither timer runs. Called by the top interrupt at $6523."
  },
  {
   "address": 25734,
   "type": "line",
   "text": "Raster interrupt 1 of 3 (vector $6486), on line 0 (set by $63EE). Saves A, X and Y in the operands at $656A, $656C and $656E, sets the fine scroll from $1FA1 ($D016) and $1FA2 ($D011), $D018 to $34, the screen ($62FD) and the multicolours. With the banner flag $56A1 set it calls $555F and goes to line $C5. Otherwise it sorts the sprites ($60C7), turns the sprites on unless the wipe flag $7411 is set, runs the first multiplexer pass ($66D5, limit $29), the player ($5936), places the player's sprites (X $7B16, Y $7B17) with $644A, makes sprites 0 and 1 white while the recoil $1725 is non-zero (colour 0 otherwise) and plays the sound ($B176). A second pass ($66D5, limit $8C), the colour copy $6AB4 and the object update $11D8 follow, then line $C5 and the vector $6313."
  },
  {
   "address": 25962,
   "type": "line",
   "text": "Holds the A register saved by irq_top at $6486: the immediate operand of the LDA at $6569."
  },
  {
   "address": 25964,
   "type": "line",
   "text": "Holds the X register saved by irq_top at $6489: the immediate operand of the LDX at $656B."
  },
  {
   "address": 25966,
   "type": "line",
   "text": "Holds the Y register saved by irq_top at $648C: the immediate operand of the LDY at $656D."
  },
  {
   "address": 25968,
   "type": "line",
   "text": "Busy-wait: the outer count is A and the inner count is A as well (Y and X both start from A), so the callers' values from $14 to $FF give delays from a few milliseconds to about a third of a second. Used by the wipe, the game over, continue, briefing and ending screens."
  },
  {
   "address": 25977,
   "type": "line",
   "text": "The first output of the step $6593: the entry of the table $657A at the index $65B8. Nothing reads it. The file holds 0."
  },
  {
   "address": 25978,
   "type": "line",
   "text": "Eight values read by $6593 by the index $65B8: $01, $0F, $0C, $0B, $00, $0B, $0C, $0F (they read as the C64 colours white, light grey, grey, dark grey, black and back up)."
  },
  {
   "address": 25986,
   "type": "line",
   "text": "Eight values read by $6593 by the index $65B8 into $65BA: $01, $03, $0E, $06, $00, $06, $0E, $03 (white, cyan, light blue, blue, black and back up, if they are colours)."
  },
  {
   "address": 25994,
   "type": "line",
   "text": "No caller: nothing calls, jumps to or branches to it. When the delay $65B9 is not zero it counts it down and returns; when it is zero it falls on into the step at $6593."
  },
  {
   "address": 26003,
   "type": "line",
   "text": "Entered only by falling through from $658A, which nothing calls. Sets the delay $65B9 to 3, steps the index $65B8 through 0 to 7 (back to 0 after 7) and copies the entry at that index of the three tables $657A, $6582 and $65BC to $6579, $65BA and $65BB. Nothing reads those three bytes."
  },
  {
   "address": 26040,
   "type": "line",
   "text": "Index 0 to 7 of the step $6593 into the three tables $657A, $6582 and $65BC. The file holds 0."
  },
  {
   "address": 26041,
   "type": "line",
   "text": "Delay of the step $6593: it sets it to 3 and $658A counts it down to zero before the next step. The file holds 0."
  },
  {
   "address": 26042,
   "type": "line",
   "text": "The second output of the step $6593: the entry of the table $6582 at the index $65B8. Nothing reads it. The file holds 0."
  },
  {
   "address": 26043,
   "type": "line",
   "text": "The third output of the step $6593: the entry of the table $65BC at the index $65B8. Nothing reads it. The file holds 0."
  },
  {
   "address": 26044,
   "type": "line",
   "text": "Eight values read by $6593 by the index $65B8 into $65BB: $09, $08, $0A, $07, $01, $07, $0A, $08 (brown, orange, light red, yellow, white and back, if they are colours)."
  },
  {
   "address": 26052,
   "type": "line",
   "text": "Returns a pseudo-random byte in A. It stores the low three bits of CIA 1 timer A ($DC04) as the offset of the branch at $65D4, adds the timer's high byte ($DC05) to the seed $65E3, and rotates the sum left through the carry (set) by a number of places from 2 to 9 that the patched branch picks. The result is the new seed and the return value. Called by the behaviours at $18EB, $191A, $1B2F and $1B5E, which compare it with a limit."
  },
  {
   "address": 26069,
   "type": "line",
   "text": "The offset of the BCS at $65D4, rewritten by $65C4 (at $65C9) with the low three bits of $DC04, so that the branch lands between $65D6 and $65DD in the chain of ROL instructions up to $65DE. The file holds $FE."
  },
  {
   "address": 26083,
   "type": "line",
   "text": "The seed of $65C4: replaced by each result. The file holds $80."
  },
  {
   "address": 26084,
   "type": "line",
   "text": "A lone RTS, called once per pass by the main loop at $1F02. The bytes after it ($65E5-$65F3) read $DD00 and would jump to $0810, but the traced code never reaches them."
  },
  {
   "address": 26085,
   "type": "line",
   "text": "Reads $DD00 (CIA 2 port A) and returns when bit 2 is set. When it is clear it removes three bytes from the stack (three PLA), disables interrupts and jumps to $0810. Nothing reaches it: the main loop calls $65E4, which is an RTS."
  },
  {
   "address": 26100,
   "type": "line",
   "text": "Fills the 1 KB screen matrix at $CC00-$CFFF with A. Called by the setup, the game over, continue, briefing and ending screens."
  },
  {
   "address": 26118,
   "type": "line",
   "text": "Fills colour RAM $D800-$DBFF with A. Called by the game over, continue, briefing and ending screens."
  },
  {
   "address": 26136,
   "type": "line",
   "text": "Key code read by $6619 and stored by $2067; $50 pauses ($74B1), $20 can end the level (main loop at $1F37)."
  },
  {
   "address": 26137,
   "type": "line",
   "text": "Reads the keyboard with CIA 1 into A. Returns $FF at once when any of the low five bits of $DC00 AND $DC01 reads low (the test at $6624, so while the joystick or a key in that range is down); otherwise scans the eight rows from $6690, looks the key up in the table at $6693 and returns its code (also keeping the table index in $02A7). $2067 keeps the result in $6618."
  },
  {
   "address": 26255,
   "type": "line",
   "text": "1 zero byte between read_keys ($6619-$668E) and key_row_select ($6690) ($668F), no reader."
  },
  {
   "address": 26256,
   "type": "line",
   "text": "The row select value written to $DC00 by $6619 while it scans the keyboard, rotated one bit for each row."
  },
  {
   "address": 26257,
   "type": "line",
   "text": "The number of the keyboard row $6619 is scanning."
  },
  {
   "address": 26258,
   "type": "line",
   "text": "The column bits read from $DC01 for the row being scanned by $6619."
  },
  {
   "address": 26259,
   "type": "line",
   "text": "Key codes for the 64 keys of the matrix, indexed by 8 times the column plus the row; $80 and above mean no code. Read by $6619."
  },
  {
   "address": 26323,
   "type": "line",
   "text": "Index into the sprite list at $0010 of the last slot the multiplexer handled; set to $10 by the top interrupt before each frame's first pass."
  },
  {
   "address": 26324,
   "type": "line",
   "text": "Raster line limit for the multiplexer: $29 for the first pass, $8C for the second."
  },
  {
   "address": 26325,
   "type": "line",
   "text": "Sprite multiplexer for sprites 3 to 7, called twice a frame by the top interrupt $6486 (with the raster limit $29 and then $8C in $66D4). Takes the next entry of the sorted sprite list at $0010 (position kept in $66D3, $64 ends the list) and, while the raster line is below the limit, gives it the next of the five sprites whose previous slot has finished (its height more than $15 lines above the raster): height into $D007, $D009, $D00B, $D00D or $D00F, X into $D006, $D008, $D00A, $D00C or $D00E with its ninth bit in $D010, the pointer $0A6A into both screens' tables ($CFFB-$CFFF and $CBFB-$CBFF), the colour $0A78 and the multicolour bit $0A86."
  },
  {
   "address": 26829,
   "type": "line",
   "text": "Bit masks for sprites 2 to 7 ($04, $08, $10, $20, $40, $80) followed by their complements ($FB, $F7, $EF, $DF, $BF, $7F). No code reads them: the multiplexer $66D5 and the interrupts use immediate masks."
  },
  {
   "address": 26841,
   "type": "line",
   "text": "Set to 1 by $68DA when it has copied rows 10 and 11 of the colour buffer; read and cleared by $6AB4, which then copies rows 12 to 18, and cleared by the setup $51F7 ($5268)."
  },
  {
   "address": 26842,
   "type": "line",
   "text": "Copies the colours of screen rows 10 and 11 from the colour buffer to colour RAM: 39 colours of each row ($71F4-$721A to $D990-$D9B6 and $721C-$7242 to $D9B8-$D9DE, leaving out the last column of each), and sets the flag $68D9 so that the top interrupt copies rows 12 to 18 through $6AB4. Called by the finish phase of every scroll ($2108, $2667, $2A00, $2D6D and the others)."
  },
  {
   "address": 27316,
   "type": "line",
   "text": "When the flag $68D9 is set, clears it and copies the colour buffer $7244-$735A to colour RAM $D9E0-$DAF6 (screen rows 12 to 18, 39 characters in each, leaving out the last column of each row); otherwise returns at once. Called every frame by the top interrupt at $654C."
  },
  {
   "address": 28263,
   "type": "line",
   "text": "Last part of the copy of the colour buffer $7244-$735A to colour RAM: screen rows 16, 17 and 18, 39 colours each, from $72E4, $730C and $7334 to $DA80, $DAA8 and $DAD0, ending with the RTS at $7125."
  },
  {
   "address": 28966,
   "type": "line",
   "text": "No caller: nothing calls or jumps to it. Jumps to colour_buffer_from_cc ($3946) when the buffer flag $1FA7 is non-zero and to colour_buffer_from_c8 ($459E) when it is zero; the phase 2 routines of the scrolls make the same choice themselves."
  },
  {
   "address": 28977,
   "type": "line",
   "text": "Fills colour RAM rows 0 to 9 ($D800-$D98F) from the matrix just made: for each column Y from $28 down to 0 and each of the 10 rows it looks up the colour of the character in the colour table $BF00. It reads $C800 when the buffer flag $1FA7 is 0 and $CC00 when it is 1. Called by the finish phase of every scroll ($2108, $2667, $2A00 and others)."
  },
  {
   "address": 29172,
   "type": "line",
   "text": "Colours for screen rows 10 and 11, 40 bytes a row (80 bytes), built from the screen matrix by $3946 and $459E (columns 0 to 38 of each row; the last byte of each row is never written) and copied to colour RAM from $D990 by $68DA. Rows 12 to 18 follow at $7244."
  },
  {
   "address": 29252,
   "type": "line",
   "text": "Colours for screen rows 12 to 18, 40 bytes a row, one for each character; $6AB4 copies 39 of each 40 to colour RAM from $D9E0. The extent is what $6AB4 reads."
  },
  {
   "address": 29531,
   "type": "line",
   "text": "121 zero bytes between colour_buffer ($7244-$735A) and wipe_lengths ($73D4) ($735B-$73D3), no reader."
  },
  {
   "address": 29652,
   "type": "line",
   "text": "Lengths of the 56 diagonal lines of the wipe in $7413."
  },
  {
   "address": 29708,
   "type": "line",
   "text": "Two bytes ($01, $00) after the 56 lengths in $73D4 that $7413 does not read."
  },
  {
   "address": 29710,
   "type": "line",
   "text": "Characters still to clear on the diagonal line $7413 is drawing: loaded from $73D4 and counted down until it is zero."
  },
  {
   "address": 29711,
   "type": "line",
   "text": "Low byte of the start address of the diagonal line $7413 is drawing in screen B."
  },
  {
   "address": 29712,
   "type": "line",
   "text": "High byte of the start address of the diagonal line $7413 is drawing in screen B."
  },
  {
   "address": 29713,
   "type": "line",
   "text": "Set to 1 by $7413 and cleared by the setup; while it is set the top interrupt $6486 does not turn the sprites on."
  },
  {
   "address": 29714,
   "type": "line",
   "text": "1 zero byte between wipe_flag ($7411) and screen_wipe ($7413) ($7412), no reader."
  },
  {
   "address": 29715,
   "type": "line",
   "text": "Wipes the screen: sets the wipe flag $7411 and the pause flag $6449, then clears both screen matrices ($CC00 and $C800) in 56 diagonal lines, each stepping 39 characters from its start with the lengths taken from $73D4, a delay through $6570 after each, and clears the pause flag at the end. The first 39 lines start along the top row, the rest down the right edge. Called by the game over screen $587B and the ending screen $75EA."
  },
  {
   "address": 29804,
   "type": "line",
   "text": "Holds the line number saved by $7460: the immediate operand of the LDX at $746B."
  },
  {
   "address": 29806,
   "type": "line",
   "text": "Holds the Y register saved by $7463: the immediate operand of the LDY at $746D."
  },
  {
   "address": 29873,
   "type": "line",
   "text": "Pause: when the key code in $6618 is $50, sets $6449, waits for the key to be released, pressed again and released, then clears $6449. Called by the main loop at $1F1D."
  },
  {
   "address": 29912,
   "type": "line",
   "text": "Types the ending text from $756B on the screen one character at a time, from $CC56, with a delay through $6570 after each: adds $66 to each code (a space becomes 0), $FF ends a line (the pointer moves on 2 rows) and a second $FF ends the text, which then waits for fire (bit 4 of $DC00), sets $9464 to 1 and runs two long delays. It first waits, clears the screen and fills colour RAM with 7. Called by the ending screen $75EA."
  },
  {
   "address": 29970,
   "type": "line",
   "text": "Holds the Y register saved by $7509: the immediate operand of the LDY at $7511."
  },
  {
   "address": 30059,
   "type": "line",
   "text": "The ending text in screen codes (letters as 1 to 26, doubled spaces as in the briefing): game completed, Strack falls to his doom, Darkman rescues his true love, \"end of line\". Each line ends with $FF and a second $FF ends the text; typed by $74D8."
  },
  {
   "address": 30186,
   "type": "line",
   "text": "The ending screen, called by the main loop at $1F25 when the ending flag $6220 is set or when $0A11 is set and the key code $6618 is $20. Runs the wipe $7413, stops the sound ($B828), switches to the text screen, swaps the character shapes ($9670), clears the screen, types the ending text through $74D8, waits one long delay and puts the shapes back."
  },
  {
   "address": 30281,
   "type": "line",
   "text": "The 70 starting types of the objects, copied to obj_type $0B26 by $7A1D (the 14 tables from $7649 to $7A1C are 70 bytes apart)."
  },
  {
   "address": 30351,
   "type": "line",
   "text": "The 70 starting values of obj_counter $0B6C, copied by $7A1D."
  },
  {
   "address": 30421,
   "type": "line",
   "text": "The 70 starting values of obj_flag $0BB2, copied by $7A1D."
  },
  {
   "address": 30491,
   "type": "line",
   "text": "The 70 starting values of obj_energy $0BF8, copied by $7A1D."
  },
  {
   "address": 30561,
   "type": "line",
   "text": "The 70 starting values of obj_variant $0C3E, copied by $7A1D."
  },
  {
   "address": 30631,
   "type": "line",
   "text": "The 70 starting values of obj_flag_b $0C84, copied by $7A1D."
  },
  {
   "address": 30701,
   "type": "line",
   "text": "The 70 starting values of obj_left_lo $0CCA, copied by $7A1D."
  },
  {
   "address": 30771,
   "type": "line",
   "text": "The 70 starting values of obj_left_hi $0D10, copied by $7A1D."
  },
  {
   "address": 30841,
   "type": "line",
   "text": "The 70 starting values of obj_right_lo $0D56, copied by $7A1D."
  },
  {
   "address": 30911,
   "type": "line",
   "text": "The 70 starting values of obj_right_hi $0D9C, copied by $7A1D."
  },
  {
   "address": 30981,
   "type": "line",
   "text": "The 70 starting values of obj_x_lo $0DE2, copied by $7A1D."
  },
  {
   "address": 31051,
   "type": "line",
   "text": "The 70 starting values of obj_x_hi $0E28, copied by $7A1D."
  },
  {
   "address": 31121,
   "type": "line",
   "text": "The 70 starting values of obj_y_lo $0E6E, copied by $7A1D."
  },
  {
   "address": 31191,
   "type": "line",
   "text": "The 70 starting values of obj_y_hi $0EB4, copied by $7A1D."
  },
  {
   "address": 31261,
   "type": "line",
   "text": "Copies the 70 entries of the 14 object tables from the level data at $7649-$7A1C into the working tables $0B26-$0EF9 (type, counter, flag, energy, variant, second flag, left and right limits, X and Y), clears the slot links $0F08 and the active flags $101A, and zeroes the 14-byte slot tables $0A94, $0AB0, $0ABE, $0ACC, $0EFA and $11CA. Called once by the setup $51F7 at $530D."
  },
  {
   "address": 31388,
   "type": "line",
   "text": "Finds the player's place in the level map for the player state routines ($5A80, $5AFA, $5B7A, $5CEE, $5CFF, $5E7E, $5EAB, $5F5A and $5FE5). Y becomes the map column: (camera X $CB/$CC minus $86 plus the player's X $7B16) divided by 16, minus 1; the sum before the division is left in $1EA0/$1EA1. X becomes twice the map row: (camera Y $D9/$DA minus $AE plus the player's Y $7B17) divided by 8, with bit 0 cleared; it picks a word in the table at $7EF7, which is stored in $E9/$EA as the address of that row of the map. Uses $595F/$5960 as scratch."
  },
  {
   "address": 31510,
   "type": "line",
   "text": "The player's screen X (sprite coordinates), $74 at the start; sprites 0, 1 and 2 are placed at this X by $6486, and the scroll routines change it."
  },
  {
   "address": 31511,
   "type": "line",
   "text": "The player's screen Y, $82 at the start; sprites 0 and 2 are placed at it and sprite 1 21 lines below."
  },
  {
   "address": 31512,
   "type": "line",
   "text": "Units digit of the timer; the timer is $7B18 (units), $7B19 (tens) and $7B1A (hundreds), counted down by $7B59 and drawn by $7B1B."
  },
  {
   "address": 31513,
   "type": "line",
   "text": "Tens digit of the timer (see $7B18)."
  },
  {
   "address": 31514,
   "type": "line",
   "text": "Hundreds digit of the timer (see $7B18); the setup sets it to 5 when $0A10 is set and to 0 otherwise."
  },
  {
   "address": 31515,
   "type": "line",
   "text": "Draws the three timer digits into the panel's character shapes at $F9D8 (hundreds, $7B1A), $F9E8 (tens, $7B19) and $F9F0 (units, $7B18) through $7B43. Called by the main loop at $1F1A."
  },
  {
   "address": 31555,
   "type": "line",
   "text": "Copies the 8-byte shape of the timer digit $7B18+X from $1EA2 to the pointer $85/$86. Called three times by $7B1B."
  },
  {
   "address": 31576,
   "type": "line",
   "text": "Alternates 1 and 0 on each call of $7B59, which counts the timer down only when it finds 0."
  },
  {
   "address": 31577,
   "type": "line",
   "text": "Called by the middle interrupt $6313 at $63C2 every frame; does nothing while the game is paused ($6449). When the three timer digits $7B18-$7B1A are zero it clears $0A10 and sets the timer state $7BCC to 1; otherwise on every second call ($7B58 alternates 1 and 0) it counts the digits down by one, the units first."
  },
  {
   "address": 31675,
   "type": "line",
   "text": "Called by the main loop at $1F17. When the timer state $7BCC is 1 it sets it to 2 and runs $7C36, which replaces the timer's picture in the panel; in any other state it does nothing."
  },
  {
   "address": 31692,
   "type": "line",
   "text": "Set to 1 by $7B59 when the timer reaches zero; $7BBB then steps it to 2 and changes the panel graphics."
  },
  {
   "address": 31693,
   "type": "line",
   "text": "Copies the panel's timer picture for a running timer: five rows of 48 bytes from $7DCB, $7DFB, $7E2B, $7E5B and $7E8B to the bitmap at $F8C0, $FA00, $FB40, $FC80 and $FDC0, then five rows of 6 bytes from $7EBB, $7EC1, $7EC7, $7ECD and $7ED3 to colour RAM $DB18, $DB40, $DB68, $DB90 and $DBB8, and five from $7ED9, $7EDF, $7EE5, $7EEB and $7EF1 to the screen characters $CF18, $CF40, $CF68, $CF90 and $CFB8. Called by draw_panel ($53D2) when $0A10 is set."
  },
  {
   "address": 31798,
   "type": "line",
   "text": "The same copy as timer_graphics_on ($7BCD) with the picture for an expired or absent timer: rows of 48 bytes from $7C9F, $7CCF, $7CFF, $7D2F and $7D5F, five 6-byte colour rows from $7D8F, $7D95, $7D9B, $7DA1 and $7DA7 and five 6-byte screen character rows from $7DAD, $7DB3, $7DB9, $7DBF and $7DC5, to the same panel places. Called by draw_panel ($53CC) when $0A10 is clear and by timer_expired ($7BC8)."
  },
  {
   "address": 31903,
   "type": "line",
   "text": "The panel picture for an expired or absent timer: five rows of 48 bitmap bytes, then ten rows of 6 bytes (five colour rows and five screen character rows), copied by $7C36. The extent is what $7C36 reads."
  },
  {
   "address": 32203,
   "type": "line",
   "text": "The panel picture for a running timer, laid out like timer_picture_off ($7C9F): five rows of 48 bitmap bytes, then ten rows of 6 bytes, copied by $7BCD. The extent is what $7BCD reads."
  },
  {
   "address": 32503,
   "type": "line",
   "text": "Table of 77 16-bit pointers to the map rows, the first one twice: entry k from 1 on is $8182 + 64 x (k - 1). It starts on an odd address because $7A9C reads the low byte from $7EF7,X and the high byte from $7EF8,X with X twice the map row. The last four entries (rows 72 to 75) point at $9382 on, which holds code and not map rows."
  },
  {
   "address": 32657,
   "type": "line",
   "text": "Six bytes after the last row pointer: 0, 0, 0, 0, 4, 4. No code reads them."
  },
  {
   "address": 32663,
   "type": "line",
   "text": "Draws the opening view: 9 rows of tiles from the map at $90C4 (64 bytes a row) into screen B from $CC29 (two text rows for each map row), each row as the right half of its first tile ($807D) and 19 whole tiles ($803F). It then copies the 38 characters at $8017 to $CC00, puts the code $2C at $CE58, $CE80, $CEA8 and $CED0, and sets the colour RAM at $D800-$DAFF from the colour table at $BF00 indexed by each character. Called once by the setup $51F7."
  },
  {
   "address": 32790,
   "type": "line",
   "text": "The tile row number that $7F97 passes in X; $803F and $807D keep it here and leave the bottom half of the tile out when it is 9."
  },
  {
   "address": 32791,
   "type": "line",
   "text": "The 38 screen codes that $7F97 copies to the first row of screen B ($CC00)."
  },
  {
   "address": 32829,
   "type": "line",
   "text": "Two screen codes, $28 and $7D, right after the 38 of first_row_chars ($8017). The copy loop of $7F97 stops at $26 (38) characters, so nothing reads them."
  },
  {
   "address": 32831,
   "type": "line",
   "text": "Writes tile A as two by two characters at the screen pointer $ED/$EE: the top pair from the table at $97F4 and, unless the tile row in $8016 is 9, the bottom pair from $9892 to the row below; then moves the pointer on 2 characters. Keeps X and Y in the operands at $8079 and $807B. Called by $7F97."
  },
  {
   "address": 32889,
   "type": "line",
   "text": "Holds the X register saved by draw_tile at $803F: the immediate operand of the LDX at $8078."
  },
  {
   "address": 32891,
   "type": "line",
   "text": "Holds the Y register saved by draw_tile at $8045: the immediate operand of the LDY at $807A."
  },
  {
   "address": 32893,
   "type": "line",
   "text": "Writes only the right half of tile A at the screen pointer $ED/$EE: the top right character from $97F5 and, unless the tile row in $8016 is 9, the bottom right character from $9893 to the row below; then moves the pointer on 1 character. Keeps X and Y in the operands at $80AB and $80AD. Used by $7F97 for the first tile of each row."
  },
  {
   "address": 32939,
   "type": "line",
   "text": "Holds the X register saved by draw_tile_right_half at $807D: the immediate operand of the LDX at $80AA."
  },
  {
   "address": 32941,
   "type": "line",
   "text": "Holds the Y register saved by draw_tile_right_half at $8083: the immediate operand of the LDY at $80AC."
  },
  {
   "address": 32943,
   "type": "line",
   "text": "Tests whether a slot in state 7 (the follower behaviour $1DF5) stands in the player's way to the left. Returns A=0 at once when the resident flag $0A10 is non-zero. Otherwise it goes through slots $0A down to 0 in state 7 whose previous object's slot ($0F07,Y) is not in state $10 and returns A=1 when the slot's screen X $87,X (high byte $BF,X zero) is at or up to $13 left of the player's $7B16 and the player's $7B17 is at most $13 lines below, or $27 lines above, the slot's height $A3,X minus $15 (kept in $53D6); A=0 if no slot is. Called by the player states ($5AA9, $5C76, $5E28 and $5F83) before a step left."
  },
  {
   "address": 33007,
   "type": "line",
   "text": "A lone RTS right after the jump at $80EC in blocked_left: no branch, jump or call reaches it."
  },
  {
   "address": 33008,
   "type": "line",
   "text": "Second part of blocked_left ($80AF). Reached by the branch at $80E2 when the player's height $7B17 is less than the slot's height minus $15 (kept in $53D6): it gives up unless the difference is less than $28. From $80FB, which the first part also reaches, the slot counts only when its screen X high byte $BF is 0 and its screen X $87 is the player's $7B16 or less than $14 below it; it returns A=1 then and otherwise goes back to the slot loop at $80BD."
  },
  {
   "address": 33048,
   "type": "line",
   "text": "The same test as $80AF for a step to the right: returns A=1 when a slot in state 7 has its screen X at or up to $13 right of the player's $7B16 (same height test, with $53D6), otherwise A=0. Called by the player states ($5ACB, $5CBE, $5E56 and $5FB1)."
  },
  {
   "address": 33112,
   "type": "line",
   "text": "A lone RTS right after the jump at $8155 in blocked_right: no branch, jump or call reaches it."
  },
  {
   "address": 33113,
   "type": "line",
   "text": "Second part of blocked_right ($8118). Reached by the branch at $814B when the player's height $7B17 is less than the slot's height minus $15 (kept in $53D6): it gives up unless the difference is less than $28. From $8164, which the first part also reaches, the slot counts only when its screen X high byte $BF is 0 and its screen X $87 is the player's $7B16 or more than the player's by less than $14 (it returns A=1 then); otherwise it goes back to the slot loop at $8126."
  },
  {
   "address": 33154,
   "type": "line",
   "text": "The level map: 72 rows of 64 tile numbers (0 to $3E), row r at $8182 + 64 x r (pointers in map_row_pointers). A tile number picks two characters of the top row from tile_top_chars ($97F4) and two of the bottom row from tile_bottom_chars ($9892), which $7F97 and the scroll routines draw two by two. Columns 58 to 63 are tile $0C in 68 rows, column 0 is $0C in 59 rows and column 1 in 60; rows 70 and 71 are all tile 5. This symbol covers the map from row 0 column 0 ($8182) to row 15 column 63 ($8581): of its 1,024 numbers, tile 0 333, tile $34 252, tile $0C 141."
  },
  {
   "address": 34178,
   "type": "line",
   "text": "The level map, from row 16 column 0 ($8582) to row 31 column 63 ($8981): of its 1,024 numbers, tile 0 531, tile $0C 144, tile 4 70."
  },
  {
   "address": 35202,
   "type": "line",
   "text": "The level map, from row 32 column 0 ($8982) to row 47 column 63 ($8D81): of its 1,024 numbers, tile 0 489, tile $0C 144, tile 4 120."
  },
  {
   "address": 36226,
   "type": "line",
   "text": "The level map, from row 48 column 0 ($8D82) to row 63 column 63 ($9181): of its 1,024 numbers, tile 0 421, tile $0C 144, tile 4 117."
  },
  {
   "address": 37250,
   "type": "line",
   "text": "The level map, from row 64 column 0 ($9182) to row 71 column 63 ($9381): of its 512 numbers, tile 2 128, tile 5 128, tile 0 83."
  },
  {
   "address": 37762,
   "type": "line",
   "text": "Called first by the walking and attack behaviours $1726, $185C, $196C and $1AA1, with the slot in X and its object in Y. Does nothing unless the finale flag $621F is set and the object's variant $0C3E is non-zero. Then it adds 3 to the slot's Y ($95/$CD), writes the result to the object's Y ($0E6E/$0EB4), and writes the slot's Y plus $15 to the Y of the next object ($0E6F/$0EB5). So once the finale has begun, a variant 1 enemy sinks 3 lines a frame and drags the object after it down with it."
  },
  {
   "address": 37807,
   "type": "line",
   "text": "Called by the middle interrupt $6313 at $63C5 every frame. While the finale flag $621F is set (by $61BC, when an object of variant 1 is beaten) it replaces the joystick byte $1FA4 with $F7 (right pressed) until the map position $1EA1/$1EA0 reaches $01BE and with $FF (nothing pressed) from then on; at that point it starts $6222 at $C8, counts it down and sets the ending flag $6220 when it reaches 1. While $6221 is non-zero it counts it down and adds 1 to the Y position of objects 52 and 53 ($0EA2/$0EE8 and $0EA3/$0EE9)."
  },
  {
   "address": 37912,
   "type": "line",
   "text": "Writes the continue screen's texts \"PRESS FIRE TO CONTINUE\" from $9465 at $CD49 and \"CREDITS\" from $947C at $CF8C, adding $66 to each code and turning $20 into 0 (each ends at $FF), then the digit of $0A12 at $CF94 and the digit of $9463 at $CE1C (both as $8A plus the digit). Called by $9494."
  },
  {
   "address": 37987,
   "type": "line",
   "text": "The countdown shown on the continue screen, from 9; counted down by $9494 and drawn by $9418."
  },
  {
   "address": 37988,
   "type": "line",
   "text": "Set to 1 by $96AB and $74D8 once the text has ended and the fire button is pressed (each waits on bit 4 of $DC00); nothing else in the traced code reads it."
  },
  {
   "address": 37989,
   "type": "line",
   "text": "\"PRESS FIRE TO CONTINUE\" in screen codes, ended by $FF; written by $9418."
  },
  {
   "address": 38012,
   "type": "line",
   "text": "\"CREDITS\" followed by spaces in screen codes, ended by $FF; written by $9418, with the digit of $0A12 after it."
  },
  {
   "address": 38035,
   "type": "line",
   "text": "Set to 1 by $9494 when fire is pressed to continue; read by the main loop at $1F4C."
  },
  {
   "address": 38036,
   "type": "line",
   "text": "The continue screen, entered from the main loop at $1F49 when the energy is zero and $0A12 (the credits) is not zero. Sets up the text screen, clears the score digits $0A00-$0A06 and $0A10, swaps the shapes ($9670), draws the texts through $9418 and counts $9463 down from 9 with delays; fire (bit 4 of $DC00) takes one from $0A12 and sets the continue flag $9493 to 1, and when the count runs out the flag stays 0. Then puts the shapes back and redraws the panel ($53A6)."
  },
  {
   "address": 38200,
   "type": "line",
   "text": "Character shapes (136 bytes) for the text screens, exchanged with $C338 by $9670."
  },
  {
   "address": 38336,
   "type": "line",
   "text": "Character shapes (136 bytes) for the text screens, exchanged with $C3C0 by $9670."
  },
  {
   "address": 38472,
   "type": "line",
   "text": "40 zero bytes between text_shapes_b ($95C0-$9647) and swap_shapes ($9670) ($9648-$966F), no reader."
  },
  {
   "address": 38512,
   "type": "line",
   "text": "Exchanges three blocks: 136 bytes at $9538 and 136 at $95C0 with $C338 and $C3C0, and the 80 bytes of digit shapes at $1EA2 with $C450. Called to put the text screens' shapes in and to restore the play shapes."
  },
  {
   "address": 38569,
   "type": "line",
   "text": "Counts down from $1E while $96AB or $74D8 types the first characters of the text; in the briefing fire is not tested during that time."
  },
  {
   "address": 38570,
   "type": "line",
   "text": "Index of the next character of the text that $96AB or $74D8 types."
  },
  {
   "address": 38571,
   "type": "line",
   "text": "Types the level briefing from $973F on the screen one character at a time, from $CC56, with a delay through $6570 after each: adds $66 to each code (a space becomes 0), $FF ends a line (the pointer moves on 2 rows) and a second $FF ends the text, which then waits for fire (bit 4 of $DC00). Fire is ignored for the first $1E characters ($96A9); pressing it later skips to the end, where $9464 is set to 1 and two long delays run. It first waits, clears the screen and fills colour RAM with 7. Called by the setup $51F7; the setup calls $9670 before and after it."
  },
  {
   "address": 38634,
   "type": "line",
   "text": "Holds the Y register saved by show_briefing at $96E1: the immediate operand of the LDY at $96E9."
  },
  {
   "address": 38719,
   "type": "line",
   "text": "The level briefing in screen codes (\"level six\", Darkman pursues Strack to free his love and kill his creator, \"end of line\"); each line ends with $FF and a second $FF ends the text. Typed by $96AB."
  },
  {
   "address": 38899,
   "type": "line",
   "text": "The $FF that ends the last line of briefing_text ($973F). The second $FF, which ends the text for $96AB, is the first byte of tile_top_chars ($97F4)."
  },
  {
   "address": 38900,
   "type": "line",
   "text": "For each tile (index times 2) the two screen codes of its top row; the characters count in strips of 40 across the character set. Read by $803F and $807D. The extent is the pattern up to the bytes at $9872."
  },
  {
   "address": 39026,
   "type": "line",
   "text": "Three bytes, $60, $00 and $00, between tile_top_chars and unused_continue_text ($9875); nothing reads them."
  },
  {
   "address": 39029,
   "type": "line",
   "text": "\"PRESS FIRE TO CONTINUE\" in screen codes, ended by $FF. This level's continue screen reads its own copy at $9465, and nothing in the traced code reads these bytes."
  },
  {
   "address": 39052,
   "type": "line",
   "text": "The six letters CREDIT in screen codes ($03 $12 $05 $04 $09 $14), right after unused_continue_text and before tile_bottom_chars ($9892); nothing reads them. The credits text that is drawn is credits_text ($947C)."
  },
  {
   "address": 39058,
   "type": "line",
   "text": "For each tile (index times 2) the two screen codes of its bottom row, read by $803F and $807D. The extent is the pattern up to the panel characters at $9914."
  },
  {
   "address": 39188,
   "type": "line",
   "text": "The 200 screen codes of the status panel (5 rows of 40), copied to $CEF7 by $53A6."
  },
  {
   "address": 39388,
   "type": "line",
   "text": "The 200 colours of the status panel, copied to colour RAM $DAF7 by $53A6."
  },
  {
   "address": 39588,
   "type": "line",
   "text": "92 bytes left in memory from an earlier program, not used by this level: nothing in the level's code refers to them. They are the second half of a keyboard reader (the instruction that stores the row select in $DC00 and the rest of the scan) and the first five bytes of its key table, byte for byte the same as level 4's $9AA4-$9AFF. This level's own keyboard reader is read_keys ($6619)."
  },
  {
   "address": 48896,
   "type": "line",
   "text": "Colour for each character code, indexed by the character; $7F97 and $56A5 read it to fill the colour RAM, and the setup $51F7 ORs $08 into every entry."
  },
  {
   "address": 49152,
   "type": "line",
   "text": "Pointer $00: 64 zero bytes, the empty frame. The text screens read their character set from $C000 ($D018=$30 in the setup $51F7), so these bytes are also character 0, the blank."
  },
  {
   "address": 49216,
   "type": "line",
   "text": "Sprite shapes for pointers $01 to $0B and the first 56 bytes of $0C (760 bytes). In use: $01 in the frame table $5476 (behaviour $548E); $02 and $03, an enemy walking right of variant 0 (table $1A61); $05 and $06, walking left (table $181C); $04 and $07, the frames at counter $0E of the attacks $196C and $1726 for variant 0; $08 to $0B, the frames of slot_follow below its limit (table $1E7F)."
  },
  {
   "address": 49976,
   "type": "line",
   "text": "Character shapes (136 bytes) that $9670 exchanges with the block at $9538."
  },
  {
   "address": 50112,
   "type": "line",
   "text": "Character shapes (136 bytes) that $9670 exchanges with the block at $95C0."
  },
  {
   "address": 50248,
   "type": "line",
   "text": "8 bytes between the swapped letters (char_shapes_text_b) and the swapped digits (char_shapes_digits): the font's character 137, which $9670 leaves alone. During play they are bytes 8 to 15 of the sprite shape for pointer $11, the second frame of an enemy walking right of variant 1 (table $1A81)."
  },
  {
   "address": 50256,
   "type": "line",
   "text": "The 80 bytes that $9670 exchanges with the digit shapes at $1EA2."
  },
  {
   "address": 50336,
   "type": "line",
   "text": "Sprite shapes from byte 32 of pointer $12 to the end of $1F (864 bytes). In use: $13 and $17, the attack frames of variant 1 at counter $0E ($196C and $1726); $14 and $15, walking left of variant 1 (table $183C); $18, the knocked-down frame of $6271 (tables $6223 and $625F); $19 to $1B, follow_frames_a ($6241); $1F in the frame table $5476."
  },
  {
   "address": 51200,
   "type": "line",
   "text": "Screen matrix A: 25 rows of 40 characters in text mode, written by the scroll routines. $D018 selects it, or screen_b, from screen_buffer ($1FA7) through $62FD."
  },
  {
   "address": 52200,
   "type": "line",
   "text": "16 zero bytes after the 25 rows of 40 characters of screen_a, between its last row ($CBE7) and its sprite pointers ($CBF8); the VIC does not display them."
  },
  {
   "address": 52216,
   "type": "line",
   "text": "The sprite pointers of screen A's table ($CBF8-$CBFF); the player's sprites 0 to 2 are written by $6121, sprites 3 to 7 by the multiplexer $66D5 and the banner by $5669. Always written together with sprite_pointers_b."
  },
  {
   "address": 52224,
   "type": "line",
   "text": "Screen matrix B: the same layout as screen_a, 25 rows of 40 characters. The briefing is typed into it at $CC56 and the game over text at $CD50; the panel is drawn into it by $53A6."
  },
  {
   "address": 53224,
   "type": "line",
   "text": "16 zero bytes after the 25 rows of 40 characters of screen_b, between its last row ($CFE7) and its sprite pointers ($CFF8); the VIC does not display them. fill_screen ($65F4) can overwrite them."
  },
  {
   "address": 53240,
   "type": "line",
   "text": "The sprite pointers of screen B's table ($CFF8-$CFFF); see sprite_pointers_a ($CBF8)."
  },
  {
   "address": 53248,
   "type": "line",
   "text": "Characters 0 to 127 of level 6's play character set (1,024 bytes, 8 bytes a character, one byte a pixel row). The top interrupt irq_top ($6486) stores $34 in $D018 at $64AC, which sets the character base to $D000 and the screen to $CC00; select_screen ($62FD) then switches the screen between $CC00 and $C800 and keeps the character bits. tile_top_chars ($97F4) and tile_bottom_chars ($9892) pick the codes, and char_colours ($BF00) gives each its colour. Level 4 has a different character set here (1,823 of the 2,048 bytes differ). Only the VIC sees these bytes: with the I/O area switched in, the CPU reads the chips' registers at the same addresses."
  },
  {
   "address": 54272,
   "type": "line",
   "text": "Characters 128 to 245 of the play character set (944 bytes), the same form as play_charset_a. The tile tables reach $F5 (tile_top_chars) and $FF (tile_bottom_chars), and panel_chars ($9914) reaches $FC; the codes from $F6 up are the blank characters of play_charset_blank. Only the VIC sees these bytes: with the I/O area switched in, the CPU reads the chips' registers at the same addresses."
  },
  {
   "address": 55216,
   "type": "line",
   "text": "Characters 246 to 255 (80 bytes), all zero: the blank characters. Sprite pointer $5F would read the last 64 of these bytes, and pointers $5A to $5E read other characters as sprite data, so $5A to $5F are not shapes."
  },
  {
   "address": 55296,
   "type": "line",
   "text": "Shape address = $C000 + 64 x pointer. Sprite shapes for pointers $60 and $61 (128 bytes): the same bytes as level 4's countdown_light_shapes. No table or constant in level 6 names them. Read as multicolour they are scattered strokes, so the picture is not clear."
  },
  {
   "address": 55424,
   "type": "line",
   "text": "Shape address = $C000 + 64 x pointer. Sprite shapes for pointers $62 and $63 (128 bytes): the pickup of the behaviour at $1BBE, named by pickup_frames ($1BB0). A round body in two sizes."
  },
  {
   "address": 55552,
   "type": "line",
   "text": "Shape address = $C000 + 64 x pointer. Sprite shapes for pointers $64 to $66 (192 bytes): three frames of the burst that lobbed_shot_steps ($1D89) and behave_falling_burst ($54F9) run through, growing from the base like a flame."
  },
  {
   "address": 55744,
   "type": "line",
   "text": "Shape address = $C000 + 64 x pointer. Sprite shape for pointer $67 (64 bytes): the picture of behave_map_switch ($13AF), behave_radial_shot ($15C6) and behave_lobbed_shot ($1CDE). It differs from level 4's pointer $67; a few strokes and dots, not a clear picture."
  },
  {
   "address": 55808,
   "type": "line",
   "text": "Shape address = $C000 + 64 x pointer. Sprite shapes for pointers $68 and $69 (128 bytes): vpatrol_frames ($1515) lists them for the behaviour at $1524, and banner_sprites ($555F) gives $68 to one of the sprites of the end picture. $68 is a hollow rectangle with a dotted inside and $69 a narrow vertical bar."
  },
  {
   "address": 55936,
   "type": "line",
   "text": "Shape address = $C000 + 64 x pointer. Sprite shapes for pointers $6A and $6B (128 bytes): behave_flash_frame ($1CBE) shows $6B while the object's counter runs and $6A otherwise, and drop_rise_steps ($128C) uses both for the behaviour at $134B. Two small figures."
  },
  {
   "address": 56064,
   "type": "line",
   "text": "Shape address = $C000 + 64 x pointer. Sprite shape for pointer $6C (64 bytes): the pickup of behave_score_pickup ($1C7C), a round body with a lighter centre."
  },
  {
   "address": 56128,
   "type": "line",
   "text": "Shape address = $C000 + 64 x pointer. Sprite shapes for pointers $6D to $6F (192 bytes): rows of vertical bars at three heights, the flashing hazard of behaviour $16BA, named by flash_frames ($165E)."
  },
  {
   "address": 56320,
   "type": "line",
   "text": "Shape address = $C000 + 64 x pointer. Sprite shape for pointer $70 (64 bytes): the pointer behave_light_start ($1416) gives its slot, and that drop_rise_steps ($128C) ends on. A round lamp-like body."
  },
  {
   "address": 56384,
   "type": "line",
   "text": "Shape address = $C000 + 64 x pointer. Sprite shapes for pointers $71 and $72 (128 bytes): the first and last frames of the burst in lobbed_shot_steps ($1D89), after the three frames of burst_shapes; $72 is mostly empty."
  },
  {
   "address": 56512,
   "type": "line",
   "text": "Shape address = $C000 + 64 x pointer. Sprite shapes for pointers $73 and $74 (128 bytes): the shot of behave_enemy_shot ($146C), $73 when it flies right and $74 when it flies left. A small ring."
  },
  {
   "address": 56640,
   "type": "line",
   "text": "Shape address = $C000 + 64 x pointer. Sprite shapes for pointers $75 to $79 (320 bytes): pieces of the end picture that banner_sprites ($555F) lays out with the pointers $75 to $7B. Each is a hollow frame with dotted columns inside."
  },
  {
   "address": 56960,
   "type": "line",
   "text": "Shape address = $C000 + 64 x pointer. Sprite shapes for pointers $7A to $7F (384 bytes): fall_frame ($5EC8) sets the falling player's pose to $7A or $7B and the drawing routine adds 2 and 4 for the other two sprites. banner_sprites ($555F) also gives $7A and $7B to the last sprites of the end picture, and lobbed_shot_steps ($1D89) lists $7B and $7C."
  },
  {
   "address": 57344,
   "type": "line",
   "text": "Sprite shapes for pointers $80 to $8F (1,024 bytes): sprite 2 of the standing and walking frames, which player_draw ($6121) takes as the main frame $611D plus $0D minus $24 ($83 and $89 for the standing frames $9A and $A0, $80 to $85 for the walk to the right and $86 to $8B for the walk to the left), and $8C and $8D, sprite 2 of the strike (strike_frames $5A10). The same bytes as in levels 1, 3 and 4."
  },
  {
   "address": 58368,
   "type": "line",
   "text": "Sprite shapes for pointers $90 to $93 (256 bytes), sprite 2 of the player's punch and crouch frames: $611E takes $90 and $91 from punch_frames ($59CC) and $92 and $93 from crouch_frames ($5C23). The same bytes as in levels 1, 3 and 4."
  },
  {
   "address": 58624,
   "type": "line",
   "text": "Sprite shapes for pointers $94 to $96 (192 bytes): the player climbing, picked by climb_frames_up ($603E) and climb_frames_down ($604A). The same bytes as in levels 1, 3 and 4."
  },
  {
   "address": 58816,
   "type": "line",
   "text": "Sprite shapes for pointers $97 to $9C (384 bytes): the player walking right (walk_frames_right at $5975). The same bytes as in levels 1, 3 and 4."
  },
  {
   "address": 59200,
   "type": "line",
   "text": "Sprite shapes for pointers $9D to $A2 (384 bytes): the player walking left (walk_frames_left at $5963), drawn like walk_right_shapes, with $AA to $AF and $86 to $8B as the other two sprites. The same bytes as in levels 1, 3 and 4."
  },
  {
   "address": 59584,
   "type": "line",
   "text": "Sprite shapes for pointers $A3 to $B2 (1,024 bytes): sprite 1 of the standing and walking frames (the main frame plus $0D: $A4 to $A9 walking right, $AA to $AF walking left, $A7 and $AD standing), and from strike_frames ($5A10) the strike's $A3 (sprite 0) and $B0 (sprite 1) facing right and $B1 (sprite 0) facing left. The same bytes as in levels 1, 3 and 4."
  },
  {
   "address": 60608,
   "type": "line",
   "text": "Sprite shapes for pointers $B3 to $C1 (960 bytes), the rest of attack_shapes: $B4 to $B7 (sprite 0) and $BE to $C1 (sprite 1) of the punch and crouch frames, $BB (sprite 1) of the strike facing left, and $B8 to $BA, sprite 0 of the player climbing (the climbing frame plus $24, see climb_shapes). The same bytes as in levels 1, 3 and 4."
  },
  {
   "address": 61568,
   "type": "line",
   "text": "Sprite shapes for pointers $C2 to $C4 (192 bytes): sprite 1 of the player climbing (the climbing frame plus $2E, see climb_shapes). The same bytes as in levels 1, 3 and 4."
  },
  {
   "address": 61760,
   "type": "line",
   "text": "Sprite shapes for pointers $C5 to $CD (576 bytes), lying before the banner's shapes, which start at $CE (banner_sprites $555F)."
  },
  {
   "address": 62336,
   "type": "line",
   "text": "Sprite shapes for pointers $CE to $DD (1,024 bytes): the banner picture of banner_sprites ($555F), which sets eight sprite pointers from $CE for the upper band and eight from $D6 for the lower."
  },
  {
   "address": 63360,
   "type": "line",
   "text": "Sprite shape for pointer $DE (64 bytes): all zero."
  },
  {
   "address": 63424,
   "type": "line",
   "text": "The status panel's bitmap, which the raster interrupt irq_bottom ($63EE) switches on from line $CD (bitmap mode at $E000, multicolour): 40 cells wide, rows 19 to 24, 8 bytes a cell and 320 a row. This symbol holds the first 256 bytes of its 1,920. The same bytes as in levels 1, 3 and 4."
  },
  {
   "address": 63680,
   "type": "line",
   "text": "Row 19, columns 32 to 37: the first of five rows of the 6 by 5 cell picture that timer_graphics_on ($7BCD) or timer_graphics_off ($7C36) copies in (48 bytes a row; the others are panel_picture_1 to 4). The same bytes as in levels 1, 3 and 4."
  },
  {
   "address": 63728,
   "type": "line",
   "text": "Row 19, columns 38 and 39, and row 20, columns 0 to 26: panel bitmap that no traced routine writes (232 bytes). The same bytes as in levels 1, 3 and 4."
  },
  {
   "address": 63960,
   "type": "line",
   "text": "Row 20, columns 27 to 31 (40 bytes): draw_timer ($7B1B) draws the three timer digits into the cells at $F9D8, $F9E8 and $F9F0. The same bytes as in levels 1, 3 and 4."
  },
  {
   "address": 64000,
   "type": "line",
   "text": "Row 20, columns 32 to 37: the second row of the panel picture (see panel_picture_0). The same bytes as in levels 1, 3 and 4."
  },
  {
   "address": 64048,
   "type": "line",
   "text": "Row 20, columns 38 and 39, and row 21, columns 0 to 2: panel bitmap that no traced routine writes (40 bytes). The same bytes as in levels 1, 3 and 4."
  },
  {
   "address": 64088,
   "type": "line",
   "text": "The seven character shapes (8 bytes each) of the score digits in the panel, drawn by $5842."
  },
  {
   "address": 64144,
   "type": "line",
   "text": "Row 21, columns 10 to 16: panel bitmap that no traced routine writes (56 bytes). The same bytes as in levels 1, 3 and 4."
  },
  {
   "address": 64200,
   "type": "line",
   "text": "The eight character shapes (64 bytes) of the energy bar in the panel, copied from bar_shapes ($574D) by $578E."
  },
  {
   "address": 64264,
   "type": "line",
   "text": "Row 21, columns 25 to 31: panel bitmap that no traced routine writes (56 bytes). The same bytes as in levels 1, 3 and 4."
  },
  {
   "address": 64320,
   "type": "line",
   "text": "Row 21, columns 32 to 37: the third row of the panel picture (see panel_picture_0). The same bytes as in levels 1, 3 and 4."
  },
  {
   "address": 64368,
   "type": "line",
   "text": "Row 21, columns 38 and 39, and row 22, columns 0 to 31: panel bitmap that no traced routine writes (272 bytes). The same bytes as in levels 1, 3 and 4."
  },
  {
   "address": 64640,
   "type": "line",
   "text": "Row 22, columns 32 to 37: the fourth row of the panel picture (see panel_picture_0). The same bytes as in levels 1, 3 and 4."
  },
  {
   "address": 64688,
   "type": "line",
   "text": "Row 22, columns 38 and 39, and row 23, columns 0 to 31: panel bitmap that no traced routine writes (272 bytes). The same bytes as in levels 1, 3 and 4."
  },
  {
   "address": 64960,
   "type": "line",
   "text": "Row 23, columns 32 to 37: the fifth row of the panel picture (see panel_picture_0). The same bytes as in levels 1, 3 and 4."
  },
  {
   "address": 65008,
   "type": "line",
   "text": "Row 23, columns 38 and 39 (16 bytes): panel bitmap that no traced routine writes. Row 24 of the bitmap ($FE00-$FF3F) is where jump_shapes lie."
  },
  {
   "address": 65024,
   "type": "line",
   "text": "Sprite shapes for pointers $F8 to $FD (384 bytes), lying where row 24 of the panel bitmap ($FE00-$FF3F) and the 64 bytes after it are: the player jumping, $F8 (facing right) or $F9 from jump_frame ($602A), with sprites 0 and 1 taking that plus 2 and plus 4 ($FA and $FC, or $FB and $FD). Row 24 shows black because draw_panel clears its colours."
  },
  {
   "address": 65408,
   "type": "line",
   "text": "The sprite shape for pointer $FE (64 bytes, shape address $C000 + 64 x $FE): the pointer that behave_falling_object ($548E) gives its slot. The 64th byte ($FFBF, $C8) is not part of the picture."
  },
  {
   "address": 65472,
   "type": "line",
   "text": "48 zero bytes after the shape for pointer $FE, up to the resident vectors at $FFF0 (outside this level's file); no reader."
  }
 ]
}