Files

388 lines
17 KiB
YAML

emulator: Triforce
type: standalone
core_classification: enhanced_fork
source: "https://github.com/REG-Linux/dolphin-triforce"
upstream: "https://github.com/dolphin-emu/dolphin"
profiled_date: "2026-08-08"
source_commit: "5c456e8ff0da0235be2cf1d55ba7bb2115b0cae2"
core_version: "2407"
display_name: "Namco / Sega / Nintendo - Triforce (Dolphin Triforce)"
cores:
- triforce
- dolphin-triforce
systems:
- sega-triforce
- nintendo-wii-arcade
- nintendo-gamecube
- nintendo-wii
mode: standalone
notes: |
crediar's Dolphin fork, which adds the Triforce arcade boards (AM-Baseboard on
the serial interface, AM-Mediaboard on the disc interface) and the Wii Arcade
boards on top of GameCube and Wii emulation. The tree self-reports Dolphin 2407
(CMake/ScmRevGen.cmake:34-35) and builds DolphinQt. crediar publishes the source
on crediar.dev; the commit profiled here is the REG-Linux mirror of it, whose
Data/Sys tree matches the Hancock33 and ReaverTeknoGods mirrors byte for byte.
ES-DE looks for dolphin-emu-triforce on Linux and Triforce.exe or
Triforce/DolphinWX.exe on Windows, RetroBat installs it as dolphin-triforce.
segaboot.gcm is the Triforce firmware. DVDInterface::Init calls
AMMediaboard::Init only when EXI serial port 1 holds the AM Mediaboard, so the
read happens on every Triforce launch and never otherwise
(Source/Core/Core/HW/DVD/DVDInterface.cpp:289-294). Init resolves the file under
Sys/Triforce, with no User fallback, and copies min(file size, 2 MiB) into the
firmware buffer without checking anything
(Source/Core/Core/HW/DVD/AMMediaboard.cpp:215-233). A missing file raises a
modal alert and returns before the buffer is filled, leaving it at 0xFF. The
guest reads that buffer whenever the firmware is mapped
(Source/Core/Core/HW/DVD/AMMediaboard.cpp:1083-1090), which is how the Service
and Test menus are reached. The tree ships the copy documented below, SegaBoot
v3.11 with a RELSAB header, and the mediaboard answers GetSegaBootVersion for
both 3.09 and 3.11 layouts
(Source/Core/Core/HW/DVD/AMMediaboard.cpp:1268-1269, 1397-1398).
Triforce mode also swaps the GameCube boot ROM name: GetBootROMPath returns
IPL_TRI.bin instead of IPL.bin, User first then Sys
(Source/Core/Core/Config/MainSettings.cpp:614-625). Load_BS2 reads at most 2 MiB,
CRC32s what it read against a table of Redump dumps and accepts 0xD1883221 as
the Triforce revision (Source/Core/Core/Boot/Boot.cpp:391-436). On that match it
patches OSReport and maps SegaBoot as firmware so the guest IPL can chain into
it (Source/Core/Core/Boot/Boot.cpp:482-489). SkipIPL defaults to true
(Source/Core/Core/Config/MainSettings.cpp:37) and EmulatedBS2 otherwise copies
the disc straight into DIMM memory and clears the firmware mapping
(Source/Core/Core/Boot/Boot_BS2Emu.cpp:332-347), so games run without any IPL.
Boot ROM directories follow the legacy naming: GetDirectoryForRegion defaults to
RegionDirectoryStyle::Legacy (Source/Core/Core/Config/MainSettings.h:369-370) and
every boot ROM caller takes the default, so NTSC-J resolves to JAP. FindIPLDump
probes USA, EUR and JAP and stops there
(Source/Core/Core/HW/EXI/EXI_DeviceIPL.cpp:180-189).
Wii Arcade runs as IOSC console type RVA, reached three ways: the RVA expansion
device in slot A (Source/Core/Core/IOS/IOSC.cpp:213-218), an RVA.txt file in the
System Menu title data (Source/Core/Core/Boot/Boot_BS2Emu.cpp:387-397), or a
ticket issued by Root-CA10000000-XS10000000
(Source/Core/Core/IOS/ES/Formats.cpp:490-493). That console type switches to the
development common key and root key held in the binary
(Source/Core/Core/IOS/IOSC.cpp:603-615).
Save data the emulator creates on first run is keyed on the disc, so none of it
can be supplied: tridimm_<game-id>.bin and backup_<game-id>.bin
(Source/Core/Core/HW/DVD/AMMediaboard.cpp:201-202), the baseboard backup
tribackup_<game-id>.bin
(Source/Core/Core/HW/EXI/EXI_DeviceAMBaseboard.cpp:77-100), the card reader image
tricard_<game-id>.bin
(Source/Core/Core/HW/SI/SI_DeviceAMBaseboard.cpp:1147-1310), and the three Wii
Arcade SRAM images under User/Arcade, sized 0x1400, 0x1A40 and 0x8000 by game
type (Source/Core/Core/HW/EXI/EXI_DeviceRVA.cpp:1249-1285).
Recognised Triforce titles are F-Zero AX, F-Zero AX Monster Ride, Mario Kart
Arcade GP 1 and 2, Virtua Striker 3 and 4, Gekitou Pro Yakyuu and Key of Avalon
(Source/Core/Core/HW/DVD/AMMediaboard.h:25-36).
# Two roots. Paths starting with Sys/ are relative to the installation data
# directory returned by File::GetSysDirectory (Source/Core/Common/FileUtil.cpp:800),
# which is where the code looks and nowhere else. Every other path is relative to
# the user directory (GC/, GBA/, Wii/, Triforce/, Arcade/, Load/), which the code
# tries first, falling back to the same relative path under Sys/ for the GameCube
# boot ROMs and DSP ROMs.
files:
# -- Triforce firmware --
- name: "segaboot.gcm"
path: "Sys/Triforce/segaboot.gcm"
description: "SegaBoot, the Triforce system disc image held on the AM-Mediaboard"
system: sega-triforce
size: 2097152
sha1: "87918619c632ac9de270d4fdf396a57eb57fc620"
required: true
source_ref: "Source/Core/Core/HW/DVD/AMMediaboard.cpp:215-233, Source/Core/Core/HW/DVD/DVDInterface.cpp:289-294"
note: >
Read on every Triforce launch, Sys/Triforce only with no User fallback.
Nothing is validated, min(file size, 2 MiB) is copied into the firmware
buffer. The hash is the copy the fork's own Data/Sys tree carries, SegaBoot
v3.11.
# -- Triforce GameCube boot ROM --
# Region-specific directory, User/GC/<region>/ then Sys/GC/<region>/.
# One dump (Redump "Triforce (ARCADE BOOTROM)", DEV revision 1.0) serves every
# directory, the region only decides where the code looks.
- name: "IPL_TRI.bin"
path: "GC/USA/IPL_TRI.bin"
description: "Triforce boot ROM, NTSC-U directory"
system: sega-triforce
region: [north-america]
size: 2097152
crc32: "d1883221"
validation: [crc32]
required: false
hle_fallback: true
source_ref: "Source/Core/Common/CommonPaths.h:149, Source/Core/Core/Config/MainSettings.cpp:614-625, Source/Core/Core/Boot/Boot.cpp:400,415-436"
note: >
CRC32 is computed over the first 2 MiB and compared against the Redump
table, 0xD1883221 being the Triforce revision. An unknown value warns and
loading continues. A match also maps SegaBoot as firmware
(Source/Core/Core/Boot/Boot.cpp:482-489).
- name: "IPL_TRI.bin"
path: "GC/EUR/IPL_TRI.bin"
description: "Triforce boot ROM, PAL directory"
system: sega-triforce
region: [europe]
size: 2097152
crc32: "d1883221"
validation: [crc32]
required: false
hle_fallback: true
source_ref: "Source/Core/Core/Config/MainSettings.cpp:620-623"
- name: "IPL_TRI.bin"
path: "GC/JAP/IPL_TRI.bin"
description: "Triforce boot ROM, NTSC-J directory"
system: sega-triforce
region: [japan]
size: 2097152
crc32: "d1883221"
validation: [crc32]
required: false
hle_fallback: true
source_ref: "Source/Core/Core/Config/MainSettings.cpp:587-612,620-623"
note: "JAP is the directory the legacy naming style returns for NTSC-J."
# -- AM-Mediaboard system state --
- name: "trinetcfg.bin"
path: "Triforce/trinetcfg.bin"
description: "Mediaboard network configuration"
system: sega-triforce
required: false
unsourceable: "created empty by the emulator on first Triforce launch, written by the guest, no hardware dump equivalent"
source_ref: "Source/Core/Core/HW/DVD/AMMediaboard.cpp:169-177,198"
- name: "trinetctrl.bin"
path: "Triforce/trinetctrl.bin"
description: "Mediaboard network control block"
system: sega-triforce
required: false
unsourceable: "created empty by the emulator on first Triforce launch, written by the guest, no hardware dump equivalent"
source_ref: "Source/Core/Core/HW/DVD/AMMediaboard.cpp:169-177,199"
- name: "triextra.bin"
path: "Triforce/triextra.bin"
description: "Mediaboard extra settings block"
system: sega-triforce
required: false
unsourceable: "created empty by the emulator on first Triforce launch, written by the guest, no hardware dump equivalent"
source_ref: "Source/Core/Core/HW/DVD/AMMediaboard.cpp:169-177,200"
# -- Wii Arcade --
- name: "RVA.txt"
path: "Wii/title/00000001/00000002/data/RVA.txt"
description: "Marker that switches the emulated console to Wii Arcade mode"
system: nintendo-wii-arcade
required: false
unsourceable: "user-created marker inside the emulated NAND, only its presence is tested, no file is distributed"
source_ref: "Source/Core/Common/CommonPaths.h:165, Source/Core/Core/Boot/Boot_BS2Emu.cpp:387-397"
note: >
Opened for read inside the System Menu title data. Success sets console type
RVA and forces the RGB region settings. The RVA expansion device in slot A
reaches the same console type without it
(Source/Core/Core/IOS/IOSC.cpp:213-218).
# -- GameCube boot ROM --
# User/GC/<region>/ then Sys/GC/<region>/. Also the preferred source for the
# GameCube fonts when present.
- name: "IPL.bin"
path: "GC/USA/IPL.bin"
description: "GameCube NTSC-U boot ROM"
region: [north-america]
size: 2097152
required: false
hle_fallback: true
source_ref: "Source/Core/Common/CommonPaths.h:148, Source/Core/Core/Config/MainSettings.cpp:627-630, Source/Core/Core/HW/EXI/EXI_DeviceIPL.cpp:109-118,182-183"
note: "Needed to boot the GameCube menu and to take the fonts from a real dump."
- name: "IPL.bin"
path: "GC/EUR/IPL.bin"
description: "GameCube PAL boot ROM"
region: [europe]
size: 2097152
required: false
hle_fallback: true
source_ref: "Source/Core/Core/HW/EXI/EXI_DeviceIPL.cpp:184-185"
- name: "IPL.bin"
path: "GC/JAP/IPL.bin"
description: "GameCube NTSC-J boot ROM"
region: [japan]
size: 2097152
required: false
hle_fallback: true
source_ref: "Source/Core/Core/HW/EXI/EXI_DeviceIPL.cpp:186-187"
# -- DSP ROMs --
# User/GC/ then Sys/GC/. Used by DSP LLE, and dsp_coef.bin also by the HLE
# polyphase resampler.
- name: "dsp_rom.bin"
path: "GC/dsp_rom.bin"
description: "DSP instruction ROM"
size: 8192
validation: [size, adler32]
known_hash_adler32: ["0x66f334fe", "0xe789b5a5"]
adler32_byteswap: true
required: false
hle_fallback: true
source_ref: "Source/Core/Common/CommonPaths.h:145, Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:87-105,109-118, Source/Core/Core/DSP/DSPCore.h:44, Source/Core/Core/DSP/DSPCore.cpp:36-38, Source/Core/Core/DSP/DSPCore.cpp:28-102"
note: >
LoadDSPRom rejects any file whose length differs from DSP_IROM_BYTE_SIZE and
swaps every 16 bit word before storing it, so the Adler32 in the source is
taken over the swapped data (Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:100-102).
The pair is matched against seven known sets, the first being the Nintendo
ROMs; a miss asks the user whether to stop
(Source/Core/Core/DSP/DSPCore.cpp:60-84).
- name: "dsp_coef.bin"
path: "GC/dsp_coef.bin"
description: "DSP coefficient ROM"
size: 4096
validation: [size, adler32]
known_hash_adler32: ["0xf3b93527", "0xa4a575f5"]
adler32_byteswap: true
required: false
hle_fallback: true
source_ref: "Source/Core/Common/CommonPaths.h:146, Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:87-105,110-119, Source/Core/Core/DSP/DSPCore.h:58, Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp:61-62, Source/Core/Core/DSP/DSPCore.cpp:28-102"
note: >
Also read by the HLE AX ucode for polyphase resampling. Adler32 is taken over
the byte-swapped data (Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:100-102).
# -- GameCube fonts --
# Sys/GC/ only. Skipped when an IPL dump is available, the fonts are then read
# out of the dump at 0x1aff00 and 0x1fcf00 instead.
- name: "font_western.bin"
path: "Sys/GC/font_western.bin"
description: "Windows-1252 font used by GameCube and Wii text rendering"
size: 9589
required: false
hle_fallback: true
source_ref: "Source/Core/Common/CommonPaths.h:142, Source/Core/Core/HW/EXI/EXI_DeviceIPL.cpp:131,203-247"
note: >
Size is the official font length the code reads from an IPL dump, 0x2575
(Source/Core/Core/HW/EXI/EXI_DeviceIPL.cpp:234-236). A standalone file is
read without any check.
- name: "font_japanese.bin"
path: "Sys/GC/font_japanese.bin"
description: "Shift-JIS font used by GameCube and Wii text rendering"
size: 303693
required: false
hle_fallback: true
source_ref: "Source/Core/Common/CommonPaths.h:143, Source/Core/Core/HW/EXI/EXI_DeviceIPL.cpp:130,203-247"
note: "Size is the official font length read from an IPL dump, 0x4a24d."
# -- GBA BIOS --
- name: "gba_bios.bin"
path: "GBA/gba_bios.bin"
description: "GBA BIOS for the GameCube to Game Boy Advance link"
required: false
hle_fallback: true
source_ref: "Source/Core/Common/CommonPaths.h:155, Source/Core/Common/FileUtil.cpp:917-919, Source/Core/Core/HW/GBACore.cpp:202-206,336-353"
note: >
Loaded into the integrated mGBA core, which fails to start without it. The
path is overridable by the Main.GBA BIOS setting
(Source/Core/Core/Config/MainSettings.cpp:361).
# -- Wii system files --
- name: "SYSCONF"
path: "Wii/shared2/sys/SYSCONF"
description: "Wii system configuration"
size: 16384
validation: [size]
required: false
hle_fallback: true
source_ref: "Source/Core/Common/CommonPaths.h:87,127, Source/Core/Core/SysConf.cpp:19,54-65"
note: >
SysConf::Load rejects any size other than SYSCONF_SIZE and falls back to
built-in defaults. Generated by the emulator, can come from a NAND backup
instead.
- name: "setting.txt"
path: "Wii/title/00000001/00000002/data/setting.txt"
description: "Wii region, area and serial settings"
size: 256
required: false
hle_fallback: true
source_ref: "Source/Core/Common/CommonPaths.h:163, Source/Core/Core/Boot/Boot_BS2Emu.cpp:412-424, Source/Core/Common/SettingsHandler.h:21,26"
note: >
Read into a fixed 256 byte buffer, then rewritten during Wii boot emulation
from the region settings table.
- name: "nand.bin"
path: null
description: "BootMii NAND backup, imported through the NAND importer"
required: false
hle_fallback: true
source_ref: "Source/Core/DiscIO/NANDImporter.cpp:26-40,42-57"
note: >
Accepted at 0x21000000 bytes, or 0x21000400 when the OTP and SEEPROM dump is
appended. Any other size is rejected.
- name: "keys.bin"
path: "Wii/keys.bin"
description: "OTP and SEEPROM dump holding the console keys"
size: 1024
required: false
hle_fallback: true
source_ref: "Source/Core/DiscIO/NANDImporter.cpp:19,76-88,288-298, Source/Core/Core/IOS/IOSC.cpp:639-665"
note: >
Asked for at import time when not appended to the NAND image, and written to
the Wii root. Read at every boot, absence falls back to the built-in default
key set.
- name: "clientca.pem"
path: "Wii/clientca.pem"
description: "SSL client certificate extracted from IOS13"
required: false
hle_fallback: true
source_ref: "Source/Core/DiscIO/NANDImporter.cpp:201-286"
note: "Located inside the IOS13 content during NAND import by its leading bytes."
- name: "clientcakey.pem"
path: "Wii/clientcakey.pem"
description: "SSL client private key extracted from IOS13"
required: false
hle_fallback: true
source_ref: "Source/Core/DiscIO/NANDImporter.cpp:237"
- name: "rootca.pem"
path: "Wii/rootca.pem"
description: "SSL root certificate extracted from IOS13"
required: false
hle_fallback: true
source_ref: "Source/Core/DiscIO/NANDImporter.cpp:238"
- name: "WiiSD.raw"
path: "Load/WiiSD.raw"
description: "Virtual SD card image for the Wii SD slot"
required: false
hle_fallback: true
source_ref: "Source/Core/Common/CommonPaths.h:160, Source/Core/Common/FileUtil.cpp:909"
note: "Created by the emulator, path overridable by the General WiiSDCardPath setting."
- name: "Wii System Menu"
path: null
description: "Wii System Menu WAD, installed into the emulated NAND"
required: false
hle_fallback: true
source_ref: "Source/Core/DolphinQt/MenuBar.cpp:290,1098-1112"
note: "Needed to boot the Wii Menu. Installed through Tools, Install WAD."
- name: "codehandler.bin"
path: "Sys/codehandler.bin"
description: "Gecko code handler used to apply cheat codes"
required: false
hle_fallback: true
source_ref: "Source/Core/Common/CommonPaths.h:167, Source/Core/Core/GeckoCode.cpp:121-134"
note: >
Read from the Sys root. Cheats are refused when it is missing and when it
exceeds the installer window.