; ============================================================================ ; $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 ........