mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-04-13 04:12:33 -05:00
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:
399
emulators/cemu.yml
Normal file
399
emulators/cemu.yml
Normal 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
86
emulators/citra.yml
Normal 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
182
emulators/dolphin.yml
Normal 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
1074
emulators/duckstation.yml
Normal file
File diff suppressed because it is too large
Load Diff
185
emulators/flycast.yml
Normal file
185
emulators/flycast.yml
Normal 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
75
emulators/melonds.yml
Normal 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
212
emulators/pcsx2.yml
Normal 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
137
emulators/ppsspp.yml
Normal 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
318
emulators/rpcs3.yml
Normal 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
295
emulators/vita3k.yml
Normal 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
75
emulators/xemu.yml
Normal 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"
|
||||
@@ -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)
|
||||
|
||||
|
||||
35
schemas/emulator.schema.json
Normal file
35
schemas/emulator.schema.json
Normal 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
192
scripts/cross_reference.py
Normal 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()
|
||||
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user