1138 lines
No EOL
26 KiB
JSON
1138 lines
No EOL
26 KiB
JSON
{
|
|
"chunk": "boot_titleBitmapA000_A000",
|
|
"unit": "boot/titleBitmapA000",
|
|
"unitLabels": {
|
|
"boot/titleBitmapA000": {
|
|
"A000": "titleBitmap",
|
|
"AAEA": "titleBitmapAAEA",
|
|
"BAA2": "titleBitmapBAA2",
|
|
"BAA3": "titleBitmapBAA3",
|
|
"BF40": "leftoverDataDiskCode",
|
|
"BF5C": "leftoverTableBF5C",
|
|
"BF5F": "leftoverDiskPrompt",
|
|
"BF7C": "leftoverSwapDisks",
|
|
"BF9C": "leftoverGrabSaveSlots",
|
|
"BFB0": "mapRowAddrLoTable",
|
|
"BFC5": "leftoverStampSerial",
|
|
"BFD8": "mapRowAddrHiTable",
|
|
"BFDA": "leftoverReadTrack18Sector",
|
|
"BFED": "titleFileTailFiller"
|
|
}
|
|
},
|
|
"notes": {
|
|
"A000": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"titleBitmap - the 8000-byte multicolour bitmap of the title picture, $A000-$BF3F. It is bytes",
|
|
"$0800-$27FF of the 11264-byte directory file 'load' (tracks 19-21, not encrypted), which the",
|
|
"stage-1 stub at $02B8 KERNAL-LOADs to $9800-$C3FF - into the RAM under the ROMs - so the picture",
|
|
"arrives already at the address the VIC reads it from: no code ever copies it.",
|
|
"Layout is the VIC's own: 25 character rows of 40 cells, 8 consecutive bytes per cell (one byte per",
|
|
"pixel row of that cell), so cell (row,col) is at $A000 + 320*row + 8*col and every line below is one",
|
|
"8x8 cell. Each byte holds four 2-bit pixels (leftmost in bits 7-6): %00 = background $D021 (black,",
|
|
"set at $C14E), %01 = the high nibble of titleScreenRam[cell], %10 = its low nibble, %11 = the low",
|
|
"nibble of titleColorRam[cell]. bootShowTitlePicture ($C23F) copies those two 1000-byte tables from",
|
|
"$9800 -> COLOR_RAM and $9C00 -> $8C00, selects VIC bank 2 (CIA2_PRA = $05) and sets VIC_CTRL2 = $D8",
|
|
"(multicolour), VIC_MEM_PTR = $38 (video matrix $8C00, bitmap $A000) and VIC_CTRL1 = $3B (bitmap on).",
|
|
"The CPU still has BASIC ROM banked in over $A000-$BFFF at that moment - only the VIC, which always",
|
|
"sees RAM, can read these bytes; the game switches to $01 = $35 later.",
|
|
"The picture: Dan Bunten's name over the 'MODEM WARS' logo, a striding walker tank firing (a second",
|
|
"walker behind it on the left, its shot crossing the logo), an explosion and smoke on the right, and",
|
|
"the copyright line along the bottom. docs/titleScreen.png is these bytes decoded.",
|
|
"No CPU code in the shipped game reads or writes the picture: it is shown while the disk loads and",
|
|
"then thrown away. From $0800 on this is simply the game's own display bitmap - initBitmapScreen",
|
|
"($2D41) clears $A000-$BF3F (and stops there, because $BFB0-$BFFF holds the map row tables).",
|
|
"The three labels inside the picture (titleBitmapAAEA, titleBitmapBAA2, titleBitmapBAA3) are not",
|
|
"data: they are the operands of dead or patched instructions in the boot loader - see each one.",
|
|
"Row 0 (pixel rows 0-7): sky (light blue) across columns 0-31, the yellow caption \"DAN BUNTEN'S\"",
|
|
"starting on pixel row 5 in columns 13-25, and the grey-black smoke column in columns 26-39."
|
|
]
|
|
},
|
|
"A140": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Row 1 (pixel rows 8-15): the caption ends on pixel row 11; pixel row 15 is the yellow top rim",
|
|
"that runs the whole width of the 'MODEM WARS' logo. Smoke still fills columns 27-39."
|
|
]
|
|
},
|
|
"A280": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Row 2 (pixel rows 16-23): first body row of the logo - dark red block letters with a black",
|
|
"outline, sky showing between them in columns 0-28, smoke in columns 30-39."
|
|
]
|
|
},
|
|
"A3C0": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Row 3 (pixel rows 24-31): logo body; the white muzzle flash of the background walker's gun",
|
|
"reaches column 0 at the left."
|
|
]
|
|
},
|
|
"A500": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Row 4 (pixel rows 32-39): logo body with the white-and-orange muzzle flash over columns 0-5."
|
|
]
|
|
},
|
|
"A640": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Row 5 (pixel rows 40-47): logo body; the flash (columns 2-5) and the grey gun barrel that runs",
|
|
"down and to the right from it, drawn straight over the letters."
|
|
]
|
|
},
|
|
"A780": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Row 6 (pixel rows 48-55): logo body; flash and barrel in columns 2-7."
|
|
]
|
|
},
|
|
"A8C0": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Row 7 (pixel rows 56-63): last body row of the logo - the letters end on pixel row 62 and pixel",
|
|
"row 63 is their black shadow line; the barrel continues in columns 2-9."
|
|
]
|
|
},
|
|
"AA00": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Row 8 (pixel rows 64-71): sky, the top of the big walker's hull (greys, columns 7-28) with the",
|
|
"white barrel highlight in columns 8-25, and smoke turning into the explosion in columns 29-39."
|
|
]
|
|
},
|
|
"AAEA": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "row 8, column 29, pixel rows 2-7: dark grey smoke against the sky, ordinary picture bytes. The label exists only because the boot loader's STA $AAEA,Y at $C168 carries this address as its operand, and that instruction is patched to TXS (INC $C168 at $C242) before it is ever executed - nothing is ever stored here"
|
|
},
|
|
"AB40": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Row 9 (pixel rows 72-79): walker hull and turret; the first orange and yellow pixels of the",
|
|
"explosion appear in columns 30-35."
|
|
]
|
|
},
|
|
"AC80": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Row 10 (pixel rows 80-87): hull and raised turret; the explosion (white, yellow, orange, red)",
|
|
"now covers columns 30-39."
|
|
]
|
|
},
|
|
"ADC0": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Row 11 (pixel rows 88-95): hull; explosion in columns 30-39."
|
|
]
|
|
},
|
|
"AF00": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Row 12 (pixel rows 96-103): the underside of the hull; explosion in columns 31-39."
|
|
]
|
|
},
|
|
"B040": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Row 13 (pixel rows 104-111): sky in columns 0-6, the hull ending in columns 7-26, sky again in",
|
|
"columns 27-31, explosion in columns 32-39."
|
|
]
|
|
},
|
|
"B180": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Row 14 (pixel rows 112-119): the hull's belly and the tops of the legs (columns 7-25); the",
|
|
"background walker's gun appears at columns 5-6; explosion in columns 29-39."
|
|
]
|
|
},
|
|
"B2C0": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Row 15 (pixel rows 120-127): the background walker's barrel crosses columns 1-5, the big",
|
|
"walker's legs fill columns 6-25, explosion in columns 30-39."
|
|
]
|
|
},
|
|
"B400": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Row 16 (pixel rows 128-135): the background walker (columns 4-16), sky between the big walker's",
|
|
"legs (columns 17-25), explosion in columns 31-39."
|
|
]
|
|
},
|
|
"B540": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Row 17 (pixel rows 136-143): both walkers' legs over sky; explosion and its falling debris in",
|
|
"columns 33-39."
|
|
]
|
|
},
|
|
"B680": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Row 18 (pixel rows 144-151): legs over sky; the brown ridge of the horizon comes in at columns",
|
|
"33-39 on pixel row 149."
|
|
]
|
|
},
|
|
"B7C0": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Row 19 (pixel rows 152-159): the brown horizon ridge now crosses the whole row behind the legs."
|
|
]
|
|
},
|
|
"B900": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Row 20 (pixel rows 160-167): the ridge ends and the green ground starts on pixel row 164; the",
|
|
"legs and feet of both walkers stand on it."
|
|
]
|
|
},
|
|
"BA40": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Row 21 (pixel rows 168-175): green ground with the white and grey legs and feet. The two labels",
|
|
"in this row (titleBitmapBAA2/BAA3) belong to dead code - see them."
|
|
]
|
|
},
|
|
"BAA2": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "row 21, column 12, pixel row 2 - four pixels of a grey leg standing on the green ground. In the build the boot loader was cut down from, $BA00 held a sector buffer and this was BAM offset $A2, the first character of the disk id; the truncated leftoverCheckDiskId still reads it at $C3EC, but that routine is unreachable, so this is picture data and nothing else"
|
|
},
|
|
"BAA3": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "the same for BAM offset $A3, the second id character, read by the dead code at $C3E3; then four more pixel bytes to the end of column 12"
|
|
},
|
|
"BB80": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Row 22 (pixel rows 176-183): green ground, feet and their shadows."
|
|
]
|
|
},
|
|
"BCC0": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Row 23 (pixel rows 184-191): ground on pixel rows 184-186, then the yellow copyright line",
|
|
"'COPYRIGHT(C) 1988-OZARK SOFTSCAPE' from pixel row 187, columns 5-36."
|
|
]
|
|
},
|
|
"BE00": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Row 24 (pixel rows 192-199): the copyright line finishes on pixel row 193, green ground below.",
|
|
"This row is also where the older build whose remains start at $BF40 kept code ($BE93, $BEA7)",
|
|
"and the ten-byte serial it copied from $BE30 - the picture overwrote all of it."
|
|
]
|
|
},
|
|
"BF28": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "columns 37-39 of the last row: the small dark-grey monogram in the bottom right corner of the picture - it reads like a lower-case 'mk' with a flourish, probably the artist's initials. $BF3F is the last byte the VIC displays"
|
|
},
|
|
"BF40": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"leftoverDataDiskCode ($BF40-$BFEC) - 173 bytes that are NOT part of the picture and are never",
|
|
"executed by anything: the bitmap needs 8000 bytes and stops at $BF3F, so these are whatever",
|
|
"happened to be sitting in the mastering machine's memory above it when the 'load' file was written.",
|
|
"They are 6502 code, and they disassemble cleanly all the way from $BF40 to $BFEC. (At run time the",
|
|
"half from $BFB0 on is overwritten by the map row address tables - see mapRowAddrLoTable; $BF40-$BFAF",
|
|
"is never touched at all.)",
|
|
"It is code from an earlier build of this game - almost certainly the same build whose remains also",
|
|
"survive in the boot loader file at $C3BC-$C3FF:",
|
|
" * it calls $C3C4, and the truncated original of that routine (leftoverCheckDiskId, 'read the BAM",
|
|
" of track 18 to $BA00 and compare $BAA2/$BAA3 with OZ / EA') is itself still sitting unreachable",
|
|
" in the boot loader file from $C3C4 to the end of the file at $C3FF;",
|
|
" * both fragments call the same pair of loader entry points $CBED (set destination) and $CBF2 (read",
|
|
" sectors), which in that build lived at $CBxx and in the shipped one live at $C034/$C004;",
|
|
" * both use the same $BA00 sector buffer, and this fragment stamps ten bytes into $BAAB - BAM",
|
|
" offset $AB, exactly the disk name/serial field the shipped checkDiskId reads at $02AB ($0FF3)",
|
|
" and copies to ownPlayerName $FFDE-$FFE7;",
|
|
" * its other call targets ($C1B3, $C1C6, $C1D8, $C453, $C7AB, $C860, $C933) and the strings it",
|
|
" prints ($BB5C, $BB8C) match nothing in the shipped game at those addresses.",
|
|
"What it does, as far as the surviving part shows: print a prompt, ask $C3C4 which disk is in the",
|
|
"drive, keep asking until the right one is inserted, copy track 18 sectors $11 and $12 (the two save",
|
|
"slots) through the $BA00 buffer, and write a ten-byte serial into a BAM image - i.e. the disk-swap /",
|
|
"data-disk preparation that the shipped game does from $0FB1 and the film menus. The routines it",
|
|
"calls below $BF40 ($BE30, $BE93, $BEA7, the strings at $BB5C and $BB8C) were all overwritten by the",
|
|
"title picture, so only this tail survives.",
|
|
"Rendered one instruction per line, with the decoded instruction in the comment; the file is pure",
|
|
"data, so the bytes stay .byte."
|
|
],
|
|
"line": "lda #$0B"
|
|
},
|
|
"BF42": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "sta $5F - a flag or parameter of that build (in the shipped game $5F is joyFireUp)"
|
|
},
|
|
"BF44": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "jsr $C1D8 - a routine of that build; the shipped boot loader has unrelated code there"
|
|
},
|
|
"BF47": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "ldy $60"
|
|
},
|
|
"BF49": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "ldx $21"
|
|
},
|
|
"BF4B": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "lda leftoverTableBF5C,y - pick one of the three constants below"
|
|
},
|
|
"BF4E": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "sta $BA02,x - into the sector buffer at $BA00, offset 2 + X"
|
|
},
|
|
"BF51": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "lda #$04"
|
|
},
|
|
"BF53": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "jsr $C453"
|
|
},
|
|
"BF56": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "ldx #$07"
|
|
},
|
|
"BF58": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "jmp $C1B3 - tail call, X = 7"
|
|
},
|
|
"BF5B": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "rts - unreachable, left over from whatever preceded the jmp"
|
|
},
|
|
"BF5C": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Three constants, indexed by zero page $60 in the fragment above and stored into the $BA00 sector",
|
|
"buffer at offset 2 + zp $21: $00, $08, $40."
|
|
]
|
|
},
|
|
"BF5F": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Prints one prompt: the string at $BB8C in that build's memory (now picture data). Called from",
|
|
"$BFB0 below."
|
|
],
|
|
"line": "lda #$0B"
|
|
},
|
|
"BF61": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "jsr $C7AB"
|
|
},
|
|
"BF64": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "lda #$8C"
|
|
},
|
|
"BF66": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "ldy #$BB - A/Y = $BB8C, a string in that build"
|
|
},
|
|
"BF68": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "jsr $C860 - print it"
|
|
},
|
|
"BF6B": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "lda #$0A"
|
|
},
|
|
"BF6D": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "jsr $C933"
|
|
},
|
|
"BF70": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "lda #$0B"
|
|
},
|
|
"BF72": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "jsr $C7AB"
|
|
},
|
|
"BF75": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "lda #$00"
|
|
},
|
|
"BF77": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "sta $2D"
|
|
},
|
|
"BF79": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "jmp $C775 - tail call"
|
|
},
|
|
"BF7C": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"The main surviving routine: print a message, then ask $C3C4 (that build's checkDiskId, whose",
|
|
"truncated remains are at $C3C4 in the boot loader file) which disk is in the drive. A = 0 means the",
|
|
"expected disk is there and it goes straight on to $BFB0; A = 2 means the other disk, in which case",
|
|
"the two save-slot sectors are pulled off it first."
|
|
],
|
|
"line": "jsr $BE93 - a routine of that build; the picture overwrote it (row 24 of the bitmap)"
|
|
},
|
|
"BF7F": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "lda #$5C"
|
|
},
|
|
"BF81": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "ldy #$BB - A/Y = $BB5C, another lost string"
|
|
},
|
|
"BF83": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "jsr $C860 - print it"
|
|
},
|
|
"BF86": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "jsr $C3C4 - checkDiskId: reads the BAM of track 18 to $BA00 and matches $BAA2/$BAA3"
|
|
},
|
|
"BF89": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "cmp #$00 - 0 = the disk it wanted is in the drive"
|
|
},
|
|
"BF8B": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "beq $BFB0"
|
|
},
|
|
"BF8D": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "lda #$07"
|
|
},
|
|
"BF8F": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "jsr $C1C6 - prompt / wait, code 7"
|
|
},
|
|
"BF92": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "jsr $C3C4 - look again"
|
|
},
|
|
"BF95": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "beq $BFB0"
|
|
},
|
|
"BF97": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "cmp #$02 - 2 = the other disk of the pair"
|
|
},
|
|
"BF99": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "beq $BF9C"
|
|
},
|
|
"BF9B": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "rts - anything else: give up"
|
|
},
|
|
"BF9C": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Reads track 18 sectors $11 and $12 - the two save slots - into the $BA00 buffer and hands each to",
|
|
"$C1B3 with X = 0 then X = 1."
|
|
],
|
|
"line": "ldx #$11 - track 18 sector 17, the first save slot"
|
|
},
|
|
"BF9E": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "jsr leftoverReadTrack18Sector"
|
|
},
|
|
"BFA1": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "ldx #$00"
|
|
},
|
|
"BFA3": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "jsr $C1B3 - pass the buffer on as 0"
|
|
},
|
|
"BFA6": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "ldx #$12 - track 18 sector 18, the second save slot"
|
|
},
|
|
"BFA8": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "jsr leftoverReadTrack18Sector"
|
|
},
|
|
"BFAB": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "ldx #$01"
|
|
},
|
|
"BFAD": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "jsr $C1B3 - and as 1"
|
|
},
|
|
"BFB0": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"mapRowAddrLoTable - 40 bytes, $BFB0-$BFD7, one per battlefield row: the LOW byte of the address of",
|
|
"map row 0-39, i.e. of $F000 + 40*row. The matching high bytes are the separate table",
|
|
"mapRowAddrHiTable at $BFD8; this is a split lo/hi pointer pair, not a table of addresses, so the two",
|
|
"halves are typed as bytes.",
|
|
"Built at start-up by buildMapRowAddressTable ($0339, low byte stored at $034A, high byte at $0345)",
|
|
"and read by readMapCell ($25FA - low at $25FC, high at $2603) and every other map accessor, so the",
|
|
"80 bytes $BFB0-$BFFF are live for the whole game. They sit here because these are the last 80 bytes",
|
|
"of VIC bank 2 above the bitmap (which ends at $BF3F), which is why initBitmapScreen ($2D41) clears",
|
|
"only $A000-$BF3F.",
|
|
"What the disk file holds at these addresses is the middle of the leftover routine below - the table",
|
|
"is written over it before the first map cell is ever read. $BF40-$BFAF, the 112 bytes in front of",
|
|
"the table, are the only bytes of this file that the game never reads or writes: no label in",
|
|
"XREF.txt falls between $BF40 and $BFAF, and the bitmap clear stops at $BF3F. The only code that",
|
|
"ever reaches them is the copy-protection memory wipe at $0A1E, which erases everything.",
|
|
"The leftover instructions here: after the prompt, keep checking until the right disk is inserted,",
|
|
"then stamp the serial in."
|
|
],
|
|
"line": "jsr leftoverDiskPrompt - 'insert the other disk'"
|
|
},
|
|
"BFB3": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "jsr $BEA7 - another routine of that build, now under the picture"
|
|
},
|
|
"BFB6": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "jsr $C3C4 - checkDiskId"
|
|
},
|
|
"BFB9": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "cmp #$00"
|
|
},
|
|
"BFBB": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "beq $BFC5"
|
|
},
|
|
"BFBD": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "lda #$07"
|
|
},
|
|
"BFBF": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "jsr $C1C6 - prompt / wait, code 7"
|
|
},
|
|
"BFC2": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "jmp $BFB6 - loop until the right disk is in the drive"
|
|
},
|
|
"BFC5": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Copies ten bytes from $BE30 (lost under the picture) into the sector buffer at $BAAB - BAM offset",
|
|
"$AB, the ten-byte disk name/serial that the shipped game reads back at $02AB ($0FF3) and keeps in",
|
|
"ownPlayerName ($FFDE-$FFE7) so both modem players can prove they run the same disk. Then it hands",
|
|
"the buffer to $C1B3 and tail-calls $C1C6 with code 5."
|
|
],
|
|
"line": "ldy #$09 - ten bytes, index 9 down to 0"
|
|
},
|
|
"BFC7": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "lda $BE30,y - the serial in that build"
|
|
},
|
|
"BFCA": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "sta $BAAB,y - into BAM offset $AB of the $BA00 buffer"
|
|
},
|
|
"BFCD": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "dey"
|
|
},
|
|
"BFCE": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "bpl $BFC7"
|
|
},
|
|
"BFD0": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "ldx #$00"
|
|
},
|
|
"BFD2": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "jsr $C1B3"
|
|
},
|
|
"BFD5": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "lda #$05"
|
|
},
|
|
"BFD7": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "jmp opcode ($4C); its operand is the first two bytes of the high-byte table below"
|
|
},
|
|
"BFD8": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"mapRowAddrHiTable - 40 bytes, $BFD8-$BFFF: the HIGH byte of the address of map row 0-39 ($F000 +",
|
|
"40*row, so $F0 for rows 0-5, $F1 for 6-12, and so on). Second half of the split pointer pair whose",
|
|
"low bytes are mapRowAddrLoTable at $BFB0; written at $0345 by buildMapRowAddressTable and read at",
|
|
"$2603 by readMapCell. On disk these bytes are still the leftover routine (and its trailing filler),",
|
|
"starting in the middle of the jmp at $BFD7."
|
|
],
|
|
"line": "operand $C1C6 of the jmp at $BFD7"
|
|
},
|
|
"BFDA": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"Reads one sector of track 18 into the $BA00 buffer with that build's fast loader: X = sector number,",
|
|
"patched into the LDX below. Called twice from $BF9C."
|
|
],
|
|
"line": "stx $BFE7 - self-modifying: X = the sector number, patched into the ldx at $BFE6"
|
|
},
|
|
"BFDD": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "ldx #$00"
|
|
},
|
|
"BFDF": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "ldy #$BA - destination $BA00"
|
|
},
|
|
"BFE1": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "jsr $CBED - that build's setLoadDest (shipped: $C034 / $085C)"
|
|
},
|
|
"BFE4": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "ldy #$12 - track 18"
|
|
},
|
|
"BFE6": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "ldx #$00 - sector, patched at $BFDA"
|
|
},
|
|
"BFE8": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "lda #$01 - one sector"
|
|
},
|
|
"BFEA": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"line": "jmp $CBF2 - that build's sector read (shipped: $C004 / $0804)"
|
|
},
|
|
"BFED": {
|
|
"unit": "boot/titleBitmapA000",
|
|
"block": [
|
|
"The last 19 bytes of the loaded file: filler, not code and not picture - alternating $00/$FF with a",
|
|
"stray $0B, the same kind of junk the mastering system left in the unused sector tails elsewhere on",
|
|
"the disk. At run time these are entries 21-39 of mapRowAddrHiTable."
|
|
]
|
|
}
|
|
},
|
|
"dataTypes": {
|
|
"A000": [
|
|
"grid",
|
|
320,
|
|
8
|
|
],
|
|
"A140": [
|
|
"grid",
|
|
320,
|
|
8
|
|
],
|
|
"A280": [
|
|
"grid",
|
|
320,
|
|
8
|
|
],
|
|
"A3C0": [
|
|
"grid",
|
|
320,
|
|
8
|
|
],
|
|
"A500": [
|
|
"grid",
|
|
320,
|
|
8
|
|
],
|
|
"A640": [
|
|
"grid",
|
|
320,
|
|
8
|
|
],
|
|
"A780": [
|
|
"grid",
|
|
320,
|
|
8
|
|
],
|
|
"A8C0": [
|
|
"grid",
|
|
320,
|
|
8
|
|
],
|
|
"AA00": [
|
|
"grid",
|
|
234,
|
|
8
|
|
],
|
|
"AAEA": [
|
|
"grid",
|
|
6,
|
|
6
|
|
],
|
|
"AAF0": [
|
|
"grid",
|
|
80,
|
|
8
|
|
],
|
|
"AB40": [
|
|
"grid",
|
|
320,
|
|
8
|
|
],
|
|
"AC80": [
|
|
"grid",
|
|
320,
|
|
8
|
|
],
|
|
"ADC0": [
|
|
"grid",
|
|
320,
|
|
8
|
|
],
|
|
"AF00": [
|
|
"grid",
|
|
320,
|
|
8
|
|
],
|
|
"B040": [
|
|
"grid",
|
|
320,
|
|
8
|
|
],
|
|
"B180": [
|
|
"grid",
|
|
320,
|
|
8
|
|
],
|
|
"B2C0": [
|
|
"grid",
|
|
320,
|
|
8
|
|
],
|
|
"B400": [
|
|
"grid",
|
|
320,
|
|
8
|
|
],
|
|
"B540": [
|
|
"grid",
|
|
320,
|
|
8
|
|
],
|
|
"B680": [
|
|
"grid",
|
|
320,
|
|
8
|
|
],
|
|
"B7C0": [
|
|
"grid",
|
|
320,
|
|
8
|
|
],
|
|
"B900": [
|
|
"grid",
|
|
320,
|
|
8
|
|
],
|
|
"BA40": [
|
|
"grid",
|
|
98,
|
|
8
|
|
],
|
|
"BAA2": [
|
|
"grid",
|
|
1,
|
|
1
|
|
],
|
|
"BAA3": [
|
|
"grid",
|
|
5,
|
|
5
|
|
],
|
|
"BAA8": [
|
|
"grid",
|
|
216,
|
|
8
|
|
],
|
|
"BB80": [
|
|
"grid",
|
|
320,
|
|
8
|
|
],
|
|
"BCC0": [
|
|
"grid",
|
|
320,
|
|
8
|
|
],
|
|
"BE00": [
|
|
"grid",
|
|
296,
|
|
8
|
|
],
|
|
"BF28": [
|
|
"grid",
|
|
24,
|
|
8
|
|
],
|
|
"BF40": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BF42": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BF44": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BF47": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BF49": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BF4B": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BF4E": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BF51": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BF53": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BF56": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BF58": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BF5B": [
|
|
"grid",
|
|
1,
|
|
1
|
|
],
|
|
"BF5C": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BF5F": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BF61": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BF64": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BF66": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BF68": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BF6B": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BF6D": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BF70": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BF72": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BF75": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BF77": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BF79": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BF7C": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BF7F": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BF81": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BF83": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BF86": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BF89": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BF8B": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BF8D": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BF8F": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BF92": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BF95": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BF97": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BF99": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BF9B": [
|
|
"grid",
|
|
1,
|
|
1
|
|
],
|
|
"BF9C": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BF9E": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BFA1": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BFA3": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BFA6": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BFA8": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BFAB": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BFAD": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BFB0": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BFB3": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BFB6": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BFB9": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BFBB": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BFBD": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BFBF": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BFC2": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BFC5": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BFC7": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BFCA": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BFCD": [
|
|
"grid",
|
|
1,
|
|
1
|
|
],
|
|
"BFCE": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BFD0": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BFD2": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BFD5": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BFD7": [
|
|
"grid",
|
|
1,
|
|
1
|
|
],
|
|
"BFD8": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BFDA": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BFDD": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BFDF": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BFE1": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BFE4": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BFE6": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BFE8": [
|
|
"grid",
|
|
2,
|
|
2
|
|
],
|
|
"BFEA": [
|
|
"grid",
|
|
3,
|
|
3
|
|
],
|
|
"BFED": [
|
|
"grid",
|
|
19,
|
|
19
|
|
]
|
|
}
|
|
} |