fix: separate findable gaps from unsourceable ones

The README said 14 files were 'not in the collection yet', which
implies somebody could still put them there. Nine of them cannot be:
WHDLoad.key is a per-user signed registration, Custom.dat and key.txt
are slots the emulator expects the user to fill, gpib.rom and
dragonfly-2.3.rom have never been dumped, CARTS.CRC belongs to a dead
code path. The profiles already record why, so the two are now counted
apart: five still to be found, nine that cannot be.
This commit is contained in:
Abdessamad Derraz committed 2026-08-11 15:56:26 +02:00
1 parent b890998a94
commit 4b1ab7cb74
3 files changed
+24 -10

No files matched your search

+6 -6
View File
@@ -59,17 +59,17 @@ These are the files an emulator loads from disk instead of carrying inside itsel
Each file is checked the way your platform checks it. Most compare a checksum, the fingerprint of a file's contents, which catches a corrupt or unexpected copy. RetroArch, Lakka and RetroPie only look for the filename, because that is all their code does: the Coverage table says which applies to you. Independently of that, the collection records five fingerprints per file, and wherever an emulator's code states an expected size or hash, that value is read from its source and rechecked here.
- **14 files** the platforms' emulators load are not in the collection yet, named in the [gap analysis](https://abdess.github.io/retrobios/gaps/)
- **5 files** the platforms' emulators load are still to be found, and 9 more cannot be sourced at all (per-user keys, user-filled slots, dumps nobody has made); both are named in the [gap analysis](https://abdess.github.io/retrobios/gaps/)
- **12 platforms** supported with platform-specific verification
- **385 emulators** profiled from source (RetroArch cores + standalone)
- **421 systems** handled by those emulators (NES, SNES, PlayStation, Saturn, Dreamcast, ...)
- **387 emulators** profiled from source (RetroArch cores + standalone)
- **440 systems** handled by those emulators (NES, SNES, PlayStation, Saturn, Dreamcast, ...)
- **8,372 files**, each with its SHA1, MD5, SHA256, CRC32 and Adler-32 fingerprints: 3,030 system files, 2,803 arcade ROM sets, 2,539 game and engine data files
- **542 of 3,030 system files** matched to dump-preservation catalogs (No-Intro, Redump, TOSEC); arcade sets and engine data fall outside what those catalogs index
- **10010 MB** total collection size
## Supported systems
NES, SNES, Nintendo 64, GameCube, Wii, Game Boy, Game Boy Advance, Nintendo DS, Nintendo 3DS, Switch, PlayStation, PlayStation 2, PlayStation 3, PSP, PS Vita, Mega Drive, Saturn, Dreamcast, Game Gear, Master System, Neo Geo, Atari 2600, Atari 7800, Atari Lynx, Atari ST, MSX, PC Engine, TurboGrafx-16, ColecoVision, Intellivision, Commodore 64, Amiga, ZX Spectrum, Arcade (MAME), and 387+ more.
NES, SNES, Nintendo 64, GameCube, Wii, Game Boy, Game Boy Advance, Nintendo DS, Nintendo 3DS, Switch, PlayStation, PlayStation 2, PlayStation 3, PSP, PS Vita, Mega Drive, Saturn, Dreamcast, Game Gear, Master System, Neo Geo, Atari 2600, Atari 7800, Atari Lynx, Atari ST, MSX, PC Engine, TurboGrafx-16, ColecoVision, Intellivision, Commodore 64, Amiga, ZX Spectrum, Arcade (MAME), and 406+ more.
Full list with per-file details: **[https://abdess.github.io/retrobios/](https://abdess.github.io/retrobios/)**
@@ -128,7 +128,7 @@ The [documentation site](https://abdess.github.io/retrobios/) provides:
- **Per-emulator profiles** with source code references for every file
- **Per-system pages** showing which emulators and platforms cover each console
- **Gap analysis** identifying missing files and undeclared core requirements
- **Cross-reference** mapping files across 12 platforms and 385 emulators
- **Cross-reference** mapping files across 12 platforms and 387 emulators
- **Versioned data access** through JSON, CSV and SQLite exports with published SHA-256 checksums
## How it works
@@ -166,4 +166,4 @@ The scripts and tooling are released under the [MIT License](LICENSE).
The BIOS and firmware files are not covered by that license: they are third-party system software, preserved and provided for personal backup, archival, and interoperability with emulation software. [NOTICE](NOTICE) sets out their status and how to ask for a file to be removed.
The reasoning, and where it is weakest, is in the [FAQ](https://abdess.github.io/retrobios/wiki/faq/#is-this-legal).
*Auto-generated on 2026-08-11T12:24:04Z*
*Auto-generated on 2026-08-11T13:47:40Z*
+4 -2
View File
@@ -440,7 +440,7 @@ nav:
- MicroW8: emulators/uw8.md
- uzem: emulators/uzem.md
- VirtualXT: emulators/virtualxt.md
- Game engines (32):
- Game engines (33):
- boom3: emulators/boom3.md
- Cannonball: emulators/cannonball.md
- ChaiLove: emulators/chailove.md
@@ -451,6 +451,7 @@ nav:
- FAKE-08: emulators/fake08.md
- future-pinball: emulators/future-pinball.md
- Gargoyle: emulators/gargoyle.md
- idTech4A++: emulators/idtech4a++.md
- Jump 'n Bump: emulators/jumpnbump.md
- lightspark: emulators/lightspark.md
- Lutro: emulators/lutro.md
@@ -547,7 +548,7 @@ nav:
- ArcadeFlashWeb: emulators/arcadeflashweb.md
- Dolphin Launcher: emulators/dolphin_launcher.md
- Parallel Launcher: emulators/parallel-launcher.md
- Other (44):
- Other (45):
- ares: emulators/ares.md
- Basilisk II: emulators/basiliskii.md
- beebem: emulators/beebem.md
@@ -569,6 +570,7 @@ nav:
- FPseNG: emulators/fpse-ng.md
- Gopher2600: emulators/gopher2600.md
- gopher64: emulators/gopher64.md
- iNES: emulators/ines.md
- jgenesis: emulators/jgenesis.md
- KEGS: emulators/kegs.md
- Lexaloffle: emulators/lexaloffle.md
+14 -2
View File
@@ -81,6 +81,7 @@ def compute_coverage(
"core_missing": core_missing,
"core_unsourceable": core_unsourceable,
"missing_names": missing_names,
"unsourceable_names": unsourceable_names,
"pack_files": present + core_present,
"total_missing": missing + core_missing,
"mode": config.get("verification_mode", "existence"),
@@ -212,6 +213,15 @@ def generate_readme(db: dict, platforms_dir: str) -> str:
emulator_count = len(profiles)
comp = compute_composition(db)
missing_total = len(set().union(*(c["missing_names"] for c in coverages.values())))
# "Not in the collection yet" implies somebody could still put it there.
# Most of this figure cannot be: per-user registration keys, slots the
# emulator expects the user to fill, dumps nobody has made. Counting those
# beside genuinely acquirable files overstates what is actionable, so the
# two are reported apart.
unsourceable_total = len(
set().union(*(c["unsourceable_names"] for c in coverages.values()))
)
acquirable_total = missing_total - unsourceable_total
system_ids: set[str] = set()
for p in profiles.values():
@@ -339,8 +349,10 @@ def generate_readme(db: dict, platforms_dir: str) -> str:
" read from its source and rechecked here.",
"",
(
f"- **{missing_total} files** the platforms' emulators load are"
f" not in the collection yet, named in the"
f"- **{acquirable_total} files** the platforms' emulators load"
f" are still to be found, and {unsourceable_total} more cannot"
f" be sourced at all (per-user keys, user-filled slots, dumps"
f" nobody has made); both are named in the"
f" [gap analysis]({SITE_URL}gaps/)"
if missing_total
else "- **Nothing missing**: every file the platforms'"