modemwars/disassembly/game/graphicsData9300.s
2026-08-23 02:09:40 -05:00

3433 lines
177 KiB
ArmAsm

; ============================================================================
; $9300-$9FFF - screen address tables, fonts, terrain and unit graphics (track 28 sectors 0-12)
; ============================================================================
.setcpu "6502"
.include "c64.inc"
.include "zeropage.inc"
.org $9300
; 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).
bitmapRowLoTable:
.byte $00,$40,$80 ; 9300 .@.
; 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.
bitmapRowLoTableFrom3:
.byte $C0,$00,$40 ; 9303 ..@ rows 3-5
; 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.
bitmapRowLoTableFrom6:
.byte $80,$C0,$00,$40,$80,$C0,$00,$40,$80,$C0,$00,$40,$80,$C0,$00,$40,$80,$C0,$00; 9306 ...@...@...@...@... rows 6-24
; 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.
bitmapRowHiTable:
.byte $A0,$A1,$A2 ; 9319 ...
; Rows 3-24 (window base row 3): read at $5DBA and at $7BE2/$7C40 in the $6F00 overlays.
bitmapRowHiTableFrom3:
.byte $A3,$A5,$A6 ; 931C ... rows 3-5
; Rows 6-24 (drone camera base row 6): read at $7446 and $74A7 in the $6F00 overlays.
bitmapRowHiTableFrom6:
.byte $A7,$A8,$AA,$AB,$AC,$AD,$AF,$B0,$B1,$B2,$B4,$B5,$B6,$B7,$B9,$BA,$BB,$BC,$BE; 931F ................... rows 6-24
; 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.
bitmapColLoTable:
.byte $00,$08,$10 ; 9332 ...
; 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.
bitmapColLoTableFrom3:
.byte $18,$20,$28,$30,$38,$40,$48,$50,$58,$60; 9335 . (08@HPX` columns 3-12
; Columns 13-39, the base of the drone camera window at character column 13: read at $7441 and $74A2
; in both $6F00 overlays.
bitmapColLoTableFrom13:
.byte $68,$70,$78,$80,$88,$90,$98,$A0,$A8,$B0,$B8,$C0,$C8,$D0,$D8,$E0,$E8,$F0,$F8,$00,$08,$10,$18,$20,$28,$30,$38; 933F hpx.................... (08 columns 13-39
; 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.
bitmapColHiTable:
.byte $00,$00,$00 ; 935A ...
; Columns 3-39: read at $5DBD and at $7BE5/$7C43 in both $6F00 overlays.
bitmapColHiTableFrom3:
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00; 935D .......... columns 3-12
; Columns 13-39: read at $7449 and $74AA in both $6F00 overlays.
bitmapColHiTableFrom13:
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$01,$01,$01,$01,$01,$01,$01,$01; 9367 ........................... columns 13-39
; 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.
screenRowLoTable:
.byte $00,$28,$50 ; 9382 .(P
; Rows 3-24 (window base row 3): read at $5DC3 and at $78E9/$7BEB in both $6F00 overlays.
screenRowLoTableFrom3:
.byte $78,$A0,$C8 ; 9385 x.. rows 3-5
; Rows 6-24 (drone camera base row 6): read at $744F in both $6F00 overlays.
screenRowLoTableFrom6:
.byte $F0,$18,$40,$68,$90,$B8,$E0,$08,$30,$58,$80,$A8,$D0,$F8,$20,$48,$70,$98,$C0; 9388 ..@h....0X.... Hp.. rows 6-24
; 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.
screenRowHiTable:
.byte $8C,$8C,$8C ; 939B ...
; Rows 3-24: read at $5DCA and at $78F2/$7BF2 in both $6F00 overlays.
screenRowHiTableFrom3:
.byte $8C,$8C,$8C ; 939E ... rows 3-5
; Rows 6-24: read at $7456 in both $6F00 overlays.
screenRowHiTableFrom6:
.byte $8C,$8D,$8D,$8D,$8D,$8D,$8D,$8E,$8E,$8E,$8E,$8E,$8E,$8E,$8F,$8F,$8F,$8F,$8F; 93A1 ................... rows 6-24
; 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.
fontColorTable:
.byte $10,$1C,$FC,$CC,$BC,$0C,$BC,$BC,$BC,$FC,$BC,$FC,$BC,$FC,$FC,$BC; 93B4 ................
.byte $BC,$BC,$FC,$BC,$BC,$BC,$BC,$BE,$BE,$BC,$BE,$BC,$BC,$BE,$BE,$BC; 93C4 ................
.byte $BE,$BC,$BC,$BE,$BC,$BE,$BE,$BC,$BC,$BE,$BC,$BE,$BE,$BC,$BC,$BC; 93D4 ................
.byte $6E,$6E,$6E,$6E,$6E,$6E,$6E,$6E,$BC,$FC,$FC,$FC,$BC,$FC,$BC,$FC; 93E4 nnnnnnnn........
.byte $BC,$0B,$BF,$FB,$CF,$02,$02,$02,$02,$15,$15,$BC,$FC,$FC,$FC,$BC; 93F4 ................
.byte $FC,$BC,$FC,$BC,$0C,$0B,$BF,$FB,$CF,$02,$1B,$FB,$F1,$1B,$F1,$FB; 9404 ................
.byte $FB,$FB,$FB,$BB,$FB,$BB,$BB,$FB,$BB,$BB,$BB,$BB,$BB,$BB,$FF,$BB; 9414 ................
.byte $FF,$FF ; 9424 ..
; 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).
gameFont:
.byte $00 ; 9426 ........
.byte $00 ; 9427 ........
.byte $00 ; 9428 ........
.byte $00 ; 9429 ........
.byte $00 ; 942A ........
.byte $00 ; 942B ........
.byte $00 ; 942C ........
.byte $00 ; 942D ........
.byte $FF ; 942E ########
.byte $FF ; 942F ########
.byte $FF ; 9430 ########
.byte $FF ; 9431 ########
.byte $FF ; 9432 ########
.byte $FF ; 9433 ########
.byte $FF ; 9434 ########
.byte $FF ; 9435 ########
.byte $FF ; 9436 ########
.byte $FF ; 9437 ########
.byte $FF ; 9438 ########
.byte $FF ; 9439 ########
.byte $FF ; 943A ########
.byte $FF ; 943B ########
.byte $FF ; 943C ########
.byte $FF ; 943D ########
.byte $FF ; 943E ########
.byte $FF ; 943F ########
.byte $FF ; 9440 ########
.byte $FF ; 9441 ########
.byte $FF ; 9442 ########
.byte $FF ; 9443 ########
.byte $FF ; 9444 ########
.byte $FF ; 9445 ########
.byte $FF ; 9446 ########
.byte $FF ; 9447 ########
.byte $FF ; 9448 ########
.byte $FF ; 9449 ########
.byte $FF ; 944A ########
.byte $FF ; 944B ########
.byte $FF ; 944C ########
.byte $FF ; 944D ########
.byte $FF ; 944E ########
.byte $FF ; 944F ########
.byte $FF ; 9450 ########
.byte $FF ; 9451 ########
.byte $FF ; 9452 ########
.byte $FF ; 9453 ########
.byte $FF ; 9454 ########
.byte $FF ; 9455 ########
; 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).
gameFontFramePieces:
.byte $00 ; 9456 ........
.byte $00 ; 9457 ........
.byte $00 ; 9458 ........
.byte $00 ; 9459 ........
.byte $00 ; 945A ........
.byte $00 ; 945B ........
.byte $00 ; 945C ........
.byte $03 ; 945D ......##
.byte $00 ; 945E ........
.byte $00 ; 945F ........
.byte $00 ; 9460 ........
.byte $00 ; 9461 ........
.byte $00 ; 9462 ........
.byte $00 ; 9463 ........
.byte $00 ; 9464 ........
.byte $C0 ; 9465 ##......
.byte $03 ; 9466 ......##
.byte $00 ; 9467 ........
.byte $00 ; 9468 ........
.byte $00 ; 9469 ........
.byte $00 ; 946A ........
.byte $00 ; 946B ........
.byte $00 ; 946C ........
.byte $00 ; 946D ........
.byte $C0 ; 946E ##......
.byte $00 ; 946F ........
.byte $00 ; 9470 ........
.byte $00 ; 9471 ........
.byte $00 ; 9472 ........
.byte $00 ; 9473 ........
.byte $00 ; 9474 ........
.byte $00 ; 9475 ........
.byte $00 ; 9476 ........
.byte $00 ; 9477 ........
.byte $00 ; 9478 ........
.byte $00 ; 9479 ........
.byte $00 ; 947A ........
.byte $00 ; 947B ........
.byte $00 ; 947C ........
.byte $FF ; 947D ########
.byte $FF ; 947E ########
.byte $00 ; 947F ........
.byte $00 ; 9480 ........
.byte $00 ; 9481 ........
.byte $00 ; 9482 ........
.byte $00 ; 9483 ........
.byte $00 ; 9484 ........
.byte $00 ; 9485 ........
.byte $03 ; 9486 ......##
.byte $03 ; 9487 ......##
.byte $03 ; 9488 ......##
.byte $03 ; 9489 ......##
.byte $03 ; 948A ......##
.byte $03 ; 948B ......##
.byte $03 ; 948C ......##
.byte $03 ; 948D ......##
.byte $C0 ; 948E ##......
.byte $C0 ; 948F ##......
.byte $C0 ; 9490 ##......
.byte $C0 ; 9491 ##......
.byte $C0 ; 9492 ##......
.byte $C0 ; 9493 ##......
.byte $C0 ; 9494 ##......
.byte $C0 ; 9495 ##......
.byte $01 ; 9496 .......#
.byte $02 ; 9497 ......#.
.byte $04 ; 9498 .....#..
.byte $08 ; 9499 ....#...
.byte $10 ; 949A ...#....
.byte $20 ; 949B ..#.....
.byte $40 ; 949C .#......
.byte $80 ; 949D #.......
.byte $01 ; 949E .......#
.byte $02 ; 949F ......#.
.byte $04 ; 94A0 .....#..
.byte $08 ; 94A1 ....#...
.byte $10 ; 94A2 ...#....
.byte $20 ; 94A3 ..#.....
.byte $40 ; 94A4 .#......
.byte $80 ; 94A5 #.......
.byte $80 ; 94A6 #.......
.byte $40 ; 94A7 .#......
.byte $20 ; 94A8 ..#.....
.byte $10 ; 94A9 ...#....
.byte $08 ; 94AA ....#...
.byte $04 ; 94AB .....#..
.byte $02 ; 94AC ......#.
.byte $01 ; 94AD .......#
.byte $80 ; 94AE #.......
.byte $40 ; 94AF .#......
.byte $20 ; 94B0 ..#.....
.byte $10 ; 94B1 ...#....
.byte $08 ; 94B2 ....#...
.byte $04 ; 94B3 .....#..
.byte $02 ; 94B4 ......#.
.byte $01 ; 94B5 .......#
.byte $80 ; 94B6 #.......
.byte $80 ; 94B7 #.......
.byte $80 ; 94B8 #.......
.byte $80 ; 94B9 #.......
.byte $80 ; 94BA #.......
.byte $80 ; 94BB #.......
.byte $80 ; 94BC #.......
.byte $80 ; 94BD #.......
.byte $01 ; 94BE .......#
.byte $01 ; 94BF .......#
.byte $01 ; 94C0 .......#
.byte $01 ; 94C1 .......#
.byte $01 ; 94C2 .......#
.byte $01 ; 94C3 .......#
.byte $01 ; 94C4 .......#
.byte $01 ; 94C5 .......#
; 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.
gameFontDialArcs:
.byte $00 ; 94C6 ........
.byte $00 ; 94C7 ........
.byte $00 ; 94C8 ........
.byte $01 ; 94C9 .......#
.byte $07 ; 94CA .....###
.byte $0F ; 94CB ....####
.byte $1F ; 94CC ...#####
.byte $7F ; 94CD .#######
.byte $00 ; 94CE ........
.byte $0F ; 94CF ....####
.byte $7F ; 94D0 .#######
.byte $FF ; 94D1 ########
.byte $FF ; 94D2 ########
.byte $FF ; 94D3 ########
.byte $FF ; 94D4 ########
.byte $FF ; 94D5 ########
.byte $00 ; 94D6 ........
.byte $01 ; 94D7 .......#
.byte $03 ; 94D8 ......##
.byte $03 ; 94D9 ......##
.byte $07 ; 94DA .....###
.byte $0F ; 94DB ....####
.byte $0F ; 94DC ....####
.byte $1F ; 94DD ...#####
.byte $FF ; 94DE ########
.byte $FF ; 94DF ########
.byte $FF ; 94E0 ########
.byte $FF ; 94E1 ########
.byte $FE ; 94E2 #######.
.byte $FC ; 94E3 ######..
.byte $F8 ; 94E4 #####...
.byte $F0 ; 94E5 ####....
.byte $FC ; 94E6 ######..
.byte $F0 ; 94E7 ####....
.byte $C0 ; 94E8 ##......
.byte $00 ; 94E9 ........
.byte $00 ; 94EA ........
.byte $00 ; 94EB ........
.byte $00 ; 94EC ........
.byte $00 ; 94ED ........
.byte $1F ; 94EE ...#####
.byte $3F ; 94EF ..######
.byte $3F ; 94F0 ..######
.byte $7F ; 94F1 .#######
.byte $7F ; 94F2 .#######
.byte $7F ; 94F3 .#######
.byte $7F ; 94F4 .#######
.byte $FF ; 94F5 ########
.byte $E0 ; 94F6 ###.....
.byte $E0 ; 94F7 ###.....
.byte $C0 ; 94F8 ##......
.byte $C0 ; 94F9 ##......
.byte $80 ; 94FA #.......
.byte $80 ; 94FB #.......
.byte $80 ; 94FC #.......
.byte $00 ; 94FD ........
.byte $80 ; 94FE #.......
.byte $F8 ; 94FF #####...
.byte $FE ; 9500 #######.
.byte $FF ; 9501 ########
.byte $FF ; 9502 ########
.byte $FF ; 9503 ########
.byte $FF ; 9504 ########
.byte $FF ; 9505 ########
.byte $00 ; 9506 ........
.byte $00 ; 9507 ........
.byte $00 ; 9508 ........
.byte $80 ; 9509 #.......
.byte $E0 ; 950A ###.....
.byte $F0 ; 950B ####....
.byte $FC ; 950C ######..
.byte $FE ; 950D #######.
.byte $7F ; 950E .#######
.byte $0F ; 950F ....####
.byte $03 ; 9510 ......##
.byte $00 ; 9511 ........
.byte $00 ; 9512 ........
.byte $00 ; 9513 ........
.byte $00 ; 9514 ........
.byte $00 ; 9515 ........
.byte $FF ; 9516 ########
.byte $FF ; 9517 ########
.byte $FF ; 9518 ########
.byte $FF ; 9519 ########
.byte $7F ; 951A .#######
.byte $3F ; 951B ..######
.byte $1F ; 951C ...#####
.byte $0F ; 951D ....####
.byte $00 ; 951E ........
.byte $80 ; 951F #.......
.byte $80 ; 9520 #.......
.byte $C0 ; 9521 ##......
.byte $E0 ; 9522 ###.....
.byte $F0 ; 9523 ####....
.byte $F0 ; 9524 ####....
.byte $F8 ; 9525 #####...
.byte $07 ; 9526 .....###
.byte $07 ; 9527 .....###
.byte $03 ; 9528 ......##
.byte $03 ; 9529 ......##
.byte $01 ; 952A .......#
.byte $01 ; 952B .......#
.byte $00 ; 952C ........
.byte $00 ; 952D ........
.byte $F8 ; 952E #####...
.byte $FC ; 952F ######..
.byte $FC ; 9530 ######..
.byte $FC ; 9531 ######..
.byte $FE ; 9532 #######.
.byte $FE ; 9533 #######.
.byte $FE ; 9534 #######.
.byte $FE ; 9535 #######.
.byte $7F ; 9536 .#######
.byte $7F ; 9537 .#######
.byte $7F ; 9538 .#######
.byte $7F ; 9539 .#######
.byte $3F ; 953A ..######
.byte $3F ; 953B ..######
.byte $3F ; 953C ..######
.byte $1F ; 953D ...#####
.byte $00 ; 953E ........
.byte $00 ; 953F ........
.byte $80 ; 9540 #.......
.byte $80 ; 9541 #.......
.byte $C0 ; 9542 ##......
.byte $C0 ; 9543 ##......
.byte $E0 ; 9544 ###.....
.byte $E0 ; 9545 ###.....
.byte $1F ; 9546 ...#####
.byte $0F ; 9547 ....####
.byte $0F ; 9548 ....####
.byte $07 ; 9549 .....###
.byte $03 ; 954A ......##
.byte $01 ; 954B .......#
.byte $01 ; 954C .......#
.byte $00 ; 954D ........
.byte $F0 ; 954E ####....
.byte $F8 ; 954F #####...
.byte $FC ; 9550 ######..
.byte $FE ; 9551 #######.
.byte $FF ; 9552 ########
.byte $FF ; 9553 ########
.byte $FF ; 9554 ########
.byte $FF ; 9555 ########
.byte $00 ; 9556 ........
.byte $00 ; 9557 ........
.byte $00 ; 9558 ........
.byte $00 ; 9559 ........
.byte $00 ; 955A ........
.byte $C0 ; 955B ##......
.byte $F0 ; 955C ####....
.byte $FE ; 955D #######.
.byte $7F ; 955E .#######
.byte $3F ; 955F ..######
.byte $0F ; 9560 ....####
.byte $07 ; 9561 .....###
.byte $01 ; 9562 .......#
.byte $00 ; 9563 ........
.byte $00 ; 9564 ........
.byte $00 ; 9565 ........
.byte $FF ; 9566 ########
.byte $FF ; 9567 ########
.byte $FF ; 9568 ########
.byte $FF ; 9569 ########
.byte $FF ; 956A ########
.byte $7F ; 956B .#######
.byte $1F ; 956C ...#####
.byte $01 ; 956D .......#
.byte $00 ; 956E ........
.byte $01 ; 956F .......#
.byte $01 ; 9570 .......#
.byte $01 ; 9571 .......#
.byte $03 ; 9572 ......##
.byte $03 ; 9573 ......##
.byte $07 ; 9574 .....###
.byte $07 ; 9575 .....###
.byte $FF ; 9576 ########
.byte $FE ; 9577 #######.
.byte $FE ; 9578 #######.
.byte $FE ; 9579 #######.
.byte $FE ; 957A #######.
.byte $FC ; 957B ######..
.byte $FC ; 957C ######..
.byte $F8 ; 957D #####...
.byte $00 ; 957E ........
.byte $00 ; 957F ........
.byte $00 ; 9580 ........
.byte $00 ; 9581 ........
.byte $00 ; 9582 ........
.byte $03 ; 9583 ......##
.byte $0F ; 9584 ....####
.byte $3F ; 9585 ..######
.byte $0F ; 9586 ....####
.byte $1F ; 9587 ...#####
.byte $3F ; 9588 ..######
.byte $7F ; 9589 .#######
.byte $FF ; 958A ########
.byte $FF ; 958B ########
.byte $FF ; 958C ########
.byte $FF ; 958D ########
.byte $F8 ; 958E #####...
.byte $F0 ; 958F ####....
.byte $F0 ; 9590 ####....
.byte $E0 ; 9591 ###.....
.byte $C0 ; 9592 ##......
.byte $C0 ; 9593 ##......
.byte $80 ; 9594 #.......
.byte $00 ; 9595 ........
.byte $FF ; 9596 ########
.byte $FF ; 9597 ########
.byte $FF ; 9598 ########
.byte $FF ; 9599 ########
.byte $FF ; 959A ########
.byte $FE ; 959B #######.
.byte $F0 ; 959C ####....
.byte $00 ; 959D ........
.byte $FE ; 959E #######.
.byte $F8 ; 959F #####...
.byte $F0 ; 95A0 ####....
.byte $E0 ; 95A1 ###.....
.byte $80 ; 95A2 #.......
.byte $00 ; 95A3 ........
.byte $00 ; 95A4 ........
.byte $00 ; 95A5 ........
; 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).
gameFontCompassN:
.byte $00 ; 95A6 ........
.byte $00 ; 95A7 ........
.byte $C3 ; 95A8 ##....##
.byte $E3 ; 95A9 ###...##
.byte $F3 ; 95AA ####..##
.byte $FB ; 95AB #####.##
.byte $DF ; 95AC ##.#####
.byte $CF ; 95AD ##..####
.byte $C7 ; 95AE ##...###
.byte $C3 ; 95AF ##....##
.byte $00 ; 95B0 ........
.byte $00 ; 95B1 ........
.byte $00 ; 95B2 ........
.byte $00 ; 95B3 ........
.byte $00 ; 95B4 ........
.byte $00 ; 95B5 ........
; $32 over $33 = 'S' (pixel rows 6-13 of the two stacked cells).
gameFontCompassS:
.byte $00 ; 95B6 ........
.byte $00 ; 95B7 ........
.byte $00 ; 95B8 ........
.byte $00 ; 95B9 ........
.byte $00 ; 95BA ........
.byte $00 ; 95BB ........
.byte $7E ; 95BC .######.
.byte $C3 ; 95BD ##....##
.byte $C0 ; 95BE ##......
.byte $7E ; 95BF .######.
.byte $03 ; 95C0 ......##
.byte $03 ; 95C1 ......##
.byte $C3 ; 95C2 ##....##
.byte $7E ; 95C3 .######.
.byte $00 ; 95C4 ........
.byte $00 ; 95C5 ........
; $34 beside $35 = 'W' (pixel columns 2-9 of the two cells side by side).
gameFontCompassW:
.byte $30 ; 95C6 ..##....
.byte $30 ; 95C7 ..##....
.byte $30 ; 95C8 ..##....
.byte $30 ; 95C9 ..##....
.byte $36 ; 95CA ..##.##.
.byte $3F ; 95CB ..######
.byte $39 ; 95CC ..###..#
.byte $30 ; 95CD ..##....
.byte $C0 ; 95CE ##......
.byte $C0 ; 95CF ##......
.byte $C0 ; 95D0 ##......
.byte $C0 ; 95D1 ##......
.byte $C0 ; 95D2 ##......
.byte $C0 ; 95D3 ##......
.byte $C0 ; 95D4 ##......
.byte $C0 ; 95D5 ##......
; $36 beside $37 = 'E' (pixel columns 6-13 of the two cells side by side).
gameFontCompassE:
.byte $03 ; 95D6 ......##
.byte $03 ; 95D7 ......##
.byte $03 ; 95D8 ......##
.byte $03 ; 95D9 ......##
.byte $03 ; 95DA ......##
.byte $03 ; 95DB ......##
.byte $03 ; 95DC ......##
.byte $03 ; 95DD ......##
.byte $F8 ; 95DE #####...
.byte $00 ; 95DF ........
.byte $00 ; 95E0 ........
.byte $E0 ; 95E1 ###.....
.byte $00 ; 95E2 ........
.byte $00 ; 95E3 ........
.byte $00 ; 95E4 ........
.byte $F8 ; 95E5 #####...
; 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.
gameFontCornerMark:
.byte $00 ; 95E6 ........
.byte $00 ; 95E7 ........
.byte $18 ; 95E8 ...##...
.byte $24 ; 95E9 ..#..#..
.byte $24 ; 95EA ..#..#..
.byte $18 ; 95EB ...##...
.byte $00 ; 95EC ........
.byte $00 ; 95ED ........
; 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).
gameFontFramePiecesAlt:
.byte $00 ; 95EE ........
.byte $00 ; 95EF ........
.byte $00 ; 95F0 ........
.byte $00 ; 95F1 ........
.byte $00 ; 95F2 ........
.byte $00 ; 95F3 ........
.byte $00 ; 95F4 ........
.byte $03 ; 95F5 ......##
.byte $00 ; 95F6 ........
.byte $00 ; 95F7 ........
.byte $00 ; 95F8 ........
.byte $00 ; 95F9 ........
.byte $00 ; 95FA ........
.byte $00 ; 95FB ........
.byte $00 ; 95FC ........
.byte $C0 ; 95FD ##......
.byte $03 ; 95FE ......##
.byte $00 ; 95FF ........
.byte $00 ; 9600 ........
.byte $00 ; 9601 ........
.byte $00 ; 9602 ........
.byte $00 ; 9603 ........
.byte $00 ; 9604 ........
.byte $00 ; 9605 ........
.byte $C0 ; 9606 ##......
.byte $00 ; 9607 ........
.byte $00 ; 9608 ........
.byte $00 ; 9609 ........
.byte $00 ; 960A ........
.byte $00 ; 960B ........
.byte $00 ; 960C ........
.byte $00 ; 960D ........
.byte $00 ; 960E ........
.byte $00 ; 960F ........
.byte $00 ; 9610 ........
.byte $00 ; 9611 ........
.byte $00 ; 9612 ........
.byte $00 ; 9613 ........
.byte $00 ; 9614 ........
.byte $FF ; 9615 ########
.byte $FF ; 9616 ########
.byte $00 ; 9617 ........
.byte $00 ; 9618 ........
.byte $00 ; 9619 ........
.byte $00 ; 961A ........
.byte $00 ; 961B ........
.byte $00 ; 961C ........
.byte $00 ; 961D ........
.byte $03 ; 961E ......##
.byte $03 ; 961F ......##
.byte $03 ; 9620 ......##
.byte $03 ; 9621 ......##
.byte $03 ; 9622 ......##
.byte $03 ; 9623 ......##
.byte $03 ; 9624 ......##
.byte $03 ; 9625 ......##
.byte $C0 ; 9626 ##......
.byte $C0 ; 9627 ##......
.byte $C0 ; 9628 ##......
.byte $C0 ; 9629 ##......
.byte $C0 ; 962A ##......
.byte $C0 ; 962B ##......
.byte $C0 ; 962C ##......
.byte $C0 ; 962D ##......
.byte $80 ; 962E #.......
.byte $40 ; 962F .#......
.byte $20 ; 9630 ..#.....
.byte $10 ; 9631 ...#....
.byte $08 ; 9632 ....#...
.byte $04 ; 9633 .....#..
.byte $02 ; 9634 ......#.
.byte $01 ; 9635 .......#
.byte $FF ; 9636 ########
.byte $FE ; 9637 #######.
.byte $FC ; 9638 ######..
.byte $F8 ; 9639 #####...
.byte $F0 ; 963A ####....
.byte $E0 ; 963B ###.....
.byte $C0 ; 963C ##......
.byte $80 ; 963D #.......
.byte $01 ; 963E .......#
.byte $03 ; 963F ......##
.byte $07 ; 9640 .....###
.byte $0F ; 9641 ....####
.byte $1F ; 9642 ...#####
.byte $3F ; 9643 ..######
.byte $7F ; 9644 .#######
.byte $FF ; 9645 ########
.byte $80 ; 9646 #.......
.byte $40 ; 9647 .#......
.byte $20 ; 9648 ..#.....
.byte $10 ; 9649 ...#....
.byte $08 ; 964A ....#...
.byte $04 ; 964B .....#..
.byte $02 ; 964C ......#.
.byte $01 ; 964D .......#
; 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).
gameFontBoxCorners:
.byte $FF ; 964E ########
.byte $FF ; 964F ########
.byte $C0 ; 9650 ##......
.byte $C0 ; 9651 ##......
.byte $C0 ; 9652 ##......
.byte $C0 ; 9653 ##......
.byte $C0 ; 9654 ##......
.byte $C0 ; 9655 ##......
.byte $FF ; 9656 ########
.byte $FF ; 9657 ########
.byte $03 ; 9658 ......##
.byte $03 ; 9659 ......##
.byte $03 ; 965A ......##
.byte $03 ; 965B ......##
.byte $03 ; 965C ......##
.byte $03 ; 965D ......##
.byte $C0 ; 965E ##......
.byte $C0 ; 965F ##......
.byte $C0 ; 9660 ##......
.byte $C0 ; 9661 ##......
.byte $C0 ; 9662 ##......
.byte $C0 ; 9663 ##......
.byte $FF ; 9664 ########
.byte $FF ; 9665 ########
.byte $03 ; 9666 ......##
.byte $03 ; 9667 ......##
.byte $03 ; 9668 ......##
.byte $03 ; 9669 ......##
.byte $03 ; 966A ......##
.byte $03 ; 966B ......##
.byte $FF ; 966C ########
.byte $FF ; 966D ########
; 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.
gameFontTallDigitHalves:
.byte $00 ; 966E ........
.byte $00 ; 966F ........
.byte $3C ; 9670 ..####..
.byte $5A ; 9671 .#.##.#.
.byte $66 ; 9672 .##..##.
.byte $66 ; 9673 .##..##.
.byte $66 ; 9674 .##..##.
.byte $42 ; 9675 .#....#.
.byte $42 ; 9676 .#....#.
.byte $66 ; 9677 .##..##.
.byte $66 ; 9678 .##..##.
.byte $66 ; 9679 .##..##.
.byte $5A ; 967A .#.##.#.
.byte $3C ; 967B ..####..
.byte $00 ; 967C ........
.byte $00 ; 967D ........
.byte $00 ; 967E ........
.byte $00 ; 967F ........
.byte $18 ; 9680 ...##...
.byte $18 ; 9681 ...##...
.byte $18 ; 9682 ...##...
.byte $18 ; 9683 ...##...
.byte $18 ; 9684 ...##...
.byte $00 ; 9685 ........
.byte $00 ; 9686 ........
.byte $18 ; 9687 ...##...
.byte $18 ; 9688 ...##...
.byte $18 ; 9689 ...##...
.byte $18 ; 968A ...##...
.byte $18 ; 968B ...##...
.byte $00 ; 968C ........
.byte $00 ; 968D ........
.byte $00 ; 968E ........
.byte $00 ; 968F ........
.byte $7C ; 9690 .#####..
.byte $3A ; 9691 ..###.#.
.byte $06 ; 9692 .....##.
.byte $06 ; 9693 .....##.
.byte $06 ; 9694 .....##.
.byte $3C ; 9695 ..####..
.byte $3C ; 9696 ..####..
.byte $60 ; 9697 .##.....
.byte $60 ; 9698 .##.....
.byte $60 ; 9699 .##.....
.byte $5C ; 969A .#.###..
.byte $3E ; 969B ..#####.
.byte $00 ; 969C ........
.byte $00 ; 969D ........
.byte $3C ; 969E ..####..
.byte $06 ; 969F .....##.
.byte $06 ; 96A0 .....##.
.byte $06 ; 96A1 .....##.
.byte $3A ; 96A2 ..###.#.
.byte $7C ; 96A3 .#####..
.byte $00 ; 96A4 ........
.byte $00 ; 96A5 ........
.byte $00 ; 96A6 ........
.byte $00 ; 96A7 ........
.byte $42 ; 96A8 .#....#.
.byte $66 ; 96A9 .##..##.
.byte $66 ; 96AA .##..##.
.byte $66 ; 96AB .##..##.
.byte $66 ; 96AC .##..##.
.byte $3C ; 96AD ..####..
.byte $3C ; 96AE ..####..
.byte $06 ; 96AF .....##.
.byte $06 ; 96B0 .....##.
.byte $06 ; 96B1 .....##.
.byte $06 ; 96B2 .....##.
.byte $06 ; 96B3 .....##.
.byte $00 ; 96B4 ........
.byte $00 ; 96B5 ........
.byte $00 ; 96B6 ........
.byte $00 ; 96B7 ........
.byte $3C ; 96B8 ..####..
.byte $58 ; 96B9 .#.##...
.byte $60 ; 96BA .##.....
.byte $60 ; 96BB .##.....
.byte $60 ; 96BC .##.....
.byte $3C ; 96BD ..####..
.byte $3C ; 96BE ..####..
.byte $66 ; 96BF .##..##.
.byte $66 ; 96C0 .##..##.
.byte $66 ; 96C1 .##..##.
.byte $5A ; 96C2 .#.##.#.
.byte $3C ; 96C3 ..####..
.byte $00 ; 96C4 ........
.byte $00 ; 96C5 ........
.byte $00 ; 96C6 ........
.byte $00 ; 96C7 ........
.byte $7C ; 96C8 .#####..
.byte $1A ; 96C9 ...##.#.
.byte $06 ; 96CA .....##.
.byte $06 ; 96CB .....##.
.byte $06 ; 96CC .....##.
.byte $00 ; 96CD ........
.byte $00 ; 96CE ........
.byte $06 ; 96CF .....##.
.byte $06 ; 96D0 .....##.
.byte $06 ; 96D1 .....##.
.byte $06 ; 96D2 .....##.
.byte $02 ; 96D3 ......#.
.byte $00 ; 96D4 ........
.byte $00 ; 96D5 ........
.byte $00 ; 96D6 ........
.byte $00 ; 96D7 ........
.byte $3C ; 96D8 ..####..
.byte $5A ; 96D9 .#.##.#.
.byte $66 ; 96DA .##..##.
.byte $66 ; 96DB .##..##.
.byte $66 ; 96DC .##..##.
.byte $3C ; 96DD ..####..
; 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.
gameFontFuelCaption:
.byte $00 ; 96DE ........
.byte $00 ; 96DF ........
.byte $79 ; 96E0 .####..#
.byte $41 ; 96E1 .#.....#
.byte $71 ; 96E2 .###...#
.byte $41 ; 96E3 .#.....#
.byte $41 ; 96E4 .#.....#
.byte $41 ; 96E5 .#.....#
.byte $00 ; 96E6 ........
.byte $00 ; 96E7 ........
.byte $27 ; 96E8 ..#..###
.byte $24 ; 96E9 ..#..#..
.byte $27 ; 96EA ..#..###
.byte $24 ; 96EB ..#..#..
.byte $24 ; 96EC ..#..#..
.byte $E7 ; 96ED ###..###
.byte $00 ; 96EE ........
.byte $00 ; 96EF ........
.byte $90 ; 96F0 #..#....
.byte $10 ; 96F1 ...#....
.byte $10 ; 96F2 ...#....
.byte $10 ; 96F3 ...#....
.byte $10 ; 96F4 ...#....
.byte $9E ; 96F5 #..####.
; 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.
gameFontFillPatterns:
.byte $AA ; 96F6 #.#.#.#.
.byte $AA ; 96F7 #.#.#.#.
.byte $BA ; 96F8 #.###.#.
.byte $BA ; 96F9 #.###.#.
.byte $AE ; 96FA #.#.###.
.byte $AE ; 96FB #.#.###.
.byte $AA ; 96FC #.#.#.#.
.byte $AA ; 96FD #.#.#.#.
.byte $AB ; 96FE #.#.#.##
.byte $AB ; 96FF #.#.#.##
.byte $AD ; 9700 #.#.##.#
.byte $AD ; 9701 #.#.##.#
.byte $B5 ; 9702 #.##.#.#
.byte $B5 ; 9703 #.##.#.#
.byte $D5 ; 9704 ##.#.#.#
.byte $D5 ; 9705 ##.#.#.#
.byte $55 ; 9706 .#.#.#.#
.byte $55 ; 9707 .#.#.#.#
.byte $75 ; 9708 .###.#.#
.byte $75 ; 9709 .###.#.#
.byte $5D ; 970A .#.###.#
.byte $5D ; 970B .#.###.#
.byte $55 ; 970C .#.#.#.#
.byte $55 ; 970D .#.#.#.#
.byte $AA ; 970E #.#.#.#.
.byte $AA ; 970F #.#.#.#.
.byte $AA ; 9710 #.#.#.#.
.byte $AA ; 9711 #.#.#.#.
.byte $AA ; 9712 #.#.#.#.
.byte $AA ; 9713 #.#.#.#.
.byte $AA ; 9714 #.#.#.#.
.byte $AA ; 9715 #.#.#.#.
.byte $55 ; 9716 .#.#.#.#
.byte $55 ; 9717 .#.#.#.#
.byte $55 ; 9718 .#.#.#.#
.byte $55 ; 9719 .#.#.#.#
.byte $55 ; 971A .#.#.#.#
.byte $55 ; 971B .#.#.#.#
.byte $55 ; 971C .#.#.#.#
.byte $55 ; 971D .#.#.#.#
; 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.
gameFontBevelPieces:
.byte $FF ; 971E ########
.byte $55 ; 971F .#.#.#.#
.byte $7F ; 9720 .#######
.byte $7F ; 9721 .#######
.byte $7F ; 9722 .#######
.byte $7F ; 9723 .#######
.byte $7E ; 9724 .######.
.byte $7E ; 9725 .######.
.byte $FF ; 9726 ########
.byte $55 ; 9727 .#.#.#.#
.byte $FF ; 9728 ########
.byte $FF ; 9729 ########
.byte $FF ; 972A ########
.byte $FF ; 972B ########
.byte $AA ; 972C #.#.#.#.
.byte $AA ; 972D #.#.#.#.
.byte $FF ; 972E ########
.byte $55 ; 972F .#.#.#.#
.byte $FE ; 9730 #######.
.byte $FE ; 9731 #######.
.byte $FE ; 9732 #######.
.byte $FE ; 9733 #######.
.byte $BE ; 9734 #.#####.
.byte $BE ; 9735 #.#####.
.byte $7E ; 9736 .######.
.byte $7E ; 9737 .######.
.byte $7E ; 9738 .######.
.byte $7E ; 9739 .######.
.byte $7E ; 973A .######.
.byte $7E ; 973B .######.
.byte $7E ; 973C .######.
.byte $7E ; 973D .######.
.byte $7E ; 973E .######.
.byte $7E ; 973F .######.
.byte $7E ; 9740 .######.
.byte $7E ; 9741 .######.
.byte $7E ; 9742 .######.
.byte $7E ; 9743 .######.
.byte $7E ; 9744 .######.
.byte $7E ; 9745 .######.
.byte $7E ; 9746 .######.
.byte $7E ; 9747 .######.
.byte $7F ; 9748 .#######
.byte $7F ; 9749 .#######
.byte $7F ; 974A .#######
.byte $7F ; 974B .#######
.byte $AA ; 974C #.#.#.#.
.byte $FF ; 974D ########
.byte $55 ; 974E .#.#.#.#
.byte $55 ; 974F .#.#.#.#
.byte $FF ; 9750 ########
.byte $FF ; 9751 ########
.byte $FF ; 9752 ########
.byte $FF ; 9753 ########
.byte $AA ; 9754 #.#.#.#.
.byte $FF ; 9755 ########
.byte $7E ; 9756 .######.
.byte $7E ; 9757 .######.
.byte $FE ; 9758 #######.
.byte $FE ; 9759 #######.
.byte $FE ; 975A #######.
.byte $FE ; 975B #######.
.byte $AA ; 975C #.#.#.#.
.byte $FF ; 975D ########
.byte $7E ; 975E .######.
.byte $7E ; 975F .######.
.byte $7F ; 9760 .#######
.byte $7F ; 9761 .#######
.byte $7F ; 9762 .#######
.byte $7F ; 9763 .#######
.byte $7E ; 9764 .######.
.byte $7E ; 9765 .######.
.byte $AA ; 9766 #.#.#.#.
.byte $AA ; 9767 #.#.#.#.
.byte $FF ; 9768 ########
.byte $FF ; 9769 ########
.byte $FF ; 976A ########
.byte $FF ; 976B ########
.byte $AA ; 976C #.#.#.#.
.byte $AA ; 976D #.#.#.#.
.byte $7E ; 976E .######.
.byte $7E ; 976F .######.
.byte $FE ; 9770 #######.
.byte $FE ; 9771 #######.
.byte $FE ; 9772 #######.
.byte $FE ; 9773 #######.
.byte $7E ; 9774 .######.
.byte $7E ; 9775 .######.
.byte $FF ; 9776 ########
.byte $FF ; 9777 ########
.byte $FF ; 9778 ########
.byte $FF ; 9779 ########
.byte $FF ; 977A ########
.byte $FF ; 977B ########
.byte $FE ; 977C #######.
.byte $FE ; 977D #######.
.byte $FF ; 977E ########
.byte $FF ; 977F ########
.byte $FF ; 9780 ########
.byte $FF ; 9781 ########
.byte $FF ; 9782 ########
.byte $FF ; 9783 ########
.byte $AA ; 9784 #.#.#.#.
.byte $AA ; 9785 #.#.#.#.
.byte $FF ; 9786 ########
.byte $FF ; 9787 ########
.byte $FF ; 9788 ########
.byte $FF ; 9789 ########
.byte $FF ; 978A ########
.byte $FF ; 978B ########
.byte $BF ; 978C #.######
.byte $BF ; 978D #.######
.byte $FE ; 978E #######.
.byte $FE ; 978F #######.
.byte $FE ; 9790 #######.
.byte $FE ; 9791 #######.
.byte $FE ; 9792 #######.
.byte $FE ; 9793 #######.
.byte $FE ; 9794 #######.
.byte $FE ; 9795 #######.
.byte $7F ; 9796 .#######
.byte $7F ; 9797 .#######
.byte $7F ; 9798 .#######
.byte $7F ; 9799 .#######
.byte $7F ; 979A .#######
.byte $7F ; 979B .#######
.byte $7F ; 979C .#######
.byte $7F ; 979D .#######
.byte $FE ; 979E #######.
.byte $FE ; 979F #######.
.byte $FF ; 97A0 ########
.byte $FF ; 97A1 ########
.byte $FF ; 97A2 ########
.byte $FF ; 97A3 ########
.byte $FF ; 97A4 ########
.byte $FF ; 97A5 ########
.byte $55 ; 97A6 .#.#.#.#
.byte $55 ; 97A7 .#.#.#.#
.byte $FF ; 97A8 ########
.byte $FF ; 97A9 ########
.byte $FF ; 97AA ########
.byte $FF ; 97AB ########
.byte $FF ; 97AC ########
.byte $FF ; 97AD ########
.byte $7F ; 97AE .#######
.byte $7F ; 97AF .#######
.byte $FF ; 97B0 ########
.byte $FF ; 97B1 ########
.byte $FF ; 97B2 ########
.byte $FF ; 97B3 ########
.byte $FF ; 97B4 ########
.byte $FF ; 97B5 ########
; 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.
compassRoseBlock:
.byte $05,$05 ; 97B6 .. 5 wide, 5 high
; 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.
.byte $17,$18,$30,$1D,$1E ; 97B8 ..0.. row 0 - upper-left arc, upper N, upper-right arc
.byte $1A,$00,$31,$00,$20 ; 97BD ..1.
.byte $34,$35,$00,$36,$37 ; 97C2 45.67
.byte $23,$00,$32,$00,$29 ; 97C7 #.2.)
.byte $25,$26,$33,$2B,$2C ; 97CC %&3+,
; 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.
dialFaceBlock:
.byte $07,$07 ; 97D1 .. 7 wide, 7 high
; 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.
.byte $38,$14,$15,$04,$1B,$1C,$38; 97D3 8.....8 row 0 - corner diamond, arc, arc, ring top, arc, arc, corner diamond
.byte $16,$17,$18,$00,$1D,$1E,$1F; 97DA .......
.byte $19,$1A,$00,$00,$00,$20,$21; 97E1 ..... !
.byte $04,$00,$00,$00,$00,$00,$04; 97E8 .......
.byte $22,$23,$00,$00,$00,$29,$2A; 97EF "#...)*
.byte $24,$25,$26,$00,$2B,$2C,$2D; 97F6 $%&.+,-
.byte $38,$27,$28 ; 97FD 8'(
; 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.
D_9800:
.byte $04 ; 9800 end of the 7x7 dial picture
.byte $2E,$2F,$38 ; 9801 ./8
; 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.
buttonBoxBlock:
.byte $02,$02,$45,$46,$47,$48 ; 9804 ..EFGH 2x2: box corners $45-$48
; 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.
solidPlugBlock:
.byte $02,$02,$05,$05,$05,$05 ; 980A ...... 2x2: four solid cells
; 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).
tallDigitGlyphPairTable:
.byte $49,$4A ; 9810 IJ digit 0
.byte $4B,$4C ; 9812 KL
.byte $4D,$4E ; 9814 MN
.byte $4D,$4F ; 9816 MO
.byte $50,$51 ; 9818 PQ
.byte $52,$4F ; 981A RO
.byte $52,$53 ; 981C RS
.byte $54,$55 ; 981E TU
.byte $56,$53 ; 9820 VS
.byte $56,$51 ; 9822 VQ
; 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.
windowFrameTileSets:
.byte $06,$0A,$07,$0C ; 9824 .... set 0: TL,T,TR,L,C,R,BL,B,BR
; 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.
.byte $00,$0D,$08,$0B,$09 ; 9828 ..... set 0, tiles 4-8
; 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.
windowFrameTileSetRaised:
.byte $39,$3D,$3A,$3F,$00,$40,$3B,$3E,$3C; 982D 9=:?.@;>< set 1: thin box, raised
; 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).
windowFrameTileSetOctagon:
.byte $0E,$0B,$10,$12,$00,$13,$11,$0A,$0F; 9836 ......... set 2: octagon
; 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.
windowFrameTileSetPanel:
.byte $41,$04,$42,$04,$03,$02,$43,$02,$44; 983F A.B...C.D set 3: solid panel, chamfered corners
; 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).
windowFrameTileSetSolid:
.byte $03,$03,$03,$03,$03,$03,$03,$03; 9848 ........ set 4: all solid
; Set 4, last tile (split by the title-picture row boundary at $9850).
.byte $03 ; 9850 . set 4, tile 8
; Set 5 - nine blank cells, i.e. drawing this frame erases one. Windows $14 and $15.
windowFrameTileSetBlank:
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00; 9851 ......... set 5: all blank (erase)
; 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.
windowFrameTileSetDither:
.byte $5A,$5D,$5B,$5D ; 985A Z][] set 6: multicolour dither, tiles 0-3
; $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.
asciiToGlyphTableBiased:
.byte $03,$5E,$5B,$5E,$5C ; 985E .^[^\ set 6, tiles 4-8; also the biased base of asciiToGlyphTable
; Set 7 - heavy raised bevel with a dithered outer edge ($5F-$66). Window $01, the battlefield view.
windowFrameTileSetBevelA:
.byte $5F,$60,$61,$62,$03,$63,$64,$65,$66; 9863 _`ab.cdef set 7: bevel, battlefield view
; Set 8 - the same bevel with different corner shading ($67-$69 then $62-$66 again). Window $02, the
; console panel.
windowFrameTileSetBevelB:
.byte $67,$68,$69,$62,$03,$63,$64,$65,$66; 986C ghib.cdef set 8: bevel, console panel
; Set 9 - the heavy solid bevel ($6A-$71). Window $03, the message frame used during a battle.
windowFrameTileSetBevelC:
.byte $6A,$6B,$6C ; 9875 jkl set 9: solid bevel, message frame
; Set 9 continued (split by the title-picture row boundary at $9878).
.byte $6D,$03,$6E,$6F,$70,$71 ; 9878 m.nopq set 9, tiles 3-8
; 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.
asciiToGlyphTable:
.byte $00,$26,$33,$34,$35,$2B,$38,$2C,$28,$29,$2F,$30,$27,$2A,$25,$31,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0A,$2E,$37,$39,$32,$3A,$2D,$36,$0B; 987E .&345+8,()/0'*%1...........792:-6. characters $20-$41: space, punctuation, digits, ':' to '@' and 'A'
; The rest of asciiToGlyphTable; the split is a title-picture row boundary, not a structure boundary.
.byte $0C,$0D,$0E,$0F,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1A,$1B,$1C,$1D,$1E,$1F,$20,$21,$22,$23,$24,$28,$3B,$29,$3B,$3B; 98A0 .................... !"#$(;);; characters $42-$5F: 'B' to 'Z', then '[', '\', ']', '^', '_'
; 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.
consoleFontMulticolour:
.byte $00 ; 98BE ........
.byte $00 ; 98BF ........
.byte $00 ; 98C0 ........
.byte $00 ; 98C1 ........
.byte $00 ; 98C2 ........
.byte $00 ; 98C3 ........
.byte $00 ; 98C4 ........
.byte $00 ; 98C5 ........
; Glyphs $01-$0A of the multicolour set: the digits 0 to 9, in order.
consoleFontMulticolourDigits:
.byte $00 ; 98C6 ........
.byte $0C ; 98C7 ....##..
; 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.
.byte $33 ; 98C8 ..##..##
.byte $33 ; 98C9 ..##..##
.byte $33 ; 98CA ..##..##
.byte $33 ; 98CB ..##..##
.byte $0C ; 98CC ....##..
.byte $00 ; 98CD ........
.byte $00 ; 98CE ........
.byte $0C ; 98CF ....##..
.byte $0C ; 98D0 ....##..
.byte $0C ; 98D1 ....##..
.byte $0C ; 98D2 ....##..
.byte $0C ; 98D3 ....##..
.byte $0C ; 98D4 ....##..
.byte $00 ; 98D5 ........
.byte $00 ; 98D6 ........
.byte $3F ; 98D7 ..######
.byte $03 ; 98D8 ......##
.byte $0F ; 98D9 ....####
.byte $30 ; 98DA ..##....
.byte $30 ; 98DB ..##....
.byte $3F ; 98DC ..######
.byte $00 ; 98DD ........
.byte $00 ; 98DE ........
.byte $3F ; 98DF ..######
.byte $03 ; 98E0 ......##
.byte $0C ; 98E1 ....##..
.byte $03 ; 98E2 ......##
.byte $03 ; 98E3 ......##
.byte $3F ; 98E4 ..######
.byte $00 ; 98E5 ........
.byte $00 ; 98E6 ........
.byte $03 ; 98E7 ......##
.byte $33 ; 98E8 ..##..##
.byte $33 ; 98E9 ..##..##
.byte $3F ; 98EA ..######
.byte $03 ; 98EB ......##
.byte $03 ; 98EC ......##
.byte $00 ; 98ED ........
.byte $00 ; 98EE ........
.byte $3F ; 98EF ..######
.byte $30 ; 98F0 ..##....
.byte $3F ; 98F1 ..######
.byte $03 ; 98F2 ......##
.byte $03 ; 98F3 ......##
.byte $3F ; 98F4 ..######
.byte $00 ; 98F5 ........
.byte $00 ; 98F6 ........
.byte $30 ; 98F7 ..##....
.byte $30 ; 98F8 ..##....
.byte $3F ; 98F9 ..######
.byte $33 ; 98FA ..##..##
.byte $33 ; 98FB ..##..##
.byte $3F ; 98FC ..######
.byte $00 ; 98FD ........
.byte $00 ; 98FE ........
.byte $3F ; 98FF ..######
.byte $03 ; 9900 ......##
.byte $03 ; 9901 ......##
.byte $0C ; 9902 ....##..
.byte $0C ; 9903 ....##..
.byte $0C ; 9904 ....##..
.byte $00 ; 9905 ........
.byte $00 ; 9906 ........
.byte $3F ; 9907 ..######
.byte $33 ; 9908 ..##..##
.byte $0C ; 9909 ....##..
.byte $33 ; 990A ..##..##
.byte $33 ; 990B ..##..##
.byte $3F ; 990C ..######
.byte $00 ; 990D ........
.byte $00 ; 990E ........
.byte $3F ; 990F ..######
.byte $33 ; 9910 ..##..##
.byte $33 ; 9911 ..##..##
.byte $3F ; 9912 ..######
.byte $03 ; 9913 ......##
.byte $03 ; 9914 ......##
.byte $00 ; 9915 ........
; Glyphs $0B-$24 of the multicolour set: the letters A to Z, in order.
consoleFontMulticolourLetters:
.byte $00 ; 9916 ........
.byte $0C ; 9917 ....##..
.byte $3F ; 9918 ..######
.byte $33 ; 9919 ..##..##
.byte $33 ; 991A ..##..##
.byte $3F ; 991B ..######
.byte $33 ; 991C ..##..##
.byte $00 ; 991D ........
.byte $00 ; 991E ........
.byte $3C ; 991F ..####..
.byte $33 ; 9920 ..##..##
.byte $3C ; 9921 ..####..
.byte $33 ; 9922 ..##..##
.byte $33 ; 9923 ..##..##
.byte $3C ; 9924 ..####..
.byte $00 ; 9925 ........
.byte $00 ; 9926 ........
.byte $0F ; 9927 ....####
.byte $30 ; 9928 ..##....
.byte $30 ; 9929 ..##....
.byte $30 ; 992A ..##....
.byte $30 ; 992B ..##....
.byte $0F ; 992C ....####
.byte $00 ; 992D ........
.byte $00 ; 992E ........
.byte $3C ; 992F ..####..
.byte $33 ; 9930 ..##..##
.byte $33 ; 9931 ..##..##
.byte $33 ; 9932 ..##..##
.byte $33 ; 9933 ..##..##
.byte $3C ; 9934 ..####..
.byte $00 ; 9935 ........
.byte $00 ; 9936 ........
.byte $3F ; 9937 ..######
.byte $30 ; 9938 ..##....
.byte $3C ; 9939 ..####..
.byte $30 ; 993A ..##....
.byte $30 ; 993B ..##....
.byte $3F ; 993C ..######
.byte $00 ; 993D ........
.byte $00 ; 993E ........
.byte $3F ; 993F ..######
.byte $30 ; 9940 ..##....
.byte $3C ; 9941 ..####..
.byte $30 ; 9942 ..##....
.byte $30 ; 9943 ..##....
.byte $30 ; 9944 ..##....
.byte $00 ; 9945 ........
.byte $00 ; 9946 ........
.byte $0F ; 9947 ....####
.byte $30 ; 9948 ..##....
.byte $30 ; 9949 ..##....
.byte $33 ; 994A ..##..##
.byte $33 ; 994B ..##..##
.byte $0F ; 994C ....####
.byte $00 ; 994D ........
.byte $00 ; 994E ........
.byte $33 ; 994F ..##..##
.byte $33 ; 9950 ..##..##
.byte $3F ; 9951 ..######
.byte $33 ; 9952 ..##..##
.byte $33 ; 9953 ..##..##
.byte $33 ; 9954 ..##..##
.byte $00 ; 9955 ........
.byte $00 ; 9956 ........
.byte $0C ; 9957 ....##..
.byte $0C ; 9958 ....##..
.byte $0C ; 9959 ....##..
.byte $0C ; 995A ....##..
.byte $0C ; 995B ....##..
.byte $0C ; 995C ....##..
.byte $00 ; 995D ........
.byte $00 ; 995E ........
.byte $03 ; 995F ......##
.byte $03 ; 9960 ......##
.byte $03 ; 9961 ......##
.byte $33 ; 9962 ..##..##
.byte $33 ; 9963 ..##..##
.byte $0C ; 9964 ....##..
.byte $00 ; 9965 ........
.byte $00 ; 9966 ........
.byte $33 ; 9967 ..##..##
.byte $33 ; 9968 ..##..##
.byte $3C ; 9969 ..####..
.byte $33 ; 996A ..##..##
.byte $33 ; 996B ..##..##
.byte $33 ; 996C ..##..##
.byte $00 ; 996D ........
.byte $00 ; 996E ........
.byte $30 ; 996F ..##....
.byte $30 ; 9970 ..##....
.byte $30 ; 9971 ..##....
.byte $30 ; 9972 ..##....
.byte $30 ; 9973 ..##....
.byte $3F ; 9974 ..######
.byte $00 ; 9975 ........
.byte $00 ; 9976 ........
.byte $33 ; 9977 ..##..##
.byte $3F ; 9978 ..######
.byte $3F ; 9979 ..######
.byte $33 ; 997A ..##..##
.byte $33 ; 997B ..##..##
.byte $33 ; 997C ..##..##
.byte $00 ; 997D ........
.byte $00 ; 997E ........
.byte $33 ; 997F ..##..##
.byte $3F ; 9980 ..######
.byte $3F ; 9981 ..######
.byte $3F ; 9982 ..######
.byte $3F ; 9983 ..######
.byte $33 ; 9984 ..##..##
.byte $00 ; 9985 ........
.byte $00 ; 9986 ........
.byte $0C ; 9987 ....##..
.byte $33 ; 9988 ..##..##
.byte $33 ; 9989 ..##..##
.byte $33 ; 998A ..##..##
.byte $33 ; 998B ..##..##
.byte $0C ; 998C ....##..
.byte $00 ; 998D ........
.byte $00 ; 998E ........
.byte $3C ; 998F ..####..
.byte $33 ; 9990 ..##..##
.byte $33 ; 9991 ..##..##
.byte $3C ; 9992 ..####..
.byte $30 ; 9993 ..##....
.byte $30 ; 9994 ..##....
.byte $00 ; 9995 ........
.byte $00 ; 9996 ........
.byte $0C ; 9997 ....##..
.byte $33 ; 9998 ..##..##
.byte $33 ; 9999 ..##..##
.byte $33 ; 999A ..##..##
.byte $3C ; 999B ..####..
.byte $0F ; 999C ....####
.byte $00 ; 999D ........
.byte $00 ; 999E ........
.byte $3C ; 999F ..####..
.byte $33 ; 99A0 ..##..##
.byte $33 ; 99A1 ..##..##
.byte $3C ; 99A2 ..####..
.byte $33 ; 99A3 ..##..##
.byte $33 ; 99A4 ..##..##
.byte $00 ; 99A5 ........
.byte $00 ; 99A6 ........
.byte $0F ; 99A7 ....####
.byte $30 ; 99A8 ..##....
.byte $0C ; 99A9 ....##..
.byte $03 ; 99AA ......##
.byte $03 ; 99AB ......##
.byte $3C ; 99AC ..####..
.byte $00 ; 99AD ........
.byte $00 ; 99AE ........
.byte $3F ; 99AF ..######
.byte $0C ; 99B0 ....##..
.byte $0C ; 99B1 ....##..
.byte $0C ; 99B2 ....##..
.byte $0C ; 99B3 ....##..
.byte $0C ; 99B4 ....##..
.byte $00 ; 99B5 ........
.byte $00 ; 99B6 ........
.byte $33 ; 99B7 ..##..##
.byte $33 ; 99B8 ..##..##
.byte $33 ; 99B9 ..##..##
.byte $33 ; 99BA ..##..##
.byte $33 ; 99BB ..##..##
.byte $3F ; 99BC ..######
.byte $00 ; 99BD ........
.byte $00 ; 99BE ........
.byte $33 ; 99BF ..##..##
.byte $33 ; 99C0 ..##..##
.byte $33 ; 99C1 ..##..##
.byte $33 ; 99C2 ..##..##
.byte $3F ; 99C3 ..######
.byte $0C ; 99C4 ....##..
.byte $00 ; 99C5 ........
.byte $00 ; 99C6 ........
.byte $33 ; 99C7 ..##..##
.byte $33 ; 99C8 ..##..##
.byte $33 ; 99C9 ..##..##
.byte $3F ; 99CA ..######
.byte $3F ; 99CB ..######
.byte $33 ; 99CC ..##..##
.byte $00 ; 99CD ........
.byte $00 ; 99CE ........
.byte $33 ; 99CF ..##..##
.byte $33 ; 99D0 ..##..##
.byte $0C ; 99D1 ....##..
.byte $0C ; 99D2 ....##..
.byte $33 ; 99D3 ..##..##
.byte $33 ; 99D4 ..##..##
.byte $00 ; 99D5 ........
.byte $00 ; 99D6 ........
.byte $33 ; 99D7 ..##..##
.byte $33 ; 99D8 ..##..##
.byte $33 ; 99D9 ..##..##
.byte $0C ; 99DA ....##..
.byte $0C ; 99DB ....##..
.byte $0C ; 99DC ....##..
.byte $00 ; 99DD ........
.byte $00 ; 99DE ........
.byte $3F ; 99DF ..######
.byte $03 ; 99E0 ......##
.byte $0C ; 99E1 ....##..
.byte $0C ; 99E2 ....##..
.byte $30 ; 99E3 ..##....
.byte $3F ; 99E4 ..######
.byte $00 ; 99E5 ........
; 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.
consoleFontMulticolourSymbols:
.byte $00 ; 99E6 ........
.byte $00 ; 99E7 ........
.byte $00 ; 99E8 ........
.byte $00 ; 99E9 ........
.byte $00 ; 99EA ........
.byte $0C ; 99EB ....##..
.byte $0C ; 99EC ....##..
.byte $00 ; 99ED ........
.byte $00 ; 99EE ........
.byte $0C ; 99EF ....##..
.byte $0C ; 99F0 ....##..
.byte $0C ; 99F1 ....##..
.byte $0C ; 99F2 ....##..
.byte $00 ; 99F3 ........
.byte $0C ; 99F4 ....##..
.byte $00 ; 99F5 ........
.byte $00 ; 99F6 ........
.byte $00 ; 99F7 ........
.byte $00 ; 99F8 ........
.byte $00 ; 99F9 ........
.byte $00 ; 99FA ........
.byte $0C ; 99FB ....##..
.byte $0C ; 99FC ....##..
.byte $30 ; 99FD ..##....
.byte $00 ; 99FE ........
.byte $0C ; 99FF ....##..
.byte $30 ; 9A00 ..##....
.byte $30 ; 9A01 ..##....
.byte $30 ; 9A02 ..##....
.byte $30 ; 9A03 ..##....
.byte $0C ; 9A04 ....##..
.byte $00 ; 9A05 ........
.byte $00 ; 9A06 ........
.byte $30 ; 9A07 ..##....
.byte $0C ; 9A08 ....##..
.byte $0C ; 9A09 ....##..
.byte $0C ; 9A0A ....##..
.byte $0C ; 9A0B ....##..
.byte $30 ; 9A0C ..##....
.byte $00 ; 9A0D ........
.byte $00 ; 9A0E ........
.byte $00 ; 9A0F ........
.byte $00 ; 9A10 ........
.byte $3C ; 9A11 ..####..
.byte $00 ; 9A12 ........
.byte $00 ; 9A13 ........
.byte $00 ; 9A14 ........
.byte $00 ; 9A15 ........
.byte $00 ; 9A16 ........
.byte $33 ; 9A17 ..##..##
.byte $03 ; 9A18 ......##
.byte $0C ; 9A19 ....##..
.byte $0C ; 9A1A ....##..
.byte $30 ; 9A1B ..##....
.byte $33 ; 9A1C ..##..##
.byte $00 ; 9A1D ........
.byte $0C ; 9A1E ....##..
.byte $0C ; 9A1F ....##..
.byte $0C ; 9A20 ....##..
.byte $00 ; 9A21 ........
.byte $00 ; 9A22 ........
.byte $00 ; 9A23 ........
.byte $00 ; 9A24 ........
.byte $00 ; 9A25 ........
.byte $00 ; 9A26 ........
.byte $0C ; 9A27 ....##..
.byte $33 ; 9A28 ..##..##
.byte $03 ; 9A29 ......##
.byte $0C ; 9A2A ....##..
.byte $00 ; 9A2B ........
.byte $0C ; 9A2C ....##..
.byte $00 ; 9A2D ........
.byte $00 ; 9A2E ........
.byte $0C ; 9A2F ....##..
.byte $0C ; 9A30 ....##..
.byte $00 ; 9A31 ........
.byte $00 ; 9A32 ........
.byte $0C ; 9A33 ....##..
.byte $0C ; 9A34 ....##..
.byte $00 ; 9A35 ........
.byte $00 ; 9A36 ........
.byte $33 ; 9A37 ..##..##
.byte $0C ; 9A38 ....##..
.byte $3F ; 9A39 ..######
.byte $0C ; 9A3A ....##..
.byte $33 ; 9A3B ..##..##
.byte $00 ; 9A3C ........
.byte $00 ; 9A3D ........
.byte $00 ; 9A3E ........
.byte $00 ; 9A3F ........
.byte $0C ; 9A40 ....##..
.byte $0C ; 9A41 ....##..
.byte $3F ; 9A42 ..######
.byte $0C ; 9A43 ....##..
.byte $0C ; 9A44 ....##..
.byte $00 ; 9A45 ........
.byte $00 ; 9A46 ........
.byte $03 ; 9A47 ......##
.byte $03 ; 9A48 ......##
.byte $0C ; 9A49 ....##..
.byte $0C ; 9A4A ....##..
.byte $30 ; 9A4B ..##....
.byte $30 ; 9A4C ..##....
.byte $00 ; 9A4D ........
.byte $00 ; 9A4E ........
.byte $00 ; 9A4F ........
.byte $00 ; 9A50 ........
.byte $3C ; 9A51 ..####..
.byte $00 ; 9A52 ........
.byte $3C ; 9A53 ..####..
.byte $00 ; 9A54 ........
.byte $00 ; 9A55 ........
.byte $00 ; 9A56 ........
.byte $33 ; 9A57 ..##..##
.byte $33 ; 9A58 ..##..##
.byte $33 ; 9A59 ..##..##
.byte $00 ; 9A5A ........
.byte $00 ; 9A5B ........
.byte $00 ; 9A5C ........
.byte $00 ; 9A5D ........
.byte $00 ; 9A5E ........
.byte $00 ; 9A5F ........
.byte $0C ; 9A60 ....##..
.byte $3F ; 9A61 ..######
.byte $0C ; 9A62 ....##..
.byte $3F ; 9A63 ..######
.byte $0C ; 9A64 ....##..
.byte $00 ; 9A65 ........
.byte $0C ; 9A66 ....##..
.byte $0F ; 9A67 ....####
.byte $30 ; 9A68 ..##....
.byte $0C ; 9A69 ....##..
.byte $03 ; 9A6A ......##
.byte $3C ; 9A6B ..####..
.byte $0C ; 9A6C ....##..
.byte $00 ; 9A6D ........
.byte $00 ; 9A6E ........
.byte $0C ; 9A6F ....##..
.byte $33 ; 9A70 ..##..##
.byte $33 ; 9A71 ..##..##
.byte $3F ; 9A72 ..######
.byte $3F ; 9A73 ..######
.byte $30 ; 9A74 ..##....
.byte $0C ; 9A75 ....##..
.byte $00 ; 9A76 ........
.byte $0C ; 9A77 ....##..
.byte $0C ; 9A78 ....##..
.byte $00 ; 9A79 ........
.byte $00 ; 9A7A ........
.byte $0C ; 9A7B ....##..
.byte $0C ; 9A7C ....##..
.byte $30 ; 9A7D ..##....
.byte $00 ; 9A7E ........
.byte $0C ; 9A7F ....##..
; Last fragment of consoleFontMulticolour; the set ends at $9A95.
.byte $0C ; 9A80 ....##..
.byte $3C ; 9A81 ..####..
.byte $3F ; 9A82 ..######
.byte $3C ; 9A83 ..####..
.byte $0C ; 9A84 ....##..
.byte $00 ; 9A85 ........
.byte $00 ; 9A86 ........
.byte $03 ; 9A87 ......##
.byte $0F ; 9A88 ....####
.byte $3C ; 9A89 ..####..
.byte $30 ; 9A8A ..##....
.byte $3C ; 9A8B ..####..
.byte $0F ; 9A8C ....####
.byte $03 ; 9A8D ......##
.byte $00 ; 9A8E ........
.byte $30 ; 9A8F ..##....
.byte $3C ; 9A90 ..####..
.byte $0F ; 9A91 ....####
.byte $03 ; 9A92 ......##
.byte $0F ; 9A93 ....####
.byte $3C ; 9A94 ..####..
.byte $30 ; 9A95 ..##....
; 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.
consoleFontHires:
.byte $00 ; 9A96 ........
.byte $00 ; 9A97 ........
.byte $00 ; 9A98 ........
.byte $00 ; 9A99 ........
.byte $00 ; 9A9A ........
.byte $00 ; 9A9B ........
.byte $00 ; 9A9C ........
.byte $00 ; 9A9D ........
; Glyphs $01-$0A of the hires set: the digits 0 to 9.
consoleFontHiresDigits:
.byte $00 ; 9A9E ........
.byte $38 ; 9A9F ..###...
.byte $44 ; 9AA0 .#...#..
.byte $44 ; 9AA1 .#...#..
.byte $44 ; 9AA2 .#...#..
.byte $44 ; 9AA3 .#...#..
.byte $38 ; 9AA4 ..###...
.byte $00 ; 9AA5 ........
.byte $00 ; 9AA6 ........
.byte $10 ; 9AA7 ...#....
; Continuation of consoleFontHires; the breaks every 40 bytes are title-picture row boundaries.
.byte $10 ; 9AA8 ...#....
.byte $10 ; 9AA9 ...#....
.byte $10 ; 9AAA ...#....
.byte $10 ; 9AAB ...#....
.byte $10 ; 9AAC ...#....
.byte $00 ; 9AAD ........
.byte $00 ; 9AAE ........
.byte $78 ; 9AAF .####...
.byte $04 ; 9AB0 .....#..
.byte $18 ; 9AB1 ...##...
.byte $60 ; 9AB2 .##.....
.byte $40 ; 9AB3 .#......
.byte $7C ; 9AB4 .#####..
.byte $00 ; 9AB5 ........
.byte $00 ; 9AB6 ........
.byte $7C ; 9AB7 .#####..
.byte $04 ; 9AB8 .....#..
.byte $18 ; 9AB9 ...##...
.byte $04 ; 9ABA .....#..
.byte $04 ; 9ABB .....#..
.byte $7C ; 9ABC .#####..
.byte $00 ; 9ABD ........
.byte $00 ; 9ABE ........
.byte $04 ; 9ABF .....#..
.byte $44 ; 9AC0 .#...#..
.byte $44 ; 9AC1 .#...#..
.byte $7C ; 9AC2 .#####..
.byte $04 ; 9AC3 .....#..
.byte $04 ; 9AC4 .....#..
.byte $00 ; 9AC5 ........
.byte $00 ; 9AC6 ........
.byte $7C ; 9AC7 .#####..
.byte $40 ; 9AC8 .#......
.byte $78 ; 9AC9 .####...
.byte $04 ; 9ACA .....#..
.byte $04 ; 9ACB .....#..
.byte $7C ; 9ACC .#####..
.byte $00 ; 9ACD ........
.byte $00 ; 9ACE ........
.byte $40 ; 9ACF .#......
.byte $40 ; 9AD0 .#......
.byte $7C ; 9AD1 .#####..
.byte $44 ; 9AD2 .#...#..
.byte $44 ; 9AD3 .#...#..
.byte $7C ; 9AD4 .#####..
.byte $00 ; 9AD5 ........
.byte $00 ; 9AD6 ........
.byte $7C ; 9AD7 .#####..
.byte $04 ; 9AD8 .....#..
.byte $04 ; 9AD9 .....#..
.byte $08 ; 9ADA ....#...
.byte $10 ; 9ADB ...#....
.byte $10 ; 9ADC ...#....
.byte $00 ; 9ADD ........
.byte $00 ; 9ADE ........
.byte $7C ; 9ADF .#####..
.byte $44 ; 9AE0 .#...#..
.byte $38 ; 9AE1 ..###...
.byte $44 ; 9AE2 .#...#..
.byte $44 ; 9AE3 .#...#..
.byte $7C ; 9AE4 .#####..
.byte $00 ; 9AE5 ........
.byte $00 ; 9AE6 ........
.byte $7C ; 9AE7 .#####..
.byte $44 ; 9AE8 .#...#..
.byte $44 ; 9AE9 .#...#..
.byte $7C ; 9AEA .#####..
.byte $04 ; 9AEB .....#..
.byte $04 ; 9AEC .....#..
.byte $00 ; 9AED ........
; Glyphs $0B-$24 of the hires set: the letters A to Z.
consoleFontHiresLetters:
.byte $00 ; 9AEE ........
.byte $38 ; 9AEF ..###...
.byte $6C ; 9AF0 .##.##..
.byte $44 ; 9AF1 .#...#..
.byte $44 ; 9AF2 .#...#..
.byte $7C ; 9AF3 .#####..
.byte $44 ; 9AF4 .#...#..
.byte $00 ; 9AF5 ........
.byte $00 ; 9AF6 ........
.byte $78 ; 9AF7 .####...
.byte $44 ; 9AF8 .#...#..
.byte $78 ; 9AF9 .####...
.byte $44 ; 9AFA .#...#..
.byte $44 ; 9AFB .#...#..
.byte $78 ; 9AFC .####...
.byte $00 ; 9AFD ........
.byte $00 ; 9AFE ........
.byte $3C ; 9AFF ..####..
.byte $40 ; 9B00 .#......
.byte $40 ; 9B01 .#......
.byte $40 ; 9B02 .#......
.byte $40 ; 9B03 .#......
.byte $3C ; 9B04 ..####..
.byte $00 ; 9B05 ........
.byte $00 ; 9B06 ........
.byte $78 ; 9B07 .####...
.byte $44 ; 9B08 .#...#..
.byte $44 ; 9B09 .#...#..
.byte $44 ; 9B0A .#...#..
.byte $44 ; 9B0B .#...#..
.byte $78 ; 9B0C .####...
.byte $00 ; 9B0D ........
.byte $00 ; 9B0E ........
.byte $7C ; 9B0F .#####..
.byte $40 ; 9B10 .#......
.byte $78 ; 9B11 .####...
.byte $40 ; 9B12 .#......
.byte $40 ; 9B13 .#......
.byte $7C ; 9B14 .#####..
.byte $00 ; 9B15 ........
.byte $00 ; 9B16 ........
.byte $7C ; 9B17 .#####..
.byte $40 ; 9B18 .#......
.byte $78 ; 9B19 .####...
.byte $40 ; 9B1A .#......
.byte $40 ; 9B1B .#......
.byte $40 ; 9B1C .#......
.byte $00 ; 9B1D ........
.byte $00 ; 9B1E ........
.byte $3C ; 9B1F ..####..
.byte $40 ; 9B20 .#......
.byte $40 ; 9B21 .#......
.byte $44 ; 9B22 .#...#..
.byte $44 ; 9B23 .#...#..
.byte $3C ; 9B24 ..####..
.byte $00 ; 9B25 ........
.byte $00 ; 9B26 ........
.byte $44 ; 9B27 .#...#..
.byte $44 ; 9B28 .#...#..
.byte $7C ; 9B29 .#####..
.byte $44 ; 9B2A .#...#..
.byte $44 ; 9B2B .#...#..
.byte $44 ; 9B2C .#...#..
.byte $00 ; 9B2D ........
.byte $00 ; 9B2E ........
.byte $10 ; 9B2F ...#....
.byte $10 ; 9B30 ...#....
.byte $10 ; 9B31 ...#....
.byte $10 ; 9B32 ...#....
.byte $10 ; 9B33 ...#....
.byte $10 ; 9B34 ...#....
.byte $00 ; 9B35 ........
.byte $00 ; 9B36 ........
.byte $04 ; 9B37 .....#..
.byte $04 ; 9B38 .....#..
.byte $04 ; 9B39 .....#..
.byte $44 ; 9B3A .#...#..
.byte $44 ; 9B3B .#...#..
.byte $38 ; 9B3C ..###...
.byte $00 ; 9B3D ........
.byte $00 ; 9B3E ........
.byte $44 ; 9B3F .#...#..
.byte $48 ; 9B40 .#..#...
.byte $78 ; 9B41 .####...
.byte $48 ; 9B42 .#..#...
.byte $44 ; 9B43 .#...#..
.byte $44 ; 9B44 .#...#..
.byte $00 ; 9B45 ........
.byte $00 ; 9B46 ........
.byte $40 ; 9B47 .#......
.byte $40 ; 9B48 .#......
.byte $40 ; 9B49 .#......
.byte $40 ; 9B4A .#......
.byte $40 ; 9B4B .#......
.byte $7C ; 9B4C .#####..
.byte $00 ; 9B4D ........
.byte $00 ; 9B4E ........
.byte $44 ; 9B4F .#...#..
.byte $7C ; 9B50 .#####..
.byte $54 ; 9B51 .#.#.#..
.byte $44 ; 9B52 .#...#..
.byte $44 ; 9B53 .#...#..
.byte $44 ; 9B54 .#...#..
.byte $00 ; 9B55 ........
.byte $00 ; 9B56 ........
.byte $44 ; 9B57 .#...#..
.byte $64 ; 9B58 .##..#..
.byte $74 ; 9B59 .###.#..
.byte $5C ; 9B5A .#.###..
.byte $4C ; 9B5B .#..##..
.byte $44 ; 9B5C .#...#..
.byte $00 ; 9B5D ........
.byte $00 ; 9B5E ........
.byte $38 ; 9B5F ..###...
.byte $44 ; 9B60 .#...#..
.byte $44 ; 9B61 .#...#..
.byte $44 ; 9B62 .#...#..
.byte $44 ; 9B63 .#...#..
.byte $38 ; 9B64 ..###...
.byte $00 ; 9B65 ........
.byte $00 ; 9B66 ........
.byte $78 ; 9B67 .####...
.byte $44 ; 9B68 .#...#..
.byte $44 ; 9B69 .#...#..
.byte $78 ; 9B6A .####...
.byte $40 ; 9B6B .#......
.byte $40 ; 9B6C .#......
.byte $00 ; 9B6D ........
.byte $00 ; 9B6E ........
.byte $38 ; 9B6F ..###...
.byte $44 ; 9B70 .#...#..
.byte $44 ; 9B71 .#...#..
.byte $44 ; 9B72 .#...#..
.byte $48 ; 9B73 .#..#...
.byte $3C ; 9B74 ..####..
.byte $00 ; 9B75 ........
.byte $00 ; 9B76 ........
.byte $78 ; 9B77 .####...
.byte $44 ; 9B78 .#...#..
.byte $44 ; 9B79 .#...#..
.byte $78 ; 9B7A .####...
.byte $44 ; 9B7B .#...#..
.byte $44 ; 9B7C .#...#..
.byte $00 ; 9B7D ........
.byte $00 ; 9B7E ........
.byte $3C ; 9B7F ..####..
.byte $40 ; 9B80 .#......
.byte $38 ; 9B81 ..###...
.byte $04 ; 9B82 .....#..
.byte $04 ; 9B83 .....#..
.byte $78 ; 9B84 .####...
.byte $00 ; 9B85 ........
.byte $00 ; 9B86 ........
.byte $7C ; 9B87 .#####..
.byte $10 ; 9B88 ...#....
.byte $10 ; 9B89 ...#....
.byte $10 ; 9B8A ...#....
.byte $10 ; 9B8B ...#....
.byte $10 ; 9B8C ...#....
.byte $00 ; 9B8D ........
.byte $00 ; 9B8E ........
.byte $44 ; 9B8F .#...#..
.byte $44 ; 9B90 .#...#..
.byte $44 ; 9B91 .#...#..
.byte $44 ; 9B92 .#...#..
.byte $44 ; 9B93 .#...#..
.byte $7C ; 9B94 .#####..
.byte $00 ; 9B95 ........
.byte $00 ; 9B96 ........
.byte $44 ; 9B97 .#...#..
.byte $44 ; 9B98 .#...#..
.byte $44 ; 9B99 .#...#..
.byte $44 ; 9B9A .#...#..
.byte $38 ; 9B9B ..###...
.byte $10 ; 9B9C ...#....
.byte $00 ; 9B9D ........
.byte $00 ; 9B9E ........
.byte $44 ; 9B9F .#...#..
.byte $44 ; 9BA0 .#...#..
.byte $44 ; 9BA1 .#...#..
.byte $54 ; 9BA2 .#.#.#..
.byte $7C ; 9BA3 .#####..
.byte $44 ; 9BA4 .#...#..
.byte $00 ; 9BA5 ........
.byte $00 ; 9BA6 ........
.byte $44 ; 9BA7 .#...#..
.byte $6C ; 9BA8 .##.##..
.byte $10 ; 9BA9 ...#....
.byte $10 ; 9BAA ...#....
.byte $6C ; 9BAB .##.##..
.byte $44 ; 9BAC .#...#..
.byte $00 ; 9BAD ........
.byte $00 ; 9BAE ........
.byte $44 ; 9BAF .#...#..
.byte $44 ; 9BB0 .#...#..
.byte $44 ; 9BB1 .#...#..
.byte $38 ; 9BB2 ..###...
.byte $10 ; 9BB3 ...#....
.byte $10 ; 9BB4 ...#....
.byte $00 ; 9BB5 ........
.byte $00 ; 9BB6 ........
.byte $7C ; 9BB7 .#####..
.byte $08 ; 9BB8 ....#...
.byte $10 ; 9BB9 ...#....
.byte $20 ; 9BBA ..#.....
.byte $40 ; 9BBB .#......
.byte $7C ; 9BBC .#####..
.byte $00 ; 9BBD ........
; 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.
consoleFontHiresSymbols:
.byte $00 ; 9BBE ........
.byte $00 ; 9BBF ........
.byte $00 ; 9BC0 ........
.byte $00 ; 9BC1 ........
.byte $00 ; 9BC2 ........
.byte $18 ; 9BC3 ...##...
.byte $18 ; 9BC4 ...##...
.byte $00 ; 9BC5 ........
.byte $00 ; 9BC6 ........
.byte $18 ; 9BC7 ...##...
.byte $18 ; 9BC8 ...##...
.byte $18 ; 9BC9 ...##...
.byte $18 ; 9BCA ...##...
.byte $00 ; 9BCB ........
.byte $18 ; 9BCC ...##...
.byte $00 ; 9BCD ........
.byte $00 ; 9BCE ........
.byte $00 ; 9BCF ........
.byte $00 ; 9BD0 ........
.byte $00 ; 9BD1 ........
.byte $00 ; 9BD2 ........
.byte $18 ; 9BD3 ...##...
.byte $10 ; 9BD4 ...#....
.byte $20 ; 9BD5 ..#.....
.byte $00 ; 9BD6 ........
.byte $30 ; 9BD7 ..##....
.byte $60 ; 9BD8 .##.....
.byte $40 ; 9BD9 .#......
.byte $40 ; 9BDA .#......
.byte $60 ; 9BDB .##.....
.byte $30 ; 9BDC ..##....
.byte $00 ; 9BDD ........
.byte $00 ; 9BDE ........
.byte $30 ; 9BDF ..##....
.byte $18 ; 9BE0 ...##...
.byte $08 ; 9BE1 ....#...
.byte $08 ; 9BE2 ....#...
.byte $18 ; 9BE3 ...##...
.byte $30 ; 9BE4 ..##....
.byte $00 ; 9BE5 ........
.byte $00 ; 9BE6 ........
.byte $00 ; 9BE7 ........
.byte $00 ; 9BE8 ........
.byte $3C ; 9BE9 ..####..
.byte $00 ; 9BEA ........
.byte $00 ; 9BEB ........
.byte $00 ; 9BEC ........
.byte $00 ; 9BED ........
.byte $00 ; 9BEE ........
.byte $00 ; 9BEF ........
.byte $64 ; 9BF0 .##..#..
.byte $08 ; 9BF1 ....#...
.byte $10 ; 9BF2 ...#....
.byte $20 ; 9BF3 ..#.....
.byte $4C ; 9BF4 .#..##..
.byte $00 ; 9BF5 ........
.byte $18 ; 9BF6 ...##...
.byte $18 ; 9BF7 ...##...
.byte $18 ; 9BF8 ...##...
.byte $00 ; 9BF9 ........
.byte $00 ; 9BFA ........
.byte $00 ; 9BFB ........
.byte $00 ; 9BFC ........
.byte $00 ; 9BFD ........
.byte $00 ; 9BFE ........
.byte $38 ; 9BFF ..###...
D_9C00:
.byte $44 ; 9C00 .#...#..
.byte $08 ; 9C01 ....#...
.byte $10 ; 9C02 ...#....
.byte $00 ; 9C03 ........
.byte $18 ; 9C04 ...##...
.byte $00 ; 9C05 ........
.byte $00 ; 9C06 ........
.byte $18 ; 9C07 ...##...
.byte $18 ; 9C08 ...##...
.byte $00 ; 9C09 ........
.byte $00 ; 9C0A ........
.byte $18 ; 9C0B ...##...
.byte $18 ; 9C0C ...##...
.byte $00 ; 9C0D ........
.byte $00 ; 9C0E ........
.byte $28 ; 9C0F ..#.#...
.byte $10 ; 9C10 ...#....
.byte $7C ; 9C11 .#####..
.byte $10 ; 9C12 ...#....
.byte $28 ; 9C13 ..#.#...
.byte $00 ; 9C14 ........
.byte $00 ; 9C15 ........
.byte $00 ; 9C16 ........
.byte $00 ; 9C17 ........
.byte $08 ; 9C18 ....#...
.byte $08 ; 9C19 ....#...
.byte $3E ; 9C1A ..#####.
.byte $08 ; 9C1B ....#...
.byte $08 ; 9C1C ....#...
.byte $00 ; 9C1D ........
.byte $00 ; 9C1E ........
.byte $00 ; 9C1F ........
.byte $02 ; 9C20 ......#.
.byte $04 ; 9C21 .....#..
.byte $08 ; 9C22 ....#...
.byte $10 ; 9C23 ...#....
.byte $20 ; 9C24 ..#.....
.byte $00 ; 9C25 ........
.byte $00 ; 9C26 ........
.byte $00 ; 9C27 ........
.byte $00 ; 9C28 ........
.byte $3C ; 9C29 ..####..
.byte $00 ; 9C2A ........
.byte $3C ; 9C2B ..####..
.byte $00 ; 9C2C ........
.byte $00 ; 9C2D ........
.byte $24 ; 9C2E ..#..#..
.byte $24 ; 9C2F ..#..#..
.byte $24 ; 9C30 ..#..#..
.byte $00 ; 9C31 ........
.byte $00 ; 9C32 ........
.byte $00 ; 9C33 ........
.byte $00 ; 9C34 ........
.byte $00 ; 9C35 ........
.byte $00 ; 9C36 ........
.byte $00 ; 9C37 ........
.byte $14 ; 9C38 ...#.#..
.byte $3E ; 9C39 ..#####.
.byte $14 ; 9C3A ...#.#..
.byte $3E ; 9C3B ..#####.
.byte $14 ; 9C3C ...#.#..
.byte $00 ; 9C3D ........
.byte $10 ; 9C3E ...#....
.byte $3C ; 9C3F ..####..
.byte $40 ; 9C40 .#......
.byte $38 ; 9C41 ..###...
.byte $04 ; 9C42 .....#..
.byte $78 ; 9C43 .####...
.byte $10 ; 9C44 ...#....
.byte $00 ; 9C45 ........
.byte $00 ; 9C46 ........
.byte $3C ; 9C47 ..####..
.byte $42 ; 9C48 .#....#.
.byte $4A ; 9C49 .#..#.#.
.byte $5A ; 9C4A .#.##.#.
.byte $5E ; 9C4B .#.####.
.byte $40 ; 9C4C .#......
.byte $3C ; 9C4D ..####..
.byte $00 ; 9C4E ........
.byte $18 ; 9C4F ...##...
; Last fragment of consoleFontHires: the set ends at $9C6D, the last byte invertTextFonts flips.
.byte $18 ; 9C50 ...##...
.byte $00 ; 9C51 ........
.byte $00 ; 9C52 ........
.byte $18 ; 9C53 ...##...
.byte $18 ; 9C54 ...##...
.byte $30 ; 9C55 ..##....
.byte $00 ; 9C56 ........
.byte $08 ; 9C57 ....#...
.byte $08 ; 9C58 ....#...
.byte $78 ; 9C59 .####...
.byte $5E ; 9C5A .#.####.
.byte $78 ; 9C5B .####...
.byte $08 ; 9C5C ....#...
.byte $00 ; 9C5D ........
.byte $00 ; 9C5E ........
.byte $0C ; 9C5F ....##..
.byte $18 ; 9C60 ...##...
.byte $30 ; 9C61 ..##....
.byte $60 ; 9C62 .##.....
.byte $30 ; 9C63 ..##....
.byte $18 ; 9C64 ...##...
.byte $0C ; 9C65 ....##..
.byte $00 ; 9C66 ........
.byte $30 ; 9C67 ..##....
.byte $18 ; 9C68 ...##...
.byte $0C ; 9C69 ....##..
.byte $06 ; 9C6A .....##.
.byte $0C ; 9C6B ....##..
.byte $18 ; 9C6C ...##...
.byte $30 ; 9C6D ..##....
; 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).
terrainTileShapes:
.byte $00 ; 9C6E ........
.byte $00 ; 9C6F ........
.byte $00 ; 9C70 ........
.byte $00 ; 9C71 ........
.byte $00 ; 9C72 ........
.byte $00 ; 9C73 ........
.byte $00 ; 9C74 ........
.byte $00 ; 9C75 ........
; 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.
terrainTileContourShapes:
.byte $00 ; 9C76 ........
.byte $02 ; 9C77 ......#.
.byte $02 ; 9C78 ......#.
.byte $20 ; 9C79 ..#.....
.byte $13 ; 9C7A ...#..##
.byte $06 ; 9C7B .....##.
.byte $6C ; 9C7C .##.##..
.byte $08 ; 9C7D ....#...
.byte $00 ; 9C7E ........
.byte $40 ; 9C7F .#......
.byte $10 ; 9C80 ...#....
.byte $10 ; 9C81 ...#....
.byte $C0 ; 9C82 ##......
.byte $62 ; 9C83 .##...#.
.byte $34 ; 9C84 ..##.#..
.byte $10 ; 9C85 ...#....
.byte $08 ; 9C86 ....#...
.byte $6C ; 9C87 .##.##..
.byte $06 ; 9C88 .....##.
.byte $33 ; 9C89 ..##..##
.byte $00 ; 9C8A ........
.byte $02 ; 9C8B ......#.
.byte $02 ; 9C8C ......#.
.byte $00 ; 9C8D ........
.byte $10 ; 9C8E ...#....
.byte $36 ; 9C8F ..##.##.
.byte $60 ; 9C90 .##.....
.byte $C8 ; 9C91 ##..#...
.byte $04 ; 9C92 .....#..
.byte $20 ; 9C93 ..#.....
.byte $20 ; 9C94 ..#.....
.byte $00 ; 9C95 ........
.byte $00 ; 9C96 ........
.byte $00 ; 9C97 ........
.byte $00 ; 9C98 ........
.byte $03 ; 9C99 ......##
.byte $06 ; 9C9A .....##.
.byte $0C ; 9C9B ....##..
.byte $1A ; 9C9C ...##.#.
.byte $10 ; 9C9D ...#....
.byte $00 ; 9C9E ........
.byte $00 ; 9C9F ........
.byte $00 ; 9CA0 ........
.byte $C0 ; 9CA1 ##......
.byte $60 ; 9CA2 .##.....
.byte $30 ; 9CA3 ..##....
.byte $58 ; 9CA4 .#.##...
.byte $08 ; 9CA5 ....#...
.byte $10 ; 9CA6 ...#....
.byte $1A ; 9CA7 ...##.#.
.byte $0C ; 9CA8 ....##..
.byte $06 ; 9CA9 .....##.
.byte $03 ; 9CAA ......##
.byte $00 ; 9CAB ........
.byte $00 ; 9CAC ........
.byte $00 ; 9CAD ........
.byte $08 ; 9CAE ....#...
.byte $58 ; 9CAF .#.##...
.byte $30 ; 9CB0 ..##....
.byte $60 ; 9CB1 .##.....
.byte $C0 ; 9CB2 ##......
.byte $00 ; 9CB3 ........
.byte $00 ; 9CB4 ........
.byte $00 ; 9CB5 ........
.byte $08 ; 9CB6 ....#...
.byte $08 ; 9CB7 ....#...
.byte $48 ; 9CB8 .#..#...
.byte $08 ; 9CB9 ....#...
.byte $08 ; 9CBA ....#...
.byte $08 ; 9CBB ....#...
.byte $48 ; 9CBC .#..#...
.byte $08 ; 9CBD ....#...
.byte $08 ; 9CBE ....#...
.byte $48 ; 9CBF .#..#...
.byte $0C ; 9CC0 ....##..
.byte $64 ; 9CC1 .##..#..
.byte $04 ; 9CC2 .....#..
.byte $0C ; 9CC3 ....##..
.byte $48 ; 9CC4 .#..#...
.byte $08 ; 9CC5 ....#...
.byte $10 ; 9CC6 ...#....
.byte $12 ; 9CC7 ...#..#.
.byte $10 ; 9CC8 ...#....
.byte $12 ; 9CC9 ...#..#.
.byte $10 ; 9CCA ...#....
.byte $10 ; 9CCB ...#....
.byte $12 ; 9CCC ...#..#.
.byte $10 ; 9CCD ...#....
.byte $10 ; 9CCE ...#....
.byte $12 ; 9CCF ...#..#.
.byte $30 ; 9CD0 ..##....
.byte $22 ; 9CD1 ..#...#.
.byte $24 ; 9CD2 ..#..#..
.byte $30 ; 9CD3 ..##....
.byte $12 ; 9CD4 ...#..#.
.byte $10 ; 9CD5 ...#....
.byte $00 ; 9CD6 ........
.byte $88 ; 9CD7 #...#...
.byte $48 ; 9CD8 .#..#...
.byte $00 ; 9CD9 ........
.byte $FF ; 9CDA ########
.byte $00 ; 9CDB ........
.byte $00 ; 9CDC ........
.byte $00 ; 9CDD ........
.byte $00 ; 9CDE ........
.byte $90 ; 9CDF #..#....
.byte $54 ; 9CE0 .#.#.#..
.byte $00 ; 9CE1 ........
.byte $CF ; 9CE2 ##..####
.byte $78 ; 9CE3 .####...
.byte $00 ; 9CE4 ........
.byte $00 ; 9CE5 ........
.byte $00 ; 9CE6 ........
.byte $84 ; 9CE7 #....#..
.byte $40 ; 9CE8 .#......
.byte $07 ; 9CE9 .....###
.byte $ED ; 9CEA ###.##.#
.byte $38 ; 9CEB ..###...
.byte $00 ; 9CEC ........
.byte $00 ; 9CED ........
.byte $00 ; 9CEE ........
.byte $80 ; 9CEF #.......
.byte $52 ; 9CF0 .#.#..#.
.byte $10 ; 9CF1 ...#....
.byte $C1 ; 9CF2 ##.....#
.byte $7B ; 9CF3 .####.##
.byte $0E ; 9CF4 ....###.
.byte $00 ; 9CF5 ........
.byte $00 ; 9CF6 ........
.byte $00 ; 9CF7 ........
.byte $00 ; 9CF8 ........
.byte $F7 ; 9CF9 ####.###
.byte $1C ; 9CFA ...###..
.byte $02 ; 9CFB ......#.
.byte $44 ; 9CFC .#...#..
.byte $00 ; 9CFD ........
.byte $00 ; 9CFE ........
.byte $00 ; 9CFF ........
.byte $70 ; 9D00 .###....
.byte $D3 ; 9D01 ##.#..##
.byte $1E ; 9D02 ...####.
.byte $40 ; 9D03 .#......
.byte $48 ; 9D04 .#..#...
.byte $00 ; 9D05 ........
.byte $00 ; 9D06 ........
.byte $00 ; 9D07 ........
.byte $3C ; 9D08 ..####..
.byte $E7 ; 9D09 ###..###
.byte $10 ; 9D0A ...#....
.byte $92 ; 9D0B #..#..#.
.byte $00 ; 9D0C ........
.byte $00 ; 9D0D ........
.byte $00 ; 9D0E ........
.byte $00 ; 9D0F ........
.byte $00 ; 9D10 ........
.byte $FF ; 9D11 ########
.byte $00 ; 9D12 ........
.byte $94 ; 9D13 #..#.#..
.byte $10 ; 9D14 ...#....
.byte $00 ; 9D15 ........
; 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.
terrainTileRiverShapes:
.byte $00 ; 9D16 ........
.byte $00 ; 9D17 ........
.byte $03 ; 9D18 ......##
.byte $0F ; 9D19 ....####
.byte $1F ; 9D1A ...#####
.byte $1F ; 9D1B ...#####
.byte $3E ; 9D1C ..#####.
.byte $3C ; 9D1D ..####..
.byte $00 ; 9D1E ........
.byte $00 ; 9D1F ........
.byte $C0 ; 9D20 ##......
.byte $F0 ; 9D21 ####....
.byte $F8 ; 9D22 #####...
.byte $F8 ; 9D23 #####...
.byte $7C ; 9D24 .#####..
.byte $3C ; 9D25 ..####..
.byte $3C ; 9D26 ..####..
.byte $3E ; 9D27 ..#####.
.byte $1F ; 9D28 ...#####
.byte $1F ; 9D29 ...#####
.byte $0F ; 9D2A ....####
.byte $03 ; 9D2B ......##
.byte $00 ; 9D2C ........
.byte $00 ; 9D2D ........
.byte $3C ; 9D2E ..####..
.byte $7C ; 9D2F .#####..
.byte $F8 ; 9D30 #####...
.byte $F8 ; 9D31 #####...
.byte $F0 ; 9D32 ####....
.byte $C0 ; 9D33 ##......
.byte $00 ; 9D34 ........
.byte $00 ; 9D35 ........
.byte $00 ; 9D36 ........
.byte $00 ; 9D37 ........
.byte $FF ; 9D38 ########
.byte $FF ; 9D39 ########
.byte $FF ; 9D3A ########
.byte $FF ; 9D3B ########
.byte $00 ; 9D3C ........
.byte $00 ; 9D3D ........
.byte $00 ; 9D3E ........
.byte $00 ; 9D3F ........
.byte $F3 ; 9D40 ####..##
.byte $FF ; 9D41 ########
.byte $FF ; 9D42 ########
.byte $FF ; 9D43 ########
.byte $1E ; 9D44 ...####.
.byte $00 ; 9D45 ........
.byte $00 ; 9D46 ........
.byte $0E ; 9D47 ....###.
.byte $9F ; 9D48 #..#####
.byte $FF ; 9D49 ########
.byte $FF ; 9D4A ########
.byte $FB ; 9D4B #####.##
.byte $F0 ; 9D4C ####....
.byte $00 ; 9D4D ........
.byte $00 ; 9D4E ........
.byte $3C ; 9D4F ..####..
.byte $FF ; 9D50 ########
.byte $FF ; 9D51 ########
.byte $FF ; 9D52 ########
.byte $E7 ; 9D53 ###..###
.byte $00 ; 9D54 ........
.byte $00 ; 9D55 ........
; Tiles $1D-$20 - forest, map codes $5D-$60: four dense noise patterns.
terrainTileForestShapes:
.byte $4C ; 9D56 .#..##..
.byte $D5 ; 9D57 ##.#.#.#
.byte $2C ; 9D58 ..#.##..
.byte $0B ; 9D59 ....#.##
.byte $B4 ; 9D5A #.##.#..
.byte $50 ; 9D5B .#.#....
.byte $E6 ; 9D5C ###..##.
.byte $28 ; 9D5D ..#.#...
.byte $14 ; 9D5E ...#.#..
.byte $2E ; 9D5F ..#.###.
.byte $68 ; 9D60 .##.#...
.byte $15 ; 9D61 ...#.#.#
.byte $44 ; 9D62 .#...#..
.byte $99 ; 9D63 #..##..#
.byte $42 ; 9D64 .#....#.
.byte $4D ; 9D65 .#..##.#
.byte $01 ; 9D66 .......#
.byte $8A ; 9D67 #...#.#.
.byte $59 ; 9D68 .#.##..#
.byte $36 ; 9D69 ..##.##.
.byte $28 ; 9D6A ..#.#...
.byte $4B ; 9D6B .#..#.##
.byte $B6 ; 9D6C #.##.##.
.byte $99 ; 9D6D #..##..#
.byte $A1 ; 9D6E #.#....#
.byte $52 ; 9D6F .#.#..#.
.byte $4A ; 9D70 .#..#.#.
.byte $29 ; 9D71 ..#.#..#
.byte $56 ; 9D72 .#.#.##.
.byte $34 ; 9D73 ..##.#..
.byte $8D ; 9D74 #...##.#
.byte $21 ; 9D75 ..#....#
; Tiles $21-$24 - hillside, map codes $61-$64: four sparse dot patterns.
terrainTileHillShapes:
.byte $02 ; 9D76 ......#.
.byte $00 ; 9D77 ........
.byte $20 ; 9D78 ..#.....
.byte $00 ; 9D79 ........
.byte $04 ; 9D7A .....#..
.byte $00 ; 9D7B ........
.byte $10 ; 9D7C ...#....
.byte $00 ; 9D7D ........
.byte $00 ; 9D7E ........
.byte $00 ; 9D7F ........
.byte $22 ; 9D80 ..#...#.
.byte $00 ; 9D81 ........
.byte $10 ; 9D82 ...#....
.byte $04 ; 9D83 .....#..
.byte $00 ; 9D84 ........
.byte $10 ; 9D85 ...#....
.byte $00 ; 9D86 ........
.byte $04 ; 9D87 .....#..
.byte $20 ; 9D88 ..#.....
.byte $00 ; 9D89 ........
.byte $08 ; 9D8A ....#...
.byte $20 ; 9D8B ..#.....
.byte $00 ; 9D8C ........
.byte $01 ; 9D8D .......#
.byte $00 ; 9D8E ........
.byte $00 ; 9D8F ........
.byte $20 ; 9D90 ..#.....
.byte $04 ; 9D91 .....#..
.byte $10 ; 9D92 ...#....
.byte $00 ; 9D93 ........
.byte $02 ; 9D94 ......#.
.byte $00 ; 9D95 ........
; Tiles $25-$26 - summit, map codes $65-$66: two very sparse dot patterns.
terrainTileSummitShapes:
.byte $00 ; 9D96 ........
.byte $00 ; 9D97 ........
.byte $20 ; 9D98 ..#.....
.byte $00 ; 9D99 ........
.byte $04 ; 9D9A .....#..
.byte $00 ; 9D9B ........
.byte $10 ; 9D9C ...#....
.byte $00 ; 9D9D ........
.byte $00 ; 9D9E ........
.byte $00 ; 9D9F ........
.byte $02 ; 9DA0 ......#.
.byte $00 ; 9DA1 ........
.byte $00 ; 9DA2 ........
.byte $00 ; 9DA3 ........
.byte $00 ; 9DA4 ........
.byte $10 ; 9DA5 ...#....
; Tile $27 - the recycler, map code $67: a boxed cross.
terrainTileRecyclerShape:
.byte $FE ; 9DA6 #######.
.byte $82 ; 9DA7 #.....#.
.byte $92 ; 9DA8 #..#..#.
.byte $BA ; 9DA9 #.###.#.
.byte $92 ; 9DAA #..#..#.
.byte $82 ; 9DAB #.....#.
.byte $FE ; 9DAC #######.
.byte $00 ; 9DAD ........
; 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.
terrainTileEndZoneShapes:
.byte $FF ; 9DAE ########
.byte $9F ; 9DAF #..#####
.byte $99 ; 9DB0 #..##..#
.byte $F9 ; 9DB1 #####..#
.byte $FF ; 9DB2 ########
.byte $CF ; 9DB3 ##..####
.byte $CF ; 9DB4 ##..####
.byte $FF ; 9DB5 ########
.byte $FF ; 9DB6 ########
.byte $F9 ; 9DB7 #####..#
.byte $99 ; 9DB8 #..##..#
.byte $9F ; 9DB9 #..#####
.byte $FF ; 9DBA ########
.byte $F3 ; 9DBB ####..##
.byte $F3 ; 9DBC ####..##
.byte $FF ; 9DBD ########
.byte $FF ; 9DBE ########
.byte $F3 ; 9DBF ####..##
.byte $F3 ; 9DC0 ####..##
.byte $FF ; 9DC1 ########
.byte $9F ; 9DC2 #..#####
.byte $99 ; 9DC3 #..##..#
.byte $F9 ; 9DC4 #####..#
.byte $FF ; 9DC5 ########
.byte $FF ; 9DC6 ########
.byte $CF ; 9DC7 ##..####
.byte $CF ; 9DC8 ##..####
.byte $FF ; 9DC9 ########
.byte $F9 ; 9DCA #####..#
.byte $99 ; 9DCB #..##..#
.byte $9F ; 9DCC #..#####
.byte $FF ; 9DCD ########
; 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.
unitSymbolShapes:
.byte $00 ; 9DCE ........
.byte $10 ; 9DCF ...#....
.byte $10 ; 9DD0 ...#....
.byte $28 ; 9DD1 ..#.#...
.byte $7C ; 9DD2 .#####..
.byte $38 ; 9DD3 ..###...
.byte $00 ; 9DD4 ........
.byte $00 ; 9DD5 ........
.byte $00 ; 9DD6 ........
.byte $38 ; 9DD7 ..###...
.byte $7C ; 9DD8 .#####..
.byte $28 ; 9DD9 ..#.#...
.byte $10 ; 9DDA ...#....
.byte $10 ; 9DDB ...#....
.byte $00 ; 9DDC ........
.byte $00 ; 9DDD ........
.byte $00 ; 9DDE ........
.byte $20 ; 9DDF ..#.....
.byte $70 ; 9DE0 .###....
.byte $6C ; 9DE1 .##.##..
.byte $70 ; 9DE2 .###....
.byte $20 ; 9DE3 ..#.....
.byte $00 ; 9DE4 ........
.byte $00 ; 9DE5 ........
.byte $00 ; 9DE6 ........
.byte $08 ; 9DE7 ....#...
.byte $1C ; 9DE8 ...###..
.byte $6C ; 9DE9 .##.##..
.byte $1C ; 9DEA ...###..
.byte $08 ; 9DEB ....#...
.byte $00 ; 9DEC ........
.byte $00 ; 9DED ........
; Glyphs $30-$33 - RIDER, the four facings.
unitSymbolShapesRider:
.byte $00 ; 9DEE ........
.byte $10 ; 9DEF ...#....
.byte $54 ; 9DF0 .#.#.#..
.byte $38 ; 9DF1 ..###...
.byte $38 ; 9DF2 ..###...
.byte $C6 ; 9DF3 ##...##.
.byte $82 ; 9DF4 #.....#.
.byte $00 ; 9DF5 ........
.byte $41 ; 9DF6 .#.....#
.byte $63 ; 9DF7 .##...##
.byte $1C ; 9DF8 ...###..
.byte $1C ; 9DF9 ...###..
.byte $2A ; 9DFA ..#.#.#.
.byte $08 ; 9DFB ....#...
.byte $00 ; 9DFC ........
.byte $00 ; 9DFD ........
.byte $60 ; 9DFE .##.....
.byte $24 ; 9DFF ..#..#..
.byte $18 ; 9E00 ...##...
.byte $1E ; 9E01 ...####.
.byte $18 ; 9E02 ...##...
.byte $24 ; 9E03 ..#..#..
.byte $60 ; 9E04 .##.....
.byte $00 ; 9E05 ........
.byte $06 ; 9E06 .....##.
.byte $24 ; 9E07 ..#..#..
.byte $18 ; 9E08 ...##...
.byte $78 ; 9E09 .####...
.byte $18 ; 9E0A ...##...
.byte $24 ; 9E0B ..#..#..
.byte $06 ; 9E0C .....##.
.byte $00 ; 9E0D ........
; Glyphs $34-$37 - BOOMER, the four facings.
unitSymbolShapesBoomer:
.byte $38 ; 9E0E ..###...
.byte $10 ; 9E0F ...#....
.byte $10 ; 9E10 ...#....
.byte $10 ; 9E11 ...#....
.byte $7C ; 9E12 .#####..
.byte $7C ; 9E13 .#####..
.byte $00 ; 9E14 ........
.byte $00 ; 9E15 ........
.byte $00 ; 9E16 ........
.byte $7C ; 9E17 .#####..
.byte $7C ; 9E18 .#####..
.byte $10 ; 9E19 ...#....
.byte $10 ; 9E1A ...#....
.byte $10 ; 9E1B ...#....
.byte $38 ; 9E1C ..###...
.byte $00 ; 9E1D ........
.byte $00 ; 9E1E ........
.byte $60 ; 9E1F .##.....
.byte $62 ; 9E20 .##...#.
.byte $7E ; 9E21 .######.
.byte $62 ; 9E22 .##...#.
.byte $60 ; 9E23 .##.....
.byte $00 ; 9E24 ........
.byte $00 ; 9E25 ........
.byte $00 ; 9E26 ........
.byte $0C ; 9E27 ....##..
.byte $8C ; 9E28 #...##..
.byte $FC ; 9E29 ######..
.byte $8C ; 9E2A #...##..
.byte $0C ; 9E2B ....##..
.byte $00 ; 9E2C ........
.byte $00 ; 9E2D ........
; Glyphs $38-$3B - SPY, the four facings.
unitSymbolShapesSpy:
.byte $00 ; 9E2E ........
.byte $44 ; 9E2F .#...#..
.byte $44 ; 9E30 .#...#..
.byte $38 ; 9E31 ..###...
.byte $10 ; 9E32 ...#....
.byte $10 ; 9E33 ...#....
.byte $00 ; 9E34 ........
.byte $00 ; 9E35 ........
.byte $00 ; 9E36 ........
.byte $10 ; 9E37 ...#....
.byte $10 ; 9E38 ...#....
.byte $38 ; 9E39 ..###...
.byte $44 ; 9E3A .#...#..
.byte $44 ; 9E3B .#...#..
.byte $00 ; 9E3C ........
.byte $00 ; 9E3D ........
.byte $00 ; 9E3E ........
.byte $0C ; 9E3F ....##..
.byte $10 ; 9E40 ...#....
.byte $70 ; 9E41 .###....
.byte $10 ; 9E42 ...#....
.byte $0C ; 9E43 ....##..
.byte $00 ; 9E44 ........
.byte $00 ; 9E45 ........
.byte $00 ; 9E46 ........
.byte $60 ; 9E47 .##.....
.byte $10 ; 9E48 ...#....
.byte $1C ; 9E49 ...###..
.byte $10 ; 9E4A ...#....
.byte $60 ; 9E4B .##.....
.byte $00 ; 9E4C ........
.byte $00 ; 9E4D ........
; Glyphs $3C-$3F - COMCEN, the four facings; the last shape of the table, which ends at $9E6E.
unitSymbolShapesComcen:
.byte $18 ; 9E4E ...##...
.byte $3C ; 9E4F ..####..
.byte $42 ; 9E50 .#....#.
.byte $7E ; 9E51 .######.
.byte $7E ; 9E52 .######.
.byte $7E ; 9E53 .######.
.byte $7E ; 9E54 .######.
.byte $00 ; 9E55 ........
.byte $7E ; 9E56 .######.
.byte $7E ; 9E57 .######.
.byte $7E ; 9E58 .######.
.byte $7E ; 9E59 .######.
.byte $42 ; 9E5A .#....#.
.byte $3C ; 9E5B ..####..
.byte $18 ; 9E5C ...##...
.byte $00 ; 9E5D ........
.byte $00 ; 9E5E ........
.byte $7C ; 9E5F .#####..
.byte $76 ; 9E60 .###.##.
.byte $77 ; 9E61 .###.###
.byte $77 ; 9E62 .###.###
.byte $76 ; 9E63 .###.##.
.byte $7C ; 9E64 .#####..
.byte $00 ; 9E65 ........
.byte $00 ; 9E66 ........
.byte $3E ; 9E67 ..#####.
.byte $6E ; 9E68 .##.###.
.byte $EE ; 9E69 ###.###.
.byte $EE ; 9E6A ###.###.
.byte $6E ; 9E6B .##.###.
.byte $3E ; 9E6C ..#####.
.byte $00 ; 9E6D ........
; 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.
cursorSquareShape:
.byte $FC,$00,$00 ; 9E6E ######..................
.byte $84,$00,$00 ; 9E71 #....#..................
.byte $84,$00,$00 ; 9E74 #....#..................
.byte $84,$00,$00 ; 9E77 #....#..................
.byte $84,$00,$00 ; 9E7A #....#..................
.byte $FC,$00,$00 ; 9E7D ######..................
; 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).
cursorCrossShape:
.byte $30,$00,$00 ; 9E80 ..##....................
.byte $30,$00,$00 ; 9E83 ..##....................
.byte $FC,$00,$00 ; 9E86 ######..................
.byte $FC,$00,$00 ; 9E89 ######..................
.byte $30,$00,$00 ; 9E8C ..##....................
.byte $30,$00,$00 ; 9E8F ..##....................
; 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).
cursorBlockShape:
.byte $00,$00,$00 ; 9E92 ........................
.byte $78,$00,$00 ; 9E95 .####...................
.byte $78,$00,$00 ; 9E98 .####...................
.byte $78,$00,$00 ; 9E9B .####...................
.byte $78,$00,$00 ; 9E9E .####...................
.byte $00,$00,$00 ; 9EA1 ........................
; 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.
cursorBoxSprite:
.byte $00,$00,$00 ; 9EA4 ........................
.byte $00,$00,$00 ; 9EA7 ........................
.byte $00,$00,$00 ; 9EAA ........................
.byte $00,$00,$00 ; 9EAD ........................
.byte $00,$00,$00 ; 9EB0 ........................
.byte $00,$00,$00 ; 9EB3 ........................
.byte $03,$FF,$80 ; 9EB6 ......###########.......
.byte $03,$01,$80 ; 9EB9 ......##.......##.......
.byte $03,$01,$80 ; 9EBC ......##.......##.......
.byte $03,$01,$80 ; 9EBF ......##.......##.......
.byte $03,$01,$80 ; 9EC2 ......##.......##.......
.byte $03,$01,$80 ; 9EC5 ......##.......##.......
.byte $03,$01,$80 ; 9EC8 ......##.......##.......
.byte $03,$01,$80 ; 9ECB ......##.......##.......
.byte $03,$FF,$80 ; 9ECE ......###########.......
.byte $00,$00,$00 ; 9ED1 ........................
.byte $00,$00,$00 ; 9ED4 ........................
.byte $00,$00,$00 ; 9ED7 ........................
.byte $00,$00,$00 ; 9EDA ........................
.byte $00,$00,$00 ; 9EDD ........................
.byte $00,$00,$00 ; 9EE0 ........................
; 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.
crosshairSprite:
.byte $00,$00,$00 ; 9EE3 ........................
.byte $00,$00,$00 ; 9EE6 ........................
.byte $00,$00,$00 ; 9EE9 ........................
.byte $00,$00,$00 ; 9EEC ........................
.byte $00,$10,$00 ; 9EEF ...........#............
.byte $00,$10,$00 ; 9EF2 ...........#............
.byte $00,$38,$00 ; 9EF5 ..........###...........
.byte $00,$44,$00 ; 9EF8 .........#...#..........
.byte $00,$82,$00 ; 9EFB ........#.....#.........
.byte $01,$01,$00 ; 9EFE .......#.......#........
.byte $07,$01,$C0 ; 9F01 .....###.......###......
.byte $01,$01,$00 ; 9F04 .......#.......#........
.byte $00,$82,$00 ; 9F07 ........#.....#.........
.byte $00,$44,$00 ; 9F0A .........#...#..........
.byte $00,$38,$00 ; 9F0D ..........###...........
.byte $00,$10,$00 ; 9F10 ...........#............
.byte $00,$10,$00 ; 9F13 ...........#............
.byte $00,$00,$00 ; 9F16 ........................
.byte $00,$00,$00 ; 9F19 ........................
.byte $00,$00,$00 ; 9F1C ........................
.byte $00,$00,$00 ; 9F1F ........................
; 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.
comcenCrossMarkerShape:
.byte $00,$0C,$00 ; 9F22 ............##..........
.byte $00,$0C,$00 ; 9F25 ............##..........
.byte $00,$0C,$00 ; 9F28 ............##..........
.byte $00,$7F,$80 ; 9F2B .........########.......
.byte $00,$0C,$00 ; 9F2E ............##..........
.byte $00,$0C,$00 ; 9F31 ............##..........
.byte $00,$0C,$00 ; 9F34 ............##..........
; 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.
circleDxPtrLoTable:
.byte $69,$6F,$73,$79,$7F,$8B,$97,$A1,$AF,$BF; 9F37 iosy...... radii 1-10
; 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.
circleDxPtrHiTable:
.byte $9F,$9F,$9F,$9F,$9F,$9F,$9F,$9F,$9F,$9F; 9F41 .......... radii 1-10, all $9F
; 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.
circleDyPtrLoTable:
.byte $6C,$71,$76,$7C,$85,$91,$9C,$A8,$B7,$C8; 9F4B lqv|...... radii 1-10
; circleDyPtrHiTable - high bytes of the ten dy pointers, all $9F; read at $324C.
circleDyPtrHiTable:
.byte $9F,$9F,$9F,$9F,$9F,$9F,$9F,$9F,$9F,$9F; 9F55 .......... radii 1-10, all $9F
; 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.
circleStepCountTable:
.byte $02,$01,$02,$02,$05,$05,$04,$06,$07,$08; 9F5F .......... radii 1-10
; 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
circleDeltasRadius1:
.byte $00,$01,$01 ; 9F69 ... dx list, then dy list
.byte $00,$00,$01 ; 9F6C ...
; Radius 2: dx 02,02 / dy 00,01
circleDeltasRadius2:
.byte $02,$02 ; 9F6F .. dx list, then dy list
.byte $00,$01 ; 9F71 ..
; Radius 3: dx 03,03,02 / dy 00,01,02
circleDeltasRadius3:
.byte $03,$03,$02 ; 9F73 ... dx list, then dy list
.byte $00,$01,$02 ; 9F76 ...
; Radius 4: dx 04,04,03 / dy 00,01,02
circleDeltasRadius4:
.byte $04,$04,$03 ; 9F79 ... dx list, then dy list
.byte $00,$01,$02 ; 9F7C ...
; Radius 5: dx 05,05,05,04,04,03 / dy 00,01,02,02,03,03
circleDeltasRadius5:
.byte $05,$05,$05,$04,$04,$03 ; 9F7F ...... dx list, then dy list
.byte $00,$01,$02,$02,$03,$03 ; 9F85 ......
; 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).
circleDeltasRadius6:
.byte $06,$06,$06,$05,$05,$04 ; 9F8B ...... dx list, then dy list
.byte $00,$01,$02,$05,$03,$04 ; 9F91 ......
; Radius 7: dx 07,07,07,06,05 / dy 00,01,02,03,04
circleDeltasRadius7:
.byte $07,$07,$07,$06,$05 ; 9F97 ..... dx list, then dy list
.byte $00,$01,$02,$03,$04 ; 9F9C .....
; Radius 8: dx 08,08,08,07,06,06,05 / dy 00,01,02,03,04,05,05
circleDeltasRadius8:
.byte $08,$08,$08,$07,$06,$06,$05; 9FA1 ....... dx list, then dy list
.byte $00,$01,$02,$03,$04,$05,$05; 9FA8 .......
; Radius 9: dx 09,09,09,08,08,07,07,06 / dy 00,01,02,03,04,04,05,06
circleDeltasRadius9:
.byte $09,$09,$09,$08,$08,$07,$07,$06; 9FAF ........ dx list, then dy list
.byte $00,$01,$02,$03,$04,$04,$05,$06; 9FB7 ........
; Radius 10: dx 0A,0A,0A,09,09,08,07,07,08 / dy 00,01,02,03,04,05,06,07,06
circleDeltasRadius10:
.byte $0A,$0A,$0A,$09,$09,$08,$07,$07,$08; 9FBF ......... dx list, then dy list
.byte $00,$01,$02,$03,$04,$05,$06,$07,$06; 9FC8 .........
; 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.
graphicsBlockTail:
.byte $FF,$00,$FF,$00,$3F,$00,$3F,$00,$FF,$00,$FF,$00,$FF,$00,$33,$FF,$00,$FF,$00,$FF,$00,$FF,$C0; 9FD1 ....?.?.......3........ filler to the end of the sector
; 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.
.byte $FF,$00,$FF,$00,$FF,$00,$FF,$00; 9FE8 ........
.byte $00,$F3,$00,$3F,$00,$3F,$30,$FF; 9FF0 ...?.?0.
.byte $00,$FF,$00,$FF,$00,$FF,$00,$FF; 9FF8 ........