feat: add emulator profiles and cross-reference engine (tier 2)

New two-tier architecture:
- Tier 1: Platform configs (what the UI checks) - unchanged
- Tier 2: Emulator profiles (what the code actually loads)

11 emulator profiles from source code analysis:
  cemu, citra, dolphin, duckstation, flycast,
  melonds, pcsx2, ppsspp, rpcs3, vita3k, xemu

Each profile documents every file the emulator loads with
source code references (file:line), hashes, and notes.

New scripts/cross_reference.py computes gaps between what
platforms declare and what emulators need.

Current gap: 200 undeclared files, 24 already in repo.
DuckStation alone recognizes 105 PS1/PS2 BIOS variants.

generate_pack.py gains --include-extras flag (future use).
_registry.yml maps platforms to their emulators.
This commit is contained in:
Abdessamad Derraz
2026-03-17 18:46:38 +01:00
parent a38c86cf1e
commit 9052a6b750
15 changed files with 3270 additions and 0 deletions

399
emulators/cemu.yml Normal file
View File

@@ -0,0 +1,399 @@
emulator: Cemu
type: standalone
source: "https://github.com/cemu-project/Cemu"
systems: [nintendo-wiiu]
analysis_date: "2026-03-17"
analysis_commit: "HEAD (depth=1)"
# keys.txt - disc decryption keys (AES-128, one per line, hex format)
# Located in Cemu user data root directory
# otp.bin and seeprom.bin - console-specific dumps for online features
# MLC path contains firmware titles under sys/title/
files:
# --- Disc decryption keys ---
- name: "keys.txt"
required: true
path: "" # Cemu root / user data directory
size: null
note: "AES-128 disc keys for WUD/WUX decryption, one 32-char hex key per line"
source_ref: "src/Cafe/Filesystem/FST/KeyCache.cpp:63"
# --- Console-specific dumps (online play) ---
- name: "otp.bin"
required: false
path: "" # Cemu root / user data directory
size: 1024
note: "Wii U OTP dump, required for online mode and SSL certificate generation"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:556"
- name: "seeprom.bin"
required: false
path: "" # Cemu root / user data directory
size: 512
note: "Wii U SEEPROM dump, required for online mode and console region detection"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:579"
# --- Shared system fonts (title 0005001b-10042400) ---
# Fallback: Cemu also checks resources/sharedFonts/ in its data directory
- name: "CafeCn.ttf"
required: true
path: "mlc01/sys/title/0005001b/10042400/content/"
note: "Shared font - Chinese"
source_ref: "src/Cafe/CafeSystem.cpp:289"
- name: "CafeKr.ttf"
required: true
path: "mlc01/sys/title/0005001b/10042400/content/"
note: "Shared font - Korean"
source_ref: "src/Cafe/CafeSystem.cpp:290"
- name: "CafeStd.ttf"
required: true
path: "mlc01/sys/title/0005001b/10042400/content/"
note: "Shared font - Standard (Latin/Japanese)"
source_ref: "src/Cafe/CafeSystem.cpp:291"
- name: "CafeTw.ttf"
required: true
path: "mlc01/sys/title/0005001b/10042400/content/"
note: "Shared font - Traditional Chinese (Taiwan)"
source_ref: "src/Cafe/CafeSystem.cpp:292"
# --- SSL client certificates (title 0005001b-10054000) ---
# Required for online features, loaded only when otp.bin is present
- name: "WIIU_COMMON_1_CERT.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/ccerts/"
note: "Nintendo client certificate - common"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:471"
- name: "WIIU_COMMON_1_RSA_KEY.aes"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/ccerts/"
note: "Nintendo client key - common (AES-encrypted)"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:471"
- name: "WIIU_ACCOUNT_1_CERT.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/ccerts/"
note: "Nintendo client certificate - account"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:472"
- name: "WIIU_ACCOUNT_1_RSA_KEY.aes"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/ccerts/"
note: "Nintendo client key - account (AES-encrypted)"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:472"
- name: "WIIU_OLIVE_1_CERT.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/ccerts/"
note: "Nintendo client certificate - olive (Miiverse)"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:473"
- name: "WIIU_OLIVE_1_RSA_KEY.aes"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/ccerts/"
note: "Nintendo client key - olive (AES-encrypted)"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:473"
- name: "WIIU_VINO_1_CERT.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/ccerts/"
note: "Nintendo client certificate - vino"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:474"
- name: "WIIU_VINO_1_RSA_KEY.aes"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/ccerts/"
note: "Nintendo client key - vino (AES-encrypted)"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:474"
- name: "WIIU_WOOD_1_CERT.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/ccerts/"
note: "Nintendo client certificate - wood"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:475"
- name: "WIIU_WOOD_1_RSA_KEY.aes"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/ccerts/"
note: "Nintendo client key - wood (AES-encrypted)"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:475"
# --- SSL CA certificates (title 0005001b-10054000) ---
# Nintendo CA certs
- name: "CACERT_NINTENDO_CA.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:480"
- name: "CACERT_NINTENDO_CA_G2.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:481"
- name: "CACERT_NINTENDO_CA_G3.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:482"
- name: "CACERT_NINTENDO_CLASS2_CA.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:483"
- name: "CACERT_NINTENDO_CLASS2_CA_G2.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:484"
- name: "CACERT_NINTENDO_CLASS2_CA_G3.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:485"
# Commercial CA certs
- name: "BALTIMORE_CYBERTRUST_ROOT_CA.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:488"
- name: "CYBERTRUST_GLOBAL_ROOT_CA.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:489"
- name: "VERIZON_GLOBAL_ROOT_CA.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:490"
- name: "GLOBALSIGN_ROOT_CA.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:491"
- name: "GLOBALSIGN_ROOT_CA_R2.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:492"
- name: "GLOBALSIGN_ROOT_CA_R3.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:493"
- name: "VERISIGN_CLASS3_PUBLIC_PRIMARY_CA_G3.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:494"
- name: "VERISIGN_UNIVERSAL_ROOT_CA.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:495"
- name: "VERISIGN_CLASS3_PUBLIC_PRIMARY_CA_G5.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:496"
- name: "THAWTE_PRIMARY_ROOT_CA_G3.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:497"
- name: "THAWTE_PRIMARY_ROOT_CA.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:498"
- name: "GEOTRUST_GLOBAL_CA.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:499"
- name: "GEOTRUST_GLOBAL_CA2.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:500"
- name: "GEOTRUST_PRIMARY_CA.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:501"
- name: "GEOTRUST_PRIMARY_CA_G3.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:502"
- name: "ADDTRUST_EXT_CA_ROOT.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:503"
- name: "COMODO_CA.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:504"
- name: "UTN_DATACORP_SGC_CA.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:505"
- name: "UTN_USERFIRST_HARDWARE_CA.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:506"
- name: "DIGICERT_HIGH_ASSURANCE_EV_ROOT_CA.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:507"
- name: "DIGICERT_ASSURED_ID_ROOT_CA.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:508"
- name: "DIGICERT_GLOBAL_ROOT_CA.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:509"
- name: "GTE_CYBERTRUST_GLOBAL_ROOT.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:510"
- name: "VERISIGN_CLASS3_PUBLIC_PRIMARY_CA.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:511"
- name: "THAWTE_PREMIUM_SERVER_CA.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:512"
- name: "EQUIFAX_SECURE_CA.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:513"
- name: "ENTRUST_SECURE_SERVER_CA.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:514"
- name: "VERISIGN_CLASS3_PUBLIC_PRIMARY_CA_G2.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:515"
- name: "ENTRUST_CA_2048.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:516"
- name: "ENTRUST_ROOT_CA.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:517"
- name: "ENTRUST_ROOT_CA_G2.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:518"
- name: "DIGICERT_ASSURED_ID_ROOT_CA_G2.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:519"
- name: "DIGICERT_GLOBAL_ROOT_CA_G2.der"
required: false
path: "mlc01/sys/title/0005001b/10054000/content/scerts/"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:520"
# --- Optional firmware libraries (cafeLibs/) ---
- name: "snd_user.rpl"
required: false
path: "cafeLibs/"
note: "Wii U firmware sound library, improves audio accuracy for some games"
source_ref: "src/Cafe/OS/libs/snd_user/snd_user.cpp:1071"
- name: "snduser2.rpl"
required: false
path: "cafeLibs/"
note: "Wii U firmware sound library v2, improves audio accuracy for some games"
source_ref: "src/Cafe/OS/libs/snd_user/snd_user.cpp:1071"
# Firmware title IDs referenced in the source
firmware_titles:
- id: "0005001b-10042400"
name: "Shared fonts"
content: ["CafeCn.ttf", "CafeKr.ttf", "CafeStd.ttf", "CafeTw.ttf"]
required: true
source_ref: "src/Cafe/CafeSystem.cpp:289-292"
- id: "0005001b-10054000"
name: "SSL certificates"
content: ["ccerts/", "scerts/"]
required: false
note: "Only needed for online features, requires otp.bin"
source_ref: "src/Cafe/IOSU/legacy/iosu_crypto.cpp:535"
- id: "0005001b-1005c000"
name: "System language/country data"
content: ["language.txt", "country.txt"]
required: false
note: "Auto-generated by Cemu if missing"
source_ref: "src/gui/wxgui/CemuApp.cpp:535-561"
- id: "00050010-10041200"
name: "System version"
content: ["version.bin"]
required: false
note: "Referenced but not strictly loaded (TODO in source)"
source_ref: "src/Cafe/OS/libs/coreinit/coreinit_MCP.cpp:203"
- id: "00050010-10040000"
name: "Wii U Menu (JPN)"
required: false
source_ref: "src/Cafe/OS/libs/sysapp/sysapp.cpp:382"
- id: "00050010-10040100"
name: "Wii U Menu (USA)"
required: false
source_ref: "src/Cafe/OS/libs/sysapp/sysapp.cpp:382"
- id: "00050010-10040200"
name: "Wii U Menu (EUR)"
required: false
source_ref: "src/Cafe/OS/libs/sysapp/sysapp.cpp:382"
# MLC directory structure expected by Cemu
mlc_structure:
- "mlc01/sys/title/0005001b/10042400/content/" # shared fonts
- "mlc01/sys/title/0005001b/10054000/content/ccerts/" # client certs
- "mlc01/sys/title/0005001b/10054000/content/scerts/" # server CA certs
- "mlc01/sys/title/0005001b/1005c000/content/" # language files
- "mlc01/sys/title/00050010/" # system applets
- "mlc01/usr/title/00050000/" # base games
- "mlc01/usr/title/0005000c/" # DLC
- "mlc01/usr/title/0005000e/" # updates
- "mlc01/usr/save/" # save data
- "mlc01/usr/boss/" # SpotPass data
notes: |
Cemu is a standalone Wii U emulator (not a libretro core).
Minimum to run games: keys.txt with disc decryption keys.
Shared fonts are required but Cemu ships fallback fonts in resources/sharedFonts/.
Online play requires otp.bin (1024 bytes) + seeprom.bin (512 bytes) + SSL certificates.
The cafeLibs/ directory can hold original Wii U firmware .rpl libraries for accuracy.
Any .rpl from the Wii U firmware placed in cafeLibs/ will override Cemu's HLE implementation.

86
emulators/citra.yml Normal file
View File

@@ -0,0 +1,86 @@
emulator: Citra / Lime3DS / Azahar
type: standalone + libretro
source: "https://github.com/azahar-emu/azahar"
systems: [nintendo-3ds]
notes: |
Citra (now Azahar, formerly Lime3DS) uses HLE for most system services,
so many files are optional. AES keys are the most important for decrypting
games and system data. Shared font has a built-in fallback.
File locations relative to user dir: sysdata/ for keys/boot/font/otp/seeddb,
nand/ for NAND filesystem, nand/private/ for movable.sed.
Legacy data dirs: citra-emu, lime3ds-emu -> azahar-emu.
files:
# --- sysdata/ directory ---
- name: "keys.txt"
path: "sysdata/keys.txt"
description: "AES encryption keys"
required: false
source_ref: "src/common/common_paths.h:83, src/core/hw/aes/key.cpp:291"
notes: "Contains AES key slots (X/Y/N types) for game decryption; has built-in encrypted fallback keys (key.cpp:300-306)"
- name: "boot9.bin"
path: "sysdata/boot9.bin"
description: "ARM9 bootrom"
required: false
source_ref: "src/common/common_paths.h:84"
notes: "3DS ARM9 boot ROM; used for hardware key derivation"
- name: "sector0x96.bin"
path: "sysdata/sector0x96.bin"
description: "Secret sector from NAND"
required: false
source_ref: "src/common/common_paths.h:85"
notes: "OTP-encrypted sector 0x96 from 3DS NAND; used for key derivation"
- name: "shared_font.bin"
path: "sysdata/shared_font.bin"
description: "System shared font"
required: false
source_ref: "src/common/common_paths.h:82, src/core/hle/service/apt/apt.cpp:284"
notes: "Fallback if NAND system archive not available; built-in font data also exists (archive_ncch.cpp:28,189)"
- name: "seeddb.bin"
path: "sysdata/seeddb.bin"
description: "Game seed database"
required: false
source_ref: "src/core/file_sys/seed_db.cpp:15"
notes: "Required for some seed-encrypted games (9.6+ titles)"
- name: "otp.bin"
path: "sysdata/otp.bin"
description: "One-time programmable memory dump"
required: false
source_ref: "src/core/hw/unique_data.cpp:214"
notes: "Console-unique OTP data; used for hardware key derivation"
# --- nand/ directory ---
- name: "movable.sed"
path: "nand/private/movable.sed"
description: "Movable unique key"
required: false
source_ref: "src/core/hw/unique_data.cpp:218"
notes: "Console-unique key seed for SD/NAND encryption; signature verified at load (unique_data.cpp:197)"
- name: "SecureInfo_A"
path: "nand/rw/sys/SecureInfo_A"
description: "Console serial and region info"
required: false
source_ref: "src/core/hw/unique_data.cpp:206"
notes: "Contains console serial number and region data"
- name: "LocalFriendCodeSeed_B"
path: "nand/rw/sys/LocalFriendCodeSeed_B"
description: "Friend code seed"
required: false
source_ref: "src/core/hw/unique_data.cpp:210"
notes: "Used for friend code generation"
# --- NAND system archives (installed titles) ---
- name: "shared font (system archive)"
path: "nand/ (installed as NCCH title 0004009B00014002)"
description: "Shared font system archive (JPN/USA/EUR)"
required: false
source_ref: "src/core/file_sys/archive_ncch.cpp:161"
notes: "Region variants: CHN=00014102, KOR=00014202, TWN=00014302"

182
emulators/dolphin.yml Normal file
View File

@@ -0,0 +1,182 @@
emulator: Dolphin
type: standalone + libretro
source: "https://github.com/dolphin-emu/dolphin"
systems: [nintendo-gamecube, nintendo-wii]
# Dolphin has HLE for most system functions, so real BIOS/firmware files
# are optional but improve accuracy. DSP ROMs are the most commonly needed.
# File paths are relative to Dolphin User directory:
# Standalone: User/GC/ and User/Wii/
# Libretro (RetroArch): system/dolphin-emu/GC/ and system/dolphin-emu/Wii/
files:
# -- GameCube IPL (Boot ROM) --
# Region-specific, placed in GC/<region>/IPL.bin
# Regions: USA, EUR, JAP (legacy), JPN, DEV
- name: "IPL.bin"
path: "GC/USA/IPL.bin"
size: 2097152 # 0x200000 (2 MB)
required: false
note: "GameCube NTSC-U boot ROM. HLE available but real IPL needed for GC menu boot and accurate fonts"
source_ref: "Source/Core/Common/CommonPaths.h:139, Source/Core/Core/HW/EXI/EXI_DeviceIPL.cpp:108"
- name: "IPL.bin"
path: "GC/EUR/IPL.bin"
size: 2097152
required: false
note: "GameCube PAL boot ROM"
source_ref: "Source/Core/Core/Config/MainSettings.cpp:744-750"
- name: "IPL.bin"
path: "GC/JAP/IPL.bin"
size: 2097152
required: false
note: "GameCube NTSC-J boot ROM"
source_ref: "Source/Core/Core/HW/EXI/EXI_DeviceIPL.cpp:185"
# -- DSP ROMs --
# Used by DSP LLE (low-level emulation) for accurate audio
# Dolphin ships a free replacement ROM, but dumps from real hardware are more accurate
# Searched in: User/GC/ then Sys/GC/
- name: "dsp_rom.bin"
path: "GC/dsp_rom.bin"
size: 8192 # 0x2000 (DSP_IROM_BYTE_SIZE)
required: false
note: "DSP instruction ROM for LLE audio. Free replacement included with Dolphin, real dump improves accuracy"
known_hash_adler32: "0x66f334fe" # official Nintendo ROM
source_ref: "Source/Core/Common/CommonPaths.h:136, Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:106-117"
- name: "dsp_coef.bin"
path: "GC/dsp_coef.bin"
size: 4096 # 0x1000 (DSP_COEF_BYTE_SIZE)
required: false
note: "DSP coefficient ROM for LLE audio and HLE polyphase resampling. Free replacement included"
known_hash_adler32: "0xf3b93527" # official Nintendo ROM
source_ref: "Source/Core/Common/CommonPaths.h:137, Source/Core/Core/DSP/DSPCore.cpp:32-33, Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp:55-62"
# -- GameCube Fonts --
# Bundled free alternatives exist but have padding differences causing misplaced text
# If IPL dump is present, fonts are extracted from it instead
# Searched in: Sys/GC/
- name: "font_western.bin"
path: "GC/font_western.bin"
size: 9589 # 0x2575
required: false
note: "Windows-1252 font for GC/Wii text rendering. Free alternative bundled, real one from IPL dump preferred"
source_ref: "Source/Core/Common/CommonPaths.h:133, Source/Core/Core/HW/EXI/EXI_DeviceIPL.cpp:130,202-239"
- name: "font_japanese.bin"
path: "GC/font_japanese.bin"
size: 303693 # 0x4A24D
required: false
note: "Shift-JIS font for Japanese text. Free alternative bundled, real one from IPL dump preferred"
source_ref: "Source/Core/Common/CommonPaths.h:134, Source/Core/Core/HW/EXI/EXI_DeviceIPL.cpp:129,234"
# -- GBA BIOS (for GC-GBA link) --
# Used by integrated mGBA core for GameCube-GBA connectivity
- name: "gba_bios.bin"
path: "GBA/gba_bios.bin"
required: false
note: "GBA BIOS for GC-GBA link feature (uses integrated mGBA). Path configurable in settings"
source_ref: "Source/Core/Common/CommonPaths.h:145, Source/Core/Core/HW/GBACore.cpp:346-363"
# -- Wii System Files --
# These are generated/managed by Dolphin's Wii NAND emulation
# Not typically user-supplied, but listed for completeness
- name: "SYSCONF"
path: "Wii/shared2/sys/SYSCONF"
required: false
note: "Wii system configuration. Auto-generated by Dolphin, can be imported from NAND backup"
source_ref: "Source/Core/Common/CommonPaths.h:118, Source/Core/Common/FileUtil.cpp:900"
- name: "setting.txt"
path: "Wii/title/00000001/00000002/data/setting.txt"
size: 256
required: false
note: "Wii region/language settings. Auto-generated by Dolphin during Wii boot emulation"
source_ref: "Source/Core/Common/CommonPaths.h:153, Source/Core/Core/Boot/Boot_BS2Emu.cpp:384-460"
# -- Wii NAND Backup (BootMii) --
- name: "nand.bin"
path: null # user-selected via file dialog
required: false
note: "BootMii NAND backup. Can be imported to populate Wii NAND with channels, saves, system menu"
source_ref: "Source/Core/DiscIO/NANDImporter.cpp:26-39,42-89"
- name: "keys.bin"
path: null # user-selected, or appended to nand.bin
size: 1024 # 0x400 (NAND_KEYS_SIZE)
required: false
note: "OTP/SEEPROM dump (Wii encryption keys). Needed if not appended to nand.bin for NAND import"
source_ref: "Source/Core/DiscIO/NANDImporter.cpp:19,76-88, Source/Core/DiscIO/NANDImporter.h:28"
# -- Wii SD Card Image --
- name: "WiiSD.raw"
path: "Load/WiiSD.raw"
required: false
note: "Virtual SD card image for Wii homebrew. Auto-created by Dolphin, supports SD/SDHC up to 4GB"
source_ref: "Source/Core/Common/CommonPaths.h:150"
# -- Gecko Code Handler --
- name: "codehandler.bin"
path: null # in Sys directory, shipped with Dolphin
required: false
note: "Gecko/Ocarina cheat code handler. Shipped with Dolphin in Sys/, not user-supplied"
source_ref: "Source/Core/Common/CommonPaths.h:155, Source/Core/Core/GeckoCode.cpp:120"
# -- Wii System Menu (WAD) --
- name: "Wii System Menu"
path: null # installed to NAND via WAD import
required: false
note: "Wii System Menu WAD. Installed to NAND via Tools > Install WAD, needed for Wii Menu boot"
source_ref: "Source/Core/DolphinQt/MainWindow.cpp:1581-1583, Source/Core/DolphinQt/MenuBar.cpp:1174-1188"
# -- NAND Certificates (auto-extracted) --
- name: "clientca.pem"
path: "Wii/clientca.pem"
required: false
note: "SSL client certificate. Auto-extracted from IOS13 content during NAND import"
source_ref: "Source/Core/DiscIO/NANDImporter.cpp:201-285"
- name: "clientcakey.pem"
path: "Wii/clientcakey.pem"
required: false
note: "SSL client private key. Auto-extracted from IOS13 content during NAND import"
source_ref: "Source/Core/DiscIO/NANDImporter.cpp:237"
- name: "rootca.pem"
path: "Wii/rootca.pem"
required: false
note: "SSL root CA certificate. Auto-extracted from IOS13 content during NAND import"
source_ref: "Source/Core/DiscIO/NANDImporter.cpp:238"
notes:
hle_available: true
hle_note: >
Dolphin provides HLE for GameCube IPL (boot ROM), DSP, and Wii system functions.
No BIOS files are strictly required for most games. DSP ROMs (dsp_rom.bin + dsp_coef.bin)
are the most impactful optional files - Dolphin ships free replacements but real dumps
from hardware provide better audio accuracy in some titles.
ipl_regions: ["USA", "EUR", "JAP", "JPN", "DEV"]
ipl_region_note: >
IPL.bin is region-specific, placed in GC/<REGION>/IPL.bin.
JAP is the legacy directory name, JPN is the modern default.
DEV is for development/debug units.
dsp_rom_note: >
DSP ROMs are verified at load time via Adler32 hash.
Official Nintendo hashes: irom=0x66f334fe, drom=0xf3b93527.
Multiple free replacement versions exist (v0.1 through v0.4).
font_note: >
Fonts can come from three sources: real IPL dump (preferred), standalone font files
in Sys/GC/, or bundled free alternatives. The free fonts have different padding that
causes text positioning issues in some games.
libretro_note: >
No official libretro core exists in the main Dolphin repo.
Third-party libretro cores (dolphin_libretro) use the same file paths
under RetroArch system/dolphin-emu/.
nand_note: >
Wii NAND content (channels, saves, system menu) is managed by Dolphin internally.
Users can import a BootMii NAND backup (nand.bin + optional keys.bin) to populate it.
Most Wii games do not require a real NAND dump.

1074
emulators/duckstation.yml Normal file

File diff suppressed because it is too large Load Diff

185
emulators/flycast.yml Normal file
View File

@@ -0,0 +1,185 @@
emulator: Flycast
type: standalone + libretro
source: "https://github.com/flyinghead/flycast"
systems:
- sega-dreamcast
- sega-naomi
- sega-naomi2
- sega-atomiswave
- sega-systemsp
notes: |
Flycast has a built-in HLE BIOS (reios) for Dreamcast that can boot most
games without real BIOS files. Arcade systems (NAOMI, NAOMI2, Atomiswave,
System SP) require MAME-format BIOS ROM archives.
Hikaru and Triforce are NOT supported by Flycast.
BIOS file search uses prefix + name pattern. The emulator looks in configured
"Content Path" directories for these files (standalone) or the system directory
(libretro).
File loading logic: core/hw/flashrom/nvmem.cpp loadFiles() and
core/hw/naomi/naomi_cart.cpp loadBios().
The prefix is determined by platform (nvmem.cpp:36-49):
Dreamcast -> dc_
NAOMI -> naomi_
NAOMI 2 -> naomi2_
Atomiswave -> aw_
Boot ROM search pattern (nvmem.cpp:287):
{prefix}boot.bin, {prefix}boot.bin.bin, {prefix}bios.bin, {prefix}bios.bin.bin
files:
# -------------------------------------------------------
# Sega Dreamcast
# -------------------------------------------------------
- name: "dc_boot.bin"
system: sega-dreamcast
required: false
size: 2097152 # 2 MB
note: "Dreamcast boot ROM. HLE BIOS (reios) used as fallback."
source_ref: "core/hw/flashrom/nvmem.cpp:287"
- name: "dc_bios.bin"
system: sega-dreamcast
required: false
size: 2097152
note: "Alternate name for Dreamcast boot ROM."
source_ref: "core/hw/flashrom/nvmem.cpp:287"
- name: "dc_flash.bin"
system: sega-dreamcast
required: false
size: 131072 # 128 KB
note: "Dreamcast flash memory (settings, saves). Created if missing."
source_ref: "core/hw/flashrom/nvmem.cpp:246"
# -------------------------------------------------------
# Sega NAOMI
# -------------------------------------------------------
- name: "naomi_boot.bin"
system: sega-naomi
required: false
size: 2097152 # 2 MB
note: "NAOMI boot ROM (flat binary). Alternative to naomi.zip."
source_ref: "core/hw/flashrom/nvmem.cpp:287"
- name: "naomi.zip"
system: sega-naomi
required: true
note: >
NAOMI system BIOS archive (MAME format). Contains region-specific
BIOS ROMs: epr-21576h.ic27 (Japan), epr-21577h.ic27 (USA),
epr-21578h.ic27 (Export), epr-21579d.ic27 (Korea).
source_ref: "core/hw/naomi/naomi_roms.cpp:87-143"
# NAOMI special BIOS sets (game-specific, loaded from game archive or standalone)
- name: "airlbios.zip"
system: sega-naomi
required: false
note: "Airline Pilots Deluxe BIOS. epr-21802.ic27 (Export), epr-21801.ic27 (USA)."
source_ref: "core/hw/naomi/naomi_roms.cpp:30-37"
- name: "f355bios.zip"
system: sega-naomi
required: false
note: "Ferrari F355 Challenge BIOS. Japan/USA/Export variants."
source_ref: "core/hw/naomi/naomi_roms.cpp:49-58"
- name: "f355dlx.zip"
system: sega-naomi
required: false
note: "Ferrari F355 Challenge Deluxe BIOS. Japan/USA/Export variants."
source_ref: "core/hw/naomi/naomi_roms.cpp:60-74"
- name: "hod2bios.zip"
system: sega-naomi
required: false
note: "House of the Dead 2 BIOS. Japan/USA/Export variants."
source_ref: "core/hw/naomi/naomi_roms.cpp:76-85"
- name: "naomigd.zip"
system: sega-naomi
required: false
note: "NAOMI GD-ROM BIOS. Used by GD-ROM based NAOMI games."
source_ref: "core/hw/naomi/naomi_roms.cpp:158-181"
# -------------------------------------------------------
# Sega NAOMI 2
# -------------------------------------------------------
- name: "naomi2_boot.bin"
system: sega-naomi2
required: false
size: 2097152 # 2 MB
note: "NAOMI 2 boot ROM (flat binary). Alternative to naomi2.zip."
source_ref: "core/hw/flashrom/nvmem.cpp:287"
- name: "naomi2.zip"
system: sega-naomi2
required: true
note: >
NAOMI 2 system BIOS archive (MAME format). Contains region-specific
ROMs: epr-23605c.ic27 (Japan), epr-23607c.ic27 (USA),
epr-23608c.ic27 (Export), epr-23609b.ic27 (Korea).
source_ref: "core/hw/naomi/naomi_roms.cpp:183-201"
# -------------------------------------------------------
# Sega Atomiswave
# -------------------------------------------------------
- name: "awbios.zip"
system: sega-atomiswave
required: true
note: >
Atomiswave system BIOS archive (MAME format). Contains
bios0.ic23 (Sammy, 128 KB). BIOS size is 128 KB.
source_ref: "core/hw/naomi/naomi_roms.cpp:39-48"
# -------------------------------------------------------
# Sega System SP
# -------------------------------------------------------
- name: "segasp.zip"
system: sega-systemsp
required: true
note: >
Sega System SP BIOS archive (MAME format). Contains
epr-24328a.ic50 (BOOT VER 2.01, 2 MB) and region-specific
EEPROM files mb_eeprom_us.ic54s, mb_eeprom_exp.ic54s.
source_ref: "core/hw/naomi/naomi_roms.cpp:204-218"
platform_details:
dreamcast:
bios_size: 2097152 # 2 MB
flash_size: 131072 # 128 KB
ram_size: 16777216 # 16 MB (32 MB with mod)
hle_available: true
source_ref: "core/emulator.cpp:446-452"
naomi:
bios_size: 2097152 # 2 MB
flash_size: 32768 # 32 KB (battery-backed SRAM)
ram_size: 33554432 # 32 MB
hle_available: false
source_ref: "core/emulator.cpp:453-459"
naomi2:
bios_size: 2097152 # 2 MB
flash_size: 32768 # 32 KB (battery-backed SRAM)
ram_size: 33554432 # 32 MB
eram_size: 33554432 # 32 MB (ELAN)
hle_available: false
source_ref: "core/emulator.cpp:460-467"
atomiswave:
bios_size: 131072 # 128 KB
flash_size: 131072 # 128 KB (SRAM)
ram_size: 16777216 # 16 MB
hle_available: false
source_ref: "core/emulator.cpp:468-474"
systemsp:
bios_size: 2097152 # 2 MB
flash_size: 131072 # 128 KB (SRAM)
ram_size: 33554432 # 32 MB
hle_available: false
source_ref: "core/emulator.cpp:475-481"

75
emulators/melonds.yml Normal file
View File

@@ -0,0 +1,75 @@
emulator: MelonDS
type: standalone + libretro
source: "https://github.com/melonDS-emu/melonDS"
systems: [nintendo-ds, nintendo-dsi]
notes: |
MelonDS includes a built-in FreeBIOS replacement for basic DS mode (NTR).
Native BIOS/firmware files are required for DSi mode and recommended for
full DS compatibility (Key1 crypto for cartridge auth).
ARM9 BIOS size: 0x1000 (4 KB), ARM7 BIOS size: 0x4000 (16 KB).
DSi BIOS size: 0x10000 (64 KB) each.
Config keys: DS.BIOS9Path, DS.BIOS7Path, DS.FirmwarePath,
DSi.BIOS9Path, DSi.BIOS7Path, DSi.FirmwarePath, DSi.NANDPath.
files:
# --- Nintendo DS (NTR) ---
- name: "bios9.bin"
system: nintendo-ds
description: "ARM9 BIOS (NDS mode)"
required: false
size: 4096
crc32: "0x2ab23573"
source_ref: "src/MemConstants.h:30,37"
notes: "FreeBIOS fallback available; native needed for Key1 cartridge crypto (src/NDSCart.cpp:147-153)"
- name: "bios7.bin"
system: nintendo-ds
description: "ARM7 BIOS (NDS mode)"
required: false
size: 16384
crc32: "0x1280f0d5"
source_ref: "src/MemConstants.h:31,36"
notes: "FreeBIOS fallback available; native needed for Key1 init at offset 0x0030 (src/NDSCart.cpp:149-153)"
- name: "firmware.bin"
system: nintendo-ds
description: "NDS firmware image"
required: false
source_ref: "src/frontend/qt_sdl/EmuInstance.cpp:561"
notes: "Generated firmware used as default; native firmware needed for boot animation and wifi settings"
# --- Nintendo DSi (TWL) ---
- name: "dsi_bios9.bin"
system: nintendo-dsi
description: "ARM9i BIOS (DSi mode)"
required: true
size: 65536
crc32_full: "0xBAE84F6C"
crc32_low32k: "0x11E7C1EA"
source_ref: "src/MemConstants.h:32,41,45"
notes: "No FreeBIOS fallback for DSi; full dump needed for native boot (src/DSi.cpp:150-152)"
- name: "dsi_bios7.bin"
system: nintendo-dsi
description: "ARM7i BIOS (DSi mode)"
required: true
size: 65536
crc32_full: "0x4316CC42"
crc32_low32k: "0x5434691D"
source_ref: "src/MemConstants.h:32,40,44"
notes: "Contains eMMC key-Y at offset 0x8308 used for NAND init (src/frontend/qt_sdl/EmuInstance.cpp:1044)"
- name: "dsi_firmware.bin"
system: nintendo-dsi
description: "DSi firmware image"
required: true
source_ref: "src/frontend/qt_sdl/EmuInstance.cpp:593"
notes: "Separate from DS firmware; config key DSi.FirmwarePath"
- name: "dsi_nand.bin"
system: nintendo-dsi
description: "DSi NAND dump"
required: true
source_ref: "src/DSi_NAND.h:34, src/Args.h:132"
notes: "eMMC image; uses AES keys from ARM7i BIOS and ARM9i BIOS (src/DSi_AES.cpp:94)"

212
emulators/pcsx2.yml Normal file
View File

@@ -0,0 +1,212 @@
# PCSX2 emulator BIOS profile
# Generated from source analysis of https://github.com/PCSX2/pcsx2
# Commit analyzed: HEAD as of 2026-03-17
emulator: PCSX2
type: standalone
source: "https://github.com/PCSX2/pcsx2"
systems: [sony-playstation-2]
bios_directory: "bios/"
bios_detection: "romdir" # scans romdir structure inside binary, looks for RESET/ROMVER/EXTINFO entries
bios_selection: "automatic" # scans all files in bios dir matching 4-8 MB size, validates via romdir
validation:
method: "romdir_parse"
min_size: 4194304 # 4 MB (MIN_BIOS_SIZE = 4 * _1mb)
max_size: 8388608 # 8 MB (MAX_BIOS_SIZE = 8 * _1mb)
required_entries: ["RESET", "ROMVER"]
optional_entries: ["EXTINFO"]
note: "Any file in bios/ between 4-8 MB with valid romdir containing RESET+ROMVER is accepted"
regions:
J: {zone: "Japan", id: 0}
A: {zone: "USA", id: 1}
E: {zone: "Europe", id: 2}
H: {zone: "Asia", id: 4}
C: {zone: "China", id: 6}
T: {zone: "T10K/COH-H", id: 8}
X: {zone: "Test", id: 9}
P: {zone: "Free", id: 10}
files:
# -- Main BIOS binary (required) --
- name: "<user-selected>.bin"
pattern: "*"
required: true
size_range: "4MB-8MB"
source_ref: "pcsx2/ps2/BiosTools.cpp:258-282"
note: >
PCSX2 does not mandate a specific filename. It scans the entire bios/ directory
for any file between 4-8 MB that contains a valid romdir structure (RESET + ROMVER entries).
Common filenames follow the SCPH-XXXXX_BIOS_VYYY_REGION_ZZZ.BIN convention but this is
not enforced. The file is loaded into the 4 MB ROM region of EE memory.
# -- ROM1 (optional, DVD player) --
- name: "<biosname>.rom1"
pattern: "{biosname}.rom1 or {biosbase}.rom1"
required: false
max_size: 4194304 # 4 MB (Ps2MemSize::Rom1)
source_ref: "pcsx2/ps2/BiosTools.cpp:214-241"
note: >
DVD player ROM. Loaded via LoadExtraRom("rom1"). PCSX2 tries two naming patterns:
1) Full bios path + ".rom1" appended (e.g. scph70004.bin.rom1)
2) Bios path with extension replaced (e.g. scph70004.rom1)
Mapped to EE memory at ROM1 region (0x1FC00000 + 4MB offset).
Contains DVD player and region detection data (DVDID).
# -- ROM2 (optional, Chinese ROM extension) --
- name: "<biosname>.rom2"
pattern: "{biosname}.rom2 or {biosbase}.rom2"
required: false
max_size: 4194304 # 4 MB (Ps2MemSize::Rom2)
source_ref: "pcsx2/ps2/BiosTools.cpp:214-241"
note: >
Chinese ROM extension. Loaded via LoadExtraRom("rom2"). Same naming convention
as rom1: tries appended extension first, then replaced extension.
Only present on Chinese region consoles.
# -- NVM / NVRAM (optional, auto-created) --
- name: "<biosname>.nvm"
pattern: "{biosbase}.nvm"
required: false
size: 1024 # NVRAM_SIZE = 1024 bytes
source_ref: "pcsx2/CDVD/CDVD.cpp:160-238"
note: >
EEPROM / NVRAM data. Path derived from BiosPath with extension replaced to ".nvm"
(cdvdGetNVRAMPath). Contains console configuration: language, timezone, iLink ID,
region parameters, OSD settings. Auto-created with defaults if missing.
Two NVM layouts exist: v0.00+ (biosVer 0x000) and v1.70+ (biosVer 0x146).
# -- MEC file (optional, auto-created) --
- name: "<biosname>.mec"
pattern: "{biosbase}.mec"
required: false
size: 4 # u32 s_mecha_version
source_ref: "pcsx2/CDVD/CDVD.cpp:190-204"
note: >
Mechacon (mechanism controller) version file. 4 bytes containing the mecha version
as a u32 value. Auto-created with DEFAULT_MECHA_VERSION (0x00020603) if missing.
Path derived from BiosPath with extension replaced to ".mec".
# -- IRX override (optional, advanced) --
- name: "<custom>.irx"
pattern: "*.irx"
required: false
source_ref: "pcsx2/ps2/BiosTools.cpp:243-256,384-385"
note: >
Custom IOP Reboot eXecutable module. Loaded into ROM at offset 0x3C0000 if
EmuConfig.CurrentIRX is set (path length > 3). Injected at IOP reset (PC=0x1630).
Used for debugging/development, not needed for normal operation.
# -- DEV9 EEPROM (optional, network adapter) --
- name: "eeprom.dat"
required: false
size: 64 # 64 bytes, mmap'd
source_ref: "pcsx2/DEV9/DEV9.cpp:110-160"
note: >
DEV9 (network adapter / HDD expansion bay) EEPROM data. Fixed filename "eeprom.dat"
opened from working directory. Contains network adapter configuration.
Falls back to built-in defaults if file not found. Only relevant when using
DEV9 features (online play, HDD).
common_bios_filenames:
# Japan
- "SCPH-10000_BIOS_V1_JAP_100.BIN"
- "SCPH-15000_BIOS_V3_JAP_120.BIN"
- "SCPH-30000_BIOS_V4_JAP_150.BIN"
- "SCPH-30001R_BIOS_V7_JAP_160.BIN"
- "SCPH-30004R_BIOS_V7_JAP_160.BIN"
- "SCPH-35000_BIOS_V5_JAP_160.BIN"
- "SCPH-50000_BIOS_V9_JAP_170.BIN"
- "SCPH-50004_BIOS_V9_JAP_170.BIN"
- "SCPH-70000_BIOS_V12_JAP_200.BIN"
- "SCPH-75000_BIOS_V14_JAP_220.BIN"
- "SCPH-77000_BIOS_V14_JAP_220.BIN"
- "SCPH-90000_BIOS_V18_JAP_230.BIN"
# USA
- "SCPH-30001_BIOS_V4_USA_150.BIN"
- "SCPH-39001_BIOS_V6_USA_160.BIN"
- "SCPH-50001_BIOS_V9_USA_170.BIN"
- "SCPH-50003_BIOS_V9_USA_170.BIN"
- "SCPH-70002_BIOS_V12_USA_200.BIN"
- "SCPH-70004_BIOS_V12_USA_200.BIN"
- "SCPH-70012_BIOS_V12_USA_200.BIN"
- "SCPH-75001_BIOS_V14_USA_220.BIN"
- "SCPH-77001_BIOS_V14_USA_220.BIN"
- "SCPH-90001_BIOS_V18_USA_230.BIN"
# Europe
- "SCPH-30002_BIOS_V4_EUR_150.BIN"
- "SCPH-30003_BIOS_V4_EUR_150.BIN"
- "SCPH-30004_BIOS_V4_EUR_150.BIN"
- "SCPH-39002_BIOS_V6_EUR_160.BIN"
- "SCPH-39003_BIOS_V6_EUR_160.BIN"
- "SCPH-39004_BIOS_V6_EUR_160.BIN"
- "SCPH-50002_BIOS_V9_EUR_170.BIN"
- "SCPH-50004_BIOS_V9_EUR_170.BIN"
- "SCPH-70002_BIOS_V12_EUR_200.BIN"
- "SCPH-70003_BIOS_V12_EUR_200.BIN"
- "SCPH-70004_BIOS_V12_EUR_200.BIN"
- "SCPH-70008_BIOS_V12_EUR_200.BIN"
- "SCPH-75002_BIOS_V14_EUR_220.BIN"
- "SCPH-75003_BIOS_V14_EUR_220.BIN"
- "SCPH-75004_BIOS_V14_EUR_220.BIN"
- "SCPH-77002_BIOS_V14_EUR_220.BIN"
- "SCPH-77003_BIOS_V14_EUR_220.BIN"
- "SCPH-77004_BIOS_V14_EUR_220.BIN"
- "SCPH-90002_BIOS_V18_EUR_230.BIN"
- "SCPH-90003_BIOS_V18_EUR_230.BIN"
- "SCPH-90004_BIOS_V18_EUR_230.BIN"
# Asia
- "SCPH-50009_BIOS_V9_HK_170.BIN"
- "SCPH-70005_BIOS_V12_HK_200.BIN"
- "SCPH-70006_BIOS_V12_HK_200.BIN"
- "SCPH-70008_BIOS_V12_HK_200.BIN"
# China
- "SCPH-50009_BIOS_V9_CHN_170.BIN"
- "SCPH-70006_BIOS_V12_CHN_200.BIN"
memory_layout:
ROM: {offset: "0x1FC00000", size: "4 MB", purpose: "Main BIOS binary"}
ROM1: {offset: "ROM + 4MB", size: "4 MB", purpose: "DVD player"}
ROM2: {offset: "ROM + 8MB", size: "4 MB", purpose: "Chinese ROM extension"}
nvm_layout:
format_0:
applies_to: "BIOS v0.00+"
biosVer: 0x000
config0: 0x280
config1: 0x300
config2: 0x200
consoleId: 0x1C8
ilinkId: 0x1C0
modelNum: 0x1A0
regparams: 0x180
mac: 0x198
format_1:
applies_to: "BIOS v1.70+"
biosVer: 0x146
config0: 0x270
config1: 0x2B0
config2: 0x200
consoleId: 0x1F0
ilinkId: 0x1E0
modelNum: 0x1B0
regparams: 0x180
mac: 0x198
notes: |
PCSX2 is filename-agnostic for the main BIOS. Detection relies on romdir structure
parsing inside the binary itself, not on filename or extension. Any file between 4-8 MB
with a valid romdir (containing at least RESET and ROMVER entries) is accepted.
The ROMVER entry encodes: version (2+2 digits), region letter, console/devel flag,
build date (YYYYMMDD), and is used to determine the BIOS description and region.
Companion files (.nvm, .mec) are auto-created with sane defaults if missing.
ROM1/ROM2 are silently skipped if not found - only the main BIOS binary is strictly required.
PCSX2 no longer ships as a libretro core in official builds. The standalone emulator
is the primary distribution channel.
Devel console BIOSes (< ~2.3 MB) lack the OSD and are handled with NoOSD=true flag.

137
emulators/ppsspp.yml Normal file
View File

@@ -0,0 +1,137 @@
# PPSSPP emulator firmware profile
# Generated from source analysis of https://github.com/hrydgard/ppsspp
# Commit analyzed: HEAD as of 2026-03-17
emulator: PPSSPP
type: standalone
source: "https://github.com/hrydgard/ppsspp"
systems: [sony-psp]
firmware_required: false
firmware_detection: "none"
bios_directory: "N/A"
bios_selection: "N/A"
note: >
PPSSPP is a full HLE emulator - it does not require PSP firmware or BIOS files.
All PSP kernel modules (flash0:/kd/*.prx) are reimplemented in C++.
The emulator ships its own flash0/ directory with replacement fonts and assets.
default_firmware_version: 660 # PSP_DEFAULT_FIRMWARE in ConfigValues.h
source_ref_firmware: "Core/ConfigValues.h:40"
# Bundled assets (shipped with PPSSPP, not from Sony)
bundled_assets:
ppge_atlas:
files:
- {name: "ppge_atlas.zim", purpose: "UI texture atlas for dialogs, buttons, icons"}
- {name: "ppge_atlas.meta", purpose: "Atlas metadata (glyph positions, UV coords)"}
source_ref: "Core/Util/PPGeDraw.cpp:256-266"
note: >
PPGE (PlayStation Portable Graphics Engine) is PPSSPP's reimplementation of the
PSP system dialog renderer. The atlas contains button icons, dialog backgrounds,
and a basic font for system dialogs (save/load, network, etc).
Without ppge_atlas.zim, system dialogs render without graphics.
flash0_fonts:
path: "assets/flash0/font/"
source_ref: "Core/HLE/sceFont.cpp:88-106"
note: >
Replacement PGF font files shipped with PPSSPP. These are not the original Sony
fonts but open-source replacements that satisfy the sceFont API. Located in the
assets/flash0/font/ directory, mounted as flash0:/font/ at runtime.
files:
# Japanese
- {name: "jpn0.pgf", type: "FTT-NewRodin Pro DB", language: "Japanese", size: "standard"}
# Chinese
- {name: "zh_gb.pgf", type: "FTT-NewRodin Pro DB", language: "Chinese GB", note: "Also loaded from disc0: if present"}
# Korean
- {name: "kr0.pgf", type: "AsiaNHH(512Johab)", language: "Korean", size: "standard"}
# Latin - Standard size (0x288 height)
- {name: "ltn0.pgf", type: "FTT-NewRodin Pro Latin", style: "regular"}
- {name: "ltn1.pgf", type: "FTT-Matisse Pro Latin", style: "regular"}
- {name: "ltn2.pgf", type: "FTT-NewRodin Pro Latin", style: "italic"}
- {name: "ltn3.pgf", type: "FTT-Matisse Pro Latin", style: "italic"}
- {name: "ltn4.pgf", type: "FTT-NewRodin Pro Latin", style: "bold"}
- {name: "ltn5.pgf", type: "FTT-Matisse Pro Latin", style: "bold"}
- {name: "ltn6.pgf", type: "FTT-NewRodin Pro Latin", style: "bold_italic"}
- {name: "ltn7.pgf", type: "FTT-Matisse Pro Latin", style: "bold_italic"}
# Latin - Small size (0x1c0 height)
- {name: "ltn8.pgf", type: "FTT-NewRodin Pro Latin", style: "regular", size: "small"}
- {name: "ltn9.pgf", type: "FTT-Matisse Pro Latin", style: "regular", size: "small"}
- {name: "ltn10.pgf", type: "FTT-NewRodin Pro Latin", style: "italic", size: "small"}
- {name: "ltn11.pgf", type: "FTT-Matisse Pro Latin", style: "italic", size: "small"}
- {name: "ltn12.pgf", type: "FTT-NewRodin Pro Latin", style: "bold", size: "small"}
- {name: "ltn13.pgf", type: "FTT-Matisse Pro Latin", style: "bold", size: "small"}
- {name: "ltn14.pgf", type: "FTT-NewRodin Pro Latin", style: "bold_italic", size: "small"}
- {name: "ltn15.pgf", type: "FTT-Matisse Pro Latin", style: "bold_italic", size: "small"}
# HLE kernel modules (reimplemented, not loaded from firmware)
hle_modules:
source_ref: "Core/HLE/sceKernelModule.cpp:100-113"
note: >
When a PSP game tries to load these flash0:/kd/*.prx modules, PPSSPP intercepts
the load call and activates its built-in HLE implementation instead. No actual
PRX files are loaded from disk.
flash0_kd:
- {prx: "audiocodec.prx", hle: "sceAudiocodec_Driver"}
- {prx: "audiocodec_260.prx", hle: "sceAudiocodec_Driver"}
- {prx: "libatrac3plus.prx", hle: "sceATRAC3plus_Library"}
- {prx: "ifhandle.prx", hle: "sceNet_Service"}
- {prx: "pspnet.prx", hle: "sceNet_Library"}
- {prx: "pspnet_inet.prx", hle: "sceNetInet_Library"}
- {prx: "pspnet_apctl.prx", hle: "sceNetApctl_Library"}
- {prx: "pspnet_resolver.prx", hle: "sceNetResolver_Library"}
- {prx: "pspnet_adhoc.prx", hle: "sceNetAdhoc_Library"}
- {prx: "pspnet_adhocctl.prx", hle: "sceNetAdhocctl_Library"}
- {prx: "pspnet_adhoc_matching.prx", hle: "sceNetAdhocMatching_Library"}
- {prx: "pspnet_adhoc_download.prx", hle: "sceNetAdhocDownload_Library"}
- {prx: "pspnet_adhoc_discover.prx", hle: "sceNetAdhocDiscover_Library"}
# Flash0 filesystem layout
flash0_layout:
source_ref: "Core/HLE/sceIo.cpp:87,654"
note: >
flash0: is the PSP system partition. PPSSPP maps it to g_Config.flash0Directory
which is typically assets/flash0/ bundled with the emulator. The filesystem is
mounted read-only with FLASH flag.
directories:
font: "PGF/BWFON font files (mounted as flash0:/font/)"
kd: "Kernel drivers/modules (intercepted by HLE, not actually loaded)"
vsh: "Visual Shell resources"
dic: "Dictionary files"
data: "System data files"
# Font override path
font_override:
path: "ms0:/PSP/flash0/font/"
source_ref: "Core/HLE/sceFont.cpp:881"
note: >
Users can override bundled fonts by placing real PSP PGF files at
ms0:/PSP/flash0/font/ (inside the memory stick directory). PPSSPP
checks this path before falling back to the bundled flash0:/font/.
# Registry defaults relevant to fonts
registry_defaults:
font_path: "flash0:/font"
default_jpn_font: "jpn0.pgf"
default_latin_font: "ltn0.pgf"
source_ref: "Core/HLE/sceReg.cpp:81-281"
notes: |
PPSSPP does NOT require any firmware files, BIOS, or system software from Sony.
It is a complete HLE (High Level Emulation) implementation of the PSP operating system.
All PSP kernel modules (flash0:/kd/*.prx) are reimplemented in C++ within PPSSPP.
When games attempt to load these modules via sceKernelLoadModule, PPSSPP intercepts
the call and activates its built-in HLE implementation.
The bundled flash0/font/*.pgf files are open-source replacements for the original
Sony PSP fonts. They satisfy the sceFont API but are not identical to real PSP fonts.
For pixel-perfect font rendering, users can place original PGF files in the
ms0:/PSP/flash0/font/ override directory.
The ppge_atlas.zim/meta files provide PPSSPP's system dialog rendering (save/load
dialogs, on-screen keyboard, etc). These are PPSSPP-specific assets, not Sony firmware.
PPSSPP also exists as a libretro core (ppsspp_libretro), which uses the same HLE
approach and bundled assets.

318
emulators/rpcs3.yml Normal file
View File

@@ -0,0 +1,318 @@
# RPCS3 emulator firmware profile
# Generated from source analysis of https://github.com/RPCS3/rpcs3
# Commit analyzed: HEAD as of 2026-03-17
emulator: RPCS3
type: standalone
source: "https://github.com/RPCS3/rpcs3"
systems: [sony-playstation-3]
firmware_file: "PS3UPDAT.PUP"
firmware_source: "https://www.playstation.com/en-us/support/hardware/ps3/system-software/"
firmware_detection: "pup_header" # validates PUP magic bytes, HMAC-SHA1 hash per entry
firmware_install: "extracts dev_flash_* TAR packages from PUP into dev_flash/"
validation:
method: "pup_object"
magic: "SCEUF"
hash_algo: "HMAC-SHA1"
source_ref: "rpcs3/Loader/PUP.cpp:8-114"
note: "PUP file is validated by magic header, file count, HMAC-SHA1 per entry against PUP_KEY"
firmware_version:
path: "dev_flash/vsh/etc/version.txt"
source_ref: "rpcs3/util/sysinfo.cpp:686"
note: "Read at startup, displayed as 'Firmware version: X.XX'. Missing = 'Missing Firmware'"
# dev_flash filesystem layout extracted from PUP
dev_flash:
# -- sys/external/ : LLE firmware SPRX modules --
sys_external:
path: "dev_flash/sys/external/"
source_ref: "rpcs3/Emu/Cell/PPUModule.cpp:2579"
note: >
Primary firmware module directory. Contains decrypted .sprx modules loaded by
liblv2.sprx at boot. RPCS3 can run these via LLE (low-level emulation) or fall
back to HLE (high-level emulation) per module. liblv2.sprx is the kernel loader.
critical_file: "liblv2.sprx"
modules:
# Core system
- "liblv2.sprx" # LV2 kernel, loads all other modules
- "libsysmodule.sprx" # Module loader
- "libfs_utility_init.sprx" # FS init (sys/internal)
# Audio/Video codecs
- "libadec.sprx" # Audio decoder
- "libatrac3plus.sprx" # ATRAC3+ codec
- "libcelp8dec.sprx" # CELP-8 decoder
- "libcelpdec.sprx" # CELP decoder
- "libcelpenc.sprx" # CELP encoder
- "libddpdec.sprx" # Dolby Digital Plus
- "libdtslbrdec.sprx" # DTS-LBR decoder
- "libdtsdec.sprx" # DTS decoder
- "libdtshdcoredec.sprx" # DTS-HD Core decoder
- "libdtshddec.sprx" # DTS-HD decoder
- "libm2aac.sprx" # MPEG-2 AAC
- "libm2bc.sprx" # MPEG-2 BC
- "libm4aac.sprx" # MPEG-4 AAC
- "libm4aac2ch.sprx" # MPEG-4 AAC 2ch
- "libm4aac2chmod.sprx" # MPEG-4 AAC 2ch mod
- "libmp3dec.sprx" # MP3 decoder
- "libmp3sdec.sprx" # MP3 streaming decoder
- "libmpl1dec.sprx" # MPEG Layer 1
- "libtrhddec.sprx" # TRHD decoder
- "libwmadec.sprx" # WMA decoder
- "libwmaprodec.sprx" # WMA Pro decoder
- "libwmalslbrdec.sprx" # WMA Lossless LBR
- "libac3dec.sprx" # AC3 decoder
- "libvdec.sprx" # Video decoder
- "libdmux.sprx" # Demuxer
- "libdmuxpamf.sprx" # PAMF demuxer
- "libpamf.sprx" # PAMF container
- "libvpost.sprx" # Video post-processing
- "libsail.sprx" # Media framework
- "libsailrec.sprx" # Media recording
# Graphics
- "libgcm_sys.sprx" # GCM (RSX graphics)
- "libresc.sprx" # Resolution scaler
# Input/Peripherals
- "libio.sprx" # I/O system
- "libcamera.sprx" # Camera
- "libgem.sprx" # PS Move
- "libmic.sprx" # Microphone
- "libusbpspcm.sprx" # USB PSP communication
- "libusbd.sprx" # USB driver
# Networking
- "libnetctl.sprx" # Network control
- "librudp.sprx" # Reliable UDP
- "libssl.sprx" # SSL/TLS
- "libhttp.sprx" # HTTP
- "libhttps.sprx" # HTTPS
- "libhttputil.sprx" # HTTP utilities
- "libsysnet.sprx" # System networking
# System utilities
- "libsysutil.sprx" # System utilities
- "libsysutil_ap.sprx" # Access point
- "libsysutil_avc2.sprx" # AV chat
- "libsysutil_avc_ext.sprx"
- "libsysutil_np_eula.sprx" # NP EULA
- "libaudio.sprx" # Audio system
- "libvoice.sprx" # Voice chat
- "libavconfext.sprx" # AV config
- "libsavedata.sprx" # Save data
- "libgame.sprx" # Game utilities
- "libgameexec.sprx" # Game exec
- "libuserinfo.sprx" # User info
- "libosklialog.sprx" # On-screen keyboard
- "libsysconf.sprx" # System configuration
# Image codecs
- "libgifdec.sprx" # GIF decoder
- "libjpgdec.sprx" # JPEG decoder
- "libjpgenc.sprx" # JPEG encoder
- "libpngdec.sprx" # PNG decoder
- "libpngenc.sprx" # PNG encoder
# NP (PlayStation Network)
- "libsceNp.sprx" # NP base
- "libsceNp2.sprx" # NP v2
- "libsceNpBasicLimited.sprx"
- "libsceNpClans.sprx"
- "libsceNpCommerce2.sprx"
- "libsceNpMatchingInt.sprx"
- "libsceNpPlus.sprx"
- "libsceNpSns.sprx"
- "libsceNpTrophy.sprx"
- "libsceNpTus.sprx"
- "libsceNpUtil.sprx"
# Misc
- "libfont.sprx" # Font engine
- "libfontFT.sprx" # FreeType fonts
- "libfreetype2.sprx" # FreeType2 library
- "librtc.sprx" # Real-time clock
- "librtcalarm.sprx" # RTC alarm
- "libl10n.sprx" # Localization
- "libkey2char.sprx" # Key-to-char mapping
- "libimejp.sprx" # Japanese IME
- "libcrosscontroller.sprx" # Cross controller
- "libfiber.sprx" # Fiber (coroutines)
- "libspurs_jq.sprx" # SPURS job queue
- "libspudll.sprx" # SPU DLL
- "libmixer.sprx" # Audio mixer
- "libsnd3.sprx" # Sound 3
- "libsynth2.sprx" # Synthesizer
- "libovis.sprx" # OVis
- "libprint.sprx" # Print
- "librec.sprx" # Recording
- "libremoteplay.sprx" # Remote play
- "libscreenshot.sprx" # Screenshot
- "libsearch.sprx" # Content search
- "libmusic.sprx" # Music player
- "libmusicdecode.sprx" # Music decode
- "libmusicexport.sprx" # Music export
- "libphoto.sprx" # Photo decode
- "libphotoexport.sprx" # Photo export
- "libphotoimportutil.sprx"
- "libvideo.sprx" # Video export
- "libvideoplayer.sprx" # Video player
- "libvideoupload.sprx" # Video upload
- "libnetaoi.sprx" # NetAoI
- "libpesmutility.sprx" # PESM utility
- "libbgdl.sprx" # Background download
- "libsubdisplay.sprx" # Sub display
- "libdtcpiputility.sprx" # DTCP-IP utility
- "libsheap.sprx" # Simple heap
- "libsync2.sprx" # Sync 2
- "libminisSavedata.sprx" # Minis save data
- "libauthdialogutility.sprx" # Auth dialog
- "libcrashdump.sprx" # Crash dump
- "liblv2dbg.sprx" # LV2 debug
# -- sys/internal/ : Internal system modules --
sys_internal:
path: "dev_flash/sys/internal/"
source_ref: "rpcs3/Emu/Cell/lv2/sys_prx.cpp:33"
note: "Internal system modules, e.g. libfs_utility_init.sprx"
# -- vsh/ : Visual Shell (XMB) --
vsh:
path: "dev_flash/vsh/"
source_ref: "rpcs3/rpcs3qt/main_window.cpp:272,734"
note: "PS3 XMB interface. vsh.self is the main executable, booted via 'Boot VSH' menu."
files:
- path: "vsh/module/vsh.self"
purpose: "XMB main executable"
required_for: "Boot VSH / XrossMediaBar"
- path: "vsh/etc/version.txt"
purpose: "Firmware version string"
- path: "vsh/module/eseibrd.sprx"
purpose: "System module (precompiled at boot)"
- path: "vsh/module/msmw2.sprx"
purpose: "Media streaming"
- path: "vsh/resource/explore/user/*.png"
purpose: "User avatar icons (000.png - 025.png)"
- path: "vsh/resource/explore/icon/icon_home.png"
purpose: "Home icon for game list"
# -- data/font/ : System fonts --
fonts:
path: "dev_flash/data/font/"
source_ref: "rpcs3/Emu/Cell/Modules/cellFont.cpp:226-281"
note: >
PS3 system fonts used by cellFont API. Loaded from dev_flash/data/font/
and dev_flash/data/font/SONY-CC/ subdirectory. Games using cellFont will
fail to render text without these.
files:
# Rodin Sans Serif
- {name: "SCE-PS3-RD-R-LATIN.TTF", type: "Rodin Sans Serif Regular Latin", required: true}
- {name: "SCE-PS3-RD-L-LATIN.TTF", type: "Rodin Sans Serif Light Latin"}
- {name: "SCE-PS3-RD-B-LATIN.TTF", type: "Rodin Sans Serif Bold Latin"}
- {name: "SCE-PS3-RD-R-LATIN2.TTF", type: "Rodin Sans Serif Regular Latin2"}
- {name: "SCE-PS3-RD-L-LATIN2.TTF", type: "Rodin Sans Serif Light Latin2"}
- {name: "SCE-PS3-RD-B-LATIN2.TTF", type: "Rodin Sans Serif Bold Latin2"}
# Matisse Serif
- {name: "SCE-PS3-MT-R-LATIN.TTF", type: "Matisse Serif Regular Latin"}
# NewRodin Gothic (Japanese)
- {name: "SCE-PS3-NR-R-JPN.TTF", type: "NewRodin Gothic Regular Japanese"}
- {name: "SCE-PS3-NR-L-JPN.TTF", type: "NewRodin Gothic Light Japanese"}
- {name: "SCE-PS3-NR-B-JPN.TTF", type: "NewRodin Gothic Bold Japanese"}
# YD Gothic (Korean)
- {name: "SCE-PS3-YG-R-KOR.TTF", type: "YD Gothic Regular Korean"}
# Seurat Maru Gothic
- {name: "SCE-PS3-SR-R-LATIN.TTF", type: "Seurat Maru Gothic Regular Latin"}
- {name: "SCE-PS3-SR-R-LATIN2.TTF", type: "Seurat Maru Gothic Regular Latin2"}
- {name: "SCE-PS3-SR-R-JPN.TTF", type: "Seurat Maru Gothic Regular Japanese"}
# VAGR Sans Serif Round
- {name: "SCE-PS3-VR-R-LATIN.TTF", type: "VAGR Sans Serif Round Latin"}
- {name: "SCE-PS3-VR-R-LATIN2.TTF", type: "VAGR Sans Serif Round Latin2"}
# Chinese (in SONY-CC subdirectory)
- {name: "SCE-PS3-DH-R-CGB.TTF", type: "Chinese GB font", subdir: "SONY-CC/"}
# -- data/cert/ : SSL certificates --
certs:
path: "dev_flash/data/cert/"
source_ref: "rpcs3/Emu/Cell/Modules/cellSsl.cpp:110"
note: "SSL root certificates for PSN and HTTPS connections"
# -- ps1emu/ : PS1 backward compatibility --
ps1emu:
path: "dev_flash/ps1emu/"
source_ref: "rpcs3/Emu/System.cpp:1954"
note: "PS1 Classics emulator. Booted when running PS1 game via ps1_newemu.self"
files:
- {name: "ps1_newemu.self", purpose: "PS1 emulator binary"}
# -- ps2emu/ : PS2 backward compatibility --
ps2emu:
path: "dev_flash/ps2emu/"
source_ref: "rpcs3/Crypto/key_vault.h:219"
note: >
PS2 emulator components. Only present on fat PS3 models (CECHA/B/C/E).
Includes me_iso_for_ps2emu.self and sv_iso_for_ps2emu.self (since FW 3.70).
# -- pspemu/ : PSP backward compatibility --
pspemu:
path: "dev_flash/pspemu/"
source_ref: "rpcs3/Emu/System.cpp:1982, rpcs3/Crypto/key_vault.h:285-290"
note: "PSP emulator for PS3. Contains psp_emulator.self, psp_translator.self, and release/*.sprx"
files:
- {name: "psp_emulator.self", purpose: "PSP emulator main binary"}
- {name: "psp_translator.self", purpose: "PSP translator"}
- {name: "release/emulator_api.sprx", purpose: "Emulator API"}
- {name: "release/emulator_drm.sprx", purpose: "DRM handling"}
# -- bdplayer/ : Blu-ray player --
bdplayer:
path: "dev_flash/bdplayer/"
source_ref: "rpcs3/Crypto/key_vault.h:257-258"
note: "Blu-ray disc player modules"
files:
- {name: "bdp_bdmv.self", purpose: "BD-MV player"}
- {name: "bdj.self", purpose: "BD-J (Java) player"}
# Additional flash partitions
dev_flash2:
path: "dev_flash2/"
filesystem: "CELL_FS_FAT"
device: "CELL_FS_IOS:BUILTIN_FLSH2"
source_ref: "rpcs3/Emu/Cell/lv2/sys_fs.cpp:29"
note: "Second flash partition, used for additional system data"
dev_flash3:
path: "dev_flash3/"
filesystem: "CELL_FS_FAT"
device: "CELL_FS_IOS:BUILTIN_FLSH3"
source_ref: "rpcs3/Emu/Cell/lv2/sys_fs.cpp:28"
note: "Third flash partition"
notes: |
RPCS3 requires the official PS3 firmware (PS3UPDAT.PUP) from Sony. The PUP file is
a signed update package containing multiple TAR archives prefixed with "dev_flash_".
During installation, RPCS3 extracts these TARs into the dev_flash/ directory structure.
The most critical component is dev_flash/sys/external/liblv2.sprx - without it, no
PS3 game can boot. RPCS3 checks for its presence and shows a firmware install prompt
if missing.
Most sys/external modules can run in either LLE (real firmware code) or HLE (RPCS3
reimplementation) mode. By default, liblv2.sprx loads libsysmodule.sprx which chains
all other modules. Users can toggle individual modules between LLE/HLE.
The dev_flash/ structure mirrors the real PS3 NAND layout:
- sys/external/ : Loadable firmware PRX modules
- sys/internal/ : Internal system modules
- vsh/ : Visual Shell (XMB interface)
- data/font/ : System TTF fonts (16+ files)
- data/cert/ : SSL certificates
- ps1emu/ : PS1 backward compat emulator
- ps2emu/ : PS2 backward compat emulator (fat models only)
- pspemu/ : PSP emulator
- bdplayer/ : Blu-ray disc player
Firmware versions follow the X.XX format (e.g. 4.90). RPCS3 reads the version from
dev_flash/vsh/etc/version.txt at startup.

295
emulators/vita3k.yml Normal file
View File

@@ -0,0 +1,295 @@
# Vita3K emulator firmware profile
# Generated from source analysis of https://github.com/Vita3K/Vita3K
# Commit analyzed: HEAD as of 2026-03-17
emulator: Vita3K
type: standalone
source: "https://github.com/Vita3K/Vita3K"
systems: [sony-playstation-vita]
firmware_file: "PSVUPDAT.PUP"
firmware_source: "https://www.playstation.com/en-us/support/hardware/psvita/system-software/"
firmware_detection: "pup_decrypt"
firmware_install: "decrypts PUP, extracts FAT/exFAT images into os0/, vs0/, sa0/, pd0/"
validation:
method: "pup_decrypt_and_extract"
source_ref: "vita3k/packages/src/pup.cpp:260-314"
note: >
PUP is decrypted using SCE keys (register_keys), then four filesystem images are
extracted: os0.img (FAT), pd0.img (exFAT), sa0.img (FAT), vs0.img (FAT).
Each image is mounted to its respective partition path.
firmware_version:
path: "PUP_DEC/PUP/version.txt"
source_ref: "vita3k/packages/src/pup.cpp:303-309"
note: "Read from version.txt inside the decrypted PUP during installation"
# Firmware partitions extracted from PSVUPDAT.PUP
partitions:
os0:
image: "os0.img"
filesystem: "FAT"
source_ref: "vita3k/packages/src/pup.cpp:293"
note: "Core OS partition. Contains kernel modules and low-level system components."
vs0:
image: "vs0.img"
filesystem: "FAT"
source_ref: "vita3k/packages/src/pup.cpp:299"
note: >
Main system partition. Contains firmware modules (sys/external/*.suprx),
system apps (app/), LiveArea resources, themes, and system configuration.
directories:
sys_external:
path: "vs0/sys/external/"
source_ref: "vita3k/modules/module_parent.cpp:332"
note: >
Primary firmware module directory. Modules are loaded as .suprx files.
RPCS3-style LLE/HLE toggle: Vita3K can load real firmware modules (LLE)
or use built-in reimplementations (HLE) per module.
app:
path: "vs0/app/"
note: "System applications (settings, browser, store, etc)"
data_internal:
path: "vs0/data/internal/"
note: "Internal system data: themes, LiveArea defaults"
files:
- {path: "theme/", purpose: "Default system themes"}
- {path: "livearea/default/sce_sys/icon0.png", purpose: "Default app icon"}
sa0:
image: "sa0.img"
filesystem: "FAT"
source_ref: "vita3k/packages/src/pup.cpp:297"
note: "System assets partition. Contains firmware fonts (PVF files)."
directories:
fonts:
path: "sa0/data/font/pvf/"
source_ref: "vita3k/gui/src/gui.cpp:228-267"
note: >
PS Vita system fonts in PVF format (PlayStation Vita Font). Used for
system UI, LiveArea, and games that use the sceFt2/libpvf font API.
Without these, Vita3K falls back to bundled open-source fonts.
files:
- {name: "ltn0.pvf", type: "Latin Regular", required: true, note: "Primary UI font, checked at startup"}
- {name: "jpn0.pvf", type: "Japanese", required: false}
- {name: "kr0.pvf", type: "Korean", required: false}
- {name: "cn0.pvf", type: "Chinese Simplified", required: false}
pd0:
image: "pd0.img"
filesystem: "exFAT"
source_ref: "vita3k/packages/src/pup.cpp:295"
note: "System data partition. Contains system BGM and other data."
files:
- {path: "data/systembgm/initialsetup.at9", purpose: "Initial setup background music"}
# Firmware modules (vs0/sys/external/*.suprx)
firmware_modules:
# Auto-LLE modules (loaded from firmware by default)
auto_lle:
source_ref: "vita3k/module/src/load_module.cpp:142-161"
note: "These modules are automatically loaded via LLE when firmware is present"
modules:
- {id: "SCE_SYSMODULE_HTTP", libs: ["libhttp"]}
- {id: "SCE_SYSMODULE_SSL", libs: ["libssl"]}
- {id: "SCE_SYSMODULE_HTTPS", libs: ["libhttp", "libssl"]}
- {id: "SCE_SYSMODULE_ULT", libs: ["libult"]}
- {id: "SCE_SYSMODULE_SAS", libs: ["libsas"]}
- {id: "SCE_SYSMODULE_PGF", libs: ["libpgf"]}
- {id: "SCE_SYSMODULE_FIOS2", libs: ["libfios2"]}
- {id: "SCE_SYSMODULE_SYSTEM_GESTURE", libs: ["libsystemgesture"]}
- {id: "SCE_SYSMODULE_XML", libs: ["libSceXml"]}
- {id: "SCE_SYSMODULE_SQLITE", libs: ["libSceSqlite"]}
- {id: "SCE_SYSMODULE_RUDP", libs: ["librudp"]}
- {id: "SCE_SYSMODULE_NET_ADHOC_MATCHING", libs: ["adhoc_matching"]}
- {id: "SCE_SYSMODULE_MP4", libs: ["libscemp4"]}
- {id: "SCE_SYSMODULE_ATRAC", libs: ["libatrac"]}
- {id: "SCE_SYSMODULE_FACE", libs: ["libface"]}
- {id: "SCE_SYSMODULE_SMART", libs: ["libsmart"]}
- {id: "SCE_SYSMODULE_AVPLAYER", libs: ["libsceavplayer", "libscemp4"]}
- {id: "SCE_SYSMODULE_JSON", libs: ["libSceJson"]}
# Always-LLE preload modules
preload:
source_ref: "vita3k/interface.cpp:497-504, vita3k/module/src/load_module.cpp:187"
note: "These modules are always loaded from firmware (LLE), never HLE"
modules:
- {name: "libc", note: "C standard library"}
- {name: "libSceFt2", note: "FreeType2 font engine"}
- {name: "libpvf", note: "PlayStation Vita Font library"}
- {name: "libcdlg", note: "Common dialog library"}
# All registered sysmodule mappings
sysmodule_map:
source_ref: "vita3k/module/src/load_module.cpp:25-109"
note: "Complete mapping of SCE_SYSMODULE IDs to firmware library filenames"
modules:
# Networking
- {id: "SCE_SYSMODULE_NET", libs: ["libnet", "libnetctl"]}
- {id: "SCE_SYSMODULE_HTTP", libs: ["libhttp"]}
- {id: "SCE_SYSMODULE_SSL", libs: ["libssl"]}
- {id: "SCE_SYSMODULE_HTTPS", libs: ["libhttp", "libssl"]}
# Performance / Threading
- {id: "SCE_SYSMODULE_PERF", libs: ["libperf"]}
- {id: "SCE_SYSMODULE_FIBER", libs: ["libfiber"]}
- {id: "SCE_SYSMODULE_ULT", libs: ["libult"]}
# Debug
- {id: "SCE_SYSMODULE_DBG", libs: ["librazorcapture_es4", "librazorhud_es4"]}
- {id: "SCE_SYSMODULE_RAZOR_CAPTURE", libs: ["librazorcapture_es4"]}
- {id: "SCE_SYSMODULE_RAZOR_HUD", libs: ["librazorhud_es4"]}
# Audio
- {id: "SCE_SYSMODULE_NGS", libs: ["libngs"]}
- {id: "SCE_SYSMODULE_SULPHA", libs: ["libsulpha"]}
- {id: "SCE_SYSMODULE_SAS", libs: ["libsas"]}
- {id: "SCE_SYSMODULE_AUDIOCODEC", libs: ["libaudiocodec"]}
- {id: "SCE_SYSMODULE_AACENC", libs: ["libnaac"]}
- {id: "SCE_SYSMODULE_ATRAC", libs: ["libatrac"]}
- {id: "SCE_SYSMODULE_VOICE", libs: ["libvoice"]}
- {id: "SCE_SYSMODULE_VOICEQOS", libs: ["libvoiceqos"]}
# Font / Text
- {id: "SCE_SYSMODULE_PGF", libs: ["libpgf"]}
- {id: "SCE_SYSMODULE_IME", libs: ["libime"]}
- {id: "SCE_SYSMODULE_HANDWRITING", libs: ["libhandwriting"]}
# System
- {id: "SCE_SYSMODULE_APPUTIL", libs: ["apputil"]}
- {id: "SCE_SYSMODULE_FIOS2", libs: ["libfios2"]}
- {id: "SCE_SYSMODULE_SYSTEM_GESTURE", libs: ["libsystemgesture"]}
- {id: "SCE_SYSMODULE_LOCATION", libs: ["liblocation"]}
- {id: "SCE_SYSMODULE_CLIPBOARD", libs: ["libclipboard"]}
- {id: "SCE_SYSMODULE_TRIGGER_UTIL", libs: ["trigger_util"]}
- {id: "SCE_SYSMODULE_LIVEAREA", libs: ["livearea_util"]}
- {id: "SCE_SYSMODULE_BG_APP_UTIL", libs: ["bgapputil"]}
- {id: "SCE_SYSMODULE_INCOMING_DIALOG", libs: ["incoming_dialog"]}
- {id: "SCE_SYSMODULE_IPMI", libs: ["libipmi_nongame"]}
- {id: "SCE_SYSMODULE_NOTIFICATION_UTIL", libs: ["notification_util"]}
- {id: "SCE_SYSMODULE_SHUTTER_SOUND", libs: ["libSceShutterSound"]}
- {id: "SCE_SYSMODULE_SCREEN_SHOT", libs: ["libSceScreenShot"]}
# PlayStation Network
- {id: "SCE_SYSMODULE_NP_BASIC", libs: ["np_basic"]}
- {id: "SCE_SYSMODULE_NP", libs: ["np_common", "np_manager", "np_basic"]}
- {id: "SCE_SYSMODULE_NP_COMMERCE2", libs: ["np_commerce2"]}
- {id: "SCE_SYSMODULE_NP_UTILITY", libs: ["np_utility"]}
- {id: "SCE_SYSMODULE_NP_MATCHING2", libs: ["np_matching2"]}
- {id: "SCE_SYSMODULE_NP_SCORE_RANKING", libs: ["np_ranking"]}
- {id: "SCE_SYSMODULE_NP_ACTIVITY", libs: ["np_activity_sdk"]}
- {id: "SCE_SYSMODULE_NP_TROPHY", libs: ["np_trophy"]}
- {id: "SCE_SYSMODULE_NP_MESSAGE", libs: ["np_message_padding", "np_message"]}
- {id: "SCE_SYSMODULE_NP_PARTY", libs: ["np_party"]}
- {id: "SCE_SYSMODULE_NP_TUS", libs: ["np_tus"]}
- {id: "SCE_SYSMODULE_NP_SNS_FACEBOOK", libs: ["np_sns_facebook"]}
- {id: "SCE_SYSMODULE_NP_SIGNALING", libs: ["np_signaling"]}
- {id: "SCE_SYSMODULE_NP_WEBAPI", libs: ["np_webapi"]}
# Media
- {id: "SCE_SYSMODULE_MP4", libs: ["libscemp4"]}
- {id: "SCE_SYSMODULE_AVPLAYER", libs: ["libsceavplayer", "libscemp4"]}
- {id: "SCE_SYSMODULE_AVCDEC", libs: ["avcdec_for_player"]}
- {id: "SCE_SYSMODULE_MP4_RECORDER", libs: ["libSceMp4Rec"]}
- {id: "SCE_SYSMODULE_PHOTO_EXPORT", libs: ["libScePhotoExport"]}
- {id: "SCE_SYSMODULE_VIDEO_EXPORT", libs: ["libSceVideoExport"]}
- {id: "SCE_SYSMODULE_MUSIC_EXPORT", libs: ["libSceMusicExport"]}
# Other
- {id: "SCE_SYSMODULE_XML", libs: ["libSceXml"]}
- {id: "SCE_SYSMODULE_JSON", libs: ["libSceJson"]}
- {id: "SCE_SYSMODULE_SQLITE", libs: ["libSceSqlite"]}
- {id: "SCE_SYSMODULE_RUDP", libs: ["librudp"]}
- {id: "SCE_SYSMODULE_NET_ADHOC_MATCHING", libs: ["adhoc_matching"]}
- {id: "SCE_SYSMODULE_PSPNET_ADHOC", libs: ["pspnet_adhoc"]}
- {id: "SCE_SYSMODULE_FACE", libs: ["libface"]}
- {id: "SCE_SYSMODULE_SMART", libs: ["libsmart"]}
- {id: "SCE_SYSMODULE_MARLIN", libs: ["libmln"]}
- {id: "SCE_SYSMODULE_MARLIN_DOWNLOADER", libs: ["libmlndownloader"]}
- {id: "SCE_SYSMODULE_MARLIN_APP_LIB", libs: ["libmlnapplib"]}
- {id: "SCE_SYSMODULE_TELEPHONY_UTIL", libs: ["libSceTelephonyUtil"]}
- {id: "SCE_SYSMODULE_DTCP_IP", libs: ["libSceDtcpIp"]}
- {id: "SCE_SYSMODULE_VIDEO_SEARCH_EMPR", libs: ["libSceVideoSearchEmpr"]}
- {id: "SCE_SYSMODULE_BEISOBMF", libs: ["libSceBeisobmf"]}
- {id: "SCE_SYSMODULE_BEMP2SYS", libs: ["libSceBemp2sys"]}
- {id: "SCE_SYSMODULE_NEAR_UTIL", libs: ["libScenNearUtil"]}
- {id: "SCE_SYSMODULE_NEAR_DIALOG_UTIL", libs: ["libSceNearDialogUtil"]}
- {id: "SCE_SYSMODULE_LOCATION_EXTENSION", libs: ["liblocation_extension"]}
- {id: "SCE_SYSMODULE_MAIL_API", libs: ["mail_api_for_local_libc"]}
- {id: "SCE_SYSMODULE_TELEPORT_CLIENT", libs: ["libSceTeleportClient"]}
- {id: "SCE_SYSMODULE_TELEPORT_SERVER", libs: ["libSceTeleportServer"]}
- {id: "SCE_SYSMODULE_APPUTIL_EXT", libs: ["apputil_ext"]}
- {id: "SCE_SYSMODULE_CODECENGINE_PERF", libs: ["libcodecengine_perf"]}
# Internal sysmodule mappings
internal_modules:
source_ref: "vita3k/module/src/load_module.cpp:114-136"
modules:
- {id: "SCE_SYSMODULE_INTERNAL_JPEG_ENC_ARM", libs: ["libscejpegencarm"]}
- {id: "SCE_SYSMODULE_INTERNAL_AUDIOCODEC", libs: ["audiocodec"]}
- {id: "SCE_SYSMODULE_INTERNAL_BXCE", libs: ["bXCe"]}
- {id: "SCE_SYSMODULE_INTERNAL_INI_FILE_PROCESSOR", libs: ["ini_file_processor"]}
- {id: "SCE_SYSMODULE_INTERNAL_NP_ACTIVITY_NET", libs: ["np_activity"]}
- {id: "SCE_SYSMODULE_INTERNAL_PAF", libs: ["libpaf"]}
- {id: "SCE_SYSMODULE_INTERNAL_SQLITE_VSH", libs: ["sqlite"]}
- {id: "SCE_SYSMODULE_INTERNAL_DBUTIL", libs: ["dbutil"]}
- {id: "SCE_SYSMODULE_INTERNAL_ACTIVITY_DB", libs: ["activity_db"]}
- {id: "SCE_SYSMODULE_INTERNAL_COMMON_GUI_DIALOG", libs: ["common_gui_dialog"]}
- {id: "SCE_SYSMODULE_INTERNAL_MSG_DIALOG", libs: ["libcdlg_msg"]}
- {id: "SCE_SYSMODULE_INTERNAL_SAVEDATA_DIALOG", libs: ["libcdlg_savedata"]}
- {id: "SCE_SYSMODULE_INTERNAL_IME_DIALOG", libs: ["libcdlg_ime"]}
- {id: "SCE_SYSMODULE_INTERNAL_COMMON_DIALOG_MAIN", libs: ["libcdlg_main"]}
- {id: "SCE_SYSMODULE_INTERNAL_DB_RECOVERY_UTILITY", libs: ["dbrecovery_utility"]}
- {id: "SCE_SYSMODULE_INTERNAL_DRM_PSM_KDC", libs: ["psmkdc"]}
- {id: "SCE_SYSMODULE_INTERNAL_LOCATION_INTERNAL", libs: ["liblocation_internal"]}
# IO device layout (full Vita filesystem)
io_devices:
source_ref: "vita3k/io/include/io/VitaIoDevice.h:22-50"
firmware_partitions:
- {device: "os0", purpose: "Core OS kernel modules"}
- {device: "vs0", purpose: "System firmware modules and apps"}
- {device: "sa0", purpose: "System assets (fonts)"}
- {device: "pd0", purpose: "System data (BGM, resources)"}
user_partitions:
- {device: "ux0", purpose: "Main storage (memory card)"}
- {device: "ur0", purpose: "Internal user storage"}
- {device: "uma0", purpose: "USB mass storage (PSTV)"}
- {device: "imc0", purpose: "Internal memory card (Slim)"}
- {device: "grw0", purpose: "Game card (writable area)"}
- {device: "gro0", purpose: "Game card (read-only area)"}
app_partitions:
- {device: "app0", purpose: "Current running application"}
- {device: "addcont0", purpose: "Additional content (DLC)"}
- {device: "savedata0", purpose: "Save data (slot 0)"}
- {device: "savedata1", purpose: "Save data (slot 1)"}
# Fallback fonts when firmware is not installed
fallback_fonts:
source_ref: "vita3k/gui/src/gui.cpp:276-318"
path: "data/fonts/"
files:
- {name: "mplus-1mn-bold.ttf", purpose: "Primary fallback monospaced font"}
- {name: "SourceHanSansSC-Bold-Min.ttf", purpose: "Chinese fallback font"}
- {name: "neodgm.ttf", purpose: "Korean fallback font"}
note: "Open-source fonts bundled with Vita3K, used when firmware fonts (sa0) are not installed"
notes: |
Vita3K requires the official PS Vita firmware (PSVUPDAT.PUP) from Sony for full
compatibility. The firmware is decrypted using SCE keys and extracted into four
partition images: os0 (kernel), vs0 (system), sa0 (assets), pd0 (data).
The most important firmware components are:
1. vs0/sys/external/*.suprx - Firmware modules loaded by games
2. sa0/data/font/pvf/*.pvf - System fonts (ltn0.pvf is checked at startup)
3. vs0/data/internal/ - LiveArea resources and default themes
Vita3K uses a hybrid LLE/HLE approach:
- Some modules (libc, libSceFt2, libpvf, libcdlg) are always loaded from firmware (LLE)
- Others can be toggled between LLE and HLE per module via settings
- Without firmware, many games will fail to load required modules
The module loading path is: first check app0:sce_module/{name}.suprx (game-bundled),
then fall back to vs0:sys/external/{name}.suprx (firmware). This allows games to
ship their own module versions.
CLI firmware install: vita3k --firmware /path/to/PSVUPDAT.PUP
GUI: File > Install Firmware
Vita3K does not have a libretro core. It is standalone only.

75
emulators/xemu.yml Normal file
View File

@@ -0,0 +1,75 @@
emulator: Xemu
type: standalone
source: "https://github.com/xemu-project/xemu"
systems: [microsoft-xbox]
notes: |
Xemu is a free, open-source Xbox emulator based on QEMU.
Three firmware files are required for operation: MCPX boot ROM,
flash ROM (BIOS), and EEPROM image. A pre-built HDD image is
also needed. The EEPROM can be auto-generated by xemu if not
provided. Config stored in xemu.toml under sys.files section.
files:
- name: "mcpx_1.0.bin"
description: "MCPX HLE boot ROM (v1.0)"
required: true
size: 512
source_ref: "hw/xbox/xbox.c:151 (bootrom_size != 512 -> error)"
config_key: "sys.files.bootrom_path"
notes: |
Overlaid on the last 512 bytes of the flash ROM region at boot.
Mapped to 0xFFFFFE00-0xFFFFFFFF. Disabled after early init
via LPC config register write (hw/xbox/xbox_pci.c:362).
Machine property: -machine xbox,bootrom=<path>
- name: "Complex_4627.bin"
description: "Xbox flash ROM / BIOS (256 KB, kernel 4627)"
required: true
size_options: [262144, 524288, 1048576]
size_note: "Must be a multiple of 64 KB. Default 256 KB."
source_ref: "hw/xbox/xbox.c:70-81 (bios_name, bios_size validation)"
config_key: "sys.files.flashrom_path"
notes: |
Loaded as -bios argument (system/vl.c:3052-3053).
Mapped to 0xFF000000-0xFFFFFFFF with mirroring.
Common variants: Complex_4627 (1.0), Complex_4034 (debug),
Complex_4817 (1.1). Any valid Xbox BIOS dump works.
- name: "eeprom.bin"
description: "Xbox EEPROM dump (256 bytes)"
required: false
size: 256
source_ref: "system/vl.c:2939 (size != 256 -> error)"
config_key: "sys.files.eeprom_path"
notes: |
Loaded via smbus-storage device (hw/xbox/smbus_storage.c:157).
Auto-generated as XBOX_EEPROM_VERSION_R1 if missing
(system/vl.c:2918-2919). Default path: <config_dir>/eeprom.bin.
Contains serial, MAC, HDD key, region, video standard.
Structure defined in hw/xbox/eeprom_generation.h.
- name: "xbox_hdd.qcow2"
description: "Xbox HDD image (8 GB, qcow2 format)"
required: true
source_ref: "system/vl.c:3060-3073 (hdd_path loading)"
config_key: "sys.files.hdd_path"
notes: |
Attached as IDE drive index=0 with locked=on.
Must contain Xbox partitions (C, E, X, Y, Z).
Pre-built images available from xemu project.
Not a BIOS file - excluded from retrobios packs.
machine_properties:
bootrom: "MCPX boot ROM path (string)"
avpack: "Video connector type: composite, scart, svideo, vga, rfu, hdtv, none"
short-animation: "Skip Xbox boot animation (bool)"
smc-version: "SMC version string, 3 chars, default P01"
video-encoder: "Video encoder chip: conexant (default), focus, xcalibur"
source_ref: "hw/xbox/xbox.c:446-497"
memory_layout:
ram: "64 MB or 128 MB (configurable via sys.mem_limit)"
flash_rom: "0xFF000000-0xFFFFFFFF (mirrored per bios_size)"
mcpx_overlay: "Last bios_size bytes, overlays flash ROM at reset"
source_ref: "hw/xbox/xbox.c:64-173"

View File

@@ -15,6 +15,7 @@ platforms:
source_format: clrmamepro_dat
hash_type: sha1
schedule: weekly
emulators: [pcsx_rearmed, beetle_psx, genesis_plus_gx, flycast, melonds, mgba, snes9x, mupen64plus, beetle_saturn, dolphin]
batocera:
config: batocera.yml
@@ -52,6 +53,7 @@ platforms:
source_format: bash_script+csv
hash_type: md5
schedule: weekly
emulators: [duckstation, pcsx2, dolphin, rpcs3, ppsspp, cemu, xemu, vita3k, citra, melonds]
# dragoonDorise/EmuDeck = official repo (creator's account, 3.4k stars)
# EmuDeck/emudeck.github.io = official wiki (org account)

View File

@@ -0,0 +1,35 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Emulator BIOS Profile",
"type": "object",
"required": ["emulator", "source", "systems", "files"],
"properties": {
"emulator": { "type": "string" },
"type": {
"type": "string",
"enum": ["standalone", "libretro", "standalone + libretro"]
},
"source": { "type": "string", "format": "uri" },
"systems": {
"type": "array",
"items": { "type": "string" }
},
"files": {
"type": "array",
"items": {
"type": "object",
"required": ["name"],
"properties": {
"name": { "type": "string" },
"region": { "type": "string" },
"required": { "type": "boolean", "default": false },
"md5": { "type": "string", "pattern": "^[a-fA-F0-9]{32}$" },
"sha1": { "type": "string", "pattern": "^[a-f0-9]{40}$" },
"size": { "type": "integer" },
"source_ref": { "type": "string" },
"note": { "type": "string" }
}
}
}
}
}

192
scripts/cross_reference.py Normal file
View File

@@ -0,0 +1,192 @@
#!/usr/bin/env python3
"""Cross-reference emulator profiles against platform configs.
Identifies BIOS files that emulators need but platforms don't declare,
providing gap analysis for extended coverage.
Usage:
python scripts/cross_reference.py
python scripts/cross_reference.py --emulator dolphin
python scripts/cross_reference.py --json
"""
from __future__ import annotations
import argparse
import json
import os
import sys
from pathlib import Path
try:
import yaml
except ImportError:
print("Error: PyYAML required (pip install pyyaml)", file=sys.stderr)
sys.exit(1)
sys.path.insert(0, os.path.dirname(__file__))
from common import load_database
DEFAULT_EMULATORS_DIR = "emulators"
DEFAULT_PLATFORMS_DIR = "platforms"
DEFAULT_DB = "database.json"
def load_emulator_profiles(emulators_dir: str) -> dict[str, dict]:
"""Load all emulator YAML profiles."""
profiles = {}
emu_path = Path(emulators_dir)
if not emu_path.exists():
return profiles
for f in sorted(emu_path.glob("*.yml")):
with open(f) as fh:
profile = yaml.safe_load(fh) or {}
if "emulator" in profile:
profiles[f.stem] = profile
return profiles
def load_platform_files(platforms_dir: str) -> dict[str, set[str]]:
"""Load all platform configs and collect declared filenames per system."""
declared = {}
for f in sorted(Path(platforms_dir).glob("*.yml")):
if f.name.startswith("_"):
continue
with open(f) as fh:
config = yaml.safe_load(fh) or {}
for sys_id, system in config.get("systems", {}).items():
for fe in system.get("files", []):
name = fe.get("name", "")
if name:
declared.setdefault(sys_id, set()).add(name)
return declared
def cross_reference(
profiles: dict[str, dict],
declared: dict[str, set[str]],
db: dict,
) -> dict:
"""Compare emulator profiles against platform declarations.
Returns a report with gaps (files emulators need but platforms don't list)
and coverage stats.
"""
by_name = db.get("indexes", {}).get("by_name", {})
report = {}
for emu_name, profile in profiles.items():
emu_files = profile.get("files", [])
systems = profile.get("systems", [])
# Collect all platform-declared files for this emulator's systems
platform_names = set()
for sys_id in systems:
platform_names.update(declared.get(sys_id, set()))
gaps = []
covered = []
for f in emu_files:
fname = f.get("name", "")
if not fname:
continue
in_platform = fname in platform_names
in_repo = fname in by_name
entry = {
"name": fname,
"required": f.get("required", False),
"note": f.get("note", ""),
"source_ref": f.get("source_ref", ""),
"in_platform": in_platform,
"in_repo": in_repo,
}
if not in_platform:
gaps.append(entry)
else:
covered.append(entry)
report[emu_name] = {
"emulator": profile.get("emulator", emu_name),
"systems": systems,
"total_files": len(emu_files),
"platform_covered": len(covered),
"gaps": len(gaps),
"gap_in_repo": sum(1 for g in gaps if g["in_repo"]),
"gap_missing": sum(1 for g in gaps if not g["in_repo"]),
"gap_details": gaps,
}
return report
def print_report(report: dict) -> None:
"""Print a human-readable gap analysis report."""
print("Emulator vs Platform Gap Analysis")
print("=" * 60)
total_gaps = 0
total_in_repo = 0
total_missing = 0
for emu_name, data in sorted(report.items()):
gaps = data["gaps"]
if gaps == 0:
status = "OK"
else:
status = f"{data['gap_in_repo']} in repo, {data['gap_missing']} missing"
print(f"\n{data['emulator']} ({', '.join(data['systems'])})")
print(f" {data['total_files']} files in profile, "
f"{data['platform_covered']} declared by platforms, "
f"{gaps} undeclared")
if gaps > 0:
print(f" Gaps: {status}")
for g in data["gap_details"]:
req = "*" if g["required"] else " "
loc = "repo" if g["in_repo"] else "MISSING"
note = f" -- {g['note']}" if g["note"] else ""
print(f" {req} {g['name']} [{loc}]{note}")
total_gaps += gaps
total_in_repo += data["gap_in_repo"]
total_missing += data["gap_missing"]
print(f"\n{'=' * 60}")
print(f"Total: {total_gaps} undeclared files across all emulators")
print(f" {total_in_repo} already in repo (can be added to packs)")
print(f" {total_missing} missing from repo (need to be sourced)")
def main():
parser = argparse.ArgumentParser(description="Emulator vs platform gap analysis")
parser.add_argument("--emulators-dir", default=DEFAULT_EMULATORS_DIR)
parser.add_argument("--platforms-dir", default=DEFAULT_PLATFORMS_DIR)
parser.add_argument("--db", default=DEFAULT_DB)
parser.add_argument("--emulator", "-e", help="Analyze single emulator")
parser.add_argument("--json", action="store_true", help="JSON output")
args = parser.parse_args()
profiles = load_emulator_profiles(args.emulators_dir)
if args.emulator:
profiles = {k: v for k, v in profiles.items() if k == args.emulator}
if not profiles:
print("No emulator profiles found.", file=sys.stderr)
return
declared = load_platform_files(args.platforms_dir)
db = load_database(args.db)
report = cross_reference(profiles, declared, db)
if args.json:
print(json.dumps(report, indent=2))
else:
print_report(report)
if __name__ == "__main__":
main()

View File

@@ -385,6 +385,9 @@ def main():
parser.add_argument("--db", default=DEFAULT_DB_FILE, help="Path to database.json")
parser.add_argument("--bios-dir", default=DEFAULT_BIOS_DIR)
parser.add_argument("--output-dir", "-o", default=DEFAULT_OUTPUT_DIR)
parser.add_argument("--include-extras", action="store_true",
help="Include emulator-recommended files not declared by platform")
parser.add_argument("--emulators-dir", default="emulators")
parser.add_argument("--list", action="store_true", help="List available platforms")
args = parser.parse_args()