ROM Header: Difference between revisions

no edit summary
No edit summary
No edit summary
Line 56:
|-
|0x34
|47
|Unused
|?
|?
|-
|0x38
|3
|?
|?
|-
|0x3B
Line 81 ⟶ 76:
|Game ID
|Two letter code to identify the game. Normally, these are ASCII uppercase letters.
 
 
The special value "ED" (ASCII) indicates a homebrew ROM that follows the Advanced Homebrew ROM Header format. In this format, additional informations are encoded in the header for the purpose of helping playing homebrew games in emulators and flashcarts. See below for more information.
|-
|0x3E
Line 157 ⟶ 155:
|0x3F
|1
|Unused
|Version?
|?
|-
|0x40
Line 164 ⟶ 162:
|IPL3
|This area contains the [[IPL3|IPL3 boot code]]. Each ROM ships its own IPL3 that is meant to work together with the [[CIC]] installed in the ROM. Before running IPL3, IPL2 checks its checksum also using a seed coming from the CIC, which binds each IPL3 code to a specific version of CIC.
|}
 
== Advanced Homebrew ROM Header ==
The Advanced Homebrew ROM Header format is a convention that has been agreed upon in the N64 homebrew community to add additional information in the header, using unused fields. The goal of this convention is to let homebrew ROMs declare the correct saveype and controllers that are expected to play the game. The format has been introduced by the EverDrive 64 flashcard and has been later enhanced by the homebrew community.
 
This is useful because emulators normally work using a game database which matches games using checksum to find out which savetype and controllers are expected by the game, to help gamers play the game. For instance, when a N64 emulator detects that a Perfect Dark ROM is loaded, it will automatically emulate a 16Kb EEPROM to save the game (that was the original support present in the physical cartridge for the original game), and will possibly also emulate a preinstalled Transfer PAK, as the accessory can be used with the game. This is done purely by matching the Perfect Dark ROM checksum in a database, so a homebrew game, which would probably not be present in game databases, would suffer from non-working saves and possibly wouldn't be able to use special controllers or accessories.
 
Instead, by using the Advanced Hombrew ROM Header, emulators can automatically configure the required emulated hardware as expected without having to keep any additional database, by simply decoding specific fields of the ROM header. In addition to emulators, also development flashcarts and loaders can use this format to automatically configure the correct savetype when the ROM is loaded.
 
=== Homebrew ROM Header special flags ===
{| class="wikitable"
!Offset
!Bytes
!Name
!Description
|-
|0x36
|1
|Controller 1
|This byte contains the suggested / expected controller hardware that should be attached to port 1.
Values 0x01-0x7F indicate a standard N64 controller, possibly with some installed pak.
 
Values 0x80-0xFE indicate a different kind of controller.
{| class="wikitable"
|+
!0x00
|No information provided.
Emulators should follow their standard configuration for this port.
!0x80
|N64 mouse
|-
!0x01
|N64 controller with Rumble Pak
!0x81
|VRU
|-
!0x02
|N64 controller with Controller Pak
!0x82
|Gamecube controller
|-
!0x03
|N64 controller with Transfer Pak
!0x83
|Randnet keyboard
|-
!0xFF
|Nothing attached to this port
!0x84
|Gamecube keyboard
|}
 
 
|-
|0x37
|1
|Controller 2
|This byte contains the suggested / expected controller hardware that should be attached to port 2. See byte 0x36 for more information.
|-
|0x38
|1
|Controller 3
|This byte contains the suggested / expected controller hardware that should be attached to port 3. See byte 0x36 for more information.
|-
|0x39
|1
|Controller 4
|This byte contains the suggested / expected controller hardware that should be attached to port 4. See byte 0x36 for more information.
|-
|0x3C
|2
|Game ID
|This must contain the ASCII characters "ED". It is used as an ID to identify that the Advanced Homebrew ROM header format Is being used by this ROM.
|-
|0x3F
|1
|Savetype
|This byte mostly contains information on the savetype. It must be decoded as a bitfield:
{| class="wikitable"
|+
!Bit
!Description
|-
|0
|The game uses the serial RTC (via Joybus)
|-
|1
|The game is region-free
|-
|2
|Unused
|-
|3
|Unused
|-
|4-7
|Savetype expected by the game. possibile values:
 
 
0: None
 
1: 4K EEPROM
 
2: 16K EEPROM
 
3: 256K SRAM
 
4: 768K SRAM (banked)
 
5: Flash RAM
 
6: 1M SRAM
 
|}
|}
 
=== Support by emulators ===
Emulators not listed here do not support the advanced homebrew ROM header format.
{| class="wikitable"
|+
!Emulator
!Current support
!
!
|-
|Ares
|Supports Savetype only
|
|
|-
|cen64
|Supports Savetype only
|
|
|}
 
=== Support by flashcarts ===
Support by flashcarts can vary depending on the USB loader being used and/or the flashcart operating system. Notice that flashcarts can emulate a specific savetype but have nothing to do with controllers, so the maximum expected support is related to savetype.
{| class="wikitable"
|+
!Flashcart
!Loader
!Current support
|-
| rowspan="4" |64drive
|64drive official C tool
|None
|-
|64drive menu
|None
|-
|g64drive
|Savetype supported
|-
|UNFLoader
|None
|-
| rowspan="3" |Everdrive 64
|Menu
|Savetype supported
|-
|ed64
|None
|-
|UNFLoader
|None
|}