From 3a4f8a51114c5f8fbfc74dcb3f8e75629fdadb12 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Sat, 8 Aug 2026 07:00:46 +0200 Subject: [PATCH] feat: publish source coverage beyond shipped cores --- README.md | 29 +++++++++++++++-------------- scripts/generate_readme.py | 9 +++++++-- scripts/generate_site.py | 25 +++++++++++++++++-------- 3 files changed, 39 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 7d541e7d..29d2e131 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Complete BIOS and firmware packs for Batocera, BizHawk, EmuDeck, Lakka, MiSTer FPGA, ROCKNIX, Recalbox, RetroArch, RetroBat, RetroDECK, RetroPie, and RomM. -**7,652** verified files across **396** systems, ready to extract into your emulator's BIOS directory. +Pick your platform below and extract the pack: it carries every file its emulators load, read from their source code. Nothing to configure, nothing to hunt down. ## Quick Install @@ -56,12 +56,13 @@ The RetroDECK pack already contains its own `bios/` folder, so it extracts into BIOS, firmware, and system files for consoles from Atari to PlayStation 3. Every file passes its platform's own verification; where an emulator profile exists, the expected hashes and sizes are read from the emulator's source code (the Source-backed column below). +- **0 files missing** from the packs: every file the platforms' emulators load is in the collection. Files needed only by emulators no platform ships yet are counted in the [gap analysis](https://abdess.github.io/retrobios/gaps/) - **12 platforms** supported with platform-specific verification -- **321 emulators** profiled from source (RetroArch cores + standalone) +- **322 emulators** profiled from source (RetroArch cores + standalone) - **396 systems** covered (NES, SNES, PlayStation, Saturn, Dreamcast, ...) -- **7,652 files** indexed with SHA1, MD5, SHA256 and CRC32 checksums: 2,366 system files, 2,747 arcade ROM sets, 2,539 game and engine data files -- **527 files** matched to dump-preservation catalogs (No-Intro, Redump, TOSEC) -- **9832 MB** total collection size +- **7,723 files** indexed with SHA1, MD5, SHA256 and CRC32 checksums: 2,438 system files, 2,746 arcade ROM sets, 2,539 game and engine data files +- **542 files** matched to dump-preservation catalogs (No-Intro, Redump, TOSEC) +- **9843 MB** total collection size ## Supported systems @@ -73,16 +74,16 @@ Full list with per-file details: **[https://abdess.github.io/retrobios/](https:/ | Platform | Files in pack | Still missing | Verified by | |----------|--------------:|--------------:|-------------| -| Batocera | 1,601 | 0 | MD5 hash | -| BizHawk | 539 | 0 | SHA1 hash | +| Batocera | 1,600 | 0 | MD5 hash | +| BizHawk | 538 | 0 | SHA1 hash | | EmuDeck | 525 | 0 | MD5 hash | -| Lakka | 1,631 | 0 | file presence | +| Lakka | 1,630 | 0 | file presence | | MiSTer FPGA | 65 | 0 | MD5 hash | -| ROCKNIX | 1,496 | 0 | MD5 hash | +| ROCKNIX | 1,495 | 0 | MD5 hash | | Recalbox | 1,184 | 0 | MD5 hash | -| RetroArch | 1,631 | 0 | file presence | -| RetroBat | 1,235 | 0 | MD5 hash | -| RetroDECK | 3,266 | 0 | MD5 hash | +| RetroArch | 1,630 | 0 | file presence | +| RetroBat | 1,234 | 0 | MD5 hash | +| RetroDECK | 3,265 | 0 | MD5 hash | | RetroPie * | 1,678 | 0 | file presence | | RomM | 543 | 0 | MD5 hash | @@ -124,7 +125,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 321 emulators +- **Cross-reference** mapping files across 12 platforms and 322 emulators ## How it works @@ -161,4 +162,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. The legal reasoning is laid out in the [FAQ](https://abdess.github.io/retrobios/wiki/faq/#is-this-legal). -*Auto-generated on 2026-08-08T04:18:10Z* +*Auto-generated on 2026-08-08T04:58:16Z* diff --git a/scripts/generate_readme.py b/scripts/generate_readme.py index 3a171ed2..2c594035 100644 --- a/scripts/generate_readme.py +++ b/scripts/generate_readme.py @@ -205,8 +205,9 @@ def generate_readme(db: dict, platforms_dir: str) -> str: 'platform' ])[-1]['platform']}.", "", - f"**{total_files:,}** verified files across **{len(system_ids)}** systems," - f" ready to extract into your emulator's BIOS directory.", + f"Pick your platform below and extract the pack: it carries every file" + f" its emulators load, read from their source code. Nothing to" + f" configure, nothing to hunt down.", "", "## Quick Install", "", @@ -289,6 +290,10 @@ def generate_readme(db: dict, platforms_dir: str) -> str: " profile exists, the expected hashes and sizes are read from the" " emulator's source code (the Source-backed column below).", "", + f"- **{sum(c['total_missing'] for c in coverages.values())} files missing**" + f" from the packs: every file the platforms' emulators load is in the" + f" collection. Files needed only by emulators no platform ships yet" + f" are counted in the [gap analysis]({SITE_URL}gaps/)", f"- **{len(coverages)} platforms** supported with platform-specific verification", f"- **{emulator_count} emulators** profiled from source (RetroArch cores + standalone)", f"- **{len(system_ids)} systems** covered (NES, SNES, PlayStation, Saturn, Dreamcast, ...)", diff --git a/scripts/generate_site.py b/scripts/generate_site.py index 9187b3e2..9239810a 100644 --- a/scripts/generate_site.py +++ b/scripts/generate_site.py @@ -1348,6 +1348,7 @@ def generate_emulator_page( return True src = _resolve_source( fname, by_name, by_name_lower, data_names, by_path_suffix, + f, db_files, ) if src is not None: return True @@ -1355,7 +1356,7 @@ def generate_emulator_page( if path_field and path_field != fname: src = _resolve_source( path_field, by_name, by_name_lower, data_names, - by_path_suffix, + by_path_suffix, f, db_files, ) if src is not None: return True @@ -1969,20 +1970,20 @@ def generate_gap_analysis( for _name, cov in coverages.items(): matched = resolve_platform_cores(cov["config"], unique_profiles) relevant_set.update(matched) - active_profiles = { - k: v for k, v in unique_profiles.items() if k in relevant_set - } - - report = run_cross_reference( - active_profiles, declared, db, + # One pass over every profile, read twice: the packs' scope (emulators a + # platform ships) and the whole profiled corpus, so the two views cannot + # drift apart. + report_all = run_cross_reference( + unique_profiles, declared, db, data_names=data_names, all_declared=all_declared, ) + report = {k: v for k, v in report_all.items() if k in relevant_set} src_totals: dict[str, int] = {"bios": 0, "data": 0, "large_file": 0, "missing": 0} total_undeclared = 0 emulator_gaps = [] - for emu_name, data in sorted(report.items()): + for emu_name, data in sorted(report_all.items()): if data["gaps"] == 0: continue total_undeclared += data["gaps"] @@ -1990,6 +1991,8 @@ def generate_gap_analysis( src_totals[key] += data.get(f"gap_{key}", 0) emulator_gaps.append((emu_name, data)) + shipped_missing = sum(d["gap_missing"] for d in report.values()) + if total_undeclared > 0: total_available = ( src_totals["bios"] + src_totals["data"] + src_totals["large_file"] @@ -2008,6 +2011,12 @@ def generate_gap_analysis( f"{total_available:,} available ({pct_available}), " f"{src_totals['missing']} to source.", "", + f"This counts every profiled emulator, including those no platform " + f"ships yet. Restricted to the emulators the platforms above do " + f"ship, {shipped_missing} of these files are absent, which is why " + f"the packs report no missing file. The rest are acquisition " + f"targets, named per emulator below.", + "", "### Provenance", "", "| Source | Count | Description |",