diff --git a/emulators/cemu.yml b/emulators/cemu.yml new file mode 100644 index 00000000..50901fc4 --- /dev/null +++ b/emulators/cemu.yml @@ -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. diff --git a/emulators/citra.yml b/emulators/citra.yml new file mode 100644 index 00000000..ac332b82 --- /dev/null +++ b/emulators/citra.yml @@ -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" diff --git a/emulators/dolphin.yml b/emulators/dolphin.yml new file mode 100644 index 00000000..62588862 --- /dev/null +++ b/emulators/dolphin.yml @@ -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//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//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. diff --git a/emulators/duckstation.yml b/emulators/duckstation.yml new file mode 100644 index 00000000..bbace495 --- /dev/null +++ b/emulators/duckstation.yml @@ -0,0 +1,1074 @@ +emulator: DuckStation +type: standalone +source: "https://github.com/stenzek/duckstation" +systems: [sony-playstation] +bios_size: 524288 # 0x80000 (512 KB), also accepts PS2 (4 MB) and PS3 BIOS +verification: md5 +notes: > + DuckStation auto-detects BIOS by MD5 hash. It accepts PS1, PS2 and PS3 BIOS images + (only the first 512 KB are mapped). Each image has a priority score - lower is better. + Images with region_check=true enforce region matching for disc booting. + PS2 BIOS images are deprioritized (priority >= 100) due to requiring dynamic fast boot patches. + Late PAL revisions are further deprioritized due to additional regional checks. + OpenBIOS is detected by signature at offset 0x78, not by hash. + +files: + # -- PS1 BIOS images (priority <= 20, preferred) -- + + - name: "scph1000.bin" + description: "SCPH-1000, DTL-H1000 (v1.0)" + region: "NTSC-J" + required: false + md5: "239665b1a3dade1b5a52c06338011044" + region_check: true + fast_boot: Type1 + priority: 50 + source_ref: "src/core/bios.cpp:35" + + - name: "scph1001.bin" + description: "SCPH-1001, 5003, DTL-H1201, H3001 (v2.2 12-04-95 A)" + region: "NTSC-U" + required: false + md5: "924e392ed05558ffdb115408c263dccf" + region_check: false + fast_boot: Type1 + priority: 10 + source_ref: "src/core/bios.cpp:36" + + - name: "scph1002a.bin" + description: "SCPH-1002, DTL-H1002 (v2.0 05-10-95 E)" + region: "PAL" + required: false + md5: "54847e693405ffeb0359c6287434cbef" + region_check: false + fast_boot: Type1 + priority: 10 + source_ref: "src/core/bios.cpp:37" + + - name: "scph1002b.bin" + description: "SCPH-1002, DTL-H1102 (v2.1 07-17-95 E)" + region: "PAL" + required: false + md5: "417b34706319da7cf001e76e40136c23" + region_check: false + fast_boot: Type1 + priority: 10 + source_ref: "src/core/bios.cpp:38" + + - name: "scph1002c.bin" + description: "SCPH-1002, DTL-H1202, H3002 (v2.2 12-04-95 E)" + region: "PAL" + required: false + md5: "e2110b8a2b97a8e0b857a45d32f7e187" + region_check: false + fast_boot: Type1 + priority: 10 + source_ref: "src/core/bios.cpp:39" + + - name: "dtlh1100.bin" + description: "DTL-H1100 (v2.2 03-06-96 D)" + region: "NTSC-J" + required: false + md5: "ca5cfc321f916756e3f0effbfaeba13b" + region_check: true + fast_boot: Type1 + priority: 20 + source_ref: "src/core/bios.cpp:40" + + - name: "scph3000.bin" + description: "SCPH-3000, DTL-H1000H (v1.1 01-22-95)" + region: "NTSC-J" + required: false + md5: "849515939161e62f6b866f6853006780" + region_check: true + fast_boot: Type1 + priority: 10 + source_ref: "src/core/bios.cpp:41" + + - name: "scph1001_v20.bin" + description: "SCPH-1001, DTL-H1001 (v2.0 05-07-95 A)" + region: "NTSC-U" + required: false + md5: "dc2b9bf8da62ec93e868cfd29f0d067d" + region_check: false + fast_boot: Type1 + priority: 10 + source_ref: "src/core/bios.cpp:42" + + - name: "scph3500.bin" + description: "SCPH-3500 (v2.1 07-17-95 J)" + region: "NTSC-J" + required: false + md5: "cba733ceeff5aef5c32254f1d617fa62" + region_check: true + fast_boot: Type1 + priority: 10 + source_ref: "src/core/bios.cpp:43" + + - name: "scph1001_v21.bin" + description: "SCPH-1001, DTL-H1101 (v2.1 07-17-95 A)" + region: "NTSC-U" + required: false + md5: "da27e8b6dab242d8f91a9b25d80c63b8" + region_check: false + fast_boot: Type1 + priority: 10 + source_ref: "src/core/bios.cpp:44" + + - name: "scph5000.bin" + description: "SCPH-5000, DTL-H1200, H3000 (v2.2 12-04-95 J)" + region: "NTSC-J" + required: false + md5: "57a06303dfa9cf9351222dfcbb4a29d9" + region_check: true + fast_boot: Type1 + priority: 5 + source_ref: "src/core/bios.cpp:45" + + - name: "scph5500.bin" + description: "SCPH-5500 (v3.0 09-09-96 J)" + region: "NTSC-J" + required: true + md5: "8dd7d5296a650fac7319bce665a6a53c" + region_check: true + fast_boot: Type1 + priority: 5 + source_ref: "src/core/bios.cpp:46" + + - name: "scph5501.bin" + description: "SCPH-5501, 5503, 7003 (v3.0 11-18-96 A)" + region: "NTSC-U" + required: true + md5: "490f666e1afb15b7362b406ed1cea246" + region_check: false + fast_boot: Type1 + priority: 5 + source_ref: "src/core/bios.cpp:47" + + - name: "scph5502.bin" + description: "SCPH-5502, 5552 (v3.0 01-06-97 E)" + region: "PAL" + required: true + md5: "32736f17079d0b2b7024407c39bd3050" + region_check: false + fast_boot: Type1 + priority: 5 + source_ref: "src/core/bios.cpp:48" + + - name: "scph7000.bin" + description: "SCPH-7000, 7500, 9000 (v4.0 08-18-97 J)" + region: "NTSC-J" + required: false + md5: "8e4c14f567745eff2f0408c8129f72a6" + region_check: true + fast_boot: Type1 + priority: 10 + source_ref: "src/core/bios.cpp:49" + + - name: "scph7000w.bin" + description: "SCPH-7000W (v4.1 11-14-97 A)" + region: "NTSC-J" + required: false + md5: "b84be139db3ee6cbd075630aa20a6553" + region_check: false + fast_boot: Type1 + priority: 10 + source_ref: "src/core/bios.cpp:50" + + - name: "scph7001.bin" + description: "SCPH-7001, 7501, 7503, 9001, 9003, 9903 (v4.1 12-16-97 A)" + region: "NTSC-U" + required: false + md5: "1e68c231d0896b7eadcad1d7d8e76129" + region_check: false + fast_boot: Type1 + priority: 10 + source_ref: "src/core/bios.cpp:51" + + - name: "scph7002.bin" + description: "SCPH-7002, 7502, 9002 (v4.1 12-16-97 E)" + region: "PAL" + required: false + md5: "b9d9a0286c33dc6b7237bb13cd46fdee" + region_check: false + fast_boot: Type1 + priority: 10 + source_ref: "src/core/bios.cpp:52" + + - name: "scph100.bin" + description: "SCPH-100 (v4.3 03-11-00 J)" + region: "NTSC-J" + required: false + md5: "8abc1b549a4a80954addc48ef02c4521" + region_check: true + fast_boot: Type1 + priority: 10 + source_ref: "src/core/bios.cpp:53" + + - name: "scph101_v44.bin" + description: "SCPH-101 (v4.4 03-24-00 A)" + region: "NTSC-U" + required: false + md5: "9a09ab7e49b422c007e6d54d7c49b965" + region_check: false + fast_boot: Type1 + priority: 10 + source_ref: "src/core/bios.cpp:54" + + - name: "scph101_v45.bin" + description: "SCPH-101 (v4.5 05-25-00 A)" + region: "NTSC-U" + required: false + md5: "6e3735ff4c7dc899ee98981385f6f3d0" + region_check: false + fast_boot: Type1 + priority: 10 + source_ref: "src/core/bios.cpp:55" + + - name: "scph102_v44.bin" + description: "SCPH-102 (v4.4 03-24-00 E)" + region: "PAL" + required: false + md5: "b10f5e0e3d9eb60e5159690680b1e774" + region_check: true + fast_boot: Type1 + priority: 20 + source_ref: "src/core/bios.cpp:56" + + - name: "scph102_v45.bin" + description: "SCPH-102 (v4.5 05-25-00 E)" + region: "PAL" + required: false + md5: "de93caec13d1a141a40a79f5c86168d6" + region_check: true + fast_boot: Type1 + priority: 20 + source_ref: "src/core/bios.cpp:57" + + - name: "scph1000r.bin" + description: "SCPH-1000R (v4.5 05-25-00 J)" + region: "NTSC-J" + required: false + md5: "476d68a94ccec3b9c8303bbd1daf2810" + region_check: true + fast_boot: Type1 + priority: 10 + source_ref: "src/core/bios.cpp:58" + + # -- PS2 BIOS images (priority >= 100, deprioritized) -- + # DuckStation accepts PS2 BIOS (4 MB) but only maps first 512 KB. + # Requires Type2 fast boot patch. All have region_check=true. + + - name: "ps2_scph18000.bin" + description: "PS2, SCPH-18000 (v5.0 10-27-00 J)" + region: "NTSC-J" + required: false + md5: "d8f485717a5237285e4d7c5f881b7f32" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:59" + + - name: "ps2_scph30003.bin" + description: "PS2, SCPH-30003 (v5.0 09-02-00 E)" + region: "PAL" + required: false + md5: "71f50ef4f4e17c163c78908e16244f7d" + region_check: true + fast_boot: Type2 + priority: 150 + source_ref: "src/core/bios.cpp:60" + + - name: "ps2_dtlh10000_0117.bin" + description: "PS2, DTL-H10000 (v5.0 01/17/00 T)" + region: "Auto" + required: false + md5: "32f2e4d5ff5ee11072a6bc45530f5765" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:61" + + - name: "ps2_scph10000_0117.bin" + description: "PS2, SCPH-10000 (v5.0 01/17/00 T)" + region: "Auto" + required: false + md5: "acf4730ceb38ac9d8c7d8e21f2614600" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:62" + + - name: "ps2_dtlh10000_0217.bin" + description: "PS2, DTL-H10000 (v5.0 02/17/00 T)" + region: "Auto" + required: false + md5: "acf9968c8f596d2b15f42272082513d1" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:63" + + - name: "ps2_scph10000_15000.bin" + description: "PS2, SCPH-10000/SCPH-15000 (v5.0 02/17/00 T)" + region: "Auto" + required: false + md5: "b1459d7446c69e3e97e6ace3ae23dd1c" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:64" + + - name: "ps2_dtlh10000_0224.bin" + description: "PS2, DTL-H10000 (v5.0 02/24/00 T)" + region: "Auto" + required: false + md5: "d3f1853a16c2ec18f3cd1ae655213308" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:65" + + - name: "ps2_dtlh30001.bin" + description: "PS2, DTL-H30001 (v5.0 07/27/00 A)" + region: "NTSC-U" + required: false + md5: "63e6fd9b3c72e0d7b920e80cf76645cd" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:66" + + - name: "ps2_scph30001_0727.bin" + description: "PS2, SCPH-30001 (v5.0 07/27/00 A)" + region: "NTSC-U" + required: false + md5: "a20c97c02210f16678ca3010127caf36" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:67" + + - name: "ps2_scph30001_0902.bin" + description: "PS2, SCPH-30001 (v5.0 09/02/00 A)" + region: "NTSC-U" + required: false + md5: "8db2fbbac7413bf3e7154c1e0715e565" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:68" + + - name: "ps2_dtlh30002.bin" + description: "PS2, DTL-H30002 (v5.0 09/02/00 E)" + region: "PAL" + required: false + md5: "91c87cb2f2eb6ce529a2360f80ce2457" + region_check: true + fast_boot: Type2 + priority: 150 + source_ref: "src/core/bios.cpp:69" + + - name: "ps2_dtlh30102_0902.bin" + description: "PS2, DTL-H30102 (v5.0 09/02/00 E)" + region: "PAL" + required: false + md5: "3016b3dd42148a67e2c048595ca4d7ce" + region_check: true + fast_boot: Type2 + priority: 150 + source_ref: "src/core/bios.cpp:70" + + - name: "ps2_scph30002_0902.bin" + description: "PS2, SCPH-30002/SCPH-30003/SCPH-30004 (v5.0 09/02/00 E)" + region: "PAL" + required: false + md5: "b7fa11e87d51752a98b38e3e691cbf17" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:71" + + - name: "ps2_scph18000_gh003.bin" + description: "PS2, SCPH-18000 (GH-003) (v5.0 10/27/00 J)" + region: "NTSC-J" + required: false + md5: "f63bc530bd7ad7c026fcd6f7bd0d9525" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:72" + + - name: "ps2_scph18000_gh008.bin" + description: "PS2, SCPH-18000 (GH-008) (v5.0 10/27/00 J)" + region: "NTSC-J" + required: false + md5: "cee06bd68c333fc5768244eae77e4495" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:73" + + - name: "ps2_dtlh30101.bin" + description: "PS2, DTL-H30101 (v5.0 12/28/00 A)" + region: "NTSC-U" + required: false + md5: "0bf988e9c7aaa4c051805b0fa6eb3387" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:74" + + - name: "ps2_scph30001_35001.bin" + description: "PS2, SCPH-30001/SCPH-35001 (v5.0 12/28/00 A)" + region: "NTSC-U" + required: false + md5: "8accc3c49ac45f5ae2c5db0adc854633" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:75" + + - name: "ps2_dtlh30102_1228.bin" + description: "PS2, DTL-H30102 (v5.0 12/28/00 E)" + region: "PAL" + required: false + md5: "6f9a6feb749f0533aaae2cc45090b0ed" + region_check: true + fast_boot: Type2 + priority: 150 + source_ref: "src/core/bios.cpp:76" + + - name: "ps2_scph30002_1228.bin" + description: "PS2, SCPH-30002/SCPH-30003/SCPH-30004/SCHP-35002/SCPH-35003/SCPH-35004 (v5.0 12/28/00 E)" + region: "PAL" + required: false + md5: "838544f12de9b0abc90811279ee223c8" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:77" + + - name: "ps2_dtlh30000.bin" + description: "PS2, DTL-H30000 (v5.0 01/18/01 J)" + region: "NTSC-J" + required: false + md5: "bb6bbc850458fff08af30e969ffd0175" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:78" + + - name: "ps2_scph30000_35000.bin" + description: "PS2, SCPH-30000/SCPH-35000 (v5.0 01/18/01 J)" + region: "NTSC-J" + required: false + md5: "815ac991d8bc3b364696bead3457de7d" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:79" + + - name: "ps2_scph30001r_0427.bin" + description: "PS2, SCPH-30001R (v5.0 04/27/01 A)" + region: "NTSC-U" + required: false + md5: "b107b5710042abe887c0f6175f6e94bb" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:80" + + - name: "ps2_scph30000_0427.bin" + description: "PS2, SCPH-30000 (v5.0 04/27/01 J)" + region: "NTSC-J" + required: false + md5: "ab55cceea548303c22c72570cfd4dd71" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:81" + + - name: "ps2_scph30001r_0704.bin" + description: "PS2, SCPH-30001R (v5.0 07/04/01 A)" + region: "NTSC-U" + required: false + md5: "18bcaadb9ff74ed3add26cdf709fff2e" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:82" + + - name: "ps2_scph30002r_0704.bin" + description: "PS2, SCPH-30002R/SCPH-30003R/SCPH-30004R (v5.0 07/04/01 E)" + region: "PAL" + required: false + md5: "491209dd815ceee9de02dbbc408c06d6" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:83" + + - name: "ps2_scph30001r_1004.bin" + description: "PS2, SCPH-30001R (v5.0 10/04/01 A)" + region: "NTSC-U" + required: false + md5: "7200a03d51cacc4c14fcdfdbc4898431" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:84" + + - name: "ps2_scph30002r_1004.bin" + description: "PS2, SCPH-30002R/SCPH-30003R/SCPH-30004R (v5.0 10/04/01 E)" + region: "PAL" + required: false + md5: "8359638e857c8bc18c3c18ac17d9cc3c" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:85" + + - name: "ps2_scph30005r.bin" + description: "PS2, SCPH-30005R/SCPH-30006R/SCPH-30007R (v5.0 07/30/01 J)" + region: "NTSC-J" + required: false + md5: "352d2ff9b3f68be7e6fa7e6dd8389346" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:86" + + - name: "ps2_scph39001.bin" + description: "PS2, SCPH-39001 (v5.0 02/07/02 A)" + region: "NTSC-U" + required: false + md5: "d5ce2c7d119f563ce04bc04dbc3a323e" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:87" + + - name: "ps2_scph39002.bin" + description: "PS2, SCPH-39002/SCPH-39003/SCPH-39004 (v5.0 03/19/02 E)" + region: "PAL" + required: false + md5: "0d2228e6fd4fb639c9c39d077a9ec10c" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:88" + + - name: "ps2_scph37000_39000.bin" + description: "PS2, SCPH-37000/SCPH-39000 (v5.0 04/26/02 J)" + region: "NTSC-J" + required: false + md5: "72da56fccb8fcd77bba16d1b6f479914" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:89" + + - name: "ps2_scph39008.bin" + description: "PS2, SCPH-39008 (v5.0 04/26/02 E)" + region: "PAL" + required: false + md5: "5b1f47fbeb277c6be2fccdd6344ff2fd" + region_check: true + fast_boot: Type2 + priority: 150 + source_ref: "src/core/bios.cpp:90" + + - name: "ps2_scph39005.bin" + description: "PS2, SCPH-39005/SCPH-39006/SCPH-39007 (v5.0 04/26/02 J)" + region: "NTSC-J" + required: false + md5: "315a4003535dfda689752cb25f24785c" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:91" + + - name: "ps2_dtlh50000.bin" + description: "PS2, DTL-H50000 (v5.0 02/06/03 J)" + region: "NTSC-J" + required: false + md5: "54ecde087258557e2ddb5c3ddb004028" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:92" + + - name: "ps2_scph50000_55000.bin" + description: "PS2, SCPH-50000/SCPH-55000 (v5.0 02/06/03 J)" + region: "NTSC-J" + required: false + md5: "312ad4816c232a9606e56f946bc0678a" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:93" + + - name: "ps2_dtlh50002.bin" + description: "PS2, DTL-H50002 (v5.0 02/27/03 E)" + region: "PAL" + required: false + md5: "666018ffec65c5c7e04796081295c6c7" + region_check: true + fast_boot: Type2 + priority: 150 + source_ref: "src/core/bios.cpp:94" + + - name: "ps2_scph50002_0227.bin" + description: "PS2, SCPH-50002/SCPH-50003/SCPH-50004 (v5.0 02/27/03 E)" + region: "PAL" + required: false + md5: "6e69920fa6eef8522a1d688a11e41bc6" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:95" + + - name: "ps2_dtlh50001_0325.bin" + description: "PS2, DTL-H50001 (v5.0 03/25/03 A)" + region: "NTSC-U" + required: false + md5: "eb960de68f0c0f7f9fa083e9f79d0360" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:96" + + - name: "ps2_scph50001_0325.bin" + description: "PS2, SCPH-50001 (v5.0 03/25/03 A)" + region: "NTSC-U" + required: false + md5: "8aa12ce243210128c5074552d3b86251" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:97" + + - name: "ps2_dtlh50009.bin" + description: "PS2, DTL-H50009 (v5.0 02/24/03 J)" + region: "NTSC-J" + required: false + md5: "240d4c5ddd4b54069bdc4a3cd2faf99d" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:98" + + - name: "ps2_desr5000.bin" + description: "PS2, DESR-5000/DESR-5100/DESR-7000/DESR-7100 (v5.0 10/28/03 J)" + region: "NTSC-J" + required: false + md5: "1c6cd089e6c83da618fbf2a081eb4888" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:99" + + - name: "ps2_scph55000_0623.bin" + description: "PS2, SCPH-55000 (v5.0 06/23/03 J)" + region: "NTSC-J" + required: false + md5: "463d87789c555a4a7604e97d7db545d1" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:100" + + - name: "ps2_dtlh50001_0623.bin" + description: "PS2, DTL-H50001 (v5.0 06/23/03 A)" + region: "NTSC-U" + required: false + md5: "ab9d49ad40ae49f19856ad187777b1b3" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:101" + + - name: "ps2_scph50001_0623.bin" + description: "PS2, SCPH-50001/SCPH-50010 (v5.0 06/23/03 A)" + region: "NTSC-U" + required: false + md5: "35461cecaa51712b300b2d6798825048" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:102" + + - name: "ps2_scph50002_0623.bin" + description: "PS2, SCPH-50002/SCPH-50003/SCPH-50004 (v5.0 06/23/03 E)" + region: "PAL" + required: false + md5: "bd6415094e1ce9e05daabe85de807666" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:103" + + - name: "ps2_scph50006.bin" + description: "PS2, SCPH-50006/SCPH-50007 (v5.0 06/23/03 J)" + region: "NTSC-J" + required: false + md5: "2e70ad008d4ec8549aada8002fdf42fb" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:104" + + - name: "ps2_scph50005.bin" + description: "PS2, SCPH-50005 (v5.0 06/23/03 J)" + region: "NTSC-J" + required: false + md5: "50d5b97b57d8c9b6534adcb46c2027d4" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:105" + + - name: "ps2_scph50008.bin" + description: "PS2, SCPH-50008 (v5.0 06/23/03 E)" + region: "PAL" + required: false + md5: "b53d51edc7fc086685e31b811dc32aad" + region_check: true + fast_boot: Type2 + priority: 150 + source_ref: "src/core/bios.cpp:106" + + - name: "ps2_scph50009.bin" + description: "PS2, SCPH-50009 (v5.0 06/23/03 J)" + region: "NTSC-J" + required: false + md5: "1b6e631b536247756287b916f9396872" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:107" + + - name: "ps2_scph50000_0822.bin" + description: "PS2, SCPH-50000 (v5.0 08/22/03 J)" + region: "NTSC-J" + required: false + md5: "00da1b177096cfd2532c8fa22b43e667" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:108" + + - name: "ps2_scph50004_0822.bin" + description: "PS2, SCPH-50004 (v5.0 08/22/03 E)" + region: "PAL" + required: false + md5: "afde410bd026c16be605a1ae4bd651fd" + region_check: true + fast_boot: Type2 + priority: 150 + source_ref: "src/core/bios.cpp:109" + + - name: "ps2_scph50011.bin" + description: "PS2, SCPH-50011 (v5.0 03/29/04 A)" + region: "NTSC-U" + required: false + md5: "81f4336c1de607dd0865011c0447052e" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:110" + + - name: "ps2_scph70000.bin" + description: "PS2, SCPH-70000 (v5.0 06/14/04 J)" + region: "NTSC-J" + required: false + md5: "0eee5d1c779aa50e94edd168b4ebf42e" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:111" + + - name: "ps2_scph70001.bin" + description: "PS2, SCPH-70001/SCPH-70011/SCPH-70012 (v5.0 06/14/04 A)" + region: "NTSC-U" + required: false + md5: "d333558cc14561c1fdc334c75d5f37b7" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:112" + + - name: "ps2_scph70002.bin" + description: "PS2, SCPH-70002/SCPH-70003/SCPH-70004/SCPH-70008 (v5.0 06/14/04 E)" + region: "PAL" + required: false + md5: "dc752f160044f2ed5fc1f4964db2a095" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:113" + + - name: "ps2_scph70002_alt.bin" + description: "PS2, SCPH-70002 (v5.0 06/14/04 E)" + region: "PAL" + required: false + md5: "7ebb4fc5eab6f79a27d76ac9aad392b2" + region_check: true + fast_boot: Type2 + priority: 150 + source_ref: "src/core/bios.cpp:114" + + - name: "ps2_dtlh70002.bin" + description: "PS2, DTL-H70002 (v5.0 06/14/04 E)" + region: "PAL" + required: false + md5: "63ead1d74893bf7f36880af81f68a82d" + region_check: true + fast_boot: Type2 + priority: 150 + source_ref: "src/core/bios.cpp:115" + + - name: "ps2_scph70005.bin" + description: "PS2, SCPH-70005/SCPH-70006/SCPH-70007 (v5.0 06/14/04 J)" + region: "NTSC-J" + required: false + md5: "3e3e030c0f600442fa05b94f87a1e238" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:116" + + - name: "ps2_desr5500.bin" + description: "PS2, DESR-5500/DESR-5700/DESR-7500/DESR-7700 (v5.0 09/17/04 J)" + region: "NTSC-J" + required: false + md5: "1ad977bb539fc9448a08ab276a836bbc" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:117" + + - name: "ps2_dtlh75000.bin" + description: "PS2, DTL-H75000 (v5.0 06/20/05 J)" + region: "NTSC-J" + required: false + md5: "bf0078ba5e19d57eae18047407f3b6e5" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:118" + + - name: "ps2_scph75000.bin" + description: "PS2, SCPH-75000 (v5.0 06/20/05 J)" + region: "NTSC-J" + required: false + md5: "eb4f40fcf4911ede39c1bbfe91e7a89a" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:119" + + - name: "ps2_dtlh75000a.bin" + description: "PS2, DTL-H75000A (v5.0 06/20/05 A)" + region: "NTSC-U" + required: false + md5: "9959ad7a8685cad66206e7752ca23f8b" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:120" + + - name: "ps2_scph75001.bin" + description: "PS2, SCPH-75001/SCPH-75010 (v5.0 06/20/05 A)" + region: "NTSC-U" + required: false + md5: "929a14baca1776b00869f983aa6e14d2" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:121" + + - name: "ps2_scph75002.bin" + description: "PS2, SCPH-75002/SCPH-75003/SCPH-75004/SCPH-75008 (v5.0 06/20/05 E)" + region: "PAL" + required: false + md5: "573f7d4a430c32b3cc0fd0c41e104bbd" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:122" + + - name: "ps2_scph75006.bin" + description: "PS2, SCPH-75006 (v5.0 06/20/05 J)" + region: "NTSC-J" + required: false + md5: "df63a604e8bff5b0599bd1a6c2721bd0" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:123" + + - name: "ps2_scph77000.bin" + description: "PS2, SCPH-77000 (v5.0 02/10/06 J)" + region: "NTSC-J" + required: false + md5: "5b1ba4bb914406fae75ab8e38901684d" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:124" + + - name: "ps2_scph77001.bin" + description: "PS2, SCPH-77001/SCPH-77010 (v5.0 02/10/06 A)" + region: "NTSC-U" + required: false + md5: "cb801b7920a7d536ba07b6534d2433ca" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:125" + + - name: "ps2_scph77002.bin" + description: "PS2, SCPH-77002/SCPH-77003/SCPH-77004/SCPH-77008 (v5.0 02/10/06 E)" + region: "PAL" + required: false + md5: "af60e6d1a939019d55e5b330d24b1c25" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:126" + + - name: "ps2_scph77006.bin" + description: "PS2, SCPH-77006/SCPH-77007 (v5.0 02/10/06 J)" + region: "NTSC-J" + required: false + md5: "549a66d0c698635ca9fa3ab012da7129" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:127" + + - name: "ps2_dtlh90000_j.bin" + description: "PS2, DTL-H90000 (v5.0 09/05/06 J)" + region: "NTSC-J" + required: false + md5: "5e2014472c88f74f7547d8c2c60eca45" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:128" + + - name: "ps2_scph79000_90000.bin" + description: "PS2, SCPH-79000/SCPH-90000 (v5.0 09/05/06 J)" + region: "NTSC-J" + required: false + md5: "5de9d0d730ff1e7ad122806335332524" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:129" + + - name: "ps2_dtlh90000_a.bin" + description: "PS2, DTL-H90000 (v5.0 09/05/06 A)" + region: "NTSC-U" + required: false + md5: "21fe4cad111f7dc0f9af29477057f88d" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:130" + + - name: "ps2_scph79001_90001.bin" + description: "PS2, SCPH-79001/SCPH-79010/SCPH-90001 (v5.0 09/05/06 A)" + region: "NTSC-U" + required: false + md5: "40c11c063b3b9409aa5e4058e984e30c" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:131" + + - name: "ps2_scph79002_90002.bin" + description: "PS2, SCPH-79002/SCPH-79003/SCPH-79004/SCPH-79008/SCPH-90002/SCPH-90003/SCPH-90004 (v5.0 09/05/06 E)" + region: "PAL" + required: false + md5: "80bbb237a6af9c611df43b16b930b683" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:132" + + - name: "ps2_scph79006_90006.bin" + description: "PS2, SCPH-79006/SCPH-79007/SCPH-90006/SCPH-90007 (v5.0 09/05/06 J)" + region: "NTSC-J" + required: false + md5: "c37bce95d32b2be480f87dd32704e664" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:133" + + - name: "ps2_scph90000_0220.bin" + description: "PS2, SCPH-90000 (v5.0 02/20/08 J)" + region: "NTSC-J" + required: false + md5: "80ac46fa7e77b8ab4366e86948e54f83" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:134" + + - name: "ps2_scph90001_0220.bin" + description: "PS2, SCPH-90001/SCPH-90010 (v5.0 02/20/08 A)" + region: "NTSC-U" + required: false + md5: "21038400dc633070a78ad53090c53017" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:135" + + - name: "ps2_scph90002_0220.bin" + description: "PS2, SCPH-90002/SCPH-90003/SCPH-90004/SCPH-90008 (v5.0 02/20/08 E)" + region: "PAL" + required: false + md5: "dc69f0643a3030aaa4797501b483d6c4" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:136" + + - name: "ps2_scph90005_0220.bin" + description: "PS2, SCPH-90005/SCPH-90006/SCPH-90007 (v5.0 02/20/08 J)" + region: "NTSC-J" + required: false + md5: "30d56e79d89fbddf10938fa67fe3f34e" + region_check: true + fast_boot: Type2 + priority: 100 + source_ref: "src/core/bios.cpp:137" + + - name: "ps2_kdl22px300.bin" + description: "PS2, KDL-22PX300 (v5.0 04/15/10 E)" + region: "PAL" + required: false + md5: "93ea3bcee4252627919175ff1b16a1d9" + region_check: true + fast_boot: Type2 + priority: 150 + source_ref: "src/core/bios.cpp:138" + notes: "Sony Bravia TV with embedded PS2" + + # -- OpenBIOS (signature-based detection, no fixed hash) -- + + - name: "openbios.bin" + description: "OpenBIOS" + region: "Auto" + required: false + md5: null + region_check: false + fast_boot: unsupported + priority: 200 + source_ref: "src/core/bios.cpp:144-146" + notes: "Detected by 'OpenBIOS' signature at offset 0x78, not by MD5 hash" diff --git a/emulators/flycast.yml b/emulators/flycast.yml new file mode 100644 index 00000000..ade9e064 --- /dev/null +++ b/emulators/flycast.yml @@ -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" diff --git a/emulators/melonds.yml b/emulators/melonds.yml new file mode 100644 index 00000000..0b2aae2e --- /dev/null +++ b/emulators/melonds.yml @@ -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)" diff --git a/emulators/pcsx2.yml b/emulators/pcsx2.yml new file mode 100644 index 00000000..0ab4e681 --- /dev/null +++ b/emulators/pcsx2.yml @@ -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: ".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: ".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: ".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: ".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: ".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: ".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. diff --git a/emulators/ppsspp.yml b/emulators/ppsspp.yml new file mode 100644 index 00000000..58f165ef --- /dev/null +++ b/emulators/ppsspp.yml @@ -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. diff --git a/emulators/rpcs3.yml b/emulators/rpcs3.yml new file mode 100644 index 00000000..4a34af92 --- /dev/null +++ b/emulators/rpcs3.yml @@ -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. diff --git a/emulators/vita3k.yml b/emulators/vita3k.yml new file mode 100644 index 00000000..3ce0621f --- /dev/null +++ b/emulators/vita3k.yml @@ -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. diff --git a/emulators/xemu.yml b/emulators/xemu.yml new file mode 100644 index 00000000..853b2773 --- /dev/null +++ b/emulators/xemu.yml @@ -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= + + - 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: /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" diff --git a/platforms/_registry.yml b/platforms/_registry.yml index 80605266..7580d74b 100644 --- a/platforms/_registry.yml +++ b/platforms/_registry.yml @@ -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) diff --git a/schemas/emulator.schema.json b/schemas/emulator.schema.json new file mode 100644 index 00000000..bdcc2032 --- /dev/null +++ b/schemas/emulator.schema.json @@ -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" } + } + } + } + } +} diff --git a/scripts/cross_reference.py b/scripts/cross_reference.py new file mode 100644 index 00000000..f2a3db60 --- /dev/null +++ b/scripts/cross_reference.py @@ -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() diff --git a/scripts/generate_pack.py b/scripts/generate_pack.py index 0de565f9..561fb43c 100644 --- a/scripts/generate_pack.py +++ b/scripts/generate_pack.py @@ -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()