| Byte / Bit # | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| HB0 | Packet Type = 0x81 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| HB1 | Version = 1 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| HB2 | 0 | 0 | 0 | Length = 27 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| PB0 | Checksum | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| PB1 | IEEE OUI Third Octet = 0x49 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| PB2 | IEEE OUI Second Octet = 0x31 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| PB3 | IEEE OUI First Octet = 0xF4 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| PB4 | Vendor Type = 0x01 (Game ID) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| PB5 |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| PB6 | Game-ID Byte0 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ... | ... | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| PB27 | Game-ID Byte22 (unused Bytes should be 0x00) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Uses the PlayStation game ID format (like "SLUS-01333"), which was assigned by Sony as part of their licensing system.
Can be easily etracted from a disc image:
# ISO/BIN files:
# Mount or extract the ISO, then read SYSTEM.CNF
# SYSTEM.CNF contains something like:
BOOT = cdrom:\SLUS_013.33;1
# cdrom:\SLUS_013.33;1 normalized to SLUS-01333
Uses the PlayStation 2 game ID format (like "SLUS-21489"), which was assigned by Sony as part of their licensing system.
Can be easily etracted from a disc image:
# ISO/BIN files:
# Mount or extract the ISO, then read SYSTEM.CNF
# SYSTEM.CNF contains something like:
BOOT2 = cdrom0:\SLUS_214.89;1
# cdrom:\SLUS_214.89;1 normalized to SLUS-21489
Uses the ROM header CRC checksums and Country Code
Extract CRC1 (CRC HI), CRC2 (CRC LO) and Country Code (endian normalized to big-endian) from the ROM header:
| Offset | Bytes | Explanation |
|---|---|---|
0x10 |
4 | CRC1 (CRC HI) |
0x14 |
4 | CRC2 (CRC LO) |
0x3E |
1 | Country Code |
The Game-ID transmitted then is:
# [8 chars CRC1]-[8 chars CRC2]-[2 chars Country Code]
gameid := to_hex_string(CRC1) + "-" + to_hex_string(CRC2) + "-" + to_hex_string(Country Code)
Example:
635A2BFF-8B022326-45 (Super Mario 64 (U))
Uses a publisher-assigned SKU/catalog number
Game-ID can extracted from XBE header:
XBE Header (fixed offsets)
| Offset | Size | Description |
|---|---|---|
0x000 |
4 | Magic number (XBEH) |
0x104 |
4 | Base Address |
0x118 |
4 | Certificate Address (pointer) |
Certificate Section (relative to certificate offset)
The certificate address at 0x118 is a virtual address. To get the file offset:
cert_file_offset = cert_address - base_address
Then within the certificate:
| Offset | Size | Description |
|---|---|---|
+0x00 |
4 | Certificate size |
+0x04 |
4 | Timestamp |
+0x08 |
4 | Title ID |
+0x0C |
80 | Title Name (UTF-16LE, 40 chars) |
+0x5C |
4 | Region flags |
+0x60 |
4 | Media type flags |
+0x64 |
4 | Version |
+0x68 |
4 | Disc number |
+0x6C |
16 | LAN Key |
+0x7C |
16 | Signature Key |
+0x9C |
256 | Alternate Signature Keys |
Example: Title ID: 0x5345002A -> Game-ID: SE-042
Uses the Wii Game-ID found at the start if the disc image
The Game-ID is at the very beginning of the ISO:
| Offset | Size | Description |
|---|---|---|
0x000 |
6 | Game-ID |
0x006 |
1 | Disc number |
0x007 |
1 | Disc version |
0x018 |
4 | Wii magic (0x5D1C9EA3) |
0x020 |
64 | Game Title (ASCII) |
Example: Game-ID: R2FE5G (Freddi Fish: Kelp Seed Mystery (USA) (EN))
Uses boot_hash, ConsoleID and CountryCode
The Game-ID (10 bytes: boot_hash + ConsoleID + CountryCode) is then transmitted as a 20-character hexadecimal packet.
Example:
FB FD 9C 15 31 41 7A EF 47 50 (Tomb Raider Legend - PAL)
└┴─┴┴─┴┴─┴┴─┴┴─┴┴─┴┴─┴┘ │ │
│ │ └── CountryCode/Region: 'P' (0x50) = Europe
│ └───── ConsoleID/Media: 'G' (0x47) = GameCube
└──────────────────── boot_hash: 0xFBFD9C1531417AEF
Uses a product code system, which can be extracted from a disc image
Game-ID can be extracted from the IP.BIN header:
| Offset | Size | Description |
|---|---|---|
0x000 |
16 | Hardware ID ("SEGA SEGAKATANA ") |
0x010 |
16 | Maker ID |
0x020 |
5 | Device Info ("GD-ROM") |
0x025 |
11 | Area Symbols (regions) |
0x030 |
8 | Peripherals |
0x040 |
10 | Product Number/Game-ID |
0x04A |
6 | Version |
0x050 |
16 | Release Date |
0x060 |
16 | Boot Filename |
0x070 |
16 | Publisher |
0x080 |
128 | Game Title |
Example: Game-ID: MK-51054 (VIRTUA TENNIS)
Uses a publisher-assigned product code system
The product code is stored in the disc header, usually at the beginning of the first track (bin/cue).
| Offset | Size | Description |
|---|---|---|
0x000 |
16 | Raw Image Header |
0x010 |
16 | Hardware ID ("SEGA SEGASATURN ") |
0x020 |
16 | Maker ID |
0x030 |
10 | Product Number/Game-ID |
0x03A |
6 | Version |
0x040 |
8 | Release Date |
0x070 |
112 | Game Title |
Example: Game-ID: MK-81009 (PANZER DRAGOON)
Nintendo's 6-character ID format:
ALZE01
││││││
│││││└── Region code
││││└─── Publisher code (char 2)
│││└──── Publisher code (char 1)
││└───── Game code (char 2)
│└────── Game code (char 1)
└─────── Console/Type code
Example: Game-ID: ALZE01 (The Legend of Zelda: Breath of the Wild (USA) (EN))
https://firmware.pixelfx.co/gameid.php?pid=SYSTEM-ID&gameid=GAME-ID
SYSTEM-ID can be the "System Identifier" as string (case-insensitive), integer or hexGAME-ID is the game id as transmittedExamples:
N64:
PS1:
PS2:
XBOX:
https://firmware.pixelfx.co/gameid-cover.php?pid=SYSTEM-ID&gameid=GAME-ID
SYSTEM-ID can be the "System Identifier" as string (case-insensitive), integer or hexGAME-ID is the game id as transmittedExamples:
LoveMHz for contributing Xbox code, database and cover art!
grawlixdev for contributing Wii/WiiU code, databases and cover art!