The Broadcast Satellaview-X is one of the many pieces of SNES hardware still not emulated quite right. Most emulators initialize the RAM to the wrong value, causing extremely odd play times, and do not emulate the system's extra 128KB of memory.
When I began work on a ROM renaming tool a while ago, I realized I would need to be able to read information from these ROMS, which were in a slightly different format than the standard SNES binary.
Here are the offsets, lengths and descriptions of all the bytes that make up the internal ROM information for a BSX ROM. The addressing used in the example is HiROM. Subtract $8000 for LoROM addressing.
To detect a BS-X ROM, read 5 bytes from $ffd0. If at least one of them is less than 0x20, the ROM is likely BS-X. This is because those bytes are used for title fields in normal carts, so they will be padded out with 0x20 bytes.
$ffd4 is 0x00 in every dumped BS-X ROM. $ffc0 - ROM Title (J-ASCII) [21 bytes, string] $ffd6 - Release date: month [4 bits] Multiplier [4 bits] Note: All error except 0×00 $ffd7 - Release date: day [4 bits] Multiplier [4 bits] Multiplier Structure: 0x0 – 0x3 = X*2 0x8 – 0xb = X*2+1 X > 0xb = Error $ffd8 - ROM Speed [4 bits upper] 0x0 – 0x2 = SlowROM (200ns) X > 0x2 = FastROM (120ns) HiROM/LoROM [4 bits lower] 1=hirom, 0=lorom $ffd9 - ROM type [4 bits upper] 0x0 = FullSize+SoundLink 0x1 = FullSize 0x2 = PartSize+SoundLink 0x3 = PartSize X > 3 = Error Lower 4 bits are 0 in every BS-X ROM $ffda - Licensee [1 byte] 0x33 or 0xff = Reference to $ffb0. Grab 2 bytes' ASCII values for real licensee code. Reference codes from SNESKART.TXT. $ffdb - Version number [1 byte] This is an extension. Actual format is 1 + ord(val($ffdb))/10. $ffdc - Inverse Checksum [2 bytes] $ffde - Checksum [2 bytes] Inverse Checksum and Checksum must add up to 0xffff
Copyright (c) 2005 Derrick Sobodash. Some Rights Reserved.
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.