From ebb55a445b6d8b8cc14cb8313bfa08a786b45642 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Wed, 25 Mar 2026 07:00:17 +0100 Subject: [PATCH] feat: re-profile 40 emulators, harden CI workflows profile emulators pd777 through tic80, add frozen snapshots (puae2021, snes9x2002/2005/2010, stella2014/2023). CI: replace github-script with gh CLI, add test execution, job-level permissions, propagate changed output, pin jsonschema. --- .github/workflows/build.yml | 21 +- .github/workflows/validate.yml | 100 ++++--- database.json | 32 ++- emulators/pd777.yml | 12 +- emulators/play.yml | 81 ++---- emulators/pocketcdg.yml | 11 +- emulators/potator.yml | 6 +- emulators/ppsspp.yml | 165 +++--------- emulators/prboom.yml | 9 +- emulators/prosystem.yml | 54 ++-- emulators/puae.yml | 32 ++- emulators/puae2021.yml | 295 +++++++++++++++++++++ emulators/puzzlescript.yml | 19 +- emulators/px68k.yml | 4 +- emulators/qemu.yml | 350 ++++++++++++++++--------- emulators/quasi88.yml | 76 +++--- emulators/quicknes.yml | 7 +- emulators/race.yml | 54 ++-- emulators/redbook.yml | 12 +- emulators/reminiscence.yml | 56 ++-- emulators/remotejoy.yml | 14 +- emulators/retro8.yml | 23 +- emulators/retrodream.yml | 72 +++-- emulators/romcleaner.yml | 14 +- emulators/rustation.yml | 119 ++++++--- emulators/rvvm.yml | 104 +++----- emulators/same_cdi.yml | 333 ++++++++++------------- emulators/sameboy.yml | 121 +++------ emulators/sameduck.yml | 29 +- emulators/scummvm.yml | 5 +- emulators/sdlpal.yml | 219 +++++++++------- emulators/simcp.yml | 20 +- emulators/skyemu.yml | 76 +++++- emulators/smsplus.yml | 85 +++--- emulators/snes9x.yml | 128 ++------- emulators/snes9x2002.yml | 23 ++ emulators/snes9x2005.yml | 25 ++ emulators/snes9x2005_plus.yml | 26 ++ emulators/snes9x2010.yml | 40 +++ emulators/squirreljme.yml | 96 +++---- emulators/stella.yml | 61 +---- emulators/stella2014.yml | 60 +++++ emulators/stella2023.yml | 73 ++++++ emulators/stonesoup.yml | 43 ++- emulators/superbroswar.yml | 12 +- emulators/swanstation.yml | 84 +++++- emulators/syobonaction.yml | 252 +++++++++++++++++- emulators/tamalibretro.yml | 19 +- emulators/tempgba.yml | 26 +- emulators/test.yml | 12 +- emulators/test_netplay.yml | 18 +- emulators/testaudio_callback.yml | 10 +- emulators/testaudio_no_callback.yml | 13 +- emulators/testaudio_playback_wav.yml | 13 +- emulators/testgl.yml | 12 +- emulators/testgl_compute_shaders.yml | 9 +- emulators/testgl_ff.yml | 14 +- emulators/testinput_buttontest.yml | 13 +- emulators/testretroluxury.yml | 15 +- emulators/testsw.yml | 13 +- emulators/testsw_vram.yml | 13 +- emulators/testvulkan.yml | 8 +- emulators/testvulkan_async_compute.yml | 12 +- emulators/tgbdual.yml | 25 +- emulators/theodore.yml | 11 +- emulators/thepowdertoy.yml | 11 +- emulators/tic80.yml | 33 +-- platforms/_data_dirs.yml | 10 + scripts/common.py | 18 +- 69 files changed, 2337 insertions(+), 1544 deletions(-) create mode 100644 emulators/puae2021.yml create mode 100644 emulators/snes9x2002.yml create mode 100644 emulators/snes9x2005.yml create mode 100644 emulators/snes9x2005_plus.yml create mode 100644 emulators/snes9x2010.yml create mode 100644 emulators/stella2014.yml create mode 100644 emulators/stella2023.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 966afd33..b9226067 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,9 +11,7 @@ on: type: boolean default: false -permissions: - contents: write - pages: write +permissions: {} concurrency: group: build @@ -22,6 +20,11 @@ concurrency: jobs: regenerate: runs-on: ubuntu-latest + permissions: + contents: write + pages: write + outputs: + changed: ${{ steps.commit.outputs.changed }} steps: - uses: actions/checkout@v6 @@ -57,6 +60,9 @@ jobs: python scripts/generate_readme.py --db database.json --platforms-dir platforms python scripts/generate_site.py + - name: Run tests + run: python -m unittest tests.test_e2e -v + - name: Deploy site to GitHub Pages if: github.ref == 'refs/heads/main' run: mkdocs gh-deploy --force --clean @@ -74,8 +80,10 @@ jobs: release: needs: regenerate - if: needs.regenerate.result == 'success' || github.event.inputs.force_release == 'true' + if: (needs.regenerate.outputs.changed == 'true' || github.event.inputs.force_release == 'true') runs-on: ubuntu-latest + permissions: + contents: write steps: - name: Rate limit if: github.event.inputs.force_release != 'true' @@ -105,6 +113,10 @@ jobs: with: python-version: "3.12" + - name: Install dependencies + if: steps.rate.outputs.skip != 'true' + run: pip install pyyaml + - name: Refresh data directories if: steps.rate.outputs.skip != 'true' run: python scripts/refresh_data_dirs.py @@ -113,7 +125,6 @@ jobs: - name: Build packs if: steps.rate.outputs.skip != 'true' run: | - pip install pyyaml python scripts/generate_db.py --bios-dir bios --output database.json python scripts/generate_pack.py --all --output-dir dist/ diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 33895de7..836989ee 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -31,8 +31,11 @@ jobs: - name: Get changed BIOS files id: changed + env: + BASE_SHA: ${{ github.event.pull_request.base.sha }} + HEAD_SHA: ${{ github.event.pull_request.head.sha }} run: | - files=$(git diff --name-only ${{ github.event.pull_request.base.sha }}...${{ github.event.pull_request.head.sha }} | grep '^bios/' || true) + files=$(git diff --name-only "$BASE_SHA"..."$HEAD_SHA" | grep '^bios/' || true) echo "files=$files" >> "$GITHUB_OUTPUT" echo "$files" > /tmp/changed_files.txt @@ -46,17 +49,11 @@ jobs: fi - name: Post validation report - uses: actions/github-script@v8 - with: - script: | - const fs = require('fs'); - const report = fs.readFileSync('/tmp/report.md', 'utf8'); - await github.rest.issues.createComment({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: context.issue.number, - body: report - }); + if: always() + run: | + gh pr comment "${{ github.event.pull_request.number }}" --body-file /tmp/report.md + env: + GH_TOKEN: ${{ github.token }} validate-configs: runs-on: ubuntu-latest @@ -68,7 +65,7 @@ jobs: python-version: "3.12" - name: Install dependencies - run: pip install pyyaml jsonschema + run: pip install pyyaml jsonschema==4.23.0 - name: Validate platform configs run: | @@ -88,15 +85,30 @@ jobs: config = yaml.safe_load(f) try: validate(config, schema) - print(f'✅ {yml_file.name}') + print(f'OK {yml_file.name}') except ValidationError as e: errors.append(f'{yml_file.name}: {e.message}') - print(f'❌ {yml_file.name}: {e.message}') + print(f'FAIL {yml_file.name}: {e.message}') if errors: sys.exit(1) " + run-tests: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + + - uses: actions/setup-python@v6 + with: + python-version: "3.12" + + - name: Install dependencies + run: pip install pyyaml + + - name: Run test suite + run: python -m unittest tests.test_e2e -v + label-pr: runs-on: ubuntu-latest permissions: @@ -107,43 +119,25 @@ jobs: fetch-depth: 0 - name: Auto-label PR - uses: actions/github-script@v8 - with: - script: | - const { data: files } = await github.rest.pulls.listFiles({ - owner: context.repo.owner, - repo: context.repo.repo, - pull_number: context.issue.number, - }); + run: | + labels="" + files=$(gh pr diff "${{ github.event.pull_request.number }}" --name-only) - const labels = new Set(); + if echo "$files" | grep -q '^bios/'; then + labels="$labels bios" + for sys in $(echo "$files" | grep '^bios/' | cut -d/ -f2 | sort -u); do + labels="$labels system:$(echo "$sys" | tr '[:upper:]' '[:lower:]')" + done + fi + if echo "$files" | grep -q '^platforms/'; then + labels="$labels platform-config" + fi + if echo "$files" | grep -q '^scripts/'; then + labels="$labels automation" + fi - for (const file of files) { - if (file.filename.startsWith('bios/')) { - labels.add('bios'); - // Extract system from path - const parts = file.filename.split('/'); - if (parts.length >= 3) { - labels.add(`system:${parts[1].toLowerCase()}`); - } - } - if (file.filename.startsWith('platforms/')) { - labels.add('platform-config'); - } - if (file.filename.startsWith('scripts/')) { - labels.add('automation'); - } - } - - if (labels.size > 0) { - try { - await github.rest.issues.addLabels({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: context.issue.number, - labels: [...labels], - }); - } catch (e) { - console.log('Could not add labels:', e.message); - } - } + for label in $labels; do + gh pr edit "${{ github.event.pull_request.number }}" --add-label "$label" 2>/dev/null || true + done + env: + GH_TOKEN: ${{ github.token }} diff --git a/database.json b/database.json index af32fbb0..cd8479c6 100644 --- a/database.json +++ b/database.json @@ -1,5 +1,5 @@ { - "generated_at": "2026-03-24T21:16:05Z", + "generated_at": "2026-03-25T05:56:02Z", "total_files": 6733, "total_size": 5288644732, "files": { @@ -93684,6 +93684,10 @@ "4ed31ec6b0b175bb109c0eb5fd3d193da823339f", "1db57a1e8b6e4096f811587f9eab0c6675fd9755" ], + "dmg0_rom.bin": [ + "4ed31ec6b0b175bb109c0eb5fd3d193da823339f", + "1db57a1e8b6e4096f811587f9eab0c6675fd9755" + ], "sgb_bios.bin": [ "aa2f50a77dfb4823da96ba99309085a3c6278515", "369e6eb5e0c975eaa52a4a3f6ee07b2a3c3c16de", @@ -95178,9 +95182,6 @@ "DMG_ROM.bin": [ "1db57a1e8b6e4096f811587f9eab0c6675fd9755" ], - "dmg0_rom.bin": [ - "1db57a1e8b6e4096f811587f9eab0c6675fd9755" - ], "amiga-os-300-a4000.rom": [ "f0b4e9e29e12218c2d5bd7020e4e785297d91fd7" ], @@ -95211,6 +95212,9 @@ "terak.rom": [ "273a9933b68a290c5aedcd6d69faa7b1d22c0344" ], + "BS-X.bios": [ + "604556b2e62860af18db5a77f2956ebc75450020" + ], "upd7801g.bin": [ "6e89d1227581c76441a53d605f9e324185f1da33" ], @@ -95220,9 +95224,6 @@ "FdsBios.bin": [ "57fe1bdee955bb48d357e463ccbf129496930b62" ], - "BS-X.bios": [ - "604556b2e62860af18db5a77f2956ebc75450020" - ], "N88_0.ROM": [ "d1ae642aed4f0584eeb81ff50180db694e5101d4" ], @@ -95292,6 +95293,14 @@ "2608_RYM.WAV": [ "c65592330c9dd84011151daed52f9aec926b7e56" ], + "cgb0_boot.bin": [ + "80e3ee82416c1a74827a5459fde32f04bf51a1f6", + "1293d68bf9643bc4f36954c1e80e38f39864528d" + ], + "cgb_agb_boot.bin": [ + "80e3ee82416c1a74827a5459fde32f04bf51a1f6", + "1293d68bf9643bc4f36954c1e80e38f39864528d" + ], "dc_flash_wb.bin": [ "72c65f2a11ee7b72b77b9945187b7a332632e14a" ], @@ -95310,12 +95319,6 @@ "epr-21576d.bin": [ "6d27d71aec4dfba98f66316ae74a1426d567698a" ], - "cgb0_boot.bin": [ - "1293d68bf9643bc4f36954c1e80e38f39864528d" - ], - "cgb_agb_boot.bin": [ - "1293d68bf9643bc4f36954c1e80e38f39864528d" - ], "nds_sd_card.bin": [ "3b71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3" ], @@ -115616,9 +115619,9 @@ "9d76f3eefd64e032c763fa1ebf9cd3d9bd22317a", "34fa37599f2f9eb607390ef2458a3c22d87f09a9", "273a9933b68a290c5aedcd6d69faa7b1d22c0344", + "604556b2e62860af18db5a77f2956ebc75450020", "6e89d1227581c76441a53d605f9e324185f1da33", "57fe1bdee955bb48d357e463ccbf129496930b62", - "604556b2e62860af18db5a77f2956ebc75450020", "d1ae642aed4f0584eeb81ff50180db694e5101d4", "4ae4d37409ff99411a623da9f6a44192170a854e", "e94278682ef9e9bbb82201f72c50382748dcea2a", @@ -115636,6 +115639,7 @@ "db1031585968cfc6ec2ecda5c9a5a52f61444a3b", "b4f14e58030ed40fff2dc312b58ea4440bdf8cc5", "c65592330c9dd84011151daed52f9aec926b7e56", + "80e3ee82416c1a74827a5459fde32f04bf51a1f6", "72c65f2a11ee7b72b77b9945187b7a332632e14a", "6d27d71aec4dfba98f66316ae74a1426d567698a", "1293d68bf9643bc4f36954c1e80e38f39864528d", diff --git a/emulators/pd777.yml b/emulators/pd777.yml index 33c93213..440c723f 100644 --- a/emulators/pd777.yml +++ b/emulators/pd777.yml @@ -1,7 +1,9 @@ emulator: PD777 type: libretro -source: "https://github.com/W88DodPECuThLOl/PD777" -profiled_date: "2026-03-18" +core_classification: community_fork +source: "https://github.com/mittonk/PD777" +upstream: "https://github.com/W88DodPECuThLOl/PD777" +profiled_date: "2026-03-24" core_version: "v1.0.0" display_name: "Epoch - Cassette Vision (PD777)" cores: @@ -10,12 +12,12 @@ systems: - epochcv notes: | - PD777 is an Epoch Cassette Vision emulator (NEC uPD777C CPU) with a libretro - interface, by W88DodPECuThLOl. + PD777 is an Epoch Cassette Vision emulator (NEC uPD777C CPU), by + W88DodPECuThLOl. Libretro port by Ken Mitton (mittonk). No BIOS or firmware files required. The .info file declares firmware_count = 0. - Game loading in source/libretro/libretro.cpp:retro_load_game() (line 386-474). + Game loading in source/libretro/libretro.cpp:retro_load_game() (line 404-532). The core loads a code ROM file (.bin777) directly from the content path, then attempts to load a pattern ROM file (.ptn777) by replacing the extension. diff --git a/emulators/play.yml b/emulators/play.yml index fb8786ea..78bb1a7e 100644 --- a/emulators/play.yml +++ b/emulators/play.yml @@ -1,63 +1,34 @@ -# Play! emulator BIOS profile -# Generated from source analysis of https://github.com/jpd002/Play- -# Commit analyzed: HEAD as of 2026-03-17 - -emulator: "Play!" +emulator: play type: libretro -core_name: play_libretro +core_classification: official_port source: "https://github.com/jpd002/Play-" -profiled_date: "2026-03-18" +upstream: "https://github.com/jpd002/Play-" +profiled_date: "2026-03-24" core_version: "Git" display_name: "Sony - PlayStation 2 (Play!)" -systems: [sony-playstation-2] +cores: + - play +systems: + - sony-playstation-2 -bios_directory: null -bios_detection: "hle" -bios_selection: "not_applicable" - -validation: - method: "none" - note: > - Play! is a full HLE (High-Level Emulation) PS2 emulator. It does not load or - require any real PS2 BIOS dump. The LoadBIOS() function in Ee_SubSystem.cpp - (which would read ./vfs/rom0/scph10000.bin) is commented out in PS2VM.cpp:ResetVM(). - -files: [] - # No BIOS files required. - # IOP modules (rom0:SIO2MAN, rom0:PADMAN, rom0:MCMAN, rom0:MCSERV, etc.) - # are all replaced by HLE implementations in Source/iop/IopBios.cpp. - # The EE kernel/OS is reimplemented in Source/ee/PS2OS.cpp. - -virtual_filesystem: - # Play! uses a virtual filesystem for memory cards and disc access, - # but these are runtime directories, not BIOS files. - mc0: {default: "vfs/mc0", purpose: "Memory card slot 0 (save data)"} - mc1: {default: "vfs/mc1", purpose: "Memory card slot 1 (save data)"} - host: {default: "vfs/host", purpose: "Host filesystem access"} - cdrom0: {default: null, purpose: "Disc image (set per-game)"} - -memory_layout: - EE_RAM: {size: "32 MB (0x02000000)"} - EE_BIOS: {size: "4 MB (0x00400000)", note: "Allocated but unused, HLE replaces real BIOS"} - IOP_RAM: {size: "2 MB (0x00200000)"} - SPU_RAM: {size: "2 MB (0x00200000)"} +# Full HLE PS2 emulator by Jean-Philip Desjardins. +# All PS2 subsystems are reimplemented in C++: EE kernel (PS2OS.cpp), +# IOP BIOS modules (IopBios.cpp), GS, SPU2, VU units. +# The libretro core never calls RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY. +# +# LoadBIOS() exists in Ee_SubSystem.cpp:832 but is commented out at line 232. +# IOP modules (SIO2MAN, PADMAN, MCMAN, MCSERV, CDVDMAN, CDVDFSV, etc.) +# are all HLE-replaced via m_hleModules in IopBios.cpp:279-290. +# _IOP_EMULATE_MODULES=1 is unconditionally defined in CMakeLists.txt:24. +# +# source_ref: Source/ee/Ee_SubSystem.cpp:232 (LoadBIOS commented out) +# source_ref: Source/iop/IopBios.cpp:279-290 (HLE module table) +# source_ref: Source/PS2VM.cpp:483-537 (ResetVM — no BIOS loading) +# source_ref: Source/ui_libretro/main_libretro.cpp:546-568 (retro_init — no file I/O) +# source_ref: README.md:4 ("Using an external BIOS file is not necessary or possible.") +# source_ref: play_libretro.info (firmware_count absent = 0) notes: | - Play! does not require any PS2 BIOS files. Unlike PCSX2, it uses High-Level - Emulation to reimplement the PS2 kernel, IOP BIOS modules, and system services - entirely in C++. + Full HLE emulator. No BIOS or firmware files required. firmware_count=0 confirmed by source. - Key HLE components: - - EE kernel: Source/ee/PS2OS.cpp (handles BootFromCDROM, BootFromFile, syscalls) - - IOP BIOS: Source/iop/IopBios.cpp (HLE modules for rom0:PADMAN, MCMAN, MCSERV, etc.) - - No rom0/rom1/erom files are loaded at runtime - - The legacy LoadBIOS() function in Source/ee/Ee_SubSystem.cpp references - "./vfs/rom0/scph10000.bin" but this call is commented out in PS2VM::ResetVM() - and has no effect on emulation. - - mc2_ings.ico is not referenced anywhere in Play! source code. That file is - specific to PCSX2's memory card icon handling, not Play!. - - The libretro core supports: .elf, .iso, .cso, .isz, .bin disc images. - Extensions handled in main_libretro.cpp:retro_get_system_info(). +files: [] diff --git a/emulators/pocketcdg.yml b/emulators/pocketcdg.yml index 7cf4ae59..1c39b7cd 100644 --- a/emulators/pocketcdg.yml +++ b/emulators/pocketcdg.yml @@ -1,14 +1,15 @@ emulator: PocketCDG type: utility +core_classification: pure_libretro source: "https://github.com/libretro/libretro-pocketcdg" -profiled_date: "2026-03-18" +upstream: "https://github.com/redbug26/libretro-pocketcdg" +profiled_date: "2026-03-24" core_version: "Git" display_name: "PocketCDG" cores: [pocketcdg] systems: [] files: [] notes: > - CD+G (CD+Graphics) karaoke player for libretro. Renders the subcode - graphics channel from .cdg files synchronized with audio. - Loads .cdg content files directly. - No BIOS, firmware, or system directory files required. + CD+G (CD+Graphics) karaoke player. Renders subcode graphics from .cdg + files synchronized with MP3 audio. Font and MP3 decoder (libmad) + embedded in the binary. diff --git a/emulators/potator.yml b/emulators/potator.yml index cd65309d..21727c1e 100644 --- a/emulators/potator.yml +++ b/emulators/potator.yml @@ -1,8 +1,9 @@ emulator: Potator type: libretro core_classification: community_fork -source: "https://github.com/libretro/potern" -profiled_date: "2026-03-21" +source: "https://github.com/libretro/potator" +upstream: "https://github.com/alekmaul/potator" +profiled_date: "2026-03-24" core_version: "1.0.5" display_name: "Watara - Supervision (Potator)" cores: @@ -12,5 +13,6 @@ systems: notes: | Watara Supervision emulator. No BIOS required. + The Supervision has no BIOS ROM; games execute directly from cartridge. files: [] diff --git a/emulators/ppsspp.yml b/emulators/ppsspp.yml index 8c9b9858..abf4060f 100644 --- a/emulators/ppsspp.yml +++ b/emulators/ppsspp.yml @@ -1,141 +1,44 @@ -# 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" -logo: "https://raw.githubusercontent.com/hrydgard/ppsspp/master/icons/icon-512.svg" -profiled_date: "2026-03-18" +type: standalone + libretro +core_classification: official_port +source: "https://github.com/libretro/ppsspp" +upstream: "https://github.com/hrydgard/ppsspp" +profiled_date: "2026-03-24" core_version: "Git" display_name: "Sony - PlayStation Portable (PPSSPP)" +cores: + - 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. +pack_structure: + libretro: "PPSSPP" -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" +data_directories: + - ref: ppsspp-assets + destination: "" + source_ref: "libretro/libretro.cpp:537,549" 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. + Full HLE emulator. No Sony firmware or BIOS required. + All PSP kernel modules (flash0:/kd/*.prx) are reimplemented in C++. + Libretro core loads assets from system/PPSSPP/ via VFS. + Assets include replacement PGF fonts (18 files in flash0/font/), + game compatibility database (compat.ini), language mapping (langregion.ini), + and post-processing shaders (shaders/). + Libretro fork (2020-03-18) behind upstream. + PSP_DEFAULT_FIRMWARE = 660 (Core/ConfigValues.h:40). - 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. +files: + - name: "ppge_atlas.zim" + path: "PPSSPP/ppge_atlas.zim" + description: "PPGe dialog texture atlas for save/load dialogs, on-screen keyboard, system UI" + required: false + source_ref: "Core/Util/PPGeDraw.cpp:227-228" + note: "PanicAlert if missing. System dialogs render without graphics but core continues running." - 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. + - name: "ppge_atlas.meta" + path: "PPSSPP/ppge_atlas.meta" + description: "PPGe atlas metadata (glyph positions, UV coords)" + required: false + source_ref: "Core/Util/PPGeDraw.cpp:235-237" + note: "Loaded after ppge_atlas.zim. Without it, dialog UI has no glyph layout." diff --git a/emulators/prboom.yml b/emulators/prboom.yml index 59232d10..d5288eab 100644 --- a/emulators/prboom.yml +++ b/emulators/prboom.yml @@ -1,9 +1,12 @@ emulator: PrBoom type: libretro +core_classification: game_engine source: "https://github.com/libretro/libretro-prboom" -profiled_date: "2026-03-18" +upstream: "http://prboom.sourceforge.net/" +profiled_date: "2026-03-24" core_version: "v2.5.0" display_name: "Doom (PrBoom)" +cores: [prboom] systems: [doom] notes: | @@ -22,7 +25,7 @@ notes: | (d_main.c:1073-1074), so the file is technically optional but expected for correct rendering of menus, HUD digits, and extended features. - File search order (libretro.c I_FindFile, line 1743): + File search order (libretro.c I_FindFile, line 1742): 1. WAD directory (same folder as the loaded game WAD) 2. system/prboom/ subdirectory 3. system/ directory directly @@ -47,5 +50,5 @@ files: md5: "72ae1b47820fcc93cc0df9c428d0face" sha1: "5f4aed208301449c2e9514edfd325fe9dead76fa" crc32: "a5751b99" - source_ref: "d_main.c:1069-1078 (PACKAGE .wad load), libretro.c:1743-1780 (I_FindFile search), config.h:46 (PACKAGE=prboom)" + source_ref: "d_main.c:1069-1078 (PACKAGE .wad load), libretro.c:1742-1784 (I_FindFile search), config.h:46 (PACKAGE=prboom)" notes: "Searched in system/prboom/ then system/. Falls back to internal defaults if missing, but menus and HUD may render incorrectly without it." diff --git a/emulators/prosystem.yml b/emulators/prosystem.yml index eb5ec321..4a7709f4 100644 --- a/emulators/prosystem.yml +++ b/emulators/prosystem.yml @@ -1,7 +1,9 @@ emulator: ProSystem type: libretro +core_classification: community_fork source: "https://github.com/libretro/prosystem-libretro" -profiled_date: "2026-03-18" +upstream: "https://github.com/gstanton/ProSystem1_3" +profiled_date: "2026-03-24" core_version: "1.3e" display_name: "Atari - 7800 (ProSystem)" cores: @@ -10,51 +12,37 @@ systems: - atari-7800 notes: | - ProSystem is an Atari 7800 emulator ported to libretro. + Atari 7800 emulator by Greg Stanton, ported to libretro by community + contributors. The upstream is a Windows-only application with a single + user-configured BIOS path. The libretro port adds automatic region-based + BIOS selection: PAL carts get (E), everything else gets (U). - BIOS loading is in core/libretro.c:579-588. Region is read from the - cartridge header byte 57 (core/Cartridge.c:214) or overridden by the - internal database (core/Database.c). PAL carts get the (E) BIOS, - everything else gets (U). + Region is read from cartridge header byte 57 (core/Cartridge.c:214) or + overridden by the internal database (core/Database.c:1739-1757). - Both BIOS files are optional. The core runs games without them, but - some titles may have compatibility issues without the real BIOS - (startup encryption check, etc). bios_Store() maps the BIOS data - into the top of the 64K address space (65536 - bios_size). + Both BIOS files are optional. The core runs without them but some titles + have compatibility issues (startup encryption check). bios_Store() maps + the BIOS into ROM at address (65536 - bios_size). - No core option controls BIOS loading -- if the file exists in the - system directory, it is loaded automatically. + No core option controls BIOS loading. If the file exists in the system + directory, it is loaded automatically. No hash or size validation is + performed on the BIOS file. + + The .info declares firmware_count=1 (U only), missing the PAL BIOS. files: - name: "7800 BIOS (U).rom" system: atari-7800 required: false hle_fallback: true - size: 4096 # 4 KB - note: "NTSC/US Atari 7800 BIOS. Loaded when cartridge_region != REGION_PAL." + size: 4096 + description: "NTSC/US BIOS, loaded when cartridge_region != REGION_PAL" source_ref: "core/libretro.c:585" - name: "7800 BIOS (E).rom" system: atari-7800 required: false hle_fallback: true - size: 16384 # 16 KB (PAL BIOS is larger than NTSC) - note: "PAL/EU Atari 7800 BIOS. Loaded when cartridge_region == REGION_PAL." + size: 16384 + description: "PAL/EU BIOS, loaded when cartridge_region == REGION_PAL" source_ref: "core/libretro.c:583" - -platform_details: - bios_mapping: - target: "top of 64K memory (65536 - bios_size)" - source_ref: "core/Bios.c:88" - notes: | - bios_Store() writes the BIOS into ROM at address (65536 - bios_size). - The BIOS size is read dynamically from the file, not hardcoded. - bios_enabled flag is set only if bios_Load() succeeds (file found - and read without error). - - region_detection: - source_ref: "core/Cartridge.c:214, core/Database.c" - notes: | - Region byte is at offset 57 in the A7800 cartridge header. - The internal database (Database.c) can override the header value. - REGION_NTSC = 0, REGION_PAL = 1 (defined in Region.h). diff --git a/emulators/puae.yml b/emulators/puae.yml index 35b9b368..aff86fd6 100644 --- a/emulators/puae.yml +++ b/emulators/puae.yml @@ -1,9 +1,11 @@ emulator: PUAE (P-UAE) type: libretro -cores: [puae, puae2021] +core_classification: community_fork +cores: [puae] source: "https://github.com/libretro/libretro-uae" -profiled_date: "2026-03-18" -core_version: "5.3.0" +upstream: "https://github.com/GnoStiC/PUAE" +profiled_date: "2026-03-24" +core_version: "5.3.1" display_name: "Commodore - Amiga (PUAE)" systems: - commodore-amiga @@ -41,7 +43,8 @@ notes: | WHDLoad support copies kick33180.A500, kick34005.A500, kick40063.A600, kick40068.A1200 into saves/WHDLoad/Devs/Kickstarts/ for use by WHDLoad - slave files. + slave files. Also copies rom.key (Amiga Forever decryption) and WHDLoad.key + (license) from the system directory. ROM search order (libretro-core.c retro_config_kickstart): 1. Exact filename in system directory @@ -232,6 +235,27 @@ files: - "CD32 Extended-ROM rev 40.60 (1993)(Commodore)(CD32).rom" source_ref: "libretro/libretro-core.h:241-244" + # ------------------------------------------------------- + # WHDLoad support files + # ------------------------------------------------------- + - name: "rom.key" + system: commodore-amiga + required: false + note: "Amiga Forever ROM decryption key. Copied to saves/WHDLoad/Devs/Kickstarts/ for WHDLoad." + source_ref: "libretro/libretro-core.c:5969-5980" + + - name: "WHDLoad.key" + system: commodore-amiga + required: false + note: "WHDLoad license key. Copied to saves/WHDLoad/L/ for registered WHDLoad use." + source_ref: "libretro/libretro-core.c:5985-5998" + + - name: "WHDLoad.prefs" + system: commodore-amiga + required: false + note: "WHDLoad preferences. Copied to saves/WHDLoad/S/ when present." + source_ref: "libretro/libretro-core.c:6002-6025" + model_kickstart_map: A500: {kickstart: "kick34005.A500", ext: null} A500OG: {kickstart: "kick34005.A500", ext: null} diff --git a/emulators/puae2021.yml b/emulators/puae2021.yml new file mode 100644 index 00000000..9b98f4f0 --- /dev/null +++ b/emulators/puae2021.yml @@ -0,0 +1,295 @@ +emulator: PUAE 2021 +type: libretro +core_classification: frozen_snapshot +cores: [puae2021] +source: "https://github.com/libretro/libretro-uae/tree/2.6.1" +upstream: "https://github.com/GnoStiC/PUAE" +profiled_date: "2026-03-24" +core_version: "2.6.1" +display_name: "Commodore - Amiga (PUAE 2021)" +systems: + - commodore-amiga + - commodore-amiga-cd32 + - commodore-cdtv + +notes: | + Frozen snapshot of PUAE at WinUAE 2.6.1 era. Less accurate than current PUAE + (5.x), intended for weaker devices. BIOS handling is identical to the current + version. + + PUAE is a port of UAE (Unix Amiga Emulator) to libretro, continuing E-UAE. + Emulates A500, 500+, 600, 1200, 2000, 4000, CD32, and CDTV. Kickstart ROMs + are loaded from the RetroArch system directory. + + AROS (open-source Kickstart replacement) is available as a built-in fallback + when no Kickstart ROM is found. Compatibility is limited compared to real ROMs. + + The core scans the system directory for files starting with "kick", "amiga-os", + or "KS ROM". Each filename is matched against a table of known naming + conventions: standard (kick*.A*), Amiga Forever (amiga-os-*.rom), and + TOSEC (Kickstart v*.rom). The first valid match is used. + + Default kickstart per model (automatic selection): + A500, A500OG, A2000OG, CDTV -> kick34005.A500 (KS 1.3) + A500+ -> kick37175.A500 (KS 2.04) + A600 -> kick40063.A600 (KS 3.1) + A1200, A1200OG -> kick40068.A1200 (KS 3.1) + A2000 -> kick40063.A600 (KS 3.1) + A4030, A4040 -> kick40068.A4000 (KS 3.1) + CD32, CD32FR -> kick40060.CD32 (KS 3.1) + CDTV (ext) -> kick34005.CDTV + CD32 (ext) -> kick40060.CD32.ext + + Extended ROM handling: CD32 and CDTV require an extended ROM in addition + to the main kickstart. If the main ROM filesize is <= 512 KB, the extended + ROM is loaded separately. Combined ROMs (main + ext in one file) skip the + extended ROM search. + + WHDLoad support copies kick33180.A500, kick34005.A500, kick40063.A600, + kick40068.A1200 into saves/WHDLoad/Devs/Kickstarts/ for use by WHDLoad + slave files. Also copies rom.key (Amiga Forever decryption) and WHDLoad.key + (license) from the system directory. + + ROM search order (libretro-core.c retro_config_kickstart): + 1. Exact filename in system directory + 2. Amiga Forever naming (amiga-os-*.rom) + 3. TOSEC modified naming (with [!] suffix) + 4. TOSEC naming (without [!] suffix) + + capsimg.so/capsimg.dll is an optional shared library for IPF floppy image + support (SPS/CAPS format). Not a BIOS file, loaded dynamically at runtime. + + Source: libretro/libretro-core.h:140-245, libretro/libretro-core.c:5534-5700, + libretro/libretro-core.c:5786-5945 + +files: + # ------------------------------------------------------- + # Amiga 1000 + # ------------------------------------------------------- + - name: "kick31034.A1000" + system: commodore-amiga + required: false + hle_fallback: true + size: 262144 # 256 KB + note: "Kickstart 1.1 rev 31.34 (1985) NTSC. A1000 only." + aliases: + - "amiga-os-110-ntsc.rom" + - "Kickstart v1.1 rev 31.34 (1985)(Commodore)(A1000)(NTSC).rom" + source_ref: "libretro/libretro-core.h:170-174" + + - name: "kick32034.A1000" + system: commodore-amiga + required: false + hle_fallback: true + size: 262144 # 256 KB + note: "Kickstart 1.1 rev 32.34 (1986) PAL. A1000 only." + aliases: + - "amiga-os-110-pal.rom" + - "Kickstart v1.1 rev 32.34 (1986)(Commodore)(A1000)(PAL).rom" + source_ref: "libretro/libretro-core.h:176-179" + + # ------------------------------------------------------- + # Amiga 500 / 2000 + # ------------------------------------------------------- + - name: "kick33180.A500" + system: commodore-amiga + required: false + hle_fallback: true + size: 262144 # 256 KB + note: "Kickstart 1.2 rev 33.180 (1986). A500/A2000. Also used by WHDLoad." + aliases: + - "amiga-os-120.rom" + - "Kickstart v1.2 rev 33.180 (1986)(Commodore)(A500-A2000)[!].rom" + - "Kickstart v1.2 rev 33.180 (1986)(Commodore)(A500-A1000-A2000).rom" + source_ref: "libretro/libretro-core.h:182-185" + + - name: "kick34005.A500" + system: commodore-amiga + required: true + size: 262144 # 256 KB + note: "Kickstart 1.3 rev 34.5 (1987). Default for A500/A2000OG/CDTV models. Also used by WHDLoad." + aliases: + - "amiga-os-130.rom" + - "Kickstart v1.3 rev 34.5 (1987)(Commodore)(A500-A1000-A2000-CDTV)[!].rom" + - "Kickstart v1.3 rev 34.5 (1987)(Commodore)(A500-A1000-A2000-CDTV).rom" + source_ref: "libretro/libretro-core.h:187-190" + + - name: "kick37175.A500" + system: commodore-amiga + required: false + hle_fallback: true + size: 262144 # 256 KB + note: "Kickstart 2.04 rev 37.175 (1991). Default for A500+ model." + aliases: + - "amiga-os-204.rom" + - "Kickstart v2.04 rev 37.175 (1991)(Commodore)(A500+)[!].rom" + - "Kickstart v2.04 rev 37.175 (1991)(Commodore)(A500+).rom" + source_ref: "libretro/libretro-core.h:192-195" + + # ------------------------------------------------------- + # Amiga 600 + # ------------------------------------------------------- + - name: "kick37350.A600" + system: commodore-amiga + required: false + hle_fallback: true + size: 262144 # 256 KB + note: "Kickstart 2.05 rev 37.350 (1992). A600HD." + aliases: + - "amiga-os-205-a600.rom" + - "Kickstart v2.05 rev 37.350 (1992)(Commodore)(A600HD)[!].rom" + source_ref: "libretro/libretro-core.h:198-201" + + - name: "kick40063.A600" + system: commodore-amiga + required: false + hle_fallback: true + size: 524288 # 512 KB + note: "Kickstart 3.1 rev 40.63 (1993). Default for A600/A2000 models. Also used by WHDLoad." + aliases: + - "amiga-os-310-a600.rom" + - "Kickstart v3.1 rev 40.63 (1993)(Commodore)(A500-A600-A2000)[!].rom" + - "Kickstart v3.1 rev 40.63 (1993)(Commodore)(A500-A600-A2000).rom" + source_ref: "libretro/libretro-core.h:203-206" + + # ------------------------------------------------------- + # Amiga 1200 + # ------------------------------------------------------- + - name: "kick39106.A1200" + system: commodore-amiga + required: false + hle_fallback: true + size: 524288 # 512 KB + note: "Kickstart 3.0 rev 39.106 (1992). A1200." + aliases: + - "amiga-os-300-a1200.rom" + - "Kickstart v3.0 rev 39.106 (1992)(Commodore)(A1200)[!].rom" + source_ref: "libretro/libretro-core.h:209-212" + + - name: "kick40068.A1200" + system: commodore-amiga + required: true + size: 524288 # 512 KB + note: "Kickstart 3.1 rev 40.68 (1993). Default for A1200/A1200OG models. Also used by WHDLoad." + aliases: + - "amiga-os-310-a1200.rom" + - "Kickstart v3.1 rev 40.68 (1993)(Commodore)(A1200)[!].rom" + - "Kickstart v3.1 rev 40.68 (1993)(Commodore)(A1200).rom" + source_ref: "libretro/libretro-core.h:214-217" + + # ------------------------------------------------------- + # Amiga 4000 + # ------------------------------------------------------- + - name: "kick39106.A4000" + system: commodore-amiga + required: false + hle_fallback: true + size: 524288 # 512 KB + note: "Kickstart 3.0 rev 39.106 (1992). A4000." + aliases: + - "amiga-os-300-a4000.rom" + - "Kickstart v3.0 rev 39.106 (1992)(Commodore)(A4000)[!].rom" + source_ref: "libretro/libretro-core.h:220-223" + + - name: "kick40068.A4000" + system: commodore-amiga + required: false + hle_fallback: true + size: 524288 # 512 KB + note: "Kickstart 3.1 rev 40.68 (1993). Default for A4030/A4040 models." + aliases: + - "amiga-os-310-a4000.rom" + - "Kickstart v3.1 rev 40.68 (1993)(Commodore)(A4000).rom" + source_ref: "libretro/libretro-core.h:225-228" + + # ------------------------------------------------------- + # Commodore CDTV + # ------------------------------------------------------- + - name: "kick34005.CDTV" + system: commodore-cdtv + required: true + size: 262144 # 256 KB + note: "CDTV Extended ROM v1.0 (1991). Required as extended ROM for CDTV model. Main kickstart is kick34005.A500." + aliases: + - "amiga-os-130-cdtv-ext.rom" + - "CDTV Extended-ROM v1.0 (1991)(Commodore)(CDTV)[!].rom" + - "CDTV Extended-ROM v1.0 (1992)(Commodore)(CDTV).rom" + source_ref: "libretro/libretro-core.h:231-234" + + # ------------------------------------------------------- + # Amiga CD32 + # ------------------------------------------------------- + - name: "kick40060.CD32" + system: commodore-amiga-cd32 + required: true + size: 524288 # 512 KB + note: "CD32 Kickstart 3.1 rev 40.60 (1993). Main ROM for CD32 and CD32FR models." + aliases: + - "amiga-os-310-cd32.rom" + - "Kickstart v3.1 rev 40.60 (1993)(Commodore)(CD32).rom" + source_ref: "libretro/libretro-core.h:236-239" + + - name: "kick40060.CD32.ext" + system: commodore-amiga-cd32 + required: true + size: 524288 # 512 KB + note: "CD32 Extended ROM rev 40.60 (1993). Required when main ROM is <= 512 KB (not combined)." + aliases: + - "amiga-os-310-cd32-ext.rom" + - "CD32 Extended-ROM rev 40.60 (1993)(Commodore)(CD32).rom" + source_ref: "libretro/libretro-core.h:241-244" + + # ------------------------------------------------------- + # WHDLoad support files + # ------------------------------------------------------- + - name: "rom.key" + system: commodore-amiga + required: false + note: "Amiga Forever ROM decryption key. Copied to saves/WHDLoad/Devs/Kickstarts/ for WHDLoad." + source_ref: "libretro/libretro-core.c:5887-5898" + + - name: "WHDLoad.key" + system: commodore-amiga + required: false + note: "WHDLoad license key. Copied to saves/WHDLoad/L/ for registered WHDLoad use." + source_ref: "libretro/libretro-core.c:5903-5916" + + - name: "WHDLoad.prefs" + system: commodore-amiga + required: false + note: "WHDLoad preferences. Copied to saves/WHDLoad/S/ when present." + source_ref: "libretro/libretro-core.c:5920-5943" + +model_kickstart_map: + A500: {kickstart: "kick34005.A500", ext: null} + A500OG: {kickstart: "kick34005.A500", ext: null} + A500PLUS: {kickstart: "kick37175.A500", ext: null} + A600: {kickstart: "kick40063.A600", ext: null} + A1200: {kickstart: "kick40068.A1200", ext: null} + A1200OG: {kickstart: "kick40068.A1200", ext: null} + A2000: {kickstart: "kick40063.A600", ext: null} + A2000OG: {kickstart: "kick34005.A500", ext: null} + A4030: {kickstart: "kick40068.A4000", ext: null} + A4040: {kickstart: "kick40068.A4000", ext: null} + CDTV: {kickstart: "kick34005.A500", ext: "kick34005.CDTV"} + CD32: {kickstart: "kick40060.CD32", ext: "kick40060.CD32.ext"} + CD32FR: {kickstart: "kick40060.CD32", ext: "kick40060.CD32.ext"} + +whdload_kickstarts: + - "kick33180.A500" # KS 1.2, 256 KB + - "kick34005.A500" # KS 1.3, 256 KB + - "kick40063.A600" # KS 3.1, 512 KB + - "kick40068.A1200" # KS 3.1, 512 KB + +platform_details: + rom_sizes: + ROM_SIZE_128: 131072 # 128 KB + ROM_SIZE_256: 262144 # 256 KB + ROM_SIZE_512: 524288 # 512 KB + aros_fallback: true + naming_conventions: + standard: "kick{rev}.{model}" + amiga_forever: "amiga-os-{version}.rom" + tosec: "Kickstart v{version} rev {rev} ({year})(Commodore)({model}).rom" + scan_prefixes: ["kick", "amiga-os", "KS ROM"] + source_ref: "libretro/libretro-core.c:2617-2656" diff --git a/emulators/puzzlescript.yml b/emulators/puzzlescript.yml index 3676d5f2..0698120d 100644 --- a/emulators/puzzlescript.yml +++ b/emulators/puzzlescript.yml @@ -1,20 +1,21 @@ emulator: PuzzleScript type: game -source: "https://github.com/libretro/puzzlescript-libretro" -profiled_date: "2026-03-18" -core_version: "" -display_name: "PuzzleScript (pzretro)" +core_classification: game_engine +source: "https://github.com/nwhitehead/pzretro" +upstream: "https://github.com/increpare/PuzzleScript" +profiled_date: "2026-03-25" +core_version: "0.2.1" display_name: "PuzzleScript (pzretro)" cores: - puzzlescript systems: [] notes: | - Libretro port of PuzzleScript, an open-source HTML5 puzzle game - engine by Stephen Lavelle (increpare). Runs .puz puzzle definition - files within RetroArch. + Libretro port of PuzzleScript, an open-source HTML5 puzzle game engine + by Stephen Lavelle (increpare). Runs .pz and .pzp puzzle definition files. + Also supports PuzzleScript Plus (Auroriax fork) for .pzp files. - No BIOS or system files required. The puzzle engine and renderer - are self-contained. + The PuzzleScript and PuzzleScript Plus JavaScript engines are compiled into + the binary via QuickJS. No external files required. files: [] diff --git a/emulators/px68k.yml b/emulators/px68k.yml index 164d3407..cb60cb16 100644 --- a/emulators/px68k.yml +++ b/emulators/px68k.yml @@ -1,7 +1,9 @@ emulator: px68k type: libretro +core_classification: community_fork source: "https://github.com/libretro/px68k-libretro" -profiled_date: "2026-03-18" +upstream: "https://github.com/hissorii/px68k" +profiled_date: "2026-03-25" core_version: "0.15+" display_name: "Sharp - X68000 (PX68k)" cores: diff --git a/emulators/qemu.yml b/emulators/qemu.yml index 0f36d144..96d891a8 100644 --- a/emulators/qemu.yml +++ b/emulators/qemu.yml @@ -1,19 +1,27 @@ emulator: QEMU type: libretro +core_classification: community_fork source: "https://github.com/io12/qemu-libretro" -profiled_date: "2026-03-18" +upstream: "https://github.com/qemu/qemu" +profiled_date: "2026-03-25" core_version: "0.1.0" display_name: "QEMU" -systems: [ibm-pc, x86, x86-64, ppc, sparc, sparc64, arm, aarch64, mips, riscv, s390x, m68k, alpha, hppa] +cores: [qemu] +systems: [ibm-pc, x86, x86-64, ppc, ppc64, sparc, sparc64, arm, aarch64, mips, mips64, riscv32, riscv64, s390x, m68k, alpha, hppa] # QEMU (Quick Emulator) libretro core, based on QEMU 9.0.50. -# Supports x86_64, i386, PPC, Sparc, ARM, AArch64, MIPS, RISC-V, S390x, M68K, Alpha, HPPA. -# Opens .iso, .img, .qcow, .qcow2 files or custom .qemu_cmd_line for any architecture. +# Builds 17 targets: aarch64, alpha, arm, i386, m68k, mips(el), mips64(el), +# ppc, ppc64, riscv32, riscv64, s390x, sparc, sparc64, x86_64. +# Opens .iso, .img, .qcow, .qcow2 or custom .qemu_cmd_line for any architecture. # Default architecture is x86_64 when loading .iso/.img/.qcow directly. # # All BIOS/firmware files are loaded from {retroarch_system_dir}/qemu/ # via qemu_add_data_dir(system_dir + "/qemu") in ui/libretro.c:659-660. # QEMU resolves firmware by name through its data directory search path. +# No hash/size validation is performed on any firmware file. +# +# .info declares firmware_count=0. All firmware is loaded by QEMU's internal +# machine/device code, not declared in the .info. files: # ======================================================== @@ -58,9 +66,7 @@ files: md5: "387c48aef9497c6c2b914b1e6b9bc7aa" size: 16384 required: false - note: > - Minimal x86 firmware for fast Linux kernel booting. - Alternative to SeaBIOS for Linux-only workloads. + note: "Minimal x86 firmware for fast Linux kernel booting." source_ref: "pc-bios/meson.build:32" # ======================================================== @@ -83,9 +89,7 @@ files: md5: "fcd3d3c0b07a9096693d69425cd940f6" size: 38912 required: false - note: > - Cirrus Logic GD5446 VGA BIOS. Used by the cirrus-vga PCI - device and cirrus-vga-isa ISA device. + note: "Cirrus Logic GD5446 VGA BIOS." source_ref: "hw/display/cirrus_vga.c:3001, hw/display/cirrus_vga_isa.c:67" - name: "VGA BIOS stdvga" @@ -94,9 +98,7 @@ files: md5: "8117c3fd986fbbe327badfe38e77db1d" size: 39424 required: false - note: > - Standard VGA PCI BIOS (Bochs VBE extensions). Used by the - VGA PCI device, the most common display adapter for x86. + note: "Standard VGA PCI BIOS (Bochs VBE extensions)." source_ref: "hw/display/vga-pci.c:387" - name: "VGA BIOS bochs-display" @@ -105,7 +107,7 @@ files: md5: "83e39bd3e056291ee50d2b5d937bab3e" size: 28672 required: false - note: "Bochs display device VGA BIOS. Simpler non-VGA display adapter." + note: "Bochs display device VGA BIOS." source_ref: "hw/display/bochs-display.c:365" - name: "VGA BIOS ramfb" @@ -114,7 +116,7 @@ files: md5: "c55512e313c4cb08ec5a36198fdfef33" size: 28672 required: false - note: "RAM framebuffer VGA BIOS for simple display output." + note: "RAM framebuffer VGA BIOS." source_ref: "hw/display/ramfb.c:150" - name: "VGA BIOS ATI" @@ -154,7 +156,7 @@ files: source_ref: "hw/display/vmware_vga.c:1349" # ======================================================== - # x86 OPTION ROMs (loaded on demand) + # x86 OPTION ROMs # ======================================================== - name: "KVM VAPIC" path: "qemu/kvmvapic.bin" @@ -162,9 +164,7 @@ files: md5: "b8cec9572e408a3259914f9aba8664cb" size: 9216 required: false - note: > - KVM virtual APIC option ROM. Loaded as option ROM for - APIC acceleration on x86. + note: "KVM virtual APIC option ROM for APIC acceleration on x86." source_ref: "hw/i386/vapic.c:733" - name: "Linux boot ROM" @@ -200,7 +200,7 @@ files: md5: "e942cc4f612050c7331d33a34b0d5192" size: 1024 required: false - note: "DMA-capable option ROM for Multiboot kernel loading." + note: "DMA-capable Multiboot option ROM." source_ref: "hw/i386/multiboot.c:406" - name: "PVH boot ROM" @@ -213,7 +213,7 @@ files: source_ref: "hw/i386/x86-common.c:735" # ======================================================== - # PXE NETWORK BOOT ROMs (iPXE) + # PXE NETWORK BOOT ROMs (iPXE legacy BIOS) # ======================================================== - name: "PXE e1000" path: "qemu/pxe-e1000.rom" @@ -222,7 +222,7 @@ files: size: 67072 required: false note: "iPXE PXE boot ROM for Intel e1000 NIC (8086:100e)." - source_ref: "pc-bios/README" + source_ref: "pc-bios/meson.build:47" - name: "PXE eepro100" path: "qemu/pxe-eepro100.rom" @@ -230,8 +230,8 @@ files: md5: "2f8279177fdc2ce5abc47d9f1e303db1" size: 61440 required: false - note: "iPXE PXE boot ROM for Intel eepro100 NIC (8086:1209)." - source_ref: "pc-bios/README" + note: "iPXE PXE boot ROM for Intel eepro100 NIC (8086:1209). Device default romfile." + source_ref: "hw/net/eepro100.c:2077" - name: "PXE ne2k_pci" path: "qemu/pxe-ne2k_pci.rom" @@ -240,7 +240,7 @@ files: size: 61440 required: false note: "iPXE PXE boot ROM for NE2000 PCI NIC (1050:0940)." - source_ref: "pc-bios/README" + source_ref: "pc-bios/meson.build:49" - name: "PXE pcnet" path: "qemu/pxe-pcnet.rom" @@ -249,7 +249,7 @@ files: size: 61440 required: false note: "iPXE PXE boot ROM for AMD PCnet NIC (1022:2000)." - source_ref: "pc-bios/README" + source_ref: "pc-bios/meson.build:50" - name: "PXE rtl8139" path: "qemu/pxe-rtl8139.rom" @@ -258,7 +258,7 @@ files: size: 61440 required: false note: "iPXE PXE boot ROM for Realtek RTL8139 NIC (10ec:8139)." - source_ref: "pc-bios/README" + source_ref: "pc-bios/meson.build:51" - name: "PXE virtio" path: "qemu/pxe-virtio.rom" @@ -267,7 +267,7 @@ files: size: 60416 required: false note: "iPXE PXE boot ROM for VirtIO NIC (1af4:1000)." - source_ref: "pc-bios/README" + source_ref: "pc-bios/meson.build:52" # ======================================================== # EFI NETWORK BOOT ROMs (iPXE UEFI) @@ -278,7 +278,7 @@ files: md5: "d8330b99643e31b51e7710fa26c7e859" size: 159232 required: false - note: "iPXE EFI boot ROM for Intel e1000 NIC." + note: "iPXE EFI boot ROM for Intel e1000 NIC. Device default romfile." source_ref: "hw/net/e1000.c:1708" - name: "EFI e1000e" @@ -287,7 +287,7 @@ files: md5: "a55bf3f4988d4a736c71a1300636cd69" size: 159232 required: false - note: "iPXE EFI boot ROM for Intel e1000e NIC." + note: "iPXE EFI boot ROM for Intel e1000e NIC. Device default romfile." source_ref: "hw/net/e1000e.c:689" - name: "EFI eepro100" @@ -297,7 +297,7 @@ files: size: 159232 required: false note: "iPXE EFI boot ROM for Intel eepro100 NIC." - source_ref: "hw/net/eepro100.c:2077" + source_ref: "pc-bios/meson.build:54" - name: "EFI ne2k_pci" path: "qemu/efi-ne2k_pci.rom" @@ -305,7 +305,7 @@ files: md5: "10b66275b3644af301c64a3c545c3daf" size: 157696 required: false - note: "iPXE EFI boot ROM for NE2000 PCI NIC." + note: "iPXE EFI boot ROM for NE2000 PCI NIC. Device default romfile." source_ref: "hw/net/ne2000-pci.c:111" - name: "EFI pcnet" @@ -314,7 +314,7 @@ files: md5: "374696f4fffa83c9cf18272212c21d83" size: 157696 required: false - note: "iPXE EFI boot ROM for AMD PCnet NIC." + note: "iPXE EFI boot ROM for AMD PCnet NIC. Device default romfile." source_ref: "hw/net/pcnet-pci.c:267" - name: "EFI rtl8139" @@ -323,7 +323,7 @@ files: md5: "f81dbbd7001a8db631f2a548b7d08c4e" size: 160768 required: false - note: "iPXE EFI boot ROM for Realtek RTL8139 NIC." + note: "iPXE EFI boot ROM for Realtek RTL8139 NIC. Device default romfile." source_ref: "hw/net/rtl8139.c:3423" - name: "EFI virtio" @@ -332,8 +332,8 @@ files: md5: "d3887f04c23035cae3f0e1075deea459" size: 160768 required: false - note: "iPXE EFI boot ROM for VirtIO NIC." - source_ref: "pc-bios/meson.build:58" + note: "iPXE EFI boot ROM for VirtIO NIC. Device default romfile." + source_ref: "hw/virtio/virtio-net-pci.c:73" - name: "EFI vmxnet3" path: "qemu/efi-vmxnet3.rom" @@ -341,57 +341,132 @@ files: md5: "ea1ba222dbd5aa356ea1f29393ae55e1" size: 156672 required: false - note: "iPXE EFI boot ROM for VMware vmxnet3 NIC." + note: "iPXE EFI boot ROM for VMware vmxnet3 NIC. Device default romfile." source_ref: "hw/net/vmxnet3.c:2508" + # ======================================================== + # EDK2 UEFI FIRMWARE + # ======================================================== + - name: "EDK2 x86_64 UEFI" + path: "qemu/edk2-x86_64-code.fd" + sha1: "eac1a94b8e0d7c53fd5df001c36794ec34c7c724" + size: 3653632 + required: false + note: "TianoCore UEFI firmware for x86_64. Built from edk2-stable202302." + source_ref: "pc-bios/meson.build:12" + + - name: "EDK2 x86_64 Secure Boot UEFI" + path: "qemu/edk2-x86_64-secure-code.fd" + sha1: "617abe2746696bb4a309d72cecb446dc76a2a61e" + size: 3653632 + required: false + note: "TianoCore UEFI firmware for x86_64 with Secure Boot support." + source_ref: "pc-bios/meson.build:13" + + - name: "EDK2 i386 UEFI" + path: "qemu/edk2-i386-code.fd" + sha1: "45b8faebdfaaf19d16e3a7c5f60d69214685071c" + size: 3653632 + required: false + note: "TianoCore UEFI firmware for i386." + source_ref: "pc-bios/meson.build:9" + + - name: "EDK2 i386 Secure Boot UEFI" + path: "qemu/edk2-i386-secure-code.fd" + sha1: "6982abec8ef2ed7c8293163d5a0bd69a01a2126f" + size: 3653632 + required: false + note: "TianoCore UEFI firmware for i386 with Secure Boot support." + source_ref: "pc-bios/meson.build:10" + + - name: "EDK2 i386 UEFI vars template" + path: "qemu/edk2-i386-vars.fd" + sha1: "b62e676c9317a32aaa9ee1d76268d8c55663bd6e" + size: 540672 + required: false + note: "UEFI variable store template for i386/x86_64 EDK2 firmware." + source_ref: "pc-bios/meson.build:11" + + - name: "EDK2 AArch64 UEFI" + path: "qemu/edk2-aarch64-code.fd" + sha1: "514edbce58bfa877170673c1799351a7dab3b6df" + size: 67108864 + required: false + note: "TianoCore UEFI firmware for AArch64 (ARM 64-bit)." + source_ref: "pc-bios/meson.build:4" + + - name: "EDK2 ARM UEFI" + path: "qemu/edk2-arm-code.fd" + sha1: "c20f01c28b59b388abb9d0febeec45d801a632f0" + size: 67108864 + required: false + note: "TianoCore UEFI firmware for ARM (32-bit)." + source_ref: "pc-bios/meson.build:5" + + - name: "EDK2 ARM UEFI vars template" + path: "qemu/edk2-arm-vars.fd" + sha1: "b051167e0e57bd13d77ed92ef7b474872f44ec6d" + size: 67108864 + required: false + note: "UEFI variable store template for ARM/AArch64 EDK2 firmware." + source_ref: "pc-bios/meson.build:6" + + - name: "EDK2 RISC-V UEFI" + path: "qemu/edk2-riscv-code.fd" + sha1: "2c8633d881ece0c4794d740138a318f7e9af480c" + size: 33554432 + required: false + note: "TianoCore UEFI firmware for RISC-V 64-bit." + source_ref: "pc-bios/meson.build:7" + + - name: "EDK2 RISC-V UEFI vars template" + path: "qemu/edk2-riscv-vars.fd" + sha1: "c4e6cce4247ba8f32f528c1c69f49228f616677f" + size: 33554432 + required: false + note: "UEFI variable store template for RISC-V EDK2 firmware." + source_ref: "pc-bios/meson.build:8" + # ======================================================== # POWERPC FIRMWARE # ======================================================== - name: "OpenBIOS PowerPC" path: "qemu/openbios-ppc" sha1: "0ef5051dcb318c0bc45d1908f8318d6eece8686a" - md5: "" size: 677196 required: false note: > OpenBIOS (IEEE 1275 Open Firmware) for PowerPC emulation. - Required for -M mac99, -M g3beige and other PPC machines. - source_ref: "pc-bios/README" + Default for -M mac99, -M g3beige and other PPC machines. + source_ref: "hw/ppc/mac_oldworld.c:60, hw/ppc/mac_newworld.c:86" - name: "SLOF (Slimline Open Firmware)" path: "qemu/slof.bin" sha1: "a03a94acfe555804d66cc6c74760ae1375a71a64" - md5: "" size: 995000 required: false - note: > - IBM SLOF firmware for pSeries (POWER) machine type. - Built from qemu-slof-20230918 tag. - source_ref: "pc-bios/README" + note: "IBM SLOF firmware for pSeries (POWER) machine type. Built from qemu-slof-20230918." + source_ref: "hw/ppc/spapr.c:106" - name: "skiboot" path: "qemu/skiboot.lid" sha1: "8052069aa9714c23be05b4e62fb245a3d572cb0f" - md5: "" size: 2527328 required: false - note: > - OPAL firmware for OpenPOWER PowerNV (non-virtualized) machine type. - source_ref: "pc-bios/README" + note: "OPAL firmware for OpenPOWER PowerNV (non-virtualized) machine type." + source_ref: "hw/ppc/pnv.c:63" - name: "VOF (Virtual Open Firmware)" path: "qemu/vof.bin" sha1: "fc737b34a390f5752cb7e35b33d71f4f438ab607" - md5: "" size: 3456 required: false - note: "Minimal Open Firmware shim for -machine pseries,x-vof=on." - source_ref: "pc-bios/README" + note: "Minimal Open Firmware shim for -machine pseries,x-vof=on. Also default for Pegasos II." + source_ref: "hw/ppc/spapr.c:107, hw/ppc/pegasos2.c:43" - name: "VOF NVRAM" path: "qemu/vof-nvram.bin" sha1: "5d1184609b87f78635f0575467a1c3f440900ff0" - md5: "" size: 16384 required: false note: "NVRAM template for VOF (Virtual Open Firmware)." @@ -400,18 +475,14 @@ files: - name: "U-Boot e500" path: "qemu/u-boot.e500" sha1: "9ea03f249f856cdcb4399cc1f5a5031729379911" - md5: "" size: 421720 required: false - note: > - U-Boot for PowerPC e500 (qemu-ppce500 target). - Built from upstream denx u-boot, commit 2072e72. - source_ref: "pc-bios/README" + note: "U-Boot for PowerPC e500 (qemu-ppce500 target). Built from upstream denx u-boot, commit 2072e72." + source_ref: "hw/ppc/e500.c:1184" - name: "U-Boot SAM460" path: "qemu/u-boot-sam460-20100605.bin" sha1: "0399a79ac0cf77f0da70af9baec7548a3b368f0a" - md5: "" size: 524288 required: false note: "U-Boot for Sam460ex (AmigaOne) PowerPC board." @@ -420,11 +491,10 @@ files: - name: "QEMU VGA Mac driver" path: "qemu/qemu_vga.ndrv" sha1: "638c6262a6eb579ec3d1c9292566ac94c942dc15" - md5: "" size: 18752 required: false note: "QemuMacDrivers VGA driver for PPC MacOS guests." - source_ref: "pc-bios/README" + source_ref: "hw/ppc/mac_oldworld.c:58, hw/ppc/mac_newworld.c:84" # ======================================================== # SPARC FIRMWARE @@ -432,38 +502,41 @@ files: - name: "OpenBIOS Sparc32" path: "qemu/openbios-sparc32" sha1: "5a4f2124c8f093f8aee99fbcebcf5d17d789ff26" - md5: "" size: 382080 required: false - note: > - OpenBIOS for Sparc32 emulation. Includes QEMU,tcx.bin - and QEMU,cgthree.bin display drivers. - source_ref: "pc-bios/README" + note: "OpenBIOS for Sparc32 emulation (sun4m)." + source_ref: "hw/sparc/sun4m.c:79" - name: "OpenBIOS Sparc64" path: "qemu/openbios-sparc64" sha1: "c6e215fe460629d35688ab8e51faf6f765827cd6" - md5: "" size: 1593408 required: false - note: "OpenBIOS for Sparc64 (UltraSPARC) emulation." - source_ref: "pc-bios/README" + note: "OpenBIOS for Sparc64 (UltraSPARC) emulation (sun4u)." + source_ref: "hw/sparc64/sun4u.c:67" - name: "QEMU TCX display" path: "qemu/QEMU,tcx.bin" - sha1: "" - md5: "" + sha1: "5f1792a73ee47d78b2160191ecb2c92f353f93ad" + size: 1402 required: false note: "TCX framebuffer FCode driver for Sparc32 OpenBIOS." - source_ref: "pc-bios/meson.build:45" + source_ref: "hw/display/tcx.c:38,827" - name: "QEMU cgthree display" path: "qemu/QEMU,cgthree.bin" - sha1: "" - md5: "" + sha1: "619b86fb02faf8f682474be3f0653b58015008ba" + size: 850 required: false note: "CG3 framebuffer FCode driver for Sparc32 OpenBIOS." - source_ref: "pc-bios/meson.build:46" + source_ref: "hw/display/cg3.c:44,303" + + - name: "U-Boot LEON3" + path: "qemu/u-boot.bin" + sha1: "" + required: false + note: "U-Boot for LEON3 SPARC board. Not shipped with QEMU, user-supplied." + source_ref: "hw/sparc/leon3.c:53" # ======================================================== # ALPHA FIRMWARE @@ -471,11 +544,10 @@ files: - name: "Alpha PALcode" path: "qemu/palcode-clipper" sha1: "47b0870aaa45a7aa0d48847fd905908fb06f3e9f" - md5: "" size: 153728 required: false note: "PALcode firmware for Alpha (Clipper/DP264) machine emulation." - source_ref: "pc-bios/README" + source_ref: "hw/alpha/dp264.c:139" # ======================================================== # RISC-V FIRMWARE @@ -483,24 +555,18 @@ files: - name: "OpenSBI RISC-V 32" path: "qemu/opensbi-riscv32-generic-fw_dynamic.bin" sha1: "7a23dfdeef3d78ffc89d86e89fc06a36f1e4386f" - md5: "" size: 268312 required: false - note: > - OpenSBI (Supervisor Binary Interface) firmware for RISC-V 32-bit. - Required for riscv32-softmmu machine types. - source_ref: "pc-bios/README" + note: "OpenSBI (Supervisor Binary Interface) firmware for RISC-V 32-bit." + source_ref: "hw/riscv/boot.c:92" - name: "OpenSBI RISC-V 64" path: "qemu/opensbi-riscv64-generic-fw_dynamic.bin" sha1: "6883bfd1991c0ef0d67b0967e7dcbd60420dd480" - md5: "" size: 272504 required: false - note: > - OpenSBI firmware for RISC-V 64-bit. - Required for riscv64-softmmu machine types. - source_ref: "pc-bios/README" + note: "OpenSBI firmware for RISC-V 64-bit." + source_ref: "hw/riscv/boot.c:92" # ======================================================== # S390X FIRMWARE @@ -508,20 +574,18 @@ files: - name: "S390 CCW firmware" path: "qemu/s390-ccw.img" sha1: "7b4fa888d32ca8ddbc752f7442e4d055cee1871a" - md5: "" size: 42608 required: false note: "Channel Command Word boot firmware for s390x emulation." - source_ref: "pc-bios/meson.build:68" + source_ref: "hw/s390x/ipl.c:149" - name: "S390 network boot" path: "qemu/s390-netboot.img" sha1: "f6cec671408117bd9a31e982682662f27ef4fb2c" - md5: "" size: 67232 required: false note: "Network boot firmware for s390x emulation." - source_ref: "pc-bios/meson.build:69" + source_ref: "hw/s390x/ipl.c:497" # ======================================================== # HP-PA FIRMWARE @@ -529,20 +593,77 @@ files: - name: "HP-PA firmware (32-bit)" path: "qemu/hppa-firmware.img" sha1: "605c36ede6c120c6cc7efe147a75a3dc4b7e4fb0" - md5: "" size: 167820 required: false note: "SeaBIOS-hppa firmware for 32-bit HP-PARISC emulation." - source_ref: "pc-bios/README" + source_ref: "hw/hppa/machine.c:424" - name: "HP-PA firmware (64-bit)" path: "qemu/hppa-firmware64.img" sha1: "b42f6d4ca74073de6c038579b4a9323ad0a6b398" - md5: "" size: 206024 required: false note: "SeaBIOS-hppa firmware for 64-bit HP-PARISC emulation." - source_ref: "pc-bios/README" + source_ref: "hw/hppa/machine.c:424" + + # ======================================================== + # MIPS FIRMWARE (not shipped, user-supplied) + # ======================================================== + - name: "MIPS BIOS (big-endian)" + path: "qemu/mips_bios.bin" + sha1: "" + required: false + note: "Default BIOS for big-endian MIPS machines (Malta, MIPSsim, Jazz). Not shipped with QEMU." + source_ref: "hw/mips/malta.c:97" + + - name: "MIPS BIOS (little-endian)" + path: "qemu/mipsel_bios.bin" + sha1: "" + required: false + note: "Default BIOS for little-endian MIPS machines (Malta, MIPSsim, Jazz). Not shipped with QEMU." + source_ref: "hw/mips/malta.c:99" + + - name: "Loongson3 BIOS" + path: "qemu/bios_loongson3.bin" + sha1: "" + required: false + note: "Default BIOS for Loongson3 virtual MIPS machine. Not shipped with QEMU." + source_ref: "hw/mips/loongson3_virt.c:63" + + - name: "PMON Fuloong2e" + path: "qemu/pmon_2e.bin" + sha1: "" + required: false + note: "PMON monitor for Fuloong2e MIPS board. Not shipped with QEMU." + source_ref: "hw/mips/fuloong2e.c:58" + + # ======================================================== + # M68K FIRMWARE (not shipped, user-supplied) + # ======================================================== + - name: "Macintosh ROM" + path: "qemu/MacROM.bin" + sha1: "" + required: false + note: "Apple Macintosh ROM for Quadra 800 emulation. Not shipped with QEMU." + source_ref: "hw/m68k/q800.c:62" + + # ======================================================== + # ARM FIRMWARE (non-NPCM7xx, not shipped) + # ======================================================== + - name: "Canon A1100 ROM" + path: "qemu/canon-a1100-rom1.bin" + sha1: "" + required: false + note: "Canon PowerShot A1100 IS DIGIC camera ROM. Not shipped with QEMU." + source_ref: "hw/arm/digic_boards.c:131" + + - name: "NPCM7xx boot ROM" + path: "qemu/npcm7xx_bootrom.bin" + sha1: "22a75d26a0591d2c7763765b6381fa2f73de43e1" + size: 768 + required: false + note: "Boot ROM for Nuvoton NPCM7xx BMC (ARM Cortex-A9)." + source_ref: "hw/arm/npcm7xx_boards.c:56" # ======================================================== # DEVICE TREE BLOBS @@ -550,50 +671,41 @@ files: - name: "Bamboo DTB (PPC)" path: "qemu/bamboo.dtb" sha1: "ebdf1745479f4ec88459bbd9ef16ee1114018508" - md5: "" size: 3211 required: false note: "Device tree blob for PowerPC Bamboo (440EP) board." - source_ref: "pc-bios/meson.build:88" + source_ref: "hw/ppc/ppc440_bamboo.c:38" - name: "Canyonlands DTB (PPC)" path: "qemu/canyonlands.dtb" sha1: "8a2fda0b4f23a92eb44776b5d7ffe951987062da" - md5: "" size: 9779 required: false - note: "Device tree blob for PowerPC Canyonlands (460EX) board." - source_ref: "pc-bios/meson.build:89" + note: "Device tree blob for PowerPC Canyonlands (460EX) / Sam460ex board." + source_ref: "hw/ppc/sam460ex.c:45" - name: "Petalogix ML605 DTB (MicroBlaze)" path: "qemu/petalogix-ml605.dtb" sha1: "892d265838866869b8a8ef104252ff5b2fda156f" - md5: "" size: 9882 required: false - note: "Device tree blob for Xilinx Petalogix ML605 MicroBlaze board." + note: "Device tree blob for Xilinx Petalogix ML605 MicroBlaze board. MicroBlaze target not built in libretro core." source_ref: "pc-bios/meson.build:91" - name: "Petalogix S3ADSP1800 DTB (MicroBlaze)" path: "qemu/petalogix-s3adsp1800.dtb" sha1: "976600e3f89ecc1f3564b7077f53c58e0b565280" - md5: "" size: 8161 required: false - note: "Device tree blob for Xilinx Petalogix S3ADSP1800 MicroBlaze board." + note: "Device tree blob for Xilinx Petalogix S3ADSP1800 MicroBlaze board. MicroBlaze target not built in libretro core." source_ref: "pc-bios/meson.build:90" - # ======================================================== - # OTHER - # ======================================================== - - name: "NPCM7xx boot ROM" - path: "qemu/npcm7xx_bootrom.bin" - sha1: "22a75d26a0591d2c7763765b6381fa2f73de43e1" - md5: "" - size: 768 + - name: "Virtex ML507 DTB (PPC)" + path: "qemu/virtex-ml507.dtb" + sha1: "" required: false - note: "Boot ROM for Nuvoton NPCM7xx BMC (ARM Cortex-A9)." - source_ref: "pc-bios/README" + note: "Device tree blob for Xilinx Virtex ML507 PowerPC board. Not shipped with QEMU." + source_ref: "hw/ppc/virtex_ml507.c:148" notes: bios_directory: > @@ -605,10 +717,12 @@ notes: Other VGA BIOS variants are loaded depending on the emulated GPU. PXE/EFI ROMs are only needed for network booting. multi_arch: > - The libretro build supports 16 target architectures. Non-x86 firmware + The libretro build targets 17 architectures. Non-x86 firmware is only needed when using .qemu_cmd_line files that invoke a different qemu-system-* binary (e.g. qemu-system-ppc for MacOS 9). - experimental: > - This core is marked is_experimental=true in its .info file. - Savestates are not supported. + edk2: > + EDK2 UEFI firmware is shipped as bz2-compressed blobs in pc-bios/. These + provide UEFI boot for x86, ARM, and RISC-V machine types. Users specify + them via -bios or pflash in .qemu_cmd_line files. + experimental: "This core is marked is_experimental=true in its .info file." version: "Based on QEMU 9.0.50 (io12/qemu-libretro)" diff --git a/emulators/quasi88.yml b/emulators/quasi88.yml index 913538d8..6cd0eddc 100644 --- a/emulators/quasi88.yml +++ b/emulators/quasi88.yml @@ -1,7 +1,9 @@ emulator: QUASI88 type: libretro +core_classification: community_fork source: "https://github.com/libretro/quasi88-libretro" -profiled_date: "2026-03-18" +upstream: "https://www.retropc.net/showzoh/quasi88/" +profiled_date: "2026-03-25" core_version: "0.6.4" display_name: "NEC - PC-8000 / PC-8800 series (QUASI88)" cores: @@ -9,69 +11,63 @@ cores: systems: - pc-8801 -# QUASI88 is a NEC PC-8801 emulator. The libretro port includes a pseudo-BIOS -# (pbios_n88, pbios_disk) compiled into the core that provides basic compatibility -# when real BIOS files are missing. With the pseudo-BIOS, many disk-based games -# will boot, but compatibility is lower than with real ROMs. +# QUASI88 by Showzoh Fukunaga, libretro port by Celerizer. +# Includes pseudo-BIOS (pbios_n88, pbios_disk) by cisc compiled into the core. +# With pseudo-BIOS, some disk-based games boot but compatibility is limited. # -# ROM file search order (libretro.c:444-491): +# ROM search order (libretro.c:444-491): # 1. / # 2. /quasi88/ # 3. / # Each ROM entry has up to 4 alternate filenames tried in order. # # ROM loading (libretro.c:550-594): -# N88.ROM and DISK.ROM (SUB_ROM) are the only two checked for failure. -# If missing, the core falls back to the built-in pseudo-BIOS. +# N88.ROM and DISK.ROM have pseudo-BIOS fallback if missing. # All other ROMs are loaded silently if present, ignored if absent. # # The original QUASI88 (memory.c:80-95) uses uppercase-first filenames -# (N88.ROM, N88EXT0.ROM, etc.) while the libretro .info file standardizes -# on lowercase with underscore variants (n88.rom, n88_0.rom, etc.). +# (N88.ROM, N88EXT0.ROM, etc.) while the libretro .info file uses +# lowercase with underscore variants (n88.rom, n88_0.rom, etc.). # The core tries both naming conventions. # -# FONT.ROM/FONT2.ROM/FONT3.ROM are not listed in the .info file. -# When missing, the core uses built-in fonts or falls back to kanji ROM glyphs. +# FONT.ROM/FONT2.ROM/FONT3.ROM are not in the .info file. +# When missing, the core uses built-in fonts (font.h) or kanji ROM glyphs. +# +# Upstream supports 2HD disk ROM (8 KB) via memory.c:356-368. +# The libretro port reads only 2 KB (2D type) at libretro.c:552. notes: | Files go in /quasi88/ or directly in /. - The pseudo-BIOS built into the core covers N88-BASIC V2 and the disk - subsystem at a basic level. For full compatibility (N-BASIC, V1H/V1S modes, - dictionary lookup, kanji display), real ROM files are needed. + The pseudo-BIOS covers N88-BASIC V2 and the disk subsystem at a basic + level. For full compatibility (N-BASIC, V1H/V1S modes, dictionary lookup, + kanji display), real ROM files are needed. - N88_0.ROM (EXT0) is marked required in the .info file because it contains - the N88-BASIC V2 extension used by most software. EXT1-EXT3 are version- - specific extensions (V1H, V1S, older V2) needed only for specific titles. - - The core option "quasi88_basic_mode" selects N88 V2, N88 V1H, N88 V1S, - or N mode. Each mode requires its corresponding ROM to be present. + Core option "quasi88_basic_mode" selects N88 V2, N88 V1H, N88 V1S, + or N mode. Each mode requires its corresponding ROM. files: - # -- Required for full operation -- - - name: n88.rom path: "quasi88/n88.rom" size: 32768 required: true - note: "N88-BASIC main ROM (32 KB). Core falls back to pseudo-BIOS if missing." - source_ref: "src/LIBRETRO/libretro.c:550" + hle_fallback: true + note: "N88-BASIC main ROM (32 KB). Falls back to pseudo-BIOS if missing." + source_ref: "src/LIBRETRO/libretro.c:550-551" aliases: ["N88.ROM"] - name: n88_0.rom path: "quasi88/n88_0.rom" size: 8192 required: true - note: "N88-BASIC V2 extension ROM 0 (8 KB). Needed for most PC-8801 software." + note: "N88-BASIC V2 extension ROM 0 (8 KB). Needed by most software." source_ref: "src/LIBRETRO/libretro.c:555" aliases: ["N88_0.ROM", "N88EXT0.ROM", "n88ext0.rom"] - # -- Optional extensions -- - - name: n88_1.rom path: "quasi88/n88_1.rom" size: 8192 required: false - note: "N88-BASIC V1H extension ROM 1 (8 KB). For V1 High-speed mode software." + note: "N88-BASIC V1H extension ROM 1 (8 KB). For V1 High-speed mode." source_ref: "src/LIBRETRO/libretro.c:556" aliases: ["N88_1.ROM", "N88EXT1.ROM", "n88ext1.rom"] @@ -79,7 +75,7 @@ files: path: "quasi88/n88_2.rom" size: 8192 required: false - note: "N88-BASIC V1S extension ROM 2 (8 KB). For V1 Standard mode software." + note: "N88-BASIC V1S extension ROM 2 (8 KB). For V1 Standard mode." source_ref: "src/LIBRETRO/libretro.c:557" aliases: ["N88_2.ROM", "N88EXT2.ROM", "n88ext2.rom"] @@ -87,7 +83,7 @@ files: path: "quasi88/n88_3.rom" size: 8192 required: false - note: "N88-BASIC extension ROM 3 (8 KB). Older V2 extension, rarely needed." + note: "N88-BASIC extension ROM 3 (8 KB). Older V2 extension." source_ref: "src/LIBRETRO/libretro.c:558" aliases: ["N88_3.ROM", "N88EXT3.ROM", "n88ext3.rom"] @@ -104,15 +100,15 @@ files: size: 2048 required: false hle_fallback: true - note: "Disk subsystem ROM (2 KB, 2D type). Core falls back to pseudo-BIOS if missing. 8 KB variant (2HD type) also accepted." - source_ref: "src/LIBRETRO/libretro.c:552" + note: "Disk subsystem ROM (2 KB, 2D type). Falls back to pseudo-BIOS if missing." + source_ref: "src/LIBRETRO/libretro.c:552-553" aliases: ["DISK.ROM", "N88SUB.ROM", "n88sub.rom"] - name: n88knj1.rom path: "quasi88/n88knj1.rom" size: 131072 required: false - note: "Kanji ROM level 1 (128 KB). Required for Japanese text display. Also used as font fallback." + note: "Kanji ROM level 1 (128 KB). Required for Japanese text display." source_ref: "src/LIBRETRO/libretro.c:560" aliases: ["N88KNJ1.ROM", "KANJI1.ROM", "kanji1.rom"] @@ -128,18 +124,18 @@ files: path: "quasi88/n88jisho.rom" size: 524288 required: false - note: "Dictionary ROM (512 KB). Japanese dictionary lookup, very few titles use it." + note: "Dictionary ROM (512 KB). Japanese dictionary lookup." source_ref: "src/LIBRETRO/libretro.c:562" aliases: ["N88JISHO.ROM", "JISYO.ROM", "jisyo.rom"] - # -- Font ROMs (not in .info, core has built-in fallback) -- + # Font ROMs (not in .info, core has built-in fallback via font.h) - name: font.rom path: "quasi88/font.rom" - size: 4096 + size: 2048 required: false hle_fallback: true - note: "ANK font ROM (4 KB). Falls back to built-in font or kanji ROM glyphs." + note: "ANK font ROM (2 KB). Falls back to built-in font or kanji ROM glyphs." source_ref: "src/LIBRETRO/libretro.c:566" aliases: ["FONT.ROM"] @@ -148,7 +144,7 @@ files: size: 4096 required: false hle_fallback: true - note: "Second font ROM (4 KB). Falls back to built-in ANH font." + note: "Second font ROM (up to 4 KB). Falls back to built-in ANH font." source_ref: "src/LIBRETRO/libretro.c:576" aliases: ["FONT2.ROM"] @@ -157,6 +153,6 @@ files: size: 4096 required: false hle_fallback: true - note: "Third font ROM (4 KB). Zeroed out if missing." + note: "Third font ROM (up to 4 KB). Zeroed out if missing." source_ref: "src/LIBRETRO/libretro.c:588" aliases: ["FONT3.ROM"] diff --git a/emulators/quicknes.yml b/emulators/quicknes.yml index a5782e35..56095679 100644 --- a/emulators/quicknes.yml +++ b/emulators/quicknes.yml @@ -2,7 +2,8 @@ emulator: QuickNES type: libretro core_classification: community_fork source: "https://github.com/libretro/QuickNES_Core" -profiled_date: "2026-03-21" +upstream: "https://github.com/kode54/QuickNES" +profiled_date: "2026-03-25" core_version: "1.0-WIP" display_name: "Nintendo - NES / Famicom (QuickNES)" cores: @@ -11,7 +12,7 @@ systems: - nintendo-nes notes: | - NES emulator by blargg (Shay Green). No BIOS required. - NES cartridge games are self-contained. + NES emulator by blargg (Shay Green), maintained by kode54. + NES has no BIOS. All palettes compiled in. files: [] diff --git a/emulators/race.yml b/emulators/race.yml index a7f28d7d..031cd7eb 100644 --- a/emulators/race.yml +++ b/emulators/race.yml @@ -1,43 +1,28 @@ emulator: RACE (Neo Geo Pocket) type: libretro +core_classification: community_fork source: "https://github.com/libretro/RACE" -profiled_date: "2026-03-18" +upstream: "https://github.com/8bitpsp/race" +profiled_date: "2026-03-25" core_version: "v2.16" display_name: "SNK - Neo Geo Pocket / Color (RACE)" +cores: [race] systems: [snk-ngp, snk-ngpc] notes: | - RACE is a Neo Geo Pocket and Neo Geo Pocket Color emulator, originally - developed for PSP (forked from Akop Karapetyan's port), adapted for - libretro. + RACE is a Neo Geo Pocket and Neo Geo Pocket Color emulator originally by + Judge_ (MHE), ported to GP2X by Flavor, to PSP by Akop Karapetyan, modified + by theelf, then adapted for libretro. - No external BIOS files are required. The core contains dead code in - race-memory.c that would load "NPBIOS.BIN" (64KB, loaded into cpurom - via filestream_open), but it is compiled out with #if 0 and loadBIOS() - unconditionally returns 0. The comment explains: "Using a real bios - file causes nothing but issues" and references Card Fighters' Clash - Test Mode as a known failure. + No external BIOS files are required. The upstream versions (GP2X, PSP) support + optional loading of NPBIOS.BIN, but the libretro port disabled it entirely + with #if 0 in race-memory.c:loadBIOS(). The comment explains: "Using a real + bios file causes nothing but issues." - Instead, the core uses a software HLE approach: - - A built-in koyote_bin memory dump (RAM state from a real console - post-boot) is copied into mainram at startup - - A fake SWI jump table is constructed at cpurom[0xE000] using the - TLCS-900H 0x1A (reg) dummy opcode to trap BIOS calls - - doBios() in tlcs900h.c handles 33 BIOS functions in software: - shutdown, clock speed, RTC, screen mode, font rendering, flash - read/write, communication, and sound control - - Interrupt vectors are set up at cpurom[0xFF00] and interrupt - handler code at cpurom[0xF800] - - CPU RAM defaults (interrupt priorities, timers) are loaded from - the ngpcpuram[256] table - - The Z80 sound CPU is emulated in software (cz80 or DrZ80 backend). - Flash memory for game saves is handled internally by flash.c. - - The only core option affecting system behavior is ngp_language - (english/japanese), which sets a RAM flag at 0x6F87. - - ROM extensions: .ngp, .ngc, .ngpc, .npc + The core uses a software HLE approach: a compiled-in koyote_bin RAM dump + (post-boot console state) is copied into mainram at startup, a fake SWI jump + table is built at cpurom[0xE000], and doBios() in tlcs900h.c handles 33 BIOS + functions in software. The Z80 sound CPU is emulated via cz80 or DrZ80. files: [] @@ -48,8 +33,9 @@ analysis: loaded_by: "race-memory.c:loadBIOS()" status: disabled source_ref: "race-memory.c:337-361" + upstream_status: optional + upstream_ref: "memory.cpp:346-365 (8bitpsp/race)" notes: | - loadBIOS() is wrapped in #if 0 and always returns 0. - Even if re-enabled, the realBIOSloaded=1 path has known - compatibility issues (e.g. Puzzle Bobble fails to boot). - The HLE path is the only functional code path. + loadBIOS() is wrapped in #if 0 and always returns 0 in the libretro port. + In upstream (8bitpsp/race, alekmaul/race), the function is live and loads + NPBIOS.BIN optionally, falling back to HLE if not found. diff --git a/emulators/redbook.yml b/emulators/redbook.yml index e8c641b0..2f64ec33 100644 --- a/emulators/redbook.yml +++ b/emulators/redbook.yml @@ -1,7 +1,8 @@ emulator: Redbook type: utility -source: "https://github.com/libretro/RetroArch" -profiled_date: "2026-03-18" +core_classification: pure_libretro +source: "https://github.com/libretro/redbook" +profiled_date: "2026-03-25" core_version: "1.0" display_name: "Redbook Audio Player" cores: @@ -9,10 +10,7 @@ cores: systems: [] notes: | - Redbook is an audio CD player core for RetroArch. Plays standard - Red Book audio CDs and CD image files (CUE/BIN) containing audio - tracks. - - No BIOS or system files required. + Audio CD player core. Plays Red Book audio CDs and CUE/BIN images. + Original libretro creation by Brad Parker, no upstream emulator. files: [] diff --git a/emulators/reminiscence.yml b/emulators/reminiscence.yml index f197cab6..f18f96ca 100644 --- a/emulators/reminiscence.yml +++ b/emulators/reminiscence.yml @@ -1,7 +1,9 @@ emulator: REminiscence type: libretro +core_classification: community_fork source: "https://github.com/libretro/REminiscence" -profiled_date: "2026-03-18" +upstream: "https://github.com/cyxx/REminiscence" +profiled_date: "2026-03-25" core_version: "0.3.6" display_name: "Flashback (REminiscence)" cores: @@ -10,23 +12,22 @@ systems: - flashback notes: | - REminiscence is a re-implementation of the Flashback (Delphine Software, 1992) game engine, - ported to libretro. Version 0.3.6. It is not a general-purpose emulator; it only runs the - original Flashback game data files. + Game engine re-implementation of Flashback (Delphine Software, 1992) by Gregory Montoir, + ported to libretro by Stuart Carnie. Version 0.3.6 (upstream is at 0.5.5). - The core sets need_fullpath = true and valid_extensions = "map" (libretro.cpp:67-68). + The core sets need_fullpath = true and valid_extensions = "map" (libretro.cpp:66). Content loading (retro_load_game) extracts the parent directory from the provided .MAP file path and uses it as the data root via FileSystem (libretro.cpp:194-196). - Version detection (libretro.cpp:126-149) probes for these files in order: + Version detection (libretro.cpp:125-148) probes for these files in order: DEMO_UK.ABA -> DOS Demo INTRO.SEQ -> DOS CD LEVEL1.MAP -> DOS LEVEL1.LEV -> Amiga DEMO.LEV -> Amiga Demo - Only kResourceTypeDOS is accepted by retro_load_game (line 199); Amiga data is rejected. + Only kResourceTypeDOS is accepted (line 199); Amiga data is rejected. - Language detection (libretro.cpp:151-175) probes for: + Language detection (libretro.cpp:150-174) probes for: ENGCINE.TXT -> English FR_CINE.TXT -> French GERCINE.TXT -> German @@ -35,27 +36,38 @@ notes: | FRCINE.TXT -> French (Amiga) Falls back to English if none found. - All game data files are loaded from the content directory at runtime via FileSystem - (fs.cpp), which recursively scans the directory and matches filenames case-insensitively - (strcasecmp at fs.cpp:52). The resource system (resource.cpp) loads files by constructing - names like "LEVEL1.MAP", "GLOBAL.ICN", "PERSO.SPR", "FB_TXT.FNT", etc. + All game data files are loaded from the content directory via FileSystem (fs.cpp), + which scans the directory and matches filenames case-insensitively (strcasecmp at + fs.cpp:52). The resource system (resource.cpp) loads files by constructing names + like "LEVEL1.MAP", "GLOBAL.ICN", "PERSO.SPR", "FB_TXT.FNT", etc. The core never calls RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY. All data files must live - alongside the loaded .MAP content file (or in subdirectories of its parent). There are - no BIOS or firmware files; the required files are the original Flashback game data. + alongside the loaded .MAP content file. No BIOS or firmware files; the required files + are the original Flashback DOS game data. - Music is loaded from .mod files or Amiga-format module files (mod_player.cpp, staticres.cpp - lines 3198-3225). These are optional; the core has a built-in SFX player for in-game - action music (sfx_player.cpp with embedded music data in staticres.cpp). + Music loaded from .mod files (mod_player.cpp, staticres.cpp:3198-3225). Optional; + the core has a built-in SFX player for in-game action music (sfx_player.cpp with + embedded music data in staticres.cpp). - VOICE.VCE from the SegaCD version can optionally be placed in the data directory for - in-game voice playback (resource.cpp:910). + VOICE.VCE from the SegaCD version can be placed in the data directory for in-game + voice playback (resource.cpp:900-941). Optional. - INTRO.SEQ and other .SEQ files from the DOS CD version provide FMV cutscenes - (seq_player.cpp). Without them, the core falls back to polygon-based cutscenes. + SEQ cutscene playback is disabled in the libretro build: g_options is zero-initialized + (game.cpp:30) and rs.cfg is never parsed, so use_seq_cutscenes defaults to false. + The core always uses polygon-based cutscenes (cutscene.cpp). + + Upstream (0.5.5) additionally supports Amiga, Macintosh, PC98 data, MIDI music, + OGG playback, SEQ cutscenes, and widescreen modes. None of these are in the + libretro port. files: [] +exclusion_note: > + Game engine core. All data files (game data, music, voice) are loaded from the content + directory alongside the .MAP file via FileSystem. The core never accesses the system + directory (RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY is never called). The .info declares + firmware_count=0, consistent with the code. + analysis: content_type: game_data content_extensions: ["map"] @@ -77,7 +89,7 @@ analysis: - "VOICE.VCE (SegaCD voice data)" dos_cd: additional: - - "INTRO.SEQ, CREDITS.SEQ, and other .SEQ cutscene videos" + - "INTRO.SEQ, CREDITS.SEQ, and other .SEQ cutscene videos (SEQ playback disabled in libretro build)" demo: archive: "DEMO_UK.ABA (contains all demo data in a single archive)" detection_order: diff --git a/emulators/remotejoy.yml b/emulators/remotejoy.yml index 3726161a..fb574479 100644 --- a/emulators/remotejoy.yml +++ b/emulators/remotejoy.yml @@ -1,7 +1,9 @@ emulator: RemoteJoy type: utility +core_classification: pure_libretro source: "https://github.com/libretro/libretro-remotejoy" -profiled_date: "2026-03-18" +upstream: "https://github.com/akiraink/RemoteJoyLite" +profiled_date: "2026-03-25" core_version: "v1" display_name: "PSP RemotePlay (RemoteJoy)" cores: @@ -9,11 +11,9 @@ cores: systems: [] notes: | - RemoteJoy is a PSP remote display utility for libretro. It receives - video output from a PSP running the RemoteJoy plugin over USB or - network, displaying it within RetroArch. - - No BIOS or system files required. Requires a PSP with the RemoteJoy - plugin installed on the device side. + USB streaming receiver for PSP. Connects via libusb to a PSP running the + RemoteJoy plugin (Sony VID 0x054C, PIDs 0x01C9/0x02D2) and displays + video frames at 480x272. No file I/O. Protocol reimplemented from + RemoteJoyLite Win32 client constants, not a port. files: [] diff --git a/emulators/retro8.yml b/emulators/retro8.yml index 4e06ff57..943da636 100644 --- a/emulators/retro8.yml +++ b/emulators/retro8.yml @@ -1,18 +1,23 @@ emulator: Retro8 -type: game +type: libretro +core_classification: game_engine source: "https://github.com/libretro/retro8" -profiled_date: "2026-03-18" -core_version: "Git" +upstream: "https://github.com/Jakz/retro8" +profiled_date: "2026-03-25" +core_version: "0.1b" display_name: "PICO-8 (Retro8)" cores: - retro8 -systems: [] +systems: + - pico8 notes: | - Retro8 is a PICO-8 compatible runtime for libretro. It can run .p8 - and .p8.png cartridge files created for the PICO-8 fantasy console. - - No BIOS, firmware, or system files required. The virtual machine and - Lua interpreter are self-contained in the core binary. + Open-source PICO-8 fantasy console reimplementation by Jacopo Santoni. + Runs .p8 and .p8.png cartridge files. The PICO-8 font is compiled into the + binary as a byte array (gen/pico_font.h, loaded in gfx.cpp:9). The Lua API + shim is compiled as a string constant (gen/lua_api.h, loaded in + lua_bridge.cpp:1126). The core never calls GET_SYSTEM_DIRECTORY and performs + no file I/O from the system directory. +exclusion_note: "all engine resources (font, Lua API, color palette, audio synth) compiled into the binary" files: [] diff --git a/emulators/retrodream.yml b/emulators/retrodream.yml index 84364349..2382ffc1 100644 --- a/emulators/retrodream.yml +++ b/emulators/retrodream.yml @@ -1,60 +1,54 @@ emulator: RetroDream type: libretro +core_classification: community_fork source: "https://github.com/libretro/redream-next" -profiled_date: "2026-03-18" +upstream: "https://github.com/inolen/redream" +profiled_date: "2026-03-25" core_version: "Git" display_name: "Sega - Dreamcast (RetroDream)" +cores: + - retrodream systems: - sega-dreamcast notes: | - Fork of the final open-source redream release (pre-relicense). Experimental - core with no HLE BIOS -- real BIOS files are required to boot games. - Flycast is recommended over this core for actual gameplay. + Fork of the last GPLv3 release of redream (inolen) before it went closed-source. + The core has HLE bootstrap -- when boot.bin is missing, bios_invalid_instr() + traps at PC=0x0 and calls bios_boot(), which loads IP.BIN and 1ST_READ.BIN + directly from disc, sets up syscall vectors, and starts execution at 0xac008300. - The libretro core sets appdir to the RetroArch system directory - (src/host/retro_host.c:216-217). boot.bin and flash.bin are loaded - directly from appdir (src/guest/rom/boot.c:17, src/guest/rom/flash.c:30). + The fork sets appdir to the RetroArch system directory root + (retro_host.c:216-217), unlike the upstream which appends /dc + (upstream retro_host.c:196-198). The .info still declares dc/ prefix paths + matching the upstream, not this fork. - The .info file declares paths as dc/boot.bin and dc/flash.bin, which means - RetroArch resolves them under {system_dir}/dc/. + boot.bin is validated against four known MD5 hashes (boot.c:25-30). + Validation failure logs a warning but the core continues via HLE. - boot.bin is validated against four known MD5 hashes at load time - (src/guest/rom/boot.c:25-30). If validation fails, the core logs a warning - but still attempts to run via HLE syscall hooks (bios.c:440-447). - - flash.bin is read/write -- the core saves modified flash data back to disk - on shutdown (src/guest/rom/flash.c:197-199). - - Boot ROM size: 2 MB (0x200000). Flash ROM size: 128 KB (0x20000). + flash.bin is read/write. If missing, bios_validate_flash() resets all + partitions to defaults. Saved back to disk on shutdown (flash.c:197-199). files: - name: "boot.bin" system: sega-dreamcast - path: "dc/boot.bin" - required: true - size: 2097152 # 2 MB (0x200000) + path: "boot.bin" + required: false + hle_fallback: true + size: 2097152 + validation: [size, md5] md5: - - e10c53c2f8b90bab96ead2d368858623 # original US/EU BIOS - - a5c6a00818f97c5e3e91569ee22416dc # Chinese BIOS - - 37c921eb47532cae8fb70e5d987ce91c # Japanese BIOS - - f2cd29d09f3e29984bcea22ab2e006fe # revised BIOS without MIL-CD - note: "Dreamcast boot ROM. Validated against known MD5 hashes at load." + - a5c6a00818f97c5e3e91569ee22416dc + - 37c921eb47532cae8fb70e5d987ce91c + - f2cd29d09f3e29984bcea22ab2e006fe + - e10c53c2f8b90bab96ead2d368858623 + note: "Dreamcast boot ROM. Four known variants accepted." source_ref: "src/guest/rom/boot.c:12-80" - name: "flash.bin" system: sega-dreamcast - path: "dc/flash.bin" - required: true - size: 131072 # 128 KB (0x20000) - md5: - - 0a93f7940c455905bea6e392dfde92a4 - note: "Dreamcast flash memory (date, time, language). Written back on shutdown." - source_ref: "src/guest/rom/flash.c:25-35" - -platform_details: - dreamcast: - bios_size: 2097152 # 2 MB - flash_size: 131072 # 128 KB - hle_available: false - source_ref: "src/guest/rom/boot.c, src/guest/rom/flash.c" + path: "flash.bin" + required: false + size: 131072 + validation: [size] + note: "Dreamcast flash memory. Written back on shutdown." + source_ref: "src/guest/rom/flash.c:25-71" diff --git a/emulators/romcleaner.yml b/emulators/romcleaner.yml index 6f5fc00a..124a4223 100644 --- a/emulators/romcleaner.yml +++ b/emulators/romcleaner.yml @@ -1,7 +1,9 @@ emulator: ROM Cleaner type: utility -source: "https://github.com/libretro/libretro-database" -profiled_date: "2026-03-18" +core_classification: pure_libretro +source: "https://github.com/JesseTG/rom-cleaner" +upstream: "https://github.com/JesseTG/rom-cleaner" +profiled_date: "2026-03-25" core_version: "1.0.0" display_name: "ROM Cleaner" cores: @@ -9,10 +11,8 @@ cores: systems: [] notes: | - ROM Cleaner is a utility core for identifying and cleaning ROM - headers. Uses the libretro database for ROM identification via - CRC32/SHA1 matching. - - No BIOS or system files required. + Utility core that simulates blowing dust off a cartridge via microphone + input. All visual and audio assets are compiled into the binary. + No external files required. files: [] diff --git a/emulators/rustation.yml b/emulators/rustation.yml index 86a9ed97..131f0ee7 100644 --- a/emulators/rustation.yml +++ b/emulators/rustation.yml @@ -1,21 +1,24 @@ emulator: Rustation type: libretro +core_classification: official_port source: "https://github.com/libretro/rustation-libretro" -profiled_date: "2026-03-18" +upstream: "https://github.com/simias/rustation" +profiled_date: "2026-03-25" core_version: "v1" display_name: "Sony - PlayStation (Rustation)" cores: [rustation] systems: [sony-playstation] -bios_size: 524288 # 512 KB, enforced before SHA-256 check -verification: sha256 + notes: > - No filename requirement: the core scans every file in the system directory, - filters by exact 512 KB size, then validates the full binary against an internal - SHA-256 database (lifted from Mednafen). Region must match the loaded disc - (Japan, NorthAmerica, Europe). Known-bad dumps are rejected even if hash matches. - "Boot to BIOS menu" option allows booting without a disc. - No HLE fallback: a real, database-matched BIOS is mandatory. - Database contains 24 entries (22 good, 2 known_bad) covering BIOS versions 1.0 through 4.5. + Scans every file in the system directory, filters by exact 512 KB size, + then validates the full binary against an internal SHA-256 database + (lifted from Mednafen). Region must match the loaded disc. Known-bad + dumps are rejected. No filename requirement. No HLE fallback. + "Boot to BIOS menu" core option allows booting without a disc. + Database contains 24 entries (22 good, 2 known-bad rejected) + covering BIOS versions 1.0 through 4.5. + .info declares firmware_count=0; incorrect. + Project abandoned, superseded by rustation-ng. files: # -- Region: Japan -- @@ -24,10 +27,11 @@ files: description: "SCPH-5500 (v3.0 J)" region: "NTSC-J" required: true + size: 524288 + validation: [size, sha256] md5: "8dd7d5296a650fac7319bce665a6a53c" sha256: "9c0421858e217805f4abe18698afea8d5aa36ff0727eb8484944e00eb5e7eadb" - source_ref: "rustation/src/bios/db.rs:226-232 (v3.0 Japan)" - notes: "Any filename works. Core matches by SHA-256, not name. v3.0 is the standard JP BIOS." + source_ref: "rustation/src/bios/db.rs:158-167 (v3.0 Japan)" # -- Region: North America -- @@ -35,10 +39,11 @@ files: description: "SCPH-5501 (v3.0 A)" region: "NTSC-U" required: true + size: 524288 + validation: [size, sha256] md5: "490f666e1afb15b7362b406ed1cea246" sha256: "11052b6499e466bbf0a709b1f9cb6834a9418e66680387912451e971cf8a1fef" - source_ref: "rustation/src/bios/db.rs:234-244 (v3.0 NorthAmerica)" - notes: "Any filename works. Only NA BIOS with animation_jump_hook and debug UART patch support." + source_ref: "rustation/src/bios/db.rs:168-177 (v3.0 NorthAmerica)" # -- Region: Europe -- @@ -46,149 +51,185 @@ files: description: "SCPH-5502 (v3.0 E)" region: "PAL" required: true + size: 524288 + validation: [size, sha256] md5: "32736f17079d0b2b7024407c39bd3050" sha256: "1faaa18fa820a0225e488d9f086296b8e6c46df739666093987ff7d8fd352c09" - source_ref: "rustation/src/bios/db.rs:246-256 (v3.0 Europe)" - notes: "Any filename works. Core matches by SHA-256, not name." + source_ref: "rustation/src/bios/db.rs:178-187 (v3.0 Europe)" - # -- Additional accepted BIOS versions (all validated by SHA-256 scan) -- - # The core accepts any of the 22 good entries below. Only one per region is needed. - # Listed here for completeness; scph5500/5501/5502 above are the standard choices. + # -- Alternatives: any of the 22 good entries is accepted. One per region needed. -- # Japan alternatives - name: "scph1000.bin" description: "SCPH-1000 (v1.0 J)" region: "NTSC-J" required: false + size: 524288 + validation: [size, sha256] sha256: "cfc1fc38eb442f6f80781452119e931bcae28100c1c97e7e6c5f2725bbb0f8bb" - source_ref: "rustation/src/bios/db.rs:77-88 (v1.0 Japan)" + source_ref: "rustation/src/bios/db.rs:38-47 (v1.0 Japan)" - name: "scph_v11j.bin" description: "v1.1 J" region: "NTSC-J" required: false + size: 524288 + validation: [size, sha256] sha256: "5eb3aee495937558312b83b54323d76a4a015190decd4051214f1b6df06ac34b" - source_ref: "rustation/src/bios/db.rs:89-100 (v1.1 Japan)" + source_ref: "rustation/src/bios/db.rs:48-57 (v1.1 Japan)" - name: "scph3000.bin" description: "SCPH-3000 (v2.1 J)" region: "NTSC-J" required: false + size: 524288 + validation: [size, sha256] sha256: "6f71ca1e716da761dc53187bd39e00c213f566e55090708fd3e2b4b425c8c989" - source_ref: "rustation/src/bios/db.rs:126-136 (v2.1 Japan)" + source_ref: "rustation/src/bios/db.rs:78-87 (v2.1 Japan)" - name: "scph3500.bin" description: "SCPH-3500 (v2.2 J)" region: "NTSC-J" required: false + size: 524288 + validation: [size, sha256] sha256: "0c8359870cbac0ea091f1c87f188cd332dcc709753b91cafd9fd44a4a6188197" - source_ref: "rustation/src/bios/db.rs:162-172 (v2.2 Japan, good)" + source_ref: "rustation/src/bios/db.rs:108-117 (v2.2 Japan)" notes: "A known-bad v2.2 J dump also exists in the DB but is rejected." - name: "scph5000.bin" description: "v2.2 J (alt)" region: "NTSC-J" required: false + size: 524288 + validation: [size, sha256] sha256: "4018749b3698b8694387beebcbabfb48470513066840f9441459ee4c9f0f39bc" - source_ref: "rustation/src/bios/db.rs:209-220 (v2.2 Japan, alt)" + source_ref: "rustation/src/bios/db.rs:148-157 (v2.2 Japan alt)" - name: "scph7000.bin" description: "SCPH-7000 (v4.0 J)" region: "NTSC-J" required: false + size: 524288 + validation: [size, sha256] sha256: "e900504d1755f021f861b82c8258c5e6658c7b592f800cccd91f5d32ea380d28" - source_ref: "rustation/src/bios/db.rs:269-281 (v4.0 Japan)" - notes: "Shares animation_jump_hook patch with NA v3.0." + source_ref: "rustation/src/bios/db.rs:198-207 (v4.0 Japan)" - name: "scph7500.bin" description: "SCPH-7500 (v4.1 J)" region: "NTSC-J" required: false + size: 524288 + validation: [size, sha256] sha256: "b3aa63cf30c81e0a40641740f4a43e25fda0b21b792fa9aaef60ce1675761479" - source_ref: "rustation/src/bios/db.rs:283-293 (v4.1 Japan)" + source_ref: "rustation/src/bios/db.rs:208-217 (v4.1 Japan)" - name: "scph9000.bin" description: "SCPH-9000 (v4.3 J)" region: "NTSC-J" required: false + size: 524288 + validation: [size, sha256] sha256: "b29b4b5fcddef369bd6640acacda0865e0366fcf7ea54e40b2f1a8178004f89a" - source_ref: "rustation/src/bios/db.rs:318-329 (v4.3 Japan)" + source_ref: "rustation/src/bios/db.rs:238-247 (v4.3 Japan)" # North America alternatives - name: "scph1001.bin" description: "SCPH-1001 (v2.0 A)" region: "NTSC-U" required: false + size: 524288 + validation: [size, sha256] sha256: "42e4124be7623e2e28b1db0d8d426539646faee49d74b71166d8ba5bd7c472ed" - source_ref: "rustation/src/bios/db.rs:101-112 (v2.0 NorthAmerica)" + source_ref: "rustation/src/bios/db.rs:58-67 (v2.0 NorthAmerica)" - name: "scph5001.bin" description: "SCPH-5001 (v2.1 A)" region: "NTSC-U" required: false + size: 524288 + validation: [size, sha256] sha256: "6ad5521d105a6b86741f1af8da2e6ea1c732d34459940618c70305a105e8ec10" - source_ref: "rustation/src/bios/db.rs:138-148 (v2.1 NorthAmerica)" + source_ref: "rustation/src/bios/db.rs:88-97 (v2.1 NorthAmerica)" - name: "scph_v22a.bin" description: "v2.2 A" region: "NTSC-U" required: false + size: 524288 + validation: [size, sha256] sha256: "71af94d1e47a68c11e8fdb9f8368040601514a42a5a399cda48c7d3bff1e99d3" - source_ref: "rustation/src/bios/db.rs:186-196 (v2.2 NorthAmerica)" + source_ref: "rustation/src/bios/db.rs:128-137 (v2.2 NorthAmerica)" - name: "scph7001.bin" description: "SCPH-7001 (v4.1 A)" region: "NTSC-U" required: false + size: 524288 + validation: [size, sha256] sha256: "39dcc1a0717036c9b6ac52fefd1ee7a57d3808e8cfbc755879fa685a0a738278" - source_ref: "rustation/src/bios/db.rs:294-305 (v4.1 NorthAmerica)" + source_ref: "rustation/src/bios/db.rs:218-227 (v4.1 NorthAmerica)" - name: "scph101.bin" description: "SCPH-101 (v4.5 A)" region: "NTSC-U" required: false + size: 524288 + validation: [size, sha256] sha256: "aca9cbfa974b933646baad6556a867eca9b81ce65d8af343a7843f7775b9ffc8" - source_ref: "rustation/src/bios/db.rs:342-353 (v4.5 NorthAmerica)" + source_ref: "rustation/src/bios/db.rs:258-267 (v4.5 NorthAmerica)" # Europe alternatives - name: "scph1002.bin" description: "SCPH-1002 (v2.0 E)" region: "PAL" required: false + size: 524288 + validation: [size, sha256] sha256: "0af2be3468d30b6018b3c3b0d98b8b64347e255e16d874d55f0363648973dbf0" - source_ref: "rustation/src/bios/db.rs:113-124 (v2.0 Europe)" + source_ref: "rustation/src/bios/db.rs:68-77 (v2.0 Europe)" - name: "scph_v21e.bin" description: "v2.1 E" region: "PAL" required: false + size: 524288 + validation: [size, sha256] sha256: "1efb0cfc5db8a8751a884c5312e9c6265ca1bc580dc0c2663eb2dea3bde9fcf7" - source_ref: "rustation/src/bios/db.rs:149-160 (v2.1 Europe)" + source_ref: "rustation/src/bios/db.rs:98-107 (v2.1 Europe)" - name: "scph_v22e.bin" description: "v2.2 E" region: "PAL" required: false + size: 524288 + validation: [size, sha256] sha256: "3d06d2c469313c2a2128d24fe2e0c71ff99bc2032be89a829a62337187f500b7" - source_ref: "rustation/src/bios/db.rs:198-208 (v2.2 Europe)" + source_ref: "rustation/src/bios/db.rs:138-147 (v2.2 Europe)" - name: "scph7002.bin" description: "SCPH-7002 (v4.1 E)" region: "PAL" required: false + size: 524288 + validation: [size, sha256] sha256: "5e84a94818cf5282f4217591fefd88be36b9b174b3cc7cb0bcd75199beb450f1" - source_ref: "rustation/src/bios/db.rs:306-317 (v4.1 Europe)" + source_ref: "rustation/src/bios/db.rs:228-237 (v4.1 Europe)" - name: "scph102.bin" description: "SCPH-102 (v4.4 E)" region: "PAL" required: false + size: 524288 + validation: [size, sha256] sha256: "5c0166da24e27deaa82246de8ff0108267fe4bb59f6df0fdec50e05e62448ca4" - source_ref: "rustation/src/bios/db.rs:330-341 (v4.4 Europe)" + source_ref: "rustation/src/bios/db.rs:248-257 (v4.4 Europe)" - name: "scph102_v45.bin" description: "v4.5 E" region: "PAL" required: false + size: 524288 + validation: [size, sha256] sha256: "42244b0c650821519751b7e77ad1d3222a0125e75586df2b4e84ba693b9809dc" - source_ref: "rustation/src/bios/db.rs:354-365 (v4.5 Europe)" + source_ref: "rustation/src/bios/db.rs:268-277 (v4.5 Europe)" diff --git a/emulators/rvvm.yml b/emulators/rvvm.yml index f4af4807..cb815e0c 100644 --- a/emulators/rvvm.yml +++ b/emulators/rvvm.yml @@ -1,21 +1,23 @@ emulator: RVVM type: libretro +core_classification: official_port source: "https://github.com/LekKit/RVVM" -profiled_date: "2026-03-18" +upstream: "https://github.com/LekKit/RVVM" +profiled_date: "2026-03-25" core_version: "0.6-git" display_name: "RVVM" +cores: [rvvm] systems: [riscv] -# RVVM is a RISC-V virtual machine / emulator. The libretro core loads a -# ".rvvm" config file that specifies bootrom, kernel, nvme drives, memory, -# CPU mode (rv32/rv64), cmdline, and framebuffer resolution. +# RVVM emulates a RISC-V machine (rv64imafdcb or rv32ima). The libretro core +# loads a .rvvm plain-text config file specifying bootrom, kernel, nvme drives, +# memory, CPU mode, cmdline, and framebuffer resolution. # -# The core itself does NOT bundle any firmware. Users must supply: -# 1. A bootrom (M-mode firmware): typically OpenSBI fw_payload.bin or fw_jump.bin -# 2. Optionally a kernel payload (S-mode): Linux Image, U-Boot, etc. -# 3. Optionally a custom DTB (the core auto-generates one if not provided) +# The core does NOT use the RetroArch system directory. All firmware paths are +# specified in the .rvvm config file and resolved relative to its directory. +# The core chdir()s to the .rvvm file's parent before initializing the VM. # -# The .rvvm file is a plain-text key=value config parsed by retro_load_game(): +# The .rvvm config format (parsed by retro_load_game): # bootrom=/path/to/fw_payload.bin # kernel=/path/to/Image # nvme=/path/to/rootfs.img @@ -24,80 +26,54 @@ systems: [riscv] # rv64 # cmdline=root=/dev/nvme0n1 rootflags=discard rw console=tty0 # -# Paths in the .rvvm file are resolved relative to the .rvvm file's directory -# (the core chdir()s there before vm_init). The bootrom is mandatory - the core -# shows "RVVM: No bootrom" if missing. +# The libretro binding uses an older RVVM API (rvvm_load_bootrom, 4-param +# rvvm_create_machine) that has been renamed in the current upstream +# (rvvm_load_firmware, 3-param rvvm_create_machine). The binding may not +# compile against RVVM HEAD without updates. # Source references: -# libretro binding: src/bindings/libretro/libretro.c -# firmware loading: src/rvvm.c:rvvm_load_firmware() -# kernel loading: src/rvvm.c:rvvm_load_kernel() (offset 0x200000 rv64, 0x400000 rv32) -# FDT generation: src/rvvm.c:rvvm_init_fdt() (auto-generated if not provided) -# CLI help: src/main.c:rvvm_print_help() +# libretro binding: src/bindings/libretro/libretro.c +# config parsing: libretro.c:332-421 (retro_load_game) +# VM init + loading: libretro.c:288-330 (vm_init) +# firmware loading: rvvm.c:621-628 (rvvm_load_firmware) +# kernel loading: rvvm.c:630-638 (rvvm_load_kernel) +# FDT loading: rvvm.c:641-648 (rvvm_load_fdt, standalone only) +# standalone CLI: main.c:213-282 (rvvm_cli_configure) files: - # -- OpenSBI firmware (required) -- - # M-mode firmware loaded at RESET_PC (0x80000000). This is the first code - # executed by the virtual machine. The standard choice is OpenSBI with - # U-Boot as payload (fw_payload.bin) or OpenSBI standalone (fw_jump.bin). - # The core calls rvvm_load_bootrom() which maps to rvvm_load_firmware(). - - name: "fw_payload.bin" path: "rvvm/fw_payload.bin" required: true - source_ref: "libretro.c:309-315, rvvm.c:621-628" + source_ref: "libretro.c:309-314, rvvm.c:621-628" note: > - OpenSBI firmware with U-Boot payload. This is the M-mode bootrom - loaded at physical address 0x80000000. Without this file, the VM - cannot start. Common builds: opensbi fw_payload (includes U-Boot), - or fw_jump.bin (jumps to kernel directly). The file is referenced - by the bootrom= key in the .rvvm config file. - - # -- Kernel image (optional) -- - # S-mode kernel loaded at offset 0x200000 (rv64) or 0x400000 (rv32) from - # RAM base. Used with fw_jump.bin to boot Linux directly without U-Boot. + M-mode firmware loaded at 0x80000000. Typically OpenSBI with U-Boot + payload (fw_payload.bin) or standalone (fw_jump.bin). Referenced by + the bootrom= key in the .rvvm config. - name: "Image" path: "rvvm/Image" required: false source_ref: "libretro.c:316-318, rvvm.c:630-638" note: > - Linux kernel image or other S-mode payload. Loaded at a fixed offset - from RAM base (0x200000 for rv64, 0x400000 for rv32). Only needed - when using fw_jump.bin as bootrom. Referenced by the kernel= key - in the .rvvm config file. - - # -- Device Tree Blob (optional) -- - # Custom FDT passed to the guest. The core auto-generates a complete DTB - # with cpu topology, memory map, and all attached devices if not provided. + S-mode kernel payload loaded at offset 0x200000 (rv64) or 0x400000 + (rv32) from RAM base. Only needed with fw_jump.bin as bootrom. + Referenced by the kernel= key in the .rvvm config. - name: "machine.dtb" path: "rvvm/machine.dtb" required: false - source_ref: "rvvm.c:641-648, main.c:230" + mode: standalone + source_ref: "main.c:230, rvvm.c:641-648" note: > - Custom Flattened Device Tree. The core generates a DTB automatically - based on the machine configuration (cpus, memory, devices), so this - is only needed for special setups. The FDT address is passed to the - firmware in register a1 at boot. + Custom Flattened Device Tree. The core auto-generates a DTB based on + machine configuration. The libretro binding does not parse a dtb= key + in the .rvvm config, so this is only usable via the standalone CLI + (-dtb flag). notes: - emulation_target: > - RVVM emulates a RISC-V machine with rv64imafdcb (or rv32ima) ISA, - SiFive PLIC interrupt controller, NVMe storage, RTL8169 networking, - framebuffer display, HID keyboard/mouse, UART, Goldfish RTC, and - PCI bus. It includes a tracing JIT with x86_64/ARM64/RISC-V backends. firmware_sources: > - OpenSBI builds: https://github.com/riscv-software-src/opensbi/releases - Pre-built fw_payload.bin (OpenSBI + U-Boot) for RVVM: - https://github.com/LekKit/RVVM/wiki/Running - config_format: > - The .rvvm file is a plain-text key=value config. Supported keys: - bootrom, kernel, nvme (up to 4), mem (MB), smp, cmdline, rv64/rv32. - Default: rv64, 256 MB RAM, 1 core, 640x480 framebuffer. - libretro_info: > - Core name: rvvm_libretro. Extension: .rvvm. Experimental: yes. - No save states, no cheats, needs_fullpath=true. - The core does not use the RetroArch system directory for firmware - - all paths are specified in the .rvvm config file relative to its - own directory. + OpenSBI: https://github.com/riscv-software-src/opensbi/releases. + Pre-built images for RVVM: https://github.com/LekKit/RVVM/wiki/Running + info_firmware_count: > + .info declares 0 firmware. Correct: the core loads firmware via + user-specified paths in the .rvvm config, not from system_dir. diff --git a/emulators/same_cdi.yml b/emulators/same_cdi.yml index 6f67ea14..161e9ec1 100644 --- a/emulators/same_cdi.yml +++ b/emulators/same_cdi.yml @@ -1,226 +1,179 @@ emulator: SAME CDi type: libretro -cores: [same_cdi] +core_classification: community_fork source: "https://github.com/libretro/same_cdi" -profiled_date: "2026-03-18" +upstream: "https://github.com/mamedev/mame" +profiled_date: "2026-03-25" core_version: "Git" display_name: "Philips - CDi (SAME CDi)" +cores: [same_cdi] systems: - cdi notes: | SAME CDi is a Single Arcade Machine Emulator fork of MAME libretro, stripped down to just the Philips CD-i driver. The core hardcodes "cdimono1" as the - forced system (retro_init.cpp:86) and searches for MAME ROM ZIPs in: + forced system (retro_init.cpp:86,454) and searches for MAME ROM ZIPs in: /same_cdi/bios/ The ROM path (-rp) is built at retro_init.cpp:534 as: ;/same_cdi/bios/ - MAME expects each romset as a ZIP containing the individual ROM files listed - below. The ZIP filenames (cdimono1.zip, cdimono2.zip, cdibios.zip) match - the MAME driver names. Only cdimono1.zip is required for consumer CD-i games; - cdimono2.zip and cdibios.zip are optional (Mono-II and Quizard arcade). + MAME expects each romset as a ZIP containing the individual ROM files. + The ZIP filenames match the MAME driver names. Only cdimono1.zip is required + for consumer CD-i games; other ZIPs are for alternate hardware models or + Quizard arcade (unreachable without boot_from_cli core option). - cdi2015 is an older MAME 2015-based CD-i core with the same BIOS layout. + The driver includes 5 system ROM sets (cdimono1, cdi910, cdimono2, cdi490a, + cdibios) plus Quizard arcade game ROM sets (clones of cdibios with i8751 + protection MCU dumps). Upstream MAME has additional ROM sets not present + in this fork (gpi1200, Italian Quizard variants, cdimono2 alternate BIOS). - ROM definitions: src/mame/drivers/cdi.cpp lines 574-650. - System forced: src/osd/libretro/libretro-internal/retro_init.cpp:86. - BIOS path: src/osd/libretro/libretro-internal/retro_init.cpp:534. - Firmware list: same_cdi_libretro.info firmware0-2. + ROM definitions: src/mame/drivers/cdi.cpp:574-640. + Quizard game ROMs: src/mame/drivers/cdi.cpp:662-820. + System forced: retro_init.cpp:86,454,525. + BIOS path: retro_init.cpp:534. files: - # ===================================================== - # cdimono1.zip - Philips CD-i Mono-I (PAL) - REQUIRED - # Contains main CPU BIOS + servo/slave MCU dumps - # ===================================================== - - # Main CPU BIOS (one of three, selected via MAME BIOS switch) - - name: "cdi200.rom" - zip: "cdimono1.zip" - system: cdi - region: [north-america] - required: true - size: 524288 # 0x80000 - crc32: "40c4e6b9" - sha1: "d961de803c89b3d1902d656ceb9ce7c02dccb40a" - note: "Magnavox CD-i 200 BIOS. Default BIOS for cdimono1." - source_ref: "src/mame/drivers/cdi.cpp:577" - - - name: "cdi220b.rom" - zip: "cdimono1.zip" - system: cdi - region: [europe] - required: true - size: 524288 # 0x80000 - crc32: "279683ca" - sha1: "53360a1f21ddac952e95306ced64186a3fc0b93e" - note: "Philips CD-i 220 F2 BIOS. Alternate BIOS for cdimono1." - source_ref: "src/mame/drivers/cdi.cpp:579" - - - name: "cdi220.rom" - zip: "cdimono1.zip" - system: cdi - region: [europe] - required: false - size: 524288 # 0x80000 - crc32: "584c0af8" - sha1: "5d757ab46b8c8fc36361555d978d7af768342d47" - note: "Philips CD-i 220 BIOS (alternate, does not boot). Marked non-working." - source_ref: "src/mame/drivers/cdi.cpp:581" - - # Servo MCU (MC68HC705C8A) - shared with cdi910 dump, BAD_DUMP - - name: "zx405037p__cdi_servo_2.1__b43t__llek9215.mc68hc705c8a_withtestrom.7201" - zip: "cdimono1.zip" + - name: cdimono1.zip + category: bios_zip system: cdi required: true - size: 8192 # 0x2000 - crc32: "7a3af407" - sha1: "fdf8d78d6a0df4a56b5b963d72eabd39fcec163f" - note: "Servo MCU 2.1, taken from cdi910 (BAD_DUMP, no Mono-I specific dump)." - source_ref: "src/mame/drivers/cdi.cpp:584" + note: "Forced system. Main CPU BIOS (3 region variants via MAME BIOS switch) + servo/slave MCU dumps." + source_ref: "src/mame/drivers/cdi.cpp:574-589" + contents: + - name: cdi200.rom + description: Magnavox CD-i 200 BIOS (default, US) + size: 524288 + crc32: "40c4e6b9" + sha1: "d961de803c89b3d1902d656ceb9ce7c02dccb40a" + - name: cdi220b.rom + description: Philips CD-i 220 F2 BIOS (alternate, PAL) + size: 524288 + crc32: "279683ca" + sha1: "53360a1f21ddac952e95306ced64186a3fc0b93e" + - name: cdi220.rom + description: Philips CD-i 220 BIOS (non-working, does not boot) + size: 524288 + crc32: "584c0af8" + sha1: "5d757ab46b8c8fc36361555d978d7af768342d47" + - name: "zx405037p__cdi_servo_2.1__b43t__llek9215.mc68hc705c8a_withtestrom.7201" + description: Servo MCU 2.1 MC68HC705C8A (BAD_DUMP, from cdi910) + size: 8192 + crc32: "7a3af407" + sha1: "fdf8d78d6a0df4a56b5b963d72eabd39fcec163f" + - name: "zx405042p__cdi_slave_2.0__b43t__zzmk9213.mc68hc705c8a_withtestrom.7206" + description: Slave MCU 2.0 MC68HC705C8A (BAD_DUMP, from cdi910) + size: 8192 + crc32: "688cda63" + sha1: "56d0acd7caad51c7de703247cd6d842b36173079" - # Slave MCU (MC68HC705C8A) - shared with cdi910 dump, BAD_DUMP - - name: "zx405042p__cdi_slave_2.0__b43t__zzmk9213.mc68hc705c8a_withtestrom.7206" - zip: "cdimono1.zip" - system: cdi - required: true - size: 8192 # 0x2000 - crc32: "688cda63" - sha1: "56d0acd7caad51c7de703247cd6d842b36173079" - note: "Slave MCU 2.0, taken from cdi910 (BAD_DUMP, no Mono-I specific dump)." - source_ref: "src/mame/drivers/cdi.cpp:587" - - # ===================================================== - # cdimono2.zip - Philips CD-i Mono-II (NTSC) - OPTIONAL - # MACHINE_NOT_WORKING in MAME - # ===================================================== - - - name: "philips__cdi-220_ph3_r1.2__mb834200b-15__02f_aa__9402_z04.tc574200-le._1.7211" - zip: "cdimono2.zip" + - name: cdimono2.zip + category: bios_zip system: cdi required: false - size: 524288 # 0x80000 - crc32: "17d723e7" - sha1: "6c317a82e35d60ca5e7a74fc99f665055693169d" - note: "Mono-II main CPU BIOS. Philips CDI-220 PH3 R1.2." - source_ref: "src/mame/drivers/cdi.cpp:623" + note: "CD-i Mono-II (NTSC). MACHINE_NOT_WORKING. Listed in .info as optional." + source_ref: "src/mame/drivers/cdi.cpp:609-618" + contents: + - name: "philips__cdi-220_ph3_r1.2__mb834200b-15__02f_aa__9402_z04.tc574200-le._1.7211" + description: Mono-II main CPU BIOS, Philips CDI-220 PH3 R1.2 + size: 524288 + crc32: "17d723e7" + sha1: "6c317a82e35d60ca5e7a74fc99f665055693169d" + - name: "zc405351p__servo_cdi_4.1__0d67p__lluk9404.mc68hc705c8a.7490" + description: Mono-II servo MCU 4.1 + size: 8192 + crc32: "2bc8e4e9" + sha1: "8cd052b532fc052d6b0077261c12f800e8655bb1" + - name: "zc405352p__slave_cdi_4.1__0d67p__lltr9403.mc68hc705c8a.7206" + description: Mono-II slave MCU 4.1 + size: 8192 + crc32: "5b19da07" + sha1: "cf02d84977050c71e87a38f1249e83c43a93949b" - - name: "zc405351p__servo_cdi_4.1__0d67p__lluk9404.mc68hc705c8a.7490" - zip: "cdimono2.zip" + - name: cdibios.zip + category: bios_zip system: cdi required: false - size: 8192 # 0x2000 - crc32: "2bc8e4e9" - sha1: "8cd052b532fc052d6b0077261c12f800e8655bb1" - note: "Mono-II servo MCU 4.1." - source_ref: "src/mame/drivers/cdi.cpp:626" + note: "CD-i BIOS for Quizard arcade. MACHINE_IS_BIOS_ROOT. Subset of cdimono1 + slave MCU." + source_ref: "src/mame/drivers/cdi.cpp:630-640" + contents: + - name: cdi200.rom + description: Magnavox CD-i 200 BIOS (same as cdimono1) + size: 524288 + crc32: "40c4e6b9" + sha1: "d961de803c89b3d1902d656ceb9ce7c02dccb40a" + - name: cdi220b.rom + description: Philips CD-i 220 F2 BIOS (same as cdimono1) + size: 524288 + crc32: "279683ca" + sha1: "53360a1f21ddac952e95306ced64186a3fc0b93e" + - name: "zx405042p__cdi_slave_2.0__b43t__zzmk9213.mc68hc705c8a_withtestrom.7206" + description: Slave MCU 2.0 (BAD_DUMP, same as cdimono1) + size: 8192 + crc32: "688cda63" + sha1: "56d0acd7caad51c7de703247cd6d842b36173079" - - name: "zc405352p__slave_cdi_4.1__0d67p__lltr9403.mc68hc705c8a.7206" - zip: "cdimono2.zip" + - name: cdi910.zip + category: bios_zip system: cdi required: false - size: 8192 # 0x2000 - crc32: "5b19da07" - sha1: "cf02d84977050c71e87a38f1249e83c43a93949b" - note: "Mono-II slave MCU 4.1." - source_ref: "src/mame/drivers/cdi.cpp:629" + note: "CD-i 910-17P Mini-MMC (PAL). MACHINE_NOT_WORKING. Not in .info firmware list." + source_ref: "src/mame/drivers/cdi.cpp:591-607" + contents: + - name: "philips__cd-i_2.1__mb834200b-15__26b_aa__9224_z01.tc574200.7211" + description: CD-i 910-17P Mini-MMC BIOS (default) + size: 524288 + crc32: "4ae3bee3" + sha1: "9729b4ee3ce0c17172d062339c47b1ab822b222b" + - name: cdi910.rom + description: CD-i 910 alternate BIOS + size: 524288 + crc32: "2f3048d2" + sha1: "11c4c3e602060518b52e77156345fa01f619e793" + - name: "zx405037p__cdi_servo_2.1__b43t__llek9215.mc68hc705c8a_withtestrom.7201" + description: Servo MCU 2.1 (same ROM as cdimono1, not BAD_DUMP here) + size: 8192 + crc32: "7a3af407" + sha1: "fdf8d78d6a0df4a56b5b963d72eabd39fcec163f" + - name: "zx405042p__cdi_slave_2.0__b43t__zzmk9213.mc68hc705c8a_withtestrom.7206" + description: Slave MCU 2.0 (same ROM as cdimono1, not BAD_DUMP here) + size: 8192 + crc32: "688cda63" + sha1: "56d0acd7caad51c7de703247cd6d842b36173079" + - name: "ti_portugal_206xf__tibpal20l8-15cnt__m7205n.7205.bin" + description: PAL chip dump + size: 324 + crc32: "dd167e0d" + sha1: "2ba82a4619d7a0f19e62e02a2841afd4d45d56ba" + - name: "ti_portugal_774_206xf__tibpal16l8-10cn_m7204n.7204.bin" + description: PAL chip dump + size: 260 + crc32: "04e6bd37" + sha1: "153d1a977291bedb7420484a9f889325dbd3628e" - # ===================================================== - # cdibios.zip - CD-i BIOS for Quizard arcade - OPTIONAL - # Subset of cdimono1 ROMs + slave MCU, used by Quizard games - # ===================================================== - - # cdibios reuses cdi200.rom and cdi220b.rom (same hashes as cdimono1) - # plus the slave MCU. Listed here for completeness of the ZIP contents. - - - name: "cdi200.rom" - zip: "cdibios.zip" + - name: cdi490a.zip + category: bios_zip system: cdi required: false - size: 524288 # 0x80000 - crc32: "40c4e6b9" - sha1: "d961de803c89b3d1902d656ceb9ce7c02dccb40a" - note: "Magnavox CD-i 200 BIOS (same as cdimono1). For Quizard arcade." - source_ref: "src/mame/drivers/cdi.cpp:639" - - - name: "cdi220b.rom" - zip: "cdibios.zip" - system: cdi - required: false - size: 524288 # 0x80000 - crc32: "279683ca" - sha1: "53360a1f21ddac952e95306ced64186a3fc0b93e" - note: "Philips CD-i 220 F2 BIOS (same as cdimono1). For Quizard arcade." - source_ref: "src/mame/drivers/cdi.cpp:641" - - - name: "zx405042p__cdi_slave_2.0__b43t__zzmk9213.mc68hc705c8a_withtestrom.7206" - zip: "cdibios.zip" - system: cdi - required: false - size: 8192 # 0x2000 - crc32: "688cda63" - sha1: "56d0acd7caad51c7de703247cd6d842b36173079" - note: "Slave MCU 2.0 (BAD_DUMP, same as cdimono1). For Quizard arcade." - source_ref: "src/mame/drivers/cdi.cpp:645" - - # ===================================================== - # Additional MAME romsets (not in libretro .info firmware list) - # These are part of the MAME driver but not declared as - # required firmware by the libretro core. - # ===================================================== - - # cdi910 - CD-i 910-17P Mini-MMC (PAL) - MACHINE_NOT_WORKING - - name: "philips__cd-i_2.1__mb834200b-15__26b_aa__9224_z01.tc574200.7211" - zip: "cdi910.zip" - system: cdi - required: false - size: 524288 # 0x80000 - crc32: "4ae3bee3" - sha1: "9729b4ee3ce0c17172d062339c47b1ab822b222b" - note: "CD-i 910-17P Mini-MMC BIOS. Not listed in libretro firmware." - source_ref: "src/mame/drivers/cdi.cpp:594" - - - name: "cdi910.rom" - zip: "cdi910.zip" - system: cdi - required: false - size: 524288 # 0x80000 - crc32: "2f3048d2" - sha1: "11c4c3e602060518b52e77156345fa01f619e793" - note: "CD-i 910 alternate BIOS. Not listed in libretro firmware." - source_ref: "src/mame/drivers/cdi.cpp:596" - - # cdi490a - CD-i 490 - MACHINE_NOT_WORKING - - name: "cdi490a.rom" - zip: "cdi490a.zip" - system: cdi - required: false - size: 524288 # 0x80000 - crc32: "e2f200f6" - sha1: "c9bf3c4c7e4fe5cbec3fe3fc993c77a4522ca547" - note: "CD-i 490 BIOS. Not listed in libretro firmware." - source_ref: "src/mame/drivers/cdi.cpp:633" - - - name: "impega.rom" - zip: "cdi490a.zip" - system: cdi - required: false - size: 262144 # 0x40000 - crc32: "84d6f6aa" - sha1: "02526482a0851ea2a7b582d8afaa8ef14a8bd914" - note: "CD-i 490 MPEG audio decoder ROM." - source_ref: "src/mame/drivers/cdi.cpp:636" - - - name: "vmpega.rom" - zip: "cdi490a.zip" - system: cdi - required: false - size: 262144 # 0x40000 - crc32: "db264e8b" - sha1: "be407fbc102f1731a0862554855e963e5a47c17b" - note: "CD-i 490 MPEG video decoder ROM." - source_ref: "src/mame/drivers/cdi.cpp:637" + note: "CD-i 490. MACHINE_NOT_WORKING. Not in .info firmware list." + source_ref: "src/mame/drivers/cdi.cpp:620-628" + contents: + - name: cdi490a.rom + description: CD-i 490 main CPU BIOS + size: 524288 + crc32: "e2f200f6" + sha1: "c9bf3c4c7e4fe5cbec3fe3fc993c77a4522ca547" + - name: impega.rom + description: MPEG audio decoder ROM + size: 262144 + crc32: "84d6f6aa" + sha1: "02526482a0851ea2a7b582d8afaa8ef14a8bd914" + - name: vmpega.rom + description: MPEG video decoder ROM + size: 262144 + crc32: "db264e8b" + sha1: "be407fbc102f1731a0862554855e963e5a47c17b" platform_details: cdi: @@ -232,4 +185,4 @@ platform_details: rom_path_flag: "-rp" rom_search_path: ";/same_cdi/bios/" supported_extensions: ["chd", "iso", "cue"] - source_ref: "retro_init.cpp:86,534 same_cdi_libretro.info" + source_ref: "retro_init.cpp:86,454,525,534" diff --git a/emulators/sameboy.yml b/emulators/sameboy.yml index a9f04fcf..ce0f285d 100644 --- a/emulators/sameboy.yml +++ b/emulators/sameboy.yml @@ -1,8 +1,10 @@ emulator: SameBoy type: libretro +core_classification: official_port source: "https://github.com/libretro/SameBoy" -profiled_date: "2026-03-18" -core_version: "0.14.7" +upstream: "https://github.com/LIJI32/SameBoy" +profiled_date: "2026-03-25" +core_version: "0.15.4" display_name: "Nintendo - Game Boy / Color (SameBoy)" cores: - sameboy @@ -13,128 +15,90 @@ systems: notes: | SameBoy is a high-accuracy Game Boy, Game Boy Color and Super Game Boy - emulator written by Lior Halphon (LIJI32). + emulator by LIJI32 (official_port: same author maintains upstream and + libretro fork). - All boot ROMs are optional. SameBoy ships its own open-source boot ROM - replacements compiled from BootROMs/*.asm and embedded directly into - the libretro core binary (extern arrays dmg_boot, cgb_boot, agb_boot, - sgb_boot, sgb2_boot in libretro.c:129-130). These built-in boot ROMs - are SameBoy-authored replacements, not Nintendo originals. + All boot ROMs are optional. SameBoy compiles open-source boot ROM + replacements from BootROMs/*.asm and embeds them into the libretro + binary (extern arrays dmg_boot, cgb_boot, agb_boot, sgb_boot, + sgb2_boot in libretro.c:129-130). These are SameBoy-authored + replacements, not Nintendo originals. - The libretro port (libretro.c boot_rom_load(), line 513) tries to load - an external boot ROM from the system directory first. The filename is - constructed as "{model}_boot.bin" where model is one of: dmg0, dmg, - mgb, sgb, sgb2, cgb0, cgb, agb. If the file is missing or unreadable, - the embedded boot ROM is used as fallback. + The libretro port (boot_rom_load, libretro.c:512-588) tries to load + an external boot ROM from the system directory first. Filename is + constructed as "{model}_boot.bin". If missing, the embedded boot ROM + is used as fallback. - Boot ROM type selection depends on the emulated model configured via - the sameboy_model core option (request_boot_rom in Core/gb.c:1588): + Boot ROM selection depends on the sameboy_model core option + (request_boot_rom in Core/gb.c:1587-1625): DMG_B -> GB_BOOT_ROM_DMG -> dmg_boot.bin - MGB -> GB_BOOT_ROM_MGB -> mgb_boot.bin - SGB/SGB_NTSC -> GB_BOOT_ROM_SGB -> sgb_boot.bin + SGB_NTSC/PAL -> GB_BOOT_ROM_SGB -> sgb_boot.bin SGB2 -> GB_BOOT_ROM_SGB2 -> sgb2_boot.bin - CGB_0 -> GB_BOOT_ROM_CGB_0 -> cgb0_boot.bin - CGB_A..CGB_E -> GB_BOOT_ROM_CGB -> cgb_boot.bin - AGB_A (GBA) -> GB_BOOT_ROM_AGB -> agb_boot.bin + CGB_A..E -> GB_BOOT_ROM_CGB -> cgb_boot.bin + AGB_A/GBP_A -> GB_BOOT_ROM_AGB -> agb_boot.bin - Built-in fallback mapping (some models share a boot ROM): - DMG_0 and MGB reuse dmg_boot (not yet separately implemented) - CGB_0 reuses cgb_boot (not yet separately implemented) + .info declares firmware_count=2 (dmg, cgb only). Actual reachable + files in the libretro port are 5 (adds sgb, sgb2, agb). - The boot ROM buffer is 0x900 (2304) bytes. DMG/MGB/SGB/SGB2 boot ROMs - are 256 bytes (mapped at 0x0000-0x00FF). CGB/AGB boot ROMs are 2304 - bytes (mapped at 0x0000-0x00FF and 0x0200-0x08FF). + Unreachable boot ROMs in the libretro port (array entries exist in + boot_rom_load but no model option triggers them): + - dmg0_boot.bin: GB_MODEL_DMG_0 commented out (Core/gb.h:100) + - mgb_boot.bin: GB_MODEL_MGB active but not exposed by core options + - cgb0_boot.bin: GB_MODEL_CGB_0 active but not exposed by core options + Upstream standalone (v1.0.3) supports these plus cgbE_boot.bin and + agb0_boot.bin (10 boot ROM types total). - SameDuck (MegaDuck emulator) is a separate project, not part of this - core. + No validation performed on loaded boot ROMs. GB_load_boot_rom_from_buffer + (Core/gb.c:266-273) does a plain memcpy capped at 0x900 bytes. files: - # --- DMG boot ROM (optional, built-in fallback) --- - name: "dmg_boot.bin" system: nintendo-gb - description: "Original Game Boy (DMG) boot ROM" + description: "Game Boy (DMG) boot ROM" required: false hle_fallback: true size: 256 - source_ref: "libretro.c:519,530,556 (boot_rom_load)" - notes: "Also used as fallback for DMG_0 and MGB models when dedicated boot ROMs are absent." + source_ref: "libretro.c:519,530,556 (boot_rom_load); Core/gb.c:1594 (request_boot_rom)" - # --- MGB boot ROM (optional, built-in fallback) --- - - name: "mgb_boot.bin" - system: nintendo-gb - description: "Game Boy Pocket (MGB) boot ROM" - required: false - hle_fallback: true - size: 256 - source_ref: "libretro.c:520,531,556" - notes: "Built-in fallback reuses dmg_boot (mgb not separately implemented yet)." - - # --- SGB boot ROM (optional, built-in fallback) --- - name: "sgb_boot.bin" system: nintendo-sgb description: "Super Game Boy (SGB) boot ROM" required: false hle_fallback: true size: 256 - source_ref: "libretro.c:521,532,556" - notes: "Used for SGB and SGB_NTSC models. Also loaded temporarily when borrowing SGB border for non-SGB games." + source_ref: "libretro.c:521,532,556; Core/gb.c:1600-1604" + notes: "Used for SGB_NTSC, SGB_PAL models. Also loaded when borrowing SGB border (Core/gb.c:264)." - # --- SGB2 boot ROM (optional, built-in fallback) --- - name: "sgb2_boot.bin" system: nintendo-sgb description: "Super Game Boy 2 (SGB2) boot ROM" required: false hle_fallback: true size: 256 - source_ref: "libretro.c:522,533,556" - notes: "Separate from sgb_boot.bin, unlike some other cores that merge SGB/SGB2." + source_ref: "libretro.c:522,533,556; Core/gb.c:1607" - # --- CGB boot ROM (optional, built-in fallback) --- - name: "cgb_boot.bin" system: nintendo-gbc description: "Game Boy Color (CGB) boot ROM" required: false hle_fallback: true size: 2304 - source_ref: "libretro.c:524,535,556" - notes: "Also used as fallback for CGB_0 model (not separately implemented yet)." + source_ref: "libretro.c:524,535,556; Core/gb.c:1613-1618" + notes: "Used for CGB revisions A through E in the libretro port." - # --- CGB0 boot ROM (optional, built-in fallback) --- - - name: "cgb0_boot.bin" - system: nintendo-gbc - description: "Game Boy Color early revision (CGB-0) boot ROM" - required: false - hle_fallback: true - size: 2304 - source_ref: "libretro.c:523,534,556" - notes: "Built-in fallback reuses cgb_boot (cgb0 not separately implemented yet)." - - # --- AGB boot ROM (optional, built-in fallback) --- - name: "agb_boot.bin" system: nintendo-gbc description: "Game Boy Advance in GBC mode (AGB) boot ROM" required: false hle_fallback: true size: 2304 - source_ref: "libretro.c:525,536,556" - notes: "Used when emulating a GBA running GB/GBC software. Enables GBA-enhanced palettes in compatible GBC games." - - # --- DMG0 boot ROM (optional, built-in fallback) --- - - name: "dmg0_boot.bin" - system: nintendo-gb - description: "Original Game Boy early revision (DMG-0) boot ROM" - required: false - hle_fallback: true - size: 256 - source_ref: "SDL/main.c:640 (standalone), libretro.c:518,529" - notes: "Only referenced in standalone SDL build filename list. Built-in fallback reuses dmg_boot." + source_ref: "libretro.c:525,536,556; Core/gb.c:1621" + notes: "Enables GBA-enhanced palettes in compatible GBC games." builtin_boot_roms: description: | - SameBoy includes open-source boot ROM replacements compiled from - assembly source in BootROMs/ directory. These are NOT Nintendo - originals. They reproduce the boot animation and hardware - initialization but are clean-room implementations. + Open-source boot ROM replacements compiled from BootROMs/ assembly. + Not Nintendo originals. sources: - "BootROMs/dmg_boot.asm -> dmg_boot (256 bytes)" - "BootROMs/sgb_boot.asm -> sgb_boot (256 bytes)" @@ -157,4 +121,3 @@ builtin_boot_roms: agb_boot.bin: md5: "7e095aa30941da3086fa0e9221335370" sha1: "3b6231bdf840fb889f402d0ae89f21adb077323a" - notes: "These are SameBoy's own boot ROMs, not Nintendo originals. The hashes above identify the built-in versions." diff --git a/emulators/sameduck.yml b/emulators/sameduck.yml index 1302df3e..677c6694 100644 --- a/emulators/sameduck.yml +++ b/emulators/sameduck.yml @@ -1,8 +1,25 @@ -emulator: "sameduck" -type: alias -alias_of: "sameboy" -profiled_date: "2026-03-18" -core_version: "git" +emulator: sameduck +type: libretro +core_classification: official_port +source: "https://github.com/LIJI32/SameBoy" +upstream: "https://github.com/LIJI32/SameBoy" +profiled_date: "2026-03-25" +core_version: "0.13.6" display_name: "Mega Duck / Cougar Boy (SameDuck)" -note: "This core uses the same BIOS/firmware as sameboy. See emulators/sameboy.yml for details." +cores: + - sameduck +systems: + - mega-duck + +notes: | + SameDuck is the Mega Duck / Cougar Boy branch of SameBoy by LIJI32. + Built from the SameDuck branch of the upstream repo (no separate + libretro fork). The Mega Duck hardware has no boot ROM. All boot ROM + loading functions are stubs in this branch (GB_load_boot_rom returns 0, + request_boot_rom is empty, no BootROMs/ directory exists). + + The libretro port loads only game ROMs via GB_load_rom(). No + boot_rom_load_callback is set. retro_system_directory is stored but + never used for file loading. + files: [] diff --git a/emulators/scummvm.yml b/emulators/scummvm.yml index ba7df8ab..f8e2afed 100644 --- a/emulators/scummvm.yml +++ b/emulators/scummvm.yml @@ -1,10 +1,13 @@ emulator: ScummVM type: libretro +core_classification: game_engine source: "https://github.com/libretro/scummvm" +upstream: "https://github.com/scummvm/scummvm" logo: "https://raw.githubusercontent.com/scummvm/scummvm/master/icons/scummvm.svg" -profiled_date: "2026-03-18" +profiled_date: "2026-03-25" core_version: "2.8.0git" display_name: "ScummVM" +cores: [scummvm] systems: [scummvm] # ScummVM is a multi-engine point-and-click adventure game interpreter. diff --git a/emulators/sdlpal.yml b/emulators/sdlpal.yml index 7d2f9123..ca5c25b8 100644 --- a/emulators/sdlpal.yml +++ b/emulators/sdlpal.yml @@ -1,7 +1,9 @@ emulator: SDLPAL type: libretro +core_classification: official_port source: "https://github.com/sdlpal/sdlpal" -profiled_date: "2026-03-18" +upstream: "https://github.com/sdlpal/sdlpal" +profiled_date: "2026-03-25" core_version: "v2.0.1" display_name: "SDLPAL" cores: @@ -9,175 +11,171 @@ cores: systems: - sdlpal -# SDLPAL is an open-source reimplementation of the classic Chinese RPG -# "Xian Jian Qi Xia Zhuan" (Sword and Fairy / PAL) by SoftStar Inc. -# -# It does NOT include any game data. The original game files are proprietary -# and must be obtained separately (e.g. from the Steam release). -# -# The core accepts a .cfg file pointing to the game directory (needs_fullpath). -# When launched without a game (supports_no_game = true), it looks for data -# in /sdlpal/ (libretro.c:201-204). -# -# Data file search (util.c:728-781, UTIL_CheckResourceFiles): -# Required: 13 common .mkf archives + message file (word.dat or m.msg) -# Optional: sound files (voc.mkf, sounds.mkf), music files (midi.mkf, mus.mkf) -# -# Additional optional files loaded at runtime: -# desc.dat - object descriptions (global.c:204, DOS version only) -# mus.mkf - MIDI music archive (audio.c:305) -# -# All files are game data, not BIOS or firmware. No system files are needed -# beyond the original game resource files. - notes: | - No BIOS or firmware required. SDLPAL is a game engine that needs the - original PAL (Sword and Fairy) game data files to run. + Game engine reimplementing the classic Chinese RPG PAL (Sword and Fairy) + by SoftStar Inc. No BIOS or firmware required. All files are proprietary + game data from the original 1995 DOS or 1998 Win95 release. - Place game files in /sdlpal/ or point a .cfg file at the - game directory. The game is available on Steam (app 1546570). + Place game files in /sdlpal/ or point a .cfg at the game + directory. The game is available on Steam (app 1546570). Auto-detects + DOS vs Win95 game data. - The core supports both DOS (original 1995) and Win95 (1998 remake) - versions of the game data. It auto-detects which version is present. + The libretro port disables MP3, OGG, OPUS, native MIDI, and CD audio + backends (pal_config.h). Only RIX (mus.mkf) and software MIDI synthesis + via Timidity/TinySoundFont (midi.mkf + user-provided soundfont) are + available for music. files: # ================================================================ - # Required game data archives (proprietary, not distributable) - # util.c:733-737 - UTIL_CheckResourceFiles common_files[] + # Required game data archives + # util.c:733-737 UTIL_CheckResourceFiles common_files[] + # global.c:175-182 PAL_InitGlobals # ================================================================ - name: "abc.mkf" category: game_data path: "sdlpal/abc.mkf" required: true - source_ref: "util.c:734, battle.c:879, global.c:55" - note: > - Animation/battle character data archive. Required for battle scenes - and character animations. + source_ref: "util.c:734, global.c:55, battle.c:879" + note: "Animation and battle character data archive." - name: "ball.mkf" category: game_data path: "sdlpal/ball.mkf" required: true source_ref: "util.c:734, global.c:177" - note: > - Ball/magic effect graphics archive. + note: "Magic effect graphics archive." - name: "data.mkf" category: game_data path: "sdlpal/data.mkf" required: true source_ref: "util.c:734, global.c:178" - note: > - Core game data archive containing scripts, events, and game logic. + note: "Core game data archive (scripts, events, game logic)." - name: "f.mkf" category: game_data path: "sdlpal/f.mkf" required: true source_ref: "util.c:734, global.c:179" - note: > - Face/portrait graphics archive for character dialog. + note: "Face/portrait graphics archive." - name: "fbp.mkf" category: game_data path: "sdlpal/fbp.mkf" required: true source_ref: "util.c:735, global.c:175" - note: > - Full-screen background picture archive (cutscenes, title screen). + note: "Full-screen background picture archive (cutscenes, title)." - name: "fire.mkf" category: game_data path: "sdlpal/fire.mkf" required: true source_ref: "util.c:735, global.c:180" - note: > - Fire/spell effect graphics archive. + note: "Fire/spell effect graphics archive." - name: "gop.mkf" category: game_data path: "sdlpal/gop.mkf" required: true source_ref: "util.c:735, res.c:234" - note: > - GOP (game object palette/graphics) archive. + note: "Game object palette/graphics archive." - name: "map.mkf" category: game_data path: "sdlpal/map.mkf" required: true - source_ref: "util.c:735, res.c:233, global.c:55" - note: > - Map tile and layout data archive for all game locations. + source_ref: "util.c:735, global.c:55, res.c:233" + note: "Map tile and layout data archive." - name: "mgo.mkf" category: game_data path: "sdlpal/mgo.mkf" required: true source_ref: "util.c:736, global.c:176" - note: > - Map graphic object (sprite overlay) archive. + note: "Map graphic object (sprite overlay) archive." - name: "pat.mkf" category: game_data path: "sdlpal/pat.mkf" required: true source_ref: "util.c:736, palette.c:53" - note: > - Palette data archive for color management. + note: "Palette data archive." - name: "rgm.mkf" category: game_data path: "sdlpal/rgm.mkf" required: true source_ref: "util.c:736, global.c:181" - note: > - RGM graphics archive. + note: "RGM graphics archive." - name: "rng.mkf" category: game_data path: "sdlpal/rng.mkf" required: true source_ref: "util.c:736, rngplay.c:402" - note: > - RNG animation/cutscene sequence archive. + note: "RNG animation/cutscene sequence archive." - name: "sss.mkf" category: game_data path: "sdlpal/sss.mkf" required: true source_ref: "util.c:737, global.c:182" - note: > - SSS data archive. + note: "SSS data archive (message offsets in chunk 3)." # ================================================================ - # Message/text data (one of these is required) - # util.c:739-741 - msg_files[] + # Message/text data (both required in default mode) + # text.c:718-719 PAL_InitText # ================================================================ + - name: "m.msg" + category: game_data + path: "sdlpal/m.msg" + required: true + source_ref: "util.c:740, text.c:718" + note: "Message text data (dialog, story). Opened via UTIL_OpenRequiredFile in default mode." + - name: "word.dat" category: game_data path: "sdlpal/word.dat" required: true source_ref: "util.c:741, text.c:719, global.c:197" - note: > - Game text/dialog data file (DOS version). Contains all in-game text - strings. Either word.dat or m.msg is needed depending on game version. + note: "Word data (menu items, status labels, item/spell names)." - - name: "m.msg" + # ================================================================ + # Object descriptions (DOS version only) + # global.c:204 PAL_LoadObjectDesc -> ui.c:864 + # ================================================================ + + - name: "desc.dat" category: game_data - path: "sdlpal/m.msg" + path: "sdlpal/desc.dat" required: false - source_ref: "util.c:740" - note: > - Alternative message file format. Used by some game distributions - instead of word.dat. The core checks for a configured message file - first, then falls back to word.dat. + source_ref: "global.c:204, ui.c:864" + note: "Object description strings. DOS version only (skipped for Win95). Returns NULL if absent." + + # ================================================================ + # Embedded font files (optional, DOS game data) + # font.c:102-197 PAL_LoadEmbeddedFont + # ================================================================ + + - name: "wor16.asc" + category: game_data + path: "sdlpal/wor16.asc" + required: false + source_ref: "font.c:114" + note: "Chinese character code mapping for embedded font. Silently skipped if absent." + + - name: "wor16.fon" + category: game_data + path: "sdlpal/wor16.fon" + required: false + source_ref: "font.c:172" + note: "Chinese character bitmap font data. Used with wor16.asc for DOS font rendering." # ================================================================ # Sound effect files (optional, at least one recommended) - # util.c:743 - sound_files[] + # sound.c:962-975 SOUND_Init # ================================================================ - name: "voc.mkf" @@ -185,37 +183,78 @@ files: path: "sdlpal/voc.mkf" required: false source_ref: "util.c:743, sound.c:969" - note: > - VOC format sound effects archive (DOS version). One of voc.mkf or - sounds.mkf is needed for sound effects. + note: "VOC format sound effects archive (DOS version). Preferred for DOS game data." - name: "sounds.mkf" category: game_data path: "sdlpal/sounds.mkf" required: false source_ref: "util.c:743, sound.c:964" - note: > - WAV format sound effects archive (Win95 version). Alternative to - voc.mkf with higher quality audio. + note: "WAV format sound effects archive (Win95 version). Preferred for Win95 game data." # ================================================================ # Music files (optional, at least one recommended) - # util.c:744 - music_files[] + # audio.c:302-305 AUDIO_OpenDevice # ================================================================ - - name: "midi.mkf" - category: game_data - path: "sdlpal/midi.mkf" - required: false - source_ref: "util.c:744, midi.c:78, midi_tsf.c:68" - note: > - MIDI music archive. Used when Music type is set to MIDI. - - name: "mus.mkf" category: game_data path: "sdlpal/mus.mkf" required: false source_ref: "util.c:744, audio.c:305" - note: > - RIX/OPL music archive. Default music source for the game. Contains - FM synthesizer music data played through OPL emulation. + note: "RIX/OPL music archive. Default music source, played through OPL emulation." + + - name: "midi.mkf" + category: game_data + path: "sdlpal/midi.mkf" + required: false + source_ref: "util.c:744, midi.c:78, midi_tsf.c:68, midi_timidity.c:130" + note: "MIDI music archive. Used when Music=MIDI is configured in sdlpal.cfg." + + # ================================================================ + # AVI cutscene videos (Win95 version only, optional) + # aviplay.c:641-772 PAL_PlayAVI + # Guarded by fEnableAviPlay && fIsWIN95 (global.c:192) + # ================================================================ + + - name: "1.avi" + category: game_data + path: "sdlpal/1.avi" + required: false + source_ref: "main.c:197" + note: "Trademark screen video (Win95 only). Falls back to RNG animation if absent." + + - name: "2.avi" + category: game_data + path: "sdlpal/2.avi" + required: false + source_ref: "main.c:237" + note: "Splash screen video (Win95 only). Falls back to sprite animation if absent." + + - name: "3.avi" + category: game_data + path: "sdlpal/3.avi" + required: false + source_ref: "uigame.c:162" + note: "In-game event video (Win95 only)." + + - name: "4.avi" + category: game_data + path: "sdlpal/4.avi" + required: false + source_ref: "ending.c:418" + note: "Ending sequence video part 1 (Win95 only)." + + - name: "5.avi" + category: game_data + path: "sdlpal/5.avi" + required: false + source_ref: "ending.c:420" + note: "Ending sequence video part 2 (Win95 only)." + + - name: "6.avi" + category: game_data + path: "sdlpal/6.avi" + required: false + source_ref: "ending.c:485" + note: "Ending sequence video part 3 (Win95 only)." diff --git a/emulators/simcp.yml b/emulators/simcp.yml index c58094b5..0b2d5057 100644 --- a/emulators/simcp.yml +++ b/emulators/simcp.yml @@ -1,7 +1,9 @@ emulator: SimCoupe type: libretro +core_classification: community_fork source: "https://github.com/libretro/libretro-simcoupe" -profiled_date: "2026-03-18" +upstream: "https://github.com/simonowen/simcoupe" +profiled_date: "2026-03-25" core_version: "Git" display_name: "SAM Coupe (SimCoupe)" cores: @@ -10,15 +12,15 @@ systems: - sam-coupe notes: | - SimCoupe is an emulator for the SAM Coupe, a British 8-bit home - computer by Miles Gordon Technology (1989). The SAM Coupe was - designed as a successor to the ZX Spectrum with a Z80B CPU at 6 MHz - and custom ASIC graphics. + SAM Coupe emulator by Simon Owen. Port based on old pre-1.0 SimCoupe + codebase. Experimental, incomplete (no sound, partial input). - No external BIOS or ROM files required. The SAM Coupe ROM is built - into the emulator. The libretro wrapper does not request any files - from the system directory. + SAM Coupe ROM v3.0 and SAMDOS 2.0 embedded in the binary (SAMROM.h, + SAMDOS.h). HDBOOT patches for Atom Lite also embedded (HDBOOT.h). + The libretro wrapper never accesses the system directory. - Loads .dsk, .sad, .mgt, .sbt, and .cpm disk images as content. + Upstream v1.2.x loads external resource files (samcoupe.rom, + sp0256-al2.bin for VoiceBox speech synthesis). The libretro port + lacks VoiceBox/SP0256 support (commented out in IO.cpp). files: [] diff --git a/emulators/skyemu.yml b/emulators/skyemu.yml index f49c34d8..15f5d110 100644 --- a/emulators/skyemu.yml +++ b/emulators/skyemu.yml @@ -1,8 +1,70 @@ -emulator: "skyemu" -type: alias -alias_of: "mgba" -profiled_date: "2026-03-18" -core_version: "Git" +emulator: skyemu +type: standalone + libretro +core_classification: official_port +source: https://github.com/skylersaleh/SkyEmu/blob/v5/src/libretro.c +upstream: https://github.com/skylersaleh/SkyEmu +profiled_date: "2026-03-25" +core_version: "v5" display_name: "Nintendo - Game Boy/GBA/NDS (SkyEmu)" -note: "This core uses the same BIOS/firmware as mgba. See emulators/mgba.yml for details." -files: [] + +cores: + - skyemu + +systems: + - nintendo-gb + - nintendo-gbc + - nintendo-gba + - nintendo-ds + +notes: | + Multi-system emulator by skylersaleh. Libretro core built from the upstream repo. + All BIOS optional; bundles Cult-of-GBA BIOS (GBA), DraStic free BIOS (NDS ARM7/ARM9), + stub firmware (NDS), and HLE boot skip (GB/GBC). BIOS loading controlled by core options + (default: on). Files loaded from system_dir/SkyEmu/ subdirectory. + Standalone validates exact BIOS file size; libretro only rejects files exceeding buffer. + .info missing gb_bios.bin (gb.h:1603). + +files: + - name: cgb_boot.bin + description: GBC boot ROM + path: SkyEmu/cgb_boot.bin + required: false + hle_fallback: true + aliases: [gbc_bios.bin, cgb0_boot.bin, cgb_agb_boot.bin] + source_ref: "src/gb.h:1593-1596, 1605-1608" + + - name: dmg_rom.bin + description: DMG boot ROM + path: SkyEmu/dmg_rom.bin + required: false + hle_fallback: true + aliases: [dmg0_rom.bin, gb_bios.bin] + source_ref: "src/gb.h:1601-1603" + + - name: gba_bios.bin + description: GBA BIOS + path: SkyEmu/gba_bios.bin + required: false + hle_fallback: true + source_ref: "src/gba.h:1726-1730" + + - name: nds7.bin + description: NDS ARM7 BIOS + path: SkyEmu/nds7.bin + required: false + hle_fallback: true + source_ref: "src/nds.h:3088-3089" + + - name: nds9.bin + description: NDS ARM9 BIOS + path: SkyEmu/nds9.bin + required: false + hle_fallback: true + source_ref: "src/nds.h:3091-3092" + + - name: firmware.bin + description: NDS firmware + path: SkyEmu/firmware.bin + required: false + hle_fallback: true + source_ref: "src/nds.h:3094, 3200-3268" diff --git a/emulators/smsplus.yml b/emulators/smsplus.yml index a8347a5f..8fdfc996 100644 --- a/emulators/smsplus.yml +++ b/emulators/smsplus.yml @@ -1,7 +1,9 @@ emulator: SMS Plus GX -type: libretro +type: standalone + libretro +core_classification: enhanced_fork source: "https://github.com/libretro/smsplus-gx" -profiled_date: "2026-03-18" +upstream: "https://github.com/ekeeke/smsplus-gx" +profiled_date: "2026-03-25" core_version: "1.8" display_name: "Sega - MS/GG (SMS Plus GX)" cores: @@ -11,42 +13,35 @@ systems: - sega-game-gear - colecovision - sega-sg1000 + - sord-m5 notes: | - SMS Plus GX is a Sega Master System / Game Gear emulator with additional - support for ColecoVision, SG-1000 and Sord M5 via TMS9918 VDP emulation. + Enhanced fork of Charles MacDonald's SMS Plus 1.3 by Eke-Eke (GX) and + gameblabla. Master System, Game Gear, ColecoVision and SG-1000 emulator. + Standalone ports also support Sord M5 (behind SORDM5_EMU compile flag, + not compiled in libretro build). - BIOS loading happens in bios_init() (smsplus_libretro.c:203-252). - Two BIOS files are supported: + BIOS loading in bios_init() (smsplus_libretro.c:203-252). bios.sms is + always attempted but only activated when core option smsplus_sms_bios is + "auto" (default: disabled). BIOS.col is loaded only for ColecoVision + ROMs and required for them. Standalone ports use BIOS.sms (uppercase) + instead of bios.sms. - 1. bios.sms -- Sega Master System boot ROM. Optional. Loaded for all - console types. A core option "smsplus_sms_bios" (default: disabled) - controls whether it is used. When set to "auto" and the file exists, - bios.enabled is set and the SMS boot sequence plays before games. - - 2. BIOS.col -- ColecoVision BIOS. Required for ColecoVision ROMs only. - Loaded into coleco.rom (0x2000 bytes = 8 KB). Without it, ColecoVision - games will not start and the core logs an error. The filename is - case-sensitive (uppercase BIOS, lowercase .col). - - Both files are read from the system directory root (no subdirectory). - Path is built as: system_dir + "/" + filename (smsplus_libretro.c:211,234). - - Console type is auto-detected from ROM file extension: - .col -> CONSOLE_COLECO - .sg -> CONSOLE_SG1000 - Or forced via the "smsplus_hardware" core option. + .info marks BIOS.col as optional (firmware1_opt=true) but the libretro + code returns false from retro_load_game() when BIOS.col is missing for + .col ROMs. files: - name: "bios.sms" system: sega-master-system description: "Sega Master System boot ROM" required: false + aliases: ["BIOS.sms"] source_ref: "smsplus_libretro.c:211-229" notes: | - Loaded into bios.rom (up to 1 MB allocated). Only active when the - core option smsplus_sms_bios is set to "auto". Displays the Sega - Master System startup screen before game execution. + Loaded into bios.rom (up to 1 MB allocated). Only active when core + option smsplus_sms_bios is "auto". Displays SMS startup screen + before game execution. Standalone ports use BIOS.sms (uppercase). - name: "BIOS.col" system: colecovision @@ -55,30 +50,18 @@ files: size: 8192 source_ref: "smsplus_libretro.c:232-248" notes: | - Required for ColecoVision games. Read as 0x2000 (8192) raw bytes - into coleco.rom. Without this file, retro_load_game() returns false - when loading .col files. Filename is case-sensitive on Linux. + Required for ColecoVision games. Read as 0x2000 (8192) bytes into + coleco.rom. Without this file, retro_load_game() returns false for + .col files. -platform_details: - bios_mapping: - sms: - target: "bios.rom buffer, mapped via slot system" - source_ref: "smsplus_libretro.c:208-229, source/memz80.c" - notes: | - When bios.enabled has both bits set (file present + option enabled), - the BIOS ROM is paged into the Z80 address space at startup. The - BIOS executes the boot animation, then hands off to the cartridge. - coleco: - target: "coleco.rom, mapped at 0x0000-0x1FFF" - source_ref: "smsplus_libretro.c:245, source/memz80.c" - notes: | - The ColecoVision BIOS provides the interrupt handler, I/O routines - and startup code. Mapped into the first 8 KB of Z80 address space. - - console_detection: - source_ref: "smsplus_libretro.c:605-609, source/loadrom.c:402" + - name: "BIOS_sordm5.bin" + system: sord-m5 + description: "Sord M5 BIOS ROM" + required: false + size: 8192 + mode: standalone + source_ref: "ports/sdl/smsplus.c:321-329" notes: | - File extension .col forces CONSOLE_COLECO with MAPPER_NONE. - Extension .sg forces CONSOLE_SG1000. - The core option smsplus_hardware can override to: master system, - master system II, game gear, game gear (sms compatibility), coleco. + Read as 0x2000 (8192) bytes into coleco.rom (shared buffer). Only + in standalone builds (SORDM5_EMU define). Not compiled in libretro. + Code does not enforce presence but system needs BIOS to function. diff --git a/emulators/snes9x.yml b/emulators/snes9x.yml index b9f77d13..215a7af2 100644 --- a/emulators/snes9x.yml +++ b/emulators/snes9x.yml @@ -1,137 +1,49 @@ emulator: snes9x type: libretro +core_classification: official_port source: "https://github.com/libretro/snes9x" +upstream: "https://github.com/snes9xgit/snes9x" logo: "https://raw.githubusercontent.com/snes9xgit/snes9x/master/gtk/data/snes9x.svg" -profiled_date: "2026-03-18" +profiled_date: "2026-03-25" core_version: "1.61" display_name: "Nintendo - SNES / SFC (Snes9x)" systems: [nintendo-snes, nintendo-satellaview, nintendo-sufami-turbo] -# snes9x uses HLE for all coprocessors: DSP1-4, ST010, ST011, ST018, CX4. -# No external firmware files are needed for these chips - the emulation -# logic and lookup tables are hardcoded in dsp1.cpp, dsp2.cpp, dsp3.cpp, -# dsp4.cpp, seta010.cpp, seta011.cpp, seta018.cpp, c4emu.cpp. -# -# Unlike bsnes, snes9x does NOT support LLE coprocessor firmware. -# It also does NOT support Super Game Boy (RETRO_GAME_TYPE_SUPER_GAME_BOY -# is defined but never loads a SGB BIOS or boot ROM). -# -# The only external BIOS files used are for Satellaview (BS-X) and -# Sufami Turbo, loaded by LoadBIOS() in libretro/libretro.cpp and -# BSX_LoadBIOS() in bsx.cpp. -# -# BIOS lookup order (LoadBIOS): -# 1. ROM directory (same folder as the game) -# 2. RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY (system dir) - cores: snes9x: source: "https://github.com/libretro/snes9x" firmware_loading: true hle_only: true notes: | - Current snes9x. Loads BS-X.bin (tries BS-X.bios as fallback) - and STBIOS.bin via LoadBIOS() in libretro.cpp. - Auto-detects Sufami Turbo carts (is_SufamiTurbo_Cart) and - BS-X games (is_bsx) when loading via retro_load_game(). - Also handles retro_load_game_special() for multi-cart and - subsystem types (RETRO_GAME_TYPE_BSX, RETRO_GAME_TYPE_SUFAMI_TURBO, - RETRO_GAME_TYPE_MULTI_CART). - - snes9x2010: - source: "https://github.com/libretro/snes9x2010" - firmware_loading: true - hle_only: true - notes: | - Based on snes9x 1.52. Same BIOS loading as snes9x current. - BSX_LoadBIOS() in src/bsx.c loads BS-X.bin (fallback BS-X.bios). - STBIOS.bin loaded in src/memmap.c for Sufami Turbo. - - snes9x2005: - source: "https://github.com/libretro/snes9x2005" - firmware_loading: false - hle_only: true - notes: | - Based on snes9x 1.43. Detects BS-X and Sufami Turbo ROM headers - in source/memmap.c but has no LoadBIOS function - does not load - external BIOS files. No firmware needed. - - snes9x2005_plus: - source: "https://github.com/libretro/snes9x2005" - firmware_loading: false - hle_only: true - notes: | - Same codebase as snes9x2005 with video enhancements. - No external BIOS loading. No firmware needed. - - snes9x2002: - source: "https://github.com/libretro/snes9x2002" - firmware_loading: false - hle_only: true - notes: | - Based on snes9x 1.39 (PocketSNES). Minimal core for low-end - devices. No BS-X, no Sufami Turbo, no external BIOS loading. - No firmware needed. + Loads BS-X.bin and STBIOS.bin via LoadBIOS() in libretro.cpp. + BSX_LoadBIOS() in bsx.cpp tries BS-X.bios as fallback. + Auto-detects Satellaview and Sufami Turbo carts on load. + Subsystem support via retro_load_game_special() for + RETRO_GAME_TYPE_BSX, RETRO_GAME_TYPE_SUFAMI_TURBO, + RETRO_GAME_TYPE_MULTI_CART. files: - # -- BS-X Satellaview BIOS -- - # Required by: snes9x, snes9x2010 - # Loaded by: LoadBIOS() in libretro.cpp (snes9x) / BSX_LoadBIOS() in bsx.c (snes9x2010) - # Auto-detected when game ROM header matches BS-X signature at 0x7FC0 or 0xFFC0. - # Size validated: must be exactly BIOS_SIZE (0x100000 = 1048576 bytes). - # Filename fallback: BS-X.bin -> BS-X.bios (bsx.cpp:1209-1215) - - name: "BS-X.bin" system: nintendo-satellaview - description: "Satellaview BS-X BIOS (Japanese)" + description: "Satellaview BS-X BIOS" required: false size: 1048576 - md5: "fed4d8242cfbed61343d53d48432aced" - sha1: "604556b2e62860af18db5a77f2956ebc75450020" - source_ref: "libretro.cpp:1209 (LoadBIOS, 'BS-X.bin'), bsx.cpp:1209-1215 (BSX_LoadBIOS)" + validation: [size] + source_ref: "libretro.cpp:1209, bsx.cpp:1209,1214" aliases: ["BS-X.bios"] - notes: "Needed for Satellaview (.bs) game support. Without this file, BS-X games will fail to load." - - # -- Sufami Turbo BIOS -- - # Required by: snes9x, snes9x2010 - # Loaded by: LoadBIOS() in libretro.cpp (snes9x) / memmap.c (snes9x2010) - # Auto-detected when cart has "BANDAI SFC-ADX" at offset 0, without "SFC-ADX BACKUP" at 0x10. - # Size: 0x40000 (262144 bytes). Validated by is_SufamiTurbo_BIOS(). + notes: "Needed for Satellaview (.bs) games." - name: "STBIOS.bin" system: nintendo-sufami-turbo - description: "Bandai SuFami Turbo BIOS (Mini Cartridge add-on)" + description: "Sufami Turbo BIOS" required: false size: 262144 - md5: "d3a44ba7d42a74d3ac58cb9c14c6a5ca" - sha1: "ef86ea192eed03d5c413fdbbfd46043be1d7a127" - source_ref: "libretro.cpp:1203,1317,1348 (LoadBIOS, 'STBIOS.bin'), memmap.cpp:1672" - notes: "Needed for Sufami Turbo multi-cart games. Validated by is_SufamiTurbo_BIOS() which checks for 'BANDAI SFC-ADX' + 'SFC-ADX BACKUP' headers." + validation: [size] + source_ref: "libretro.cpp:1203,1317, memmap.cpp:1672" + notes: "Needed for Sufami Turbo multi-cart games." notes: coprocessor_hle: | - All SNES coprocessor chips are emulated in software (HLE) across - every snes9x variant. No external firmware files are needed for: - - DSP1/DSP1B (dsp1.cpp, static DSP1ROM[1024] lookup table) - - DSP2 (dsp2.cpp) - - DSP3 (dsp3.cpp) - - DSP4 (dsp4.cpp) - - ST010 (seta010.cpp, static ST010_SinTable) - - ST011 (seta011.cpp) - - ST018 (seta018.cpp) - - CX4/Cx4 (c4.cpp, c4emu.cpp, math-based HLE) - This is the key difference from bsnes, which supports both HLE and - LLE (with optional external firmware ROM files). - sgb_status: | - RETRO_GAME_TYPE_SUPER_GAME_BOY (0x104) is defined in libretro.cpp - but no actual SGB emulation exists. No SGB BIOS or boot ROM is - loaded or used by any snes9x variant. - bsx_detection: | - BS-X games are auto-detected by is_bsx() which checks for the - "Satellaview BS-X" signature in the ROM header. When detected, - the BIOS is loaded automatically without user intervention. - sufami_detection: | - Sufami Turbo carts are auto-detected by is_SufamiTurbo_Cart() - which checks for "BANDAI SFC-ADX" at ROM offset 0 and absence - of "SFC-ADX BACKUP" at offset 0x10 (which would indicate BIOS, - not cart). Multi-cart support uses retro_load_game_special(). + All coprocessors are HLE (DSP1-4, ST010, ST011, ST018, CX4). + No external firmware files needed. Lookup tables and math + emulation hardcoded in dsp1-4.cpp, seta010-018.cpp, c4emu.cpp. diff --git a/emulators/snes9x2002.yml b/emulators/snes9x2002.yml new file mode 100644 index 00000000..dd49b903 --- /dev/null +++ b/emulators/snes9x2002.yml @@ -0,0 +1,23 @@ +emulator: Snes9x 2002 +type: libretro +core_classification: frozen_snapshot +source: "https://github.com/libretro/snes9x2002" +upstream: "https://github.com/snes9xgit/snes9x" +profiled_date: "2026-03-25" +core_version: "7.2.0" +display_name: "Nintendo - SNES / SFC (Snes9x 2002)" +cores: + - snes9x2002 +systems: + - snes + - sufami-turbo + - satellaview + +notes: | + Frozen snapshot of Snes9x 1.39 via PocketSNES, optimized for ARM. + SPC700 IPL ROM (64 bytes) embedded in globals.c:283 as APUROM[64]. + All ROM I/O via memstream (snes9x.h:54-57). The core never calls + GET_SYSTEM_DIRECTORY and performs no file I/O from the system directory. + +exclusion_note: "SPC700 IPL ROM embedded in binary (globals.c:283); no system_directory access" +files: [] diff --git a/emulators/snes9x2005.yml b/emulators/snes9x2005.yml new file mode 100644 index 00000000..ef2cd1f9 --- /dev/null +++ b/emulators/snes9x2005.yml @@ -0,0 +1,25 @@ +emulator: Snes9x 2005 +type: libretro +core_classification: frozen_snapshot +source: "https://github.com/libretro/snes9x2005" +upstream: "https://github.com/ShadauxCat/CATSFC" +profiled_date: "2026-03-25" +core_version: "v1.36" +display_name: "Nintendo - SNES / SFC (Snes9x 2005)" +cores: + - snes9x2005 +systems: + - snes + - sufami-turbo + - satellaview + +notes: | + Frozen snapshot of Snes9x 1.43 via CATSFC (NDS/PSP port by ShadauxCat/Nebuleon). + SPC700 IPL ROM (64 bytes) embedded in globals.c:191 as APUROM[64]. + DSP-1 ROM data (1024 x uint16) embedded in dsp1emu.c:8 as DSP1ROM[1024]. + All coprocessors (DSP-1/2/4, CX4, ST010/011/018, SuperFX, SPC7110, SA-1, OBC-1) + are pure HLE. The core never calls GET_SYSTEM_DIRECTORY and performs no file I/O + from the system directory. + +exclusion_note: "all coprocessor ROMs embedded in binary; no system_directory access" +files: [] diff --git a/emulators/snes9x2005_plus.yml b/emulators/snes9x2005_plus.yml new file mode 100644 index 00000000..9e6a495c --- /dev/null +++ b/emulators/snes9x2005_plus.yml @@ -0,0 +1,26 @@ +emulator: Snes9x 2005 Plus +type: libretro +core_classification: frozen_snapshot +source: "https://github.com/libretro/snes9x2005" +upstream: "https://github.com/ShadauxCat/CATSFC" +profiled_date: "2026-03-25" +core_version: "v1.36" +display_name: "Nintendo - SNES / SFC (Snes9x 2005 Plus)" +cores: + - snes9x2005_plus +systems: + - snes + - sufami-turbo + - satellaview + +notes: | + Same codebase as Snes9x 2005 built with USE_BLARGG_APU=1 for more accurate audio. + Frozen snapshot of Snes9x 1.43 via CATSFC (NDS/PSP port by ShadauxCat/Nebuleon). + SPC700 IPL ROM (64 bytes) embedded in apu_blargg.c:3272 as APUROM[64]. + DSP-1 ROM data (1024 x uint16) embedded in dsp1emu.c:8 as DSP1ROM[1024]. + All coprocessors (DSP-1/2/4, CX4, ST010/011/018, SuperFX, SPC7110, SA-1, OBC-1) + are pure HLE. The core never calls GET_SYSTEM_DIRECTORY and performs no file I/O + from the system directory. + +exclusion_note: "all coprocessor ROMs embedded in binary; no system_directory access" +files: [] diff --git a/emulators/snes9x2010.yml b/emulators/snes9x2010.yml new file mode 100644 index 00000000..af82dd17 --- /dev/null +++ b/emulators/snes9x2010.yml @@ -0,0 +1,40 @@ +emulator: Snes9x 2010 +type: libretro +core_classification: frozen_snapshot +source: "https://github.com/libretro/snes9x2010" +upstream: "https://github.com/snes9xgit/snes9x" +profiled_date: "2026-03-25" +core_version: "v1.52.4" +display_name: "Nintendo - SNES / SFC (Snes9x 2010)" +cores: + - snes9x2010 +systems: + - snes + - sufami-turbo + - satellaview + +notes: | + Frozen snapshot of Snes9x 1.52.4, rewritten in C with optimizations + for PS3 (originally called SNES9x Next). + SPC700 IPL ROM (64 bytes) embedded in src/apu.c:3442 as APUROM[64]. + DSP-1 ROM data (1024 x uint16) embedded in src/dsp.c:219 as DSP1ROM[1024]. + All coprocessors (DSP-1/2/3/4, CX4, ST010/011/018, SuperFX, SPC7110, + SA-1, S-DD1, S-RTC, OBC-1) are pure HLE. + Sufami Turbo support disabled: LoadSufamiTurbo in src/memmap.c is behind + #if SNES_SUPPORT_MULTI_CART which defaults to 0 and is never enabled in + any Makefile. retro_load_game_special returns false. + Upstream snes9x 1.52 supports Sufami Turbo (loads STBIOS.bin). + +files: + - name: "BS-X.bin" + system: satellaview + description: "Satellaview BS-X BIOS" + required: false + size: 1048576 + validation: [size] + aliases: ["BS-X.bios"] + source_ref: "src/bsx.c:959-993 (BSX_LoadBIOS), src/bsx.c:1068 (caller in S9xInitBSX)" + notes: | + Loaded when a BS game is auto-detected (is_bsx checks ROM header at + 0x7FC0/0xFFC0). Without this file, BSX.bootup is set to FALSE and + BIOSROM is zeroed. BS games still load but lack the boot menu. diff --git a/emulators/squirreljme.yml b/emulators/squirreljme.yml index c590d6aa..a0b1b579 100644 --- a/emulators/squirreljme.yml +++ b/emulators/squirreljme.yml @@ -1,94 +1,70 @@ emulator: SquirrelJME type: libretro +core_classification: official_port source: "https://github.com/SquirrelJME/SquirrelJME" -profiled_date: "2026-03-18" +upstream: "https://github.com/SquirrelJME/SquirrelJME" +profiled_date: "2026-03-25" core_version: "0.3.0" display_name: "Java ME (SquirrelJME)" cores: [squirreljme] systems: [j2me] verification: existence notes: | - Java ME 8 virtual machine for libretro. Runs J2ME MIDlets and older flip-phone games. - The core needs a class library JAR placed in RetroArch's system directory. - It searches for the JAR using a priority list: versioned-fast first, then versioned, - then unversioned variants. The first match wins. - - Search order (from nanocoat/src/boot.c sjme_nvm_romNames[]): - 1. squirreljme-{version}-fast.jar - 2. squirreljme-{version}.jar - 3. squirreljme-{version}-test.jar - 4. squirreljme-{version}-slow.jar - 5. squirreljme-{version}-slow-test.jar - 6. squirreljme-fast.jar - 7. squirreljme.jar - 8. squirreljme-test.jar - 9. squirreljme-slow.jar - 10. squirreljme-slow-test.jar - - Current version: 0.3.0. All firmware entries are marked optional in the .info file - because the core can launch its built-in modeless stars demo without a class library. - For actual J2ME software, one of these JARs is required. - - The class library JAR is built from the SquirrelJME project itself (not a third-party - BIOS dump). It is open source under MPL-2.0. + Java ME 8 virtual machine. Runs J2ME MIDlets and older flip-phone games. + Requires a class library JAR in the system directory. The core searches + sjme_nvm_romNames[] in priority order and uses the first match found. + All entries are optional: without a class library, the core runs a built-in + modeless stars demo but cannot execute J2ME software. + The .info declares firmware_count=8 but the code defines 10 search names + (squirreljme-{version}-test.jar and squirreljme-test.jar are missing from .info). files: - # -- Versioned JARs (v0.3.0, preferred) -- - - name: "squirreljme-0.3.0-fast.jar" - description: "SquirrelJME class library v0.3.0 (fast/optimized build)" + description: "Class library v0.3.0, fast/optimized build" required: false - bundled: false - source_ref: "nanocoat/src/boot.c:102, squirreljme_libretro.info:firmware5" - note: "Highest priority versioned JAR. Optimized runtime, recommended for normal use." + source_ref: "nanocoat/src/boot.c:102" - name: "squirreljme-0.3.0.jar" - description: "SquirrelJME class library v0.3.0 (standard build)" + description: "Class library v0.3.0, standard build" required: false - bundled: false - source_ref: "nanocoat/src/boot.c:103, squirreljme_libretro.info:firmware4" - note: "Standard versioned build. Second in search priority." + source_ref: "nanocoat/src/boot.c:103" + + - name: "squirreljme-0.3.0-test.jar" + description: "Class library v0.3.0, standard build with test suites" + required: false + source_ref: "nanocoat/src/boot.c:104" - name: "squirreljme-0.3.0-slow.jar" - description: "SquirrelJME class library v0.3.0 (slow/interpreter build)" + description: "Class library v0.3.0, slow/interpreter build" required: false - bundled: false - source_ref: "nanocoat/src/boot.c:105, squirreljme_libretro.info:firmware6" - note: "Pure interpreter mode, no optimizations. Useful for debugging." + source_ref: "nanocoat/src/boot.c:105" - name: "squirreljme-0.3.0-slow-test.jar" - description: "SquirrelJME class library v0.3.0 (slow build with tests)" + description: "Class library v0.3.0, slow build with test suites" required: false - bundled: false - source_ref: "nanocoat/src/boot.c:106, squirreljme_libretro.info:firmware7" - note: "Interpreter mode with built-in test suites." - - # -- Unversioned JARs (fallback) -- + source_ref: "nanocoat/src/boot.c:106" - name: "squirreljme-fast.jar" - description: "SquirrelJME class library (fast/optimized, unversioned)" + description: "Class library, fast/optimized build (unversioned)" required: false - bundled: false - source_ref: "nanocoat/src/boot.c:107, squirreljme_libretro.info:firmware1" - note: "Highest priority unversioned JAR. Renamed from a versioned build." + source_ref: "nanocoat/src/boot.c:107" - name: "squirreljme.jar" - description: "SquirrelJME class library (standard, unversioned)" + description: "Class library, standard build (unversioned)" required: false - bundled: false - source_ref: "nanocoat/src/boot.c:108, squirreljme_libretro.info:firmware0" - note: "Most common filename. If only one JAR is provided, use this name." + source_ref: "nanocoat/src/boot.c:108" + + - name: "squirreljme-test.jar" + description: "Class library, standard build with test suites (unversioned)" + required: false + source_ref: "nanocoat/src/boot.c:109" - name: "squirreljme-slow.jar" - description: "SquirrelJME class library (slow/interpreter, unversioned)" + description: "Class library, slow/interpreter build (unversioned)" required: false - bundled: false - source_ref: "nanocoat/src/boot.c:110, squirreljme_libretro.info:firmware2" - note: "Pure interpreter, unversioned." + source_ref: "nanocoat/src/boot.c:110" - name: "squirreljme-slow-test.jar" - description: "SquirrelJME class library (slow with tests, unversioned)" + description: "Class library, slow build with test suites (unversioned)" required: false - bundled: false - source_ref: "nanocoat/src/boot.c:111, squirreljme_libretro.info:firmware3" - note: "Interpreter with tests, unversioned." + source_ref: "nanocoat/src/boot.c:111" diff --git a/emulators/stella.yml b/emulators/stella.yml index 9d332098..f9993894 100644 --- a/emulators/stella.yml +++ b/emulators/stella.yml @@ -1,57 +1,18 @@ emulator: Stella -type: libretro -source: "https://github.com/libretro/stella2014-libretro" -profiled_date: "2026-03-18" -core_version: "6.6" +type: alias +alias_of: stella2014 +source: "https://github.com/libretro/stella-libretro" +profiled_date: "2026-03-25" +core_version: "3.9.3" display_name: "Atari - 2600 (Stella)" cores: - stella - - stella2014 - - stella2023 systems: - atari-2600 -notes: | - Stella is an Atari 2600 (VCS) emulator. The libretro port available is - stella2014, which is a fork frozen at the 2014 codebase. The upstream - "stella-libretro" repo redirects to stella2014-libretro. There is no - separate stella2023 libretro core published at this time. - - The Atari 2600 console has no BIOS ROM. Games run directly on the - hardware with no boot firmware. - - The Starpath/Arcadia Supercharger add-on had a 2K BIOS ROM on the - physical hardware. Stella does NOT load this BIOS from an external - file. Instead, the core contains a built-in dummy BIOS - (ourDummyROMCode, 294 bytes in CartAR.cxx) that simulates the - Supercharger load sequence. The initializeROM() function copies this - dummy code into the ROM bank (bank 3) at reset, sets up the 6502 - reset vector to 0xF80A, and handles multiload via a hotspot at - address 0x1850. - - The "fastscbios" setting (offset 109 in the dummy ROM) controls - whether the SC load progress bars are shown (0x00) or skipped - (0xFF). This is toggled automatically during ROM format detection - (Console.cxx:119-120). - - The real Supercharger BIOS ROM (MD5 4565c1a7abce773e53c75b35414adefd) - is recognized in DefProps.hxx as a known cartridge entry but is not - required or loaded as a system file. - - The libretro interface (retro_set_environment) does not call - RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY and declares no firmware - requirements. No core option references BIOS loading. - -files: [] - -platform_details: - supercharger_emulation: - source_ref: "stella/src/emucore/CartAR.cxx, CartAR.hxx" - notes: | - The Supercharger (type AR) uses 4 banks: 3x 2K RAM + 1x 2K ROM. - The ROM bank is filled with ourDummyROMCode at reset. SC games - are multi-load images (8448 bytes per load: 8192 data + 256 header). - loadIntoRAM() handles loading game data when the hotspot at 0x1850 - is accessed with the ROM bank mapped. The bank switching byte and - start address are written to zero-page RAM (0xFE, 0xFF, 0x80) for - the dummy BIOS to read. +note: | + Identical codebase to stella2014-libretro. Both repos share the same HEAD + commit and produce a binary reporting library_name "Stella 2014". The + stella_libretro.info incorrectly lists display_version "6.6"; the actual + embedded version is 3.9.3. See stella2014.yml for firmware requirements + and KidVid audio files. diff --git a/emulators/stella2014.yml b/emulators/stella2014.yml new file mode 100644 index 00000000..2e61866c --- /dev/null +++ b/emulators/stella2014.yml @@ -0,0 +1,60 @@ +emulator: Stella 2014 +type: libretro +core_classification: frozen_snapshot +source: "https://github.com/libretro/stella2014-libretro" +upstream: "https://github.com/stella-emu/stella" +profiled_date: "2026-03-25" +core_version: "3.9.3" +display_name: "Atari - 2600 (Stella 2014)" +cores: + - stella2014 +systems: + - atari_2600 + +notes: | + Frozen snapshot of Stella 3.9.3. The Atari 2600 has no BIOS ROM; the TIA, + RIOT, and 6507 CPU are fully emulated in software. The SuperCharger (Starpath) + BIOS is emulated via a built-in dummy ROM (ourDummyROMCode in CartAR.cxx:518). + Game properties database (stella.pro) is compiled into DefProps.hxx; external + loading is disabled in the libretro port (PropsSet.cxx:35). The core does not + call GET_SYSTEM_DIRECTORY. KidVid Voice Module audio tapes (7 WAV files) are + loaded via rfopen with relative filenames from the content directory + (KidVid.cxx:166-185); absence is handled gracefully. EEPROM save data for + AtariVox and SaveKey peripherals is managed as NVRAM, not user-supplied. + +files: + - name: kvs1.wav + description: "KidVid Voice Module audio tape 1 (Smurfs Save the Day)" + required: false + category: game_data + source_ref: "stella/src/emucore/KidVid.cxx:167,182" + - name: kvs2.wav + description: "KidVid Voice Module audio tape 2 (Smurfs Save the Day)" + required: false + category: game_data + source_ref: "stella/src/emucore/KidVid.cxx:167,182" + - name: kvs3.wav + description: "KidVid Voice Module audio tape 3 (Smurfs Save the Day)" + required: false + category: game_data + source_ref: "stella/src/emucore/KidVid.cxx:167,182" + - name: kvb1.wav + description: "KidVid Voice Module audio tape 1 (Berenstain Bears)" + required: false + category: game_data + source_ref: "stella/src/emucore/KidVid.cxx:167,182" + - name: kvb2.wav + description: "KidVid Voice Module audio tape 2 (Berenstain Bears)" + required: false + category: game_data + source_ref: "stella/src/emucore/KidVid.cxx:167,182" + - name: kvb3.wav + description: "KidVid Voice Module audio tape 3 (Berenstain Bears)" + required: false + category: game_data + source_ref: "stella/src/emucore/KidVid.cxx:167,182" + - name: kvshared.wav + description: "KidVid Voice Module shared audio samples" + required: false + category: game_data + source_ref: "stella/src/emucore/KidVid.cxx:185" diff --git a/emulators/stella2023.yml b/emulators/stella2023.yml new file mode 100644 index 00000000..5b3717a1 --- /dev/null +++ b/emulators/stella2023.yml @@ -0,0 +1,73 @@ +emulator: Stella 2023 +type: libretro +core_classification: frozen_snapshot +source: "https://github.com/libretro/stella2023" +upstream: "https://github.com/stella-emu/stella" +profiled_date: "2026-03-25" +core_version: "7.0_pre" +display_name: "Atari - 2600 (Stella 2023)" +cores: + - stella2023 +systems: + - atari_2600 + +notes: | + Frozen snapshot of Stella development branch (7.0_pre, copyright 2024). + The .info reports display_version 6.6 which does not match the source + (src/common/Version.hxx defines STELLA_VERSION as "7.0_pre"). + + The Atari 2600 has no BIOS ROM; TIA, RIOT, and 6507 CPU are fully + emulated in software. The SuperCharger (Starpath) BIOS is emulated via + a built-in dummy ROM (ourDummyROMCode in CartAR.cxx:279). The game + properties database is compiled into DefProps.hxx; external loading is + disabled in the libretro port (OSystemLIBRETRO returns + CompositeKeyValueRepositoryNoop for the property repository). + + The libretro interface does not call RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY + and declares no firmware requirements (firmware_count=0 in .info). + + KidVid Voice Module audio tapes (7 WAV files) are checked via + FSNode::exists() in baseDir (resolves to content directory in the + libretro port). SoundLIBRETRO does not override playWav()/wavSize() + from the base Sound class, so WAV playback is non-functional. Games + work without WAV files using a timing-based fallback in KidVid::setNextSong(). + + EEPROM save data for AtariVox and SaveKey peripherals is managed as + NVRAM, not user-supplied. + +files: + - name: KVS1.WAV + description: "KidVid Voice Module audio tape 1 (Smurfs Save the Day)" + required: false + category: game_data + source_ref: "stella2023/src/emucore/KidVid.cxx:245,273" + - name: KVS2.WAV + description: "KidVid Voice Module audio tape 2 (Smurfs Save the Day)" + required: false + category: game_data + source_ref: "stella2023/src/emucore/KidVid.cxx:245,273" + - name: KVS3.WAV + description: "KidVid Voice Module audio tape 3 (Smurfs Save the Day)" + required: false + category: game_data + source_ref: "stella2023/src/emucore/KidVid.cxx:245,273" + - name: KVB1.WAV + description: "KidVid Voice Module audio tape 1 (Berenstain Bears)" + required: false + category: game_data + source_ref: "stella2023/src/emucore/KidVid.cxx:246,273" + - name: KVB2.WAV + description: "KidVid Voice Module audio tape 2 (Berenstain Bears)" + required: false + category: game_data + source_ref: "stella2023/src/emucore/KidVid.cxx:246,273" + - name: KVB3.WAV + description: "KidVid Voice Module audio tape 3 (Berenstain Bears)" + required: false + category: game_data + source_ref: "stella2023/src/emucore/KidVid.cxx:246,273" + - name: KVSHARED.WAV + description: "KidVid Voice Module shared audio samples" + required: false + category: game_data + source_ref: "stella2023/src/emucore/KidVid.cxx:274" diff --git a/emulators/stonesoup.yml b/emulators/stonesoup.yml index f775da60..438f8284 100644 --- a/emulators/stonesoup.yml +++ b/emulators/stonesoup.yml @@ -1,20 +1,41 @@ emulator: Stone Soup type: game +core_classification: frozen_snapshot source: "https://github.com/libretro/crawl-ref" -profiled_date: "2026-03-18" -core_version: "Git" +upstream: "https://github.com/crawl/crawl" +profiled_date: "2026-03-25" +core_version: "0.16-a0" display_name: "Dungeon Crawl Stone Soup" cores: [stonesoup] systems: [] -notes: > - Dungeon Crawl Stone Soup, a roguelike dungeon crawler. The libretro port is - built from the crawl-ref source tree (crawl-ref/source/) with TILES=y and - the libretro backend. The core accepts no content extensions - it launches - directly into a new game or save selection. All game data (tiles, databases, - descriptions, lua scripts, des files for level generation) is compiled into - the core binary or loaded from the bundled dat/ directory built alongside - the core. No BIOS, firmware, or external system files are required. Save - files are stored in the RetroArch save directory. +notes: | + Roguelike dungeon crawler. Fork frozen at DCSS 0.16-a0 (upstream now ~0.32). + Last libretro commit: Oct 2019. Marked experimental. + + Accepts .crawlrc config files as content (supported_extensions: crawlrc). + The libretro wrapper sets -dir to the content directory. + ref: libretro/libretro.cc:178-198 — main_wrap() passes -dir content_dir + + Game data loaded at runtime from dat/ tree via datafile_path(). + ref: source/files.cc:375-458 — _get_base_dirs() + datafile_path() + No DATA_DIR_PATH defined in Makefile.libretro — falls back to SysEnv.crawl_dir. + Data is NOT compiled into the binary. + + dat/ tree contents (532 files, 16 MB): + - dat/tiles/*.png (floor, wall, feat, player, main, gui, icons) — tiletex.cc:89-97 + - dat/DejaVuSans.ttf, dat/DejaVuSansMono.ttf — fontwrapper-ft.cc:79 + - dat/descript/*.txt, dat/database/*.txt — database.cc:72-140 + - dat/des/*.des (level generation) — maps.cc:1457 + - dat/dlua/*.lua, dat/clua/*.lua — maps.cc:1465 + - dat/defaults/ (settings) + + Not on buildbot.libretro.com/assets/system/. + No divergence in file loading between upstream and libretro fork. + +data_directories: + - ref: stonesoup + source_ref: "source/files.cc:375-458" files: [] +# no BIOS/firmware — game data loaded via data_directories diff --git a/emulators/superbroswar.yml b/emulators/superbroswar.yml index 81859c01..ba94e485 100644 --- a/emulators/superbroswar.yml +++ b/emulators/superbroswar.yml @@ -1,14 +1,16 @@ emulator: Super Bros War type: game +core_classification: game_engine source: "https://github.com/libretro/superbroswar-libretro" -profiled_date: "2026-03-18" +upstream: "https://github.com/mmatyas/supermariowar" +profiled_date: "2026-03-25" core_version: "v0.1" display_name: "Super Bros War" cores: [superbroswar] systems: [] files: [] notes: > - Libretro port of Super Mario War, a fan-made multiplayer battle game - where players stomp each other in Mario-style arenas. - Game data (maps, sprites, sounds) ships with the core repository. - No BIOS, firmware, or system directory files required. + Libretro port of Super Mario War, a fan-made multiplayer battle game. + All game data (maps, sprites, sounds, tilesets, skins) loads from the + content directory via convertPath(). System directory not used for game + data, only as save directory fallback. diff --git a/emulators/swanstation.yml b/emulators/swanstation.yml index 8fd40949..bbc5aaa5 100644 --- a/emulators/swanstation.yml +++ b/emulators/swanstation.yml @@ -1,8 +1,80 @@ -emulator: "swanstation" -type: alias -alias_of: "beetle_psx" -profiled_date: "2026-03-18" +emulator: swanstation +type: libretro +core_classification: community_fork +source: "https://github.com/libretro/swanstation" +upstream: "https://github.com/stenzek/duckstation" +profiled_date: "2026-03-25" core_version: "v0.1" display_name: "Sony - PlayStation (SwanStation)" -note: "This core uses the same BIOS/firmware as beetle_psx. See emulators/beetle_psx.yml for details." -files: [] +cores: [swanstation] +systems: [sony-playstation] +notes: | + Fork of DuckStation maintained by the libretro community after stenzek removed + libretro support. Frozen at an early DuckStation state. + + BIOS is required to boot. No HLE fallback. + ref: src/core/system.cpp:667-674 (GetBIOSImage fails = Shutdown) + + Auto-detects BIOS by scanning system_dir for files of known sizes. + ref: src/core/host_interface.cpp:183-243 (FindBIOSImageInDirectory) + Accepts PS1 (512 KB), PS2 (4 MB), and PS3 (0x3E66F0) BIOS images. + Only the first 512 KB are loaded (bios.cpp:83, Image(BIOS_SIZE)). + ref: src/core/bios.h:9 (BIOS_SIZE=0x80000, BIOS_SIZE_PS2=0x400000, BIOS_SIZE_PS3=0x3E66F0) + + 27 known BIOS entries identified by MD5 hash (all PS1 variants). + ref: src/core/bios.cpp:27-70 (s_image_infos) + Each entry has: description, region, hash, patch_compatible flag. + + Upstream DuckStation has evolved significantly (105 entries, PS2 BIOS, OpenBIOS, + priority system). SwanStation is frozen at the fork point. + +files: + - name: "scph5500.bin" + description: "SCPH-5500 (v3.0 09-09-96 J)" + region: "NTSC-J" + required: false + md5: "8dd7d5296a650fac7319bce665a6a53c" + size: 524288 + validation: [size, md5] + source_ref: "src/core/bios.cpp:47" + aliases: [] + + - name: "scph5501.bin" + description: "SCPH-5501, 5503, 7003 (v3.0 11-18-96 A)" + region: "NTSC-U" + required: false + md5: "490f666e1afb15b7362b406ed1cea246" + size: 524288 + validation: [size, md5] + source_ref: "src/core/bios.cpp:48-49" + aliases: [] + + - name: "scph5502.bin" + description: "SCPH-5502, 5552 (v3.0 01-06-97 E)" + region: "PAL" + required: false + md5: "32736f17079d0b2b7024407c39bd3050" + size: 524288 + validation: [size, md5] + source_ref: "src/core/bios.cpp:50-51" + aliases: [] + + - name: "psxonpsp660.bin" + description: "PSP, SCPH-1000R (v4.5 05-25-00 J)" + region: "Auto" + required: false + md5: "c53ca5908936d412331790f4426c6c33" + size: 524288 + validation: [size, md5] + source_ref: "src/core/bios.cpp:65-66" + aliases: [] + + - name: "ps1_rom.bin" + description: "PS3 (v5.0 06-23-03 A)" + region: "Auto" + required: false + md5: "81bbe60ba7a3d1cea1d48c14cbcc647b" + size: 4089584 + validation: [size, md5] + source_ref: "src/core/bios.cpp:70" + aliases: [] diff --git a/emulators/syobonaction.yml b/emulators/syobonaction.yml index 1fc2bc29..319b85b8 100644 --- a/emulators/syobonaction.yml +++ b/emulators/syobonaction.yml @@ -1,14 +1,250 @@ emulator: Syobon Action type: game -source: "https://github.com/libretro/syobonaction-libretro" -profiled_date: "2026-03-18" -core_version: "0.1" +core_classification: community_fork +source: "https://github.com/iyzsong/syobonaction-libretro" +upstream: "https://github.com/akemin-dayo/OpenSyobonAction" +profiled_date: "2026-03-25" +core_version: "0.3" display_name: "Syobon Action" cores: [syobonaction] systems: [] -files: [] notes: > - Libretro port of Syobon Action (Cat Mario), a parody platformer known - for deceptive traps and unfair level design by z_gundam_tanosii. - Game data (maps, sprites, sounds) ships with the core repository. - No BIOS, firmware, or system directory files required. + Libretro port of Open Syobon Action (Cat Mario), the SDL port of the + Japanese platformer by z_gundam_tanosii. Game assets required in + system_dir/SyobonAction/ with BGM/, SE/, and res/ subdirectories. + Level data hardcoded in source. The original libretro/syobonaction-libretro + repo was deleted; source points to the archived original by iyzsong. + The .info display_version is "0.1" but the code reports "0.3". + +files: + # ── res/ - Graphics (required: LoadGraph → exit(1) on failure) ── + + - name: player.PNG + path: SyobonAction/res/player.PNG + description: "Player character sprites" + required: true + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:40" + + - name: brock.PNG + path: SyobonAction/res/brock.PNG + description: "Block tileset" + required: true + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:42" + + - name: item.PNG + path: SyobonAction/res/item.PNG + description: "Item sprites" + required: true + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:44" + + - name: teki.PNG + path: SyobonAction/res/teki.PNG + description: "Enemy sprites" + required: true + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:46" + + - name: haikei.PNG + path: SyobonAction/res/haikei.PNG + description: "Background graphics" + required: true + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:48" + + - name: brock2.PNG + path: SyobonAction/res/brock2.PNG + description: "Alternate block tileset" + required: true + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:50" + + - name: omake.PNG + path: SyobonAction/res/omake.PNG + description: "Bonus sprites" + required: true + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:52" + + - name: omake2.PNG + path: SyobonAction/res/omake2.PNG + description: "Bonus sprites (set 2)" + required: true + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:54" + + - name: syobon3.PNG + path: SyobonAction/res/syobon3.PNG + description: "Title screen" + required: true + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:56" + + # ── res/ - Font (required: TTF_OpenFont → exit(1) on failure) ── + + - name: sazanami-gothic.ttf + path: SyobonAction/res/sazanami-gothic.ttf + description: "Sazanami Gothic Japanese font for text rendering" + required: true + category: game_data + source_ref: "OpenSyobonAction/DxLib.cpp:73" + + # ── BGM/ - Music (optional: LoadMusicMem → NULL on failure, game continues) ── + + - name: field.ogg + path: SyobonAction/BGM/field.ogg + description: "Field stage music" + required: false + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:220" + + - name: dungeon.ogg + path: SyobonAction/BGM/dungeon.ogg + description: "Dungeon stage music" + required: false + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:221" + + - name: star4.ogg + path: SyobonAction/BGM/star4.ogg + description: "Star power music" + required: false + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:222" + + - name: castle.ogg + path: SyobonAction/BGM/castle.ogg + description: "Castle stage music" + required: false + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:223" + + - name: puyo.ogg + path: SyobonAction/BGM/puyo.ogg + description: "Puyo stage music" + required: false + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:224" + + # ── SE/ - Sound effects (optional: LoadSoundMem → NULL on failure, game continues) ── + + - name: jump.ogg + path: SyobonAction/SE/jump.ogg + description: "Jump sound" + required: false + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:228" + + - name: brockbreak.ogg + path: SyobonAction/SE/brockbreak.ogg + description: "Block break sound" + required: false + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:230" + + - name: coin.ogg + path: SyobonAction/SE/coin.ogg + description: "Coin sound" + required: false + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:231" + + - name: humi.ogg + path: SyobonAction/SE/humi.ogg + description: "Stomp sound" + required: false + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:232" + + - name: koura.ogg + path: SyobonAction/SE/koura.ogg + description: "Shell sound" + required: false + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:233" + + - name: dokan.ogg + path: SyobonAction/SE/dokan.ogg + description: "Pipe sound" + required: false + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:234" + + - name: brockkinoko.ogg + path: SyobonAction/SE/brockkinoko.ogg + description: "Mushroom from block sound" + required: false + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:235" + + - name: powerup.ogg + path: SyobonAction/SE/powerup.ogg + description: "Power-up sound" + required: false + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:236" + + - name: kirra.ogg + path: SyobonAction/SE/kirra.ogg + description: "Star sound" + required: false + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:237" + + - name: goal.ogg + path: SyobonAction/SE/goal.ogg + description: "Goal sound" + required: false + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:238" + + - name: death.ogg + path: SyobonAction/SE/death.ogg + description: "Death sound" + required: false + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:239" + + - name: Pswitch.ogg + path: SyobonAction/SE/Pswitch.ogg + description: "P-switch sound" + required: false + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:240" + + - name: jumpBlock.ogg + path: SyobonAction/SE/jumpBlock.ogg + description: "Jump block sound" + required: false + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:241" + + - name: hintBlock.ogg + path: SyobonAction/SE/hintBlock.ogg + description: "Hint block sound" + required: false + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:242" + + - name: 4-clear.ogg + path: SyobonAction/SE/4-clear.ogg + description: "Stage clear sound" + required: false + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:243" + + - name: allclear.ogg + path: SyobonAction/SE/allclear.ogg + description: "All stages clear sound" + required: false + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:244" + + - name: tekifire.ogg + path: SyobonAction/SE/tekifire.ogg + description: "Enemy fire sound" + required: false + category: game_data + source_ref: "OpenSyobonAction/loadg.cpp:245" diff --git a/emulators/tamalibretro.yml b/emulators/tamalibretro.yml index 0d44762b..abd65623 100644 --- a/emulators/tamalibretro.yml +++ b/emulators/tamalibretro.yml @@ -1,14 +1,17 @@ emulator: TamaLIBretro -type: game -source: "https://github.com/libretro/tamern-libretro" -profiled_date: "2026-03-18" +type: libretro +core_classification: community_fork +source: "https://github.com/celerizer/tamalibretro" +upstream: "https://github.com/jcrona/tamalib" +source_ref: "main.c:345-365 (retro_load_game)" +profiled_date: "2026-03-25" core_version: "1.0" display_name: "Bandai - Tamagotchi P1 (TamaLIBretro)" cores: [tamalibretro] -systems: [] +systems: [tamagotchi-p1] files: [] notes: > - Tamagotchi P1 virtual pet simulator for libretro based on TamaLIB. - Emulates the Bandai Tamagotchi P1 hardware (E0C6S46 CPU). - The original Tamagotchi ROM is compiled into the binary. - No content file, BIOS, or system directory files required. + Emulates Bandai Tamagotchi P1 hardware (Epson E0C6S46 CPU) via TamaLIB. + Loads the Tamagotchi ROM (tama.b from MAME set) as content. + No BIOS or system directory files required. + .info firmware_count=0 matches the code. diff --git a/emulators/tempgba.yml b/emulators/tempgba.yml index 99a1632e..7cbfdcbf 100644 --- a/emulators/tempgba.yml +++ b/emulators/tempgba.yml @@ -1,7 +1,9 @@ emulator: TempGBA type: libretro +core_classification: community_fork source: "https://github.com/libretro/TempGBA-libretro" -profiled_date: "2026-03-18" +upstream: "https://github.com/Nebuleon/ReGBA" +profiled_date: "2026-03-25" core_version: "26731013" display_name: "Nintendo - Game Boy Advance (TempGBA)" cores: @@ -10,22 +12,16 @@ systems: - nintendo-gba notes: | - TempGBA is a Game Boy Advance emulator forked from gpSP. Originally - developed for the Nintendo DS homebrew scene, the libretro port wraps - the dynarec-based GBA engine for use in RetroArch. - - The GBA BIOS (gba_bios.bin) is optional. TempGBA includes HLE BIOS - stubs inherited from gpSP that handle most SWI calls. The real BIOS - improves boot logo display and SWI accuracy for a small number of - titles. - - BIOS file goes in the system directory as gba_bios.bin (same path - used by gpSP and mGBA). + Fork chain: gpSP (Exophase) -> gpSP Kai (takka) -> TempGBA NDS + (Nebuleon) -> TempGBA4PSP (unknown) -> TempGBA-libretro. + PSP-optimized GBA emulator. No HLE BIOS: SWI calls execute from + the real BIOS ROM. The NDS version (ReGBA) added an open-source + BIOS replacement (Normmatt), but TempGBA4PSP did not carry it over. + Boot sequence skipped by default (PC starts at 0x08000000). files: - name: gba_bios.bin system: nintendo-gba - required: false - hle_fallback: true + required: true size: 16384 - note: "GBA BIOS. Optional, HLE stubs cover most software." + source_ref: "memory.c:3308-3323 (load_bios), libretro.c:238-314 (retro_load_game returns false if missing)" diff --git a/emulators/test.yml b/emulators/test.yml index 157746dc..29b8b9ff 100644 --- a/emulators/test.yml +++ b/emulators/test.yml @@ -1,7 +1,9 @@ emulator: test type: test +core_classification: pure_libretro source: "https://github.com/libretro/libretro-samples" -profiled_date: "2026-03-18" +upstream: "https://github.com/libretro/libretro-samples" +profiled_date: "2026-03-25" core_version: "v1" display_name: "Test" cores: @@ -9,10 +11,10 @@ cores: systems: [] notes: | - Basic test core from libretro-samples. Minimal software-rendered core - used for sanity-checking the libretro frontend loop (frame timing, input - polling, audio sample generation). + Test core from libretro-samples. Software-rendered checkerboard pattern + with sine wave audio and input device testing (joypad, mouse, analog, + lightgun, keyboard, rumble). No emulation, no system files. - No system files, BIOS, or firmware required. Not an emulator. + Source: tests/test/libretro-test.c. Single file, no file I/O. files: [] diff --git a/emulators/test_netplay.yml b/emulators/test_netplay.yml index a776d2a7..6801c3ad 100644 --- a/emulators/test_netplay.yml +++ b/emulators/test_netplay.yml @@ -1,7 +1,7 @@ emulator: test_netplay type: test -source: "https://github.com/libretro/libretro-samples" -profiled_date: "2026-03-18" +core_classification: pure_libretro +profiled_date: "2026-03-25" core_version: "1" display_name: "Test for netplay" cores: @@ -9,11 +9,15 @@ cores: systems: [] notes: | - Netplay test core from libretro-samples. Designed to validate the libretro - netplay subsystem: deterministic frame stepping, input synchronization, - savestate serialization for rollback. Renders a simple interactive scene - where two players can verify sync. + Phantom .info: declared in libretro-core-info since 2017 but no source code, + build recipe, or compiled binary exists anywhere in the libretro organization. + Not on the buildbot. The .info has empty authors, license, and extensions. - No system files, BIOS, or firmware required. Not an emulator. + No system files required. + +exclusion_note: > + .info declares no firmware (firmware_count absent). No source code found + to analyze — searched libretro-samples, RetroArch cores, libretro-super, + and the full libretro GitHub org. files: [] diff --git a/emulators/testaudio_callback.yml b/emulators/testaudio_callback.yml index 4e9a2f5b..99212be4 100644 --- a/emulators/testaudio_callback.yml +++ b/emulators/testaudio_callback.yml @@ -1,7 +1,9 @@ emulator: testaudio_callback type: test +core_classification: pure_libretro source: "https://github.com/libretro/libretro-samples" -profiled_date: "2026-03-18" +upstream: "https://github.com/libretro/libretro-samples" +profiled_date: "2026-03-25" core_version: "v1" display_name: "TestAudio Callback" cores: @@ -11,9 +13,7 @@ systems: [] notes: | Audio callback test core from libretro-samples. Tests the RETRO_ENVIRONMENT_SET_AUDIO_CALLBACK path where audio runs on a - separate thread managed by the frontend. Generates a simple tone - to validate callback-driven audio output. - - No system files, BIOS, or firmware required. Not an emulator. + separate thread managed by the frontend. Generates a 300 Hz sine + tone to validate callback-driven audio output. files: [] diff --git a/emulators/testaudio_no_callback.yml b/emulators/testaudio_no_callback.yml index 5df82c18..d76e8a85 100644 --- a/emulators/testaudio_no_callback.yml +++ b/emulators/testaudio_no_callback.yml @@ -1,7 +1,9 @@ emulator: testaudio_no_callback type: test +core_classification: pure_libretro source: "https://github.com/libretro/libretro-samples" -profiled_date: "2026-03-18" +upstream: "https://github.com/libretro/libretro-samples" +profiled_date: "2026-03-25" core_version: "v1" display_name: "TestAudio NoCallback" cores: @@ -9,11 +11,8 @@ cores: systems: [] notes: | - Audio no-callback test core from libretro-samples. Tests the standard - synchronous audio path using retro_audio_sample/retro_audio_sample_batch - (no threaded callback). Generates a simple tone to validate the default - audio output mode. - - No system files, BIOS, or firmware required. Not an emulator. + Audio test core from libretro-samples. Tests the synchronous audio path + using retro_audio_sample (no threaded callback). Generates a 300 Hz sine + wave at 30 kHz sample rate. files: [] diff --git a/emulators/testaudio_playback_wav.yml b/emulators/testaudio_playback_wav.yml index 6ccdd99e..d649d416 100644 --- a/emulators/testaudio_playback_wav.yml +++ b/emulators/testaudio_playback_wav.yml @@ -1,7 +1,9 @@ emulator: testaudio_playback_wav type: test +core_classification: pure_libretro source: "https://github.com/libretro/libretro-samples" -profiled_date: "2026-03-18" +upstream: "https://github.com/libretro/libretro-samples" +profiled_date: "2026-03-25" core_version: "v1" display_name: "TestAudio Playback Wav" cores: @@ -9,11 +11,10 @@ cores: systems: [] notes: | - Audio WAV playback test core from libretro-samples. Loads a .wav file - as content and plays it back through the libretro audio interface. Tests - audio sample rate conversion, buffer management, and content loading for - non-ROM file types. + WAV playback test core from libretro-samples. Loads a .wav file as content + and plays it back through the libretro audio interface. Renders a progress + bar on a 320x240 framebuffer. No emulation, no system files. - No system files, BIOS, or firmware required. Not an emulator. + Source: audio/audio_playback_wav/libretro-test.c. Single file, no file I/O. files: [] diff --git a/emulators/testgl.yml b/emulators/testgl.yml index f7fe23e2..ec10faf4 100644 --- a/emulators/testgl.yml +++ b/emulators/testgl.yml @@ -1,7 +1,9 @@ emulator: testgl type: test +core_classification: pure_libretro source: "https://github.com/libretro/libretro-samples" -profiled_date: "2026-03-18" +upstream: "https://github.com/libretro/libretro-samples" +profiled_date: "2026-03-25" core_version: "v1" display_name: "TestGL" cores: @@ -9,10 +11,8 @@ cores: systems: [] notes: | - OpenGL test core from libretro-samples. Validates the hardware-accelerated - OpenGL rendering path in the frontend. Renders a spinning triangle or cube - using GL calls through the libretro hw_render interface. - - No system files, BIOS, or firmware required. Not an emulator. + OpenGL programmable pipeline test core from libretro-samples. Renders two + spinning quads via GL 2.0+ / GLES 2.0+ shaders through the libretro + hw_render interface. Shaders are embedded as string constants in the source. files: [] diff --git a/emulators/testgl_compute_shaders.yml b/emulators/testgl_compute_shaders.yml index 551551f7..693a64f4 100644 --- a/emulators/testgl_compute_shaders.yml +++ b/emulators/testgl_compute_shaders.yml @@ -1,7 +1,9 @@ emulator: testgl_compute_shaders type: test +core_classification: pure_libretro source: "https://github.com/libretro/libretro-samples" -profiled_date: "2026-03-18" +upstream: "https://github.com/libretro/libretro-samples" +profiled_date: "2026-03-25" core_version: "v1" display_name: "TestGL ComputeShaders" cores: @@ -12,8 +14,7 @@ notes: | OpenGL compute shader test core from libretro-samples. Validates compute shader support through the libretro hw_render interface. Runs a compute shader kernel and renders the output, testing GL 4.3+ / GLES 3.1+ - capability in the frontend. - - No system files, BIOS, or firmware required. Not an emulator. + capability in the frontend. All visual assets (shaders, textures, mesh) + are bundled in the core's app/ directory alongside the binary. files: [] diff --git a/emulators/testgl_ff.yml b/emulators/testgl_ff.yml index 81f3f9c2..f21f0f34 100644 --- a/emulators/testgl_ff.yml +++ b/emulators/testgl_ff.yml @@ -1,7 +1,10 @@ emulator: testgl_ff type: test +core_classification: pure_libretro source: "https://github.com/libretro/libretro-samples" -profiled_date: "2026-03-18" +upstream: null +source_ref: "video/opengl/libretro_test_gl_fixedfunction/libretro_gl_ff_test.c" +profiled_date: "2026-03-25" core_version: "v1" display_name: "TestGL (FF)" cores: @@ -9,11 +12,8 @@ cores: systems: [] notes: | - OpenGL fixed-function test core from libretro-samples. Similar to testgl - but uses the legacy OpenGL fixed-function pipeline (glBegin/glEnd, matrix - stack) instead of shaders. Tests frontend compatibility with older GL code - paths. - - No system files, BIOS, or firmware required. Not an emulator. + OpenGL fixed-function pipeline test core from libretro-samples. + Renders a colored quad using glBegin/glEnd and matrix stack (GL 1.4+ / GLES 1.x+). + No file loading of any kind. supports_no_game. files: [] diff --git a/emulators/testinput_buttontest.yml b/emulators/testinput_buttontest.yml index 6887a5e0..8d141bb6 100644 --- a/emulators/testinput_buttontest.yml +++ b/emulators/testinput_buttontest.yml @@ -1,7 +1,9 @@ emulator: testinput_buttontest type: test +core_classification: pure_libretro source: "https://github.com/libretro/libretro-samples" -profiled_date: "2026-03-18" +upstream: "https://github.com/libretro/libretro-samples" +profiled_date: "2026-03-25" core_version: "v1" display_name: "Button Test" cores: @@ -9,11 +11,10 @@ cores: systems: [] notes: | - Input button test core from libretro-samples. Displays a visual - representation of all libretro input bindings (joypad buttons, analog - sticks, triggers) and highlights them in real time as they are pressed. - Used to debug controller mapping and input driver issues. + Input button test core from libretro-samples. Renders an RLE-encoded + controller image and highlights buttons in real time as pressed. Polls + joypad and analog inputs. No file I/O. - No system files, BIOS, or firmware required. Not an emulator. + Source: input/button_test/libretro.c. Single file, no external dependencies. files: [] diff --git a/emulators/testretroluxury.yml b/emulators/testretroluxury.yml index 3aac97fa..4875a6a4 100644 --- a/emulators/testretroluxury.yml +++ b/emulators/testretroluxury.yml @@ -1,7 +1,9 @@ emulator: testretroluxury type: test -source: "https://github.com/libretro/libretro-samples" -profiled_date: "2026-03-18" +core_classification: pure_libretro +source: "https://github.com/libretro/retroluxury" +upstream: "https://github.com/leiradel/retroluxury" +profiled_date: "2026-03-25" core_version: "v1" display_name: "Test RetroLuxury" cores: @@ -9,11 +11,8 @@ cores: systems: [] notes: | - RetroLuxury test core from libretro-samples. Demonstrates the rluxury - (RetroLuxury) middleware layer for libretro, which provides a simplified - game development framework on top of the core API. Used as a reference - implementation for the middleware. - - No system files, BIOS, or firmware required. Not an emulator. + Tech demo for the retroluxury middleware layer. All resources (sprites, audio, + fonts) are embedded in the binary via xxd -i at compile time. No external + files loaded at runtime. files: [] diff --git a/emulators/testsw.yml b/emulators/testsw.yml index 182b928f..7f0ab4f0 100644 --- a/emulators/testsw.yml +++ b/emulators/testsw.yml @@ -1,7 +1,10 @@ emulator: testsw type: test +core_classification: pure_libretro source: "https://github.com/libretro/libretro-samples" -profiled_date: "2026-03-18" +source_ref: "video/software/rendering/libretro-test.c" +upstream: null +profiled_date: "2026-03-25" core_version: "v1" display_name: "TestSW" cores: @@ -9,10 +12,8 @@ cores: systems: [] notes: | - Software rendering test core from libretro-samples. Validates the basic - software framebuffer path (RETRO_HW_FRAME_BUFFER_VALID). Writes pixel - data directly to the framebuffer without any hardware acceleration. - - No system files, BIOS, or firmware required. Not an emulator. + Software rendering test core from libretro-samples. Allocates a 320x240 + XRGB8888 framebuffer and renders a moving checkered pattern. Reference + implementation for core authors testing the software rendering path. files: [] diff --git a/emulators/testsw_vram.yml b/emulators/testsw_vram.yml index 75553edf..1c8d309d 100644 --- a/emulators/testsw_vram.yml +++ b/emulators/testsw_vram.yml @@ -1,7 +1,10 @@ emulator: testsw_vram type: test +core_classification: pure_libretro source: "https://github.com/libretro/libretro-samples" -profiled_date: "2026-03-18" +upstream: "https://github.com/libretro/libretro-samples" +source_ref: "video/software/rendering_direct_to_vram/libretro-test.c" +profiled_date: "2026-03-25" core_version: "v1" display_name: "TestSW VRAM" cores: @@ -9,10 +12,8 @@ cores: systems: [] notes: | - Software VRAM test core from libretro-samples. Tests the software rendering - path with VRAM access patterns, validating how the frontend handles direct - video memory writes and buffer management. - - No system files, BIOS, or firmware required. Not an emulator. + Software rendering test core. Renders a checkered pattern directly to VRAM + via RETRO_ENVIRONMENT_GET_CURRENT_SOFTWARE_FRAMEBUFFER, with fallback to + standard framebuffer copy. Single source file, no file I/O. files: [] diff --git a/emulators/testvulkan.yml b/emulators/testvulkan.yml index f499acde..66fbcf55 100644 --- a/emulators/testvulkan.yml +++ b/emulators/testvulkan.yml @@ -1,7 +1,9 @@ emulator: testvulkan type: test +core_classification: pure_libretro source: "https://github.com/libretro/libretro-samples" -profiled_date: "2026-03-18" +upstream: "https://github.com/libretro/libretro-samples" +profiled_date: "2026-03-25" core_version: "v1" display_name: "TestVulkan" cores: @@ -11,8 +13,8 @@ systems: [] notes: | Vulkan test core from libretro-samples. Validates the Vulkan hardware rendering path in the frontend via the libretro hw_render_interface_vulkan - API. Renders a basic scene using Vulkan command buffers and swapchain - integration. + API. Renders a rotating triangle using Vulkan command buffers and swapchain + integration. Shaders embedded at compile time (SPIR-V). No system files, BIOS, or firmware required. Not an emulator. diff --git a/emulators/testvulkan_async_compute.yml b/emulators/testvulkan_async_compute.yml index 276eaa1e..e5814be7 100644 --- a/emulators/testvulkan_async_compute.yml +++ b/emulators/testvulkan_async_compute.yml @@ -1,7 +1,9 @@ emulator: testvulkan_async_compute type: test +core_classification: pure_libretro source: "https://github.com/libretro/libretro-samples" -profiled_date: "2026-03-18" +upstream: "https://github.com/libretro/libretro-samples" +profiled_date: "2026-03-25" core_version: "v1" display_name: "TestVulkan AsyncCompute" cores: @@ -9,10 +11,10 @@ cores: systems: [] notes: | - Vulkan async compute test core from libretro-samples. Extends testvulkan - to exercise async compute queue support in the Vulkan rendering path. - Tests concurrent graphics and compute workloads through the libretro - hw_render_interface_vulkan API. + Vulkan async compute test core from libretro-samples. Exercises async + compute queue support via the libretro hw_render_interface_vulkan API. + Renders a raymarching demo using concurrent graphics and compute workloads. + Compute shader embedded at compile time (SPIR-V). No system files, BIOS, or firmware required. Not an emulator. diff --git a/emulators/tgbdual.yml b/emulators/tgbdual.yml index 49caed19..479c667a 100644 --- a/emulators/tgbdual.yml +++ b/emulators/tgbdual.yml @@ -1,7 +1,9 @@ emulator: TGB Dual type: libretro +core_classification: community_fork source: "https://github.com/libretro/tgbdual-libretro" -profiled_date: "2026-03-18" +upstream: "http://gigo.retrogames.com/download.html#tgb-dual" +profiled_date: "2026-03-25" core_version: "v0.8.3" display_name: "Nintendo - Game Boy / Color (TGB Dual)" cores: @@ -11,22 +13,11 @@ systems: - nintendo-gbc notes: | - TGB Dual is a Game Boy / Game Boy Color emulator by GIGO and Hii with - link cable support for two Game Boy units side by side. + Game Boy / Game Boy Color emulator by GIGO and Hii with link cable support + for two units side by side. Libretro port based on shinichiro.h's SDL port. - No BIOS or boot ROM files are required or supported. The core does not - call RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY for firmware loading and does - not attempt to open any files from the system directory. - - In cpu.cpp:57, the program counter is initialized to 0x100 (post-boot ROM - entry point), and cpu::reset() sets all registers to their post-boot - values directly (AF=0x01B0 for DMG, 0x11B0 for CGB). This means the - core completely bypasses the boot ROM sequence via HLE register setup. - - The load_rom() path in libretro.cpp passes ROM data directly to the gb - class without any BIOS file concatenation or boot ROM mapping. - - Supported extensions: gb, dmg, gbc, cgb, sgb. - Library version: v0.8.3. + cpu::reset() initializes PC to 0x100 and sets post-boot register values + (AF=0x01B0 DMG, 0x11B0 CGB), bypassing the boot ROM via HLE. + No system directory access, no file I/O for firmware. files: [] diff --git a/emulators/theodore.yml b/emulators/theodore.yml index 84dae9ec..80db898b 100644 --- a/emulators/theodore.yml +++ b/emulators/theodore.yml @@ -1,12 +1,15 @@ emulator: Theodore type: libretro +core_classification: pure_libretro source: "https://github.com/Zlika/theodore" -profiled_date: "2026-03-18" -core_version: "v4.1" +upstream: "http://dcmoto.free.fr/" +profiled_date: "2026-03-25" +core_version: "Git (post-3.1)" display_name: "Thomson - MO/TO (Theodore)" cores: [theodore] systems: [thomson-to7, thomson-to770, thomson-to8, thomson-to8d, thomson-to9, thomson-to9plus, thomson-mo5, thomson-mo6, olivetti-pc128] notes: > - All system ROMs (monitor + BASIC) are compiled into the binary. - No external BIOS files needed. + All system ROMs (monitor, BASIC, disk drive controller) are compiled into the binary + as C arrays in src/rom/*.inc. Derived from Daniel Coulom's DCTO8D/DCTO9P/DCMO5 emulators. + The .info declares no firmware (firmware_count absent), consistent with the code. files: [] diff --git a/emulators/thepowdertoy.yml b/emulators/thepowdertoy.yml index fa98f057..7b55ea28 100644 --- a/emulators/thepowdertoy.yml +++ b/emulators/thepowdertoy.yml @@ -1,14 +1,15 @@ emulator: The Powder Toy type: game +core_classification: pure_libretro source: "https://github.com/libretro/ThePowderToy" -profiled_date: "2026-03-18" +upstream: "https://github.com/ThePowderToy/The-Powder-Toy" +profiled_date: "2026-03-25" core_version: "v92.5.336" display_name: "The Powder Toy" cores: [thepowdertoy] systems: [] files: [] notes: > - Libretro port of The Powder Toy, a falling-sand physics simulation game. - Simulate various materials (powder, liquid, gas, explosive, electronic) - interacting with each other. Can load .cps save files as content. - No BIOS, firmware, or system directory files required. + Falling-sand physics simulation game. All resources (fonts, shaders, + images) compiled into the binary. GetSystemDir() declared but never + called. No external files loaded from system directory. diff --git a/emulators/tic80.yml b/emulators/tic80.yml index 94a5f13c..33984bb0 100644 --- a/emulators/tic80.yml +++ b/emulators/tic80.yml @@ -1,7 +1,9 @@ emulator: TIC-80 type: libretro +core_classification: game_engine source: "https://github.com/libretro/TIC-80" -profiled_date: "2026-03-18" +upstream: "https://github.com/nesbox/TIC-80" +profiled_date: "2026-03-25" core_version: "0.80.0" display_name: "TIC-80" cores: @@ -10,22 +12,17 @@ systems: - tic80 notes: | - TIC-80 is a fantasy computer for making, playing and sharing tiny games. - The libretro port wraps the nesbox/TIC-80 engine as a submodule. + Fantasy computer for making, playing and sharing tiny games. + The libretro repo wraps nesbox/TIC-80 as a submodule; the libretro + wrapper (tic80_libretro.c) lives in the upstream repo itself. - The core loads .tic cartridge files (and .png for cart-as-image format) - entirely through the libretro data buffer (need_fullpath = false, - tic80_libretro.c:340). Content bytes are passed directly to tic80_load() - at retro_load_game() (tic80_libretro.c:1152). + Content loaded entirely via libretro data buffer (need_fullpath = false, + tic80_libretro.c:340). No call to RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY. + No code path reads any file from the system directory. All VM resources + (sprites, palette, font, sound engine) are compiled into the binary. - The core never calls RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY. There is no - code path that reads any file from the system directory. No BIOS, firmware, - or boot ROM exists for this platform -- TIC-80 is a self-contained virtual - machine with all system resources built into the engine binary. - - The TIC-80 VM provides 80x45 tilemap, 240x136 screen, 256 8x8 sprites, - 4 channels of sound, and supports Lua, Moonscript, JavaScript, Wren, - Fennel, Squirrel, Ruby, Python, and Janet as scripting languages. + TIC_MODULE_EXT (dynamic scripting plugins) is disabled in libretro + builds via #if !defined(__LIBRETRO__) in tic80_config.h:36. files: [] @@ -34,14 +31,12 @@ platform_details: extensions: "tic, png" source_ref: "tic80_libretro.c:339" notes: | - .tic is the native cartridge format containing code, sprites, map, - sound, and music data. .png support allows loading cartridges + .tic is the native cartridge format. .png loads cartridges encoded as cover images (code stored in PNG metadata). runtime: source_ref: "nesbox/TIC-80 (submodule at core/)" notes: | - The entire TIC-80 runtime (CPU, GPU, APU, scripting engines) is - compiled into the core binary. No external dependencies at runtime. + Entire runtime compiled into the binary. No external dependencies. State serialization uses TIC_PERSISTENT_SIZE * 4 bytes of pmem() data (tic80_libretro.c:1203-1243). diff --git a/platforms/_data_dirs.yml b/platforms/_data_dirs.yml index 55407b7a..925d8e3e 100644 --- a/platforms/_data_dirs.yml +++ b/platforms/_data_dirs.yml @@ -159,6 +159,16 @@ data_directories: strip_components: 1 description: "FreeIntv per-game controller overlay PNGs" + # ref: crawl-ref/source/files.cc:375-458 — datafile_path() dat/ tree + # Not on buildbot — sourced from libretro repo + # 532 files (tiles, fonts, databases, lua scripts, level descriptions) + stonesoup: + source_url: "https://github.com/libretro/crawl-ref" + source_type: git_subtree + source_path: "crawl-ref/source/dat" + local_cache: data/stonesoup + description: "DCSS game data (tiles, fonts, databases, lua, level descriptions)" + # ref: dirksimple — system/ dirksimple: source_url: "https://buildbot.libretro.com/assets/system/DirkSimple.zip" diff --git a/scripts/common.py b/scripts/common.py index acad4ce6..e9dfe5b6 100644 --- a/scripts/common.py +++ b/scripts/common.py @@ -557,13 +557,21 @@ def _build_validation_index(profiles: dict) -> dict[str, dict]: # Hash checks — collect all accepted hashes as sets (multiple valid # versions of the same file, e.g. MT-32 ROM versions) if "crc32" in checks and f.get("crc32"): - norm = f["crc32"].lower() - if norm.startswith("0x"): - norm = norm[2:] - index[fname]["crc32"].add(norm) + crc_val = f["crc32"] + crc_list = crc_val if isinstance(crc_val, list) else [crc_val] + for cv in crc_list: + norm = str(cv).lower() + if norm.startswith("0x"): + norm = norm[2:] + index[fname]["crc32"].add(norm) for hash_type in ("md5", "sha1", "sha256"): if hash_type in checks and f.get(hash_type): - index[fname][hash_type].add(f[hash_type].lower()) + val = f[hash_type] + if isinstance(val, list): + for h in val: + index[fname][hash_type].add(str(h).lower()) + else: + index[fname][hash_type].add(str(val).lower()) # Adler32 — stored as known_hash_adler32 field (not in validation: list # for Dolphin, but support it in both forms for future profiles) adler_val = f.get("known_hash_adler32") or f.get("adler32")