{
 "schema": 1,
 "platform": "spectrum",
 "game": "valhalla",
 "build": "original Legend release (TOSEC: Valhalla (1983)(Legend).tzx), a tape of four ROM-speed files: a BASIC loader, the loading screen, 12,185 bytes of machine code at $D066 and the game's BASIC program saved with its variables, autostarting at line 9800",
 "source": "control file",
 "regions": {
  "exclude": [
   [
    0,
    16383,
    "ROM"
   ],
   [
    16384,
    23295,
    "screen RAM"
   ]
  ],
  "extra": []
 },
 "blocks": [
  {
   "start": 23755,
   "end": 23759,
   "type": "BASIC"
  },
  {
   "start": 23760,
   "end": 23778,
   "type": "Code"
  },
  {
   "start": 23779,
   "end": 23791,
   "type": "Byte"
  },
  {
   "start": 23792,
   "end": 23855,
   "type": "Code"
  },
  {
   "start": 23856,
   "end": 52211,
   "type": "BASIC"
  },
  {
   "start": 53350,
   "end": 53362,
   "type": "Byte"
  },
  {
   "start": 53363,
   "end": 53714,
   "type": "Code"
  },
  {
   "start": 53715,
   "end": 53936,
   "type": "Byte"
  },
  {
   "start": 53937,
   "end": 53938,
   "type": "Byte"
  },
  {
   "start": 53939,
   "end": 53939,
   "type": "Byte"
  },
  {
   "start": 53940,
   "end": 53980,
   "type": "Byte"
  },
  {
   "start": 53981,
   "end": 54048,
   "type": "Byte"
  },
  {
   "start": 54049,
   "end": 54112,
   "type": "Byte"
  },
  {
   "start": 54113,
   "end": 54412,
   "type": "Byte"
  },
  {
   "start": 54413,
   "end": 54555,
   "type": "Code"
  },
  {
   "start": 54556,
   "end": 54560,
   "type": "Byte"
  },
  {
   "start": 54561,
   "end": 54725,
   "type": "Code"
  },
  {
   "start": 54726,
   "end": 54726,
   "type": "Byte"
  },
  {
   "start": 54727,
   "end": 55281,
   "type": "Code"
  },
  {
   "start": 55282,
   "end": 55282,
   "type": "Byte"
  },
  {
   "start": 55283,
   "end": 55902,
   "type": "Code"
  },
  {
   "start": 55903,
   "end": 55913,
   "type": "Byte"
  },
  {
   "start": 55914,
   "end": 55983,
   "type": "Code"
  },
  {
   "start": 55984,
   "end": 55987,
   "type": "Byte"
  },
  {
   "start": 55988,
   "end": 56169,
   "type": "Code"
  },
  {
   "start": 56170,
   "end": 56171,
   "type": "Byte"
  },
  {
   "start": 56172,
   "end": 56452,
   "type": "Code"
  },
  {
   "start": 56453,
   "end": 56455,
   "type": "Byte"
  },
  {
   "start": 56456,
   "end": 56790,
   "type": "Code"
  },
  {
   "start": 56791,
   "end": 56792,
   "type": "Byte"
  },
  {
   "start": 56793,
   "end": 56831,
   "type": "Code"
  },
  {
   "start": 56832,
   "end": 56833,
   "type": "Byte"
  },
  {
   "start": 56834,
   "end": 56939,
   "type": "Code"
  },
  {
   "start": 56940,
   "end": 56943,
   "type": "Byte"
  },
  {
   "start": 56944,
   "end": 57037,
   "type": "Code"
  },
  {
   "start": 57038,
   "end": 57039,
   "type": "Byte"
  },
  {
   "start": 57040,
   "end": 57127,
   "type": "Code"
  },
  {
   "start": 57128,
   "end": 57130,
   "type": "Byte"
  },
  {
   "start": 57131,
   "end": 57140,
   "type": "Code"
  },
  {
   "start": 57141,
   "end": 57142,
   "type": "Word"
  },
  {
   "start": 57143,
   "end": 57143,
   "type": "Byte"
  },
  {
   "start": 57144,
   "end": 57145,
   "type": "Byte"
  },
  {
   "start": 57146,
   "end": 57147,
   "type": "Word"
  },
  {
   "start": 57148,
   "end": 57151,
   "type": "Byte"
  },
  {
   "start": 57152,
   "end": 57231,
   "type": "Code"
  },
  {
   "start": 57232,
   "end": 57311,
   "type": "Byte"
  },
  {
   "start": 57312,
   "end": 57457,
   "type": "Code"
  },
  {
   "start": 57458,
   "end": 57462,
   "type": "Byte"
  },
  {
   "start": 57463,
   "end": 57641,
   "type": "Code"
  },
  {
   "start": 57642,
   "end": 57643,
   "type": "Byte"
  },
  {
   "start": 57644,
   "end": 57795,
   "type": "Code"
  },
  {
   "start": 57796,
   "end": 57801,
   "type": "Byte"
  },
  {
   "start": 57802,
   "end": 57816,
   "type": "Code"
  },
  {
   "start": 57817,
   "end": 57822,
   "type": "Byte"
  },
  {
   "start": 57823,
   "end": 57825,
   "type": "Code"
  },
  {
   "start": 57826,
   "end": 57831,
   "type": "Byte"
  },
  {
   "start": 57832,
   "end": 57834,
   "type": "Code"
  },
  {
   "start": 57835,
   "end": 57840,
   "type": "Byte"
  },
  {
   "start": 57841,
   "end": 57843,
   "type": "Code"
  },
  {
   "start": 57844,
   "end": 57849,
   "type": "Byte"
  },
  {
   "start": 57850,
   "end": 58002,
   "type": "Code"
  },
  {
   "start": 58003,
   "end": 58005,
   "type": "Code"
  },
  {
   "start": 58006,
   "end": 58011,
   "type": "Byte"
  },
  {
   "start": 58012,
   "end": 58014,
   "type": "Code"
  },
  {
   "start": 58015,
   "end": 58020,
   "type": "Byte"
  },
  {
   "start": 58021,
   "end": 58191,
   "type": "Code"
  },
  {
   "start": 58192,
   "end": 58193,
   "type": "Byte"
  },
  {
   "start": 58194,
   "end": 58209,
   "type": "Address"
  },
  {
   "start": 58210,
   "end": 58225,
   "type": "Address"
  },
  {
   "start": 58226,
   "end": 58266,
   "type": "Code"
  },
  {
   "start": 58267,
   "end": 58272,
   "type": "Byte"
  },
  {
   "start": 58273,
   "end": 58275,
   "type": "Code"
  },
  {
   "start": 58276,
   "end": 58281,
   "type": "Byte"
  },
  {
   "start": 58282,
   "end": 58301,
   "type": "Code"
  },
  {
   "start": 58302,
   "end": 58307,
   "type": "Byte"
  },
  {
   "start": 58308,
   "end": 58327,
   "type": "Code"
  },
  {
   "start": 58328,
   "end": 58333,
   "type": "Byte"
  },
  {
   "start": 58334,
   "end": 58336,
   "type": "Code"
  },
  {
   "start": 58337,
   "end": 58342,
   "type": "Byte"
  },
  {
   "start": 58343,
   "end": 58348,
   "type": "Code"
  },
  {
   "start": 58349,
   "end": 58354,
   "type": "Byte"
  },
  {
   "start": 58355,
   "end": 58357,
   "type": "Code"
  },
  {
   "start": 58358,
   "end": 58363,
   "type": "Byte"
  },
  {
   "start": 58364,
   "end": 58366,
   "type": "Code"
  },
  {
   "start": 58367,
   "end": 58372,
   "type": "Byte"
  },
  {
   "start": 58373,
   "end": 58458,
   "type": "Code"
  },
  {
   "start": 58459,
   "end": 58460,
   "type": "Byte"
  },
  {
   "start": 58461,
   "end": 58463,
   "type": "Code"
  },
  {
   "start": 58464,
   "end": 58469,
   "type": "Byte"
  },
  {
   "start": 58470,
   "end": 58510,
   "type": "Code"
  },
  {
   "start": 58511,
   "end": 58516,
   "type": "Byte"
  },
  {
   "start": 58517,
   "end": 58519,
   "type": "Code"
  },
  {
   "start": 58520,
   "end": 58525,
   "type": "Byte"
  },
  {
   "start": 58526,
   "end": 58561,
   "type": "Code"
  },
  {
   "start": 58562,
   "end": 58567,
   "type": "Byte"
  },
  {
   "start": 58568,
   "end": 58589,
   "type": "Code"
  },
  {
   "start": 58590,
   "end": 58595,
   "type": "Byte"
  },
  {
   "start": 58596,
   "end": 58639,
   "type": "Code"
  },
  {
   "start": 58640,
   "end": 58645,
   "type": "Byte"
  },
  {
   "start": 58646,
   "end": 58667,
   "type": "Code"
  },
  {
   "start": 58668,
   "end": 58673,
   "type": "Byte"
  },
  {
   "start": 58674,
   "end": 58676,
   "type": "Code"
  },
  {
   "start": 58677,
   "end": 58682,
   "type": "Byte"
  },
  {
   "start": 58683,
   "end": 58691,
   "type": "Code"
  },
  {
   "start": 58692,
   "end": 58697,
   "type": "Byte"
  },
  {
   "start": 58698,
   "end": 58716,
   "type": "Code"
  },
  {
   "start": 58717,
   "end": 58722,
   "type": "Byte"
  },
  {
   "start": 58723,
   "end": 58731,
   "type": "Code"
  },
  {
   "start": 58732,
   "end": 58737,
   "type": "Byte"
  },
  {
   "start": 58738,
   "end": 58746,
   "type": "Code"
  },
  {
   "start": 58747,
   "end": 58752,
   "type": "Byte"
  },
  {
   "start": 58753,
   "end": 58780,
   "type": "Code"
  },
  {
   "start": 58781,
   "end": 58786,
   "type": "Byte"
  },
  {
   "start": 58787,
   "end": 58830,
   "type": "Code"
  },
  {
   "start": 58831,
   "end": 58836,
   "type": "Byte"
  },
  {
   "start": 58837,
   "end": 58845,
   "type": "Code"
  },
  {
   "start": 58846,
   "end": 58851,
   "type": "Byte"
  },
  {
   "start": 58852,
   "end": 58859,
   "type": "Code"
  },
  {
   "start": 58860,
   "end": 58865,
   "type": "Byte"
  },
  {
   "start": 58866,
   "end": 58909,
   "type": "Code"
  },
  {
   "start": 58910,
   "end": 58915,
   "type": "Byte"
  },
  {
   "start": 58916,
   "end": 59006,
   "type": "Code"
  },
  {
   "start": 59007,
   "end": 59010,
   "type": "Byte"
  },
  {
   "start": 59011,
   "end": 59027,
   "type": "Code"
  },
  {
   "start": 59028,
   "end": 59031,
   "type": "Byte"
  },
  {
   "start": 59032,
   "end": 59034,
   "type": "Code"
  },
  {
   "start": 59035,
   "end": 59038,
   "type": "Byte"
  },
  {
   "start": 59039,
   "end": 59074,
   "type": "Code"
  },
  {
   "start": 59075,
   "end": 59078,
   "type": "Byte"
  },
  {
   "start": 59079,
   "end": 59081,
   "type": "Code"
  },
  {
   "start": 59082,
   "end": 59085,
   "type": "Byte"
  },
  {
   "start": 59086,
   "end": 59088,
   "type": "Code"
  },
  {
   "start": 59089,
   "end": 59092,
   "type": "Byte"
  },
  {
   "start": 59093,
   "end": 59123,
   "type": "Code"
  },
  {
   "start": 59124,
   "end": 59127,
   "type": "Byte"
  },
  {
   "start": 59128,
   "end": 59130,
   "type": "Code"
  },
  {
   "start": 59131,
   "end": 59134,
   "type": "Byte"
  },
  {
   "start": 59135,
   "end": 59137,
   "type": "Code"
  },
  {
   "start": 59138,
   "end": 59141,
   "type": "Byte"
  },
  {
   "start": 59142,
   "end": 59144,
   "type": "Code"
  },
  {
   "start": 59145,
   "end": 59148,
   "type": "Byte"
  },
  {
   "start": 59149,
   "end": 59151,
   "type": "Code"
  },
  {
   "start": 59152,
   "end": 59155,
   "type": "Byte"
  },
  {
   "start": 59156,
   "end": 59158,
   "type": "Code"
  },
  {
   "start": 59159,
   "end": 59162,
   "type": "Byte"
  },
  {
   "start": 59163,
   "end": 59165,
   "type": "Code"
  },
  {
   "start": 59166,
   "end": 59169,
   "type": "Byte"
  },
  {
   "start": 59170,
   "end": 59172,
   "type": "Code"
  },
  {
   "start": 59173,
   "end": 59176,
   "type": "Byte"
  },
  {
   "start": 59177,
   "end": 59179,
   "type": "Code"
  },
  {
   "start": 59180,
   "end": 59183,
   "type": "Byte"
  },
  {
   "start": 59184,
   "end": 59186,
   "type": "Code"
  },
  {
   "start": 59187,
   "end": 59190,
   "type": "Byte"
  },
  {
   "start": 59191,
   "end": 59203,
   "type": "Code"
  },
  {
   "start": 59204,
   "end": 59207,
   "type": "Byte"
  },
  {
   "start": 59208,
   "end": 59210,
   "type": "Code"
  },
  {
   "start": 59211,
   "end": 59214,
   "type": "Byte"
  },
  {
   "start": 59215,
   "end": 59236,
   "type": "Code"
  },
  {
   "start": 59237,
   "end": 59240,
   "type": "Byte"
  },
  {
   "start": 59241,
   "end": 59243,
   "type": "Code"
  },
  {
   "start": 59244,
   "end": 59247,
   "type": "Byte"
  },
  {
   "start": 59248,
   "end": 59270,
   "type": "Code"
  },
  {
   "start": 59271,
   "end": 59274,
   "type": "Byte"
  },
  {
   "start": 59275,
   "end": 59277,
   "type": "Code"
  },
  {
   "start": 59278,
   "end": 59281,
   "type": "Byte"
  },
  {
   "start": 59282,
   "end": 59284,
   "type": "Code"
  },
  {
   "start": 59285,
   "end": 59288,
   "type": "Byte"
  },
  {
   "start": 59289,
   "end": 59291,
   "type": "Code"
  },
  {
   "start": 59292,
   "end": 59295,
   "type": "Byte"
  },
  {
   "start": 59296,
   "end": 59331,
   "type": "Code"
  },
  {
   "start": 59332,
   "end": 59347,
   "type": "Address"
  },
  {
   "start": 59348,
   "end": 59361,
   "type": "Address"
  },
  {
   "start": 59362,
   "end": 59405,
   "type": "Byte"
  },
  {
   "start": 59406,
   "end": 59434,
   "type": "Byte"
  },
  {
   "start": 59435,
   "end": 59479,
   "type": "Byte"
  },
  {
   "start": 59480,
   "end": 59508,
   "type": "Byte"
  },
  {
   "start": 59509,
   "end": 59529,
   "type": "Byte"
  },
  {
   "start": 59530,
   "end": 59545,
   "type": "Byte"
  },
  {
   "start": 59546,
   "end": 59561,
   "type": "Byte"
  },
  {
   "start": 59562,
   "end": 59756,
   "type": "Byte"
  },
  {
   "start": 59757,
   "end": 59892,
   "type": "Byte"
  },
  {
   "start": 59893,
   "end": 59964,
   "type": "Byte"
  },
  {
   "start": 59965,
   "end": 60060,
   "type": "Byte"
  },
  {
   "start": 60061,
   "end": 60132,
   "type": "Byte"
  },
  {
   "start": 60133,
   "end": 60212,
   "type": "Byte"
  },
  {
   "start": 60213,
   "end": 60236,
   "type": "Byte"
  },
  {
   "start": 60237,
   "end": 60285,
   "type": "Byte"
  },
  {
   "start": 60286,
   "end": 60299,
   "type": "Address"
  },
  {
   "start": 60300,
   "end": 60316,
   "type": "Byte"
  },
  {
   "start": 60317,
   "end": 60333,
   "type": "Byte"
  },
  {
   "start": 60334,
   "end": 60342,
   "type": "Byte"
  },
  {
   "start": 60343,
   "end": 60347,
   "type": "Byte"
  },
  {
   "start": 60348,
   "end": 60475,
   "type": "Byte"
  },
  {
   "start": 60476,
   "end": 60483,
   "type": "Byte"
  },
  {
   "start": 60484,
   "end": 60634,
   "type": "Byte"
  },
  {
   "start": 60635,
   "end": 60666,
   "type": "Byte"
  },
  {
   "start": 60667,
   "end": 60730,
   "type": "Byte"
  },
  {
   "start": 60731,
   "end": 60797,
   "type": "Byte"
  },
  {
   "start": 60798,
   "end": 60909,
   "type": "Byte"
  },
  {
   "start": 60910,
   "end": 60941,
   "type": "Byte"
  },
  {
   "start": 60942,
   "end": 61070,
   "type": "Byte"
  },
  {
   "start": 61071,
   "end": 61246,
   "type": "Code"
  },
  {
   "start": 61247,
   "end": 61248,
   "type": "Byte"
  },
  {
   "start": 61249,
   "end": 61365,
   "type": "Code"
  },
  {
   "start": 61366,
   "end": 61368,
   "type": "Byte"
  },
  {
   "start": 61369,
   "end": 61415,
   "type": "Code"
  },
  {
   "start": 61416,
   "end": 61419,
   "type": "Byte"
  },
  {
   "start": 61420,
   "end": 62034,
   "type": "Code"
  },
  {
   "start": 62035,
   "end": 62039,
   "type": "Byte"
  },
  {
   "start": 62040,
   "end": 62135,
   "type": "Code"
  },
  {
   "start": 62136,
   "end": 62137,
   "type": "Byte"
  },
  {
   "start": 62138,
   "end": 62187,
   "type": "Code"
  },
  {
   "start": 62188,
   "end": 62188,
   "type": "Byte"
  },
  {
   "start": 62189,
   "end": 62663,
   "type": "Code"
  },
  {
   "start": 62664,
   "end": 62669,
   "type": "Byte"
  },
  {
   "start": 62670,
   "end": 62746,
   "type": "Code"
  },
  {
   "start": 62747,
   "end": 62753,
   "type": "Byte"
  },
  {
   "start": 62754,
   "end": 62874,
   "type": "Code"
  },
  {
   "start": 62875,
   "end": 62877,
   "type": "Byte"
  },
  {
   "start": 62878,
   "end": 63109,
   "type": "Code"
  },
  {
   "start": 63110,
   "end": 63127,
   "type": "Byte"
  },
  {
   "start": 63128,
   "end": 63192,
   "type": "Code"
  },
  {
   "start": 63193,
   "end": 63193,
   "type": "Byte"
  },
  {
   "start": 63194,
   "end": 63259,
   "type": "Code"
  },
  {
   "start": 63260,
   "end": 63261,
   "type": "Byte"
  },
  {
   "start": 63262,
   "end": 63452,
   "type": "Code"
  },
  {
   "start": 63453,
   "end": 63496,
   "type": "Address"
  },
  {
   "start": 63497,
   "end": 63607,
   "type": "Code"
  },
  {
   "start": 63608,
   "end": 63608,
   "type": "Byte"
  },
  {
   "start": 63609,
   "end": 63615,
   "type": "Code"
  },
  {
   "start": 63616,
   "end": 63618,
   "type": "Byte"
  },
  {
   "start": 63619,
   "end": 63625,
   "type": "Code"
  },
  {
   "start": 63626,
   "end": 63628,
   "type": "Byte"
  },
  {
   "start": 63629,
   "end": 63635,
   "type": "Code"
  },
  {
   "start": 63636,
   "end": 63638,
   "type": "Byte"
  },
  {
   "start": 63639,
   "end": 63645,
   "type": "Code"
  },
  {
   "start": 63646,
   "end": 63648,
   "type": "Byte"
  },
  {
   "start": 63649,
   "end": 63732,
   "type": "Code"
  },
  {
   "start": 63733,
   "end": 63734,
   "type": "Byte"
  },
  {
   "start": 63735,
   "end": 63752,
   "type": "Code"
  },
  {
   "start": 63753,
   "end": 63763,
   "type": "Byte"
  },
  {
   "start": 63764,
   "end": 63844,
   "type": "Code"
  },
  {
   "start": 63845,
   "end": 63847,
   "type": "Byte"
  },
  {
   "start": 63848,
   "end": 63989,
   "type": "Code"
  },
  {
   "start": 63990,
   "end": 63992,
   "type": "Byte"
  },
  {
   "start": 63993,
   "end": 64024,
   "type": "Code"
  },
  {
   "start": 64025,
   "end": 64105,
   "type": "Byte"
  },
  {
   "start": 64106,
   "end": 64206,
   "type": "Byte"
  },
  {
   "start": 64207,
   "end": 64240,
   "type": "Code"
  },
  {
   "start": 64241,
   "end": 64270,
   "type": "Address"
  },
  {
   "start": 64271,
   "end": 64289,
   "type": "Byte"
  },
  {
   "start": 64290,
   "end": 64308,
   "type": "Byte"
  },
  {
   "start": 64309,
   "end": 64332,
   "type": "Code"
  },
  {
   "start": 64333,
   "end": 64347,
   "type": "Code"
  },
  {
   "start": 64348,
   "end": 64380,
   "type": "Code"
  },
  {
   "start": 64381,
   "end": 64382,
   "type": "Byte"
  },
  {
   "start": 64383,
   "end": 64433,
   "type": "Code"
  },
  {
   "start": 64434,
   "end": 64449,
   "type": "Byte"
  },
  {
   "start": 64450,
   "end": 64513,
   "type": "Code"
  },
  {
   "start": 64514,
   "end": 64588,
   "type": "Code"
  },
  {
   "start": 64589,
   "end": 64591,
   "type": "Byte"
  },
  {
   "start": 64592,
   "end": 64594,
   "type": "Code"
  },
  {
   "start": 64595,
   "end": 64596,
   "type": "Byte"
  },
  {
   "start": 64597,
   "end": 64615,
   "type": "Code"
  },
  {
   "start": 64616,
   "end": 64618,
   "type": "Byte"
  },
  {
   "start": 64619,
   "end": 64621,
   "type": "Code"
  },
  {
   "start": 64622,
   "end": 64624,
   "type": "Byte"
  },
  {
   "start": 64625,
   "end": 64627,
   "type": "Code"
  },
  {
   "start": 64628,
   "end": 64630,
   "type": "Byte"
  },
  {
   "start": 64631,
   "end": 64633,
   "type": "Code"
  },
  {
   "start": 64634,
   "end": 64635,
   "type": "Byte"
  },
  {
   "start": 64636,
   "end": 64638,
   "type": "Code"
  },
  {
   "start": 64639,
   "end": 64640,
   "type": "Byte"
  },
  {
   "start": 64641,
   "end": 64659,
   "type": "Code"
  },
  {
   "start": 64660,
   "end": 64662,
   "type": "Byte"
  },
  {
   "start": 64663,
   "end": 64665,
   "type": "Code"
  },
  {
   "start": 64666,
   "end": 64668,
   "type": "Byte"
  },
  {
   "start": 64669,
   "end": 64671,
   "type": "Code"
  },
  {
   "start": 64672,
   "end": 64673,
   "type": "Byte"
  },
  {
   "start": 64674,
   "end": 64676,
   "type": "Code"
  },
  {
   "start": 64677,
   "end": 64678,
   "type": "Byte"
  },
  {
   "start": 64679,
   "end": 64697,
   "type": "Code"
  },
  {
   "start": 64698,
   "end": 64700,
   "type": "Byte"
  },
  {
   "start": 64701,
   "end": 64703,
   "type": "Code"
  },
  {
   "start": 64704,
   "end": 64706,
   "type": "Byte"
  },
  {
   "start": 64707,
   "end": 64709,
   "type": "Code"
  },
  {
   "start": 64710,
   "end": 64712,
   "type": "Byte"
  },
  {
   "start": 64713,
   "end": 64715,
   "type": "Code"
  },
  {
   "start": 64716,
   "end": 64717,
   "type": "Byte"
  },
  {
   "start": 64718,
   "end": 64720,
   "type": "Code"
  },
  {
   "start": 64721,
   "end": 64722,
   "type": "Byte"
  },
  {
   "start": 64723,
   "end": 64781,
   "type": "Code"
  },
  {
   "start": 64782,
   "end": 64797,
   "type": "Byte"
  },
  {
   "start": 64798,
   "end": 65115,
   "type": "Code"
  },
  {
   "start": 65116,
   "end": 65128,
   "type": "Byte"
  },
  {
   "start": 65129,
   "end": 65312,
   "type": "Code"
  },
  {
   "start": 65313,
   "end": 65535,
   "type": "Byte"
  }
 ],
 "symbols": [
  {
   "address": 23755,
   "name": "rem_code",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23760,
   "name": "scroll_text",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23779,
   "name": "rem_filler",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23792,
   "name": "save_game",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23819,
   "name": "load_game",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23845,
   "name": "restore_trap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23856,
   "name": "rem_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23858,
   "name": "build_stamp",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23884,
   "name": "gx",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 23899,
   "name": "fn_words",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24063,
   "name": "fn_the",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24148,
   "name": "fn_article",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24346,
   "name": "fn_article_n",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24375,
   "name": "fn_has",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24471,
   "name": "fn_carries",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24637,
   "name": "fn_lies_at",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24733,
   "name": "fn_numbers",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 24882,
   "name": "fn_qualities",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25075,
   "name": "fn_money_here",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25116,
   "name": "fn_tests",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25195,
   "name": "fn_strength",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25221,
   "name": "fn_full_strength",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25253,
   "name": "fn_verb",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25323,
   "name": "synt",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25382,
   "name": "read_parse",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25533,
   "name": "parse_errors",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25559,
   "name": "mary",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25679,
   "name": "mary_slap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25806,
   "name": "rf",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25832,
   "name": "rf_ask",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25975,
   "name": "rf_accept",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 25987,
   "name": "step_left",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26042,
   "name": "step_walk",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26077,
   "name": "step_right",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26132,
   "name": "step_right_walk",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26144,
   "name": "verb_go",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26275,
   "name": "go_direction",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26393,
   "name": "go_to_thing",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26632,
   "name": "verb_offer",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26906,
   "name": "trade_new",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 26937,
   "name": "trade_check",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27222,
   "name": "trade_offer",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27391,
   "name": "trade_deal",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27584,
   "name": "verb_take",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27756,
   "name": "take_walk",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 27971,
   "name": "take_object",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28102,
   "name": "take_money",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28133,
   "name": "take_beside",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28422,
   "name": "verb_attack",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28542,
   "name": "attack_goodness",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28625,
   "name": "fight",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28687,
   "name": "fight_strength",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28888,
   "name": "fight_blows",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 28965,
   "name": "fight_drawn",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29080,
   "name": "fight_defeat",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29181,
   "name": "fight_kill",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29253,
   "name": "fight_blow",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29446,
   "name": "verb_drop",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29772,
   "name": "drop_money",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29803,
   "name": "verb_throw",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 29879,
   "name": "throw_check",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30026,
   "name": "throw_damage",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30156,
   "name": "throw_magic",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30192,
   "name": "throw_fly",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30571,
   "name": "verb_jump",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30701,
   "name": "verb_put",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 30997,
   "name": "verb_drink",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31128,
   "name": "verb_give",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31397,
   "name": "verb_buy",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31661,
   "name": "verb_sell",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31836,
   "name": "verb_eat",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 31973,
   "name": "verb_open",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32224,
   "name": "open_walk",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32243,
   "name": "open_draw",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32352,
   "name": "verb_summon",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32464,
   "name": "verb_close",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32650,
   "name": "verb_unlock",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32663,
   "name": "verb_lock",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32676,
   "name": "ver",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32726,
   "name": "bput",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32768,
   "name": "bput_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32770,
   "name": "bput_slot",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32920,
   "name": "bput_store",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 32966,
   "name": "bget",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33171,
   "name": "mput",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33243,
   "name": "mget",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33327,
   "name": "mfi",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33502,
   "name": "blist",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33785,
   "name": "csa",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33840,
   "name": "css",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33878,
   "name": "moba",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 33919,
   "name": "mobs",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34022,
   "name": "moma",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34063,
   "name": "moms",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34133,
   "name": "mo",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34158,
   "name": "mprop",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34255,
   "name": "mprop_special",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34501,
   "name": "mnex",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34634,
   "name": "cango",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 34834,
   "name": "mdesc",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35122,
   "name": "world_name",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35215,
   "name": "de",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35248,
   "name": "character_turn",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35343,
   "name": "turn_pick",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35519,
   "name": "turn_mood",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35654,
   "name": "turn_action",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35696,
   "name": "turn_leave",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35753,
   "name": "turn_take",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35895,
   "name": "turn_drop",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 35950,
   "name": "turn_attack",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36066,
   "name": "turn_give",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36130,
   "name": "turn_step",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36175,
   "name": "np",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36231,
   "name": "pr",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36393,
   "name": "show_text",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36425,
   "name": "lf",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36440,
   "name": "refuses",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36463,
   "name": "rp2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36513,
   "name": "rep",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36692,
   "name": "rep_slot",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36738,
   "name": "nloc",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 36859,
   "name": "nloc_objects",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 37138,
   "name": "nloc_characters",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 37297,
   "name": "valhalla",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 37420,
   "name": "efi",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 37525,
   "name": "klepto",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38069,
   "name": "v0",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38131,
   "name": "dov",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38228,
   "name": "comings_and_goings",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38639,
   "name": "die",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38671,
   "name": "die_scatter",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38822,
   "name": "die_hell",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 38975,
   "name": "die_body",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39095,
   "name": "gap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39500,
   "name": "dep",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39615,
   "name": "arr",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39784,
   "name": "cmd_l",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39796,
   "name": "cmd_r",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39808,
   "name": "cmd_pause",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39933,
   "name": "cmd_save",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39979,
   "name": "cmd_list",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 39995,
   "name": "cmd_who",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40004,
   "name": "who_line",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40119,
   "name": "who_container",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40337,
   "name": "who_name",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40450,
   "name": "cmd_load",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40706,
   "name": "cmd_print",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40718,
   "name": "cmd_noprint",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40730,
   "name": "cmd_copy",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40738,
   "name": "cmd_what",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40756,
   "name": "cmd_where",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40927,
   "name": "cmd_help",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40960,
   "name": "help_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 40966,
   "name": "help_ways",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 41447,
   "name": "help_more",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 41557,
   "name": "cmd_how",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 41694,
   "name": "gfx_none",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 41700,
   "name": "gter",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 41867,
   "name": "gter_features",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 41940,
   "name": "gter_feature",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42330,
   "name": "gp",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42402,
   "name": "gm",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42533,
   "name": "glie",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42561,
   "name": "geat",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42614,
   "name": "geatp",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42689,
   "name": "gdrink",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42740,
   "name": "gdrinkp",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42815,
   "name": "ggeto",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42837,
   "name": "gget",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42906,
   "name": "gdropo",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42928,
   "name": "gdrop",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42978,
   "name": "gfx_ret_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 42984,
   "name": "garmd",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 43006,
   "name": "gfx_ret_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 43012,
   "name": "garmo",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 43034,
   "name": "gfx_ret_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 43040,
   "name": "gemb",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 43059,
   "name": "gfire",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 43089,
   "name": "gturn",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 43144,
   "name": "mx",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 43177,
   "name": "main_flag",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 43200,
   "name": "main_comings",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 43224,
   "name": "main_command",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 43324,
   "name": "main_hunger",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 43489,
   "name": "main_do",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 43652,
   "name": "start",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 43743,
   "name": "error_messages",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 44107,
   "name": "error_messages_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 44378,
   "name": "text_area",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 45024,
   "name": "dictionary",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 45461,
   "name": "dict_objects",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 46132,
   "name": "dict_verbs",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 46638,
   "name": "dict_little_words",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 46979,
   "name": "dict_places",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 47837,
   "name": "consts_first",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 47855,
   "name": "objects_table",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 48163,
   "name": "characters_table",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 48951,
   "name": "map_table",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 49152,
   "name": "map_hell",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 49769,
   "name": "map_midgard",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50417,
   "name": "facings",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50618,
   "name": "screen_columns",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 50756,
   "name": "special_places",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 51088,
   "name": "work_vars",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 51213,
   "name": "consts_k_l",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 51339,
   "name": "consts_named",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 51395,
   "name": "game_state",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 51438,
   "name": "routine_names_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 51509,
   "name": "exits_open",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 51555,
   "name": "exits_special",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 51601,
   "name": "leftover_for",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 51620,
   "name": "compass",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 51683,
   "name": "here_and_exits",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 51708,
   "name": "mc_addresses",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 51774,
   "name": "routine_names_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 51909,
   "name": "blank_pair",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 51927,
   "name": "routine_names_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 52211,
   "name": "vars_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 53350,
   "name": "parse_result",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 53363,
   "name": "parse_command",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 53648,
   "name": "parse_error",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 53652,
   "name": "parse_next_word",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 53684,
   "name": "parse_number",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 53699,
   "name": "parse_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 53715,
   "name": "stale_variables",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 53937,
   "name": "matched_entry",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 53939,
   "name": "enter_flag",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 53940,
   "name": "input_vars",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 53981,
   "name": "input_line",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 54049,
   "name": "word_buffer",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 54113,
   "name": "word_list",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 54413,
   "name": "input_init",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 54454,
   "name": "print_input_line",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 54477,
   "name": "print_lower_text",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 54513,
   "name": "toggle_cursor",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 54556,
   "name": "cursor_text",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 54561,
   "name": "print_chars",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 54571,
   "name": "key_pressed",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 54702,
   "name": "key_refused",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 54726,
   "name": "unused_d5c6",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 54727,
   "name": "clear_word_buffer",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 54749,
   "name": "escape_to_basic",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 54757,
   "name": "cursor_left",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 54780,
   "name": "cursor_right",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 54806,
   "name": "clear_line",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 54846,
   "name": "delete_left",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 54886,
   "name": "insert_char",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 54937,
   "name": "cursor_up",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 54963,
   "name": "cursor_down",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 54993,
   "name": "recall_line",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55019,
   "name": "print_text_window",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55078,
   "name": "scroll_text_back",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55104,
   "name": "scroll_text_on",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55123,
   "name": "add_number_entry",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55172,
   "name": "enter_pressed",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55282,
   "name": "zero_byte",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55283,
   "name": "read_digit",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55313,
   "name": "check_digit",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55324,
   "name": "end_of_word",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55414,
   "name": "highlight_word",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55496,
   "name": "show_bad_word",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55607,
   "name": "find_word",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55808,
   "name": "times_ten",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55825,
   "name": "next_entry",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55868,
   "name": "break_trap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55903,
   "name": "stale_da5f",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55914,
   "name": "shade_sky",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55917,
   "name": "shade_area",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55966,
   "name": "cell_address",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55984,
   "name": "rng_state",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55988,
   "name": "random",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56027,
   "name": "draw_ridge",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56097,
   "name": "ridge_new_run",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56141,
   "name": "ridge_columns",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56170,
   "name": "ridge_y",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56172,
   "name": "bit_mask",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56186,
   "name": "ridge_step",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56208,
   "name": "fill_column",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56234,
   "name": "plot_pixel",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56286,
   "name": "scatter_dots",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56307,
   "name": "scatter_box",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56377,
   "name": "scatter_strokes",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56453,
   "name": "saved_hl_alt",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56456,
   "name": "draw_stroke",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56525,
   "name": "scatter_dashes",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56558,
   "name": "draw_dash",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56594,
   "name": "draw_glyph",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56634,
   "name": "paint_land",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56637,
   "name": "paint_rows",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56640,
   "name": "paint_box",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56682,
   "name": "set_plot_xor",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56689,
   "name": "set_plot_or",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56694,
   "name": "set_plot_test",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56699,
   "name": "fill_shape",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56791,
   "name": "fill_state",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56793,
   "name": "mirror_chars",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56799,
   "name": "mirror_bytes",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56815,
   "name": "toggle_ridge_fill",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56832,
   "name": "fill_column_address",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56834,
   "name": "ridge_outline",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56841,
   "name": "clear_box",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56885,
   "name": "seed_random",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56921,
   "name": "clear_picture",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56932,
   "name": "gfx_return",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56940,
   "name": "gfx_saved_sp",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56944,
   "name": "attr_address",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56962,
   "name": "cell_of_point",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56981,
   "name": "point_of_cell",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 56997,
   "name": "mirror_top_third",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57038,
   "name": "saved_attr_t",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57040,
   "name": "draw_line",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57060,
   "name": "draw_line_regs",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57128,
   "name": "unused_df28",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57131,
   "name": "blank_box",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57141,
   "name": "bank_address",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57143,
   "name": "bank_size",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57144,
   "name": "draw_xy",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57146,
   "name": "flag_position",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57148,
   "name": "hall_colours",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57152,
   "name": "new_hall_style",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57163,
   "name": "pick_hall_colours",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57179,
   "name": "pick_wall_colours",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57232,
   "name": "castle_tiles",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57312,
   "name": "draw_tile",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57385,
   "name": "texture_box",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57421,
   "name": "texture_cell",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57436,
   "name": "draw_wall_tile",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57458,
   "name": "tower_size",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57463,
   "name": "draw_tower",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57642,
   "name": "castle_x",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57644,
   "name": "castle_start",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57670,
   "name": "draw_battlements",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57768,
   "name": "battlement_texture",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57783,
   "name": "terrain_forest",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57796,
   "name": "forest_treetops_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57802,
   "name": "forest_rows",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57817,
   "name": "forest_first_line_foliage_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57823,
   "name": "forest_line_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57826,
   "name": "forest_second_line_foliage_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57832,
   "name": "forest_line_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57835,
   "name": "forest_third_line_foliage_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57841,
   "name": "forest_line_4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57844,
   "name": "forest_foot_trees_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57850,
   "name": "forest_trunks",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57901,
   "name": "forest_foliage",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58003,
   "name": "forest_floor",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58006,
   "name": "forest_undergrowth_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58012,
   "name": "forest_floor_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58015,
   "name": "forest_ground_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58021,
   "name": "forest_colours",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58051,
   "name": "gfx_terrain",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58192,
   "name": "terrain_now",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58194,
   "name": "terrain_table",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58210,
   "name": "view_table",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58226,
   "name": "terrain_icy",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58267,
   "name": "icy_waste_first_line_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58273,
   "name": "icy_line_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58276,
   "name": "icy_waste_second_line_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58282,
   "name": "icy_done",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58285,
   "name": "paint_sky",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58287,
   "name": "paint_sky_a",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58290,
   "name": "paint_from_top",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58296,
   "name": "view_icy",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58302,
   "name": "view_icy_waste_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58308,
   "name": "view_icy_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58309,
   "name": "terrain_marsh",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58328,
   "name": "marsh_first_pool_line_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58334,
   "name": "marsh_line_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58337,
   "name": "marsh_second_pool_line_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58343,
   "name": "marsh_dots",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58349,
   "name": "marsh_first_dots_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58355,
   "name": "marsh_dots_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58358,
   "name": "marsh_second_dots_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58364,
   "name": "marsh_dots_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58367,
   "name": "marsh_third_dots_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58373,
   "name": "marsh_pools",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58459,
   "name": "pool_state",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58461,
   "name": "view_marsh",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58464,
   "name": "view_marsh_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58470,
   "name": "view_marsh_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58471,
   "name": "terrain_plain",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58511,
   "name": "plain_first_dots_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58517,
   "name": "plain_dots_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58520,
   "name": "plain_second_dots_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58526,
   "name": "plain_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58527,
   "name": "view_plain",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58538,
   "name": "terrain_lakes",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58562,
   "name": "lakes_water_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58568,
   "name": "lakes_shore",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58590,
   "name": "lakes_shore_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58596,
   "name": "lakes_grass",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58612,
   "name": "view_lakes",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58640,
   "name": "view_lakes_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58646,
   "name": "view_lakes_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58647,
   "name": "terrain_mountains",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58668,
   "name": "mountains_foothills_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58674,
   "name": "mountains_dots",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58677,
   "name": "mountains_slopes_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58683,
   "name": "mountains_lines",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58692,
   "name": "mountains_lines_slopes_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58698,
   "name": "mountains_lines_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58704,
   "name": "view_mountains",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58717,
   "name": "view_mountains_far_peaks_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58723,
   "name": "view_mountains_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58732,
   "name": "view_mountains_nearer_range_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58738,
   "name": "view_mountains_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58739,
   "name": "view_forest",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58747,
   "name": "view_forest_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58753,
   "name": "view_forest_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58754,
   "name": "terrain_cave",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58781,
   "name": "cave_walls_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58787,
   "name": "cave_columns",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58831,
   "name": "cave_roof_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58837,
   "name": "cave_roof_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58846,
   "name": "cave_lower_edge_roof_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58852,
   "name": "cave_floor",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58860,
   "name": "cave_floor_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58866,
   "name": "cave_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58867,
   "name": "terrain_hall",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58900,
   "name": "hall_room",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58910,
   "name": "hall_dots_wall_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58916,
   "name": "hall_paint",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58993,
   "name": "hall_flat",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59007,
   "name": "hall_style_0_ceiling_edge_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59011,
   "name": "hall_flat_beams",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59028,
   "name": "hall_style_0_beam_end_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59032,
   "name": "hall_flat_beam",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59035,
   "name": "hall_style_0_beam_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59039,
   "name": "hall_flat_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59056,
   "name": "hall_rafters",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59075,
   "name": "hall_style_1_first_rafter_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59079,
   "name": "hall_rafters_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59082,
   "name": "hall_style_1_second_rafter_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59086,
   "name": "hall_rafters_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59089,
   "name": "hall_style_1_ridge_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59093,
   "name": "hall_rafters_fan",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59121,
   "name": "hall_trusses",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59124,
   "name": "hall_style_2_line_1_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59128,
   "name": "hall_trusses_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59131,
   "name": "hall_style_2_line_2_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59135,
   "name": "hall_trusses_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59138,
   "name": "hall_style_2_line_3_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59142,
   "name": "hall_trusses_4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59145,
   "name": "hall_style_2_line_4_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59149,
   "name": "hall_trusses_5",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59152,
   "name": "hall_style_2_line_5_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59156,
   "name": "hall_trusses_6",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59159,
   "name": "hall_style_2_line_6_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59163,
   "name": "hall_trusses_7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59166,
   "name": "hall_style_2_line_7_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59170,
   "name": "hall_trusses_8",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59173,
   "name": "hall_style_2_line_8_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59177,
   "name": "hall_trusses_9",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59180,
   "name": "hall_style_2_line_9_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59184,
   "name": "hall_trusses_10",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59187,
   "name": "hall_style_2_line_10_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59191,
   "name": "hall_trusses_fill",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59204,
   "name": "hall_style_2_line_11_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59208,
   "name": "hall_trusses_12",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59211,
   "name": "hall_style_2_line_12_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59215,
   "name": "hall_trusses_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59234,
   "name": "hall_vault",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59237,
   "name": "hall_style_3_first_stretch_curve_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59241,
   "name": "hall_vault_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59244,
   "name": "hall_style_3_second_stretch_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59248,
   "name": "hall_vault_fill",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59271,
   "name": "hall_style_3_rib_1_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59275,
   "name": "hall_vault_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59278,
   "name": "hall_style_3_rib_2_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59282,
   "name": "hall_vault_4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59285,
   "name": "hall_style_3_rib_3_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59289,
   "name": "hall_vault_5",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59292,
   "name": "hall_style_3_rib_4_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59296,
   "name": "hall_vault_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59332,
   "name": "glyph_banks",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59348,
   "name": "figure_shapes",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59362,
   "name": "shape_0",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59406,
   "name": "shape_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59435,
   "name": "shape_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59480,
   "name": "shape_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59509,
   "name": "shape_4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59530,
   "name": "shape_5",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59546,
   "name": "shape_6",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59562,
   "name": "figure_records",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59757,
   "name": "bank_0",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59893,
   "name": "bank_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59965,
   "name": "bank_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60061,
   "name": "bank_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60133,
   "name": "bank_4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60213,
   "name": "bank_5",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60237,
   "name": "bank_6",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60286,
   "name": "carry_tables",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60300,
   "name": "object_codes",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60317,
   "name": "carry_shape_0",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60334,
   "name": "carry_shape_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60343,
   "name": "carry_none",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60348,
   "name": "object_glyphs",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60476,
   "name": "unused_ec3c",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60484,
   "name": "lying_glyphs",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60635,
   "name": "window_glyphs",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60667,
   "name": "tall_window_glyphs",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60731,
   "name": "cupboard_open_lists",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60798,
   "name": "cupboard_shut_lists",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60910,
   "name": "door_glyphs",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60942,
   "name": "gate_lists",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61071,
   "name": "figure_walk",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61247,
   "name": "walk_steps",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61249,
   "name": "walk_next_frame",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61272,
   "name": "walk_pause",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61324,
   "name": "figure_put",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61354,
   "name": "check_figure",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61366,
   "name": "figure_vars",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61369,
   "name": "find_figure",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61416,
   "name": "figure_shape",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61420,
   "name": "select_bank",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61465,
   "name": "turn_figure",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61613,
   "name": "show_carried",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61644,
   "name": "show_optional",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61708,
   "name": "part_position",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61756,
   "name": "draw_object_glyph",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61784,
   "name": "draw_shape_copy",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61880,
   "name": "draw_bank_glyph",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61906,
   "name": "draw_figure",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61977,
   "name": "gfx_put",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62013,
   "name": "object_offset",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62035,
   "name": "object_vars",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62040,
   "name": "object_glyph",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62136,
   "name": "object_xy",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62138,
   "name": "read_position",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62167,
   "name": "turn_object",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62188,
   "name": "draw_off",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62189,
   "name": "gfx_get_drop",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62469,
   "name": "gfx_lie",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62664,
   "name": "lie_vars",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62670,
   "name": "gfx_appear",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62747,
   "name": "appear_patch",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62754,
   "name": "fade_cells",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62837,
   "name": "fade_cell",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62875,
   "name": "fade_vars",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62878,
   "name": "gfx_move",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63069,
   "name": "gfx_16",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63110,
   "name": "missile_glyphs",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63128,
   "name": "gfx_missile",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63193,
   "name": "move_draw",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63194,
   "name": "gfx_blush",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63260,
   "name": "blush_cell",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63262,
   "name": "figure_setup",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63291,
   "name": "gfx_arms",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63407,
   "name": "graphics",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63453,
   "name": "gfx_table",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63497,
   "name": "gfx_speed",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63502,
   "name": "gfx_random",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63511,
   "name": "gfx_fight",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63608,
   "name": "fight_blow",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63609,
   "name": "blow_up",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63616,
   "name": "blow_up_bits",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63619,
   "name": "blow_down",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63626,
   "name": "blow_down_bits",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63629,
   "name": "blow_other_up",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63636,
   "name": "blow_other_up_bits",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63639,
   "name": "blow_other_down",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63646,
   "name": "blow_other_down_bits",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63649,
   "name": "set_blow",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63667,
   "name": "gfx_eat",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63733,
   "name": "meal_objects",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63735,
   "name": "gfx_drink",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63753,
   "name": "arm_frame",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63764,
   "name": "meal_start",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63812,
   "name": "meal_arm",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63845,
   "name": "meal_vars",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63848,
   "name": "turn_frames",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63895,
   "name": "draw_frame",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63938,
   "name": "play_frames",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63990,
   "name": "frames_vars",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 63993,
   "name": "first_frame",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64025,
   "name": "eat_frames",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64106,
   "name": "drink_frames",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64207,
   "name": "gfx_feature",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64241,
   "name": "feature_table",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64271,
   "name": "chest_shut_list",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64290,
   "name": "chest_open_list",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64309,
   "name": "feature_chest_shut",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64317,
   "name": "feature_chest_open",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64323,
   "name": "draw_glyph_list",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64333,
   "name": "glyph_list_at_cell",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64348,
   "name": "glyph_list_loop",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64381,
   "name": "feature_xy",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64383,
   "name": "draw_flag",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64434,
   "name": "flag_glyphs",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64450,
   "name": "gfx_dark",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64459,
   "name": "gfx_flag",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64514,
   "name": "feature_black_sky",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64523,
   "name": "feature_hut",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64582,
   "name": "feature_castle_0",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64589,
   "name": "castle_0_tower_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64592,
   "name": "castle_0_top",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64595,
   "name": "castle_0_battlements_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64597,
   "name": "castle_0_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64608,
   "name": "feature_castle_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64616,
   "name": "castle_1_left_tower_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64619,
   "name": "castle_1_middle",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64622,
   "name": "castle_1_middle_tower_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64625,
   "name": "castle_1_right",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64628,
   "name": "castle_1_right_tower_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64631,
   "name": "castle_1_top",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64634,
   "name": "castle_1_left_battlements_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64636,
   "name": "castle_1_top_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64639,
   "name": "castle_1_right_battlements_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64641,
   "name": "castle_1_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64652,
   "name": "feature_castle_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64660,
   "name": "castle_2_keep_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64663,
   "name": "castle_2_wall",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64666,
   "name": "castle_2_wall_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64669,
   "name": "castle_2_top",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64672,
   "name": "castle_2_wall_battlements_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64674,
   "name": "castle_2_top_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64677,
   "name": "castle_2_keep_battlements_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64679,
   "name": "castle_2_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64690,
   "name": "feature_castle_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64698,
   "name": "castle_3_left_tower_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64701,
   "name": "castle_3_wall",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64704,
   "name": "castle_3_wall_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64707,
   "name": "castle_3_right",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64710,
   "name": "castle_3_right_tower_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64713,
   "name": "castle_3_top",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64716,
   "name": "castle_3_left_battlements_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64718,
   "name": "castle_3_top_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64721,
   "name": "castle_3_right_battlements_args",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64723,
   "name": "castle_3_end",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64734,
   "name": "feature_door",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64782,
   "name": "door_frames",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64798,
   "name": "feature_tall_window",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64859,
   "name": "feature_window",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64908,
   "name": "draw_gate",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64919,
   "name": "feature_gate",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 64965,
   "name": "feature_cupboard_open",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 65031,
   "name": "feature_cupboard_shut",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 65086,
   "name": "gfx_reset_figure",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 65116,
   "name": "signature",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 65129,
   "name": "interrupt",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 65313,
   "name": "unused_ff21",
   "type": "UserDefined",
   "kind": "user"
  }
 ],
 "comments": [
  {
   "address": 23755,
   "type": "line",
   "text": "Line 1, a REM whose text is machine code, called by address from the BASIC: three routines, at 23760, 23792 and 23819: thirteen letters x of filler after the first, and one more at 23856 ($5D30)."
  },
  {
   "address": 23760,
   "type": "line",
   "text": "USR 23760 (lines 5010, 5016): scrolls the text area up a line, copying characters 33 to 640 of n$ (the first variable, its text at VARS + 6) down over 1 to 608, so the new line can go in at 609."
  },
  {
   "address": 23779,
   "type": "line",
   "text": "Thirteen letters \"x\", filler that puts the next routine at 23792."
  },
  {
   "address": 23792,
   "type": "line",
   "text": "USR 23792 (\"save\", line 6050): saves the first 6,378 bytes of the variables ($18EA from VARS: n$, d$, the simple variables l, o and z, p$, c$, m$, d() and g$: everything before s$) to tape as one block with no header, through the ROM's SA-BYTES ($04C2) with flag $FF. The simple variables after s$, the food tally fo among them, are not saved. Before it, the low byte of the error handler's address, in the slot ERR_SP points to, is set to $25, the old address kept at $FFFA; after it, the address is put back."
  },
  {
   "address": 23819,
   "type": "line",
   "text": "USR 23819 (\"load\", line 6255): the same, loading the block back over the variables with the ROM's LD-BYTES ($0556, carry set for LOAD)."
  },
  {
   "address": 23845,
   "type": "line",
   "text": "Puts back the error handler's address saved at $FFFA, then returns (the last two bytes, LD (HL),D and RET, sit at $5D2E). This is where an error during the tape operation was meant to come: the routines change only the handler's low byte, to $25. In play the handler is break_trap, $DA3C, so an error goes to $DA25 instead, in the middle of find_word: BREAK pressed during \"save\" or \"load\" resets the Spectrum, and the game is lost (seen in play, both ways)."
  },
  {
   "address": 23856,
   "type": "line",
   "text": "The end of line 1: a last \"x\" and the line's ENTER."
  },
  {
   "address": 23858,
   "type": "line",
   "text": "Line 10: REM LEGEND (c) 1983 021083, the publisher, the year and, as day, month and year, 2 October 1983, the release date."
  },
  {
   "address": 23884,
   "type": "line",
   "text": "gx (15): every graphics command but one goes through here; line 6260, after \"load\", runs the same LET itself to send command 14. The caller has built the command in x$; LET x$=STR$ USR gi runs it (graphics), and the assignment that follows leaves x$ holding the number USR returned."
  },
  {
   "address": 23899,
   "type": "line",
   "text": "The functions, defined once and used everywhere but FN n$. FN w$(n): word n of the dictionary d$, its first byte its length; FN n$(x,y) a byte of two nibbles, which no line uses; FN d$(x) a number as two bytes, high first; FN u and FN n the high and low nibbles of a character's code."
  },
  {
   "address": 24063,
   "type": "line",
   "text": "FN t$(x): an object with \"the\" before it (none for a quest object, whose name has a capital), or an amount of crowns (ca) with \"s\" after it for money (word 97)."
  },
  {
   "address": 24148,
   "type": "line",
   "text": "FN a$(x$): a word with its article: \"some food\", \"some wine\", \"some lightning\", \"an axe\", \"a sword\"; names (capitals) and \"you\" take none."
  },
  {
   "address": 24346,
   "type": "line",
   "text": "FN b$(n): word n with its article."
  },
  {
   "address": 24375,
   "type": "line",
   "text": "FN h$(n): \"you have\" or \"Thor has\"; FN i$(n): \"you are\" or \"Thor is\"."
  },
  {
   "address": 24471,
   "type": "line",
   "text": "FN a(n,t): true when character n carries object t in any of the twelve slots of c$(n)."
  },
  {
   "address": 24637,
   "type": "line",
   "text": "FN v(h,t): true when object t lies at location h, in one of the six object slots of m$(h)."
  },
  {
   "address": 24733,
   "type": "line",
   "text": "FN r(x): a random number from 1 to x. FN s(n) and FN t(n), the first byte of p$(n), are never used; FN w(n) and FN j(n), its second and third, are an object's weight and value, or a character's load. FN l(n) and FN x(n): character n's location and column, c$(n,13) and c$(n,14)."
  },
  {
   "address": 24882,
   "type": "line",
   "text": "FN m(n): character n's crowns, two bytes of c$(n); then the qualities, the nibbles of c$(n,17) to c$(n,19), which match the inlay's table: FN g goodness (0 the worst, 15 the best), FN h charisma, FN y strength (the cap on c$(n,20): FN s$ makes it y x 16 + 15), FN b bravery, FN i brains, and FN p, which the inlay does not list: how readily the character moves on. No line uses FN b, so bravery changes nothing."
  },
  {
   "address": 25075,
   "type": "line",
   "text": "FN q(h): the crowns lying at location h, two bytes of m$(h)."
  },
  {
   "address": 25116,
   "type": "line",
   "text": "FN o(): true when a command lacks an object or has a word in a slot the verb does not take; FN z(): true when it has any object at all. FN f(x,y): how far apart characters x and y are in goodness (co is 1), the measure of how much they dislike each other."
  },
  {
   "address": 25195,
   "type": "line",
   "text": "FN k(n): character n's strength now, c$(n,20)."
  },
  {
   "address": 25221,
   "type": "line",
   "text": "FN s$(n): character n's full strength as a character, FN y(n) x 16 + 15."
  },
  {
   "address": 25253,
   "type": "line",
   "text": "FN v$(n,x$): a verb with its subject: \"you go\", \"Thor goes\", \"Thor gets\"."
  },
  {
   "address": 25323,
   "type": "line",
   "text": "synt (100): reads the typed command. USR syntad runs parse_command, the flag at fad is cleared, and a game command (sc, the parse_result's slot 10) jumps to line sc x 50 - 700: l 5900, r 5950, pause 6000, save 6050, list 6100, who 6200, load 6250, print 6300, noprint 6350, copy 6400, what 6450, where 6500, help 6550, how 6600."
  },
  {
   "address": 25382,
   "type": "line",
   "text": "With no parser error, PEEKs the subject, verb, object and the rest from parse_result into s, v, b, im, so, c, ex and ca. A subject that is also the object (\"Thor, hit Thor\") sets e to 1, which answers \"what?\"."
  },
  {
   "address": 25533,
   "type": "line",
   "text": "Any error but 4 answers \"what?\"."
  },
  {
   "address": 25559,
   "type": "line",
   "text": "Error 4, a swear word: \"Mary is not amused...\". Mary (character 23) is brought on at the edge if she is elsewhere, and walks up to you."
  },
  {
   "address": 25679,
   "type": "line",
   "text": "Mary puts out her arms, with a low beep, and lowers them; you blush (gemb); she walks back and turns, and is taken off again if she was not here."
  },
  {
   "address": 25806,
   "type": "line",
   "text": "rf (200): will the character told to act do it? Acting for yourself (s = ll), or on a command already agreed (iv), passes at once."
  },
  {
   "address": 25832,
   "type": "line",
   "text": "\"You ask Thor to get the axe.\" (rp2), a pause, then a refusal (\"Thor refuses to get the axe.\") one time in three; or, when you are the one asking and the character is the last one asked, by you or by another character, or the last you dealt with in a trade (la, also set by line 1129), whatever it answered, eleven times in twelve, since a second test refuses seven in eight of the asks the first lets through; or always when FN f, how far apart the two are in goodness, less half the asker's charisma, is above 2. A refusal gives back 4 of the 5 strength the command cost."
  },
  {
   "address": 25975,
   "type": "line",
   "text": "Notes who was asked last (la) and returns."
  },
  {
   "address": 25987,
   "type": "line",
   "text": "Steps character n left (the command \"l\", line 5900): looks left along g$(1) from its own column for the first free one; if there is none, e = 1."
  },
  {
   "address": 26042,
   "type": "line",
   "text": "Walks n to the free column (gm) and records it in c$(n,14)."
  },
  {
   "address": 26077,
   "type": "line",
   "text": "Steps character n right (\"r\", line 5950), as step_left."
  },
  {
   "address": 26132,
   "type": "line",
   "text": "Joins step_left's walk."
  },
  {
   "address": 26144,
   "type": "line",
   "text": "Verb 101, \"go\" (101 x 50 - 4000 = 1050, run from 1055): \"go to Thor\" and \"go north\" alike. A character must be here (error 6); a compass word typed short (\"n\" to \"nw\", words 40-47) is made the long one (88-95)."
  },
  {
   "address": 26275,
   "type": "line",
   "text": "A direction: can the mover go that way (cango), to which location (mnex); the move is reported (rep); then you arrive at the new location (nloc), or another character departs (dep)."
  },
  {
   "address": 26393,
   "type": "line",
   "text": "\"go to\" a character or an object here: finds its column (an object's with mfi) and walks next to it, on the near side, or past anyone standing there to the next free column."
  },
  {
   "address": 26632,
   "type": "line",
   "text": "Verb 102, \"offer\" (1100, run from 1102), the start and the haggling of a trade. Only you can trade: anyone else told to refuses (5040). The object goes before the character if typed the other way round; the offer is pt. While a trade is under way (neg) the seller must be the same (ven: \"You are dealing with ...\") and so must the goods (vt: \"You are trying to buy ...\")."
  },
  {
   "address": 26906,
   "type": "line",
   "text": "A new trade, \"offer the sword to Thor for the axe\". Without \"for\" it is a gift (line 1750)."
  },
  {
   "address": 26937,
   "type": "line",
   "text": "The goods vt must not be money (\"You can't buy money.\") and the seller ven must be a character (\"Don't be silly.\"), here, and carrying them. The price vtv is the goods' value FN j, raised by f/32, where f is how far the seller is from you in goodness; when f is above 9 the seller may refuse outright, if RND x f is above 9."
  },
  {
   "address": 27222,
   "type": "line",
   "text": "The offer's worth ptv is its value, or the crowns offered: nothing offered is \"You must offer something.\", too little \"Thor says: the sword is not enough\". Another \"offer\" carries on the same trade."
  },
  {
   "address": 27391,
   "type": "line",
   "text": "\"Thor accepts.\": you give your offer to the seller and the seller gives the goods to you, both through dov as the verb \"give\" (115), so the usual checks of carrying and weight apply; if the seller cannot give, it gives your offer back."
  },
  {
   "address": 27584,
   "type": "line",
   "text": "Verbs 103 \"get\" and 104 \"take\" (1150 and 1200, both run from 1201): picks up an object here, or takes it out of the open chest or cupboard (\"take the key from the chest\"; a shut one is \"the chest is shut\"). A character can't be taken (error 17, \"You can't get Thor\"), and money goes to line 1231."
  },
  {
   "address": 27756,
   "type": "line",
   "text": "Walks to the object, first moving aside a character who stands on it, and turns to face it."
  },
  {
   "address": 27971,
   "type": "line",
   "text": "Takes the object off the ground (mget) and, for get and take, into the hands (bput), putting it back if bput refuses it (too heavy, no free slot, or a second weapon, shield or helmet); then draws the pick-up (gr: gget, or geatp and gdrinkp when eat and drink come this way for food and wine lying here)."
  },
  {
   "address": 28102,
   "type": "line",
   "text": "Money: the crowns are taken from the location (moms) and given to the taker (moba), which gives the wrong amount: see line 3410."
  },
  {
   "address": 28133,
   "type": "line",
   "text": "The object is at the taker's own column: the same, without the walk."
  },
  {
   "address": 28422,
   "type": "line",
   "text": "Verbs 105 \"hit\", 106 \"attack\" and 107 \"kill\" (1250, 1300 and 1350, all run from 1351), all the same: the victim b must be a character and here, and a weapon named with \"with\" must be carried (error 3)."
  },
  {
   "address": 28542,
   "type": "line",
   "text": "When you gave the command the attack is reported, and one time in two the attacker's goodness moves a step (16 in c$(s,17)): up if the victim is bad (goodness under 8), down if it is good. A step down from goodness 0 would be CHR$ of a negative number."
  },
  {
   "address": 28625,
   "type": "line",
   "text": "The fight: the two are brought face to face (gap). If either has no weapon in slot 1, or its p$ starts above \"9\" (Gore, Nidhog, Nasher and Raven), the attacker first steps aside (4600); the fight goes on all the same."
  },
  {
   "address": 28687,
   "type": "line",
   "text": "Each side's score is its strength plus 40 for its weapon and 40 more if the weapon's number is above 66. The attacker's weapon is the object named with \"with\", so \"attack Thor\" alone is bare hands even with a sword carried, and anything numbered above 66 counts as the better weapon: a sword or Skalir, but food, wine or a key too; an axe, Felstrong or lightning gets 40. The defender's is whatever is in its slot 1. The side behind then adds 32 for a shield and 64 for a helmet, if it holds a weapon."
  },
  {
   "address": 28888,
   "type": "line",
   "text": "Two or three rounds of blows, each side's figure striking (1380). The outcome is already settled by the scores: the winner w and the loser d, with no luck in it."
  },
  {
   "address": 28965,
   "type": "line",
   "text": "Scores within 20: \"The fight is drawn.\", both lose 32 strength, and the weaker turns round and steps aside twice."
  },
  {
   "address": 29080,
   "type": "line",
   "text": "A win by less than 64 over another character: \"Thor defeats Gripe\", the winner loses 32 strength and the loser 64, and the loser goes off to a random location (4110)."
  },
  {
   "address": 29181,
   "type": "line",
   "text": "A win by 64 or more, or any loss of 20 or more by you: \"Thor kills Gripe\", the winner loses 32 strength and the loser dies (5615)."
  },
  {
   "address": 29253,
   "type": "line",
   "text": "One blow: the fighter's figure swings its weapon (graphics command 11 with a random 1 to 3), steps forward and back, with a short beep."
  },
  {
   "address": 29446,
   "type": "line",
   "text": "Verb 108 \"drop\" (1400, run from 1402): money goes to 1430; otherwise the object leaves the hands (bget) and goes on the ground in the first free column ahead, the character stepping over if it must."
  },
  {
   "address": 29772,
   "type": "line",
   "text": "Money: the crowns are taken from the dropper (mobs) and left at the location (moma)."
  },
  {
   "address": 29803,
   "type": "line",
   "text": "Verb 109 \"throw\" (1450, run from 1452): throws an object at a character or another object (1455). A character hit fights back: it attacks the thrower with its own weapon (1350)."
  },
  {
   "address": 29879,
   "type": "line",
   "text": "Needs an object and a target, neither of them money; the object leaves the hands, then the target must be here. A target character that is not here gives the object back to the hands (bput, line 1462), but every later check that fails loses it: after a refusal (rf), a target object not found (mfi) or a throw from too close, it is never put down again."
  },
  {
   "address": 30026,
   "type": "line",
   "text": "Faces the target; the damage m is 10 for a sword or Skalir, 20 for an axe or Felstrong, 30 for lightning, 40 for a fireball and 2 for anything else, taken from a character's strength at once."
  },
  {
   "address": 30156,
   "type": "line",
   "text": "Lightning (66) or a fireball (87) flies as a missile (gfire, w = 1 for lightning) and is not put down anywhere."
  },
  {
   "address": 30192,
   "type": "line",
   "text": "A target under 2 columns away is \"too close to throw\", but the damage has been done and the object is gone (seen in play: food thrown at Thor from beside him vanished and Thor lost 2 strength). Otherwise the object flies to the target's column, or the nearest free one, with a beep, and lands there (mput)."
  },
  {
   "address": 30571,
   "type": "line",
   "text": "Verb 110 \"jump\" (1500, run from 1505), with no object: through a ringway. Needs the ring (85; Drapnir does not count) and a ringway here (wh, m$(h,3): \"There is no ringway here.\"); then the move is as for going (1077)."
  },
  {
   "address": 30701,
   "type": "line",
   "text": "Verb 112 \"put\" (1600, run from 1605): \"put the key in the chest\". The container must be the chest (68) or the cupboard (73), else error 5, and the one here must be open; the object must be carried, and not money. The putter walks to the container and the object goes in (mput with the column con, 255, that marks the inside)."
  },
  {
   "address": 30997,
   "type": "line",
   "text": "Verb 114 \"drink\" (1700, run from 1705): only wine (70), and \"drink\" alone means wine. Wine carried is drunk at once (gdrink); wine lying here is fetched first, as \"get\" fetches (gdrinkp)."
  },
  {
   "address": 31128,
   "type": "line",
   "text": "Verb 115 \"give\" (1750, run from 1752): \"give the axe to Thor\". The receiver must be here and the giver must carry the object; the gift is the giver dropping it (verb 108) and the receiver taking it (verb 104), through dov; if the receiver cannot take it, the giver picks it up again."
  },
  {
   "address": 31397,
   "type": "line",
   "text": "Verb 116 \"buy\" (1800, run from 1805): \"buy the axe from Thor for the sword\" is the trade at 1125. Another character told to buy from you (\"Thor, buy the sword\", 1820) is you selling: the buyer must be here, and pays the goods' value less f/32 for how far it is from you in goodness, without haggling (1135)."
  },
  {
   "address": 31661,
   "type": "line",
   "text": "Verb 117 \"sell\" (1850, run from 1856): you selling to a character is that character buying from you (1820); a character told to sell to you is you buying (1125)."
  },
  {
   "address": 31836,
   "type": "line",
   "text": "Verb 118 \"eat\" (1900, run from 1905): only food (96), and \"eat\" alone means food; carried or lying here, as for drink."
  },
  {
   "address": 31973,
   "type": "line",
   "text": "Verb 119 \"open\" (1950, run from 1955; \"unlock\" comes here too): needs the key (80: Ofnir does not count), and the chest or the cupboard here, shut (\"is already open\"). The opener needs (35 - sp) x 6 strength, from 0 to 204 at the special places that have one. At locations 4, 6, 37, 44 and 81 that is more than your full strength, 175, so there someone stronger, with a key of its own, must be told to open it."
  },
  {
   "address": 32224,
   "type": "line",
   "text": "Walks to the container."
  },
  {
   "address": 32243,
   "type": "line",
   "text": "Redraws the container: graphics command 18 with its feature for the new state and then for the old (5 shut and 6 open for the cupboard, 8 and 9 for the chest), with a beep."
  },
  {
   "address": 32352,
   "type": "line",
   "text": "Verb 120 \"summon\" (2000, run from 2002): calls a character to you; only you can summon. \"Sorry..\" when a$, the other characters here as last counted, is empty or holds more than six: the summons needs company, but not a crowd. Otherwise the character arrives (arr) if it is not here."
  },
  {
   "address": 32464,
   "type": "line",
   "text": "Verbs 121 \"close\" and 122 \"shut\" (2050 and 2100, both run from 2102; \"lock\" comes here too): the chest or the cupboard here, open (\"is already shut\"); a key named with \"with\" is allowed. The closer walks to it and it is redrawn shut."
  },
  {
   "address": 32650,
   "type": "line",
   "text": "Verb 123 \"unlock\" is \"open\"."
  },
  {
   "address": 32663,
   "type": "line",
   "text": "Verb 124 \"lock\" is \"close\"."
  },
  {
   "address": 32676,
   "type": "line",
   "text": "ver (2900): a command the verb cannot use: \"This doesn't make sense:-\", then the command as it was understood (rep)."
  },
  {
   "address": 32726,
   "type": "line",
   "text": "bput (3100, run from 3110): character n takes object t into its hands. Refused (error 1, \"can't carry\") when the object weighs nothing (the chest and the cupboard) or its weight on top of the load p$(n,2) is more than n's strength. A weapon (axe, Felstrong, sword, Skalir) goes in slot 1, a shield (shield, Skornir) in 2, a helmet (Grimnir, helmet) in 3, anything else in the first free slot from 4 to 12."
  },
  {
   "address": 32768,
   "type": "line",
   "text": "The last two bytes of line 3110, where the program crosses $8000."
  },
  {
   "address": 32770,
   "type": "line",
   "text": "Which slot: one each for a weapon, a shield and a helmet; a second weapon, shield or helmet is error 7, a full set of slots error 2."
  },
  {
   "address": 32920,
   "type": "line",
   "text": "Puts the object in its slot and adds its weight to the load, p$(n,2)."
  },
  {
   "address": 32966,
   "type": "line",
   "text": "bget (3150): character n gives up object t from its hands: from slot 1-3 for a weapon, shield or helmet, otherwise from 4-12; error 3 if it has not got it. Takes the weight off the load."
  },
  {
   "address": 33171,
   "type": "line",
   "text": "mput (3200): puts object t on the ground at column x of the location, in the first free pair of m$(h,6-17). When all six are taken, Klepto comes (5300)."
  },
  {
   "address": 33243,
   "type": "line",
   "text": "mget (3250): takes object t at column x off the location's list; error 6 if it is not there."
  },
  {
   "address": 33327,
   "type": "line",
   "text": "mfi (3285): finds object t at the location, the copy nearest character n. One inside an open container counts as at the container's column (cx) and sets in; one in a shut container is not found. Error 6 if there is none."
  },
  {
   "address": 33502,
   "type": "line",
   "text": "blist (3300): \"You have ...\" or \"Thor has ...\": the objects character n carries, with articles, and its crowns, or \"nothing\"."
  },
  {
   "address": 33785,
   "type": "line",
   "text": "csa (3350, run from 3355): adds m to character n's strength, up to its full strength."
  },
  {
   "address": 33840,
   "type": "line",
   "text": "css (3375, run from 3380): takes m from its strength, down to 0."
  },
  {
   "address": 33878,
   "type": "line",
   "text": "moba (3400, run from 3410): meant to add m crowns to character n, it adds n, the character's own number. So you get 1 crown however many you pick up (\"You get 50 crowns.\" then \"You have 151 crowns.\", seen in play), a character paid in a trade gets its number, and the rest of the money leaves the game."
  },
  {
   "address": 33919,
   "type": "line",
   "text": "mobs (3450, run from 3455): takes m crowns from character n: error 10 if it has none, 9 if you have too few; another character short of money refuses."
  },
  {
   "address": 34022,
   "type": "line",
   "text": "moma (3500, run from 3510): adds m crowns to the location."
  },
  {
   "address": 34063,
   "type": "line",
   "text": "moms (3550, run from 3555): takes m crowns from the location: error 12 if there are none, 13 if too few."
  },
  {
   "address": 34133,
   "type": "line",
   "text": "mo (3600, run from 3610): sets character n's location and column, c$(n,13) and c$(n,14), to h and x."
  },
  {
   "address": 34158,
   "type": "line",
   "text": "mprop (3750, run from 3760): reads location h from m$: its terrain te, its ringway wh, and its exits, the bits of m$(h,2) unpacked into c(1-8), north from the top bit round to northwest at the bottom."
  },
  {
   "address": 34255,
   "type": "line",
   "text": "No terrain is a plain (3). A terrain byte above 128 is a special place, sp = te - 128, with its own row of s$: its real terrain, the object or character needed (o1) and the one forbidden (o2) to take its other exits, those in k(1-8). The terrain to the north, tb, is read for the picture's distance: off the map or nothing is a plain, a hall counts as mountains."
  },
  {
   "address": 34501,
   "type": "line",
   "text": "mnex (3800, run from 3810): nx, the location one step in direction dir: the map is 9 by 9 (mb), numbered 1 to 81 from the south; north adds 9, east adds 1. Off the top or the bottom is error 14."
  },
  {
   "address": 34634,
   "type": "line",
   "text": "cango (3850, run from 3860): may character n leave by direction dir? An open exit (c) always; a special place's other exits (k) only with o1 carried or present and o2 neither carried nor present; otherwise error 14, \"the way north is blocked\"."
  },
  {
   "address": 34834,
   "type": "line",
   "text": "mdesc (3900, run from 3902): \"You are in Valheim, which is in an area of lakes in Asgard.\": the special place's name, \"hall\" after a name that ends in 's (\"Krank's hall\"), the terrain (none for a hall), and the world."
  },
  {
   "address": 35122,
   "type": "line",
   "text": "The world: Hell for locations 1 to 45, Midgard for 46 on, except Asgard where the column of the location, (h - 1) mod 9, is above 4: the map's east side."
  },
  {
   "address": 35215,
   "type": "line",
   "text": "de (3980): reports error e unless ep is clear, as it is while a character takes, eats or drinks something on its own (line 4223), for the give-backs of lines 1140 and 1790, on Klepto's journey (5312) and in the comings and goings (5520): RESTORE to line 9900 + e and READ the message, an expression the READ works out."
  },
  {
   "address": 35248,
   "type": "line",
   "text": "4000 (run from 4010), up to ten times a pass of the main loop: another character's turn. First a random character not here may arrive (arr): one that was at the location you just left, if its FN p beats RND x 8 and it either likes or loathes you (FN f under 5 or over 11), or one whose home, kept in p$(n,3), is here (the location it starts at, for all but Idun, Snake and Raven)."
  },
  {
   "address": 35343,
   "type": "line",
   "text": "Otherwise, if there are characters here (a$), a random one acts on its own, s; it has an object here in view, b (never a quest object, whose name has a capital), one it carries, t, and two others here, n1 and n2."
  },
  {
   "address": 35519,
   "type": "line",
   "text": "One time in four you are n1. n1 is made the one s likes more (the nearer in goodness), n2 the one it likes less. A clever character (brains, FN i, above 7; one time in ten the opposite) does not drop things; but one time in two a random character here is picked as ll and, unless that is the clever one itself, tells it what to do instead, and then it may refuse (rf), and may drop."
  },
  {
   "address": 35654,
   "type": "line",
   "text": "Unless a command is waiting, picks the action at random: line 4100, 4200, 4300, 4400, 4500 or 4600."
  },
  {
   "address": 35696,
   "type": "line",
   "text": "4100: one time in two, leaves for a random location anywhere (dep). Line 4110 also sends off a defeated character, and each one that congratulates you at Valhalla."
  },
  {
   "address": 35753,
   "type": "line",
   "text": "4200: picks up the object in view, or drinks it if it is wine, or eats it if it is food; with nothing in view, steps aside. Klepto (24) leaves axes and swords lying. Errors are not shown when it acts on its own."
  },
  {
   "address": 35895,
   "type": "line",
   "text": "4300: drops something it carries, unless it is clever (then it steps aside)."
  },
  {
   "address": 35950,
   "type": "line",
   "text": "4400: attacks n2 if it dislikes it enough (FN f of 7 or more) and n2 did not tell it to act, else steps aside; one time in three, when acting on its own, it throws something it carries at n2 instead."
  },
  {
   "address": 36066,
   "type": "line",
   "text": "4500: gives something it carries to n1, if it likes n1 enough (FN f of 3 or less)."
  },
  {
   "address": 36130,
   "type": "line",
   "text": "4600: steps aside, left or right as it faces, or the other way if that is blocked."
  },
  {
   "address": 36175,
   "type": "line",
   "text": "np (5000, run from 5007): ends a sentence with a full stop and a capital, then prints it."
  },
  {
   "address": 36231,
   "type": "line",
   "text": "pr (5010): prints x$ in the text window. A line of 32 or less scrolls n$ (USR 23760) and goes in at 609; a longer one is cut at the last space among its first 33 characters (after 32 if there is none) and printed a line at a time."
  },
  {
   "address": 36393,
   "type": "line",
   "text": "Shows the text area (USR priad) and, after \"print\", copies the line to the printer."
  },
  {
   "address": 36425,
   "type": "line",
   "text": "lf (5030): an empty line."
  },
  {
   "address": 36440,
   "type": "line",
   "text": "\"Thor refuses\", e = 1."
  },
  {
   "address": 36463,
   "type": "line",
   "text": "rp2 (5045): \"Thor refuses to give the axe to Odin\", or \"You ask Thor to ...\": the subject, x$, \"to\" and the verb, then the rest of the command as rep gives it."
  },
  {
   "address": 36513,
   "type": "line",
   "text": "rep (5050): reports a command as a sentence, \"Thor gets the axe from the chest.\": the subject and the verb (FN v$), then each word of the command after its preposition (\"with\", \"from\", \"to\", or \"at\" for throw and \"in\" for put, \"for\")."
  },
  {
   "address": 36692,
   "type": "line",
   "text": "Adds one word to the report: \"with the sword\"."
  },
  {
   "address": 36738,
   "type": "line",
   "text": "nloc (5100, run from 5105): you arrive at a location. Clears the waiting flag, any trade, help's flag and the container (open ones close behind you), puts you at a random column, reads the location (mprop), draws its picture (gter) and describes it (mdesc)."
  },
  {
   "address": 36859,
   "type": "line",
   "text": "Draws the objects lying here, moving any that would share a column. An empty slot is filled one time in three, while the food tally fo is under 100, with new food or wine: fo starts at 230, eating takes 2 off it and drinking 1, so once enough has gone the world's food and drink grow back. The first chest or cupboard here becomes the location's container."
  },
  {
   "address": 37138,
   "type": "line",
   "text": "Draws the characters here, each at a free column; every one but you is put back to full strength. Then lists them (\"who\") unless a command is waiting."
  },
  {
   "address": 37297,
   "type": "line",
   "text": "Location 80 (\"P\"), Valhalla, the end: characters 2 to 37 come in turn, each \"congratulates you.\" and leaves for somewhere else (4110), until you type a command."
  },
  {
   "address": 37420,
   "type": "line",
   "text": "efi (5200, run from 5205): the column a figure comes in at or goes out by: the first free one from the screen's edge nearer column y, at least 2 from y, with d facing it towards y."
  },
  {
   "address": 37525,
   "type": "line",
   "text": "5300: an object put down where all six slots are taken. Klepto (24) comes, \"Klepto steals the axe\", and carries it off to a random neighbouring location with a free slot (further if there is none), where he stays and it can be found again. A quest object (its name has a capital) is not the one he takes while an ordinary object lies there: it goes into that slot in place of the ordinary object, and he takes that; only when every slot holds a quest object or the container does he take whatever is in the last."
  },
  {
   "address": 38069,
   "type": "line",
   "text": "v0 (5400, run from 5405): clears the parsed command."
  },
  {
   "address": 38131,
   "type": "line",
   "text": "dov (5450): does verb v for character s (n): a character with no strength dies \"of hunger\"; otherwise the command costs it 5 strength (css) and the verb's line, v x 50 - 4000, runs."
  },
  {
   "address": 38228,
   "type": "line",
   "text": "5500, every pass of the main loop: who is here (a$, the characters in g$(1)). Then, one time in two: with you alone or with one other, a character from elsewhere arrives; with five or more others, one leaves for a neighbouring location, more likely a restless one (FN p) that is not too good; with two to four, nothing."
  },
  {
   "address": 38639,
   "type": "line",
   "text": "die (5600, run from 5610): \"You die of hunger\"."
  },
  {
   "address": 38671,
   "type": "line",
   "text": "The dead character keeps its weapon, shield and helmet (slots 1-3) and its crowns; everything in slots 4-12, Ofnir and Drapnir included, goes to random locations with room."
  },
  {
   "address": 38822,
   "type": "line",
   "text": "Four low beeps; the dead are taken to another location: you to location 30, 39 or 21, all in Hell, at random; the others anywhere."
  },
  {
   "address": 38975,
   "type": "line",
   "text": "The body lies down (glie) for a moment and is taken away; the dead are back at full strength (csa 1024, capped) at the new location, and for you the new location is drawn (nloc)."
  },
  {
   "address": 39095,
   "type": "line",
   "text": "gap (5650, run from 5655): brings attacker s and victim b two columns apart, moving them if they must, and turns them to face each other."
  },
  {
   "address": 39500,
   "type": "line",
   "text": "dep (5700, run from 5705): character n departs: walks off at the nearer edge (efi), \"Thor leaves.\", its new location nx and a random column recorded."
  },
  {
   "address": 39615,
   "type": "line",
   "text": "arr (5750): character n arrives at a free column, \"Thor arrives.\", at full strength (c$(n,20) set to FN s$), walking in from the nearer edge."
  },
  {
   "address": 39784,
   "type": "line",
   "text": "\"l\": step left (600)."
  },
  {
   "address": 39796,
   "type": "line",
   "text": "\"r\": step right (620)."
  },
  {
   "address": 39808,
   "type": "line",
   "text": "\"pause\" (6000, run from 6020): shows VALHALLA and \"Enter any command to continue...\" and waits for the flag at fad."
  },
  {
   "address": 39933,
   "type": "line",
   "text": "\"save\": USR 23792 saves the world to tape at once, then \"Game position saved.\""
  },
  {
   "address": 39979,
   "type": "line",
   "text": "\"list\": what you carry (blist)."
  },
  {
   "address": 39995,
   "type": "line",
   "text": "\"who\": the characters here (g$(1)), their names printed by column, each with an up arrow pointing at its figure."
  },
  {
   "address": 40004,
   "type": "line",
   "text": "Builds the line of names, a new line when one would overlap."
  },
  {
   "address": 40119,
   "type": "line",
   "text": "For \"what\" (6450, a = 2) the objects, and for an open container what is in it: \"In the chest, a key\"."
  },
  {
   "address": 40337,
   "type": "line",
   "text": "Places one name: \"^Thor\" from its column, or \"Thor^\" when it would run off the right."
  },
  {
   "address": 40450,
   "type": "line",
   "text": "\"load\" (6250, run from 6255): \"Play the tape.\", USR 23819 loads the saved world, then every figure is rebuilt (graphics command 14 and the weapon, shield and helmet it carries, its name shown meanwhile) and the game goes on at your location."
  },
  {
   "address": 40706,
   "type": "line",
   "text": "\"print\": every line of text also goes to the ZX printer (pf)."
  },
  {
   "address": 40718,
   "type": "line",
   "text": "\"noprint\"."
  },
  {
   "address": 40730,
   "type": "line",
   "text": "\"copy\": COPY, the screen to the printer."
  },
  {
   "address": 40738,
   "type": "line",
   "text": "\"what\": the objects here (6210 with a = 2)."
  },
  {
   "address": 40756,
   "type": "line",
   "text": "\"where\": the location (mdesc), the ways out (\"You can go east, or southeast\") and a ringway if there is one."
  },
  {
   "address": 40927,
   "type": "line",
   "text": "\"help\": \"Sorry..\" one time in two, and nineteen times in twenty once help has been given here."
  },
  {
   "address": 40960,
   "type": "line",
   "text": "The last six bytes of line 6550, where the program crosses $A000."
  },
  {
   "address": 40966,
   "type": "line",
   "text": "A special place's other exits: \"You need Ofnir if you wish to go north\", \"You need Odin's help ...\". The text for a forbidden object or character (\"you must not have a helmet\", \"Krank must not be present\") is never shown: with o2 alone line 6563 writes over it with \"You can go \", and where there are both o1 and o2 the exits are skipped altogether (both seen in play, with o1 and o2 set by hand)."
  },
  {
   "address": 41447,
   "type": "line",
   "text": "What a random character here carries (blist), and where the ringway leads."
  },
  {
   "address": 41557,
   "type": "line",
   "text": "\"how\": \"You are feeling strong\": strength over full strength, weak under a half, \"very\" above three quarters or under a quarter."
  },
  {
   "address": 41694,
   "type": "line",
   "text": "A RETURN no line reaches, the last of the game commands."
  },
  {
   "address": 41700,
   "type": "line",
   "text": "gter (7010): the location's picture. Seeds RND from the location, so a place looks the same at every visit; sends dark buildings (command 19) for Hell and locations 56, 57, 65, 66 and 81, then the picture (command 1) with the location's halves, its terrain and the terrain north; in a hall, tall windows at random."
  },
  {
   "address": 41867,
   "type": "line",
   "text": "The location's scene feature, m$(h,18), and a special place's four, s$(sp,6-9)."
  },
  {
   "address": 41940,
   "type": "line",
   "text": "Sends one feature (command 18); a castle (features 0-3) gets windows along its front, tall ones among them on castles 0, 1 and 3 (castle 2's are all plain), a hut (4) a window one time in two and a door one time in four."
  },
  {
   "address": 42330,
   "type": "line",
   "text": "gp (7050): puts character or object g at column x (command 2) and records it in g$, row 1 for characters, 2 for objects. Drawing is XOR, so putting it again takes it away; the record's first byte then goes back to 0, but its second still takes d."
  },
  {
   "address": 42402,
   "type": "line",
   "text": "gm (7100): moves g from column x1 to x2 (command 3) and moves its entry in g$; a character's facing is recorded in d(g)."
  },
  {
   "address": 42533,
   "type": "line",
   "text": "glie (7120): g lying down (command 4)."
  },
  {
   "address": 42561,
   "type": "line",
   "text": "geat (7150): g eats the food it carries (command 5): 64 strength back, and 2 off the food tally fo."
  },
  {
   "address": 42614,
   "type": "line",
   "text": "geatp (7170): g eats food lying beside it."
  },
  {
   "address": 42689,
   "type": "line",
   "text": "gdrink (7200): g drinks the wine it carries (command 6): 32 strength back, and 1 off fo."
  },
  {
   "address": 42740,
   "type": "line",
   "text": "gdrinkp (7220): g drinks wine lying beside it."
  },
  {
   "address": 42815,
   "type": "line",
   "text": "ggeto (7250): g carries t, the record only (command 7, three bytes)."
  },
  {
   "address": 42837,
   "type": "line",
   "text": "gget (7270): g picks up t from beside it (command 7)."
  },
  {
   "address": 42906,
   "type": "line",
   "text": "gdropo (7300): g no longer carries t, the record only (command 8, three bytes)."
  },
  {
   "address": 42928,
   "type": "line",
   "text": "gdrop (7320): g drops t beside it (command 8), recorded in g$(2)."
  },
  {
   "address": 42978,
   "type": "line",
   "text": "A RETURN between gdrop and garmd that no line reaches."
  },
  {
   "address": 42984,
   "type": "line",
   "text": "garmd (7370): g's arms down (command 9)."
  },
  {
   "address": 43006,
   "type": "line",
   "text": "Another RETURN no line reaches."
  },
  {
   "address": 43012,
   "type": "line",
   "text": "garmo (7420): g's arms out (command 10)."
  },
  {
   "address": 43034,
   "type": "line",
   "text": "A third unreached RETURN."
  },
  {
   "address": 43040,
   "type": "line",
   "text": "gemb (7550): the figure at column x blushes (command 13)."
  },
  {
   "address": 43059,
   "type": "line",
   "text": "gfire (7750): lightning (w = 1) or a fireball flies from x1 to x2 (command 17)."
  },
  {
   "address": 43089,
   "type": "line",
   "text": "gturn (7820): character n turns round: drawn again (XOR, so it vanishes), then drawn facing the other way."
  },
  {
   "address": 43144,
   "type": "line",
   "text": "mx (8000, run from 8100): the main loop. Up to ten other characters' turns (4000), stopping as soon as a command is waiting."
  },
  {
   "address": 43177,
   "type": "line",
   "text": "One time in two, the castle's flag flaps (command 20)."
  },
  {
   "address": 43200,
   "type": "line",
   "text": "The comings and goings (5500); round again unless a command is waiting."
  },
  {
   "address": 43224,
   "type": "line",
   "text": "A command is waiting: parse it (synt); a game command or an error goes back to the loop. \"me\" means you. A command whose subject is also its object is \"what?\"."
  },
  {
   "address": 43324,
   "type": "line",
   "text": "Your strength is checked in steps of 175/4: on falling into a lower step below 87 (\"W\"), \"You are getting weak - you need to eat or drink.\"; at 0 you die of hunger."
  },
  {
   "address": 43489,
   "type": "line",
   "text": "A command with no verb that starts with an object or a direction is \"go\" to it (\"north\"), or \"offer\" it while a trade is under way; a subject that is not a character, or is not here, is an error. Then the verb (dov), told by you (ll = 1), and its report (rep)."
  },
  {
   "address": 43652,
   "type": "line",
   "text": "9800, where the tape starts the program: DF_SZ = 2, clear the flags, black paper and border, CLS, you at your location, USR ioad (input_init), USR priad (print_text_window), the first location (nloc) and the main loop."
  },
  {
   "address": 43743,
   "type": "line",
   "text": "The error messages, read by de: one DATA line for each error number e at 9900 + e, each an expression READ works out with the current variables: 1 \"Thor can't carry the axe\", 2 \"... no room to carry ...\", 3 \"Thor has no axe\", 4 \"Klepto steals ...\", 5 \"... is not a container\", 6 \"... is not here\", 7 \"... a weapon already\"."
  },
  {
   "address": 44107,
   "type": "line",
   "text": "Errors 9 to 18: 9 \"you have only 5 crowns\", 10 \"... no money\", 12 \"there is no money here\", 13 \"there are only ... crowns here\", 14 \"the way north is blocked\", 17 \"... can't get ...\", 18 \"... not strong enough\", which no line raises (opening has a message of its own). 8, 11, 15 and 16 have no line and are not raised either."
  },
  {
   "address": 44378,
   "type": "line",
   "text": "n$(640): the text window's text area, 20 lines of 32 characters, five of them on screen at a time (print_text_window). A new line goes in at 609 after scroll_text has moved the rest up a line. Blank on the tape."
  },
  {
   "address": 45024,
   "type": "line",
   "text": "d$(255,11): the dictionary, one word to a row, its number the row: a length byte, the word, and in the last byte its class, which parse_command reads to file it. Words 1 to 39 are the characters, \"you\" first."
  },
  {
   "address": 45461,
   "type": "line",
   "text": "Words 40 to 100: the short compass words \"n\" to \"nw\" (40-47), the objects from 63 (axe) to 97 (crown), the long compass words 88-95 and \"me\" (99); the rows between are blank."
  },
  {
   "address": 46132,
   "type": "line",
   "text": "Words 101 to 146: the verbs \"go\" (101) to \"lock\" (124), class 2, then the game commands \"l\" (132) to \"how\" (146), class 7. A verb's number picks its line, 50 x v - 4000; a command's, 50 x sc - 700."
  },
  {
   "address": 46638,
   "type": "line",
   "text": "Words 147 to 177: the prepositions (\"with\", \"to\", \"from\", \"for\", class 3) and the words the parser lets pass (\"the\", \"please\", \"hallo\", \"thankyou\", class 5)."
  },
  {
   "address": 46979,
   "type": "line",
   "text": "Words 178 to 255: the special places' names (\"Ecstasy\", \"Krank's\", \"VALHALLA\", \"Asnir\", \"Hellgate\"), and from 241 the fourteen swear words, class 6, that bring Mary."
  },
  {
   "address": 47837,
   "type": "line",
   "text": "l = 1, o = 0, z = 2: the commonest numbers, kept as variables. A number written in a line takes its digits and six hidden bytes more, a variable's name one or two, so the program names nearly every number it uses."
  },
  {
   "address": 47855,
   "type": "line",
   "text": "p$(100,3): three bytes for each word. For an object, its first byte 0, its weight and its value (Grimnir weighs 20 and is worth 255, food 2 and 5); a chest and a cupboard weigh nothing and so can't be carried. For a character, a byte only the fight reads, its load, and its home, a location it may come back to (line 4010); for all but Idun, Snake and Raven it is where it starts."
  },
  {
   "address": 48163,
   "type": "line",
   "text": "c$(39,20): the 39 characters, you first: twelve slots of objects (1 the weapon, 2 the shield, 3 the helmet, 4-12 the rest), the location (13), the column on screen (14), crowns (15-16, high byte first), the qualities as nibbles (17-19: goodness and charisma, strength and bravery, brains and how readily it moves on) and the strength now (20). You start with 200 crowns, nothing else, and 175 strength."
  },
  {
   "address": 48951,
   "type": "line",
   "text": "m$(81,18): the 81 locations, 1 in the south-west corner. Each row: the terrain (1 icy waste, 2 marsh, 3 plain, 4 lakes, 5 forest, 6 mountains, 7 cave, 8 hall; 128 + n for special place n), the exits as bits, the location a ringway leads to, the crowns lying here (two bytes), six pairs of object and column, and a scene feature for the picture."
  },
  {
   "address": 49152,
   "type": "line",
   "text": "m$ on through Hell, locations 1 to 45 (the label is where the variables cross $C000, in location 11's row)."
  },
  {
   "address": 49769,
   "type": "line",
   "text": "m$ rows 46 to 81: Midgard, and Asgard on its east side; you start in row 71, Valheim, and row 80 is Valhalla."
  },
  {
   "address": 50417,
   "type": "line",
   "text": "d(39): which way each character faces, 1 for right."
  },
  {
   "address": 50618,
   "type": "line",
   "text": "g$(2,32,2): the screen's 32 columns: row 1 the character standing at each and its facing, row 2 the object. who, what, step_left and the walks read it."
  },
  {
   "address": 50756,
   "type": "line",
   "text": "s$(36,9): the 36 special places. Each row: the real terrain, the name's word, the object or character needed (o1) and the one forbidden (o2) for the exits in the next byte's bits, and up to four scene features."
  },
  {
   "address": 51088,
   "type": "line",
   "text": "The working variables, in the order they were first made, which is not the order this program sets them (line 110 and v0 set im and so before c): n, g, x, y, a, d and w, the command's parts as read from parse_result (s, v, b, c, so, im, ex, ca and sc), then p, q, e (the error) and t (the object)."
  },
  {
   "address": 51213,
   "type": "line",
   "text": "k3 to k9 and l0 to l9 and z0: the numbers 3 to 20."
  },
  {
   "address": 51339,
   "type": "line",
   "text": "gi = 63407, the graphics entry; gx = 15, its line; co = 1; ww = 32, the width; bs = 12, the slots; lc = 39, the last character; ln = 100, the last object; mb = 9, the map's side."
  },
  {
   "address": 51395,
   "type": "line",
   "text": "ep = 1 (report errors), pf = 0 (no printer), neg = 0 (no trade under way), la = 0 (nobody asked yet), he = 0 (no help given here), and fo = 230, the food tally that decides when food and wine grow back."
  },
  {
   "address": 51438,
   "type": "line",
   "text": "The first routine names: gp 7050, gm 7100, mo 3600, np 5000, pr 5010, lf 5030, dov 5450, rf 200, with iv = 0 and de 3980."
  },
  {
   "address": 51509,
   "type": "line",
   "text": "c(8): the location's ordinary exits, north to northwest, filled by mprop. Zeros on the tape."
  },
  {
   "address": 51555,
   "type": "line",
   "text": "k(8): a special place's other exits, those that need o1 and forbid o2."
  },
  {
   "address": 51601,
   "type": "line",
   "text": "i = 13, the end of a FOR loop to 12 that ran as a direct command (its line, 65534, is the edit line), left by whoever prepared the tape. The main loop's FOR i at line 8100 makes i again as soon as the game starts; lines 5140 (Valhalla) and 6260 (load) use it too."
  },
  {
   "address": 51620,
   "type": "line",
   "text": "nn = 88 to nw = 95: the long compass words' numbers, north round to northwest; then ll = 1, the one giving orders."
  },
  {
   "address": 51683,
   "type": "line",
   "text": "a$, the characters here as last counted (empty), o1 and o2 for a special place, and con = 255, the column that marks the inside of a container."
  },
  {
   "address": 51708,
   "type": "line",
   "text": "The machine code's addresses: rad 53350 (parse_result), syntad 53363 (parse_command), ioad 54413 (input_init), priad 55019 (print_text_window), fad 53939 (enter_flag), and two no line uses, tokad 54113 (word_list) and brkad 54749 (escape_to_basic)."
  },
  {
   "address": 51774,
   "type": "line",
   "text": "mt = 97 (money), me = 99, then more routine names: mx 8000, synt 100, ver 2900, and the carrying and money routines from bput 3100 to moma 3500."
  },
  {
   "address": 51909,
   "type": "line",
   "text": "o$(12): twelve zero bytes; LET g$(k,j)=o$ copies two of them, to clear a column."
  },
  {
   "address": 51927,
   "type": "line",
   "text": "The rest of the routine names: moms, the graphics from gter 7010 to gturn 7820, the location routines mprop to md2, and rep, rp2, v0, gap, nloc, efi, die, dep and arr; then lq = 255, your strength when it was last checked."
  },
  {
   "address": 52211,
   "type": "line",
   "text": "$80, the end of the variables, written by LOAD after the 28,456 bytes of the tape's file."
  },
  {
   "address": 53350,
   "type": "line",
   "text": "The parser's answer, which BASIC reads with PEEK from rad (53350, this address): +0 the subject s (a character told to act: \"Thor get axe\"), +1 the verb v, +2 the object b, +3 im (after \"with\", unless the verb before it is buy or sell), +4 so (after \"from\"), +5 c (after \"to\", or a second noun), +6 ex (after \"for\", or after \"with\" following buy or sell), +7 a slot for word class 4, which no word in the dictionary has, +8 and +9 ca, a number typed (an amount of crowns), low byte first, +10 sc, a game command (\"save\", \"who\", \"l\"), +11 the code of the word before the current one, +12 $FF once the last word has been read. Each slot holds a word's code, its index in the dictionary d$. parse_command clears all 13 bytes first."
  },
  {
   "address": 53363,
   "type": "line",
   "text": "Parser, USR syntad (53363) from line 100. Clears parse_result, then reads the word list the ENTER key built at word_list, five bytes a word, and files each word by its class (the 11th byte of its dictionary entry): a name or an object (class 1) before the verb becomes the subject, after it the object and then c; a verb (class 2) the verb; a preposition (class 3) sends the next word to im (\"with\", code 153, but ex when the verb already read is buy or sell, 116 or 117), so (\"from\", 155), c (\"to\", 154) or ex (any other: \"for\", 160); a game command (class 7) goes to sc and ends the parse; a swear word (class 6) ends it with error 4, which line 120 answers with Mary (line 115 answers every other error with \"what?\"). A number becomes the noun 97 (\"crown\") with the amount in ca, and the word \"crowns\" after it is passed over; \"crown\" with no number before it is error 3. A second verb or one noun too many is error 1, a second subject 5, a preposition at the end 2, a preposition followed by anything but a noun 6 (a number counts as a noun there only where the word goes to ex). Returns BC = 0 or the error, which BASIC takes as e."
  },
  {
   "address": 53648,
   "type": "line",
   "text": "Returns from the parser with BC = the error number in E."
  },
  {
   "address": 53652,
   "type": "line",
   "text": "Steps HL to the next entry of word_list, skipping the noise words (class 5: \"the\", \"please\", the place names) and the copies the matcher adds with code $FF; returns C = the class and B = the code, keeps the code before in parse_result+11, and sets parse_result+12 to $FF when the class is 0, the end of the list."
  },
  {
   "address": 53684,
   "type": "line",
   "text": "A number in the word list: its value (the entry's last two bytes) goes to ca at parse_result+8, and the word becomes the noun 97, \"crown\" (B = $61, C = 1)."
  },
  {
   "address": 53699,
   "type": "line",
   "text": "The end of the list: a command with no subject is the player's, so the subject is set to 1 (\"you\"); returns BC = 0, no error."
  },
  {
   "address": 53715,
   "type": "line",
   "text": "Unused. 222 bytes that nothing in the game reads or writes (no address in the machine code or the BASIC points here, and the play snapshots leave them as the tape has them). From $D200 they hold an older copy of matched_entry, enter_flag and the input editor's variables at input_vars (its flag byte $C1 at $D203), with the words \"quitt the axe at Nidhogg\" in its line buffer: memory the authors' machine held when the file was saved."
  },
  {
   "address": 53937,
   "type": "line",
   "text": "Address of the dictionary entry the matcher accepted last (d$ is 11 bytes an entry); the ENTER handler reads its 11th byte, the word's class."
  },
  {
   "address": 53939,
   "type": "line",
   "text": "fad (53939): bit 1 is set by ENTER when a line is waiting for BASIC, and cleared again if a word in it is not in the dictionary; the BASIC main loop reads it with PEEK fad (any bit) and clears it with POKE fad,0 once the line is parsed. While bit 1 is set the interrupt passes no keys to the editor. Bit 0, when set, makes ENTER ignored; nothing in the game sets it."
  },
  {
   "address": 53940,
   "type": "line",
   "text": "The input editor's variables, reached through IX = $D2B4. +0 flags: bit 0 a line was cleared by CAPS SHIFT 1 and can be fetched back, bit 2 a word is being collected, bit 3 the matcher has used its one spelling allowance, bit 5 a number is being read, bit 6 the cursor is showing, bit 7 SYMBOL SHIFT S and BREAK may leave the game (ioad sets it, line 9800 clears it with POKE fad+1,0). +1 ($D2B5) the cursor's position in the line, +2 ($D2B6) the line's length, +3 ($D2B7) the length of the word being read; $D2B8 a copy of SP; $D2BA and $D2BB the position and length saved by CAPS SHIFT 1; $D2BC the start of the five text-window lines shown, inside n$; $D2BE the number being read; $D2C0 where the next entry of word_list goes; $D2C2 the dictionary entry being tried; $D2C4, $D2C5, $D2C7, $D2C8 and $D2CD the matcher's counts; $D2C9 the start of n$'s text, VARS+6; $D2CB (IX+$17) more flags: bit 0 clear the input lines before printing, bits 3-5 which kind of misspelling has been allowed; $D2CC (IX+$18) the position of the last digit read (each digit overwrites it); $D2D2-$D2DC the ROM's print settings, saved by the interrupt."
  },
  {
   "address": 53981,
   "type": "line",
   "text": "The line being typed, as the keys gave it: up to 63 characters (the editor refuses a 64th)."
  },
  {
   "address": 54049,
   "type": "line",
   "text": "The word being looked up, lower case (OR $20 on each letter), up to 64 bytes; cleared by clear_word_buffer before each word."
  },
  {
   "address": 54113,
   "type": "line",
   "text": "tokad (54113): the line as the ENTER handler leaves it for the parser, five bytes a word: where the word ends in the line (the position just after its last letter), its length, its class, 0, and its code, the index of its entry in d$. A number is entered as the position just after its last digit, a byte that is 0 (1 when the digits follow letters directly), $FF, and its value, low byte first. ENTER clears 300 bytes here before it starts. At the hand-over it holds the entries of the authors' last command."
  },
  {
   "address": 54413,
   "type": "line",
   "text": "ioad (54413), USR from line 9800: sets the ROM's keyboard to lower case (FLAGS bit 3 and FLAGS2 bit 3), sets the input editor's flag byte to $80 (escape allowed), sets MODE ($5C41) to 0 and the lower screen's height DF_SZ ($5C6B) to 7 lines, puts break_trap at the address ERR_SP points to, so an error report comes there first, and switches to interrupt mode 2 with I = 9: the vector is the word at $09FF in the ROM, $FE69, the address of interrupt."
  },
  {
   "address": 54454,
   "type": "line",
   "text": "Prints the input line in the lower screen: opens channel K (stream 0), clears the input lines first if the line has just been shortened or emptied (bit 0 of $D2CB, set by CAPS SHIFT 0, CAPS SHIFT 1 and the end of ENTER), and prints. The caller pushes the text's address and length; B is the line offset."
  },
  {
   "address": 54477,
   "type": "line",
   "text": "Sets the print position in the lower screen with the ROM's CL-SET ($0DD9), row from $11 + B, then prints the number of characters and the address the caller pushed (read through a copy of SP in IX)."
  },
  {
   "address": 54513,
   "type": "line",
   "text": "Draws or removes the cursor: prints the five bytes at cursor_text, an underline with OVER 1, at the cursor's position in the two-line input area. The interrupt calls it every 16 frames, which makes it flash."
  },
  {
   "address": 54556,
   "type": "line",
   "text": "The cursor as the ROM prints it: OVER 1 ($15,$01), \"_\", OVER 0."
  },
  {
   "address": 54561,
   "type": "line",
   "text": "Prints B characters from HL with RST $10."
  },
  {
   "address": 54571,
   "type": "line",
   "text": "The editor's key handler, called from the interrupt with A = the ROM's LAST_K. CAPS SHIFT 2 (code 6) fetches back the cleared line, CAPS SHIFT 1 (7) clears it, CAPS SHIFT 5 and 8 (8, 9) move the cursor left and right, CAPS SHIFT 6 and 7 (10, 11) move it a whole screen line, CAPS SHIFT 0 (12) deletes to the left, ENTER (13) ends the line, SYMBOL SHIFT S (\"NOT\", $C3) leaves for BASIC when allowed, SYMBOL SHIFT Q (\"<=\", $C7) and A (\"STOP\", $E2) scroll the text window back and forward, SYMBOL SHIFT Z (\":\") redraws it. Letters, digits, space and ! \" , - . ; ? are inserted at the cursor; any other key gets the low error beep. Each accepted key ends with the short click."
  },
  {
   "address": 54702,
   "type": "line",
   "text": "A key the editor does not take: a beep of DE = $28 cycles at HL = $0428 through the ROM's BEEPER ($03B5)."
  },
  {
   "address": 54711,
   "type": "line",
   "text": "Every accepted key returns here: the click, DE = 7 cycles at HL = $0197."
  },
  {
   "address": 54726,
   "type": "line",
   "text": "Unused byte between two routines."
  },
  {
   "address": 54727,
   "type": "line",
   "text": "Clears the 64 bytes of word_buffer by copying the zero at zero_byte over and over (LDI with HL stepped back each time)."
  },
  {
   "address": 54749,
   "type": "line",
   "text": "brkad (54749), SYMBOL SHIFT S: if bit 7 of the editor's flags allows it, switches to interrupt mode 1, so the ROM's handler runs and the game's keyboard stops; line 9800 clears the bit, so in play the key does nothing."
  },
  {
   "address": 54757,
   "type": "line",
   "text": "CAPS SHIFT 5: moves the cursor one character left, if it is not at the start."
  },
  {
   "address": 54780,
   "type": "line",
   "text": "CAPS SHIFT 8: moves the cursor one character right, up to the end of the line."
  },
  {
   "address": 54806,
   "type": "line",
   "text": "CAPS SHIFT 1: empties the input line, keeping its position and length for CAPS SHIFT 2. Also the end of the ENTER handler, which clears the line once its words are listed."
  },
  {
   "address": 54846,
   "type": "line",
   "text": "CAPS SHIFT 0: deletes the character left of the cursor and closes the gap."
  },
  {
   "address": 54886,
   "type": "line",
   "text": "Inserts the character in A at the cursor, moving the rest of the line right; refused at 63 characters."
  },
  {
   "address": 54937,
   "type": "line",
   "text": "CAPS SHIFT 7: the cursor 32 characters back (one screen line), or to the start."
  },
  {
   "address": 54963,
   "type": "line",
   "text": "CAPS SHIFT 6: the cursor 32 characters on, or to the end."
  },
  {
   "address": 54993,
   "type": "line",
   "text": "CAPS SHIFT 2: gives back the line CAPS SHIFT 1 cleared (bit 0 of the flags), with its length and cursor position."
  },
  {
   "address": 55019,
   "type": "line",
   "text": "priad (55019), USR from line 5020 after each new line of text, from lines 6265 and 9800, and SYMBOL SHIFT Z: prints the five lines of the 20-line text area n$ that $D2BC points to, 160 characters, in the lower screen, with the ROM's print settings saved around it. This entry first points $D2BC at the last five lines (n$ starts 6 bytes into the variables; +$1E0 is line 16 of 20)."
  },
  {
   "address": 55078,
   "type": "line",
   "text": "SYMBOL SHIFT Q: moves the shown part of n$ one line (32 characters) towards its start, unless it is there, and prints it."
  },
  {
   "address": 55104,
   "type": "line",
   "text": "SYMBOL SHIFT A: moves the shown part one line towards the end, unless the last line is showing, and prints it."
  },
  {
   "address": 55123,
   "type": "line",
   "text": "Ends a number: adds its entry to word_list (the position just after its last digit, a byte that is 0 or 1 rather than its length, $FF, value) and clears the number being read."
  },
  {
   "address": 55172,
   "type": "line",
   "text": "ENTER: ignored on an empty line. Sets bit 1 of enter_flag, clears 300 bytes of word_list, then reads the line word by word: letters are lower-cased into word_buffer, digits build a number, and at each other character the word collected is looked up in the dictionary (find_word). A word the dictionary has is added to word_list with its class and code; the first one it has not stops the reading and is shown in red (show_bad_word). At the end of the line the line is cleared, leaving the list for BASIC."
  },
  {
   "address": 55219,
   "type": "line",
   "text": "The next word: clears word_buffer and the counts."
  },
  {
   "address": 55245,
   "type": "line",
   "text": "Reads one character: a letter goes into the word, a digit into the number (read_digit), anything else ends the word (end_of_word)."
  },
  {
   "address": 55282,
   "type": "line",
   "text": "A zero, copied over word_buffer and word_list to clear them."
  },
  {
   "address": 55283,
   "type": "line",
   "text": "Adds the digit at HL to the number being read: number = number x 10 + digit, in $D2BE."
  },
  {
   "address": 55313,
   "type": "line",
   "text": "A character that is not a letter: a digit goes to read_digit."
  },
  {
   "address": 55324,
   "type": "line",
   "text": "The end of a word: if letters were collected, looks the word up in the dictionary, d$ (VARS + $028E is its first entry's length byte), and adds an entry to word_list: where it ends (the position just after its last letter), its length, its class, 0 and its code; when the match allowed a final \"s\" a second entry follows with code $FF. A word not found goes to show_bad_word."
  },
  {
   "address": 55414,
   "type": "line",
   "text": "Not called: no address in the game points here, and the BASIC never uses 55414. Saves the ROM's print settings, brings back the line CAPS SHIFT 1 cleared (recall_line, called before IX is set), finds entry number L (from the LD L,$00 at $D88D, which nothing changes) of word_list, sets the cursor there and, only if a line was brought back, shows that word in red, as show_bad_word does."
  },
  {
   "address": 55496,
   "type": "line",
   "text": "A word that is not in the dictionary: puts the cursor after it, inserts PAPER 2 (red) before it and PAPER 0 after it, prints the line and takes the codes out again, so the word stays red on the screen while the line can be edited. Clears bit 1 of enter_flag: BASIC never sees the line."
  },
  {
   "address": 55607,
   "type": "line",
   "text": "Looks up the word in word_buffer (length at +3 of the editor's variables) in the dictionary, from the entry DE points to: the first byte of each 11-byte entry is its word's length, then the word, padded with spaces, then its class. Each entry is compared letter by letter, allowing one wrong, missing or extra letter (bits 3-5 of $D2CB record which); an entry matched with no allowance is returned at once, otherwise the search goes on through all 255 entries keeping the entry with most letters matched, which is accepted at the end if that count is within two of the typed word's length. Returns A = the entry's number, its code, or 0; matched_entry points at the entry."
  },
  {
   "address": 55808,
   "type": "line",
   "text": "Multiplies the number being read at $D2BE by ten."
  },
  {
   "address": 55825,
   "type": "line",
   "text": "Moves to the next dictionary entry (11 bytes on) and tries again, up to entry 255; at the end, returns the best near match found if the number of letters it matched is within two of the word's length, else 0."
  },
  {
   "address": 55868,
   "type": "line",
   "text": "Where a BASIC error comes first (input_init puts this address where ERR_SP points). Error code $14 (\"L BREAK into program\") is ignored unless the escape is allowed: the trap puts itself back and carries on with the next statement at the ROM's STMT-R-1 ($1B7D). Any other error, or BREAK when allowed, switches to interrupt mode 1 and goes to the ROM's error report at $1303."
  },
  {
   "address": 55903,
   "type": "line",
   "text": "Unused: 11 bytes that nothing reaches, the end of an older copy of cursor_text and print_chars ($5F,$15,$00, then LD A,(HL) / INC HL / PUSH HL / PUSH BC / RST $10 / POP BC / POP HL / DJNZ)."
  },
  {
   "address": 55914,
   "type": "line",
   "text": "Shades the top six character rows, the sky, from the cell in HL: shade_area with a size of 6 rows by 32 columns."
  },
  {
   "address": 55917,
   "type": "line",
   "text": "Shades a block of character cells, row H and column L, D rows by E columns: each pixel line is ANDed with $55 and $AA in turn, which leaves a checkerboard of what was drawn there, half its pixels."
  },
  {
   "address": 55966,
   "type": "line",
   "text": "DE = the screen address of the top pixel line of the character cell at row B, column C (rows 0-23)."
  },
  {
   "address": 55984,
   "type": "line",
   "text": "The 32-bit state of random, low byte first. The scene drawers read its bytes as random numbers; seed_random sets it from the location before a picture is drawn, so a location always looks the same."
  },
  {
   "address": 55988,
   "type": "line",
   "text": "Steps the shift register in rng_state 16 times: each step the new bit is the exclusive or of two bits of the top byte (bits 3 and 6 of $DAB3), shifted in at the bottom, and bit 7 of the top byte is kept clear."
  },
  {
   "address": 56027,
   "type": "line",
   "text": "Draws a skyline across the whole width, 256 columns from x = 0: six bytes follow the CALL (the routine returns past them), giving how many columns share a height, the longest run in one direction, counted in columns, the lowest and highest y, the spread of a step and the starting y. A run's step moves the height as the run starts and again every time a height's columns are done, so where a run ends on a step the height moves twice between two columns. Each column is filled from its height down to the y in fill_bottom with fill_column (or one pixel drawn, after toggle_ridge_fill)."
  },
  {
   "address": 56097,
   "type": "line",
   "text": "Picks a new run: a length (random below the limit, plus one) and a step (random below the spread, less half the spread), retrying until the height moved by that step is inside the limits, and moves it at once, before the run's first column."
  },
  {
   "address": 56141,
   "type": "line",
   "text": "Draws the columns of one step at the current height; ends when x wraps past 255."
  },
  {
   "address": 56170,
   "type": "line",
   "text": "draw_ridge's current height (y, counted up from the bottom of the upper screen as PLOT counts it) and, at $DB6B, its column, which wraps to 0 at the end of each skyline."
  },
  {
   "address": 56172,
   "type": "line",
   "text": "A = the mask of every bit up to the highest set bit of A ($0A gives $0F): the random-number users AND a random byte with it and retry while the result is too big."
  },
  {
   "address": 56186,
   "type": "line",
   "text": "The end of a step: moves the height by the run's step, if that stays inside the limits, and counts down the run."
  },
  {
   "address": 56208,
   "type": "line",
   "text": "Draws a vertical line in column C from y = B down to the y held in fill_bottom, the operand of the LD D at $DB90 (the scene drawers set it: $80 by default, the bottom of the sky; $28 for the forest and the cave floor, $50 for the lakes' shore, $68 for the mountains)."
  },
  {
   "address": 56234,
   "type": "line",
   "text": "Plots the pixel at x = C, y = B in PLOT's coordinates (y counted up from row 21), straight into the screen without touching the attributes. The instruction at $DBDA is rewritten by set_plot_xor, set_plot_or and set_plot_test, and directly by fill_shape, so the pixel is flipped (XOR, the default), set (OR), or only tested (AND, Z when clear)."
  },
  {
   "address": 56286,
   "type": "line",
   "text": "Scatters dots: six bytes follow the CALL, the number of dots, the lowest y and x, and the ranges of y and x. Each dot is a random position in the box, drawn by the routine whose address is at $DC2D: plot_pixel, or the stroke and dash drawers that borrow this loop."
  },
  {
   "address": 56307,
   "type": "line",
   "text": "scatter_dots with the box in registers: HL dots, x from B over a range of D, y from C over a range of E."
  },
  {
   "address": 56377,
   "type": "line",
   "text": "Scatters IX short strokes, grass and reeds: x from B over D, y from C over E; each stroke rises 1 to H+1 pixels and leans up to L/2 pixels to either side, drawn by the ROM's DRAW ($24BA) with the attribute byte ATTR_T set to $20 (green paper) and put back after."
  },
  {
   "address": 56453,
   "type": "line",
   "text": "scatter_strokes keeps here the HL' that the ROM's calculator must find unchanged on the return to BASIC ($DC85), and the attribute ATTR_T it overrides ($DC87)."
  },
  {
   "address": 56456,
   "type": "line",
   "text": "One stroke for scatter_strokes: sets the ROM's COORDS to the dot, picks a lean and a length from rng_state and draws the line up from it; a stroke whose top would lean outside the box's x range is retried at another position (its height is not checked against the box)."
  },
  {
   "address": 56525,
   "type": "line",
   "text": "Scatters HL horizontal dashes, ripples and furrows, of 1 to A+1 pixels: x from B over D, y from C over E, each dash running right and stopping at the right edge of the box; a dash cut short there is not counted, so another is drawn in its place."
  },
  {
   "address": 56558,
   "type": "line",
   "text": "One dash for scatter_dashes: its length from rng_state, then one pixel at a time to the right."
  },
  {
   "address": 56594,
   "type": "line",
   "text": "Draws the 8 by 8 pattern at HL with plot_pixel, its bottom row at y = B and left edge at x = C: the eight bytes are read from the last to the first, one set bit at a time, so a glyph can sit at any pixel position."
  },
  {
   "address": 56634,
   "type": "line",
   "text": "Paints the land, rows 6 to 16, all 32 columns, with the attribute in A."
  },
  {
   "address": 56637,
   "type": "line",
   "text": "Paints rows from 6, D rows by E columns, with the attribute in A."
  },
  {
   "address": 56640,
   "type": "line",
   "text": "Fills the attributes of a block of cells, row H, column L, D rows by E columns, with the attribute in C (from A)."
  },
  {
   "address": 56682,
   "type": "line",
   "text": "plot_pixel flips its pixel: XOR (HL), LD (HL),A at $DBDA."
  },
  {
   "address": 56689,
   "type": "line",
   "text": "plot_pixel sets its pixel: OR (HL), LD (HL),A."
  },
  {
   "address": 56694,
   "type": "line",
   "text": "plot_pixel only tests its pixel: AND (HL) and a NOP, so A is the pixel's bit and Z means clear."
  },
  {
   "address": 56699,
   "type": "line",
   "text": "Fills the inside of outlines, column by column, from x = H to x = L: going down from y = E to y = D + 1 (y = D itself is not reached), each set pixel met turns filling on or off, and pixels are set while it is on. A gives the state each column starts in."
  },
  {
   "address": 56791,
   "type": "line",
   "text": "fill_shape's on-off flag for the column being filled, and the state each column starts in."
  },
  {
   "address": 56793,
   "type": "line",
   "text": "Mirrors B character patterns at HL left to right, 8B bytes, reversing the bits of each byte."
  },
  {
   "address": 56799,
   "type": "line",
   "text": "Reverses the bits of B bytes from HL."
  },
  {
   "address": 56815,
   "type": "line",
   "text": "Switches draw_ridge between filled hills (each column drawn with fill_column) and a bare outline (one pixel a column, with plot_pixel), by rewriting the CALL at $DB58."
  },
  {
   "address": 56832,
   "type": "line",
   "text": "The address of fill_column, which toggle_ridge_fill compares with the CALL at $DB58."
  },
  {
   "address": 56834,
   "type": "line",
   "text": "toggle_ridge_fill's other half: the CALL at $DB58 becomes CALL plot_pixel."
  },
  {
   "address": 56841,
   "type": "line",
   "text": "Clears the pixels of a block of cells, row H, column L, D rows by E columns."
  },
  {
   "address": 56885,
   "type": "line",
   "text": "Sets rng_state from B and C, the two halves of the location's number that the BASIC sends with the picture command, mixing each with shifts and its complement (a zero becomes $0A or $ED), then steps random once."
  },
  {
   "address": 56921,
   "type": "line",
   "text": "Clears the picture, rows 0 to 16, and paints it black on white ($38)."
  },
  {
   "address": 56932,
   "type": "line",
   "text": "The early way out of a graphics command: puts back the stack pointer graphics saved on entry and returns BC = 1 to USR (a command that runs to its end returns through graphics at $F7D5 with BC = 0). A command that checks its string's length (all but 14, 18, 19, 20, 21 and 22) comes straight here when it is wrong, and so do a command number above 24 and command 15, whose entry in gfx_table is this address."
  },
  {
   "address": 56940,
   "type": "line",
   "text": "The stack pointer at the entry to graphics, and at $DE6E a second one, kept while the routines that take bytes after their CALL read them through SP."
  },
  {
   "address": 56944,
   "type": "line",
   "text": "DE = the attribute address of row B, column C, and A = the attribute there."
  },
  {
   "address": 56962,
   "type": "line",
   "text": "Converts a point in PLOT's coordinates to its character cell: C = x / 8, B = (168 - y) / 8, the row whose bottom pixel line is at y when y is a multiple of 8."
  },
  {
   "address": 56981,
   "type": "line",
   "text": "The opposite of cell_of_point: C = column x 8, B = 168 - row x 8, the bottom left pixel of the cell in PLOT's coordinates."
  },
  {
   "address": 56997,
   "type": "line",
   "text": "Makes the top third of the screen, rows 0 to 7, symmetrical: the left half of each pixel line is copied, mirrored, over the right half."
  },
  {
   "address": 57038,
   "type": "line",
   "text": "draw_line keeps the ROM's ATTR_T here while it draws, and an unused byte follows."
  },
  {
   "address": 57040,
   "type": "line",
   "text": "Draws a line in the colours already on the screen where it starts: four bytes follow the CALL, the start (x, y) and the end (x, y). Takes the attribute of the start cell for ATTR_T, PLOTs the start with the ROM's PLOT-SUB ($22E5) and draws the rest with its DRAW-LINE ($24BA), keeping HL' for the return to BASIC."
  },
  {
   "address": 57060,
   "type": "line",
   "text": "draw_line with the start in BC and the end in HL (y in the high byte)."
  },
  {
   "address": 57128,
   "type": "line",
   "text": "Unused: three bytes nothing reads, a LD HL,$0000 left between two routines."
  },
  {
   "address": 57131,
   "type": "line",
   "text": "Paints a block of cells with the attribute in A and clears its pixels: paint_box, then clear_box."
  },
  {
   "address": 57141,
   "type": "line",
   "text": "The address of the current shape bank's glyphs, set by select_bank and read by the figure routines ($E9F5 as loaded)."
  },
  {
   "address": 57143,
   "type": "line",
   "text": "The number of glyphs in that bank (9 as loaded)."
  },
  {
   "address": 57144,
   "type": "line",
   "text": "The point the figure and feature routines draw from: $DF38 the x in pixels (set by read_position, gfx_feature, gfx_fight, gfx_appear, figure_walk and the feature drawers), $DF39 the y, the figures' base row ($38 as loaded, read by part_position, read_position and gfx_blush); draw_glyph_list saves both and restores them when it finishes."
  },
  {
   "address": 57146,
   "type": "line",
   "text": "Where draw_flag put the castle's flag, column then row, for gfx_flag and draw_flag to wave it."
  },
  {
   "address": 57148,
   "type": "line",
   "text": "The colours of a settlement's buildings: the walls' attribute ($DF3C), the other attribute ($DF3D), the paper picked ($DF3E), and the settlement's style ($DF3F: bits 0-1 the layout, bit 2 a dark scheme, bit 3 which side the flag is on, bit 6 a flag is flying, bit 7 a castle). pick_hall_colours and pick_wall_colours set them; castle_start sets bit 7 for every castle, $FB92 sets bit 6 and $FBF5 flips bit 3, gfx_dark sets bit 2, and terrain_cave writes $DF3C, $DF3D and $DF3F itself ($E587-$E58F). gfx_terrain clears bits 3 to 7 for each new picture ($E2EB)."
  },
  {
   "address": 57152,
   "type": "line",
   "text": "Starts a settlement's style unless one is set (bit 7 of $DF3F): steps random and picks one with bit 7 set."
  },
  {
   "address": 57163,
   "type": "line",
   "text": "Picks a settlement's style from B and rng_state, keeping the dark-scheme bit; then the colours."
  },
  {
   "address": 57179,
   "type": "line",
   "text": "Picks the paper, yellow or white ($30 or $38); in the light scheme the other attribute takes it and the walls the other one; in the dark scheme the walls are $02 (red on black) and the other attribute is yellow or white ink on black, and the dark bit is cleared for the next building."
  },
  {
   "address": 57232,
   "type": "line",
   "text": "Ten 8 by 8 tiles that castles and halls are built from, drawn by draw_tile: 0-2 roof slopes (a large, a steep and a small corner triangle), 3 a merlon (top and both sides), 4 top and bottom lines, 5 right side and bottom, 6 bottom line, 7 right side, 8 top and left side, 9 top line. Mirrored, 7 and 8 give the left side and the top right corner."
  },
  {
   "address": 57312,
   "type": "line",
   "text": "Draws tile A (bits 0-4) of castle_tiles in the character cell at row B, column C: the tile is copied to $5B78, in the printer buffer, mirrored left to right when bit 6 of A is set and inverted when bit 7 is, then written into the cell's eight pixel lines."
  },
  {
   "address": 57385,
   "type": "line",
   "text": "Sets up scatter_box for the stone texture of a block of cells, D high and E wide with its top left at row H, column L: four dots a cell (HL = 4DE), x and y in pixels."
  },
  {
   "address": 57421,
   "type": "line",
   "text": "Four dots of stone texture in the cell at row B, column C."
  },
  {
   "address": 57436,
   "type": "line",
   "text": "Draws tile A at row B, column C, gives the cell the wall colour (hall_colours), adds texture when the castle has it (bit 4 of tower_size+4), and moves C one cell right."
  },
  {
   "address": 57458,
   "type": "line",
   "text": "The tower draw_tower is building: width and height in cells, its column and top row ($E074-$E075), and its style byte ($E076: bit 4 textured walls)."
  },
  {
   "address": 57463,
   "type": "line",
   "text": "Draws one tower or wall of a castle: three bytes follow the CALL, its width and height in cells and a byte whose bits 0-4 are its column (counted from the castle's left, castle_x) and bits 5-7 its shading. The tower stands on row 11: its cells are painted in the wall colour and cleared, its sides drawn down with tiles 7 (mirrored on the left), a top drawn with tiles 8 and 9 when it is narrower than 9 cells, and texture added: everywhere when the castle is textured, down its left 1-3 columns by bits 6-7, and down its right side by bit 5."
  },
  {
   "address": 57642,
   "type": "line",
   "text": "The column of the castle's left edge (feature x times 2), which draw_tower, draw_battlements, draw_flag and draw_gate add to their own columns (feature_hut reads it too)."
  },
  {
   "address": 57644,
   "type": "line",
   "text": "Starts a castle: its style is A plus $80 with the dark-scheme bit kept; picks from rng_state whether its walls are textured (bit 4 of tower_size+4), then the colours."
  },
  {
   "address": 57670,
   "type": "line",
   "text": "Draws a row of battlements: two bytes follow the CALL, the first holding the number of merlons less two (bits 5-7) and the column (bits 0-4), the second the row (bits 0-6) and, in bit 7, a parapet of tiles 4, 5 and 6 on the row below. The merlons are tile 3 with tile 9 between them, a row lower."
  },
  {
   "address": 57768,
   "type": "line",
   "text": "Texture on the first merlon, the cell below it and the cell right of that one, a row below the merlons."
  },
  {
   "address": 57783,
   "type": "line",
   "text": "Terrain 5, a forest: the land green ($20); the ground along the bottom of the picture (rows 15-16, below the trees) is a skyline filled down to y = 40 (fill_bottom $28)."
  },
  {
   "address": 57796,
   "type": "line",
   "text": "Forest, the ground along the bottom of the picture: draw_ridge's six bytes: runs of 1 column, each with a step of -3 to +3 that the height takes as the run starts and again after its column, so it moves twice from one column to the next (up to 4 inside these limits); it starts at y = 50 and stays between 45 and 51."
  },
  {
   "address": 57802,
   "type": "line",
   "text": "Forest, continued: shades rows 14-16, the ground under the trees, switches draw_ridge to outlines and draws three lines of foliage across the trees."
  },
  {
   "address": 57817,
   "type": "line",
   "text": "Forest, first line of foliage: draw_ridge's six bytes: the height moves every 3 columns and at each new run, in runs of 1 to 6 columns, by steps of -1 to +1; it starts at y = 126 and stays between 119 and 127."
  },
  {
   "address": 57823,
   "type": "line",
   "text": "Forest: the second line of foliage."
  },
  {
   "address": 57826,
   "type": "line",
   "text": "Forest, second line of foliage: draw_ridge's six bytes: the height moves every 3 columns and at each new run, in runs of 1 to 6 columns, by steps of -1 to +1; it starts at y = 123 and stays between 119 and 127."
  },
  {
   "address": 57832,
   "type": "line",
   "text": "Forest: the third line of foliage."
  },
  {
   "address": 57835,
   "type": "line",
   "text": "Forest, third line of foliage: draw_ridge's six bytes: the height moves every 3 columns and at each new run, in runs of 1 to 6 columns, by steps of -1 to +1; it starts at y = 120 and stays between 119 and 127."
  },
  {
   "address": 57841,
   "type": "line",
   "text": "Forest: the line along the foot of the trees."
  },
  {
   "address": 57844,
   "type": "line",
   "text": "Forest, the foot of the trees: draw_ridge's six bytes: the height moves every 3 columns and at each new run, in runs of 1 to 6 columns, by steps of -1 to +1; it starts at y = 96 and stays between 95 and 97."
  },
  {
   "address": 57850,
   "type": "line",
   "text": "Forest: tree trunks, each 2 to 5 pixels wide at a random 10 to 25 pixels from the last, filled with fill_shape from y = 98 down to a height that grows with the width, until x passes 255."
  },
  {
   "address": 57901,
   "type": "line",
   "text": "Forest: walks along y = 93 with plot_pixel testing; for each run of set pixels (a trunk) found, scatters 45 dots of foliage in each of two boxes 8 pixels wide and 24 high, from y = 100 to 123: one starting 17 pixels left of the trunk's middle and one at x = 231 less the middle, across the picture (set_plot_or, called just before, overwrites H, so the trunk's width plays no part), skipping a box that would pass x = 255; then sets plot_pixel to setting (OR)."
  },
  {
   "address": 58003,
   "type": "line",
   "text": "Forest: dots in the undergrowth."
  },
  {
   "address": 58006,
   "type": "line",
   "text": "Forest, undergrowth: scatter_dots's six bytes: 200 dots, x from 0 to 254, y from 97 to 120."
  },
  {
   "address": 58012,
   "type": "line",
   "text": "Forest: dots on the ground."
  },
  {
   "address": 58015,
   "type": "line",
   "text": "Forest, ground: scatter_dots's six bytes: 768 dots, x from 0 to 254, y from 92 to 99."
  },
  {
   "address": 58021,
   "type": "line",
   "text": "Forest: the colours of the trees: rows 6-7 white ink on green ($27), row 8 cyan ink ($25), rows 9-11 blue ink ($21), so the trunks show blue."
  },
  {
   "address": 58051,
   "type": "line",
   "text": "Graphics command 1, the location's picture (gter, line 7011): five bytes, the command and the location number's two halves, its terrain te and the terrain to the north tb. Seeds random from the halves, clears the picture, draws the bottom line at y = 40 and jumps to the terrain's drawer in terrain_table. Then, one time in four, paints rows 13-15 yellow, a track (not on an icy waste or in a cave); and, for terrain 1 to 5, when the terrain to the north is at least as high, draws the view north from view_table with the sky rows painted $3C and fill_bottom at $80. A hall gets neither: its drawer ends with POP HL ($E66F), which drops the return to $E30C pushed at $E30A."
  },
  {
   "address": 58192,
   "type": "line",
   "text": "The terrain being drawn, and at $E351 the terrain to the north."
  },
  {
   "address": 58194,
   "type": "line",
   "text": "The terrain drawers, 1 to 8: icy waste, marsh, plain, lakes, forest, mountains, cave, hall."
  },
  {
   "address": 58210,
   "type": "line",
   "text": "The views north, by the terrain there, 1 to 8: icy waste, marsh, plain, lakes, forest, and mountains for 6 to 8."
  },
  {
   "address": 58226,
   "type": "line",
   "text": "Terrain 1, an icy waste: the land white, rows 6-11 blue ink ($39), rows 6-7 cyan ink ($3D); 32 dashes of up to 25 pixels over the ice (and one more for each cut short at the right edge), then two outline skylines."
  },
  {
   "address": 58267,
   "type": "line",
   "text": "Icy waste, first line: draw_ridge's six bytes: the height moves every 7 columns and at each new run, in runs of 1 to 17 columns, by steps of -1 to +1; it starts at y = 125 and stays between 120 and 127."
  },
  {
   "address": 58273,
   "type": "line",
   "text": "Icy waste: the second line."
  },
  {
   "address": 58276,
   "type": "line",
   "text": "Icy waste, second line: draw_ridge's six bytes: the height moves every 3 columns and at each new run, in runs of 1 to 10 columns, by steps of -1 to +1; it starts at y = 90 and stays between 87 and 91."
  },
  {
   "address": 58282,
   "type": "line",
   "text": "Icy waste: switches draw_ridge back to filling; falls into paint_sky."
  },
  {
   "address": 58285,
   "type": "line",
   "text": "Paints the sky, rows 0-5, cyan ($2F)."
  },
  {
   "address": 58287,
   "type": "line",
   "text": "Paints the sky with the attribute in A."
  },
  {
   "address": 58290,
   "type": "line",
   "text": "Paints D rows by E columns from the top left corner with A."
  },
  {
   "address": 58296,
   "type": "line",
   "text": "The view north to an icy waste: a cyan sky and a skyline of white hills."
  },
  {
   "address": 58302,
   "type": "line",
   "text": "View north to an icy waste: draw_ridge's six bytes: the height moves every 5 columns and at each new run, in runs of 1 to 10 columns, by steps of -1 to +1; it starts at y = 138 and stays between 136 and 140."
  },
  {
   "address": 58308,
   "type": "line",
   "text": "Returns from view_icy."
  },
  {
   "address": 58309,
   "type": "line",
   "text": "Terrain 2, a marsh: the land green, row 6 cyan ink ($25), two outline skylines (the pools themselves are drawn later by marsh_pools)."
  },
  {
   "address": 58328,
   "type": "line",
   "text": "Marsh, first pool line: draw_ridge's six bytes: runs of 1 column, each with a step of -3 to +3 that the height takes as the run starts and again after its column, so it moves twice from one column to the next (up to 4 inside these limits); it starts at y = 50 and stays between 45 and 51."
  },
  {
   "address": 58334,
   "type": "line",
   "text": "Marsh: the second line."
  },
  {
   "address": 58337,
   "type": "line",
   "text": "Marsh, second pool line: draw_ridge's six bytes: runs of 1 column, each with a step of -1 to +1 that the height takes as the run starts and again after its column, so it moves twice from one column to the next (up to 2); it starts at y = 100 and stays between 98 and 103."
  },
  {
   "address": 58343,
   "type": "line",
   "text": "Marsh: switches draw_ridge back to filling and scatters three sets of dots, reeds and mud."
  },
  {
   "address": 58349,
   "type": "line",
   "text": "Marsh, first dots: scatter_dots's six bytes: 40 dots, x from 0 to 254, y from 127 to 127."
  },
  {
   "address": 58355,
   "type": "line",
   "text": "Marsh: the second set of dots."
  },
  {
   "address": 58358,
   "type": "line",
   "text": "Marsh, second dots: scatter_dots's six bytes: 300 dots, x from 0 to 254, y from 80 to 126."
  },
  {
   "address": 58364,
   "type": "line",
   "text": "Marsh: the third set of dots."
  },
  {
   "address": 58367,
   "type": "line",
   "text": "Marsh, third dots: scatter_dots's six bytes: 625 dots, x from 0 to 253, y from 81 to 95."
  },
  {
   "address": 58373,
   "type": "line",
   "text": "Marsh: the pools, along row 10 from column 0: first a gap of 1 to 8 cells, then a box of 1 to 8 cells painted $25 (cyan ink on green), cleared and filled with ripples, and so on in turn until column 31."
  },
  {
   "address": 58459,
   "type": "line",
   "text": "marsh_pools's column and its draw-or-skip flag."
  },
  {
   "address": 58461,
   "type": "line",
   "text": "The view north to a marsh: a low line on the horizon."
  },
  {
   "address": 58464,
   "type": "line",
   "text": "View north to a marsh: draw_ridge's six bytes: the height moves at each new run, every 1 or 2 columns (a run never lasts the 3 columns of a step), by steps of -1 to +1; it starts at y = 129 and stays between 128 and 131."
  },
  {
   "address": 58470,
   "type": "line",
   "text": "Returns from view_marsh."
  },
  {
   "address": 58471,
   "type": "line",
   "text": "Terrain 3, a plain: the land green, 150 tufts of grass (scatter_strokes) at y 83-90 and 125 more at y 40-47, then two sets of dots."
  },
  {
   "address": 58511,
   "type": "line",
   "text": "Plain, first dots: scatter_dots's six bytes: 160 dots, x from 0 to 254, y from 88 to 126."
  },
  {
   "address": 58517,
   "type": "line",
   "text": "Plain: the second set of dots."
  },
  {
   "address": 58520,
   "type": "line",
   "text": "Plain, second dots: scatter_dots's six bytes: 160 dots, x from 0 to 254, y from 84 to 93."
  },
  {
   "address": 58526,
   "type": "line",
   "text": "Returns from terrain_plain."
  },
  {
   "address": 58527,
   "type": "line",
   "text": "The view north to a plain: rows 4-5 green."
  },
  {
   "address": 58538,
   "type": "line",
   "text": "Terrain 4, lakes: the land green, rows 6-11 green ink on blue ($0C), rows 6-7 cyan ink on blue ($0D); then dots over the water."
  },
  {
   "address": 58562,
   "type": "line",
   "text": "Lakes, water: scatter_dots's six bytes: 500 dots, x from 0 to 254, y from 115 to 126."
  },
  {
   "address": 58568,
   "type": "line",
   "text": "Lakes: 256 ripples of up to 6 pixels at y 88 to 127, then the far shore, a skyline filled down to y = 80."
  },
  {
   "address": 58590,
   "type": "line",
   "text": "Lakes, the shore: draw_ridge's six bytes: runs of 1 or 2 columns, each taking a new step of -2 to +2 as it starts (a run never reaches the 4 columns after which a step would repeat); it starts at y = 87 and stays between 81 and 95."
  },
  {
   "address": 58596,
   "type": "line",
   "text": "Lakes: 100 tufts of grass along the bottom."
  },
  {
   "address": 58612,
   "type": "line",
   "text": "The view north to lakes: rows 4-5 white ink on blue ($0F), with 25 ripples."
  },
  {
   "address": 58640,
   "type": "line",
   "text": "View north to lakes: scatter_dots's six bytes: 800 dots, x from 0 to 254, y from 128 to 143."
  },
  {
   "address": 58646,
   "type": "line",
   "text": "Returns from view_lakes."
  },
  {
   "address": 58647,
   "type": "line",
   "text": "Terrain 6, mountains: the land green, rows 6-8 green ink on black ($04), a skyline filled down to y = 104."
  },
  {
   "address": 58668,
   "type": "line",
   "text": "Mountains, the foothills: draw_ridge's six bytes: runs of 1 to 8 columns, each with a step of -1 to +1 that the height takes as the run starts and again every 2 columns; it starts at y = 115 and stays between 104 and 127."
  },
  {
   "address": 58674,
   "type": "line",
   "text": "Mountains: dots on the slopes."
  },
  {
   "address": 58677,
   "type": "line",
   "text": "Mountains, slopes: scatter_dots's six bytes: 128 dots, x from 0 to 254, y from 85 to 94."
  },
  {
   "address": 58683,
   "type": "line",
   "text": "Mountains: three outline skylines, then back to filling."
  },
  {
   "address": 58692,
   "type": "line",
   "text": "Mountains, the lines on the slopes: draw_ridge's six bytes: runs of 1 to 8 columns, each with a step of -3 to +3 that the height takes as the run starts and again every 3 columns; it starts at y = 45 and stays between 40 and 50."
  },
  {
   "address": 58698,
   "type": "line",
   "text": "Mountains: counts the three lines."
  },
  {
   "address": 58704,
   "type": "line",
   "text": "The view north to mountains: a white sky ($38), filled peaks down to y = 128, the sky shaded, and a second, lower range in front."
  },
  {
   "address": 58717,
   "type": "line",
   "text": "View north to mountains, the far peaks: draw_ridge's six bytes: runs of 1 to 4 columns, each with a step of -1 to +1 that the height takes as the run starts and again every 2 columns; it starts at y = 151 and stays between 138 and 174."
  },
  {
   "address": 58723,
   "type": "line",
   "text": "View north to mountains: shades the sky, then the nearer range."
  },
  {
   "address": 58732,
   "type": "line",
   "text": "View north to mountains, the nearer range: draw_ridge's six bytes: runs of 1 to 10 columns, each with a step of -1 to +1 that the height takes as the run starts and again every 3 columns; it starts at y = 140 and stays between 129 and 155."
  },
  {
   "address": 58738,
   "type": "line",
   "text": "Returns from view_mountains."
  },
  {
   "address": 58739,
   "type": "line",
   "text": "The view north to a forest: a sky of $3C and a treeline."
  },
  {
   "address": 58747,
   "type": "line",
   "text": "View north to a forest: draw_ridge's six bytes: runs of 1 to 3 columns, each taking a new step of -2 to +2 as it starts (a run never reaches the 10 columns after which a step would repeat); it starts at y = 145 and stays between 140 and 150."
  },
  {
   "address": 58753,
   "type": "line",
   "text": "Returns from view_forest."
  },
  {
   "address": 58754,
   "type": "line",
   "text": "Terrain 7, a cave: a random style, the walls and land yellow ($30), the roof rows 0-5 yellow ink on black ($06); scattered rocks, then stalagmites: columns of dots 9 pixels wide, at random spacings of 18, 26 or 34 pixels from x = 255 down to 0."
  },
  {
   "address": 58781,
   "type": "line",
   "text": "Cave, the walls: scatter_dots's six bytes: 900 dots, x from 0 to 254, y from 80 to 127."
  },
  {
   "address": 58787,
   "type": "line",
   "text": "Cave: the stalagmites, boxes of 80 dots 9 pixels wide and 48 high at x falling by random steps, then the roof, two skylines filled down to y = 128, the first shaded, and the floor."
  },
  {
   "address": 58831,
   "type": "line",
   "text": "Cave, the roof: draw_ridge's six bytes: runs of 1 to 4 columns, each with a step of -3 to +3 that the height takes as the run starts and again after each column, so it moves twice where one run gives way to the next (up to 6); it starts at y = 140 and stays between 137 and 158."
  },
  {
   "address": 58837,
   "type": "line",
   "text": "Cave: shades the roof, then its lower edge."
  },
  {
   "address": 58846,
   "type": "line",
   "text": "Cave, the lower edge of the roof: draw_ridge's six bytes: runs of 1 to 4 columns, each with a step of -3 to +3 that the height takes as the run starts and again after each column, so it moves twice where one run gives way to the next (up to 6); it starts at y = 130 and stays between 128 and 147."
  },
  {
   "address": 58852,
   "type": "line",
   "text": "Cave: the floor, a skyline filled down to y = 40."
  },
  {
   "address": 58860,
   "type": "line",
   "text": "Cave, the floor: draw_ridge's six bytes: runs of 1 to 16 columns, each with a step of -1 to +1 that the height takes as the run starts and again every 4 columns; it starts at y = 51 and stays between 48 and 55."
  },
  {
   "address": 58866,
   "type": "line",
   "text": "Returns from terrain_cave."
  },
  {
   "address": 58867,
   "type": "line",
   "text": "Terrain 8, inside a hall: picks the colours and a style 0 to 3 (hall_colours); for styles 1 to 3 draws the ceiling (hall_rafters, hall_trusses or hall_vault) and returns through hall_room, while style 0 goes straight to hall_room and hall_paint draws its flat ceiling (hall_flat)."
  },
  {
   "address": 58900,
   "type": "line",
   "text": "The hall's room: one time in two, 190 dots on the wall."
  },
  {
   "address": 58910,
   "type": "line",
   "text": "Hall, dots on the wall: scatter_dots's six bytes: 190 dots, x from 0 to 254, y from 80 to 135."
  },
  {
   "address": 58916,
   "type": "line",
   "text": "The hall's colours: row 16 black, the floor rows 12-15 in the paper picked, rows 0-11 in the wall colour; one time in two, 20 short dashes on the floor, more if one is cut short at the edge; for style 0 the flat ceiling, and for styles 0 and 1 row 0 black."
  },
  {
   "address": 58993,
   "type": "line",
   "text": "Style 0: rows 0-2 cleared white ink on black, the ceiling's edge a line at y = 160."
  },
  {
   "address": 59007,
   "type": "line",
   "text": "Hall style 0, the ceiling's edge: draw_line's four bytes, from (0, 160) to (255, 160)."
  },
  {
   "address": 59011,
   "type": "line",
   "text": "Style 0: tile 0 at rows 3 and 4 makes the corner, then two lines, the end of the beam."
  },
  {
   "address": 59028,
   "type": "line",
   "text": "Hall style 0, the beam's end: draw_line's four bytes, from (8, 151) to (8, 144)."
  },
  {
   "address": 59032,
   "type": "line",
   "text": "Style 0: the beam along the ceiling."
  },
  {
   "address": 59035,
   "type": "line",
   "text": "Hall style 0, the beam: draw_line's four bytes, from (247, 144) to (8, 144)."
  },
  {
   "address": 59039,
   "type": "line",
   "text": "Style 0: mirrors the left half onto the right, then 200 dashes of up to 5 pixels (more if one is cut short at the edge) along the beam, x 8 to 247 and y 144 to 151 (character row 3)."
  },
  {
   "address": 59056,
   "type": "line",
   "text": "Style 1: tiles 1 and 2 in the top corner, then the rafters' lines."
  },
  {
   "address": 59075,
   "type": "line",
   "text": "Hall style 1, the first rafter: draw_line's four bytes, from (8, 167) to (31, 144)."
  },
  {
   "address": 59079,
   "type": "line",
   "text": "Style 1: the second rafter."
  },
  {
   "address": 59082,
   "type": "line",
   "text": "Hall style 1, the second rafter: draw_line's four bytes, from (40, 167) to (47, 152)."
  },
  {
   "address": 59086,
   "type": "line",
   "text": "Style 1: the ridge of the roof."
  },
  {
   "address": 59089,
   "type": "line",
   "text": "Hall style 1, the ridge: draw_line's four bytes, from (47, 152) to (130, 152)."
  },
  {
   "address": 59093,
   "type": "line",
   "text": "Style 1: four parallel lines from the left edge (x = 0, y = 152 down to 128, 8 pixels apart) to the top of the picture (y = 175, x = 47 to 95, 16 pixels apart), then the left half is mirrored onto the right."
  },
  {
   "address": 59121,
   "type": "line",
   "text": "Style 2: the trusses of the roof, ten lines; the triangle between them is filled with fill_shape."
  },
  {
   "address": 59124,
   "type": "line",
   "text": "Hall style 2, line 1: draw_line's four bytes, from (0, 159) to (40, 175)."
  },
  {
   "address": 59128,
   "type": "line",
   "text": "Style 2: line 2."
  },
  {
   "address": 59131,
   "type": "line",
   "text": "Hall style 2, line 2: draw_line's four bytes, from (0, 152) to (55, 174)."
  },
  {
   "address": 59135,
   "type": "line",
   "text": "Style 2: line 3."
  },
  {
   "address": 59138,
   "type": "line",
   "text": "Hall style 2, line 3: draw_line's four bytes, from (0, 143) to (103, 175)."
  },
  {
   "address": 59142,
   "type": "line",
   "text": "Style 2: line 4."
  },
  {
   "address": 59145,
   "type": "line",
   "text": "Hall style 2, line 4: draw_line's four bytes, from (0, 128) to (63, 151)."
  },
  {
   "address": 59149,
   "type": "line",
   "text": "Style 2: line 5."
  },
  {
   "address": 59152,
   "type": "line",
   "text": "Hall style 2, line 5: draw_line's four bytes, from (95, 160) to (128, 174)."
  },
  {
   "address": 59156,
   "type": "line",
   "text": "Style 2: line 6."
  },
  {
   "address": 59159,
   "type": "line",
   "text": "Hall style 2, line 6: draw_line's four bytes, from (95, 160) to (127, 160)."
  },
  {
   "address": 59163,
   "type": "line",
   "text": "Style 2: line 7."
  },
  {
   "address": 59166,
   "type": "line",
   "text": "Hall style 2, line 7: draw_line's four bytes, from (63, 151) to (127, 151)."
  },
  {
   "address": 59170,
   "type": "line",
   "text": "Style 2: line 8."
  },
  {
   "address": 59173,
   "type": "line",
   "text": "Hall style 2, line 8: draw_line's four bytes, from (40, 175) to (55, 175)."
  },
  {
   "address": 59177,
   "type": "line",
   "text": "Style 2: line 9."
  },
  {
   "address": 59180,
   "type": "line",
   "text": "Hall style 2, line 9: draw_line's four bytes, from (104, 175) to (127, 175)."
  },
  {
   "address": 59184,
   "type": "line",
   "text": "Style 2: line 10."
  },
  {
   "address": 59187,
   "type": "line",
   "text": "Hall style 2, line 10: draw_line's four bytes, from (95, 158) to (96, 158)."
  },
  {
   "address": 59191,
   "type": "line",
   "text": "Style 2: fills the beams from x = 0 to 127, y = 175 down to 129, then two more lines."
  },
  {
   "address": 59204,
   "type": "line",
   "text": "Hall style 2, line 11: draw_line's four bytes, from (0, 167) to (31, 152)."
  },
  {
   "address": 59208,
   "type": "line",
   "text": "Style 2: the last line."
  },
  {
   "address": 59211,
   "type": "line",
   "text": "Hall style 2, line 12: draw_line's four bytes, from (31, 175) to (47, 160)."
  },
  {
   "address": 59215,
   "type": "line",
   "text": "Style 2: tiles 1 and 2 in the corner, then the left half is mirrored onto the right."
  },
  {
   "address": 59234,
   "type": "line",
   "text": "Style 3: a vaulted ceiling: an edge of two lines with the space above it filled and shaded, then the curve of the vault in four lines, the ribs."
  },
  {
   "address": 59237,
   "type": "line",
   "text": "Hall style 3, the first stretch of the curve: draw_line's four bytes, from (8, 143) to (24, 159)."
  },
  {
   "address": 59241,
   "type": "line",
   "text": "Style 3: the second stretch."
  },
  {
   "address": 59244,
   "type": "line",
   "text": "Hall style 3, the second stretch: draw_line's four bytes, from (24, 159) to (63, 175)."
  },
  {
   "address": 59248,
   "type": "line",
   "text": "Style 3: fills above the curve (fill_shape starting filled), from x = 0 to 62, shades the top five rows of the first eight columns, then the vault's ribs."
  },
  {
   "address": 59271,
   "type": "line",
   "text": "Hall style 3, rib 1: draw_line's four bytes, from (15, 128) to (15, 135)."
  },
  {
   "address": 59275,
   "type": "line",
   "text": "Style 3: rib 2."
  },
  {
   "address": 59278,
   "type": "line",
   "text": "Hall style 3, rib 2: draw_line's four bytes, from (16, 136) to (40, 151)."
  },
  {
   "address": 59282,
   "type": "line",
   "text": "Style 3: rib 3."
  },
  {
   "address": 59285,
   "type": "line",
   "text": "Hall style 3, rib 3: draw_line's four bytes, from (40, 151) to (79, 167)."
  },
  {
   "address": 59289,
   "type": "line",
   "text": "Style 3: rib 4."
  },
  {
   "address": 59292,
   "type": "line",
   "text": "Hall style 3, rib 4: draw_line's four bytes, from (79, 167) to (127, 170)."
  },
  {
   "address": 59296,
   "type": "line",
   "text": "Style 3: tile 0 at rows 5 and 6 of the first columns, a slope of columns filled from y = 175 down to a line rising one pixel a column, then the left half mirrored onto the right."
  },
  {
   "address": 59332,
   "type": "line",
   "text": "The start of each figure shape's own set of 8 by 8 glyphs, banks 0 to 6, and the end of the last: the difference between one and the next, over 8, is a bank's size (17, 9, 12, 9, 10, 3 and 6 glyphs)."
  },
  {
   "address": 59348,
   "type": "line",
   "text": "The seven figure shapes, by the shape number in a figure's record (byte 1, bits 1-7)."
  },
  {
   "address": 59362,
   "type": "line",
   "text": "Shape 0, the full-sized warrior with 8 carried parts (helmet, shield, sword, axe and so on), used by you, Odin, Thor and most of the gods: a shape's first byte is its glyph bank times two, with the way the bank's glyphs face in bit 0 (they are mirrored in place when a figure turns); the second is the number of parts that come and go with what the figure carries, each two bytes (position, and a glyph from object_glyphs); then the body's parts until a 0, each three bytes (flags, position, glyph from the bank) or, when bits 0-1 of the flags are not 1, five (flags, position, a byte nothing uses, a first glyph, and a nibble of frame and one of last frame for the walk). A position byte gives y in bits 0-2 and x in bits 4-6, in pixels times 8, from the figure's corner, bit 7 counting x leftwards; bit 3 of a carried part's position shows it."
  },
  {
   "address": 59406,
   "type": "line",
   "text": "Shape 1, a smaller figure with 6 carried parts (Kon, Alvin, Boogi, Mary, Klepto, Leer and Bug), in the same layout as shape_0."
  },
  {
   "address": 59435,
   "type": "line",
   "text": "Shape 2, the dragon (Nidhog, Nasher and Skadi): one carried part and twelve body parts."
  },
  {
   "address": 59480,
   "type": "line",
   "text": "Shape 3, the stocky figure of the baddies (Thudd, Drudge, Gripe, Rankle, Snor, Glut, Grunt, Krank and Klout), 6 carried parts."
  },
  {
   "address": 59509,
   "type": "line",
   "text": "Shape 4 (Gore, Frantic and Gastro): one carried part, four body parts."
  },
  {
   "address": 59530,
   "type": "line",
   "text": "Shape 5, the snake (Snake): one carried part, three body parts."
  },
  {
   "address": 59546,
   "type": "line",
   "text": "Shape 6, the bird (Raven): one carried part, three body parts."
  },
  {
   "address": 59562,
   "type": "line",
   "text": "One record of five bytes for each of the 39 characters, found by find_figure from the character's number in byte 0: byte 1 its shape (bits 1-7) and which way it faces (bit 0); byte 2 which carried parts show, one bit each, set and cleared by get and drop, set for each blow by the fight command and cleared by command 14; bytes 3 and 4 which optional body parts show (the arms' positions, set by the arm commands and by get and drop, and for shape 0 which legs or lower body; bits 6-7 of byte 4 set by command 16). The search stops at a 0, which is the first byte of bank_0."
  },
  {
   "address": 59757,
   "type": "line",
   "text": "Shape 0's 17 glyphs: the warrior's head, body, arms in their positions and legs in their walking frames."
  },
  {
   "address": 59893,
   "type": "line",
   "text": "Shape 1's 9 glyphs."
  },
  {
   "address": 59965,
   "type": "line",
   "text": "The dragon's 12 glyphs."
  },
  {
   "address": 60061,
   "type": "line",
   "text": "Shape 3's 9 glyphs."
  },
  {
   "address": 60133,
   "type": "line",
   "text": "Shape 4's 10 glyphs."
  },
  {
   "address": 60213,
   "type": "line",
   "text": "The snake's 3 glyphs."
  },
  {
   "address": 60237,
   "type": "line",
   "text": "The raven's 6 glyphs, then a zero ($EB7D) that ends glyph_banks's last entry."
  },
  {
   "address": 60286,
   "type": "line",
   "text": "For each shape, the table get and drop look an object up in: shape 0's, shape 1's and 3's, and one for the shapes that show nothing carried."
  },
  {
   "address": 60300,
   "type": "line",
   "text": "The objects that have a glyph of their own, 16 entries and a 0 to end them: bits 1-7 are the object's code less $3E (83 helmet, 65 shield, 67 sword, 63 axe, 80 key, 76 stone, 70 wine, 96 food, 71 jewel, 84 and 85 ring, after object_glyph has mapped the objects that share a glyph; the five entries $FF and $FE match no object and only keep the facing of glyphs that figures carry), bit 0 the way its glyph in object_glyphs faces."
  },
  {
   "address": 60317,
   "type": "line",
   "text": "Shape 0's carry table: four bytes for each object it can show (the object's code as in object_codes, then the bits of record bytes 2 and 3 to set and to clear), ending with a 0."
  },
  {
   "address": 60334,
   "type": "line",
   "text": "The carry table of shapes 1 and 3."
  },
  {
   "address": 60343,
   "type": "line",
   "text": "The carry table of the dragon, shape 4, the snake and the raven: one entry and the end."
  },
  {
   "address": 60348,
   "type": "line",
   "text": "16 glyphs, 8 bytes each, in the order of object_codes: eleven are objects' own, the glyph an object lying on the ground or thrown is drawn with; the other five (1, 2, 4, 10 and 11) are a sword, a shield and an axe as a figure holds them and a sword and an axe raised, drawn only as figures' carried parts."
  },
  {
   "address": 60476,
   "type": "line",
   "text": "Unused: a 17th glyph, all zeros, that nothing refers to."
  },
  {
   "address": 60484,
   "type": "line",
   "text": "A figure lying down, for each of the seven shapes: a byte with the number of glyphs (bits 0-3), how many cells behind the figure's position they start (bits 4-6: to its left for one facing, to its right for the other, the glyphs running the other way) and the way they face (bit 7), then the glyphs, drawn side by side by gfx_lie."
  },
  {
   "address": 60635,
   "type": "line",
   "text": "Scene feature 10, a window one cell high: one glyph for each of the four building styles."
  },
  {
   "address": 60667,
   "type": "line",
   "text": "Scene feature 11, a window two cells high: two glyphs for each of the four styles."
  },
  {
   "address": 60731,
   "type": "line",
   "text": "Scene feature 6, an open cupboard, in each of the four styles: lists of glyphs drawn by draw_glyph_list, each entry a position byte (as in a figure's parts) and 8 bytes of pattern, the list ending at a byte with bit 3 set."
  },
  {
   "address": 60798,
   "type": "line",
   "text": "Scene feature 5, a shut cupboard, in the four styles, as cupboard_open_lists."
  },
  {
   "address": 60910,
   "type": "line",
   "text": "Scene feature 7, the door of a hut: two pairs of glyphs, the pair picked from rng_state."
  },
  {
   "address": 60942,
   "type": "line",
   "text": "The gate of a castle (draw_gate), as glyph lists: one for styles 0 and 1, one for style 2 and a taller one, three cells high, for style 3."
  },
  {
   "address": 61071,
   "type": "line",
   "text": "Graphics command 3 for a character: walks figure B from column x1 to x2 on the figures' base row ($DF39; the row and facing bytes of the command are not read). Finds its record and shape, turns it to face the way it goes, works out the steps (8 a column) and the pause between them (the walking speed), copies the shape to $5B00, in the printer buffer, and then for each step: draws the copy (XOR, so it vanishes), moves one pixel, advances each animated part's frame nibble, draws it again and waits. Returns at once if x1 = x2."
  },
  {
   "address": 61247,
   "type": "line",
   "text": "The count of pixel steps still to go, for figure_walk and for gfx_move's objects and missiles; at $EF40, the facing a figure's record had before turn_figure last turned it, which nothing reads."
  },
  {
   "address": 61249,
   "type": "line",
   "text": "Advances an animated part's frame: the frame nibble counts up to the last-frame nibble and back to 0."
  },
  {
   "address": 61272,
   "type": "line",
   "text": "The pause between steps: B times 256 empty loops, B set by figure_walk from the speed at $EEDA times one more than bits 6-7 of record byte 4; then the figure is undrawn, moved a pixel and drawn at its new position, or drawn standing after the last step."
  },
  {
   "address": 61324,
   "type": "line",
   "text": "Graphics command 2 for a character: draws figure B at the column given, on the figures' base row (the row byte only places objects), facing as the last byte says."
  },
  {
   "address": 61354,
   "type": "line",
   "text": "Refuses (through gfx_return) a figure number of 64 or more."
  },
  {
   "address": 61366,
   "type": "line",
   "text": "The figure number being looked for ($EFB6), and a place to keep HL ($EFB7) while the figure routines use it."
  },
  {
   "address": 61369,
   "type": "line",
   "text": "Finds the record of figure A in figure_records ($EFEA keeps its address) and its shape in figure_shapes (figure_shape); a number with no record goes to gfx_return."
  },
  {
   "address": 61416,
   "type": "line",
   "text": "The address of the shape being drawn, and at $EFEA the address of the figure's record."
  },
  {
   "address": 61420,
   "type": "line",
   "text": "Points the glyph routines at shape bank A: $DF35 gets the bank's address from glyph_banks, $DF37 its number of glyphs."
  },
  {
   "address": 61465,
   "type": "line",
   "text": "Turns the figure to face the way A says (0 or 1): mirrors in place each carried part's glyph in object_glyphs that faces the other way, then the shape's whole bank (mirror_chars), noting the new facing in the shape and the record."
  },
  {
   "address": 61613,
   "type": "line",
   "text": "Sets bit 3 of each carried part's position in the shape from the bits of record byte 2, so only what the figure carries is drawn."
  },
  {
   "address": 61644,
   "type": "line",
   "text": "Sets bit 6 of each optional body part's flags from the bits of record bytes 3 and 4, choosing which of the optional glyphs are drawn: the arms' positions and, for shape 0, which legs or lower body."
  },
  {
   "address": 61708,
   "type": "line",
   "text": "B, C = the screen position of a part from its position byte A and the figure's corner ($DF38 x, $DF39 y); carry set when it falls off the screen, past the right edge or, for a part to the left of the corner, past the left."
  },
  {
   "address": 61756,
   "type": "line",
   "text": "Draws glyph A of object_glyphs at B, C."
  },
  {
   "address": 61784,
   "type": "line",
   "text": "Draws the shape copy at HL with interrupts off: the carried parts that show, then the body parts that are not marked standing-only (bit 5 of the flags), each optional one only when it is chosen, each animated one at its current frame."
  },
  {
   "address": 61880,
   "type": "line",
   "text": "Draws glyph A of the current bank at B, C."
  },
  {
   "address": 61906,
   "type": "line",
   "text": "Draws the figure from its shape itself, standing: the carried parts that show and the body parts marked for standing (bit 4 of the flags), each optional one only when it is chosen; used when it does not move."
  },
  {
   "address": 61977,
   "type": "line",
   "text": "Graphics command 2 (gp, line 7050): five bytes, the command, a character or an object, its column, its row and the way it faces. A character goes to figure_put; an object's glyph is looked up, turned and drawn at the position."
  },
  {
   "address": 62013,
   "type": "line",
   "text": "Moves an object a whole column, 8 pixels, left or right: from gfx_get_drop and from the eating and drinking animations to the column beside the figure where it lies on the ground (the eating and drinking animations rub the food or wine out there before the frames play)."
  },
  {
   "address": 62035,
   "type": "line",
   "text": "The object being drawn: its entry in object_codes ($F253), its glyph's address ($F255) and the way the glyph faces ($F257)."
  },
  {
   "address": 62040,
   "type": "line",
   "text": "Finds the glyph of the object whose number is at HL (and returns HL past it): objects with no glyph of their own borrow another's (64 Felstrong the axe's, 69 Skalir the sword's, 72 Skornir the shield's, 78 Drapnir the ring's, 79 Ofnir the key's, 82 Grimnir the helmet's), then object_codes is searched."
  },
  {
   "address": 62136,
   "type": "line",
   "text": "The pixel position of the object being drawn: x, then y."
  },
  {
   "address": 62138,
   "type": "line",
   "text": "Reads a column (x 8) and a row (x 8, added to the figures' base y at $DF39) from the command string at HL."
  },
  {
   "address": 62167,
   "type": "line",
   "text": "Turns the object's glyph to face the way A says, mirroring it in place."
  },
  {
   "address": 62188,
   "type": "line",
   "text": "Bit 0 set: the command only changes a record and draws nothing, because the figure is not on the screen."
  },
  {
   "address": 62189,
   "type": "line",
   "text": "Graphics commands 7 and 8, get and drop (gget, gdrop: lines 7270, 7320): six bytes, the command, a character, an object, a column, a row and a facing; or three, which only change the record. Draws the object (XOR, so a lying object vanishes when it is picked up), and redraws the figure with the object shown or not: the object's entry in the shape's carry table sets or clears bits in record bytes 2 and 3."
  },
  {
   "address": 62469,
   "type": "line",
   "text": "Graphics command 4 (glie, line 7120): five bytes, the command, a character, a column, a row, a facing. Draws the character lying on the ground, with the glyphs in lying_glyphs for its shape, turned the right way; glyphs that would fall off the screen are left out."
  },
  {
   "address": 62664,
   "type": "line",
   "text": "gfx_lie's flags, glyph count and position, and the address of the next glyph; gfx_eat and gfx_drink also pass the frame list's address to turn_frames in the position's two bytes ($F4CA)."
  },
  {
   "address": 62670,
   "type": "line",
   "text": "Graphics command 12: three bytes, a character and a column. Makes the figure appear: seven passes over the cells it covers, each moving their ink a step towards the paper's colour with a pause, then the figure drawn, then one pass that sets the ink back (the patch at $F51B, put in at $F57F and taken out after). No line of the BASIC sends this command."
  },
  {
   "address": 62747,
   "type": "line",
   "text": "Code fade_cell jumps to for the last pass (gfx_appear writes JP $F51B at $F57F): LD A,(HL), AND $38, LD (HL),A (ink black), JP $F58F."
  },
  {
   "address": 62754,
   "type": "line",
   "text": "One pass of gfx_appear over every cell a part of the figure is in, then a pause of 100 x 256 loops."
  },
  {
   "address": 62837,
   "type": "line",
   "text": "Moves the ink of one cell a step towards its paper, up or down."
  },
  {
   "address": 62875,
   "type": "line",
   "text": "fade_cell's place to keep HL, and a byte where gfx_appear writes the command's column, which nothing reads."
  },
  {
   "address": 62878,
   "type": "line",
   "text": "Graphics command 3 (gm, line 7101): the command, a character or an object, x1, x2, a row and a facing. A character walks (figure_walk); an object slides from x1 to x2 one pixel at a time, drawn, paused and undrawn, and is left at x2. Also the flight of a fireball or lightning for gfx_missile."
  },
  {
   "address": 63069,
   "type": "line",
   "text": "Graphics command 16: three bytes, a character and a number 0-3: sets bits 6-7 of record byte 4 to 3 less the number. No line of the BASIC sends this command."
  },
  {
   "address": 63110,
   "type": "line",
   "text": "The two missiles: a fireball (a ball) and lightning (a zigzag); then the facing byte for gfx_missile ($F696) and gfx_move's slide pause kept while the missile flies at half of it ($F697)."
  },
  {
   "address": 63128,
   "type": "line",
   "text": "Graphics command 17 (gfire, line 7750): five bytes, the command, 0 for a fireball or 1 for lightning, x1, x2 and the row: flies the missile from x1 to x2 like an object moved by gfx_move, at twice the speed."
  },
  {
   "address": 63193,
   "type": "line",
   "text": "gfx_move's flag: 1 when the moving thing is an object (0 for a missile), undrawn at x1 before it slides and drawn again at x2 at the end."
  },
  {
   "address": 63194,
   "type": "line",
   "text": "Graphics command 13 (gemb, line 7550): two bytes, the command and a column. The three cells of the column from the figures' base row up (rows 14, 13 and 12, where a figure stands) change ink to magenta, blue, red and black in turn, a pause each: you blush when Mary is not amused (line 122)."
  },
  {
   "address": 63260,
   "type": "line",
   "text": "gfx_blush's column and row."
  },
  {
   "address": 63262,
   "type": "line",
   "text": "Reads a character's number from the command at HL, finds its record and shape, and turns and dresses the shape as the record says."
  },
  {
   "address": 63291,
   "type": "line",
   "text": "Graphics commands 9 and 10, arms down and arms out (garmd, garmo: lines 7370, 7420): a character and a column (or no column, which only changes the record). Undraws the figure, changes the arm bits of record byte 3 for the command and the shape, and draws it again."
  },
  {
   "address": 63407,
   "type": "line",
   "text": "gi (63407): every graphics command. The BASIC builds the command in x$ and runs LET x$=STR$ USR gi (line 15): DEST still points at x$'s text and STRLEN holds its length. The first byte picks the routine from gfx_table (1 to 24; 25 and more go to gfx_return), which is called with A = the length and HL at the second byte. Saves SP so that any routine can leave through gfx_return, and returns BC = 0."
  },
  {
   "address": 63453,
   "type": "line",
   "text": "The graphics commands 1 to 22: 1 the location's picture, 2 put, 3 move, 4 lie, 5 eat, 6 drink, 7 get, 8 drop, 9 arms down, 10 arms out, 11 fight, 12 appear, 13 blush, 14 reset a figure, 15 nothing, 16 a record bit, 17 a missile, 18 a scene feature, 19 dark buildings, 20 the flag, 21 the walking speed, 22 a random number. The BASIC never sends 12, 15, 16, 21 or 22. graphics lets 23 and 24 through as well, which would take the code bytes after the table as addresses ($327E and $EEDA)."
  },
  {
   "address": 63497,
   "type": "line",
   "text": "Graphics command 21: sets the walking speed, the step added up to four times (one more time than bits 6-7 of the figure's record byte 4 say) to make figure_walk's pause, from the byte after the command."
  },
  {
   "address": 63502,
   "type": "line",
   "text": "Graphics command 22: steps random and returns its low two bytes to USR in BC, leaving graphics by its caller's return."
  },
  {
   "address": 63511,
   "type": "line",
   "text": "Graphics command 11 (line 1380, a blow in a fight): four bytes, the command, a character, a random 1 to 3 and a column (three bytes change only the record). Undraws the figure, sets the weapon bits of record byte 2 for the blow: shape 0 shows a sword (bits $52) or an axe (bits $A8) upright, diagonal or level for blows 1, 2 and 3, other shapes use $15 for the sword and $2A for the axe; and draws it again."
  },
  {
   "address": 63608,
   "type": "line",
   "text": "The blow being shown, 1 to 3."
  },
  {
   "address": 63609,
   "type": "line",
   "text": "The sword for shape 0: the mask for record byte 2 and three values, one for each blow, at blow_up_bits."
  },
  {
   "address": 63616,
   "type": "line",
   "text": "The bits blow_up sets for blows 1, 2 and 3."
  },
  {
   "address": 63619,
   "type": "line",
   "text": "The axe for shape 0."
  },
  {
   "address": 63626,
   "type": "line",
   "text": "The bits blow_down sets for blows 1, 2 and 3."
  },
  {
   "address": 63629,
   "type": "line",
   "text": "The sword for the other shapes."
  },
  {
   "address": 63636,
   "type": "line",
   "text": "The bits blow_other_up sets for blows 1, 2 and 3."
  },
  {
   "address": 63639,
   "type": "line",
   "text": "The axe for the other shapes."
  },
  {
   "address": 63646,
   "type": "line",
   "text": "The bits blow_other_down sets for blows 1, 2 and 3."
  },
  {
   "address": 63649,
   "type": "line",
   "text": "Clears the weapon's bits of record byte 2 with the mask in A (kept in D) and sets the blow's value from the three bytes at BC, then goes on at $F85A without returning, so the second weapon test is skipped."
  },
  {
   "address": 63667,
   "type": "line",
   "text": "Graphics command 5 (geat, line 7150, three bytes; geatp, line 7170, five bytes): the command, a character, a column, and with five bytes a row and the food's facing. With five bytes the food (object 96) lying in the column beside the figure is first drawn over with XOR, rubbing it out; then, for a figure of shape 0, the figure lifts food to its mouth: the frames of eat_frames are drawn and undrawn in turn, with a pause, and the arm is put back. Three bytes do the same without the food on the ground, and nothing for other shapes."
  },
  {
   "address": 63733,
   "type": "line",
   "text": "The objects eaten and drunk: 96 food and 70 wine."
  },
  {
   "address": 63735,
   "type": "line",
   "text": "Graphics command 6 (gdrink, line 7200): as gfx_eat, with the frames of drink_frames and the wine (object 70)."
  },
  {
   "address": 63753,
   "type": "line",
   "text": "The arm rubbed out before eating or drinking and put back after: an unused byte, then one frame as in eat_frames."
  },
  {
   "address": 63764,
   "type": "line",
   "text": "Starts gfx_eat or gfx_drink: five bytes draw the object, three do not; finds the figure and its position. Only shape 0 is animated, and its arm is rubbed out by meal_arm first; for other shapes five bytes draw only the object and three do nothing."
  },
  {
   "address": 63812,
   "type": "line",
   "text": "Turns the arm frame to the figure's facing and, unless the figure holds a shield (bit 2 of record byte 2), draws it."
  },
  {
   "address": 63845,
   "type": "line",
   "text": "The address of the command's facing byte, and the meal's flags (bit 0 the object not drawn, bit 1 the object only)."
  },
  {
   "address": 63848,
   "type": "line",
   "text": "Turns a list of frames to face the figure's way (bit 0 of the byte before HL, record byte 1; meal_arm enters at $F972 with it in A), mirroring each frame's glyph in place."
  },
  {
   "address": 63895,
   "type": "line",
   "text": "Draws one frame: the entries from HL that share its frame number (bits 0-3 of the first byte), each a flags byte, a position and 8 bytes of glyph, until one with bit 4 set."
  },
  {
   "address": 63938,
   "type": "line",
   "text": "Plays a list of frames: draws a frame, waits 220 x 256 loops, undraws it and goes on to the next; after the last it plays them back one at a time, ending when a frame's number comes round to 0."
  },
  {
   "address": 63990,
   "type": "line",
   "text": "The address of the frame list being played, and play_frames's flag for the turn back."
  },
  {
   "address": 63993,
   "type": "line",
   "text": "When play_frames goes back, steps back through the list, ten bytes an entry, from the frame at HL to the first entry of the frame before it."
  },
  {
   "address": 64025,
   "type": "line",
   "text": "The eating frames: a zero, then eight entries of ten bytes (a frame number with flags, a position, a glyph), frames 0 to 4, the arm going up to the mouth; play_frames brings it down again."
  },
  {
   "address": 64106,
   "type": "line",
   "text": "The drinking frames: a zero, then ten entries of ten bytes."
  },
  {
   "address": 64207,
   "type": "line",
   "text": "Graphics command 18: two bytes, the command and a feature byte, the feature in the top four bits and a position in the bottom four. The position times 2 becomes castle_x, the column of a castle's left edge, and times 16 the pixel x at $DF38; plot_pixel is set to OR, and the feature's routine is taken from feature_table."
  },
  {
   "address": 64241,
   "type": "line",
   "text": "The 15 scene features: 0-3 castles, 4 a hut, 5 a shut cupboard, 6 an open cupboard, 7 a hut's door, 8 a shut chest, 9 an open chest, 10 a window, 11 a tall window, 12 a gate, 13 a black sky, 14 dark buildings."
  },
  {
   "address": 64271,
   "type": "line",
   "text": "Scene feature 8, a shut chest, as a glyph list (see cupboard_open_lists)."
  },
  {
   "address": 64290,
   "type": "line",
   "text": "Scene feature 9, an open chest."
  },
  {
   "address": 64309,
   "type": "line",
   "text": "Feature 8: the shut chest's glyph list, drawn with XOR so that the open one can replace it."
  },
  {
   "address": 64317,
   "type": "line",
   "text": "Feature 9: the open chest's list."
  },
  {
   "address": 64323,
   "type": "line",
   "text": "Draws a glyph list from HL at the feature's position: each entry's position byte places its 8 bytes with draw_glyph, until a byte with bit 3 set. Keeps the feature's position at feature_xy and puts it back after."
  },
  {
   "address": 64333,
   "type": "line",
   "text": "Not reached: no address in the game points here. draw_glyph_list with the position given as a cell in BC, converted to pixels."
  },
  {
   "address": 64348,
   "type": "line",
   "text": "draw_glyph_list's loop over the entries."
  },
  {
   "address": 64381,
   "type": "line",
   "text": "The feature position draw_glyph_list keeps while it draws."
  },
  {
   "address": 64383,
   "type": "line",
   "text": "A castle's flag at row B, column C (plus castle_x), three times in four: a pole down the left of the cell, and the flag above it, drawn from flag_glyphs. Notes the flag's place at $DF3A and sets bit 6 of the style so that gfx_flag can wave it."
  },
  {
   "address": 64434,
   "type": "line",
   "text": "The flag in two positions, 8 bytes each."
  },
  {
   "address": 64450,
   "type": "line",
   "text": "Graphics command 19 (line 7010) and feature 14: sets the dark-scheme bit of the style, so the next buildings are drawn red on black. Line 7010 sends it before the picture of locations 1 to 45, 56, 57, 65, 66 and 81."
  },
  {
   "address": 64459,
   "type": "line",
   "text": "Graphics command 20 (line 8110, one time in two round the main loop): if the castle has a flag, undraws it and draws the other position, so the flag flaps."
  },
  {
   "address": 64514,
   "type": "line",
   "text": "Feature 13: rows 0-7 cleared and painted black."
  },
  {
   "address": 64523,
   "type": "line",
   "text": "Feature 4, a hut: a new style unless one is set, then a tower 3 or 4 cells high and 4 to 6 wide at the position (draw_tower, from $E07F with its sizes in DE), and, seven times in eight, its rows above the bottom two (the roof) painted black or blue at random."
  },
  {
   "address": 64582,
   "type": "line",
   "text": "Feature 0, a castle of one tower with battlements, a flag and a gate at column 5."
  },
  {
   "address": 64589,
   "type": "line",
   "text": "Castle 0, the tower: draw_tower's three bytes, 9 cells wide and 9 high at column 1, shading $80."
  },
  {
   "address": 64592,
   "type": "line",
   "text": "Castle 0: the battlements."
  },
  {
   "address": 64595,
   "type": "line",
   "text": "Castle 0, the battlements: draw_battlements's two bytes, 6 merlons from column 0 on row 1, with a parapet."
  },
  {
   "address": 64597,
   "type": "line",
   "text": "Castle 0: the flag at row 1, column 5, and the gate at column 5."
  },
  {
   "address": 64608,
   "type": "line",
   "text": "Feature 1, a castle of three towers."
  },
  {
   "address": 64616,
   "type": "line",
   "text": "Castle 1, the left tower: draw_tower's three bytes, 5 cells wide and 8 high at column 1, shading $40."
  },
  {
   "address": 64619,
   "type": "line",
   "text": "Castle 1: the middle tower."
  },
  {
   "address": 64622,
   "type": "line",
   "text": "Castle 1, the middle tower: draw_tower's three bytes, 4 cells wide and 6 high at column 6, shading $20."
  },
  {
   "address": 64625,
   "type": "line",
   "text": "Castle 1: the right tower."
  },
  {
   "address": 64628,
   "type": "line",
   "text": "Castle 1, the right tower: draw_tower's three bytes, 9 cells wide and 8 high at column 10, shading $80."
  },
  {
   "address": 64631,
   "type": "line",
   "text": "Castle 1: the battlements of the left tower."
  },
  {
   "address": 64634,
   "type": "line",
   "text": "Castle 1, the left battlements: draw_battlements's two bytes, 4 merlons from column 0 on row 2, with a parapet."
  },
  {
   "address": 64636,
   "type": "line",
   "text": "Castle 1: the right battlements."
  },
  {
   "address": 64639,
   "type": "line",
   "text": "Castle 1, the right battlements: draw_battlements's two bytes, 5 merlons from column 10 on row 3."
  },
  {
   "address": 64641,
   "type": "line",
   "text": "Castle 1: the flag at row 2, column 14, and the gate at column 7."
  },
  {
   "address": 64652,
   "type": "line",
   "text": "Feature 2, a castle with a keep behind a wider wall."
  },
  {
   "address": 64660,
   "type": "line",
   "text": "Castle 2, the keep: draw_tower's three bytes, 5 cells wide and 8 high at column 4, shading $40."
  },
  {
   "address": 64663,
   "type": "line",
   "text": "Castle 2: the wall."
  },
  {
   "address": 64666,
   "type": "line",
   "text": "Castle 2, the wall: draw_tower's three bytes, 13 cells wide and 5 high at column 0, shading $80."
  },
  {
   "address": 64669,
   "type": "line",
   "text": "Castle 2: the wall's battlements."
  },
  {
   "address": 64672,
   "type": "line",
   "text": "Castle 2, the wall's battlements: draw_battlements's two bytes, 7 merlons from column 0 on row 6."
  },
  {
   "address": 64674,
   "type": "line",
   "text": "Castle 2: the keep's battlements."
  },
  {
   "address": 64677,
   "type": "line",
   "text": "Castle 2, the keep's battlements: draw_battlements's two bytes, 4 merlons from column 3 on row 2, with a parapet."
  },
  {
   "address": 64679,
   "type": "line",
   "text": "Castle 2: the flag at row 2, column 6, and the gate at column 6."
  },
  {
   "address": 64690,
   "type": "line",
   "text": "Feature 3, a castle of two towers with a wall between them."
  },
  {
   "address": 64698,
   "type": "line",
   "text": "Castle 3, the left tower: draw_tower's three bytes, 5 cells wide and 9 high at column 1, shading $40."
  },
  {
   "address": 64701,
   "type": "line",
   "text": "Castle 3: the wall."
  },
  {
   "address": 64704,
   "type": "line",
   "text": "Castle 3, the wall: draw_tower's three bytes, 8 cells wide and 7 high at column 6, shading $20."
  },
  {
   "address": 64707,
   "type": "line",
   "text": "Castle 3: the right tower."
  },
  {
   "address": 64710,
   "type": "line",
   "text": "Castle 3, the right tower: draw_tower's three bytes, 5 cells wide and 9 high at column 14, shading $40."
  },
  {
   "address": 64713,
   "type": "line",
   "text": "Castle 3: the left battlements."
  },
  {
   "address": 64716,
   "type": "line",
   "text": "Castle 3, the left battlements: draw_battlements's two bytes, 4 merlons from column 0 on row 1, with a parapet."
  },
  {
   "address": 64718,
   "type": "line",
   "text": "Castle 3: the right battlements."
  },
  {
   "address": 64721,
   "type": "line",
   "text": "Castle 3, the right battlements: draw_battlements's two bytes, 4 merlons from column 13 on row 1, with a parapet."
  },
  {
   "address": 64723,
   "type": "line",
   "text": "Castle 3: the flag at row 1, column 3, and the gate at column 9."
  },
  {
   "address": 64734,
   "type": "line",
   "text": "Feature 7, a hut's door: one of the two pairs of door_glyphs and one of two door frames picked from rng_state, drawn a cell apart, the door's cells painted in the other colour."
  },
  {
   "address": 64782,
   "type": "line",
   "text": "The two bars over a hut's door for feature_door, 8 bytes each, drawn in the cell above the door with only their bottom two lines set."
  },
  {
   "address": 64798,
   "type": "line",
   "text": "Feature 11, a tall window: two glyphs from tall_window_glyphs for the style, its two cells painted in the wall colour."
  },
  {
   "address": 64859,
   "type": "line",
   "text": "Feature 10, a window: one glyph from window_glyphs for the style, a cell to the right of the position."
  },
  {
   "address": 64908,
   "type": "line",
   "text": "A castle's gate at column A (plus castle_x)."
  },
  {
   "address": 64919,
   "type": "line",
   "text": "Feature 12, a gate on its own: a 2 by 2 block painted in the other colour and the gate list for the style (gate_lists), drawn by draw_glyph_list."
  },
  {
   "address": 64965,
   "type": "line",
   "text": "Feature 6, an open cupboard: its cells painted, then the list for the style from cupboard_open_lists."
  },
  {
   "address": 65031,
   "type": "line",
   "text": "Feature 5, a shut cupboard: the list for the style from cupboard_shut_lists."
  },
  {
   "address": 65086,
   "type": "line",
   "text": "Graphics command 14 (line 6260, after a game is loaded): two bytes, the command and a character. Rewrites the command as 9, clears what the figure is shown carrying (record byte 2) and puts its arms down, drawing nothing; line 6260 then gives back each object it carries with get commands of three bytes."
  },
  {
   "address": 65116,
   "type": "line",
   "text": "\"Jas.Learmont\" and a byte $18: James Learmont's name, one of the six credited, in the code where nothing reads it."
  },
  {
   "address": 65129,
   "type": "line",
   "text": "The IM 2 interrupt (the ROM's byte pair at $09FF points here). Runs the ROM's own handler first (RST $38: the keyboard scan and the frame counter), then, with the registers and the ROM's print settings saved: every 16 frames flips the cursor; when a key has been pressed (bit 5 of FLAGS) and no line is waiting for BASIC, passes the key to key_pressed and prints the input line again. Puts the print settings back, clears the key flag and returns."
  },
  {
   "address": 65313,
   "type": "line",
   "text": "Unused, to the end of memory: zeros, then what was in memory when the file was saved, some of it the ROM's system variables and, from $FFC9, its user-defined graphics O to U as the ROM sets them up (copies of the capital letters)."
  }
 ]
}