{
 "_comment": "generated by tools/mergeSurvey.py from survey/*.json - do not edit by hand",
 "notes": {
  "9300": {
   "unit": "game/graphicsData9300",
   "block": [
    "bitmapRowLoTable: byteTable, 25 bytes. Low bytes of the 25 bitmap character-row addresses $A000 + 320*row (values cycle $00,$40,$80,$C0). Read as bitmapRowLoTable,Y (Y = row 0-24) by calcCellPointersXY ($2AA3) and by plotBitmapPixelRow ($FC80) in the high-memory block; overlay B reads it biased by 3 ($9303, rows 3+) at $7BDA/$7C38."
   ]
  },
  "9319": {
   "unit": "game/graphicsData9300",
   "block": [
    "bitmapRowHiTable: byteTable, 25 bytes. High bytes of the same 25 row addresses: $A0,$A1,$A2,$A3,$A5,$A6,$A7,$A8,$AA,... (step $140 per row). Read at $2AAC and $FC87; biased alias $931C used by overlay B."
   ]
  },
  "9332": {
   "unit": "game/graphicsData9300",
   "block": [
    "bitmapColLoTable: byteTable, 40 bytes. Low bytes of column*8 for the 40 bitmap columns (0,8,...,312 mod 256). Read at $2AA7 and $FCAE; biased alias $9335 used by overlay B at $7BDD/$7C3B."
   ]
  },
  "935A": {
   "unit": "game/graphicsData9300",
   "block": [
    "bitmapColHiTable: byteTable, 40 bytes. High bytes of column*8: $00 for columns 0-31, $01 for columns 32-39. Read at $2AAF and $FCB5."
   ]
  },
  "9382": {
   "unit": "game/graphicsData9300",
   "block": [
    "screenRowLoTable: byteTable, 25 bytes. Low bytes of the 25 screen-RAM row addresses $8C00 + 40*row (0,$28,$50,...). Read by fillScreenColourRect ($2A71), calcCellPointersXY ($2AB6) and both $6F00 overlays at $82C1."
   ]
  },
  "939B": {
   "unit": "game/graphicsData9300",
   "block": [
    "screenRowHiTable: byteTable, 25 bytes. High bytes of the screen-RAM row addresses: $8C x7, $8D x6, $8E x7, $8F x5. Read at $2A6C, $2ABB and $82C6 in both $6F00 overlays. Colour RAM is reached by adding $4C to the high byte."
   ]
  },
  "93B4": {
   "unit": "game/graphicsData9300",
   "block": [
    "fontColorTable: byteTable, 114 bytes. Default screen-RAM colour byte for each of the 114 gameFont glyphs, same index as gameFont. Read by plotGlyph at $2AD6 only when textDrawParams ($2A29) is zero; a zero entry makes the plotter fall back to the explicit colour $2A2A. Values are packed nibble pairs, e.g. $BC, $FC, $6E for the diagonal shading glyphs $30-$37 and $BB/$FF for the heavy bevel glyphs $6A-$71."
   ]
  },
  "9426": {
   "unit": "game/graphicsData9300",
   "block": [
    "gameFont: charset, 912 bytes. 114 glyphs of 8x8 pixels, 8 bytes each, addressed as $9426 + code*8 by plotGlyph ($2AC8). This is not a text font: $00 blank, $01-$05 solid, $06-$13 single-pixel corner/edge pieces, $14-$2F the chunky diagonal / wedge shading set, $30-$33 the two halves of a tall 'N' and 'S' (stacked vertically) and $34-$37 a goalpost 'H' and a comb 'E' (two cells side by side), $38 a small hollow diamond, $39-$48 thin frame pieces, diagonals and the four double-line corners, $49-$56 the top and bottom halves of the ten tall digits 0-9 (see tallDigitGlyphPairTable), $57-$59 three narrow glyphs that together form a 24-pixel strip of small letters and are not reached from any table found so far, $5A-$5E vertical dither patterns, $5F-$71 the heavy raised-bevel frame set. Text on the battlefield screens is drawn with the separate 59-glyph sets at $98BE/$9A96, not with this one."
   ]
  },
  "97B6": {
   "unit": "game/graphicsData9300",
   "block": [
    "unreferencedGlyphCodeBlock: byteTable, 90 bytes. 90 bytes of valid gameFont glyph codes ($00,$02,$04,$05,$07,$14-$2F,$30-$38,$45-$48) sitting between gameFont and tallDigitGlyphPairTable. No traced code reads it: XREF.txt has no label anywhere in $9426-$980F, no instruction in any .s file carries an immediate $97 or $98 high byte, and a scan of the whole 64K runtime image finds no little-endian pointer into $97B6-$980F. Rendering it as 10x9, 9x10, 15x6, 6x15, 5x18 or 18x5 glyph grids, as 45 vertically stacked glyph pairs (the tallDigitGlyphPairTable format) and as ten 3x3 window frame sets (the $9824 format) all produce incoherent art, so the exact structure is unresolved; the value range says it is a screen-code layout of some kind, most likely leftover from an earlier build. (confidence: low on the interpretation, high on the fact that nothing reads it)"
   ]
  },
  "9810": {
   "unit": "game/graphicsData9300",
   "block": [
    "tallDigitGlyphPairTable: byteTable, 20 bytes. Ten 2-byte pairs, indexed by drawTallGlyph ($2BB7) as $9810 + symbol*2. The first code is drawn at row zp_18 and the second one row lower, so each pair forms a 8x16 pixel tall digit: 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 console panels."
   ]
  },
  "9824": {
   "unit": "game/graphicsData9300",
   "block": [
    "windowFrameTileSets: byteTable, 90 bytes. Ten 9-byte frame tile sets, each nine gameFont codes in row-major order (topLeft, top, topRight, left, centre, right, bottomLeft, bottom, bottomRight), selected through windowFramePtrTable ($2C49) and drawn by drawWindowFrame ($2BDD group) / drawFrameBox. $9824 = thin single box, $982D = thin box built from the $39-$40 pieces, $9836 = octagon with diagonal corners, $983F = solid box with diagonal shadow corners, $9848 = all $03 (solid fill), $9851 = all $00 (blank/erase), $985A = 50 percent dither box, $9863/$986C = heavy raised bevel with a dithered outer edge, $9875 = heavy solid bevel."
   ]
  },
  "987E": {
   "unit": "game/graphicsData9300",
   "block": [
    "asciiToGlyphTable: byteTable, 64 bytes. Character code $20-$5F -> gameFont glyph index, 64 entries. printChar ($C01A) reads it as asciiToGlyphTable,Y with Y = char - $20 ($C02A). The chat-line editor at $C80A reads exactly the same table through the biased base $985E with the raw character code in X and rejects the character when the entry is $3B, which is why XREF lists a second label $985E for it. Layout: space -> 0, digits '0'-'9' -> $01-$0A, 'A'-'Z' -> $0B-$24, punctuation to the small symbol glyphs, '[' -> $28, ']' -> $29, '\\', '^', '_' -> $3B (not typeable)."
   ]
  },
  "98BE": {
   "unit": "game/graphicsData9300",
   "block": [
    "consoleFontMulticolour: charset, 472 bytes. 59 glyphs of 8x8, 8 bytes each: the multicolour / double-width character set of the $C000 text plotter, selected when bit 4 of the $D016 shadow $9001 is set ($C20B). Every pixel is drawn as the bit pair %11 (byte values $00,$03,$0C,$0F,$30,$33,$3C,$3F). Order: 0 blank, 1-10 digits 0-9, 11-36 letters A-Z, 37-58 punctuation and arrows. Stored positive on disk and inverted in place at boot by invertTextFonts ($031B), which EORs $98BE-$9C6D with $FF."
   ]
  },
  "9A96": {
   "unit": "game/graphicsData9300",
   "block": [
    "consoleFontHires: charset, 472 bytes. The same 59 glyphs in single-width hires form ($9A96 = $98BE + $1D8), used when $9001 bit 4 is clear. Also inverted at boot by invertTextFonts."
   ]
  },
  "9C6E": {
   "unit": "game/graphicsData9300",
   "block": [
    "terrainTileShapes: charset, 352 bytes. 44 one-bit 8x8 terrain tiles, 8 bytes each, addressed as $9C6E + index*8 by setTerrainTilePtr ($2DBD). The index is mapCell - $40, or mapCell - $20 when the cell is below $40 ($27B2), so the lower contour codes $21-$34 and the upper contour codes $41-$54 share tiles $01-$14. Tiles: $00 blank ground, $01-$14 contour/ridge line segments, $15-$18 the four quadrants of a small round blob and $19-$1C its filled forms (river, cells $55-$5C), $1D-$20 dense noise (forest, $5D-$60), $21-$24 sparse dots (lower hill, $61-$64), $25-$26 very sparse dots (summit, $65-$66), $27 a boxed cross (the recycler, $67), $28-$2B four checkerboard blocks (end-zone/goal cells $68-$6B). The main program doubles each nybble through nybbleToMulticolourTable to draw them 16x16 in the tactical view; overlay B's drawRadarGlyph ($7396) uses the same base for the radar screens."
   ]
  },
  "9DCE": {
   "unit": "game/graphicsData9300",
   "block": [
    "unitSymbolShapes: charset, 160 bytes. 20 one-bit 8x8 unit symbols continuing the $9C6E table at indices $2C-$3F: five unit types x four facings, matching unitGlyphBaseTable at $0799 ($2C GRUNT, $30 RIDER, $34 BOOMER, $38 SPY, $3C COMCEN, plus unitFlags AND 3). They are the small single-cell symbols; the big 16x16 multicolour versions live at $6C5D in the main program."
   ]
  },
  "9E6E": {
   "unit": "game/graphicsData9300",
   "block": [
    "spareCursorShapes: sprite, 36 bytes. Two 18-byte sprite fragments in the same format as cursorBlockShape: six 24-pixel rows drawing a 6x6 hollow box ($9E6E) and a 6x6 plus/cross ($9E80). Nothing in the disassembly reads them - they look like alternative cursor shapes kept next to the one that is used. (confidence: medium)"
   ]
  },
  "9E92": {
   "unit": "game/graphicsData9300",
   "block": [
    "cursorBlockShape: sprite, 18 bytes. 18 bytes = six 3-byte sprite rows drawing a small solid 4x4 block. setCursorShapeBlock ($2FFA) copies exactly $12 bytes from here into the top of sprite $91CC's shape ($8A00 + n*64) for the plain battlefield cursor."
   ]
  },
  "9EA4": {
   "unit": "game/graphicsData9300",
   "block": [
    "cursorBoxSprite: sprite, 63 bytes. One complete 24x21 sprite (21 rows of 3 bytes): an 11x9 hollow rectangle centred in the sprite. showCursorBoxSprite ($3306) copies it into sprite 2 with X counting $3E..0; it is the normal battlefield centre cursor."
   ]
  },
  "9EE3": {
   "unit": "game/graphicsData9300",
   "block": [
    "crosshairSprite: sprite, 63 bytes. One complete 24x21 sprite: a diamond crosshair with a vertical stem above and below and horizontal ticks. showCrosshairSprite ($3302) copies it into sprite 2 by loading X with $7D (= $9EA4 + $3F)."
   ]
  },
  "9F22": {
   "unit": "game/graphicsData9300",
   "block": [
    "comcenCrossMarkerShape: sprite, 21 bytes. 21 bytes = seven 3-byte sprite rows drawing a plus/cross marker. showComcenCrossMarker ($3383) copies it (LDY #$14, 21 bytes) into rows 7-13 of sprite 2 at $8A95 and colours it light red; overlay B calls it at $75B6 to mark the comcen on the strategic grid."
   ]
  },
  "9F37": {
   "unit": "game/graphicsData9300",
   "block": [
    "circleDxPtrLoTable: byteTable, 10 bytes. Low bytes of the ten dx point-list pointers used by drawCircleInSprite ($3239), indexed by radius-1: $9F69,$9F6F,$9F73,$9F79,$9F7F,$9F8B,$9F97,$9FA1,$9FAF,$9FBF. Read at $323D into zp_AD."
   ]
  },
  "9F41": {
   "unit": "game/graphicsData9300",
   "block": [
    "circleDxPtrHiTable: byteTable, 10 bytes. High bytes of the dx pointers, all $9F. Read at $3242 into zp_AE."
   ]
  },
  "9F4B": {
   "unit": "game/graphicsData9300",
   "block": [
    "circleDyPtrLoTable: byteTable, 10 bytes. Low bytes of the ten dy point-list pointers: $9F6C,$9F71,$9F76,$9F7C,$9F85,$9F91,$9F9C,$9FA8,$9FB7,$9FC8. Read at $3247 into zp_AF."
   ]
  },
  "9F55": {
   "unit": "game/graphicsData9300",
   "block": [
    "circleDyPtrHiTable: byteTable, 10 bytes. High bytes of the dy pointers, all $9F. Read at $324C into zp_B0."
   ]
  },
  "9F5F": {
   "unit": "game/graphicsData9300",
   "block": [
    "circleStepCountTable: byteTable, 10 bytes. Highest point index of each circle radius 1-10: 2,1,2,2,5,5,4,6,7,8. drawCircleInSprite loads it into circleStepsLeft ($91F2) at $3251 and counts down to 0, so radius 1 plots 3 points (a filled 3x3 dot) and radius 10 plots 9."
   ]
  },
  "9F69": {
   "unit": "game/graphicsData9300",
   "block": [
    "circlePointDeltaLists: byteTable, 104 bytes. The ten dx lists and ten dy lists themselves, interleaved so that each radius' dx list is immediately followed by its dy list (radius 1: dx $9F69 = 00,01,01 / dy $9F6C = 00,00,01; radius 10: dx $9FBF = 0A,0A,0A,09,09,08,07,07,08 / dy $9FC8 = 00,01,02,03,04,05,06,07,06). computeCircleOctantPoints reflects each (dx,dy) into the eight octants around the sprite centre (12,10)."
   ]
  },
  "9FD1": {
   "unit": "game/graphicsData9300",
   "block": [
    "graphicsBlockTail: unknown, 47 bytes. 47 bytes to the end of track 28 sector 12, not referenced by anything. Byte-for-byte a 50 percent dither: alternating $FF/$00 pairs whose phase flips every eight bytes, with a handful of stray values ($3F,$33,$C0,$F3,$30). The identical pattern appears in the tail of the $8800 block ($897F-$89FF, track 29 sector 10), so both are almost certainly the same stale bitmap fragment left in the mastering machine's memory. (confidence: medium)"
   ]
  }
 }
}