1698 lines
50 KiB
JSON
1698 lines
50 KiB
JSON
{
|
|
"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
|
|
]
|
|
}
|
|
}
|