1 Commits

Author SHA1 Message Date
Abdessamad Derraz f45f93a5a6 fix: restore large files in release job
release job built packs without PS3UPDAT.PUP, PSVUPDAT.PUP, etc.
producing tiny non-functional ZIPs (2-14 MB instead of 200+ MB).
2026-03-25 07:03:51 +01:00
59 changed files with 981 additions and 4513 deletions
+76 -12
View File
@@ -18,11 +18,13 @@ concurrency:
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
release: regenerate:
if: false # disabled until pack generation is validated in production
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions:
contents: write contents: write
pages: write
outputs:
changed: ${{ steps.commit.outputs.changed }}
steps: steps:
- uses: actions/checkout@v6 - uses: actions/checkout@v6
@@ -32,9 +34,57 @@ jobs:
- run: pip install pyyaml - run: pip install pyyaml
- name: Restore large files from release
run: |
mkdir -p .cache/large
gh release download large-files -D .cache/large/ 2>/dev/null || true
# Copy large files to their bios/ paths so generate_db sees them
for f in .cache/large/*; do
[ -f "$f" ] || continue
name=$(basename "$f")
# Match against .gitignore entries to find target path
target=$(grep "$name" .gitignore | head -1)
if [ -n "$target" ] && [ ! -f "$target" ]; then
mkdir -p "$(dirname "$target")"
cp "$f" "$target"
echo "Restored: $target"
fi
done
env:
GH_TOKEN: ${{ github.token }}
- name: Regenerate database, readme, and site
run: |
pip install mkdocs-material
python scripts/generate_db.py --force --bios-dir bios --output database.json
python scripts/generate_readme.py --db database.json --platforms-dir platforms
python scripts/generate_site.py
- name: Run tests - name: Run tests
run: python -m unittest tests.test_e2e -v 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
- name: Commit if changed
id: commit
run: |
git diff --quiet database.json README.md CONTRIBUTING.md && echo "changed=false" >> "$GITHUB_OUTPUT" && exit 0
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add database.json README.md CONTRIBUTING.md
git commit -m "regenerate database and docs"
git push
echo "changed=true" >> "$GITHUB_OUTPUT"
release:
needs: regenerate
if: (needs.regenerate.outputs.changed == 'true' || github.event.inputs.force_release == 'true')
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Rate limit - name: Rate limit
if: github.event.inputs.force_release != 'true' if: github.event.inputs.force_release != 'true'
id: rate id: rate
@@ -53,6 +103,20 @@ jobs:
env: env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- uses: actions/checkout@v6
if: steps.rate.outputs.skip != 'true'
with:
ref: main
- uses: actions/setup-python@v6
if: steps.rate.outputs.skip != 'true'
with:
python-version: "3.12"
- name: Install dependencies
if: steps.rate.outputs.skip != 'true'
run: pip install pyyaml
- name: Restore large files from release - name: Restore large files from release
if: steps.rate.outputs.skip != 'true' if: steps.rate.outputs.skip != 'true'
run: | run: |
@@ -78,7 +142,9 @@ jobs:
- name: Build packs - name: Build packs
if: steps.rate.outputs.skip != 'true' if: steps.rate.outputs.skip != 'true'
run: python scripts/generate_pack.py --all --output-dir dist/ run: |
python scripts/generate_db.py --bios-dir bios --output database.json
python scripts/generate_pack.py --all --output-dir dist/
- name: Release - name: Release
if: steps.rate.outputs.skip != 'true' if: steps.rate.outputs.skip != 'true'
@@ -102,16 +168,14 @@ jobs:
${PACKS} ${PACKS}
### Install ### Install
Download the pack matching your frontend, extract to the BIOS directory. Download, extract to your emulator's BIOS directory.
| Platform | Pack | Path | | Platform | Path |
|----------|------|------| |----------|------|
| RetroArch / Lakka | RetroArch_Lakka_BIOS_Pack.zip | system/ | | RetroArch / Lakka | system/ |
| Batocera | Batocera_BIOS_Pack.zip | /userdata/bios/ | | Batocera | /userdata/bios/ |
| Recalbox | Recalbox_BIOS_Pack.zip | /recalbox/share/bios/ | | Recalbox | /recalbox/share/bios/ |
| RetroBat | RetroBat_BIOS_Pack.zip | bios/ | | RetroBat | bios/ |
| RetroDECK | RetroDECK_BIOS_Pack.zip | ~/retrodeck/bios/ |
| EmuDeck | EmuDeck_BIOS_Pack.zip | Emulation/bios/ |
### Changes ### Changes
${CHANGES} ${CHANGES}
-59
View File
@@ -1,59 +0,0 @@
name: Deploy Site
on:
push:
branches: [main]
paths:
- "platforms/**"
- "emulators/**"
- "wiki/**"
- "scripts/generate_site.py"
- "scripts/generate_readme.py"
- "scripts/verify.py"
- "scripts/common.py"
- "database.json"
- "mkdocs.yml"
workflow_dispatch:
permissions:
contents: read
pages: write
id-token: write
concurrency:
group: deploy-site
cancel-in-progress: true
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: "3.12"
- run: pip install pyyaml mkdocs-material pymdown-extensions
- name: Generate site
run: |
python scripts/generate_site.py
python scripts/generate_readme.py --db database.json --platforms-dir platforms
mkdocs build
- name: Upload artifact
uses: actions/upload-pages-artifact@v4
with:
path: site/
deploy:
needs: build
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
+7 -2
View File
@@ -11,8 +11,13 @@ site/
*.log *.log
node_modules/ node_modules/
# Generated site pages (built by generate_site.py, deployed in CI) # Generated site pages (built in CI)
docs/ docs/index.md
docs/platforms/
docs/systems/
docs/emulators/
docs/contributing.md
docs/gaps.md
# Large files stored as GitHub Release assets (> 50MB) # Large files stored as GitHub Release assets (> 50MB)
bios/Arcade/Arcade/Firmware.19.0.0.zip bios/Arcade/Arcade/Firmware.19.0.0.zip
+10 -26
View File
@@ -1,24 +1,8 @@
# RetroBIOS # Retrogaming BIOS & Firmware Collection
Source-verified BIOS and firmware packs for retrogaming platforms. Complete, verified collection of BIOS, firmware, and system files for retrogaming emulators.
Documentation and metadata can drift from what emulators actually load at runtime. > **6724** files | **5013.3 MB** | **8** platforms | **275** emulator profiles
To keep packs accurate, each file here is checked against the emulator's source code:
what the code opens, what hashes it expects, what happens when a file is missing.
306 emulators profiled, 8 platforms cross-referenced,
6,733 files verified.
### How it works
1. **Read emulator source code** - identify every file the code loads, its expected hash and size
2. **Cross-reference with platforms** - match against what RetroArch, Batocera, Recalbox and others declare
3. **Build packs** - for each platform, include its baseline files plus what its cores need
4. **Verify** - run each platform's native checks (MD5, existence) and emulator-level validation (CRC32, size)
When a platform and an emulator disagree on a file, the discrepancy is reported.
When a variant in the repo satisfies both, it is preferred automatically.
> **6,733** files | **5043.6 MB** | **8** platforms | **306** emulator profiles
## Download ## Download
@@ -39,12 +23,12 @@ When a variant in the repo satisfies both, it is preferred automatically.
|----------|----------|----------|----------|---------| |----------|----------|----------|----------|---------|
| Batocera | 359/359 (100.0%) | 358 | 1 | 0 | | Batocera | 359/359 (100.0%) | 358 | 1 | 0 |
| EmuDeck | 161/161 (100.0%) | 161 | 0 | 0 | | EmuDeck | 161/161 (100.0%) | 161 | 0 | 0 |
| Lakka | 448/448 (100.0%) | 440 | 8 | 0 | | Lakka | 448/448 (100.0%) | 448 | 0 | 0 |
| Recalbox | 346/346 (100.0%) | 341 | 5 | 0 | | Recalbox | 346/346 (100.0%) | 346 | 0 | 0 |
| RetroArch | 448/448 (100.0%) | 440 | 8 | 0 | | RetroArch | 448/448 (100.0%) | 448 | 0 | 0 |
| RetroBat | 331/331 (100.0%) | 330 | 1 | 0 | | RetroBat | 331/331 (100.0%) | 331 | 0 | 0 |
| RetroDECK | 2007/2007 (100.0%) | 2001 | 6 | 0 | | RetroDECK | 2007/2007 (100.0%) | 1698 | 309 | 0 |
| RetroPie | 448/448 (100.0%) | 440 | 8 | 0 | | RetroPie | 448/448 (100.0%) | 448 | 0 | 0 |
## Documentation ## Documentation
@@ -63,4 +47,4 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
This repository provides BIOS files for personal backup and archival purposes. This repository provides BIOS files for personal backup and archival purposes.
*Auto-generated on 2026-03-25T15:42:07Z* *Auto-generated on 2026-03-20T19:10:25Z*
+88 -89
View File
@@ -1,5 +1,5 @@
{ {
"generated_at": "2026-03-25T15:41:49Z", "generated_at": "2026-03-25T05:56:02Z",
"total_files": 6733, "total_files": 6733,
"total_size": 5288644732, "total_size": 5288644732,
"files": { "files": {
@@ -1163,6 +1163,16 @@
"crc32": "b28f7112", "crc32": "b28f7112",
"adler32": "591b377c" "adler32": "591b377c"
}, },
"ac4b78d53c7a97da2451ca35498395d8dd1e3024": {
"path": "bios/Arcade/Arcade/Firmware.19.0.0.zip",
"name": "Firmware.19.0.0.zip",
"size": 338076508,
"sha1": "ac4b78d53c7a97da2451ca35498395d8dd1e3024",
"md5": "72d6c73306c7f0b76723f989e7e1bdd1",
"sha256": "2f3791655e6c1b56f07a309b69ce8ea35d8412695599bbb6d4b0e29d1b044b66",
"crc32": "77228c84",
"adler32": "471a3291"
},
"5426d52e17e0ff9195fabbb42f704342e556d08e": { "5426d52e17e0ff9195fabbb42f704342e556d08e": {
"path": "bios/Arcade/Arcade/acpsx.zip", "path": "bios/Arcade/Arcade/acpsx.zip",
"name": "acpsx.zip", "name": "acpsx.zip",
@@ -1833,6 +1843,16 @@
"crc32": "065d69d0", "crc32": "065d69d0",
"adler32": "3e9b6373" "adler32": "3e9b6373"
}, },
"add40c002084e8e25768671877b2aa603aaf5cb1": {
"path": "bios/Arcade/Arcade/maclc3.zip",
"name": "maclc3.zip",
"size": 189428461,
"sha1": "add40c002084e8e25768671877b2aa603aaf5cb1",
"md5": "aff722788800df5b22d5a07cf8e558ee",
"sha256": "e663e456e88f475b3cacc06e75f50605e700789aa327b6648c627a560762a5d6",
"crc32": "81f21918",
"adler32": "dbd42440"
},
"4e0202f8430cb4842184df7b5418e32620156c7b": { "4e0202f8430cb4842184df7b5418e32620156c7b": {
"path": "bios/Arcade/Arcade/macsbios.zip", "path": "bios/Arcade/Arcade/macsbios.zip",
"name": "macsbios.zip", "name": "macsbios.zip",
@@ -33233,6 +33253,16 @@
"crc32": "df558b58", "crc32": "df558b58",
"adler32": "4f2d77b8" "adler32": "4f2d77b8"
}, },
"b48f44194fe918aaaec5298861479512b581d661": {
"path": "bios/Nintendo/Nintendo DS/dsi_nand.bin",
"name": "dsi_nand.bin",
"size": 251658304,
"sha1": "b48f44194fe918aaaec5298861479512b581d661",
"md5": "dfafb1908da8f527df7a372e649b50be",
"sha256": "f57d9bf00529bec35d58404faff029a193fd2ccda0a83403ec4e6cc32626721b",
"crc32": "416bf51a",
"adler32": "3b3e7d56"
},
"3b71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3": { "3b71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3": {
"path": "bios/Nintendo/Nintendo DS/dsi_sd_card.bin", "path": "bios/Nintendo/Nintendo DS/dsi_sd_card.bin",
"name": "dsi_sd_card.bin", "name": "dsi_sd_card.bin",
@@ -65443,6 +65473,16 @@
"crc32": "2c3bcd32", "crc32": "2c3bcd32",
"adler32": "26412551" "adler32": "26412551"
}, },
"093f8698b54b78dcb701de2043f82639de51d63b": {
"path": "bios/Sony/PlayStation 3/PS3UPDAT.PUP",
"name": "PS3UPDAT.PUP",
"size": 206126236,
"sha1": "093f8698b54b78dcb701de2043f82639de51d63b",
"md5": "05fe32f5dc8c78acbcd84d36ee7fdc5b",
"sha256": "69070a95780f59fc9e0d82bcf53eb9b28fd4ed4a7d54d0a40045f80422fd98d6",
"crc32": "24bdb2db",
"adler32": "1ec0b1c3"
},
"6bf1ae9fb01915966b715836253592cbf588b406": { "6bf1ae9fb01915966b715836253592cbf588b406": {
"path": "bios/Sony/PlayStation Portable/Roboto-Condensed.ttf", "path": "bios/Sony/PlayStation Portable/Roboto-Condensed.ttf",
"name": "Roboto-Condensed.ttf", "name": "Roboto-Condensed.ttf",
@@ -66433,6 +66473,26 @@
"crc32": "c0c3a1fe", "crc32": "c0c3a1fe",
"adler32": "ea4fd486" "adler32": "ea4fd486"
}, },
"ed3a4cb264fff283209f10ae58c96c6090fed187": {
"path": "bios/Sony/PlayStation Vita/PSP2UPDAT.PUP",
"name": "PSP2UPDAT.PUP",
"size": 56778752,
"sha1": "ed3a4cb264fff283209f10ae58c96c6090fed187",
"md5": "59dcf059d3328fb67be7e51f8aa33418",
"sha256": "c3c03fc7363dd573d90e5157629bf11551f434b283cc898d9ffc71dd716b791c",
"crc32": "082ecf86",
"adler32": "620a2ff1"
},
"cc72dfcc964577cc29112ef368c28f55277c237c": {
"path": "bios/Sony/PlayStation Vita/PSVUPDAT.PUP",
"name": "PSVUPDAT.PUP",
"size": 133834240,
"sha1": "cc72dfcc964577cc29112ef368c28f55277c237c",
"md5": "f2c7b12fe85496ec88a0391b514d6e3b",
"sha256": "6ef6dc8da6db026f28647713e473486d770087a605c52a8d751bfca7478386cf",
"crc32": "39075d41",
"adler32": "75d71010"
},
"b184f1c1febf66c8168fcae0b8aa37a5754f79db": { "b184f1c1febf66c8168fcae0b8aa37a5754f79db": {
"path": "bios/Synertek/SYM-1/SYM.ROM", "path": "bios/Synertek/SYM-1/SYM.ROM",
"name": "SYM.ROM", "name": "SYM.ROM",
@@ -67272,66 +67332,6 @@
"sha256": "2a86458696e83eb924fc6c6fda3ca5d320ca90885bd6c2f32d121757ade389bb", "sha256": "2a86458696e83eb924fc6c6fda3ca5d320ca90885bd6c2f32d121757ade389bb",
"crc32": "74b76447", "crc32": "74b76447",
"adler32": "701e6531" "adler32": "701e6531"
},
"ac4b78d53c7a97da2451ca35498395d8dd1e3024": {
"path": ".cache/large/Firmware.19.0.0.zip",
"name": "Firmware.19.0.0.zip",
"size": 338076508,
"sha1": "ac4b78d53c7a97da2451ca35498395d8dd1e3024",
"md5": "72d6c73306c7f0b76723f989e7e1bdd1",
"sha256": "2f3791655e6c1b56f07a309b69ce8ea35d8412695599bbb6d4b0e29d1b044b66",
"crc32": "77228c84",
"adler32": "471a3291"
},
"add40c002084e8e25768671877b2aa603aaf5cb1": {
"path": ".cache/large/maclc3.zip",
"name": "maclc3.zip",
"size": 189428461,
"sha1": "add40c002084e8e25768671877b2aa603aaf5cb1",
"md5": "aff722788800df5b22d5a07cf8e558ee",
"sha256": "e663e456e88f475b3cacc06e75f50605e700789aa327b6648c627a560762a5d6",
"crc32": "81f21918",
"adler32": "dbd42440"
},
"b48f44194fe918aaaec5298861479512b581d661": {
"path": ".cache/large/dsi_nand.bin",
"name": "dsi_nand.bin",
"size": 251658304,
"sha1": "b48f44194fe918aaaec5298861479512b581d661",
"md5": "dfafb1908da8f527df7a372e649b50be",
"sha256": "f57d9bf00529bec35d58404faff029a193fd2ccda0a83403ec4e6cc32626721b",
"crc32": "416bf51a",
"adler32": "3b3e7d56"
},
"093f8698b54b78dcb701de2043f82639de51d63b": {
"path": ".cache/large/PS3UPDAT.PUP",
"name": "PS3UPDAT.PUP",
"size": 206126236,
"sha1": "093f8698b54b78dcb701de2043f82639de51d63b",
"md5": "05fe32f5dc8c78acbcd84d36ee7fdc5b",
"sha256": "69070a95780f59fc9e0d82bcf53eb9b28fd4ed4a7d54d0a40045f80422fd98d6",
"crc32": "24bdb2db",
"adler32": "1ec0b1c3"
},
"ed3a4cb264fff283209f10ae58c96c6090fed187": {
"path": ".cache/large/PSP2UPDAT.PUP",
"name": "PSP2UPDAT.PUP",
"size": 56778752,
"sha1": "ed3a4cb264fff283209f10ae58c96c6090fed187",
"md5": "59dcf059d3328fb67be7e51f8aa33418",
"sha256": "c3c03fc7363dd573d90e5157629bf11551f434b283cc898d9ffc71dd716b791c",
"crc32": "082ecf86",
"adler32": "620a2ff1"
},
"cc72dfcc964577cc29112ef368c28f55277c237c": {
"path": ".cache/large/PSVUPDAT.PUP",
"name": "PSVUPDAT.PUP",
"size": 133834240,
"sha1": "cc72dfcc964577cc29112ef368c28f55277c237c",
"md5": "f2c7b12fe85496ec88a0391b514d6e3b",
"sha256": "6ef6dc8da6db026f28647713e473486d770087a605c52a8d751bfca7478386cf",
"crc32": "39075d41",
"adler32": "75d71010"
} }
}, },
"indexes": { "indexes": {
@@ -67452,6 +67452,7 @@
"fcb298d97792b9e9bdd3296cc6be10b6": "eb2a867578a05bbf8741e9fe7204301062df0cb8", "fcb298d97792b9e9bdd3296cc6be10b6": "eb2a867578a05bbf8741e9fe7204301062df0cb8",
"ddb8aacffffffa608ddbb4a6d6dda5ec": "0b6519209766ed883e3fca4c61bf866804c89004", "ddb8aacffffffa608ddbb4a6d6dda5ec": "0b6519209766ed883e3fca4c61bf866804c89004",
"6c6c0c726cbf15e81785eb7592fdb51c": "de463b0577dfd1027bf7de523ff67a0fff861cdb", "6c6c0c726cbf15e81785eb7592fdb51c": "de463b0577dfd1027bf7de523ff67a0fff861cdb",
"72d6c73306c7f0b76723f989e7e1bdd1": "ac4b78d53c7a97da2451ca35498395d8dd1e3024",
"fcb631bf18a56f2d5b077fa846bab4a6": "5426d52e17e0ff9195fabbb42f704342e556d08e", "fcb631bf18a56f2d5b077fa846bab4a6": "5426d52e17e0ff9195fabbb42f704342e556d08e",
"3f348c88af99a40fbd11fa435f28c69d": "e18c5e9ca21654dfd724aa54e625b386e6ffb2c5", "3f348c88af99a40fbd11fa435f28c69d": "e18c5e9ca21654dfd724aa54e625b386e6ffb2c5",
"c266fc58905af1e246dffadc84301042": "beaf97c4a0e0792b8db65648f9dabb6a54ae0549", "c266fc58905af1e246dffadc84301042": "beaf97c4a0e0792b8db65648f9dabb6a54ae0549",
@@ -67519,6 +67520,7 @@
"7b51d463324b6bf26e86c4afb7316a3a": "8cf0aa7f9dca4d77485e605fb0e2173a734633bf", "7b51d463324b6bf26e86c4afb7316a3a": "8cf0aa7f9dca4d77485e605fb0e2173a734633bf",
"7a14456d6e8afaf540f2368fead25f26": "78c8e1c3c033b65758b7e53a9346b44d037fea7f", "7a14456d6e8afaf540f2368fead25f26": "78c8e1c3c033b65758b7e53a9346b44d037fea7f",
"d048a9ff941041de45c26474a0da40aa": "65a2f2cee74c316d5f40b68deda66787609df353", "d048a9ff941041de45c26474a0da40aa": "65a2f2cee74c316d5f40b68deda66787609df353",
"aff722788800df5b22d5a07cf8e558ee": "add40c002084e8e25768671877b2aa603aaf5cb1",
"34530e248d96e7171af19155af315378": "4e0202f8430cb4842184df7b5418e32620156c7b", "34530e248d96e7171af19155af315378": "4e0202f8430cb4842184df7b5418e32620156c7b",
"b48fb4fb35dc348f4904a318dbf9a712": "697551fcf9557ae33e31096b118a0c6769700a2e", "b48fb4fb35dc348f4904a318dbf9a712": "697551fcf9557ae33e31096b118a0c6769700a2e",
"6bb005f55ba39bc5f6b330b663da1a58": "c9ee16e26e03496195a7bff151efbdd89da01204", "6bb005f55ba39bc5f6b330b663da1a58": "c9ee16e26e03496195a7bff151efbdd89da01204",
@@ -70659,6 +70661,7 @@
"bfd8292fbf0a251647a23c5cb310a97a": "f1ad917e0affaeb8d2114c7ecd02b9f938c3cbd9", "bfd8292fbf0a251647a23c5cb310a97a": "f1ad917e0affaeb8d2114c7ecd02b9f938c3cbd9",
"94bc5094607c5e6598d50472c52f27f2": "1cf9e67c2c703bb9961bbcdd39cd2c7e319a803b", "94bc5094607c5e6598d50472c52f27f2": "1cf9e67c2c703bb9961bbcdd39cd2c7e319a803b",
"8daa89fd280b3e5ec79fbab73ad6684e": "d2a5af338f09c5cbdd5d7628db5b9c075c69b616", "8daa89fd280b3e5ec79fbab73ad6684e": "d2a5af338f09c5cbdd5d7628db5b9c075c69b616",
"dfafb1908da8f527df7a372e649b50be": "b48f44194fe918aaaec5298861479512b581d661",
"b6d81b360a5672d80c27430f39153e2c": "3b71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3", "b6d81b360a5672d80c27430f39153e2c": "3b71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3",
"74f23348012d7b3e1cc216c47192ffeb": "3773f52559d5ac4fc6d8aefe35bce58730ae8181", "74f23348012d7b3e1cc216c47192ffeb": "3773f52559d5ac4fc6d8aefe35bce58730ae8181",
"e45033d9b0fa6b0de071292bba7c9d13": "cfe072921ee3fb93f688743f8beef89043c3e9ad", "e45033d9b0fa6b0de071292bba7c9d13": "cfe072921ee3fb93f688743f8beef89043c3e9ad",
@@ -73880,6 +73883,7 @@
"5dea62f70439682a6cee16ba3823d11e": "6eddec30056cde7c664a0cf508dcad29353a12bb", "5dea62f70439682a6cee16ba3823d11e": "6eddec30056cde7c664a0cf508dcad29353a12bb",
"de6da198a7359d1200c3eeb6df9c7eda": "40ecf6138c99a0aba775ef93240b295025a45500", "de6da198a7359d1200c3eeb6df9c7eda": "40ecf6138c99a0aba775ef93240b295025a45500",
"44552702b05697a14ccbe2ca22ee7139": "47d2ec4b342649e4c391043ab915d4435f9d180d", "44552702b05697a14ccbe2ca22ee7139": "47d2ec4b342649e4c391043ab915d4435f9d180d",
"05fe32f5dc8c78acbcd84d36ee7fdc5b": "093f8698b54b78dcb701de2043f82639de51d63b",
"55caa30ec34ef081ded15615db54eafe": "6bf1ae9fb01915966b715836253592cbf588b406", "55caa30ec34ef081ded15615db54eafe": "6bf1ae9fb01915966b715836253592cbf588b406",
"a062688b08c70a42ff2a0acff6c46d93": "08325554623568bb9babadc10213bfc0b1151766", "a062688b08c70a42ff2a0acff6c46d93": "08325554623568bb9babadc10213bfc0b1151766",
"ad0542e2956a8dddf52357f28a8a7d9c": "9d6c9874c1d6a0c57a1345f211154fe1e494b55a", "ad0542e2956a8dddf52357f28a8a7d9c": "9d6c9874c1d6a0c57a1345f211154fe1e494b55a",
@@ -73979,6 +73983,8 @@
"331d6806a56d7370515d94a66616eca6": "78632d0fe9dd77bf9a2264f192fae6f0af03a71c", "331d6806a56d7370515d94a66616eca6": "78632d0fe9dd77bf9a2264f192fae6f0af03a71c",
"c96bb62586bf81dd6237c417f8cf3bb8": "18985a2079c7570c13cf39e0d001eef87538cd15", "c96bb62586bf81dd6237c417f8cf3bb8": "18985a2079c7570c13cf39e0d001eef87538cd15",
"8b5f60b56c3da8365b973dba570c53a5": "3ae832c9800fcaa007eccfc48f24242967c111f8", "8b5f60b56c3da8365b973dba570c53a5": "3ae832c9800fcaa007eccfc48f24242967c111f8",
"59dcf059d3328fb67be7e51f8aa33418": "ed3a4cb264fff283209f10ae58c96c6090fed187",
"f2c7b12fe85496ec88a0391b514d6e3b": "cc72dfcc964577cc29112ef368c28f55277c237c",
"e59fdf56762c480ba4dfe1b3ec5fb86d": "b184f1c1febf66c8168fcae0b8aa37a5754f79db", "e59fdf56762c480ba4dfe1b3ec5fb86d": "b184f1c1febf66c8168fcae0b8aa37a5754f79db",
"1d33d70f35b33873fc75941d95ad1ffa": "567c5b5054552a2771eafa7966844a146f0dde96", "1d33d70f35b33873fc75941d95ad1ffa": "567c5b5054552a2771eafa7966844a146f0dde96",
"b81dc552536796d234c08587bac7be43": "f2fa8d8e940f1d91a1b1624013df5dca0bb1ee44", "b81dc552536796d234c08587bac7be43": "f2fa8d8e940f1d91a1b1624013df5dca0bb1ee44",
@@ -74062,13 +74068,7 @@
"6f68e4baf89c8ee4623c19617319184b": "cee76080884af97c20059da0eb1ca956a835f3d0", "6f68e4baf89c8ee4623c19617319184b": "cee76080884af97c20059da0eb1ca956a835f3d0",
"2010e5b85f9e1d60685ccb3d84a17115": "c7cc306fb921754ba00794153292d533cf0765ef", "2010e5b85f9e1d60685ccb3d84a17115": "c7cc306fb921754ba00794153292d533cf0765ef",
"39e5bc84ce9aac3a2d297d8aeb2a0d05": "22bcfeb5b6c6481569b90db96aa3f4b5f06c8848", "39e5bc84ce9aac3a2d297d8aeb2a0d05": "22bcfeb5b6c6481569b90db96aa3f4b5f06c8848",
"a471e64e9f69afbe59c10cc94ed1b184": "ecfc092fe6371dbf38e238a8ba5f90785b5db52d", "a471e64e9f69afbe59c10cc94ed1b184": "ecfc092fe6371dbf38e238a8ba5f90785b5db52d"
"72d6c73306c7f0b76723f989e7e1bdd1": "ac4b78d53c7a97da2451ca35498395d8dd1e3024",
"aff722788800df5b22d5a07cf8e558ee": "add40c002084e8e25768671877b2aa603aaf5cb1",
"dfafb1908da8f527df7a372e649b50be": "b48f44194fe918aaaec5298861479512b581d661",
"05fe32f5dc8c78acbcd84d36ee7fdc5b": "093f8698b54b78dcb701de2043f82639de51d63b",
"59dcf059d3328fb67be7e51f8aa33418": "ed3a4cb264fff283209f10ae58c96c6090fed187",
"f2c7b12fe85496ec88a0391b514d6e3b": "cc72dfcc964577cc29112ef368c28f55277c237c"
}, },
"by_name": { "by_name": {
"3do_arcade_saot.bin": [ "3do_arcade_saot.bin": [
@@ -74428,6 +74428,9 @@
"de463b0577dfd1027bf7de523ff67a0fff861cdb", "de463b0577dfd1027bf7de523ff67a0fff861cdb",
"12516c82f52a8abb252fba754f95b7952c295e6f" "12516c82f52a8abb252fba754f95b7952c295e6f"
], ],
"Firmware.19.0.0.zip": [
"ac4b78d53c7a97da2451ca35498395d8dd1e3024"
],
"acpsx.zip": [ "acpsx.zip": [
"5426d52e17e0ff9195fabbb42f704342e556d08e" "5426d52e17e0ff9195fabbb42f704342e556d08e"
], ],
@@ -83268,6 +83271,9 @@
"dsi_firmware.bin": [ "dsi_firmware.bin": [
"d2a5af338f09c5cbdd5d7628db5b9c075c69b616" "d2a5af338f09c5cbdd5d7628db5b9c075c69b616"
], ],
"dsi_nand.bin": [
"b48f44194fe918aaaec5298861479512b581d661"
],
"dsi_sd_card.bin": [ "dsi_sd_card.bin": [
"3b71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3" "3b71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3"
], ],
@@ -92082,6 +92088,9 @@
"rom1.bin": [ "rom1.bin": [
"47d2ec4b342649e4c391043ab915d4435f9d180d" "47d2ec4b342649e4c391043ab915d4435f9d180d"
], ],
"PS3UPDAT.PUP": [
"093f8698b54b78dcb701de2043f82639de51d63b"
],
"Roboto-Condensed.ttf": [ "Roboto-Condensed.ttf": [
"6bf1ae9fb01915966b715836253592cbf588b406" "6bf1ae9fb01915966b715836253592cbf588b406"
], ],
@@ -92377,6 +92386,9 @@
"3ae832c9800fcaa007eccfc48f24242967c111f8", "3ae832c9800fcaa007eccfc48f24242967c111f8",
"ed3a4cb264fff283209f10ae58c96c6090fed187" "ed3a4cb264fff283209f10ae58c96c6090fed187"
], ],
"PSVUPDAT.PUP": [
"cc72dfcc964577cc29112ef368c28f55277c237c"
],
"coco.zip": [ "coco.zip": [
"567c5b5054552a2771eafa7966844a146f0dde96", "567c5b5054552a2771eafa7966844a146f0dde96",
"e31fbbb831f32886e57410183bc4e85d36c2dc7a" "e31fbbb831f32886e57410183bc4e85d36c2dc7a"
@@ -92611,18 +92623,6 @@
"data.zip": [ "data.zip": [
"ecfc092fe6371dbf38e238a8ba5f90785b5db52d" "ecfc092fe6371dbf38e238a8ba5f90785b5db52d"
], ],
"Firmware.19.0.0.zip": [
"ac4b78d53c7a97da2451ca35498395d8dd1e3024"
],
"dsi_nand.bin": [
"b48f44194fe918aaaec5298861479512b581d661"
],
"PS3UPDAT.PUP": [
"093f8698b54b78dcb701de2043f82639de51d63b"
],
"PSVUPDAT.PUP": [
"cc72dfcc964577cc29112ef368c28f55277c237c"
],
"disk2-16boot.rom": [ "disk2-16boot.rom": [
"d4181c9f046aafc3fb326b381baac809d9e38d16" "d4181c9f046aafc3fb326b381baac809d9e38d16"
], ],
@@ -93636,8 +93636,7 @@
"2b8cb4f87580683eb4d760e4ed210813d667f0a2" "2b8cb4f87580683eb4d760e4ed210813d667f0a2"
], ],
"saturn_bios.bin": [ "saturn_bios.bin": [
"2b8cb4f87580683eb4d760e4ed210813d667f0a2", "2b8cb4f87580683eb4d760e4ed210813d667f0a2"
"df94c5b4d47eb3cc404d88b33a8fda237eaf4720"
], ],
"sega-saturn:85ec9ca47d8f6807718151cbcca8b964": [ "sega-saturn:85ec9ca47d8f6807718151cbcca8b964": [
"df94c5b4d47eb3cc404d88b33a8fda237eaf4720" "df94c5b4d47eb3cc404d88b33a8fda237eaf4720"
@@ -95474,6 +95473,7 @@
"ad37f2de": "eb2a867578a05bbf8741e9fe7204301062df0cb8", "ad37f2de": "eb2a867578a05bbf8741e9fe7204301062df0cb8",
"b0e03aa6": "0b6519209766ed883e3fca4c61bf866804c89004", "b0e03aa6": "0b6519209766ed883e3fca4c61bf866804c89004",
"b28f7112": "de463b0577dfd1027bf7de523ff67a0fff861cdb", "b28f7112": "de463b0577dfd1027bf7de523ff67a0fff861cdb",
"77228c84": "ac4b78d53c7a97da2451ca35498395d8dd1e3024",
"9c9601ca": "5426d52e17e0ff9195fabbb42f704342e556d08e", "9c9601ca": "5426d52e17e0ff9195fabbb42f704342e556d08e",
"2c87c283": "e18c5e9ca21654dfd724aa54e625b386e6ffb2c5", "2c87c283": "e18c5e9ca21654dfd724aa54e625b386e6ffb2c5",
"da9beacc": "beaf97c4a0e0792b8db65648f9dabb6a54ae0549", "da9beacc": "beaf97c4a0e0792b8db65648f9dabb6a54ae0549",
@@ -95541,6 +95541,7 @@
"ce2a2c77": "8cf0aa7f9dca4d77485e605fb0e2173a734633bf", "ce2a2c77": "8cf0aa7f9dca4d77485e605fb0e2173a734633bf",
"7325a518": "78c8e1c3c033b65758b7e53a9346b44d037fea7f", "7325a518": "78c8e1c3c033b65758b7e53a9346b44d037fea7f",
"065d69d0": "65a2f2cee74c316d5f40b68deda66787609df353", "065d69d0": "65a2f2cee74c316d5f40b68deda66787609df353",
"81f21918": "add40c002084e8e25768671877b2aa603aaf5cb1",
"946c6bb8": "4e0202f8430cb4842184df7b5418e32620156c7b", "946c6bb8": "4e0202f8430cb4842184df7b5418e32620156c7b",
"bfce92a3": "697551fcf9557ae33e31096b118a0c6769700a2e", "bfce92a3": "697551fcf9557ae33e31096b118a0c6769700a2e",
"7c57bff1": "c9ee16e26e03496195a7bff151efbdd89da01204", "7c57bff1": "c9ee16e26e03496195a7bff151efbdd89da01204",
@@ -98681,6 +98682,7 @@
"7389b815": "f1ad917e0affaeb8d2114c7ecd02b9f938c3cbd9", "7389b815": "f1ad917e0affaeb8d2114c7ecd02b9f938c3cbd9",
"62efc03d": "1cf9e67c2c703bb9961bbcdd39cd2c7e319a803b", "62efc03d": "1cf9e67c2c703bb9961bbcdd39cd2c7e319a803b",
"df558b58": "d2a5af338f09c5cbdd5d7628db5b9c075c69b616", "df558b58": "d2a5af338f09c5cbdd5d7628db5b9c075c69b616",
"416bf51a": "b48f44194fe918aaaec5298861479512b581d661",
"a738ea1c": "3b71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3", "a738ea1c": "3b71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3",
"6f6d289b": "3773f52559d5ac4fc6d8aefe35bce58730ae8181", "6f6d289b": "3773f52559d5ac4fc6d8aefe35bce58730ae8181",
"945f9dc9": "cfe072921ee3fb93f688743f8beef89043c3e9ad", "945f9dc9": "cfe072921ee3fb93f688743f8beef89043c3e9ad",
@@ -101902,6 +101904,7 @@
"0b805686": "6eddec30056cde7c664a0cf508dcad29353a12bb", "0b805686": "6eddec30056cde7c664a0cf508dcad29353a12bb",
"a3e573a0": "40ecf6138c99a0aba775ef93240b295025a45500", "a3e573a0": "40ecf6138c99a0aba775ef93240b295025a45500",
"2c3bcd32": "47d2ec4b342649e4c391043ab915d4435f9d180d", "2c3bcd32": "47d2ec4b342649e4c391043ab915d4435f9d180d",
"24bdb2db": "093f8698b54b78dcb701de2043f82639de51d63b",
"72d2fd97": "6bf1ae9fb01915966b715836253592cbf588b406", "72d2fd97": "6bf1ae9fb01915966b715836253592cbf588b406",
"c48bf84b": "08325554623568bb9babadc10213bfc0b1151766", "c48bf84b": "08325554623568bb9babadc10213bfc0b1151766",
"2b629346": "9d6c9874c1d6a0c57a1345f211154fe1e494b55a", "2b629346": "9d6c9874c1d6a0c57a1345f211154fe1e494b55a",
@@ -102001,6 +102004,8 @@
"616f5e40": "78632d0fe9dd77bf9a2264f192fae6f0af03a71c", "616f5e40": "78632d0fe9dd77bf9a2264f192fae6f0af03a71c",
"92ddefae": "18985a2079c7570c13cf39e0d001eef87538cd15", "92ddefae": "18985a2079c7570c13cf39e0d001eef87538cd15",
"c0c3a1fe": "3ae832c9800fcaa007eccfc48f24242967c111f8", "c0c3a1fe": "3ae832c9800fcaa007eccfc48f24242967c111f8",
"082ecf86": "ed3a4cb264fff283209f10ae58c96c6090fed187",
"39075d41": "cc72dfcc964577cc29112ef368c28f55277c237c",
"44295096": "b184f1c1febf66c8168fcae0b8aa37a5754f79db", "44295096": "b184f1c1febf66c8168fcae0b8aa37a5754f79db",
"31c53421": "567c5b5054552a2771eafa7966844a146f0dde96", "31c53421": "567c5b5054552a2771eafa7966844a146f0dde96",
"d13aefe2": "f2fa8d8e940f1d91a1b1624013df5dca0bb1ee44", "d13aefe2": "f2fa8d8e940f1d91a1b1624013df5dca0bb1ee44",
@@ -102084,13 +102089,7 @@
"8419990c": "cee76080884af97c20059da0eb1ca956a835f3d0", "8419990c": "cee76080884af97c20059da0eb1ca956a835f3d0",
"3cacb086": "c7cc306fb921754ba00794153292d533cf0765ef", "3cacb086": "c7cc306fb921754ba00794153292d533cf0765ef",
"0a4e2e07": "22bcfeb5b6c6481569b90db96aa3f4b5f06c8848", "0a4e2e07": "22bcfeb5b6c6481569b90db96aa3f4b5f06c8848",
"74b76447": "ecfc092fe6371dbf38e238a8ba5f90785b5db52d", "74b76447": "ecfc092fe6371dbf38e238a8ba5f90785b5db52d"
"77228c84": "ac4b78d53c7a97da2451ca35498395d8dd1e3024",
"81f21918": "add40c002084e8e25768671877b2aa603aaf5cb1",
"416bf51a": "b48f44194fe918aaaec5298861479512b581d661",
"24bdb2db": "093f8698b54b78dcb701de2043f82639de51d63b",
"082ecf86": "ed3a4cb264fff283209f10ae58c96c6090fed187",
"39075d41": "cc72dfcc964577cc29112ef368c28f55277c237c"
}, },
"by_path_suffix": { "by_path_suffix": {
".variants/aa310.zip": [ ".variants/aa310.zip": [
+70 -139
View File
@@ -1,10 +1,9 @@
emulator: Amiberry emulator: Amiberry
type: standalone + libretro type: standalone + libretro
core_classification: official_port
source: "https://github.com/BlitterStudio/amiberry" source: "https://github.com/BlitterStudio/amiberry"
upstream: "https://github.com/tonioni/WinUAE" upstream: "https://github.com/tonioni/WinUAE"
profiled_date: "2026-03-25" profiled_date: "2026-03-18"
core_version: "v8.1.1" core_version: "v6.3.4"
display_name: "Commodore - Amiga (Amiberry)" display_name: "Commodore - Amiga (Amiberry)"
cores: [amiberry] cores: [amiberry]
systems: systems:
@@ -13,179 +12,111 @@ systems:
- commodore-cdtv - commodore-cdtv
notes: | notes: |
Amiberry is an Amiga emulator based on WinUAE, available as both standalone Amiberry is an Amiga emulator based on WinUAE, available as both
and libretro core. No built-in kickstart — requires a real Kickstart ROM or standalone and libretro core. No built-in kickstart fallback — a real
external AROS replacement files (aros-ext.bin + aros-rom.bin). Kickstart ROM is required.
Core option "amiberry_kickstart" overrides ROM selection: auto, kick.rom, Core option "amiberry_kickstart" selects the ROM file:
kick13.rom, kick20.rom, kick31.rom, kick205.rom, kick40068.A1200, auto, kick.rom, kick13.rom, kick20.rom, kick31.rom, kick205.rom,
kick40068.A4000, cd32.rom, cdtv.rom. "auto" selects per model. kick40068.A1200, kick40068.A4000, cd32.rom, cdtv.rom.
ref: libretro/libretro.cpp:558,621-640 "auto" selects based on the model option.
ref: BlitterStudio/amiberry/libretro/libretro.cpp:558,621-634
Default model is A500 (KS 1.3). ROM search directories: Standalone mode ships with data/ directory (UI icons, virtual keyboards,
save_dir/Kickstarts, system_dir/Kickstarts, system_dir/save-data/Kickstarts, floppy sounds, AmigaTopaz.ttf font, gamecontrollerdb.txt). These are
then system_dir as fallback. compiled into the standalone binary but the libretro core may look for
ref: libretro/libretro.cpp:2740-2756 them in the system directory.
ROM identification uses SHA1 against WinUAE database (340+ entries) but does
not reject unknown ROMs. Cloanto encrypted ROMs supported with rom.key.
Munt MT-32/CM-32L emulation compiled in (WITH_MIDIEMU). ROMs loaded from
mt32-roms/ subdirectory of the ROM path.
ref: src/midiemu.cpp:120-157
WHDLoad autoboot requires whdboot/ directory in system_dir with boot-data.zip,
WHDLoad, AmiQuit, JST, whdload_db.xml. These ship with the standalone build
but must be obtained separately for the libretro core.
ref: libretro/libretro.cpp:1151-1184
files: files:
# --- Kickstart ROMs (searched by find_kickstart_in_system_dir) --- # --- Required Kickstart ROMs (from .info) ---
# ref: libretro/libretro.cpp:1502-1565 # ref: BlitterStudio/amiberry/libretro/libretro.cpp:558
# ref: WinUAE rommgr.cpp for ROM identification
- name: kick13.rom - name: kick34005.A500
system: commodore-amiga system: commodore-amiga
required: true required: true
size: 262144 size: 262144
note: "A500 Kickstart v1.3 rev 34.005, default for A500 model" crc32: c4f0f55f
source_ref: "libretro/libretro.cpp:1516 candidates_a500" note: "A500 Kickstart v1.3 rev 34.5"
source_ref: "libretro-super/dist/info/amiberry_libretro.info firmware0"
- name: kick12.rom - name: kick37350.A600
system: commodore-amiga system: commodore-amiga
required: false required: true
size: 262144
note: "A500 Kickstart v1.2 rev 33.180, for A500OG model"
source_ref: "libretro/libretro.cpp:1515 candidates_a500og"
- name: kick20.rom
system: commodore-amiga
required: false
size: 524288 size: 524288
aliases: [kick204.rom] crc32: 43b0df7b
note: "A500+ Kickstart v2.04 rev 37.175" note: "A600 Kickstart v2.05 rev 37.350"
source_ref: "libretro/libretro.cpp:1517 candidates_a500p" source_ref: "amiberry_libretro.info firmware1"
- name: kick205.rom
system: commodore-amiga
required: false
size: 524288
note: "A600 Kickstart v2.05 rev 37.350, also used for WHDLoad"
source_ref: "libretro/libretro.cpp:1518 candidates_a600, 1479 pick_whdload_kickstart"
- name: kick31.rom
system: commodore-amiga
required: false
size: 524288
note: "Kickstart v3.1 (generic), first candidate for A1200 and A4000"
source_ref: "libretro/libretro.cpp:1519-1520 candidates_a1200/a4000"
- name: kick40068.A1200 - name: kick40068.A1200
system: commodore-amiga system: commodore-amiga
required: false required: true
size: 524288 size: 524288
note: "A1200 Kickstart v3.1 rev 40.68, fallback after kick31.rom" crc32: 1483a091
source_ref: "libretro/libretro.cpp:1519 candidates_a1200" note: "A1200 Kickstart v3.1 rev 40.68"
source_ref: "amiberry_libretro.info firmware2"
# --- Optional Kickstart ROMs ---
- name: kick33180.A500
system: commodore-amiga
required: false
size: 262144
crc32: a6ce1636
note: "A500 Kickstart v1.2 rev 33.180"
source_ref: "amiberry_libretro.info firmware3"
- name: kick40068.A4000 - name: kick40068.A4000
system: commodore-amiga system: commodore-amiga
required: false required: false
size: 524288 size: 524288
note: "A4000 Kickstart v3.1 rev 40.68, fallback after kick31.rom" crc32: d6bae334
source_ref: "libretro/libretro.cpp:1520 candidates_a4000" note: "A4000 Kickstart v3.1 rev 40.68"
source_ref: "amiberry_libretro.info firmware4"
- name: kick.rom - name: kick40060.CD32
system: commodore-amiga
required: false
note: "Generic name, any Kickstart ROM. Last resort fallback for all models."
source_ref: "libretro/libretro.cpp:1510-1521 last in all candidate lists"
# --- CD32 ROMs ---
- name: cd32.rom
system: commodore-cd32 system: commodore-cd32
required: false required: false
size: 524288 size: 524288
aliases: [amiga-os-310-cd32.rom, kick40060.CD32] crc32: 1e62d4a5
note: "CD32 Kickstart v3.1 rev 40.60" note: "CD32 Kickstart v3.1 rev 40.60"
source_ref: "libretro/libretro.cpp:1521 candidates_cd32" source_ref: "amiberry_libretro.info firmware5"
- name: cd32ext.rom - name: kick40060.CD32.ext
system: commodore-cd32 system: commodore-cd32
required: false required: false
size: 524288 size: 524288
aliases: [amiga-ext-310-cd32.rom, "CD32 Extended.ROM"] crc32: 87746be2
note: "CD32 extended ROM rev 40.60. Not needed if using a combined 1MB ROM." note: "CD32 Extended ROM rev 40.60"
source_ref: "libretro/libretro.cpp:1579 candidates_cd32 (find_ext_rom_in_system_dir)" source_ref: "amiberry_libretro.info firmware6"
# --- CDTV ROMs --- # --- Alternative names accepted by core option ---
# these are common user-facing names, same ROMs as above
- name: cdtv.rom - name: kick13.rom
system: commodore-amiga
required: false
note: "alias for kick34005.A500 (v1.3)"
source_ref: "libretro.cpp:630"
- name: kick34005.CDTV
system: commodore-cdtv system: commodore-cdtv
required: false required: false
aliases: [kick34005.CDTV] note: "CDTV extended ROM"
note: "CDTV extended ROM v1.00, used as kickstart candidate" source_ref: "libretro.cpp:558 cdtv.rom option"
source_ref: "libretro/libretro.cpp:1522 candidates_cdtv"
- name: cdtvext.rom # --- Standalone data files ---
system: commodore-cdtv
required: false
aliases: ["CDTV Extended.ROM"]
note: "CDTV extended ROM file"
source_ref: "libretro/libretro.cpp:1581 candidates_cdtv (find_ext_rom_in_system_dir)"
# --- AROS replacement ROMs --- - name: AmigaTopaz.ttf
# ref: src/memory.cpp:1871-1930 load_kickstart_replacement
- name: aros-ext.bin
system: commodore-amiga system: commodore-amiga
required: false required: false
hle_fallback: true mode: standalone
note: "AROS extended ROM replacement. Used when no Kickstart ROM is found." note: "Amiga Topaz font for UI rendering"
source_ref: "src/memory.cpp:1877 load_kickstart_replacement" source_ref: "BlitterStudio/amiberry/data/AmigaTopaz.ttf"
- name: aros-rom.bin - name: gamecontrollerdb.txt
system: commodore-amiga system: commodore-amiga
required: false required: false
hle_fallback: true mode: standalone
note: "AROS main ROM replacement. Used with aros-ext.bin as Kickstart fallback." note: "SDL gamepad mapping database"
source_ref: "src/memory.cpp:1910 load_kickstart_replacement" source_ref: "BlitterStudio/amiberry/controllers/gamecontrollerdb.txt"
# --- Cloanto key ---
- name: rom.key
system: commodore-amiga
required: false
note: "Decryption key for Cloanto Amiga Forever encrypted ROMs"
source_ref: "src/rommgr.cpp:1738 AMIROMTYPE1 decryption"
# --- Munt MT-32/CM-32L MIDI ROMs ---
# Located in mt32-roms/ subdirectory of the ROM path
# ref: src/midiemu.cpp:120-157 midi_emu_add_roms
- name: mt32-roms/mt32_control.rom
system: commodore-amiga
required: false
aliases: [mt32-roms/ctrl_mt32.rom, mt32-roms/MT32_CONTROL.rom]
note: "Roland MT-32 control ROM for Munt MIDI emulation"
source_ref: "src/midiemu.cpp:38-61 mt32ctl candidates, 151-156 load loop"
- name: mt32-roms/pcm_mt32.rom
system: commodore-amiga
required: false
aliases: [mt32-roms/mt32_pcm.rom, mt32-roms/MT32_PCM.rom, mt32-roms/PCM_MT32.rom]
note: "Roland MT-32 PCM ROM for Munt MIDI emulation"
source_ref: "src/midiemu.cpp:133-140 MT-32 PCM loading"
- name: mt32-roms/cm32l_control.rom
system: commodore-amiga
required: false
aliases: [mt32-roms/ctrl_cm32l.rom, mt32-roms/CM32L_CONTROL.rom]
note: "Roland CM-32L control ROM for Munt MIDI emulation"
source_ref: "src/midiemu.cpp:25-37 cm32lctl candidates, 151-156 load loop"
- name: mt32-roms/pcm_cm32l.rom
system: commodore-amiga
required: false
aliases: [mt32-roms/cm32l_pcm.rom, mt32-roms/PCM_CM32L.rom, mt32-roms/CM32L_PCM.rom]
note: "Roland CM-32L PCM ROM for Munt MIDI emulation"
source_ref: "src/midiemu.cpp:142-149 CM-32L PCM loading"
+17 -10
View File
@@ -3,7 +3,7 @@ type: libretro
core_classification: frozen_snapshot core_classification: frozen_snapshot
source: "https://github.com/libretro/bsnes2014" source: "https://github.com/libretro/bsnes2014"
upstream: "https://github.com/bsnes-emu/bsnes" upstream: "https://github.com/bsnes-emu/bsnes"
profiled_date: "2026-03-25" profiled_date: "2026-03-23"
core_version: "v094" core_version: "v094"
display_name: "Nintendo - SNES / SFC (bsnes 2014)" display_name: "Nintendo - SNES / SFC (bsnes 2014)"
cores: [bsnes2014_accuracy, bsnes2014_balanced, bsnes2014_performance] cores: [bsnes2014_accuracy, bsnes2014_balanced, bsnes2014_performance]
@@ -15,23 +15,30 @@ systems:
notes: | notes: |
Frozen at bsnes v094. Three build profiles: accuracy (dot-based PPU), Frozen at bsnes v094. Three build profiles: accuracy (dot-based PPU),
balanced, performance (scanline PPU). All 3 share the same 16 firmware balanced, performance (scanline PPU). All 3 share the same 18 firmware
files. Profiles only differ in PPU (sfc/profile-*.hpp), not coprocessors. files. Profiles only differ in PPU (sfc/profile-*.hpp), not coprocessors.
Performance .info is wrong (firmware_count=17, missing cx4.data.rom).
SPC700 IPL ROM (64 bytes) embedded in target-libretro/libretro.cpp:31. SPC700 IPL ROM (64 bytes) embedded in target-libretro/libretro.cpp:31.
No HLE fallback for any coprocessor in v094. No HLE fallback for any coprocessor in v094.
Firmware loaded from system_dir via file::exists() + mmapstream. Firmware loaded from system_dir via file::exists() + mmapstream.
No hash or size validation on any firmware file. DSP1 (non-b) names used via embedded database for specific SHA256-matched
Libretro build uses heuristics only (ananke/heuristics/), not the SHA256 games; DSP1B names used via heuristic fallback for all DSP1/DSP1B games.
database (ananke/database/). All DSP1 games use DSP1B filenames via
heuristic fallback. The database dsp1.program.rom / dsp1.data.rom names
are only in the standalone build (target-ethos via ananke).
.info accuracy/balanced: firmware_count=18 (overcounts by 2, includes
phantom dsp1.* from unused database). Performance .info: firmware_count=17
(also missing cx4.data.rom).
Upstream v094 source is contained within the libretro repo (sfc/, ananke/). Upstream v094 source is contained within the libretro repo (sfc/, ananke/).
bsnes-emu/bsnes is the modern rewrite (v115+). bsnes-emu/bsnes is the modern rewrite (v115+).
files: files:
- name: dsp1.program.rom
system: nintendo-snes
required: false
size: 6144
source_ref: "ananke/database/super-famicom.hpp:5658"
- name: dsp1.data.rom
system: nintendo-snes
required: false
size: 2048
source_ref: "ananke/database/super-famicom.hpp:5659"
- name: dsp1b.program.rom - name: dsp1b.program.rom
system: nintendo-snes system: nintendo-snes
required: false required: false
+2 -2
View File
@@ -3,7 +3,7 @@ type: libretro
core_classification: enhanced_fork core_classification: enhanced_fork
source: "https://github.com/libretro/bsnes-mercury" source: "https://github.com/libretro/bsnes-mercury"
upstream: "https://byuu.org/higan" upstream: "https://byuu.org/higan"
profiled_date: "2026-03-25" profiled_date: "2026-03-23"
core_version: "v094 (Mercury)" core_version: "v094 (Mercury)"
display_name: "Nintendo - SNES / SFC (bsnes-mercury)" display_name: "Nintendo - SNES / SFC (bsnes-mercury)"
cores: [bsnes_mercury_accuracy, bsnes_mercury_balanced, bsnes_mercury_performance] cores: [bsnes_mercury_accuracy, bsnes_mercury_balanced, bsnes_mercury_performance]
@@ -22,7 +22,7 @@ notes: |
Firmware loaded from system_dir via file::exists + mmapstream. Firmware loaded from system_dir via file::exists + mmapstream.
No hash or size validation on any firmware file. No hash or size validation on any firmware file.
ref: target-libretro/libretro.cpp:242-264 ref: target-libretro/libretro.cpp:241-263
firmware_appended: firmware can be appended to end of ROM file. firmware_appended: firmware can be appended to end of ROM file.
ref: ananke/heuristics/super-famicom.hpp:83 ref: ananke/heuristics/super-famicom.hpp:83
+1 -2
View File
@@ -2,8 +2,7 @@ emulator: "Game & Watch"
type: libretro type: libretro
core_classification: pure_libretro core_classification: pure_libretro
source: "https://github.com/libretro/gw-libretro" source: "https://github.com/libretro/gw-libretro"
upstream: "http://www.madrigaldesign.it/sim/" profiled_date: "2026-03-21"
profiled_date: "2026-03-25"
core_version: "Git" core_version: "Git"
display_name: "Handheld Electronic (GW)" display_name: "Handheld Electronic (GW)"
cores: cores:
+4 -5
View File
@@ -3,7 +3,7 @@ type: libretro
core_classification: official_port core_classification: official_port
source: "https://github.com/timoinutilis/lowres-nx" source: "https://github.com/timoinutilis/lowres-nx"
upstream: "https://github.com/timoinutilis/lowres-nx" upstream: "https://github.com/timoinutilis/lowres-nx"
profiled_date: "2026-03-25" profiled_date: "2026-03-22"
core_version: "v1.2" core_version: "v1.2"
display_name: "LowRes NX" display_name: "LowRes NX"
cores: cores:
@@ -18,10 +18,9 @@ notes: |
the same repository. the same repository.
retro_load_game() copies the .nx source code into memory retro_load_game() copies the .nx source code into memory
(libretro_main.c:490-493) and compiles it with the built-in interpreter. (libretro_main.c:490) and compiles it with the built-in interpreter.
The boot intro is a string constant embedded in boot_intro.c:26. Default The boot intro is a string constant embedded in boot_intro.c. The core
characters and charsets are compiled-in C arrays. The core never calls never accesses the system directory. No BIOS, firmware, or external
RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY. No BIOS, firmware, or external
files required. files required.
files: [] files: []
+11 -13
View File
@@ -7,7 +7,7 @@ type: libretro
core_classification: community_fork core_classification: community_fork
source: "https://github.com/libretro/ps2" source: "https://github.com/libretro/ps2"
upstream: "https://github.com/PCSX2/pcsx2" upstream: "https://github.com/PCSX2/pcsx2"
profiled_date: "2026-03-25" profiled_date: "2026-03-24"
core_version: "Git" core_version: "Git"
display_name: "Sony - PlayStation 2 (LRPS2)" display_name: "Sony - PlayStation 2 (LRPS2)"
cores: [lrps2] cores: [lrps2]
@@ -17,14 +17,12 @@ bios_directory: "pcsx2/bios/"
resources_directory: "pcsx2/resources/" resources_directory: "pcsx2/resources/"
notes: | notes: |
Hard fork of PCSX2 (pre-Qt, 1.7-dev era) ported to libretro. x86_64 only. Hard fork of PCSX2 ported to libretro. BIOS detection is filename-agnostic: the core
BIOS detection is filename-agnostic: scans pcsx2/bios/ for any file between 4-8 MB scans pcsx2/bios/ for any file between 4-8 MB with a valid romdir structure containing
with a valid romdir structure (RESET + ROMVER entries). No hash validation. RESET and ROMVER entries. The ROMVER entry determines region and version.
Companion files (.rom1, .rom2, .nvm, .mec) derive paths from the selected BIOS. Companion files (.rom1, .rom2, .nvm, .mec) derive their paths from the selected BIOS.
DEV9 (network/HDD) and USB are stubbed in the libretro port. DEV9 (network adapter) and USB are stubbed in the libretro port.
Widescreen patches are largely compiled into the core (libretro/patches.cpp). GameIndex.yaml in pcsx2/resources/ provides per-game patches for compatibility.
.info firmware_count=2 counts the bios folder and GameIndex.yaml.
.info description mentions EROM.BIN but no EROM loading path exists in the code.
files: files:
- name: "<bios>.bin" - name: "<bios>.bin"
@@ -34,7 +32,7 @@ files:
min_size: 4194304 min_size: 4194304
max_size: 8388608 max_size: 8388608
validation: [size] validation: [size]
source_ref: "pcsx2/ps2/BiosTools.cpp:231-254,267-322" source_ref: "pcsx2/ps2/BiosTools.cpp:230-254,266-322"
note: > note: >
Scans pcsx2/bios/ for any file between 4 MB and 8 MB. Validates via romdir Scans pcsx2/bios/ for any file between 4 MB and 8 MB. Validates via romdir
structure parsing (RESET + ROMVER entries). User selects BIOS via core option structure parsing (RESET + ROMVER entries). User selects BIOS via core option
@@ -45,7 +43,7 @@ files:
required: false required: false
max_size: 4194304 max_size: 4194304
description: "DVD player ROM" description: "DVD player ROM"
source_ref: "pcsx2/ps2/BiosTools.cpp:190-211,314" source_ref: "pcsx2/ps2/BiosTools.cpp:189-210,313"
note: > note: >
DVD player ROM. Tries <biospath>.rom1 (appended) then <biosbase>.rom1 DVD player ROM. Tries <biospath>.rom1 (appended) then <biosbase>.rom1
(extension replaced). Silently skipped if not found. (extension replaced). Silently skipped if not found.
@@ -53,9 +51,9 @@ files:
- name: "<bios>.rom2" - name: "<bios>.rom2"
path: "pcsx2/bios/" path: "pcsx2/bios/"
required: false required: false
max_size: 524288 max_size: 4194304
description: "Chinese ROM extension" description: "Chinese ROM extension"
source_ref: "pcsx2/ps2/BiosTools.cpp:190-211,315" source_ref: "pcsx2/ps2/BiosTools.cpp:189-210,314"
note: > note: >
Chinese region ROM extension. Same naming convention as rom1. Chinese region ROM extension. Same naming convention as rom1.
Only present on Chinese region consoles. Only present on Chinese region consoles.
+1 -1
View File
@@ -3,7 +3,7 @@ type: libretro
core_classification: embedded_hle core_classification: embedded_hle
source: "https://github.com/libretro/pcsx_rearmed" source: "https://github.com/libretro/pcsx_rearmed"
upstream: "https://github.com/notaz/pcsx_rearmed" upstream: "https://github.com/notaz/pcsx_rearmed"
profiled_date: "2026-03-25" profiled_date: "2026-03-24"
core_version: "r25" core_version: "r25"
display_name: "Sony - PlayStation (PCSX ReARMed)" display_name: "Sony - PlayStation (PCSX ReARMed)"
cores: [pcsx_rearmed, pcsx_rearmed_neon, pcsx_rearmed_interpreter] cores: [pcsx_rearmed, pcsx_rearmed_neon, pcsx_rearmed_interpreter]
-39
View File
@@ -1,39 +0,0 @@
emulator: trident
display_name: "Nintendo - 3DS (Trident)"
type: libretro
core_classification: community_fork
source: https://github.com/DanAlexMorton/3dsTrident
upstream: https://github.com/wheremyfoodat/Panda3DS
profiled_date: 2026-03-25
core_version: git
cores:
- trident
systems:
- 3ds
notes: >-
Libretro core wrapping Panda3DS, an HLE Nintendo 3DS emulator.
Shared font, Mii data, country list and bad word list are embedded in
the binary via CMRC and compiled-in headers. DSP firmware is loaded from
the game ROM at runtime, not from an external file.
DSP modes: HLE (default), LLE (Teakra), Null.
Files are resolved from the RetroArch save directory
(<save_dir>/Emulator Files/sysdata/), not the system directory.
files:
- name: aes_keys.txt
description: AES encryption keys for decrypting encrypted 3DS ROMs
required: false
source_ref: >-
src/emulator.cpp:234,242-244 (path construction and existence check);
src/core/crypto/aes_engine.cpp:13-92 (loadKeys, parses key=value text);
src/core/loader/ncch.cpp:151-164 (panic if encrypted ROM loaded without keys)
- name: seeddb.bin
description: seed database for seed-encrypted 3DS games
required: false
source_ref: >-
src/emulator.cpp:235,246-248 (path construction and existence check);
src/core/crypto/aes_engine.cpp:94-153 (setSeedPath, loadSeeds, getSeedFromDB)
+17 -15
View File
@@ -1,25 +1,27 @@
emulator: TyrQuake emulator: TyrQuake
type: libretro type: libretro
core_classification: game_engine
source: "https://github.com/libretro/tyrquake" source: "https://github.com/libretro/tyrquake"
upstream: "http://disenchant.net/tyrquake/" profiled_date: "2026-03-18"
profiled_date: "2026-03-25"
core_version: "v0.62" core_version: "v0.62"
display_name: "Quake (TyrQuake)" display_name: "Quake (TyrQuake)"
cores: [tyrquake] cores: [tyrquake]
systems: [quake] systems: [quake]
verification: existence
notes: > notes: >
Quake engine source port by Kevin Shanahan (Tyrann). Plays Quake (id1), mission Quake engine source port. Plays Quake (id1), mission packs Scourge of Armagon
packs Scourge of Armagon (hipnotic) and Dissolution of Eternity (rogue), Quoth (hipnotic) and Dissolution of Eternity (rogue), Quoth mod, and custom mods via
mod, and custom mods via -game parameter. Content is loaded directly from the -game parameter. The core accepts .pak extensions (retro_get_system_info sets
PAK file path — the directory containing the PAK becomes basedir valid_extensions = "pak"). Content is loaded directly from the PAK file path -
(libretro.c:988,1050). The engine auto-detects game variant by checking the the directory containing the PAK becomes basedir (libretro.c:988,1050).
content path for id1, hipnotic, rogue, or quoth substrings The engine auto-detects game variant by checking the content path for id1,
(libretro.c:1030-1070). All engine assets (gfx/palette.lmp, gfx/colormap.lmp, hipnotic, rogue, or quoth substrings (libretro.c:1030-1070) and passes the
gfx.wad, textures, models, sounds) are loaded from within PAK files via corresponding command-line flag. For non-standard paths it uses -game with the
COM_AddGameDirectory (common.c:1709), which tries pak0.pak through pak9.pak in directory basename. PAK files are game data (maps, textures, models, sounds)
both lowercase and uppercase. The core never calls shipped with the original retail game, not engine firmware. The engine checks
RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY. BGM as OGG tracks in music/ subfolder for gfx/pop.lmp inside pak0.pak to distinguish registered vs shareware
of each game directory. (common.c:974-991). COM_AddGameDirectory (common.c:1709) loads pak0.pak through
pak9.pak sequentially from the game directory, trying both lowercase and
uppercase filenames. No engine data files are required in the RetroArch system
directory. The core needs no BIOS or firmware.
files: [] files: []
+6 -62
View File
@@ -1,64 +1,8 @@
emulator: uae4arm emulator: "uae4arm"
type: libretro type: alias
core_classification: community_fork alias_of: "puae"
cores: [uae4arm] profiled_date: "2026-03-18"
source: "https://github.com/libretro/uae4arm-libretro"
upstream: "https://github.com/PandTomB/uae4arm"
profiled_date: "2026-03-25"
core_version: "v0.5" core_version: "v0.5"
display_name: "Commodore - Amiga (UAE4ARM)" display_name: "Commodore - Amiga (UAE4ARM)"
systems: note: "This core uses the same BIOS/firmware as puae. See emulators/puae.yml for details."
- commodore-amiga files: []
notes: |
ARM-optimized Amiga emulator by TomB, ported to libretro by Chips-fr.
Based on an older uae4arm version, intended for low-powered ARM hardware
where PUAE cannot maintain full speed.
Core options expose three models: A500, A600, A1200. Each selects its
Kickstart ROM automatically. Extended ROMs (CDTV/CD32) can be set via
.uae config files but CD32/CDTV hardware emulation is absent from
this port (no akiko chip, CD support listed as missing).
Built-in AROS Kickstart replacement used as fallback when no ROM is found.
Cloanto-encrypted ROMs require rom.key in the system directory.
files:
- name: "kick34005.A500"
description: "Amiga 500 Kickstart v1.3 rev 34.005"
required: false
hle_fallback: true
source_ref: "libretro/core/libretro-core.cpp:73,420 src/memory.cpp:2080-2180"
- name: "kick40063.A600"
description: "Amiga 600 Kickstart v3.1 rev 40.063"
required: false
hle_fallback: true
source_ref: "libretro/core/libretro-core.cpp:74,391 src/memory.cpp:2080-2180"
- name: "kick40068.A1200"
description: "Amiga 1200 Kickstart v3.1 rev 40.068"
required: false
hle_fallback: true
source_ref: "libretro/core/libretro-core.cpp:75,405 src/memory.cpp:2080-2180"
- name: "kick34005.CDTV"
description: "CDTV extended ROM v1.00 rev 34.005"
required: false
source_ref: "src/memory.cpp:1931-1971 (EXTENDED_ROM_CDTV via romextfile)"
- name: "kick40060.CD32"
description: "CD32 Kickstart v3.1 rev 40.060"
required: false
source_ref: "src/memory.cpp:2080-2180 (loaded via romfile from .uae config)"
- name: "kick40060.CD32.ext"
description: "CD32 extended ROM rev 40.060"
required: false
source_ref: "src/memory.cpp:1931-1971 (EXTENDED_ROM_CD32 via romextfile)"
- name: "rom.key"
description: "Cloanto Amiga Forever decryption key"
required: false
source_ref: "src/memory.cpp:598-613,625-700 (addkeydir, load_keyring)"
+7 -476
View File
@@ -1,477 +1,8 @@
emulator: UME 2015 emulator: "ume2015"
type: libretro type: alias
core_classification: frozen_snapshot alias_of: "mame2016"
source: "https://github.com/libretro/mame2015-libretro" profiled_date: "2026-03-18"
upstream: "https://github.com/mamedev/mame/tree/mame0159" core_version: "0.160"
logo: "https://raw.githubusercontent.com/mamedev/mame/master/docs/source/images/MAMElogo.svg"
profiled_date: "2026-03-25"
core_version: "0.159"
display_name: "Multi (UME 2015)" display_name: "Multi (UME 2015)"
mame_version: "0.159" note: "This core uses the same BIOS/firmware as mame2016. See emulators/mame2016.yml for details."
files: []
cores:
- ume2015
systems:
- snk-neogeo-mvs
- snk-neogeo-aes
- igs-pgm
- sega-naomi
- sega-naomi2
- sega-naomigd
- sammy-atomiswave
- sega-stv
- sega-lindbergh
- sega-hikaru
- sega-chihiro
- sega-triforce
- deco-cassette
- nintendo-playch10
- sega-megaplay
- sega-megatech
- nintendo-sfcbox
- nintendo-nss
- philips-cdi
- commodore-cubo
- namco-system246
- namco-system256
- namco-system573
- konami-viper
- taito-gnet
- super-kaneko-nova
- capcom-zn1
- capcom-zn2
- konami-gv
- panasonic-3do
- hyper-neogeo64
- konami-twinkle
notes: |
Universal Machine Emulator — combined MAME + MESS before the official
merge at MAME 0.162. Same repo as mame2015 (mame2015-libretro), built
with -DWANT_UME including both mame.mak and mess.mak. 69 arcade BIOS
root sets (identical to mame2015), plus 619 MESS computer/console
drivers. Source version.c says 0.159, .info claims 0.160.
Paths under system_dir/ume2015/ (samples, artwork, cheat, hash, ini).
Software list hash XMLs in system_dir/ume2015/hash/ (375 files from
repo hash/ directory, required for MESS software list support).
Per-game XML cheats in system_dir/ume2015/cheat/.
hiscore.dat loaded via f.open("hiscore", ".dat") without explicit
search path (libretro-specific path code disabled via #if 0).
ROM naming follows MAME 0.159 conventions.
files:
# Data files (system_dir/ume2015/)
- name: hiscore.dat
required: false
category: game_data
source_ref: "src/emu/hiscore.c:335-337"
note: "high score definitions, external file, not embedded"
# SNK Neo Geo MVS/AES
- name: neogeo.zip
required: true
category: bios_zip
system: snk-neogeo-mvs
source_ref: "src/mame/drivers/neogeo.c:1529"
# IGS PGM
- name: pgm.zip
required: true
category: bios_zip
system: igs-pgm
source_ref: "src/mame/drivers/pgm.c:4147"
# Sega Naomi / Naomi 2 / Naomi GD-ROM / Atomiswave
- name: naomi.zip
required: true
category: bios_zip
system: sega-naomi
source_ref: "src/mame/drivers/naomi.c:8960"
- name: naomi2.zip
required: true
category: bios_zip
system: sega-naomi2
source_ref: "src/mame/drivers/naomi.c:8965"
- name: naomigd.zip
required: true
category: bios_zip
system: sega-naomigd
source_ref: "src/mame/drivers/naomi.c:8966"
- name: awbios.zip
required: true
category: bios_zip
system: sammy-atomiswave
source_ref: "src/mame/drivers/naomi.c:9275"
- name: hod2bios.zip
required: false
category: bios_zip
source_ref: "src/mame/drivers/naomi.c:8961"
note: "game-specific BIOS for House of the Dead 2"
- name: f355dlx.zip
required: false
category: bios_zip
source_ref: "src/mame/drivers/naomi.c:8962"
note: "game-specific BIOS for Ferrari F355 Challenge deluxe"
- name: f355bios.zip
required: false
category: bios_zip
source_ref: "src/mame/drivers/naomi.c:8963"
note: "game-specific BIOS for Ferrari F355 Challenge twin"
- name: airlbios.zip
required: false
category: bios_zip
source_ref: "src/mame/drivers/naomi.c:8964"
note: "game-specific BIOS for Airline Pilots deluxe"
# Sega ST-V
- name: stvbios.zip
required: true
category: bios_zip
system: sega-stv
source_ref: "src/mame/drivers/stv.c:3042"
# Sega Hikaru / Chihiro / Triforce / Lindbergh
- name: hikaru.zip
required: true
category: bios_zip
system: sega-hikaru
source_ref: "src/mame/drivers/hikaru.c:744"
- name: chihiro.zip
required: true
category: bios_zip
system: sega-chihiro
source_ref: "src/mame/drivers/chihiro.c:2192"
- name: triforce.zip
required: true
category: bios_zip
system: sega-triforce
source_ref: "src/mame/drivers/triforce.c:1021"
- name: lindbios.zip
required: true
category: bios_zip
system: sega-lindbergh
source_ref: "src/mame/drivers/lindbergh.c:569"
# DECO Cassette
- name: decocass.zip
required: true
category: bios_zip
system: deco-cassette
source_ref: "src/mame/drivers/decocass.c:1647"
# Nintendo arcade
- name: playch10.zip
required: true
category: bios_zip
system: nintendo-playch10
source_ref: "src/mame/drivers/playch10.c:1639"
- name: nss.zip
required: true
category: bios_zip
system: nintendo-nss
source_ref: "src/mame/drivers/nss.c:1058"
- name: sfcbox.zip
required: true
category: bios_zip
system: nintendo-sfcbox
source_ref: "src/mame/drivers/sfcbox.c:572"
# Sega Mega Drive arcade
- name: megaplay.zip
required: true
category: bios_zip
system: sega-megaplay
source_ref: "src/mame/drivers/megaplay.c:942"
- name: megatech.zip
required: true
category: bios_zip
system: sega-megatech
source_ref: "src/mame/drivers/megatech.c:1393"
# Philips CD-i
- name: cdibios.zip
required: true
category: bios_zip
system: philips-cdi
source_ref: "src/mame/drivers/cdi.c:611"
# Commodore Cubo (CD32-based)
- name: cubo.zip
required: true
category: bios_zip
system: commodore-cubo
source_ref: "src/mame/drivers/cubo.c:1362"
# Namco boards
- name: sys246.zip
required: true
category: bios_zip
system: namco-system246
source_ref: "src/mame/drivers/namcops2.c:672"
- name: sys256.zip
required: true
category: bios_zip
system: namco-system256
source_ref: "src/mame/drivers/namcops2.c:705"
- name: sys573.zip
required: true
category: bios_zip
system: namco-system573
source_ref: "src/mame/drivers/ksys573.c:4678"
# Konami
- name: kviper.zip
required: true
category: bios_zip
system: konami-viper
source_ref: "src/mame/drivers/viper.c:2609"
- name: konamigv.zip
required: true
category: bios_zip
system: konami-gv
source_ref: "src/mame/drivers/konamigv.c:822"
- name: konamigx.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/konamigx.c:3775"
- name: gq863.zip
required: true
category: bios_zip
system: konami-twinkle
source_ref: "src/mame/drivers/twinkle.c:1330"
# Taito
- name: taitogn.zip
required: true
category: bios_zip
system: taito-gnet
source_ref: "src/mame/drivers/taitogn.c:1081"
- name: taitotz.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/taitotz.c:2951"
- name: taitofx1.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/zn.c:4906"
# PSX-based arcade boards (ZN)
- name: cpzn1.zip
required: true
category: bios_zip
system: capcom-zn1
source_ref: "src/mame/drivers/zn.c:4800"
- name: cpzn2.zip
required: true
category: bios_zip
system: capcom-zn2
source_ref: "src/mame/drivers/zn.c:4823"
- name: atpsx.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/zn.c:4853"
- name: acpsx.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/zn.c:4862"
- name: tps.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/zn.c:4873"
- name: vspsx.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/zn.c:4896"
- name: psarc95.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/zn.c:4935"
- name: atluspsx.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/zn.c:4961"
# Super Kaneko Nova System
- name: skns.zip
required: true
category: bios_zip
system: super-kaneko-nova
source_ref: "src/mame/drivers/suprnova.c:1734"
- name: mac2bios.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/macs.c:747"
- name: macsbios.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/macs.c:746"
# Panasonic 3DO
- name: 3dobios.zip
required: true
category: bios_zip
system: panasonic-3do
source_ref: "src/mame/drivers/3do.c:253"
# Hyper Neo-Geo 64
- name: hng64.zip
required: true
category: bios_zip
system: hyper-neogeo64
source_ref: "src/mame/drivers/hng64.c:1991"
# Arcadia Systems
- name: ar_bios.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/arcadia.c:963"
# American Laser Games
- name: alg_bios.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/alg.c:772"
# Aleck64 (N64-based)
- name: aleck64.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/aleck64.c:1161"
# Atari System 1
- name: atarisy1.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/atarisy1.c:2368"
# Exidy Max-A-Flex
- name: maxaflex.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/maxaflex.c:536"
# Crystal System
- name: crysbios.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/crystal.c:1134"
# Galaxy Games
- name: galgbios.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/tmaster.c:1850"
# Aristocrat MK5/MK6
- name: aristmk5.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/aristmk5.c:739"
- name: aristmk6.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/aristmk6.c:224"
- name: mk6nsw11.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/aristmk6.c:225"
# Pinball
- name: allied.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/allied.c:711"
- name: gp_110.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/gp_1.c:531"
- name: gts1.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/gts1.c:978"
- name: gts1s.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/gts1.c:981"
# Other BIOS root sets
- name: bubsys.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/nemesis.c:2707"
- name: isgsm.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/segas16b.c:7501"
- name: iteagle.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/iteagle.c:315"
- name: pyson.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/pyson.c:251"
- name: sammymdl.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/sigmab98.c:2277"
- name: shtzone.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/shtzone.c:121"
- name: su2000.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/su2000.c:296"
- name: tourvis.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/tourvis.c:612"
- name: v4bios.zip
required: true
category: bios_zip
source_ref: "src/mame/drivers/mpu4vid.c:3655"
+5 -8
View File
@@ -1,16 +1,13 @@
emulator: MicroW8 emulator: MicroW8
profiled_date: "2026-03-25" profiled_date: "2026-03-18"
core_version: "0.2.2" core_version: "0.2.2"
display_name: "MicroW8" display_name: "MicroW8"
type: game type: game
core_classification: pure_libretro
source: https://github.com/libretro/uw8-libretro
upstream: https://github.com/exoticorn/microw8
cores: [uw8] cores: [uw8]
systems: [] systems: []
files: [] files: []
notes: > notes: >
WebAssembly-based fantasy console. 320x240 screen, 32-color palette, MicroW8 is a WebAssembly-based fantasy console with a 320x240 screen,
256KB memory. The WASM runtime (platform + loader modules) is compiled 32-color palette, and a 256KB memory limit. Programs are compiled to
to C via wasm2c and embedded in the binary. No external files required. compact WASM modules (.uw8 format). The runtime is fully self-contained
firmware_count=0 in .info is correct. with no external dependencies. No BIOS or system directory files required.
+9 -13
View File
@@ -1,19 +1,15 @@
emulator: UXN emulator: UXN
type: libretro type: game
core_classification: community_fork source: "https://github.com/libretro/uxn"
source: "https://codeberg.org/iyzsong/uxn-libretro" profiled_date: "2026-03-18"
upstream: "https://github.com/chmod222/zuxn" core_version: "0.0.0"
profiled_date: "2026-03-25"
core_version: "0.0.1"
display_name: "Uxn / Varvara (zuxn)" display_name: "Uxn / Varvara (zuxn)"
cores: [uxn] cores: [uxn]
systems: [] systems: []
files: [] files: []
exclusion_note: >
Uxn/Varvara is a software-defined stack machine with 64KB of memory.
The VM has no firmware or BIOS. ROMs compiled from Uxntal assembly are
loaded directly via libretro game_info. The .info declares no firmware.
notes: > notes: >
Libretro wrapper around the zuxn library (Zig implementation of the Libretro port of the Varvara/UXN stack machine designed by Hundred Rabbits.
Uxn/Varvara spec by Hundred Rabbits). The file device in Varvara handles UXN is a portable 8-bit virtual computer with 64KB of memory and a
ROM-initiated I/O but does not load system files from the system directory. minimal instruction set. Loads .rom files compiled from Uxntal assembly.
The VM is entirely software-defined with no firmware or BIOS dependencies.
No system directory files required.
+27 -19
View File
@@ -1,38 +1,46 @@
emulator: uzem emulator: uzem
type: libretro type: libretro
core_classification: pure_libretro
source: "https://github.com/libretro/libretro-uzem" source: "https://github.com/libretro/libretro-uzem"
upstream: "https://github.com/Uzebox/uzebox" profiled_date: "2026-03-18"
profiled_date: "2026-03-25" core_version: "3.1"
core_version: "v2.0" display_name: "Uzem (Uzebox)"
display_name: "Uzebox (Uzem)" display_name: "Uzebox (Uzem)"
cores: cores:
- uzem - uzem
systems: systems:
- uzebox - uzebox
# No BIOS or firmware files required. The Uzebox is an open-source 8-bit game # Uzem emulates the Uzebox, an open-source 8-bit game console based on an
# console (ATmega644 AVR MCU) with no proprietary firmware. Games are # ATmega644 AVR microcontroller. The console was designed by Alec Bourque (Uze)
# self-contained .uze files loaded directly into progmem # and all hardware/software is open-source.
# (uzem_libretro.cpp:254-286, "UZEBOX" magic header + RomHeader + program data).
# #
# The libretro core does not call RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY. # No BIOS or firmware files are required. The core loads .uze ROM files directly
# SD card emulation uses GET_CORE_ASSETS_DIRECTORY (uzem_libretro.cpp:186-192) # into progmem (uzem_libretro.cpp:254-286). The .uze format includes a "UZEBOX"
# for optional game data via virtual FAT16 filesystem (SDEmulator.cpp). # magic header followed by a RomHeader struct (uzerom.h) and raw program data.
# EEPROM is handled via RETRO_MEMORY_SAVE_RAM (uzem_libretro.cpp:407-408).
# #
# The standalone uzem supports --boot (PC=0xF000) for bootloader mode # The standalone uzem (oldsrcs/uzem.cpp:90) has a --boot flag that sets PC to
# (uzem.cpp:206) and .hex format loading, neither exposed in the libretro port. # 0xF000 for bootloader mode, but this is NOT exposed in the libretro port.
# The libretro core has no retro_environment calls for RETRO_ENVIRONMENT_SET_SYSTEM_DIR
# or any firmware loading paths.
# #
# The .info file declares no firmware entries (firmware_count absent). # SD card emulation uses RETRO_ENVIRONMENT_GET_CORE_ASSETS_DIRECTORY
# (uzem_libretro.cpp:186-192) for virtual FAT16 filesystem access via SDEmulator.cpp,
# but this is optional game data, not system firmware.
#
# The .info file declares no firmware entries.
files: [] files: []
notes: notes:
open_source_console: > open_source_console: >
Fully open-source hardware and software designed by Alec Bourque. The Uzebox is fully open-source hardware and software. There is no proprietary
No proprietary BIOS or bootloader. Games are self-contained .uze files. BIOS or bootloader required. Games are self-contained .uze files that include
all code needed to run on the ATmega644 MCU emulation.
sd_card: > sd_card: >
Some games use SD card access for loading assets. The core reads from the Some games use SD card access for loading assets. The core reads from the
libretro core assets directory to emulate a FAT16 SD card (game data, not libretro core assets directory to emulate a FAT16 SD card, but this is game
system firmware). data, not system firmware.
standalone_bootloader: >
The original standalone uzem supports a --boot flag for bootloader mode
(PC starts at 0xF000 instead of 0x0000). This feature is not available in
the libretro port.
+8 -11
View File
@@ -1,17 +1,14 @@
emulator: VaporSpec emulator: VaporSpec
type: libretro type: game
core_classification: official_port source: "https://github.com/libretro/libretro-vaporspec"
source: "https://github.com/minkcv/vm" profiled_date: "2026-03-18"
upstream: "https://github.com/minkcv/vm"
profiled_date: "2026-03-25"
core_version: "GIT" core_version: "GIT"
display_name: "VaporSpec" display_name: "VaporSpec"
cores: [vaporspec] cores: [vaporspec]
systems: [vaporspec] systems: []
files: [] files: []
notes: > notes: >
Fantasy console with fixed specs (256x192 display, 4-channel audio, Fantasy console for libretro inspired by retro hardware aesthetics.
256-color palette). Runs .vaporbin cartridge bundles containing code Provides a virtual machine with fixed specs (256x192 display, 4-channel
and optional ROM data. All content is self-contained in the bundle audio) for running homebrew .vaporbin cartridge files.
passed by the frontend; no system directory files loaded. No BIOS, firmware, or system directory files required.
firmware_count=0 confirmed by code analysis.
+52 -24
View File
@@ -1,9 +1,7 @@
emulator: VBA-Next emulator: VBA-Next
type: libretro type: libretro
core_classification: frozen_snapshot
source: "https://github.com/libretro/vba-next" source: "https://github.com/libretro/vba-next"
upstream: "https://github.com/visualboyadvance-m/visualboyadvance-m" profiled_date: "2026-03-18"
profiled_date: "2026-03-25"
core_version: "SVN" core_version: "SVN"
display_name: "Nintendo - Game Boy Advance (VBA Next)" display_name: "Nintendo - Game Boy Advance (VBA Next)"
cores: cores:
@@ -12,34 +10,64 @@ systems:
- nintendo-gba - nintendo-gba
notes: | notes: |
Frozen snapshot of VBA-M circa 2011, optimized for libretro by Squarepusher. VBA-Next is a Game Boy Advance emulator forked from VBA-M, optimized for
libretro. It includes a built-in HLE BIOS (myROM array in src/gba.cpp:8423)
that handles all standard SWI calls, so no external BIOS file is needed for
most games.
Built-in HLE BIOS (myROM array, src/gba.cpp:8423) handles all standard SWI BIOS loading is gated behind HAVE_HLE_BIOS (defined in build/Makefile.common)
calls. No external BIOS file needed for most games. and controlled by core option vbanext_bios (default: enabled). When enabled,
the libretro port looks for gba_bios.bin in RetroArch's system directory
(libretro/libretro.cpp:198-203). CPUInit() loads the file via utilLoad(),
validates it is exactly 0x4000 bytes (16 KB), and sets useBios = true
(src/gba.cpp:12413-12443). If loading fails or the option is off, the HLE
BIOS (myROM) is memcpy'd into the bios buffer instead.
BIOS loading gated by HAVE_HLE_BIOS (build/Makefile.common:3) and core option CPUIsGBABios() accepts extensions: .gba, .agb, .bin, .bios, .rom
vbanext_bios (default: enabled). When enabled, retro_init resolves gba_bios.bin
in system_dir (libretro/libretro.cpp:198-202). CPUInit loads via utilLoad(),
validates size == 0x4000, sets useBios = true (src/gba.cpp:12430-12438). On
failure, myROM is memcpy'd as HLE fallback (src/gba.cpp:12443).
With real BIOS, execution starts at 0x00000000 (BIOS entry point). Without,
jumps to 0x08000000 (ROM entry), skipping boot animation
(src/gba.cpp:12657-12675).
CPUIsGBABios accepts extensions: .gba, .agb, .bin, .bios, .rom
(src/gba.cpp:8851-8873). (src/gba.cpp:8851-8873).
Upstream VBA-M CPUInit (src/core/gba/gba.cpp:3674-3702) is functionally When useBios is true and skipBios is false, execution starts at 0x00000000
identical. No divergences in BIOS handling. (real BIOS entry). Otherwise it jumps straight to 0x08000000 (ROM entry),
skipping the boot animation (src/gba.cpp:12657-12675).
The HLE BIOS covers: SoftReset, RegisterRamReset, Halt, VBlankIntrWait,
Div, Sqrt, ArcTan, ArcTan2, CpuSet, CpuFastSet, GetBiosChecksum,
BgAffineSet, ObjAffineSet, BitUnPack, LZ77UnComp (WRAM/VRAM),
HuffUnComp, RLUnComp (WRAM/VRAM), Diff8bitUnFilter (WRAM/VRAM),
Diff16bitUnFilter, MidiKey2Freq, SndDriverJmpTableCopy
(src/gba.cpp:2369-2578).
Some per-game overrides in gbaover[] (libretro/libretro.cpp:235) have a
useBios field, but all entries currently set it to 0 (no game forces BIOS).
files: files:
# -------------------------------------------------------
# Game Boy Advance - BIOS (optional, HLE fallback)
# -------------------------------------------------------
- name: gba_bios.bin - name: gba_bios.bin
system: nintendo-gba system: nintendo-gba
required: false required: false
hle_fallback: true hle_fallback: true
size: 16384 size: 16384 # 16 KB (0x4000)
validation: [size] note: "GBA BIOS. Optional -- HLE replacement (myROM) handles all standard SWI calls. Real BIOS adds startup logo and may improve edge-case accuracy."
description: "GBA BIOS" source_ref: "libretro/libretro.cpp:198-203, src/gba.cpp:12413-12443"
note: "Optional. HLE replacement handles all standard SWI calls. Real BIOS adds startup logo and may improve edge-case accuracy."
source_ref: "libretro/libretro.cpp:198-202, src/gba.cpp:12430-12438" platform_details:
gba:
bios_size: 16384 # 0x4000
hle_bios: true
source_ref: "src/gba.cpp:8423 (myROM), src/gba.cpp:2369-2578 (SWI handlers)"
notes: |
BIOS buffer is always allocated at 0x4000 bytes (src/gba.cpp:8963).
If the real BIOS loads successfully (exactly 0x4000 bytes), useBios is
set to true and CPUReset starts at address 0x00000000 with IRQ disabled.
Otherwise myROM (built-in HLE stub) is copied in and execution starts
at 0x08000000 with standard register init.
The core option vbanext_bios defaults to "enabled", so if gba_bios.bin
is present in the system directory it will be loaded automatically.
BIOS reads at runtime go through the memory map (src/gba.cpp:792-1076).
Address range 0x0000-0x3FFF maps to the bios buffer. A biosProtected[4]
array at 0x00f029e1 is returned when reading outside the current PC
region, matching real GBA BIOS protection behavior.
+6 -47
View File
@@ -1,49 +1,8 @@
emulator: VBA-M emulator: "vbam"
type: "standalone + libretro" type: alias
core_classification: official_port alias_of: "vba_next"
source: "https://github.com/libretro/vbam-libretro" profiled_date: "2026-03-18"
upstream: "https://github.com/visualboyadvance-m/visualboyadvance-m"
profiled_date: "2026-03-25"
core_version: "2.1.4" core_version: "2.1.4"
display_name: "Nintendo - Game Boy Advance (VBA-M)" display_name: "Nintendo - Game Boy Advance (VBA-M)"
cores: note: "This core uses the same BIOS/firmware as vba_next. See emulators/vba_next.yml for details."
- vbam files: []
systems:
- nintendo-gba
- nintendo-gb
- nintendo-gbc
notes: |
Supports GB, GBC, GBA, and SGB (borders/palette only).
BIOS usage controlled by vbam_usebios core option (default: disabled).
Built-in HLE BIOS (myROM array) handles GBA SWI calls without external file.
GB/GBC boot sequence skipped when BIOS absent.
Upstream repo includes the libretro port in src/libretro/.
files:
- name: gba_bios.bin
system: nintendo-gba
required: false
hle_fallback: true
size: 16384
validation: [size]
description: "GBA BIOS"
source_ref: "src/gba/GBA.cpp:3262-3272 (CPUInit size check), src/libretro/libretro.cpp:846-851 (gba_init)"
- name: gb_bios.bin
system: nintendo-gb
required: false
hle_fallback: true
size: 256
validation: [size]
description: "Game Boy boot ROM"
source_ref: "src/gb/GB.cpp:2172-2192 (gbCPUInit size check), src/libretro/libretro.cpp:861-879 (gb_init)"
- name: gbc_bios.bin
system: nintendo-gbc
required: false
hle_fallback: true
size: 2304
validation: [size]
description: "Game Boy Color boot ROM"
source_ref: "src/gb/GB.cpp:2172-2192 (gbCPUInit size check), src/libretro/libretro.cpp:861-879 (gb_init)"
+1 -3
View File
@@ -1,9 +1,7 @@
emulator: vecx emulator: vecx
type: libretro type: libretro
core_classification: community_fork
source: "https://github.com/libretro/libretro-vecx" source: "https://github.com/libretro/libretro-vecx"
upstream: "https://github.com/jhawthorn/vecx" profiled_date: "2026-03-18"
profiled_date: "2026-03-25"
core_version: "SVN" core_version: "SVN"
display_name: "GCE - Vectrex (vecx)" display_name: "GCE - Vectrex (vecx)"
cores: cores:
+25 -13
View File
@@ -1,9 +1,7 @@
emulator: VeMUlator emulator: VeMUlator
type: libretro type: libretro
core_classification: official_port
source: "https://github.com/libretro/vemulator-libretro" source: "https://github.com/libretro/vemulator-libretro"
upstream: "closed-source Android app (removed from Google Play ~2020)" profiled_date: "2026-03-18"
profiled_date: "2026-03-25"
core_version: "0.1" core_version: "0.1"
display_name: "VeMUlator" display_name: "VeMUlator"
cores: cores:
@@ -12,18 +10,32 @@ systems:
- sega-vmu - sega-vmu
notes: | notes: |
Sega Dreamcast VMU/VMS emulator. Same author (Mahmoud Jaoune) ported VeMUlator is a Sega Dreamcast Visual Memory Unit (VMU/VMS) emulator ported
the original Android Java app to C++ for libretro. Emulates the Sanyo from Android (Java) to C++ for libretro. It emulates the Sanyo LC8670
LC8670 CPU, 128 KB flash, 48x32 LCD, piezo buzzer, and timers. "Potato" CPU, 128 KB flash memory, 48x32 monochrome LCD, piezo buzzer,
and basic timer subsystems.
No BIOS files required. The core uses HLE exclusively: startCPU() No BIOS files are required. The core uses High Level Emulation (HLE) to
checks BIOSExists (always false), then initializeHLE() sets SFR bypass the VMU firmware entirely:
registers and system RAM directly (vmu.cpp:193-222).
A loadBIOS() function exists (vmu.cpp:82-137) handling encrypted and - At startup, startCPU() checks the BIOSExists flag (vmu.cpp:195). When
unencrypted BIOS images, but is never called from the libretro false (always, in the libretro port), it calls initializeHLE() which
interface. retro_load_game() only loads game flash data, with no sets up SFR registers (SP=0x7F, PSW=0x02, IE=0x80, MCR=0x08, P7=0x02,
system directory query. README lists BIOS support as planned. OCR=0xA3, BTCR=0x41) and system RAM variables directly (vmu.cpp:206-222).
- A loadBIOS() function exists in the VMU class (vmu.cpp:82-137) and can
handle both encrypted (XOR 0x37, 4-byte header stripped) and unencrypted
BIOS images (first byte must be 0x2A = JMPF opcode). Maximum accepted
size is 0xF004 (61444) bytes, loaded into 0xF000 (61440) bytes of ROM.
However, this function is never called by the libretro frontend code.
retro_load_game() in main.cpp only loads game flash data, with no BIOS
path resolution or RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY call.
- The README lists "BIOS support" as a planned future feature.
The .info file declares no firmware entries (firmware_count absent).
Supported ROM formats: VMS (.vms), DCI (.dci), raw flash dump (.bin).
The core option "enable_flash_write" allows persistent saves for .bin files.
files: [] files: []
-52
View File
@@ -1,52 +0,0 @@
emulator: "VICE x128"
type: libretro
core_classification: community_fork
source: "https://github.com/libretro/vice-libretro"
upstream: "https://sourceforge.net/projects/vice-emu/"
profiled_date: "2026-03-25"
core_version: "3.10"
display_name: "Commodore - C128 (VICE x128)"
cores: [vice_x128]
systems: [commodore-c128]
notes: >
System ROMs embedded in binary: C128 kernal (318020-05), chargen (390059-01),
BASIC lo (318018-04), BASIC hi (318019-04), C64 kernal (901227-03), C64 BASIC (901226-01),
plus all drive ROMs (1540, 1541, 1541-II, 1551, 1570, 1571, 1571CR, 1581, 1001, 2031,
2040, 3040, 4040, 9000). Embedded ROM check in sysfile_load takes priority over filesystem.
Localized kernal/chargen variants (DE, FI, FR, IT, NO, SE, CH) are in the embedded list
with NULL data pointers; selecting a non-international model produces uninitialized ROM data.
JiffyDOS requires True Drive Emulation enabled and a 1541/1571/1581 drive type.
C64 BASIC/kernal use shared names (basic-901226-01.bin, kernal-901227-03.bin) instead of
upstream c128-specific names (basic64-901226-01.bin, kernal64-901227-03.bin) to share
files with the C64 core in RetroArch's shared system directory.
files:
- name: "JiffyDOS_C128.bin"
description: "JiffyDOS C128 kernal replacement"
required: false
source_ref: "retrodep/ui.c:309-310"
notes: "Loaded into KernalIntName when vice_jiffydos option is enabled."
- name: "JiffyDOS_C64.bin"
description: "JiffyDOS C64 kernal replacement (GO64 mode)"
required: false
source_ref: "retrodep/ui.c:307-308"
notes: "Loaded into Kernal64Name when vice_jiffydos option is enabled."
- name: "JiffyDOS_1541-II.bin"
description: "JiffyDOS 1541-II drive DOS replacement"
required: false
source_ref: "retrodep/ui.c:283-284"
notes: "Loaded into DosName1541ii when vice_jiffydos option is enabled."
- name: "JiffyDOS_1571_repl310654.bin"
description: "JiffyDOS 1571 drive DOS replacement"
required: false
source_ref: "retrodep/ui.c:285-286"
notes: "Loaded into DosName1571 when vice_jiffydos option is enabled."
- name: "JiffyDOS_1581.bin"
description: "JiffyDOS 1581 drive DOS replacement"
required: false
source_ref: "retrodep/ui.c:287-288"
notes: "Loaded into DosName1581 when vice_jiffydos option is enabled."
-68
View File
@@ -1,68 +0,0 @@
emulator: "VICE x64"
type: libretro
core_classification: community_fork
source: "https://github.com/libretro/vice-libretro"
upstream: "https://sourceforge.net/projects/vice-emu/"
profiled_date: "2026-03-25"
core_version: "3.10"
display_name: "Commodore - C64 (VICE x64, fast)"
cores: [vice_x64]
systems: [commodore-c64]
notes: >
System ROMs embedded in binary: C64 BASIC (901226-01), chargen (901225-01),
chargen Japanese (906143-02), kernal Rev 3 (901227-03), kernal GS (390852-01),
kernal SX-64 (251104-04), kernal 4064 (901246-01), kernal Japanese (906145-02),
plus all drive ROMs (1540, 1541, 1541-II, 1551, 1570, 1571, 1571CR, 1581, 1001,
2031, 2040, 3040, 4040, 9000) and VIC-II palettes. Embedded ROM check in
sysfile_load takes priority over filesystem. Kernal Rev 1 (901227-01) and
Rev 2 (901227-02) are NOT embedded; selecting C64 OLD NTSC or C64 OLD PAL model
requires them on the filesystem in system/vice/C64/. JiffyDOS requires True Drive
Emulation enabled and a 1541/1571/1581 drive type. SX-64 models use a separate
JiffyDOS kernal (JiffyDOS_SX-64.bin) not declared in the .info.
files:
- name: "JiffyDOS_C64.bin"
description: "JiffyDOS C64 kernal replacement"
required: false
source_ref: "retrodep/ui.c:302-303"
notes: "Loaded into KernalName when vice_jiffydos option is enabled (non-SX64 models)."
- name: "JiffyDOS_SX-64.bin"
description: "JiffyDOS SX-64 kernal replacement"
required: false
source_ref: "retrodep/ui.c:295-296"
notes: "Loaded into KernalName when vice_jiffydos option is enabled and SX-64 model selected."
- name: "JiffyDOS_1541-II.bin"
description: "JiffyDOS 1541-II drive DOS replacement"
required: false
source_ref: "retrodep/ui.c:283-284"
notes: "Loaded into DosName1541ii when vice_jiffydos option is enabled."
- name: "JiffyDOS_1571_repl310654.bin"
description: "JiffyDOS 1571 drive DOS replacement"
required: false
source_ref: "retrodep/ui.c:285-286"
notes: "Loaded into DosName1571 when vice_jiffydos option is enabled."
- name: "JiffyDOS_1581.bin"
description: "JiffyDOS 1581 drive DOS replacement"
required: false
source_ref: "retrodep/ui.c:287-288"
notes: "Loaded into DosName1581 when vice_jiffydos option is enabled."
- name: "kernal-901227-01.bin"
description: "C64 Kernal Rev 1"
required: false
size: 8192
validation: [size]
source_ref: "vice/src/c64/c64-resources.c:253, vice/src/c64/c64model.c:131"
notes: "Not embedded. Loaded via sysfile from system/vice/C64/ when C64 OLD NTSC model selected."
- name: "kernal-901227-02.bin"
description: "C64 Kernal Rev 2"
required: false
size: 8192
validation: [size]
source_ref: "vice/src/c64/c64-resources.c:254, vice/src/c64/c64model.c:117"
notes: "Not embedded. Loaded via sysfile from system/vice/C64/ when C64 OLD PAL model selected."
-34
View File
@@ -1,34 +0,0 @@
emulator: "VICE x64dtv"
type: libretro
core_classification: community_fork
source: "https://github.com/libretro/vice-libretro"
upstream: "https://sourceforge.net/projects/vice-emu/"
profiled_date: "2026-03-25"
core_version: "3.10"
display_name: "Commodore - C64DTV (VICE x64dtv)"
cores: [vice_x64dtv]
systems: [commodore-c64dtv]
notes: >
System ROMs embedded in binary: C64 BASIC (901226-01), kernal Rev 3
(901227-03), chargen (901225-01), plus all drive ROMs (1540, 1541, 1541-II,
1551, 1570, 1571, 1571CR, 1581, 1001, 2031, 2040, 3040, 4040, 9000).
Embedded ROM check in sysfile_load takes priority over filesystem.
DTV has its own color system (viciidtv-color.c); external palette loading
is disabled. JiffyDOS is not supported (excluded from build conditionals).
The .info declares 4 JiffyDOS firmware (firmware_count=4) but the code
never loads them for this core. The .info also omits dtvrom.bin.
files:
- name: "dtvrom.bin"
description: "C64 DTV 2MB flash ROM image"
required: false
hle_fallback: true
size: 2097152
source_ref: "vice/src/c64dtv/c64dtvflash.c:59-64,470-471,488-505"
notes: >
Loaded via sysfile_load from system/vice/C64DTV/. All model variants
(V2 PAL/NTSC, V3 PAL/NTSC, Hummer) default to this filename. If not
found, the core copies embedded BASIC, kernal and chargen ROMs into
flash memory. Without it, the DTV operates as a basic C64 without the
built-in DTV games and firmware. The original DTV ROM has distorted
colors; a patched ROM is recommended.
-69
View File
@@ -1,69 +0,0 @@
emulator: "VICE x64sc"
type: libretro
core_classification: community_fork
source: "https://github.com/libretro/vice-libretro"
upstream: "https://sourceforge.net/projects/vice-emu/"
profiled_date: "2026-03-25"
core_version: "3.10"
display_name: "Commodore - C64 (VICE x64sc, accurate)"
cores: [vice_x64sc]
systems: [commodore-c64]
notes: >
Cycle-accurate C64 emulator using the viciisc VIC-II implementation.
System ROMs embedded in binary: C64 BASIC (901226-01), chargen (901225-01),
chargen Japanese (906143-02), kernal Rev 3 (901227-03), kernal GS (390852-01),
kernal SX-64 (251104-04), kernal 4064 (901246-01), kernal Japanese (906145-02),
plus all drive ROMs (1540, 1541, 1541-II, 1551, 1570, 1571, 1571CR, 1581, 1001,
2031, 2040, 3040, 4040, 9000) and VIC-II palettes. Embedded ROM check in
sysfile_load takes priority over filesystem. Kernal Rev 1 (901227-01) and
Rev 2 (901227-02) are NOT embedded; selecting C64 OLD NTSC or C64 OLD PAL model
requires them on the filesystem in system/vice/C64/. JiffyDOS requires True Drive
Emulation enabled and a 1541/1571/1581 drive type. SX-64 models use a separate
JiffyDOS kernal (JiffyDOS_SX-64.bin) not declared in the .info.
files:
- name: "JiffyDOS_C64.bin"
description: "JiffyDOS C64 kernal replacement"
required: false
source_ref: "retrodep/ui.c:302-303"
notes: "Loaded into KernalName when vice_jiffydos option is enabled (non-SX64 models)."
- name: "JiffyDOS_SX-64.bin"
description: "JiffyDOS SX-64 kernal replacement"
required: false
source_ref: "retrodep/ui.c:295-296"
notes: "Loaded into KernalName when vice_jiffydos option is enabled and SX-64 model selected."
- name: "JiffyDOS_1541-II.bin"
description: "JiffyDOS 1541-II drive DOS replacement"
required: false
source_ref: "retrodep/ui.c:283-284"
notes: "Loaded into DosName1541ii when vice_jiffydos option is enabled."
- name: "JiffyDOS_1571_repl310654.bin"
description: "JiffyDOS 1571 drive DOS replacement"
required: false
source_ref: "retrodep/ui.c:285-286"
notes: "Loaded into DosName1571 when vice_jiffydos option is enabled."
- name: "JiffyDOS_1581.bin"
description: "JiffyDOS 1581 drive DOS replacement"
required: false
source_ref: "retrodep/ui.c:287-288"
notes: "Loaded into DosName1581 when vice_jiffydos option is enabled."
- name: "kernal-901227-01.bin"
description: "C64 Kernal Rev 1"
required: false
size: 8192
validation: [size]
source_ref: "vice/src/c64/c64-resources.c:253, vice/src/c64/c64scmodel.c:141"
notes: "Not embedded. Loaded via sysfile from system/vice/C64/ when C64 OLD NTSC model selected."
- name: "kernal-901227-02.bin"
description: "C64 Kernal Rev 2"
required: false
size: 8192
validation: [size]
source_ref: "vice/src/c64/c64-resources.c:254, vice/src/c64/c64scmodel.c:123"
notes: "Not embedded. Loaded via sysfile from system/vice/C64/ when C64 OLD PAL model selected."
-22
View File
@@ -1,22 +0,0 @@
emulator: "VICE xcbm2"
type: libretro
core_classification: community_fork
source: "https://github.com/libretro/vice-libretro"
upstream: "https://sourceforge.net/projects/vice-emu/"
profiled_date: "2026-03-25"
core_version: "3.10"
display_name: "Commodore - CBM-II 6x0/7x0 (VICE xcbm2)"
cores: [vice_xcbm2]
systems: [commodore-cbm-ii]
notes: >
System ROMs embedded in binary: chargen 600 (901237-01), chargen 700 (901232-01),
kernal (901244-04a), BASIC 128K (901242+3-04a), BASIC 256K (901240+1-03), plus
all drive ROMs (1001, 2031, 2040, 3040, 4040, 9000) and CRTC palettes (amber,
green, white). Embedded ROM check in sysfile_load takes priority over filesystem.
Models: 610 PAL/NTSC, 620 PAL/NTSC, 620+ PAL/NTSC, 710 NTSC, 720 NTSC,
720+ NTSC. 600 series uses CRTC with 8 scanlines/char, 700 series uses 14
scanlines/char (different chargen ROM). CBM-II uses IEEE-488 bus (not IEC serial),
so no JiffyDOS support. Cartridge slots (Cart1-Cart6) are user content, not system
files.
files: []
-19
View File
@@ -1,19 +0,0 @@
emulator: "VICE xcbm5x0"
type: libretro
core_classification: community_fork
source: "https://github.com/libretro/vice-libretro"
upstream: "https://sourceforge.net/projects/vice-emu/"
profiled_date: "2026-03-25"
core_version: "3.10"
display_name: "Commodore - CBM-II 5x0 (VICE xcbm5x0)"
cores: [vice_xcbm5x0]
systems: [commodore-cbm-ii]
notes: >
System ROMs embedded in binary: chargen 500 (901225-01), kernal 500
(901234-02), BASIC 500 (901235+6-02), plus all drive ROMs (1001, 2031, 2040,
3040, 4040, 9000) and VIC-II palettes. Embedded ROM check in sysfile_load
takes priority over filesystem. Models: 510 PAL/NTSC. CBM-5x0 (P500/C510)
uses VIC-II chip instead of CRTC. IEEE-488 bus (not IEC serial), no JiffyDOS
support. Cartridge slots (Cart1-Cart6) are user content, not system files.
files: []
-24
View File
@@ -1,24 +0,0 @@
emulator: "VICE xpet"
type: libretro
core_classification: community_fork
source: "https://github.com/libretro/vice-libretro"
upstream: "https://sourceforge.net/projects/vice-emu/"
profiled_date: "2026-03-25"
core_version: "3.10"
display_name: "Commodore - PET (VICE xpet)"
cores: [vice_xpet]
systems: [commodore-pet]
notes: >
System ROMs embedded in binary: kernal 1 (901439-04-07), kernal 2 (901465-03),
kernal 4 (901465-22), BASIC 1 (901439-09-05-02-06), BASIC 2 (901465-01-02),
BASIC 4 (901465-23-20-21), chargen 1 (901447-08), chargen 2 (901447-10),
SuperPET chargen (901640-01), 6 editor ROMs (1g40, 2b40, 2g40, 4b40, 4b80, 4g40),
6 SuperPET Waterloo 6809 ROMs (a000-f000), plus all drive ROMs (1540, 1541, 1541-II,
1551, 1570, 1571, 1571CR, 1581, 1001, 2031, 2040, 3040, 4040, 9000) and CRTC
palettes (amber, green, white). Embedded ROM check in sysfile_load takes priority
over filesystem. Models: 2001, 3008, 3016, 3032, 3032B, 4016, 4032, 4032B, 8032,
8096, 8296, SuperPET. PET uses IEEE-488 bus (not IEC serial), so no JiffyDOS support.
No cartridge support. Extension ROM slots ($9000/$A000/$B000) and German chargen
(chargen.de) are standalone-only features not exposed via libretro core options.
files: []
-23
View File
@@ -1,23 +0,0 @@
emulator: "VICE xplus4"
type: libretro
core_classification: community_fork
source: "https://github.com/libretro/vice-libretro"
upstream: "https://sourceforge.net/projects/vice-emu/"
profiled_date: "2026-03-25"
core_version: "3.10"
display_name: "Commodore - PLUS/4 (VICE xplus4)"
cores: [vice_xplus4]
systems: [commodore-plus4]
notes: >
All system ROMs embedded in binary: BASIC (318006-01), kernal PAL (318004-05),
kernal NTSC (318005-05), kernal V232 (318004-01), kernal V364 (364),
3+1 function low (317053-01), 3+1 function high (317054-01), V364 speech ROM
(c2lo-364). All drive ROMs embedded (1540, 1541, 1541-II, 1551, 1570, 1571,
1571CR, 1581, 1001, 2031, 2040, 3040, 4040, 9000). TED palettes embedded
(colodore_ted, BT601, BT709, BT2020, yape-pal, yape-ntsc). Embedded check in
sysfile_load takes priority over filesystem. Models: C16 PAL/NTSC, Plus/4
PAL/NTSC, V364 NTSC, 232 NTSC — all use embedded kernal variants. No JiffyDOS
support (C64/C128/SCPU64 only). 3+1 function ROMs loaded for Plus/4 and V364
models, cleared to 0xFF for C16 and 232 models. c2lo loaded only for V364 model.
files: []
-59
View File
@@ -1,59 +0,0 @@
emulator: "VICE xscpu64"
type: libretro
core_classification: community_fork
source: "https://github.com/libretro/vice-libretro"
upstream: "https://sourceforge.net/projects/vice-emu/"
profiled_date: "2026-03-25"
core_version: "3.10"
display_name: "Commodore - C64 SuperCPU (VICE xscpu64)"
cores: [vice_xscpu64]
systems: [commodore-c64-supercpu]
notes: >
Embedded SCPU64 ROM V0.07 (free replacement by Soci/Singular, 64 KB), chargen
(901225-01, 906143-02), C64 BASIC (901226-01), all C64 kernals (Rev 3, GS,
SX-64, 4064, Japanese), all drive ROMs (1540 through 9000), and VIC-II palettes.
Embedded ROM check in sysfile_load takes priority over filesystem. External
scpu-dos-*.bin provide the original CMD SuperCPU DOS kernals, loaded from
system/vice/SCPU64/ when SuperCPU Kernal core option is changed from Internal.
JiffyDOS requires True Drive Emulation enabled and a non-internal SuperCPU
kernal (the internal ROM is not JiffyDOS-compatible). The .info incorrectly
declares JiffyDOS_C64.bin (firmware_count=4); the C64 kernal replacement is
only loaded for x64/x64sc/x128, never for xscpu64. Correct firmware_count=5
(2 SCPU64 kernals + 3 JiffyDOS drive DOSes).
files:
- name: "scpu-dos-2.04.bin"
description: "CMD SuperCPU Kernal v2.04"
required: false
min_size: 65536
max_size: 524288
validation: [size]
source_ref: "retrodep/ui.c:262-263, vice/src/scpu64/scpu64rom.c:75-89"
notes: "Loaded as SCPU64Name when SuperCPU Kernal option set to 2.04. Size must be power of 2 between 64 KB and 512 KB. Stored in system/vice/SCPU64/."
- name: "scpu-dos-1.4.bin"
description: "CMD SuperCPU Kernal v1.4"
required: false
min_size: 65536
max_size: 524288
validation: [size]
source_ref: "retrodep/ui.c:265-266, vice/src/scpu64/scpu64rom.c:75-89"
notes: "Loaded as SCPU64Name when SuperCPU Kernal option set to 1.40. Size must be power of 2 between 64 KB and 512 KB. Stored in system/vice/SCPU64/."
- name: "JiffyDOS_1541-II.bin"
description: "JiffyDOS 1541-II drive DOS replacement"
required: false
source_ref: "retrodep/ui.c:282-283"
notes: "Loaded as DosName1541ii when JiffyDOS option enabled."
- name: "JiffyDOS_1571_repl310654.bin"
description: "JiffyDOS 1571 drive DOS replacement"
required: false
source_ref: "retrodep/ui.c:285-286"
notes: "Loaded as DosName1571 when JiffyDOS option enabled."
- name: "JiffyDOS_1581.bin"
description: "JiffyDOS 1581 drive DOS replacement"
required: false
source_ref: "retrodep/ui.c:287-288"
notes: "Loaded as DosName1581 when JiffyDOS option enabled."
-36
View File
@@ -1,36 +0,0 @@
emulator: "VICE xvic"
type: libretro
core_classification: community_fork
source: "https://github.com/libretro/vice-libretro"
upstream: "https://sourceforge.net/projects/vice-emu/"
profiled_date: "2026-03-25"
core_version: "3.10"
display_name: "Commodore - VIC-20 (VICE xvic)"
cores: [vice_xvic]
systems: [commodore-vic20]
notes: >
System ROMs embedded in binary: BASIC (901486-01), chargen (901460-03),
kernal PAL Rev 7 (901486-07), kernal NTSC Rev 6 (901486-06), plus all
drive ROMs (1540, 1541, 1541-II, 1551, 1570, 1571, 1571CR, 1581, 1001,
2031, 2040, 3040, 4040, 9000) and VIC palettes. Embedded ROM check in
sysfile_load takes priority over filesystem. Japanese VIC-1001 model
requires kernal Rev 2 (901486-02) and chargen (901460-02) on the
filesystem in system/vice/VIC20/; this model is not exposed via core
options (only via vicerc). No JiffyDOS support for VIC-20.
files:
- name: "kernal.901486-02.bin"
description: "VIC-1001 Kernal Rev 2 (Japanese NTSC)"
required: false
size: 8192
validation: [size]
source_ref: "vice/src/vic20/vic20rom.h:49, vice/src/vic20/vic20model.c:60, vice/src/vic20/vic20rom.c:112-120"
notes: "Not embedded. Loaded via sysfile from system/vice/VIC20/ when VIC-1001 Japanese model selected via vicerc."
- name: "chargen-901460-02.bin"
description: "VIC-1001 Character ROM (Japanese)"
required: false
size: 4096
validation: [size]
source_ref: "vice/src/vic20/vic20rom.h:53, vice/src/vic20/vic20model.c:60, vice/src/vic20/vic20rom.c:173-179"
notes: "Not embedded. Loaded via sysfile from system/vice/VIC20/ when VIC-1001 Japanese model selected via vicerc."
+8 -7
View File
@@ -1,8 +1,7 @@
emulator: vidtest emulator: vidtest
type: test type: test
core_classification: pure_libretro source: "https://github.com/libretro/RetroArch"
source: "https://github.com/schellingb/vidtest_libretro" profiled_date: "2026-03-18"
profiled_date: "2026-03-25"
core_version: "0.1" core_version: "0.1"
display_name: "VidTest" display_name: "VidTest"
cores: cores:
@@ -10,9 +9,11 @@ cores:
systems: [] systems: []
notes: | notes: |
Video mode and input test core for libretro frontends. Provides interactive Video test core built into RetroArch (not from libretro-samples). Tests
GUI (Nuklear) to adjust resolution, aspect ratio, timing, and inspect full video driver capabilities: pixel format negotiation, resolution switching,
input state across all device types. Renders directly to a software surface. aspect ratio handling, and frame pacing. Renders test patterns for visual
No system files required. validation of the video output chain.
No system files, BIOS, or firmware required. Not an emulator.
files: [] files: []
+4 -6
View File
@@ -1,10 +1,8 @@
emulator: Vircon32 emulator: Vircon32
type: libretro type: libretro
core_classification: official_port
source: "https://github.com/vircon32/vircon32-libretro" source: "https://github.com/vircon32/vircon32-libretro"
upstream: "https://github.com/vircon32/ComputerSoftware" profiled_date: "2026-03-18"
profiled_date: "2026-03-25" core_version: "2024.08.28"
core_version: "2026.2.18"
display_name: "Vircon32" display_name: "Vircon32"
cores: cores:
- vircon32 - vircon32
@@ -20,7 +18,7 @@ notes: |
C header (embedded/StandardBios.h), generated from Assets/StandardBios.v32 C header (embedded/StandardBios.h), generated from Assets/StandardBios.v32
at build time. The core never strictly requires an external BIOS file. at build time. The core never strictly requires an external BIOS file.
BIOS loading logic (libretro.cpp:415-429): BIOS loading logic (libretro.cpp:416-429):
1. Check if system_dir/Vircon32Bios.v32 exists on disk 1. Check if system_dir/Vircon32Bios.v32 exists on disk
2. If found, load it via Console.LoadBiosFile() (external override) 2. If found, load it via Console.LoadBiosFile() (external override)
3. If not found, load the embedded BIOS via LoadEmbeddedBios() 3. If not found, load the embedded BIOS via LoadEmbeddedBios()
@@ -46,7 +44,7 @@ files:
size: 1073060 size: 1073060
md5: "73f04397cbb2dafcf2047b19a856153a" md5: "73f04397cbb2dafcf2047b19a856153a"
sha1: "67ddbcd018f03ed74b6e013074d92cc5f1f51c80" sha1: "67ddbcd018f03ed74b6e013074d92cc5f1f51c80"
source_ref: "libretro.cpp:422-425" source_ref: "libretro.cpp:423-426"
notes: | notes: |
Optional external BIOS placed in the system directory root. Optional external BIOS placed in the system directory root.
If present, overrides the embedded Standard BIOS v1.2. If present, overrides the embedded Standard BIOS v1.2.
+1 -3
View File
@@ -1,9 +1,7 @@
emulator: Virtual Jaguar emulator: Virtual Jaguar
type: libretro type: libretro
core_classification: community_fork
source: "https://github.com/libretro/virtualjaguar-libretro" source: "https://github.com/libretro/virtualjaguar-libretro"
upstream: "http://shamusworld.gotdns.org/git/virtualjaguar" profiled_date: "2026-03-18"
profiled_date: "2025-03-25"
core_version: "v2.1.0" core_version: "v2.1.0"
display_name: "Atari - Jaguar (Virtual Jaguar)" display_name: "Atari - Jaguar (Virtual Jaguar)"
cores: cores:
+43 -20
View File
@@ -1,32 +1,55 @@
emulator: VirtualXT emulator: VirtualXT
type: libretro type: libretro
core_classification: pure_libretro source: "https://github.com/libretro/virtualxt"
source: "https://codeberg.org/virtualxt/virtualxt" profiled_date: "2026-03-18"
upstream: "https://codeberg.org/virtualxt/virtualxt" core_version: "0.9.0"
profiled_date: "2026-03-25"
core_version: "2.1.0"
display_name: "VirtualXT" display_name: "VirtualXT"
cores: [virtualxt]
systems: [ibm-pc] systems: [ibm-pc]
# All BIOS ROMs are embedded at compile time via Odin's #load() directive. # VirtualXT is a Turbo PC/XT emulator (Intel 8088/186). Written in Odin.
# No external files are loaded from system_dir in standard operation. # All BIOS ROMs are embedded at compile time via #load() directives in
# src/frontend/core.odin. No external BIOS files are required at runtime.
# The default machine setup (setup_default_machine) loads these embedded ROMs:
# - BIOS: GLaBIOS 0.2.6 or Turbo XT BIOS 3.1 (user selects via core option)
# - VGA BIOS: vgabios.bin (loaded when VGA video mode is selected)
# - Disk Extension: vxtx.bin (always loaded)
# - RTC BIOS: GLaTICK 0.8.4 (loaded when RTC is enabled)
# Core option "virtualxt_bios" selects between GLaBIOS and TurboXT at startup.
# Core option "virtualxt_video" selects CGA or VGA (VGA loads vgabios.bin).
# Core option "virtualxt_rtc" selects GLaTICK or none (loads GLaTICK_0.8.4_AT.ROM).
# INI config files (.ini extension) can reference external ROM paths, but the
# standard usage path does not require any files in the system directory.
# Embedded BIOS files (shipped inside the compiled core binary):
# #
# Embedded ROMs (core.odin:323-394, edge branch): # GLABIOS.ROM 8192 bytes md5:bbeb6f7e2175732eebc3f0b49976347a sha1:701bb8ab0f9797581f795394a5c09eb147ff93d2
# GLABIOS.ROM, pcxtbios.bin, vgabios.bin, vxtx.bin, GLaTICK_0.8.4_AT.ROM # pcxtbios.bin 8192 bytes md5:336bf8888a22075caa09e2e8e4d96a3b sha1:f7b73e441fd7b582a493837658fa17407e851d7c
# # vgabios.bin 32768 bytes md5:9c80b0a0784dcf80f84c35b1cc8db81b sha1:251d85a90d3df3d116c30568167587ee3819f623
# INI config files can reference external ROM paths via load_from_file # vxtx.bin 2048 bytes md5:c6c7eef021e5e40503cb5ae860f02fde sha1:ccd27f24e5d7bd7d14b336be5b79b7ef8ba6e6be
# (rom.odin:42-68), but this is not the standard usage path. # GLaTICK_0.8.4_AT.ROM 2048 bytes md5:06ead46b977ffb4a056844e2965653eb sha1:025c5d6d9391698488cebad11623ee239ce070a2
#
# source_ref: src/frontend/core.odin:323-394 (setup_default_machine, #load) # Source references:
# source_ref: src/modules/rom/rom.odin:42-68 (load_from_file, INI only) # src/frontend/core.odin:295-370 - BIOS embedding via #load("bios:...", []byte)
# source_ref: src/frontend/options.odin:55 (core option virtualxt_bios) # src/frontend/options.odin:55 - core option "virtualxt_bios" (GLaBIOS|TurboXT)
# src/modules/rom/rom.odin:42-67 - load_from_file (INI path only)
# bios/ - open-source BIOS files (GLaBIOS, TurboXT, vgabios)
files: [] files: []
notes: notes:
bios_approach: > bios_approach: >
All BIOS ROMs embedded at compile time via Odin #load() directive. VirtualXT embeds all BIOS ROMs into the core binary at compile time using
Open-source replacements: GLaBIOS (GPL), Turbo XT BIOS 3.1, vgabios. Odin's #load() directive. The bios/ directory in the source tree contains
No proprietary IBM PC/XT BIOS needed. open-source replacements: GLaBIOS (GPL), Turbo XT BIOS 3.1, and vgabios.
No proprietary IBM PC/XT BIOS is needed.
ini_config: >
When loading an .ini file, the core can instantiate ROM modules with external
file paths (rom.odin handles string values for "mem" via load_from_file).
This is an advanced usage path; standard operation needs no external files.
supported_extensions: "img, ini, exe, com" supported_extensions: "img, ini, exe, com"
supported_features: >
Intel 8088/186 CPU, CGA/VGA graphics, EMS memory, ethernet adapter,
host file sharing (RIFS2), GDB server, floppy and hard disk images.
+1 -3
View File
@@ -1,9 +1,7 @@
emulator: vitaQuakeII emulator: vitaQuakeII
type: libretro type: libretro
core_classification: official_port
source: "https://github.com/libretro/vitaquake2" source: "https://github.com/libretro/vitaquake2"
upstream: "https://github.com/Rinnegatamante/vitaQuakeII" profiled_date: "2026-03-18"
profiled_date: "2026-03-25"
core_version: "git" core_version: "git"
display_name: "Quake II (vitaQuake 2)" display_name: "Quake II (vitaQuake 2)"
cores: [vitaquake2, vitaquake2-rogue, vitaquake2-xatrix, vitaquake2-zaero] cores: [vitaquake2, vitaquake2-rogue, vitaquake2-xatrix, vitaquake2-zaero]
+12 -11
View File
@@ -1,21 +1,22 @@
emulator: vitaQuakeIII emulator: vitaQuakeIII
type: game type: game
core_classification: community_fork
source: "https://github.com/libretro/vitaquake3" source: "https://github.com/libretro/vitaquake3"
upstream: "https://github.com/ioquake/ioq3" profiled_date: "2026-03-18"
profiled_date: "2026-03-25"
core_version: "git" core_version: "git"
display_name: "Quake III: Arena (vitaQuake 3)" display_name: "Quake III: Arena (vitaQuake 3)"
cores: [vitaquake3] cores: [vitaquake3, vitavoyager]
systems: [quake3] systems: [quake3]
notes: > notes: >
Quake III Arena source port built from ioquake3 with the libretro backend. Quake III Arena and Star Trek Voyager Elite Force source ports. Built from
Also supports Team Arena (missionpack), OpenArena (baseoa), Quake3Rally ioquake3 with the libretro backend. vitaquake3 plays Quake III Arena and
(baseq3r), and Urban Terror (q3ut4) via path detection. Content is loaded Team Arena, vitavoyager plays Star Trek Voyager Elite Force (Holomatch
from the .pk3 file path - the engine resolves the parent directory structure multiplayer). Both cores accept .pk3 extensions. Content is loaded from the
to find baseq3/ and loads pak0.pk3 through pak8.pk3 sequentially. Game data .pk3 file path - the engine resolves the parent directory structure to find
files (.pk3 archives) come from the retail game. No files are required in baseq3/ (or baseEF/ for vitavoyager) and loads pak0.pk3 through pak8.pk3
the RetroArch system directory. sequentially. Game data files (.pk3 archives containing maps, textures,
models, shaders, sounds) come from the retail game, not engine firmware.
No files are required in the RetroArch system directory. The cores need
no BIOS or firmware.
files: [] files: []
+5 -17
View File
@@ -1,20 +1,8 @@
emulator: vitavoyager emulator: "vitavoyager"
type: game type: alias
core_classification: community_fork alias_of: "vitaquake3"
source: "https://github.com/libretro/vitavoyager" profiled_date: "2026-03-18"
upstream: "https://github.com/zturtleman/lilium-voyager"
profiled_date: "2026-03-25"
core_version: "git" core_version: "git"
display_name: "Star Trek: Voyager - Elite Force (vitaVoyager)" display_name: "Star Trek: Voyager - Elite Force (vitaVoyager)"
cores: [vitavoyager] note: "This core uses the same BIOS/firmware as vitaquake3. See emulators/vitaquake3.yml for details."
systems: [quake3]
notes: >
Star Trek Voyager Elite Force Holomatch (multiplayer) source port built from
Lilium Voyager (itself an ioquake3 fork) with the libretro backend. Content
is loaded from the .pk3 file path - the engine resolves the parent directory
structure to find baseEF/ and loads pak0.pk3 through pak3.pk3 sequentially.
Game data files (.pk3 archives) come from the retail game. No files are
required in the RetroArch system directory.
files: [] files: []
+6 -6
View File
@@ -1,15 +1,15 @@
emulator: WASM-4 emulator: WASM-4
type: game type: game
core_classification: game_engine
source: "https://github.com/aduros/wasm4" source: "https://github.com/aduros/wasm4"
upstream: "https://github.com/aduros/wasm4" profiled_date: "2026-03-18"
profiled_date: "2026-03-25"
core_version: "2.1.0" core_version: "2.1.0"
display_name: "WASM-4" display_name: "WASM-4"
cores: [wasm4] cores: [wasm4]
systems: [] systems: []
files: [] files: []
notes: > notes: >
Fantasy game console for WebAssembly. 160x160 display, 4-color palette, WASM-4 is a low-level fantasy game console for building small games with
1024 bytes persistent storage. Self-contained runtime, no external file WebAssembly. It provides a fixed 160x160 display, 4-color palette, gamepad
dependencies. Libretro backend is in the upstream repo (no separate fork). input, and 1024 bytes of persistent storage. Games are standalone .wasm
cartridges. The runtime is fully self-contained with no external file
dependencies. No BIOS or system directory files required.
+38 -47
View File
@@ -1,92 +1,83 @@
emulator: "X Millennium" emulator: "X Millennium"
type: libretro type: libretro
core_classification: community_fork
source: "https://github.com/libretro/xmil-libretro" source: "https://github.com/libretro/xmil-libretro"
upstream: "http://amethyst.yui.ne.jp/svn/x1/xmil/trunk/" profiled_date: "2026-03-18"
profiled_date: "2026-03-25" core_version: "0.60"
core_version: "0.60a"
display_name: "Sharp X1 (X Millennium)" display_name: "Sharp X1 (X Millennium)"
cores: cores:
- x1 - x1
systems: systems:
- sharp-x1 - sharp-x1
# X Millennium (XMIL) is a Sharp X1 series emulator by yui, ported to libretro # X Millennium (XMIL) is a Sharp X1 series emulator by yui. The libretro port
# by r-type. Supports X1, X1 Turbo, and X1 TurboZ models via the "X1_ROMTYPE" # supports X1, X1 Turbo, and X1 TurboZ models via the "X1_ROMTYPE" core option
# core option (X1 = ROM_TYPE 1, TURBO = 2, TURBOZ = 3). # (values: X1, TURBO, TURBOZ; default: X1 = ROM_TYPE 1).
#
# SUPPORT_TURBOZ is not compiled in the libretro build (compiler.h), so TurboZ
# extended color modes are unavailable. ROM_TYPE 3 still selects IPLROM.X1T.
# #
# All system files go under: <system_dir>/xmil/ # All system files go under: <system_dir>/xmil/
# retro_init() builds: retro_system_conf = "<system_dir>/xmil" (libretro.c:597) # (libretro.c:597 builds the path as "<system_dir>/xmil")
# #
# IPL ROM loading (memio.c:87-121): # IPL ROM loading (memio.c:88-116):
# biosmem is initialized with defaultiplrom (575-byte boot stub from defipl.res). # ROM_TYPE 0: uses built-in default IPL (575 bytes, basic boot stub from defipl.res)
# ROM_TYPE >= 1: loads external IPL ROM into biosmem, overwriting the stub. # ROM_TYPE 1 (X1): loads xmil/IPLROM.X1 (32 KB)
# ROM_TYPE 1 (X1): xmil/IPLROM.X1 # ROM_TYPE 2 (Turbo): loads xmil/IPLROM.X1T (32 KB)
# ROM_TYPE >= 2 (Turbo/TurboZ): xmil/IPLROM.X1T # ROM_TYPE 3 (TurboZ): loads xmil/IPLROM.X1T (32 KB, same file as Turbo)
# Path built explicitly: sprintf(rtmp, "%s%c%s", retro_system_conf, slash, iplfile) # If the file is missing, the core falls back to the built-in default IPL.
# If file missing, the 575-byte stub remains (limited boot capability).
# #
# Font loading (fontx1.c:69-122, font.c:89-127): # Font loading (font.c:90-127, fontx1.c:70-123):
# font_load(NULL, TRUE) called from pccore_initialize() (pccore.c:67). # font_load() calls x1fontread() which looks for font files using fontopen().
# Built-in defaults (defrom_ank, defrom_txt from fontdata.c) provide basic ASCII. # fontopen() resolves paths relative to the working directory (file_getcd()),
# x1fontread() tries to load external font files via fontopen(). # which in libretro context is the xmil subdirectory.
# Font path resolution uses file_getcd() which defaults to "./" in the libretro # Built-in defaults (defrom_ank, defrom_txt) are used for basic ASCII rendering.
# port (file_setcd() is never called). Upstream win9x/sdl2 calls file_setcd() # External font ROMs add full Japanese character support.
# to set the working dir. Fonts may not be found from xmil/ in practice.
# #
# .info declares firmware_count=2 (IPL ROMs only). Font files are not declared. # The .info file only lists IPLROM.X1 and IPLROM.X1T as required BIOS files.
# .info firmware1_desc incorrectly says "8x8 Font ROM" (actually Turbo IPL ROM). # Font ROMs are optional -- the core renders basic text without them but Japanese
# kanji display requires the external font files.
notes: | notes: |
Place all files in: <system_dir>/xmil/ Place all files in: <system_dir>/xmil/
The core selects between IPLROM.X1 and IPLROM.X1T based on the "X1_ROMTYPE" The core selects between IPLROM.X1 and IPLROM.X1T based on the "X1_ROMTYPE"
core option. A 575-byte built-in IPL stub provides limited boot without the core option. A built-in fallback IPL exists but lacks full boot functionality.
real ROMs. Font files add Japanese character support; the libretro port has a Font files are optional; without them, kanji/JIS characters won't render.
path resolution quirk where fonts are searched in "./" instead of "xmil/"
(missing file_setcd call).
files: files:
# -- IPL ROMs --
- name: IPLROM.X1 - name: IPLROM.X1
path: xmil/IPLROM.X1 path: xmil/IPLROM.X1
size: 32768 size: 32768
required: false md5: eeeea1cd29c6e0e8b094790ae969bfa7
hle_fallback: true required: true
description: "X1 IPL ROM. Loaded when ROM_TYPE=1 (X1 model)." note: "X1 IPL ROM (32 KB). Loaded when ROM_TYPE=1 (X1 model). Listed in .info."
source_ref: "io/memio.c:82,96-108" source_ref: "io/memio.c:82,96-103"
- name: IPLROM.X1T - name: IPLROM.X1T
path: xmil/IPLROM.X1T path: xmil/IPLROM.X1T
size: 32768 size: 32768
required: false md5: 851e4a5936f17d13f8c39a980cf00d77
hle_fallback: true required: true
description: "X1 Turbo/TurboZ IPL ROM. Loaded when ROM_TYPE=2 or 3." note: "X1 Turbo/TurboZ IPL ROM (32 KB). Loaded when ROM_TYPE=2 or 3. Listed in .info."
source_ref: "io/memio.c:83,97-108" source_ref: "io/memio.c:83,97-99"
# -- Font ROMs (optional, for Japanese text rendering) --
- name: FNT0808.X1 - name: FNT0808.X1
path: xmil/FNT0808.X1 path: xmil/FNT0808.X1
size: 2048 size: 2048
validation: [size]
required: false required: false
hle_fallback: true note: "8x8 ANK font ROM (2 KB). Provides half-width ASCII/kana characters."
description: "8x8 ANK font ROM. Built-in defrom_ank fallback provides basic ASCII."
source_ref: "font/fontdata.c:6, font/fontx1.c:79-87" source_ref: "font/fontdata.c:6, font/fontx1.c:79-87"
- name: FNT0816.X1 - name: FNT0816.X1
path: xmil/FNT0816.X1 path: xmil/FNT0816.X1
size: 4096 size: 4096
validation: [size]
required: false required: false
hle_fallback: true note: "8x16 ANK font ROM (4 KB). Provides taller half-width characters for text mode."
description: "8x16 ANK font ROM. Built-in fallback derived from defrom_ank/defrom_txt."
source_ref: "font/fontdata.c:7, font/fontx1.c:89-103" source_ref: "font/fontdata.c:7, font/fontx1.c:89-103"
- name: FNT1616.X1 - name: FNT1616.X1
path: xmil/FNT1616.X1 path: xmil/FNT1616.X1
size: 306176 size: 306176
validation: [size]
required: false required: false
description: "16x16 Kanji font ROM. No built-in kanji data (zeroed). Required for Japanese text." note: "16x16 Kanji font ROM (~299 KB). Full JIS kanji character set for Japanese text."
source_ref: "font/fontdata.c:8, font/fontx1.c:105-120" source_ref: "font/fontdata.c:8, font/fontx1.c:105-120"
+14 -175
View File
@@ -1,181 +1,20 @@
emulator: x64sdl emulator: x64sdl
type: libretro type: libretro
core_classification: community_fork source: "https://github.com/libretro/vice-libretro"
source: "https://github.com/r-type/sdlvice-libretro" profiled_date: "2026-03-18"
upstream: "https://sourceforge.net/projects/vice-emu/" core_version: "v3.1"
profiled_date: "2026-03-25"
core_version: "3.1"
display_name: "Commodore - C64 (VICE SDL)" display_name: "Commodore - C64 (VICE SDL)"
cores: [x64sdl] cores:
systems: [commodore-c64] - vice_x64
notes: > systems:
Old port of VICE 3.1 using an SDL-to-libretro shim (r-type/sdlvice-libretro). - commodore-c64
Separate codebase from the newer vice-libretro port. Marked experimental and
superseded. Unlike the newer port, this core does NOT embed system ROMs; all ROMs
must be on disk in <system_dir>/data/C64/ and <system_dir>/data/DRIVES/.
The .info declares firmware_count=0 which is incorrect. No JiffyDOS support.
No save states, no netplay, no cheats.
files: notes: |
# C64 system ROMs (required, path: data/C64/) Alias for the VICE x64 core. x64sdl is an alternate build name
- name: "kernal" referencing the SDL-based VICE x64 Commodore 64 emulator. In the
description: "C64 Kernal ROM" libretro ecosystem this maps to the same vice_x64 core binary.
required: true
size: 8192
path: "data/C64/kernal"
source_ref: "src/c64/c64rom.c:133, src/c64/c64-resources.c:255"
- name: "basic" See vice.yml for full ROM and BIOS details. All standard ROMs are
description: "C64 BASIC ROM" embedded in the core binary.
required: true
size: 8192
path: "data/C64/basic"
source_ref: "src/c64/c64rom.c:192, src/c64/c64-resources.c:258"
- name: "chargen" files: []
description: "C64 character generator ROM"
required: true
size: 4096
path: "data/C64/chargen"
source_ref: "src/c64/c64rom.c:207, src/c64/c64-resources.c:252"
# C64 variant kernals (optional, for alternate models via c64model.c)
- name: "sxkernal"
description: "SX-64 Kernal ROM"
required: false
size: 8192
path: "data/C64/sxkernal"
source_ref: "src/c64/c64model.c:142,147"
notes: "Loaded when SX64 PAL or SX64 NTSC model selected."
- name: "jpkernal"
description: "Japanese C64 Kernal ROM"
required: false
size: 8192
path: "data/C64/jpkernal"
source_ref: "src/c64/c64model.c:152"
notes: "Loaded when C64 JAP NTSC model selected."
- name: "jpchrgen"
description: "Japanese C64 character generator ROM"
required: false
size: 4096
path: "data/C64/jpchrgen"
source_ref: "src/c64/c64model.c:152"
notes: "Loaded when C64 JAP NTSC model selected."
- name: "gskernal"
description: "C64 Games System Kernal ROM"
required: false
size: 8192
path: "data/C64/gskernal"
source_ref: "src/c64/c64model.c:157"
notes: "Loaded when C64 GS PAL model selected."
- name: "edkernal"
description: "PET64/Educator64 Kernal ROM"
required: false
size: 8192
path: "data/C64/edkernal"
source_ref: "src/c64/c64model.c:162,167"
notes: "Loaded when PET64 PAL or PET64 NTSC model selected."
# IEC drive ROMs (optional, path: data/DRIVES/)
- name: "dos1540"
description: "1540 floppy drive ROM"
required: false
path: "data/DRIVES/dos1540"
source_ref: "src/drive/iec/iecrom.c:99, src/drive/iec/iec-resources.c:182"
notes: "Hardware-level 1540 drive emulation. Absence disables this drive type."
- name: "dos1541"
description: "1541 floppy drive ROM"
required: false
path: "data/DRIVES/dos1541"
source_ref: "src/drive/iec/iecrom.c:106, src/drive/iec/iec-resources.c:185"
notes: "Hardware-level 1541 drive emulation. Most common C64 drive."
- name: "d1541II"
description: "1541-II floppy drive ROM"
required: false
path: "data/DRIVES/d1541II"
source_ref: "src/drive/iec/iecrom.c:113, src/drive/iec/iec-resources.c:187"
- name: "dos1570"
description: "1570 floppy drive ROM"
required: false
path: "data/DRIVES/dos1570"
source_ref: "src/drive/iec/iecrom.c:121, src/drive/iec/iec-resources.c:189"
- name: "dos1571"
description: "1571 floppy drive ROM"
required: false
path: "data/DRIVES/dos1571"
source_ref: "src/drive/iec/iecrom.c:127, src/drive/iec/iec-resources.c:191"
- name: "dos1581"
description: "1581 floppy drive ROM"
required: false
path: "data/DRIVES/dos1581"
source_ref: "src/drive/iec/iecrom.c:133, src/drive/iec/iec-resources.c:193"
- name: "dos2000"
description: "CMD FD-2000 drive ROM"
required: false
path: "data/DRIVES/dos2000"
source_ref: "src/drive/iec/iecrom.c:139, src/drive/iec/iec-resources.c:195"
notes: "Not shipped with VICE 3.1 data files."
- name: "dos4000"
description: "CMD FD-4000 drive ROM"
required: false
path: "data/DRIVES/dos4000"
source_ref: "src/drive/iec/iecrom.c:145, src/drive/iec/iec-resources.c:197"
notes: "Not shipped with VICE 3.1 data files."
# IEEE drive ROMs (optional, path: data/DRIVES/)
- name: "dos2031"
description: "2031 IEEE drive ROM"
required: false
path: "data/DRIVES/dos2031"
source_ref: "src/drive/ieee/ieee.c:115, src/drive/ieee/ieee-resources.c:93"
notes: "IEEE488 interface drive. Requires parallel IEEE488 extension."
- name: "dos2040"
description: "2040 IEEE drive ROM"
required: false
path: "data/DRIVES/dos2040"
source_ref: "src/drive/ieee/ieee.c:116, src/drive/ieee/ieee-resources.c:96"
- name: "dos3040"
description: "3040 IEEE drive ROM"
required: false
path: "data/DRIVES/dos3040"
source_ref: "src/drive/ieee/ieee.c:117, src/drive/ieee/ieee-resources.c:98"
- name: "dos4040"
description: "4040 IEEE drive ROM"
required: false
path: "data/DRIVES/dos4040"
source_ref: "src/drive/ieee/ieee.c:118, src/drive/ieee/ieee-resources.c:100"
- name: "dos1001"
description: "1001/8050/8250 IEEE drive ROM"
required: false
path: "data/DRIVES/dos1001"
source_ref: "src/drive/ieee/ieee.c:119, src/drive/ieee/ieee-resources.c:102"
# Printer ROMs (optional, path: data/PRINTER/)
- name: "mps803"
description: "MPS-803 printer character ROM"
required: false
path: "data/PRINTER/mps803"
source_ref: "src/printerdrv/drv-mps803.c:420"
notes: "Loaded on demand when MPS-803 printer opened."
- name: "nl10-cbm"
description: "NL10 printer ROM"
required: false
path: "data/PRINTER/nl10-cbm"
source_ref: "src/printerdrv/drv-nl10.c:2210"
notes: "Loaded on demand when NL10 printer opened."
+1 -3
View File
@@ -1,9 +1,7 @@
emulator: XRick emulator: XRick
type: libretro type: libretro
core_classification: game_engine
source: "https://github.com/libretro/xrick-libretro" source: "https://github.com/libretro/xrick-libretro"
upstream: "https://github.com/fabiensanglard/xrick" profiled_date: "2026-03-18"
profiled_date: "2026-03-25"
core_version: "1.0.0.6" core_version: "1.0.0.6"
display_name: "Rick Dangerous (XRick)" display_name: "Rick Dangerous (XRick)"
cores: cores:
+6 -53
View File
@@ -1,55 +1,8 @@
emulator: yabasanshiro emulator: "yabasanshiro"
type: libretro type: alias
core_classification: official_port alias_of: "kronos"
source: "https://github.com/libretro/yabause/tree/yabasanshiro" profiled_date: "2026-03-18"
upstream: "https://github.com/devmiyax/yabause"
profiled_date: "2026-03-25"
core_version: "v2.6.8" core_version: "v2.6.8"
display_name: "Sega - Saturn (YabaSanshiro)" display_name: "Sega - Saturn (YabaSanshiro)"
cores: note: "This core uses the same BIOS/firmware as kronos. See emulators/kronos.yml for details."
- yabasanshiro files: []
systems:
- sega-saturn
notes: |
YabaSanshiro is a Sega Saturn emulator by devmiyax, forked from Yabause.
Requires OpenGL 3.3 or OpenGL ES 3.0.
Saturn BIOS search order:
1. {system}/saturn_bios.bin
2. {system}/sega_101.bin
3. {system}/mpr-17933.bin
First file found wins. Real BIOS required for normal operation.
HLE available via yabasanshiro_force_hle_bios core option (deprecated,
debug only).
Addon cartridges: 1M/4M RAM expansion via core option (no files needed).
ROM cartridge and MPEG card ROM loading disabled in libretro port
(cartpath = empty, mpegpath = NULL).
BIOS loading: libretro.c retro_load_game() lines 1048-1069.
Core load: memory.c LoadBios() line 1353, T123Load() memory.h lines 219-280.
files:
- name: "saturn_bios.bin"
system: sega-saturn
required: true
hle_fallback: true
note: "Primary Saturn BIOS. Any region accepted."
source_ref: "libretro.c:1048"
- name: "sega_101.bin"
system: sega-saturn
region: [japan]
required: false
hle_fallback: true
note: "Saturn BIOS v1.01 (Japan). Fallback if saturn_bios.bin missing."
source_ref: "libretro.c:1052"
- name: "mpr-17933.bin"
system: sega-saturn
region: [north-america, europe]
required: false
hle_fallback: true
note: "Saturn BIOS v1.003 (NA/EU). Last fallback."
source_ref: "libretro.c:1056"
+6 -59
View File
@@ -1,61 +1,8 @@
emulator: yabause emulator: "yabause"
type: libretro type: alias
core_classification: community_fork alias_of: "kronos"
source: "https://github.com/libretro/yabause" profiled_date: "2026-03-18"
upstream: "https://github.com/Yabause/yabause"
profiled_date: "2026-03-25"
core_version: "v0.9.15" core_version: "v0.9.15"
display_name: "Sega - Saturn (Yabause)" display_name: "Sega - Saturn (Yabause)"
cores: note: "This core uses the same BIOS/firmware as kronos. See emulators/kronos.yml for details."
- yabause files: []
systems:
- sega-saturn
notes: |
Yabause is a software-rendered Sega Saturn emulator. Upstream project is
dead; libretro port maintained by the community on the master branch of
libretro/yabause.
Saturn BIOS search order:
1. {system}/saturn_bios.bin
2. {system}/sega_101.bin
3. {system}/mpr-17933.bin
First file found wins. HLE BIOS available via yabause_force_hle_bios core
option (reduced compatibility). Multi-disc (m3u) requires real BIOS.
Addon cartridges: 1M/4M RAM expansion via core option (no files needed).
ROM cartridge loading, SH1 ROM (CD Block LLE), and MPEG card ROM are
standalone-only features disabled in the libretro port.
BIOS loading: libretro.c retro_load_game() lines 1035-1049.
Core load: memory.c LoadBios() line 1260, T123Load() memory.h lines 196-264.
files:
- name: "saturn_bios.bin"
system: sega-saturn
required: true
hle_fallback: true
max_size: 524288
validation: [max_size]
note: "Primary Saturn BIOS. Any region accepted."
source_ref: "libretro.c:1035"
- name: "sega_101.bin"
system: sega-saturn
region: [japan]
required: false
hle_fallback: true
max_size: 524288
validation: [max_size]
note: "Saturn BIOS v1.01 (Japan). Fallback if saturn_bios.bin missing."
source_ref: "libretro.c:1039"
- name: "mpr-17933.bin"
system: sega-saturn
region: [north-america, europe]
required: false
hle_fallback: true
max_size: 524288
validation: [max_size]
note: "Saturn BIOS (NA/EU). Last fallback."
source_ref: "libretro.c:1043"
-72
View File
@@ -1,72 +0,0 @@
emulator: ymir
type: standalone + libretro
core_classification: community_fork
source: "https://github.com/warmenhoven/Ymir/tree/libretro"
upstream: "https://github.com/StrikerX3/Ymir"
profiled_date: "2026-03-25"
core_version: "PR#746"
display_name: "Sega - Saturn (Ymir)"
cores:
- ymir
systems:
- sega-saturn
notes: |
Ymir is a Sega Saturn emulator by StrikerX3. The libretro port by
warmenhoven wraps the shared ymir-core library (PR #746, not yet merged).
No .info file exists in libretro-core-info.
Saturn BIOS search order:
1. {system}/sega_101.bin
2. {system}/mpr-17933.bin
3. {system}/saturn_bios.bin
First file found with exact 512 KiB size wins. No HLE fallback for IPL.
CD Block LLE: optional low-level CD drive emulation. Scans {system}/cdb/
for any 64 KiB file. Falls back to HLE when disabled or no ROM found.
Known versions in upstream db: 1.04, 1.05, 1.06.
ROM cartridges: KoF95 and Ultraman shipped with physical ROM carts. The
core auto-detects required cartridge from its game database.
Addon cartridges: 1M/4M DRAM expansion handled via core option (no files).
Upstream uses XXH128 hashes for ROM identification only, not validation.
All file loading validates size only.
files:
- name: "sega_101.bin"
system: sega-saturn
required: true
size: 524288
validation: [size]
aliases: [mpr-17933.bin, saturn_bios.bin]
description: "Saturn IPL ROM (BIOS). Any region accepted."
source_ref: "libretro.cpp:260-263,534-558"
- name: "cdb/cdb_rom.bin"
system: sega-saturn
required: false
hle_fallback: true
size: 65536
validation: [size]
description: "SH1 CD Block ROM for low-level CD drive emulation. Core scans cdb/ subdirectory for any matching file."
source_ref: "libretro.cpp:567-591"
- name: "mpr-18811-mx.ic1"
system: sega-saturn
required: false
category: game_data
size: 2097152
validation: [size]
description: "ROM cartridge for The King of Fighters '95."
source_ref: "libretro.cpp:619-620,597-616"
- name: "mpr-19367-mx.ic1"
system: sega-saturn
required: false
category: game_data
size: 2097152
validation: [size]
description: "ROM cartridge for Ultraman: Hikari no Kyojin Densetsu."
source_ref: "libretro.cpp:619,621,597-616"
+122 -240
View File
@@ -24,7 +24,6 @@ theme:
- navigation.tabs - navigation.tabs
- navigation.sections - navigation.sections
- navigation.top - navigation.top
- navigation.indexes
- search.suggest - search.suggest
- search.highlight - search.highlight
- content.tabs.link - content.tabs.link
@@ -33,13 +32,8 @@ markdown_extensions:
- tables - tables
- admonition - admonition
- attr_list - attr_list
- md_in_html
- toc: - toc:
permalink: true permalink: true
- pymdownx.details
- pymdownx.superfences
- pymdownx.tabbed:
alternate_style: true
plugins: plugins:
- search - search
nav: nav:
@@ -52,7 +46,6 @@ nav:
- Recalbox: platforms/recalbox.md - Recalbox: platforms/recalbox.md
- RetroArch: platforms/retroarch.md - RetroArch: platforms/retroarch.md
- RetroBat: platforms/retrobat.md - RetroBat: platforms/retrobat.md
- RetroDECK: platforms/retrodeck.md
- RetroPie: platforms/retropie.md - RetroPie: platforms/retropie.md
- Systems: - Systems:
- Overview: systems/index.md - Overview: systems/index.md
@@ -63,7 +56,6 @@ nav:
- Apple: systems/apple.md - Apple: systems/apple.md
- Arcade: systems/arcade.md - Arcade: systems/arcade.md
- Atari: systems/atari.md - Atari: systems/atari.md
- BBK: systems/bbk.md
- Bally: systems/bally.md - Bally: systems/bally.md
- Bandai: systems/bandai.md - Bandai: systems/bandai.md
- Bit Corporation: systems/bit-corporation.md - Bit Corporation: systems/bit-corporation.md
@@ -87,27 +79,20 @@ nav:
- GamePark: systems/gamepark.md - GamePark: systems/gamepark.md
- Grundy: systems/grundy.md - Grundy: systems/grundy.md
- Hartung: systems/hartung.md - Hartung: systems/hartung.md
- IBM: systems/ibm.md
- Id Software: systems/id-software.md - Id Software: systems/id-software.md
- Infocom: systems/infocom.md - Infocom: systems/infocom.md
- Java: systems/java.md - Java: systems/java.md
- Jupiter: systems/jupiter.md
- Lambda: systems/lambda.md
- Lexaloffle: systems/lexaloffle.md
- Magnavox: systems/magnavox.md - Magnavox: systems/magnavox.md
- Mattel: systems/mattel.md - Mattel: systems/mattel.md
- Microdigital: systems/microdigital.md
- Microsoft: systems/microsoft.md - Microsoft: systems/microsoft.md
- NEC: systems/nec.md - NEC: systems/nec.md
- Nintendo: systems/nintendo.md - Nintendo: systems/nintendo.md
- Nokia: systems/nokia.md - Nokia: systems/nokia.md
- Oric: systems/oric.md - Oric: systems/oric.md
- Other: systems/other.md
- Palm: systems/palm.md - Palm: systems/palm.md
- Philips: systems/philips.md - Philips: systems/philips.md
- Pioneer: systems/pioneer.md - Pioneer: systems/pioneer.md
- RPG Maker: systems/rpg-maker.md - RPG Maker: systems/rpg-maker.md
- Ringo: systems/ringo.md
- SNK: systems/snk.md - SNK: systems/snk.md
- ScummVM: systems/scummvm.md - ScummVM: systems/scummvm.md
- Sega: systems/sega.md - Sega: systems/sega.md
@@ -118,7 +103,6 @@ nav:
- Tandy: systems/tandy.md - Tandy: systems/tandy.md
- Texas Instruments: systems/texas-instruments.md - Texas Instruments: systems/texas-instruments.md
- Tiger: systems/tiger.md - Tiger: systems/tiger.md
- Timex: systems/timex.md
- Tomy: systems/tomy.md - Tomy: systems/tomy.md
- VTech: systems/vtech.md - VTech: systems/vtech.md
- Videoton: systems/videoton.md - Videoton: systems/videoton.md
@@ -127,294 +111,192 @@ nav:
- xrick: systems/xrick.md - xrick: systems/xrick.md
- Emulators: - Emulators:
- Overview: emulators/index.md - Overview: emulators/index.md
- Official ports (60): - '2048': emulators/2048.md
- amiarcadia: emulators/amiarcadia.md - 3DEngine: emulators/3dengine.md
- Amiberry: emulators/amiberry.md
- Ardens: emulators/ardens.md
- Atari800: emulators/atari800.md
- BlastEm: emulators/blastem.md
- Boytacean: emulators/boytacean.md
- bsnes: emulators/bsnes.md
- ClownMDEmu: emulators/clownmdemu.md
- CrocoDS: emulators/crocods.md
- DirkSimple: emulators/dirksimple.md
- DuckStation: emulators/duckstation.md
- emux (CHIP-8): emulators/emux_chip8.md
- emux (Game Boy): emulators/emux_gb.md
- emux (NES): emulators/emux_nes.md
- emux (SMS): emulators/emux_sms.md
- FinalBurn Neo: emulators/fbneo.md
- FinalBurn Neo (CPS-1/CPS-2): emulators/fbneo_cps12.md
- FinalBurn Neo (Neo Geo): emulators/fbneo_neogeo.md
- fixGB: emulators/fixgb.md
- fixNES: emulators/fixnes.md
- Flycast: emulators/flycast.md
- FreeJ2ME: emulators/freej2me.md
- galaksija: emulators/galaksija.md
- Gearboy: emulators/gearboy.md
- Gearcoleco: emulators/gearcoleco.md
- Geargrafx: emulators/geargrafx.md
- Gearlynx: emulators/gearlynx.md
- Gearsystem: emulators/gearsystem.md
- Geolith: emulators/geolith.md
- Holani: emulators/holani.md
- JAXE: emulators/jaxe.md
- JollyCV: emulators/jollycv.md
- Kronos: emulators/kronos.md
- LowRes NX: emulators/lowresnx.md
- M2000: emulators/m2000.md
- MAME: emulators/mame.md
- MAME Arcade: emulators/mamearcade.md
- MAME MESS: emulators/mamemess.md
- Mesen: emulators/mesen.md
- mesen-s: emulators/mesen-s.md
- mGBA: emulators/mgba.md
- Mr.Boom: emulators/mrboom.md
- Panda3DS: emulators/panda3ds.md
- PicoDrive: emulators/picodrive.md
- play: emulators/play.md
- PPSSPP: emulators/ppsspp.md
- Rustation: emulators/rustation.md
- RVVM: emulators/rvvm.md
- SameBoy: emulators/sameboy.md
- sameduck: emulators/sameduck.md
- SDLPAL: emulators/sdlpal.md
- skyemu: emulators/skyemu.md
- snes9x: emulators/snes9x.md
- SquirrelJME: emulators/squirreljme.md
- VaporSpec: emulators/vaporspec.md
- VBA-M: emulators/vbam.md
- VeMUlator: emulators/vemulator.md
- Vircon32: emulators/vircon32.md
- vitaQuakeII: emulators/vitaquake2.md
- yabasanshiro: emulators/yabasanshiro.md
- Community forks (104):
- EightyOne: emulators/81.md - EightyOne: emulators/81.md
- a5200: emulators/a5200.md - a5200: emulators/a5200.md
- amiarcadia: emulators/amiarcadia.md
- Anarch: emulators/anarch.md - Anarch: emulators/anarch.md
- AppleWin: emulators/applewin.md - AppleWin: emulators/applewin.md
- Azahar: emulators/azahar.md - Ardens: emulators/ardens.md
- Arduous: emulators/arduous.md
- Atari800: emulators/atari800.md
- b2: emulators/b2.md - b2: emulators/b2.md
- Beetle Lynx (Mednafen Lynx): emulators/beetle_lynx.md - Beetle Lynx (Mednafen Lynx): emulators/beetle_lynx.md
- Beetle NGP (Mednafen Neo Geo Pocket): emulators/beetle_ngp.md - Beetle NGP (Mednafen Neo Geo Pocket): emulators/beetle_ngp.md
- Beetle PCE (Mednafen PCE): emulators/beetle_pce.md - Beetle PCE (Mednafen PCE): emulators/beetle_pce.md
- Beetle PC-FX (Mednafen): emulators/beetle_pcfx.md - Beetle PC-FX (Mednafen): emulators/beetle_pcfx.md
- Beetle PSX (Mednafen PSX): emulators/beetle_psx.md - Beetle PSX (Mednafen PSX): emulators/beetle_psx.md
- beetle_saturn: emulators/beetle_saturn.md - Beetle Saturn (Mednafen): emulators/beetle_saturn.md
- Beetle VB (Mednafen Virtual Boy): emulators/beetle_vb.md - Beetle VB (Mednafen Virtual Boy): emulators/beetle_vb.md
- Beetle WonderSwan (Mednafen WonderSwan): emulators/beetle_wswan.md
- BennuGD: emulators/bennugd.md - BennuGD: emulators/bennugd.md
- bk-emulator: emulators/bk.md - bk-emulator: emulators/bk.md
- BlastEm: emulators/blastem.md
- blueMSX: emulators/bluemsx.md - blueMSX: emulators/bluemsx.md
- bsnes-jg: emulators/bsnes-jg.md - bnes: emulators/bnes.md
- boom3: emulators/boom3.md
- Boytacean: emulators/boytacean.md
- bsnes: emulators/bsnes.md
- Cannonball: emulators/cannonball.md
- Caprice32: emulators/cap32.md - Caprice32: emulators/cap32.md
- ChimeraSNES: emulators/chimerasnes.md - Cemu: emulators/cemu.md
- Citra: emulators/citra.md - ChaiLove: emulators/chailove.md
- Citra Canary: emulators/citra_canary.md - Citra / Lime3DS / Azahar: emulators/citra.md
- ClownMDEmu: emulators/clownmdemu.md
- Craft: emulators/craft.md
- CrocoDS: emulators/crocods.md
- Cruzes: emulators/cruzes.md
- Daphne: emulators/daphne.md - Daphne: emulators/daphne.md
- DeSmuME: emulators/desmume.md - DeSmuME: emulators/desmume.md
- DICE: emulators/dice.md - DICE: emulators/dice.md
- Dinothawr: emulators/dinothawr.md
- DirectXBox: emulators/directxbox.md
- Dolphin: emulators/dolphin.md - Dolphin: emulators/dolphin.md
- DOSBox: emulators/dosbox.md - Dolphin Launcher: emulators/dolphin_launcher.md
- DOSBox-core: emulators/dosbox_core.md - DOSBox-core: emulators/dosbox_core.md
- DOSBox-SVN: emulators/dosbox_svn.md - DOSBox Pure: emulators/dosbox_pure.md
- DOSBox-SVN CE: emulators/dosbox_svn_ce.md - DoubleCherryGB: emulators/doublecherrygb.md
- doukutsu-rs: emulators/doukutsu_rs.md
- DuckStation: emulators/duckstation.md
- EasyRPG Player: emulators/easyrpg.md
- ECWolf: emulators/ecwolf.md
- EmuSCV: emulators/emuscv.md - EmuSCV: emulators/emuscv.md
- ep128emu_core: emulators/ep128emu_core.md - emux (CHIP-8): emulators/emux_chip8.md
- ep128emu-core: emulators/ep128emu.md
- FAKE-08: emulators/fake08.md
- FinalBurn Neo: emulators/fbneo.md
- FCEUmm: emulators/fceumm.md - FCEUmm: emulators/fceumm.md
- FFmpeg: emulators/ffmpeg.md
- fixGB: emulators/fixgb.md
- Flycast: emulators/flycast.md
- fMSX: emulators/fmsx.md - fMSX: emulators/fmsx.md
- FreeChaF: emulators/freechaf.md
- FreeIntv: emulators/freeintv.md
- FreeIntv (Touchscreen Overlay): emulators/freeintv_ts_overlay.md
- FreeJ2ME: emulators/freej2me.md
- Frodo: emulators/frodo.md - Frodo: emulators/frodo.md
- FS-UAE: emulators/fsuae.md
- Fuse: emulators/fuse.md - Fuse: emulators/fuse.md
- galaksija: emulators/galaksija.md
- GAM4980: emulators/gam4980.md
- Gambatte: emulators/gambatte.md - Gambatte: emulators/gambatte.md
- Gearcoleco: emulators/gearcoleco.md
- Geargrafx: emulators/geargrafx.md
- Gearlynx: emulators/gearlynx.md
- Gearsystem: emulators/gearsystem.md
- Genesis Plus GX: emulators/genesis_plus_gx.md - Genesis Plus GX: emulators/genesis_plus_gx.md
- Geolith: emulators/geolith.md
- Game Music Emu: emulators/gme.md
- Gong: emulators/gong.md
- gpSP: emulators/gpsp.md - gpSP: emulators/gpsp.md
- Game & Watch: emulators/gw.md
- Handy: emulators/handy.md - Handy: emulators/handy.md
- higan (SFC Accuracy): emulators/higan_sfc.md - Hatari: emulators/hatari.md
- LRPS2: emulators/lrps2.md - HBMAME (Homebrew MAME): emulators/hbmame.md
- mednafen_pce: emulators/mednafen_pce.md - Holani: emulators/holani.md
- mednafen_pce_fast: emulators/mednafen_pce_fast.md - Image Viewer: emulators/imageviewer.md
- mednafen_supafaust: emulators/mednafen_supafaust.md - Ishiiruka: emulators/ishiiruka.md
- mednafen_supergrafx: emulators/mednafen_supergrafx.md - JAXE: emulators/jaxe.md
- melonDS: emulators/melonds.md - JollyCV: emulators/jollycv.md
- melonDS DS: emulators/melonds_ds.md - Jump 'n Bump: emulators/jumpnbump.md
- Kronos: emulators/kronos.md
- LowRes NX: emulators/lowresnx.md
- Lutro: emulators/lutro.md
- M2000: emulators/m2000.md
- MAME 2003-Plus: emulators/mame2003_plus.md
- MAME 2010: emulators/mame2010.md
- MAME 2016: emulators/mame2016.md
- MCSoftserve: emulators/mcsoftserve.md
- MelonDS: emulators/melonds.md
- Mesen: emulators/mesen.md
- Meteor GBA: emulators/meteor.md - Meteor GBA: emulators/meteor.md
- mGBA: emulators/mgba.md
- Mini vMac: emulators/minivmac.md - Mini vMac: emulators/minivmac.md
- mkxp-z: emulators/mkxp_z.md
- MojoZork: emulators/mojozork.md
- Moonlight: emulators/moonlight.md - Moonlight: emulators/moonlight.md
- mpv: emulators/mpv.md - mpv: emulators/mpv.md
- nekop2: emulators/nekop2.md - Mr.Boom: emulators/mrboom.md
- nes: emulators/nes.md - Mu: emulators/mu.md
- Mupen64Plus-Next: emulators/mupen64plus.md
- NeoCD: emulators/neocd.md
- Nestopia UE: emulators/nestopia.md - Nestopia UE: emulators/nestopia.md
- NooDS: emulators/noods.md - NooDS: emulators/noods.md
- NP2kai: emulators/np2kai.md
- Numero: emulators/numero.md - Numero: emulators/numero.md
- NXEngine: emulators/nxengine.md
- O2EM: emulators/o2em.md - O2EM: emulators/o2em.md
- Oberon: emulators/oberon.md - Oberon: emulators/oberon.md
- ONScripter: emulators/onscripter.md - ONScripter: emulators/onscripter.md
- ONScripter Yuri: emulators/onsyuri.md
- OpenLara: emulators/openlara.md
- OpenTyrian: emulators/opentyrian.md
- Opera (4DO): emulators/opera.md - Opera (4DO): emulators/opera.md
- ParaLLEl N64: emulators/parallel_n64.md - Panda3DS: emulators/panda3ds.md
- Pascal Pong: emulators/pascal_pong.md
- PCem: emulators/pcem.md - PCem: emulators/pcem.md
- PCSX1: emulators/pcsx1.md - PCSX2: emulators/pcsx2.md
- PCSX-ReARMed: emulators/pcsx_rearmed.md
- PD777: emulators/pd777.md - PD777: emulators/pd777.md
- PicoDrive: emulators/picodrive.md
- Play!: emulators/play.md
- PocketCDG: emulators/pocketcdg.md
- PokeMini: emulators/pokemini.md - PokeMini: emulators/pokemini.md
- Potator: emulators/potator.md - PPSSPP: emulators/ppsspp.md
- PrBoom: emulators/prboom.md
- ProSystem: emulators/prosystem.md - ProSystem: emulators/prosystem.md
- PUAE (P-UAE): emulators/puae.md - PUAE (P-UAE): emulators/puae.md
- PuzzleScript: emulators/puzzlescript.md
- px68k: emulators/px68k.md - px68k: emulators/px68k.md
- QEMU: emulators/qemu.md - QEMU: emulators/qemu.md
- QUASI88: emulators/quasi88.md - QUASI88: emulators/quasi88.md
- QuickNES: emulators/quicknes.md
- RACE (Neo Geo Pocket): emulators/race.md - RACE (Neo Geo Pocket): emulators/race.md
- Redbook: emulators/redbook.md
- REminiscence: emulators/reminiscence.md - REminiscence: emulators/reminiscence.md
- RemoteJoy: emulators/remotejoy.md
- Retro8: emulators/retro8.md
- RetroDream: emulators/retrodream.md - RetroDream: emulators/retrodream.md
- ROM Cleaner: emulators/romcleaner.md
- RPCS3: emulators/rpcs3.md
- Rustation: emulators/rustation.md
- RVVM: emulators/rvvm.md
- SAME CDi: emulators/same_cdi.md - SAME CDi: emulators/same_cdi.md
- SameBoy: emulators/sameboy.md
- ScummVM: emulators/scummvm.md
- SDLPAL: emulators/sdlpal.md
- SimCoupe: emulators/simcp.md - SimCoupe: emulators/simcp.md
- swanstation: emulators/swanstation.md - SMS Plus GX: emulators/smsplus.md
- snes9x: emulators/snes9x.md
- SquirrelJME: emulators/squirreljme.md
- Stella: emulators/stella.md
- Stone Soup: emulators/stonesoup.md
- Super Bros War: emulators/superbroswar.md
- Syobon Action: emulators/syobonaction.md - Syobon Action: emulators/syobonaction.md
- TamaLIBretro: emulators/tamalibretro.md - TamaLIBretro: emulators/tamalibretro.md
- TempGBA: emulators/tempgba.md - TempGBA: emulators/tempgba.md
- TGB Dual: emulators/tgbdual.md - TGB Dual: emulators/tgbdual.md
- trident: emulators/trident.md
- uae4arm: emulators/uae4arm.md
- UXN: emulators/uxn.md
- vecx: emulators/vecx.md
- VICE x128: emulators/vice_x128.md
- VICE x64: emulators/vice_x64.md
- VICE x64dtv: emulators/vice_x64dtv.md
- VICE x64sc: emulators/vice_x64sc.md
- VICE xcbm2: emulators/vice_xcbm2.md
- VICE xcbm5x0: emulators/vice_xcbm5x0.md
- VICE xpet: emulators/vice_xpet.md
- VICE xplus4: emulators/vice_xplus4.md
- VICE xscpu64: emulators/vice_xscpu64.md
- VICE xvic: emulators/vice_xvic.md
- Virtual Jaguar: emulators/virtualjaguar.md
- vitaQuakeIII: emulators/vitaquake3.md
- vitavoyager: emulators/vitavoyager.md
- X Millennium: emulators/x1.md
- x64sdl: emulators/x64sdl.md
- yabause: emulators/yabause.md
- ymir: emulators/ymir.md
- Pure libretro (29):
- '2048': emulators/2048.md
- 3DEngine: emulators/3dengine.md
- Arduous: emulators/arduous.md
- Beetle WonderSwan (Mednafen WonderSwan): emulators/beetle_wswan.md
- Craft: emulators/craft.md
- Cruzes: emulators/cruzes.md
- DirectXBox: emulators/directxbox.md
- FFmpeg: emulators/ffmpeg.md
- FreeChaF: emulators/freechaf.md
- FreeIntv: emulators/freeintv.md
- GAM4980: emulators/gam4980.md
- Game Music Emu: emulators/gme.md
- Gong: emulators/gong.md
- Game & Watch: emulators/gw.md
- Image Viewer: emulators/imageviewer.md
- MCSoftserve: emulators/mcsoftserve.md
- MojoZork: emulators/mojozork.md
- Mu: emulators/mu.md
- NeoCD: emulators/neocd.md
- Pascal Pong: emulators/pascal_pong.md
- PocketCDG: emulators/pocketcdg.md
- Redbook: emulators/redbook.md
- RemoteJoy: emulators/remotejoy.md
- ROM Cleaner: emulators/romcleaner.md
- Theodore: emulators/theodore.md - Theodore: emulators/theodore.md
- The Powder Toy: emulators/thepowdertoy.md - The Powder Toy: emulators/thepowdertoy.md
- MicroW8: emulators/uw8.md
- uzem: emulators/uzem.md
- VirtualXT: emulators/virtualxt.md
- Game engines (24):
- boom3: emulators/boom3.md
- Cannonball: emulators/cannonball.md
- ChaiLove: emulators/chailove.md
- Dinothawr: emulators/dinothawr.md
- doukutsu-rs: emulators/doukutsu_rs.md
- EasyRPG Player: emulators/easyrpg.md
- ECWolf: emulators/ecwolf.md
- FAKE-08: emulators/fake08.md
- Jump 'n Bump: emulators/jumpnbump.md
- Lutro: emulators/lutro.md
- mkxp-z: emulators/mkxp_z.md
- NXEngine: emulators/nxengine.md
- ONScripter Yuri: emulators/onsyuri.md
- OpenLara: emulators/openlara.md
- OpenTyrian: emulators/opentyrian.md
- PrBoom: emulators/prboom.md
- PuzzleScript: emulators/puzzlescript.md
- Retro8: emulators/retro8.md
- ScummVM: emulators/scummvm.md
- Super Bros War: emulators/superbroswar.md
- TIC-80: emulators/tic80.md - TIC-80: emulators/tic80.md
- TyrQuake: emulators/tyrquake.md - TyrQuake: emulators/tyrquake.md
- WASM-4: emulators/wasm4.md - MicroW8: emulators/uw8.md
- XRick: emulators/xrick.md - UXN: emulators/uxn.md
- Enhanced forks (12): - uzem: emulators/uzem.md
- bsnes-hd beta: emulators/bsnes_hd_beta.md - VaporSpec: emulators/vaporspec.md
- bsnes-mercury: emulators/bsnes_mercury.md
- DOSBox Pure: emulators/dosbox_pure.md
- DoubleCherryGB: emulators/doublecherrygb.md
- Genesis Plus GX Wide: emulators/genesis_plus_gx_wide.md
- HBMAME (Homebrew MAME): emulators/hbmame.md
- nSide (SFC Balanced): emulators/higan_sfc_balanced.md
- Ishiiruka: emulators/ishiiruka.md
- MAME 2003-Plus: emulators/mame2003_plus.md
- Mupen64Plus-Next: emulators/mupen64plus_next.md
- NP2kai: emulators/np2kai.md
- SMS Plus GX: emulators/smsplus.md
- Frozen snapshots (32):
- bnes: emulators/bnes.md
- bsnes 2014: emulators/bsnes2014.md
- bsnes C++98: emulators/bsnes_cplusplus98.md
- CDi 2015: emulators/cdi2015.md
- Citra 2018: emulators/citra2018.md
- DeSmuME 2015: emulators/desmume2015.md
- FB Alpha 2012: emulators/fbalpha2012.md
- FB Alpha 2012 CPS-1: emulators/fbalpha2012_cps1.md
- FB Alpha 2012 CPS-2: emulators/fbalpha2012_cps2.md
- FB Alpha 2012 CPS-3: emulators/fbalpha2012_cps3.md
- FB Alpha 2012 Neo Geo: emulators/fbalpha2012_neogeo.md
- Hatari: emulators/hatari.md
- MAME 2000: emulators/mame2000.md
- MAME 2003: emulators/mame2003.md
- MAME 2003 Midway: emulators/mame2003_midway.md
- MAME 2009: emulators/mame2009.md
- MAME 2010: emulators/mame2010.md
- MAME 2015: emulators/mame2015.md
- MAME 2016: emulators/mame2016.md
- mednafen_gba: emulators/mednafen_gba.md
- mednafen_snes: emulators/mednafen_snes.md
- MESS 2015: emulators/mess2015.md
- PUAE 2021: emulators/puae2021.md
- Snes9x 2002: emulators/snes9x2002.md
- Snes9x 2005: emulators/snes9x2005.md
- Snes9x 2005 Plus: emulators/snes9x2005_plus.md
- Snes9x 2010: emulators/snes9x2010.md
- Stella 2014: emulators/stella2014.md
- Stella 2023: emulators/stella2023.md
- Stone Soup: emulators/stonesoup.md
- UME 2015: emulators/ume2015.md
- VBA-Next: emulators/vba_next.md - VBA-Next: emulators/vba_next.md
- Embedded HLE (1): - vecx: emulators/vecx.md
- PCSX-ReARMed: emulators/pcsx_rearmed.md - VeMUlator: emulators/vemulator.md
- Launchers (1):
- Dolphin Launcher: emulators/dolphin_launcher.md
- Other (10):
- Beetle GBA (Mednafen): emulators/beetle_gba.md
- Cemu: emulators/cemu.md
- ep128emu-core: emulators/ep128emu.md
- PCSX2: emulators/pcsx2.md
- Redream: emulators/redream.md
- RPCS3: emulators/rpcs3.md
- VBA-M: emulators/vba_m.md
- VICE: emulators/vice.md - VICE: emulators/vice.md
- Vircon32: emulators/vircon32.md
- Virtual Jaguar: emulators/virtualjaguar.md
- VirtualXT: emulators/virtualxt.md
- Vita3K: emulators/vita3k.md - Vita3K: emulators/vita3k.md
- vitaQuakeII: emulators/vitaquake2.md
- vitaQuakeIII: emulators/vitaquake3.md
- WASM-4: emulators/wasm4.md
- X Millennium: emulators/x1.md
- x64sdl: emulators/x64sdl.md
- Xemu: emulators/xemu.md - Xemu: emulators/xemu.md
- Cross-reference: cross-reference.md - XRick: emulators/xrick.md
- Gap Analysis: gaps.md - Gap Analysis: gaps.md
- Wiki:
- Overview: wiki/index.md
- Architecture: wiki/architecture.md
- Tools: wiki/tools.md
- Profiling guide: wiki/profiling.md
- Data model: wiki/data-model.md
- Contributing: contributing.md - Contributing: contributing.md
+2 -74
View File
@@ -9,8 +9,6 @@ from __future__ import annotations
import hashlib import hashlib
import json import json
import os import os
import urllib.error
import urllib.request
import zipfile import zipfile
import zlib import zlib
from pathlib import Path from pathlib import Path
@@ -418,23 +416,16 @@ def group_identical_platforms(
"""Group platforms that produce identical packs (same files + base_destination). """Group platforms that produce identical packs (same files + base_destination).
Returns [(group_of_platform_names, representative), ...]. Returns [(group_of_platform_names, representative), ...].
The representative is the root platform (one that does not inherit).
""" """
fingerprints: dict[str, list[str]] = {} fingerprints: dict[str, list[str]] = {}
representatives: dict[str, str] = {} representatives: dict[str, str] = {}
inherits: dict[str, bool] = {}
for platform in platforms: for platform in platforms:
try: try:
raw_path = os.path.join(platforms_dir, f"{platform}.yml")
with open(raw_path) as f:
raw = yaml.safe_load(f) or {}
inherits[platform] = "inherits" in raw
config = load_platform_config(platform, platforms_dir) config = load_platform_config(platform, platforms_dir)
except FileNotFoundError: except FileNotFoundError:
fingerprints.setdefault(platform, []).append(platform) fingerprints.setdefault(platform, []).append(platform)
representatives.setdefault(platform, platform) representatives.setdefault(platform, platform)
inherits[platform] = False
continue continue
base_dest = config.get("base_destination", "") base_dest = config.get("base_destination", "")
@@ -449,16 +440,9 @@ def group_identical_platforms(
fp = hashlib.sha1("|".join(sorted(entries)).encode()).hexdigest() fp = hashlib.sha1("|".join(sorted(entries)).encode()).hexdigest()
fingerprints.setdefault(fp, []).append(platform) fingerprints.setdefault(fp, []).append(platform)
# Prefer the root platform (no inherits) as representative representatives.setdefault(fp, platform)
if fp not in representatives or (not inherits[platform] and inherits.get(representatives[fp], False)):
representatives[fp] = platform
result = [] return [(group, representatives[fp]) for fp, group in fingerprints.items()]
for fp, group in fingerprints.items():
rep = representatives[fp]
ordered = [rep] + [p for p in group if p != rep]
result.append((ordered, rep))
return result
def resolve_platform_cores( def resolve_platform_cores(
@@ -553,10 +537,8 @@ def _build_validation_index(profiles: dict) -> dict[str, dict]:
"min_size": None, "max_size": None, "min_size": None, "max_size": None,
"crc32": set(), "md5": set(), "sha1": set(), "sha256": set(), "crc32": set(), "md5": set(), "sha1": set(), "sha256": set(),
"adler32": set(), "crypto_only": set(), "adler32": set(), "crypto_only": set(),
"emulators": set(),
} }
sources[fname] = {} sources[fname] = {}
index[fname]["emulators"].add(emu_name)
index[fname]["checks"].update(checks) index[fname]["checks"].update(checks)
# Track non-reproducible crypto checks # Track non-reproducible crypto checks
index[fname]["crypto_only"].update( index[fname]["crypto_only"].update(
@@ -602,7 +584,6 @@ def _build_validation_index(profiles: dict) -> dict[str, dict]:
for v in index.values(): for v in index.values():
v["checks"] = sorted(v["checks"]) v["checks"] = sorted(v["checks"])
v["crypto_only"] = sorted(v["crypto_only"]) v["crypto_only"] = sorted(v["crypto_only"])
v["emulators"] = sorted(v["emulators"])
# Keep hash sets as frozensets for O(1) lookup in check_file_validation # Keep hash sets as frozensets for O(1) lookup in check_file_validation
return index return index
@@ -696,59 +677,6 @@ def filter_files_by_mode(files: list[dict], standalone: bool) -> list[dict]:
return result return result
LARGE_FILES_RELEASE = "large-files"
LARGE_FILES_REPO = "Abdess/retrobios"
LARGE_FILES_CACHE = ".cache/large"
def fetch_large_file(name: str, dest_dir: str = LARGE_FILES_CACHE,
expected_sha1: str = "", expected_md5: str = "") -> str | None:
"""Download a large file from the 'large-files' GitHub release if not cached."""
cached = os.path.join(dest_dir, name)
if os.path.exists(cached):
if expected_sha1 or expected_md5:
hashes = compute_hashes(cached)
if expected_sha1 and hashes["sha1"].lower() != expected_sha1.lower():
os.unlink(cached)
elif expected_md5:
md5_list = [m.strip().lower() for m in expected_md5.split(",") if m.strip()]
if hashes["md5"].lower() not in md5_list:
os.unlink(cached)
else:
return cached
else:
return cached
else:
return cached
encoded_name = urllib.request.quote(name)
url = f"https://github.com/{LARGE_FILES_REPO}/releases/download/{LARGE_FILES_RELEASE}/{encoded_name}"
try:
req = urllib.request.Request(url, headers={"User-Agent": "retrobios/1.0"})
with urllib.request.urlopen(req, timeout=300) as resp:
os.makedirs(dest_dir, exist_ok=True)
with open(cached, "wb") as f:
while True:
chunk = resp.read(65536)
if not chunk:
break
f.write(chunk)
except (urllib.error.URLError, urllib.error.HTTPError):
return None
if expected_sha1 or expected_md5:
hashes = compute_hashes(cached)
if expected_sha1 and hashes["sha1"].lower() != expected_sha1.lower():
os.unlink(cached)
return None
if expected_md5:
md5_list = [m.strip().lower() for m in expected_md5.split(",") if m.strip()]
if hashes["md5"].lower() not in md5_list:
os.unlink(cached)
return None
return cached
def safe_extract_zip(zip_path: str, dest_dir: str) -> None: def safe_extract_zip(zip_path: str, dest_dir: str) -> None:
"""Extract a ZIP file safely, preventing zip-slip path traversal.""" """Extract a ZIP file safely, preventing zip-slip path traversal."""
dest = os.path.realpath(dest_dir) dest = os.path.realpath(dest_dir)
-61
View File
@@ -216,62 +216,6 @@ def save_cache(cache_path: str, cache: dict):
json.dump(cache, f) json.dump(cache, f)
def _load_gitignored_large_files() -> dict[str, str]:
"""Read .gitignore and return {filename: bios_path} for large files."""
gitignore = Path(".gitignore")
if not gitignore.exists():
return {}
entries = {}
for line in gitignore.read_text().splitlines():
line = line.strip()
if line.startswith("bios/") and not line.startswith("#"):
name = Path(line).name
entries[name] = line
return entries
def _preserve_large_file_entries(files: dict, db_path: str) -> int:
"""Preserve database entries for large files not on disk.
Large files (>50 MB) are stored as GitHub release assets and listed
in .gitignore. When generate_db runs locally without them, their
entries would be lost. This reads the existing database, downloads
missing files from the release, and re-adds entries with paths
pointing to the local cache.
"""
from common import fetch_large_file
large_files = _load_gitignored_large_files()
if not large_files:
return 0
try:
with open(db_path) as f:
existing_db = json.load(f)
except (FileNotFoundError, json.JSONDecodeError):
return 0
count = 0
for sha1, entry in existing_db.get("files", {}).items():
if sha1 in files:
continue
name = entry.get("name", "")
path = entry.get("path", "")
# Match by gitignored bios/ path OR by filename of a known large file
if path not in large_files.values() and name not in large_files:
continue
cached = fetch_large_file(
name,
expected_sha1=entry.get("sha1", ""),
expected_md5=entry.get("md5", ""),
)
if cached:
entry = {**entry, "path": cached}
files[sha1] = entry
count += 1
return count
def main(): def main():
parser = argparse.ArgumentParser(description="Generate multi-indexed BIOS database") parser = argparse.ArgumentParser(description="Generate multi-indexed BIOS database")
parser.add_argument("--force", action="store_true", help="Force rehash all files") parser.add_argument("--force", action="store_true", help="Force rehash all files")
@@ -292,11 +236,6 @@ def main():
if not files: if not files:
print("Warning: No BIOS files found", file=sys.stderr) print("Warning: No BIOS files found", file=sys.stderr)
# Preserve entries for large files stored as release assets (.gitignore)
preserved = _preserve_large_file_entries(files, args.output)
if preserved:
print(f" Preserved {preserved} large file entries from existing database")
platform_aliases = _collect_all_aliases(files) platform_aliases = _collect_all_aliases(files)
for sha1, name_list in platform_aliases.items(): for sha1, name_list in platform_aliases.items():
for alias_entry in name_list: for alias_entry in name_list:
+63 -70
View File
@@ -26,7 +26,7 @@ from pathlib import Path
sys.path.insert(0, os.path.dirname(__file__)) sys.path.insert(0, os.path.dirname(__file__))
from common import ( from common import (
_build_validation_index, build_zip_contents_index, check_file_validation, _build_validation_index, build_zip_contents_index, check_file_validation,
check_inside_zip, compute_hashes, fetch_large_file, filter_files_by_mode, check_inside_zip, compute_hashes, filter_files_by_mode,
group_identical_platforms, list_emulator_profiles, list_system_ids, group_identical_platforms, list_emulator_profiles, list_system_ids,
load_database, load_data_dir_registry, load_emulator_profiles, load_database, load_data_dir_registry, load_emulator_profiles,
load_platform_config, md5_composite, resolve_local_file, load_platform_config, md5_composite, resolve_local_file,
@@ -43,48 +43,55 @@ DEFAULT_PLATFORMS_DIR = "platforms"
DEFAULT_DB_FILE = "database.json" DEFAULT_DB_FILE = "database.json"
DEFAULT_OUTPUT_DIR = "dist" DEFAULT_OUTPUT_DIR = "dist"
DEFAULT_BIOS_DIR = "bios" DEFAULT_BIOS_DIR = "bios"
LARGE_FILES_RELEASE = "large-files"
LARGE_FILES_REPO = "Abdess/retrobios"
MAX_ENTRY_SIZE = 512 * 1024 * 1024 # 512MB MAX_ENTRY_SIZE = 512 * 1024 * 1024 # 512MB
def _find_candidate_satisfying_both( def _verify_file_hash(path: str, expected_sha1: str = "",
file_entry: dict, expected_md5: str = "") -> bool:
db: dict, if not expected_sha1 and not expected_md5:
local_path: str, return True
validation_index: dict, hashes = compute_hashes(path)
bios_dir: str, if expected_sha1:
) -> str | None: return hashes["sha1"].lower() == expected_sha1.lower()
"""Search for a repo file that satisfies both platform MD5 and emulator validation. md5_list = [m.strip().lower() for m in expected_md5.split(",") if m.strip()]
return hashes["md5"].lower() in md5_list
When the current file passes platform verification but fails emulator checks,
search all candidates with the same name for one that passes both. def fetch_large_file(name: str, dest_dir: str = ".cache/large",
Returns a better path, or None if no upgrade found. expected_sha1: str = "", expected_md5: str = "") -> str | None:
""" """Download a large file from the 'large-files' GitHub release if not cached."""
fname = file_entry.get("name", "") cached = os.path.join(dest_dir, name)
if not fname: if os.path.exists(cached):
return None if expected_sha1 or expected_md5:
entry = validation_index.get(fname) if _verify_file_hash(cached, expected_sha1, expected_md5):
if not entry: return cached
os.unlink(cached)
else:
return cached
encoded_name = urllib.request.quote(name)
url = f"https://github.com/{LARGE_FILES_REPO}/releases/download/{LARGE_FILES_RELEASE}/{encoded_name}"
try:
req = urllib.request.Request(url, headers={"User-Agent": "retrobios-pack/1.0"})
with urllib.request.urlopen(req, timeout=300) as resp:
os.makedirs(dest_dir, exist_ok=True)
with open(cached, "wb") as f:
while True:
chunk = resp.read(65536)
if not chunk:
break
f.write(chunk)
except (urllib.error.URLError, urllib.error.HTTPError):
return None return None
md5_expected = file_entry.get("md5", "") if expected_sha1 or expected_md5:
md5_set = {m.strip().lower() for m in md5_expected.split(",") if m.strip()} if md5_expected else set() if not _verify_file_hash(cached, expected_sha1, expected_md5):
os.unlink(cached)
by_name = db.get("indexes", {}).get("by_name", {})
files_db = db.get("files", {})
for sha1 in by_name.get(fname, []):
candidate = files_db.get(sha1, {})
path = candidate.get("path", "")
if not path or not os.path.exists(path) or os.path.realpath(path) == os.path.realpath(local_path):
continue
# Must still satisfy platform MD5
if md5_set and candidate.get("md5", "").lower() not in md5_set:
continue
# Check emulator validation
reason = check_file_validation(path, fname, validation_index, bios_dir)
if reason is None:
return path
return None return None
return cached
def _sanitize_path(raw: str) -> str: def _sanitize_path(raw: str) -> str:
@@ -111,11 +118,10 @@ def resolve_file(file_entry: dict, db: dict, bios_dir: str,
path, status = resolve_local_file(file_entry, db, zip_contents, path, status = resolve_local_file(file_entry, db, zip_contents,
dest_hint=dest_hint) dest_hint=dest_hint)
if path and status != "hash_mismatch": if path:
return path, status return path, status
# Large files from GitHub release assets — tried when local file is # Last resort: large files from GitHub release assets
# missing OR has a hash mismatch (wrong variant on disk)
name = file_entry.get("name", "") name = file_entry.get("name", "")
sha1 = file_entry.get("sha1") sha1 = file_entry.get("sha1")
md5_raw = file_entry.get("md5", "") md5_raw = file_entry.get("md5", "")
@@ -125,10 +131,6 @@ def resolve_file(file_entry: dict, db: dict, bios_dir: str,
if cached: if cached:
return cached, "release_asset" return cached, "release_asset"
# Fall back to hash_mismatch local file if release asset unavailable
if path:
return path, status
return None, "not_found" return None, "not_found"
@@ -360,28 +362,20 @@ def generate_pack(
else: else:
file_status.setdefault(dedup_key, "ok") file_status.setdefault(dedup_key, "ok")
# Emulator-level validation: informational only for platform packs. # Emulator-level validation (matches verify.py behavior)
# Platform verification (existence/md5) is the authority for pack status. # In existence mode: validation is informational (warning, not downgrade)
# Emulator checks are supplementary — logged but don't downgrade. # In md5 mode: validation downgrades OK to UNTESTED
# When a discrepancy is found, try to find a file satisfying both.
if (file_status.get(dedup_key) == "ok" if (file_status.get(dedup_key) == "ok"
and local_path and validation_index): and local_path and validation_index):
fname = file_entry.get("name", "") fname = file_entry.get("name", "")
reason = check_file_validation(local_path, fname, validation_index, reason = check_file_validation(local_path, fname, validation_index)
bios_dir)
if reason: if reason:
better = _find_candidate_satisfying_both( if verification_mode == "existence":
file_entry, db, local_path, validation_index, bios_dir, # Existence mode: file present = OK, validation is extra info
) file_reasons.setdefault(dedup_key, reason)
if better:
local_path = better
else: else:
ventry = validation_index.get(fname, {}) file_status[dedup_key] = "untested"
emus = ", ".join(ventry.get("emulators", [])) file_reasons[dedup_key] = reason
file_reasons.setdefault(
dedup_key,
f"{platform_display} says OK but {emus} says {reason}",
)
if already_packed: if already_packed:
continue continue
@@ -481,7 +475,7 @@ def generate_pack(
for key, reason in sorted(file_reasons.items()): for key, reason in sorted(file_reasons.items()):
status = file_status.get(key, "") status = file_status.get(key, "")
label = "UNTESTED" if status == "untested" else "DISCREPANCY" label = "UNTESTED"
print(f" {label}: {key}{reason}") print(f" {label}: {key}{reason}")
for name in missing_files: for name in missing_files:
print(f" MISSING: {name}") print(f" MISSING: {name}")
@@ -921,11 +915,10 @@ def main():
groups = group_identical_platforms(platforms, args.platforms_dir) groups = group_identical_platforms(platforms, args.platforms_dir)
for group_platforms, representative in groups: for group_platforms, representative in groups:
variants = [p for p in group_platforms if p != representative] if len(group_platforms) > 1:
if variants: names = [load_platform_config(p, args.platforms_dir).get("platform", p) for p in group_platforms]
all_names = [load_platform_config(p, args.platforms_dir).get("platform", p) for p in group_platforms] combined_name = " + ".join(names)
label = " / ".join(all_names) print(f"\nGenerating shared pack for {combined_name}...")
print(f"\nGenerating pack for {label}...")
else: else:
print(f"\nGenerating pack for {representative}...") print(f"\nGenerating pack for {representative}...")
@@ -936,10 +929,10 @@ def main():
zip_contents=zip_contents, data_registry=data_registry, zip_contents=zip_contents, data_registry=data_registry,
emu_profiles=emu_profiles, emu_profiles=emu_profiles,
) )
if zip_path and variants: if zip_path and len(group_platforms) > 1:
all_names = [load_platform_config(p, args.platforms_dir).get("platform", p) for p in group_platforms] names = [load_platform_config(p, args.platforms_dir).get("platform", p) for p in group_platforms]
combined = "_".join(n.replace(" ", "") for n in all_names) + "_BIOS_Pack.zip" combined_filename = "_".join(n.replace(" ", "") for n in names) + "_BIOS_Pack.zip"
new_path = os.path.join(os.path.dirname(zip_path), combined) new_path = os.path.join(os.path.dirname(zip_path), combined_filename)
if new_path != zip_path: if new_path != zip_path:
os.rename(zip_path, new_path) os.rename(zip_path, new_path)
print(f" Renamed -> {os.path.basename(new_path)}") print(f" Renamed -> {os.path.basename(new_path)}")
+3 -19
View File
@@ -97,27 +97,11 @@ def generate_readme(db: dict, platforms_dir: str) -> str:
) if Path("emulators").exists() else 0 ) if Path("emulators").exists() else 0
lines = [ lines = [
"# RetroBIOS", "# Retrogaming BIOS & Firmware Collection",
"", "",
"Source-verified BIOS and firmware packs for retrogaming platforms.", "Complete, verified collection of BIOS, firmware, and system files for retrogaming emulators.",
"", "",
"Documentation and metadata can drift from what emulators actually load at runtime.", f"> **{total_files}** files | **{size_mb:.1f} MB** | **{len(coverages)}** platforms | **{emulator_count}** emulator profiles",
"To keep packs accurate, each file here is checked against the emulator's source code:",
"what the code opens, what hashes it expects, what happens when a file is missing.",
f"{emulator_count} emulators profiled, {len(coverages)} platforms cross-referenced,",
f"{total_files:,} files verified.",
"",
"### How it works",
"",
"1. **Read emulator source code** - identify every file the code loads, its expected hash and size",
"2. **Cross-reference with platforms** - match against what RetroArch, Batocera, Recalbox and others declare",
"3. **Build packs** - for each platform, include its baseline files plus what its cores need",
"4. **Verify** - run each platform's native checks (MD5, existence) and emulator-level validation (CRC32, size)",
"",
"When a platform and an emulator disagree on a file, the discrepancy is reported.",
"When a variant in the repo satisfies both, it is preferred automatically.",
"",
f"> **{total_files:,}** files | **{size_mb:.1f} MB** | **{len(coverages)}** platforms | **{emulator_count}** emulator profiles",
"", "",
"## Download", "## Download",
"", "",
+107 -1529
View File
File diff suppressed because it is too large Load Diff
+9 -39
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
"""Run the full retrobios pipeline. """Run the full retrobios pipeline: generate DB, verify, generate packs.
Steps: Steps:
1. generate_db.py --force (rebuild database.json from bios/) 1. generate_db.py --force (rebuild database.json from bios/)
@@ -7,14 +7,11 @@ Steps:
3. verify.py --all (check all platforms) 3. verify.py --all (check all platforms)
4. generate_pack.py --all (build ZIP packs) 4. generate_pack.py --all (build ZIP packs)
5. consistency check (verify counts == pack counts) 5. consistency check (verify counts == pack counts)
6. generate_readme.py (rebuild README.md + CONTRIBUTING.md)
7. generate_site.py (rebuild MkDocs pages)
Usage: Usage:
python scripts/pipeline.py # active platforms python scripts/pipeline.py # active platforms
python scripts/pipeline.py --include-archived # all platforms python scripts/pipeline.py --include-archived # all platforms
python scripts/pipeline.py --skip-packs # steps 1-3 only python scripts/pipeline.py --skip-packs # steps 1-3 only
python scripts/pipeline.py --skip-docs # skip steps 6-7
python scripts/pipeline.py --offline # skip step 2 python scripts/pipeline.py --offline # skip step 2
""" """
from __future__ import annotations from __future__ import annotations
@@ -97,7 +94,7 @@ def check_consistency(verify_output: str, pack_output: str) -> bool:
v = parse_verify_counts(verify_output) v = parse_verify_counts(verify_output)
p = parse_pack_counts(pack_output) p = parse_pack_counts(pack_output)
print("\n--- 5/7 consistency check ---") print("\n--- 5/5 consistency check ---")
all_ok = True all_ok = True
for v_label, (v_ok, v_total) in sorted(v.items()): for v_label, (v_ok, v_total) in sorted(v.items()):
@@ -131,8 +128,6 @@ def main():
help="Include archived platforms") help="Include archived platforms")
parser.add_argument("--skip-packs", action="store_true", parser.add_argument("--skip-packs", action="store_true",
help="Only regenerate DB and verify, skip pack generation") help="Only regenerate DB and verify, skip pack generation")
parser.add_argument("--skip-docs", action="store_true",
help="Skip README and site generation")
parser.add_argument("--offline", action="store_true", parser.add_argument("--offline", action="store_true",
help="Skip data directory refresh") help="Skip data directory refresh")
parser.add_argument("--output-dir", default="dist", parser.add_argument("--output-dir", default="dist",
@@ -150,7 +145,7 @@ def main():
ok, out = run( ok, out = run(
[sys.executable, "scripts/generate_db.py", "--force", [sys.executable, "scripts/generate_db.py", "--force",
"--bios-dir", "bios", "--output", "database.json"], "--bios-dir", "bios", "--output", "database.json"],
"1/7 generate database", "1/5 generate database",
) )
results["generate_db"] = ok results["generate_db"] = ok
if not ok: if not ok:
@@ -161,18 +156,18 @@ def main():
if not args.offline: if not args.offline:
ok, out = run( ok, out = run(
[sys.executable, "scripts/refresh_data_dirs.py"], [sys.executable, "scripts/refresh_data_dirs.py"],
"2/7 refresh data directories", "2/5 refresh data directories",
) )
results["refresh_data"] = ok results["refresh_data"] = ok
else: else:
print("\n--- 2/7 refresh data directories: SKIPPED (--offline) ---") print("\n--- 2/5 refresh data directories: SKIPPED (--offline) ---")
results["refresh_data"] = True results["refresh_data"] = True
# Step 3: Verify # Step 3: Verify
verify_cmd = [sys.executable, "scripts/verify.py", "--all"] verify_cmd = [sys.executable, "scripts/verify.py", "--all"]
if args.include_archived: if args.include_archived:
verify_cmd.append("--include-archived") verify_cmd.append("--include-archived")
ok, verify_output = run(verify_cmd, "3/7 verify all platforms") ok, verify_output = run(verify_cmd, "3/5 verify all platforms")
results["verify"] = ok results["verify"] = ok
all_ok = all_ok and ok all_ok = all_ok and ok
@@ -189,11 +184,11 @@ def main():
pack_cmd.append("--offline") pack_cmd.append("--offline")
if args.include_extras: if args.include_extras:
pack_cmd.append("--include-extras") pack_cmd.append("--include-extras")
ok, pack_output = run(pack_cmd, "4/7 generate packs") ok, pack_output = run(pack_cmd, "4/5 generate packs")
results["generate_packs"] = ok results["generate_packs"] = ok
all_ok = all_ok and ok all_ok = all_ok and ok
else: else:
print("\n--- 4/7 generate packs: SKIPPED (--skip-packs) ---") print("\n--- 4/5 generate packs: SKIPPED (--skip-packs) ---")
results["generate_packs"] = True results["generate_packs"] = True
# Step 5: Consistency check # Step 5: Consistency check
@@ -202,34 +197,9 @@ def main():
results["consistency"] = ok results["consistency"] = ok
all_ok = all_ok and ok all_ok = all_ok and ok
else: else:
print("\n--- 5/7 consistency check: SKIPPED ---") print("\n--- 5/5 consistency check: SKIPPED ---")
results["consistency"] = True results["consistency"] = True
# Step 6: Generate README
if not args.skip_docs:
ok, _ = run(
[sys.executable, "scripts/generate_readme.py",
"--db", "database.json", "--platforms-dir", "platforms"],
"6/7 generate readme",
)
results["generate_readme"] = ok
all_ok = all_ok and ok
else:
print("\n--- 6/7 generate readme: SKIPPED (--skip-docs) ---")
results["generate_readme"] = True
# Step 7: Generate site pages
if not args.skip_docs:
ok, _ = run(
[sys.executable, "scripts/generate_site.py"],
"7/7 generate site",
)
results["generate_site"] = ok
all_ok = all_ok and ok
else:
print("\n--- 7/7 generate site: SKIPPED (--skip-docs) ---")
results["generate_site"] = True
# Summary # Summary
total_elapsed = time.monotonic() - total_start total_elapsed = time.monotonic() - total_start
print(f"\n{'=' * 60}") print(f"\n{'=' * 60}")
-144
View File
@@ -1,144 +0,0 @@
# Architecture - RetroBIOS
## Directory structure
```
bios/ BIOS and firmware files, organized by Manufacturer/Console/
Manufacturer/Console/ canonical files (one per unique content)
.variants/ alternate versions (different hash, same purpose)
emulators/ one YAML profile per core (285 profiles)
platforms/ one YAML config per platform (scraped from upstream)
_shared.yml shared file groups across platforms
_registry.yml platform metadata (logos, scrapers, status)
_data_dirs.yml data directory definitions (Dolphin Sys, PPSSPP...)
scripts/ all tooling (Python, pyyaml only dependency)
scraper/ upstream scrapers (libretro, batocera, recalbox...)
data/ cached data directories (not BIOS, fetched at build)
schemas/ JSON schemas for validation
tests/ E2E test suite with synthetic fixtures
dist/ generated packs (gitignored)
.cache/ hash cache and large file downloads (gitignored)
```
## Data flow
```
Upstream sources Scrapers parse generate_db.py scans
System.dat (libretro) + fetch versions bios/ on disk
batocera-systems builds database.json
es_bios.xml (recalbox) (SHA1 primary key,
core-info .info files indexes: by_md5, by_name,
by_crc32, by_path_suffix)
emulators/*.yml verify.py checks generate_pack.py resolves
source-verified platform-native files by hash, builds ZIP
from code verification packs per platform
```
## Three layers of data
| Layer | Source | Role |
|-------|--------|------|
| Platform YAML | Scraped from upstream | What the platform declares it needs |
| `_shared.yml` | Curated | Shared files across platforms, reflects actual behavior |
| Emulator profiles | Source-verified | What the code actually loads. Used for cross-reference and gap detection |
The pack combines platform baseline (layer 1) with core requirements (layer 3).
Neither too much (no files from unused cores) nor too few (no missing files for active cores).
## Pack grouping
Platforms that produce identical packs are grouped automatically.
RetroArch and Lakka share the same files and `base_destination` (`system/`),
so they produce one combined pack (`RetroArch_Lakka_BIOS_Pack.zip`).
RetroPie uses `BIOS/` as base path, so it gets a separate pack.
## Storage tiers
| Tier | Meaning |
|------|---------|
| `embedded` (default) | file is in the `bios/` directory, included in packs |
| `external` | file has a `source_url`, downloaded at pack build time |
| `user_provided` | user must provide the file (instructions included in pack) |
## Verification severity
How missing or mismatched files are reported:
| Mode | required + missing | optional + missing | hash mismatch |
|------|-------------------|-------------------|--------------|
| existence | WARNING | INFO | N/A |
| md5 | CRITICAL | WARNING | UNTESTED |
Files with `hle_fallback: true` are downgraded to INFO when missing
(the emulator has a software fallback).
## Discrepancy detection
When a file passes platform verification (MD5 match) but fails
emulator-level validation (wrong CRC32, wrong size), a DISCREPANCY is reported.
The pack generator searches the repo for a variant that satisfies both.
If none exists, the platform version is kept.
## Security
- `safe_extract_zip()` prevents zip-slip path traversal attacks
- `deterministic_zip` rebuilds MAME ZIPs so same ROMs always produce the same hash
- `crypto_verify.py` and `sect233r1.py` verify 3DS RSA-2048 signatures and AES-128-CBC integrity
- ZIP inner ROM verification via `checkInsideZip()` replicates Batocera's behavior
- `md5_composite()` replicates Recalbox's composite ZIP hash
## Edge cases
| Case | Handling |
|------|---------|
| Batocera truncated MD5 (29 chars) | prefix match in resolution |
| `zippedFile` entries | MD5 is of the ROM inside the ZIP, not the ZIP itself |
| Regional variants (same filename) | `by_path_suffix` index disambiguates |
| MAME BIOS ZIPs | `contents` field documents inner structure |
| RPG Maker/ScummVM | excluded from dedup (NODEDUP) to preserve directory structure |
| `strip_components` in data dirs | flattens cache prefix to match expected path |
| case-insensitive dedup | prevents `font.rom` + `FONT.ROM` conflicts on Windows/macOS |
## Platform inheritance
Platform configs support `inherits:` to share definitions.
Lakka inherits from RetroArch, RetroPie inherits from RetroArch with `base_destination: BIOS`.
`overrides:` allows child platforms to modify specific systems from the parent.
Core resolution (`resolve_platform_cores`) uses three strategies:
- `cores: all_libretro` - include all profiles with `libretro` in their type
- `cores: [list]` - include only named profiles
- `cores:` absent - fallback to system ID intersection between platform and profiles
## MAME clone map
`_mame_clones.json` at repo root maps MAME clone ROM names to their canonical parent.
When a clone ZIP was deduplicated, `resolve_local_file` uses this map to find the canonical file.
## Tests
`tests/test_e2e.py` contains 75 end-to-end tests with synthetic fixtures.
Covers: file resolution, verification, severity, cross-reference, aliases,
inheritance, shared groups, data dirs, storage tiers, HLE, launchers,
platform grouping, core resolution (3 strategies + alias exclusion).
```bash
python -m unittest tests.test_e2e -v
```
## CI workflows
| Workflow | File | Trigger | Role |
|----------|------|---------|------|
| Build & Release | `build.yml` | `workflow_dispatch` (manual) | restore large files, build packs, deploy site, create GitHub release |
| PR Validation | `validate.yml` | pull request on `bios/`/`platforms/` | validate BIOS hashes, schema check, run tests, auto-label PR |
| Weekly Sync | `watch.yml` | cron (Monday 6 AM UTC) + manual | scrape upstream sources, detect changes, create update PR |
Build workflow has a 7-day rate limit between releases and keeps the 3 most recent.
## License
See `LICENSE` at repo root. Files are provided for personal backup and archival.
-19
View File
@@ -1,19 +0,0 @@
# Wiki - RetroBIOS
Technical documentation for the RetroBIOS toolchain.
## Pages
- **[Architecture](architecture.md)** - directory structure, data flow, platform inheritance, pack grouping, security, edge cases, CI workflows
- **[Tools](tools.md)** - CLI reference for every script, pipeline usage, scrapers
- **[Profiling guide](profiling.md)** - how to create an emulator profile from source code, step by step, with YAML field reference
- **[Data model](data-model.md)** - database.json structure, indexes, file resolution order, YAML formats
## For users
If you just want to download BIOS packs, see the [home page](../index.md).
## For contributors
Start with the [profiling guide](profiling.md) to understand how emulator profiles are built,
then see [contributing](../contributing.md) for submission guidelines.
-132
View File
@@ -1,132 +0,0 @@
# Profiling guide - RetroBIOS
How to create an emulator profile from source code.
## Approach
A profile documents what an emulator loads at runtime.
The source code is the reference because it reflects actual behavior.
Documentation, .info files, and wikis are useful starting points
but are verified against the code.
## Steps
### 1. Find the source code
Check these locations in order:
1. Upstream original (the emulator's own repository)
2. Libretro fork (may have adapted paths or added files)
3. If not on GitHub: GitLab, Codeberg, SourceForge, archive.org
Always clone both upstream and libretro port to compare.
### 2. Trace file loading
Read the code flow. Don't grep keywords by assumption.
Each emulator has its own way of loading files.
Look for:
- `fopen`, `open`, `read_file`, `load_rom`, `load_bios` calls
- `retro_system_directory` / `system_dir` in libretro cores
- File existence checks (`path_is_valid`, `file_exists`)
- Hash validation (MD5, CRC32, SHA1 comparisons in code)
- Size validation (`fseek`/`ftell`, `stat`, fixed buffer sizes)
### 3. Determine required vs optional
This is decided by code behavior, not by judgment:
- **required**: the core does not start or function without the file
- **optional**: the core works with degraded functionality without it
- **hle_fallback: true**: the core has a high-level emulation path when the file is missing
### 4. Document divergences
When the libretro port differs from the upstream:
- `mode: libretro` - file only used by the libretro core
- `mode: standalone` - file only used in standalone mode
- `mode: both` - used by both (default, can be omitted)
Path differences (current dir vs system_dir) are normal adaptation,
not a divergence. Name changes (e.g. `naomi2_` to `n2_`) may be intentional
to avoid conflicts in the shared system directory.
### 5. Write the YAML profile
```yaml
emulator: Dolphin
type: standalone + libretro
core_classification: community_fork
source: https://github.com/libretro/dolphin
upstream: https://github.com/dolphin-emu/dolphin
profiled_date: 2026-03-25
core_version: 5.0-21264
systems:
- nintendo-gamecube
- nintendo-wii
files:
- name: GC/USA/IPL.bin
system: nintendo-gamecube
required: false
hle_fallback: true
size: 2097152
validation: [size, adler32]
known_hash_adler32: 0x4f1f6f5c
region: north-america
source_ref: Source/Core/Core/Boot/Boot_BS2Emu.cpp:42
```
### 6. Validate
```bash
python scripts/cross_reference.py --emulator dolphin --json
python scripts/verify.py --emulator dolphin
```
## YAML field reference
### Profile fields
| Field | Required | Description |
|-------|----------|-------------|
| `emulator` | yes | display name |
| `type` | yes | `libretro`, `standalone`, `standalone + libretro`, `alias`, `launcher` |
| `core_classification` | no | `pure_libretro`, `official_port`, `community_fork`, `frozen_snapshot`, `enhanced_fork`, `game_engine`, `embedded_hle`, `alias`, `launcher` |
| `source` | yes | libretro core repository URL |
| `upstream` | no | original emulator repository URL |
| `profiled_date` | yes | date of source analysis |
| `core_version` | yes | version analyzed |
| `systems` | yes | list of system IDs this core handles |
| `cores` | no | list of core names (default: profile filename) |
| `files` | yes | list of file entries |
| `notes` | no | free-form technical notes |
| `exclusion_note` | no | why the profile has no files |
| `data_directories` | no | references to data dirs in `_data_dirs.yml` |
### File entry fields
| Field | Description |
|-------|-------------|
| `name` | filename as the core expects it |
| `required` | true if the core needs this file to function |
| `system` | system ID this file belongs to |
| `size` | expected size in bytes |
| `md5`, `sha1`, `crc32`, `sha256` | expected hashes from source code |
| `validation` | list of checks the code performs: `size`, `crc32`, `md5`, `sha1` |
| `aliases` | alternate filenames for the same file |
| `mode` | `libretro`, `standalone`, or `both` |
| `hle_fallback` | true if a high-level emulation path exists |
| `category` | `bios` (default), `game_data`, `bios_zip` |
| `region` | geographic region (e.g. `north-america`, `japan`) |
| `source_ref` | source file and line number |
| `path` | path relative to system directory |
| `description` | what this file is |
| `note` | additional context |
| `archive` | parent ZIP if this file is inside an archive |
| `contents` | structure of files inside a BIOS ZIP |
| `storage` | `embedded` (default), `external`, `user_provided` |
-128
View File
@@ -1,128 +0,0 @@
# Tools - RetroBIOS
All tools are Python scripts in `scripts/`. Single dependency: `pyyaml`.
## Pipeline
Run everything in sequence:
```bash
python scripts/pipeline.py --offline # DB + verify + packs + readme + site
python scripts/pipeline.py --offline --skip-packs # DB + verify only
python scripts/pipeline.py --skip-docs # skip readme + site generation
```
## Individual tools
### generate_db.py
Scan `bios/` and build `database.json` with multi-indexed lookups.
Large files in `.gitignore` are preserved from the existing database
and downloaded from GitHub release assets if not cached locally.
```bash
python scripts/generate_db.py --force --bios-dir bios --output database.json
```
### verify.py
Check BIOS coverage for each platform using its native verification mode.
```bash
python scripts/verify.py --all # all platforms
python scripts/verify.py --platform batocera # single platform
python scripts/verify.py --emulator dolphin # single emulator
python scripts/verify.py --system atari-lynx # single system
```
Verification modes per platform:
| Platform | Mode | Logic |
|----------|------|-------|
| RetroArch, Lakka, RetroPie | existence | file present = OK |
| Batocera, RetroBat | md5 | MD5 hash match |
| Recalbox | md5 | MD5 multi-hash, 3 severity levels |
| EmuDeck | md5 | MD5 whitelist per system |
### generate_pack.py
Build platform-specific BIOS ZIP packs.
```bash
python scripts/generate_pack.py --all --output-dir dist/
python scripts/generate_pack.py --platform batocera
python scripts/generate_pack.py --emulator dolphin
python scripts/generate_pack.py --system atari-lynx
```
Packs include platform baseline files plus files required by the platform's cores.
When a file passes platform verification but fails emulator validation,
the tool searches for a variant that satisfies both.
If none exists, the platform version is kept and the discrepancy is reported.
### cross_reference.py
Compare emulator profiles against platform configs.
Reports files that cores need but platforms don't declare.
```bash
python scripts/cross_reference.py # all
python scripts/cross_reference.py --emulator dolphin # single
```
### refresh_data_dirs.py
Fetch data directories (Dolphin Sys, PPSSPP assets, blueMSX databases)
from upstream repositories into `data/`.
```bash
python scripts/refresh_data_dirs.py
python scripts/refresh_data_dirs.py --key dolphin-sys --force
```
### Other tools
| Script | Purpose |
|--------|---------|
| `dedup.py` | Deduplicate `bios/`, move duplicates to `.variants/`. RPG Maker and ScummVM excluded (NODEDUP) |
| `validate_pr.py` | Validate BIOS files in pull requests |
| `auto_fetch.py` | Fetch missing BIOS files from known sources |
| `list_platforms.py` | List active platforms (used by CI) |
| `download.py` | Download packs from GitHub releases |
| `common.py` | Shared library: hash computation, file resolution, platform config loading, emulator profiles |
| `generate_readme.py` | Generate README.md and CONTRIBUTING.md from database |
| `generate_site.py` | Generate all MkDocs site pages (this documentation) |
| `deterministic_zip.py` | Rebuild MAME BIOS ZIPs deterministically (same ROMs = same hash) |
| `crypto_verify.py` | 3DS RSA signature and AES crypto verification |
| `sect233r1.py` | Pure Python ECDSA verification on sect233r1 curve (3DS OTP cert) |
| `batch_profile.py` | Batch profiling automation for libretro cores |
| `migrate.py` | Migrate flat bios structure to Manufacturer/Console/ hierarchy |
## Large files
Files over 50 MB are stored as assets on the `large-files` GitHub release.
They are listed in `.gitignore` so they don't bloat the git repository.
`generate_db.py` downloads them from the release when rebuilding the database,
using `fetch_large_file()` from `common.py`. The same function is used by
`generate_pack.py` when a file has a hash mismatch with the local variant.
## Scrapers
Located in `scripts/scraper/`. Each inherits `BaseScraper` and implements `fetch_requirements()`.
| Scraper | Source | Format |
|---------|--------|--------|
| `libretro_scraper` | System.dat + core-info .info files | clrmamepro DAT |
| `batocera_scraper` | batocera-systems script | Python dict |
| `recalbox_scraper` | es_bios.xml | XML |
| `retrobat_scraper` | batocera-systems.json | JSON |
| `emudeck_scraper` | checkBIOS.sh | Bash + CSV |
| `retrodeck_scraper` | component manifests | JSON per component |
| `coreinfo_scraper` | .info files from libretro-core-info | INI-like |
Internal modules: `base_scraper.py` (abstract base with `_fetch_raw()` caching
and shared CLI), `dat_parser.py` (clrmamepro DAT format parser).
Adding a scraper: inherit `BaseScraper`, implement `fetch_requirements()`,
call `scraper_cli(YourScraper)` in `__main__`.