カートリッジヘッダは、SNESのメモリでは0x00_FFxxh
(例外ベクタの近く)にマッピングされています。
実際のハードウェア上でゲームを実行するためには必要ありませんが、カートリッジヘッダは任天堂の承認プロセスで検証のために使用され、SNESエミュレータでもメモリレイアウトやROMタイプを識別するために使用されます。
ROMイメージでは、ROMヘッダのオフセットは
LoROM: 0x00_7Fxx
HiROM: 0x00_FFxx
ExHiROM: 0x40_FFxx
となっています。
もし(imagesize AND 3FFh)=200h
の場合、つまり SWC/UFO/その他のコピー機からの追加ヘッダがある場合は、このオフセットに +200h
を加えます。
カートリッジヘッダはFFC0h..FFDFh
の32バイトです。
オフセット | サイズ | 内容 |
---|---|---|
FFC0h | 21バイト | カートリッジのタイトル |
FFD5h | 1バイト | Rom Makeup / ROM Speed and Map Mode (後述) |
FFD6h | 1バイト | チップセット (カートリッジの基盤構成、後述) |
FFD7h | 1バイト | ROMサイズ(後述) |
FFD8h | 1バイト | RAMサイズ(後述) |
FFD9h | 1バイト | 製造地域コード(後述) |
FFDAh | 1バイト | 製造元ID (00h=不明/自作, 01h=Nintendo, etc.) (33h=後期型拡張ヘッダが存在) |
FFDBh | 1バイト | バージョン (0スタート、つまり v1.0 = 00h) |
FFDCh | 2バイト | チェックサムの補数(チェックサムの16bitの補数(ビット反転)) |
FFDEh | 2バイト | チェックサム (all bytes in ROM added together; assume [FFDC-F]=FF,FF,0,0) |
Note:
ROMサイズは`[FFD7h]`の値が`n`とすると`(1 SHL n) KB`となります。
- 例えば、08hなら256KB、0Chなら4MBになります。
- 10,12,20,24 Mbitsのカートの場合、値は切り上げられます。
RAMサイズは`[FFD8h]`の値が`n`とすると`(1 SHL n) KB`となります。
- 例えば、01hなら2KB、05hなら32KBになります。
- 00hはRAMが搭載されていないカートリッジであることを示します。
拡張ヘッダは、オフセットFFB0h..FFBFh
に配置されており、比較的後に発売されたカートリッジに搭載されています。
[FFD4h]=00h
、つまりカートリッジのタイトルの最後が00h
のときは初期型拡張ヘッダを利用しています。
オフセット | サイズ | 内容 |
---|---|---|
FFB0h | 15バイト | 予約領域(全部0) |
FFBFh | 1バイト | チップセットのサブタイプ (基本的に0、[FFD6h]=Fxh の場合のみ参照) |
[FFDAh]=33h
、つまり製造元IDが33h
のときは後期型拡張ヘッダを利用しています。
オフセット | サイズ | 内容 |
---|---|---|
FFB0h | 2バイト | 製造元ID(ASCII2文字, 例: "01"=Nintendo) |
FFB2h | 4バイト | ゲームコード (ASCII4文字) (古いタイプはASCII2文字で20h,20hでパディングされています) |
FFB6h | 6バイト | 予約領域(全部0) |
FFBCh | 1バイト | Expansion FLASH Size (1 SHL n) Kbytes (used in JRA PAT) |
FFBDh | 1バイト | Expansion RAM Size (1 SHL n) Kbytes (in GSUn games) (without battery?) |
FFBEh | 1バイト | Special Version(usually zero) (eg. promotional version) |
FFBFh | 1バイト | チップセットのサブタイプ (基本的に0、[FFD6h]=Fxh の場合のみ参照) |
注意: 初期型拡張ヘッダは ST010/11 ゲーム でのみ使われていました。
ST0xxは セタ製のチップで、主にAIを強化する目的で使われていました。
4文字のゲームコードの最初の文字が "Z"の場合、そのカートリッジにはサテラビューのようなデータパック/フラッシュカートリッジスロットがあります。これは、"Zxxx"の4文字コードにのみ適用され、スペース埋めされた古い2文字コード(Zx
)には適用されません。
The BS-X Satellaview FLASH Card Files, and Sufami Turbo Mini-Cartridges are using similar looking (but not fully identical) headers (and usually the same .SMC file extension) than normal ROM cartridges. Detecting the content of .SMC files can be done by examining ID Strings (Sufami Turbo), or differently calculated checksum values (Satellaview). For details, see:
- SNES Cart Satellaview (satellite receiver & mini flashcard)
- SNES Cart Sufami Turbo (Mini Cartridge Adaptor)
Homebrew games (and copiers & cheat devices) are usually having several errors in the cartridge header (usually no checksum, zero-padded title, etc), they should (hopefully) contain valid entryoints in range 8000h..FFFEh. Many Copiers are using 8Kbyte ROM bank(s) - in that special case the exception vectors are located at offset 1Fxxh within the ROM-image.
The ASCII fields can use chr(20h..7Eh), actually they are JIS (with Yen instead backslash).
ROMサイズは、(1 << n) KB
となっていますが、例外もいくつかあります。
- 2,3個のROMチップを利用するカートリッジ(例: 8Mbit + 2Mbit)
- 2個のROMチップを利用するつもりだったが、結局1つしか使わなかったカートリッジ
- 24MbitのROMチップ(23C2401)を使うカートリッジ
3つのケースとも、ROMサイズを表す[FFD7h]
には切り上げられた値が入っています。
メモリ上では、容量が大きいROMチップがアドレス0にマッピングされます。そして、その後のアドレスに小さい方のROMチップがマッピングされ、以降はその小さいROMチップのミラーが続きます。
例えば、10Mbit(8+2Mbit) のゲームは 16Mbit として扱われ、メモリ上のマッピングは "8Mbit + 4x2Mbit" のように行われます。
ROMサイズが特殊なゲーム一覧
タイトル | ハードウェア | サイズ | チェックサム |
---|---|---|---|
大貝獣物語2(J) | ExHiROM+S-RTC | 5MB | 4MB + 4 x Last 1MB |
テイルズオブファンタジア(J) | ExHiROM | 6MB | <???> |
Star Ocean (J) | LoROM+S-DD1 | 6MB | 4MB + 2 x Last 2MB |
天外魔境ZERO(J) | HiROM+SPC7110+RTC | 5MB | 5MB |
桃太郎電鉄HAPPY(J) | HiROM+SPC7110 | 3MB | 2 x 3MB |
Sufami Turbo BIOS | LoROM in Minicart | xx | without checksum |
Sufami Turbo Games | LoROM in Minicart | xx | without checksum |
Dragon Ball Z - Hyper Dimension | LoROM+SA-1 | 3MB | Overdump 4MB |
SDガンダム GNEXT(J) | LoROM+SA-1 | 1.5MB | Overdump 2MB |
Megaman X2 | LoROM+CX4 | 1.5MB | Overdump 2MB |
BS Super Mahjong Taikai (J) | BS | Overdump/Mirr+Empty | ? |
SPC7110タイトル | ROMサイズ(ヘッダ値) | チェックサム |
---|---|---|
Super Power League 4 | 2MB (rounded to 2MB) | 1x(All 2MB) |
桃太郎電鉄HAPPY(J) | 3MB (rounded to 4MB) | 2x(All 3MB) |
天外魔境ZERO(J) | 5MB (rounded to 8MB) | 1x(All 5MB) |
On-chip ROM contained in external CPUs (DSPn,ST01n,CX4) is NOT counted in the ROM size entry, and not included in the checksum.
Homebrew files often contain 0000h,0000h or FFFFh,0000h as checksum value.
Bit 0-3 マッピングモード
0x0: LoROM/32K Banks Mode 20 (LoROM)
0x1: HiROM/64K Banks Mode 21 (HiROM)
0x2: LoROM/32K Banks + S-DD1 Mode 22 (mappable) "Super MMC"
0x3: LoROM/32K Banks + SA-1 Mode 23 (mappable) "Emulates Super MMC"
0x5: HiROM/64K Banks Mode 25 (ExHiROM)
0xA: HiROM/64K Banks + SPC7110 Mode 25? (mappable)
Bit 4 動作速度
0: Slow(200ns)
1: Fast(120ns)
Bit 5 0b1(bit4とbit5の2bitでROMの動作クロック(2 or 3)を表していると思われる)
Bit 6-7 0b00
Note: ExHiROM は "大貝獣物語2(J)" と "テイルズオブファンタジア(J)" でのみ使われています。
00h ROM
01h ROM+RAM
02h ROM+RAM+Battery
x3h ROM+Co-processor
x4h ROM+Co-processor+RAM
x5h ROM+Co-processor+RAM+Battery
x6h ROM+Co-processor+Battery
x9h ROM+Co-processor+RAM+Battery+RTC-4513
xAh ROM+Co-processor+RAM+Battery+overclocked GSU1 ? (Stunt Race)
x2h Same as x5h, used in "F1 Grand Prix Sample (J)" (?)
0xh Co-processor is DSP (DSP1,DSP1A,DSP1B,DSP2,DSP3,DSP4)
1xh Co-processor is GSU (MarioChip1,GSU1,GSU2,GSU2-SP1)
2xh Co-processor is OBC1
3xh Co-processor is SA-1
4xh Co-processor is S-DD1
5xh Co-processor is S-RTC
Exh Co-processor is Other (Super Gameboy/Satellaview)
Fxh.xxh Co-processor is Custom (subclassed via [FFBFh]=xxh)
Fxh.00h Co-processor is Custom (SPC7110)
Fxh.01h Co-processor is Custom (ST010/ST011)
Fxh.02h Co-processor is Custom (ST018)
Fxh.10h Co-processor is Custom (CX4)
実際には以下の値が使用されます。
00h ROM ;if gamecode="042J" --> ROM+SGB2
01h ROM+RAM (if any such produced?)
02h ROM+RAM+Battery ;if gamecode="XBND" --> ROM+RAM+Batt+XBandModem
;if gamecode="MENU" --> ROM+RAM+Batt+Nintendo Power
03h ROM+DSP
04h ROM+DSP+RAM (no such produced)
05h ROM+DSP+RAM+Battery
13h ROM+MarioChip1/ExpansionRAM (and "hacked version of OBC1")
14h ROM+GSU+RAM ;\ROM size up to 1MByte -> GSU1
15h ROM+GSU+RAM+Battery ;/ROM size above 1MByte -> GSU2
1Ah ROM+GSU1+RAM+Battery+Fast Mode? (Stunt Race)
25h ROM+OBC1+RAM+Battery
32h ROM+SA1+RAM+Battery (?) "F1 Grand Prix Sample (J)"
34h ROM+SA1+RAM (?) "Dragon Ball Z - Hyper Dimension"
35h ROM+SA1+RAM+Battery
43h ROM+S-DD1
45h ROM+S-DD1+RAM+Battery
55h ROM+S-RTC+RAM+Battery
E3h ROM+Super Gameboy (SGB)
E5h ROM+Satellaview BIOS (BS-X)
F5h.00h ROM+Custom+RAM+Battery (SPC7110)
F9h.00h ROM+Custom+RAM+Battery+RTC (SPC7110+RTC)
F6h.01h ROM+Custom+Battery (ST010/ST011)
F5h.02h ROM+Custom+RAM+Battery (ST018)
F3h.10h ROM+Custom (CX4)
製造国が決まるとPAL/NTSCのどちらであるかも決まります。
値 | FFD9h | 地域 | PAL/NTSC |
---|---|---|---|
00h | - | 全世界向け(SGBなど) | any |
00h | J | 日本 | NTSC |
01h | E | アメリカ、カナダ | NTSC |
02h | P | ヨーロッパ、オセアニア、アジア | PAL |
03h | W | スウェーデン、スカンジナビア | PAL |
04h | - | フィンランド | PAL |
05h | - | デンマーク | PAL |
06h | F | フランス | SECAM, PAL-like 50Hz |
07h | H | オランダ | PAL |
08h | S | スペイン | PAL |
09h | D | ドイツ、オーストラリア、スイス | PAL |
0Ah | I | イタリア | PAL |
0Bh | C | 中国、香港 | PAL |
0Ch | - | インドネシア | PAL |
0Dh | K | 韓国 | NTSC |
0Eh | A | Common (?) | ? |
0Fh | N | カナダ | NTSC |
10h | B | ブラジル | PAL-M, NTSC-like 60Hz |
11h | U | オーストラリア | PAL |
12h | X | その他 | ? |
13h | Y | その他 | ? |
14h | Z | その他 | ? |
FFD9hの項目は、[FFD9h]
の値とゲームコードの4文字目を表しています。(製造地域コードが決まると[FFD9h]
とゲームコードの4文字目が一意に定まるものがある)
この領域は[FFDAh]=33h
のときに利用されます。
"xxxx" Normal 4-letter code (usually "Axxx") (or "Bxxx" for newer codes)
"xx " Old 2-letter code (space padded)
"042J" Super Gameboy 2
"MENU" Nintendo Power FLASH Cartridge Menu
"Txxx" NTT JRA-PAT and SPAT4 (SFC Modem BIOSes)
"XBND" X-Band Modem BIOS
"Zxxx" Special Cartridge with satellaview-like Data Pack Slot
ゲームコードが2文字のみのもの、"MENU"/"XBND"以外の、ゲームコードは、4文字目が製造地域を表しています。