322 lines
14 KiB
JSON
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
|
|
]
|
|
}
|
|
}
|