{
 "schema": 1,
 "platform": "c64",
 "game": "jupiter-lander",
 "build": "COPYRIGHT 1982 BY COMMODORE AND HAL LABORATORY",
 "source": "regenerator2000 live",
 "regions": {
  "exclude": [
   [
    256,
    511,
    "stack"
   ],
   [
    53248,
    57343,
    "I/O and colour RAM"
   ],
   [
    1024,
    2047,
    "screen RAM"
   ]
  ],
  "extra": [
   [
    14336,
    16383,
    "character set"
   ]
  ]
 },
 "blocks": [
  {
   "start": 0,
   "end": 14335,
   "type": "Undefined"
  },
  {
   "start": 14336,
   "end": 16383,
   "type": "Byte"
  },
  {
   "start": 16384,
   "end": 57343,
   "type": "Undefined"
  },
  {
   "start": 57344,
   "end": 57398,
   "type": "Byte"
  },
  {
   "start": 57399,
   "end": 57565,
   "type": "Code"
  },
  {
   "start": 57566,
   "end": 57581,
   "type": "Byte"
  },
  {
   "start": 57582,
   "end": 57786,
   "type": "Code"
  },
  {
   "start": 57787,
   "end": 57795,
   "type": "Byte"
  },
  {
   "start": 57796,
   "end": 57877,
   "type": "Code"
  },
  {
   "start": 57878,
   "end": 58009,
   "type": "Byte"
  },
  {
   "start": 58010,
   "end": 58342,
   "type": "Code"
  },
  {
   "start": 58343,
   "end": 58360,
   "type": "Byte"
  },
  {
   "start": 58361,
   "end": 58663,
   "type": "Code"
  },
  {
   "start": 58664,
   "end": 58673,
   "type": "Byte"
  },
  {
   "start": 58674,
   "end": 58706,
   "type": "Code"
  },
  {
   "start": 58707,
   "end": 58715,
   "type": "Byte"
  },
  {
   "start": 58716,
   "end": 58967,
   "type": "Code"
  },
  {
   "start": 58968,
   "end": 59131,
   "type": "Byte"
  },
  {
   "start": 59132,
   "end": 59507,
   "type": "Code"
  },
  {
   "start": 59508,
   "end": 59889,
   "type": "Byte"
  },
  {
   "start": 59890,
   "end": 60208,
   "type": "Code"
  },
  {
   "start": 60209,
   "end": 60216,
   "type": "Undefined"
  },
  {
   "start": 60217,
   "end": 60369,
   "type": "Code"
  },
  {
   "start": 60370,
   "end": 60373,
   "type": "Undefined"
  },
  {
   "start": 60374,
   "end": 60497,
   "type": "Code"
  },
  {
   "start": 60498,
   "end": 60529,
   "type": "Address"
  },
  {
   "start": 60530,
   "end": 60627,
   "type": "Code"
  },
  {
   "start": 60628,
   "end": 60795,
   "type": "Byte"
  },
  {
   "start": 60796,
   "end": 61100,
   "type": "Code"
  },
  {
   "start": 61101,
   "end": 62035,
   "type": "Byte"
  },
  {
   "start": 62036,
   "end": 62260,
   "type": "Code"
  },
  {
   "start": 62261,
   "end": 62544,
   "type": "Byte"
  },
  {
   "start": 62545,
   "end": 65535,
   "type": "Undefined"
  }
 ],
 "symbols": [
  {
   "address": 0,
   "name": "cpu_port_ddr",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1,
   "name": "cpu_port",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 2,
   "name": "scr_ptr_lo",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 3,
   "name": "scr_ptr_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 4,
   "name": "terrain_dst_lo",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 5,
   "name": "terrain_dst_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 6,
   "name": "terrain_col_lo",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 7,
   "name": "terrain_col_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 8,
   "name": "ship_x_frac",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 9,
   "name": "ship_x_lo",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 10,
   "name": "ship_x_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 11,
   "name": "ship_vx_lo",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 12,
   "name": "ship_vx_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 13,
   "name": "ship_y_frac",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 14,
   "name": "ship_y_lo",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 15,
   "name": "ship_y_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 16,
   "name": "ship_vy_lo",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 17,
   "name": "ship_vy_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 18,
   "name": "fuel_lo",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 19,
   "name": "fuel_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 20,
   "name": "grav",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 21,
   "name": "landing_count",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 22,
   "name": "thrust_up",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 23,
   "name": "thrust_side",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 24,
   "name": "score_lo",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 25,
   "name": "score_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 26,
   "name": "hiscore_lo",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 27,
   "name": "hiscore_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 28,
   "name": "view",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 29,
   "name": "bonus_lo",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 30,
   "name": "on_pad",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 32,
   "name": "want_intro_tune",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 33,
   "name": "out_of_fuel_shown",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 34,
   "name": "attract_mode",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 35,
   "name": "spr_x_lo",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 36,
   "name": "spr_x_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 37,
   "name": "spr_y",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 38,
   "name": "digit_seen",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 39,
   "name": "scratch",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 40,
   "name": "rle_index",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 41,
   "name": "rle_col",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 42,
   "name": "boom_frame",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 43,
   "name": "flame_phase",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 44,
   "name": "bonus_gate",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 45,
   "name": "demo_repeats",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 46,
   "name": "irq_divider",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 47,
   "name": "logo_src_lo",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 48,
   "name": "logo_src_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 49,
   "name": "logo_dst_lo",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 50,
   "name": "logo_dst_hi",
   "type": "ZeroPageAbsoluteAddress",
   "kind": "user"
  },
  {
   "address": 1062,
   "name": "a_0426",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1063,
   "name": "a_0427",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1075,
   "name": "f_0433",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1076,
   "name": "f_0434",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1102,
   "name": "a_044E",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1103,
   "name": "a_044F",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1115,
   "name": "f_045B",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1116,
   "name": "f_045C",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1117,
   "name": "a_045D",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1118,
   "name": "f_045E",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1120,
   "name": "a_0460",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1122,
   "name": "a_0462",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1123,
   "name": "a_0463",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1124,
   "name": "a_0464",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1126,
   "name": "a_0466",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1127,
   "name": "a_0467",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1128,
   "name": "a_0468",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1129,
   "name": "a_0469",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1142,
   "name": "a_0476",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1143,
   "name": "a_0477",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1154,
   "name": "f_0482",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1155,
   "name": "f_0483",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1182,
   "name": "a_049E",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1183,
   "name": "a_049F",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1184,
   "name": "a_04A0",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1195,
   "name": "f_04AB",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1199,
   "name": "f_04AF",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1222,
   "name": "a_04C6",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1224,
   "name": "a_04C8",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1235,
   "name": "f_04D3",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1262,
   "name": "a_04EE",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1264,
   "name": "a_04F0",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1302,
   "name": "a_0516",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1304,
   "name": "a_0518",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1327,
   "name": "f_052F",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1342,
   "name": "a_053E",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1344,
   "name": "a_0540",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1382,
   "name": "a_0566",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1384,
   "name": "a_0568",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1422,
   "name": "a_058E",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1424,
   "name": "a_0590",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1462,
   "name": "a_05B6",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1464,
   "name": "a_05B8",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1474,
   "name": "f_05C2",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1483,
   "name": "f_05CB",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1502,
   "name": "a_05DE",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1504,
   "name": "a_05E0",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1542,
   "name": "a_0606",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1544,
   "name": "f_0608",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1582,
   "name": "a_062E",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1584,
   "name": "f_0630",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1622,
   "name": "a_0656",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1624,
   "name": "f_0658",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1662,
   "name": "a_067E",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1664,
   "name": "f_0680",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1702,
   "name": "a_06A6",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1704,
   "name": "f_06A8",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1742,
   "name": "a_06CE",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1744,
   "name": "f_06D0",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1753,
   "name": "f_06D9",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1782,
   "name": "a_06F6",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1784,
   "name": "f_06F8",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1793,
   "name": "f_0701",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1822,
   "name": "a_071E",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1833,
   "name": "f_0729",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1862,
   "name": "a_0746",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1863,
   "name": "a_0747",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1865,
   "name": "f_0749",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1902,
   "name": "a_076E",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1903,
   "name": "a_076F",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1922,
   "name": "f_0782",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1942,
   "name": "a_0796",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1943,
   "name": "a_0797",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 1944,
   "name": "f_0798",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1953,
   "name": "f_07A1",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1991,
   "name": "f_07C7",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1992,
   "name": "f_07C8",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1993,
   "name": "f_07C9",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1994,
   "name": "f_07CA",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 1998,
   "name": "f_07CE",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 2041,
   "name": "a_07F9",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 2042,
   "name": "a_07FA",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 2043,
   "name": "a_07FB",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 14336,
   "name": "glyph_blank",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14344,
   "name": "glyph_solid",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14352,
   "name": "glyph_pad_labels",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14392,
   "name": "glyph_pad_surface",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14400,
   "name": "glyph_ms_label",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14416,
   "name": "glyph_scale_ends",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14432,
   "name": "glyph_commodore_badge",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14464,
   "name": "glyph_fuel_bar_steps",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14528,
   "name": "glyph_gauge_marker",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14592,
   "name": "glyph_slopes",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14720,
   "name": "glyph_digits",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14808,
   "name": "glyph_gauge_labels",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14848,
   "name": "glyph_40_unused",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 14856,
   "name": "glyph_letters",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15064,
   "name": "glyph_punctuation",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15104,
   "name": "glyph_logo_corners",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15136,
   "name": "glyph_wordmark",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15352,
   "name": "glyph_7f_unused",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15360,
   "name": "sprite_lander",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15424,
   "name": "sprite_boom_1",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15488,
   "name": "sprite_boom_2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15552,
   "name": "sprite_boom_3",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15616,
   "name": "sprite_boom_4",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15680,
   "name": "sprite_boom_5",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15744,
   "name": "sprite_boom_6",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15808,
   "name": "sprite_boom_7",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15872,
   "name": "sprite_flame_a",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 15936,
   "name": "sprite_flame_b",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16000,
   "name": "sprite_jet_left",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16064,
   "name": "sprite_jet_right",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 16128,
   "name": "sprite_slots_unused",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 55388,
   "name": "f_D85C",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55467,
   "name": "f_D8AB",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55494,
   "name": "a_D8C6",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 55507,
   "name": "f_D8D3",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55599,
   "name": "f_D92F",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55746,
   "name": "f_D9C2",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55755,
   "name": "f_D9CB",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 55774,
   "name": "a_D9DE",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 55814,
   "name": "a_DA06",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 55815,
   "name": "a_DA07",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 56067,
   "name": "a_DB03",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 56094,
   "name": "a_DB1E",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 56216,
   "name": "f_DB98",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 56266,
   "name": "a_DBCA",
   "type": "AbsoluteAddress",
   "kind": "auto"
  },
  {
   "address": 56270,
   "name": "f_DBCE",
   "type": "Field",
   "kind": "auto"
  },
  {
   "address": 57344,
   "name": "vic_init_table",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 57374,
   "name": "sid_init_table",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 57399,
   "name": "reset_entry",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57406,
   "name": "b_E03E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57417,
   "name": "b_E049",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57488,
   "name": "goto_attract",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 57491,
   "name": "start_game",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 57550,
   "name": "next_landing",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 57557,
   "name": "b_E0D5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57565,
   "name": "gravity_table_base",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 57566,
   "name": "gravity_table",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57582,
   "name": "new_lander",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 57644,
   "name": "main_loop",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 57662,
   "name": "b_E13E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57668,
   "name": "b_E144",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57678,
   "name": "b_E14E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57688,
   "name": "b_E158",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57707,
   "name": "b_E16B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57715,
   "name": "update_view_and_sprites",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 57736,
   "name": "b_E188",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57761,
   "name": "b_E1A1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57786,
   "name": "view_origin_x_lo_base",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 57787,
   "name": "view_origin_x_lo",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57789,
   "name": "view_origin_x_hi_base",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 57790,
   "name": "view_origin_x_hi",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57792,
   "name": "view_origin_y_base",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 57793,
   "name": "view_origin_y",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 57796,
   "name": "zone_for_position",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 57819,
   "name": "b_E1DB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57852,
   "name": "b_E1FC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57875,
   "name": "b_E213",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 57878,
   "name": "tune_intro",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 58010,
   "name": "play_intro_tune",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 58021,
   "name": "b_E2A5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58055,
   "name": "r_E2C7",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 58056,
   "name": "read_controls_and_move",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 58059,
   "name": "move_ship",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 58067,
   "name": "b_E2D3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58087,
   "name": "b_E2E7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58110,
   "name": "b_E2FE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58136,
   "name": "b_E318",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58152,
   "name": "b_E328",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58211,
   "name": "b_E363",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58247,
   "name": "b_E387",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58253,
   "name": "wide_view_sprites",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 58273,
   "name": "close_view_sprites",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 58293,
   "name": "check_on_pad",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 58295,
   "name": "b_E3B7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58339,
   "name": "b_E3E3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58342,
   "name": "r_E3E6",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 58343,
   "name": "pad_y_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 58346,
   "name": "pad_y_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 58349,
   "name": "pad_x_min_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 58352,
   "name": "pad_x_min_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 58355,
   "name": "pad_x_max_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 58358,
   "name": "pad_x_max_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 58361,
   "name": "place_sprites",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 58396,
   "name": "b_E41C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58418,
   "name": "b_E432",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58432,
   "name": "b_E440",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58443,
   "name": "explode",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 58483,
   "name": "explode_frame_loop",
   "type": "Branch",
   "kind": "user"
  },
  {
   "address": 58497,
   "name": "b_E481",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58515,
   "name": "b_E493",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58520,
   "name": "b_E498",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58534,
   "name": "b_E4A6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58538,
   "name": "b_E4AA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58557,
   "name": "b_E4BD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58562,
   "name": "j_E4C2",
   "type": "Jump",
   "kind": "auto"
  },
  {
   "address": 58574,
   "name": "b_E4CE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58600,
   "name": "b_E4E8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58611,
   "name": "flash_explosion_colour",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 58615,
   "name": "b_E4F7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58636,
   "name": "out_of_sky",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 58652,
   "name": "b_E51C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58664,
   "name": "text_out_of_sky",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 58674,
   "name": "draw_game_over",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 58676,
   "name": "b_E534",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58697,
   "name": "b_E549",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58707,
   "name": "text_game_over",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 58716,
   "name": "touchdown",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 58746,
   "name": "b_E57A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58749,
   "name": "b_E57D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58765,
   "name": "b_E58D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58783,
   "name": "b_E59F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58795,
   "name": "b_E5AB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58830,
   "name": "b_E5CE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58872,
   "name": "b_E5F8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58916,
   "name": "landing_too_fast",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 58923,
   "name": "b_E62B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58956,
   "name": "b_E64C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 58968,
   "name": "tune_crash",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 59054,
   "name": "text_sorry_no_bonus",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 59056,
   "name": "text_sorry_no_bonus_body",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 59070,
   "name": "tune_landing",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 59132,
   "name": "clear_message_rows",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 59136,
   "name": "b_E700",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59146,
   "name": "b_E70A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59159,
   "name": "draw_bonus_line",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 59169,
   "name": "b_E721",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59190,
   "name": "b_E736",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59212,
   "name": "b_E74C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59222,
   "name": "b_E756",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59232,
   "name": "b_E760",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59243,
   "name": "b_E76B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59266,
   "name": "b_E782",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59269,
   "name": "b_E785",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59296,
   "name": "attract_entry",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 59306,
   "name": "draw_instructions",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 59324,
   "name": "b_E7BC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59326,
   "name": "b_E7BE",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59344,
   "name": "b_E7D0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59357,
   "name": "b_E7DD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59359,
   "name": "b_E7DF",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59377,
   "name": "b_E7F1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59382,
   "name": "b_E7F6",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59393,
   "name": "b_E801",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59404,
   "name": "b_E80C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59415,
   "name": "b_E817",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59438,
   "name": "b_E82E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59485,
   "name": "b_E85D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59496,
   "name": "b_E868",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59508,
   "name": "txt_title",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 59522,
   "name": "txt_instructions_banner",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 59540,
   "name": "txt_push_f1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 59558,
   "name": "txt_key_fire",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 59565,
   "name": "txt_key_left",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 59572,
   "name": "txt_key_right",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 59579,
   "name": "txt_rules_1",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 59617,
   "name": "txt_rules_2",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 59655,
   "name": "txt_rules_3",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 59693,
   "name": "txt_rules_4",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 59731,
   "name": "txt_rules_5",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 59769,
   "name": "txt_rules_6",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 59807,
   "name": "txt_rules_7",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 59845,
   "name": "txt_copyright",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 59872,
   "name": "txt_developer",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 59890,
   "name": "attract_demo",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 59942,
   "name": "demo_control_loop",
   "type": "Jump",
   "kind": "user"
  },
  {
   "address": 59946,
   "name": "b_EA2A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59968,
   "name": "b_EA40",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 59990,
   "name": "b_EA56",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60012,
   "name": "b_EA6C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60034,
   "name": "b_EA82",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60048,
   "name": "b_EA90",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60064,
   "name": "b_EAA0",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60089,
   "name": "b_EAB9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60177,
   "name": "b_EB11",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60209,
   "name": "demo_vx_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60213,
   "name": "demo_vx_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60217,
   "name": "irq_tick",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 60238,
   "name": "b_EB4E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60244,
   "name": "b_EB54",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60262,
   "name": "b_EB66",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60271,
   "name": "read_controls",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 60282,
   "name": "b_EB7A",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60303,
   "name": "b_EB8F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60310,
   "name": "b_EB96",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60315,
   "name": "r_EB9B",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 60316,
   "name": "b_EB9C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60323,
   "name": "b_EBA3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60337,
   "name": "b_EBB1",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60343,
   "name": "b_EBB7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60349,
   "name": "b_EBBD",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60364,
   "name": "b_EBCC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60370,
   "name": "key_row_select",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60372,
   "name": "key_row_value",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60374,
   "name": "draw_fuel_bar",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 60386,
   "name": "b_EBE2",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60392,
   "name": "b_EBE8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60403,
   "name": "b_EBF3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60417,
   "name": "draw_velocity_gauge",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 60427,
   "name": "b_EC0B",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60450,
   "name": "b_EC22",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60463,
   "name": "b_EC2F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60497,
   "name": "r_EC51",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 60498,
   "name": "gauge_row_addr",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60499,
   "name": "gauge_row_addr_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60530,
   "name": "draw_terrain",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 60562,
   "name": "b_EC92",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60566,
   "name": "b_EC96",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60573,
   "name": "b_EC9D",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60584,
   "name": "b_ECA8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60586,
   "name": "b_ECAA",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60597,
   "name": "b_ECB5",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60612,
   "name": "b_ECC4",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60628,
   "name": "view_stream_lo",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60632,
   "name": "view_stream_hi",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60636,
   "name": "hud_colour_template",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60716,
   "name": "hud_text_template",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 60796,
   "name": "draw_hud",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 60815,
   "name": "b_ED8F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60824,
   "name": "b_ED98",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60844,
   "name": "b_EDAC",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60855,
   "name": "b_EDB7",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 60990,
   "name": "delay_units",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 60997,
   "name": "delay_one_unit",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 61004,
   "name": "b_EE4C",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 61006,
   "name": "b_EE4E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 61018,
   "name": "draw_scores",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 61039,
   "name": "print_bcd_word",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 61045,
   "name": "print_bcd_byte",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 61054,
   "name": "print_bcd_digit",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 61062,
   "name": "b_EE86",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 61070,
   "name": "b_EE8E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 61072,
   "name": "check_out_of_fuel",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 61086,
   "name": "b_EE9E",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 61100,
   "name": "r_EEAC",
   "type": "Return",
   "kind": "auto"
  },
  {
   "address": 61101,
   "name": "text_out_of_fuel",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 61112,
   "name": "terrain_wide",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61453,
   "name": "terrain_close_x5",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61650,
   "name": "terrain_close_x2",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 61819,
   "name": "terrain_close_x10",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62036,
   "name": "start_thrust_noise",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 62045,
   "name": "start_explosion_noise",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 62054,
   "name": "draw_title_logo",
   "type": "Subroutine",
   "kind": "user"
  },
  {
   "address": 62073,
   "name": "b_F279",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 62081,
   "name": "b_F281",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 62103,
   "name": "b_F297",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 62111,
   "name": "b_F29F",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 62139,
   "name": "b_F2BB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 62163,
   "name": "b_F2D3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 62179,
   "name": "b_F2E3",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 62185,
   "name": "b_F2E9",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 62187,
   "name": "b_F2EB",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 62189,
   "name": "b_F2ED",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 62200,
   "name": "b_F2F8",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 62211,
   "name": "b_F303",
   "type": "Branch",
   "kind": "auto"
  },
  {
   "address": 62261,
   "name": "logo_glyph_table",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 62267,
   "name": "logo_bitmap",
   "type": "UserDefined",
   "kind": "user"
  },
  {
   "address": 62488,
   "name": "logo_strip_top",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 62507,
   "name": "logo_strip_middle",
   "type": "Field",
   "kind": "user"
  },
  {
   "address": 62526,
   "name": "logo_strip_bottom",
   "type": "Field",
   "kind": "user"
  }
 ],
 "comments": [
  {
   "address": 0,
   "type": "line",
   "text": "Data direction register of the 6510 processor port. reset_entry writes $2F here."
  },
  {
   "address": 1,
   "type": "line",
   "text": "6510 processor port. reset_entry writes $05, which banks RAM in over BASIC and the KERNAL while leaving I/O visible, and nothing changes it again. From then on the game owns $A000-$BFFF and $E000-$FFFF and its own code lives under where the KERNAL used to be."
  },
  {
   "address": 2,
   "type": "line",
   "text": "Low byte of the general screen pointer. draw_instructions and draw_velocity_gauge point it at a screen row; draw_terrain uses it to walk the run-length stream instead."
  },
  {
   "address": 3,
   "type": "line",
   "text": "High byte of the general screen pointer."
  },
  {
   "address": 4,
   "type": "line",
   "text": "Low byte of draw_terrain's screen write pointer, stepping 40 bytes per row from $0400."
  },
  {
   "address": 5,
   "type": "line",
   "text": "High byte of draw_terrain's screen write pointer."
  },
  {
   "address": 6,
   "type": "line",
   "text": "Low byte of draw_terrain's colour RAM write pointer, kept 40 bytes in step with the screen pointer from $D800."
  },
  {
   "address": 7,
   "type": "line",
   "text": "High byte of draw_terrain's colour RAM write pointer."
  },
  {
   "address": 8,
   "type": "line",
   "text": "Fractional part of the ship's world X, 1/256 of a world unit. move_ship adds the X velocity here and carries into ship_x."
  },
  {
   "address": 9,
   "type": "line",
   "text": "Low byte of the ship's world X. The world is about 530 units across; the wide view shows it halved, a close-up shows it one for one."
  },
  {
   "address": 10,
   "type": "line",
   "text": "High byte of the ship's world X."
  },
  {
   "address": 11,
   "type": "line",
   "text": "Low byte of the ship's X velocity, a signed 16-bit number in 1/256 world units per tick. A side thruster changes it by 6, which is about a fortieth of a unit per tick per tick."
  },
  {
   "address": 12,
   "type": "line",
   "text": "High byte of the ship's X velocity. Nothing damps it: once the ship is moving sideways it keeps moving until the opposite thruster cancels it."
  },
  {
   "address": 13,
   "type": "line",
   "text": "Fractional part of the ship's world Y, 1/256 of a world unit."
  },
  {
   "address": 14,
   "type": "line",
   "text": "Low byte of the ship's world Y. Y grows downward; the pads sit at $016A, $009A and $017A."
  },
  {
   "address": 15,
   "type": "line",
   "text": "High byte of the ship's world Y. Climbing above $003A ends the flight with OUT OF SKY."
  },
  {
   "address": 16,
   "type": "line",
   "text": "Low byte of the ship's Y velocity in 1/256 world units per tick. This single byte is the number the whole game turns on: the velocity gauge shows it, the landing test rejects $48 and above, and the bonus is 80 minus it."
  },
  {
   "address": 17,
   "type": "line",
   "text": "High byte of the ship's Y velocity. Negative means climbing. Once it leaves the range -2 to +1 the velocity gauge stops drawing a marker at all."
  },
  {
   "address": 18,
   "type": "line",
   "text": "Low byte of the fuel counter. Full tanks are $FFFF."
  },
  {
   "address": 19,
   "type": "line",
   "text": "High byte of the fuel counter. The bar on the status line is drawn from this byte alone, and OUT OF FUEL appears the moment it reaches zero."
  },
  {
   "address": 20,
   "type": "line",
   "text": "Downward acceleration for this landing in 1/256 world units per tick, loaded from gravity_table by new_lander."
  },
  {
   "address": 21,
   "type": "line",
   "text": "How many landers this game has used, 1 to 16. It indexes gravity_table and stops climbing at 16."
  },
  {
   "address": 22,
   "type": "line",
   "text": "Set to 1 by read_controls while F1 or the joystick fire button is held, cleared otherwise. move_ship reads it once and clears nothing: the flag is rebuilt from scratch every pass."
  },
  {
   "address": 23,
   "type": "line",
   "text": "Side thruster from read_controls: 0 none, 1 left, 2 right. Also reused as a 16-bit high byte while the landing bonus is being counted out."
  },
  {
   "address": 24,
   "type": "line",
   "text": "Low two digits of the score, packed BCD. The status line prints these digits and then a fixed 0, so the number on screen is always ten times this counter."
  },
  {
   "address": 25,
   "type": "line",
   "text": "High two digits of the score, packed BCD. The counter tops out at 9999, which reads as 99990 on screen."
  },
  {
   "address": 26,
   "type": "line",
   "text": "Low two digits of the high score, packed BCD. Only a reset clears it; a new game does not."
  },
  {
   "address": 27,
   "type": "line",
   "text": "High two digits of the high score, packed BCD."
  },
  {
   "address": 28,
   "type": "line",
   "text": "Which of the four views is on screen: 0 the pulled-back landscape, 1 the x5 pad, 2 the x2 plateau, 3 the x10 pad. Also the score multiplier selector. Set to $FF before the attract demo so the first zone test always redraws."
  },
  {
   "address": 29,
   "type": "line",
   "text": "Low byte of the points still to be counted out after a landing, and a scratch counter elsewhere."
  },
  {
   "address": 30,
   "type": "line",
   "text": "Set by check_on_pad when the ship's world Y is exactly a pad's line and its X is inside that pad. The main loop treats it as touchdown."
  },
  {
   "address": 32,
   "type": "line",
   "text": "Set by start_game and cleared by play_intro_tune, so the opening tune plays once per game rather than once per lander."
  },
  {
   "address": 33,
   "type": "line",
   "text": "Set once OUT OF FUEL has been stamped on the status line, so it is not written again every pass."
  },
  {
   "address": 34,
   "type": "line",
   "text": "1 while the attract demo is flying itself, 0 during a real game. The explosion routine returns to the attract loop instead of charging fuel when this is set."
  },
  {
   "address": 35,
   "type": "line",
   "text": "Low byte of the ship sprite's screen X, written to $D002, $D004 and $D006."
  },
  {
   "address": 36,
   "type": "line",
   "text": "Non-zero when the ship sprite's screen X is 256 or more; drives the $D010 high bits for all sprites at once."
  },
  {
   "address": 37,
   "type": "line",
   "text": "The ship sprite's screen Y, written to $D003, $D005 and $D007."
  },
  {
   "address": 38,
   "type": "line",
   "text": "Leading-zero flag for the score printer: bit 7 is set once a non-zero digit has been printed, after which zeros print too."
  },
  {
   "address": 39,
   "type": "line",
   "text": "Scratch byte, used as the high half of a shift in the crash fuel penalty and the velocity gauge."
  },
  {
   "address": 40,
   "type": "line",
   "text": "Offset of the next run inside the terrain stream draw_terrain is unpacking."
  },
  {
   "address": 41,
   "type": "line",
   "text": "Column reached within the current terrain row, 0 to 37."
  },
  {
   "address": 42,
   "type": "line",
   "text": "Counts the seven explosion frames down to zero."
  },
  {
   "address": 43,
   "type": "line",
   "text": "Flips between 0 and 1 on every sprite update and picks which of the two main-thruster flame shapes is shown, so the flame flickers at the update rate."
  },
  {
   "address": 44,
   "type": "line",
   "text": "Toggles SID voice 1 between gate off and gate on for each point counted out, which is what makes the bonus tick."
  },
  {
   "address": 45,
   "type": "line",
   "text": "How many times the attract control demonstration still has to run before the flying demo starts."
  },
  {
   "address": 46,
   "type": "line",
   "text": "Counts IRQs down from 20; every twentieth one steps the colour of the fuel bar."
  },
  {
   "address": 47,
   "type": "line",
   "text": "Low byte of draw_title_logo's read pointer into the packed title bitmap."
  },
  {
   "address": 48,
   "type": "line",
   "text": "High byte of draw_title_logo's read pointer."
  },
  {
   "address": 49,
   "type": "line",
   "text": "Low byte of draw_title_logo's screen write pointer, also reused to clear screen and colour RAM."
  },
  {
   "address": 50,
   "type": "line",
   "text": "High byte of draw_title_logo's screen write pointer."
  },
  {
   "address": 14336,
   "type": "line",
   "text": "Glyph $00, eight zero bytes. It is the space the terrain streams use for empty sky and the value the screen is cleared to, so a cell of 0 is the only cell the terrain painter colours cyan instead of red."
  },
  {
   "address": 14344,
   "type": "line",
   "text": "Glyph $01, eight bytes of $FF. Every filled cell of rock is this one glyph, and so is every full cell of the fuel bar; only the colour cell tells them apart."
  },
  {
   "address": 14352,
   "type": "line",
   "text": "Glyphs $02 to $06: X, 2, 5, 1 and 0, cut small so the multiplier beside each pad fits in two cells. draw_hud stamps them next to the three landing sites."
  },
  {
   "address": 14392,
   "type": "line",
   "text": "Glyph $07, a checkerboard of alternate pixels. It is the flat top of every landing pad and the only visual clue that a stretch of rock can be landed on."
  },
  {
   "address": 14400,
   "type": "line",
   "text": "Glyphs $08 and $09, the m and the /s of the m/s label at the top of the velocity gauge."
  },
  {
   "address": 14416,
   "type": "line",
   "text": "Glyphs $0A and $0B, a bar along the bottom of the cell and a bar along the top. draw_hud puts them at screen rows 3 and 20 to close off the ends of the gauge."
  },
  {
   "address": 14432,
   "type": "line",
   "text": "Glyphs $0C to $0F, the four quarters of the Commodore badge. Every one of the four terrain streams has these cut into the rock, so the badge is part of the landscape rather than an overlay."
  },
  {
   "address": 14464,
   "type": "line",
   "text": "Glyphs $10 to $17, a bar filling the cell from the left in eight steps. draw_fuel_bar uses the bottom three bits of the fuel high byte to pick one, which is how the bar creeps smoothly instead of jumping a character at a time."
  },
  {
   "address": 14528,
   "type": "line",
   "text": "Glyphs $18 to $1F, a marker at each of eight heights within the cell. draw_velocity_gauge picks one with the bottom three bits of the gauge value, giving the needle 128 positions over sixteen character rows."
  },
  {
   "address": 14592,
   "type": "line",
   "text": "Glyphs $20 to $2F, the sixteen diagonal and half-filled shapes that make the edge between rock and sky. The terrain streams are all blanks, solids and these, which is why long runs compress so well."
  },
  {
   "address": 14720,
   "type": "line",
   "text": "Glyphs $30 to $39, the digits 0 to 9 at their ASCII codes, and $3A, the colon. The game's character set is laid out as ASCII rather than as C64 screen codes."
  },
  {
   "address": 14808,
   "type": "line",
   "text": "Glyphs $3B to $3F. $3B and $3C stack across two character rows to read plus-or-minus zero at the middle of the gauge; $3D is the equals sign of the bonus sum; $3E reads 10 and $3F reads -10, marking the top and bottom of the scale."
  },
  {
   "address": 14848,
   "type": "line",
   "text": "Glyph $40, blank. It is the gap between the digits and the letters that the ASCII layout leaves, and nothing draws it."
  },
  {
   "address": 14856,
   "type": "line",
   "text": "Glyphs $41 to $5A, the capitals A to Z at their ASCII codes. There are no lower-case letters: every string in the game is capitals."
  },
  {
   "address": 15064,
   "type": "line",
   "text": "Glyphs $5B to $5F. Where ASCII has brackets and a backslash this set has the five marks the game actually needs: less-than, comma, greater-than, full stop and hyphen."
  },
  {
   "address": 15104,
   "type": "line",
   "text": "Glyphs $60 to $63, four half-tone corner shapes. The packed title bitmap can only select these four plus a blank and a solid, which is why the JUPITER LANDER lettering has chamfered corners."
  },
  {
   "address": 15136,
   "type": "line",
   "text": "Glyphs $64 to $7E, the Commodore badge and the commodore logotype and (c)1982, drawn once across three rows of cells rather than spelled out of letters. This is the only lower-case lettering in the game and it is a picture, not text."
  },
  {
   "address": 15352,
   "type": "line",
   "text": "Glyph $7F, the last glyph of the used half of the character set. Nothing on any screen selects it."
  },
  {
   "address": 15360,
   "type": "line",
   "text": "Sprite shape $F0, the lander: a 24 by 21 pixel lunar module with four legs. It is drawn as sprite 1 in cyan, at true size in the pulled-back view and doubled in both directions in a close-up. It is also frame 0 of the explosion."
  },
  {
   "address": 15424,
   "type": "line",
   "text": "Sprite shape $F1, the first explosion frame: the lander already coming apart. explode reaches it by adding one to the sprite pointer."
  },
  {
   "address": 15488,
   "type": "line",
   "text": "Sprite shape $F2, the second explosion frame, the wreck collapsing into a ring."
  },
  {
   "address": 15552,
   "type": "line",
   "text": "Sprite shape $F3, the third explosion frame, a solid fireball."
  },
  {
   "address": 15616,
   "type": "line",
   "text": "Sprite shape $F4, the fourth explosion frame, the fireball at its widest. The noise burst is retriggered around here."
  },
  {
   "address": 15680,
   "type": "line",
   "text": "Sprite shape $F5, the fifth explosion frame, the ring beginning to break up."
  },
  {
   "address": 15744,
   "type": "line",
   "text": "Sprite shape $F6, the sixth explosion frame, a ring of loose fragments."
  },
  {
   "address": 15808,
   "type": "line",
   "text": "Sprite shape $F7, the last explosion frame, scattered dots. The sprite is switched off after it."
  },
  {
   "address": 15872,
   "type": "line",
   "text": "Sprite shape $F8, one of the two main thruster flames, a flat plume under the hull. Sprite 2 alternates between this and $F9 on every pass, in red, which is the flicker under the ship while the up thruster is held."
  },
  {
   "address": 15936,
   "type": "line",
   "text": "Sprite shape $F9, the other main thruster flame, a longer forked plume."
  },
  {
   "address": 16000,
   "type": "line",
   "text": "Sprite shape $FA, the left side jet: a short orange spurt near the top left of the hull, shown as sprite 3 while the left thruster is held."
  },
  {
   "address": 16064,
   "type": "line",
   "text": "Sprite shape $FB, the right side jet, the mirror of $FA at the top right of the hull."
  },
  {
   "address": 16128,
   "type": "line",
   "text": "Sprite shapes $FC to $FF, four unused 64-byte slots, all zero. They are the tail of the 2 KB character block that the sprite shapes share with the glyphs, so they cost nothing extra."
  },
  {
   "address": 57344,
   "type": "line",
   "text": "VIC-II power-on image, 30 bytes copied straight to $D011-$D02E by reset_entry. Sets standard text mode, screen at $0400 and character set at $3800 ($D018=$1E), all sprites off, black border and background, and the sprite colours the game never changes afterwards: sprite 1 cyan, sprite 2 red, sprite 3 orange."
  },
  {
   "address": 57374,
   "type": "line",
   "text": "SID power-on image, 25 bytes copied to $D400-$D418 by reset_entry. Voice 1 is a pulse with sustain 13 (melody), voice 2 noise with a fast attack (side thruster), voice 3 noise with a long release (main thruster and explosion). Master volume starts at zero; the title sequence raises it."
  },
  {
   "address": 57399,
   "type": "line",
   "text": "Cold start, and the target of all three hardware vectors at $FFFA. Copies vic_init_table to $D011-$D02E and sid_init_table to $D400-$D418, stops both CIA1 timers, sets the processor port to $05 so RAM shows through at $A000 and $E000 with I/O still visible, arms CIA1 timer A with a latch of $411B for an interrupt about 59 times a second, clears the high score, draws the status rows and falls into the attract loop. The KERNAL is switched out here and never comes back, so from this point the game owns the machine and its own code occupies the addresses the KERNAL used to."
  },
  {
   "address": 57488,
   "type": "line",
   "text": "Single jump into the attract loop. The explosion path comes back here when the attract demo crashes."
  },
  {
   "address": 57491,
   "type": "line",
   "text": "Starts a real game, entered from irq_tick the moment F1 or fire is seen during attract. Clears the attract flag, silences all three voices, sets the master volume to 15, repaints the status rows, gives the player $FFFF fuel, zeroes the score, the landing counter and the message flags, and arms the opening tune."
  },
  {
   "address": 57550,
   "type": "line",
   "text": "Begins the next landing of the same game. Steps the landing counter up to its ceiling of 16 and loads that entry of gravity_table into grav, so every successful landing makes the next one fall harder. Falls straight into new_lander."
  },
  {
   "address": 57565,
   "type": "line",
   "text": "Base address of gravity_table, one byte before the first entry, because new_lander indexes it with a landing counter that starts at 1."
  },
  {
   "address": 57566,
   "type": "line",
   "text": "Gravity for landings 1 to 16, read by new_lander with the landing counter as index and held in grav. Values 4,5,4,5,6,5,6,6,6,7,8,7,7,8,9,9 in 1/256 world units per tick of downward acceleration. The counter stops at 16, so the sixteenth landing is as hard as the game ever gets."
  },
  {
   "address": 57582,
   "type": "line",
   "text": "Puts a fresh lander in the sky. Sets view to $FF so the first zone test is guaranteed to redraw the terrain, drops the ship at world X $0050 and Y $006A with both velocities zero, repaints the fuel bar, makes the ship cyan, picks the view, clears the pending sprite-to-background collision by reading $D01F, plays the opening tune if this is the first lander of the game, and falls into the main loop."
  },
  {
   "address": 57644,
   "type": "line",
   "text": "One pass of the flight. Decides whether the ship is inside the visible area, where the hardware collision bit can be believed, tests sprite 1 against the background and branches to explode if it has touched rock, updates the view and the sprites, jumps to touchdown if the ship is standing on a pad, reads the controls and moves the ship, redraws the fuel bar, ends the flight with OUT OF SKY if the ship has climbed above world Y $003A, waits three delay units and goes round again. Three delay units is about 31 milliseconds, so the whole game updates about 33 times a second, measured live at 3.03 delay units per pass."
  },
  {
   "address": 57715,
   "type": "line",
   "text": "Works out which view the ship belongs in and converts its world position to sprite coordinates. When the view has changed it blanks the sprites, redraws the terrain for the new view and clears the out-of-fuel flag, which is what makes the picture snap between the pulled-back landscape and a close-up. In the wide view it halves the world coordinates; in a close-up it subtracts that view's origin and leaves the scale alone."
  },
  {
   "address": 57786,
   "type": "line",
   "text": "Base address of view_origin_x_lo, one byte before the first entry, because the view number used as the index starts at 1."
  },
  {
   "address": 57787,
   "type": "line",
   "text": "Low byte of the world X origin of close-up views 1-3: $38, $E8, $48. screen_from_world subtracts this from the ship's world X to get its sprite X. Index 0 is unused because the wide view halves the coordinate instead of offsetting it."
  },
  {
   "address": 57789,
   "type": "line",
   "text": "Base address of view_origin_x_hi. It overlaps the last byte of the low table, which is harmless because index 0 is never read."
  },
  {
   "address": 57790,
   "type": "line",
   "text": "High byte of the world X origin of close-up views 1-3, giving origins $0038, $00E8 and $0148."
  },
  {
   "address": 57792,
   "type": "line",
   "text": "Base address of view_origin_y, again offset by one for the 1-based view number."
  },
  {
   "address": 57793,
   "type": "line",
   "text": "World Y origin of close-up views 1-3: $E2, $42, $E2. Each is 50 less than the Y at which that view's zone begins, so the ship enters a close-up at the top of the visible area."
  },
  {
   "address": 57796,
   "type": "line",
   "text": "Returns in Y which view the ship's world position falls in: 1 for the x5 pad when Y is at least $0114 and X is under $0140, 2 for the x2 plateau when X is between $0110 and $01D8 and Y is at least $0074, 3 for the x10 pad when X is at least $0140 and Y is at least $0114, and 0 for everywhere else. The tests run in that order, so the left pad wins where its box overlaps the others."
  },
  {
   "address": 57878,
   "type": "line",
   "text": "The tune played once at the start of a game, 44 entries of three bytes: delay units, SID voice 1 frequency low, frequency high. play_intro_tune walks it with voice 1 gated to a pulse wave. A frequency of zero is a rest."
  },
  {
   "address": 58010,
   "type": "line",
   "text": "Plays tune_intro once per game on SID voice 1 and clears want_intro_tune. Each of the 44 entries gives a delay in units, a frequency low byte and a frequency high byte; the gate stays open throughout, so repeated pitches run together into one held note."
  },
  {
   "address": 58056,
   "type": "line",
   "text": "Reads the stick and keyboard, then falls into move_ship. The only entry the flight loop uses."
  },
  {
   "address": 58059,
   "type": "line",
   "text": "One tick of physics, and the place the empty tank is enforced. If the fuel high byte is zero both thrust flags are cleared straight away, so the last 255 units in the low byte can never be spent and a pilot with an empty tank has no engine at all. Otherwise a side thruster adds 6 or subtracts 6 from the X velocity and costs 30 fuel, and the main thruster subtracts 12 from the Y velocity and costs 111, nearly four times as much. Gravity is then added to the Y velocity unconditionally and both 16-bit velocities are added into the 24-bit positions with sign extension. Thrusting also opens the noise voices: voice 2 for the side jets, voice 3 for the main engine. Nothing damps either velocity, so the ship keeps whatever sideways speed it is given."
  },
  {
   "address": 58253,
   "type": "line",
   "text": "Sprite setup for the pulled-back view. Clears the on-pad flag, blanks the sprites for one instruction, turns both sprite expansions off so the lander is drawn at its true 24 by 21 pixels, and falls into place_sprites. There is no landing test here: pads are only reachable from a close-up."
  },
  {
   "address": 58273,
   "type": "line",
   "text": "Sprite setup for a close-up. Same as the wide view except that sprites 1, 2 and 3 are expanded in both directions, which is the whole of the zoom: the terrain is a different picture but the lander is simply the same 24 by 21 sprite drawn at double size. Then it runs the landing test."
  },
  {
   "address": 58293,
   "type": "line",
   "text": "Tests all three pads and sets on_pad if the ship is standing on one. The Y test is an exact match against pad_y_lo and pad_y_hi, not a range, so a pad is a single line in the world and a ship moving faster than one unit per tick can step straight over it. The X test is an ordinary range check against pad_x_min and pad_x_max. All three lines are placed to the pixel: running the video chip's own sprite-against-character test at a pad's Y leaves the lander clear by a hair, and one world unit lower puts its legs inside the rock."
  },
  {
   "address": 58343,
   "type": "line",
   "text": "Low byte of the world Y at which each of the three pads is stood on: $6A, $9A, $7A. check_on_pad demands an exact match, so the pad is a single world line, not a band."
  },
  {
   "address": 58346,
   "type": "line",
   "text": "High byte of each pad's world Y, giving $016A for the x5 pad, $009A for the x2 plateau and $017A for the x10 pad."
  },
  {
   "address": 58349,
   "type": "line",
   "text": "Low byte of the left edge of each pad in world X: $B0, $60, $E0."
  },
  {
   "address": 58352,
   "type": "line",
   "text": "High byte of the left edge of each pad, giving $00B0, $0160 and $01E0."
  },
  {
   "address": 58355,
   "type": "line",
   "text": "Low byte of the right edge of each pad in world X: $E0, $90, $00."
  },
  {
   "address": 58358,
   "type": "line",
   "text": "High byte of the right edge of each pad, giving $00E0, $0190 and $0200. The pads are 48 world units wide, the same as the lander sprite doubled."
  },
  {
   "address": 58361,
   "type": "line",
   "text": "Writes the ship's screen position to sprites 1, 2 and 3 and decides which of them to switch on. Sprite 1 is always the lander, pointer $F0. Sprite 2 is the main thruster flame, pointer $F8 or $F9 depending on flame_phase, which flips every pass. Sprite 3 is a side jet, pointer $FA for left or $FB for right. The count in X ends up 1, 3, 5 or 7 and is doubled into $D015, giving sprite masks $02, $06, $0A and $0E. The three sprites share one position and are stacked by colour: cyan ship, red main flame, orange side jet."
  },
  {
   "address": 58443,
   "type": "line",
   "text": "Destroys the lander. Silences the tune, opens voice 3 as a long noise burst, leaves only sprite 1 on and steps its pointer through the seven shapes from $F0 to $F7, so the lander itself is the first frame of its own explosion. flash_explosion_colour cycles the sprite colour between frames. In attract mode it returns here; in a real game it charges the crash to the fuel tank, taking one sixteenth of the impact speed out of the fuel high byte, waits 200 delay units and either starts a new lander or, if the tank is empty, updates the high score and ends the game."
  },
  {
   "address": 58483,
   "type": "line",
   "text": "The seven-frame explosion. Each pass bumps the sprite 1 pointer by one; on the third frame it retriggers the noise so the bang has a tail."
  },
  {
   "address": 58611,
   "type": "line",
   "text": "Steps sprite 1's colour forward by 2 modulo 16, four times, three delay units apart. It runs once per explosion frame, so the fireball cycles through eight of the sixteen colours as it grows."
  },
  {
   "address": 58636,
   "type": "line",
   "text": "Ends the flight when the ship climbs above world Y $003A. Silences the voices, clears the message rows and stamps OUT OF SKY at screen $045E, then joins the end of the explosion path so the same fuel accounting and restart happen. The ship is not destroyed, but the flight is over."
  },
  {
   "address": 58664,
   "type": "line",
   "text": "The ten characters of OUT OF SKY in the game's own alphabet, stamped at screen $045E when the ship climbs above world Y $003A."
  },
  {
   "address": 58674,
   "type": "line",
   "text": "Paints GAME OVER across screen rows 2 and 3 at $04AF and sets the matching colour cells to white, then leaves the screen up until the delay in the caller expires."
  },
  {
   "address": 58707,
   "type": "line",
   "text": "The nine characters of GAME OVER in the game's own alphabet, stamped at screen $04AF by draw_game_over."
  },
  {
   "address": 58716,
   "type": "line",
   "text": "Handles a ship standing on a pad. The test is the Y velocity alone: climbing is always accepted, and descending is accepted only while the velocity is below $0048. Anything faster goes to landing_too_fast. A good landing scores 80 minus the velocity low byte, doubled for the x2 and x10 pads and multiplied by five again for the x5 and x10 pads, which is where the on-screen multipliers come from. Because the subtraction is an ordinary 8-bit one, a ship that arrives climbing scores more than a perfect stop: at a velocity of minus 16 the base is 96 rather than 80. The total is then counted out one point at a time, each point adding 1 to the BCD score, 70 to the fuel and one click to the sound, which is why a good landing both scores and refuels. Fuel stops at $FFFF rather than wrapping."
  },
  {
   "address": 58916,
   "type": "line",
   "text": "A landing that arrived above the speed limit. Plays tune_crash, clears the message rows, stamps SORRY NO BONUS at screen $045C and drops into explode. The ship is wrecked and nothing is refuelled, so a heavy landing costs a lander and a slice of the tank."
  },
  {
   "address": 58968,
   "type": "line",
   "text": "The falling phrase played when a landing is too fast, 44 pairs of SID voice 1 frequency low and high bytes, eight delay units apart."
  },
  {
   "address": 59054,
   "type": "line",
   "text": "Two leading spaces and the fourteen characters of SORRY NO BONUS, stamped at screen $045C after a landing that arrives faster than the limit."
  },
  {
   "address": 59056,
   "type": "line",
   "text": "The fourteen characters of SORRY NO BONUS, without the two leading spaces that centre it."
  },
  {
   "address": 59070,
   "type": "line",
   "text": "The rising phrase played on a successful landing, 31 pairs of SID voice 1 frequency low and high bytes, fourteen delay units apart, immediately before the bonus is counted out."
  },
  {
   "address": 59132,
   "type": "line",
   "text": "Clears screen rows 1, 2 and 3 and sets 15 colour cells at $D85C to white, ready for a message to be stamped into them."
  },
  {
   "address": 59159,
   "type": "line",
   "text": "Builds the sum shown after a good landing, as digits on screen row 2. It prints 80 minus the vertical speed as two digits with a fixed 0 after it, then X, then the pad's multiplier as 5, 2 or 10, then =, then the total as three digits with a fixed 0 after it. Both numbers are printed ten times larger than the values the game counts, matching the trailing zero on the status line score."
  },
  {
   "address": 59296,
   "type": "line",
   "text": "Entry to the attract sequence. Silences the SID by setting the volume to zero, raises attract_mode and enables interrupts so irq_tick can see F1."
  },
  {
   "address": 59306,
   "type": "line",
   "text": "Draws the title logo, then the instruction screen: clears 24 rows of screen and sets 24 rows of colour RAM to white, then copies the fifteen pieces of instruction_text to their fixed screen addresses and falls into the attract demo."
  },
  {
   "address": 59508,
   "type": "line",
   "text": "JUPITER LANDER, 14 characters, stamped at screen row 1 column 12."
  },
  {
   "address": 59522,
   "type": "line",
   "text": "<< INSTRUCTIONS >>, 18 characters, screen row 3 column 10."
  },
  {
   "address": 59540,
   "type": "line",
   "text": "PUSH <F1> TO START, 18 characters, screen row 24 column 10. The same key is the up thruster once play begins."
  },
  {
   "address": 59558,
   "type": "line",
   "text": "F1-FIRE, 7 characters, screen row 7 column 23, beside the lander picture."
  },
  {
   "address": 59565,
   "type": "line",
   "text": "LEFT-A with a leading space, 7 characters, screen row 11 column 10."
  },
  {
   "address": 59572,
   "type": "line",
   "text": "D-RIGHT, 7 characters, screen row 11 column 19."
  },
  {
   "address": 59579,
   "type": "line",
   "text": "Rules line 1, 38 characters: USE THE KEYBOARD OR JOYSTICK FOR CONT-"
  },
  {
   "address": 59617,
   "type": "line",
   "text": "Rules line 2, 38 characters: ROLLING THRUST. LAND ON ONE OF THREE"
  },
  {
   "address": 59655,
   "type": "line",
   "text": "Rules line 3, 38 characters: POSITIONS. VERTICAL VELOCITY MUST COME"
  },
  {
   "address": 59693,
   "type": "line",
   "text": "Rules line 4, 38 characters: WITHIN THE YELLOW AREA OF THE SCALE."
  },
  {
   "address": 59731,
   "type": "line",
   "text": "Rules line 5, 38 characters: THE SCORE, ACCORDING TO THE VELOCITY,"
  },
  {
   "address": 59769,
   "type": "line",
   "text": "Rules line 6, 38 characters: IS MULTIPLIED BY THE NUMBER BELOW. YOU"
  },
  {
   "address": 59807,
   "type": "line",
   "text": "Rules line 7, 38 characters: ARE REFUELED ON A SUCCESSFUL LANDING."
  },
  {
   "address": 59845,
   "type": "line",
   "text": "COPYRIGHT 1982 BY COMMODORE, 27 characters, screen row 21 column 1."
  },
  {
   "address": 59872,
   "type": "line",
   "text": "AND HAL LABORATORY, 18 characters, screen row 22 column 18. The only credit the game gives."
  },
  {
   "address": 59890,
   "type": "line",
   "text": "The attract sequence proper. First it shows a lander with the control legend, blinking each of the three thruster names in turn three times over, then it flies a demonstration: a lander is dropped at world X $0050, Y $006A with gravity 4 and one of four fixed sideways nudges chosen in rotation, and left to drift into the rock. The crash returns to the instruction screen and the whole thing repeats until somebody presses F1."
  },
  {
   "address": 59942,
   "type": "line",
   "text": "One round of the control demonstration. It flips the colour of the LEFT-A, D-RIGHT and F1-FIRE legends in colour RAM while switching the matching thruster flag on and off, so the picture shows which sprite each label is talking about."
  },
  {
   "address": 60209,
   "type": "line",
   "text": "Low byte of the four sideways nudges the attract demo gives its lander, chosen in rotation: $E6, $FF, $C8, $82."
  },
  {
   "address": 60213,
   "type": "line",
   "text": "High byte of the same four nudges, giving velocities of $00E6, $00FF, $00C8 and $0282 in 1/256 world units per tick. The last one is fast enough to carry the demo lander clear across the canyon."
  },
  {
   "address": 60217,
   "type": "line",
   "text": "The only interrupt the game runs, from CIA1 timer A about 59 times a second, and it runs **only during the attract sequence**: the single cli in the whole game is in attract_entry and start_game begins with sei. It does two things. Every twentieth tick it steps the colour of the 18 colour cells at $DBCA, which is exactly the 18 characters of PUSH <F1> TO START on screen row 24, so the prompt cycles through the palette. On every tick it selects keyboard row 0 and tests bit 4 of $DC01, which is F1 and the port 1 fire button at the same time; either one resets the stack pointer and jumps into start_game without ever returning from the interrupt."
  },
  {
   "address": 60271,
   "type": "line",
   "text": "Reads the flight controls into thrust_up and thrust_side. It looks at the joystick first, with all keyboard rows driven high so no key can show through, and debounces by reading $DC01 twice until two reads agree. Left, right and fire become side thrust 1, side thrust 2 and up thrust. Only if the stick is completely idle does it scan the keyboard, and then only three keys: F1 on row 0 bit 4 for up, A on row 1 bit 2 for left and D on row 2 bit 2 for right. D is tested last and wins if both are held."
  },
  {
   "address": 60370,
   "type": "line",
   "text": "The two CIA1 port A values read_controls writes to select keyboard rows for the side thrusters: $FD for row 1, which carries A, and $FB for row 2, which carries D."
  },
  {
   "address": 60372,
   "type": "line",
   "text": "What thrust_side becomes when the key on each row is down: 2 for row 2 and 1 for row 1. Row 2 is tested last, so holding A and D together thrusts right."
  },
  {
   "address": 60374,
   "type": "line",
   "text": "Draws the fuel bar on the status line from the fuel high byte alone. The top five bits give the number of solid cells written from screen $07C7; the bottom three bits pick one of the eight part-width glyphs $10 to $17 for the cell after it, so the bar moves in eighths of a character. Everything beyond is cleared, up to 32 cells."
  },
  {
   "address": 60417,
   "type": "line",
   "text": "Draws the marker on the vertical speed gauge in screen column 39. It gives up unless the Y velocity is inside -2 to +1 in high-byte terms, so a very fast ship has no marker at all. Otherwise it shifts the velocity right by two, adds 128 and halves it to get a gauge value from 0 to 127, clears the sixteen gauge cells, then picks row value>>3 from gauge_row_addr and writes glyph $18 plus the bottom three bits, which places the marker to one eighth of a character. One step of the marker is eight units of velocity. The single yellow cell on row 12 covers velocities 0 to 63, while touchdown accepts up to 71, so the last speed that lands sits one step below the yellow and one step above the first speed that does not."
  },
  {
   "address": 60498,
   "type": "line",
   "text": "Screen addresses of the sixteen rows of the velocity gauge, $04A0 to $06F8 in steps of 40, covering screen rows 4 to 19. draw_velocity_gauge picks one of these and writes the marker into column 39 of it."
  },
  {
   "address": 60499,
   "type": "line",
   "text": "The same table as gauge_row_addr, entered one byte along. draw_velocity_gauge reads the low byte through gauge_row_addr,X and the high byte through this label with the same even X, so the sixteen row addresses are stored as ordinary interleaved pointers rather than as split low and high tables."
  },
  {
   "address": 60530,
   "type": "line",
   "text": "Unpacks one of the four terrain streams onto the screen. Each run is a repeat count and a character code; the routine writes the character that many times, wrapping at 38 columns and stepping the screen and colour pointers together by 40, and stops when it reads a count of zero. Colour is decided by the character alone: anything other than a blank is red. Columns 38 and 39 are left alone for the velocity gauge, and the four streams pack 3496 cells into 924 bytes."
  },
  {
   "address": 60628,
   "type": "line",
   "text": "Low byte of the run-length stream for each of the four views: $B8, $0D, $D2, $7B."
  },
  {
   "address": 60632,
   "type": "line",
   "text": "High byte of the run-length stream for each view, giving $EEB8 for the wide view and $F00D, $F0D2 and $F17B for the three close-ups."
  },
  {
   "address": 60636,
   "type": "line",
   "text": "Colour RAM for the two status rows, 80 bytes copied to $DB98. Row 23 is green for the SCORE label, white for its digits and purple for HI-SCORE; row 24 is yellow for the FUEL label and blue for the bar."
  },
  {
   "address": 60716,
   "type": "line",
   "text": "The two status rows as characters, 80 bytes copied to screen $0798. It carries the SCORE, HI-SCORE and FUEL labels and, at the end of each score field, the fixed 0 that makes every score read ten times the number the game actually counts."
  },
  {
   "address": 60796,
   "type": "line",
   "text": "Paints the fixed furniture: the m/s label at the top of the gauge, the green gauge column down screen rows 2 to 20 with one yellow cell on row 12 marking the safe landing speed, the two status rows of text and colour from hud_text_template and hud_colour_template, the four x2, x5 and x10 multiplier glyphs beside the pads, and the four Commodore badge cells. Then it blanks the cells the score and message routines will write into."
  },
  {
   "address": 60990,
   "type": "line",
   "text": "Busy-waits for X delay units by calling delay_one_unit X times, with X of zero meaning 256. This is the game's only clock. The CIA interrupt is masked during play and is never waited on, and no raster interrupt is enabled, so nothing in the game is synchronised to the video at all."
  },
  {
   "address": 60997,
   "type": "line",
   "text": "One delay unit: ten passes of a 200-step countdown, about 10,000 CPU cycles or roughly 10 milliseconds on a PAL machine. Nothing here is synchronised to the raster, so the game's speed follows the CPU rather than the video standard, and an NTSC machine runs it about four per cent faster."
  },
  {
   "address": 61018,
   "type": "line",
   "text": "Prints the score at screen $07A1 and the high score 20 cells further along, both from packed BCD with leading zeros suppressed."
  },
  {
   "address": 61039,
   "type": "line",
   "text": "Prints a two-byte BCD value as four digits, high byte first, through print_bcd_byte."
  },
  {
   "address": 61045,
   "type": "line",
   "text": "Prints one packed BCD byte as two digits through print_bcd_digit."
  },
  {
   "address": 61054,
   "type": "line",
   "text": "Prints one BCD digit at screen $07A1 offset by Y, skipping it while digit_seen says every digit so far has been zero. Y is advanced whether or not anything was printed, so the digits stay in their columns."
  },
  {
   "address": 61072,
   "type": "line",
   "text": "Stamps OUT OF FUEL at screen $07CE in light red the first time the fuel high byte reaches zero. That same condition is what move_ship uses to cut the engines, so the message and the loss of control arrive together. The game does not end here: the ship keeps falling with no way to slow down, and it ends when it hits something."
  },
  {
   "address": 61101,
   "type": "line",
   "text": "The eleven characters of OUT OF FUEL, stamped at screen $07CE in light red the moment the fuel high byte reaches zero."
  },
  {
   "address": 61112,
   "type": "line",
   "text": "Run-length stream for the wide view, 341 bytes in 170 runs. Each run is a count then a character code; draw_terrain lays them out 38 cells per row for 23 rows. This is the whole pulled-back landscape with all three pads in it."
  },
  {
   "address": 61453,
   "type": "line",
   "text": "Run-length stream for the close-up of the x5 pad on the left, 197 bytes in 98 runs, in the same format as terrain_wide."
  },
  {
   "address": 61650,
   "type": "line",
   "text": "Run-length stream for the close-up of the x2 plateau in the middle, 169 bytes in 84 runs, the smallest of the four because the plateau is mostly flat fill."
  },
  {
   "address": 61819,
   "type": "line",
   "text": "Run-length stream for the close-up of the x10 pad on the right, 217 bytes in 108 runs. Every one of the four streams carries a Commodore badge cut into the rock."
  },
  {
   "address": 62036,
   "type": "line",
   "text": "Opens SID voice 3 as noise at frequency $0900 for the main thruster. Called on every tick the thruster is held."
  },
  {
   "address": 62045,
   "type": "line",
   "text": "Opens SID voice 3 as noise at the lower frequency $0700 for the explosion, which is why the bang sounds deeper than the engine."
  },
  {
   "address": 62054,
   "type": "line",
   "text": "Draws the boot screen. Clears the screen to blanks and colour RAM to blue, sets the border and background to light grey, unpacks logo_bitmap two cells per byte through logo_glyph_table into 440 cells from screen $04C7, then lays the three rows of the Commodore wordmark under it. It switches multicolour text mode on for three delay units before turning the background blue and switching it off again, which is the brief flicker of colour as the title appears."
  },
  {
   "address": 62261,
   "type": "line",
   "text": "The six characters the packed title bitmap can select: blank, solid, and the four half-tone corner shapes $60 to $63. Each nibble of the bitmap is an index into this table."
  },
  {
   "address": 62267,
   "type": "line",
   "text": "The JUPITER LANDER title, packed two screen cells per byte as nibbles into logo_glyph_table. draw_title_logo unpacks 440 cells from screen $04C7, which is eleven rows starting one cell early, and stops on the $FF terminator."
  },
  {
   "address": 62488,
   "type": "line",
   "text": "First of three 19-cell rows of the Commodore wordmark under the title, drawn from dedicated glyphs $64 to $7E rather than from letters. This row carries the upper half of the C= badge."
  },
  {
   "address": 62507,
   "type": "line",
   "text": "Middle row of the Commodore wordmark: the lower half of the C= badge followed by fifteen consecutive glyphs that spell the commodore logotype one cell at a time."
  },
  {
   "address": 62526,
   "type": "line",
   "text": "Bottom row of the Commodore wordmark, carrying the base of the badge and the four glyphs that read (c)1982."
  }
 ]
}