19 Commits

Author SHA1 Message Date
Abdessamad Derraz
d4ce6df911 fix: remaining releases variable reference 2026-04-03 22:34:45 +02:00
Abdessamad Derraz
d0846ed78f fix: which-pack link text, paths, and table clarity 2026-04-03 22:29:16 +02:00
Abdessamad Derraz
07b4e55053 docs: rewrite which-pack as complete download guide 2026-04-03 22:27:00 +02:00
Abdessamad Derraz
690e897ca7 docs: rewrite which-pack page with real guidance 2026-04-03 22:23:06 +02:00
Abdessamad Derraz
7471c176c3 fix: generate which-pack page via generate_site.py 2026-04-03 22:20:23 +02:00
Abdessamad Derraz
e72773e46d fix: restore community tools section in readme generator 2026-04-03 15:00:38 +02:00
Abdessamad Derraz
3c0c1cec02 fix: generate banner header in readme and site scripts 2026-04-03 14:22:22 +02:00
Abdessamad Derraz
faf4236463 docs: add project logo and branding assets 2026-04-03 14:17:53 +02:00
Abdessamad Derraz
1c0c502258 docs: add community tools section
Reference BIOS Preservation Tool by monster-penguin in README,
wiki, and site nav.
2026-04-03 13:33:21 +02:00
Abdessamad Derraz
06c48e071a test: update grouping test for flat zip behavior 2026-04-03 12:06:38 +02:00
Abdessamad Derraz
8f93ee2239 feat: flatten zips, standalone copies, retropie grouping 2026-04-03 12:04:55 +02:00
Abdessamad Derraz
9ba8b02ff1 fix: verify functions handle flat zip extraction 2026-04-03 11:50:26 +02:00
Abdessamad Derraz
6fc2753f3e feat: add standalone copies for 9 emulators 2026-04-03 11:20:21 +02:00
Abdessamad Derraz
486b359c22 feat: extend do_standalone_copies with pattern, note, wsl fallback 2026-04-03 11:16:34 +02:00
Abdessamad Derraz
76a3543672 feat: verify functions handle flat and nested ZIPs 2026-04-03 11:15:32 +02:00
Abdessamad Derraz
48d185dd7d feat: flatten ZIP structure, strip base_dest prefix 2026-04-03 11:12:14 +02:00
Abdessamad Derraz
6dbc3f510b fix: retrodeck bios_path double prefix 2026-04-03 11:07:46 +02:00
Abdessamad Derraz
97e26103f5 fix: include source/req tags in grouped pack rename 2026-04-03 11:07:34 +02:00
Abdessamad Derraz
59d777a33d fix: restore wiki links for mkdocs context 2026-04-02 20:54:14 +02:00
23 changed files with 2455 additions and 85 deletions

BIN
.github/assets/banner-light.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 KiB

BIN
.github/assets/banner.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

BIN
.github/assets/favicon.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
.github/assets/logo.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

BIN
.github/assets/social-preview.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

View File

@@ -1,4 +1,6 @@
# RetroBIOS <p align="center">
<img src=".github/assets/banner.png" alt="RetroBIOS" width="400">
</p>
Complete BIOS and firmware packs for Batocera, BizHawk, EmuDeck, Lakka, Recalbox, RetroArch, RetroBat, RetroDECK, RetroPie, and RomM. Complete BIOS and firmware packs for Batocera, BizHawk, EmuDeck, Lakka, Recalbox, RetroArch, RetroBat, RetroDECK, RetroPie, and RomM.
@@ -122,6 +124,10 @@ To keep packs accurate, each file is checked against the emulator's source code.
<a href="https://github.com/monster-penguin"><img src="https://avatars.githubusercontent.com/u/266009589?v=4" width="50" title="monster-penguin"></a> <a href="https://github.com/monster-penguin"><img src="https://avatars.githubusercontent.com/u/266009589?v=4" width="50" title="monster-penguin"></a>
## Community tools
- [BIOS Preservation Tool](https://github.com/monster-penguin/BIOS-Preservation-Tool) by [monster-penguin](https://github.com/monster-penguin) - scan, verify, and stage your own BIOS collection using RetroBIOS hash metadata
## Contributing ## Contributing
See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines. See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
@@ -130,4 +136,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-04-02T13:38:26Z* *Auto-generated on 2026-04-03T12:59:52Z*

View File

@@ -101,4 +101,50 @@ foreach ($f in $toDownload) {
} }
} }
# Standalone emulator copies
if ($manifest.standalone_copies) {
Write-Host "`nStandalone emulators:"
foreach ($entry in $manifest.standalone_copies) {
if ($entry.note) {
$detectPaths = @()
if ($entry.detect -and $entry.detect.windows) {
$detectPaths = $entry.detect.windows
}
foreach ($dp in $detectPaths) {
$expanded = [Environment]::ExpandEnvironmentVariables($dp)
if (Test-Path $expanded) {
Write-Host " $($entry.note)"
break
}
}
continue
}
$sources = @()
if ($entry.pattern) {
$sources = Get-ChildItem -Path $biosPath -Filter $entry.pattern -File -ErrorAction SilentlyContinue
} elseif ($entry.file) {
$src = Join-Path $biosPath $entry.file
if (Test-Path $src) { $sources = @(Get-Item $src) }
}
if ($sources.Count -eq 0) { continue }
$targetDirs = @()
if ($entry.targets -and $entry.targets.windows) {
$targetDirs = $entry.targets.windows
}
foreach ($td in $targetDirs) {
$expanded = [Environment]::ExpandEnvironmentVariables($td)
if (-not (Test-Path $expanded)) { continue }
foreach ($s in $sources) {
$dest = Join-Path $expanded $s.Name
try {
Copy-Item $s.FullName $dest -Force
Write-Host " $($s.Name) -> $expanded"
} catch {
Write-Host " $($s.Name) -> $expanded FAILED" -ForegroundColor Red
}
}
}
}
}
Write-Host "`nDone. $downloaded downloaded, $upToDate already up to date." Write-Host "`nDone. $downloaded downloaded, $upToDate already up to date."

View File

@@ -192,9 +192,9 @@ def detect_platforms(os_type: str) -> list[tuple[str, Path]]:
if retrodeck_cfg.exists(): if retrodeck_cfg.exists():
bios_path = _parse_bash_var(retrodeck_cfg, "rdhome") bios_path = _parse_bash_var(retrodeck_cfg, "rdhome")
if bios_path: if bios_path:
found.append(("retrodeck", Path(bios_path) / "bios")) found.append(("retrodeck", Path(bios_path)))
else: else:
found.append(("retrodeck", home / "retrodeck" / "bios")) found.append(("retrodeck", home / "retrodeck"))
# RetroArch Flatpak # RetroArch Flatpak
flatpak_cfg = home / ".var" / "app" / "org.libretro.RetroArch" / "config" / "retroarch" / "retroarch.cfg" flatpak_cfg = home / ".var" / "app" / "org.libretro.RetroArch" / "config" / "retroarch" / "retroarch.cfg"
@@ -390,8 +390,16 @@ def do_standalone_copies(
) -> tuple[int, int]: ) -> tuple[int, int]:
"""Copy BIOS files to standalone emulator directories. """Copy BIOS files to standalone emulator directories.
Supports:
- file: single file copy
- pattern: glob match (e.g. "scph*.bin")
- note: informational message when detect path exists
- WSL fallback to linux targets
Returns (copied_count, skipped_count). Returns (copied_count, skipped_count).
""" """
from fnmatch import fnmatch
copies = manifest.get("standalone_copies", []) copies = manifest.get("standalone_copies", [])
if not copies: if not copies:
return 0, 0 return 0, 0
@@ -400,21 +408,48 @@ def do_standalone_copies(
skipped = 0 skipped = 0
for entry in copies: for entry in copies:
src = bios_path / entry["file"] # Note entries: print message if emulator detected
if not src.exists(): if "note" in entry:
detect_paths = entry.get("detect", {}).get(os_type, [])
if not detect_paths and os_type == "wsl":
detect_paths = entry.get("detect", {}).get("linux", [])
for dp in detect_paths:
expanded = Path(os.path.expandvars(os.path.expanduser(dp)))
if expanded.is_dir():
print(f" {entry['note']}")
break
continue continue
# Resolve source files
if "pattern" in entry:
sources = [
f for f in bios_path.rglob("*")
if fnmatch(f.name, entry["pattern"]) and f.is_file()
]
else:
src = bios_path / entry["file"]
sources = [src] if src.exists() else []
if not sources:
continue
# Resolve target directories with WSL fallback
targets = entry.get("targets", {}).get(os_type, []) targets = entry.get("targets", {}).get(os_type, [])
if not targets and os_type == "wsl":
targets = entry.get("targets", {}).get("linux", [])
for target_dir_str in targets: for target_dir_str in targets:
target_dir = Path(os.path.expandvars(os.path.expanduser(target_dir_str))) target_dir = Path(os.path.expandvars(os.path.expanduser(target_dir_str)))
if target_dir.is_dir(): if not target_dir.is_dir():
skipped += len(sources)
continue
for src in sources:
dest = target_dir / src.name dest = target_dir / src.name
try: try:
shutil.copy2(src, dest) shutil.copy2(src, dest)
copied += 1 copied += 1
except OSError: except OSError:
skipped += 1 skipped += 1
else:
skipped += 1
return copied, skipped return copied, skipped

View File

@@ -4,7 +4,7 @@
"platform": "batocera", "platform": "batocera",
"display_name": "Batocera", "display_name": "Batocera",
"version": "1.0", "version": "1.0",
"generated": "2026-04-02T13:52:15Z", "generated": "2026-04-03T09:43:11Z",
"base_destination": "bios", "base_destination": "bios",
"detect": [ "detect": [
{ {
@@ -14,7 +14,222 @@
"bios_path": "/userdata/bios" "bios_path": "/userdata/bios"
} }
], ],
"standalone_copies": [], "standalone_copies": [
{
"file": "prod.keys",
"targets": {
"linux": [
"$HOME/.local/share/yuzu/keys",
"$HOME/.local/share/eden/keys",
"$HOME/.local/share/citron/keys",
"$HOME/.local/share/suyu/keys",
"$HOME/.config/Ryujinx/system"
],
"windows": [
"%APPDATA%\\yuzu\\keys",
"%APPDATA%\\eden\\keys",
"%APPDATA%\\citron\\keys",
"%APPDATA%\\suyu\\keys",
"%APPDATA%\\Ryujinx\\system"
],
"darwin": [
"$HOME/Library/Application Support/yuzu/keys",
"$HOME/Library/Application Support/Ryujinx/system"
]
}
},
{
"file": "title.keys",
"targets": {
"linux": [
"$HOME/.local/share/yuzu/keys",
"$HOME/.local/share/eden/keys",
"$HOME/.local/share/citron/keys",
"$HOME/.local/share/suyu/keys"
],
"windows": [
"%APPDATA%\\yuzu\\keys",
"%APPDATA%\\eden\\keys",
"%APPDATA%\\citron\\keys",
"%APPDATA%\\suyu\\keys"
],
"darwin": [
"$HOME/Library/Application Support/yuzu/keys"
]
}
},
{
"file": "Citra/sysdata/aes_keys.txt",
"targets": {
"linux": [
"$HOME/.local/share/azahar/sysdata"
],
"windows": [
"%APPDATA%\\Azahar\\sysdata"
]
}
},
{
"file": "Citra/sysdata/boot9.bin",
"targets": {
"linux": [
"$HOME/.local/share/azahar/sysdata"
],
"windows": [
"%APPDATA%\\Azahar\\sysdata"
]
}
},
{
"pattern": "scph*.bin",
"targets": {
"linux": [
"$HOME/.local/share/duckstation/bios"
],
"windows": [
"%LOCALAPPDATA%\\DuckStation\\bios",
"%USERPROFILE%\\Documents\\DuckStation\\bios"
],
"darwin": [
"$HOME/Library/Application Support/DuckStation/bios"
]
}
},
{
"pattern": "ps2-*.bin",
"targets": {
"linux": [
"$HOME/.config/PCSX2/bios",
"$HOME/.var/app/net.pcsx2.PCSX2/config/PCSX2/bios"
],
"windows": [
"%USERPROFILE%\\Documents\\PCSX2\\bios"
],
"darwin": [
"$HOME/Library/Application Support/PCSX2/bios"
]
}
},
{
"note": "PS3 firmware (PS3UPDAT.PUP) found. Install via RPCS3 > File > Install Firmware.",
"detect": {
"linux": [
"$HOME/.config/rpcs3"
],
"windows": [
"%APPDATA%\\rpcs3"
]
}
},
{
"file": "GC/USA/IPL.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu/GC/USA"
],
"windows": [
"%APPDATA%\\Dolphin Emulator\\GC\\USA"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin/GC/USA"
]
}
},
{
"file": "GC/EUR/IPL.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu/GC/EUR"
],
"windows": [
"%APPDATA%\\Dolphin Emulator\\GC\\EUR"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin/GC/EUR"
]
}
},
{
"file": "GC/JAP/IPL.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu/GC/JAP"
],
"windows": [
"%APPDATA%\\Dolphin Emulator\\GC\\JAP"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin/GC/JAP"
]
}
},
{
"file": "dsp_rom.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu"
],
"windows": [
"%APPDATA%\\Dolphin Emulator"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin"
]
}
},
{
"file": "dsp_coef.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu"
],
"windows": [
"%APPDATA%\\Dolphin Emulator"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin"
]
}
},
{
"file": "PPSSPP/ppge_atlas.zim",
"targets": {
"linux": [
"$HOME/.config/ppsspp/PSP/SYSTEM"
],
"windows": [
"%USERPROFILE%\\Documents\\PPSSPP\\PSP\\SYSTEM"
],
"darwin": [
"$HOME/Library/Application Support/PPSSPP/PSP/SYSTEM"
]
}
},
{
"file": "dc/dc_boot.bin",
"targets": {
"linux": [
"$HOME/.local/share/flycast/data",
"$HOME/.var/app/org.flycast.Flycast/data/flycast"
],
"windows": [
"%APPDATA%\\flycast\\data"
]
}
},
{
"file": "dc/dc_nvmem.bin",
"targets": {
"linux": [
"$HOME/.local/share/flycast/data",
"$HOME/.var/app/org.flycast.Flycast/data/flycast"
],
"windows": [
"%APPDATA%\\flycast\\data"
]
}
}
],
"total_files": 1547, "total_files": 1547,
"total_size": 4371484317, "total_size": 4371484317,
"files": [ "files": [

View File

@@ -4,7 +4,7 @@
"platform": "emudeck", "platform": "emudeck",
"display_name": "EmuDeck", "display_name": "EmuDeck",
"version": "1.0", "version": "1.0",
"generated": "2026-04-01T14:41:53Z", "generated": "2026-04-03T09:43:22Z",
"base_destination": "bios", "base_destination": "bios",
"detect": [ "detect": [
{ {
@@ -34,19 +34,211 @@
"linux": [ "linux": [
"$HOME/.local/share/yuzu/keys", "$HOME/.local/share/yuzu/keys",
"$HOME/.local/share/eden/keys", "$HOME/.local/share/eden/keys",
"$HOME/.local/share/citron/keys",
"$HOME/.local/share/suyu/keys",
"$HOME/.config/Ryujinx/system" "$HOME/.config/Ryujinx/system"
], ],
"windows": [ "windows": [
"%APPDATA%\\yuzu\\keys", "%APPDATA%\\yuzu\\keys",
"%APPDATA%\\eden\\keys" "%APPDATA%\\eden\\keys",
"%APPDATA%\\citron\\keys",
"%APPDATA%\\suyu\\keys",
"%APPDATA%\\Ryujinx\\system"
],
"darwin": [
"$HOME/Library/Application Support/yuzu/keys",
"$HOME/Library/Application Support/Ryujinx/system"
] ]
} }
}, },
{ {
"file": "aes_keys.txt", "file": "title.keys",
"targets": { "targets": {
"linux": [ "linux": [
"$HOME/Emulation/bios/citra/keys" "$HOME/.local/share/yuzu/keys",
"$HOME/.local/share/eden/keys",
"$HOME/.local/share/citron/keys",
"$HOME/.local/share/suyu/keys"
],
"windows": [
"%APPDATA%\\yuzu\\keys",
"%APPDATA%\\eden\\keys",
"%APPDATA%\\citron\\keys",
"%APPDATA%\\suyu\\keys"
],
"darwin": [
"$HOME/Library/Application Support/yuzu/keys"
]
}
},
{
"file": "Citra/sysdata/aes_keys.txt",
"targets": {
"linux": [
"$HOME/.local/share/azahar/sysdata"
],
"windows": [
"%APPDATA%\\Azahar\\sysdata"
]
}
},
{
"file": "Citra/sysdata/boot9.bin",
"targets": {
"linux": [
"$HOME/.local/share/azahar/sysdata"
],
"windows": [
"%APPDATA%\\Azahar\\sysdata"
]
}
},
{
"pattern": "scph*.bin",
"targets": {
"linux": [
"$HOME/.local/share/duckstation/bios"
],
"windows": [
"%LOCALAPPDATA%\\DuckStation\\bios",
"%USERPROFILE%\\Documents\\DuckStation\\bios"
],
"darwin": [
"$HOME/Library/Application Support/DuckStation/bios"
]
}
},
{
"pattern": "ps2-*.bin",
"targets": {
"linux": [
"$HOME/.config/PCSX2/bios",
"$HOME/.var/app/net.pcsx2.PCSX2/config/PCSX2/bios"
],
"windows": [
"%USERPROFILE%\\Documents\\PCSX2\\bios"
],
"darwin": [
"$HOME/Library/Application Support/PCSX2/bios"
]
}
},
{
"note": "PS3 firmware (PS3UPDAT.PUP) found. Install via RPCS3 > File > Install Firmware.",
"detect": {
"linux": [
"$HOME/.config/rpcs3"
],
"windows": [
"%APPDATA%\\rpcs3"
]
}
},
{
"file": "GC/USA/IPL.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu/GC/USA"
],
"windows": [
"%APPDATA%\\Dolphin Emulator\\GC\\USA"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin/GC/USA"
]
}
},
{
"file": "GC/EUR/IPL.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu/GC/EUR"
],
"windows": [
"%APPDATA%\\Dolphin Emulator\\GC\\EUR"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin/GC/EUR"
]
}
},
{
"file": "GC/JAP/IPL.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu/GC/JAP"
],
"windows": [
"%APPDATA%\\Dolphin Emulator\\GC\\JAP"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin/GC/JAP"
]
}
},
{
"file": "dsp_rom.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu"
],
"windows": [
"%APPDATA%\\Dolphin Emulator"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin"
]
}
},
{
"file": "dsp_coef.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu"
],
"windows": [
"%APPDATA%\\Dolphin Emulator"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin"
]
}
},
{
"file": "PPSSPP/ppge_atlas.zim",
"targets": {
"linux": [
"$HOME/.config/ppsspp/PSP/SYSTEM"
],
"windows": [
"%USERPROFILE%\\Documents\\PPSSPP\\PSP\\SYSTEM"
],
"darwin": [
"$HOME/Library/Application Support/PPSSPP/PSP/SYSTEM"
]
}
},
{
"file": "dc/dc_boot.bin",
"targets": {
"linux": [
"$HOME/.local/share/flycast/data",
"$HOME/.var/app/org.flycast.Flycast/data/flycast"
],
"windows": [
"%APPDATA%\\flycast\\data"
]
}
},
{
"file": "dc/dc_nvmem.bin",
"targets": {
"linux": [
"$HOME/.local/share/flycast/data",
"$HOME/.var/app/org.flycast.Flycast/data/flycast"
],
"windows": [
"%APPDATA%\\flycast\\data"
] ]
} }
} }

View File

@@ -4,7 +4,7 @@
"platform": "recalbox", "platform": "recalbox",
"display_name": "Recalbox", "display_name": "Recalbox",
"version": "1.0", "version": "1.0",
"generated": "2026-04-02T13:53:15Z", "generated": "2026-04-03T09:44:06Z",
"base_destination": "bios", "base_destination": "bios",
"detect": [ "detect": [
{ {
@@ -14,7 +14,222 @@
"bios_path": "/recalbox/share/bios" "bios_path": "/recalbox/share/bios"
} }
], ],
"standalone_copies": [], "standalone_copies": [
{
"file": "prod.keys",
"targets": {
"linux": [
"$HOME/.local/share/yuzu/keys",
"$HOME/.local/share/eden/keys",
"$HOME/.local/share/citron/keys",
"$HOME/.local/share/suyu/keys",
"$HOME/.config/Ryujinx/system"
],
"windows": [
"%APPDATA%\\yuzu\\keys",
"%APPDATA%\\eden\\keys",
"%APPDATA%\\citron\\keys",
"%APPDATA%\\suyu\\keys",
"%APPDATA%\\Ryujinx\\system"
],
"darwin": [
"$HOME/Library/Application Support/yuzu/keys",
"$HOME/Library/Application Support/Ryujinx/system"
]
}
},
{
"file": "title.keys",
"targets": {
"linux": [
"$HOME/.local/share/yuzu/keys",
"$HOME/.local/share/eden/keys",
"$HOME/.local/share/citron/keys",
"$HOME/.local/share/suyu/keys"
],
"windows": [
"%APPDATA%\\yuzu\\keys",
"%APPDATA%\\eden\\keys",
"%APPDATA%\\citron\\keys",
"%APPDATA%\\suyu\\keys"
],
"darwin": [
"$HOME/Library/Application Support/yuzu/keys"
]
}
},
{
"file": "Citra/sysdata/aes_keys.txt",
"targets": {
"linux": [
"$HOME/.local/share/azahar/sysdata"
],
"windows": [
"%APPDATA%\\Azahar\\sysdata"
]
}
},
{
"file": "Citra/sysdata/boot9.bin",
"targets": {
"linux": [
"$HOME/.local/share/azahar/sysdata"
],
"windows": [
"%APPDATA%\\Azahar\\sysdata"
]
}
},
{
"pattern": "scph*.bin",
"targets": {
"linux": [
"$HOME/.local/share/duckstation/bios"
],
"windows": [
"%LOCALAPPDATA%\\DuckStation\\bios",
"%USERPROFILE%\\Documents\\DuckStation\\bios"
],
"darwin": [
"$HOME/Library/Application Support/DuckStation/bios"
]
}
},
{
"pattern": "ps2-*.bin",
"targets": {
"linux": [
"$HOME/.config/PCSX2/bios",
"$HOME/.var/app/net.pcsx2.PCSX2/config/PCSX2/bios"
],
"windows": [
"%USERPROFILE%\\Documents\\PCSX2\\bios"
],
"darwin": [
"$HOME/Library/Application Support/PCSX2/bios"
]
}
},
{
"note": "PS3 firmware (PS3UPDAT.PUP) found. Install via RPCS3 > File > Install Firmware.",
"detect": {
"linux": [
"$HOME/.config/rpcs3"
],
"windows": [
"%APPDATA%\\rpcs3"
]
}
},
{
"file": "GC/USA/IPL.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu/GC/USA"
],
"windows": [
"%APPDATA%\\Dolphin Emulator\\GC\\USA"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin/GC/USA"
]
}
},
{
"file": "GC/EUR/IPL.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu/GC/EUR"
],
"windows": [
"%APPDATA%\\Dolphin Emulator\\GC\\EUR"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin/GC/EUR"
]
}
},
{
"file": "GC/JAP/IPL.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu/GC/JAP"
],
"windows": [
"%APPDATA%\\Dolphin Emulator\\GC\\JAP"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin/GC/JAP"
]
}
},
{
"file": "dsp_rom.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu"
],
"windows": [
"%APPDATA%\\Dolphin Emulator"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin"
]
}
},
{
"file": "dsp_coef.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu"
],
"windows": [
"%APPDATA%\\Dolphin Emulator"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin"
]
}
},
{
"file": "PPSSPP/ppge_atlas.zim",
"targets": {
"linux": [
"$HOME/.config/ppsspp/PSP/SYSTEM"
],
"windows": [
"%USERPROFILE%\\Documents\\PPSSPP\\PSP\\SYSTEM"
],
"darwin": [
"$HOME/Library/Application Support/PPSSPP/PSP/SYSTEM"
]
}
},
{
"file": "dc/dc_boot.bin",
"targets": {
"linux": [
"$HOME/.local/share/flycast/data",
"$HOME/.var/app/org.flycast.Flycast/data/flycast"
],
"windows": [
"%APPDATA%\\flycast\\data"
]
}
},
{
"file": "dc/dc_nvmem.bin",
"targets": {
"linux": [
"$HOME/.local/share/flycast/data",
"$HOME/.var/app/org.flycast.Flycast/data/flycast"
],
"windows": [
"%APPDATA%\\flycast\\data"
]
}
}
],
"total_files": 1107, "total_files": 1107,
"total_size": 3980096655, "total_size": 3980096655,
"files": [ "files": [

View File

@@ -4,7 +4,7 @@
"platform": "retroarch", "platform": "retroarch",
"display_name": "RetroArch", "display_name": "RetroArch",
"version": "1.0", "version": "1.0",
"generated": "2026-04-02T13:52:45Z", "generated": "2026-04-03T09:43:38Z",
"base_destination": "system", "base_destination": "system",
"detect": [ "detect": [
{ {
@@ -32,7 +32,222 @@
"parse_key": "system_directory" "parse_key": "system_directory"
} }
], ],
"standalone_copies": [], "standalone_copies": [
{
"file": "prod.keys",
"targets": {
"linux": [
"$HOME/.local/share/yuzu/keys",
"$HOME/.local/share/eden/keys",
"$HOME/.local/share/citron/keys",
"$HOME/.local/share/suyu/keys",
"$HOME/.config/Ryujinx/system"
],
"windows": [
"%APPDATA%\\yuzu\\keys",
"%APPDATA%\\eden\\keys",
"%APPDATA%\\citron\\keys",
"%APPDATA%\\suyu\\keys",
"%APPDATA%\\Ryujinx\\system"
],
"darwin": [
"$HOME/Library/Application Support/yuzu/keys",
"$HOME/Library/Application Support/Ryujinx/system"
]
}
},
{
"file": "title.keys",
"targets": {
"linux": [
"$HOME/.local/share/yuzu/keys",
"$HOME/.local/share/eden/keys",
"$HOME/.local/share/citron/keys",
"$HOME/.local/share/suyu/keys"
],
"windows": [
"%APPDATA%\\yuzu\\keys",
"%APPDATA%\\eden\\keys",
"%APPDATA%\\citron\\keys",
"%APPDATA%\\suyu\\keys"
],
"darwin": [
"$HOME/Library/Application Support/yuzu/keys"
]
}
},
{
"file": "Citra/sysdata/aes_keys.txt",
"targets": {
"linux": [
"$HOME/.local/share/azahar/sysdata"
],
"windows": [
"%APPDATA%\\Azahar\\sysdata"
]
}
},
{
"file": "Citra/sysdata/boot9.bin",
"targets": {
"linux": [
"$HOME/.local/share/azahar/sysdata"
],
"windows": [
"%APPDATA%\\Azahar\\sysdata"
]
}
},
{
"pattern": "scph*.bin",
"targets": {
"linux": [
"$HOME/.local/share/duckstation/bios"
],
"windows": [
"%LOCALAPPDATA%\\DuckStation\\bios",
"%USERPROFILE%\\Documents\\DuckStation\\bios"
],
"darwin": [
"$HOME/Library/Application Support/DuckStation/bios"
]
}
},
{
"pattern": "ps2-*.bin",
"targets": {
"linux": [
"$HOME/.config/PCSX2/bios",
"$HOME/.var/app/net.pcsx2.PCSX2/config/PCSX2/bios"
],
"windows": [
"%USERPROFILE%\\Documents\\PCSX2\\bios"
],
"darwin": [
"$HOME/Library/Application Support/PCSX2/bios"
]
}
},
{
"note": "PS3 firmware (PS3UPDAT.PUP) found. Install via RPCS3 > File > Install Firmware.",
"detect": {
"linux": [
"$HOME/.config/rpcs3"
],
"windows": [
"%APPDATA%\\rpcs3"
]
}
},
{
"file": "GC/USA/IPL.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu/GC/USA"
],
"windows": [
"%APPDATA%\\Dolphin Emulator\\GC\\USA"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin/GC/USA"
]
}
},
{
"file": "GC/EUR/IPL.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu/GC/EUR"
],
"windows": [
"%APPDATA%\\Dolphin Emulator\\GC\\EUR"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin/GC/EUR"
]
}
},
{
"file": "GC/JAP/IPL.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu/GC/JAP"
],
"windows": [
"%APPDATA%\\Dolphin Emulator\\GC\\JAP"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin/GC/JAP"
]
}
},
{
"file": "dsp_rom.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu"
],
"windows": [
"%APPDATA%\\Dolphin Emulator"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin"
]
}
},
{
"file": "dsp_coef.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu"
],
"windows": [
"%APPDATA%\\Dolphin Emulator"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin"
]
}
},
{
"file": "PPSSPP/ppge_atlas.zim",
"targets": {
"linux": [
"$HOME/.config/ppsspp/PSP/SYSTEM"
],
"windows": [
"%USERPROFILE%\\Documents\\PPSSPP\\PSP\\SYSTEM"
],
"darwin": [
"$HOME/Library/Application Support/PPSSPP/PSP/SYSTEM"
]
}
},
{
"file": "dc/dc_boot.bin",
"targets": {
"linux": [
"$HOME/.local/share/flycast/data",
"$HOME/.var/app/org.flycast.Flycast/data/flycast"
],
"windows": [
"%APPDATA%\\flycast\\data"
]
}
},
{
"file": "dc/dc_nvmem.bin",
"targets": {
"linux": [
"$HOME/.local/share/flycast/data",
"$HOME/.var/app/org.flycast.Flycast/data/flycast"
],
"windows": [
"%APPDATA%\\flycast\\data"
]
}
}
],
"total_files": 1627, "total_files": 1627,
"total_size": 5735234905, "total_size": 5735234905,
"files": [ "files": [

View File

@@ -4,7 +4,7 @@
"platform": "retrobat", "platform": "retrobat",
"display_name": "RetroBat", "display_name": "RetroBat",
"version": "1.0", "version": "1.0",
"generated": "2026-04-02T13:53:25Z", "generated": "2026-04-03T09:44:16Z",
"base_destination": "bios", "base_destination": "bios",
"detect": [ "detect": [
{ {
@@ -13,7 +13,222 @@
"path": "%USERPROFILE%\\RetroBat\\bios" "path": "%USERPROFILE%\\RetroBat\\bios"
} }
], ],
"standalone_copies": [], "standalone_copies": [
{
"file": "prod.keys",
"targets": {
"linux": [
"$HOME/.local/share/yuzu/keys",
"$HOME/.local/share/eden/keys",
"$HOME/.local/share/citron/keys",
"$HOME/.local/share/suyu/keys",
"$HOME/.config/Ryujinx/system"
],
"windows": [
"%APPDATA%\\yuzu\\keys",
"%APPDATA%\\eden\\keys",
"%APPDATA%\\citron\\keys",
"%APPDATA%\\suyu\\keys",
"%APPDATA%\\Ryujinx\\system"
],
"darwin": [
"$HOME/Library/Application Support/yuzu/keys",
"$HOME/Library/Application Support/Ryujinx/system"
]
}
},
{
"file": "title.keys",
"targets": {
"linux": [
"$HOME/.local/share/yuzu/keys",
"$HOME/.local/share/eden/keys",
"$HOME/.local/share/citron/keys",
"$HOME/.local/share/suyu/keys"
],
"windows": [
"%APPDATA%\\yuzu\\keys",
"%APPDATA%\\eden\\keys",
"%APPDATA%\\citron\\keys",
"%APPDATA%\\suyu\\keys"
],
"darwin": [
"$HOME/Library/Application Support/yuzu/keys"
]
}
},
{
"file": "Citra/sysdata/aes_keys.txt",
"targets": {
"linux": [
"$HOME/.local/share/azahar/sysdata"
],
"windows": [
"%APPDATA%\\Azahar\\sysdata"
]
}
},
{
"file": "Citra/sysdata/boot9.bin",
"targets": {
"linux": [
"$HOME/.local/share/azahar/sysdata"
],
"windows": [
"%APPDATA%\\Azahar\\sysdata"
]
}
},
{
"pattern": "scph*.bin",
"targets": {
"linux": [
"$HOME/.local/share/duckstation/bios"
],
"windows": [
"%LOCALAPPDATA%\\DuckStation\\bios",
"%USERPROFILE%\\Documents\\DuckStation\\bios"
],
"darwin": [
"$HOME/Library/Application Support/DuckStation/bios"
]
}
},
{
"pattern": "ps2-*.bin",
"targets": {
"linux": [
"$HOME/.config/PCSX2/bios",
"$HOME/.var/app/net.pcsx2.PCSX2/config/PCSX2/bios"
],
"windows": [
"%USERPROFILE%\\Documents\\PCSX2\\bios"
],
"darwin": [
"$HOME/Library/Application Support/PCSX2/bios"
]
}
},
{
"note": "PS3 firmware (PS3UPDAT.PUP) found. Install via RPCS3 > File > Install Firmware.",
"detect": {
"linux": [
"$HOME/.config/rpcs3"
],
"windows": [
"%APPDATA%\\rpcs3"
]
}
},
{
"file": "GC/USA/IPL.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu/GC/USA"
],
"windows": [
"%APPDATA%\\Dolphin Emulator\\GC\\USA"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin/GC/USA"
]
}
},
{
"file": "GC/EUR/IPL.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu/GC/EUR"
],
"windows": [
"%APPDATA%\\Dolphin Emulator\\GC\\EUR"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin/GC/EUR"
]
}
},
{
"file": "GC/JAP/IPL.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu/GC/JAP"
],
"windows": [
"%APPDATA%\\Dolphin Emulator\\GC\\JAP"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin/GC/JAP"
]
}
},
{
"file": "dsp_rom.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu"
],
"windows": [
"%APPDATA%\\Dolphin Emulator"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin"
]
}
},
{
"file": "dsp_coef.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu"
],
"windows": [
"%APPDATA%\\Dolphin Emulator"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin"
]
}
},
{
"file": "PPSSPP/ppge_atlas.zim",
"targets": {
"linux": [
"$HOME/.config/ppsspp/PSP/SYSTEM"
],
"windows": [
"%USERPROFILE%\\Documents\\PPSSPP\\PSP\\SYSTEM"
],
"darwin": [
"$HOME/Library/Application Support/PPSSPP/PSP/SYSTEM"
]
}
},
{
"file": "dc/dc_boot.bin",
"targets": {
"linux": [
"$HOME/.local/share/flycast/data",
"$HOME/.var/app/org.flycast.Flycast/data/flycast"
],
"windows": [
"%APPDATA%\\flycast\\data"
]
}
},
{
"file": "dc/dc_nvmem.bin",
"targets": {
"linux": [
"$HOME/.local/share/flycast/data",
"$HOME/.var/app/org.flycast.Flycast/data/flycast"
],
"windows": [
"%APPDATA%\\flycast\\data"
]
}
}
],
"total_files": 1169, "total_files": 1169,
"total_size": 4777641221, "total_size": 4777641221,
"files": [ "files": [

View File

@@ -4,17 +4,232 @@
"platform": "retrodeck", "platform": "retrodeck",
"display_name": "RetroDECK", "display_name": "RetroDECK",
"version": "1.0", "version": "1.0",
"generated": "2026-04-02T13:53:43Z", "generated": "2026-04-03T09:44:33Z",
"base_destination": "", "base_destination": "",
"detect": [ "detect": [
{ {
"os": "linux", "os": "linux",
"method": "path_exists", "method": "path_exists",
"path": "$HOME/.var/app/net.retrodeck.retrodeck", "path": "$HOME/.var/app/net.retrodeck.retrodeck",
"bios_path": "$HOME/retrodeck/bios" "bios_path": "$HOME/retrodeck"
}
],
"standalone_copies": [
{
"file": "prod.keys",
"targets": {
"linux": [
"$HOME/.local/share/yuzu/keys",
"$HOME/.local/share/eden/keys",
"$HOME/.local/share/citron/keys",
"$HOME/.local/share/suyu/keys",
"$HOME/.config/Ryujinx/system"
],
"windows": [
"%APPDATA%\\yuzu\\keys",
"%APPDATA%\\eden\\keys",
"%APPDATA%\\citron\\keys",
"%APPDATA%\\suyu\\keys",
"%APPDATA%\\Ryujinx\\system"
],
"darwin": [
"$HOME/Library/Application Support/yuzu/keys",
"$HOME/Library/Application Support/Ryujinx/system"
]
}
},
{
"file": "title.keys",
"targets": {
"linux": [
"$HOME/.local/share/yuzu/keys",
"$HOME/.local/share/eden/keys",
"$HOME/.local/share/citron/keys",
"$HOME/.local/share/suyu/keys"
],
"windows": [
"%APPDATA%\\yuzu\\keys",
"%APPDATA%\\eden\\keys",
"%APPDATA%\\citron\\keys",
"%APPDATA%\\suyu\\keys"
],
"darwin": [
"$HOME/Library/Application Support/yuzu/keys"
]
}
},
{
"file": "Citra/sysdata/aes_keys.txt",
"targets": {
"linux": [
"$HOME/.local/share/azahar/sysdata"
],
"windows": [
"%APPDATA%\\Azahar\\sysdata"
]
}
},
{
"file": "Citra/sysdata/boot9.bin",
"targets": {
"linux": [
"$HOME/.local/share/azahar/sysdata"
],
"windows": [
"%APPDATA%\\Azahar\\sysdata"
]
}
},
{
"pattern": "scph*.bin",
"targets": {
"linux": [
"$HOME/.local/share/duckstation/bios"
],
"windows": [
"%LOCALAPPDATA%\\DuckStation\\bios",
"%USERPROFILE%\\Documents\\DuckStation\\bios"
],
"darwin": [
"$HOME/Library/Application Support/DuckStation/bios"
]
}
},
{
"pattern": "ps2-*.bin",
"targets": {
"linux": [
"$HOME/.config/PCSX2/bios",
"$HOME/.var/app/net.pcsx2.PCSX2/config/PCSX2/bios"
],
"windows": [
"%USERPROFILE%\\Documents\\PCSX2\\bios"
],
"darwin": [
"$HOME/Library/Application Support/PCSX2/bios"
]
}
},
{
"note": "PS3 firmware (PS3UPDAT.PUP) found. Install via RPCS3 > File > Install Firmware.",
"detect": {
"linux": [
"$HOME/.config/rpcs3"
],
"windows": [
"%APPDATA%\\rpcs3"
]
}
},
{
"file": "GC/USA/IPL.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu/GC/USA"
],
"windows": [
"%APPDATA%\\Dolphin Emulator\\GC\\USA"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin/GC/USA"
]
}
},
{
"file": "GC/EUR/IPL.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu/GC/EUR"
],
"windows": [
"%APPDATA%\\Dolphin Emulator\\GC\\EUR"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin/GC/EUR"
]
}
},
{
"file": "GC/JAP/IPL.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu/GC/JAP"
],
"windows": [
"%APPDATA%\\Dolphin Emulator\\GC\\JAP"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin/GC/JAP"
]
}
},
{
"file": "dsp_rom.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu"
],
"windows": [
"%APPDATA%\\Dolphin Emulator"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin"
]
}
},
{
"file": "dsp_coef.bin",
"targets": {
"linux": [
"$HOME/.local/share/dolphin-emu"
],
"windows": [
"%APPDATA%\\Dolphin Emulator"
],
"darwin": [
"$HOME/Library/Application Support/Dolphin"
]
}
},
{
"file": "PPSSPP/ppge_atlas.zim",
"targets": {
"linux": [
"$HOME/.config/ppsspp/PSP/SYSTEM"
],
"windows": [
"%USERPROFILE%\\Documents\\PPSSPP\\PSP\\SYSTEM"
],
"darwin": [
"$HOME/Library/Application Support/PPSSPP/PSP/SYSTEM"
]
}
},
{
"file": "dc/dc_boot.bin",
"targets": {
"linux": [
"$HOME/.local/share/flycast/data",
"$HOME/.var/app/org.flycast.Flycast/data/flycast"
],
"windows": [
"%APPDATA%\\flycast\\data"
]
}
},
{
"file": "dc/dc_nvmem.bin",
"targets": {
"linux": [
"$HOME/.local/share/flycast/data",
"$HOME/.var/app/org.flycast.Flycast/data/flycast"
],
"windows": [
"%APPDATA%\\flycast\\data"
]
}
} }
], ],
"standalone_copies": [],
"total_files": 3153, "total_files": 3153,
"total_size": 6351500734, "total_size": 6351500734,
"files": [ "files": [

View File

@@ -20,6 +20,8 @@ theme:
icon: material/brightness-4 icon: material/brightness-4
name: Switch to auto name: Switch to auto
font: false font: false
logo: assets/images/logo.png
favicon: assets/images/favicon.png
icon: icon:
logo: material/chip logo: material/chip
features: features:
@@ -52,6 +54,7 @@ plugins:
- search - search
nav: nav:
- Home: index.md - Home: index.md
- Which pack?: which-pack.md
- Platforms: - Platforms:
- Overview: platforms/index.md - Overview: platforms/index.md
- Batocera: platforms/batocera.md - Batocera: platforms/batocera.md
@@ -480,4 +483,5 @@ nav:
- Adding a scraper: wiki/adding-a-scraper.md - Adding a scraper: wiki/adding-a-scraper.md
- Testing guide: wiki/testing-guide.md - Testing guide: wiki/testing-guide.md
- Release process: wiki/release-process.md - Release process: wiki/release-process.md
- Community tools: wiki/community-tools.md
- Contributing: contributing.md - Contributing: contributing.md

View File

@@ -32,6 +32,144 @@ platforms:
method: config_file method: config_file
config: '%APPDATA%\RetroArch\retroarch.cfg' config: '%APPDATA%\RetroArch\retroarch.cfg'
parse_key: system_directory parse_key: system_directory
standalone_copies:
# Switch emulators (keys)
- file: prod.keys
targets:
linux:
- $HOME/.local/share/yuzu/keys
- $HOME/.local/share/eden/keys
- $HOME/.local/share/citron/keys
- $HOME/.local/share/suyu/keys
- $HOME/.config/Ryujinx/system
windows:
- '%APPDATA%\yuzu\keys'
- '%APPDATA%\eden\keys'
- '%APPDATA%\citron\keys'
- '%APPDATA%\suyu\keys'
- '%APPDATA%\Ryujinx\system'
darwin:
- $HOME/Library/Application Support/yuzu/keys
- $HOME/Library/Application Support/Ryujinx/system
- file: title.keys
targets:
linux:
- $HOME/.local/share/yuzu/keys
- $HOME/.local/share/eden/keys
- $HOME/.local/share/citron/keys
- $HOME/.local/share/suyu/keys
windows:
- '%APPDATA%\yuzu\keys'
- '%APPDATA%\eden\keys'
- '%APPDATA%\citron\keys'
- '%APPDATA%\suyu\keys'
darwin:
- $HOME/Library/Application Support/yuzu/keys
# 3DS emulators
- file: Citra/sysdata/aes_keys.txt
targets:
linux:
- $HOME/.local/share/azahar/sysdata
windows:
- '%APPDATA%\Azahar\sysdata'
- file: Citra/sysdata/boot9.bin
targets:
linux:
- $HOME/.local/share/azahar/sysdata
windows:
- '%APPDATA%\Azahar\sysdata'
# DuckStation (PS1)
- pattern: 'scph*.bin'
targets:
linux:
- $HOME/.local/share/duckstation/bios
windows:
- '%LOCALAPPDATA%\DuckStation\bios'
- '%USERPROFILE%\Documents\DuckStation\bios'
darwin:
- $HOME/Library/Application Support/DuckStation/bios
# PCSX2 (PS2)
- pattern: 'ps2-*.bin'
targets:
linux:
- $HOME/.config/PCSX2/bios
- $HOME/.var/app/net.pcsx2.PCSX2/config/PCSX2/bios
windows:
- '%USERPROFILE%\Documents\PCSX2\bios'
darwin:
- $HOME/Library/Application Support/PCSX2/bios
# RPCS3 (PS3) - needs menu install
- note: 'PS3 firmware (PS3UPDAT.PUP) found. Install via RPCS3 > File > Install Firmware.'
detect:
linux:
- $HOME/.config/rpcs3
windows:
- '%APPDATA%\rpcs3'
# Dolphin (GameCube)
- file: GC/USA/IPL.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu/GC/USA
windows:
- '%APPDATA%\Dolphin Emulator\GC\USA'
darwin:
- $HOME/Library/Application Support/Dolphin/GC/USA
- file: GC/EUR/IPL.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu/GC/EUR
windows:
- '%APPDATA%\Dolphin Emulator\GC\EUR'
darwin:
- $HOME/Library/Application Support/Dolphin/GC/EUR
- file: GC/JAP/IPL.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu/GC/JAP
windows:
- '%APPDATA%\Dolphin Emulator\GC\JAP'
darwin:
- $HOME/Library/Application Support/Dolphin/GC/JAP
- file: dsp_rom.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu
windows:
- '%APPDATA%\Dolphin Emulator'
darwin:
- $HOME/Library/Application Support/Dolphin
- file: dsp_coef.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu
windows:
- '%APPDATA%\Dolphin Emulator'
darwin:
- $HOME/Library/Application Support/Dolphin
# PPSSPP
- file: PPSSPP/ppge_atlas.zim
targets:
linux:
- $HOME/.config/ppsspp/PSP/SYSTEM
windows:
- '%USERPROFILE%\Documents\PPSSPP\PSP\SYSTEM'
darwin:
- $HOME/Library/Application Support/PPSSPP/PSP/SYSTEM
# Flycast (Dreamcast)
- file: dc/dc_boot.bin
targets:
linux:
- $HOME/.local/share/flycast/data
- $HOME/.var/app/org.flycast.Flycast/data/flycast
windows:
- '%APPDATA%\flycast\data'
- file: dc/dc_nvmem.bin
targets:
linux:
- $HOME/.local/share/flycast/data
- $HOME/.var/app/org.flycast.Flycast/data/flycast
windows:
- '%APPDATA%\flycast\data'
batocera: batocera:
config: batocera.yml config: batocera.yml
status: active status: active
@@ -256,6 +394,144 @@ platforms:
method: file_exists method: file_exists
file: /etc/batocera-version file: /etc/batocera-version
bios_path: /userdata/bios bios_path: /userdata/bios
standalone_copies:
# Switch emulators (keys)
- file: prod.keys
targets:
linux:
- $HOME/.local/share/yuzu/keys
- $HOME/.local/share/eden/keys
- $HOME/.local/share/citron/keys
- $HOME/.local/share/suyu/keys
- $HOME/.config/Ryujinx/system
windows:
- '%APPDATA%\yuzu\keys'
- '%APPDATA%\eden\keys'
- '%APPDATA%\citron\keys'
- '%APPDATA%\suyu\keys'
- '%APPDATA%\Ryujinx\system'
darwin:
- $HOME/Library/Application Support/yuzu/keys
- $HOME/Library/Application Support/Ryujinx/system
- file: title.keys
targets:
linux:
- $HOME/.local/share/yuzu/keys
- $HOME/.local/share/eden/keys
- $HOME/.local/share/citron/keys
- $HOME/.local/share/suyu/keys
windows:
- '%APPDATA%\yuzu\keys'
- '%APPDATA%\eden\keys'
- '%APPDATA%\citron\keys'
- '%APPDATA%\suyu\keys'
darwin:
- $HOME/Library/Application Support/yuzu/keys
# 3DS emulators
- file: Citra/sysdata/aes_keys.txt
targets:
linux:
- $HOME/.local/share/azahar/sysdata
windows:
- '%APPDATA%\Azahar\sysdata'
- file: Citra/sysdata/boot9.bin
targets:
linux:
- $HOME/.local/share/azahar/sysdata
windows:
- '%APPDATA%\Azahar\sysdata'
# DuckStation (PS1)
- pattern: 'scph*.bin'
targets:
linux:
- $HOME/.local/share/duckstation/bios
windows:
- '%LOCALAPPDATA%\DuckStation\bios'
- '%USERPROFILE%\Documents\DuckStation\bios'
darwin:
- $HOME/Library/Application Support/DuckStation/bios
# PCSX2 (PS2)
- pattern: 'ps2-*.bin'
targets:
linux:
- $HOME/.config/PCSX2/bios
- $HOME/.var/app/net.pcsx2.PCSX2/config/PCSX2/bios
windows:
- '%USERPROFILE%\Documents\PCSX2\bios'
darwin:
- $HOME/Library/Application Support/PCSX2/bios
# RPCS3 (PS3) - needs menu install
- note: 'PS3 firmware (PS3UPDAT.PUP) found. Install via RPCS3 > File > Install Firmware.'
detect:
linux:
- $HOME/.config/rpcs3
windows:
- '%APPDATA%\rpcs3'
# Dolphin (GameCube)
- file: GC/USA/IPL.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu/GC/USA
windows:
- '%APPDATA%\Dolphin Emulator\GC\USA'
darwin:
- $HOME/Library/Application Support/Dolphin/GC/USA
- file: GC/EUR/IPL.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu/GC/EUR
windows:
- '%APPDATA%\Dolphin Emulator\GC\EUR'
darwin:
- $HOME/Library/Application Support/Dolphin/GC/EUR
- file: GC/JAP/IPL.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu/GC/JAP
windows:
- '%APPDATA%\Dolphin Emulator\GC\JAP'
darwin:
- $HOME/Library/Application Support/Dolphin/GC/JAP
- file: dsp_rom.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu
windows:
- '%APPDATA%\Dolphin Emulator'
darwin:
- $HOME/Library/Application Support/Dolphin
- file: dsp_coef.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu
windows:
- '%APPDATA%\Dolphin Emulator'
darwin:
- $HOME/Library/Application Support/Dolphin
# PPSSPP
- file: PPSSPP/ppge_atlas.zim
targets:
linux:
- $HOME/.config/ppsspp/PSP/SYSTEM
windows:
- '%USERPROFILE%\Documents\PPSSPP\PSP\SYSTEM'
darwin:
- $HOME/Library/Application Support/PPSSPP/PSP/SYSTEM
# Flycast (Dreamcast)
- file: dc/dc_boot.bin
targets:
linux:
- $HOME/.local/share/flycast/data
- $HOME/.var/app/org.flycast.Flycast/data/flycast
windows:
- '%APPDATA%\flycast\data'
- file: dc/dc_nvmem.bin
targets:
linux:
- $HOME/.local/share/flycast/data
- $HOME/.var/app/org.flycast.Flycast/data/flycast
windows:
- '%APPDATA%\flycast\data'
recalbox: recalbox:
config: recalbox.yml config: recalbox.yml
status: active status: active
@@ -468,6 +744,144 @@ platforms:
method: file_exists method: file_exists
file: /usr/bin/recalbox-settings file: /usr/bin/recalbox-settings
bios_path: /recalbox/share/bios bios_path: /recalbox/share/bios
standalone_copies:
# Switch emulators (keys)
- file: prod.keys
targets:
linux:
- $HOME/.local/share/yuzu/keys
- $HOME/.local/share/eden/keys
- $HOME/.local/share/citron/keys
- $HOME/.local/share/suyu/keys
- $HOME/.config/Ryujinx/system
windows:
- '%APPDATA%\yuzu\keys'
- '%APPDATA%\eden\keys'
- '%APPDATA%\citron\keys'
- '%APPDATA%\suyu\keys'
- '%APPDATA%\Ryujinx\system'
darwin:
- $HOME/Library/Application Support/yuzu/keys
- $HOME/Library/Application Support/Ryujinx/system
- file: title.keys
targets:
linux:
- $HOME/.local/share/yuzu/keys
- $HOME/.local/share/eden/keys
- $HOME/.local/share/citron/keys
- $HOME/.local/share/suyu/keys
windows:
- '%APPDATA%\yuzu\keys'
- '%APPDATA%\eden\keys'
- '%APPDATA%\citron\keys'
- '%APPDATA%\suyu\keys'
darwin:
- $HOME/Library/Application Support/yuzu/keys
# 3DS emulators
- file: Citra/sysdata/aes_keys.txt
targets:
linux:
- $HOME/.local/share/azahar/sysdata
windows:
- '%APPDATA%\Azahar\sysdata'
- file: Citra/sysdata/boot9.bin
targets:
linux:
- $HOME/.local/share/azahar/sysdata
windows:
- '%APPDATA%\Azahar\sysdata'
# DuckStation (PS1)
- pattern: 'scph*.bin'
targets:
linux:
- $HOME/.local/share/duckstation/bios
windows:
- '%LOCALAPPDATA%\DuckStation\bios'
- '%USERPROFILE%\Documents\DuckStation\bios'
darwin:
- $HOME/Library/Application Support/DuckStation/bios
# PCSX2 (PS2)
- pattern: 'ps2-*.bin'
targets:
linux:
- $HOME/.config/PCSX2/bios
- $HOME/.var/app/net.pcsx2.PCSX2/config/PCSX2/bios
windows:
- '%USERPROFILE%\Documents\PCSX2\bios'
darwin:
- $HOME/Library/Application Support/PCSX2/bios
# RPCS3 (PS3) - needs menu install
- note: 'PS3 firmware (PS3UPDAT.PUP) found. Install via RPCS3 > File > Install Firmware.'
detect:
linux:
- $HOME/.config/rpcs3
windows:
- '%APPDATA%\rpcs3'
# Dolphin (GameCube)
- file: GC/USA/IPL.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu/GC/USA
windows:
- '%APPDATA%\Dolphin Emulator\GC\USA'
darwin:
- $HOME/Library/Application Support/Dolphin/GC/USA
- file: GC/EUR/IPL.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu/GC/EUR
windows:
- '%APPDATA%\Dolphin Emulator\GC\EUR'
darwin:
- $HOME/Library/Application Support/Dolphin/GC/EUR
- file: GC/JAP/IPL.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu/GC/JAP
windows:
- '%APPDATA%\Dolphin Emulator\GC\JAP'
darwin:
- $HOME/Library/Application Support/Dolphin/GC/JAP
- file: dsp_rom.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu
windows:
- '%APPDATA%\Dolphin Emulator'
darwin:
- $HOME/Library/Application Support/Dolphin
- file: dsp_coef.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu
windows:
- '%APPDATA%\Dolphin Emulator'
darwin:
- $HOME/Library/Application Support/Dolphin
# PPSSPP
- file: PPSSPP/ppge_atlas.zim
targets:
linux:
- $HOME/.config/ppsspp/PSP/SYSTEM
windows:
- '%USERPROFILE%\Documents\PPSSPP\PSP\SYSTEM'
darwin:
- $HOME/Library/Application Support/PPSSPP/PSP/SYSTEM
# Flycast (Dreamcast)
- file: dc/dc_boot.bin
targets:
linux:
- $HOME/.local/share/flycast/data
- $HOME/.var/app/org.flycast.Flycast/data/flycast
windows:
- '%APPDATA%\flycast\data'
- file: dc/dc_nvmem.bin
targets:
linux:
- $HOME/.local/share/flycast/data
- $HOME/.var/app/org.flycast.Flycast/data/flycast
windows:
- '%APPDATA%\flycast\data'
retrobat: retrobat:
config: retrobat.yml config: retrobat.yml
status: active status: active
@@ -653,6 +1067,144 @@ platforms:
- os: windows - os: windows
method: path_exists method: path_exists
path: '%USERPROFILE%\RetroBat\bios' path: '%USERPROFILE%\RetroBat\bios'
standalone_copies:
# Switch emulators (keys)
- file: prod.keys
targets:
linux:
- $HOME/.local/share/yuzu/keys
- $HOME/.local/share/eden/keys
- $HOME/.local/share/citron/keys
- $HOME/.local/share/suyu/keys
- $HOME/.config/Ryujinx/system
windows:
- '%APPDATA%\yuzu\keys'
- '%APPDATA%\eden\keys'
- '%APPDATA%\citron\keys'
- '%APPDATA%\suyu\keys'
- '%APPDATA%\Ryujinx\system'
darwin:
- $HOME/Library/Application Support/yuzu/keys
- $HOME/Library/Application Support/Ryujinx/system
- file: title.keys
targets:
linux:
- $HOME/.local/share/yuzu/keys
- $HOME/.local/share/eden/keys
- $HOME/.local/share/citron/keys
- $HOME/.local/share/suyu/keys
windows:
- '%APPDATA%\yuzu\keys'
- '%APPDATA%\eden\keys'
- '%APPDATA%\citron\keys'
- '%APPDATA%\suyu\keys'
darwin:
- $HOME/Library/Application Support/yuzu/keys
# 3DS emulators
- file: Citra/sysdata/aes_keys.txt
targets:
linux:
- $HOME/.local/share/azahar/sysdata
windows:
- '%APPDATA%\Azahar\sysdata'
- file: Citra/sysdata/boot9.bin
targets:
linux:
- $HOME/.local/share/azahar/sysdata
windows:
- '%APPDATA%\Azahar\sysdata'
# DuckStation (PS1)
- pattern: 'scph*.bin'
targets:
linux:
- $HOME/.local/share/duckstation/bios
windows:
- '%LOCALAPPDATA%\DuckStation\bios'
- '%USERPROFILE%\Documents\DuckStation\bios'
darwin:
- $HOME/Library/Application Support/DuckStation/bios
# PCSX2 (PS2)
- pattern: 'ps2-*.bin'
targets:
linux:
- $HOME/.config/PCSX2/bios
- $HOME/.var/app/net.pcsx2.PCSX2/config/PCSX2/bios
windows:
- '%USERPROFILE%\Documents\PCSX2\bios'
darwin:
- $HOME/Library/Application Support/PCSX2/bios
# RPCS3 (PS3) - needs menu install
- note: 'PS3 firmware (PS3UPDAT.PUP) found. Install via RPCS3 > File > Install Firmware.'
detect:
linux:
- $HOME/.config/rpcs3
windows:
- '%APPDATA%\rpcs3'
# Dolphin (GameCube)
- file: GC/USA/IPL.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu/GC/USA
windows:
- '%APPDATA%\Dolphin Emulator\GC\USA'
darwin:
- $HOME/Library/Application Support/Dolphin/GC/USA
- file: GC/EUR/IPL.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu/GC/EUR
windows:
- '%APPDATA%\Dolphin Emulator\GC\EUR'
darwin:
- $HOME/Library/Application Support/Dolphin/GC/EUR
- file: GC/JAP/IPL.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu/GC/JAP
windows:
- '%APPDATA%\Dolphin Emulator\GC\JAP'
darwin:
- $HOME/Library/Application Support/Dolphin/GC/JAP
- file: dsp_rom.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu
windows:
- '%APPDATA%\Dolphin Emulator'
darwin:
- $HOME/Library/Application Support/Dolphin
- file: dsp_coef.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu
windows:
- '%APPDATA%\Dolphin Emulator'
darwin:
- $HOME/Library/Application Support/Dolphin
# PPSSPP
- file: PPSSPP/ppge_atlas.zim
targets:
linux:
- $HOME/.config/ppsspp/PSP/SYSTEM
windows:
- '%USERPROFILE%\Documents\PPSSPP\PSP\SYSTEM'
darwin:
- $HOME/Library/Application Support/PPSSPP/PSP/SYSTEM
# Flycast (Dreamcast)
- file: dc/dc_boot.bin
targets:
linux:
- $HOME/.local/share/flycast/data
- $HOME/.var/app/org.flycast.Flycast/data/flycast
windows:
- '%APPDATA%\flycast\data'
- file: dc/dc_nvmem.bin
targets:
linux:
- $HOME/.local/share/flycast/data
- $HOME/.var/app/org.flycast.Flycast/data/flycast
windows:
- '%APPDATA%\flycast\data'
emudeck: emudeck:
config: emudeck.yml config: emudeck.yml
status: active status: active
@@ -681,19 +1233,143 @@ platforms:
parse_key: $emulationPath parse_key: $emulationPath
bios_subdir: bios bios_subdir: bios
standalone_copies: standalone_copies:
# Switch emulators (keys)
- file: prod.keys - file: prod.keys
targets: targets:
linux: linux:
- $HOME/.local/share/yuzu/keys - $HOME/.local/share/yuzu/keys
- $HOME/.local/share/eden/keys - $HOME/.local/share/eden/keys
- $HOME/.local/share/citron/keys
- $HOME/.local/share/suyu/keys
- $HOME/.config/Ryujinx/system - $HOME/.config/Ryujinx/system
windows: windows:
- '%APPDATA%\yuzu\keys' - '%APPDATA%\yuzu\keys'
- '%APPDATA%\eden\keys' - '%APPDATA%\eden\keys'
- file: aes_keys.txt - '%APPDATA%\citron\keys'
- '%APPDATA%\suyu\keys'
- '%APPDATA%\Ryujinx\system'
darwin:
- $HOME/Library/Application Support/yuzu/keys
- $HOME/Library/Application Support/Ryujinx/system
- file: title.keys
targets: targets:
linux: linux:
- $HOME/Emulation/bios/citra/keys - $HOME/.local/share/yuzu/keys
- $HOME/.local/share/eden/keys
- $HOME/.local/share/citron/keys
- $HOME/.local/share/suyu/keys
windows:
- '%APPDATA%\yuzu\keys'
- '%APPDATA%\eden\keys'
- '%APPDATA%\citron\keys'
- '%APPDATA%\suyu\keys'
darwin:
- $HOME/Library/Application Support/yuzu/keys
# 3DS emulators
- file: Citra/sysdata/aes_keys.txt
targets:
linux:
- $HOME/.local/share/azahar/sysdata
windows:
- '%APPDATA%\Azahar\sysdata'
- file: Citra/sysdata/boot9.bin
targets:
linux:
- $HOME/.local/share/azahar/sysdata
windows:
- '%APPDATA%\Azahar\sysdata'
# DuckStation (PS1)
- pattern: 'scph*.bin'
targets:
linux:
- $HOME/.local/share/duckstation/bios
windows:
- '%LOCALAPPDATA%\DuckStation\bios'
- '%USERPROFILE%\Documents\DuckStation\bios'
darwin:
- $HOME/Library/Application Support/DuckStation/bios
# PCSX2 (PS2)
- pattern: 'ps2-*.bin'
targets:
linux:
- $HOME/.config/PCSX2/bios
- $HOME/.var/app/net.pcsx2.PCSX2/config/PCSX2/bios
windows:
- '%USERPROFILE%\Documents\PCSX2\bios'
darwin:
- $HOME/Library/Application Support/PCSX2/bios
# RPCS3 (PS3) - needs menu install
- note: 'PS3 firmware (PS3UPDAT.PUP) found. Install via RPCS3 > File > Install Firmware.'
detect:
linux:
- $HOME/.config/rpcs3
windows:
- '%APPDATA%\rpcs3'
# Dolphin (GameCube)
- file: GC/USA/IPL.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu/GC/USA
windows:
- '%APPDATA%\Dolphin Emulator\GC\USA'
darwin:
- $HOME/Library/Application Support/Dolphin/GC/USA
- file: GC/EUR/IPL.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu/GC/EUR
windows:
- '%APPDATA%\Dolphin Emulator\GC\EUR'
darwin:
- $HOME/Library/Application Support/Dolphin/GC/EUR
- file: GC/JAP/IPL.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu/GC/JAP
windows:
- '%APPDATA%\Dolphin Emulator\GC\JAP'
darwin:
- $HOME/Library/Application Support/Dolphin/GC/JAP
- file: dsp_rom.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu
windows:
- '%APPDATA%\Dolphin Emulator'
darwin:
- $HOME/Library/Application Support/Dolphin
- file: dsp_coef.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu
windows:
- '%APPDATA%\Dolphin Emulator'
darwin:
- $HOME/Library/Application Support/Dolphin
# PPSSPP
- file: PPSSPP/ppge_atlas.zim
targets:
linux:
- $HOME/.config/ppsspp/PSP/SYSTEM
windows:
- '%USERPROFILE%\Documents\PPSSPP\PSP\SYSTEM'
darwin:
- $HOME/Library/Application Support/PPSSPP/PSP/SYSTEM
# Flycast (Dreamcast)
- file: dc/dc_boot.bin
targets:
linux:
- $HOME/.local/share/flycast/data
- $HOME/.var/app/org.flycast.Flycast/data/flycast
windows:
- '%APPDATA%\flycast\data'
- file: dc/dc_nvmem.bin
targets:
linux:
- $HOME/.local/share/flycast/data
- $HOME/.var/app/org.flycast.Flycast/data/flycast
windows:
- '%APPDATA%\flycast\data'
lakka: lakka:
config: lakka.yml config: lakka.yml
status: active status: active
@@ -752,7 +1428,145 @@ platforms:
- os: linux - os: linux
method: path_exists method: path_exists
path: $HOME/.var/app/net.retrodeck.retrodeck path: $HOME/.var/app/net.retrodeck.retrodeck
bios_path: $HOME/retrodeck/bios bios_path: $HOME/retrodeck
standalone_copies:
# Switch emulators (keys)
- file: prod.keys
targets:
linux:
- $HOME/.local/share/yuzu/keys
- $HOME/.local/share/eden/keys
- $HOME/.local/share/citron/keys
- $HOME/.local/share/suyu/keys
- $HOME/.config/Ryujinx/system
windows:
- '%APPDATA%\yuzu\keys'
- '%APPDATA%\eden\keys'
- '%APPDATA%\citron\keys'
- '%APPDATA%\suyu\keys'
- '%APPDATA%\Ryujinx\system'
darwin:
- $HOME/Library/Application Support/yuzu/keys
- $HOME/Library/Application Support/Ryujinx/system
- file: title.keys
targets:
linux:
- $HOME/.local/share/yuzu/keys
- $HOME/.local/share/eden/keys
- $HOME/.local/share/citron/keys
- $HOME/.local/share/suyu/keys
windows:
- '%APPDATA%\yuzu\keys'
- '%APPDATA%\eden\keys'
- '%APPDATA%\citron\keys'
- '%APPDATA%\suyu\keys'
darwin:
- $HOME/Library/Application Support/yuzu/keys
# 3DS emulators
- file: Citra/sysdata/aes_keys.txt
targets:
linux:
- $HOME/.local/share/azahar/sysdata
windows:
- '%APPDATA%\Azahar\sysdata'
- file: Citra/sysdata/boot9.bin
targets:
linux:
- $HOME/.local/share/azahar/sysdata
windows:
- '%APPDATA%\Azahar\sysdata'
# DuckStation (PS1)
- pattern: 'scph*.bin'
targets:
linux:
- $HOME/.local/share/duckstation/bios
windows:
- '%LOCALAPPDATA%\DuckStation\bios'
- '%USERPROFILE%\Documents\DuckStation\bios'
darwin:
- $HOME/Library/Application Support/DuckStation/bios
# PCSX2 (PS2)
- pattern: 'ps2-*.bin'
targets:
linux:
- $HOME/.config/PCSX2/bios
- $HOME/.var/app/net.pcsx2.PCSX2/config/PCSX2/bios
windows:
- '%USERPROFILE%\Documents\PCSX2\bios'
darwin:
- $HOME/Library/Application Support/PCSX2/bios
# RPCS3 (PS3) - needs menu install
- note: 'PS3 firmware (PS3UPDAT.PUP) found. Install via RPCS3 > File > Install Firmware.'
detect:
linux:
- $HOME/.config/rpcs3
windows:
- '%APPDATA%\rpcs3'
# Dolphin (GameCube)
- file: GC/USA/IPL.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu/GC/USA
windows:
- '%APPDATA%\Dolphin Emulator\GC\USA'
darwin:
- $HOME/Library/Application Support/Dolphin/GC/USA
- file: GC/EUR/IPL.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu/GC/EUR
windows:
- '%APPDATA%\Dolphin Emulator\GC\EUR'
darwin:
- $HOME/Library/Application Support/Dolphin/GC/EUR
- file: GC/JAP/IPL.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu/GC/JAP
windows:
- '%APPDATA%\Dolphin Emulator\GC\JAP'
darwin:
- $HOME/Library/Application Support/Dolphin/GC/JAP
- file: dsp_rom.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu
windows:
- '%APPDATA%\Dolphin Emulator'
darwin:
- $HOME/Library/Application Support/Dolphin
- file: dsp_coef.bin
targets:
linux:
- $HOME/.local/share/dolphin-emu
windows:
- '%APPDATA%\Dolphin Emulator'
darwin:
- $HOME/Library/Application Support/Dolphin
# PPSSPP
- file: PPSSPP/ppge_atlas.zim
targets:
linux:
- $HOME/.config/ppsspp/PSP/SYSTEM
windows:
- '%USERPROFILE%\Documents\PPSSPP\PSP\SYSTEM'
darwin:
- $HOME/Library/Application Support/PPSSPP/PSP/SYSTEM
# Flycast (Dreamcast)
- file: dc/dc_boot.bin
targets:
linux:
- $HOME/.local/share/flycast/data
- $HOME/.var/app/org.flycast.Flycast/data/flycast
windows:
- '%APPDATA%\flycast\data'
- file: dc/dc_nvmem.bin
targets:
linux:
- $HOME/.local/share/flycast/data
- $HOME/.var/app/org.flycast.Flycast/data/flycast
windows:
- '%APPDATA%\flycast\data'
romm: romm:
config: romm.yml config: romm.yml
status: active status: active

View File

@@ -743,15 +743,13 @@ def group_identical_platforms(
inherits[platform] = False inherits[platform] = False
continue continue
base_dest = config.get("base_destination", "")
entries = [] entries = []
for sys_id, system in sorted(config.get("systems", {}).items()): for sys_id, system in sorted(config.get("systems", {}).items()):
for fe in system.get("files", []): for fe in system.get("files", []):
dest = fe.get("destination", fe.get("name", "")) dest = fe.get("destination", fe.get("name", ""))
full_dest = f"{base_dest}/{dest}" if base_dest else dest
sha1 = fe.get("sha1", "") sha1 = fe.get("sha1", "")
md5 = fe.get("md5", "") md5 = fe.get("md5", "")
entries.append(f"{full_dest}|{sha1}|{md5}") entries.append(f"{dest}|{sha1}|{md5}")
fp = hashlib.sha1("|".join(sorted(entries)).encode()).hexdigest() fp = hashlib.sha1("|".join(sorted(entries)).encode()).hexdigest()
if target_cores_cache: if target_cores_cache:

View File

@@ -246,6 +246,13 @@ def _register_path(dest: str, seen_files: set[str], seen_parents: set[str]) -> N
seen_parents.add(parent) seen_parents.add(parent)
def _flat(arcname: str, prefix: str, flatten: bool) -> str:
"""Strip base_destination prefix from ZIP arcname when flattening."""
if flatten and prefix and arcname.startswith(prefix + "/"):
return arcname[len(prefix) + 1:]
return arcname
def resolve_file( def resolve_file(
file_entry: dict, file_entry: dict,
db: dict, db: dict,
@@ -783,15 +790,14 @@ def _build_readme(
" 1. Find your RetroArch system directory:\n" " 1. Find your RetroArch system directory:\n"
" - RetroArch > Settings > Directory > System/BIOS\n" " - RetroArch > Settings > Directory > System/BIOS\n"
" - Default: retroarch/system/\n" " - Default: retroarch/system/\n"
' 2. Open the "system" folder from this archive\n' " 2. Extract all files from this archive directly into your system directory\n"
" 3. Copy ALL contents into your system directory\n" " 3. Overwrite if asked\n\n"
" 4. Overwrite if asked\n\n"
" Option C: Manual (handheld / SD card)\n" " Option C: Manual (handheld / SD card)\n"
" -------------------------------------\n" " -------------------------------------\n"
" Anbernic, Retroid, Miyoo, Trimui, etc.:\n" " Anbernic, Retroid, Miyoo, Trimui, etc.:\n"
" 1. Connect your SD card to your PC\n" " 1. Connect your SD card to your PC\n"
" 2. Find the BIOS folder (usually BIOS/ or system/)\n" " 2. Find the BIOS folder (usually BIOS/ or system/)\n"
' 3. Copy ALL contents of "system" from this archive\n' " 3. Extract all files from this archive directly into that folder\n"
" 4. Eject SD card and reboot your device\n\n" " 4. Eject SD card and reboot your device\n\n"
" Common paths by device:\n" " Common paths by device:\n"
" Anbernic (ArkOS/JELOS): BIOS/\n" " Anbernic (ArkOS/JELOS): BIOS/\n"
@@ -810,14 +816,13 @@ def _build_readme(
" 1. On your PC, open the Batocera network share:\n" " 1. On your PC, open the Batocera network share:\n"
" - Windows: \\\\BATOCERA\\share\\bios\\\n" " - Windows: \\\\BATOCERA\\share\\bios\\\n"
" - Mac/Linux: smb://batocera/share/bios/\n" " - Mac/Linux: smb://batocera/share/bios/\n"
' 2. Open the "bios" folder from this archive\n' " 2. Extract all files from this archive directly into the share\n"
" 3. Copy ALL contents into the share\n" " 3. Overwrite if asked\n\n"
" 4. Overwrite if asked\n\n"
" Option C: Manual (SD card)\n" " Option C: Manual (SD card)\n"
" --------------------------\n" " --------------------------\n"
" 1. Put the SD card in your PC\n" " 1. Put the SD card in your PC\n"
" 2. Navigate to /userdata/bios/ on the SHARE partition\n" " 2. Navigate to /userdata/bios/ on the SHARE partition\n"
' 3. Copy ALL contents of "bios" from this archive\n\n' " 3. Extract all files from this archive directly into that folder\n\n"
" NOTE: Dreamcast flash memory is named dc_nvmem.bin\n" " NOTE: Dreamcast flash memory is named dc_nvmem.bin\n"
" (if your setup asks for dc_flash.bin, same file).\n\n" " (if your setup asks for dc_flash.bin, same file).\n\n"
), ),
@@ -831,13 +836,12 @@ def _build_readme(
" 1. On your PC, open the Recalbox network share:\n" " 1. On your PC, open the Recalbox network share:\n"
" - Windows: \\\\RECALBOX\\share\\bios\\\n" " - Windows: \\\\RECALBOX\\share\\bios\\\n"
" - Mac/Linux: smb://recalbox/share/bios/\n" " - Mac/Linux: smb://recalbox/share/bios/\n"
' 2. Open the "bios" folder from this archive\n' " 2. Extract all files from this archive directly into the share\n\n"
" 3. Copy ALL contents into the share\n\n"
" Option C: Manual (SD card)\n" " Option C: Manual (SD card)\n"
" --------------------------\n" " --------------------------\n"
" 1. Put the SD card in your PC\n" " 1. Put the SD card in your PC\n"
" 2. Navigate to /recalbox/share/bios/\n" " 2. Navigate to /recalbox/share/bios/\n"
' 3. Copy ALL contents of "bios" from this archive\n\n' " 3. Extract all files from this archive directly into that folder\n\n"
), ),
"emudeck": ( "emudeck": (
"INSTALLATION GUIDE (Steam Deck / Linux)\n\n" "INSTALLATION GUIDE (Steam Deck / Linux)\n\n"
@@ -851,8 +855,7 @@ def _build_readme(
" ----------------\n" " ----------------\n"
" 1. Open Dolphin file manager\n" " 1. Open Dolphin file manager\n"
" 2. Navigate to ~/Emulation/bios/\n" " 2. Navigate to ~/Emulation/bios/\n"
' 3. Open the "bios" folder from this archive\n' " 3. Extract all files from this archive directly into ~/Emulation/bios/\n\n"
" 4. Copy ALL contents into ~/Emulation/bios/\n\n"
" STANDALONE EMULATORS (extra step)\n" " STANDALONE EMULATORS (extra step)\n"
" Switch and 3DS emulators need keys in specific folders:\n" " Switch and 3DS emulators need keys in specific folders:\n"
" prod.keys -> ~/.local/share/yuzu/keys/\n" " prod.keys -> ~/.local/share/yuzu/keys/\n"
@@ -871,11 +874,8 @@ def _build_readme(
" ----------------\n" " ----------------\n"
" 1. Open Dolphin file manager\n" " 1. Open Dolphin file manager\n"
" 2. Show hidden files (Ctrl+H)\n" " 2. Show hidden files (Ctrl+H)\n"
" 3. Navigate to ~/retrodeck/\n" " 3. Navigate to ~/retrodeck/bios/\n"
' 4. Open the "bios" folder from this archive\n' " 4. Extract all files from this archive directly into ~/retrodeck/bios/\n\n"
" 5. Copy ALL contents into ~/retrodeck/bios/\n"
' 6. If the archive contains a "roms" folder, copy\n'
" its contents into ~/retrodeck/roms/\n\n"
" NOTE: RetroDECK uses its own BIOS checker. After\n" " NOTE: RetroDECK uses its own BIOS checker. After\n"
" copying, open RetroDECK > Tools > BIOS Checker to\n" " copying, open RetroDECK > Tools > BIOS Checker to\n"
" verify everything is detected.\n\n" " verify everything is detected.\n\n"
@@ -891,9 +891,8 @@ def _build_readme(
" 1. Open your RetroBat installation folder\n" " 1. Open your RetroBat installation folder\n"
" 2. Navigate to the bios\\ subfolder\n" " 2. Navigate to the bios\\ subfolder\n"
" (default: C:\\RetroBat\\bios\\)\n" " (default: C:\\RetroBat\\bios\\)\n"
' 3. Open the "bios" folder from this archive\n' " 3. Extract all files from this archive directly into your bios\\ folder\n"
" 4. Copy ALL contents into your bios\\ folder\n" " 4. Overwrite if asked\n\n"
" 5. Overwrite if asked\n\n"
), ),
"bizhawk": ( "bizhawk": (
"INSTALLATION GUIDE\n\n" "INSTALLATION GUIDE\n\n"
@@ -901,16 +900,15 @@ def _build_readme(
" 2. Navigate to the Firmware subfolder:\n" " 2. Navigate to the Firmware subfolder:\n"
" - Windows: BizHawk\\Firmware\\\n" " - Windows: BizHawk\\Firmware\\\n"
" - Linux: ~/.config/BizHawk/Firmware/\n" " - Linux: ~/.config/BizHawk/Firmware/\n"
' 3. Open the "Firmware" folder from this archive\n' " 3. Extract all files from this archive directly into your Firmware folder\n"
" 4. Copy ALL contents into your Firmware folder\n" " 4. In BizHawk: Config > Paths > Firmware should\n"
" 5. In BizHawk: Config > Paths > Firmware should\n"
" point to this folder\n\n" " point to this folder\n\n"
), ),
"romm": ( "romm": (
"INSTALLATION GUIDE (RomM server)\n\n" "INSTALLATION GUIDE (RomM server)\n\n"
" 1. Locate your RomM library folder\n" " 1. Locate your RomM library folder\n"
" 2. Navigate to the bios/ subdirectory\n" " 2. Navigate to the bios/ subdirectory\n"
' 3. Copy ALL contents of "bios" from this archive\n' " 3. Extract all files from this archive directly into that folder\n"
" 4. Restart the RomM service to detect new files\n\n" " 4. Restart the RomM service to detect new files\n\n"
), ),
"retropie": ( "retropie": (
@@ -918,7 +916,7 @@ def _build_readme(
" Option A: Via network share\n" " Option A: Via network share\n"
" --------------------------\n" " --------------------------\n"
" 1. On your PC, open: \\\\RETROPIE\\bios\\\n" " 1. On your PC, open: \\\\RETROPIE\\bios\\\n"
' 2. Copy ALL contents of "BIOS" from this archive\n\n' " 2. Extract all files from this archive directly into that folder\n\n"
" Option B: Via SSH\n" " Option B: Via SSH\n"
" -----------------\n" " -----------------\n"
" 1. SSH into your Pi: ssh pi@retropie\n" " 1. SSH into your Pi: ssh pi@retropie\n"
@@ -927,7 +925,7 @@ def _build_readme(
" ---------------------\n" " ---------------------\n"
" 1. Put the SD card in your PC\n" " 1. Put the SD card in your PC\n"
" 2. Navigate to /home/pi/RetroPie/BIOS/\n" " 2. Navigate to /home/pi/RetroPie/BIOS/\n"
' 3. Copy ALL contents of "BIOS" from this archive\n\n' " 3. Extract all files from this archive directly into that folder\n\n"
), ),
} }
@@ -938,9 +936,8 @@ def _build_readme(
platform_name, platform_name,
( (
f"INSTALLATION\n\n" f"INSTALLATION\n\n"
f' 1. Open the "{base_dest or "files"}" folder in this archive\n' f" 1. Extract all files from this archive directly into your BIOS directory\n"
f" 2. Copy ALL contents to your BIOS directory\n" f" 2. Overwrite if asked\n\n"
f" 3. Overwrite if asked\n\n"
), ),
) )
@@ -977,10 +974,7 @@ def _build_readme(
credits = "\nCONTRIBUTORS\n\n" credits = "\nCONTRIBUTORS\n\n"
for cb in contributors: for cb in contributors:
username = cb.get("username", "") username = cb.get("username", "")
contribution = cb.get("contribution", "") credits += f" @{username}\n"
pr = cb.get("pr")
pr_ref = f" (#{pr})" if pr else ""
credits += f" @{username} - {contribution}{pr_ref}\n"
credits += "\n" credits += "\n"
return header + source_info + guide + credits + footer return header + source_info + guide + credits + footer
@@ -1022,6 +1016,7 @@ def generate_pack(
system_filter: list[str] | None = None, system_filter: list[str] | None = None,
precomputed_extras: list[dict] | None = None, precomputed_extras: list[dict] | None = None,
source: str = "full", source: str = "full",
flatten: bool = True,
) -> str | None: ) -> str | None:
"""Generate a ZIP pack for a platform. """Generate a ZIP pack for a platform.
@@ -1157,7 +1152,7 @@ def generate_pack(
f"{base_dest}/{instr_name}" if base_dest else instr_name f"{base_dest}/{instr_name}" if base_dest else instr_name
) )
zf.writestr( zf.writestr(
instr_path, _flat(instr_path, base_dest, flatten),
f"File needed: {file_entry['name']}\n\n{instructions}\n", f"File needed: {file_entry['name']}\n\n{instructions}\n",
) )
user_provided.append(file_entry["name"]) user_provided.append(file_entry["name"])
@@ -1183,9 +1178,9 @@ def generate_pack(
if download_external(file_entry, tmp_path): if download_external(file_entry, tmp_path):
extract = file_entry.get("extract", False) extract = file_entry.get("extract", False)
if extract and tmp_path.endswith(".zip"): if extract and tmp_path.endswith(".zip"):
_extract_zip_to_archive(tmp_path, full_dest, zf) _extract_zip_to_archive(tmp_path, _flat(full_dest, base_dest, flatten), zf)
else: else:
zf.write(tmp_path, full_dest) zf.write(tmp_path, _flat(full_dest, base_dest, flatten))
seen_destinations.add(dedup_key) seen_destinations.add(dedup_key)
_register_path(dedup_key, seen_destinations, seen_parents) _register_path(dedup_key, seen_destinations, seen_parents)
if case_insensitive: if case_insensitive:
@@ -1263,7 +1258,7 @@ def generate_pack(
else readme_name else readme_name
) )
if readme_full not in seen_destinations: if readme_full not in seen_destinations:
zf.writestr(readme_full, readme_text) zf.writestr(_flat(readme_full, base_dest, flatten), readme_text)
seen_destinations.add(readme_full) seen_destinations.add(readme_full)
status = "agnostic_fallback" status = "agnostic_fallback"
# Fall through to normal packing below # Fall through to normal packing below
@@ -1349,12 +1344,13 @@ def generate_pack(
seen_lower.add(dedup_key.lower()) seen_lower.add(dedup_key.lower())
extract = file_entry.get("extract", False) extract = file_entry.get("extract", False)
flat_dest = _flat(full_dest, base_dest, flatten)
if extract and local_path.endswith(".zip"): if extract and local_path.endswith(".zip"):
_extract_zip_to_archive(local_path, full_dest, zf) _extract_zip_to_archive(local_path, flat_dest, zf)
elif local_path.endswith(".zip"): elif local_path.endswith(".zip"):
_normalize_zip_for_pack(local_path, full_dest, zf) _normalize_zip_for_pack(local_path, flat_dest, zf)
else: else:
zf.write(local_path, full_dest) zf.write(local_path, flat_dest)
total_files += 1 total_files += 1
# Core requirements: files platform's cores need but YAML doesn't declare # Core requirements: files platform's cores need but YAML doesn't declare
@@ -1440,10 +1436,11 @@ def generate_pack(
if status in ("not_found", "external", "user_provided"): if status in ("not_found", "external", "user_provided"):
continue continue
flat_dest = _flat(full_dest, base_dest, flatten)
if local_path.endswith(".zip"): if local_path.endswith(".zip"):
_normalize_zip_for_pack(local_path, full_dest, zf) _normalize_zip_for_pack(local_path, flat_dest, zf)
else: else:
zf.write(local_path, full_dest) zf.write(local_path, flat_dest)
seen_destinations.add(full_dest) seen_destinations.add(full_dest)
_register_path(full_dest, seen_destinations, seen_parents) _register_path(full_dest, seen_destinations, seen_parents)
if case_insensitive: if case_insensitive:
@@ -1489,7 +1486,7 @@ def generate_pack(
_register_path(full, seen_destinations, seen_parents) _register_path(full, seen_destinations, seen_parents)
if case_insensitive: if case_insensitive:
seen_lower.add(full.lower()) seen_lower.add(full.lower())
zf.write(src, full) zf.write(src, _flat(full, base_dest, flatten))
total_files += 1 total_files += 1
# README.txt for users -personalized step-by-step per platform # README.txt for users -personalized step-by-step per platform
@@ -2432,6 +2429,11 @@ def _run_verify_packs(args):
with zipfile.ZipFile(zip_path) as zf: with zipfile.ZipFile(zip_path) as zf:
zf.extractall(extract_dir) zf.extractall(extract_dir)
# Auto-detect flat vs nested extraction
is_flat = bool(base_dest) and not os.path.isdir(
os.path.join(extract_dir, base_dest)
)
missing = [] missing = []
hash_fail = [] hash_fail = []
ok = 0 ok = 0
@@ -2442,7 +2444,7 @@ def _run_verify_packs(args):
continue continue
fp = ( fp = (
os.path.join(extract_dir, base_dest, dest) os.path.join(extract_dir, base_dest, dest)
if base_dest if base_dest and not is_flat
else os.path.join(extract_dir, dest) else os.path.join(extract_dir, dest)
) )
# Case-insensitive fallback # Case-insensitive fallback
@@ -2613,9 +2615,11 @@ def _run_platform_packs(
load_platform_config(p, args.platforms_dir).get("platform", p) load_platform_config(p, args.platforms_dir).get("platform", p)
for p in group_platforms for p in group_platforms
] ]
source_tag = {"platform": "_Platform", "truth": "_Truth"}.get(source, "")
req_tag = "_Required" if required_only else ""
combined = ( combined = (
"_".join(n.replace(" ", "") for n in all_names) "_".join(n.replace(" ", "") for n in all_names)
+ f"{ver_tag}_BIOS_Pack.zip" + f"{ver_tag}{source_tag}{req_tag}_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)
if new_path != zip_path: if new_path != zip_path:
@@ -3275,7 +3279,11 @@ def verify_pack(
# Data directory: check against cached files # Data directory: check against cached files
if status == "untracked" and _data_index: if status == "untracked" and _data_index:
_bn = os.path.basename(name) _bn = os.path.basename(name)
_pr = name[len("system/") :] if name.startswith("system/") else name _pr = name
for _known_prefix in ("system/", "bios/", "BIOS/", "Firmware/"):
if name.startswith(_known_prefix):
_pr = name[len(_known_prefix):]
break
_cands = [] _cands = []
if _pr in _data_path_index: if _pr in _data_path_index:
_cands.append(_data_path_index[_pr]) _cands.append(_data_path_index[_pr])
@@ -3442,6 +3450,13 @@ def verify_pack_against_platform(
zip_set = set(zf.namelist()) zip_set = set(zf.namelist())
zip_lower = {n.lower(): n for n in zip_set} zip_lower = {n.lower(): n for n in zip_set}
# Auto-detect flat vs nested ZIP
is_flat = bool(base_dest) and not any(
n.startswith(base_dest + "/")
for n in zip_set
if n not in ("README.txt", "manifest.json") and not n.endswith("/")
)
# Structural checks # Structural checks
dupes = sum(1 for c in Counter(zf.namelist()).values() if c > 1) dupes = sum(1 for c in Counter(zf.namelist()).values() if c > 1)
if dupes: if dupes:
@@ -3471,7 +3486,7 @@ def verify_pack_against_platform(
dest = fe.get("destination", fe.get("name", "")) dest = fe.get("destination", fe.get("name", ""))
if not dest: if not dest:
continue continue
expected = f"{base_dest}/{dest}" if base_dest else dest expected = f"{base_dest}/{dest}" if base_dest and not is_flat else dest
baseline_checked += 1 baseline_checked += 1
if expected in zip_set or expected.lower() in zip_lower: if expected in zip_set or expected.lower() in zip_lower:
@@ -3498,7 +3513,7 @@ def verify_pack_against_platform(
continue continue
raw_dest = u.get("path") or u["name"] raw_dest = u.get("path") or u["name"]
dest = f"{raw_dest}{u['name']}" if raw_dest.endswith("/") else raw_dest dest = f"{raw_dest}{u['name']}" if raw_dest.endswith("/") else raw_dest
if extras_pfx: if extras_pfx and not (is_flat and extras_pfx == base_dest):
if not dest.startswith(f"{extras_pfx}/"): if not dest.startswith(f"{extras_pfx}/"):
full = f"{extras_pfx}/{dest}" full = f"{extras_pfx}/{dest}"
else: else:

View File

@@ -143,7 +143,9 @@ def generate_readme(db: dict, platforms_dir: str) -> str:
pass pass
lines = [ lines = [
"# RetroBIOS", '<p align="center">',
' <img src=".github/assets/banner.png" alt="RetroBIOS" width="400">',
"</p>",
"", "",
f"Complete BIOS and firmware packs for " f"Complete BIOS and firmware packs for "
f"{', '.join(c['platform'] for c in sorted(coverages.values(), key=lambda x: x[ f"{', '.join(c['platform'] for c in sorted(coverages.values(), key=lambda x: x[
@@ -349,6 +351,13 @@ def generate_readme(db: dict, platforms_dir: str) -> str:
lines.extend( lines.extend(
[ [
"",
"## Community tools",
"",
"- [BIOS Preservation Tool](https://github.com/monster-penguin/BIOS-Preservation-Tool)"
" by [monster-penguin](https://github.com/monster-penguin)"
" - scan, verify, and stage your own BIOS collection"
" using RetroBIOS hash metadata",
"", "",
"## Contributing", "## Contributing",
"", "",

View File

@@ -2136,6 +2136,131 @@ def _build_emulator_file_index(profiles: dict) -> dict[str, dict]:
# mkdocs.yml nav generator # mkdocs.yml nav generator
def generate_which_pack() -> str:
"""Generate the 'Which pack?' decision page."""
rel = "https://github.com/Abdess/retrobios/releases"
return f"""\
# Getting started
Some retro consoles need firmware files (commonly called BIOS) to run games.
Without them, the emulator either refuses to start the game or runs it with
reduced accuracy. This project collects and verifies those files so they are
ready to use.
## Quick install
The installer detects the platform, finds the BIOS folder, downloads what
is missing, and copies keys to standalone emulators (Yuzu, Eden, Ryujinx,
DuckStation, PCSX2, Dolphin, etc.) when they are present on the system.
**Linux / Mac / Steam Deck:**
```sh
curl -fsSL https://raw.githubusercontent.com/Abdess/retrobios/main/install.sh | sh
```
**Windows (PowerShell):**
```powershell
iwr -useb https://raw.githubusercontent.com/Abdess/retrobios/main/install.ps1 | iex
```
Nothing else needed. The installer handles everything.
---
## Manual download
Pick the pack that matches the setup from the [releases page]({rel}),
download it, and extract the files into the BIOS folder listed below.
After extraction, launch a game. If it needed BIOS, it will find it.
### Steam Deck
| Setup | What it is | Pack | Extract to |
|-------|-----------|------|-----------|
| [EmuDeck](https://www.emudeck.com/) | Installs and configures multiple emulators, adds each game to the Steam library | [EmuDeck]({rel}) | `~/Emulation/bios/` |
| [RetroDECK](https://retrodeck.net/) | Single Flatpak app, all emulators bundled, one-click install from Discover | [RetroDECK]({rel}) | `~/retrodeck/` |
| RetroArch standalone | Installed from Discover, Steam, or Flatpak | [RetroArch]({rel}) | Open RetroArch > Settings > Directory > System, that is the folder |
### Windows
| Setup | What it is | Pack | Extract to |
|-------|-----------|------|-----------|
| [RetroArch](https://www.retroarch.com/) | Multi-system emulator, loads different cores for each console | [RetroArch]({rel}) | The `system` folder next to `retroarch.exe` |
| [RetroBat](https://www.retrobat.org/) | Windows frontend with EmulationStation, includes RetroArch and standalone emulators | [RetroBat]({rel}) | The `bios` folder inside the RetroBat installation |
| [BizHawk](https://tasvideos.org/BizHawk) | Accuracy-focused multi-system emulator, popular for speedruns and TAS | [BizHawk]({rel}) | The `Firmware` folder inside the BizHawk installation |
| [LaunchBox](https://www.launchbox-app.com/) | Game library manager and launcher, uses RetroArch or standalone emulators behind the scenes | [RetroArch]({rel}) | Open RetroArch (via LaunchBox) > Settings > Directory > System |
### Linux
| Setup | What it is | Pack | Extract to |
|-------|-----------|------|-----------|
| RetroArch (native) | Installed via package manager or AppImage | [RetroArch]({rel}) | `~/.config/retroarch/system/` |
| RetroArch (Flatpak) | Installed from Flathub | [RetroArch]({rel}) | `~/.var/app/org.libretro.RetroArch/config/retroarch/system/` |
| [Batocera](https://batocera.org/) | Bootable OS dedicated to gaming, runs from USB or full install, supports PC and SBC | [Batocera]({rel}) | `/userdata/bios/` |
| [Recalbox](https://www.recalbox.com/) | Bootable OS for retro gaming, streamlined interface, auto-configured | [Recalbox]({rel}) | `/recalbox/share/bios/` |
### macOS
| Setup | What it is | Pack | Extract to |
|-------|-----------|------|-----------|
| [RetroArch](https://www.retroarch.com/) | Multi-system emulator | [RetroArch]({rel}) | `~/Library/Application Support/RetroArch/system/` |
### Raspberry Pi and single-board computers
| Setup | What it is | Pack | Extract to |
|-------|-----------|------|-----------|
| [RetroPie](https://retropie.org.uk/) | The classic Pi emulation setup, largest community, most online guides | [RetroArch]({rel}) | `~/RetroPie/BIOS/` |
| [Lakka](https://www.lakka.tv/) | Lightweight RetroArch OS, minimal config, boots straight into the UI | [RetroArch]({rel}) | `/storage/system/` |
| [Batocera](https://batocera.org/) | Easy setup, works on Pi 3/4/5 and many other boards (Odroid, etc.) | [Batocera]({rel}) | `/userdata/bios/` |
| [Recalbox](https://www.recalbox.com/) | Plug-and-play experience, good for a first build | [Recalbox]({rel}) | `/recalbox/share/bios/` |
### Android handheld (Retroid Pocket, R36S, Miyoo, etc.)
Most Android handhelds run RetroArch. Download the [RetroArch pack]({rel})
and extract into `RetroArch/system/` on internal storage or SD card.
### Self-hosted ROM manager
| Setup | What it is | Pack | Extract to |
|-------|-----------|------|-----------|
| [RomM](https://github.com/rommapp/romm) | Web-based ROM manager, plays games in the browser via EmulatorJS | [RomM]({rel}) | The `bios` folder in the RomM library, one subfolder per system |
---
## Full pack or Platform pack?
Each platform has two pack types on the [releases page]({rel}).
**Full pack** (recommended)
Contains the platform's own BIOS list plus all files needed by each
emulator core available on that platform. This covers alternate cores,
optional firmware that improves accuracy, and edge cases. Larger download,
but everything works out of the box with any core.
**Platform pack**
Contains only the files the platform officially checks for. Much smaller
download. Good for limited storage (SD cards, handhelds) or setups that
only use default cores.
When in doubt, take the full pack.
---
## After extraction
Launch a game. If it needed a BIOS file, the emulator will find it
automatically. No configuration needed.
If a game still asks for a missing file, check the
[platforms section](platforms/index.md) for the full file list, or the
[emulators section](emulators/index.md) for what each core expects.
"""
def generate_mkdocs_nav( def generate_mkdocs_nav(
coverages: dict, coverages: dict,
manufacturers: dict, manufacturers: dict,
@@ -2211,10 +2336,12 @@ def generate_mkdocs_nav(
{"Adding a scraper": "wiki/adding-a-scraper.md"}, {"Adding a scraper": "wiki/adding-a-scraper.md"},
{"Testing guide": "wiki/testing-guide.md"}, {"Testing guide": "wiki/testing-guide.md"},
{"Release process": "wiki/release-process.md"}, {"Release process": "wiki/release-process.md"},
{"Community tools": "wiki/community-tools.md"},
] ]
return [ return [
{"Home": "index.md"}, {"Home": "index.md"},
{"Download": "which-pack.md"},
{"Platforms": platform_nav}, {"Platforms": platform_nav},
{"Systems": system_nav}, {"Systems": system_nav},
{"Emulators": emu_nav}, {"Emulators": emu_nav},
@@ -2258,6 +2385,15 @@ def main():
css_dest.parent.mkdir(parents=True, exist_ok=True) css_dest.parent.mkdir(parents=True, exist_ok=True)
shutil.copy2(css_src, css_dest) shutil.copy2(css_src, css_dest)
# Copy branding assets
images_dest = docs / "assets" / "images"
images_dest.mkdir(parents=True, exist_ok=True)
assets_src = Path(".github") / "assets"
for name, dest_name in [("logo.png", "logo.png"), ("favicon.png", "favicon.png")]:
src = assets_src / name
if src.exists():
shutil.copy2(src, images_dest / dest_name)
registry_path = Path(args.platforms_dir) / "_registry.yml" registry_path = Path(args.platforms_dir) / "_registry.yml"
registry = {} registry = {}
if registry_path.exists(): if registry_path.exists():
@@ -2368,6 +2504,10 @@ def main():
str(wiki_dest / "data-model.md"), generate_wiki_data_model(db, profiles) str(wiki_dest / "data-model.md"), generate_wiki_data_model(db, profiles)
) )
# Generate which-pack page
print("Generating which-pack page...")
write_if_changed(str(docs / "which-pack.md"), generate_which_pack())
# Generate contributing # Generate contributing
print("Generating contributing page...") print("Generating contributing page...")
write_if_changed(str(docs / "contributing.md"), generate_contributing()) write_if_changed(str(docs / "contributing.md"), generate_contributing())
@@ -2403,6 +2543,8 @@ theme:
icon: material/brightness-4 icon: material/brightness-4
name: Switch to auto name: Switch to auto
font: false font: false
logo: assets/images/logo.png
favicon: assets/images/favicon.png
icon: icon:
logo: material/chip logo: material/chip
features: features:

View File

@@ -994,8 +994,10 @@ class TestE2E(unittest.TestCase):
groups = group_identical_platforms( groups = group_identical_platforms(
["test_existence", "test_inherited"], self.platforms_dir ["test_existence", "test_inherited"], self.platforms_dir
) )
# Different base_destination ->separate groups # With flat ZIPs, base_destination no longer separates groups
self.assertEqual(len(groups), 2) # Platforms with same files (regardless of base_dest) are grouped
self.assertEqual(len(groups), 1)
self.assertEqual(len(groups[0][0]), 2)
def test_51_platform_grouping_same(self): def test_51_platform_grouping_same(self):
# Create two identical platforms # Create two identical platforms
@@ -3383,10 +3385,17 @@ class TestE2E(unittest.TestCase):
registry_path, registry_path,
emulators_dir=self.emulators_dir, emulators_dir=self.emulators_dir,
) )
# Detect flat vs nested ZIP to build expected paths
base = manifest.get("base_destination", "") base = manifest.get("base_destination", "")
is_flat = bool(base) and not any(
n.startswith(base + "/") for n in zip_names
)
manifest_dests = set() manifest_dests = set()
for f in manifest["files"]: for f in manifest["files"]:
d = f"{base}/{f['dest']}" if base else f["dest"] if base and not is_flat:
d = f"{base}/{f['dest']}"
else:
d = f["dest"]
manifest_dests.add(d) manifest_dests.add(d)
self.assertEqual(manifest_dests, zip_names) self.assertEqual(manifest_dests, zip_names)

21
wiki/community-tools.md Normal file
View File

@@ -0,0 +1,21 @@
# Community tools
Projects built on RetroBIOS data.
---
## BIOS Preservation Tool
**Author:** [monster-penguin](https://github.com/monster-penguin)
**Repository:** [github.com/monster-penguin/BIOS-Preservation-Tool](https://github.com/monster-penguin/BIOS-Preservation-Tool)
**License:** MIT
A local tool for managing your own BIOS collection. Point it at your files, it verifies them against RetroBIOS platform YAMLs, stores them in a deduplicated database, and produces ready-to-use directories for each platform. Supports scanning directories, archives, and URLs.
See the project's [README](https://github.com/monster-penguin/BIOS-Preservation-Tool#readme) for setup and usage.
---
!!! note "Add your project"
Open an issue with a link to your repository.

View File

@@ -7,7 +7,7 @@ Technical documentation for the RetroBIOS toolchain.
- **[Getting started](getting-started.md)** - installation, BIOS directory paths per platform, verification - **[Getting started](getting-started.md)** - installation, BIOS directory paths per platform, verification
- **[FAQ](faq.md)** - common questions, troubleshooting, hash explanations - **[FAQ](faq.md)** - common questions, troubleshooting, hash explanations
If you just want to download BIOS packs, see the [home page](../README.md). If you just want to download BIOS packs, see the [home page](../index.md).
## Technical reference ## Technical reference
@@ -26,7 +26,11 @@ If you just want to download BIOS packs, see the [home page](../README.md).
- **[Testing guide](testing-guide.md)** - run tests, fixture pattern, how to add tests, CI integration - **[Testing guide](testing-guide.md)** - run tests, fixture pattern, how to add tests, CI integration
- **[Release process](release-process.md)** - CI workflows, large files, manual release - **[Release process](release-process.md)** - CI workflows, large files, manual release
See [contributing](../CONTRIBUTING.md) for submission guidelines. See [contributing](../contributing.md) for submission guidelines.
## Community
- **[Community tools](community-tools.md)** - projects built on RetroBIOS data
## Glossary ## Glossary