{
 "chunk": "game_graphicsData9300_9300",
 "unit": "game/graphicsData9300",
 "unitLabels": {
  "game/graphicsData9300": {
   "9300": "bitmapRowLoTable",
   "9303": "bitmapRowLoTableFrom3",
   "9306": "bitmapRowLoTableFrom6",
   "9319": "bitmapRowHiTable",
   "931C": "bitmapRowHiTableFrom3",
   "931F": "bitmapRowHiTableFrom6",
   "9332": "bitmapColLoTable",
   "9335": "bitmapColLoTableFrom3",
   "933F": "bitmapColLoTableFrom13",
   "935A": "bitmapColHiTable",
   "935D": "bitmapColHiTableFrom3",
   "9367": "bitmapColHiTableFrom13",
   "9382": "screenRowLoTable",
   "9385": "screenRowLoTableFrom3",
   "9388": "screenRowLoTableFrom6",
   "939B": "screenRowHiTable",
   "939E": "screenRowHiTableFrom3",
   "93A1": "screenRowHiTableFrom6",
   "93B4": "fontColorTable",
   "9426": "gameFont",
   "9456": "gameFontFramePieces",
   "94C6": "gameFontDialArcs",
   "95A6": "gameFontCompassN",
   "95B6": "gameFontCompassS",
   "95C6": "gameFontCompassW",
   "95D6": "gameFontCompassE",
   "95E6": "gameFontCornerMark",
   "95EE": "gameFontFramePiecesAlt",
   "964E": "gameFontBoxCorners",
   "966E": "gameFontTallDigitHalves",
   "96DE": "gameFontFuelCaption",
   "96F6": "gameFontFillPatterns",
   "971E": "gameFontBevelPieces",
   "97B6": "compassRoseBlock",
   "97D1": "dialFaceBlock",
   "9804": "buttonBoxBlock",
   "980A": "solidPlugBlock",
   "9810": "tallDigitGlyphPairTable",
   "9824": "windowFrameTileSets",
   "982D": "windowFrameTileSetRaised",
   "9836": "windowFrameTileSetOctagon",
   "983F": "windowFrameTileSetPanel",
   "9848": "windowFrameTileSetSolid",
   "9851": "windowFrameTileSetBlank",
   "985A": "windowFrameTileSetDither",
   "985E": "asciiToGlyphTableBiased",
   "9863": "windowFrameTileSetBevelA",
   "986C": "windowFrameTileSetBevelB",
   "9875": "windowFrameTileSetBevelC",
   "987E": "asciiToGlyphTable",
   "98BE": "consoleFontMulticolour",
   "98C6": "consoleFontMulticolourDigits",
   "9916": "consoleFontMulticolourLetters",
   "99E6": "consoleFontMulticolourSymbols",
   "9A96": "consoleFontHires",
   "9A9E": "consoleFontHiresDigits",
   "9AEE": "consoleFontHiresLetters",
   "9BBE": "consoleFontHiresSymbols",
   "9C6E": "terrainTileShapes",
   "9C76": "terrainTileContourShapes",
   "9D16": "terrainTileRiverShapes",
   "9D56": "terrainTileForestShapes",
   "9D76": "terrainTileHillShapes",
   "9D96": "terrainTileSummitShapes",
   "9DA6": "terrainTileRecyclerShape",
   "9DAE": "terrainTileEndZoneShapes",
   "9DCE": "unitSymbolShapes",
   "9DEE": "unitSymbolShapesRider",
   "9E0E": "unitSymbolShapesBoomer",
   "9E2E": "unitSymbolShapesSpy",
   "9E4E": "unitSymbolShapesComcen",
   "9E6E": "cursorSquareShape",
   "9E80": "cursorCrossShape",
   "9E92": "cursorBlockShape",
   "9EA4": "cursorBoxSprite",
   "9EE3": "crosshairSprite",
   "9F22": "comcenCrossMarkerShape",
   "9F37": "circleDxPtrLoTable",
   "9F41": "circleDxPtrHiTable",
   "9F4B": "circleDyPtrLoTable",
   "9F55": "circleDyPtrHiTable",
   "9F5F": "circleStepCountTable",
   "9F69": "circleDeltasRadius1",
   "9F6F": "circleDeltasRadius2",
   "9F73": "circleDeltasRadius3",
   "9F79": "circleDeltasRadius4",
   "9F7F": "circleDeltasRadius5",
   "9F8B": "circleDeltasRadius6",
   "9F97": "circleDeltasRadius7",
   "9FA1": "circleDeltasRadius8",
   "9FAF": "circleDeltasRadius9",
   "9FBF": "circleDeltasRadius10",
   "9FD1": "graphicsBlockTail"
  }
 },
 "notes": {
  "9300": {
   "unit": "game/graphicsData9300",
   "block": [
    "bitmapRowLoTable - low bytes of the 25 bitmap character-row addresses $A000 + 320*row.",
    "Verified: entry Y is exactly ($A000 + 320*Y) & $FF for Y = 0-24, so the values cycle",
    "$00,$40,$80,$C0.  This is the first of six parallel tables that turn a character cell",
    "(row 0-24, column 0-39) into two pointers without a multiply:",
    "  bitmapRowLoTable  $9300  25 bytes  low  byte of $A000 + 320*row   (the cell's 8 bitmap bytes)",
    "  bitmapRowHiTable  $9319  25 bytes  high byte of the same address",
    "  bitmapColLoTable  $9332  40 bytes  low  byte of column*8",
    "  bitmapColHiTable  $935A  40 bytes  high byte of column*8 (0, or 1 from column 32 on)",
    "  screenRowLoTable  $9382  25 bytes  low  byte of $8C00 + 40*row    (the cell's colour byte)",
    "  screenRowHiTable  $939B  25 bytes  high byte of the same address",
    "calcCellPointersXY ($2AA3-$2AC2) adds row+column entries into zp_B4/B5 (bitmap) and",
    "zp_B6/B7 (screen RAM); colour RAM is the screen pointer with $4C added to the high byte",
    "($8C00 + $4C00 = $D800).  plotBitmapPixelRow ($FC80/$FC87/$FCAE/$FCB5) in the high-memory",
    "block uses the same four bitmap tables for single-pixel plotting.",
    "Three routines index the tables from a biased base instead of adding the window origin, so",
    "the disassembler labels those interior addresses as well - see the labels inside each table.",
    "Rows 0-2 below (read as bitmapRowLoTable,Y by $2AA3 and $FC80)."
   ]
  },
  "9303": {
   "unit": "game/graphicsData9300",
   "block": [
    "Rows 3-24 again, as the base of the radar/tactical window that starts at character row 3.",
    "Read here by drawScreen1Cell ($5DB2) in the main program and by the $6F00 overlays at",
    "$7BDA/$7C38 (both variants); the matching high bytes are at $931C."
   ],
   "line": "rows 3-5"
  },
  "9306": {
   "unit": "game/graphicsData9300",
   "block": [
    "Rows 6-24, the base used by the drone camera window that starts at character row 6:",
    "read at $743E (fixed) and $749F (indexed by X) in both $6F00 overlays; high bytes at $931F."
   ],
   "line": "rows 6-24"
  },
  "9319": {
   "unit": "game/graphicsData9300",
   "block": [
    "bitmapRowHiTable - high bytes of the same 25 row addresses ($A0,$A1,$A2,$A3,$A5,...):",
    "$A000 + 320*row, so the high byte steps by 1 or 2 every row.  Read as bitmapRowHiTable,Y",
    "by calcCellPointersXY ($2AAC) and plotBitmapPixelRow ($FC87).",
    "Rows 0-2 below."
   ]
  },
  "931C": {
   "unit": "game/graphicsData9300",
   "block": [
    "Rows 3-24 (window base row 3): read at $5DBA and at $7BE2/$7C40 in the $6F00 overlays."
   ],
   "line": "rows 3-5"
  },
  "931F": {
   "unit": "game/graphicsData9300",
   "block": [
    "Rows 6-24 (drone camera base row 6): read at $7446 and $74A7 in the $6F00 overlays."
   ],
   "line": "rows 6-24"
  },
  "9332": {
   "unit": "game/graphicsData9300",
   "block": [
    "bitmapColLoTable - low bytes of column*8 for the 40 bitmap columns (0,8,...,312 mod 256).",
    "Verified: entry X = (X*8) & $FF.  Read as bitmapColLoTable,X by calcCellPointersXY ($2AA7)",
    "and plotBitmapPixelRow ($FCAE).",
    "Columns 0-2 below."
   ]
  },
  "9335": {
   "unit": "game/graphicsData9300",
   "block": [
    "Columns 3-39, the base of the window that starts at character column 3: read at $5DB5",
    "(drawScreen1Cell) and at $7BDD/$7C3B in both $6F00 overlays."
   ],
   "line": "columns 3-12"
  },
  "933F": {
   "unit": "game/graphicsData9300",
   "block": [
    "Columns 13-39, the base of the drone camera window at character column 13: read at $7441",
    "and $74A2 in both $6F00 overlays."
   ],
   "line": "columns 13-39"
  },
  "935A": {
   "unit": "game/graphicsData9300",
   "block": [
    "bitmapColHiTable - high bytes of column*8: $00 for columns 0-31, $01 for columns 32-39",
    "(column 32 is the first whose byte offset crosses $0100).  Read at $2AAF and $FCB5.",
    "Columns 0-2 below."
   ]
  },
  "935D": {
   "unit": "game/graphicsData9300",
   "block": [
    "Columns 3-39: read at $5DBD and at $7BE5/$7C43 in both $6F00 overlays."
   ],
   "line": "columns 3-12"
  },
  "9367": {
   "unit": "game/graphicsData9300",
   "block": [
    "Columns 13-39: read at $7449 and $74AA in both $6F00 overlays."
   ],
   "line": "columns 13-39"
  },
  "9382": {
   "unit": "game/graphicsData9300",
   "block": [
    "screenRowLoTable - low bytes of the 25 screen-RAM row addresses $8C00 + 40*row",
    "($00,$28,$50,...).  Verified against the formula for all 25 rows.  The column is simply",
    "added to this value, so there is no column table for screen RAM.  Read by",
    "fillScreenColourRect ($2A71), calcCellPointersXY ($2AB6) and both $6F00 overlays ($82C1).",
    "Rows 0-2 below."
   ]
  },
  "9385": {
   "unit": "game/graphicsData9300",
   "block": [
    "Rows 3-24 (window base row 3): read at $5DC3 and at $78E9/$7BEB in both $6F00 overlays."
   ],
   "line": "rows 3-5"
  },
  "9388": {
   "unit": "game/graphicsData9300",
   "block": [
    "Rows 6-24 (drone camera base row 6): read at $744F in both $6F00 overlays."
   ],
   "line": "rows 6-24"
  },
  "939B": {
   "unit": "game/graphicsData9300",
   "block": [
    "screenRowHiTable - high bytes of $8C00 + 40*row: $8C for rows 0-6, $8D for rows 7-12,",
    "$8E for rows 13-19, $8F for rows 20-24.  Read at $2A6C, $2ABB and $82C6 (both overlays).",
    "Adding $4C to one of these bytes turns the screen-RAM pointer into a colour-RAM pointer.",
    "Rows 0-2 below."
   ]
  },
  "939E": {
   "unit": "game/graphicsData9300",
   "block": [
    "Rows 3-24: read at $5DCA and at $78F2/$7BF2 in both $6F00 overlays."
   ],
   "line": "rows 3-5"
  },
  "93A1": {
   "unit": "game/graphicsData9300",
   "block": [
    "Rows 6-24: read at $7456 in both $6F00 overlays."
   ],
   "line": "rows 6-24"
  },
  "93B4": {
   "unit": "game/graphicsData9300",
   "block": [
    "fontColorTable - one default colour byte for each of the 114 gameFont glyphs, same index as",
    "gameFont ($9426).  114 bytes, 16 per line below, so the line address gives the glyph number:",
    "$93B4 = glyphs $00-$0F, $93C4 = $10-$1F and so on.",
    "Read only by plotGlyph ($2AD6), and only when useDrawColourFlag ($2A29) is zero; when the",
    "caller has set that flag the fixed colour in drawColourByte ($2A2A) is used for every glyph.",
    "The byte is the cell's screen-RAM byte.  The console screens are drawn in hires bitmap mode",
    "($D016 bit 4 clear), where the high nibble is the colour of the 1 bits and the low nibble the",
    "colour of the 0 bits; in multicolour mode the same nibbles colour the %01 and %10 pixel pairs.",
    "Almost every entry is a grey pair - $BC (dark grey on medium grey), $FC (light grey on medium",
    "grey), $BB, $FB, $FF - which is what gives the console its metal look.  Notable exceptions:",
    "$6E for glyphs $30-$37, the compass letters, drawn blue on light blue like the drone dial's",
    "colour fill at $6F2D; $02 (black on red) for the button-box corners $45-$48 and $59; $15",
    "(white on green) for the two halves of the tall digit 0.",
    "Glyphs $01-$05 are five identical solid blocks that differ only here ($1C, $FC, $CC, $BC, $0C),",
    "and the light/dark frame pieces $06-$0D and $39-$40 hold the same eight shapes with their",
    "highlight colours swapped, which is how one frame set draws a raised box and the other a sunken",
    "one (see windowFrameTileSets).",
    "No entry is zero, so with the flag clear a glyph always gets its own colour: the 'entry 0 means",
    "fall back to drawColourByte' path in plotGlyph ($2AFC) can never be taken from this table."
   ]
  },
  "9426": {
   "unit": "game/graphicsData9300",
   "block": [
    "gameFont - the main program's own 8x8 tile font: 114 glyphs of 8 bytes each, addressed as",
    "$9426 + code*8 by plotGlyph, which builds that address at $2AE5/$2AEB and copies the eight",
    "bytes into one bitmap cell through zp_B2/B3.  The plotter's mode opcode at $2AF3 can store,",
    "OR or EOR the rows, so several glyphs are designed to be drawn over each other.",
    "This is not a text font - readable text is drawn with the 59-glyph console sets at $98BE/$9A96.",
    "It is the tile set the bitmap screens are built from, and it is used through four tables:",
    "windowFrameTileSets ($9824), tallDigitGlyphPairTable ($9810), the four character-picture",
    "blocks at $97B6, and fontColorTable ($93B4) for the default colours.",
    "Map of the glyph codes:",
    "  $00       blank cell",
    "  $01-$05   solid cell (all $FF); five copies that differ only in fontColorTable",
    "  $06-$13   thin frame pieces: corner dots, edge lines, both diagonals",
    "  $14-$2F   arc segments of the drone dial rings (used only by the $97B6/$97D1 pictures)",
    "  $30-$37   the compass letters N, S, W and E, each split over two cells",
    "  $38       small hollow diamond - the inner corner mark of drawWindowInnerCorners",
    "  $39-$44   the same frame pieces again in the opposite shade, plus two solid triangles",
    "  $45-$48   the four corners of the 2x2 button box",
    "  $49-$56   fourteen half-glyphs that make the ten tall digits (see $9810)",
    "  $57-$59   the word FUEL as a 24-pixel strip (drone fuel gauge caption, drawn at $6F6F-$6F7F)",
    "  $5A-$5E   flat multicolour fills and dithers",
    "  $5F-$71   the heavy raised-bevel frame set",
    "Glyphs $00-$05 below: the blank and the five solid cells.  $01 is also drawCharBlock's",
    "initial blockFillChar ($2A2C)."
   ]
  },
  "9456": {
   "unit": "game/graphicsData9300",
   "block": [
    "Glyphs $06-$13 - thin frame pieces, two pixels thick, drawn on the inner edge of a cell:",
    "$06 bottom-right corner dot, $07 bottom-left, $08 top-right, $09 top-left, $0A line along the",
    "bottom, $0B line along the top, $0C line down the right, $0D line down the left, $0E/$0F the",
    "'/' diagonal, $10/$11 the '\\' diagonal, $12 single-pixel left column, $13 single-pixel right",
    "column.  ($0E and $0F are identical, so are $10 and $11; only their colour entries differ.)",
    "Used by window frame sets 0 ($9824) and 2 ($9836)."
   ]
  },
  "94C6": {
   "unit": "game/graphicsData9300",
   "block": [
    "Glyphs $14-$2F - 28 chunky arc segments.  Each is a slice of a circle edge, meaningless on its",
    "own; the two character-picture blocks at $97B6 and $97D1 assemble them into the inner octagon and",
    "the outer ring of the DRONE screen's compass dial (and, redrawn in one colour, into the body of",
    "the fuel gauge).  No window frame set or other glyph table in this file selects any of them."
   ]
  },
  "95A6": {
   "unit": "game/graphicsData9300",
   "block": [
    "Glyphs $30-$37 - the four compass letters of the drone dial, each split across two cells so a",
    "letter can straddle a cell boundary.  Their fontColorTable entries are all $6E (blue on light",
    "blue), the dial's colour.",
    "$30 over $31 = 'N' (the letter spans pixel rows 2-9 of the two stacked cells)."
   ]
  },
  "95B6": {
   "unit": "game/graphicsData9300",
   "block": [
    "$32 over $33 = 'S' (pixel rows 6-13 of the two stacked cells)."
   ]
  },
  "95C6": {
   "unit": "game/graphicsData9300",
   "block": [
    "$34 beside $35 = 'W' (pixel columns 2-9 of the two cells side by side)."
   ]
  },
  "95D6": {
   "unit": "game/graphicsData9300",
   "block": [
    "$36 beside $37 = 'E' (pixel columns 6-13 of the two cells side by side)."
   ]
  },
  "95E6": {
   "unit": "game/graphicsData9300",
   "block": [
    "Glyph $38 - the small hollow diamond drawWindowInnerCorners ($2B93-$2BB3) stamps just inside the",
    "four corners of a panel, giving the frame its four studs; the overlay screens call it at $7092,",
    "$7B0A and elsewhere.  It is also the corner mark of the outer dial picture at $97D1."
   ]
  },
  "95EE": {
   "unit": "game/graphicsData9300",
   "block": [
    "Glyphs $39-$44 - a second copy of the thin frame pieces plus two solid triangles:",
    "$39-$40 are byte-for-byte the same shapes as $06-$0D, but their fontColorTable entries have",
    "the light and dark greys swapped, so frame set 1 ($982D) draws the same box as set 0 ($9824)",
    "lit from the other side (raised instead of sunken).  $41 and $44 are the '\\' diagonal, $42 a",
    "solid upper-left triangle and $43 a solid lower-right triangle: the chamfered corners of the",
    "solid panel in frame set 3 ($983F)."
   ]
  },
  "964E": {
   "unit": "game/graphicsData9300",
   "block": [
    "Glyphs $45-$48 - the four corners of a 2x2 hollow box, two pixels thick: $45 top-left,",
    "$46 top-right, $47 bottom-left, $48 bottom-right.  The character block at $9804 stamps all",
    "four as the console tab boxes ($16A9), the FIRE button ($7B1B) and the drone screen's LAUNCH",
    "and STRIKE buttons ($70A3, $70D6)."
   ]
  },
  "966E": {
   "unit": "game/graphicsData9300",
   "block": [
    "Glyphs $49-$56 - fourteen half-glyphs that build the ten 8x16 tall digits.  Shapes are shared",
    "between digits (for example $4D is the top of both 2 and 3, $52 the top of both 5 and 6), which",
    "is why fourteen glyphs are enough for twenty halves; tallDigitGlyphPairTable ($9810) says which",
    "pair makes which digit."
   ]
  },
  "96DE": {
   "unit": "game/graphicsData9300",
   "block": [
    "Glyphs $57-$59 - three cells that together spell FUEL in a small 6x6 typeface (24 pixels wide).",
    "drawDroneFuelPanel plots them one after another at row 17, columns 4-6 of the DRONE screen",
    "($6F6D-$6F7F), under the tall fuel digits.  They are not reachable through any glyph table."
   ]
  },
  "96F6": {
   "unit": "game/graphicsData9300",
   "block": [
    "Glyphs $5A-$5E - flat multicolour fills, meant for the multicolour map screens where each byte",
    "is four 2-bit pixels: $5D is all %10 pixels ($AA) and $5E all %01 pixels ($55), i.e. solid",
    "cells in the two screen-RAM nibble colours; $5A, $5B and $5C are the same fields with a few %11",
    "pixels forming a faint diagonal.  Frame set 6 ($985A), the overview panel's border, is built",
    "from them."
   ]
  },
  "971E": {
   "unit": "game/graphicsData9300",
   "block": [
    "Glyphs $5F-$71 - the heavy raised-bevel frame set: solid ($FF) interiors with one or two rows",
    "or columns of $55/$AA dither along an edge, so a border drawn from them looks bevelled.",
    "Frame sets 7, 8 and 9 ($9863, $986C, $9875) - the battlefield view, the console panel and the",
    "in-battle message frame - are made of these."
   ]
  },
  "97B6": {
   "unit": "game/graphicsData9300",
   "block": [
    "Four character-picture blocks in drawCharBlock ($2B18) format, back to back: byte 0 = width in",
    "cells, byte 1 = height, then width*height gameFont codes stored row by row.  drawCharBlock",
    "stamps them at windowOriginRow/windowOriginCol ($2A2D/$2A2E).",
    "The survey called this range unreferenced dead data.  It is not: every one of the four blocks is",
    "drawn, but always from a split immediate pair (LDA #lo / LDY #hi), which the cross-referencer",
    "cannot see - that is why XREF.txt lists no label anywhere in $97B6-$980F.",
    "compassRoseBlock ($97B6, 5x5 cells = 40x40 pixels) is the inner face of the DRONE screen's",
    "heading dial: an octagonal ring with the compass letters N, S, W and E ($30-$37) at the four",
    "cardinal points.  drawDroneHeadingPanel loads it at $6F20/$6F22 and stamps it at row 5, column 3",
    "(inside the 7x7 ring below), then paints the 3x3 middle with colour $6E.",
    "Header: width 5, height 5."
   ],
   "line": "5 wide, 5 high"
  },
  "97B8": {
   "unit": "game/graphicsData9300",
   "block": [
    "The 25 glyph codes of the compass rose, one picture row per line: the ring is built from the",
    "arc glyphs $14-$2F, and cells (0,2)/(1,2) hold N, (3,2)/(4,2) hold S, (2,0)/(2,1) hold W and",
    "(2,3)/(2,4) hold E."
   ],
   "line": "row 0 - upper-left arc, upper N, upper-right arc"
  },
  "97D1": {
   "unit": "game/graphicsData9300",
   "block": [
    "dialFaceBlock - 7x7 cells (56x56 pixels): a big rounded ring with a small diamond ($38) at each",
    "of the four corners.  Drawn twice on the DRONE screen: as the outer face of the heading dial at",
    "row 4, column 2 ($6F0F/$6F11), and again at row 13, column 2 as the body of the fuel gauge",
    "($6F4F/$6F51), that time with useDrawColourFlag set so the whole picture comes out in $BC.",
    "Header: width 7, height 7."
   ],
   "line": "7 wide, 7 high"
  },
  "97D3": {
   "unit": "game/graphicsData9300",
   "block": [
    "The 49 glyph codes of the dial face, one picture row of 7 per line.  Code $00 is the hollow",
    "middle, $04 the solid flat of the ring at the four cardinal points, $38 the corner diamonds and",
    "$14-$2F the arc segments.",
    "The last row runs past $9800, where the title-picture colour RAM that shares these addresses",
    "begins, so the listing breaks the row there; the four codes at $9800 belong to this block."
   ],
   "line": "row 0 - corner diamond, arc, arc, ring top, arc, arc, corner diamond"
  },
  "9800": {
   "unit": "game/graphicsData9300",
   "block": [
    "The last four glyph codes of dialFaceBlock's bottom row ($04 $2E $2F $38): the row is split",
    "here only because $9800 is also the start of the boot loader's title-picture colour RAM."
   ],
   "line": "end of the 7x7 dial picture"
  },
  "9804": {
   "unit": "game/graphicsData9300",
   "block": [
    "buttonBoxBlock - a 2x2 character block (header 2,2 then glyphs $45,$46,$47,$48) that draws a",
    "16x16 pixel hollow box.  It is the game's push-button: the three console tab boxes STATS /",
    "REPAIR / MISC ($16A5/$16A7 in the main program), the FIRE button of the comcen screen ($7B17),",
    "and the LAUNCH and STRIKE buttons of the DRONE screen ($709F, $70D2).  The caller paints the",
    "four colour cells afterwards with fillScreenColourRect."
   ],
   "line": "2x2: box corners $45-$48"
  },
  "980A": {
   "unit": "game/graphicsData9300",
   "block": [
    "solidPlugBlock - a 2x2 character block of four solid cells (glyph $05).  The only user is the",
    "closing-iris animation on the comcen screen ($726A/$726C): once the shrinking frame is down to",
    "two cells this block plugs the 2x2 hole left in the middle."
   ],
   "line": "2x2: four solid cells"
  },
  "9810": {
   "unit": "game/graphicsData9300",
   "block": [
    "tallDigitGlyphPairTable - ten 2-byte entries, indexed as $9810 + symbol*2 by drawTallGlyph",
    "($2BBA reads the first byte, $2BC5 the second).  The first code is drawn at scratch18/scratch19",
    "and the second one row lower, so each entry makes one 8x16 pixel digit out of two gameFont",
    "half-glyphs from the $49-$56 group.  Rendering all ten confirms they are the digits 0-9 in a",
    "calculator typeface, in order; one pair per line below:",
    "  0 = $49,$4A   1 = $4B,$4C   2 = $4D,$4E   3 = $4D,$4F   4 = $50,$51",
    "  5 = $52,$4F   6 = $52,$53   7 = $54,$55   8 = $56,$53   9 = $56,$51",
    "Used for the big numbers on the overlay screens: the drone fuel gauge ($6FD9, $6FE1, $6FE9),",
    "the drone count ($7055) and the comcen screen's two-digit readout ($7AD8, $7AE0)."
   ],
   "line": "digit 0"
  },
  "9824": {
   "unit": "game/graphicsData9300",
   "block": [
    "windowFrameTileSets - ten 9-byte tile sets, one set per line below.  Each set is nine gameFont",
    "codes in row-major order: top-left, top, top-right, left, centre, right, bottom-left, bottom,",
    "bottom-right.  drawFrameBox ($2CA1) draws the four corners and then runs the edges between them,",
    "so entry 4, the centre, is never read.",
    "A set is chosen through windowFramePtrTable ($2C49) in the main program: drawWindowFrame ($2C7F)",
    "doubles the window number 0-26 and fetches the address from there, so the only references to this",
    "table are those 27 pointers, which is why XREF.txt shows no reader.  All ten sets are in use.",
    "Sets 0 and 1 hold identical shapes ($06-$0D and $39-$40 are the same eight glyphs twice); only",
    "their fontColorTable entries differ, which turns one box into a raised panel and the other into a",
    "sunken one.",
    "Set 0 - thin box with the dark grey highlight on the top and left, so it reads as sunken.",
    "Windows $04, $08, $0B and $12."
   ],
   "line": "set 0: TL,T,TR,L,C,R,BL,B,BR"
  },
  "9828": {
   "unit": "game/graphicsData9300",
   "block": [
    "Set 0 continued - the row is split here only because the title-picture colour RAM that shares",
    "these addresses is annotated one 40-byte screen row at a time (see the note at the end of this",
    "file).  The same split happens inside sets 4, 6 and 9 and inside both console fonts."
   ],
   "line": "set 0, tiles 4-8"
  },
  "982D": {
   "unit": "game/graphicsData9300",
   "block": [
    "Set 1 - the same box as set 0 with the light grey highlight on the top and left: a raised panel.",
    "Windows $07, $09, $0A, $11, $13 and $1A."
   ],
   "line": "set 1: thin box, raised"
  },
  "9836": {
   "unit": "game/graphicsData9300",
   "block": [
    "Set 2 - single-pixel lines with diagonal corners, i.e. an octagonal box.  Windows $05, $0D, $0E,",
    "$0F and $18 (the drone screen's compass and fuel panels are two of them)."
   ],
   "line": "set 2: octagon"
  },
  "983F": {
   "unit": "game/graphicsData9300",
   "block": [
    "Set 3 - a solid panel: solid cells all round with the two triangle glyphs $42/$43 and the",
    "diagonals $41/$44 chamfering the corners.  Windows $06, $10 and $19."
   ],
   "line": "set 3: solid panel, chamfered corners"
  },
  "9848": {
   "unit": "game/graphicsData9300",
   "block": [
    "Set 4 - nine copies of the solid glyph $03.  Windows $0C, $16 and $17, and the shrinking rings",
    "of the comcen iris animation, which passes this address straight to drawFrameBox ($7246)."
   ],
   "line": "set 4: all solid"
  },
  "9850": {
   "unit": "game/graphicsData9300",
   "block": [
    "Set 4, last tile (split by the title-picture row boundary at $9850)."
   ],
   "line": "set 4, tile 8"
  },
  "9851": {
   "unit": "game/graphicsData9300",
   "block": [
    "Set 5 - nine blank cells, i.e. drawing this frame erases one.  Windows $14 and $15."
   ],
   "line": "set 5: all blank (erase)"
  },
  "985A": {
   "unit": "game/graphicsData9300",
   "block": [
    "Set 6 - built from the flat multicolour fills $5A-$5E; it borders window $00, the overview panel,",
    "which is the only part of the screen drawn in multicolour mode.  The set runs $985A-$9862 and is",
    "printed in two pieces because the asciiToGlyphTable alias label falls inside it."
   ],
   "line": "set 6: multicolour dither, tiles 0-3"
  },
  "985E": {
   "unit": "game/graphicsData9300",
   "block": [
    "$985E is asciiToGlyphTable ($987E) minus $20, the base the chat-line editor uses so it can index",
    "the table with a raw character code instead of code-$20: $C80A does LDA $985E,X and refuses the",
    "key when the entry is $3B, the 'no glyph' value.  The five bytes stored here are really the last",
    "five tiles of frame set 6."
   ],
   "line": "set 6, tiles 4-8; also the biased base of asciiToGlyphTable"
  },
  "9863": {
   "unit": "game/graphicsData9300",
   "block": [
    "Set 7 - heavy raised bevel with a dithered outer edge ($5F-$66).  Window $01, the battlefield",
    "view."
   ],
   "line": "set 7: bevel, battlefield view"
  },
  "986C": {
   "unit": "game/graphicsData9300",
   "block": [
    "Set 8 - the same bevel with different corner shading ($67-$69 then $62-$66 again).  Window $02,",
    "the console panel."
   ],
   "line": "set 8: bevel, console panel"
  },
  "9875": {
   "unit": "game/graphicsData9300",
   "block": [
    "Set 9 - the heavy solid bevel ($6A-$71).  Window $03, the message frame used during a battle."
   ],
   "line": "set 9: solid bevel, message frame"
  },
  "9878": {
   "unit": "game/graphicsData9300",
   "block": [
    "Set 9 continued (split by the title-picture row boundary at $9878)."
   ],
   "line": "set 9, tiles 3-8"
  },
  "987E": {
   "unit": "game/graphicsData9300",
   "block": [
    "asciiToGlyphTable - 64 entries mapping character codes $20-$5F to a glyph number of the console",
    "font at $98BE/$9A96 (0-58); 16 entries per line below, so the line address gives the character",
    "range.  printChar reads it as asciiToGlyphTable,Y with Y = character - $20 ($C02A), in the text",
    "engine and in the boot loader's copy of the same routine; the chat-line editor reads the same",
    "bytes through the biased base $985E.",
    "Layout: space -> 0, '0'-'9' -> $01-$0A, 'A'-'Z' -> $0B-$24, the punctuation the font has",
    "-> $25-$3A ('.' $25, '!' $26, ',' $27, '('/'[' $28, ')'/']' $29, '-' $2A, '%' $2B, apostrophe",
    "$2C, '?' $2D, ':' $2E, '*' $2F, '+' $30, '/' $31, '=' $32, '\"' $33, '#' $34, '$' $35, '@' $36,",
    "';' $37, '&' $38, '<' $39, '>' $3A).  Backslash, caret and underscore map to $3B, which is one",
    "past the last glyph and means 'this character cannot be drawn': only the line editor tests for",
    "it, printChar would happily plot the eight bytes that follow the font."
   ],
   "line": "characters $20-$41: space, punctuation, digits, ':' to '@' and 'A'"
  },
  "98A0": {
   "unit": "game/graphicsData9300",
   "block": [
    "The rest of asciiToGlyphTable; the split is a title-picture row boundary, not a structure",
    "boundary."
   ],
   "line": "characters $42-$5F: 'B' to 'Z', then '[', '\\', ']', '^', '_'"
  },
  "98BE": {
   "unit": "game/graphicsData9300",
   "block": [
    "consoleFontMulticolour - the text font of the $C000 text engine: 59 glyphs of 8x8 pixels, 8",
    "bytes each, addressed as $98BE + glyph*8 by plotGlyphCell ($C201/$C207).  It is the multicolour",
    "half of a pair: every pixel is stored as the bit pair %11 (byte values $00,$03,$0C,$0F,$30,$33,",
    "$3C,$3F), so it is drawn at half horizontal resolution but takes its colour from colour RAM.",
    "The identical shapes in single-bit form are $1D8 bytes further on at $9A96, and plotGlyphCell",
    "picks between them on bit 4 of the $D016 shadow $9001 ($C20B): multicolour here, hires there.",
    "Glyph order (the same for both fonts, and what asciiToGlyphTable maps into):",
    "  $00 blank, $01-$0A digits 0-9, $0B-$24 letters A-Z, $25-$3A punctuation and arrows.",
    "Both fonts are stored as positives on disk and inverted in place at boot: invertTextFonts",
    "($031B-$0338) EORs every byte of $98BE-$9C6D with $FF, so the bit art below is the shape as it",
    "ships, and at run time the glyph is drawn as a hole in a solid cell.",
    "Glyph $00, the blank cell, below."
   ]
  },
  "98C6": {
   "unit": "game/graphicsData9300",
   "block": [
    "Glyphs $01-$0A of the multicolour set: the digits 0 to 9, in order."
   ]
  },
  "9916": {
   "unit": "game/graphicsData9300",
   "block": [
    "Glyphs $0B-$24 of the multicolour set: the letters A to Z, in order."
   ]
  },
  "99E6": {
   "unit": "game/graphicsData9300",
   "block": [
    "Glyphs $25-$3A of the multicolour set: . ! , ( ) - % ' ? : * + / = \" # $ @ ; & < >, in the order",
    "asciiToGlyphTable maps them.  The last few are the arrow and cursor shapes the message system",
    "uses."
   ]
  },
  "9A96": {
   "unit": "game/graphicsData9300",
   "block": [
    "consoleFontHires - the same 59 glyphs as $98BE in single-bit (hires) form, exactly $01D8 bytes",
    "later; plotGlyphCell adds that offset at $C215/$C21B when the display is not in multicolour mode.",
    "Same glyph order, same inversion at boot ($98BE-$9C6D).  This is the font almost all the game's",
    "readable text is drawn in.",
    "Glyph $00, the blank cell, below."
   ]
  },
  "9A9E": {
   "unit": "game/graphicsData9300",
   "block": [
    "Glyphs $01-$0A of the hires set: the digits 0 to 9."
   ]
  },
  "9AEE": {
   "unit": "game/graphicsData9300",
   "block": [
    "Glyphs $0B-$24 of the hires set: the letters A to Z."
   ]
  },
  "9BBE": {
   "unit": "game/graphicsData9300",
   "block": [
    "Glyphs $25-$3A of the hires set: the same punctuation and arrows as $99E6.  The last byte of",
    "this block, $9C6D, is where invertTextFonts stops."
   ]
  },
  "9C6E": {
   "unit": "game/graphicsData9300",
   "block": [
    "terrainTileShapes - 44 one-bit 8x8 terrain tiles of 8 bytes each, addressed as $9C6E + index*8",
    "by setTerrainTilePtr ($2DD0/$2DD6), which leaves the address in zp_B2/B3.  The 20 unit symbols",
    "at $9DCE continue the same table as indices $2C-$3F.",
    "The index is derived from the map cell byte: cell - $40, or cell - $20 when the cell is below",
    "$40 ($27B2), so the two contour rings $21-$34 and $41-$54 deliberately draw the same art.",
    "Three renderers read the shapes: the main map view doubles each nibble through",
    "nybbleToMulticolourTable to draw a cell 16x16 in the tactical window ($27B8), drawRadarGlyph",
    "($73A4) plots them 8x8 on the radar and drone screens, and drawScreen1Cell ($5DF5) uses the same",
    "pair of overlay routines for single-cell updates.",
    "Index map: $00 open ground, $01-$14 contour lines, $15-$1C river, $1D-$20 forest, $21-$24 hill,",
    "$25-$26 summit, $27 recycler, $28-$2B end zone.",
    "Tile $00 below: open ground, an empty cell (map codes $20 and $40)."
   ]
  },
  "9C76": {
   "unit": "game/graphicsData9300",
   "block": [
    "Tiles $01-$14 - the twenty contour/ridge line fragments, drawn for map codes $21-$34 (the lower",
    "contour ring) and $41-$54 (the upper one).  Each is a short line or line junction crossing the",
    "cell in a different direction; the map generator picks the fragment that joins its neighbours."
   ]
  },
  "9D16": {
   "unit": "game/graphicsData9300",
   "block": [
    "Tiles $15-$1C - river, map codes $55-$5C.  $15-$18 are the four quarters of a rounded bend and",
    "$19-$1C the straight and junction pieces, so a river drawn from them flows cell to cell."
   ]
  },
  "9D56": {
   "unit": "game/graphicsData9300",
   "block": [
    "Tiles $1D-$20 - forest, map codes $5D-$60: four dense noise patterns."
   ]
  },
  "9D76": {
   "unit": "game/graphicsData9300",
   "block": [
    "Tiles $21-$24 - hillside, map codes $61-$64: four sparse dot patterns."
   ]
  },
  "9D96": {
   "unit": "game/graphicsData9300",
   "block": [
    "Tiles $25-$26 - summit, map codes $65-$66: two very sparse dot patterns."
   ]
  },
  "9DA6": {
   "unit": "game/graphicsData9300",
   "block": [
    "Tile $27 - the recycler, map code $67: a boxed cross."
   ]
  },
  "9DAE": {
   "unit": "game/graphicsData9300",
   "block": [
    "Tiles $28-$2B - the four checkerboard blocks used for the end-zone cells, map codes $68-$6B.",
    "getRadarCellGlyph also uses them as the hatch for everything outside the 40x40 map, picking one",
    "with (row + column) AND 3 so the border looks woven."
   ]
  },
  "9DCE": {
   "unit": "game/graphicsData9300",
   "block": [
    "unitSymbolShapes - the 20 small unit symbols, indices $2C-$3F of the same 8-bytes-per-shape",
    "table that starts at $9C6E, so setTerrainTilePtr fetches them exactly like a terrain tile.",
    "Five unit types times four facings, in unit-type order: the glyph number is",
    "unitGlyphBaseTable[type] ($0799 = $2C GRUNT, $30 RIDER, $34 BOOMER, $38 SPY, $3C COMCEN) plus",
    "the facing in bits 0-1 of the unit's flags byte.  getRadarCellGlyph does that at $7512, and",
    "again at $7538 for the random 'ghost' blip of an unspotted enemy (with bit 7 set, which tells",
    "drawRadarGlyph to speckle it).",
    "These 8x8 symbols are the radar and overview views only; the tactical window draws units from",
    "the 16x16 multicolour shapes at $6C5D in the main program.",
    "$2C-$2F below: GRUNT facing 0, 1, 2, 3."
   ]
  },
  "9DEE": {
   "unit": "game/graphicsData9300",
   "block": [
    "Glyphs $30-$33 - RIDER, the four facings."
   ]
  },
  "9E0E": {
   "unit": "game/graphicsData9300",
   "block": [
    "Glyphs $34-$37 - BOOMER, the four facings."
   ]
  },
  "9E2E": {
   "unit": "game/graphicsData9300",
   "block": [
    "Glyphs $38-$3B - SPY, the four facings."
   ]
  },
  "9E4E": {
   "unit": "game/graphicsData9300",
   "block": [
    "Glyphs $3C-$3F - COMCEN, the four facings; the last shape of the table, which ends at $9E6E."
   ]
  },
  "9E6E": {
   "unit": "game/graphicsData9300",
   "block": [
    "cursorSquareShape - 18 bytes = six 24-pixel sprite rows drawing a 6x6 hollow square in the",
    "leftmost byte of each row.  setCursorShapeSquare ($2FCF) passes this address to",
    "installCursorShape, which blanks sprite 0 and copies these 18 bytes to $8A00, colours the sprite",
    "black and enables it.  Sprite 0 is the map cursor and is Y-expanded, so six rows cover a whole",
    "map cell.  Called whenever a unit is picked up or ordered ($2015, $4C53, $5E40, $5E87, $61F5,",
    "$6393).",
    "The survey listed $9E6E-$9E91 as unused spare shapes; the two 18-byte shapes here are both in",
    "use, reached by immediate address pairs that the cross-referencer cannot follow."
   ]
  },
  "9E80": {
   "unit": "game/graphicsData9300",
   "block": [
    "cursorCrossShape - the same 18-byte format, a 6x6 plus sign.  setCursorShapeCross ($2FF3) feeds",
    "it to the same installCursorShape tail; it replaces the square whenever the cursor is aiming a",
    "ranged attack (the cursor selector at $2195, on cursorTargetMode zp_BB)."
   ]
  },
  "9E92": {
   "unit": "game/graphicsData9300",
   "block": [
    "cursorBlockShape - 18 bytes, a small solid 4x4 block.  setCursorShapeBlock ($300C) copies these",
    "18 bytes into the shape of the sprite named by activeSpriteIndex ($8A00 + n*64) and colours it",
    "medium grey; it is the plain battlefield cursor ($21A8) and sprite 1's marker ($2550)."
   ]
  },
  "9EA4": {
   "unit": "game/graphicsData9300",
   "block": [
    "cursorBoxSprite - a complete 24x21 sprite (21 rows of 3 bytes): an 11x9 hollow rectangle in the",
    "middle of the sprite.  showCursorBoxSprite ($3306) copies it into sprite 2 by counting X from",
    "$3E down to 0 ($330A); it is the normal battlefield centre cursor.",
    "This shape and the crosshair that follows are stored back to back and are addressed as one",
    "63-byte pair from $9EA4."
   ]
  },
  "9EE3": {
   "unit": "game/graphicsData9300",
   "block": [
    "crosshairSprite - the second 63-byte shape of the pair: a diamond with a vertical stem above and",
    "below and a horizontal tick each side.  showCrosshairSprite ($3302) selects it by loading X with",
    "$7D, i.e. $9EA4 + $3F, and copying 63 bytes down into sprite 2; it marks the target of a shot."
   ]
  },
  "9F22": {
   "unit": "game/graphicsData9300",
   "block": [
    "comcenCrossMarkerShape - 21 bytes = seven sprite rows drawing a plus.  showComcenCrossMarker",
    "($338A, LDY #$14) copies them into rows 7-13 of sprite 2 at $8A95 and colours the sprite light",
    "red; overlay B calls it at $75B6 to mark the comcen on the strategic grid.  Only seven rows are",
    "written, so the rest of the sprite keeps whatever was there."
   ]
  },
  "9F37": {
   "unit": "game/graphicsData9300",
   "block": [
    "The circle generator's four pointer tables and its step count, 10 entries each, indexed by",
    "radius-1 (radii 1 to 10).  drawCircleInSprite ($3239) copies them into zero page: dx pointer",
    "-> zp_AD/AE ($323D/$3242), dy pointer -> zp_AF/B0 ($3247/$324C), step count -> circleStepsLeft",
    "($3251).  It then walks one octant and mirrors every point eight ways about the sprite centre",
    "(12,10) in computeCircleOctantPoints ($3266), plotting with the mode in spritePlotMode.  Used",
    "for unit range rings and the blob markers on the drone and missile screens ($3471, $3D13, $3D43,",
    "$7190-$71DA).",
    "circleDxPtrLoTable - low bytes of the ten dx lists: $9F69, $9F6F, $9F73, $9F79, $9F7F, $9F8B,",
    "$9F97, $9FA1, $9FAF, $9FBF.  This is one half of a split pointer table - the high bytes are in",
    "circleDxPtrHiTable at $9F41 - so it is left as bytes rather than typed as addresses."
   ],
   "line": "radii 1-10"
  },
  "9F41": {
   "unit": "game/graphicsData9300",
   "block": [
    "circleDxPtrHiTable - the high bytes of the same ten dx pointers, all $9F (every list lives in",
    "this page).  The low bytes are at $9F37; read at $3242."
   ],
   "line": "radii 1-10, all $9F"
  },
  "9F4B": {
   "unit": "game/graphicsData9300",
   "block": [
    "circleDyPtrLoTable - low bytes of the ten dy lists: $9F6C, $9F71, $9F76, $9F7C, $9F85, $9F91,",
    "$9F9C, $9FA8, $9FB7, $9FC8.  High bytes in circleDyPtrHiTable at $9F55; read at $3247."
   ],
   "line": "radii 1-10"
  },
  "9F55": {
   "unit": "game/graphicsData9300",
   "block": [
    "circleDyPtrHiTable - high bytes of the ten dy pointers, all $9F; read at $324C."
   ],
   "line": "radii 1-10, all $9F"
  },
  "9F5F": {
   "unit": "game/graphicsData9300",
   "block": [
    "circleStepCountTable - the index of the last point of each radius' octant, so the number of",
    "points is this value plus one: 3, 2, 3, 3, 6, 6, 5, 7, 8, 9 for radii 1 to 10.",
    "drawCircleInSprite loads it into circleStepsLeft ($91F2) at $3251 and counts down to zero, so",
    "radius 1 plots a filled 3x3 dot and radius 10 a ring that fills all 21 rows of the sprite."
   ],
   "line": "radii 1-10"
  },
  "9F69": {
   "unit": "game/graphicsData9300",
   "block": [
    "The twenty point lists themselves, laid out radius by radius with each radius' dx list",
    "immediately followed by its dy list, filling $9F69-$9FD0 exactly.  Point k of a radius is",
    "(dx[k], dy[k]) measured from the sprite centre (12,10); the plotter mirrors it into all eight",
    "octants, so a list of n points draws up to 8n pixels.  Each radius prints as two lines below,",
    "the dx list then the dy list.",
    "Radius 1: dx 00,01,01 / dy 00,00,01 - three points that mirror into a filled 3x3 dot"
   ],
   "line": "dx list, then dy list"
  },
  "9F6F": {
   "unit": "game/graphicsData9300",
   "block": [
    "Radius 2: dx 02,02 / dy 00,01"
   ],
   "line": "dx list, then dy list"
  },
  "9F73": {
   "unit": "game/graphicsData9300",
   "block": [
    "Radius 3: dx 03,03,02 / dy 00,01,02"
   ],
   "line": "dx list, then dy list"
  },
  "9F79": {
   "unit": "game/graphicsData9300",
   "block": [
    "Radius 4: dx 04,04,03 / dy 00,01,02"
   ],
   "line": "dx list, then dy list"
  },
  "9F7F": {
   "unit": "game/graphicsData9300",
   "block": [
    "Radius 5: dx 05,05,05,04,04,03 / dy 00,01,02,02,03,03"
   ],
   "line": "dx list, then dy list"
  },
  "9F8B": {
   "unit": "game/graphicsData9300",
   "block": [
    "Radius 6: dx 06,06,06,05,05,04 / dy 00,01,02,05,03,04 - the fourth point is wrong, see below",
    "Point 3 is (5,5), which is 7.07 from the centre while every other point of this list is",
    "within a pixel of 6; rendering the ring shows it as four stray dots just outside the circle.",
    "It looks like a typo for (5,3) in the original data (probably - nothing in the code corrects",
    "it, so the radius-6 ring really does draw them)."
   ],
   "line": "dx list, then dy list"
  },
  "9F97": {
   "unit": "game/graphicsData9300",
   "block": [
    "Radius 7: dx 07,07,07,06,05 / dy 00,01,02,03,04"
   ],
   "line": "dx list, then dy list"
  },
  "9FA1": {
   "unit": "game/graphicsData9300",
   "block": [
    "Radius 8: dx 08,08,08,07,06,06,05 / dy 00,01,02,03,04,05,05"
   ],
   "line": "dx list, then dy list"
  },
  "9FAF": {
   "unit": "game/graphicsData9300",
   "block": [
    "Radius 9: dx 09,09,09,08,08,07,07,06 / dy 00,01,02,03,04,04,05,06"
   ],
   "line": "dx list, then dy list"
  },
  "9FBF": {
   "unit": "game/graphicsData9300",
   "block": [
    "Radius 10: dx 0A,0A,0A,09,09,08,07,07,08 / dy 00,01,02,03,04,05,06,07,06"
   ],
   "line": "dx list, then dy list"
  },
  "9FD1": {
   "unit": "game/graphicsData9300",
   "block": [
    "graphicsBlockTail - the 47 bytes from the end of the circle lists to the end of track 28 sector",
    "12, which is where the block stops being data the game uses.  Nothing reads them: no label in",
    "$9F69-$9FFF is referenced from any file, and no code anywhere loads $9F as a pointer high byte",
    "except for the circle tables above.",
    "The bytes are 21 x $00, 18 x $FF and a handful of strays ($3F four times, $33, $C0, $F3, $30) in",
    "an alternating $FF,$00 pattern - a fragment of some bitmap, left in the mastering machine's",
    "memory when the sector was written.  The tail of the $8800 message block ($897F-$89FF) is filled",
    "with the same kind of alternating pattern, but the bytes are not identical, and this exact",
    "sequence appears nowhere else on the disk.",
    "The listing splits the run at $9FE8 only because the boot loader's title-screen RAM, which",
    "occupies the same addresses before the game loads, is labelled there."
   ],
   "line": "filler to the end of the sector"
  },
  "9FE8": {
   "unit": "game/graphicsData9300",
   "block": [
    "The last 24 bytes of the same filler run (see graphicsBlockTail above); $A000 is the end of the",
    "track 28 data block and the start of the bitmap."
   ]
  },
  "98C8": {
   "unit": "game/graphicsData9300",
   "block": [
    "Continuation of consoleFontMulticolour.  The break, and every 40 bytes from here on, is a row",
    "boundary of the title picture that shares these addresses, not a font boundary."
   ]
  },
  "9A80": {
   "unit": "game/graphicsData9300",
   "block": [
    "Last fragment of consoleFontMulticolour; the set ends at $9A95."
   ]
  },
  "9AA8": {
   "unit": "game/graphicsData9300",
   "block": [
    "Continuation of consoleFontHires; the breaks every 40 bytes are title-picture row boundaries."
   ]
  },
  "9C50": {
   "unit": "game/graphicsData9300",
   "block": [
    "Last fragment of consoleFontHires: the set ends at $9C6D, the last byte invertTextFonts flips."
   ]
  }
 },
 "dataTypes": {
  "9300": [
   "grid",
   3,
   3
  ],
  "9303": [
   "grid",
   3,
   3
  ],
  "9306": [
   "grid",
   19,
   19
  ],
  "9319": [
   "grid",
   3,
   3
  ],
  "931C": [
   "grid",
   3,
   3
  ],
  "931F": [
   "grid",
   19,
   19
  ],
  "9332": [
   "grid",
   3,
   3
  ],
  "9335": [
   "grid",
   10,
   10
  ],
  "933F": [
   "grid",
   27,
   27
  ],
  "935A": [
   "grid",
   3,
   3
  ],
  "935D": [
   "grid",
   10,
   10
  ],
  "9367": [
   "grid",
   27,
   27
  ],
  "9382": [
   "grid",
   3,
   3
  ],
  "9385": [
   "grid",
   3,
   3
  ],
  "9388": [
   "grid",
   19,
   19
  ],
  "939B": [
   "grid",
   3,
   3
  ],
  "939E": [
   "grid",
   3,
   3
  ],
  "93A1": [
   "grid",
   19,
   19
  ],
  "93B4": [
   "grid",
   114,
   16
  ],
  "9426": [
   "bitmap",
   48
  ],
  "9456": [
   "bitmap",
   112
  ],
  "94C6": [
   "bitmap",
   224
  ],
  "95A6": [
   "bitmap",
   16
  ],
  "95B6": [
   "bitmap",
   16
  ],
  "95C6": [
   "bitmap",
   16
  ],
  "95D6": [
   "bitmap",
   16
  ],
  "95E6": [
   "bitmap",
   8
  ],
  "95EE": [
   "bitmap",
   96
  ],
  "964E": [
   "bitmap",
   32
  ],
  "966E": [
   "bitmap",
   112
  ],
  "96DE": [
   "bitmap",
   24
  ],
  "96F6": [
   "bitmap",
   40
  ],
  "971E": [
   "bitmap",
   152
  ],
  "97B6": [
   "grid",
   2,
   2
  ],
  "97B8": [
   "grid",
   25,
   5
  ],
  "97D1": [
   "grid",
   2,
   2
  ],
  "97D3": [
   "grid",
   49,
   7
  ],
  "9804": [
   "grid",
   6,
   6
  ],
  "980A": [
   "grid",
   6,
   6
  ],
  "9810": [
   "grid",
   20,
   2
  ],
  "9824": [
   "grid",
   9,
   9
  ],
  "9828": [
   "grid",
   5,
   5
  ],
  "982D": [
   "grid",
   9,
   9
  ],
  "9836": [
   "grid",
   9,
   9
  ],
  "983F": [
   "grid",
   9,
   9
  ],
  "9848": [
   "grid",
   9,
   9
  ],
  "9850": [
   "grid",
   1,
   1
  ],
  "9851": [
   "grid",
   9,
   9
  ],
  "985A": [
   "grid",
   4,
   4
  ],
  "985E": [
   "grid",
   5,
   5
  ],
  "9863": [
   "grid",
   9,
   9
  ],
  "986C": [
   "grid",
   9,
   9
  ],
  "9875": [
   "grid",
   9,
   9
  ],
  "9878": [
   "grid",
   6,
   6
  ],
  "987E": [
   "grid",
   34,
   34
  ],
  "98A0": [
   "grid",
   30,
   30
  ],
  "98BE": [
   "bitmap",
   8
  ],
  "98C6": [
   "bitmap",
   80
  ],
  "9916": [
   "bitmap",
   208
  ],
  "99E6": [
   "bitmap",
   176
  ],
  "9A96": [
   "bitmap",
   8
  ],
  "9A9E": [
   "bitmap",
   80
  ],
  "9AEE": [
   "bitmap",
   208
  ],
  "9BBE": [
   "bitmap",
   176
  ],
  "9C6E": [
   "bitmap",
   8
  ],
  "9C76": [
   "bitmap",
   160
  ],
  "9D16": [
   "bitmap",
   64
  ],
  "9D56": [
   "bitmap",
   32
  ],
  "9D76": [
   "bitmap",
   32
  ],
  "9D96": [
   "bitmap",
   16
  ],
  "9DA6": [
   "bitmap",
   8
  ],
  "9DAE": [
   "bitmap",
   32
  ],
  "9DCE": [
   "bitmap",
   32
  ],
  "9DEE": [
   "bitmap",
   32
  ],
  "9E0E": [
   "bitmap",
   32
  ],
  "9E2E": [
   "bitmap",
   32
  ],
  "9E4E": [
   "bitmap",
   32
  ],
  "9E6E": [
   "sprite",
   18
  ],
  "9E80": [
   "sprite",
   18
  ],
  "9E92": [
   "sprite",
   18
  ],
  "9EA4": [
   "sprite",
   63
  ],
  "9EE3": [
   "sprite",
   63
  ],
  "9F22": [
   "sprite",
   21
  ],
  "9F37": [
   "grid",
   10,
   10
  ],
  "9F41": [
   "grid",
   10,
   10
  ],
  "9F4B": [
   "grid",
   10,
   10
  ],
  "9F55": [
   "grid",
   10,
   10
  ],
  "9F5F": [
   "grid",
   10,
   10
  ],
  "9F69": [
   "grid",
   6,
   3
  ],
  "9F6F": [
   "grid",
   4,
   2
  ],
  "9F73": [
   "grid",
   6,
   3
  ],
  "9F79": [
   "grid",
   6,
   3
  ],
  "9F7F": [
   "grid",
   12,
   6
  ],
  "9F8B": [
   "grid",
   12,
   6
  ],
  "9F97": [
   "grid",
   10,
   5
  ],
  "9FA1": [
   "grid",
   14,
   7
  ],
  "9FAF": [
   "grid",
   16,
   8
  ],
  "9FBF": [
   "grid",
   18,
   9
  ],
  "9FD1": [
   "grid",
   23,
   23
  ],
  "98C8": [
   "bitmap",
   6
  ],
  "98CE": [
   "bitmap",
   34
  ],
  "98F0": [
   "bitmap",
   6
  ],
  "98F6": [
   "bitmap",
   32
  ],
  "9918": [
   "bitmap",
   6
  ],
  "991E": [
   "bitmap",
   34
  ],
  "9940": [
   "bitmap",
   6
  ],
  "9946": [
   "bitmap",
   34
  ],
  "9968": [
   "bitmap",
   6
  ],
  "996E": [
   "bitmap",
   34
  ],
  "9990": [
   "bitmap",
   6
  ],
  "9996": [
   "bitmap",
   34
  ],
  "99B8": [
   "bitmap",
   6
  ],
  "99BE": [
   "bitmap",
   34
  ],
  "99E0": [
   "bitmap",
   6
  ],
  "9A08": [
   "bitmap",
   6
  ],
  "9A0E": [
   "bitmap",
   34
  ],
  "9A30": [
   "bitmap",
   6
  ],
  "9A36": [
   "bitmap",
   34
  ],
  "9A58": [
   "bitmap",
   6
  ],
  "9A5E": [
   "bitmap",
   34
  ],
  "9A80": [
   "bitmap",
   6
  ],
  "9A86": [
   "bitmap",
   16
  ],
  "9AA8": [
   "bitmap",
   6
  ],
  "9AAE": [
   "bitmap",
   34
  ],
  "9AD0": [
   "bitmap",
   6
  ],
  "9AD6": [
   "bitmap",
   24
  ],
  "9AF8": [
   "bitmap",
   6
  ],
  "9AFE": [
   "bitmap",
   34
  ],
  "9B20": [
   "bitmap",
   6
  ],
  "9B26": [
   "bitmap",
   34
  ],
  "9B48": [
   "bitmap",
   6
  ],
  "9B4E": [
   "bitmap",
   34
  ],
  "9B70": [
   "bitmap",
   6
  ],
  "9B76": [
   "bitmap",
   34
  ],
  "9B98": [
   "bitmap",
   6
  ],
  "9B9E": [
   "bitmap",
   32
  ],
  "9BC0": [
   "bitmap",
   6
  ],
  "9BC6": [
   "bitmap",
   34
  ],
  "9BE8": [
   "bitmap",
   6
  ],
  "9BEE": [
   "bitmap",
   18
  ],
  "9C00": [
   "bitmap",
   6
  ],
  "9C06": [
   "bitmap",
   74
  ],
  "9C50": [
   "bitmap",
   6
  ],
  "9C56": [
   "bitmap",
   24
  ]
 }
}
