modemwars/annotations/30_boot_titleScreenRam9C00_9C00.json
2026-08-23 02:09:40 -05:00

322 lines
14 KiB
JSON

{
"chunk": "boot_titleScreenRam9C00_9C00",
"unit": "boot/titleScreenRam9C00",
"unitLabels": {
"boot/titleScreenRam9C00": {
"9C00": "titleScreenRam",
"9C50": "titleScreenLogoRows",
"9C6E": "titleScreenRow02Col30",
"9DCE": "titleScreenRow11Col22",
"9E6E": "titleScreenRow15Col22",
"9E92": "titleScreenRow16Col18",
"9EA4": "titleScreenRow16Col36",
"9EE3": "titleScreenRow18Col19",
"9F22": "titleScreenRow20Col02",
"9F37": "titleScreenRow20Col23",
"9F41": "titleScreenRow20Col33",
"9F4B": "titleScreenRow21Col03",
"9F55": "titleScreenRow21Col13",
"9F5F": "titleScreenRow21Col23",
"9F69": "titleScreenRow21Col33",
"9FD1": "titleScreenRow24Col17",
"9FE8": "titleScreenRamPadding"
}
},
"notes": {
"9C00": {
"unit": "boot/titleScreenRam9C00",
"block": [
"titleScreenRam - the video matrix of the title picture: 1000 bytes, one per 4x8-pixel multicolour",
"cell, 40 cells to a screen row and 25 rows, index = row*40 + column, so each line below is one",
"whole screen row and a cell's address is $9C00 + row*40 + col.",
"Every byte carries two of that cell's four colours: the high nibble colours the %01 pixel pairs and",
"the low nibble the %10 pairs. The %11 pairs take the low nibble of titleColorRam ($9800 + the same",
"index) and %00 takes VIC_BG0, which bootMain sets to black at $C14E. The pixels themselves live in",
"titleBitmap ($A000 + row*320 + col*8). docs/titleScreen.png is this picture decoded.",
"Read exactly once, by bootShowTitlePicture: the self-modifying loop at $C288 copies four whole",
"pages ($9C00-$9FFF, so the padding at the end travels with them) to $8C00-$8FFF, and $D018 = $38",
"with VIC bank 2 then puts the video matrix at $8C00 and the bitmap at $A000. Copying is what makes",
"this page disposable: the loader's later data load at $C1EB pulls track 28 sectors 0-12 into",
"$9300-$9FFF, so from that moment these addresses hold the game's graphics tables (unit",
"game/graphicsData9300) while the picture keeps showing from the copy at $8C00 for the rest of the",
"load. Nothing else in the boot image touches $9C00-$9FFF: $C288 is the only reader XREF lists under",
"boot/fastLoaderC000. The cursorBlockShape / circle*Table references from game/mainProgram0800 that",
"XREF also shows for these addresses belong to that run-time data, not to the picture - they are why",
"unrelated labels and block breaks appear in the middle of this file, and each note below says which",
"row and column of the picture the break falls on.",
"Values: 86 distinct bytes are used. $00 (280 cells, the commonest) means nothing is drawn in the",
"%01/%10 colours there, so the cell shows only background and the colour-RAM colour; $70 = yellow",
"over black (both text lines and the logo highlight), $E0 = light blue over black (sky beside the",
"logo), $B0/$BC/$C0/$F0/$FC = the greys and white of the machine, $90 = brown over black (the dirt",
"band) and $50 = green over black (the playing field).",
"Row map:",
" $9C00 rows 0-1 light blue sky (colour RAM $0E) with the yellow 'DAN BUNTEN'S' credit line in",
" cells 13-24; in row 1 the yellow is also the bevel highlight along the top",
" edge of the logo, and cells 26-39 are the grey smoke plume.",
" $9C50 rows 2-7 the big red 'MODEM WARS' logo - colour RAM $02 (red) across the whole band -",
" with yellow highlights over sky; the white and orange muzzle flash of the",
" walker's gun is at cells 1-5 of rows 4-6.",
" $9D40 rows 8-18 the walking tank in greys and white against the sky, black smoke behind it",
" and the orange/white explosion in cells 31-39.",
" $9EF8 rows 19-20 the horizon: brown ground under the sky and the top edge of the field.",
" $9F48 rows 21-22 the green playing field with its white yard lines, and the walker's legs.",
" $9F98 rows 23-24 a black band carrying the yellow 'COPYRIGHT (C) 1988 OZARK SOFTSCAPE' line",
" (cells 5-36) and a small grey 'MK' monogram in row 24, cells 37-39,",
" probably the artist's initials.",
"Only rows 0-1 and the head of row 2 survive as whole 40-byte rows in the listing; from $9C6E on the",
"run-time structures named above cut the block into the fragments annotated below."
],
"line": "row 0: cells 0-12 plain sky ($00), cells 13-24 the top halves of the DAN BUNTEN'S letters ($70)"
},
"9C50": {
"unit": "boot/titleScreenRam9C00",
"block": [
"Screen row 2 - the first row of the red 'MODEM WARS' logo, and the start of the picture's main",
"body (rows 2-24). Through rows 2-7 the colour RAM is $02 in nearly every cell, so the logo itself",
"is painted with the %11 pixels; the bytes here supply the yellow bevel ($70, $27, $2F, $7B) and the",
"light blue sky showing between and around the letters ($E0, $E7, $20)."
],
"line": "row 2: $E0/$E7/$20 sky-plus-red cells, $70/$27 where the logo highlight starts"
},
"9C6E": {
"unit": "boot/titleScreenRam9C00",
"block": [
"Screen row 2, column 30 (that is $9C50 + 30) - the middle of the 'WARS' half of the logo.",
"The listing breaks here only because the run-time overlay puts terrainTileShapes at $9C6E-$9DCD:",
"44 one-bit 8x8 terrain tiles addressed as $9C6E + index*8 by setTerrainTilePtr ($2DBD) in",
"game/mainProgram0800, loaded over this page from track 28. In the title picture the same 352 bytes",
"are just the right-hand end of logo row 2 and rows 3-11 up to column 21: the rest of the logo, the",
"sky, the smoke plume and the top of the walking tank. Each line below still holds 40 bytes, but it",
"starts 30 cells into a screen row, so a line spans the tail of one row and the head of the next."
],
"line": "row 2 col 30 to row 11 col 21 - logo, sky and the top of the walker"
},
"9DCE": {
"unit": "boot/titleScreenRam9C00",
"block": [
"Screen row 11, column 22. Break caused by unitSymbolShapes ($9DCE-$9E6D in the run-time page): 20",
"one-cell unit symbols (five unit types x four facings) that continue the terrain tile table.",
"In the picture these 160 bytes cover rows 11-15 up to column 21 - the tank's hull and gun barrel,",
"the white highlights along its back and the black smoke to the right of it."
],
"line": "row 11 col 22 to row 15 col 21 - the tank's hull and barrel"
},
"9E6E": {
"unit": "boot/titleScreenRam9C00",
"block": [
"Screen row 15, column 22. Break caused by spareCursorShapes ($9E6E-$9E91 in the run-time page), two",
"18-byte cursor sprite fragments that nothing in the disassembly reads. Here the 36 bytes are the",
"dark smoke under and behind the tank plus the first cells of row 16."
],
"line": "row 15 col 22 to row 16 col 17 - smoke below the tank"
},
"9E92": {
"unit": "boot/titleScreenRam9C00",
"block": [
"Screen row 16, column 18. Not a boundary of the picture: cursorBlockShape lives here in the",
"run-time page (18 bytes copied into the battlefield cursor sprite by setCursorShapeBlock, read from",
"$300C in game/mainProgram0800), so the address carries a label in every listing that covers it.",
"These 18 cells are sky between the walker's legs and the left edge of the explosion."
],
"line": "row 16, cells 18-35 - sky between the legs"
},
"9EA4": {
"unit": "boot/titleScreenRam9C00",
"block": [
"Screen row 16, column 36. Break caused by cursorBoxSprite ($9EA4-$9EE2 in the run-time page), the",
"complete 24x21 centre cursor sprite that showCursorBoxSprite ($3306) copies into sprite 2.",
"In the picture the 63 bytes run from the explosion at the end of row 16 through rows 17 and 18 up",
"to column 18 - sky, the walker's right leg and the fire burst."
],
"line": "row 16 col 36 to row 18 col 18 - explosion and right leg"
},
"9EE3": {
"unit": "boot/titleScreenRam9C00",
"block": [
"Screen row 18, column 19. Break caused by crosshairSprite ($9EE3-$9F21 in the run-time page), the",
"second full 24x21 sprite (a diamond crosshair) used by showCrosshairSprite ($3302).",
"Here the 63 bytes are the sky to the right of the walker, the brown horizon of row 19 and the first",
"two cells of row 20."
],
"line": "row 18 col 19 to row 20 col 1 - sky, then the brown horizon"
},
"9F22": {
"unit": "boot/titleScreenRam9C00",
"block": [
"Screen row 20, column 2. Break caused by comcenCrossMarkerShape ($9F22-$9F36 in the run-time page),",
"seven 3-byte sprite rows drawing the comcen marker (showComcenCrossMarker, $3383).",
"These 21 cells are the brown-to-green transition band of row 20 with the walker's legs crossing it."
],
"line": "row 20, cells 2-22 - the dirt/field transition"
},
"9F37": {
"unit": "boot/titleScreenRam9C00",
"block": [
"Screen row 20, columns 23-32 - green field and the third leg. The ten bytes are one half of a split",
"pointer pair in the run-time page: circleDxPtrLoTable, the low bytes of ten dx point-list pointers",
"for drawCircleInSprite ($323D); the matching high bytes are the next ten bytes at $9F41. They have",
"no meaning in the title picture."
],
"line": "row 20, cells 23-32"
},
"9F41": {
"unit": "boot/titleScreenRam9C00",
"block": [
"Screen row 20, column 33 - the end of row 20 (cells 33-39) and the first three cells of row 21.",
"The run-time page has circleDxPtrHiTable here, the high-byte half of the pointer table whose low",
"bytes are at $9F37 (all $9F); read at $3242."
],
"line": "row 20 cells 33-39 and row 21 cells 0-2"
},
"9F4B": {
"unit": "boot/titleScreenRam9C00",
"block": [
"Screen row 21, columns 3-12 - green field with a white yard line and the walker's left leg.",
"The run-time page has circleDyPtrLoTable here: the low bytes of the ten dy point-list pointers,",
"read at $3247; its high-byte half is the next ten bytes at $9F55."
],
"line": "row 21, cells 3-12"
},
"9F55": {
"unit": "boot/titleScreenRam9C00",
"block": [
"Screen row 21, columns 13-22 - the field and the walker's middle leg.",
"The run-time page has circleDyPtrHiTable here, the high-byte half of the table whose low bytes are",
"at $9F4B (all $9F); read at $324C."
],
"line": "row 21, cells 13-22"
},
"9F5F": {
"unit": "boot/titleScreenRam9C00",
"block": [
"Screen row 21, columns 23-32 - plain green field. The run-time page has circleStepCountTable here",
"(the highest point index of each circle radius 1-10, read at $3251)."
],
"line": "row 21, cells 23-32"
},
"9F69": {
"unit": "boot/titleScreenRam9C00",
"block": [
"Screen row 21, column 33. Break caused by circlePointDeltaLists ($9F69-$9FD0 in the run-time page),",
"the ten dx and ten dy point lists the four pointer tables above point into.",
"In the picture these 104 bytes are the end of row 21, all of rows 22 and 23 and the start of row",
"24: the field with its yard lines, the walker's legs and the first half of the copyright line."
],
"line": "row 21 col 33 to row 24 col 16 - field, legs and the copyright line"
},
"9FD1": {
"unit": "boot/titleScreenRam9C00",
"block": [
"Screen row 24, column 17 - the last 23 cells of the picture: the tail of the copyright line",
"('SOFTSCAPE') and the small grey 'MK' monogram in cells 37-39, probably the artist's initials.",
"The break is the run-time page's graphicsBlockTail ($9FD1-$9FFF), 47 bytes of filler that nothing",
"reads there either."
],
"line": "row 24, cells 17-39 - end of the copyright line and the MK monogram"
},
"9FE8": {
"unit": "boot/titleScreenRam9C00",
"block": [
"titleScreenRamPadding - the 24 bytes after the 1000-byte video matrix, to the end of the page.",
"They are not picture data, but they are still copied: the loop at $C288 moves four whole pages, so",
"they land at $8FE8-$8FFF. $8FF8-$8FFF is where the VIC reads the sprite pointers for a video matrix",
"at $8C00, so these last eight bytes would be sprite shape pointers - harmless, because",
"bootShowTitlePicture zeroes every sprite register and clears VIC_SPR_ENA at $C24F before the copy.",
"The bytes themselves are filler: alternating $FF/$00 with two phase slips ($9FEC, $9FF0) and one",
"stray $0B at $9FF4. The last 19 of them ($9FED-$9FFF) are byte for byte the 19 bytes at",
"$BFED-$BFFF, the tail of the title bitmap's page, so both pages were probably padded from the same",
"stale buffer in the mastering system; the colour RAM page ends the same way at $9BE8 (the same",
"alternation in the opposite phase). Nothing reads any of it, and track 28 overwrites it a moment",
"later along with the rest of the page."
],
"line": "$FF/$00 filler; $9FF8-$9FFF would become the sprite pointers of the copy at $8C00"
}
},
"dataTypes": {
"9C00": [
"grid",
80,
40
],
"9C50": [
"grid",
920,
40
],
"9C6E": [
"grid",
352,
40
],
"9DCE": [
"grid",
160,
40
],
"9E6E": [
"grid",
36,
40
],
"9E92": [
"grid",
18,
40
],
"9EA4": [
"grid",
63,
40
],
"9EE3": [
"grid",
63,
40
],
"9F22": [
"grid",
21,
40
],
"9F37": [
"grid",
10,
40
],
"9F41": [
"grid",
10,
40
],
"9F4B": [
"grid",
10,
40
],
"9F55": [
"grid",
10,
40
],
"9F5F": [
"grid",
10,
40
],
"9F69": [
"grid",
104,
40
],
"9FD1": [
"grid",
23,
40
],
"9FE8": [
"grid",
24,
24
]
}
}