The header will be at
0x7xxx (for LoROM) or
0xFxxx (for HiROM).
xFB0-xFB1 = ID xFB2 = ?? Unknown, gets compared to 0001 xFC0-xFCF = Title xFD0-xFD3 = Block Allocation flags (for 32 blocks of 128Kbytes each bit, 32Mbits max) xFD4-xFD5 = Limited Starts xFD6 = Date - Month [4 bits] xFD7 = Date - day [5 bits] xFD8 = ROM Speed (Upper 4 bits) & HiROM / LoROM (Lower 4 bits) xFD9 = Type (Upper 4 bits) xFDA = Licensee / Maker xFDB = Version Number xFDC-xFDD = Inverse Checksum xFDE-xFDF = Checksum xFE0-xFE3 = Unknown xFE4-xFEF = Native Interrupt Pointers (16-bit) xFF0-xFF3 = Unknown xFF4-xFFF = Emulation Interrupt Pointers (16-bit)
Titles may be rendered in Shift-JIS Japanese rather than using English text.
Licensee will be
0xFF. Reference to
$ffb0. Grab 2 bytes’ ASCII values for real licensee code.
Version Number is an extension. Actual format is
1 + ord(val($ffdb))/10.
Inverse Checksum and Checksum must add up to
ROM Speed (Upper 4 bits) 0x0 - 0x2 = SlowROM (200ns) X > 0x2 = FastROM (120ns) HiROM/LoROM (Lower 4 bits) 0 = LoROM 1 = HiROM
Sound Link settings and execution type
0x0? Bit0-3 (0000xxxx) = Unknown/unused (always 0) 0x10 Bit4 (000x0000) = Receiver Power Down (0 = Sound Link enabled, 1 = Sound Link disabled) 0x20 Bit5-6 (0xx00000) = Execution Area (0 = FLASH, 1 = Copy FLASH to PSRAM, 2/3 = fail) 0x80 Bit7 (x0000000) = Skip the "J033-BS-TDM1 St.GIGA" Intro (0 = normal, 1 = skip)
Lower 4 bits are 0 in every BS-X ROM
(Previous, partially incorrect entry:)
0x0 = Full Size + Sound Link 0x1 = Full Size 0x2 = Part Size + Sound Link 0x3 = Part Size X>3 = Error If bit4 is set, 2197.7 is toggled. If bit7 is set, no satellite intro is shown. Bits 6,5 relate to each other. If only bit5 is set, the rom is copied to PSRAM.
Retail (demo) games usually have
ffff here (exception BS Camp Arnold Marvelous); Satellaview games use 00-
ff; Add-On maskrom packs use 0000. Each set bit corresponds to 1M, one megabit.
$FF 8M (Most download games, demos and Soundlink data. Largest filesize) $0F 4M (Example - Tamori no Picross series) $F0 4M (Example - Kirby no Omachahako series. Appears when the upper 4M are allocated for the title) $B8 4M (Uses blocks 4, 5, 6 and 8. Example - Game Tora no Ooana Special magazine) $07 3M (Example - Satesupo DX Dai-4-Gou - Digital Magazine) $03 2M (Example - Konae Chan no DokiDoki Pengin Kazoku) $01 1M (Example - Tsukuru-line Data Pack data) $00 1M (?) (Example - Same Game Koma Data data pack)
(These were checked through the BS-X’s “Erase data” option. 0F and F0 turned out the same. The only ROMs I know marked $00 do not detect on the BS-X itself.)
The value can be regarded as an allocation map, i.e. where the data is actually stored on the Data Pack. One bit corresponds to one megabit block on the Data Pack, with the MSB being the last “page” (
$c80000-$cfffff) and the LSB being the first (
E.g. a 4MBit game with
$F0 originally resided in the upper half of the Data Pack and should be loaded there for emulation. Otherwise an error 09 will occur because checksum calculation fails: BIOS checksums
$c80000-$cfffff according to the map, but the game is stored in
If bit15 set: limited starts. number of starts left is determined by bits 0-14.
Boot Limits When a Satellaview download is booted from BS-X, BS-X will re-write xFD4-xFD5 if it’s value is not 0x00. This is for the Boot Limit, designed to prevent bootup of downloads after a certain playcount. These are the known limited boot header values:
0xFC (11111100): 5 boots 0xBC (10111100): 4 boots 0x9C (10011100): 3 boots 0x8C (10001100): 2 boots 0x84 (10000100): 1 boot 0x80 (10000000): 0 boots (Game will not detect on BS-X) 0x00 (00000000): Unlimited Boots
The Date format goes like this (in bits):
%XXXX0000: Months %XXXXX000: Days
The checksum is calculated by adding all bytes together, assuming 0x7FB0-0x7FDF (or 0xFFB0-0xFFDF in a case of HiROM game) are filled with 00h. When calculating the checksum, the Block Allocation flags are used to determine which blocks the checksum will be calculated from.
Interrupt pointers are used to be at the end of the header, as 16-bit and Little Endian.
It turns out it’s the same interrupt pointers as the normal SNES header :
Native Mode Interrupts: xFE4 - COP xFE6 - BRK xFE8 - ABORT xFEA - NMI xFEC - Unused? xFEE - IRQ Emulation Mode Interrupts: xFF4 - COP xFF6 - Unused? xFF8 - ABORT xFFA - NMI xFFC - RESET (Points to Program Start) xFFE - IRQ or BRK
These are all the known conditions under which the BS-X will not detect data (Not to be confused with conditions under which the BS-X will spew out an error when trying to play data.)
xFD4-xFD5's value is 0x80. Checksum and Inverse Checksum are blank. "Maker" value is not 0x33.