{
 "schema": 1,
 "platform": "c64",
 "game": "darkman",
 "part": "level3",
 "build": "PAL original, two-sided G64; level 1 load in play",
 "source": "regenerator2000 live",
 "regions": {
  "exclude": [
   [
    256,
    511,
    "stack"
   ],
   [
    53248,
    57343,
    "I/O and colour RAM"
   ],
   [
    0,
    2591,
    "Loader and resident code"
   ],
   [
    24576,
    53247,
    "Not loaded by level 3"
   ],
   [
    65520,
    65535,
    "Loader and resident code"
   ]
  ],
  "extra": [],
  "edges": [
   0,
   256,
   512,
   1024,
   2048,
   4096,
   16384,
   32768,
   40960,
   49152,
   53248,
   57344
  ],
  "elsewhere": [
   [
    53248,
    57343,
    "I/O and colour RAM"
   ],
   [
    0,
    2591,
    "Loader and resident code"
   ],
   [
    24576,
    53247,
    "Not loaded by level 3"
   ],
   [
    65520,
    65535,
    "Loader and resident code"
   ]
  ]
 },
 "blocks": [
  {
   "start": 2592,
   "end": 2690,
   "type": "Code"
  },
  {
   "start": 2691,
   "end": 2691,
   "type": "Byte"
  },
  {
   "start": 2692,
   "end": 3138,
   "type": "Code"
  },
  {
   "start": 3139,
   "end": 3139,
   "type": "Byte"
  },
  {
   "start": 3140,
   "end": 3270,
   "type": "Code"
  },
  {
   "start": 3271,
   "end": 3271,
   "type": "Byte"
  },
  {
   "start": 3272,
   "end": 3272,
   "type": "Byte"
  },
  {
   "start": 3273,
   "end": 3526,
   "type": "Code"
  },
  {
   "start": 3527,
   "end": 3527,
   "type": "Byte"
  },
  {
   "start": 3528,
   "end": 3528,
   "type": "Byte"
  },
  {
   "start": 3529,
   "end": 3658,
   "type": "Code"
  },
  {
   "start": 3659,
   "end": 3659,
   "type": "Byte"
  },
  {
   "start": 3660,
   "end": 3660,
   "type": "Code"
  },
  {
   "start": 3661,
   "end": 3675,
   "type": "Code"
  },
  {
   "start": 3676,
   "end": 3746,
   "type": "Code"
  },
  {
   "start": 3747,
   "end": 3747,
   "type": "Byte"
  },
  {
   "start": 3748,
   "end": 3749,
   "type": "Byte"
  },
  {
   "start": 3750,
   "end": 3750,
   "type": "Byte"
  },
  {
   "start": 3751,
   "end": 3784,
   "type": "Code"
  },
  {
   "start": 3785,
   "end": 3785,
   "type": "Byte"
  },
  {
   "start": 3786,
   "end": 3786,
   "type": "Byte"
  },
  {
   "start": 3787,
   "end": 3787,
   "type": "Byte"
  },
  {
   "start": 3788,
   "end": 3848,
   "type": "Code"
  },
  {
   "start": 3849,
   "end": 3928,
   "type": "Byte"
  },
  {
   "start": 3929,
   "end": 3929,
   "type": "Byte"
  },
  {
   "start": 3930,
   "end": 3930,
   "type": "Byte"
  },
  {
   "start": 3931,
   "end": 4013,
   "type": "Code"
  },
  {
   "start": 4014,
   "end": 4015,
   "type": "Byte"
  },
  {
   "start": 4016,
   "end": 4016,
   "type": "Byte"
  },
  {
   "start": 4017,
   "end": 4017,
   "type": "Byte"
  },
  {
   "start": 4018,
   "end": 4018,
   "type": "Byte"
  },
  {
   "start": 4019,
   "end": 4019,
   "type": "Byte"
  },
  {
   "start": 4020,
   "end": 4021,
   "type": "Byte"
  },
  {
   "start": 4022,
   "end": 4022,
   "type": "Byte"
  },
  {
   "start": 4023,
   "end": 4179,
   "type": "Code"
  },
  {
   "start": 4180,
   "end": 4181,
   "type": "Byte"
  },
  {
   "start": 4182,
   "end": 4324,
   "type": "Code"
  },
  {
   "start": 4325,
   "end": 4325,
   "type": "Byte"
  },
  {
   "start": 4326,
   "end": 4463,
   "type": "Code"
  },
  {
   "start": 4464,
   "end": 4464,
   "type": "Byte"
  },
  {
   "start": 4465,
   "end": 4465,
   "type": "Byte"
  },
  {
   "start": 4466,
   "end": 4467,
   "type": "Byte"
  },
  {
   "start": 4468,
   "end": 4468,
   "type": "Byte"
  },
  {
   "start": 4469,
   "end": 4469,
   "type": "Byte"
  },
  {
   "start": 4470,
   "end": 4934,
   "type": "Byte"
  },
  {
   "start": 4935,
   "end": 5235,
   "type": "Code"
  },
  {
   "start": 5236,
   "end": 5435,
   "type": "Byte"
  },
  {
   "start": 5436,
   "end": 5635,
   "type": "Byte"
  },
  {
   "start": 5636,
   "end": 5669,
   "type": "Code"
  },
  {
   "start": 5670,
   "end": 5670,
   "type": "Byte"
  },
  {
   "start": 5671,
   "end": 5680,
   "type": "Byte"
  },
  {
   "start": 5681,
   "end": 5681,
   "type": "Byte"
  },
  {
   "start": 5682,
   "end": 5682,
   "type": "Byte"
  },
  {
   "start": 5683,
   "end": 5683,
   "type": "Byte"
  },
  {
   "start": 5684,
   "end": 5684,
   "type": "Byte"
  },
  {
   "start": 5685,
   "end": 5730,
   "type": "Code"
  },
  {
   "start": 5731,
   "end": 5732,
   "type": "Byte"
  },
  {
   "start": 5733,
   "end": 5733,
   "type": "Code"
  },
  {
   "start": 5734,
   "end": 5734,
   "type": "Byte"
  },
  {
   "start": 5735,
   "end": 5752,
   "type": "Byte"
  },
  {
   "start": 5753,
   "end": 5770,
   "type": "Byte"
  },
  {
   "start": 5771,
   "end": 5771,
   "type": "Byte"
  },
  {
   "start": 5772,
   "end": 5804,
   "type": "Code"
  },
  {
   "start": 5805,
   "end": 5837,
   "type": "Code"
  },
  {
   "start": 5838,
   "end": 5838,
   "type": "Byte"
  },
  {
   "start": 5839,
   "end": 5839,
   "type": "Byte"
  },
  {
   "start": 5840,
   "end": 5842,
   "type": "Byte"
  },
  {
   "start": 5843,
   "end": 5843,
   "type": "Byte"
  },
  {
   "start": 5844,
   "end": 5880,
   "type": "Code"
  },
  {
   "start": 5881,
   "end": 5881,
   "type": "Byte"
  },
  {
   "start": 5882,
   "end": 6099,
   "type": "Code"
  },
  {
   "start": 6100,
   "end": 6244,
   "type": "Code"
  },
  {
   "start": 6245,
   "end": 6322,
   "type": "Byte"
  },
  {
   "start": 6323,
   "end": 6323,
   "type": "Byte"
  },
  {
   "start": 6324,
   "end": 6522,
   "type": "Code"
  },
  {
   "start": 6523,
   "end": 6582,
   "type": "Byte"
  },
  {
   "start": 6583,
   "end": 6783,
   "type": "Code"
  },
  {
   "start": 6784,
   "end": 6808,
   "type": "Byte"
  },
  {
   "start": 6809,
   "end": 6841,
   "type": "Code"
  },
  {
   "start": 6842,
   "end": 6874,
   "type": "Code"
  },
  {
   "start": 6875,
   "end": 6875,
   "type": "Byte"
  },
  {
   "start": 6876,
   "end": 6879,
   "type": "Undefined"
  },
  {
   "start": 6880,
   "end": 6928,
   "type": "Code"
  },
  {
   "start": 6929,
   "end": 6929,
   "type": "Undefined"
  },
  {
   "start": 6930,
   "end": 6930,
   "type": "Byte"
  },
  {
   "start": 6931,
   "end": 6931,
   "type": "Byte"
  },
  {
   "start": 6932,
   "end": 6932,
   "type": "Byte"
  },
  {
   "start": 6933,
   "end": 6939,
   "type": "Byte"
  },
  {
   "start": 6940,
   "end": 6985,
   "type": "Byte"
  },
  {
   "start": 6986,
   "end": 6987,
   "type": "Byte"
  },
  {
   "start": 6988,
   "end": 7035,
   "type": "Code"
  },
  {
   "start": 7036,
   "end": 7070,
   "type": "Code"
  },
  {
   "start": 7071,
   "end": 7127,
   "type": "Code"
  },
  {
   "start": 7128,
   "end": 7157,
   "type": "Code"
  },
  {
   "start": 7158,
   "end": 7158,
   "type": "Byte"
  },
  {
   "start": 7159,
   "end": 7159,
   "type": "Byte"
  },
  {
   "start": 7160,
   "end": 7161,
   "type": "Byte"
  },
  {
   "start": 7162,
   "end": 7162,
   "type": "Byte"
  },
  {
   "start": 7163,
   "end": 7164,
   "type": "Byte"
  },
  {
   "start": 7165,
   "end": 7165,
   "type": "Byte"
  },
  {
   "start": 7166,
   "end": 7166,
   "type": "Byte"
  },
  {
   "start": 7167,
   "end": 7196,
   "type": "Byte"
  },
  {
   "start": 7197,
   "end": 7236,
   "type": "Byte"
  },
  {
   "start": 7237,
   "end": 7573,
   "type": "Code"
  },
  {
   "start": 7574,
   "end": 7582,
   "type": "Undefined"
  },
  {
   "start": 7583,
   "end": 7583,
   "type": "Byte"
  },
  {
   "start": 7584,
   "end": 7584,
   "type": "Byte"
  },
  {
   "start": 7585,
   "end": 7751,
   "type": "Code"
  },
  {
   "start": 7752,
   "end": 8007,
   "type": "Byte"
  },
  {
   "start": 8008,
   "end": 8263,
   "type": "Byte"
  },
  {
   "start": 8264,
   "end": 8515,
   "type": "Byte"
  },
  {
   "start": 8516,
   "end": 8519,
   "type": "Byte"
  },
  {
   "start": 8520,
   "end": 8768,
   "type": "Byte"
  },
  {
   "start": 8769,
   "end": 8775,
   "type": "Byte"
  },
  {
   "start": 8776,
   "end": 9031,
   "type": "Byte"
  },
  {
   "start": 9032,
   "end": 9079,
   "type": "Byte"
  },
  {
   "start": 9080,
   "end": 9294,
   "type": "Code"
  },
  {
   "start": 9295,
   "end": 9295,
   "type": "Byte"
  },
  {
   "start": 9296,
   "end": 9299,
   "type": "Byte"
  },
  {
   "start": 9300,
   "end": 9363,
   "type": "Byte"
  },
  {
   "start": 9364,
   "end": 9364,
   "type": "Byte"
  },
  {
   "start": 9365,
   "end": 9543,
   "type": "Code"
  },
  {
   "start": 9544,
   "end": 9544,
   "type": "Byte"
  },
  {
   "start": 9545,
   "end": 9601,
   "type": "Code"
  },
  {
   "start": 9602,
   "end": 9602,
   "type": "Byte"
  },
  {
   "start": 9603,
   "end": 9720,
   "type": "Code"
  },
  {
   "start": 9721,
   "end": 9721,
   "type": "Undefined"
  },
  {
   "start": 9722,
   "end": 9722,
   "type": "Byte"
  },
  {
   "start": 9723,
   "end": 9723,
   "type": "Byte"
  },
  {
   "start": 9724,
   "end": 9724,
   "type": "Byte"
  },
  {
   "start": 9725,
   "end": 9788,
   "type": "Byte"
  },
  {
   "start": 9789,
   "end": 9946,
   "type": "Code"
  },
  {
   "start": 9947,
   "end": 9956,
   "type": "Byte"
  },
  {
   "start": 9957,
   "end": 10140,
   "type": "Byte"
  },
  {
   "start": 10141,
   "end": 10359,
   "type": "Code"
  },
  {
   "start": 10360,
   "end": 11110,
   "type": "Byte"
  },
  {
   "start": 11111,
   "end": 11122,
   "type": "Byte"
  },
  {
   "start": 11123,
   "end": 12607,
   "type": "Byte"
  },
  {
   "start": 12608,
   "end": 12608,
   "type": "Byte"
  },
  {
   "start": 12609,
   "end": 12609,
   "type": "Byte"
  },
  {
   "start": 12610,
   "end": 12610,
   "type": "Byte"
  },
  {
   "start": 12611,
   "end": 12673,
   "type": "Code"
  },
  {
   "start": 12674,
   "end": 12674,
   "type": "Byte"
  },
  {
   "start": 12675,
   "end": 12738,
   "type": "Code"
  },
  {
   "start": 12739,
   "end": 12850,
   "type": "Byte"
  },
  {
   "start": 12851,
   "end": 12851,
   "type": "Byte"
  },
  {
   "start": 12852,
   "end": 13150,
   "type": "Code"
  },
  {
   "start": 13151,
   "end": 13390,
   "type": "Byte"
  },
  {
   "start": 13391,
   "end": 13420,
   "type": "Byte"
  },
  {
   "start": 13421,
   "end": 13450,
   "type": "Byte"
  },
  {
   "start": 13451,
   "end": 13690,
   "type": "Byte"
  },
  {
   "start": 13691,
   "end": 13720,
   "type": "Byte"
  },
  {
   "start": 13721,
   "end": 13750,
   "type": "Byte"
  },
  {
   "start": 13751,
   "end": 14694,
   "type": "Byte"
  },
  {
   "start": 14695,
   "end": 15798,
   "type": "Undefined"
  },
  {
   "start": 15799,
   "end": 16302,
   "type": "Byte"
  },
  {
   "start": 16303,
   "end": 16750,
   "type": "Byte"
  },
  {
   "start": 16751,
   "end": 16806,
   "type": "Byte"
  },
  {
   "start": 16807,
   "end": 16998,
   "type": "Code"
  },
  {
   "start": 16999,
   "end": 17006,
   "type": "Byte"
  },
  {
   "start": 17007,
   "end": 17029,
   "type": "Byte"
  },
  {
   "start": 17030,
   "end": 17055,
   "type": "Code"
  },
  {
   "start": 17056,
   "end": 17056,
   "type": "Byte"
  },
  {
   "start": 17057,
   "end": 17057,
   "type": "Byte"
  },
  {
   "start": 17058,
   "end": 17058,
   "type": "Byte"
  },
  {
   "start": 17059,
   "end": 17059,
   "type": "Byte"
  },
  {
   "start": 17060,
   "end": 17060,
   "type": "Byte"
  },
  {
   "start": 17061,
   "end": 17077,
   "type": "Byte"
  },
  {
   "start": 17078,
   "end": 17120,
   "type": "Code"
  },
  {
   "start": 17121,
   "end": 17136,
   "type": "Byte"
  },
  {
   "start": 17137,
   "end": 17170,
   "type": "Code"
  },
  {
   "start": 17171,
   "end": 17188,
   "type": "Byte"
  },
  {
   "start": 17189,
   "end": 17206,
   "type": "Byte"
  },
  {
   "start": 17207,
   "end": 17274,
   "type": "Code"
  },
  {
   "start": 17275,
   "end": 17275,
   "type": "Byte"
  },
  {
   "start": 17276,
   "end": 17276,
   "type": "Byte"
  },
  {
   "start": 17277,
   "end": 18110,
   "type": "Code"
  },
  {
   "start": 18111,
   "end": 18111,
   "type": "Byte"
  },
  {
   "start": 18112,
   "end": 18112,
   "type": "Byte"
  },
  {
   "start": 18113,
   "end": 18113,
   "type": "Byte"
  },
  {
   "start": 18114,
   "end": 18114,
   "type": "Byte"
  },
  {
   "start": 18115,
   "end": 18115,
   "type": "Byte"
  },
  {
   "start": 18116,
   "end": 18116,
   "type": "Byte"
  },
  {
   "start": 18117,
   "end": 18269,
   "type": "Code"
  },
  {
   "start": 18270,
   "end": 18270,
   "type": "Byte"
  },
  {
   "start": 18271,
   "end": 18453,
   "type": "Code"
  },
  {
   "start": 18454,
   "end": 18454,
   "type": "Byte"
  },
  {
   "start": 18455,
   "end": 18530,
   "type": "Code"
  },
  {
   "start": 18531,
   "end": 18532,
   "type": "Byte"
  },
  {
   "start": 18533,
   "end": 18556,
   "type": "Byte"
  },
  {
   "start": 18557,
   "end": 18557,
   "type": "Byte"
  },
  {
   "start": 18558,
   "end": 18558,
   "type": "Byte"
  },
  {
   "start": 18559,
   "end": 18559,
   "type": "Undefined"
  },
  {
   "start": 18560,
   "end": 18570,
   "type": "Code"
  },
  {
   "start": 18571,
   "end": 18583,
   "type": "Byte"
  },
  {
   "start": 18584,
   "end": 18586,
   "type": "Byte"
  },
  {
   "start": 18587,
   "end": 18587,
   "type": "Byte"
  },
  {
   "start": 18588,
   "end": 18588,
   "type": "Byte"
  },
  {
   "start": 18589,
   "end": 18589,
   "type": "Byte"
  },
  {
   "start": 18590,
   "end": 18602,
   "type": "Byte"
  },
  {
   "start": 18603,
   "end": 18615,
   "type": "Byte"
  },
  {
   "start": 18616,
   "end": 18616,
   "type": "Byte"
  },
  {
   "start": 18617,
   "end": 18617,
   "type": "Byte"
  },
  {
   "start": 18618,
   "end": 18901,
   "type": "Code"
  },
  {
   "start": 18902,
   "end": 18902,
   "type": "Byte"
  },
  {
   "start": 18903,
   "end": 18903,
   "type": "Byte"
  },
  {
   "start": 18904,
   "end": 18904,
   "type": "Byte"
  },
  {
   "start": 18905,
   "end": 19099,
   "type": "Code"
  },
  {
   "start": 19100,
   "end": 19104,
   "type": "Byte"
  },
  {
   "start": 19105,
   "end": 19109,
   "type": "Byte"
  },
  {
   "start": 19110,
   "end": 19114,
   "type": "Byte"
  },
  {
   "start": 19115,
   "end": 19119,
   "type": "Byte"
  },
  {
   "start": 19120,
   "end": 19124,
   "type": "Byte"
  },
  {
   "start": 19125,
   "end": 19129,
   "type": "Byte"
  },
  {
   "start": 19130,
   "end": 19134,
   "type": "Byte"
  },
  {
   "start": 19135,
   "end": 19139,
   "type": "Byte"
  },
  {
   "start": 19140,
   "end": 19144,
   "type": "Byte"
  },
  {
   "start": 19145,
   "end": 19168,
   "type": "Byte"
  },
  {
   "start": 19169,
   "end": 19216,
   "type": "Byte"
  },
  {
   "start": 19217,
   "end": 19219,
   "type": "Byte"
  },
  {
   "start": 19220,
   "end": 19222,
   "type": "Byte"
  },
  {
   "start": 19223,
   "end": 19383,
   "type": "Code"
  },
  {
   "start": 19384,
   "end": 19384,
   "type": "Byte"
  },
  {
   "start": 19385,
   "end": 19412,
   "type": "Code"
  },
  {
   "start": 19413,
   "end": 19420,
   "type": "Byte"
  },
  {
   "start": 19421,
   "end": 19421,
   "type": "Code"
  },
  {
   "start": 19422,
   "end": 19422,
   "type": "Byte"
  },
  {
   "start": 19423,
   "end": 19423,
   "type": "Byte"
  },
  {
   "start": 19424,
   "end": 19424,
   "type": "Byte"
  },
  {
   "start": 19425,
   "end": 19632,
   "type": "Code"
  },
  {
   "start": 19633,
   "end": 19633,
   "type": "Undefined"
  },
  {
   "start": 19634,
   "end": 19635,
   "type": "Byte"
  },
  {
   "start": 19636,
   "end": 19868,
   "type": "Code"
  },
  {
   "start": 19869,
   "end": 19869,
   "type": "Byte"
  },
  {
   "start": 19870,
   "end": 20024,
   "type": "Code"
  },
  {
   "start": 20025,
   "end": 20238,
   "type": "Code"
  },
  {
   "start": 20239,
   "end": 20239,
   "type": "Byte"
  },
  {
   "start": 20240,
   "end": 20240,
   "type": "Byte"
  },
  {
   "start": 20241,
   "end": 20378,
   "type": "Code"
  },
  {
   "start": 20379,
   "end": 20379,
   "type": "Byte"
  },
  {
   "start": 20380,
   "end": 20853,
   "type": "Code"
  },
  {
   "start": 20854,
   "end": 20854,
   "type": "Byte"
  },
  {
   "start": 20855,
   "end": 21177,
   "type": "Code"
  },
  {
   "start": 21178,
   "end": 21178,
   "type": "Byte"
  },
  {
   "start": 21179,
   "end": 21431,
   "type": "Code"
  },
  {
   "start": 21432,
   "end": 21687,
   "type": "Byte"
  },
  {
   "start": 21688,
   "end": 21959,
   "type": "Byte"
  },
  {
   "start": 21960,
   "end": 22471,
   "type": "Byte"
  },
  {
   "start": 22472,
   "end": 22951,
   "type": "Byte"
  },
  {
   "start": 22952,
   "end": 22968,
   "type": "Code"
  },
  {
   "start": 22969,
   "end": 23043,
   "type": "Code"
  },
  {
   "start": 23044,
   "end": 23044,
   "type": "Byte"
  },
  {
   "start": 23045,
   "end": 23067,
   "type": "Byte"
  },
  {
   "start": 23068,
   "end": 23090,
   "type": "Byte"
  },
  {
   "start": 23091,
   "end": 23091,
   "type": "Byte"
  },
  {
   "start": 23092,
   "end": 23235,
   "type": "Code"
  },
  {
   "start": 23236,
   "end": 23383,
   "type": "Code"
  },
  {
   "start": 23384,
   "end": 23622,
   "type": "Byte"
  },
  {
   "start": 23623,
   "end": 23780,
   "type": "Byte"
  },
  {
   "start": 23781,
   "end": 23907,
   "type": "Byte"
  },
  {
   "start": 23908,
   "end": 24107,
   "type": "Byte"
  },
  {
   "start": 24108,
   "end": 24307,
   "type": "Byte"
  },
  {
   "start": 24308,
   "end": 24563,
   "type": "Byte"
  },
  {
   "start": 24564,
   "end": 24575,
   "type": "Undefined"
  },
  {
   "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": 62463,
   "type": "Undefined"
  },
  {
   "start": 62464,
   "end": 63039,
   "type": "Byte"
  },
  {
   "start": 63040,
   "end": 63103,
   "type": "Byte"
  },
  {
   "start": 63104,
   "end": 63167,
   "type": "Byte"
  },
  {
   "start": 63168,
   "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": 63967,
   "type": "Byte"
  },
  {
   "start": 63968,
   "end": 63975,
   "type": "Byte"
  },
  {
   "start": 63976,
   "end": 63983,
   "type": "Byte"
  },
  {
   "start": 63984,
   "end": 63991,
   "type": "Byte"
  },
  {
   "start": 63992,
   "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": "Undefined"
  },
  {
   "start": 65024,
   "end": 65279,
   "type": "Byte"
  },
  {
   "start": 65280,
   "end": 65407,
   "type": "Byte"
  },
  {
   "start": 65408,
   "end": 65471,
   "type": "Byte"
  },
  {
   "start": 65472,
   "end": 65519,
   "type": "Undefined"
  }
 ],
 "symbols": [
  {
   "address": 2592,
   "name": "level_entry",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 2677,
   "name": "player_y_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 2691,
   "name": "end_flag",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2692,
   "name": "level_setup",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3127,
   "name": "load_tile_colours",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3139,
   "name": "pad_0c43",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3140,
   "name": "irq_level_1",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3271,
   "name": "irq_counter",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3272,
   "name": "irq_toggle",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3273,
   "name": "irq_level_2",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3386,
   "name": "irq_level_3",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3527,
   "name": "pause_flag",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3528,
   "name": "scroll_x_fine",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3529,
   "name": "irq_level_4",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3628,
   "name": "random",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3659,
   "name": "random_seed",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3660,
   "name": "disabled_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3661,
   "name": "unused_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3676,
   "name": "fill_screen_cc00",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3694,
   "name": "fill_screen_c800",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3712,
   "name": "fill_colour_ram",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3730,
   "name": "delay",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3739,
   "name": "nmi_handler",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 3747,
   "name": "nmi_flag",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3748,
   "name": "pad_0ea4",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3750,
   "name": "joy_port",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3751,
   "name": "draw_bottom_rows",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3785,
   "name": "counter_hundreds",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3786,
   "name": "counter_tens",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3787,
   "name": "counter_ones",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3788,
   "name": "draw_counter",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3828,
   "name": "draw_digit",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 3849,
   "name": "digit_glyphs",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3929,
   "name": "timer_skip",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3930,
   "name": "mask_end_flag",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3931,
   "name": "unused_timer_tick",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4014,
   "name": "map_pos",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4016,
   "name": "scroll_speed",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4017,
   "name": "level_done",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4018,
   "name": "shifted_flag",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4019,
   "name": "scroll_tmp",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4020,
   "name": "scroll_total",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4022,
   "name": "second_run",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4023,
   "name": "scroll_main",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4180,
   "name": "pad_1054",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4182,
   "name": "shift_main_left",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4325,
   "name": "half_step",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4326,
   "name": "new_column",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4395,
   "name": "draw_map_cell",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4464,
   "name": "scroll_fine_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4465,
   "name": "scroll_speed_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4466,
   "name": "scroll_accum_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4468,
   "name": "scroll_dir",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4469,
   "name": "scroll_count",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4470,
   "name": "scroll_script",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4935,
   "name": "scroll_lower",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5077,
   "name": "shift_rows_left",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5109,
   "name": "scroll_lower_right",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5174,
   "name": "shift_rows_right",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5204,
   "name": "draw_block",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5236,
   "name": "start_rows_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5436,
   "name": "start_rows_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5636,
   "name": "draw_start_rows",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5670,
   "name": "player_state",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5671,
   "name": "player_routines",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5681,
   "name": "player_x_prev",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5682,
   "name": "player_y_prev",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5683,
   "name": "player_x",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5684,
   "name": "player_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5685,
   "name": "player_update",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5731,
   "name": "player_update_pad",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5733,
   "name": "player_idle",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5734,
   "name": "walk_frame_index",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5735,
   "name": "walk_frames_left",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5753,
   "name": "walk_frames_right",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5771,
   "name": "walk_toggle",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5772,
   "name": "walk_left_frame",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5805,
   "name": "walk_right_frame",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5838,
   "name": "facing",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5839,
   "name": "feet_column",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5840,
   "name": "player_spare",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5843,
   "name": "walk_counter",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5844,
   "name": "stand_frame",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5881,
   "name": "stand_frame_pad",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5882,
   "name": "player_walk",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6100,
   "name": "player_fall",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6245,
   "name": "jump_steps",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 6323,
   "name": "arc_index",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 6324,
   "name": "player_jump",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6523,
   "name": "hurt_steps",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 6583,
   "name": "player_knockback",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6784,
   "name": "climb_frames",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 6809,
   "name": "climb_frame_a",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6842,
   "name": "climb_frame_b",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6875,
   "name": "player_frame",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 6880,
   "name": "player_sprites",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6930,
   "name": "tile_x_low",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 6931,
   "name": "tile_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 6932,
   "name": "tile_x_high",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 6933,
   "name": "pad_1b15",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 6940,
   "name": "row_pointers",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 6986,
   "name": "row_ptr_copy",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 6988,
   "name": "tile_lookup",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7036,
   "name": "tile_at_feet",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7071,
   "name": "tile_ahead",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7128,
   "name": "object_tile",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7158,
   "name": "obj_state",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7159,
   "name": "obj_delay",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7160,
   "name": "obj_x",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7162,
   "name": "obj_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7163,
   "name": "launch_x",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7165,
   "name": "obj_fall_step",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7166,
   "name": "obj_blast_frame",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7167,
   "name": "blast_sprites",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7197,
   "name": "fall_steps",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7237,
   "name": "object_update",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7468,
   "name": "explosion_sprites",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7583,
   "name": "hit_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7584,
   "name": "hit_delay",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7585,
   "name": "hit_test",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7752,
   "name": "map_row_0",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8008,
   "name": "map_row_1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8264,
   "name": "map_row_2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8516,
   "name": "map_patch_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8520,
   "name": "map_row_3",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8769,
   "name": "map_patch_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8776,
   "name": "map_row_4",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9032,
   "name": "block_chars",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9080,
   "name": "pause_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9119,
   "name": "explosion_frame",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9174,
   "name": "timer_update",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9295,
   "name": "energy",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9296,
   "name": "energy_masks",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9300,
   "name": "energy_sprite",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9364,
   "name": "energy_step",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9365,
   "name": "energy_bar_draw",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9501,
   "name": "score_add",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9544,
   "name": "digit_carry",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9545,
   "name": "score_draw",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9564,
   "name": "score_draw_digit",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9602,
   "name": "key_code",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9603,
   "name": "read_keys",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9722,
   "name": "key_row_mask",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9723,
   "name": "key_column",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9724,
   "name": "key_row_bits",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9725,
   "name": "key_codes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9789,
   "name": "end_screen",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9947,
   "name": "text_game_over",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9957,
   "name": "text_intro",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 10141,
   "name": "intro_text",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10275,
   "name": "copy_charsets",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10360,
   "name": "copy_source_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 11111,
   "name": "jsr_default_target",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 11123,
   "name": "copy_source_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12147,
   "name": "copy_source_b_tail",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12608,
   "name": "timer_ones",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12609,
   "name": "timer_tens",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12610,
   "name": "timer_hundreds",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12611,
   "name": "timer_sprite_draw",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12651,
   "name": "timer_sprite_digit",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12674,
   "name": "timer_tick",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12675,
   "name": "swap_chars_35b7",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12739,
   "name": "text_lab",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12851,
   "name": "image_phase",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 12852,
   "name": "image_flash",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12941,
   "name": "image_a_draw",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13046,
   "name": "image_b_draw",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13151,
   "name": "image_b_rows",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13391,
   "name": "image_b_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13421,
   "name": "image_b_chars",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13451,
   "name": "image_a_rows",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13691,
   "name": "image_a_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13721,
   "name": "image_a_chars",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13751,
   "name": "chars_saved_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 15799,
   "name": "screen_a_map",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16303,
   "name": "screen_b_map",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16384,
   "name": "screen_b_map_tail",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16751,
   "name": "rts_fill",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 16807,
   "name": "subject_screen",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 16999,
   "name": "text_subject",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 17007,
   "name": "text_press_fire",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 17030,
   "name": "mask_main",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 17056,
   "name": "match_seen_2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 17057,
   "name": "match_seen_1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 17058,
   "name": "match_seen_other",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 17059,
   "name": "text_index",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 17060,
   "name": "scan_delay",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 17061,
   "name": "text_scanning",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 17078,
   "name": "scan_text_tick",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 17121,
   "name": "text_mask_complete_data",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 17137,
   "name": "text_mask_complete",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 17171,
   "name": "text_insufficient_data",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 17189,
   "name": "text_to_generate_mask",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 17207,
   "name": "text_insufficient",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 17241,
   "name": "text_generate_mask",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 17275,
   "name": "scan_toggle",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 17276,
   "name": "scan_countdown",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 17277,
   "name": "scan_wait",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 17424,
   "name": "mask_finish",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 17503,
   "name": "mask_report",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 17548,
   "name": "dissolve_pattern",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 17621,
   "name": "draw_subject_chars",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 17720,
   "name": "clear_text_area",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 17801,
   "name": "swap_font_a",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 17858,
   "name": "swap_font_b",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 17892,
   "name": "swap_font_c",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 17964,
   "name": "draw_block_3x3",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 17984,
   "name": "draw_row_3",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 18002,
   "name": "draw_slice_blocks",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 18111,
   "name": "fire_held",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18112,
   "name": "flash_count",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18113,
   "name": "slice_number",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18114,
   "name": "capture_mark",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18115,
   "name": "pad_46c3",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18116,
   "name": "capture_delay",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18117,
   "name": "fire_capture",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 18270,
   "name": "slice_type",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18271,
   "name": "match_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 18315,
   "name": "match_row_61",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 18396,
   "name": "match_row_b1",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 18425,
   "name": "match_row_a1",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 18454,
   "name": "cursor_column",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18455,
   "name": "copy_glyph",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 18531,
   "name": "glyph_offset",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18533,
   "name": "glyph_dest_table",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18557,
   "name": "cursor_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18558,
   "name": "cursor_x",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18560,
   "name": "cursor_home",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 18571,
   "name": "scan_path",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18584,
   "name": "scan_durations",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18587,
   "name": "scan_index",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18588,
   "name": "scan_timer",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18589,
   "name": "scan_done",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18590,
   "name": "match_flags",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18603,
   "name": "slice_types",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18616,
   "name": "scan_started",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18617,
   "name": "scan_reversed",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18618,
   "name": "scan_cursor",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 18902,
   "name": "blink_colour",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18903,
   "name": "blink_count",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18904,
   "name": "cursor_phase",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 18905,
   "name": "sound_1c",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 18921,
   "name": "cursor_move",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 19100,
   "name": "mask_obj_state",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19105,
   "name": "mask_obj_delay",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19110,
   "name": "mask_obj_value_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19115,
   "name": "mask_obj_value_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19120,
   "name": "mask_obj_ptr_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19125,
   "name": "mask_obj_ptr_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19130,
   "name": "mask_obj_counter",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19135,
   "name": "mask_obj_ptr_init_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19140,
   "name": "mask_obj_ptr_init_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19145,
   "name": "mask_strip_steps",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19169,
   "name": "mask_strip_offsets",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19217,
   "name": "mask_obj_choice_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19220,
   "name": "mask_obj_choice_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19223,
   "name": "random_of_3",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 19241,
   "name": "random_of_5",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 19271,
   "name": "objects_spawn",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 19384,
   "name": "target_object",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19385,
   "name": "objects_run",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 19413,
   "name": "mask_obj_handlers",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19421,
   "name": "object_idle",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 19422,
   "name": "object_flip_toggle",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19423,
   "name": "object_source_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19424,
   "name": "object_source_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19425,
   "name": "object_return",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 19426,
   "name": "object_flip",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 19634,
   "name": "strip_offset",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19636,
   "name": "object_slide_in",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 19784,
   "name": "shift_cells_right",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 19869,
   "name": "shift_temp",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 19870,
   "name": "shift_cells_left",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 19928,
   "name": "object_slide_out",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 20025,
   "name": "screen_a_draw",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 20132,
   "name": "screen_b_draw",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 20239,
   "name": "text_pos",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 20240,
   "name": "text_skip_count",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 20241,
   "name": "lab_text",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 20379,
   "name": "typing_done",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 20380,
   "name": "mask_setup",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 20854,
   "name": "mask_unused",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 20855,
   "name": "irq_mask_1",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 20955,
   "name": "irq_mask_2",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21058,
   "name": "irq_mask_3",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21178,
   "name": "result_shown",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21179,
   "name": "mask_sprites",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21280,
   "name": "timer_draw",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21320,
   "name": "timer_draw_digit",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21341,
   "name": "mask_timer_tick",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21432,
   "name": "char_colour_table",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21688,
   "name": "font_saved_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21960,
   "name": "font_saved_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22472,
   "name": "mask_strip_data",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22952,
   "name": "story_screen",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 22969,
   "name": "continue_text",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 23044,
   "name": "continue_count",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23045,
   "name": "text_press_fire_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23068,
   "name": "text_credits",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23091,
   "name": "continue_flag",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23092,
   "name": "continue_screen",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 23236,
   "name": "story_text_type",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 23384,
   "name": "story_text",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23623,
   "name": "tile_chars_top",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23781,
   "name": "tile_chars_bottom",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23908,
   "name": "bottom_chars",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24108,
   "name": "bottom_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24308,
   "name": "tile_colour_src",
   "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": 62464,
   "name": "explosion_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 63040,
   "name": "object_shape",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 63104,
   "name": "cursor_shape",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 63168,
   "name": "invisible_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 63424,
   "name": "panel_bitmap",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 63680,
   "name": "image_row_0",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 63728,
   "name": "panel_bitmap_1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 63960,
   "name": "timer_glyph_hundreds",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 63968,
   "name": "timer_cell_gap",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 63976,
   "name": "timer_glyph_tens",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 63984,
   "name": "timer_glyph_ones",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 63992,
   "name": "panel_bitmap_2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64000,
   "name": "image_row_1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64048,
   "name": "panel_bitmap_3",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64088,
   "name": "score_glyphs",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64144,
   "name": "panel_bitmap_4",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64200,
   "name": "energy_sprite_dest",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64264,
   "name": "panel_bitmap_5",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64320,
   "name": "image_row_2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64368,
   "name": "panel_bitmap_6",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64640,
   "name": "image_row_3",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64688,
   "name": "panel_bitmap_7",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64960,
   "name": "image_row_4",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 65024,
   "name": "dissolve_buffer",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 65280,
   "name": "jump_shapes_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 65408,
   "name": "blank_sprite",
   "type": "Field",
   "kind": "user"
  }
 ],
 "comments": [
  {
   "address": 2592,
   "type": "line",
   "text": "Entry of the level 3 file, jumped to by the resident loader. Jumps to the main loop at $0A23, which calls the setup $0A84 and then repeats from $0A26: $0E4C, the counter digits $0ECC, $2549, $2495, $0A75, $3143 and the pause check $2378. It jumps to $4286 when $0FB1 is set or, with $0A11 non-zero, when the key code $2582 is $20. With the NMI flag $0EA3 set it calls $263D and goes to $0A6C. With the end flag $0A83 set it calls $263D, runs $5A34 when $0A12 is non-zero (a non-zero $5A33 then restarts at $0A23), and goes to $0A6C, which calls $B828 and jumps to the resident loader at $0404."
  },
  {
   "address": 2677,
   "type": "line",
   "text": "Sets the end flag $0A83 to 1 when the player's Y position $1634 is $A0 or more; otherwise returns at once. Called once per pass by the main loop at $0A32."
  },
  {
   "address": 2691,
   "type": "line",
   "text": "Set to 1 to end the main loop: by $0A75 when the player is low enough, by $1DA1 when the energy runs out and by $23D6 when the countdown reaches zero. Cleared by $0A84. The main loop tests it at $0A57."
  },
  {
   "address": 2692,
   "type": "line",
   "text": "One-time setup, called by the main loop at $0A23 (again after a restart). Disables interrupts, switches $01 to $35, sets VIC bank, $D018, $D011 and $D016, patches the map cells at $2145-$2147, $2241, $2242 and $2245-$2247 from $2144 and $2244, clears $FF80-$FFBF and the flags $0DC7, $0A83, $0FB1, $0FB6 and $0EA3, and sets start values ($244F=$21, $0ECA=0, $0ECB=5, $1626=1, player X/Y $1633/$1634=$F0/$5F, $1BFB=$E8, $3142=9, $0FAE/$0FAF=$1E5C, $16/$17=$1176). It ORs $08 into the 256 bytes at $BF00, clears $002A-$0100, fills screen and colour RAM through $0E5C and $0E80, builds the first screen with $4589, $279D, $2823, $0EA7, $1454 and $1604, starts the sound driver at $B0C8, installs the NMI vector $0E9B and the raster interrupt $0C44 (first line $82) and ends with CLI."
  },
  {
   "address": 3127,
   "type": "line",
   "text": "Copies 256 bytes from $5EF4 to $BF00 (the table that gives a character its colour). Called once by $0A84 at $0B56."
  },
  {
   "address": 3139,
   "type": "line",
   "text": "1 zero byte just before irq_level_1 ($0C44): padding. No traced code reads them."
  },
  {
   "address": 3140,
   "type": "line",
   "text": "Raster interrupt 1 of 4 of the level chain: the first vector set by $0A84 (line $82 then), later set to line $C6 by $0DC9. Keeps A, X and Y in the operands of the LDA/LDX/LDY #$00 before the RTI ($0CC1, $0CC3, $0CC5), puts $30 in the high nibble of $D018 and ORs $4F into $D011, writes $DB into all eight sprite pointers $CFF8-$CFFF, sets the border and sprite multicolours $D025/$D026 to 0 and acknowledges $D019. It stores the joystick port $DC00 in $0EA6, sets the low nibble of $D018 to 8, toggles $0CC8 and on every second frame counts $0CC7 down to 0, then sets raster line $CD and the vector $0CC9."
  },
  {
   "address": 3271,
   "type": "line",
   "text": "Counted down by 1 on every second frame while it is not zero, by the raster interrupts $0C44 and $5177. No other reader in the dumped code."
  },
  {
   "address": 3272,
   "type": "line",
   "text": "Toggled between 0 and 1 every frame by the raster interrupts $0C44 and $5177; $0CC7 is counted down when it becomes 0."
  },
  {
   "address": 3273,
   "type": "line",
   "text": "Raster interrupt 2 of 4 of the level chain, on line $CD (set by $0C44). Keeps A, X and Y in the operands at $0D34, $0D36 and $0D38, ORs $2F into $D011 and $17 into $D016 and writes both back after a run of NOPs for timing, acknowledges $D019, sets raster line $14 and the vector $0D3A, and clears bit 6 of $D011. It then runs the main scroll step $0FB7 and copies the player position: X $1633 to the sprite X registers $D000, $D002 and $D004, Y $1634 to $D001 and $D005, and Y plus $15 to $D003."
  },
  {
   "address": 3386,
   "type": "line",
   "text": "Raster interrupt 3 of 4 of the level chain, on line $14 (set by $0CC9). Keeps A, X and Y in the operands at $0DC1, $0DC3 and $0DC5, acknowledges $D019, masks $D011 with $90 and sets $D016 to its high nibble ORed with the fine scroll $1170. It runs the timer $23D6 and the player sprites $1AE0, sets the low nibble of $D018 to 2, writes the colours $D022=7, $D023=2, $D025=$0B, $D026=8 and later $D025=1, $D026=8, $D029=9, $D027=$D028=0, turns all sprites on ($D015=$FF), clears bit 6 of $D011 and sets sprite 2 double height ($D017=4). It then runs the object update $1C45, reads the keyboard with $2583 into $2582, and sets line $5A and the vector $0DC9."
  },
  {
   "address": 3527,
   "type": "line",
   "text": "1 while the game is paused, else 0: set and cleared by $2378. Tested by $0FB7, $1347, $1635, $1C45, $23D6 and the raster interrupt at $0DC9."
  },
  {
   "address": 3528,
   "type": "line",
   "text": "Fine horizontal scroll value 0 to 7 for the main scroller: $0FB7 takes $0FB0 off it (wrapping through 7) and the raster interrupt at $0DC9 ORs it into $D016."
  },
  {
   "address": 3529,
   "type": "line",
   "text": "Raster interrupt 4 of 4 of the level chain, on line $5A (set by $0D3A). Keeps A, X and Y in the operands at $0E26, $0E28 and $0E2A, acknowledges $D019, sets $D016 to its high nibble ORed with the fine scroll $0DC8, $D018 to $30, $D022=$0F, $D023=$0B and all sprites multicolour ($D01C=$FF). It runs the explosion $239F and the sound driver $B176, sets line $C6 and the vector $0C44, then runs the second scroller $1347 and the player update $1635, and the hit test $1DA1 unless the pause flag $0DC7 is set. It ends by setting the border $D020 to 0."
  },
  {
   "address": 3628,
   "type": "line",
   "text": "Returns a pseudo-random byte in A. Stores the low three bits of CIA 1 timer A ($DC04) into $0E3D, the offset byte of the branch at $0E3C, adds the timer high byte $DC05 and the seed $0E4B, and takes that branch (carry is set), which skips 0 to 7 of the nine ROL A at $0E3E-$0E46. The result is stored back in the seed $0E4B and returned. Called by $1C45."
  },
  {
   "address": 3659,
   "type": "line",
   "text": "Seed byte of the random routine $0E2C: read, and replaced by each result."
  },
  {
   "address": 3660,
   "type": "line",
   "text": "A bare RTS; it does nothing. Called by the main loop at $0A26 once per pass."
  },
  {
   "address": 3661,
   "type": "line",
   "text": "Reads $DD00 (CIA 2 port A) and returns when bit 2 of it is set. When the bit is clear it removes three bytes from the stack (three PLA), disables interrupts and jumps to $0810. No traced code calls or jumps here: the main loop calls $0E4C, which is a bare RTS, so these 15 bytes are never run. The bytes do not say what the check was meant to guard."
  },
  {
   "address": 3676,
   "type": "line",
   "text": "Fills the 1,024 bytes $CC00-$CFFF with the value in A. Called by $0A84 with $97 and with 0."
  },
  {
   "address": 3694,
   "type": "line",
   "text": "Fills the 1,024 bytes $C800-$CBFF with the value in A. No caller in the dumped code."
  },
  {
   "address": 3712,
   "type": "line",
   "text": "Fills colour RAM $D800-$DBFF with the value in A. Called by $0A84 with 7 and with $0E."
  },
  {
   "address": 3730,
   "type": "line",
   "text": "Delay loop: A is the outer count and the inner loop runs 256 times for each. Called twice by $0A84 with $FF."
  },
  {
   "address": 3739,
   "type": "line",
   "text": "Non-maskable interrupt (vector $FFFA, set by $0A84): sets the flag $0EA3 to 1 and returns with A preserved. The main loop at $0A4C sees the flag, calls $263D and leaves for the loader at $0404."
  },
  {
   "address": 3747,
   "type": "line",
   "text": "Set to 1 by the NMI handler $0E9B, cleared by $0A84 and by mask_setup ($4F9C, at $506A). The main loop tests it at $0A4C."
  },
  {
   "address": 3748,
   "type": "line",
   "text": "2 zero bytes after nmi_flag: padding. No traced code reads them."
  },
  {
   "address": 3750,
   "type": "line",
   "text": "$0A84 stores $FF here and the raster interrupt at $0C44 stores $DC00 each frame. No other reader in the dumped code."
  },
  {
   "address": 3751,
   "type": "line",
   "text": "Copies 200 bytes from $5D64 to $CEF7 (screen matrix) and 200 bytes from $5E2C to $DAF7 (colour RAM), then clears 40 bytes at $CFC0 and at $DBC0. Called by $0A84 at $0BC0."
  },
  {
   "address": 3785,
   "type": "line",
   "text": "First of the three counter digits drawn by $0ECC (at $F9F0)."
  },
  {
   "address": 3786,
   "type": "line",
   "text": "Second counter digit, drawn at $F9E8; $0A84 sets it to 0."
  },
  {
   "address": 3787,
   "type": "line",
   "text": "Third counter digit, drawn at $F9D8; $0A84 sets it to 5."
  },
  {
   "address": 3788,
   "type": "line",
   "text": "Draws the three counter digits with $0EF4: $0ECB at $F9D8, $0ECA at $F9E8 and $0EC9 at $F9F0 (it sets $DB/$DC to those addresses and X to 2, 1, 0). Called by the main loop at $0A29 every pass."
  },
  {
   "address": 3828,
   "type": "line",
   "text": "X is the index into the digit variables at $0EC9. Takes the digit there times 8 as an index into the glyph table $0F09 and copies 8 bytes to the address in $DB/$DC. Called three times by $0ECC."
  },
  {
   "address": 3849,
   "type": "line",
   "text": "Ten glyphs of 8 bytes, one per digit 0 to 9, copied by $0EF4 into character memory."
  },
  {
   "address": 3929,
   "type": "line",
   "text": "Skip toggle of the mask game timer: $535D finds 0, sets it to 1 and counts the timer down; finds 1 and sets it back to 0 without counting. So the timer drops on every second call. The unreached copy of the routine at $0F5B uses it too."
  },
  {
   "address": 3930,
   "type": "line",
   "text": "Set to 1 when the mask game is over: by $46C5 after the twelfth capture and by $535D when the timer reaches 0 (both also run $4880). Cleared by $4F9C. Tested by $4286, by the raster interrupts $51DB and $5242. Switches from the player phase to the scan phase."
  },
  {
   "address": 3931,
   "type": "line",
   "text": "A copy of mask_timer_tick ($535D) that nothing calls. It counts the three digits $0EC9, $0ECA and $0ECB down by one on every second call, using the skip toggle $0F59 and borrowing from the next digit as $535D does. The difference is the end: when all three digits are 0 it only returns, where $535D sets the mask game's end flag $0F5A to 1 and runs $4880."
  },
  {
   "address": 4014,
   "type": "line",
   "text": "Map position, low byte then high byte: $0A84 sets $1E5C, $10E6 adds 1 on every second call, $0FB7 resets it to $1E48 and tests it for $1F47 and $1F21. $10E6 passes it to $112B as the pointer $10/$11."
  },
  {
   "address": 4016,
   "type": "line",
   "text": "Pixels scrolled per frame; the snapshot holds 2. Cleared to 0 by $1635 each frame and by $0FB7 at the end of the level; subtracted by $0FB7, $1347 and $13F5."
  },
  {
   "address": 4017,
   "type": "line",
   "text": "Set to 1 by $0FB7 when the map position reaches its end in the second run; cleared by $0A84. The main loop tests it at $0A3B and jumps to $4286."
  },
  {
   "address": 4018,
   "type": "line",
   "text": "Cleared by $0FB7 each call and set to 1 by $1056 when the screen has just been moved one character."
  },
  {
   "address": 4019,
   "type": "line",
   "text": "Scratch byte of $0FB7 and $1347 for the wrap of the fine scroll."
  },
  {
   "address": 4020,
   "type": "line",
   "text": "16-bit total, low byte then high byte: $0FB7 adds $0FB0 to it each call. No other reader in the dumped code."
  },
  {
   "address": 4022,
   "type": "line",
   "text": "0 in the first run through the map, 1 after $0FB7 has reset the position to $1E48; $0A84 clears it."
  },
  {
   "address": 4023,
   "type": "line",
   "text": "Main scroll step, called by the raster interrupt at $0CC9 (at $0D15); returns at once while paused ($0DC7). When the map position $0FAE/$0FAF reaches $1F47 in the first run ($0FB6=0), it sets $0FB6 to 1 and resets the position to $1E48; in the second run it sets $0FB1 to 1 and $0FB0 to 0 at $1F21. Otherwise it takes the speed $0FB0 off the object X $1BF8/$1BF9 (stops the object when below $0F), takes it off the fine scroll $0DC8 (wrapping 0 to 7 and calling $1056 on a wrap, which sets $0FB2) and adds it to the 16-bit $0FB4/$0FB5."
  },
  {
   "address": 4180,
   "type": "line",
   "text": "2 zero bytes before shift_main_left ($1056): padding. No traced code reads them."
  },
  {
   "address": 4182,
   "type": "line",
   "text": "Sets $0FB2 to 1 and moves 38 characters one place to the left in ten rows of the screen matrix ($CD68, $CD90 ... $CED0, step $28) and in the same ten rows of colour RAM ($D968 ... $DAD0), then calls $10E6 to build the new column. Called by $0FB7."
  },
  {
   "address": 4325,
   "type": "line",
   "text": "Toggled between 0 and 1 by $10E6; $112B adds it to the table index, and the map position advances when it becomes 0."
  },
  {
   "address": 4326,
   "type": "line",
   "text": "Toggles $10E5 between 0 and 1; when it becomes 0 it adds 1 to the map position $0FAE/$0FAF. Points $10/$11 at the map position, $12/$13 at $CD8E and $14/$15 at $D98E and calls $112B five times, which writes column 38 of rows 9 to 18 in the screen matrix and colour RAM. Called by $1056."
  },
  {
   "address": 4395,
   "type": "line",
   "text": "Draws one map cell. The map byte at ($10) times 2 plus $10E5 indexes the character tables $5C47 (written to ($12)) and $5CE5 (written to ($12)+$28); the colour of each character from the table $BF00 is written to ($14) and ($14)+$28. Then adds $50 to $12/$13 and $14/$15 and increments $11. Called five times by $10E6."
  },
  {
   "address": 4464,
   "type": "line",
   "text": "Fine scroll 0 to 7 of the second scroller ($1347, $13F5); the raster interrupt at $0D3A ORs it into $D016."
  },
  {
   "address": 4465,
   "type": "line",
   "text": "Speed of the current step of the second scroller, loaded from the table $1176 by $1347."
  },
  {
   "address": 4466,
   "type": "line",
   "text": "16-bit value, low byte then high byte, changed by $0FB0 in each step of $1347 and $13F5. No other reader in the dumped code."
  },
  {
   "address": 4468,
   "type": "line",
   "text": "Direction of the current step of the second scroller, loaded from the table $1176: 0 scrolls through $1347's own code, non-zero calls $13F5."
  },
  {
   "address": 4469,
   "type": "line",
   "text": "Frames left in the current step of the second scroller; $1347 loads the next table entry when it is 0."
  },
  {
   "address": 4470,
   "type": "line",
   "text": "Entries of three bytes (direction, speed, count) read through the pointer $16/$17 by $1347; the table ends with $FF $FF $FF at $1344 and a first byte with bit 7 set sends the pointer back to $1176."
  },
  {
   "address": 4935,
   "type": "line",
   "text": "Second scroller, called by the raster interrupt at $0DC9 (at $0E12); returns at once while paused ($0DC7). When the count $1175 is 0 it advances the pointer $16/$17 by 3 into the table at $1176 (a first byte with bit 7 set sends it back to $1176) and loads the direction $1174, the speed $1171 and the count $1175; then it decrements $1175. A non-zero $1174 calls $13F5. Otherwise it takes the speed off $1BFB/$1BFC and off the fine scroll $1170 (wrapping 0 to 7 and calling $13D5 on a wrap), and adds $0FB0 to $1172/$1173."
  },
  {
   "address": 5077,
   "type": "line",
   "text": "Moves 38 characters one place to the left in four rows of the screen matrix ($CC28, $CC50, $CC78, $CCA0). Called by $1347 when the fine scroll $1170 wraps."
  },
  {
   "address": 5109,
   "type": "line",
   "text": "Scroll step for a non-zero direction $1174, called by $1347. Adds the speed $1171 to $1BFB/$1BFC and to the fine scroll $1170 (wrapping at 8 and calling $1436 on a wrap), and takes $0FB0 off $1172/$1173."
  },
  {
   "address": 5174,
   "type": "line",
   "text": "Moves 38 characters one place to the right in four rows of the screen matrix ($CC28, $CC50, $CC78, $CCA0), from column $25 down to 0. Called by $13F5."
  },
  {
   "address": 5204,
   "type": "line",
   "text": "Copies four rows of 12 bytes from $2348, $2354, $2360 and $236C to $CC3C, $CC64, $CC8C and $CCB4 in the screen matrix. Called once by $0A84 at $0BC3."
  },
  {
   "address": 5236,
   "type": "line",
   "text": "200 bytes copied to $CD68 by $1604, with colours from $BF00 to $D968."
  },
  {
   "address": 5436,
   "type": "line",
   "text": "200 bytes copied to $CE30 by $1604, with colours from $BF00 to $DA30."
  },
  {
   "address": 5636,
   "type": "line",
   "text": "Copies 200 bytes from $1474 to $CD68 and 200 bytes from $153C to $CE30 in the screen matrix, and writes the colour of each character, taken from the table $BF00, to $D968 and $DA30. Called once by $0A84 at $0BC6."
  },
  {
   "address": 5670,
   "type": "line",
   "text": "Selects the player routine: $1635 calls the one at $1627 + 2 x this value. $0A84 sets it to 1; $1DA1 sets it to 4 on a hit unless it is 3; $1AE0 and $1DA1 treat 3 and 4 specially."
  },
  {
   "address": 5671,
   "type": "line",
   "text": "Five routine addresses, low byte first: $1665, $16FA, $17D4, $18B4 and $19B7. $1635 writes the one selected by $1626 into the operand of the JSR at $165C."
  },
  {
   "address": 5681,
   "type": "line",
   "text": "Copy of the player X $1633 made by $1635 before it calls the player routine."
  },
  {
   "address": 5682,
   "type": "line",
   "text": "Copy of the player Y $1634 made by $1635 before it calls the player routine."
  },
  {
   "address": 5683,
   "type": "line",
   "text": "Player X position. $0A84 sets it to $F0; the raster interrupt at $0CC9 writes it to the sprite X registers $D000, $D002 and $D004; $1DA1 compares it with the object X."
  },
  {
   "address": 5684,
   "type": "line",
   "text": "Player Y position. $0A84 sets it to $5F; the raster interrupt at $0CC9 writes it to $D001 and $D005 and plus $15 to $D003; $0A75 tests it against $A0."
  },
  {
   "address": 5685,
   "type": "line",
   "text": "Called by the raster interrupt at $0DC9 (at $0E15). Unless paused ($0DC7), it clears $0FB0, copies the player X/Y $1633/$1634 to $1631/$1632 and calls the routine whose address is in the word table at $1627 selected by $1626 (the address is written into the operand of the JSR at $165C). It always ends by calling $1AE0."
  },
  {
   "address": 5731,
   "type": "line",
   "text": "Two zero bytes between the RTS that ends player_update ($1635) and player_idle. Nothing reads them."
  },
  {
   "address": 5733,
   "type": "line",
   "text": "Routine for player state 0 in the table player_routines ($1627): a bare RTS. $1635 would run it if $1626 were 0; the traced code sets $1626 only to 1, 2, 3 or 4, so it is not run."
  },
  {
   "address": 5734,
   "type": "line",
   "text": "Position 0 to 17 in the two walking-frame tables $1667 and $1679. $168C and $16AD add 1 to it on every second call and wrap it from 18 to 0. The unreached routines $1A99 and $1ABA use it the same way with a wrap at 12."
  },
  {
   "address": 5735,
   "type": "line",
   "text": "18 sprite pointers, three of each of $9D, $9E, $9F, $A0, $A1 and $A2: the frames of the player walking left. $168C copies the entry at the index $1666 to the frame number $1ADB. The shapes are at $E740 (walk_left_shapes); $A0 is also the standing frame facing left (stored by the state routines)."
  },
  {
   "address": 5753,
   "type": "line",
   "text": "18 sprite pointers, three of each of $97, $98, $99, $9A, $9B and $9C: the frames of the player walking right. $16AD copies the entry at the index $1666 to the frame number $1ADB. The shapes are at $E5C0 (walk_right_shapes); $9A is also the standing frame facing right."
  },
  {
   "address": 5771,
   "type": "line",
   "text": "Flips between 0 and 1 on each call of $168C and $16AD (and of $1A99 and $1ABA). The frame index $1666 moves on only when the flip makes it 1, so the index advances on every second call and each frame lasts six calls (the tables repeat each pointer three times)."
  },
  {
   "address": 5772,
   "type": "line",
   "text": "Next frame of the walk to the left. Flips $168B and, when it becomes 1, adds 1 to $1666 (back to 0 at 18). Then stores the pointer at $1667 plus $1666 in the frame number $1ADB. Called by player_walk ($16FA) at $1717 when the joystick is pushed left."
  },
  {
   "address": 5805,
   "type": "line",
   "text": "Next frame of the walk to the right, built like $168C with the table $1679. Called by player_walk ($16FA) at $1736 when the joystick is pushed right."
  },
  {
   "address": 5838,
   "type": "line",
   "text": "Direction the player faces: 1 after the joystick was pushed left, 0 after right (set by $16FA, $17D4 and $18B4). Read by $1B9F, which looks 8 pixels further on when it is 0, by the state routines to choose the standing frame ($A0 left, $9A right) and the jump frame ($F9 left, $F8 right), and by $19B7, which moves the player 2 pixels away from the way he faces."
  },
  {
   "address": 5839,
   "type": "line",
   "text": "Column index of the character at the player's feet (the Y register that $1B7C returns), stored by $16FA at $1776. No traced code reads it."
  },
  {
   "address": 5840,
   "type": "line",
   "text": "Three bytes, all 0 in the snapshot, that no traced code writes. $16D1 is read by $16FA at $17AC, where the branch it feeds goes to the next instruction anyway, so it has no effect."
  },
  {
   "address": 5843,
   "type": "line",
   "text": "Counter that $16FA counts down by 1 on each call while it is not 0. No traced code sets it, it is 0 in the snapshot, and nothing else reads it."
  },
  {
   "address": 5844,
   "type": "line",
   "text": "Sets the three bytes $1ADC, $1ADD and $1ADE to $92, $B6 and $C0 when the facing $16CE is 0 and to $93, $B7 and $C1 otherwise. No traced code calls it, and nothing reads those three bytes."
  },
  {
   "address": 5881,
   "type": "line",
   "text": "A zero byte between stand_frame and player_walk. Nothing reads it."
  },
  {
   "address": 5882,
   "type": "line",
   "text": "Player state 1, on the ground: the routine for $1626 = 1 that $1635 runs through the table at $1627. Sets the low three bits of the player Y $1634 and counts $16D3 down. Joystick left (bit 2 of $0EA6 clear): facing $16CE = 1, runs $168C and takes 2 off the player X $1633 unless the result would be below $78. Right (bit 3 clear): $16CE = 0, runs $16AD and adds 2, unless the result would reach $E6, where it sets the scroll speed $0FB0 to 3 and leaves X as it is. Then $1B9F reads the character ahead, one screen row up: a code from 2 to $53 blocks the move (X is put back from $1631, scroll speed 0). $1B7C reads the feet column and the character one row below: a code from 2 to $21 is floor, any other code sets the state to 2 (falling). On floor, joystick up (bit 0 clear) sets the state to 3 (jump), clears the jump index $18B3 and sets the frame $1ADB to $F8 (facing right) or $F9 (left). With no direction pushed ($0EA6 AND $0F = $0F) the frame becomes the standing frame $9A (right) or $A0 (left)."
  },
  {
   "address": 6100,
   "type": "line",
   "text": "Player state 2, falling: the routine for $1626 = 2. Moves left and right as $16FA does (limits $78 and $E6, scroll speed 3 at the right edge), then reads the character ahead in the row below the feet row ($1B9F, one row down): a code from 2 to $22 blocks the move (X from $1631, scroll speed 0). Adds 4 to the player Y each call; once Y is $3C or more it reads the character one row below the feet with $1B7C, and a code from 2 to $21 lands the player (state 1). The frame $1ADB is the standing frame $9A (facing right) or $A0 (left)."
  },
  {
   "address": 6245,
   "type": "line",
   "text": "39 signed steps for the player Y, each stored as a 16-bit value with the low byte first (the high byte is the sign, $FF or 0, and $18B4 reads only the low byte, adding it to $1634 and moving the index $18B3 on by 2). The steps run -4, -4, -3, -3, -3, -2, -3, -2, -2, -2, -2, -1, -2, -1, -1, -1, -1, 0, -1, 0 and then back up through 1 to 4. They add up to 0, so the player ends where he began, after rising 38 pixels."
  },
  {
   "address": 6323,
   "type": "line",
   "text": "Index into the step table of the arc the player is in: jump_steps ($1865) in state 3 and hurt_steps ($197B) in state 4, moved on by 2 each frame by $18B4 and $19B7. Cleared by $178E when the jump starts and by $1DA1 when the player is hit."
  },
  {
   "address": 6324,
   "type": "line",
   "text": "Player state 3, jumping: the routine for $1626 = 3. Adds the step at $1865 plus the index $18B3 to the player Y and moves the index on by 2; at $4E (the end of the table) it sets the state to 1. From index $29, once Y is $46 or more, it reads the character one row below the feet ($1B7C) and a code from 2 to $21 lands the player (state 1). The joystick moves X as in $16FA (limits $78 and $E6, scroll speed 3 at the right edge) and sets the facing. The frame $1ADB is $F8 (right) or $F9 (left), and the standing frame again after landing. The character ahead (in the row below the feet row while in the air, in the feet row itself after landing) blocks the move when its code is 2 to $22 (X from $1631, scroll speed 0)."
  },
  {
   "address": 6523,
   "type": "line",
   "text": "30 signed steps for the player Y, stored like jump_steps (16-bit, low byte first, only the low byte used): -6 four times, -5, -5, -4, -4, -3, -3, -2, -2, -1, -1, 0, 0 and then back up through 1 to 6, ending with 6 four times. They add up to 0, after a rise of 54 pixels. $19B7 reads them with the index $18B3."
  },
  {
   "address": 6583,
   "type": "line",
   "text": "Player state 4, thrown back after a hit: the routine for $1626 = 4, which $1DA1 sets (clearing $18B3) when the falling object hurts the player outside state 3. Clears the scroll speed, adds the step at $197B plus the index $18B3 to the player Y and moves the index on by 2. At $3C it sets the state to 1. From index $20, once Y is $46 or more and the character ahead in the row below the feet row has a code from 2 to $22, it lands: state 1, Y put back from $1632. The joystick is not read. X moves 2 pixels away from the way the player faces ($16CE; to the left while it is 0, with the limits $78 and $E6, and scroll speed 3 at the right edge). The frame $1ADB is changed only on landing, to the standing frame $9A or $A0; player_sprites builds the three sprites for states 3 and 4 from $1ADB, $1ADB+2 and $1ADB+4. It blocks the move into a wall as $16FA does."
  },
  {
   "address": 6784,
   "type": "line",
   "text": "A zero byte at $1A80, then two tables of 12 sprite pointers that $1A99 and $1ABA read: $1A81 holds $94, $94, $94, $95, $95, $95, $96, $96, $96, $95, $95, $95 and $1A8D the same pointers in the reverse order. They are the climbing frames, whose shapes are at $E500 (climb_shapes); no traced level 3 code calls the two routines."
  },
  {
   "address": 6809,
   "type": "line",
   "text": "Next frame of a climb: flips $168B and, when it becomes 1, adds 1 to $1666 (back to 0 at 12), then stores the pointer at $1A81 plus $1666 in the frame number $1ADB. No traced code calls it."
  },
  {
   "address": 6842,
   "type": "line",
   "text": "The same as $1A99 with the table $1A8D (the pointers in the reverse order). No traced code calls it."
  },
  {
   "address": 6875,
   "type": "line",
   "text": "Sprite pointer base for the player: $1AE0 builds $CFF8-$CFFA from it."
  },
  {
   "address": 6880,
   "type": "line",
   "text": "Sets the sprite pointers $CFF8, $CFF9 and $CFFA from the frame number $1ADB. When $1626 is 3 or 4: $CFFA=$1ADB, $CFF8=$1ADB+2 and $CFF9=$1ADB+4. Otherwise: $CFF8=$1ADB, $CFF9=$1ADB+$0D and $CFFA=$1ADB+$0D-$24. Called by the raster interrupt at $0D3A (at $0D5E) and by $1635."
  },
  {
   "address": 6930,
   "type": "line",
   "text": "Low byte of the X position for the lookup $1B4C; set by $1BD8."
  },
  {
   "address": 6931,
   "type": "line",
   "text": "Y position for the lookup $1B4C; set by $1BD8."
  },
  {
   "address": 6932,
   "type": "line",
   "text": "High byte of the X position for the lookup $1B4C; set by $1BD8."
  },
  {
   "address": 6933,
   "type": "line",
   "text": "7 zero bytes after tile_x_high: padding. No traced code reads them."
  },
  {
   "address": 6940,
   "type": "line",
   "text": "23 addresses, low byte first, $CC00 to $CF70 in steps of $28: the rows of the screen matrix, indexed by $1B4C."
  },
  {
   "address": 6986,
   "type": "line",
   "text": "$1B4C stores the row address it has just read from $1B1C here. No other reader in the dumped code."
  },
  {
   "address": 6988,
   "type": "line",
   "text": "Returns in A the character in the screen matrix at the position given by $1B12 (X low), $1B14 (X high) and $1B13 (Y). The row is (Y-$24)/8, whose address comes from the pointer table $1B1C (copied to $DD/$DE and $1B4A/$1B4B); the column is X/8, plus $20 if $1B14 is non-zero, minus 3. Y is left set to that column. Called by $1BD8."
  },
  {
   "address": 7036,
   "type": "line",
   "text": "Looks up the screen character under the player's feet: sets the position for $1B4C to X = player X $1633 + 8 (with the carry into the high byte $1B14) and Y = player Y $1634 + $16, then calls $1B4C, which returns the character in A, the column index in Y and the row address in $DD/$DE. Called by $16FA, $17D4 and $18B4."
  },
  {
   "address": 7071,
   "type": "line",
   "text": "As $1B7C, but when the player faces right ($16CE = 0) it adds another 8 to X, so that it looks at the character in front of him. Returns as $1B4C does. Called by $16FA, $17D4, $18B4, $19B7 and $1A3B."
  },
  {
   "address": 7128,
   "type": "line",
   "text": "Sets the lookup position from the object: $1B12=$1BF8+8, $1B14=$1BF9 and $1B13=$1BFA+6, then calls $1B4C. Called by $1C45 at $1CEC."
  },
  {
   "address": 7158,
   "type": "line",
   "text": "State of the falling object: 0 idle, 1 falling, 2 exploding; run by $1C45, tested by $0FB7, $1DA1 and $239F."
  },
  {
   "address": 7159,
   "type": "line",
   "text": "Frames to wait in state 0; $1C45 counts it down and then sets it from $0E2C shifted right five times; $0A84 sets $40."
  },
  {
   "address": 7160,
   "type": "line",
   "text": "Object X, low byte then high byte ($1BF9). $1C45 sets it from $1BFB/$1BFC and adds 3 per frame; $0FB7 subtracts the scroll speed."
  },
  {
   "address": 7162,
   "type": "line",
   "text": "Object Y: set to $34 and increased by $1C45 with the steps in $1C1D; also used by $1D2C, $1BD8 and $1DA1."
  },
  {
   "address": 7163,
   "type": "line",
   "text": "Position, low byte then high byte, copied to the object X when it starts; $0A84 sets $E8, and $1347 and $13F5 change it with the second scroller."
  },
  {
   "address": 7165,
   "type": "line",
   "text": "Index into the table $1C1D, set to 0 when the object starts and increased each frame by $1C45."
  },
  {
   "address": 7166,
   "type": "line",
   "text": "Frame of the explosion: index into the table $1BFF; set to 0 by $1C45 when state 2 starts and increased each frame; used by $239F and $1DA1."
  },
  {
   "address": 7167,
   "type": "line",
   "text": "Sprite pointers for the explosion frames; $1C45 reads indexes up to $1A and $239F writes the entry to $CFFB-$CFFF."
  },
  {
   "address": 7197,
   "type": "line",
   "text": "Y steps for the object per frame, indexed by $1BFD; the first byte after the table ($1C45) has bit 7 set, which stops the index."
  },
  {
   "address": 7237,
   "type": "line",
   "text": "Per-frame update of the falling object, called by the raster interrupt at $0D3A (at $0DA8). Sets the sprite pointer $CFFB to $D9; while paused it only updates the sprite registers. State $1BF6 = 0: counts down $1BF7, then picks a new delay from $0E2C, sets the state to 1, copies $1BFB/$1BFC to $1BF8/$1BF9, sets Y $1BFA to $34 and plays sound $20 with $B0EE. State 1: X goes up by 3, Y goes up by the step from $1C1D indexed by $1BFD; at Y $C8 it ends; from Y $64 it looks up the tile with $1BD8 and a character from 2 to $21 sets the state to 2 and plays sound $14. State 2: steps $1BFE and takes the sprite pointer from $1BFF, ending at $1B. Finishes by writing sprite 3 X/Y ($D006/$D007, bit 3 of $D010) from $1BF8-$1BFA."
  },
  {
   "address": 7468,
   "type": "line",
   "text": "Positions sprites 4 to 7 around the object: Y is $1BFA+7 for sprites 4 and 5 and $1BFA-7 for sprites 6 and 7; X is $1BF8-7 (sprites 4 and 6) and $1BF8+7 (sprites 5 and 7), with the high bits of $D010 handled for $1BF9 zero and non-zero. Called by $239F."
  },
  {
   "address": 7583,
   "type": "line",
   "text": "The player's Y plus $15, stored by $1DA1 for the distance test."
  },
  {
   "address": 7584,
   "type": "line",
   "text": "Frames left before the next hit counts; $1DA1 sets it to $0A and counts it down."
  },
  {
   "address": 7585,
   "type": "line",
   "text": "Called by the raster interrupt at $0DC9 (at $0E1D) when not paused. While $1DA0 is non-zero it only counts it down. It continues only when $1BF9 is 0, $1BF6 is 2, $1BFE is below 8 and $1626 is not 4, and when the object is within $19 of the player's X and within $28 of the player's Y plus $15. Then, if the energy $244F is 4 or less it sets the end flag $0A83; otherwise it takes 4 off $244F, sets $1DA0 to $0A, plays sound 0 with $B0EE, and sets $1626 to 4 and $18B3 to 0 unless $1626 is 3."
  },
  {
   "address": 7752,
   "type": "line",
   "text": "Row 0, the top row, of the level map: 256 cells of one byte, left to right. The map is five such rows, each 256 bytes after the last, so the cell below $1E48+n is $1F48+n. $10E6 draws one character column at a time at screen column 38 from the position in $0FAE/$0FAF ($1E5C at the start, $1F47 at the end of the first run through the map, in which the position is reset to $1E48 for a second run that ends at $1F21): $112B reads this row's cell, then adds $100 to the pointer for the next row, and draws each cell as two characters one above the other from the tables $5C47 and $5CE5, the left or right pair by $10E5. Row 0 lands on screen rows 9 and 10. In the bytes 219 of the 256 cells are 0; the others are mostly pairs of neighbours (18 and 19, 1C and 1D) and short platform runs."
  },
  {
   "address": 8008,
   "type": "line",
   "text": "Row 1 of the level map (see $1E48): 256 cells drawn on screen rows 11 and 12 by $112B. Cell value 0 is empty and 134 of the 256 cells are 0; value 1 (35 cells) and 2 (17 cells) form runs, 0B (19 cells) appears in groups."
  },
  {
   "address": 8264,
   "type": "line",
   "text": "Row 2 of the level map (see $1E48): 256 cells drawn on screen rows 13 and 14 by $112B. This block ends at $2143; the last four cells of the row, $2144 to $2147, are map_patch_a. Value 11 is the commonest (54 cells) and 83 cells are 0."
  },
  {
   "address": 8516,
   "type": "line",
   "text": "Map cells: $0A84 copies the value at $2144 to $2145-$2147."
  },
  {
   "address": 8520,
   "type": "line",
   "text": "Row 3 of the level map (see $1E48): 256 cells drawn on screen rows 15 and 16 by $112B. This block ends at $2240; the last seven cells of the row, $2241 to $2247, are map_patch_b. Value 11 is the commonest (60 cells) and 40 cells are 0."
  },
  {
   "address": 8769,
   "type": "line",
   "text": "Map cells: $0A84 copies $2244 to $2245-$2247 and the value at $2144 to $2241 and $2242."
  },
  {
   "address": 8776,
   "type": "line",
   "text": "Row 4, the bottom row, of the level map (see $1E48): 256 cells drawn on screen rows 17 and 18 by $112B. Value 11 is the commonest (75 cells) and 43 cells are 0; the greatest value in the five rows is $3A, which $112B turns into the index 2 x $3A + 1 in the character tables."
  },
  {
   "address": 9032,
   "type": "line",
   "text": "Four rows of 12 characters at $2348, $2354, $2360 and $236C, copied to the screen matrix by $1454."
  },
  {
   "address": 9080,
   "type": "line",
   "text": "Pause: when the key code $2582 is $50, sets $0DC7 to 1, waits for the key to be released, pressed again and released again, and clears $0DC7. Called by the main loop at $0A38 every pass."
  },
  {
   "address": 9119,
   "type": "line",
   "text": "Called by the raster interrupt at $0DC9 (at $0DFD). Returns when $1BF6 is 0. In state 2 it writes the sprite pointer $1BFF[$1BFE] to $CFFB-$CFFF and calls $1D2C. In states 1 and 2 it then sets the colour of sprites 3 to 7 ($D02A-$D02E) to 2."
  },
  {
   "address": 9174,
   "type": "line",
   "text": "Called by the raster interrupt at $0D3A (at $0D5B). Sets sprite 4 colour $D02B to 1, its position $D008/$D009 to $1E/$3C with bit 4 of $D010 set, and its pointer $CFFC to $FE. Unless paused ($0DC7): when $3140-$3142 are all zero it sets the end flag $0A83; otherwise every 7th call (counter $3182) it takes 1 off the three-digit decimal count $3140 (ones), $3141 (tens), $3142 (hundreds), borrowing 9 into the next digit."
  },
  {
   "address": 9295,
   "type": "line",
   "text": "Player energy: $0A84 sets $21; $1DA1 takes 4 off per hit and sets the end flag $0A83 when it is 4 or less."
  },
  {
   "address": 9296,
   "type": "line",
   "text": "Four AND masks $FC, $F0, $C0 and $00, taken in turn by $2495 to clear pixel pairs of the energy bar."
  },
  {
   "address": 9300,
   "type": "line",
   "text": "64-byte buffer built by $2495 (patterns $FF,$FF,$AA,$AA,$55,$55 in each group of 8) and copied to $FAC8-$FB07. The first byte, $2454, is not written."
  },
  {
   "address": 9364,
   "type": "line",
   "text": "Step counter of $2495: starts as the energy $244F and counts up to $21."
  },
  {
   "address": 9365,
   "type": "line",
   "text": "Draws the energy bar. Writes character $1D into the eight cells $CF59-$CF60 with colour 5 in $DB59-$DB60, fills the 64-byte buffer $2454-$2493 with the byte pairs $FF,$FF,$AA,$AA,$55,$55 at the start of each group of 8, then clears pixel pairs from the last group backwards with the masks at $2450-$2453, once for each point the energy $244F is below $21 (the step counter is $2494). It finally copies the buffer to $FAC8-$FB07. Called by the main loop at $0A2F and by $4428 and $5114."
  },
  {
   "address": 9501,
   "type": "line",
   "text": "Adds the value in A to the decimal digit at $0A00 plus X, then carries leftwards: a digit of 10 or more has 10 taken off and 1 is added to the digit before it (carry kept in $2548), until the digit at $0A00 has been done. Y is kept (saved on the stack); X ends at 0. The digits at $0A00-$0A06 are the seven digits drawn by $2549; their storage is in the resident code, not in this file. Called once, by $4FEA with A=3 and X=2."
  },
  {
   "address": 9544,
   "type": "line",
   "text": "Scratch byte of $251D: the value to add, then the carry (0 or 1) to the next digit."
  },
  {
   "address": 9545,
   "type": "line",
   "text": "Draws the seven digits at $0A00-$0A06: sets the pointer $DB/$DC to $FA58 and calls $255C for X=0 to 6, so that the seven glyphs fill $FA58-$FA8F in character memory. Called by the main loop at $0A2C and by $4FED."
  },
  {
   "address": 9564,
   "type": "line",
   "text": "Copies the 8-byte glyph of the digit at $0A00 plus X (glyph table $0F09, digit times 8) to the address in $DB/$DC, then adds 8 to $DB/$DC. X is kept. Called seven times by $2549."
  },
  {
   "address": 9602,
   "type": "line",
   "text": "Key code from $2583, stored here by the raster interrupt at $0D3A (at $0DAE); $FF means no key. The main loop compares it with $20 at $0A45 and $2378 with $50."
  },
  {
   "address": 9603,
   "type": "line",
   "text": "Reads the keyboard through CIA 1 ($DC00/$DC01) and returns a key code in A, or $FF for no key. It returns $FF at once when ($DC00 AND $DC01 AND $1F) is not $1F, i.e. a joystick line is pulled low. Otherwise it selects each of the 8 columns in turn with the mask $25FA, counts them in $25FB, and for the first low row bit takes the code from the table $25FD at (row x 8 + column); a negative table value ($FF) goes on scanning. The code is returned only if the joystick check still passes; the index is also stored in $02A7. Called by the raster interrupt at $0D3A (at $0DAB), which stores the result in $2582."
  },
  {
   "address": 9722,
   "type": "line",
   "text": "Column select mask written to $DC00 by $2583; starts at $FE and is rotated left."
  },
  {
   "address": 9723,
   "type": "line",
   "text": "Column number 0 to 7 counted by $2583; the low three bits of the index into $25FD."
  },
  {
   "address": 9724,
   "type": "line",
   "text": "Value read from $DC01 by $2583 when a key was found."
  },
  {
   "address": 9725,
   "type": "line",
   "text": "64 key codes in the order (row x 8 + column), ASCII for letters and digits; $FF means no code. Read by $2583."
  },
  {
   "address": 9789,
   "type": "line",
   "text": "Shows the end-of-level screen. Sets bit 6 of $D011, disables interrupts, stops the sound with $B828, sets $D018=$30, text mode with multicolour in $D011/$D016, turns the sprites off ($D015=0), clears the key code $2582 and the border and background. It swaps the character data with $4589, fills the screen $CC00 with $97 and colour RAM with 9, then writes the text at $26DB (screen codes 7 1 13 5 ... read as GAME OVER; $20 gives $97, other codes get $75 added) to $CD50 and waits six times $FF with the delay $0E92. It then restores the swap, clears the screen to 0 and redraws the bottom rows with $0EA7. Called by the main loop at $0A51 and $0A5C."
  },
  {
   "address": 9947,
   "type": "line",
   "text": "Screen-code text GAME OVER (letters are codes 1-26) ending in $FF; written to $CD50 by $263D."
  },
  {
   "address": 9957,
   "type": "line",
   "text": "Story text typed by $279D: lines of screen codes (1-26 are letters, $20 a space, $1B a stop-like mark) each ending in $FF, with a last $FF at the end. Not decoded here beyond the letters."
  },
  {
   "address": 10141,
   "type": "line",
   "text": "Types out the story text at $26E5 on the screen from $CCCE (pointer $14/$15), one character every $32 delay units, two screen rows ($50 bytes) for each line ending in $FF; the text ends with a second $FF. A $20 code gives $97 (blank), others get $75 added. After the first 30 characters ($4F10 counts down from $1E) the fire button ($DC00 bit 4) stops it. Otherwise it waits for fire at the end. It sets $4F9B to 1 and waits $FA delay units. $4F0F is the text index. Called by the setup $0A84 at $0B9B."
  },
  {
   "address": 10275,
   "type": "line",
   "text": "Copies 8 pages ($0800 bytes) from $29C0 to $C000 and then 4 pages ($0400 bytes) from $2878 to $C800, using the pointers $14/$15 (source) and $16/$17 (destination). The first source runs on to $31BF, past the variables and code at $3140-$3182, and the two sources overlap from $29C0. Called by the setup $0A84 at $0BA9."
  },
  {
   "address": 10360,
   "type": "line",
   "text": "Read by $2823: the bytes $2878-$29BF are the start of the 1,024-byte copy to $C800, and $29C0 onward is the start of the 2,048-byte copy to $C000. The contents are probably character data; not decoded."
  },
  {
   "address": 11111,
   "type": "line",
   "text": "12 bytes (E2 00 08 08 0A 8E EE BE ...) that the operand of the JSR at $4BCC points at until $4BB9 patches it. They are not code and are never run as written: $4BB9 overwrites the operand with a handler address from the table $4BD5 before every call. They also lie in the source of the $2823 copy."
  },
  {
   "address": 11123,
   "type": "line",
   "text": "Read by $2823 as part of both copies (the 2,048 bytes from $29C0 run to $31BF, and the 1,024 from $2878 to $2C77); contents not decoded."
  },
  {
   "address": 12147,
   "type": "line",
   "text": "The last 461 bytes of copy_source_b ($2B73-$313F), read by $2823 with the rest of it; contents not decoded."
  },
  {
   "address": 12608,
   "type": "line",
   "text": "Ones digit of the countdown that $23D6 decrements; $0A84 sets it to 0."
  },
  {
   "address": 12609,
   "type": "line",
   "text": "Tens digit of the countdown; $0A84 sets it to 0."
  },
  {
   "address": 12610,
   "type": "line",
   "text": "Hundreds digit of the countdown; $0A84 sets it to 9."
  },
  {
   "address": 12611,
   "type": "line",
   "text": "Draws the three countdown digits $3142, $3141 and $3140 as glyphs in sprite data: calls $316B with the destination $FF80 and X=2 (hundreds), $FF81 and X=1, and $FF82 and X=0. The three bytes of each sprite line hold one digit each. Called by the main loop at $0A35."
  },
  {
   "address": 12651,
   "type": "line",
   "text": "Takes the digit at $3140 plus X, multiplies it by 8 and copies the eight glyph bytes from the table $0F09 to every third byte from ($DB), the first eight lines of a sprite. Called three times by $3143."
  },
  {
   "address": 12674,
   "type": "line",
   "text": "Call counter of $23D6: counts down from 6 and the countdown digits change when it is 0."
  },
  {
   "address": 12675,
   "type": "line",
   "text": "Exchanges four blocks of $EC bytes: $35B7 with $C000, $36A3 with $C0EC, $378F with $C1D8 and $387B with $C2C4 (it reads both, writes each to the other). Called by the setup $4F9C at $50AD."
  },
  {
   "address": 12739,
   "type": "line",
   "text": "Screen-code text typed by $4F11: lines ending in $FF and a last $FF; includes the words DARKMAN, WAREHOUSE and LAB. Not decoded further."
  },
  {
   "address": 12851,
   "type": "line",
   "text": "Toggled by $3234 on each pass: one value draws the picture, the other clears it."
  },
  {
   "address": 12852,
   "type": "line",
   "text": "Flashes the picture drawn by $328D. If $0A10 (resident) is 0 it waits three times $FF and returns. Otherwise it repeats $FF times: toggles $3233; one phase draws the picture with $328D, the other clears the five 48-byte rows $F8C0, $FA00, $FB40, $FC80 and $FDC0. It ends by drawing the picture and waiting twice $FF. Called by $4449."
  },
  {
   "address": 12941,
   "type": "line",
   "text": "Draws picture A, 6 characters wide and 5 high. Copies five rows of 48 bytes from $348B, $34BB, $34EB, $351B and $354B to the character data $F8C0, $FA00, $FB40, $FC80 and $FDC0, then for six cells in each of five screen rows copies colours from $357B, $3581, $3587, $358D, $3593 to colour RAM $DB18, $DB40, $DB68, $DB90, $DBB8 and character codes from $3599, $359F, $35A5, $35AB, $35B1 to the screen $CF18, $CF40, $CF68, $CF90, $CFB8. Called by $3234 (twice)."
  },
  {
   "address": 13046,
   "type": "line",
   "text": "Draws picture B in the same layout as $328D: five rows of 48 bytes from $335F, $338F, $33BF, $33EF and $341F to $F8C0, $FA00, $FB40, $FC80 and $FDC0, colours from $344F ... $3467 to $DB18 ... $DBB8 and character codes from $346D ... $3485 to $CF18 ... $CFB8 (six cells per row). Called by $4425 and $5117."
  },
  {
   "address": 13151,
   "type": "line",
   "text": "Picture B pixel data: five rows of 48 bytes at $335F, $338F, $33BF, $33EF and $341F, copied to $F8C0, $FA00, $FB40, $FC80 and $FDC0 by $32F6."
  },
  {
   "address": 13391,
   "type": "line",
   "text": "Picture B colours: five rows of 6 bytes ($344F, $3455, $345B, $3461, $3467), copied to colour RAM $DB18 ... by $32F6."
  },
  {
   "address": 13421,
   "type": "line",
   "text": "Picture B character codes: five rows of 6 bytes ($346D, $3473, $3479, $347F, $3485), copied to the screen $CF18 ... by $32F6."
  },
  {
   "address": 13451,
   "type": "line",
   "text": "Picture A pixel data: five rows of 48 bytes at $348B, $34BB, $34EB, $351B and $354B, copied to $F8C0, $FA00, $FB40, $FC80 and $FDC0 by $328D."
  },
  {
   "address": 13691,
   "type": "line",
   "text": "Picture A colours: five rows of 6 bytes ($357B, $3581, $3587, $358D, $3593), copied to colour RAM $DB18 ... by $328D."
  },
  {
   "address": 13721,
   "type": "line",
   "text": "Picture A character codes: five rows of 6 bytes ($3599, $359F, $35A5, $35AB, $35B1), copied to the screen $CF18 ... by $328D."
  },
  {
   "address": 13751,
   "type": "line",
   "text": "Four blocks of $EC bytes ($35B7, $36A3, $378F, $387B) exchanged with $C000, $C0EC, $C1D8 and $C2C4 by $3183. $4252 and $5099 also clear five blocks of 72 bytes at $35B7, $35FF, $3647, $368F and $36D7. Probably character data; not decoded."
  },
  {
   "address": 15799,
   "type": "line",
   "text": "Screen A: 18 rows of 28 character codes, drawn to $CC2E ... by $4E39. A tile map; not decoded."
  },
  {
   "address": 16303,
   "type": "line",
   "text": "Screen B: 16 rows of 28 character codes, drawn to $CC2E ... by $4EA4. A tile map; not decoded."
  },
  {
   "address": 16384,
   "type": "line",
   "text": "The last 111 bytes of screen_b_map ($3FAF-$416E): its rows from $4000 on, drawn by $4EA4 with the rest of the map."
  },
  {
   "address": 16751,
   "type": "line",
   "text": "56 bytes of $60, the RTS opcode, between the end of screen_b_map ($416E) and subject_screen ($41A7). No traced code reads them, calls them or jumps into them; why they are there is open."
  },
  {
   "address": 16807,
   "type": "line",
   "text": "Shows the SUBJECT screen of the mask game. Turns bit 6 of $D011 on, waits twice $FF, fills the screen with $50 and colour RAM with 9, sets $D022=$0B and $D023=$0C, swaps character data with $45C2 and draws the 8 by 8 block of characters 0-63 with $44D5. It writes the 8 characters at $4267 (+$75) to $CC60 (colour 7) and the 23 characters at $426F to $CF51 (colour 5), turns bit 6 off, waits for fire to be released and pressed again ($DC00 bit 4), then fills $C800 with 0, sets sprite pointer $CFF8=$DA, moves all eight sprites to Y=$FF, waits, swaps back with $45C2 and clears the five 72-byte blocks at $35B7, $35FF, $3647, $368F and $36D7. Called by $50F1."
  },
  {
   "address": 16999,
   "type": "line",
   "text": "Screen-code text SUBJECT: (letters as codes 1-26, then $1C) written to $CC60 by $41A7 with $75 added to each code."
  },
  {
   "address": 17007,
   "type": "line",
   "text": "Screen-code text PRESS FIRE TO CONTINUE: written to $CF51 by $41A7 ($20 gives $50, others get $75 added)."
  },
  {
   "address": 17030,
   "type": "line",
   "text": "Entry of the mask game, jumped to by the main loop at $0A72 when the level-done flag $0FB1 is set (or, with $0A11 non-zero, when the key code is $20). Calls the setup $4F9C once, then repeats: $0E4C, the timer display $5320 and a test of $0F5A. When $0F5A is non-zero it runs the finish $4410, stops the sound with $B828 and jumps to the resident loader at $0407."
  },
  {
   "address": 17056,
   "type": "line",
   "text": "Set to 1 by $437D when a matched slice has type 2 in $48AB; cleared by $4F9C and $437D."
  },
  {
   "address": 17057,
   "type": "line",
   "text": "Set to 1 by $437D when a matched slice has type 1 in $48AB; cleared by $4F9C and $437D."
  },
  {
   "address": 17058,
   "type": "line",
   "text": "Set to 1 by $437D when a matched slice has a type other than 1 and 2; cleared by $4F9C and $437D."
  },
  {
   "address": 17059,
   "type": "line",
   "text": "Index into the word being typed by $42B6, $42F1, $4337 and $4359; cleared by $4F9C and $445F."
  },
  {
   "address": 17060,
   "type": "line",
   "text": "Delay count of $42B6: counts down from $46 between letters."
  },
  {
   "address": 17061,
   "type": "line",
   "text": "Text SCANNING followed by eight dots (code $7B) and $FF, in ASCII-like codes (a is $61, $7B draws a dot, $82 a space; $15 is added to get the screen code). Typed by $42B6."
  },
  {
   "address": 17078,
   "type": "line",
   "text": "Types the word at $42A5 on the screen. While $42A4 is not zero it only counts it down. Otherwise it reloads it with $46 and, unless the next character at $42A5 plus the index $42A3 is $FF, writes it plus $15 to $CE3C plus the index with colour 9 at $DA3C plus the index, and increments the index. Called by $437D at $43A6."
  },
  {
   "address": 17121,
   "type": "line",
   "text": "Text MASK, two spaces, COMPLETE and a stop in ASCII-like codes ending in $FF; typed by $42F1."
  },
  {
   "address": 17137,
   "type": "line",
   "text": "Prints the text at $42E1 (mask, two spaces, complete and a stop) at $CE3D with colour $0F at $DA3D, one character at a time with a delay of $32 each, using the index $42A3 and adding $15 to each code; ends at $FF. It calls itself by a jump to repeat. Called by $445F at $447A."
  },
  {
   "address": 17171,
   "type": "line",
   "text": "Text INSUFFICIENT DATA ending in $FF (ASCII-like codes, $82 a space); typed by $4337."
  },
  {
   "address": 17189,
   "type": "line",
   "text": "Text TO GENERATE MASK and a stop ending in $FF (ASCII-like codes); typed by $4359."
  },
  {
   "address": 17207,
   "type": "line",
   "text": "Prints the text at $4313 (insufficient data) at $CD24 with colour $0F at $D924, one character at a time with a delay of $32, using the index $42A3 and adding $15; ends at $FF. Called by $445F at $4480."
  },
  {
   "address": 17241,
   "type": "line",
   "text": "Prints the text at $4325 (to generate mask) at $CD74 with colour $0F at $D974, one character at a time with a delay of $32, using the index $42A3 and adding $15; ends at $FF. Called by $445F at $4488."
  },
  {
   "address": 17275,
   "type": "line",
   "text": "Toggled by $437D each time its countdown ends; selects which way round the two colours at $DA9E/$DA9F go."
  },
  {
   "address": 17276,
   "type": "line",
   "text": "Countdown of $437D: reloaded with $D2 each time it reaches 0."
  },
  {
   "address": 17277,
   "type": "line",
   "text": "Waits for the scan to finish and rates it. Every $D3 calls it toggles $437B and swaps the colours $0D and $0A in colour RAM bytes $DA9E and $DA9F; each call runs $42B6 and waits $0A, and repeats until $489D is non-zero. It then checks the twelve match flags $489E-$48A9: for each set one the type in $48AB is tested and $42A0 (type 2), $42A1 (type 1) or $42A2 (other) is set to 1. It stores in $0A10: 0 if $42A0 is clear; otherwise 0, 1 or 2 depending on whether $42A1 and $42A2 are clear, set or both set (0 when both clear, 1 when one is set, 2 when both are). Called by $4410."
  },
  {
   "address": 17424,
   "type": "line",
   "text": "Closes the mask game. Fills $CEA8-$CEF7 with $50, stops the sound ($B828), then runs $4EA4, $0EA7, $32F6, the energy bar $2495, the swaps $4589 and $45E4, the 12 blocks $4652 and $437D, waits three times $FF, runs $445F, $3234 and $0E4C and waits three more times $FF. Called by $4294."
  },
  {
   "address": 17503,
   "type": "line",
   "text": "Reports the result. Clears $42A3, runs $4538 and $45C2. If $0A10 (resident) is 0 it prints the two texts $4337 and $4359 (the index $42A3 is cleared between them). Otherwise it sets $52BA to 1, draws the block $44D5, runs the dissolve $448C and prints $42F1. Called by $4446."
  },
  {
   "address": 17548,
   "type": "line",
   "text": "Erodes the buffer $FE00-$FEFF in 30 rounds. In each round, for each of the 256 bytes, it takes a random byte from $0E2C and picks the mask $FC (below $40), $F3 (below $80), $CF (below $C4) or $3F, stores it in the operand of the AND at $44B6 (the byte $44B7) and ANDs that one byte with it; after each round it waits $32. At the end it clears the 256 bytes to 0. Called by $445F at $4477."
  },
  {
   "address": 17621,
   "type": "line",
   "text": "Writes the character codes 0 to 63 in order into an 8 by 8 block on the screen, eight per row, with the rows at $CCD8, $CD00, $CD28, $CD50, $CD78, $CDA0, $CDC8 and $CDF0. Called by $41A7 and by $445F at $4474."
  },
  {
   "address": 17720,
   "type": "line",
   "text": "Fills an 18-wide area of 12 screen rows from $CC83 (step $28) with $50, and the first 11 rows of it in colour RAM from $D883 with 9. Called by $445F."
  },
  {
   "address": 17801,
   "type": "line",
   "text": "Exchanges two blocks of $88 bytes, $54B8 with $C3B0 and $5540 with $C438, and then $50 bytes of the digit glyph table $0F09 with $C4C0. Swapping twice puts everything back. Called by the level code ($0B90, $0BA6, $2678, $26CF), by $442B, $50E3, $50FC, $59A8, $59B6, $5A6B and $5AB8."
  },
  {
   "address": 17858,
   "type": "line",
   "text": "Exchanges 256 bytes of $55C8 with $C000 and 256 bytes of $56C8 with $C100. Called by $41CD, $424B and $4467."
  },
  {
   "address": 17892,
   "type": "line",
   "text": "Exchanges 256 bytes of $C800 with $C000, $68 bytes of $C900 with $C100, 256 bytes of $C968 with $C600 and 256 bytes of $CA68 with $C700. Called by $442E."
  },
  {
   "address": 17964,
   "type": "line",
   "text": "Draws a block of 3 by 3 consecutive character codes starting with A at the screen address X (low) and Y (high), three rows $28 apart, by calling $4640 for the offsets 0, $28 and $50. Called twelve times by $4652."
  },
  {
   "address": 17984,
   "type": "line",
   "text": "Writes A, A+1 and A+2 to ($DB),Y and the next two bytes and returns with A+3 in A. Called three times by $462C."
  },
  {
   "address": 18002,
   "type": "line",
   "text": "Draws twelve 3 by 3 character blocks with $462C: four in each of three rows, at $CC83, $CC88, $CC8D and $CC92 (first codes $00, $09, $12, $1B), at $CD23, $CD28, $CD2D and $CD32 (first codes $24, $C0, $C9, $D2) and at $CDC3, $CDC8, $CDCD and $CDD2 (first codes $DB, $E4, $ED, $F6). Called by $4431."
  },
  {
   "address": 18111,
   "type": "line",
   "text": "1 while fire is held after a capture; $46C5 clears it when fire is released."
  },
  {
   "address": 18112,
   "type": "line",
   "text": "Frames left of the capture flash: set to 4 by $46C5, counted down by the raster interrupt $5242 which uses colours 1/1 for $D022/$D023 while it is non-zero; cleared by $46C5 at the end."
  },
  {
   "address": 18113,
   "type": "line",
   "text": "Number of captures made so far, 0 to 12: index into the tables $4865, $489E and $48AB. Cleared by $4F9C and incremented by $46C5."
  },
  {
   "address": 18114,
   "type": "line",
   "text": "Set to $11 by $46C5 on a capture and to 0 by $4F9C. No reader in the dumped code."
  },
  {
   "address": 18115,
   "type": "line",
   "text": "1 zero byte after capture_mark: padding. No traced code reads them."
  },
  {
   "address": 18116,
   "type": "line",
   "text": "Countdown set to $0D by $46C5 after a capture; at 1 it triggers $B828 and $B0C8."
  },
  {
   "address": 18117,
   "type": "line",
   "text": "Handles the fire button for the mask game, called by the raster interrupt $5242 while $0F5A is zero. It counts $46C4 down (at 1 it calls $B828 and $B0C8) and holds $46BF until fire ($0EA6 bit 4) is released. On a new press it plays sound $18 with $B0EE, sets $46C4=$0D, $46BF=1, $46C0=4 and $46C2=$11, picks the destination from the table $4865 by 2 times the slice number $46C1 and copies the glyphs of the 3 by 3 characters at ($0E) with $4817 into it. It then runs $475F and adds 1 to $46C1; at 12 it sets $0F5A to 1, clears $46C0 and runs $4880."
  },
  {
   "address": 18270,
   "type": "line",
   "text": "Type stored by $475F into $48AB for the slice: set to 2 by $4B47; the object code at $4BE2 toggles it between 0 and 1 and sets it to 2."
  },
  {
   "address": 18271,
   "type": "line",
   "text": "Judges the capture. For the slice number $46C1 it clears the match flag at $489E, stores $475E in $48AB and loads $4BB8. Then, by the cursor Y $487D, it calls $478B for $61, $47DC for $B1 and $47F9 for $A1 (any other Y gives no match)."
  },
  {
   "address": 18315,
   "type": "line",
   "text": "Match test for cursor Y $61, called by $475F. By the cursor X $487E it sets $4816 and tests: $61 gives 0 and needs $4BB8=0 and $4ABA below 5; $A1 gives 1 with $4BB8=1 and $4ABB below 5; $E1 gives 2 with $4BB8=2 and $4ABC below 5. When all hold it sets the match flag $489E plus X to 1."
  },
  {
   "address": 18396,
   "type": "line",
   "text": "Match test for cursor Y $B1, called by $475F: when the cursor X $487E is $79 it sets $4816 to 3 and, if $4BB8 is 3 and $4ABD is below 5, sets the match flag $489E plus X to 1."
  },
  {
   "address": 18425,
   "type": "line",
   "text": "Match test for cursor Y $A1, called by $475F: when the cursor X $487E is $C1 it sets $4816 to 4 and, if $4BB8 is 4 and $4ABE is below 5, sets the match flag $489E plus X to 1."
  },
  {
   "address": 18454,
   "type": "line",
   "text": "Position code 0 to 4 set by the match tests $478B, $47DC and $47F9 and compared in $4B47."
  },
  {
   "address": 18455,
   "type": "line",
   "text": "Copies the 8 bytes of character A (from $C000 plus 8 times A, built in $4863/$4864 and $12/$13) to ($10) and adds 8 to $10/$11. Y is kept. Called by $46C5, three times in each of three rows."
  },
  {
   "address": 18531,
   "type": "line",
   "text": "Scratch of $4817: the character code times 8, low byte then high byte."
  },
  {
   "address": 18533,
   "type": "line",
   "text": "Twelve addresses, low byte first: $C800 plus 72 for each slice ($C800, $C848, $C890 ... $CB18). $46C5 uses the entry for the slice number as the destination of the captured glyphs."
  },
  {
   "address": 18557,
   "type": "line",
   "text": "Cursor sprite Y. Set by $4F9C ($71), moved by $49E9 (joystick), $48BA (scan) and $4880 ($49); written to $D001; $475F tests it for $61, $B1 and $A1."
  },
  {
   "address": 18558,
   "type": "line",
   "text": "Cursor sprite X. Set by $4F9C ($B1), moved by $49E9, $48BA and $4880 ($70); written to $D000; tested by the match routines."
  },
  {
   "address": 18560,
   "type": "line",
   "text": "Places the cursor: sets X $487E to $70 and Y $487D to $49. Called by $46C5 and $535D."
  },
  {
   "address": 18571,
   "type": "line",
   "text": "Path of the scan cursor, read by $48BA: 0 moves X by +2, 1 moves Y by +2, 2 moves X by -2, bit 7 set ($FF) ends it. The bytes are 0,0,0,1,2,2,2,1,0,0,0,3,$FF."
  },
  {
   "address": 18584,
   "type": "line",
   "text": "Frames for each path value 0, 1, 2: $14, $10 and $14. The value 3 in the path reads $489B instead."
  },
  {
   "address": 18587,
   "type": "line",
   "text": "Index into the path $488B; cleared by $4F9C."
  },
  {
   "address": 18588,
   "type": "line",
   "text": "Frames left in the current scan step."
  },
  {
   "address": 18589,
   "type": "line",
   "text": "Set to 1 by $48BA when the path ends; $437D waits for it. Cleared by $4F9C."
  },
  {
   "address": 18590,
   "type": "line",
   "text": "One flag for each slice (13 cleared by $4F9C): 1 when $475F judged the capture a match. $48BA reverses the entries 4 to 7; $437D reads entries 0 to 11."
  },
  {
   "address": 18603,
   "type": "line",
   "text": "One byte for each slice (13 cleared by $4F9C): the value of $475E when it was captured. $437D tests 2 and 1; $48BA reverses the entries 4 to 7."
  },
  {
   "address": 18616,
   "type": "line",
   "text": "Set to 1 by $48BA at its first step; cleared by $4F9C."
  },
  {
   "address": 18617,
   "type": "line",
   "text": "Set to 1 by $48BA once it has reversed the entries 4 to 7; cleared by $4F9C."
  },
  {
   "address": 18618,
   "type": "line",
   "text": "Moves the cursor along the scan path once the game is over, called by the raster interrupt $51DB while $0F5A is set. The first time it reverses the entries $48A2-$48A5 and $48AF-$48B2. Once $489D is set it moves the cursor Y to 0. While the blink count $49D7 runs it only updates the sprite. Otherwise it steps through the path $488B (0 moves X by +2, 1 moves Y by +2, 2 moves X by -2; a value with bit 7 set ends it and sets $489D), using the durations $4898 in $489C and the index $489B. When it reaches a step whose match flag in $489E is set it plays $49D9 and sets $49D7 to $0A. It writes the sprite 0 position ($D000, $D001, pointer $CFF8=$DA, colour $D027), and while $49D7 runs it counts it down and toggles $49D6 as the colour."
  },
  {
   "address": 18902,
   "type": "line",
   "text": "Colour 0 or 1 of the cursor sprite while it blinks, toggled by $48BA and written to $D027."
  },
  {
   "address": 18903,
   "type": "line",
   "text": "Frames left of the cursor blink; set to $0A by $48BA after the sound $49D9; cleared by $4F9C."
  },
  {
   "address": 18904,
   "type": "line",
   "text": "Toggled on each call of $49E9, which only moves the cursor when it becomes 0."
  },
  {
   "address": 18905,
   "type": "line",
   "text": "Plays sound effect $1C with $B0EE and keeps X and Y: it stores them in the operands of the LDY #$00 and LDX #$00 at $49E4 and $49E6, which it then runs. Called by $48BA twice."
  },
  {
   "address": 18921,
   "type": "line",
   "text": "Moves the cursor with the joystick copy $0EA6, called by the raster interrupt $51DB while $0F5A is zero. It toggles $49D8 and acts only when that gives 0. Up (bit 0) takes 8 off the Y $487D down to $3C and $28 off the pointer $0E/$0F; down (bit 1) adds 8 up to $B4 and $28; left (bit 2) takes 8 off the X $487E down to $46 and 1 off the pointer; right (bit 3) adds 8 up to $F6 and 1. It then writes X and Y to $D000/$D001 (with $D010=0), sets the pointer $CFF8=$DA and the colour $D027=1."
  },
  {
   "address": 19100,
   "type": "line",
   "text": "State of each of the five objects: set to 1 by $4B47, 3 by the handler at $4CAB. $4BB9 uses it to pick the handler from the table $4BD5."
  },
  {
   "address": 19105,
   "type": "line",
   "text": "Delay of each object: a random value 0 to 31 set by $4B47; the handlers at $4BE2 and $4CB4 count it down."
  },
  {
   "address": 19110,
   "type": "line",
   "text": "Per-object byte set by $4B47 from the table $4B11 ($40, $58 or $70 by $4B17), and $10 for the chosen object. No reader in the dumped routines."
  },
  {
   "address": 19115,
   "type": "line",
   "text": "Per-object byte set by $4B47 from the table $4B14 ($58), and $58 for the chosen object. No reader in the dumped routines."
  },
  {
   "address": 19120,
   "type": "line",
   "text": "Low bytes of the per-object character-data pointer, copied from $4ABF by $4B47."
  },
  {
   "address": 19125,
   "type": "line",
   "text": "High bytes of the per-object character-data pointer, copied from $4AC4 by $4B47."
  },
  {
   "address": 19130,
   "type": "line",
   "text": "Per-object counter cleared by $4B47; the match tests $478B ... require it below 5."
  },
  {
   "address": 19135,
   "type": "line",
   "text": "Initial pointer low bytes $00, $48, $90, $D8, $20 (steps of 72), read by $4B47."
  },
  {
   "address": 19140,
   "type": "line",
   "text": "Initial pointer high bytes $C0, $C0, $C0, $C0, $C1: with $4ABF the addresses $C000, $C048, $C090, $C0D8, $C120, read by $4B47."
  },
  {
   "address": 19145,
   "type": "line",
   "text": "24 bytes in three descending runs: $37 down to $30, $1F down to $18 and $07 down to $00. No traced code reads them. The first value equals the constant $37 added at $4CE6, which is the only link seen; what the table is for is open."
  },
  {
   "address": 19169,
   "type": "line",
   "text": "24 offsets of two bytes (low, high), one for each step of an object's slide-in: 0 to 7, then $90 to $97, then $120 to $127. object_slide_in ($4CB4) reads the pair for the step in $4ABA,x (at $4CC5 and $4CCB) and adds it to the object's base address $4AA6/$4AAB, which is $5840, $5858 or $5870 (or $5810 for the chosen object), so the three groups of eight steps read the picture bytes at $5810 to $5887, $58A0 to $5917 and $5930 to $59A7."
  },
  {
   "address": 19217,
   "type": "line",
   "text": "Values $40, $58, $70, one chosen by $4B17 for $4AA6."
  },
  {
   "address": 19220,
   "type": "line",
   "text": "Values $58, $58, $58, one chosen by $4B17 for $4AAB."
  },
  {
   "address": 19223,
   "type": "line",
   "text": "Returns X=0, 1 or 2 from a random byte ($0E2C): 0 below $55, 1 below $AA, else 2. Called by $4B47."
  },
  {
   "address": 19241,
   "type": "line",
   "text": "Returns X=0 to 4 from a random byte ($0E2C): 0 below $32, 1 below $64, 2 below $96, 3 below $C8, else 4. Called by $4B47."
  },
  {
   "address": 19271,
   "type": "line",
   "text": "Starts five objects when all five states $4A9C-$4AA0 are 0. Sets $475E to 2 and, for each: delay $4AA1 = random and $1F, state $4A9C = 1, $4ABA = 0, the values $4AAB and $4AA6 from the tables $4B14 and $4B11 chosen with $4B17, and the pointer $4AB0/$4AB5 copied from $4ABF/$4AC4. It then picks X with $4B29 (changed to 1, then 2, while equal to $4816), stores it in $4BB8 and sets $4AAB plus X to $58 and $4AA6 plus X to $10. Called by the raster interrupt $5242 while $0F5A is zero."
  },
  {
   "address": 19384,
   "type": "line",
   "text": "Index 0 to 4 of the chosen object, set by $4B47 and used by $475F and the match tests."
  },
  {
   "address": 19385,
   "type": "line",
   "text": "Runs the five objects. For X=0 to 4 it takes the state $4A9C plus X, multiplies it by 2, reads the address from the table $4BD5 and stores it in the operand of the JSR at $4BCC (which points at $2B67 until patched), then calls it. Called by the raster interrupt $5242 while $0F5A is zero."
  },
  {
   "address": 19413,
   "type": "line",
   "text": "Handler addresses by object state 0 to 3: $4BDD, $4CB4, $4BE2, $4DD8. $4BB9 patches the chosen one into a JSR. State 4 would read the bytes after the table."
  },
  {
   "address": 19421,
   "type": "line",
   "text": "Handler for object state 0 ($4A9C,x = 0): a bare RTS. $4BB9 picks the handler from the table $4BD5."
  },
  {
   "address": 19422,
   "type": "line",
   "text": "Toggles between 0 and 1 each time $4BE2 flips the picture; the value is copied to $475E."
  },
  {
   "address": 19423,
   "type": "line",
   "text": "Low byte of the source address that $4BE2 reads the picture from ($F8 or $28 after the toggle, or $10)."
  },
  {
   "address": 19424,
   "type": "line",
   "text": "High byte of the same source address ($57 or $58)."
  },
  {
   "address": 19425,
   "type": "line",
   "text": "A bare RTS that object_flip ($4BE2) branches to when the object is not the one the cursor $4BB8 points at."
  },
  {
   "address": 19426,
   "type": "line",
   "text": "Handler for object state 2. Counts the delay $4AA1,x down; at 0 it sets state 3 ($4CAB). While counting, only the object that the cursor $4BB8 points at acts: at count $32 it toggles $4BDE (copied to $475E), takes the source $57F8 or $5828 and, at count $14, the source $5810 with $475E=2. It then copies 24 rows of three bytes (rows $90 apart in the source, $18 apart at the object's screen position $4AB0/$4AB5,x) to the screen."
  },
  {
   "address": 19634,
   "type": "line",
   "text": "Two bytes written by $4CB4 from the table at $4AE1: the offset of the picture strip for this step. Read back at $4CD5 and $4CDA and added to the object's base address $4AA6/$4AAB,x."
  },
  {
   "address": 19636,
   "type": "line",
   "text": "Handler for object state 1. Counts the delay $4AA1,x down; at 0 it copies one byte of the picture strip chosen by the step $4ABA,x (offset from the table $4AE1, two bytes per step) into three rows of the object's screen position, then calls $4D9E for nine cells to shift them left by a byte. It adds 1 to the step; at $18 it sets state 2, the delay $3C and the step 0."
  },
  {
   "address": 19784,
   "type": "line",
   "text": "Shifts the eight bytes at ($0C) one place right (byte n to n+1, from the last to the first), then puts the byte at ($0C)-$18+7 into the first. Called nine times by $4DD8 with X counting the cells."
  },
  {
   "address": 19869,
   "type": "line",
   "text": "Holds the byte that $4D48 carries from the cell above into the first byte of the cell."
  },
  {
   "address": 19870,
   "type": "line",
   "text": "Shifts the eight bytes at ($0C) one place left (byte n+1 to n), then puts the byte at ($0C)+$18 into the last one (at +7). Called nine times by $4CB4 with X counting the cells."
  },
  {
   "address": 19928,
   "type": "line",
   "text": "Handler for object state 3. Calls $4D48 for nine cells starting at the object's screen position plus $40 and going down by 8, then clears three bytes at the position. For the object that the cursor $4BB8 points at it sets $475E to 2. It adds 1 to the step $4ABA,x; at $15 it sets the state back to 0."
  },
  {
   "address": 20025,
   "type": "line",
   "text": "Draws screen A. Copies 18 rows of 28 bytes from $3DB7 to the screen from $CC2E (rows $28 apart, the pointers are in the operands at $4E52 and $4E55), then colours the three screen pages: each byte of $CC00-$CEFF is looked up in the table $53B8 and the result stored in colour RAM $D800-$DAFF. Called by $4F9C at $5109."
  },
  {
   "address": 20132,
   "type": "line",
   "text": "Draws screen B. Copies 16 rows of 28 bytes from $3FAF to the screen from $CC2E (rows $28 apart), then colours the three pages through the table $53B8 into $D800-$DAFF as $4E39 does. Called by $4410 at $441F."
  },
  {
   "address": 20239,
   "type": "line",
   "text": "Text index of the typing routines $279D and $4F11; cleared at their start."
  },
  {
   "address": 20240,
   "type": "line",
   "text": "Counts down from $1E in $279D and $4F11; at 0 the fire button can stop the typing."
  },
  {
   "address": 20241,
   "type": "line",
   "text": "Types the text at $31C3 (a space code gives 0 here) on the screen from $CCCE, with the same method as $279D: delays of $3C and $14 first, then one character every $32 delay units and 2 rows per line, fire stops it after 30 characters, and at the end it waits for fire. It sets $4F9B to 1 and waits $FA. It uses the index $4F0F and the count $4F10. Called by $4F9C at $50EE."
  },
  {
   "address": 20379,
   "type": "line",
   "text": "Set to 1 by $279D, $4F11 and $4F9C, cleared by $4F9C near its end. No reader in the dumped code."
  },
  {
   "address": 20380,
   "type": "line",
   "text": "Setup of the mask game, called by $4286. Sets $4F9B=1, interrupts off, $01=$35, VIC bank 3, $D018=$30, the cursor X $487E=$B1 and Y $487D=$71, the pointer $0E/$0F=$CD53, adds 3 to score digit 2 with $251D and draws the score, sets the timer digits $0EC9=9, $0ECA=9, $0ECB=3, fills $FE00-$FEFF with $AA, clears the state tables $489E and $48AB (13 bytes each) and many flags, stops the sound, sets bit 3 of every byte of the colour table $53B8 and 9 in its first $2D bytes, clears $35B7-$36FE, swaps with $3183, clears $002A-$0100 and the SID registers, then shows the texts $4F11 and $41A7, draws screen A ($4E39), the picture $32F6 and the energy bar, sets sprites 0 and 1, the NMI vector to $0E9B and the IRQ vector to $5177 on line $CD, and enables the raster interrupt."
  },
  {
   "address": 20854,
   "type": "line",
   "text": "Cleared by $4F9C; no reader in the dumped code."
  },
  {
   "address": 20855,
   "type": "line",
   "text": "Raster interrupt 1 of 3 of the mask game chain (first run on line $CD from the setup $4F9C, afterwards on line $C7 set by $5242). Keeps A, X and Y in the operands at $51D5, $51D7 and $51D9, sets $D018 and $D011 as $0C44 does, clears the border and sprite multicolours, acknowledges $D019, copies the joystick port $DC00 to $0EA6, sets line $CD and the low nibble of $D018 to 8, toggles $0CC8 and counts $0CC7 down on every second frame, and sets the vector $51DB."
  },
  {
   "address": 20955,
   "type": "line",
   "text": "Raster interrupt 2 of 3 of the mask game chain, on line $CD (set by $5177). Keeps A, X and Y in the operands at $523C, $523E and $5240, writes $D011 ORed with $2F and $D016 ORed with $17 after a run of NOPs, acknowledges $D019, sets line $FD and the vector $5242, clears bit 6 of $D011 and runs the sound driver $B176. While $0F5A is zero it runs $49E9 (cursor) and $535D (timer); otherwise $48BA (scan)."
  },
  {
   "address": 21058,
   "type": "line",
   "text": "Raster interrupt 3 of 3 of the mask game chain, on line $FD (set by $51DB). Keeps A, X and Y in the operands at $52B4, $52B6 and $52B8, acknowledges $D019, masks $D016 with $F0, $D011 with $90 and sets $D018=$30. It sets $D022/$D023 to $0B/$0C, or 1/1 while the flash count $46C0 is non-zero (and counts it down), sets $D025=$0B and $D026=8, turns all sprites on, clears bit 6 of $D011 and runs $52BB. While $0F5A is zero it runs $4B47, $4BB9 and $46C5. It ends (the tail from $52A4, whose STA $FFFE is at $52AB) by setting line $C7 and the vector $5177."
  },
  {
   "address": 21178,
   "type": "line",
   "text": "Set to 1 by $445F when the mask was made, cleared by $4F9C. $52BB places sprites 1 to 4 when it is non-zero."
  },
  {
   "address": 21179,
   "type": "line",
   "text": "Sets up sprites 1 to 7 for the result. Clears the sprite colours $D028-$D02B. If $52BA is 0 it sets the Y of sprites 1 to 7 ($D003 ... $D00F) to 0 and returns. Otherwise it places sprites 1 and 2 at Y $50 and sprites 3 and 4 at Y $7A, sprites 1 and 3 at X $8C and sprites 2 and 4 at X $BC, makes sprites 1 to 4 double width and height ($D017, $D01D = $1E) and sets their pointers $CFF9-$CFFC to $F8-$FB. Called by the raster interrupt $5242."
  },
  {
   "address": 21280,
   "type": "line",
   "text": "Draws the three timer digits $0ECB, $0ECA and $0EC9 at $F9D8, $F9E8 and $F9F0 with $5348 (X=2, 1, 0). Called by $4286 on every pass."
  },
  {
   "address": 21320,
   "type": "line",
   "text": "Takes the digit at $0EC9 plus X, multiplies by 8 and copies the 8 glyph bytes from the table $0F09 to ($DB). Called three times by $5320."
  },
  {
   "address": 21341,
   "type": "line",
   "text": "Counts the three-digit timer $0ECB/$0ECA/$0EC9 down, called by the raster interrupt $51DB while $0F5A is zero. When all three digits are 0 it sets $0F5A to 1 and runs $4880. Otherwise it acts on every second call, using $0F59 (0 gives 1 and a decrement, 1 gives 0): $0EC9 goes down by 1 and when it was 0 becomes 9 and takes 1 off $0ECA, which borrows from $0ECB in the same way. So $0EC9 is the least significant digit."
  },
  {
   "address": 21432,
   "type": "line",
   "text": "Colour of each screen code, used by $4E39 and $4EA4 to colour the screen. $4F9C sets bit 3 in every byte and 9 in the first $2D entries."
  },
  {
   "address": 21688,
   "type": "line",
   "text": "Two blocks of $88 bytes ($54B8, $5540) exchanged with $C3B0 and $C438 by $4589. Character data; not decoded."
  },
  {
   "address": 21960,
   "type": "line",
   "text": "Two blocks of 256 bytes ($55C8, $56C8) exchanged with $C000 and $C100 by $45C2. Character data; not decoded."
  },
  {
   "address": 22472,
   "type": "line",
   "text": "Picture bytes of the mask game's objects. object_slide_in ($4CB4) reads three bytes from here at each step: the address is the object's base ($5810, $5840, $5858 or $5870, set by $4B47 from the tables $4B11 and $4B14) plus the offset from mask_strip_offsets, and the bytes at +0, +8 and +$10 go to three rows of the object's character data. In use are $5810 to $5887, $58A0 to $5917 and $5930 to $59A7 (eight steps of 24 bytes each, in each of the three groups). No traced code reads $57C8 to $580F, $5888 to $589F or $5918 to $592F."
  },
  {
   "address": 22952,
   "type": "line",
   "text": "Swaps the character data with swap_font_a ($4589), runs the story-text routine $5AC4, ORs $40 into $D011 and swaps the characters back with $4589; continue_text ($59B9) follows. No traced code calls it."
  },
  {
   "address": 22969,
   "type": "line",
   "text": "Draws the continue screen: the text at $5A05 at $CD49 and the text at $5A1C at $CF8C (a $20 code gives $97, others get $75 added; both end at $FF), then the digit $0A12 plus $98 at $CF94 and the countdown digit $5A04 plus $98 at $CE1C. Called by $5A34."
  },
  {
   "address": 23044,
   "type": "line",
   "text": "Countdown digit 9 to 0 of the continue screen, shown by $59B9 and counted down by $5A34."
  },
  {
   "address": 23045,
   "type": "line",
   "text": "Screen-code text PRESS FIRE TO CONTINUE ending in $FF, drawn by $59B9 at $CD49."
  },
  {
   "address": 23068,
   "type": "line",
   "text": "Screen-code text CREDITS followed by spaces and $FF, drawn by $59B9 at $CF8C."
  },
  {
   "address": 23091,
   "type": "line",
   "text": "Read by the main loop at $0A67 after the call of $5A34; when non-zero the main loop restarts at $0A23. $5A34 itself is not annotated here."
  },
  {
   "address": 23092,
   "type": "line",
   "text": "Continue screen, called by the main loop at $0A64 when $0A12 is non-zero. Disables interrupts, sets $01=$35, the video registers as in $263D, clears $5A33 and the key code $2582, the border and background and the seven digits $0A00-$0A06, swaps with $4589, fills the screen with $97 and colour RAM with $0F. It counts $5A04 down from 9 (with $59B9 and two $FF waits for each step); if fire is pressed it takes 1 off $0A12, sets $5A33 to 1 and stops. When the count reaches 0 it stops with $5A33 still 0. It swaps back, clears the screen and runs $0EA7."
  },
  {
   "address": 23236,
   "type": "line",
   "text": "Types the story text at $5B58 on the screen, one character at a time. Sets the screen pointer $14/$15 to $CC56 and the index $4F0F to 0, waits, fills the screen $CC00 with 0 and colour RAM with 7, and sets the counter $4F10 to $1E. Each character takes a delay of $32 ($0E92): a $20 code gives 0 and any other code gets $66 added. While $4F10 is above 0 the fire button ($DC00 bit 4) is ignored; after $1E characters a press of fire jumps to the end. A $FF ends a line (the pointer moves down $50 bytes, two screen rows) and a second $FF ends the text; the routine then waits for a fire press, sets $4F9B to 1 and waits twice $FF. Called only by $59A8, which nothing calls."
  },
  {
   "address": 23384,
   "type": "line",
   "text": "Screen-code text typed by $5AC4: letters are the codes 1 to 26, $20 is a space, $1B is a stop (shown here as a full stop) and $FF ends a line; the last line is followed by a second $FF. The nine lines are \" LEVEL TWO.\", \" DARKMAN IS DISCOVERED BEFORE\", \" HIS PLAN IS  HALF GROWN. HIS\", \" FIANCE JULIE HAS BEEN SEIZED\", \" BY  STRACK  AND  DARKMAN  IS\", \" CORNERED IN  HIS LAIR. FIRED\", \" BY GRIEF DARKMAN FIGHTS WITH\", \" INHUMAN FEROCITY TO ESCAPE..\", \" END OF LINE...\"."
  },
  {
   "address": 23623,
   "type": "line",
   "text": "Upper character of each map cell half, indexed by 2 x map byte + $10E5 in $112B; it ends at the next table, so its true length may be shorter."
  },
  {
   "address": 23781,
   "type": "line",
   "text": "Lower character of each map cell half, indexed like $5C47 in $112B; it ends at the next table, so its true length may be shorter."
  },
  {
   "address": 23908,
   "type": "line",
   "text": "200 bytes copied to $CEF7 by $0EA7."
  },
  {
   "address": 24108,
   "type": "line",
   "text": "200 bytes copied to colour RAM $DAF7 by $0EA7."
  },
  {
   "address": 24308,
   "type": "line",
   "text": "256 bytes copied to $BF00 by $0C37."
  },
  {
   "address": 57344,
   "type": "line",
   "text": "Sprite shapes for pointers $80 to $8F (1,024 bytes; pointer p is at $C000 + 64 x p). player_sprites ($1AE0) draws the player as three sprites with the pointers F ($CFF8), F+$0D ($CFF9) and F-$17 ($CFFA), F being the frame number $1ADB. This block holds the third sprite: $80 to $85 when walking or standing facing right (F = $97 to $9C, standing $9A giving $83) and $86 to $8B facing left (F = $9D to $A2, standing $A0 giving $89). No traced level 3 code sets $8C to $8F."
  },
  {
   "address": 58368,
   "type": "line",
   "text": "Sprite shapes for pointers $90 to $93 (256 bytes). No traced level 3 code sets these pointers; the shapes belong to the player's frames in the level file but this level does not display them."
  },
  {
   "address": 58624,
   "type": "line",
   "text": "Sprite shapes for pointers $94 to $96 (192 bytes), the climbing frames. Only the unreached routines $1A99 and $1ABA (tables at $1A81 and $1A8D) store these pointers in the frame number $1ADB; level 3 has no traced call to them."
  },
  {
   "address": 58816,
   "type": "line",
   "text": "Sprite shapes for pointers $97 to $9C (384 bytes): the first sprite ($CFF8, pointer F) of the player walking right. walk_frames_right ($1679) lists them, three entries each, and $9A is also the standing frame facing right."
  },
  {
   "address": 59200,
   "type": "line",
   "text": "Sprite shapes for pointers $9D to $A2 (384 bytes): the first sprite ($CFF8, pointer F) of the player walking left. walk_frames_left ($1667) lists them, three entries each, and $A0 is also the standing frame facing left."
  },
  {
   "address": 59584,
   "type": "line",
   "text": "Sprite shapes for pointers $A3 to $B2 (1,024 bytes). $A4 to $A9 are the second sprite ($CFF9, pointer F+$0D) of the player walking or standing facing right and $AA to $AF the second sprite facing left (standing frames $A7 and $AD). No traced level 3 code sets $A3 or $B0 to $B2."
  },
  {
   "address": 60608,
   "type": "line",
   "text": "Sprite shapes for pointers $B3 to $C1 (960 bytes), the rest of the player's frames in the level file. No traced level 3 code sets these pointers."
  },
  {
   "address": 61568,
   "type": "line",
   "text": "Sprite shapes for pointers $C2 to $C4 (192 bytes). No traced level 3 code sets these pointers."
  },
  {
   "address": 62464,
   "type": "line",
   "text": "Sprite shapes for pointers $D0 to $D8 (576 bytes): the frames of the explosion. blast_sprites ($1BFF) lists them, three entries each (six for $D8), and $239F writes the entry for the frame $1BFE to the pointers of sprites 3 to 7 ($CFFB to $CFFF). $D0 draws a filled disc; the later shapes thin out, and $D8 has only 6 non-zero bytes."
  },
  {
   "address": 63040,
   "type": "line",
   "text": "Sprite shape for pointer $D9 (64 bytes): the falling object. object_update ($1C45) writes $D9 to sprite 3's pointer $CFFB. Only 5 of its bytes are non-zero: a small blob in the middle of the sprite."
  },
  {
   "address": 63104,
   "type": "line",
   "text": "Sprite shape for pointer $DA (64 bytes): a rectangular outline. $422B, $49B9 and $4A91, in the mask game, write $DA to sprite 0's pointer $CFF8; $49B9 also sets that sprite's colour to 1."
  },
  {
   "address": 63168,
   "type": "line",
   "text": "Sprite shapes for pointers $DB to $DE (256 bytes), all zero, so they draw nothing. $0C65 writes $DB to all eight sprite pointers $CFF8 to $CFFF every frame, so a sprite shows nothing until the level code gives it another pointer."
  },
  {
   "address": 63424,
   "type": "line",
   "text": "The status panel's bitmap. From raster line $CD the interrupt $0CC9 turns on bitmap mode ($D011 bit 5), and the low nibble of $D018 set by $0C44 puts the bitmap at $E000 (multicolour); the panel is the text rows 19 to 24, 40 cells wide, 8 bytes a cell and 320 a row. This is row 19, columns 0 to 31 (256 bytes), which comes with the level file; no traced routine writes it."
  },
  {
   "address": 63680,
   "type": "line",
   "text": "Row 0 of the 48-byte pixel rows of pictures A and B, written by $328D and $32F6 and cleared by $3234."
  },
  {
   "address": 63728,
   "type": "line",
   "text": "Row 19, columns 38 and 39, and row 20, columns 0 to 26 of the panel bitmap (232 bytes; see panel_bitmap): bytes that no traced routine writes."
  },
  {
   "address": 63960,
   "type": "line",
   "text": "Glyph of the counter's left digit ($0ECB), written by $5348."
  },
  {
   "address": 63968,
   "type": "line",
   "text": "Row 20, column 28 of the panel bitmap, between the counter digits timer_glyph_hundreds ($F9D8) and timer_glyph_tens ($F9E8): 8 bytes of which only the second and sixth ($B6) are not 0. No traced routine writes them."
  },
  {
   "address": 63976,
   "type": "line",
   "text": "Glyph of the counter's middle digit ($0ECA), written by $5348."
  },
  {
   "address": 63984,
   "type": "line",
   "text": "Glyph of the counter's right digit ($0EC9), written by $5348."
  },
  {
   "address": 63992,
   "type": "line",
   "text": "Row 20, column 31 of the panel bitmap (8 bytes), after the last counter digit timer_glyph_ones ($F9F0): bytes that no traced routine writes."
  },
  {
   "address": 64000,
   "type": "line",
   "text": "Row 1 of the pixel rows of pictures A and B (see $F8C0)."
  },
  {
   "address": 64048,
   "type": "line",
   "text": "Row 20, columns 38 and 39, and row 21, columns 0 to 2 of the panel bitmap (40 bytes): bytes that no traced routine writes."
  },
  {
   "address": 64088,
   "type": "line",
   "text": "Seven digit glyphs of 8 bytes, written by $2549."
  },
  {
   "address": 64144,
   "type": "line",
   "text": "Row 21, columns 10 to 16 of the panel bitmap (56 bytes), between the score digits score_glyphs ($FA58) and the energy bar cells energy_sprite_dest ($FAC8): bytes that no traced routine writes."
  },
  {
   "address": 64200,
   "type": "line",
   "text": "Destination of the energy bar buffer $2454, copied by $2495."
  },
  {
   "address": 64264,
   "type": "line",
   "text": "Row 21, columns 25 to 31 of the panel bitmap (56 bytes), after the energy bar cells: bytes that no traced routine writes."
  },
  {
   "address": 64320,
   "type": "line",
   "text": "Row 2 of the pixel rows of pictures A and B (see $F8C0)."
  },
  {
   "address": 64368,
   "type": "line",
   "text": "Row 21, columns 38 and 39, and row 22, columns 0 to 31 of the panel bitmap (272 bytes): bytes that no traced routine writes."
  },
  {
   "address": 64640,
   "type": "line",
   "text": "Row 3 of the pixel rows of pictures A and B (see $F8C0)."
  },
  {
   "address": 64688,
   "type": "line",
   "text": "Row 22, columns 38 and 39, and row 23, columns 0 to 31 of the panel bitmap (272 bytes): bytes that no traced routine writes."
  },
  {
   "address": 64960,
   "type": "line",
   "text": "Row 4 of the pixel rows of pictures A and B (see $F8C0)."
  },
  {
   "address": 65024,
   "type": "line",
   "text": "256 bytes filled with $AA by $4F9C and eroded by $448C with random AND masks, then cleared."
  },
  {
   "address": 65280,
   "type": "line",
   "text": "Sprite shapes for pointers $FC and $FD (128 bytes, 64 each), after the 256 bytes of dissolve_buffer, whose start is the shape for $F8. player_sprites ($1AE0) uses $F8, $FA and $FC for the jumping or thrown-back player facing right and $F9, $FB and $FD facing left (F, F+2 and F+4 from the frame number $1ADB); the result sprites of mask_sprites ($52BB) use $F8 to $FC."
  },
  {
   "address": 65408,
   "type": "line",
   "text": "64 bytes cleared by $0A84; the sprite pointer $FE, written to $CFFC by $23D6, points here."
  }
 ]
}