We've just updated MediaWiki and its underlying software. If anything doesn't look or work quite right, please mention it to us. --RanAS

SNES ROM Header: Difference between revisions

From SnesLab
Jump to: navigation, search
(Checksum calculation info)
Line 63: Line 63:
=== ROM Verification ===
=== ROM Verification ===
==== Complement Check ====
==== Complement Check ====
This is the 16-bit complement (bit-inverse) of the checksum. This is used so that the checksum value cancels itself out when calculating the real checksum.
==== Check Sum ====
==== Check Sum ====
This is simply the 16-bit sum of all bytes in the ROM. For power-of-2-sized ROMs, no mirroring is used, each byte of ROM is counted exactly once.
For non-power-of-2-sized ROMs (e.g. 2.5MB or 6MB), first the checksum for the largest power-of-2 area smaller than the ROM size (so 4MB for 6MB ROMs, 2MB for 2.5MB ROMs) is computed normally. Then the remaining part is repeated until it's the same size as the first part (so the last 2MB of a 6MB ROM is repeated once so both halves are 4MB, and the last 512KB of a 2.5MB ROM is repeated 4 times so both halves are 2MB). Then its checksum is computed and the checksums of the 2 halves are added to get the final checksum.

Revision as of 10:06, 7 August 2019

All SNES gamepaks have an internal header that is used to identifying the game, producer, region and technical aspects of the ROM. It's often referred as Internal ROM Header or SNES Software Specification.

Although it's not required to run a game on real hardware, the SNES ROM Header was used during the Nintendo approval process for validation and it's also used by the SNES emulators to identify and determine the memory layout and ROM type.

The data starts at SNES address $00:FFB0 and ends at $00:FFDF. $00:FFE0 though $00:FFFF contains the SNES vector information and it's actually used by the SNES CPU to determine where to execute when an interrupt occurs.

ROM Registration Data

Address Length Data Name Type
$00:FFB0 2 bytes Maker Code
$00:FFB2 4 bytes Game Code
$00:FFB6 7 bytes Fixed Value
$00:FFBD 1 byte Expansion RAM Size
$00:FFBE 1 byte Special Version
$00:FFBF 1 byte Cartridge Type (Sub-number)
$00:FFC0 21 bytes Game Title Registration
$00:FFD5 1 byte Map Mode
$00:FFD6 1 byte Cartridge Type
$00:FFD7 1 byte ROM Size
$00:FFD8 1 byte RAM Size
$00:FFD9 1 byte Destination Code
$00:FFDA 1 byte Fixed Value
$00:FFDB 1 byte Mask ROM Version
$00:FFDC 2 bytes Complement Check
$00:FFDE 2 bytes Check Sum

Data Name Types

Maker Code

Game Code

Fixed Value

Expansion RAM Size

Special Version

Game Title Specification

Cartridge Configuration

Map Mode

Cartridge Type

Sub-Number

ROM Size

RAM Size

Destination Code

Mask ROM Version

ROM Verification

Complement Check

This is the 16-bit complement (bit-inverse) of the checksum. This is used so that the checksum value cancels itself out when calculating the real checksum.

Check Sum

This is simply the 16-bit sum of all bytes in the ROM. For power-of-2-sized ROMs, no mirroring is used, each byte of ROM is counted exactly once.

For non-power-of-2-sized ROMs (e.g. 2.5MB or 6MB), first the checksum for the largest power-of-2 area smaller than the ROM size (so 4MB for 6MB ROMs, 2MB for 2.5MB ROMs) is computed normally. Then the remaining part is repeated until it's the same size as the first part (so the last 2MB of a 6MB ROM is repeated once so both halves are 4MB, and the last 512KB of a 2.5MB ROM is repeated 4 times so both halves are 2MB). Then its checksum is computed and the checksums of the 2 halves are added to get the final checksum.