{
 "schema": 1,
 "platform": "c64",
 "game": "darkman",
 "build": "PAL original, two-sided G64; level 1 load in play",
 "source": "regenerator2000 live",
 "part": "level4",
 "regions": {
  "exclude": [
   [
    256,
    511,
    "stack"
   ],
   [
    53248,
    57343,
    "I/O and colour RAM"
   ],
   [
    0,
    2591,
    "Loader and resident code"
   ],
   [
    40448,
    48895,
    "Not loaded by this level"
   ],
   [
    65520,
    65535,
    "Loader and resident code"
   ]
  ],
  "extra": [],
  "edges": [
   0,
   256,
   512,
   1024,
   2048,
   4096,
   16384,
   32768,
   40960,
   49152,
   53248,
   57344
  ],
  "elsewhere": [
   [
    0,
    2591,
    "Loader and resident code"
   ],
   [
    40448,
    48895,
    "Not loaded by this level"
   ],
   [
    65520,
    65535,
    "Loader and resident code"
   ]
  ]
 },
 "blocks": [
  {
   "start": 2592,
   "end": 2602,
   "type": "Code"
  },
  {
   "start": 2603,
   "end": 2603,
   "type": "Byte"
  },
  {
   "start": 2604,
   "end": 2609,
   "type": "Byte"
  },
  {
   "start": 2610,
   "end": 2623,
   "type": "Byte"
  },
  {
   "start": 2624,
   "end": 2637,
   "type": "Byte"
  },
  {
   "start": 2638,
   "end": 2651,
   "type": "Byte"
  },
  {
   "start": 2652,
   "end": 2665,
   "type": "Byte"
  },
  {
   "start": 2666,
   "end": 2679,
   "type": "Byte"
  },
  {
   "start": 2680,
   "end": 2693,
   "type": "Byte"
  },
  {
   "start": 2694,
   "end": 2707,
   "type": "Byte"
  },
  {
   "start": 2708,
   "end": 2721,
   "type": "Byte"
  },
  {
   "start": 2722,
   "end": 2794,
   "type": "Byte"
  },
  {
   "start": 2795,
   "end": 2867,
   "type": "Byte"
  },
  {
   "start": 2868,
   "end": 2940,
   "type": "Byte"
  },
  {
   "start": 2941,
   "end": 3013,
   "type": "Byte"
  },
  {
   "start": 3014,
   "end": 3086,
   "type": "Byte"
  },
  {
   "start": 3087,
   "end": 3159,
   "type": "Byte"
  },
  {
   "start": 3160,
   "end": 3232,
   "type": "Byte"
  },
  {
   "start": 3233,
   "end": 3305,
   "type": "Byte"
  },
  {
   "start": 3306,
   "end": 3378,
   "type": "Byte"
  },
  {
   "start": 3379,
   "end": 3451,
   "type": "Byte"
  },
  {
   "start": 3452,
   "end": 3524,
   "type": "Byte"
  },
  {
   "start": 3525,
   "end": 3597,
   "type": "Byte"
  },
  {
   "start": 3598,
   "end": 3670,
   "type": "Byte"
  },
  {
   "start": 3671,
   "end": 3743,
   "type": "Byte"
  },
  {
   "start": 3744,
   "end": 3757,
   "type": "Byte"
  },
  {
   "start": 3758,
   "end": 3830,
   "type": "Byte"
  },
  {
   "start": 3831,
   "end": 3847,
   "type": "Undefined"
  },
  {
   "start": 3848,
   "end": 3848,
   "type": "Byte"
  },
  {
   "start": 3849,
   "end": 3849,
   "type": "Byte"
  },
  {
   "start": 3850,
   "end": 3850,
   "type": "Byte"
  },
  {
   "start": 3851,
   "end": 3851,
   "type": "Byte"
  },
  {
   "start": 3852,
   "end": 4031,
   "type": "Code"
  },
  {
   "start": 4032,
   "end": 4104,
   "type": "Byte"
  },
  {
   "start": 4105,
   "end": 4121,
   "type": "Undefined"
  },
  {
   "start": 4122,
   "end": 4122,
   "type": "Byte"
  },
  {
   "start": 4123,
   "end": 4123,
   "type": "Byte"
  },
  {
   "start": 4124,
   "end": 4462,
   "type": "Code"
  },
  {
   "start": 4463,
   "end": 4463,
   "type": "Byte"
  },
  {
   "start": 4464,
   "end": 4477,
   "type": "Byte"
  },
  {
   "start": 4478,
   "end": 4595,
   "type": "Code"
  },
  {
   "start": 4596,
   "end": 4596,
   "type": "Byte"
  },
  {
   "start": 4597,
   "end": 4650,
   "type": "Byte"
  },
  {
   "start": 4651,
   "end": 4651,
   "type": "Code"
  },
  {
   "start": 4652,
   "end": 4903,
   "type": "Code"
  },
  {
   "start": 4904,
   "end": 4925,
   "type": "Code"
  },
  {
   "start": 4926,
   "end": 4940,
   "type": "Byte"
  },
  {
   "start": 4941,
   "end": 5066,
   "type": "Code"
  },
  {
   "start": 5067,
   "end": 5098,
   "type": "Byte"
  },
  {
   "start": 5099,
   "end": 5102,
   "type": "Byte"
  },
  {
   "start": 5103,
   "end": 5269,
   "type": "Code"
  },
  {
   "start": 5270,
   "end": 5359,
   "type": "Byte"
  },
  {
   "start": 5360,
   "end": 5361,
   "type": "Undefined"
  },
  {
   "start": 5362,
   "end": 5468,
   "type": "Code"
  },
  {
   "start": 5469,
   "end": 5469,
   "type": "Byte"
  },
  {
   "start": 5470,
   "end": 5712,
   "type": "Code"
  },
  {
   "start": 5713,
   "end": 5744,
   "type": "Byte"
  },
  {
   "start": 5745,
   "end": 5776,
   "type": "Byte"
  },
  {
   "start": 5777,
   "end": 6298,
   "type": "Code"
  },
  {
   "start": 6299,
   "end": 6330,
   "type": "Byte"
  },
  {
   "start": 6331,
   "end": 6362,
   "type": "Byte"
  },
  {
   "start": 6363,
   "end": 6641,
   "type": "Code"
  },
  {
   "start": 6642,
   "end": 6655,
   "type": "Byte"
  },
  {
   "start": 6656,
   "end": 6797,
   "type": "Code"
  },
  {
   "start": 6798,
   "end": 6845,
   "type": "Byte"
  },
  {
   "start": 6846,
   "end": 7129,
   "type": "Code"
  },
  {
   "start": 7130,
   "end": 7235,
   "type": "Byte"
  },
  {
   "start": 7236,
   "end": 7236,
   "type": "Byte"
  },
  {
   "start": 7237,
   "end": 7237,
   "type": "Byte"
  },
  {
   "start": 7238,
   "end": 7238,
   "type": "Byte"
  },
  {
   "start": 7239,
   "end": 7362,
   "type": "Code"
  },
  {
   "start": 7363,
   "end": 7394,
   "type": "Byte"
  },
  {
   "start": 7395,
   "end": 7426,
   "type": "Byte"
  },
  {
   "start": 7427,
   "end": 7427,
   "type": "Code"
  },
  {
   "start": 7428,
   "end": 7428,
   "type": "Byte"
  },
  {
   "start": 7429,
   "end": 7429,
   "type": "Byte"
  },
  {
   "start": 7430,
   "end": 7551,
   "type": "Code"
  },
  {
   "start": 7552,
   "end": 7552,
   "type": "Byte"
  },
  {
   "start": 7553,
   "end": 7553,
   "type": "Byte"
  },
  {
   "start": 7554,
   "end": 7556,
   "type": "Byte"
  },
  {
   "start": 7557,
   "end": 7619,
   "type": "Code"
  },
  {
   "start": 7620,
   "end": 7699,
   "type": "Byte"
  },
  {
   "start": 7700,
   "end": 7700,
   "type": "Byte"
  },
  {
   "start": 7701,
   "end": 7810,
   "type": "Code"
  },
  {
   "start": 7811,
   "end": 7811,
   "type": "Byte"
  },
  {
   "start": 7812,
   "end": 7812,
   "type": "Byte"
  },
  {
   "start": 7813,
   "end": 7872,
   "type": "Code"
  },
  {
   "start": 7873,
   "end": 7873,
   "type": "Byte"
  },
  {
   "start": 7874,
   "end": 7874,
   "type": "Byte"
  },
  {
   "start": 7875,
   "end": 7875,
   "type": "Byte"
  },
  {
   "start": 7876,
   "end": 7876,
   "type": "Byte"
  },
  {
   "start": 7877,
   "end": 7877,
   "type": "Byte"
  },
  {
   "start": 7878,
   "end": 7878,
   "type": "Byte"
  },
  {
   "start": 7879,
   "end": 7879,
   "type": "Byte"
  },
  {
   "start": 7880,
   "end": 7880,
   "type": "Byte"
  },
  {
   "start": 7881,
   "end": 7881,
   "type": "Byte"
  },
  {
   "start": 7882,
   "end": 7882,
   "type": "Byte"
  },
  {
   "start": 7883,
   "end": 7883,
   "type": "Byte"
  },
  {
   "start": 7884,
   "end": 7884,
   "type": "Byte"
  },
  {
   "start": 7885,
   "end": 8078,
   "type": "Code"
  },
  {
   "start": 8079,
   "end": 8079,
   "type": "Byte"
  },
  {
   "start": 8080,
   "end": 8080,
   "type": "Byte"
  },
  {
   "start": 8081,
   "end": 8081,
   "type": "Byte"
  },
  {
   "start": 8082,
   "end": 8083,
   "type": "Byte"
  },
  {
   "start": 8084,
   "end": 8084,
   "type": "Byte"
  },
  {
   "start": 8085,
   "end": 8085,
   "type": "Byte"
  },
  {
   "start": 8086,
   "end": 8117,
   "type": "Byte"
  },
  {
   "start": 8118,
   "end": 8118,
   "type": "Code"
  },
  {
   "start": 8119,
   "end": 8122,
   "type": "Byte"
  },
  {
   "start": 8123,
   "end": 9492,
   "type": "Code"
  },
  {
   "start": 9493,
   "end": 9496,
   "type": "Byte"
  },
  {
   "start": 9497,
   "end": 10413,
   "type": "Code"
  },
  {
   "start": 10414,
   "end": 10417,
   "type": "Byte"
  },
  {
   "start": 10418,
   "end": 10831,
   "type": "Code"
  },
  {
   "start": 10832,
   "end": 10832,
   "type": "Byte"
  },
  {
   "start": 10833,
   "end": 10833,
   "type": "Byte"
  },
  {
   "start": 10834,
   "end": 11748,
   "type": "Code"
  },
  {
   "start": 11749,
   "end": 11749,
   "type": "Byte"
  },
  {
   "start": 11750,
   "end": 12181,
   "type": "Code"
  },
  {
   "start": 12182,
   "end": 12204,
   "type": "Code"
  },
  {
   "start": 12205,
   "end": 13068,
   "type": "Code"
  },
  {
   "start": 13069,
   "end": 13072,
   "type": "Byte"
  },
  {
   "start": 13073,
   "end": 20758,
   "type": "Code"
  },
  {
   "start": 20759,
   "end": 20759,
   "type": "Byte"
  },
  {
   "start": 20760,
   "end": 21235,
   "type": "Code"
  },
  {
   "start": 21236,
   "end": 21236,
   "type": "Byte"
  },
  {
   "start": 21237,
   "end": 21348,
   "type": "Code"
  },
  {
   "start": 21349,
   "end": 21349,
   "type": "Byte"
  },
  {
   "start": 21350,
   "end": 21350,
   "type": "Byte"
  },
  {
   "start": 21351,
   "end": 21390,
   "type": "Code"
  },
  {
   "start": 21391,
   "end": 21391,
   "type": "Code"
  },
  {
   "start": 21392,
   "end": 21397,
   "type": "Byte"
  },
  {
   "start": 21398,
   "end": 21398,
   "type": "Byte"
  },
  {
   "start": 21399,
   "end": 21399,
   "type": "Byte"
  },
  {
   "start": 21400,
   "end": 21682,
   "type": "Code"
  },
  {
   "start": 21683,
   "end": 21698,
   "type": "Code"
  },
  {
   "start": 21699,
   "end": 21755,
   "type": "Byte"
  },
  {
   "start": 21756,
   "end": 21817,
   "type": "Byte"
  },
  {
   "start": 21818,
   "end": 21973,
   "type": "Code"
  },
  {
   "start": 21974,
   "end": 22129,
   "type": "Byte"
  },
  {
   "start": 22130,
   "end": 22306,
   "type": "Code"
  },
  {
   "start": 22307,
   "end": 22330,
   "type": "Byte"
  },
  {
   "start": 22331,
   "end": 22526,
   "type": "Code"
  },
  {
   "start": 22527,
   "end": 22681,
   "type": "Code"
  },
  {
   "start": 22682,
   "end": 22691,
   "type": "Byte"
  },
  {
   "start": 22692,
   "end": 22692,
   "type": "Byte"
  },
  {
   "start": 22693,
   "end": 22708,
   "type": "Byte"
  },
  {
   "start": 22709,
   "end": 22709,
   "type": "Byte"
  },
  {
   "start": 22710,
   "end": 22710,
   "type": "Byte"
  },
  {
   "start": 22711,
   "end": 22751,
   "type": "Code"
  },
  {
   "start": 22752,
   "end": 22752,
   "type": "Byte"
  },
  {
   "start": 22753,
   "end": 22753,
   "type": "Byte"
  },
  {
   "start": 22754,
   "end": 22754,
   "type": "Code"
  },
  {
   "start": 22755,
   "end": 22755,
   "type": "Byte"
  },
  {
   "start": 22756,
   "end": 22773,
   "type": "Byte"
  },
  {
   "start": 22774,
   "end": 22791,
   "type": "Byte"
  },
  {
   "start": 22792,
   "end": 22792,
   "type": "Byte"
  },
  {
   "start": 22793,
   "end": 22858,
   "type": "Code"
  },
  {
   "start": 22859,
   "end": 22859,
   "type": "Byte"
  },
  {
   "start": 22860,
   "end": 22860,
   "type": "Byte"
  },
  {
   "start": 22861,
   "end": 22965,
   "type": "Code"
  },
  {
   "start": 22966,
   "end": 22991,
   "type": "Byte"
  },
  {
   "start": 22992,
   "end": 23228,
   "type": "Code"
  },
  {
   "start": 23229,
   "end": 23229,
   "type": "Byte"
  },
  {
   "start": 23230,
   "end": 23230,
   "type": "Byte"
  },
  {
   "start": 23231,
   "end": 23231,
   "type": "Byte"
  },
  {
   "start": 23232,
   "end": 23232,
   "type": "Byte"
  },
  {
   "start": 23233,
   "end": 23233,
   "type": "Byte"
  },
  {
   "start": 23234,
   "end": 23234,
   "type": "Byte"
  },
  {
   "start": 23235,
   "end": 23371,
   "type": "Code"
  },
  {
   "start": 23372,
   "end": 23372,
   "type": "Byte"
  },
  {
   "start": 23373,
   "end": 23373,
   "type": "Byte"
  },
  {
   "start": 23374,
   "end": 24031,
   "type": "Code"
  },
  {
   "start": 24032,
   "end": 24109,
   "type": "Byte"
  },
  {
   "start": 24110,
   "end": 24110,
   "type": "Byte"
  },
  {
   "start": 24111,
   "end": 24111,
   "type": "Byte"
  },
  {
   "start": 24112,
   "end": 24385,
   "type": "Code"
  },
  {
   "start": 24386,
   "end": 24386,
   "type": "Byte"
  },
  {
   "start": 24387,
   "end": 24398,
   "type": "Byte"
  },
  {
   "start": 24399,
   "end": 24410,
   "type": "Byte"
  },
  {
   "start": 24411,
   "end": 24476,
   "type": "Code"
  },
  {
   "start": 24477,
   "end": 24477,
   "type": "Byte"
  },
  {
   "start": 24478,
   "end": 24478,
   "type": "Byte"
  },
  {
   "start": 24479,
   "end": 24763,
   "type": "Code"
  },
  {
   "start": 24764,
   "end": 24764,
   "type": "Byte"
  },
  {
   "start": 24765,
   "end": 24765,
   "type": "Byte"
  },
  {
   "start": 24766,
   "end": 24766,
   "type": "Byte"
  },
  {
   "start": 24767,
   "end": 24767,
   "type": "Byte"
  },
  {
   "start": 24768,
   "end": 25001,
   "type": "Code"
  },
  {
   "start": 25002,
   "end": 25031,
   "type": "Byte"
  },
  {
   "start": 25032,
   "end": 25071,
   "type": "Byte"
  },
  {
   "start": 25072,
   "end": 25091,
   "type": "Byte"
  },
  {
   "start": 25092,
   "end": 25121,
   "type": "Byte"
  },
  {
   "start": 25122,
   "end": 25197,
   "type": "Code"
  },
  {
   "start": 25198,
   "end": 25256,
   "type": "Code"
  },
  {
   "start": 25257,
   "end": 25484,
   "type": "Code"
  },
  {
   "start": 25485,
   "end": 25485,
   "type": "Byte"
  },
  {
   "start": 25486,
   "end": 25486,
   "type": "Byte"
  },
  {
   "start": 25487,
   "end": 25577,
   "type": "Code"
  },
  {
   "start": 25578,
   "end": 25578,
   "type": "Byte"
  },
  {
   "start": 25579,
   "end": 25638,
   "type": "Code"
  },
  {
   "start": 25639,
   "end": 25639,
   "type": "Byte"
  },
  {
   "start": 25640,
   "end": 25947,
   "type": "Code"
  },
  {
   "start": 25948,
   "end": 25948,
   "type": "Byte"
  },
  {
   "start": 25949,
   "end": 25949,
   "type": "Code"
  },
  {
   "start": 25950,
   "end": 25964,
   "type": "Code"
  },
  {
   "start": 25965,
   "end": 26000,
   "type": "Code"
  },
  {
   "start": 26001,
   "end": 26001,
   "type": "Byte"
  },
  {
   "start": 26002,
   "end": 26002,
   "type": "Byte"
  },
  {
   "start": 26003,
   "end": 26511,
   "type": "Code"
  },
  {
   "start": 26512,
   "end": 26523,
   "type": "Byte"
  },
  {
   "start": 26524,
   "end": 26524,
   "type": "Byte"
  },
  {
   "start": 26525,
   "end": 28648,
   "type": "Code"
  },
  {
   "start": 28649,
   "end": 28659,
   "type": "Code"
  },
  {
   "start": 28660,
   "end": 28854,
   "type": "Code"
  },
  {
   "start": 28855,
   "end": 28974,
   "type": "Byte"
  },
  {
   "start": 28975,
   "end": 29213,
   "type": "Byte"
  },
  {
   "start": 29214,
   "end": 29334,
   "type": "Undefined"
  },
  {
   "start": 29335,
   "end": 29488,
   "type": "Byte"
  },
  {
   "start": 29489,
   "end": 29494,
   "type": "Byte"
  },
  {
   "start": 29495,
   "end": 29865,
   "type": "Code"
  },
  {
   "start": 29866,
   "end": 29866,
   "type": "Byte"
  },
  {
   "start": 29867,
   "end": 30042,
   "type": "Code"
  },
  {
   "start": 30043,
   "end": 30043,
   "type": "Code"
  },
  {
   "start": 30044,
   "end": 30147,
   "type": "Code"
  },
  {
   "start": 30148,
   "end": 30148,
   "type": "Code"
  },
  {
   "start": 30149,
   "end": 30489,
   "type": "Code"
  },
  {
   "start": 30490,
   "end": 30490,
   "type": "Byte"
  },
  {
   "start": 30491,
   "end": 30491,
   "type": "Byte"
  },
  {
   "start": 30492,
   "end": 30492,
   "type": "Byte"
  },
  {
   "start": 30493,
   "end": 30653,
   "type": "Code"
  },
  {
   "start": 30654,
   "end": 30657,
   "type": "Byte"
  },
  {
   "start": 30658,
   "end": 30721,
   "type": "Byte"
  },
  {
   "start": 30722,
   "end": 30722,
   "type": "Byte"
  },
  {
   "start": 30723,
   "end": 30901,
   "type": "Code"
  },
  {
   "start": 30902,
   "end": 30902,
   "type": "Byte"
  },
  {
   "start": 30903,
   "end": 30959,
   "type": "Code"
  },
  {
   "start": 30960,
   "end": 31032,
   "type": "Byte"
  },
  {
   "start": 31033,
   "end": 31105,
   "type": "Byte"
  },
  {
   "start": 31106,
   "end": 31178,
   "type": "Byte"
  },
  {
   "start": 31179,
   "end": 31251,
   "type": "Byte"
  },
  {
   "start": 31252,
   "end": 31324,
   "type": "Byte"
  },
  {
   "start": 31325,
   "end": 31397,
   "type": "Byte"
  },
  {
   "start": 31398,
   "end": 31470,
   "type": "Byte"
  },
  {
   "start": 31471,
   "end": 31543,
   "type": "Byte"
  },
  {
   "start": 31544,
   "end": 31616,
   "type": "Byte"
  },
  {
   "start": 31617,
   "end": 31689,
   "type": "Byte"
  },
  {
   "start": 31690,
   "end": 31762,
   "type": "Byte"
  },
  {
   "start": 31763,
   "end": 31835,
   "type": "Byte"
  },
  {
   "start": 31836,
   "end": 31908,
   "type": "Byte"
  },
  {
   "start": 31909,
   "end": 31981,
   "type": "Byte"
  },
  {
   "start": 31982,
   "end": 36589,
   "type": "Byte"
  },
  {
   "start": 36590,
   "end": 36591,
   "type": "Byte"
  },
  {
   "start": 36592,
   "end": 36745,
   "type": "Byte"
  },
  {
   "start": 36746,
   "end": 36899,
   "type": "Byte"
  },
  {
   "start": 36900,
   "end": 37053,
   "type": "Byte"
  },
  {
   "start": 37054,
   "end": 37177,
   "type": "Byte"
  },
  {
   "start": 37178,
   "end": 37211,
   "type": "Byte"
  },
  {
   "start": 37212,
   "end": 37339,
   "type": "Byte"
  },
  {
   "start": 37340,
   "end": 37539,
   "type": "Byte"
  },
  {
   "start": 37540,
   "end": 37739,
   "type": "Byte"
  },
  {
   "start": 37740,
   "end": 37795,
   "type": "Byte"
  },
  {
   "start": 37796,
   "end": 37797,
   "type": "Byte"
  },
  {
   "start": 37798,
   "end": 37798,
   "type": "Byte"
  },
  {
   "start": 37799,
   "end": 37799,
   "type": "Byte"
  },
  {
   "start": 37800,
   "end": 37800,
   "type": "Byte"
  },
  {
   "start": 37801,
   "end": 37801,
   "type": "Byte"
  },
  {
   "start": 37802,
   "end": 37802,
   "type": "Undefined"
  },
  {
   "start": 37803,
   "end": 37960,
   "type": "Code"
  },
  {
   "start": 37961,
   "end": 37961,
   "type": "Byte"
  },
  {
   "start": 37962,
   "end": 37962,
   "type": "Byte"
  },
  {
   "start": 37963,
   "end": 37963,
   "type": "Byte"
  },
  {
   "start": 37964,
   "end": 38024,
   "type": "Code"
  },
  {
   "start": 38025,
   "end": 38025,
   "type": "Byte"
  },
  {
   "start": 38026,
   "end": 38140,
   "type": "Code"
  },
  {
   "start": 38141,
   "end": 38141,
   "type": "Byte"
  },
  {
   "start": 38142,
   "end": 38351,
   "type": "Code"
  },
  {
   "start": 38352,
   "end": 38651,
   "type": "Byte"
  },
  {
   "start": 38652,
   "end": 38951,
   "type": "Byte"
  },
  {
   "start": 38952,
   "end": 39026,
   "type": "Code"
  },
  {
   "start": 39027,
   "end": 39027,
   "type": "Byte"
  },
  {
   "start": 39028,
   "end": 39028,
   "type": "Byte"
  },
  {
   "start": 39029,
   "end": 39051,
   "type": "Byte"
  },
  {
   "start": 39052,
   "end": 39074,
   "type": "Byte"
  },
  {
   "start": 39075,
   "end": 39075,
   "type": "Byte"
  },
  {
   "start": 39076,
   "end": 39239,
   "type": "Code"
  },
  {
   "start": 39240,
   "end": 39375,
   "type": "Byte"
  },
  {
   "start": 39376,
   "end": 39511,
   "type": "Byte"
  },
  {
   "start": 39512,
   "end": 39551,
   "type": "Undefined"
  },
  {
   "start": 39552,
   "end": 39552,
   "type": "Byte"
  },
  {
   "start": 39553,
   "end": 39670,
   "type": "Code"
  },
  {
   "start": 39671,
   "end": 39671,
   "type": "Undefined"
  },
  {
   "start": 39672,
   "end": 39672,
   "type": "Byte"
  },
  {
   "start": 39673,
   "end": 39673,
   "type": "Byte"
  },
  {
   "start": 39674,
   "end": 39674,
   "type": "Byte"
  },
  {
   "start": 39675,
   "end": 39738,
   "type": "Byte"
  },
  {
   "start": 39739,
   "end": 39795,
   "type": "Code"
  },
  {
   "start": 39796,
   "end": 39796,
   "type": "Byte"
  },
  {
   "start": 39797,
   "end": 39797,
   "type": "Byte"
  },
  {
   "start": 39798,
   "end": 39945,
   "type": "Code"
  },
  {
   "start": 39946,
   "end": 40193,
   "type": "Byte"
  },
  {
   "start": 40194,
   "end": 40447,
   "type": "Byte"
  },
  {
   "start": 48896,
   "end": 49151,
   "type": "Byte"
  },
  {
   "start": 49152,
   "end": 49215,
   "type": "Byte"
  },
  {
   "start": 49216,
   "end": 49975,
   "type": "Byte"
  },
  {
   "start": 49976,
   "end": 50111,
   "type": "Byte"
  },
  {
   "start": 50112,
   "end": 50247,
   "type": "Byte"
  },
  {
   "start": 50248,
   "end": 50255,
   "type": "Byte"
  },
  {
   "start": 50256,
   "end": 50335,
   "type": "Byte"
  },
  {
   "start": 50336,
   "end": 51199,
   "type": "Byte"
  },
  {
   "start": 51200,
   "end": 52199,
   "type": "Byte"
  },
  {
   "start": 52200,
   "end": 52215,
   "type": "Undefined"
  },
  {
   "start": 52216,
   "end": 52223,
   "type": "Byte"
  },
  {
   "start": 52224,
   "end": 53223,
   "type": "Byte"
  },
  {
   "start": 53224,
   "end": 53239,
   "type": "Undefined"
  },
  {
   "start": 53240,
   "end": 53247,
   "type": "Byte"
  },
  {
   "start": 53248,
   "end": 54271,
   "type": "Byte"
  },
  {
   "start": 54272,
   "end": 55231,
   "type": "Byte"
  },
  {
   "start": 55232,
   "end": 55295,
   "type": "Byte"
  },
  {
   "start": 55296,
   "end": 55423,
   "type": "Byte"
  },
  {
   "start": 55424,
   "end": 55551,
   "type": "Byte"
  },
  {
   "start": 55552,
   "end": 55743,
   "type": "Byte"
  },
  {
   "start": 55744,
   "end": 55807,
   "type": "Byte"
  },
  {
   "start": 55808,
   "end": 55935,
   "type": "Byte"
  },
  {
   "start": 55936,
   "end": 56063,
   "type": "Byte"
  },
  {
   "start": 56064,
   "end": 56127,
   "type": "Byte"
  },
  {
   "start": 56128,
   "end": 56319,
   "type": "Byte"
  },
  {
   "start": 56320,
   "end": 56383,
   "type": "Byte"
  },
  {
   "start": 56384,
   "end": 56511,
   "type": "Byte"
  },
  {
   "start": 56512,
   "end": 56639,
   "type": "Byte"
  },
  {
   "start": 56640,
   "end": 56703,
   "type": "Byte"
  },
  {
   "start": 56704,
   "end": 57023,
   "type": "Byte"
  },
  {
   "start": 57024,
   "end": 57343,
   "type": "Byte"
  },
  {
   "start": 57344,
   "end": 58367,
   "type": "Byte"
  },
  {
   "start": 58368,
   "end": 58623,
   "type": "Byte"
  },
  {
   "start": 58624,
   "end": 58815,
   "type": "Byte"
  },
  {
   "start": 58816,
   "end": 59199,
   "type": "Byte"
  },
  {
   "start": 59200,
   "end": 59583,
   "type": "Byte"
  },
  {
   "start": 59584,
   "end": 60607,
   "type": "Byte"
  },
  {
   "start": 60608,
   "end": 61567,
   "type": "Byte"
  },
  {
   "start": 61568,
   "end": 61759,
   "type": "Byte"
  },
  {
   "start": 61760,
   "end": 62783,
   "type": "Byte"
  },
  {
   "start": 62784,
   "end": 63167,
   "type": "Byte"
  },
  {
   "start": 63168,
   "end": 63295,
   "type": "Byte"
  },
  {
   "start": 63296,
   "end": 63423,
   "type": "Byte"
  },
  {
   "start": 63424,
   "end": 63679,
   "type": "Byte"
  },
  {
   "start": 63680,
   "end": 63727,
   "type": "Byte"
  },
  {
   "start": 63728,
   "end": 63959,
   "type": "Byte"
  },
  {
   "start": 63960,
   "end": 63999,
   "type": "Byte"
  },
  {
   "start": 64000,
   "end": 64047,
   "type": "Byte"
  },
  {
   "start": 64048,
   "end": 64087,
   "type": "Byte"
  },
  {
   "start": 64088,
   "end": 64143,
   "type": "Byte"
  },
  {
   "start": 64144,
   "end": 64199,
   "type": "Byte"
  },
  {
   "start": 64200,
   "end": 64263,
   "type": "Byte"
  },
  {
   "start": 64264,
   "end": 64319,
   "type": "Byte"
  },
  {
   "start": 64320,
   "end": 64367,
   "type": "Byte"
  },
  {
   "start": 64368,
   "end": 64639,
   "type": "Byte"
  },
  {
   "start": 64640,
   "end": 64687,
   "type": "Byte"
  },
  {
   "start": 64688,
   "end": 64959,
   "type": "Byte"
  },
  {
   "start": 64960,
   "end": 65007,
   "type": "Byte"
  },
  {
   "start": 65008,
   "end": 65023,
   "type": "Byte"
  },
  {
   "start": 65024,
   "end": 65407,
   "type": "Byte"
  },
  {
   "start": 65408,
   "end": 65471,
   "type": "Byte"
  },
  {
   "start": 65472,
   "end": 65519,
   "type": "Undefined"
  }
 ],
 "symbols": [
  {
   "address": 2592,
   "name": "level_entry",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 2603,
   "name": "nmi_flag",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2604,
   "name": "spare_0a2c",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2610,
   "name": "slot_frame",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2624,
   "name": "slot_colour",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2638,
   "name": "slot_multicolour",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2652,
   "name": "slot_anim",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2666,
   "name": "slot_phase",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2680,
   "name": "slot_walk",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2694,
   "name": "slot_hurt",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2708,
   "name": "slot_state",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2722,
   "name": "obj_type",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2795,
   "name": "obj_counter",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2868,
   "name": "obj_flag",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 2941,
   "name": "obj_energy",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3014,
   "name": "obj_variant",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3087,
   "name": "obj_flag_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3160,
   "name": "obj_left_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3233,
   "name": "obj_left_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3306,
   "name": "obj_right_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3379,
   "name": "obj_right_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3452,
   "name": "obj_x_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3525,
   "name": "obj_x_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3598,
   "name": "obj_y_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3671,
   "name": "obj_y_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3744,
   "name": "slot_object",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3758,
   "name": "obj_slot",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3848,
   "name": "scan_dx_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3849,
   "name": "scan_dx_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3850,
   "name": "scan_dy_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3851,
   "name": "scan_dy_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 3852,
   "name": "scan_next_object",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 3855,
   "name": "scan_objects",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4019,
   "name": "saved_x_0fb3",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 4032,
   "name": "obj_active",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4096,
   "name": "obj_active_part_2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4122,
   "name": "hit_flag_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4123,
   "name": "hit_flag_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4124,
   "name": "player_hit_test",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4463,
   "name": "queue_count",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4464,
   "name": "slot_queue",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4478,
   "name": "update_objects",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4553,
   "name": "patched_jsr_11c9",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 4590,
   "name": "saved_index_11ee",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 4596,
   "name": "current_object",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4597,
   "name": "object_behaviours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4651,
   "name": "behave_free",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4652,
   "name": "behave_countdown_start",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4706,
   "name": "behave_countdown_light",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4757,
   "name": "behave_enemy_shot",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4904,
   "name": "behave_colour_6",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4915,
   "name": "behave_colour_1",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4926,
   "name": "vpatrol_frames",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 4941,
   "name": "behave_vertical_patrol",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 4981,
   "name": "saved_y_1375",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5067,
   "name": "radial_shot_steps",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5099,
   "name": "radial_shot_step",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5103,
   "name": "behave_radial_shot",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5182,
   "name": "saved_y_143e",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5266,
   "name": "saved_y_1492",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5268,
   "name": "saved_x_1494",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5270,
   "name": "flash_frames",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5362,
   "name": "behave_flashing_hazard",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5402,
   "name": "saved_y_151a",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5419,
   "name": "slot_right_of_player",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5436,
   "name": "slot_off_player_height",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5469,
   "name": "recoil",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5470,
   "name": "behave_attack_left",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 5565,
   "name": "attack_left_frame_a",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5573,
   "name": "attack_left_step_a",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5588,
   "name": "attack_left_frame_b",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5596,
   "name": "attack_left_step_b",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5688,
   "name": "attack_left_step_c",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5708,
   "name": "attack_left_frame_c",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5713,
   "name": "walk_left_frames_0",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5745,
   "name": "walk_left_frames_1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 5777,
   "name": "behave_walk_left",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6057,
   "name": "behave_attack_right",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6152,
   "name": "attack_right_frame_a",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6160,
   "name": "attack_right_step_a",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6175,
   "name": "attack_right_frame_b",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6183,
   "name": "attack_right_step_b",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6274,
   "name": "attack_right_step_c",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6294,
   "name": "attack_right_frame_c",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6299,
   "name": "walk_right_frames_0",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 6331,
   "name": "walk_right_frames_1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 6363,
   "name": "behave_walk_right",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6642,
   "name": "pickup_frames",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 6656,
   "name": "behave_energy_pickup",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6712,
   "name": "saved_y_1a38",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6794,
   "name": "saved_y_1a8a",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6796,
   "name": "saved_x_1a8c",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6798,
   "name": "pickup_bob_steps",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 6846,
   "name": "behave_score_pickup",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6895,
   "name": "saved_x_1aef",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6908,
   "name": "saved_y_1afc",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6910,
   "name": "saved_x_1afe",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6912,
   "name": "behave_flash_frame",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 6944,
   "name": "behave_lobbed_shot",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7126,
   "name": "saved_y_1bd6",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7128,
   "name": "saved_x_1bd8",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7130,
   "name": "lobbed_shot_steps",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7236,
   "name": "follow_limit",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7237,
   "name": "spare_1c45",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7238,
   "name": "follow_slot",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7239,
   "name": "slot_follow",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7363,
   "name": "follow_frames_high",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7395,
   "name": "follow_frames_low",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7427,
   "name": "behave_none",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7428,
   "name": "map_probe_x_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7429,
   "name": "map_probe_x_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7430,
   "name": "player_map_lookup",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7552,
   "name": "player_x",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7553,
   "name": "player_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7554,
   "name": "countdown_digits",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7557,
   "name": "draw_countdown",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7597,
   "name": "draw_countdown_digit",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7620,
   "name": "digit_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7700,
   "name": "countdown_delay",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7701,
   "name": "main_loop",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7811,
   "name": "player_y_sum_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7812,
   "name": "player_y_sum_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7813,
   "name": "countdown_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 7873,
   "name": "level_done",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7874,
   "name": "scroll_x_fine",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7875,
   "name": "scroll_y_fine",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7876,
   "name": "spare_1ec4",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7877,
   "name": "joystick",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7878,
   "name": "joystick_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7879,
   "name": "unused_1ec7",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7880,
   "name": "screen_buffer",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7881,
   "name": "saved_camera_y_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7882,
   "name": "saved_camera_y_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7883,
   "name": "saved_camera_x_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7884,
   "name": "saved_camera_x_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 7885,
   "name": "scroll_step",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8069,
   "name": "patched_jsr_1f85",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8079,
   "name": "scroll_direction",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8080,
   "name": "scroll_steps",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8081,
   "name": "scroll_phase",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8082,
   "name": "spare_1f92",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8084,
   "name": "scroll_spare_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8085,
   "name": "scroll_spare_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8086,
   "name": "scroll_routines",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8118,
   "name": "scroll_none",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8119,
   "name": "fine_x_right_values",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 8123,
   "name": "scroll_right_fine",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8169,
   "name": "scroll_right",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8222,
   "name": "scroll_right_colours",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8233,
   "name": "scroll_right_finish",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8248,
   "name": "scroll_right_copy_a",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8275,
   "name": "scroll_right_copy_b",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8308,
   "name": "shift_left_to_c8",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8424,
   "name": "copy_limit_20e8",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8428,
   "name": "shift_left_to_cc",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 8544,
   "name": "copy_limit_2160",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8548,
   "name": "draw_right_column",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9468,
   "name": "step_map_column",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9493,
   "name": "fine_y_down_values",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 9497,
   "name": "scroll_down_fine",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9543,
   "name": "scroll_down",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9597,
   "name": "scroll_down_colours",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9608,
   "name": "scroll_down_finish",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9623,
   "name": "scroll_down_copy_b",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9650,
   "name": "scroll_down_copy_a",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9683,
   "name": "shift_up_to_c8",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9793,
   "name": "copy_limit_2641",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9797,
   "name": "shift_up_to_cc",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 9907,
   "name": "copy_limit_26b3",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9911,
   "name": "draw_bottom_row_a",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10030,
   "name": "patched_table_272e",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10037,
   "name": "patched_table_2735",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10086,
   "name": "patched_table_2766",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10102,
   "name": "patched_table_2776",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10109,
   "name": "patched_table_277d",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10150,
   "name": "draw_bottom_row_b",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10269,
   "name": "patched_table_281d",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10276,
   "name": "patched_table_2824",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10325,
   "name": "patched_table_2855",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10341,
   "name": "patched_table_2865",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10348,
   "name": "patched_table_286c",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10389,
   "name": "step_map_row",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10414,
   "name": "fine_y_up_values",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 10418,
   "name": "scroll_up_fine",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10464,
   "name": "scroll_up",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10518,
   "name": "scroll_up_colours",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10529,
   "name": "scroll_up_finish",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10544,
   "name": "scroll_up_copy_b",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10571,
   "name": "scroll_up_copy_a",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10604,
   "name": "shift_down_to_c8",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10714,
   "name": "copy_limit_29da",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10718,
   "name": "shift_down_to_cc",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10828,
   "name": "copy_limit_2a4c",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10832,
   "name": "row_table_select",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 10833,
   "name": "row_shift",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 10834,
   "name": "draw_top_row_a",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 10948,
   "name": "patched_table_2ac4",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10955,
   "name": "patched_table_2acb",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11002,
   "name": "patched_table_2afa",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11018,
   "name": "patched_table_2b0a",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11025,
   "name": "patched_table_2b11",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11064,
   "name": "draw_top_row_b",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11111,
   "name": "call_placeholder",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11178,
   "name": "patched_table_2baa",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11185,
   "name": "patched_table_2bb1",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11232,
   "name": "patched_table_2be0",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11248,
   "name": "patched_table_2bf0",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11255,
   "name": "patched_table_2bf7",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11294,
   "name": "back_map_row",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11317,
   "name": "scroll_right_up",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11395,
   "name": "scroll_ru_colours",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11406,
   "name": "scroll_ru_finish",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11421,
   "name": "scroll_ru_copy_a",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11448,
   "name": "scroll_ru_copy_b",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11521,
   "name": "shift_ru_to_c8",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11631,
   "name": "copy_limit_2d6f",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11635,
   "name": "shift_ru_to_cc",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11745,
   "name": "copy_limit_2de1",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11749,
   "name": "scroll_hold",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 11750,
   "name": "scroll_left_up",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11828,
   "name": "scroll_lu_colours",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11839,
   "name": "scroll_lu_finish",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11854,
   "name": "scroll_lu_copy_a",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11881,
   "name": "scroll_lu_copy_b",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 11954,
   "name": "shift_lu_to_c8",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12064,
   "name": "copy_limit_2f20",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 12068,
   "name": "shift_lu_to_cc",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12178,
   "name": "copy_limit_2f92",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 12182,
   "name": "dead_copy_2f96",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12205,
   "name": "scroll_left_down",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12283,
   "name": "scroll_ld_colours",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12294,
   "name": "scroll_ld_finish",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12309,
   "name": "scroll_ld_copy_a",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12336,
   "name": "scroll_ld_copy_b",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12409,
   "name": "shift_ld_to_c8",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12519,
   "name": "copy_limit_30e7",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 12523,
   "name": "shift_ld_to_cc",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12633,
   "name": "copy_limit_3159",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 12637,
   "name": "scroll_right_down",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12715,
   "name": "scroll_rd_colours",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12726,
   "name": "scroll_rd_finish",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12741,
   "name": "scroll_rd_copy_a",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12768,
   "name": "scroll_rd_copy_b",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12841,
   "name": "shift_rd_to_c8",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 12951,
   "name": "copy_limit_3297",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 12955,
   "name": "shift_rd_to_cc",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13065,
   "name": "copy_limit_3309",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 13069,
   "name": "fine_x_left_values",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 13073,
   "name": "scroll_left_fine",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13119,
   "name": "scroll_left",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13172,
   "name": "scroll_left_colours",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13183,
   "name": "scroll_left_finish",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13198,
   "name": "scroll_left_copy_a",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13225,
   "name": "scroll_left_copy_b",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13258,
   "name": "shift_right_to_c8",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13374,
   "name": "copy_limit_343e",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 13378,
   "name": "shift_right_to_cc",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 13494,
   "name": "copy_limit_34b6",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 13498,
   "name": "draw_left_column",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 14416,
   "name": "back_map_column",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 14439,
   "name": "colour_buffer_from_cc",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 15141,
   "name": "colour_buffer_from_cc_part_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15843,
   "name": "colour_buffer_from_cc_part_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16545,
   "name": "colour_buffer_from_cc_part_4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17247,
   "name": "colour_buffer_from_cc_part_5",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 17599,
   "name": "colour_buffer_from_c8",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 18301,
   "name": "colour_buffer_from_c8_part_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 19003,
   "name": "colour_buffer_from_c8_part_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 19705,
   "name": "colour_buffer_from_c8_part_4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20407,
   "name": "colour_buffer_from_c8_part_5",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 20759,
   "name": "countdown_active",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 20760,
   "name": "level_setup",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21188,
   "name": "draw_panel",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21236,
   "name": "contact_scratch",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21237,
   "name": "player_contact",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21349,
   "name": "hurt_guard",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21350,
   "name": "energy",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21351,
   "name": "player_hurt",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21364,
   "name": "take_energy",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21387,
   "name": "saved_y_538b",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21389,
   "name": "saved_x_538d",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21391,
   "name": "behave_none_18",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21392,
   "name": "path_pointers",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21398,
   "name": "path_index",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21399,
   "name": "path_step",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21400,
   "name": "behave_path_follower",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21683,
   "name": "behave_fixed_sprite",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21699,
   "name": "blast_frames_left",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21756,
   "name": "blast_frames_right",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 21818,
   "name": "behave_timed_blast",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 21880,
   "name": "saved_y_5578",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21882,
   "name": "saved_x_557a",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21974,
   "name": "bounce_steps",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22130,
   "name": "behave_bouncer",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 22285,
   "name": "bounce_drift_lo",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 22293,
   "name": "bounce_drift_hi",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 22307,
   "name": "drop_frames",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22331,
   "name": "behave_falling_object",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 22390,
   "name": "saved_y_5776",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 22392,
   "name": "saved_x_5778",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 22438,
   "name": "behave_falling_burst",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 22523,
   "name": "saved_y_57fb",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 22525,
   "name": "saved_x_57fd",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 22527,
   "name": "game_over_screen",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 22682,
   "name": "game_over_text",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22692,
   "name": "player_state",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22693,
   "name": "player_state_table",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22709,
   "name": "player_prev_x",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22710,
   "name": "player_prev_y",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22711,
   "name": "player_update",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 22746,
   "name": "patched_jsr_58da",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 22752,
   "name": "map_scratch_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22753,
   "name": "map_scratch_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22754,
   "name": "player_state_none",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 22755,
   "name": "anim_index",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22756,
   "name": "walk_frames_left",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22774,
   "name": "walk_frames_right",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22792,
   "name": "anim_toggle",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22793,
   "name": "walk_anim_left",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 22826,
   "name": "walk_anim_right",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 22859,
   "name": "facing",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22860,
   "name": "player_tile_column",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22861,
   "name": "punch_frames",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 22898,
   "name": "player_punch",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 22929,
   "name": "strike_frames",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 22966,
   "name": "strike_arc",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 22992,
   "name": "player_strike",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 23229,
   "name": "strike_delay",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23230,
   "name": "strike_timer",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23231,
   "name": "crouch_flag",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23232,
   "name": "crouch_delay",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23233,
   "name": "punch_delay",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23234,
   "name": "jump_delay",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23235,
   "name": "player_crouch",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 23272,
   "name": "saved_y_5ae8",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 23274,
   "name": "saved_x_5aea",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 23335,
   "name": "crouch_frames",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 23372,
   "name": "punch_timer",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23373,
   "name": "unused_5b4d",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 23374,
   "name": "player_walk",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 23732,
   "name": "saved_y_5cb4",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 23734,
   "name": "saved_x_5cb6",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 23796,
   "name": "saved_y_5cf4",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 23798,
   "name": "saved_x_5cf6",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 23822,
   "name": "stand_frame",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 23841,
   "name": "player_fall",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 24013,
   "name": "fall_frame",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 24032,
   "name": "jump_arc",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24110,
   "name": "jump_index",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24111,
   "name": "draw_state_override",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24112,
   "name": "player_jump",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 24367,
   "name": "jump_frame",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 24386,
   "name": "climb_dir",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24387,
   "name": "climb_frames_up",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24399,
   "name": "climb_frames_down",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24411,
   "name": "climb_frame_up",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 24444,
   "name": "climb_frame_down",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 24477,
   "name": "climb_world_y_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24478,
   "name": "climb_world_y_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24479,
   "name": "player_climb",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 24632,
   "name": "sort_sprites",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 24764,
   "name": "player_frame",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24765,
   "name": "frame_sprite_2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24766,
   "name": "frame_sprite_0",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24767,
   "name": "frame_sprite_1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 24768,
   "name": "player_draw",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 24923,
   "name": "object_damaged",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 24968,
   "name": "saved_x_6188",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 25000,
   "name": "saved_x_61a8",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 25002,
   "name": "knocked_frames_0",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25032,
   "name": "follow_frames_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25072,
   "name": "knocked_frames_1_tail",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25092,
   "name": "follow_frames_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25122,
   "name": "behave_knocked_down",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 25198,
   "name": "revive_enemy",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 25257,
   "name": "select_screen",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 25279,
   "name": "irq_mid",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 25479,
   "name": "saved_a_6387",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 25481,
   "name": "saved_x_6389",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 25483,
   "name": "saved_y_638b",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 25485,
   "name": "irq_counter",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25486,
   "name": "irq_toggle",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25487,
   "name": "irq_bottom",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 25578,
   "name": "paused",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25579,
   "name": "attack_sprite_offset",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 25639,
   "name": "multiplex_pass",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25640,
   "name": "irq_top",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 25908,
   "name": "delay",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 25917,
   "name": "random_byte",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 25934,
   "name": "patched_branch_654e",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 25948,
   "name": "random_seed",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 25949,
   "name": "disabled_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 25950,
   "name": "unused_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 25965,
   "name": "fill_screen",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 25983,
   "name": "fill_colour",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 26001,
   "name": "multiplex_index",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26002,
   "name": "multiplex_limit",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26003,
   "name": "multiplex_sprites",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 26512,
   "name": "sprite_bit_masks",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26524,
   "name": "colour_pending",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 26525,
   "name": "copy_colour_mid",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 27233,
   "name": "colour_copy_lower",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 28180,
   "name": "colour_copy_lower_part_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28649,
   "name": "colour_buffer_dispatch",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 28660,
   "name": "fill_colour_top",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 28855,
   "name": "colour_buffer_mid",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 28975,
   "name": "colour_buffer",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 29335,
   "name": "map_row_pointers",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 29489,
   "name": "map_row_pointers_tail",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 29495,
   "name": "draw_first_screen",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 29595,
   "name": "pause_check",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 29634,
   "name": "load_objects",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 29761,
   "name": "countdown_tick",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 29866,
   "name": "tile_row",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 29867,
   "name": "draw_tile",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 29925,
   "name": "saved_x_74e5",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 29927,
   "name": "saved_y_74e7",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 29929,
   "name": "draw_tile_right_half",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 29975,
   "name": "saved_x_7517",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 29977,
   "name": "saved_y_7519",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 29979,
   "name": "blocked_left",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 30043,
   "name": "unreached_rts_755b",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 30044,
   "name": "blocked_left_part_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30084,
   "name": "blocked_right",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 30148,
   "name": "unreached_rts_75c4",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 30149,
   "name": "blocked_right_part_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30190,
   "name": "banner_sprites",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 30407,
   "name": "banner_row",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 30434,
   "name": "banner_pointers",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 30490,
   "name": "banner_flag",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 30491,
   "name": "banner_timer",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 30492,
   "name": "banner_done",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 30493,
   "name": "banner_step_exit",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 30494,
   "name": "banner_step",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 30654,
   "name": "bar_masks",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 30658,
   "name": "bar_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 30722,
   "name": "bar_steps",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 30723,
   "name": "draw_bar",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 30859,
   "name": "add_digits",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 30902,
   "name": "add_temp",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 30903,
   "name": "draw_score",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 30922,
   "name": "draw_digit",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 30960,
   "name": "obj_init_type",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 31033,
   "name": "obj_init_counter",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 31106,
   "name": "obj_init_flag",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 31179,
   "name": "obj_init_energy",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 31252,
   "name": "obj_init_variant",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 31325,
   "name": "obj_init_flag_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 31398,
   "name": "obj_init_left_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 31471,
   "name": "obj_init_left_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 31544,
   "name": "obj_init_right_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 31617,
   "name": "obj_init_right_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 31690,
   "name": "obj_init_x_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 31763,
   "name": "obj_init_x_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 31836,
   "name": "obj_init_y_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 31909,
   "name": "obj_init_y_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 31982,
   "name": "level_map",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 32768,
   "name": "level_map_part_2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 33792,
   "name": "level_map_part_3",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 34816,
   "name": "level_map_part_4",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 35840,
   "name": "level_map_part_5",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 36590,
   "name": "map_end_marker",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 36592,
   "name": "path_small",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 36746,
   "name": "path_medium",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 36900,
   "name": "path_large",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 37054,
   "name": "tile_top_chars",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 37178,
   "name": "unused_text_913a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 37212,
   "name": "tile_bottom_chars",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 37340,
   "name": "panel_chars",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 37540,
   "name": "panel_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 37740,
   "name": "wipe_lengths",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 37796,
   "name": "wipe_lengths_tail",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 37798,
   "name": "wipe_length_left",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 37799,
   "name": "wipe_line_start_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 37800,
   "name": "wipe_line_start_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 37801,
   "name": "wipe_flag",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 37803,
   "name": "screen_wipe",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 37892,
   "name": "saved_x_9404",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 37894,
   "name": "saved_y_9406",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 37961,
   "name": "timer_digits",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 37962,
   "name": "timer_digit_tens",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 37963,
   "name": "timer_digit_hundreds",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 37964,
   "name": "draw_timer",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 38004,
   "name": "draw_timer_digit",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 38025,
   "name": "timer_phase",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 38026,
   "name": "timer_tick",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 38124,
   "name": "timer_expired",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 38141,
   "name": "timer_state",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 38142,
   "name": "timer_graphics_on",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 38247,
   "name": "timer_graphics_off",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 38352,
   "name": "timer_picture_off",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 38652,
   "name": "timer_picture_on",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 38952,
   "name": "draw_continue_text",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39027,
   "name": "continue_count",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39028,
   "name": "briefing_done",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39029,
   "name": "continue_text",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39052,
   "name": "credits_text",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39075,
   "name": "continue_flag",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39076,
   "name": "continue_screen",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39240,
   "name": "text_shapes_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39376,
   "name": "text_shapes_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39552,
   "name": "key_code",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39553,
   "name": "read_keys",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39672,
   "name": "key_row_select",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39673,
   "name": "key_row",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39674,
   "name": "key_bits",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39675,
   "name": "key_table",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39739,
   "name": "swap_shapes",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39796,
   "name": "briefing_skip",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39797,
   "name": "briefing_index",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 39798,
   "name": "show_briefing",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 39861,
   "name": "saved_y_9bb5",
   "type": "AbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 39946,
   "name": "briefing_text",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 40194,
   "name": "level_file_tail",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 48896,
   "name": "char_colours",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 49152,
   "name": "shape_blank",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 49216,
   "name": "enemy_shapes_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 49976,
   "name": "char_shapes_text_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50112,
   "name": "char_shapes_text_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50248,
   "name": "char_shape_137",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50256,
   "name": "char_shapes_digits",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 50336,
   "name": "enemy_shapes_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 51200,
   "name": "screen_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 52216,
   "name": "sprite_pointers_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 52224,
   "name": "screen_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 53240,
   "name": "sprite_pointers_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 53248,
   "name": "play_charset_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 54272,
   "name": "play_charset_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 55232,
   "name": "play_charset_blank",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 55296,
   "name": "countdown_light_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 55424,
   "name": "pickup_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 55552,
   "name": "burst_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 55744,
   "name": "ring_shape",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 55808,
   "name": "vpatrol_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 55936,
   "name": "flash_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 56064,
   "name": "score_pickup_shape",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 56128,
   "name": "flash_hazard_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 56320,
   "name": "countdown_start_shape",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 56384,
   "name": "burst_shapes_late",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 56512,
   "name": "enemy_shot_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 56640,
   "name": "bouncer_shape",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 56704,
   "name": "blast_left_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 57024,
   "name": "blast_right_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 57344,
   "name": "player_shapes_a",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 58368,
   "name": "player_shapes_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 58624,
   "name": "climb_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 58816,
   "name": "walk_right_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 59200,
   "name": "walk_left_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 59584,
   "name": "attack_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60608,
   "name": "attack_shapes_b",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 61568,
   "name": "shapes_unreferenced",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 61760,
   "name": "banner_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 62784,
   "name": "jump_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 63168,
   "name": "object_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 63296,
   "name": "shapes_spare",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 63424,
   "name": "panel_bitmap",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 63680,
   "name": "panel_picture_0",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 63728,
   "name": "panel_bitmap_1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 63960,
   "name": "timer_cells",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64000,
   "name": "panel_picture_1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64048,
   "name": "panel_bitmap_2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64088,
   "name": "score_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64144,
   "name": "panel_bitmap_3",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64200,
   "name": "bar_chars",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64264,
   "name": "panel_bitmap_4",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64320,
   "name": "panel_picture_2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64368,
   "name": "panel_bitmap_5",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64640,
   "name": "panel_picture_3",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64688,
   "name": "panel_bitmap_6",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 64960,
   "name": "panel_picture_4",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 65008,
   "name": "panel_bitmap_7",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 65024,
   "name": "fall_shapes",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 65408,
   "name": "countdown_sprite",
   "type": "Field",
   "kind": "user"
  }
 ],
 "comments": [
  {
   "address": 2592,
   "type": "line",
   "text": "Entry of the level 4 file. Jumps to the main loop at $1E15, which runs the setup $5118 and then repeats from $1E18: the object scan $0F0F, the energy bar $7803, the countdown sprite $1D85 and its test $1E85, the banner step $771E, the score $78B7, the timer $944C and $94EC and the pause check $739B. The loop starts again at $1E15 after the continue screen, and ends through the screen wipe $93AB, the sound silence $B828 and a jump to the resident loader at $0407 (level done or the space key) or at $0404 (game over)."
  },
  {
   "address": 2603,
   "type": "line",
   "text": "Set to 1 by the NMI handler at $0A23; cleared by the setup $5118 and read by the main loop at $1E64."
  },
  {
   "address": 2604,
   "type": "line",
   "text": "6 zero bytes between nmi_flag and slot_frame ($0A2C-$0A31), no reader."
  },
  {
   "address": 2610,
   "type": "line",
   "text": "Sprite pointer value of each slot, 14 bytes ($0A32-$0A3F); written by $101C and $1C47 and by the behaviours, and copied by $6593 into the pointer tables."
  },
  {
   "address": 2624,
   "type": "line",
   "text": "Sprite colour of each slot, 14 bytes; written by $1C47 and the behaviours and copied to $D02A-$D02E by $6593."
  },
  {
   "address": 2638,
   "type": "line",
   "text": "1 when a slot's sprite is multicolour, 14 bytes; set by $1C47 and the behaviours, and copied into $D01C by $6593."
  },
  {
   "address": 2652,
   "type": "line",
   "text": "Animation counter of each slot, 14 bytes; the traced code only clears it ($73C2)."
  },
  {
   "address": 2666,
   "type": "line",
   "text": "Walk phase of each slot, 14 bytes, which picks the frame from the tables read by $1C47; cleared by $101C when it hits."
  },
  {
   "address": 2680,
   "type": "line",
   "text": "Frames left in the current walk of each slot, 14 bytes; the traced code only clears it ($73C2)."
  },
  {
   "address": 2694,
   "type": "line",
   "text": "Hurt timer of each slot, 14 bytes: set to 10 by $101C and cleared by $73C2."
  },
  {
   "address": 2708,
   "type": "line",
   "text": "State of each slot (14 bytes, of which the first 11 are used): 0 free, otherwise the type copied from $0AA2 by $0F0F; the state picks the behaviour in the table at $11F5. $101C sets 1 or 2 on a hit and $615B sets $10; 7 is handled by $1C47."
  },
  {
   "address": 2722,
   "type": "line",
   "text": "Type and state of each of the 73 objects; 0 means no object, and the value is copied into the slot state $0A94 when the object takes a slot. Copied from $78F0 by $73C2; $615B sets $10."
  },
  {
   "address": 2795,
   "type": "line",
   "text": "Counter of each object, used by the behaviours as a timer, step or saved state; copied from $7939 by $73C2, cleared by $101C on a hit, and set by $615B to the slot's old state (the entry after the object, $0AEC, is set to $FE)."
  },
  {
   "address": 2868,
   "type": "line",
   "text": "Flag of each object; copied from $7982 by $73C2 and used by the behaviours."
  },
  {
   "address": 2941,
   "type": "line",
   "text": "Energy of each object (hits it can take), counted down by $615B; copied from $79CB by $73C2."
  },
  {
   "address": 3014,
   "type": "line",
   "text": "Variant flag of each object, 0, 1 or 2 (entries $11 and $24 of the table hold 2); copied from $7A14 by $73C2 and read by about 20 behaviour routines, among them $101C, $1563, $1696, $18E0, $1C47, $53A2, $56EB and $6253."
  },
  {
   "address": 3087,
   "type": "line",
   "text": "A second flag of each object; copied from $7A5D by $73C2, and $101C sets a non-zero one to 2 when the object is hit."
  },
  {
   "address": 3160,
   "type": "line",
   "text": "Left limit of the object's walk, low byte; copied from $7AA6 by $73C2 and read by $101C."
  },
  {
   "address": 3233,
   "type": "line",
   "text": "Left limit of the object's walk, high byte; copied from $7AEF."
  },
  {
   "address": 3306,
   "type": "line",
   "text": "Right limit of the object's walk, low byte; copied from $7B38."
  },
  {
   "address": 3379,
   "type": "line",
   "text": "Right limit of the object's walk, high byte; copied from $7B81."
  },
  {
   "address": 3452,
   "type": "line",
   "text": "World X of each object, low byte; copied from $7BCA and kept up to date by the behaviours and by $101C (which also writes the entry after the hit object)."
  },
  {
   "address": 3525,
   "type": "line",
   "text": "World X of each object, high byte; copied from $7C13."
  },
  {
   "address": 3598,
   "type": "line",
   "text": "World Y of each object, low byte; copied from $7C5C."
  },
  {
   "address": 3671,
   "type": "line",
   "text": "World Y of each object, high byte; copied from $7CA5."
  },
  {
   "address": 3744,
   "type": "line",
   "text": "The object each of the slots holds (14 bytes), set by $0F0F and read by $117E and $1C47."
  },
  {
   "address": 3758,
   "type": "line",
   "text": "The slot each object holds, for the 73 objects; set by $0F0F and cleared by $73C2. $1C47 reads it one entry back ($0EAD,Y) for the slot of the previous object."
  },
  {
   "address": 3848,
   "type": "line",
   "text": "Scratch of $0F0F: the object's X minus the camera X, low byte."
  },
  {
   "address": 3849,
   "type": "line",
   "text": "Scratch of $0F0F: the object's X minus the camera X, high byte."
  },
  {
   "address": 3850,
   "type": "line",
   "text": "Scratch of $0F0F: the object's Y minus the camera Y, low byte."
  },
  {
   "address": 3851,
   "type": "line",
   "text": "Scratch of $0F0F: the object's Y minus the camera Y, high byte."
  },
  {
   "address": 3852,
   "type": "line",
   "text": "Target of the beq at $0F14 in scan_objects (an object of type 0): a short hop to $0F9D, which releases the object's slot if it holds one, because the branch cannot reach it."
  },
  {
   "address": 3855,
   "type": "line",
   "text": "Scans the 73 objects, last to first (X from $48), against the camera ($FB/$FC across, $FD/$FE down). An object with type $0AA2 of 0, or outside the window (from 26 pixels left of the camera to less than $015A right of it, and $14 to $D6 below the camera's top) is released: if it holds a slot, that slot's state $0A94 is cleared, its height $CD,X is set to $FE and the object's flag $0FC0 is cleared. An object inside the window that has no slot takes the first free slot of the 11 ($0A94 zero), which gets the object's X and Y in $79/$B1 and $95/$CD and its state from the type, and $0EA0 and $0EAE link slot and object; the whole scan ends if no slot is free. Called once per pass by the main loop at $1E1B."
  },
  {
   "address": 4019,
   "type": "line",
   "text": "Holds the object index saved by $0FA2: the immediate operand of the LDX at $0FB2."
  },
  {
   "address": 4032,
   "type": "line",
   "text": "1 for each object that holds a slot, 73 bytes; set and cleared by $0F0F and cleared by $73C2."
  },
  {
   "address": 4096,
   "type": "line",
   "text": "The last 9 entries (objects 64 to 72) of obj_active ($0FC0), after the memory-map edge at $1000."
  },
  {
   "address": 4122,
   "type": "line",
   "text": "Set to 1 by $101C when it lands a hit, which makes further calls of $101C return at once; cleared by the player state routines (for example at $5D23)."
  },
  {
   "address": 4123,
   "type": "line",
   "text": "Set to 1 by $101C on a hit, with $101A; $615B reads it to take 2 instead of 1 from the object's energy."
  },
  {
   "address": 4124,
   "type": "line",
   "text": "For slot X (object Y), tests whether the player's punch or strike hits it. It returns at once when a hit was already scored this frame ($101A or $101B set), when neither the punch timer $5B4C nor the strike timer $5ABE is running, or when the slot's state $0A94 is not 1, 2, 14 or 15; the slot's screen height $A3,X must be at most $17 lines above or 9 lines below the player's $1D81 and its screen X within 25 pixels in front of the player's $1D80, on the side given by the facing $594B. On a hit it pushes the object 9 pixels along the map in that direction unless it is already at its limit ($0CEA/$0D33 to the right, $0C58/$0CA1 to the left), copies the new X to the slot and to the next object too, sets the slot to state 1 (player facing right) or 2 (facing left) with a frame in $0A32 that depends on the variant $0BC6, starts the hurt timer $0A86 with 10, sets $101A and $101B and calls $615B. Called by $117E for every slot that is not in state 7."
  },
  {
   "address": 4463,
   "type": "line",
   "text": "Number of state 7 slots queued in $1170 by $117E."
  },
  {
   "address": 4464,
   "type": "line",
   "text": "List of the slots in state 7 found by $117E (ended by $FF), handled after the others by $1C47; cleared by $73C2."
  },
  {
   "address": 4478,
   "type": "line",
   "text": "Per-frame object update, skipped while the game is paused ($63EA). Goes through the 11 slots: a slot in state 7 is only queued in the list at $1170 (count in $116F); for the others, while the raster is above line $B4, it runs the hit test $101C and then the behaviour for the slot's state, through the table at $11F5 and a call whose operand is rewritten at $11C9/$11CA, with the slot's object in Y and in $11F4. The list is ended with $FF and each queued slot then goes through $1C47. Called by the top interrupt at $6510."
  },
  {
   "address": 4553,
   "type": "line",
   "text": "Low byte of the address in the JSR at $11C8 (high byte at $11CA), rewritten by $11BC and $11C2 with the behaviour for the slot's state from the table at $11F5; the $2B67 the file holds is only a placeholder."
  },
  {
   "address": 4590,
   "type": "line",
   "text": "Holds the queue index saved by $11DF: the immediate operand of the LDX at $11ED."
  },
  {
   "address": 4596,
   "type": "line",
   "text": "The object of the slot being handled by $117E and $1C47 (the Y register for the hit test and the behaviours)."
  },
  {
   "address": 4597,
   "type": "line",
   "text": "Table of the 27 behaviour routines, one word each, indexed by the slot state in $0A94: 0 $122B behave_free, 1 $1691 behave_walk_left, 2 $18DB behave_walk_right, 3 $1A00 behave_energy_pickup, 4 $1ABE behave_score_pickup, 5 $1B00 behave_flash_frame, 6 $1B20 behave_lobbed_shot, 7 $1C47 slot_follow, 8 $1D03 behave_none, 9 $14F2 behave_flashing_hazard, 10 $134D behave_vertical_patrol, 11 $13EF behave_radial_shot, 12 $1328 behave_colour_6, 13 $1333 behave_colour_1, 14 $17A9 behave_attack_right, 15 $155E behave_attack_left, 16 $6222 behave_knocked_down, 17 $1295 behave_enemy_shot, 18 $538F behave_none_18, 19 $5398 behave_path_follower, 20 $54B3 behave_fixed_sprite, 21 $553A behave_timed_blast, 22 $5672 behave_bouncer, 23 $573B behave_falling_object, 24 $57A6 behave_falling_burst, 25 $122C behave_countdown_start, 26 $1262 behave_countdown_light. $117E copies the word into the operand of the call at $11C8."
  },
  {
   "address": 4651,
   "type": "line",
   "text": "Behaviour for state 0 (entry 0 of the table at $11F5): a lone RTS, so a slot in state 0 does nothing."
  },
  {
   "address": 4652,
   "type": "line",
   "text": "Behaviour for state $19 (entry 25 of the table at $11F5), reached for the object of type $19 in the table at $78F0. While the countdown flag $5117 is zero it runs the contact test $52F5; on contact it sets $5117 to 1, the three countdown digits $1D82-$1D84 to 9, the banner flag $771A to 1 and the banner timer $771B to $C8. It always makes the slot multicolour ($0A4E) with colour 6 ($0A40) and sprite pointer $70 ($0A32)."
  },
  {
   "address": 4706,
   "type": "line",
   "text": "Behaviour for state $1A (entry 26 of the table at $11F5), reached for the object of type $1A in the table at $78F0. Sets sprite pointer $60, colour 1 and a single-colour sprite. While the countdown flag $5117 is non-zero it counts the slot's phase $0A6A down from $0D to 0 (restarting at $0E) and takes the pointer $61 for phases 7 and up and $60 below, so the sprite changes shape every 7 frames."
  },
  {
   "address": 4757,
   "type": "line",
   "text": "Behaviour for state $11 (entry 17 of the table at $11F5): the shot of a walking enemy, the object two entries after the one that fires it. Makes the slot multicolour with colour $0B and pointer 0 (nothing to see). While the object's counter $0AEB is zero it only copies the X of the object two before it ($0D7A, $0DC3) to this object and to the slot. The attacks $155E and $17A9 set the counter to $32; the shot then counts it down, runs the contact test $52F5 (on contact it calls $5367 and clears the counter) and moves the slot 5 pixels a frame right with pointer $73, or left with pointer $74 when $0C58 of the object is non-zero (the attacks set $0C5A for it). It clears the counter when the slot has left the screen."
  },
  {
   "address": 4904,
   "type": "line",
   "text": "Behaviour for state 12 (entry 12 of the table at $11F5): only makes the slot multicolour ($0A4E) with colour 6 ($0A40); the pointer stays as it was. No object in the table at $78F0 has type 12."
  },
  {
   "address": 4915,
   "type": "line",
   "text": "Behaviour for state 13 (entry 13 of the table at $11F5): only makes the slot multicolour ($0A4E) with colour 1 ($0A40); the pointer stays as it was. No object in the table at $78F0 has type 13."
  },
  {
   "address": 4926,
   "type": "line",
   "text": "Sprite pointers of behaviour $134D: $68 seven times and $69 eight times, indexed by the slot's $0A5C (14 down to 0), so it shows $69 for eight steps and then $68 for seven."
  },
  {
   "address": 4941,
   "type": "line",
   "text": "Behaviour for state 10 (entry 10 of the table at $11F5). Makes the slot multicolour with colour 0, counts its $0A5C down from 14 to 0 (a value of $0F or more, or 0, restarts at $0F) and takes the pointer from the table $133E by it. It then moves the slot 2 lines a frame between two heights: with the object's counter $0AEB at 0 it goes up until its Y ($95/$CD) equals the pair $0C58/$0CA1 and sets the counter to 1; with the counter at 1 it goes down until Y equals $0CEA/$0D33 and sets it to 0. The new Y is written to $0E0E/$0E57. There is no contact test."
  },
  {
   "address": 4981,
   "type": "line",
   "text": "Holds the Y register saved by $136A: the immediate operand of the LDY at $1374."
  },
  {
   "address": 5067,
   "type": "line",
   "text": "The eight steps of behaviour $13EF, 4 bytes each (X change low and high, Y change low and high, 16-bit and signed), chosen by the slot's $0A5C: up (0,-4), up and right (4,-4), right (4,0), down and right (4,4), down (0,4), down and left (-4,4), left (-4,0), up and left (-4,-4)."
  },
  {
   "address": 5099,
   "type": "line",
   "text": "The step that $13EF has chosen, copied from $13CB: X change low and high, Y change low and high, added to the slot's X ($79/$B1) and Y ($95/$CD)."
  },
  {
   "address": 5103,
   "type": "line",
   "text": "Behaviour for state 11 (entry 11 of the table at $11F5). Makes the slot multicolour with colour $0B and pointer $67 and runs the contact test $52F5: on contact it calls $5367 and restarts at $145E. Otherwise, while the object's counter $0AEB is non-zero, it counts it down and adds one of eight steps to the slot's position (the table $13CB, chosen by the slot's $0A5C, copied to $13EB-$13EE). At $145E it sets the counter to $1E, steps $0A5C on (0 to 7), puts the slot at the position of the object before this one ($0D7B, $0DC4, $0E0D, $0E56) and plays sound effect $1C through $B0EE. So it starts from the object before it every 30 frames and flies 4 pixels a frame in the next of eight directions."
  },
  {
   "address": 5182,
   "type": "line",
   "text": "Holds the Y register saved by $1416: the immediate operand of the LDY at $143D."
  },
  {
   "address": 5266,
   "type": "line",
   "text": "Holds the Y register saved by $1489: the immediate operand of the LDY at $1491."
  },
  {
   "address": 5268,
   "type": "line",
   "text": "Holds the X register saved by $1486: the immediate operand of the LDX at $1493."
  },
  {
   "address": 5270,
   "type": "line",
   "text": "The 90 sprite pointers of the flashing hazard of behaviour $14F2, indexed by the slot's counter $0A5C: $6F ten times, $6E ten times, $6D sixteen times, $6E three times and $6F three times (42 steps with a picture), then 48 zeros for which the behaviour skips the contact test. The two zero bytes after it ($14F0-$14F1) are not read."
  },
  {
   "address": 5362,
   "type": "line",
   "text": "Behaviour for state 9 (entry 9 of the table at $11F5). Makes the slot multicolour ($0A4E) with colour $0B ($0A40), counts its counter $0A5C down from $59 to 0 (a value of $5A or more, or 0, restarts it at $59) and takes the sprite pointer $0A32 from the table $1496 by that counter, so the hazard shows for 42 of every 90 steps. When the pointer is not zero it runs the contact test $52F5, and when that returns non-zero it calls $5367 to hurt the player. It does not move the slot."
  },
  {
   "address": 5402,
   "type": "line",
   "text": "Holds the Y register saved by $150F: the immediate operand of the LDY at $1519, which gives Y back after the table lookup."
  },
  {
   "address": 5419,
   "type": "line",
   "text": "Returns A=1 when slot X is at or to the right of the player on the screen (its screen X high byte $BF,X is non-zero, or its screen X $87,X is not below the player's $1D80) and A=0 when it is to the left. Called by the behaviours of states 1 and 2 ($1758, $19A1)."
  },
  {
   "address": 5436,
   "type": "line",
   "text": "Returns A=0 when slot X is about level with the player and A=1 when it is not: the slot's screen height $A3,X is compared with the player's $1D81, and the answer is 0 when they are equal, when the slot is less than 10 lines above the player and when it is less than $1C lines below him. Called by the behaviours of states 1, 2 and 15 ($15E5, $16C3, $1830, $190D)."
  },
  {
   "address": 5469,
   "type": "line",
   "text": "Hit recoil counter, counted down by $62BF; while it is running (and $5365 is zero) the joystick bytes $1EC5/$1EC6 are not refreshed, so the direction that an attack forced stays. $5367 sets it to 3 and the attacks $155E and $17A9 (at $160B and $1855) to 4; the top interrupt $6428 keeps the player's sprites 0 and 1 white while it is non-zero."
  },
  {
   "address": 5470,
   "type": "line",
   "text": "Behaviour for state 15 (entry 15 of the table at $11F5): the attack of a walking enemy that faces left, entered from $1691 with the object's counter $0AEB at $19. It makes the slot multicolour and, by the variant $0BC6, writes the frames and distances into six operands of its own code ($15BD, $15C5, $15D4, $15DC, $1638, $164C; variant 1 in brackets). At counter 0 it returns to state 1. Counting down: at 4 frame 5 ($14) and 8 (6) pixels right; at $0E frame 7 ($17) and 6 pixels left, and if the player is level ($153C) and up to 27 pixels left of the slot it forces the joystick left ($1EC5), sets the recoil $155D to 4 and calls $5374; if the object's flag $0B34 is set it clears it and starts the shot two objects on (counter $32, X of the slot, direction $0C5A set to 1); at $12 it moves 2 (0) pixels left and sets the phase $0A6A to 2; at $18 it takes frame 5 ($16)."
  },
  {
   "address": 5565,
   "type": "line",
   "text": "Frame (sprite pointer) that $155E gives the slot when its counter reaches 4: the operand of the LDA at $15BC, set to 5 or, for variant 1, $14 at $156A and $158B."
  },
  {
   "address": 5573,
   "type": "line",
   "text": "Distance in pixels that $155E moves the slot right when its counter reaches 4: the operand of the ADC at $15C4, set to 8 or, for variant 1, 6 at $156F and $1590."
  },
  {
   "address": 5588,
   "type": "line",
   "text": "Frame (sprite pointer) that $155E gives the slot when its counter reaches $0E: the operand of the LDA at $15D3, set to 7 or, for variant 1, $17 at $1574 and $1595."
  },
  {
   "address": 5596,
   "type": "line",
   "text": "Distance in pixels that $155E moves the slot left when its counter reaches $0E: the operand of the SBC at $15DB, set to 6 for both variants at $1579 and $159A."
  },
  {
   "address": 5688,
   "type": "line",
   "text": "Distance in pixels that $155E moves the slot left when its counter reaches $12: the operand of the SBC at $1637, set to 2 or, for variant 1, 0 at $157E and $159F."
  },
  {
   "address": 5708,
   "type": "line",
   "text": "Frame (sprite pointer) that $155E gives the slot when its counter reaches $18: the operand of the LDA at $164B, set to 5 or, for variant 1, $16 at $1583 and $15A4."
  },
  {
   "address": 5713,
   "type": "line",
   "text": "Sprite pointers of the walk to the left for variant 0: $05 eight times, $06 eight times, and the same again, indexed by the phase $0A6A (0 to $1F); read by behaviour $1691."
  },
  {
   "address": 5745,
   "type": "line",
   "text": "Sprite pointers of the walk to the left for variant 1: $14 eight times, $15 eight times, and the same again, indexed by the phase $0A6A (0 to $1F); read by behaviour $1691."
  },
  {
   "address": 5777,
   "type": "line",
   "text": "Behaviour for state 1 (entry 1 of the table at $11F5): an enemy walking left. Makes the slot multicolour with colour 0. When the object's second flag $0C0F is neither 0 nor 2 it only shows the standing frame $05 ($14 for variant 1). Otherwise, with $0A10 zero and the player level ($153C) and up to 26 pixels left of the slot, it starts the attack: state 15 with the counter $0AEB at $19. While the hurt timer $0A86 runs it only counts it down. If the object two on has type $11 and an idle counter ($0AED), the slot is on screen at a height of $64 to $BD and a random byte ($653D) is below $14, it sets the flag $0B34 and attacks too. At its left limit ($0C58/$0CA1) it turns to state 2 (slot and object type). When the walk counter $0A78 has run out it takes half a random byte and turns when the slot is left of the player ($152B); otherwise it moves 1 pixel left (X $79/$B1, also written to this object and the next) and steps the phase $0A6A through 0 to $1F, taking the frame from $1651 (variant 0) or $1671."
  },
  {
   "address": 6057,
   "type": "line",
   "text": "Behaviour for state 14 (entry 14 of the table at $11F5): the attack of a walking enemy that faces right, entered from $18DB with the object's counter $0AEB at $19. The same as $155E the other way round: it writes frames and distances into six operands of its own code ($1808, $1810, $181F, $1827, $1882, $1896; variant 1 in brackets) and at counter 0 returns to state 2. At 4 frame 2 ($10) and 8 (6) pixels left; at $0E frame 4 ($13) and 6 pixels right, and if the player is level and up to 27 pixels right of the slot it forces the joystick right, sets the recoil $155D to 4 and calls $5374; a set flag $0B34 starts the shot two objects on with direction 0; at $12 it moves 2 (0) pixels right and sets the phase $0A6A to 2; at $18 it takes frame 2 ($12)."
  },
  {
   "address": 6152,
   "type": "line",
   "text": "Frame (sprite pointer) that $17A9 gives the slot when its counter reaches 4: the operand of the LDA at $1807, set to 2 or, for variant 1, $10 at $17B5 and $17D6."
  },
  {
   "address": 6160,
   "type": "line",
   "text": "Distance in pixels that $17A9 moves the slot left when its counter reaches 4: the operand of the SBC at $180F, set to 8 or, for variant 1, 6 at $17BA and $17DB."
  },
  {
   "address": 6175,
   "type": "line",
   "text": "Frame (sprite pointer) that $17A9 gives the slot when its counter reaches $0E: the operand of the LDA at $181E, set to 4 or, for variant 1, $13 at $17BF and $17E0."
  },
  {
   "address": 6183,
   "type": "line",
   "text": "Distance in pixels that $17A9 moves the slot right when its counter reaches $0E: the operand of the ADC at $1826, set to 6 for both variants at $17C4 and $17E5."
  },
  {
   "address": 6274,
   "type": "line",
   "text": "Distance in pixels that $17A9 moves the slot right when its counter reaches $12: the operand of the ADC at $1881, set to 2 or, for variant 1, 0 at $17C9 and $17EA."
  },
  {
   "address": 6294,
   "type": "line",
   "text": "Frame (sprite pointer) that $17A9 gives the slot when its counter reaches $18: the operand of the LDA at $1895, set to 2 or, for variant 1, $12 at $17CE and $17EF."
  },
  {
   "address": 6299,
   "type": "line",
   "text": "Sprite pointers of the walk to the right for variant 0: $02 eight times, $03 eight times, and the same again, indexed by the phase $0A6A (0 to $1F); read by behaviour $18DB."
  },
  {
   "address": 6331,
   "type": "line",
   "text": "Sprite pointers of the walk to the right for variant 1: $10 eight times, $11 eight times, and the same again, indexed by the phase $0A6A (0 to $1F); read by behaviour $18DB."
  },
  {
   "address": 6363,
   "type": "line",
   "text": "Behaviour for state 2 (entry 2 of the table at $11F5): an enemy walking right, the mirror of $1691. Makes the slot multicolour with colour 0; with the object's second flag $0C0F neither 0 nor 2 it only shows the standing frame $02 ($10 for variant 1). With $0A10 zero and the player level ($153C) and up to 26 pixels right of the slot it starts the attack: state 14 with the counter $0AEB at $19; the same random shot test as $1691 can start it too. At its right limit ($0CEA/$0D33) it turns to state 1. When the walk counter $0A78 has run out it takes half a random byte and turns when the slot is right of the player ($152B); otherwise it moves 1 pixel right and steps the phase $0A6A through 0 to $1F, taking the frame from $189B (variant 0) or $18BB."
  },
  {
   "address": 6642,
   "type": "line",
   "text": "Sprite pointers of behaviour $1A00: $62 seven times and $63 seven times, indexed by the slot's $0A5C (11 down to 0); the last two bytes are never read."
  },
  {
   "address": 6656,
   "type": "line",
   "text": "Behaviour for state 3 (entry 3 of the table at $11F5): a pickup that gives energy. Makes the slot multicolour with colour 2. When the object's energy $0B7D is non-zero (taken) the pointer is 0 and nothing else happens. Otherwise the pointer comes from $19F2 by the slot's $0A5C (11 down to 0) and the slot bobs: the object's counter $0AEB steps by 2 round the 24 heights of $1A8E, which are added to its Y and written to $0E0E/$0E57. On contact ($52F5) it sets the object's energy to 1, adds $18 to the player's energy $5366 (at most $21) and plays sound effect $10."
  },
  {
   "address": 6712,
   "type": "line",
   "text": "Holds the Y register saved by $1A2D: the immediate operand of the LDY at $1A37."
  },
  {
   "address": 6794,
   "type": "line",
   "text": "Holds the Y register saved by $1A81: the immediate operand of the LDY at $1A89."
  },
  {
   "address": 6796,
   "type": "line",
   "text": "Holds the X register saved by $1A7E: the immediate operand of the LDX at $1A8B."
  },
  {
   "address": 6798,
   "type": "line",
   "text": "The 24 heights of the bobbing of behaviour $1A00, signed 16-bit values added to the slot's Y each frame, chosen by the object's counter $0AEB (steps of 2): 0, 0, -1, -1, -2, -2, -3, -3, -2, -2, -1, -1 and the same with the opposite signs, so the pickup rises 18 lines and comes back."
  },
  {
   "address": 6846,
   "type": "line",
   "text": "Behaviour for state 4 (entry 4 of the table at $11F5): a pickup that gives points. Makes the slot multicolour with colour 3. When the object's energy $0B7D is non-zero (taken) the pointer is 0; otherwise it is $6C and the contact test $52F5 runs: on contact the object's energy becomes 1, 6 is added to score digit 4 through $788B (600 points, going by the digit positions described there) and sound effect $0C plays."
  },
  {
   "address": 6895,
   "type": "line",
   "text": "Holds the X register saved by $1AE4: the immediate operand of the LDX at $1AEE."
  },
  {
   "address": 6908,
   "type": "line",
   "text": "Holds the Y register saved by $1AF3: the immediate operand of the LDY at $1AFB."
  },
  {
   "address": 6910,
   "type": "line",
   "text": "Holds the X register saved by $1AF0: the immediate operand of the LDX at $1AFD."
  },
  {
   "address": 6912,
   "type": "line",
   "text": "Behaviour for state 5 (entry 5 of the table at $11F5). Makes the slot multicolour with colour 9; while the object's counter $0AEB is non-zero it counts it down and shows pointer $6B, otherwise pointer $6A. This routine never sets the counter; in the object list the type 5 object stands directly before the type 6 object, whose behaviour $1B20 sets the counter of the object before it to 7 when it restarts."
  },
  {
   "address": 6944,
   "type": "line",
   "text": "Behaviour for state 6 (entry 6 of the table at $11F5). Makes the slot multicolour and runs the contact test $52F5: on contact it calls $5367 and restarts at $1B96. Otherwise colour 2 and pointer $67; the object's counter $0AEB, stepped each frame, runs through the table $1BDA: from 4 to $33 the slot moves 4 pixels left, and each table value of $5A or more is a sprite pointer while a smaller one is added to the slot's Y (written to the object too). At $6A, or on contact, $1B96 clears the counter, sets the counter of the object before it ($0AEA) to 7, puts the slot and the object $16 pixels left of and 1 line above that object and plays sound effect $14."
  },
  {
   "address": 7126,
   "type": "line",
   "text": "Holds the Y register saved by $1BCD: the immediate operand of the LDY at $1BD5."
  },
  {
   "address": 7128,
   "type": "line",
   "text": "Holds the X register saved by $1BCA: the immediate operand of the LDX at $1BD7."
  },
  {
   "address": 7130,
   "type": "line",
   "text": "106 bytes read by behaviour $1B20, indexed by its counter $0AEB after the step, and by $57A6 from $1C0E. A value of $5A or more is a sprite pointer, a smaller one a number of lines added to the slot's Y. Indexes 0 to 3: pointers $7B, $7C, $7B, $7C; 4 to 13: 0; 14 to 51: 0 to 5 lines, growing; 52 to 105: the burst frames $72 (6), $71 (6), $64 (5), $65 (5), $66 (5), $64 (5), $65 (5), $66 (5), $71 (6), $72 (6)."
  },
  {
   "address": 7236,
   "type": "line",
   "text": "The frame limit that $1C47 compares the previous slot's frame with: 5, or $14 for variant $0BC6 non-zero."
  },
  {
   "address": 7237,
   "type": "line",
   "text": "One zero byte between follow_limit and follow_slot ($1C45), no reader."
  },
  {
   "address": 7238,
   "type": "line",
   "text": "The slot of the previous object, saved by $1C47 while it reads the object's variant."
  },
  {
   "address": 7239,
   "type": "line",
   "text": "Behaviour for a slot in state 7 (entry 7 of the table at $11F5), run by $117E after the other slots. Makes the slot multicolour ($0A4E) with colour 0 ($0A40) and copies the object's position ($0D7C/$0DC5) to the slot ($79/$B1). It then picks the sprite pointer $0A32 from the slot of the previous object ($0EAD,Y): from $61C8 or $6204 by that slot's phase $0A6A when it is in state $10, otherwise from $1CE3 when its frame is below the limit in $1C44 (5, or $14 for variant $0BC6 non-zero) and from $1CC3 when not. Probably the lower sprite of a two-sprite enemy that follows the upper one."
  },
  {
   "address": 7363,
   "type": "line",
   "text": "Frames $0C to $0F, eight each, indexed by the phase $0A6A of the previous slot: the sprite pointer $1C47 gives a state 7 slot when the previous slot's frame is not below the limit $1C44."
  },
  {
   "address": 7395,
   "type": "line",
   "text": "Frames $08 to $0B, eight each, indexed by the phase $0A6A of the previous slot: the sprite pointer $1C47 gives a state 7 slot when the previous slot's frame is below the limit $1C44."
  },
  {
   "address": 7427,
   "type": "line",
   "text": "Behaviour for state 8 (entry 8 of the table at $11F5): a lone RTS, so a slot in state 8 does nothing."
  },
  {
   "address": 7428,
   "type": "line",
   "text": "Low byte of the 16-bit sum camera X ($FB) minus $86 plus the player's screen X ($1D80), stored by $1D06 before it divides the sum by 16; the player state routines read it ($5A36 and others)."
  },
  {
   "address": 7429,
   "type": "line",
   "text": "High byte of the sum whose low byte is $1D04, stored by $1D06 before the division; the player state routines read it ($5A31 and others)."
  },
  {
   "address": 7430,
   "type": "line",
   "text": "Finds the player's place in the level map for the player state routines ($5A01, $5A7B, $5BF3, $5C04, $5D83, $5DB0, $5E5F, $5EEA, $5FF3). Y becomes the map column: (camera X $FB/$FC minus $86 plus the player's X $1D80) divided by 16, minus 1; the sum before the division is left in $1D04/$1D05. X becomes twice the map row: (camera Y $FD/$FE minus $AE plus the player's Y $1D81) divided by 8, with bit 0 cleared; it picks a word in the table at $7297, which is stored in $E9/$EA as the address of that row of the map. Uses $58E0/$58E1 as scratch."
  },
  {
   "address": 7552,
   "type": "line",
   "text": "The player's screen X (sprite coordinates), $A4 at the start; sprites 0, 1 and 2 are placed at this X by $6428, and the scroll routines (for example $1FE9) change it."
  },
  {
   "address": 7553,
   "type": "line",
   "text": "The player's screen Y, $6B at the start; sprites 0 and 2 are placed at it and sprite 1 21 lines below."
  },
  {
   "address": 7554,
   "type": "line",
   "text": "The three digits of the countdown, $1D82 the units, $1D83 the tens and $1D84 the hundreds; counted down by $7441 and shown as sprite 3 by $1D85."
  },
  {
   "address": 7557,
   "type": "line",
   "text": "Draws the three countdown digits into the sprite shape at $FF80: the digit $1D84 into the byte column at $FF80, $1D83 at $FF81 and $1D82 at $FF82, each through $1DAD. Sprite 3 shows this shape (pointer $FE, set by the top interrupt $6428 in $CFFB and $CBFB). Called by the main loop at $1E21."
  },
  {
   "address": 7597,
   "type": "line",
   "text": "Copies the shape of the digit $1D82+X into one byte column of a sprite: the 8 bytes of the digit from the shapes at $1DC4 go to the address in $85/$86 and the following addresses 3 bytes apart (the 8 rows of the 3-byte-wide sprite). Called three times by $1D85."
  },
  {
   "address": 7620,
   "type": "line",
   "text": "Shapes of the digits 0 to 9, 8 bytes each; $78CA, $9474 and $1DAD copy them to the panel and the countdown sprite, and $9B3B swaps them with the block at $C450."
  },
  {
   "address": 7700,
   "type": "line",
   "text": "Frames left before $7441 counts the countdown down again; reloaded with 6."
  },
  {
   "address": 7701,
   "type": "line",
   "text": "The level's main loop. It runs the setup $5118, then from $1E18 on every pass the disabled check $655D, the object scan $0F0F, the energy bar $7803, the countdown sprite $1D85 and test $1E85, the banner step $771E, the score $78B7, the timer $944C and its expiry $94EC and the pause check $739B. It then ends the level when $0A11 is set and the key code $9A80 is $20; when the energy $5366 is zero (and $0A11 is clear) it shows the game over screen $57FF and, when $0A12 is set, the continue screen $98A4, which sends the loop back to $1E15 if fire was pressed ($98A3); when the level-done flag $1EC1 is set it ends the level, and when the NMI flag $0A2B is set it shows the game over screen and leaves. It leaves through the screen wipe $93AB, SEI, the sound silence $B828 and a jump to the resident loader at $0407 (level done or space key) or $0404 (game over)."
  },
  {
   "address": 7811,
   "type": "line",
   "text": "Low byte of the camera height $FD plus the player's screen height $1D81, worked out by $1E85."
  },
  {
   "address": 7812,
   "type": "line",
   "text": "High byte of the sum in $1E83, worked out by $1E85."
  },
  {
   "address": 7813,
   "type": "line",
   "text": "Returns at once when the countdown flag $5117 is zero. If the three countdown digits $1D82-$1D84 are all zero it clears the energy $5366, which ends the game; otherwise it adds the player's screen height $1D81 to the camera height $FD/$FE (result in $1E83/$1E84) and sets the level-done flag $1EC1 to 1 when the sum is $00FA to $00FF. Called by the main loop at $1E24."
  },
  {
   "address": 7873,
   "type": "line",
   "text": "Set to 1 by $1E85 when the sum of camera and player height is $00FA to $00FF; the main loop at $1E5F then ends the level. Cleared by the setup."
  },
  {
   "address": 7874,
   "type": "line",
   "text": "Horizontal fine scroll (6 at the start), ORed into the low bits of $D016 by the top interrupt $6428."
  },
  {
   "address": 7875,
   "type": "line",
   "text": "Vertical fine scroll (6 at the start), ORed into $D011 by the top interrupt $6428."
  },
  {
   "address": 7876,
   "type": "line",
   "text": "One zero byte between scroll_y_fine and joystick ($1EC4), no reader."
  },
  {
   "address": 7877,
   "type": "line",
   "text": "Joystick port 2 ($DC00) as last read by $62BF; bit 0 up, 1 down, 2 left, 3 right, 4 fire, clear when pressed. $FF at the start."
  },
  {
   "address": 7878,
   "type": "line",
   "text": "CIA 1 port B ($DC01) as last read by $62BF."
  },
  {
   "address": 7879,
   "type": "line",
   "text": "Cleared by the setup $5118 (at $51A9); nothing else in the traced code reads or writes it."
  },
  {
   "address": 7880,
   "type": "line",
   "text": "Which of the two screen matrices is on show: 0 selects $CC00 and 1 selects $C800 (through $62A9); the scroll routines build the other one and flip this at the end."
  },
  {
   "address": 7881,
   "type": "line",
   "text": "The camera's height, low byte, saved by $1ECD before a scroll step."
  },
  {
   "address": 7882,
   "type": "line",
   "text": "The camera's height, high byte, saved by $1ECD before a scroll step."
  },
  {
   "address": 7883,
   "type": "line",
   "text": "The camera's X, low byte, saved by $1ECD before a scroll step."
  },
  {
   "address": 7884,
   "type": "line",
   "text": "The camera's X, high byte, saved by $1ECD before a scroll step."
  },
  {
   "address": 7885,
   "type": "line",
   "text": "Called by the bottom interrupt $638F unless $771A is set. While the game is paused it only reads the keyboard through $9A81 into $9A80. Otherwise it saves the camera ($FB-$FE) in $1ECB/$1ECC and $1EC9/$1ECA and the player's screen position in $58B5/$58B6, then either goes on with the scroll in $1F8F for the steps left in $1F90, or picks a new direction from the player's screen position: right at X $DC or more, left below $64, up above Y $41 and down at $87 or more (corners combine them), stores it in $1F8F, sets $1F90 to $0B and clears $1F91 and $2DE5. The scroll routine for the direction comes from the table at $1F96 through a call whose operand is rewritten at $1F85/$1F86; a frame with no scroll to make reads the keyboard instead."
  },
  {
   "address": 8069,
   "type": "line",
   "text": "Low byte of the address in the JSR at $1F84 (high byte at $1F86), rewritten by $1F7B and $1F81 with the scroll routine from the table at $1F96; the $2B67 the file holds is only a placeholder."
  },
  {
   "address": 8079,
   "type": "line",
   "text": "Scroll direction chosen by $1ECD (0 none, 1 down, 2 up, 4 right, 5 right and down, 6 right and up, 8 left, 9 left and down, 10 left and up)."
  },
  {
   "address": 8080,
   "type": "line",
   "text": "Frames of scrolling still to run for the direction in $1F8F; set to $0B when a scroll starts and counted down by $1ECD."
  },
  {
   "address": 8081,
   "type": "line",
   "text": "Phase 0 to 3 of the scroll step, advanced by $1ECD each frame; picks which part of the screen shift the scroll routines do."
  },
  {
   "address": 8082,
   "type": "line",
   "text": "2 zero bytes between scroll_phase and scroll_spare_a ($1F92-$1F93), no reader."
  },
  {
   "address": 8084,
   "type": "line",
   "text": "Cleared by the setup $5118 (at $51F8 and $52BC); nothing else in the traced code reads or writes it."
  },
  {
   "address": 8085,
   "type": "line",
   "text": "Cleared by the setup $5118 (at $51FB and $52BF), next to scroll_spare_a; nothing else in the traced code reads or writes it."
  },
  {
   "address": 8086,
   "type": "line",
   "text": "Table of 16 routine addresses indexed by the scroll direction in $1F8F times 2: 1 down $2547 (scroll_down), 2 up $28E0 (scroll_up), 4 right $1FE9 (scroll_right), 5 right and down $315D (scroll_right_down), 6 right and up $2C35 (scroll_right_up), 8 left $333F (scroll_left), 9 left and down $2FAD (scroll_left_down), 10 left and up $2DE6 (scroll_left_up); the other entries point at an RTS ($1FB6, scroll_none). $1ECD copies the word into the operand of the call at $1F84."
  },
  {
   "address": 8118,
   "type": "line",
   "text": "A lone RTS: the routine that the entries of the scroll table at $1F96 for the directions without a scroll (0, 3, 7 and the unused ones) point at."
  },
  {
   "address": 8119,
   "type": "line",
   "text": "The fine horizontal scroll values for the four phases of a scroll to the right: 4, 2, 0, 6 (read by $1FBB)."
  },
  {
   "address": 8123,
   "type": "line",
   "text": "Sets the fine horizontal scroll $1EC2 from the table at $1FB7 (4, 2, 0, 6) for the phase in $1F91 and returns the phase in Y. When $1EC2 already holds that value, or when 10 or more steps are left ($1F90) and $1EC2 is 0, it restores the camera X ($FB/$FC) from $1ECB/$1ECC and the player's X $1D80 from $58B5 instead, so that step does not move the view. Called by $1FE9, $2C35 and $318C."
  },
  {
   "address": 8169,
   "type": "line",
   "text": "Scroll direction 4, view to the right (entry 4 of the table at $1F96). Moves the camera X ($FB/$FC) on 2 and the player's screen X $1D80 back 2, takes the fine scroll from $1FBB and runs the work of the phase it returns: phase 0 shifts the left columns of the screen one character left ($2038), 1 shifts the rest and draws the new right column ($2053), 2 builds the colours ($201E), 3 copies the colours to colour RAM and flips the buffers ($2029)."
  },
  {
   "address": 8222,
   "type": "line",
   "text": "Phase 2 of a scroll to the right: jumps to $44BF when the buffer flag $1EC8 is 0 and to $3867 when it is 1. Both build the colour buffer $70B7-$721D (screen rows 10 to 18) from the matrix just made (from $C990 or $CD90 on) through the character colours at $BF00, and return to the caller of $201E."
  },
  {
   "address": 8233,
   "type": "line",
   "text": "Phase 3 of a scroll to the right: $6FF4 fills colour RAM for screen rows 0 to 9 from the matrix just made, $679D copies the buffer's rows 10 to 12 to colour RAM from $D990 and sets $679C so that the interrupt copies rows 13 to 18 ($6A61), then the buffer flag $1EC8 is flipped so that the new matrix is shown."
  },
  {
   "address": 8248,
   "type": "line",
   "text": "Phase 0 of a scroll to the right: shifts columns 0 to $13 of the screen one character left into the other matrix, with $2074 (into $C800) when the buffer flag $1EC8 is 0 and $20EC (into $CC00) when it is 1. It first stores the loop limit $14 in the operand $20E8 or $2160."
  },
  {
   "address": 8275,
   "type": "line",
   "text": "Phase 1 of a scroll to the right: shifts columns $14 to $25 one character left into the other matrix ($2074 for $C800 when $1EC8 is 0, $20EC for $CC00 when it is 1, with the loop limit $26 stored in $20E8 or $2160) and then draws the new right column with $2164."
  },
  {
   "address": 8308,
   "type": "line",
   "text": "Copies the matrix at $CC00 one character to the left into $C800, 19 rows of 40, for the columns from Y up to the limit in the operand at $20E8: each pass copies column Y+1 of every row to column Y."
  },
  {
   "address": 8424,
   "type": "line",
   "text": "The loop limit of $2074: the operand of the CPY at $20E7 (the file holds $26). $2038 stores $14 here and $2053 stores $26."
  },
  {
   "address": 8428,
   "type": "line",
   "text": "Copies the matrix at $C800 one character to the left into $CC00, 19 rows of 40, for the columns from Y up to the limit in the operand at $2160."
  },
  {
   "address": 8544,
   "type": "line",
   "text": "The loop limit of $20EC: the operand of the CPY at $215F (the file holds $26). $2038 stores $14 here and $2053 stores $26."
  },
  {
   "address": 8548,
   "type": "line",
   "text": "Draws the new right-hand column (column $26, 19 rows) of the matrix that is being made ($C800 when $1EC8 is 0, otherwise $CC00) from the level map. It reads 10 tiles down from the map pointer $A1/$A2 plus 20 columns, each as a two by two block through the tables $90BE (top row) and $915C (bottom row), taking the left or right character by the half-column flag $AF; when the half-row flag $BD is non-zero it starts with the bottom row of the first tile. Unless $2DE5 is set it then steps $AF on, adding 1 to the map pointer when it wraps."
  },
  {
   "address": 9468,
   "type": "line",
   "text": "Steps the half-column flag $AF on by one and, when it reaches 2, sets it to 0 and adds 1 to the map pointer $A1/$A2 (one tile to the right). Called by the diagonal scrolls to the right ($2CD2, $2CF4, $31FA, $321C)."
  },
  {
   "address": 9493,
   "type": "line",
   "text": "The fine vertical scroll values for the four phases of a scroll downwards: 4, 2, 0, 6 (read by $2519)."
  },
  {
   "address": 9497,
   "type": "line",
   "text": "Sets the fine vertical scroll $1EC3 from the table at $2515 (4, 2, 0, 6) for the phase in $1F91 and returns the phase in Y. When $1EC3 already holds that value, or when 10 or more steps are left ($1F90) and $1EC3 is 0, it restores the camera Y ($FD/$FE) from $1EC9/$1ECA and the player's Y $1D81 from $58B6 instead. Called by $2547 and the diagonal scrolls that move down ($2FD9, $3189)."
  },
  {
   "address": 9543,
   "type": "line",
   "text": "Scroll direction 1, view downwards (entry 1 of the table at $1F96). Moves the camera Y ($FD/$FE) on 2 and the player's screen Y $1D81 back 2, takes the fine scroll from $2519 and runs the phase's work: 0 shifts columns 0 to $10 up a row and draws the new bottom row ($25B2), 1 shifts columns $11 to $26 ($2597), 2 builds the colours ($257D), 3 copies the colours and flips the buffers ($2588)."
  },
  {
   "address": 9597,
   "type": "line",
   "text": "Phase 2 of a scroll downwards: jumps to $44BF when the buffer flag $1EC8 is 0 and to $3867 when it is 1, which build the colour buffer $70B7-$721D from the matrix just made (the same as $201E)."
  },
  {
   "address": 9608,
   "type": "line",
   "text": "Phase 3 of a scroll downwards: fills colour RAM rows 0 to 9 ($6FF4), copies rows 10 to 12 of the colour buffer and asks the interrupt for rows 13 to 18 ($679D), then flips the buffer flag $1EC8 (the same as $2029)."
  },
  {
   "address": 9623,
   "type": "line",
   "text": "Phase 1 of a scroll downwards: shifts columns $26 down to $11 of the screen up one row into the other matrix, with $25D3 (into $C800) when $1EC8 is 0 and $2645 (into $CC00) when it is 1. It first stores the loop limit $10 in the operand $2641 or $26B3."
  },
  {
   "address": 9650,
   "type": "line",
   "text": "Phase 0 of a scroll downwards: shifts columns $10 down to 0 up one row into the other matrix ($25D3 into $C800 when $1EC8 is 0, $2645 into $CC00 when it is 1, with the loop limit $FF stored in $2641 or $26B3) and then draws the new bottom row into it ($27A6 for $C800, $26B7 for $CC00)."
  },
  {
   "address": 9683,
   "type": "line",
   "text": "Copies the matrix at $CC00 up one row into $C800, 19 rows, for the columns from Y down to the limit in the operand at $2641: row 0 of the column comes from row 1, and so on to row 17 from row 18."
  },
  {
   "address": 9793,
   "type": "line",
   "text": "The loop limit of $25D3: the operand of the CPY at $2640 (the file holds $FF). $25B2 stores $FF here and $2597 stores $10."
  },
  {
   "address": 9797,
   "type": "line",
   "text": "Copies the matrix at $C800 up one row into $CC00, 19 rows, for the columns from Y down to the limit in the operand at $26B3."
  },
  {
   "address": 9907,
   "type": "line",
   "text": "The loop limit of $2645: the operand of the CPY at $26B2 (the file holds $FF). $25B2 stores $FF here and $2597 stores $10."
  },
  {
   "address": 9911,
   "type": "line",
   "text": "Draws the new bottom row (row 18) of tiles from the level map into the matrix at $CC00. The map position is the pointer $A1/$A2 plus $0280 (ten tile rows), plus 1 when the half-column flag $AF plus 1 reaches 2, stored in $93/$94; $2A51 gets that half-column state and $2A50 the half-row state $BD minus 1 (1, with the position moved 64 tiles back, when that is negative). $2A50 picks the character table $90BE (0) or $915C, whose address is stored in the operands of the five loads below ($272E, $2735, $2766, $2776, $277D and the byte after each). It writes 40 characters from $CED0, or 39 when $2A51 is 1 (the second character of the first tile first). Unless $2DE5 is set it then steps $BD on, adding $40 to the map pointer when it wraps."
  },
  {
   "address": 10030,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $272D (high byte at $272F), rewritten by $26B7 ($26F4-$271C) with $90BE or $915C."
  },
  {
   "address": 10037,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2734 (high byte at $2736), rewritten by $26B7 ($26F4-$271C) with $90BE or $915C."
  },
  {
   "address": 10086,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2765 (high byte at $2767), rewritten by $26B7 ($26F4-$271C) with $90BE or $915C."
  },
  {
   "address": 10102,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2775 (high byte at $2777), rewritten by $26B7 ($26F4-$271C) with $90BE or $915C."
  },
  {
   "address": 10109,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $277C (high byte at $277E), rewritten by $26B7 ($26F4-$271C) with $90BE or $915C."
  },
  {
   "address": 10150,
   "type": "line",
   "text": "The same as $26B7 for the matrix at $C800: draws the new bottom row from $CAD0, and its table address operands are $281D, $2824, $2855, $2865 and $286C."
  },
  {
   "address": 10269,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $281C (high byte at $281E), rewritten by $27A6 ($27E3-$280B) with $90BE or $915C."
  },
  {
   "address": 10276,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2823 (high byte at $2825), rewritten by $27A6 ($27E3-$280B) with $90BE or $915C."
  },
  {
   "address": 10325,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2854 (high byte at $2856), rewritten by $27A6 ($27E3-$280B) with $90BE or $915C."
  },
  {
   "address": 10341,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2864 (high byte at $2866), rewritten by $27A6 ($27E3-$280B) with $90BE or $915C."
  },
  {
   "address": 10348,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $286B (high byte at $286D), rewritten by $27A6 ($27E3-$280B) with $90BE or $915C."
  },
  {
   "address": 10389,
   "type": "line",
   "text": "Steps the half-row flag $BD on by one and, when it reaches 2, sets it to 0 and adds $40 to the map pointer $A1/$A2 (one row of 64 tiles down). Called by the diagonal scrolls ($2CD5, $2CF7, $2E86, $2EA8 and others)."
  },
  {
   "address": 10414,
   "type": "line",
   "text": "The fine vertical scroll values for the four phases of a scroll upwards: 2, 4, 6, 0 (read by $28B2)."
  },
  {
   "address": 10418,
   "type": "line",
   "text": "Sets the fine vertical scroll $1EC3 from the table at $28AE (2, 4, 6, 0) for the phase in $1F91 and returns the phase in Y. When $1EC3 already holds that value, or when 10 or more steps are left ($1F90) and $1EC3 is 6, it restores the camera Y ($FD/$FE) from $1EC9/$1ECA and the player's Y $1D81 from $58B6 instead. Called by $28E0, $2C35 and $2DE6."
  },
  {
   "address": 10464,
   "type": "line",
   "text": "Scroll direction 2, view upwards (entry 2 of the table at $1F96). Moves the camera Y ($FD/$FE) back 2 and the player's screen Y $1D81 on 2, takes the fine scroll from $28B2 and runs the phase's work: 0 shifts columns 0 to $10 down a row and draws the new top row ($294B), 1 shifts columns $11 to $26 ($2930), 2 builds the colours ($2916), 3 copies the colours and flips the buffers ($2921)."
  },
  {
   "address": 10518,
   "type": "line",
   "text": "Phase 2 of a scroll upwards: jumps to $44BF when the buffer flag $1EC8 is 0 and to $3867 when it is 1, which build the colour buffer $70B7-$721D from the matrix just made (the same as $201E)."
  },
  {
   "address": 10529,
   "type": "line",
   "text": "Phase 3 of a scroll upwards: fills colour RAM rows 0 to 9 ($6FF4), copies rows 10 to 12 of the colour buffer and asks the interrupt for rows 13 to 18 ($679D), then flips the buffer flag $1EC8 (the same as $2029)."
  },
  {
   "address": 10544,
   "type": "line",
   "text": "Phase 1 of a scroll upwards: shifts columns $26 down to $11 of the screen down one row into the other matrix, with $296C (into $C800) when $1EC8 is 0 and $29DE (into $CC00) when it is 1. It first stores the loop limit $10 in the operand $29DA or $2A4C."
  },
  {
   "address": 10571,
   "type": "line",
   "text": "Phase 0 of a scroll upwards: shifts columns $10 down to 0 down one row into the other matrix ($296C into $C800 when $1EC8 is 0, $29DE into $CC00 when it is 1, with the loop limit $FF stored in $29DA or $2A4C) and then draws the new top row into it ($2B38 for $C800, $2A52 for $CC00)."
  },
  {
   "address": 10604,
   "type": "line",
   "text": "Copies the matrix at $CC00 down one row into $C800, 19 rows, for the columns from Y down to the limit in the operand at $29DA: row 18 of the column comes from row 17, and so on to row 1 from row 0."
  },
  {
   "address": 10714,
   "type": "line",
   "text": "The loop limit of $296C: the operand of the CPY at $29D9 (the file holds $FF). $294B stores $FF here and $2930 stores $10."
  },
  {
   "address": 10718,
   "type": "line",
   "text": "Copies the matrix at $C800 down one row into $CC00, 19 rows, for the columns from Y down to the limit in the operand at $2A4C."
  },
  {
   "address": 10828,
   "type": "line",
   "text": "The loop limit of $29DE: the operand of the CPY at $2A4B (the file holds $FF). $294B stores $FF here and $2930 stores $10."
  },
  {
   "address": 10832,
   "type": "line",
   "text": "Set by the row drawing routines $26B7, $27A6, $2A52 and $2B38 to the half-row state of the row they draw (the half-row flag $BD minus 1, or 1 when that is negative): 0 picks the character table $90BE (top characters of the tiles), 1 picks $915C (bottom characters)."
  },
  {
   "address": 10833,
   "type": "line",
   "text": "Set by the row drawing routines $26B7, $27A6, $2A52 and $2B38 to the half-column state of the row they draw (the half-column flag $AF plus 1, or 0 when that reaches 2): 0 builds the row from the first character of the first tile, 1 starts with its second character and ends one character earlier."
  },
  {
   "address": 10834,
   "type": "line",
   "text": "Draws the new top row (row 0) of tiles from the level map into the matrix at $CC00. The map position is the pointer $A1/$A2, plus 1 when the half-column flag $AF plus 1 reaches 2, stored in $93/$94; $2A51 gets that half-column state and $2A50 the half-row state $BD minus 1 (1, with the position moved 64 tiles back, when that is negative). $2A50 picks the character table $90BE (0) or $915C, whose address is stored in the operands of the five loads below ($2AC4, $2ACB, $2AFA, $2B0A, $2B11 and the byte after each). It writes 40 characters from $CC00, or 39 when $2A51 is 1. Unless $2DE5 is set it then steps $BD back, subtracting $40 from the map pointer when it goes below 0."
  },
  {
   "address": 10948,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2AC3 (high byte at $2AC5), rewritten by $2A52 ($2A8A-$2AB2) with $90BE or $915C."
  },
  {
   "address": 10955,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2ACA (high byte at $2ACC), rewritten by $2A52 ($2A8A-$2AB2) with $90BE or $915C."
  },
  {
   "address": 11002,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2AF9 (high byte at $2AFB), rewritten by $2A52 ($2A8A-$2AB2) with $90BE or $915C."
  },
  {
   "address": 11018,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2B09 (high byte at $2B0B), rewritten by $2A52 ($2A8A-$2AB2) with $90BE or $915C."
  },
  {
   "address": 11025,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2B10 (high byte at $2B12), rewritten by $2A52 ($2A8A-$2AB2) with $90BE or $915C."
  },
  {
   "address": 11064,
   "type": "line",
   "text": "The same as $2A52 for the matrix at $C800: draws the new top row from $C800, and its table address operands are $2BAA, $2BB1, $2BE0, $2BF0 and $2BF7."
  },
  {
   "address": 11111,
   "type": "line",
   "text": "Not a routine entry: the operand of the calls at $11C8, $1F84 and $58D9 as the file stores it ($2B67), which each of them overwrites from a table (at $11F5, $1F96 and $58A5) before the call is made. The address happens to fall on an instruction of the top row drawing routine $2B38 (LDA $94)."
  },
  {
   "address": 11178,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2BA9 (high byte at $2BAB), rewritten by $2B38 ($2B70-$2B98) with $90BE or $915C."
  },
  {
   "address": 11185,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2BB0 (high byte at $2BB2), rewritten by $2B38 ($2B70-$2B98) with $90BE or $915C."
  },
  {
   "address": 11232,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2BDF (high byte at $2BE1), rewritten by $2B38 ($2B70-$2B98) with $90BE or $915C."
  },
  {
   "address": 11248,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2BEF (high byte at $2BF1), rewritten by $2B38 ($2B70-$2B98) with $90BE or $915C."
  },
  {
   "address": 11255,
   "type": "line",
   "text": "Low byte of the table address in the instruction at $2BF6 (high byte at $2BF8), rewritten by $2B38 ($2B70-$2B98) with $90BE or $915C."
  },
  {
   "address": 11294,
   "type": "line",
   "text": "Steps the half-row flag $BD back by one and, when it goes below 0, sets it to 1 and subtracts $40 from the map pointer $A1/$A2 (one row of 64 tiles up). Called by the diagonal scrolls ($2CCC, $2CDB, $2CEE, $2CFD, $2E7D and others)."
  },
  {
   "address": 11317,
   "type": "line",
   "text": "Scroll direction 6, view to the right and upwards (entry 6 of the table at $1F96). Moves the camera X on 2 and Y back 2 and the player's screen position the other way (X back 2, Y on 2), takes both fine scrolls ($28B2, $1FBB) and runs the phase's work: 0 ($2C9D) and 1 ($2CB8) shift the screen one row down and one column left and draw the new column and row, 2 builds the colours ($2C83), 3 copies them and flips the buffers ($2C8E)."
  },
  {
   "address": 11395,
   "type": "line",
   "text": "Phase 2 of the right-and-up scroll: jumps to $44BF when the buffer flag $1EC8 is 0 and to $3867 when it is 1, which build the colour buffer $70B7-$721D from the matrix just made (the same as $201E)."
  },
  {
   "address": 11406,
   "type": "line",
   "text": "Phase 3 of the right-and-up scroll: fills colour RAM rows 0 to 9 ($6FF4), copies rows 10 to 12 of the colour buffer and asks the interrupt for rows 13 to 18 ($679D), then flips the buffer flag $1EC8 (the same as $2029)."
  },
  {
   "address": 11421,
   "type": "line",
   "text": "Phase 0 of the right-and-up scroll: shifts columns 0 to $16 one row down and one column left into the other matrix, with $2D01 (into $C800) when $1EC8 is 0 and $2D73 (into $CC00) when it is 1. It first stores the loop limit $17 in the operand $2D6F or $2DE1."
  },
  {
   "address": 11448,
   "type": "line",
   "text": "Phase 1 of the right-and-up scroll: shifts columns $17 to $25 one row down and one column left into the other matrix ($2D01 into $C800 when $1EC8 is 0, $2D73 into $CC00 when it is 1, with the loop limit $26). It then sets $2DE5 so that the drawing routines leave the map position alone and steps it itself: half a row back ($2C1E), the right column ($2164), half a column on ($24FC), half a row on ($2895), the top row ($2B38 for $C800, $2A52 for $CC00) and half a row back again ($2C1E)."
  },
  {
   "address": 11521,
   "type": "line",
   "text": "Copies the matrix at $CC00 into $C800 shifted one row down and one column left, 19 rows, for the columns from Y up to the limit in the operand at $2D6F: row r+1 of column Y comes from row r of column Y+1."
  },
  {
   "address": 11631,
   "type": "line",
   "text": "The loop limit of $2D01: the operand of the CPY at $2D6E (the file holds $26). $2C9D stores $17 here and $2CB8 stores $26."
  },
  {
   "address": 11635,
   "type": "line",
   "text": "Copies the matrix at $C800 into $CC00 shifted one row down and one column left, 19 rows, for the columns from Y up to the limit in the operand at $2DE1."
  },
  {
   "address": 11745,
   "type": "line",
   "text": "The loop limit of $2D73: the operand of the CPY at $2DE0 (the file holds $26). $2C9D stores $17 here and $2CB8 stores $26."
  },
  {
   "address": 11749,
   "type": "line",
   "text": "Cleared by $1ECD when a new scroll starts and set to 1 by the second phase of the diagonal scrolls (for example $2CB8, $2E69). While it is non-zero the routines $2164, $26B7, $27A6, $2A52 and $2B38 do not step the map pointer $A1/$A2 and the flags $AF and $BD, and the diagonal scroll steps them itself."
  },
  {
   "address": 11750,
   "type": "line",
   "text": "Scroll direction 10, view to the left and upwards (entry 10 of the table at $1F96). Moves the camera X and Y back 2 and the player's screen X and Y on 2, takes both fine scrolls ($28B2, $3311) and runs the phase's work: 0 ($2E4E) and 1 ($2E69) shift the screen one row down and one column right and draw the new column and row, 2 builds the colours ($2E34), 3 copies them and flips the buffers ($2E3F)."
  },
  {
   "address": 11828,
   "type": "line",
   "text": "Phase 2 of the left-and-up scroll: jumps to $44BF when the buffer flag $1EC8 is 0 and to $3867 when it is 1, which build the colour buffer $70B7-$721D from the matrix just made (the same as $201E)."
  },
  {
   "address": 11839,
   "type": "line",
   "text": "Phase 3 of the left-and-up scroll: fills colour RAM rows 0 to 9 ($6FF4), copies rows 10 to 12 of the colour buffer and asks the interrupt for rows 13 to 18 ($679D), then flips the buffer flag $1EC8 (the same as $2029)."
  },
  {
   "address": 11854,
   "type": "line",
   "text": "Phase 0 of the left-and-up scroll: shifts columns $25 down to $0F one row down and one column right into the other matrix, with $2EB2 (into $C800) when $1EC8 is 0 and $2F24 (into $CC00) when it is 1. It first stores the loop limit $0E in the operand $2F20 or $2F92."
  },
  {
   "address": 11881,
   "type": "line",
   "text": "Phase 1 of the left-and-up scroll: shifts columns $0E down to 0 one row down and one column right into the other matrix ($2EB2 into $C800 when $1EC8 is 0, $2F24 into $CC00 when it is 1, with the loop limit $FF). It then sets $2DE5 so that the drawing routines leave the map position alone and steps it itself: half a row back ($2C1E), the left column ($34BA), half a column back ($3850), half a row on ($2895), the top row ($2B38 for $C800, $2A52 for $CC00) and half a row back again ($2C1E)."
  },
  {
   "address": 11954,
   "type": "line",
   "text": "Copies the matrix at $CC00 into $C800 shifted one row down and one column right, 19 rows, for the columns from Y down to the limit in the operand at $2F20: row r+1 of column Y+1 comes from row r of column Y."
  },
  {
   "address": 12064,
   "type": "line",
   "text": "The loop limit of $2EB2: the operand of the CPY at $2F1F (the file holds $FF). $2E4E stores $0E here and $2E69 stores $FF."
  },
  {
   "address": 12068,
   "type": "line",
   "text": "Copies the matrix at $C800 into $CC00 shifted one row down and one column right, 19 rows, for the columns from Y down to the limit in the operand at $2F92."
  },
  {
   "address": 12178,
   "type": "line",
   "text": "The loop limit of $2F24: the operand of the CPY at $2F91 (the file holds $FF). $2E4E stores $0E here and $2E69 stores $FF."
  },
  {
   "address": 12182,
   "type": "line",
   "text": "No caller: nothing calls, jumps or branches to it, and the routine before it ends in an RTS. A copy of the end of scroll_lu_copy_b ($2E9A-$2EAE): it sets $2DE5 to 1, then steps the map half a row back ($2C1E), draws the left column ($34BA), steps half a column back ($3850), half a row on ($2895), draws the top row ($2A52) and steps half a row back again; without an RTS it runs on into scroll_left_down at $2FAD."
  },
  {
   "address": 12205,
   "type": "line",
   "text": "Scroll direction 9, view to the left and downwards (entry 9 of the table at $1F96). Moves the camera X ($FB/$FC) back 2 and Y ($FD/$FE) on 2 and the player's screen position the other way (X on 2, Y back 2), takes both fine scrolls ($2519, $3311) and runs the work of the phase that $3311 returns: 0 ($3015) and 1 ($3030) shift the screen one row up and one column right and draw the new column and row, 2 builds the colours ($2FFB), 3 copies them and flips the buffers ($3006)."
  },
  {
   "address": 12283,
   "type": "line",
   "text": "Phase 2 of the left-and-down scroll: jumps to $44BF when the buffer flag $1EC8 is 0 and to $3867 when it is 1, which build the colour buffer $70B7-$721D from the matrix just made (the same as $201E)."
  },
  {
   "address": 12294,
   "type": "line",
   "text": "Phase 3 of the left-and-down scroll: fills colour RAM rows 0 to 9 ($6FF4), copies rows 10 to 12 of the colour buffer and asks the interrupt for rows 13 to 18 ($679D), then flips the buffer flag $1EC8 (the same as $2029)."
  },
  {
   "address": 12309,
   "type": "line",
   "text": "Phase 0 of the left-and-down scroll: shifts columns $25 down to $0F one row up and one column right into the other matrix ($3079 into $C800 when $1EC8 is 0, $30EB into $CC00 when it is 1, with the loop limit $0E stored in $30E7 or $3159)."
  },
  {
   "address": 12336,
   "type": "line",
   "text": "Phase 1 of the left-and-down scroll: shifts columns $0E down to 0 one row up and one column right into the other matrix ($3079 into $C800 when $1EC8 is 0, $30EB into $CC00 when it is 1, with the loop limit $FF). It then sets $2DE5 so that the drawing routines leave the map position alone and steps it itself: half a row on ($2895), the left column ($34BA), half a column back ($3850), half a row back ($2C1E), the bottom row ($27A6 for $C800, $26B7 for $CC00) and half a row on again ($2895)."
  },
  {
   "address": 12409,
   "type": "line",
   "text": "Copies the matrix at $CC00 into $C800 shifted one row up and one column right (rows 1 to 18 of the source into rows 0 to 17), for the columns from Y down to the limit in the operand at $30E7: the character at row r+1, column Y goes to row r, column Y+1."
  },
  {
   "address": 12519,
   "type": "line",
   "text": "The loop limit of $3079: the operand of the CPY at $30E6 (the file holds $FF). $3015 stores $0E here and $3030 stores $FF."
  },
  {
   "address": 12523,
   "type": "line",
   "text": "Copies the matrix at $C800 into $CC00 shifted one row up and one column right (rows 1 to 18 of the source into rows 0 to 17), for the columns from Y down to the limit in the operand at $3159."
  },
  {
   "address": 12633,
   "type": "line",
   "text": "The loop limit of $30EB: the operand of the CPY at $3158 (the file holds $FF). $3015 stores $0E here and $3030 stores $FF."
  },
  {
   "address": 12637,
   "type": "line",
   "text": "Scroll direction 5, view to the right and downwards (entry 5 of the table at $1F96). Moves the camera X on 2 and Y on 2 and the player's screen position back 2 in both, takes both fine scrolls ($2519, $1FBB) and runs the work of the phase that $1FBB returns: 0 ($31C5) and 1 ($31E0) shift the screen one row up and one column left and draw the new column and row, 2 builds the colours ($31AB), 3 copies them and flips the buffers ($31B6)."
  },
  {
   "address": 12715,
   "type": "line",
   "text": "Phase 2 of the right-and-down scroll: jumps to $44BF when the buffer flag $1EC8 is 0 and to $3867 when it is 1, which build the colour buffer $70B7-$721D from the matrix just made (the same as $201E)."
  },
  {
   "address": 12726,
   "type": "line",
   "text": "Phase 3 of the right-and-down scroll: fills colour RAM rows 0 to 9 ($6FF4), copies rows 10 to 12 of the colour buffer and asks the interrupt for rows 13 to 18 ($679D), then flips the buffer flag $1EC8 (the same as $2029)."
  },
  {
   "address": 12741,
   "type": "line",
   "text": "Phase 0 of the right-and-down scroll: shifts columns 0 to $16 one row up and one column left into the other matrix ($3229 into $C800 when $1EC8 is 0, $329B into $CC00 when it is 1, with the loop limit $17 stored in $3297 or $3309)."
  },
  {
   "address": 12768,
   "type": "line",
   "text": "Phase 1 of the right-and-down scroll: shifts columns $17 to $25 one row up and one column left into the other matrix ($3229 into $C800 when $1EC8 is 0, $329B into $CC00 when it is 1, with the loop limit $26). It then sets $2DE5 so that the drawing routines leave the map position alone and steps it itself: half a row on ($2895), the right column ($2164), half a column on ($24FC), half a row back ($2C1E), the bottom row ($27A6 for $C800, $26B7 for $CC00) and half a row on again ($2895)."
  },
  {
   "address": 12841,
   "type": "line",
   "text": "Copies the matrix at $CC00 into $C800 shifted one row up and one column left (rows 1 to 18 of the source into rows 0 to 17), for the columns from Y up to the limit in the operand at $3297: the character at row r+1, column Y+1 goes to row r, column Y."
  },
  {
   "address": 12951,
   "type": "line",
   "text": "The loop limit of $3229: the operand of the CPY at $3296 (the file holds $26). $31C5 stores $17 here and $31E0 stores $26."
  },
  {
   "address": 12955,
   "type": "line",
   "text": "Copies the matrix at $C800 into $CC00 shifted one row up and one column left (rows 1 to 18 of the source into rows 0 to 17), for the columns from Y up to the limit in the operand at $3309."
  },
  {
   "address": 13065,
   "type": "line",
   "text": "The loop limit of $329B: the operand of the CPY at $3308 (the file holds $26). $31C5 stores $17 here and $31E0 stores $26."
  },
  {
   "address": 13069,
   "type": "line",
   "text": "The fine horizontal scroll values for the four phases of a scroll to the left: 2, 4, 6, 0 (read by $3311)."
  },
  {
   "address": 13073,
   "type": "line",
   "text": "Sets the fine horizontal scroll $1EC2 from the table at $330D (2, 4, 6, 0) for the phase in $1F91 and returns the phase in Y. When $1EC2 already holds that value, or when 10 or more steps are left ($1F90) and $1EC2 is 6, it restores the camera X ($FB/$FC) from $1ECB/$1ECC and the player's X $1D80 from $58B5 instead. Called by $2DE6, $2FAD and $333F."
  },
  {
   "address": 13119,
   "type": "line",
   "text": "Scroll direction 8, view to the left (entry 8 of the table at $1F96). Moves the camera X ($FB/$FC) back 2 and the player's screen X $1D80 on 2, takes the fine scroll from $3311 and runs the work of the phase it returns: phase 0 shifts the right columns of the screen one character right ($338E), 1 shifts the rest and draws the new left column ($33A9), 2 builds the colours ($3374), 3 copies the colours to colour RAM and flips the buffers ($337F)."
  },
  {
   "address": 13172,
   "type": "line",
   "text": "Phase 2 of a scroll to the left: jumps to $44BF when the buffer flag $1EC8 is 0 and to $3867 when it is 1, which build the colour buffer $70B7-$721D from the matrix just made (the same as $201E)."
  },
  {
   "address": 13183,
   "type": "line",
   "text": "Phase 3 of a scroll to the left: fills colour RAM rows 0 to 9 ($6FF4), copies rows 10 to 12 of the colour buffer and asks the interrupt for rows 13 to 18 ($679D), then flips the buffer flag $1EC8 (the same as $2029)."
  },
  {
   "address": 13198,
   "type": "line",
   "text": "Phase 0 of a scroll to the left: shifts columns $26 down to $12 of the screen one character right into the other matrix ($33CA into $C800 when $1EC8 is 0, $3442 into $CC00 when it is 1, with the loop limit $11 stored in $343E or $34B6)."
  },
  {
   "address": 13225,
   "type": "line",
   "text": "Phase 1 of a scroll to the left: shifts columns $11 down to 0 one character right into the other matrix ($33CA into $C800 when $1EC8 is 0, $3442 into $CC00 when it is 1, with the loop limit $FF) and then draws the new left column ($34BA)."
  },
  {
   "address": 13258,
   "type": "line",
   "text": "Copies the matrix at $CC00 one character to the right into $C800, 19 rows of 40, for the columns from Y down to the limit in the operand at $343E: the character at row r, column Y goes to column Y+1."
  },
  {
   "address": 13374,
   "type": "line",
   "text": "The loop limit of $33CA: the operand of the CPY at $343D (the file holds $FF). $338E stores $11 here and $33A9 stores $FF."
  },
  {
   "address": 13378,
   "type": "line",
   "text": "Copies the matrix at $C800 one character to the right into $CC00, 19 rows of 40, for the columns from Y down to the limit in the operand at $34B6."
  },
  {
   "address": 13494,
   "type": "line",
   "text": "The loop limit of $3442: the operand of the CPY at $34B5 (the file holds $FF). $338E stores $11 here and $33A9 stores $FF."
  },
  {
   "address": 13498,
   "type": "line",
   "text": "Draws the new left-hand column (column 0, 19 rows) of the matrix that is being made ($C800 when $1EC8 is 0, otherwise $CC00) from the level map. It reads 10 tiles down from the map pointer $A1/$A2, $40 tiles to a row, each as a two by two block through the tables $90BE (top row) and $915C (bottom row), taking the left or right character by the half-column flag $AF; when the half-row flag $BD is non-zero it starts with the bottom row of the first tile. Unless $2DE5 is set it then steps $AF back by one, subtracting 1 from the map pointer when it wraps. Called by the left scrolls ($2E69, $3030, $33A9)."
  },
  {
   "address": 14416,
   "type": "line",
   "text": "Steps the half-column flag $AF back by one and, when it goes below 0, sets it to 1 and subtracts 1 from the map pointer $A1/$A2 (one tile to the left). Called by the diagonal scrolls to the left ($2E83, $2EA5, $304A, $306C)."
  },
  {
   "address": 14439,
   "type": "line",
   "text": "Builds the colour buffer $70B7-$721D from the matrix at $CC00: for rows 10 to 18, columns 0 to 38 of each (351 characters, from $CD90 to $CEF6), it looks the character up in the colour table $BF00 and stores the colour in the buffer, 40 bytes to a row. Entered by a jump when the buffer flag $1EC8 is 1, from the phase 2 routines of the scrolls ($201E and the others) and from $6FE9."
  },
  {
   "address": 15141,
   "type": "line",
   "text": "Part 2 of the unrolled colour lookup from the matrix at $CC00: the characters of screen rows 12 and 13, 39 each from $CDE0 and $CE08, looked up in the colour table $BF00 and stored in the buffer from $7107 and $712F."
  },
  {
   "address": 15843,
   "type": "line",
   "text": "Part 3 of the unrolled colour lookup from the matrix at $CC00: the characters of screen rows 14 and 15, 39 each from $CE30 and $CE58, looked up in the colour table $BF00 and stored in the buffer from $7157 and $717F."
  },
  {
   "address": 16545,
   "type": "line",
   "text": "Part 4 of the unrolled colour lookup from the matrix at $CC00: the characters of screen rows 16 and 17, 39 each from $CE80 and $CEA8, looked up in the colour table $BF00 and stored in the buffer from $71A7 and $71CF."
  },
  {
   "address": 17247,
   "type": "line",
   "text": "Last part of the unrolled colour lookup from the matrix at $CC00: the characters of screen row 18, 39 from $CED0 to $CEF6, looked up in the colour table $BF00 and stored in the buffer from $71F7 to $721D, then the RTS at $44BE."
  },
  {
   "address": 17599,
   "type": "line",
   "text": "Builds the colour buffer $70B7-$721D from the matrix at $C800: for rows 10 to 18, columns 0 to 38 of each (351 characters, from $C990 to $CAF6), it looks the character up in the colour table $BF00 and stores the colour in the buffer, 40 bytes to a row. Entered by a jump when the buffer flag $1EC8 is 0, from the phase 2 routines of the scrolls ($201E and the others) and from $6FE9."
  },
  {
   "address": 18301,
   "type": "line",
   "text": "Part 2 of the unrolled colour lookup from the matrix at $C800: the characters of screen rows 12 and 13, 39 each from $C9E0 and $CA08, looked up in the colour table $BF00 and stored in the buffer from $7107 and $712F."
  },
  {
   "address": 19003,
   "type": "line",
   "text": "Part 3 of the unrolled colour lookup from the matrix at $C800: the characters of screen rows 14 and 15, 39 each from $CA30 and $CA58, looked up in the colour table $BF00 and stored in the buffer from $7157 and $717F."
  },
  {
   "address": 19705,
   "type": "line",
   "text": "Part 4 of the unrolled colour lookup from the matrix at $C800: the characters of screen rows 16 and 17, 39 each from $CA80 and $CAA8, looked up in the colour table $BF00 and stored in the buffer from $71A7 and $71CF."
  },
  {
   "address": 20407,
   "type": "line",
   "text": "Last part of the unrolled colour lookup from the matrix at $C800: the characters of screen row 18, 39 from $CAD0 to $CAF6, looked up in the colour table $BF00 and stored in the buffer from $71F7 to $721D, then the RTS at $5116."
  },
  {
   "address": 20759,
   "type": "line",
   "text": "Cleared by the setup $5118. While it is non-zero $7441 counts the countdown $1D82-$1D84 down and $1E85 ends the game when it reaches zero; with it zero the digits are held at zero. The traced code does not set it."
  },
  {
   "address": 20760,
   "type": "line",
   "text": "Level setup, called first by the main loop at $1E15. Switches interrupts off, banks the ROMs out ($01=$35), selects video bank 3 and the screen at $CC00 ($D018=$30) with extended colour and multicolour on, starts the timer digits $9449-$944B (5 in $944B only when $0A10 is set), sets the energy $5366 to $21, clears the flags ($1EC1, $771A-$771C, $93A9, $679C, $5117, $0A2B), the sprite registers and $002A-$00FF, ORs $08 into the 256 bytes at $BF00, clears the sound chip and fills $0010-$0077 with $FF, and sets the player's screen position $1D80/$1D81 to $A4,$6B, the camera to X $032C and Y $00F4 and the map pointer $A1/$A2 to $7E58. It then types the briefing ($9B76, with the shape swap $9B3B), draws the panel ($52C4), loads the objects ($73C2) and the first screen ($7337), starts the music ($B0C8), points the NMI at $0A23 and the IRQ at $62BF, sets the raster compare to line $82 and enables the raster interrupt with CLI."
  },
  {
   "address": 21188,
   "type": "line",
   "text": "Copies the status panel under the playfield: the 200 characters at $91DC to $CEF7 and their colours at $92A4 to $DAF7, clears the 40 characters at $CFC0 and $DBC0, then draws the timer picture through $94FE when $0A10 is set and through $9567 when it is clear. Called by the setup $5118, the game over screen $57FF and the continue screen $98A4."
  },
  {
   "address": 21236,
   "type": "line",
   "text": "Scratch of $52F5, $751B and $7584: the height that the player's screen Y $1D81 is compared with (the player's Y plus $0E, or the slot's height $A3,X minus $15)."
  },
  {
   "address": 21237,
   "type": "line",
   "text": "Contact test of slot X (a slot's sprite against the player). Heights: when the player is crouching ($5ABF non-zero) the slot's screen height $A3,X must be within 9 of the player's Y plus $0E, otherwise within $17 below or $0B above the player's $1D81. Across: the slot's high X byte $BF,X must be 0 and its screen X $87,X within $13 of the player's $1D80. Returns A=0 for no contact and a non-zero A (the distance across, or the slot's X when level with the player) for contact. Called by the behaviours ($1231, $12AF and others), which then call $5367."
  },
  {
   "address": 21349,
   "type": "line",
   "text": "Frames of protection after a hit, counted down by $62BF; while it is non-zero the joystick is read even if the recoil runs."
  },
  {
   "address": 21350,
   "type": "line",
   "text": "The player's energy, $21 at the start of the level; the bar at $7803 shows it and $1E85 clears it when the countdown runs out. The main loop at $1E42 goes to the game over screen when it is zero."
  },
  {
   "address": 21351,
   "type": "line",
   "text": "Hurts the player. Returns at once while the hurt guard $5365 is non-zero; otherwise sets $5365 and the recoil $155D to 3 and goes on into $5374."
  },
  {
   "address": 21364,
   "type": "line",
   "text": "Takes 1 from the energy $5366 unless it is already zero, and plays sound effect 4 through $B0EE, keeping X and Y in the operands at $538D and $538B. Entered from $5367 and called by the behaviours at $160E and $1858, which set their own recoil."
  },
  {
   "address": 21387,
   "type": "line",
   "text": "Holds the Y register saved by $5382: the immediate operand of the LDY at $538A."
  },
  {
   "address": 21389,
   "type": "line",
   "text": "Holds the X register saved by $537F: the immediate operand of the LDX at $538C."
  },
  {
   "address": 21391,
   "type": "line",
   "text": "Behaviour for state $12 (entry 18 of the table at $11F5): a lone RTS, so a slot in state $12 does nothing. No object in the table at $78F0 has type $12."
  },
  {
   "address": 21392,
   "type": "line",
   "text": "Three pointers to the paths of behaviour $5398, indexed by the object's variant $0BC6 times 2: $8EF0 (variant 0), $8F8A (variant 1) and $9024 (variant 2)."
  },
  {
   "address": 21398,
   "type": "line",
   "text": "The index into the path (the object's counter $0AEB), kept by $5398 for the Y register while it reads the path."
  },
  {
   "address": 21399,
   "type": "line",
   "text": "The offset taken from the path (the magnitude when the byte is negative), kept by $5398 while it works out the slot's X or Y."
  },
  {
   "address": 21400,
   "type": "line",
   "text": "Behaviour for state 19 (entry 19 of the table at $11F5), reached for the three objects of type $13. Runs the contact test $52F5 (on contact $5367) and takes a path pointer into $E9/$EA from the table $5390 by the object's variant $0BC6 (0, 1 or 2: the paths $8EF0, $8F8A and $9024). The variant 0 object steps the counter $0AEB by 2 (back to 0 at $98 or at an entry of $7F) and copies it to the next two objects ($0AEC, $0AED), which follow the same step with their own path. Pointer $67, colour 0, multicolour. The slot's X is the object's $0C58/$0CA1 plus the path's first byte of the pair, its Y the object's $0CEA/$0D33 plus the second byte (a byte with bit 7 set is subtracted, as 256 minus it); the new position is written to the object. The two pairs of limits are an anchor here, not walk limits."
  },
  {
   "address": 21683,
   "type": "line",
   "text": "Behaviour for state 20 (entry 20 of the table at $11F5): sets the pointer $67, colour 0 and multicolour on the slot and does nothing else, so the sprite stays where the object puts it. It is reached for the one object of type $14 in the table at $78F0."
  },
  {
   "address": 21699,
   "type": "line",
   "text": "Sprite pointers of behaviour $553A for variants 1 and up, indexed by the timer in the object's energy $0B7D (0 to 56): 0 for 0 to 10, then $7A (9 values), $79 (9), $78 (9), $77 (9) and $76 (10). The blast moves left while it is $19 or more."
  },
  {
   "address": 21756,
   "type": "line",
   "text": "Sprite pointers of behaviour $553A for variant 0, indexed by the timer in the object's energy $0B7D (0 to 61): 0 for 0 to 15, then $7F (9 values), $7E (9), $7D (9), $7C (9) and $7B (10). The blast moves right while it is $19 or more."
  },
  {
   "address": 21818,
   "type": "line",
   "text": "Behaviour for state 21 (entry 21 of the table at $11F5), reached for the five objects of type $15. Colour 9, multicolour. The contact test $52F5 hurts the player ($5367) and restarts it. The object's energy $0B7D is a timer: when it is zero (or after a hit) $5556 sets it from the object's flag $0B34, puts the slot and the object at the position $0C58/$0CA1 and plays sound effect $1C; otherwise it counts it down and takes the pointer from $54FC (variant 0) or $54C3 by it; while it is $19 or more the slot also moves 4 pixels right (variant 0) or left each frame."
  },
  {
   "address": 21880,
   "type": "line",
   "text": "Holds the Y register saved by $556F: the immediate operand of the LDY at $5577."
  },
  {
   "address": 21882,
   "type": "line",
   "text": "Holds the X register saved by $556C: the immediate operand of the LDX at $5579."
  },
  {
   "address": 21974,
   "type": "line",
   "text": "The path of behaviour $5672: 16-bit signed changes of the slot's Y, two bytes each, read with the object's counter $0AEB in steps of 2. Three arcs, each a rise that turns into a fall: -4 up to 7, -5 up to 8 and -5 up to 7, then -93 ($FFA3) at $566E; the low byte $5A at $5670 ends the path. $56CE overwrites the byte after it ($5671)."
  },
  {
   "address": 22130,
   "type": "line",
   "text": "Behaviour for state 22 (entry 22 of the table at $11F5), reached for the two objects of type $16. Pointer $75, colour 7, multicolour. The object's counter $0AEB steps by 2 through the table $55D6 of 16-bit Y changes (added to the slot's Y and written to $0E0E/$0E57), until an entry whose low byte is $5A ends the path: the counter returns to 0 and the slot's X to $0C58/$0CA1. At the last step before that the pointer is 0, otherwise the contact test $52F5 runs and hurts the player ($5367). Variant 1 also drifts the slot 1 pixel left a frame and variants 2 and up 1 pixel right (through the operands $570D and $5715); variant 0 stays at its X."
  },
  {
   "address": 22285,
   "type": "line",
   "text": "Low byte of the X change per frame that $5672 adds to the slot for variants 1 and up: the operand of the ADC at $570C, set to $FF (variant 1) or 1 at $56F6 and $5701."
  },
  {
   "address": 22293,
   "type": "line",
   "text": "High byte of the X change per frame that $5672 adds to the slot for variants 1 and up: the operand of the ADC at $5714, set to $FF (variant 1) or 0 at $56F9 and $5706."
  },
  {
   "address": 22307,
   "type": "line",
   "text": "Sprite pointers of behaviour $573B for the counter values 1 to 23: $01 seven times (counter 1 to 7), $1F eight times and $DB eight times; the byte for counter 0 is never read."
  },
  {
   "address": 22331,
   "type": "line",
   "text": "Behaviour for state 23 (entry 23 of the table at $11F5), reached for the four objects of type $17. The contact test $52F5 hurts the player ($5367). Pointer $DC, colour 5, single-colour. The object's counter $0AEB counts up to its flag $0B34: below $18 the pointer comes from $5723 by the counter; from $18 on the slot falls 3 lines a frame (written to $0E0E/$0E57). When the counter reaches the flag, slot and object become state $18 with the counter at 0 and sound effect $1C plays."
  },
  {
   "address": 22390,
   "type": "line",
   "text": "Holds the Y register saved by $576D: the immediate operand of the LDY at $5775."
  },
  {
   "address": 22392,
   "type": "line",
   "text": "Holds the X register saved by $576A: the immediate operand of the LDX at $5777."
  },
  {
   "address": 22438,
   "type": "line",
   "text": "Behaviour for state 24 (entry 24 of the table at $11F5), which $573B switches to when its fall ends. The contact test $52F5 hurts the player ($5367). Multicolour, colour 2. The object's counter $0AEB counts up to $35 while the pointer comes from $1C0E by the counter (the burst frames at the end of the table $1BDA). Then it clears the counter and the pointer, puts the slot and the object back at the height $0C58/$0CA1, makes both state $17 again and plays sound effect $20."
  },
  {
   "address": 22523,
   "type": "line",
   "text": "Holds the Y register saved by $57F2: the immediate operand of the LDY at $57FA."
  },
  {
   "address": 22525,
   "type": "line",
   "text": "Holds the X register saved by $57EF: the immediate operand of the LDX at $57FC."
  },
  {
   "address": 22527,
   "type": "line",
   "text": "The game over screen, called by the main loop at $1E4C when the energy $5366 is zero and $0A11 is clear, and at $1E69 when the NMI flag $0A2B is set. Runs the wipe $93AB, switches to the text screen, swaps the character shapes ($9B3B), clears the screen and fills colour RAM with 9, writes \"GAME OVER\" from $589A at $CD50 (adding $66 to each code, a space becomes 0), waits through six long delays ($6534) and puts the shapes back and redraws the panel ($9B3B, $52C4)."
  },
  {
   "address": 22682,
   "type": "line",
   "text": "\"GAME OVER\" in screen codes, ended by $FF; written by $57FF with $66 added to each code."
  },
  {
   "address": 22692,
   "type": "line",
   "text": "The player's state: 1 standing or walking, 2 falling, 3 jumping, 4 climbing, 5 punching, 6 crouching, 7 a strike. Read by $58B7 and $60C0."
  },
  {
   "address": 22693,
   "type": "line",
   "text": "Table of the eight state routines, one word each: 0 $58E2 (player_state_none, an RTS), 1 $5B4E (player_walk), 2 $5D21 (player_fall), 3 $5E30 (player_jump), 4 $5F9F (player_climb), 5 $5972 (player_punch), 6 $5AC3 (player_crouch), 7 $59D0 (player_strike). $58B7 copies the word into the operand of the call at $58D9."
  },
  {
   "address": 22709,
   "type": "line",
   "text": "The player's screen X ($1D80) before this frame's move, saved by $58B7 and $1ECD."
  },
  {
   "address": 22710,
   "type": "line",
   "text": "The player's screen Y ($1D81) before this frame's move, saved by $58B7 and $1ECD."
  },
  {
   "address": 22711,
   "type": "line",
   "text": "Called from the top interrupt at $64B9 each frame. Unless the game is paused ($63EA) it saves the player's screen position in $58B5/$58B6 and runs the routine for the player's state $58A4 (table at $58A5, through a call whose operand is rewritten at $58DA/$58DB); it then draws the player's frames with $60C0, also while paused."
  },
  {
   "address": 22746,
   "type": "line",
   "text": "Low byte of the address in the JSR at $58D9 (high byte at $58DB), rewritten by $58D0 and $58D6 with the routine for the player's state from the table at $58A5; the $2B67 the file holds is only a placeholder."
  },
  {
   "address": 22752,
   "type": "line",
   "text": "Scratch of $1D06: the low byte of the 16-bit value it works on (camera minus a constant, plus the player's position, then shifted right)."
  },
  {
   "address": 22753,
   "type": "line",
   "text": "Scratch of $1D06: the high byte of the 16-bit value it works on, shifted right 4 times (across) or 3 times (down)."
  },
  {
   "address": 22754,
   "type": "line",
   "text": "A lone RTS: the routine of player state 0 (entry 0 of the table at $58A5), which does nothing."
  },
  {
   "address": 22755,
   "type": "line",
   "text": "Index of the current walk or climb frame, stepped by $5909, $592A, $5F5B and $5F7C."
  },
  {
   "address": 22756,
   "type": "line",
   "text": "The 18 sprite pointer values of the left-facing walk ($9D to $A2, three each), read by $5909 and $5B4E."
  },
  {
   "address": 22774,
   "type": "line",
   "text": "The 18 sprite pointer values of the right-facing walk ($97 to $9C, three each), read by $592A and $5B4E."
  },
  {
   "address": 22792,
   "type": "line",
   "text": "Toggled by $5909, $592A, $5F5B and $5F7C so that the frame index advances on every second call."
  },
  {
   "address": 22793,
   "type": "line",
   "text": "Steps the left-facing walk animation: toggles $5908 and, on every other call, advances the index $58E3 through the 18 frames at $58E4, and on every call puts the frame in $60BC. Called by $5B4E."
  },
  {
   "address": 22826,
   "type": "line",
   "text": "The same for the right-facing walk: advances $58E3 through the 18 frames at $58F6 and puts the frame in $60BC. Called by $5B4E."
  },
  {
   "address": 22859,
   "type": "line",
   "text": "1 when the player faces left, 0 when he faces right."
  },
  {
   "address": 22860,
   "type": "line",
   "text": "The map column under the player (the Y that $1D06 returns), kept by $5B4E at $5C07 for the ladder tests at $5C28."
  },
  {
   "address": 22861,
   "type": "line",
   "text": "Sets the three sprite pointers in $60BD, $60BE and $60BF for the punch: $90, $B4, $BE when the player faces right ($594B zero) and $91, $B5, $BF when he faces left. Called by $5972 and $5B4E."
  },
  {
   "address": 22898,
   "type": "line",
   "text": "Player state 5, punching (entry 5 of the table at $58A5). While the punch timer $5B4C is non-zero it counts it down each frame and sets the punch frames through $594D. When it has run out the state holds until fire ($1EC5 bit 4) is released, then returns to state 1 with the punch delay $5AC1 set to 6."
  },
  {
   "address": 22929,
   "type": "line",
   "text": "Sets the three sprite pointers in $60BD, $60BE and $60BF for the strike: $8C, $A3, $B0 when the player faces right and $8D, $B1, $BB when he faces left. Called by $59D0, $5AC3, $5B4E and $5E30."
  },
  {
   "address": 22966,
   "type": "line",
   "text": "Table of the 13 height steps of state 7, signed 16-bit values: -6 up to +6, read by $59D0 through the index $5E2E."
  },
  {
   "address": 22992,
   "type": "line",
   "text": "Player state 7, a strike or hop (entry 7 of the table at $58A5). Adds the next step of the table at $59B6 (indexed by $5E2E, two bytes a step) to the player's height $1D81; when the table is used up, or from index $0F on when the tile below is solid, it returns to state 1 (strike timer $5ABE and crouch flag $5ABF cleared, crouch delay $5AC0 set to 10). It moves 2 pixels in the direction he faces ($594B; left through $751B, right through $7584, stopped by the map ends and solid tiles), puts frame $9B or $A1 in $60BC and counts the strike timer $5ABE down with the strike frames ($5991), setting the strike delay $5ABD to 10 when it runs out."
  },
  {
   "address": 23229,
   "type": "line",
   "text": "Set to 10 by $59D0 and $5E30 when the strike timer $5ABE runs out and counted down by them while it is zero. Nothing else in the traced code reads it."
  },
  {
   "address": 23230,
   "type": "line",
   "text": "Frames left of the strike; the hit test $101C, $60C0 and $63EB read it."
  },
  {
   "address": 23231,
   "type": "line",
   "text": "Non-zero while the player is crouching; $60C0 reads it."
  },
  {
   "address": 23232,
   "type": "line",
   "text": "Delay before the player can crouch or strike from state 1: set to 10 when a strike or a crouch ends, to 4 when a climb ends and to 0 when a jump ends; counted down by $5B4E."
  },
  {
   "address": 23233,
   "type": "line",
   "text": "Frames before the next punch can start: set to 6 when a punch ends ($5972) and counted down by $5B4E."
  },
  {
   "address": 23234,
   "type": "line",
   "text": "Delay before the next jump can start: set to 10 on every frame of a climb ($5F9F) and counted down by $5B4E, which starts a jump only when it is zero."
  },
  {
   "address": 23235,
   "type": "line",
   "text": "Player state 6, crouching (entry 6 of the table at $58A5). Fire ($1EC5 bit 4) starts a strike: state 7, index $5E2E cleared, strike timer $5ABE set to $0E, strike frames ($5991) and sound effect 0 through $B0EE. With down released it returns to state 1 with the crouch delay $5AC0 set to 10 and the crouch flag $5ABF cleared. While down is held, and the recoil $155D is not running, left and right turn him ($594B) and the crouch frames ($5B27) are set."
  },
  {
   "address": 23272,
   "type": "line",
   "text": "Holds the Y register saved by $5ADF: the immediate operand of the LDY at $5AE7."
  },
  {
   "address": 23274,
   "type": "line",
   "text": "Holds the X register saved by $5ADC: the immediate operand of the LDX at $5AE9."
  },
  {
   "address": 23335,
   "type": "line",
   "text": "Sets the three sprite pointers in $60BD, $60BE and $60BF for the crouch: $92, $B6, $C0 when the player faces right and $93, $B7, $C1 when he faces left. Called by $5AC3 and $5B4E."
  },
  {
   "address": 23372,
   "type": "line",
   "text": "Frames left of the punch; the hit test $101C, $60C0 and $63EB read it."
  },
  {
   "address": 23373,
   "type": "line",
   "text": "Read by $5B4E at $5C69 (a non-zero value stops a climb down from starting); nothing in the traced code writes it, and the file holds 0."
  },
  {
   "address": 23374,
   "type": "line",
   "text": "Player state 1, standing and walking (entry 1 of the table at $58A5). Counts down the jump delay $5AC2, clears the hit flags $101A/$101B and the strike timer $5ABE, then moves 2 pixels left or right from the joystick $1EC5 (bits 2 and 3): it sets the facing $594B, steps the walk animation ($5909, $592A) unless the recoil $155D runs, and is stopped by a blocker ($751B, $7584), by the ends of the map (map X $1D04/$1D05 below $0039 or from $03A5 on) and by a solid tile (the player's X is put back from $58B5). It then goes to state 2 when the tile below is not solid, and otherwise starts a climb (up held on a ladder tile $0F/$10, or down held with $0D/$0E below, state 4), a jump (up held, state 3, when $5AC2 is zero), a strike (down and fire, state 7), a crouch (down, state 6), a punch (fire, state 5, when $5AC1 is zero), or with the stick centred shows the standing frame ($5D0E)."
  },
  {
   "address": 23732,
   "type": "line",
   "text": "Holds the Y register saved by $5CAB: the immediate operand of the LDY at $5CB3."
  },
  {
   "address": 23734,
   "type": "line",
   "text": "Holds the X register saved by $5CA8: the immediate operand of the LDX at $5CB5."
  },
  {
   "address": 23796,
   "type": "line",
   "text": "Holds the Y register saved by $5CEB: the immediate operand of the LDY at $5CF3."
  },
  {
   "address": 23798,
   "type": "line",
   "text": "Holds the X register saved by $5CE8: the immediate operand of the LDX at $5CF5."
  },
  {
   "address": 23822,
   "type": "line",
   "text": "Puts the standing frame in $60BC: $9A when the player faces right and $A0 when he faces left. Called by $5B4E and $5D21."
  },
  {
   "address": 23841,
   "type": "line",
   "text": "Player state 2, falling (entry 2 of the table at $58A5). Clears the hit flag $101A, moves left and right from the joystick as in state 1 (facing $594B, blockers $751B/$7584, map ends, solid tiles; no walk animation), then lowers him by 3 lines a frame (2 from line $82, none from line $97) and, when the tile below is solid, returns to state 1 with the standing frame ($5D0E); otherwise it shows the falling frame ($5DCD)."
  },
  {
   "address": 24013,
   "type": "line",
   "text": "Puts the falling frame in $60BC: $F8 when the player faces right and $F9 when he faces left. Called by $5D21."
  },
  {
   "address": 24032,
   "type": "line",
   "text": "Table of the 39 height steps of the jump, signed 16-bit values, two bytes each, read by $5E30 through the index $5E2E: from -4 at the start to +4 near the end."
  },
  {
   "address": 24110,
   "type": "line",
   "text": "Index into the jump and strike height tables ($5DE0, $59B6), two bytes a step; cleared when a jump or a strike starts ($5B4E, $5AC3) and stepped by $5E30 and $59D0."
  },
  {
   "address": 24111,
   "type": "line",
   "text": "When non-zero, the state $60C0 draws this frame instead of $58A4; cleared by $60C0 after use."
  },
  {
   "address": 24112,
   "type": "line",
   "text": "Player state 3, a jump (entry 3 of the table at $58A5). Adds the next step of the table at $5DE0 (indexed by $5E2E) to the player's height $1D81. When the table is used up, or from index $29 on when the tile below is solid, it returns to state 1 (draw override $5E2F set to 3, strike timer $5ABE and crouch delay $5AC0 cleared). It steers left and right from the joystick as in state 1 (facing $594B, blockers $751B/$7584, map ends, solid tiles), counts a running strike timer down with the strike frames ($5991), and shows the jump frame ($5F2F)."
  },
  {
   "address": 24367,
   "type": "line",
   "text": "Puts the jump frame in $60BC: $D5 when the player faces right and $D6 when he faces left. Called by $5B4E and $5E30."
  },
  {
   "address": 24386,
   "type": "line",
   "text": "1 while the player climbs up and 0 while he climbs down; set by $5B4E and $5F9F and read by $5F9F at the end of a climb."
  },
  {
   "address": 24387,
   "type": "line",
   "text": "Twelve sprite pointer values of the climb upwards ($94 to $96), indexed by $58E3 in $5F5B."
  },
  {
   "address": 24399,
   "type": "line",
   "text": "Twelve sprite pointer values of the climb downwards ($94 to $96), indexed by $58E3 in $5F7C."
  },
  {
   "address": 24411,
   "type": "line",
   "text": "Advances the climb frame upwards: toggles $5908 and, on every other call, steps $58E3 through 12, and on every call puts the frame from the table at $5F43 in $60BC. Called by $5F9F."
  },
  {
   "address": 24444,
   "type": "line",
   "text": "Advances the climb frame downwards: toggles $5908 and, on every other call, steps $58E3 through 12, and on every call puts the frame from the table at $5F4F in $60BC. Called by $5F9F."
  },
  {
   "address": 24477,
   "type": "line",
   "text": "Low byte of the camera height $FD plus the player's screen height $1D81, worked out by $5F9F; it allows a climb upwards only from $00FA on."
  },
  {
   "address": 24478,
   "type": "line",
   "text": "High byte of the sum in $5F9D, worked out by $5F9F."
  },
  {
   "address": 24479,
   "type": "line",
   "text": "Player state 4, climbing (entry 4 of the table at $58A5). Works out the camera height plus the player's height into $5F9D/$5F9E, sets the jump delay $5AC2 to 10 and moves him 1 line up (up held, only when that sum is $00FA or more, frames from $5F5B, $5F42 set to 1) or 1 line down (down held, frames from $5F7C, $5F42 set to 0). While the tile below him is $0F, $10, $0D or $0E the climb goes on; otherwise it returns to state 1 with the crouch delay $5AC0 set to 4 and the standing frame ($9A right, $A0 left), and a climb that went up ends 2 lines lower."
  },
  {
   "address": 24632,
   "type": "line",
   "text": "Clears the sorted sprite list at $0010 (puts $FF at the place each of the 11 slots had last frame, kept in $02-$0C), then turns each slot's world position ($79/$B1 across, $95/$CD down) into a screen position by subtracting the camera ($FB-$FE): across into $87,X and $BF,X, down into $A3,X and $DB,X. A slot off the screen (X of $0150 or more, or height outside $23 to $C7) gets place 0; one on the screen goes to the first free place from its height / 2 in the list, and its place is kept in $02,X. Ends the list with $64 in $78. Called by the top interrupt at $6478, before the multiplexer $6593."
  },
  {
   "address": 24764,
   "type": "line",
   "text": "Sprite pointer value of the player's main frame, used by $60C0 in every case."
  },
  {
   "address": 24765,
   "type": "line",
   "text": "Sprite pointer for the player's sprite 2 while he punches, strikes or crouches; read by $60C0."
  },
  {
   "address": 24766,
   "type": "line",
   "text": "Sprite pointer for the player's sprite 0 while he punches, strikes or crouches; read by $60C0."
  },
  {
   "address": 24767,
   "type": "line",
   "text": "Sprite pointer for the player's sprite 1 while he punches, strikes or crouches; read by $60C0."
  },
  {
   "address": 24768,
   "type": "line",
   "text": "Writes the player's three sprite pointers into both screens' tables ($CFF8-$CFFA and $CBF8-$CBFA). The state drawn is $58A4, or the value in $5E2F when that is non-zero (which it then clears). For states 2 and 3 sprite 2 gets $60BC and sprites 0 and 1 get that plus 2 and plus 4, for state 4 the pointers are $60BC (sprite 2), plus $24 (sprite 0) and plus $2E (sprite 1); while the punch timer $5B4C, the crouch flag $5ABF or the strike timer $5ABE is set they come from $60BD (sprite 2), $60BE (sprite 0) and $60BF (sprite 1), and otherwise sprite 0 gets $60BC, sprite 1 that plus $0D and sprite 2 that minus $17. Called by $58B7."
  },
  {
   "address": 24923,
   "type": "line",
   "text": "Called by the hit test $101C with X the slot and Y the object. Takes 2 (when $101B is set) or 1 from the object's energy $0B7D and adds 4 to the score digit 5 ($788B); when the energy is already zero it instead copies the slot's state to the object's counter $0AEB, sets the slot and the object to state $10, sets the next object's counter $0AEC to $FE and adds 8 to the score digit 5."
  },
  {
   "address": 24968,
   "type": "line",
   "text": "Holds the slot index saved by $617D: the immediate operand of the LDX at $6187."
  },
  {
   "address": 25000,
   "type": "line",
   "text": "Holds the slot index saved by $619D: the immediate operand of the LDX at $61A7."
  },
  {
   "address": 25002,
   "type": "line",
   "text": "Sprite pointers of behaviour $6222 for variant 0, indexed by the phase $0A6A (0 to $1D): $18 ten times, then 20 zeros (no picture). Variant 1 reads the 30 bytes from $61E6 instead: $1C ten times (the end of follow_frames_a) and the zeros of knocked_frames_1_tail."
  },
  {
   "address": 25032,
   "type": "line",
   "text": "Sprite pointers $19, $1A, $1B and $1C, ten each, indexed by the phase $0A6A of the previous slot: the frame $1C47 gives a state 7 slot of variant 0 when the previous slot is in state $10. The extent is the run of the pattern."
  },
  {
   "address": 25072,
   "type": "line",
   "text": "The last 20 entries (all zero, no picture) of the variant 1 table of behaviour $6222, which starts at $61E6 with the ten $1C that end follow_frames_a ($61C8)."
  },
  {
   "address": 25092,
   "type": "line",
   "text": "Sprite pointers $19, $1D and $1E, ten each, indexed by the phase: the frame $1C47 gives a state 7 slot of variant 1 when the previous slot is in state $10. It ends where the code at $6222 begins."
  },
  {
   "address": 25122,
   "type": "line",
   "text": "Behaviour for state $10 (entry 16 of the table at $11F5), which $615B gives an enemy whose energy has run out. Colour 0, multicolour. The phase $0A6A (which the hit test $101C has just cleared) steps with the counter of the next object ($0AEC, which $615B sets to $FE): at $1E or more it counts up to $1D, below that down to 0. The pointer comes from $61E6 (variant 1) or $61AA by the phase: ten frames of one shape, then 0, so the enemy shows for ten frames and disappears."
  },
  {
   "address": 25198,
   "type": "line",
   "text": "No caller: nothing calls, jumps to or points at it. Sets the object's energy $0B7D to 3 and gives slot and object the state that $615B saved in the counter $0AEB (a 14 or 15 less $0D, so 1 or 2), then the walking pointer for it: 5 ($14 for variant 1) for state 1 and 2 ($10) for state 2. It would turn a knocked-down enemy back into a walking one."
  },
  {
   "address": 25257,
   "type": "line",
   "text": "Sets the screen matrix bits of $D018 to $30 (screen at $CC00) when $1EC8 is zero and to $20 ($C800) when it is not, keeping the other bits. Called by the top interrupt at $6451."
  },
  {
   "address": 25279,
   "type": "line",
   "text": "Raster interrupt 2 of 3 (vector $62BF), on line $C5 (set by $6428). Saves A, X and Y in the operands at $6387, $6389 and $638B, moves sprites 3-7 to line $0A, clears all sprite pointers $CFF8-$CFFF and $CBF8-$CBFF, turns the sprites off, writes $D018 for screen $CC00 and ORs $4F into $D011 for the panel, and acknowledges the interrupt. It counts down $5365 and the recoil $155D, reads joystick port 2 ($DC00, $DC01) into $1EC5 and $1EC6 unless the recoil is running, sets the character set bits of $D018 to 8, runs the timer $948A and toggles $638E (counting $638D down on every second frame). It sets line $CD and the vector $638F for the next interrupt."
  },
  {
   "address": 25479,
   "type": "line",
   "text": "Holds the interrupted program's A register, stored by $62BF on entry: the immediate operand of the LDA at $6386."
  },
  {
   "address": 25481,
   "type": "line",
   "text": "Holds the interrupted program's X register, stored by $62C2 on entry: the immediate operand of the LDX at $6388."
  },
  {
   "address": 25483,
   "type": "line",
   "text": "Holds the interrupted program's Y register, stored by $62C5 on entry: the immediate operand of the LDY at $638A."
  },
  {
   "address": 25485,
   "type": "line",
   "text": "Counted down on every second frame by $62BF while it is not zero; nothing else in the traced code reads it."
  },
  {
   "address": 25486,
   "type": "line",
   "text": "Toggled every frame by $62BF."
  },
  {
   "address": 25487,
   "type": "line",
   "text": "Raster interrupt 3 of 3 (vector $638F), on line $CD (set by $62BF). Saves A, X and Y in the operands at $63E4, $63E6 and $63E8, ORs $2F into $D011 and $17 into $D016 and writes them back after 18 NOPs, which switches the status panel on (bitmap mode, multicolour), acknowledges the interrupt, sets raster line 1 and the vector $6428, clears bit 6 of $D011 and calls the scroll step $1ECD unless the banner flag $771A is set. It then restores A, X and Y and returns."
  },
  {
   "address": 25578,
   "type": "line",
   "text": "1 while the game is paused ($739B); the interrupts and routines skip the moving parts while it is set. Also set by the wipe $93AB."
  },
  {
   "address": 25579,
   "type": "line",
   "text": "Moves sprite 0 ($D000) by 8 pixels along X while the punch timer $5B4C runs, or sprite 1 ($D002) while the strike timer $5ABE runs, to the right when the player faces right ($594B zero) and to the left otherwise; does nothing when neither timer runs. Called by the top interrupt at $64E4."
  },
  {
   "address": 25639,
   "type": "line",
   "text": "0 during the first multiplexer pass of a frame and 1 during the second; cleared and then incremented by the top interrupt $6428 and read by $6593."
  },
  {
   "address": 25640,
   "type": "line",
   "text": "Raster interrupt 1 of 3 (vector $6428), on line 1 (set by $638F). Saves A, X and Y in the operands at $652E, $6530 and $6532, sets the fine scroll from $1EC2 ($D016) and $1EC3 ($D011), $D018 to $34, the screen ($62A9) and the multicolours. With the banner flag $771A set it calls $75EE and leaves. Otherwise it sorts the sprites ($6038), sets sprite 3 up as the countdown (pointer $FE, X $12F, Y $3B), turns the sprites on unless the wipe flag $93A9 is set, runs the first multiplexer pass ($6593, limit $29), the player ($58B7), the player's sprite positions (X $1D80, Y $1D81) and $63EB, and plays the sound ($B176). Sprites 0 and 1 are white while the recoil $155D is non-zero. A second pass ($6593, limit $8C), $6A61, the object update $117E and $7441 follow, then line $C5 and the vector $62BF."
  },
  {
   "address": 25908,
   "type": "line",
   "text": "Busy-wait: the outer count is A and the inner count is A as well (X and Y both start from A), so the callers' values from $14 to $FF give delays from a few milliseconds to about a third of a second. Used by the wipe, the game over, continue and briefing screens."
  },
  {
   "address": 25917,
   "type": "line",
   "text": "Returns a pseudo-random byte in A. It stores the low three bits of CIA 1 timer A ($DC04) as the offset of the branch at $654D, adds the timer's high byte ($DC05) to the seed $655C, and rotates the sum left through the carry (set) by a number of places from 2 to 9 that the patched branch picks. The result is the new seed and the return value. Called by the behaviours at $171D, $1751, $1966 and $199A, which compare it with a limit."
  },
  {
   "address": 25934,
   "type": "line",
   "text": "The offset of the BCS at $654D, rewritten by $653D (at $6542) with the low three bits of $DC04, so that the branch lands between $654F and $6556 in the chain of ROL instructions up to $6557. The file holds $FE."
  },
  {
   "address": 25948,
   "type": "line",
   "text": "The seed of $653D: replaced by each result. The file holds $80."
  },
  {
   "address": 25949,
   "type": "line",
   "text": "Starts with RTS, so it returns at once; the bytes after it are unused_check ($655E), which nothing reaches while the RTS is there. Called once per pass by the main loop at $1E18."
  },
  {
   "address": 25950,
   "type": "line",
   "text": "Reads $DD00 (CIA 2 port A) and returns when bit 2 is set. When it is clear it removes three bytes from the stack (three PLA), disables interrupts and jumps to $0810. Nothing reaches it: the main loop calls $655D, which is an RTS."
  },
  {
   "address": 25965,
   "type": "line",
   "text": "Fills the 1 KB screen matrix at $CC00-$CFFF with A. Called by the setup, the game over, continue and briefing screens."
  },
  {
   "address": 25983,
   "type": "line",
   "text": "Fills colour RAM $D800-$DBFF with A. Called by the game over, continue and briefing screens."
  },
  {
   "address": 26001,
   "type": "line",
   "text": "Index into the sprite list at $0010 of the last slot the multiplexer handled; set to $10 by the top interrupt before each frame's first pass."
  },
  {
   "address": 26002,
   "type": "line",
   "text": "Raster line limit for the multiplexer: $29 for the first pass, $8C for the second."
  },
  {
   "address": 26003,
   "type": "line",
   "text": "Sprite multiplexer for sprites 3 to 7, called twice a frame by the top interrupt $6428 (with the raster limit $29 and then $8C in $6592). Takes the next entry of the sorted sprite list at $0010 (position kept in $6591, $64 ends the list) and, while the raster line is below the limit, gives it the next of the five sprites whose previous slot has finished (its height more than $15 lines above the raster): height into $D007, $D009, $D00B, $D00D or $D00F, X into $D006, $D008, $D00A, $D00C or $D00E with its ninth bit in $D010, the pointer $0A32 into both screens' tables ($CFFB-$CFFF and $CBFB-$CBFF), the colour $0A40 and the multicolour bit $0A4E. On the first pass ($6427 zero) sprite 3 is left out and the order starts with sprite 4."
  },
  {
   "address": 26512,
   "type": "line",
   "text": "Bit masks for sprites 2 to 7 ($04, $08, $10, $20, $40, $80) followed by their complements ($FB, $F7, $EF, $DF, $BF, $7F). No code reads them: the multiplexer $6593 and the interrupts use immediate masks."
  },
  {
   "address": 26524,
   "type": "line",
   "text": "Set when the lower colours are to be copied from the buffer $712F; read and cleared by $6A61 and cleared by the setup. The traced code does not set it."
  },
  {
   "address": 26525,
   "type": "line",
   "text": "Copies the colour buffer's rows 10 to 12 ($70B7-$712D, 39 colours of each row of 40) to colour RAM from $D990, and sets the flag $679C so that the interrupt copies rows 13 to 18 ($6A61). Called by the finish phase of every scroll ($202C, $258B, $2924 and others)."
  },
  {
   "address": 27233,
   "type": "line",
   "text": "When the flag $679C is set, clears it and copies the colour buffer $712F-$721D to colour RAM $DA08-$DAF6 (screen rows 13 to 18, 39 characters in each, leaving out the last column of each row); otherwise returns at once. Called every frame by the top interrupt at $650D."
  },
  {
   "address": 28180,
   "type": "line",
   "text": "Last part of the copy of the colour buffer $712F-$721D to colour RAM: screen rows 17 and 18, 39 colours each from $71CF and $71F7 to $DAA8 and $DAD0, ending with the RTS at $6FE8."
  },
  {
   "address": 28649,
   "type": "line",
   "text": "No caller: nothing calls or jumps to it. Jumps to colour_buffer_from_cc ($3867) when the buffer flag $1EC8 is non-zero and to colour_buffer_from_c8 ($44BF) when it is zero; the phase 2 routines of the scrolls make the same choice themselves."
  },
  {
   "address": 28660,
   "type": "line",
   "text": "Fills colour RAM rows 0 to 9 ($D800-$D98F) from the matrix just made: for each column Y from $28 down to 0 and each of the 10 rows it looks up the colour of the character in the colour table $BF00. It reads $C800 when the buffer flag $1EC8 is 0 and $CC00 when it is 1. Called by the finish phase of every scroll ($2029, $2588, $2921 and others)."
  },
  {
   "address": 28855,
   "type": "line",
   "text": "Colours for screen rows 10 to 12, 40 bytes a row (120 bytes), built from the screen matrix by $3867 and $44BF (columns 0 to 38 of each row; the last byte of each row is never written) and copied to colour RAM from $D990 by $679D. Rows 13 to 18 follow at $712F."
  },
  {
   "address": 28975,
   "type": "line",
   "text": "Colours for screen rows 13 to 18, 40 bytes a row, one for each character; $6A61 copies 39 of each 40 to colour RAM from $DA08. The extent is what $6A61 reads."
  },
  {
   "address": 29335,
   "type": "line",
   "text": "Table of 77 16-bit pointers to the map rows, the first one twice: entry k from 1 on is $7CEE + 64 x (k - 1). It starts on an odd address because $1D06 reads the low byte from $7297,X and the high byte from $7298,X with X twice the map row. The last four rows (72 to 75, ending at $8FAE) point at $8EEE on, which holds the paths and not map rows."
  },
  {
   "address": 29489,
   "type": "line",
   "text": "Six bytes after the last row pointer: 0, 0, 0, 0, 4, 4. No code reads them."
  },
  {
   "address": 29495,
   "type": "line",
   "text": "Draws the opening view: 10 rows of tiles from the map at $7E58 (64 bytes a row) into the screen at $CC00, each row as the right half of its first tile ($74E9) and 19 whole tiles ($74AB), with the bottom half left out for the tenth row. It then sets the colour RAM at $D800-$DAFF from the colour table at $BF00 indexed by each character. Called once by the setup $5118."
  },
  {
   "address": 29595,
   "type": "line",
   "text": "Pause: when the key code in $9A80 is $50, sets the paused flag $63EA, waits for the key to be released, pressed again and released, then clears $63EA. Called by the main loop at $1E33."
  },
  {
   "address": 29634,
   "type": "line",
   "text": "Copies the 73 entries of the 14 object tables from the level data at $78F0-$7CED into the working tables $0AA2-$0E9F (type, counter, flag, energy, variant, second flag, left and right limits, X and Y), clears the slot links $0EAE and the active flags $0FC0, and zeroes the 14-byte slot tables $0A5C, $0A78, $0A86, $0A94, $0EA0 and $1170. Called once by the setup $5118."
  },
  {
   "address": 29761,
   "type": "line",
   "text": "Counts the three-digit countdown $1D82-$1D84 (units first) down by one every seventh frame, using the delay $1E14 that it reloads with 6. Does nothing while the game is paused ($63EA); when the flag $5117 is zero it clears the three digits instead, and when all three are zero it returns. Called by the top interrupt at $6513."
  },
  {
   "address": 29866,
   "type": "line",
   "text": "The tile row number (0 to 9) that $7337 passes in X; $74AB and $74E9 keep it here and leave the bottom half of the tile out when it is 9."
  },
  {
   "address": 29867,
   "type": "line",
   "text": "Writes tile A as two by two characters at the screen pointer $ED/$EE: the top pair from the table at $90BE and, unless the tile row in $74AA is 9, the bottom pair from $915C to the row below; then moves the pointer on 2 characters. Keeps X and Y in the operands at $74E5 and $74E7. Called by $7337."
  },
  {
   "address": 29925,
   "type": "line",
   "text": "Holds the X register saved by $74AB: the immediate operand of the LDX at $74E4."
  },
  {
   "address": 29927,
   "type": "line",
   "text": "Holds the Y register saved by $74B1: the immediate operand of the LDY at $74E6."
  },
  {
   "address": 29929,
   "type": "line",
   "text": "Writes only the right half of tile A at the screen pointer $ED/$EE: the top right character from $90BF and, unless the tile row in $74AA is 9, the bottom right character from $915D to the row below; then moves the pointer on 1 character. Keeps X and Y in the operands at $7517 and $7519. Used by $7337 for the first tile of each row."
  },
  {
   "address": 29975,
   "type": "line",
   "text": "Holds the X register saved by $74E9: the immediate operand of the LDX at $7516."
  },
  {
   "address": 29977,
   "type": "line",
   "text": "Holds the Y register saved by $74EF: the immediate operand of the LDY at $7518."
  },
  {
   "address": 29979,
   "type": "line",
   "text": "Tests whether a slot in state 7 (the follower behaviour $1C47) stands in the player's way to the left. Returns A=0 at once when the resident flag $0A10 is non-zero. Otherwise it goes through slots $0A down to 0 in state 7 whose previous object's slot is not in state $10 and returns A=1 when the slot's screen X $87,X (high byte $BF,X zero) is at or up to $13 left of the player's $1D80 and the player's $1D81 is at most $13 lines below, or $27 lines above, the slot's height $A3,X minus $15 ($52F4); A=0 if no slot is. Called by the player states ($5A2A, $5B7B, $5D2D, $5E88) before a step left."
  },
  {
   "address": 30043,
   "type": "line",
   "text": "A lone RTS right after the jump at $7558 in blocked_left: no branch, jump or call reaches it."
  },
  {
   "address": 30044,
   "type": "line",
   "text": "Second part of blocked_left ($751B). Reached by the branch at $754E when the player's height $1D81 is below the follower's height minus $15 (kept in $52F4): it gives up unless the follower is less than $28 lines below the player. From $7567, which the first part also reaches, the follower counts only when its screen X high byte $BF is 0 and its screen X $87 is the player's $1D80 or less than $14 below it; it returns A=1 then and otherwise goes back to the slot loop at $7529."
  },
  {
   "address": 30084,
   "type": "line",
   "text": "The same test as $751B for a step to the right: returns A=1 when a slot in state 7 has its screen X at or up to $13 right of the player's $1D80 (same height test), otherwise A=0. Called by the player states ($5A4C, $5BC3, $5D5B, $5EB6) before a step right."
  },
  {
   "address": 30148,
   "type": "line",
   "text": "A lone RTS right after the jump at $75C1 in blocked_right: no branch, jump or call reaches it."
  },
  {
   "address": 30149,
   "type": "line",
   "text": "Second part of blocked_right ($7584). Reached by the branch at $75B7 when the player's height $1D81 is below the follower's height minus $15 (kept in $52F4): it gives up unless the follower is less than $28 lines below the player. From $75D0, which the first part also reaches, the follower counts only when its screen X high byte $BF is 0 and its screen X $87 is the player's $1D80 or more than the player's by less than $14 (it returns A=1 then); otherwise it goes back to the slot loop at $7592."
  },
  {
   "address": 30190,
   "type": "line",
   "text": "Called by the top interrupt at $646D while the banner flag $771A is set. Turns on all eight sprites as multicolour with colour $0F, sets their X positions ($87, $9F, $B7 and $CF, in two rows of four) and busy-waits on the raster until line $96: below line $62 it sets heights $3C and $51 and the pointers $C5-$CC through $76C7, and from line $62 to $91 it moves sprites 0-3 to height $66, sets the pointers $CD-$D4 and puts sprites 4-7 21 lines below the raster line it read. Probably draws a large picture across the screen."
  },
  {
   "address": 30407,
   "type": "line",
   "text": "Sets the heights of sprites 0-3 to A and of sprites 4-7 to A plus $15, then falls into $76E2."
  },
  {
   "address": 30434,
   "type": "line",
   "text": "Sets the eight sprite pointers in both screens' tables ($CFF8-$CFFF and $CBF8-$CBFF) to X, X+1, up to X+7."
  },
  {
   "address": 30490,
   "type": "line",
   "text": "1 while the banner at $75EE is on; the top interrupt $6428 and the scroll step $1ECD read it and $771E clears it at the end. The traced code does not set it."
  },
  {
   "address": 30491,
   "type": "line",
   "text": "Frames of the banner left, counted down by $771E; $C8 starts it. The traced code does not set it."
  },
  {
   "address": 30492,
   "type": "line",
   "text": "Set to 1 by $771E once the banner has run; the banner step does nothing after that."
  },
  {
   "address": 30493,
   "type": "line",
   "text": "The RTS that the early exits of banner_step ($771E) branch to, just before it."
  },
  {
   "address": 30494,
   "type": "line",
   "text": "Called by the main loop at $1E27. Returns at once when $771C is set or the banner flag $771A is clear. When the timer $771B holds $C8 it blacks the colour RAM of the playfield ($D800-$DAF7); it counts $771B down and when it reaches 1 puts the colours back from the screen matrix on show ($1EC8 picks $C800 or $CC00) through the table at $BF00, sets $771C and clears $771A. Nothing in the traced code sets $771A."
  },
  {
   "address": 30654,
   "type": "line",
   "text": "The four masks $FC, $F0, $C0 and $00 that $7803 uses to take pixels off the end of the energy bar."
  },
  {
   "address": 30658,
   "type": "line",
   "text": "64 bytes of shapes for the eight characters of the energy bar, built by $7803 and copied to $FAC8."
  },
  {
   "address": 30722,
   "type": "line",
   "text": "Counter of $7803: starts at the energy $5366 and counts up to $21 as the bar's pixels are masked off."
  },
  {
   "address": 30723,
   "type": "line",
   "text": "Builds the energy bar: fills 8 characters of the panel ($CF59 on, colour 5 at $DB59) with the code $1D, writes a striped pattern into the eight character shapes at $77C2, masks off 2 pixels for each step by which the energy $5366 is below $21 (mask table at $77BE) and copies the 64 bytes at $77C2 to the character set at $FAC8. Called by the main loop at $1E1E."
  },
  {
   "address": 30859,
   "type": "line",
   "text": "Adds A to the decimal digit $0A00+X and carries towards the more significant digits (X counting down) until a digit does not overflow; keeps Y. Digit 6 is the units, so the 4 and 8 added to digit 5 by $615B are 40 and 80 points."
  },
  {
   "address": 30902,
   "type": "line",
   "text": "Scratch of $788B: the amount to add, then the carry to the next digit."
  },
  {
   "address": 30903,
   "type": "line",
   "text": "Draws the seven digits from $0A00 on into the panel's character shapes at $FA58 (8 bytes each, from the digit shapes at $1DC4) through $78CA. Called by the main loop at $1E2A."
  },
  {
   "address": 30922,
   "type": "line",
   "text": "Copies the 8-byte shape of digit $0A00+X from $1DC4 to the pointer $85/$86 and moves the pointer on 8 bytes; keeps X. Called seven times by $78B7."
  },
  {
   "address": 30960,
   "type": "line",
   "text": "The 73 starting types of the objects, copied to $0AA2 by $73C2 (the 14 tables from $78F0 to $7CED are 73 bytes apart)."
  },
  {
   "address": 31033,
   "type": "line",
   "text": "The 73 starting counters, copied to $0AEB by $73C2 (the 14 tables from $78F0 to $7CED are 73 bytes apart)."
  },
  {
   "address": 31106,
   "type": "line",
   "text": "The 73 starting flags, copied to $0B34 by $73C2 (the 14 tables from $78F0 to $7CED are 73 bytes apart)."
  },
  {
   "address": 31179,
   "type": "line",
   "text": "The 73 starting energy, copied to $0B7D by $73C2 (the 14 tables from $78F0 to $7CED are 73 bytes apart)."
  },
  {
   "address": 31252,
   "type": "line",
   "text": "The 73 variant flags, copied to $0BC6 by $73C2 (the 14 tables from $78F0 to $7CED are 73 bytes apart)."
  },
  {
   "address": 31325,
   "type": "line",
   "text": "The 73 starting values of the second flag, copied to $0C0F by $73C2 (the 14 tables from $78F0 to $7CED are 73 bytes apart)."
  },
  {
   "address": 31398,
   "type": "line",
   "text": "The 73 left limits of the walks, low bytes, copied to $0C58 by $73C2 (the 14 tables from $78F0 to $7CED are 73 bytes apart)."
  },
  {
   "address": 31471,
   "type": "line",
   "text": "The 73 left limits of the walks, high bytes, copied to $0CA1 by $73C2 (the 14 tables from $78F0 to $7CED are 73 bytes apart)."
  },
  {
   "address": 31544,
   "type": "line",
   "text": "The 73 right limits of the walks, low bytes, copied to $0CEA by $73C2 (the 14 tables from $78F0 to $7CED are 73 bytes apart)."
  },
  {
   "address": 31617,
   "type": "line",
   "text": "The 73 right limits of the walks, high bytes, copied to $0D33 by $73C2 (the 14 tables from $78F0 to $7CED are 73 bytes apart)."
  },
  {
   "address": 31690,
   "type": "line",
   "text": "The 73 starting world X, low bytes, copied to $0D7C by $73C2 (the 14 tables from $78F0 to $7CED are 73 bytes apart)."
  },
  {
   "address": 31763,
   "type": "line",
   "text": "The 73 starting world X, high bytes, copied to $0DC5 by $73C2 (the 14 tables from $78F0 to $7CED are 73 bytes apart)."
  },
  {
   "address": 31836,
   "type": "line",
   "text": "The 73 starting world Y, low bytes, copied to $0E0E by $73C2 (the 14 tables from $78F0 to $7CED are 73 bytes apart)."
  },
  {
   "address": 31909,
   "type": "line",
   "text": "The 73 starting world Y, high bytes, copied to $0E57 by $73C2 (the 14 tables from $78F0 to $7CED are 73 bytes apart)."
  },
  {
   "address": 31982,
   "type": "line",
   "text": "The level map: 72 rows of 64 tile numbers (0 to 61), row r at $7CEE + 64 x r (pointers in map_row_pointers). A tile number picks two characters of the top row from tile_top_chars ($90BE) and two of the bottom row from tile_bottom_chars ($915C), which $7337 and the scroll routines draw two by two. Column 0 is tile $0C in 68 rows, column 1 is $08 in 61, column 58 is $08 in 66 and columns 60 to 63 are $0C in 67; rows 70 and 71 are all tile 5. This symbol covers the map from row 0 column 0 ($7CEE) to row 12 column 17 ($7FFF): of its 786 numbers, tile $15 296, tile $0C 129, tile $00 68."
  },
  {
   "address": 32768,
   "type": "line",
   "text": "The level map, from row 12 column 18 ($8000) to row 28 column 17 ($83FF) (a symbol reaches at most to a $8000 edge or 1,024 bytes): of its 1,024 numbers, tile $15 225, tile $00 107, tile $0C 96."
  },
  {
   "address": 33792,
   "type": "line",
   "text": "The level map, from row 28 column 18 ($8400) to row 44 column 17 ($87FF): of its 1,024 numbers, tile $15 338, tile $00 115, tile $05 112."
  },
  {
   "address": 34816,
   "type": "line",
   "text": "The level map, from row 44 column 18 ($8800) to row 60 column 17 ($8BFF): of its 1,024 numbers, tile $15 265, tile $00 113, tile $0C 96."
  },
  {
   "address": 35840,
   "type": "line",
   "text": "The level map, from row 60 column 18 ($8C00) to row 71 column 63 ($8EED): of its 750 numbers, tile $15 194, tile $05 134, tile $01 70."
  },
  {
   "address": 36590,
   "type": "line",
   "text": "Two bytes of $7F after the last map row, the pair that also ends each of the three paths that follow. No code addresses them."
  },
  {
   "address": 36592,
   "type": "line",
   "text": "Path 0 of behaviour $5398 (variant 0), 154 bytes: 76 pairs of signed bytes, the X offset and then the Y offset from the object's anchor, one pair a frame, ended by $7F, $7F. Both offsets run from -12 to +13, a loop round the anchor."
  },
  {
   "address": 36746,
   "type": "line",
   "text": "Path 1 of behaviour $5398 (variant 1), 154 bytes: 76 pairs of signed bytes, the X offset and then the Y offset from the object's anchor, ended by $7F, $7F. The X offsets run from -24 to +25 and the Y offsets from -25 to +24, a loop round the anchor."
  },
  {
   "address": 36900,
   "type": "line",
   "text": "Path 2 of behaviour $5398 (variant 2), 154 bytes: 76 pairs of signed bytes, the X offset and then the Y offset from the object's anchor, ended by $7F, $7F. The X offsets run from -36 to +37 and the Y offsets from -37 to +35, a loop round the anchor."
  },
  {
   "address": 37054,
   "type": "line",
   "text": "For each tile (index times 2) the two screen codes of its top row; the characters count in strips of 40 across the character set. Read by $74AB and $74E9. The extent is the pattern up to the text at $913A."
  },
  {
   "address": 37178,
   "type": "line",
   "text": "34 bytes in screen codes after tile_top_chars that nothing reads: \"TRACK  AND  DARKMAN  IS\", $FF, \" CORNERED \" (letters as 1 to 26, doubled spaces as in the briefing), with no closing $FF. The table tile_bottom_chars starts right after it."
  },
  {
   "address": 37212,
   "type": "line",
   "text": "For each tile (index times 2) the two screen codes of its bottom row, read by $74AB and $74E9. The extent is the pattern up to the panel characters at $91DC."
  },
  {
   "address": 37340,
   "type": "line",
   "text": "The 200 screen codes of the status panel (5 rows of 40), copied to $CEF7 by $52C4."
  },
  {
   "address": 37540,
   "type": "line",
   "text": "The 200 colours of the status panel, copied to colour RAM $DAF7 by $52C4."
  },
  {
   "address": 37740,
   "type": "line",
   "text": "Lengths of the 56 diagonal lines of the wipe in $93AB."
  },
  {
   "address": 37796,
   "type": "line",
   "text": "The last two entries (1 and 0) of wipe_lengths: the wipe $93AB stops at line $38 (56), so it never reads them."
  },
  {
   "address": 37798,
   "type": "line",
   "text": "Characters still to clear on the diagonal line $93AB is drawing: loaded from $936C and counted down until it is zero."
  },
  {
   "address": 37799,
   "type": "line",
   "text": "Low byte of the screen address where the current diagonal line of $93AB starts; the next line starts one step on."
  },
  {
   "address": 37800,
   "type": "line",
   "text": "High byte of the screen address where the current diagonal line of $93AB starts ($CC at the first line)."
  },
  {
   "address": 37801,
   "type": "line",
   "text": "Set to 1 by $93AB and cleared by the setup; while it is set the top interrupt $6428 does not turn the sprites on."
  },
  {
   "address": 37803,
   "type": "line",
   "text": "Wipes the screen: sets the wipe flag $93A9 and the pause flag $63EA, then clears both screen matrices ($CC00 and $C800) in 56 diagonal lines, each stepping 39 characters from its start with the lengths taken from $936C, a delay through $6534 after each, and clears the pause flag at the end. The first 39 lines start along the top row, the rest down the right edge. Called by the main loop before it leaves the level, by the game over screen and when the NMI ends the level."
  },
  {
   "address": 37892,
   "type": "line",
   "text": "Holds the line index saved by $93F8: the immediate operand of the LDX at $9403."
  },
  {
   "address": 37894,
   "type": "line",
   "text": "Holds the Y register saved by $93FB: the immediate operand of the LDY at $9405."
  },
  {
   "address": 37961,
   "type": "line",
   "text": "The three digits of the countdown timer, $9449 the units to $944B the hundreds; set at the start to 500 when $0A10 is set."
  },
  {
   "address": 37962,
   "type": "line",
   "text": "The countdown timer's tens digit (0 to 9), the middle one of the three timer digits; counted down by $948A when the units digit wraps from 0 to 9."
  },
  {
   "address": 37963,
   "type": "line",
   "text": "The countdown timer's hundreds digit; counted down by $948A when the tens digit wraps. The timer starts at 500 when $0A10 is set."
  },
  {
   "address": 37964,
   "type": "line",
   "text": "Draws the three timer digits into the panel's character shapes at $F9D8 (hundreds, $944B), $F9E8 (tens, $944A) and $F9F0 (units, $9449) through $9474. Called by the main loop at $1E2D."
  },
  {
   "address": 38004,
   "type": "line",
   "text": "Copies the 8-byte shape of the timer digit $9449+X from $1DC4 to the pointer $85/$86. Called three times by $944C."
  },
  {
   "address": 38025,
   "type": "line",
   "text": "Alternates 1 and 0 on each call of $948A, which counts the timer down only when it finds 0."
  },
  {
   "address": 38026,
   "type": "line",
   "text": "Called by the middle interrupt $62BF at $6366 every frame; does nothing while the game is paused ($63EA). When the three timer digits $9449-$944B are zero it clears $0A10 and sets the timer state $94FD to 1; otherwise on every second call ($9489 alternates 1 and 0) it counts the digits down by one, the units first."
  },
  {
   "address": 38124,
   "type": "line",
   "text": "Called by the main loop at $1E30. When the timer state $94FD is 1 it sets it to 2 and runs $9567, which replaces the timer's picture in the panel; in any other state it does nothing."
  },
  {
   "address": 38141,
   "type": "line",
   "text": "Set to 1 by $948A when the timer reaches zero; $94EC then steps it to 2 and changes the panel graphics."
  },
  {
   "address": 38142,
   "type": "line",
   "text": "Copies a picture of 6 by 5 characters into the panel: the shapes (48 bytes each from $96FC, $972C, $975C, $978C and $97BC to $F8C0, $FA00, $FB40, $FC80 and $FDC0), the colours (6 bytes each from $97EC-$9804 to $DB18-$DBB8) and the screen codes (from $980A-$9822 to $CF18-$CFB8). Drawn by $52C4 while $0A10 is set."
  },
  {
   "address": 38247,
   "type": "line",
   "text": "The same copy as $94FE from the other set of data ($95D0-$96FB): the shapes from $95D0, $9600, $9630, $9660 and $9690, the colours from $96C0-$96D8 and the screen codes from $96DE-$96F6. Drawn by $52C4 when $0A10 is clear and by $94EC when the timer runs out."
  },
  {
   "address": 38352,
   "type": "line",
   "text": "The set of data $9567 copies into the panel: 5 rows of 48 bytes of shapes, then 5 rows of 6 colours ($96C0) and 5 rows of 6 screen codes ($96DE). The picture drawn when $0A10 is clear or the timer has run out."
  },
  {
   "address": 38652,
   "type": "line",
   "text": "The set of data $94FE copies into the panel: 5 rows of 48 bytes of shapes, then 5 rows of 6 colours ($97EC) and 5 rows of 6 screen codes ($980A). The picture drawn while $0A10 is set."
  },
  {
   "address": 38952,
   "type": "line",
   "text": "Writes the continue screen's texts \"PRESS FIRE TO CONTINUE\" from $9875 at $CD49 and \"CREDITS\" from $988C at $CF8C, adding $66 to each code and turning $20 into 0 (each ends at $FF), then the digit of $0A12 at $CF94 and the digit of $9873 at $CE1C (both as $8A plus the digit). Called by $98A4."
  },
  {
   "address": 39027,
   "type": "line",
   "text": "The countdown shown on the continue screen, from 9; counted down by $98A4 and drawn by $9828."
  },
  {
   "address": 39028,
   "type": "line",
   "text": "Set to 1 by $9B76 when the briefing has ended; nothing else in the traced code reads it."
  },
  {
   "address": 39029,
   "type": "line",
   "text": "\"PRESS FIRE TO CONTINUE\" in screen codes, ended by $FF; written by $9828."
  },
  {
   "address": 39052,
   "type": "line",
   "text": "\"CREDITS\" followed by spaces in screen codes, ended by $FF; written by $9828, with the digit of $0A12 after it."
  },
  {
   "address": 39075,
   "type": "line",
   "text": "Set to 1 by $98A4 when fire is pressed to continue; read by the main loop at $1E57."
  },
  {
   "address": 39076,
   "type": "line",
   "text": "The continue screen, entered from the main loop at $1E54 when the energy is zero and $0A12 (the credits) is not zero. Sets up the text screen, clears the score digits $0A00-$0A06 and $0A10, swaps the shapes ($9B3B), draws the texts through $9828 and counts $9873 down from 9 with delays; fire (bit 4 of $DC00) takes one from $0A12 and sets the continue flag $98A3 to 1, and when the count runs out the flag stays 0. Then puts the shapes back and redraws the panel ($52C4)."
  },
  {
   "address": 39240,
   "type": "line",
   "text": "136 bytes of character shapes that $9B3B swaps with the block at $C338."
  },
  {
   "address": 39376,
   "type": "line",
   "text": "136 bytes of character shapes that $9B3B swaps with the block at $C3C0."
  },
  {
   "address": 39552,
   "type": "line",
   "text": "Key code read by $9A81 and stored by $1F88; $50 pauses ($739B), $20 can end the level (main loop at $1E3E)."
  },
  {
   "address": 39553,
   "type": "line",
   "text": "Reads the keyboard with CIA 1 into A. Returns $FF at once when any of the low five bits of $DC00 AND $DC01 reads low (the test at $9A8C, so while the joystick or a key in that range is down); otherwise scans the eight rows from $9AF8, looks the key up in the table at $9AFB and returns its code (also keeping the table index in $02A7). $1F88 keeps the result in $9A80."
  },
  {
   "address": 39672,
   "type": "line",
   "text": "The row select value written to $DC00 by $9A81 while it scans the keyboard, rotated one bit for each row."
  },
  {
   "address": 39673,
   "type": "line",
   "text": "The number of the keyboard row $9A81 is scanning."
  },
  {
   "address": 39674,
   "type": "line",
   "text": "The column bits read from $DC01 for the row being scanned by $9A81."
  },
  {
   "address": 39675,
   "type": "line",
   "text": "Key codes for the 64 keys of the matrix, indexed by 8 times the column plus the row; $80 and above mean no code. Read by $9A81."
  },
  {
   "address": 39739,
   "type": "line",
   "text": "Exchanges three blocks: 136 bytes at $9948 and 136 at $99D0 with $C338 and $C3C0, and the 80 bytes of digit shapes at $1DC4 with $C450. Called to put the text screens' shapes in and to restore the play shapes."
  },
  {
   "address": 39796,
   "type": "line",
   "text": "Counts down from $1E while $9B76 types the first characters of the briefing, during which fire is not tested."
  },
  {
   "address": 39797,
   "type": "line",
   "text": "Index of the next character of the briefing text at $9C0A for $9B76."
  },
  {
   "address": 39798,
   "type": "line",
   "text": "Types the level briefing from $9C0A on the screen one character at a time, from $CC56, with a delay through $6534 after each: adds $66 to each code (a space becomes 0), $FF ends a line (the pointer moves on 2 rows) and a second $FF ends the text, which then waits for fire (bit 4 of $DC00). Fire is ignored for the first $1E characters ($9B74); pressing it later skips to the end, where $9874 is set to 1 and two long delays run. It first waits, clears the screen and fills colour RAM with 7; the setup calls $9B3B before and after it."
  },
  {
   "address": 39861,
   "type": "line",
   "text": "Holds the Y register saved by $9BAC: the immediate operand of the LDY at $9BB4."
  },
  {
   "address": 39946,
   "type": "line",
   "text": "The level briefing in screen codes (A is 1, a space is $20, ':' is $1B), lines ended by $FF and the text by a second $FF; it reads \"LEVEL FOUR: DESCENDING TO HIS LAB, DARKMAN MUST OPEN THE GAS CYLINDERS THEN SET THE BIRD ROCKING OVER THE LIGHTER AND ESCAPE BACK UP TO THE ROOFTOP: THE DOOM INTENDED FOR HIM SHALL NOW BEFALL HIS ENEMIES: END OF LINE\". Typed by $9B76."
  },
  {
   "address": 40194,
   "type": "line",
   "text": "254 bytes after the briefing text, to the end of the level file at $9DFF: mostly $FF and $00 with other values scattered between. No code reads them."
  },
  {
   "address": 48896,
   "type": "line",
   "text": "Colour for each character code, indexed by the character; $7337 and $771E read it to fill the colour RAM, and the setup $5118 ORs $08 into every entry."
  },
  {
   "address": 49152,
   "type": "line",
   "text": "Pointer $00: 64 zero bytes, the empty frame. The text screens read their character set from $C000 ($D018=$30 in the setup $5118), so these bytes are also character 0, the blank."
  },
  {
   "address": 49216,
   "type": "line",
   "text": "Sprite shapes for pointers $01 to $0B and the first 56 bytes of $0C (760 bytes). In use: $01 in the frame table $5723 (behaviour $573B); $02 and $03, an enemy walking right of variant 0 (table $189B); $05 and $06, walking left (table $1651); $04 and $07, the frames at counter $0E of the attacks $17A9 and $155E for variant 0; $08 to $0B, the frames of slot_follow below its limit (table $1CE3)."
  },
  {
   "address": 49976,
   "type": "line",
   "text": "136 bytes of character shapes in the character set that $9B3B swaps with text_shapes_a ($9948)."
  },
  {
   "address": 50112,
   "type": "line",
   "text": "136 bytes of character shapes in the character set that $9B3B swaps with text_shapes_b ($99D0)."
  },
  {
   "address": 50248,
   "type": "line",
   "text": "8 bytes between the swapped letters (char_shapes_text_b) and the swapped digits (char_shapes_digits): the font's character 137, which $9B3B leaves alone. During play they are bytes 8 to 15 of the sprite shape for pointer $11."
  },
  {
   "address": 50256,
   "type": "line",
   "text": "80 bytes of character shapes in the character set that $9B3B swaps with the digit shapes at $1DC4."
  },
  {
   "address": 50336,
   "type": "line",
   "text": "Sprite shapes from byte 32 of pointer $12 to the end of $1F (864 bytes). In use: $12 and $13 and $16 and $17, the attack frames of variant 1 ($17A9 and $155E); $14 and $15, walking left of variant 1 (table $1671); $18 (variant 0) and $1C (variant 1), the shapes of the knocked-down frames of $6222; $19 to $1C and $1D and $1E, the frames of follow_frames_a and follow_frames_b; $1F in the frame table $5723."
  },
  {
   "address": 51200,
   "type": "line",
   "text": "Screen matrix A: 25 rows of 40 characters in text mode, written by the scroll routines and the map row routine at $2B67. $D018 selects it, or screen_b, from screen_buffer ($1EC8) through $62A9."
  },
  {
   "address": 52216,
   "type": "line",
   "text": "The sprite pointers of screen A's table ($CBF8-$CBFF); the player's sprites 0 to 2 are written by $60C0, sprites 3 to 7 by the multiplexer $6593 and the banner by $76E2. Always written together with sprite_pointers_b."
  },
  {
   "address": 52224,
   "type": "line",
   "text": "Screen matrix B: the same layout as screen_a, 25 rows of 40 characters. The briefing is typed into it at $CC56 and the game over text at $CD50; the panel is drawn into it by $52C4."
  },
  {
   "address": 53240,
   "type": "line",
   "text": "The sprite pointers of screen B's table ($CFF8-$CFFF); the player's sprites 0 to 2 are written by $60C0, sprites 3 to 7 by the multiplexer $6593 and the banner by $76E2. Always written together with sprite_pointers_a."
  },
  {
   "address": 53248,
   "type": "line",
   "text": "Characters 0 to 127 of level 4's play character set (1,024 bytes, 8 bytes a character, one byte a pixel row). The top interrupt irq_top ($6428) stores $34 in $D018 at $644E, which sets the character base to $D000 and the screen to $CC00; select_screen ($62A9) then switches the screen between $CC00 and $C800 and keeps the character bits. tile_top_chars ($90BE) and tile_bottom_chars ($915C) pick the codes, and char_colours ($BF00) gives each its colour. Level 6 has a different character set here (1,823 of the 2,048 bytes differ). Only the VIC sees these bytes: with the I/O area switched in, the CPU reads the chips' registers at the same addresses."
  },
  {
   "address": 54272,
   "type": "line",
   "text": "Characters 128 to 247 of the play character set (960 bytes), the same form as play_charset_a. The tile tables reach $F3 (tile_top_chars) and $FB (tile_bottom_chars), and panel_chars ($91DC) reaches $FC, so the codes at $F8 and up are the blank characters of play_charset_blank. Only the VIC sees these bytes: with the I/O area switched in, the CPU reads the chips' registers at the same addresses."
  },
  {
   "address": 55232,
   "type": "line",
   "text": "Characters 248 to 255 (64 bytes), all zero: the blank characters. Sprite pointer $5F would read the same bytes, and pointers $5A to $5E read other characters as sprite data, so $5A to $5F are not shapes."
  },
  {
   "address": 55296,
   "type": "line",
   "text": "Shape address = $C000 + 64 x pointer. Sprite shapes for pointers $60 and $61 (128 bytes): behave_countdown_light ($1262) shows $61 for phases 7 and up and $60 below, single-colour. Read as multicolour they are scattered strokes, so the picture is not clear. Same bytes as in level 6, where no table names them."
  },
  {
   "address": 55424,
   "type": "line",
   "text": "Shape address = $C000 + 64 x pointer. Sprite shapes for pointers $62 and $63 (128 bytes): the pickup of the behaviour at $1A00, named by pickup_frames ($19F2). A round body in two sizes."
  },
  {
   "address": 55552,
   "type": "line",
   "text": "Shape address = $C000 + 64 x pointer. Sprite shapes for pointers $64 to $66 (192 bytes): three frames of the burst that lobbed_shot_steps ($1BDA) and behave_falling_burst ($57A6) run through, growing from the base like a flame."
  },
  {
   "address": 55744,
   "type": "line",
   "text": "Shape address = $C000 + 64 x pointer. Sprite shape for pointer $67 (64 bytes): a small ring, the shot picture of behave_radial_shot ($13EF), behave_lobbed_shot ($1B20), behave_path_follower ($5398) and behave_fixed_sprite ($54B3)."
  },
  {
   "address": 55808,
   "type": "line",
   "text": "Shape address = $C000 + 64 x pointer. Sprite shapes for pointers $68 and $69 (128 bytes): the two frames of the patrolling object of behaviour $134D, named by vpatrol_frames ($133E). A wide figure in two poses."
  },
  {
   "address": 55936,
   "type": "line",
   "text": "Shape address = $C000 + 64 x pointer. Sprite shapes for pointers $6A and $6B (128 bytes): behave_flash_frame ($1B00) shows $6B while the object's counter runs and $6A otherwise. Two small figures, the first with a pointed top."
  },
  {
   "address": 56064,
   "type": "line",
   "text": "Shape address = $C000 + 64 x pointer. Sprite shape for pointer $6C (64 bytes): the pickup of behave_score_pickup ($1ABE), a round body with a lighter centre."
  },
  {
   "address": 56128,
   "type": "line",
   "text": "Shape address = $C000 + 64 x pointer. Sprite shapes for pointers $6D to $6F (192 bytes): rows of vertical bars at three heights, the flashing hazard of behaviour $14F2, named by flash_frames ($1496)."
  },
  {
   "address": 56320,
   "type": "line",
   "text": "Shape address = $C000 + 64 x pointer. Sprite shape for pointer $70 (64 bytes): the tall bar that behave_countdown_start ($122C) gives its slot."
  },
  {
   "address": 56384,
   "type": "line",
   "text": "Shape address = $C000 + 64 x pointer. Sprite shapes for pointers $71 and $72 (128 bytes): the first and last frames of the burst in lobbed_shot_steps ($1BDA), after the three frames of burst_shapes; $72 is mostly empty."
  },
  {
   "address": 56512,
   "type": "line",
   "text": "Shape address = $C000 + 64 x pointer. Sprite shapes for pointers $73 and $74 (128 bytes): the shot of behave_enemy_shot ($1295), $73 when it flies right and $74 when it flies left. A small ring."
  },
  {
   "address": 56640,
   "type": "line",
   "text": "Shape address = $C000 + 64 x pointer. Sprite shape for pointer $75 (64 bytes): the round body of behave_bouncer ($5672)."
  },
  {
   "address": 56704,
   "type": "line",
   "text": "Shape address = $C000 + 64 x pointer. Sprite shapes for pointers $76 to $7A (320 bytes): the five frames of the blast that moves left, named by blast_frames_left ($54C3). Read as multicolour they do not show a clear picture."
  },
  {
   "address": 57024,
   "type": "line",
   "text": "Shape address = $C000 + 64 x pointer. Sprite shapes for pointers $7B to $7F (320 bytes): the five frames of the blast that moves right, named by blast_frames_right ($54FC). lobbed_shot_steps ($1BDA) also lists $7B and $7C. Read as multicolour they do not show a clear picture."
  },
  {
   "address": 57344,
   "type": "line",
   "text": "Sprite shapes for pointers $80 to $8F (1,024 bytes). Level 4's player_draw ($60C0) writes the pointers into the tables at $CFF8 and $CBF8; of these, $80 to $8B are the second and third sprites of the standing and walking player (F - $17 with F from walk_frames_right ($58F6) or walk_frames_left ($58E4)). $8C to $8F have no traced use. The same bytes as level 2's player_shapes_a."
  },
  {
   "address": 58368,
   "type": "line",
   "text": "Sprite shapes for pointers $90 to $93 (256 bytes), part of the player's punch and crouch frames: $60BD takes $90 and $91 from punch_frames ($594D) and $92 and $93 from crouch_frames ($5B27). The same bytes as level 2's player_shapes_b."
  },
  {
   "address": 58624,
   "type": "line",
   "text": "Sprite shapes for pointers $94 to $96 (192 bytes): the player climbing, picked by climb_frames_up ($5F43) and climb_frames_down ($5F4F). player_draw ($60C0) adds $24 and $2E to each pointer here for the other two climbing sprites ($B8 to $BA and $C2 to $C4). The same bytes as level 2's climb_shapes."
  },
  {
   "address": 58816,
   "type": "line",
   "text": "Sprite shapes for pointers $97 to $9C (384 bytes): the player walking right (walk_frames_right at $58F6). player_draw ($60C0) subtracts $17 and adds $0D to each pointer for the other two sprites ($80 to $85 and $A4 to $A9). The same bytes as level 2's walk_right_shapes."
  },
  {
   "address": 59200,
   "type": "line",
   "text": "Sprite shapes for pointers $9D to $A2 (384 bytes): the player walking left (walk_frames_left at $58E4), drawn like walk_right_shapes, with $AA to $AF and $86 to $8B as the other two sprites. The same bytes as level 2's walk_left_shapes."
  },
  {
   "address": 59584,
   "type": "line",
   "text": "Sprite shapes for pointers $A3 to $B2 (1,024 bytes). player_draw ($60C0) reads $A4 to $AF here as the other two sprites of the walking player (F + $0D); the punch and crouch frames take $B4 to $B7 from here. The same bytes as level 2's attack_shapes."
  },
  {
   "address": 60608,
   "type": "line",
   "text": "Sprite shapes for pointers $B3 to $C1 (960 bytes), the rest of attack_shapes: $B4 to $B7, $BB and $BE to $C1 are named there, and $B8 to $BA are the second sprite of the player climbing (F + $24, see climb_shapes). The punch and crouch frames put $B4 to $B7 in the operand $60BE and $BE to $C1 in $60BF. The same bytes as level 2's attack_shapes_b."
  },
  {
   "address": 61568,
   "type": "line",
   "text": "Sprite shapes for pointers $C2 to $C4 (192 bytes): the third sprite of the player climbing (F + $2E, see climb_shapes). The same bytes as level 2's shapes_unreferenced."
  },
  {
   "address": 61760,
   "type": "line",
   "text": "Sprite shapes for pointers $C5 to $D4 (1,024 bytes): the banner picture of banner_sprites ($75EE), which sets eight sprite pointers from $C5 and eight from $CD."
  },
  {
   "address": 62784,
   "type": "line",
   "text": "Sprite shapes for pointers $D5 to $DA (384 bytes): the player jumping, $D5 (facing right) or $D6 from jump_frame ($5F2F), with sprites 0 and 1 taking that plus 2 and plus 4 ($D7 and $D9, or $D8 and $DA)."
  },
  {
   "address": 63168,
   "type": "line",
   "text": "Sprite shapes for pointers $DB and $DC (128 bytes), used by behaviour $573B: $DB in its frame table $5723 and $DC as its pointer."
  },
  {
   "address": 63296,
   "type": "line",
   "text": "Sprite shapes for pointers $DD and $DE (128 bytes): all zero."
  },
  {
   "address": 63424,
   "type": "line",
   "text": "The status panel's bitmap, which the raster interrupt irq_bottom switches on from line $CD (bitmap mode at $E000, multicolour): 40 cells wide, rows 19 to 24, 8 bytes a cell and 320 a row. Level 4's draw_panel ($52C4) copies the picture in and draw_timer ($944C) writes the timer digits; nothing else changes it. The same bytes as level 2's panel_bitmap."
  },
  {
   "address": 63680,
   "type": "line",
   "text": "Row 19, columns 32 to 37: the first of five rows of the 6 by 5 cell picture that timer_graphics_on ($94FE) or timer_graphics_off ($9567) copies in (48 bytes a row; the others are panel_picture_1 to 4). The same bytes as level 2's panel_picture_0."
  },
  {
   "address": 63728,
   "type": "line",
   "text": "Row 19, columns 38 and 39, and row 20, columns 0 to 26: panel bitmap that no traced routine writes (232 bytes). The same bytes as level 2's panel_bitmap_1."
  },
  {
   "address": 63960,
   "type": "line",
   "text": "Row 20, columns 27 to 31 (40 bytes): draw_timer ($944C) draws the three timer digits into the cells at $F9D8, $F9E8 and $F9F0. The same bytes as level 2's timer_cells."
  },
  {
   "address": 64000,
   "type": "line",
   "text": "Row 20, columns 32 to 37: the second row of the panel picture (see panel_picture_0). The same bytes as level 2's panel_picture_1."
  },
  {
   "address": 64048,
   "type": "line",
   "text": "Row 20, columns 38 and 39, and row 21, columns 0 to 2: panel bitmap that no traced routine writes (40 bytes). The same bytes as level 2's panel_bitmap_2."
  },
  {
   "address": 64088,
   "type": "line",
   "text": "The seven character shapes (8 bytes each) of the score digits in the panel, drawn by $78B7."
  },
  {
   "address": 64144,
   "type": "line",
   "text": "Row 21, columns 10 to 16: panel bitmap that no traced routine writes (56 bytes). The same bytes as level 2's panel_bitmap_3."
  },
  {
   "address": 64200,
   "type": "line",
   "text": "The eight character shapes (64 bytes) of the energy bar in the panel, copied from $77C2 by $7803."
  },
  {
   "address": 64264,
   "type": "line",
   "text": "Row 21, columns 25 to 31: panel bitmap that no traced routine writes (56 bytes). The same bytes as level 2's panel_bitmap_4."
  },
  {
   "address": 64320,
   "type": "line",
   "text": "Row 21, columns 32 to 37: the third row of the panel picture (see panel_picture_0). The same bytes as level 2's panel_picture_2."
  },
  {
   "address": 64368,
   "type": "line",
   "text": "Row 21, columns 38 and 39, and row 22, columns 0 to 31: panel bitmap that no traced routine writes (272 bytes). The same bytes as level 2's panel_bitmap_5."
  },
  {
   "address": 64640,
   "type": "line",
   "text": "Row 22, columns 32 to 37: the fourth row of the panel picture (see panel_picture_0). The same bytes as level 2's panel_picture_3."
  },
  {
   "address": 64688,
   "type": "line",
   "text": "Row 22, columns 38 and 39, and row 23, columns 0 to 31: panel bitmap that no traced routine writes (272 bytes). The same bytes as level 2's panel_bitmap_6."
  },
  {
   "address": 64960,
   "type": "line",
   "text": "Row 23, columns 32 to 37: the fifth row of the panel picture (see panel_picture_0). The same bytes as level 2's panel_picture_4."
  },
  {
   "address": 65008,
   "type": "line",
   "text": "Row 23, columns 38 and 39 of the panel bitmap (16 bytes): bytes that no traced routine writes, all zero."
  },
  {
   "address": 65024,
   "type": "line",
   "text": "Sprite shapes for pointers $F8 to $FD (384 bytes), lying where row 24 of the panel bitmap ($FE00-$FF3F) and the 64 bytes after it are: the player falling, $F8 (facing right) or $F9 from fall_frame ($5DCD), with sprites 0 and 1 taking that plus 2 and plus 4 ($FA and $FC, or $FB and $FD). Row 24 shows black because draw_panel clears its colours."
  },
  {
   "address": 65408,
   "type": "line",
   "text": "The sprite shape for pointer $FE (64 bytes, shape address $C000 + 64 x $FE): sprite 3, the countdown, drawn into the byte columns $FF80-$FF82 by $1D85 and $1DAD."
  }
 ]
}