If you are still using the old URL (datacrystal.romhacking.net), please update your bookmarks! The old URL may stop working soon.
The current URL is datacrystal.tcrf.net.
The current URL is datacrystal.tcrf.net.
Blades of Steel (NES, Famicom Disk System)/ROM map: Difference between revisions
Jump to navigation
Jump to search
Rainwarrior (talk | contribs) (→PPU data bundles: I made a utility for this) |
Rainwarrior (talk | contribs) (→PPU data bundles: clarify the invalid value behaviour) |
||
Line 21: | Line 21: | ||
... - uncompressed data (length given above) | ... - uncompressed data (length given above) | ||
return to step 2 | return to step 2 | ||
2.4. $00 - | 2.4. $00 - run-length value of 256 (never used) | ||
$xx - byte to be repeated 256 times | $xx - byte to be repeated 256 times | ||
return to step 2 | return to step 2 | ||
2.5. $80 - invalid uncompressed length value ( | 2.5. $80 - invalid uncompressed length value (causes hang) | ||
... - 255 bytes of uncompressed data | ... - 255 bytes of uncompressed data | ||
$80 is written as the 256th byte | $80 is written as the 256th byte |
Revision as of 22:50, 6 March 2019
The following article is a ROM map for Blades of Steel (NES, Famicom Disk System).
PPU data bundles
This game has a simple RLE compressed format for PPU data. The ROM stores 15 PPU data bundles, decoded by a subroutine at $7:C818, taking X as an index (x2) to tables that locate the data:
$7:C89D - pointer table to packet data (2-byte address, little-endian, X as index) $7:C8BB - bank table for packet data (1-byte UNROM bank numbers, X/2 as index)
After setting the specified bank, and loading the pointer, the data stream encoded at this pointer is as follows:
1. 2-byte PPU write address (little endian) 2. Control byte: 2.1. $FF - end of bundle stop decoding 2.2. $7F - new write address return to step 1 2.3. $01-$7E - run-length for next byte $xx - byte to be repeated for the duration of the run length return to step 2 2.4. $81-$FE - & $7F = length of uncompressed data that follows ... - uncompressed data (length given above) return to step 2 2.4. $00 - run-length value of 256 (never used) $xx - byte to be repeated 256 times return to step 2 2.5. $80 - invalid uncompressed length value (causes hang) ... - 255 bytes of uncompressed data $80 is written as the 256th byte data pointer doesn't advance, return to step 2.5
Python utility for decoding/encoding: Gist