From 3eea3a90b5a6c3f337f1eb951c63b5ca3ab9b06d Mon Sep 17 00:00:00 2001 From: cristian64 Date: Sun, 15 Mar 2026 18:14:43 +0000 Subject: [PATCH] Triforce: Check only first byte in region flag. In some Triforce games (e.g. _F-Zero AX_), the bytes that follow the region flag in the `boot.id` file (at `0x38`) happen to be `0x00`. However, in other games (e.g _Mario Kart Arcade GP 2_), it seems the region flag is padded with `0xFF`. _Mario Kart Arcade GP 2_ (`boot.id` in the USA version): ``` 00000 0000: 42 54 49 44 00 00 01 E0 00 00 00 01 00 00 00 01 BTID.... ........ 00000 0010: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ........ ........ 00000 0020: 47 43 41 4D 00 00 01 C0 07 D3 05 0F 00 00 00 07 GCAM.... ........ 00000 0030: 53 42 4E 4C 00 00 00 00 0E FF FF FF FF FF FF FF SBNL.... ........ ----------- ^ | region flag ``` When the region flag was tested in `switch` statements (where a single byte was expected in the `case`s), the test would fail, depending on the game. This issue would lead to the wrong calculation of the country in `VolumeDisc::GetCountry()`, which was then used to build the game ID in `VolumeDisc::GetGameID()`. The solution is to test using only the least meaningful byte in the region flag. Unexpected game IDs were first noticed with USA version of _Mario Kart Arcade GP 2_, which was wrongly assigned the same game ID that is given to the Japan version (i.e. `GNLJ82`). The correct game ID for the USA version is `GNLE82`. --- Source/Core/DiscIO/VolumeDisc.cpp | 2 +- Source/Core/DiscIO/VolumeGC.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Core/DiscIO/VolumeDisc.cpp b/Source/Core/DiscIO/VolumeDisc.cpp index 2ec71b9fe1..e842540376 100644 --- a/Source/Core/DiscIO/VolumeDisc.cpp +++ b/Source/Core/DiscIO/VolumeDisc.cpp @@ -67,7 +67,7 @@ Country VolumeDisc::GetCountry(const Partition& partition) const { const BootID* boot_id = static_cast(this)->GetTriforceBootID(); - switch (boot_id->region_flags) + switch (boot_id->region_flags & 0x000000FF) { default: case 0x02: // JAPAN diff --git a/Source/Core/DiscIO/VolumeGC.cpp b/Source/Core/DiscIO/VolumeGC.cpp index 5d3d372dcf..acff07e292 100644 --- a/Source/Core/DiscIO/VolumeGC.cpp +++ b/Source/Core/DiscIO/VolumeGC.cpp @@ -92,7 +92,7 @@ Region VolumeGC::GetRegion() const { if (m_is_triforce) { - switch (m_triforce_header.region_flags) + switch (m_triforce_header.region_flags & 0x000000FF) { default: case 0x02: // JAPAN