ROM header: Difference between revisions

From WSdev Wiki
Jump to navigationJump to search
(Created page with "Every WonderSwan ROM contains a header. It is stored at the end - final sixteen bytes - of the ROM image. == ROM header == Parts of this header are validated or otherwise used by the console's boot ROM - they are marked in '''bold'''. {| class="wikitable" |+ Header contents |- ! Offset !! Length !! Contents |- | '''$0''' || '''5''' || Far jump instruction: '''0xEA''', offset, segment. |- | '''$5''' || '''1''' || '''Maintenance''' |- | $6 || 1 || Developer/Publishe...")
 
 
(8 intermediate revisions by 2 users not shown)
Line 28: Line 28:
| '''$C''' || '''1''' || '''Flags'''
| '''$C''' || '''1''' || '''Flags'''
|-
|-
| $D || 1 || Mapper type
| $D || 1 || Mapper
|-
|-
| $E || 2 || Checksum (sum of all ROM bytes excluding the checksum)
| $E || 2 || Checksum (sum of all ROM bytes excluding the checksum)
|}
|}


=== $5 - Maintenance ===
=== Maintenance ($5) ===
 
----
<pre>
<pre>
s...0000
7  bit  0
|   ++++- Must be zero; otherwise the console will prohibit execution.
---- ----
|         Purpose unknown.
s... 0000
+-------- (Color) Splash bypass: 0 = Disable, 1 = Enable.
|   ||||
          Bypasses the custom boot splash stored in the console's
|    ++++- Must be zero; otherwise the console will prohibit execution.
          internal EEPROM; presumably used for bricked console recovery.
|         Purpose unknown.
+--------- (Color) Splash bypass: 0 = Disable, 1 = Enable.
          Bypasses the custom boot splash stored in the console's
          internal EEPROM; presumably used for bricked console recovery.
</pre>
</pre>


=== $6 - Developer/Publisher ID ===
=== Developer/Publisher ID ($6) ===
 
----
{| class="wikitable"
{| class="wikitable"
|+ Known official developer/publisher IDs
|+ Known official developer/publisher IDs
|-
|-
! ID !! Publisher
! ID !! Publisher code !! Publisher
|-
| $01 || BAN || Bandai
|-
|-
| $01 || Bandai
| $02 || TAT || Taito
|-
|-
| $02 || Taito
| $03 || TMY || Tomy
|-
|-
| $03 || ?
| $04 || KEX || Koei
|-
|-
| $04 || Koei
| $05 || DTE || Data East
|-
|-
| $05 || Data East
| $06 || AAE || Asmik Ace
|-
|-
| $06 || Asmik Ace
| $07 || MDE || Media Entertainment
|-
|-
| $07 || Media Entertainment
| $08 || NHB || Nichibutsu
|-
|-
| $08 || Nichibutsu
| $0A || CCJ || Coconuts Japan
|-
|-
| $0A || Coconuts Japan
| $0B || SUM || Sammy
|-
|-
| $0B || Sammy
| $0C || SUN || Sunsoft
|-
|-
| $0C || Sunsoft
| $0D || PAW || Mebius
|-
|-
| $0D || ?
| $0E || BPR || Banpresto
|-
|-
| $0E || Banpresto
| $10 || JLC || Jaleco
|-
|-
| $10 || Jaleco
| $11 || MGA || Imagineer
|-
|-
| $11 || Imagineer
| $12 || KNM || Konami
|-
|-
| $12 || Konami
| $16 || KBS || Kobunsha
|-
|-
| $16 || Kobunsha
| $17 || BTM || Bottom Up
|-
|-
| $17 || Bottom Up
| $18 || KGT || Kaga Tech
|-
|-
| $18 || ?
| $19 || SRV || Sunrise
|-
|-
| $19 || Sunrise
| $1A || CFT || Cyber Front
|-
|-
| $1A || Cyber Front
| $1B || MGH || Megahouse
|-
|-
| $1B || Megahouse
| $1D || BEC || Interbec
|-
|-
| $1D || Interbec
| $1E || NAP || Nihon Application
|-
|-
| $1E || ?
| $1F || BVL || Bandai Visual
|-
|-
| $1F || ?
| $20 || ATN || Athena
|-
|-
| $20 || Athena
| $21 || KDX || KID
|-
|-
| $21 || KID
| $22 || HAL || HAL Corporation
|-
|-
| $22 || ?
| $23 || YKE || Yuki Enterprise
|-
|-
| $23 || ?
| $24 || OMN || Omega Micott
|-
|-
| $24 || Omega Micott
| $25 || LAY || Layup
|-
|-
| $25 || ?
| $26 || KDK || Kadokawa Shoten
|-
|-
| $26 || ?
| $27 || SHL || Shall Luck
|-
|-
| $27 || ?
| $28 || SQR || Squaresoft
|-
|-
| $28 || Squaresoft
| $2A || SCC || ?
|-
|-
| $2A || ?
| $2B || TMC || Tom Create
|-
|-
| $2B || ?
| $2D || NMC || Namco
|-
|-
| $2D || Namco
| $2E || SES || ?
|-
|-
| $2E || ?
| $2F || HTR || ?
|-
|-
| $2F || ?
| $31 || VGD || Vanguard
|-
|-
| $31 || ?
| $32 || MGT || Megatron
|-
|-
| $32 || ?
| $33 || WIZ || Wiz
|-
|-
| $33 || ?
| $35 || TAN || Tanita
|-
|-
| $36 || ?
| $36 || CPC || Capcom
|}
|}


Note that IDs $00 and $01 are used across a variety of commercial games. Homebrew is known to use arbitrary values in this field.
Note that IDs $00 and $01 are used across a variety of commercial games. Homebrew is known to use arbitrary values in this field.


=== $7 - Color ===
=== Color ($7) ===
 
----
<pre>
<pre>
???????c
7  bit  0
      +- 0 = Monochrome only, 1 = Supports Color mode.
---- ----
???? ???c
        |
        +- 0 = Monochrome only, 1 = Supports Color mode.
</pre>
</pre>


=== $9 - Game version? / Safe mode ===
=== Game version? / Safe mode ($9) ===
 
----
<pre>
<pre>
pvvvvvvv
7  bit  0
|+++++++- Game version?
---- ----
+-------- Internal EEPROM write protect: 0 = Enable, 1 = Disable.
pvvv vvvv
          This prohibits writing to the internal EEPROM for addresses
|||| ||||
          0x60 and above (user settings, custom splash screen).
|+++ ++++- Game version?
          Games are expected to enable write protection; however, the
+--------- Internal EEPROM write protect: 0 = Enable, 1 = Disable.
          WonderWitch is factory configured with it disabled.
          This prohibits writing to the internal EEPROM for addresses
          0x60 and above (user settings, custom splash screen).
          Games are expected to enable write protection; however, the
          WonderWitch is factory configured with it disabled.
</pre>
</pre>


=== $A - ROM size ===
=== ROM size ($A) ===
 
----
Unofficial ROM size values are marked in ''italic''.
Unofficial/inferred ROM size values are marked in ''italic''.


{| class="wikitable"
{| class="wikitable"
Line 188: Line 199:
| $09 || 128 Mbit (16 MiB)
| $09 || 128 Mbit (16 MiB)
|-
|-
| ''$0A'' || ''256 Mbit (32 MiB)''<ref name="2003only">Not supported by the [[Bandai 2001]] mapper, which is limited to 16 MiB. The [[Bandai 2003]] mapper is limited to 64 MiB.</ref>
| ''$0A'' || ''256 Mbit (32 MiB)''
|-
|-
| ''$0B'' || ''512 Mbit (64 MiB)''<ref name="2003only"/>
| ''$0B'' || ''512 Mbit (64 MiB)''
|}
|}


=== $B - Save type/size ===
Note that ROM sizes over 16 MiB are not supported by the [[Bandai 2001]] mapper. The [[Bandai 2003]] mapper is limited to 64 MiB.


=== Save type/size ($B) ===
----
{| class="wikitable"
{| class="wikitable"
|+ Save type values
|+ Save type values
Line 202: Line 215:
| $00 || colspan="2" style="text-align:center;" | None  
| $00 || colspan="2" style="text-align:center;" | None  
|-
|-
| $01 || rowspan="5" | SRAM || 64 Kbit (8 KiB)
| $01 || rowspan="5" | SRAM || rowspan="2" | 256 Kbit (32 KiB)
|-
|-
| $02 || 256 Kbit (32 KiB)
| $02
|-
|-
| $03 || 1 Mbit (128 KiB)
| $03 || 1 Mbit (128 KiB)
Line 219: Line 232:
|}
|}


=== $C - Flags ===
Note that while ID <code>$01</code> is commonly documented as <code>64 Kbit</code>, all known cartridges using that value come with <code>256 Kbit</code> SRAM chips. This requires further investigation.


=== Flags ($C) ===
----
<pre>
<pre>
?????SBv
7  bit  0
    ||+- Starting screen orientation: 0 = Horizontal, 1 = Vertical.
---- ----
    ||  Controls the splash screen's orientation.
???? ?SBv
    |+-- ROM bus width: 0 = 16-bit, 1 = 8-bit.
      |||
    +--- ROM access time: 0 = 3 CPU cycles, 1 = 1 CPU cycle.
      ||+- Starting screen orientation: 0 = Horizontal, 1 = Vertical.
      ||  Controls the splash screen's orientation.
      |+-- ROM bus width: 0 = 16-bit, 1 = 8-bit.
      +--- ROM access time: 0 = 3 CPU cycles, 1 = 1 CPU cycle.
</pre>
</pre>


=== $D - Mapper type ===
=== Mapper ($D) ===
 
----
{| class="wikitable"
{| class="wikitable"
|+ Known mapper types
|+ Known mapper types
Line 236: Line 254:
! ID !! Mapper
! ID !! Mapper
|-
|-
| $00 || [[Bandai 2001]]
| $00 || [[Bandai 2001]] or [[KARNAK]]
|-
|-
| $01 || [[Bandai 2003]]
| $01 || [[Bandai 2003]]
|-
| $02 || [[KARNAK]] (Pocket Challenge V2)
|}
|}

Latest revision as of 18:30, 2 April 2024

Every WonderSwan ROM contains a header. It is stored at the end - final sixteen bytes - of the ROM image.

ROM header

Parts of this header are validated or otherwise used by the console's boot ROM - they are marked in bold.

Header contents
Offset Length Contents
$0 5 Far jump instruction: 0xEA, offset, segment.
$5 1 Maintenance
$6 1 Developer/Publisher ID
$7 1 Color
$8 1 Game ID (binary-coded decimal)
$9 1 Game version? / Safe mode
$A 1 ROM size
$B 1 Save type/size
$C 1 Flags
$D 1 Mapper
$E 2 Checksum (sum of all ROM bytes excluding the checksum)

Maintenance ($5)


7  bit  0
---- ----
s... 0000
|    ||||
|    ++++- Must be zero; otherwise the console will prohibit execution.
|          Purpose unknown.
+--------- (Color) Splash bypass: 0 = Disable, 1 = Enable.
           Bypasses the custom boot splash stored in the console's
           internal EEPROM; presumably used for bricked console recovery.

Developer/Publisher ID ($6)


Known official developer/publisher IDs
ID Publisher code Publisher
$01 BAN Bandai
$02 TAT Taito
$03 TMY Tomy
$04 KEX Koei
$05 DTE Data East
$06 AAE Asmik Ace
$07 MDE Media Entertainment
$08 NHB Nichibutsu
$0A CCJ Coconuts Japan
$0B SUM Sammy
$0C SUN Sunsoft
$0D PAW Mebius
$0E BPR Banpresto
$10 JLC Jaleco
$11 MGA Imagineer
$12 KNM Konami
$16 KBS Kobunsha
$17 BTM Bottom Up
$18 KGT Kaga Tech
$19 SRV Sunrise
$1A CFT Cyber Front
$1B MGH Megahouse
$1D BEC Interbec
$1E NAP Nihon Application
$1F BVL Bandai Visual
$20 ATN Athena
$21 KDX KID
$22 HAL HAL Corporation
$23 YKE Yuki Enterprise
$24 OMN Omega Micott
$25 LAY Layup
$26 KDK Kadokawa Shoten
$27 SHL Shall Luck
$28 SQR Squaresoft
$2A SCC ?
$2B TMC Tom Create
$2D NMC Namco
$2E SES ?
$2F HTR ?
$31 VGD Vanguard
$32 MGT Megatron
$33 WIZ Wiz
$35 TAN Tanita
$36 CPC Capcom

Note that IDs $00 and $01 are used across a variety of commercial games. Homebrew is known to use arbitrary values in this field.

Color ($7)


7  bit  0
---- ----
???? ???c
        |
        +- 0 = Monochrome only, 1 = Supports Color mode.

Game version? / Safe mode ($9)


7  bit  0
---- ----
pvvv vvvv
|||| ||||
|+++ ++++- Game version?
+--------- Internal EEPROM write protect: 0 = Enable, 1 = Disable.
           This prohibits writing to the internal EEPROM for addresses
           0x60 and above (user settings, custom splash screen).
           Games are expected to enable write protection; however, the
           WonderWitch is factory configured with it disabled.

ROM size ($A)


Unofficial/inferred ROM size values are marked in italic.

ROM size values
ID Size
$00 1 Mbit (128 KiB)
$01 2 Mbit (256 KiB)
$02 4 Mbit (512 KiB)
$03 8 Mbit (1 MiB)
$04 16 Mbit (2 MiB)
$05 24 Mbit (3 MiB)
$06 32 Mbit (4 MiB)
$07 48 Mbit (6 MiB)
$08 64 Mbit (8 MiB)
$09 128 Mbit (16 MiB)
$0A 256 Mbit (32 MiB)
$0B 512 Mbit (64 MiB)

Note that ROM sizes over 16 MiB are not supported by the Bandai 2001 mapper. The Bandai 2003 mapper is limited to 64 MiB.

Save type/size ($B)


Save type values
ID Type Size
$00 None
$01 SRAM 256 Kbit (32 KiB)
$02
$03 1 Mbit (128 KiB)
$04 2 Mbit (256 KiB)
$05 4 Mbit (512 KiB)
$10 EEPROM 1 Kbit (128 B)
$20 16 Kbit (2 KiB)
$50 8 Kbit (1 KiB)

Note that while ID $01 is commonly documented as 64 Kbit, all known cartridges using that value come with 256 Kbit SRAM chips. This requires further investigation.

Flags ($C)


7  bit  0
---- ----
???? ?SBv
      |||
      ||+- Starting screen orientation: 0 = Horizontal, 1 = Vertical.
      ||   Controls the splash screen's orientation.
      |+-- ROM bus width: 0 = 16-bit, 1 = 8-bit.
      +--- ROM access time: 0 = 3 CPU cycles, 1 = 1 CPU cycle.

Mapper ($D)


Known mapper types
ID Mapper
$00 Bandai 2001 or KARNAK
$01 Bandai 2003