chore: merge pack and resolver fixes

This commit is contained in:
Abdessamad Derraz committed 2026-11-07 00:06:15 +01:00
commit 70f530516d
66 files changed
+1294 -786

No files matched your search

+11 -13
View File
@@ -36,8 +36,6 @@ curl -fsSL https://abdess.github.io/retrobios/i | sh -s -- --platform retroarch
&([scriptblock]::Create((irm https://abdess.github.io/retrobios/i.ps1))) --check
```
![Recording of the one-line command in a terminal. The installer finds an ArkOS SD card with 6 games, plans 43 BIOS files (15.1 MB) for them, installs them and shows the summary.](docs_assets/demo/install.gif)
The script opens a full-screen installer, driven with the arrow keys and Enter, or with a controller on a handheld. It finds your setup and its BIOS folder, downloads only the missing files and checks each one. It can also copy the BIOS files from your old SD card.
Every option, and what the installer detects and writes, is on the [installer page](https://abdess.github.io/retrobios/wiki/installer/#passing-options).
@@ -102,23 +100,23 @@ Full list with per-file details: **[https://abdess.github.io/retrobios/](https:/
| Platform | On its BIOS list | Files its emulators load | Checked by |
|----------|-----------------:|-------------------------:|------------|
| AmberELEC | 414/434 | 4,754/4,937 | MD5 |
| Batocera | 353/353 | 14,172/15,292 | MD5 |
| Batocera | 353/353 | 14,171/15,291 | MD5 |
| BizHawk | 118/118 | - | SHA-1 |
| EmuDeck | 168/168 | 8,427/8,529 | MD5 |
| EmuDeck | 168/168 | 8,426/8,528 | MD5 |
| EmuELEC | 543/572 | 4,788/10,217 | MD5 |
| KNULLI | 290/290 | 9,127/15,351 | MD5 |
| Lakka | 532/532 | 7,910/7,995 | name only |
| KNULLI | 290/290 | 9,126/15,350 | MD5 |
| Lakka | 532/532 | 7,909/7,994 | name only |
| MiSTer FPGA | 81/81 | - | MD5 |
| MinUI | 0/0 | 78/79 | name only |
| MyMinUI | 0/0 | 356/367 | name only |
| NextUI | 0/0 | 343/350 | name only |
| ROCKNIX | 38/38 | 7,428/9,140 | MD5 |
| ROCKNIX | 38/38 | 7,427/9,139 | MD5 |
| Recalbox | 351/351 | 3,125/3,344 | MD5 |
| RetroArch | 526/526 | 7,919/7,986 | name only |
| RetroArch | 526/526 | 7,918/7,985 | name only |
| RetroBat | 348/348 | 5,135/9,659 | MD5 |
| RetroDECK | 2,007/2,008 | 6,706/6,993 | MD5 |
| RetroPie | 532/532 | 8,118/12,772 | name only |
| RomM | 383/383 | 83/875 | size, then any hash |
| RetroDECK | 2,007/2,008 | 6,705/6,992 | MD5 |
| RetroPie | 532/532 | 8,117/12,771 | name only |
| RomM | 383/383 | 83/874 | size, then any hash |
Each fraction is what the pack has over what is needed, counting required and optional files alike since both ship. The first column is the BIOS list the platform publishes. The second counts files its emulators load that this list never mentions, found by reading their source code, and it is routinely several times larger. A short fraction means files are still missing, and they are named in the [gap analysis](https://abdess.github.io/retrobios/gaps/).
That second number is a floor, not a ceiling: an emulator that accepts any file handed to it names none in its code, so nothing there can be counted.
@@ -126,7 +124,7 @@ Checked by is the test your platform runs on its own, replicated here from its s
## Build your own pack
Packs are built from a clone, and the clone carries the collection: its checkout alone is over 7.7 GB. `git clone --depth 1 https://github.com/Abdess/retrobios.git` leaves the history out. Files kept as release assets are downloaded when a pack needs them. Then generate packs for any platform, emulator, or system:
Clone the repo and generate packs for any platform, emulator, or system:
```bash
# The pack of a platform, as released
@@ -208,4 +206,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 project's legal position](https://abdess.github.io/retrobios/wiki/legal/).
*Auto-generated on 2026-11-06T19:12:52Z*
*Auto-generated on 2026-11-06T15:07:54Z*
+20 -1
View File
@@ -1,6 +1,6 @@
{
"schema_version": 1,
"generated_at": "2026-11-06T07:21:27Z",
"generated_at": "2026-11-06T13:49:27Z",
"total_files": 19947,
"total_size": 16926035621,
"bios_dir": "bios",
@@ -600592,6 +600592,25 @@
"vsaturn.bin": [
"df94c5b4d47eb3cc404d88b33a8fda237eaf4720"
]
},
"by_proven_name": {
"dsi_bios7.bin": [
"c7c7570bfe51c3c7c5da3b01331b94e7e7cb4f53",
"a3aa751eb6bdaaf8a827ba9e03576a6f1ab0f547"
],
"dsi_bios9.bin": [
"719b9eef33692406d7170ff526069615759c4dfc",
"7bf549b8be9e48ab0cdc9b0fdadd49a5131f97eb"
],
"dsi_firmware.bin": [
"3773f52559d5ac4fc6d8aefe35bce58730ae8181"
],
"kick13.rom": [
"891e9a547772fe0c6c19b610baf8bc4ea7fcb785"
],
"spectrum.zip": [
"9428d8b7c6d4db78f00a58915dccdf33f3b5d98b"
]
}
}
}
+2 -2
View File
@@ -148,7 +148,7 @@ files:
source_ref: "app/src/main/java/paulscode/android/mupen64plusae/jni/CoreService.java:599-612,621-623, app/src/main/java/paulscode/android/mupen64plusae/jni/CoreInterface.java:455-484, app/src/main/java/paulscode/android/mupen64plusae/persistent/GlobalPrefs.java:417,715, mupen64plus-core/upstream/src/main/main.c:1080-1145"
- name: "64DD_IPL_US.n64"
aliases: ["64DD_IPL_USA.bin", "IPL_USA.n64"]
aliases: ["64DD_IPL_USA.bin"]
system: nintendo-64dd
required: true
validation: [signature]
@@ -163,7 +163,7 @@ files:
source_ref: "app/src/main/java/paulscode/android/mupen64plusae/util/RomHeader.java:180-212, app/src/main/java/paulscode/android/mupen64plusae/jni/CoreInterface.java:221,455-484, mupen64plus-core/upstream/src/main/main.c:1080-1145"
- name: "64DD_IPL_DEV.n64"
aliases: ["64DD_IPL_DEV.bin", "IPL_DEV.n64"]
aliases: ["64DD_IPL_DEV.bin"]
system: nintendo-64dd
required: true
validation: [signature]
+8 -13
View File
@@ -51,19 +51,6 @@ files:
Macintosh IIx ROM image (256 KB). Tried first in the loading sequence.
If present, takes priority over MacII.ROM.
- name: "MinivMacBootv2.dsk"
path: "macintosh/MinivMacBootv2.dsk"
required: false
source_ref: "libretro/libretro-core.c:181-195, libretro/libretro-core.c:396, minivmac/src/OSGLUERETRO.c:521-537, minivmac/src/OSGLUERETRO.c:1545-1547"
note: >
System boot disk. Content given as a .cmd file is read as a command
line, and every argument that is not an option is inserted as a disk,
opened read-write first. Recalbox 10.1.1 writes a .cmd naming
bios/macintosh/MinivMacBootv2.dsk ahead of the game disk. A missing
image raises an open-failure message and the machine starts without it.
ref: recalbox projects/configgen/configgen/recalboxFiles.py:174,
recalbox projects/configgen/configgen/generators/libretro/libretroGenerator.py:877-882
notes:
emulation_target: >
Configured for Macintosh II (kEmMd_II). 68020 CPU, FPU, ADB, VIA2, ASC
@@ -71,3 +58,11 @@ notes:
info_discrepancy: >
.info declares firmware_count=1 (MacII.ROM only). The code also tries
MacIIx.ROM first (OSGLUERETRO.c:778).
disks: >
No disk image has a fixed name. Content given as a .cmd file is read as
a command line, and every argument that is not an option is inserted as
a disk, opened read-write first (libretro/libretro-core.c:181-195,
minivmac/src/OSGLUERETRO.c:521-537). With no disk inserted,
LoadInitialImages tries disk1.dsk to disk9.dsk and stops at the first
missing one (minivmac/src/OSGLUERETRO.c:563-579). A boot disk is
whatever the frontend writes into the .cmd.
+2 -2
View File
@@ -148,7 +148,7 @@ files:
source_ref: "app/src/main/java/paulscode/android/mupen64plusae/jni/CoreService.java:606-620,638-639, app/src/main/java/paulscode/android/mupen64plusae/jni/CoreInterface.java:459-488, app/src/main/java/paulscode/android/mupen64plusae/persistent/GlobalPrefs.java:421,727, mupen64plus-core/upstream/src/main/main.c:1080-1145"
- name: "64DD_IPL_US.n64"
aliases: ["64DD_IPL_USA.bin", "IPL_USA.n64"]
aliases: ["64DD_IPL_USA.bin"]
system: nintendo-64dd
required: true
validation: [signature]
@@ -163,7 +163,7 @@ files:
source_ref: "app/src/main/java/paulscode/android/mupen64plusae/util/RomHeader.java:180-220, app/src/main/java/paulscode/android/mupen64plusae/jni/CoreInterface.java:223,459-488, mupen64plus-core/upstream/src/main/main.c:1080-1145"
- name: "64DD_IPL_DEV.n64"
aliases: ["64DD_IPL_DEV.bin", "IPL_DEV.n64"]
aliases: ["64DD_IPL_DEV.bin"]
system: nintendo-64dd
required: true
validation: [signature]
+2 -2
View File
@@ -89,7 +89,7 @@ files:
source_ref: "src/main.c:321, src/main.c:729-732, src/main.c:874-877, upstream src/main/main.c:1183-1248"
- name: "64DD_IPL_US.n64"
aliases: ["64DD_IPL_USA.bin", "IPL_USA.n64"]
aliases: ["64DD_IPL_USA.bin"]
system: nintendo-64dd
required: true
unread_on: [amberelec]
@@ -98,7 +98,7 @@ files:
source_ref: "src/main.c:874-892, upstream src/main/main.c:1183-1248"
- name: "64DD_IPL_DEV.n64"
aliases: ["64DD_IPL_DEV.bin", "IPL_DEV.n64"]
aliases: ["64DD_IPL_DEV.bin"]
system: nintendo-64dd
required: true
unread_on: [amberelec]
+1 -1
View File
@@ -125,7 +125,7 @@ files:
min_size: 131072
validation: [size]
source_ref: "linux-sdl/vm/xm7.h:260, linux-sdl/vm/kanji.c:71-81, 128-133"
unsourceable: "XM7 checks no hash and its upstream distributes no dump. The KANJI.ROM files the collection holds are MSX and FPseNG fonts, not the Fujitsu ROM."
unsourceable: "XM7 checks no hash and its upstream distributes no dump. The collection holds no JIS78 table. The KANJI.ROM files are MSX and FPseNG fonts, and the Fujitsu kanji ROM inside fm7.zip and fm77av.zip (MAME kanji.rom, crc32 62402ac9) draws the JIS83 forms at the codes linux-sdl/vm/kanji.c:353-380 swaps (0x3646, 0x445B, 0x4768)."
note: "Without it a JIS78 table is generated from KANJI1.ROM."
- name: DICROM.ROM
+21 -24
View File
@@ -6,7 +6,7 @@
"platform": "amberelec",
"display_name": "AmberELEC",
"version": "prerelease-20261019_1835",
"generated": "2026-11-06T07:21:27Z",
"generated": "2026-11-06T13:49:27Z",
"base_destination": "",
"detect": [
{
@@ -30,9 +30,9 @@
],
"standalone_copies": [],
"total_files": 4958,
"total_size": 5348087825,
"total_size": 5347817533,
"pack_files": 8721,
"pack_size": 5455649092,
"pack_size": 5455378800,
"total_omitted": 93,
"omitted_files": [
{
@@ -40939,10 +40939,10 @@
},
{
"dest": "bios/kick13.rom",
"sha1": "90933936cce43ca9bc6bf375662c076b27e3c458",
"sha256": "1d68ba18412501d2a4b307a0a632b94a50b839c2c7c5ff2df6de2c38b99a921f",
"size": 524288,
"repo_path": "bios/Commodore/Amiga/kick13.rom",
"sha1": "891e9a547772fe0c6c19b610baf8bc4ea7fcb785",
"sha256": "ee05862d8102a08436ac4056da7d549db31625c7d47b24dfb7b3c9a5c113ca53",
"size": 262144,
"repo_path": "bios/Commodore/Amiga/Kickstart-v1.3-rev34.5-1987-Commodore-A500-A1000-A2000-CDTV.rom",
"cores": [
"amiberry"
],
@@ -42056,10 +42056,10 @@
},
{
"dest": "bios/spectrum.zip",
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbneo",
"fbalpha2019"
@@ -60137,10 +60137,10 @@
},
{
"dest": "bios/dsi_firmware.bin",
"sha1": "d2a5af338f09c5cbdd5d7628db5b9c075c69b616",
"sha256": "1d7c771de535e6e07182fc9820ac32e76c6f0b5bcefd256a861fdfab144761ec",
"sha1": "3773f52559d5ac4fc6d8aefe35bce58730ae8181",
"sha256": "a52e281c4dfc8f2da61e7a193d0f40e15eff6f6142ba80bf48ffe755624e2017",
"size": 131072,
"repo_path": "bios/Nintendo/Nintendo DSi/dsi_firmware.bin",
"repo_path": "bios/Nintendo/Nintendo DSi/dsifirmware.bin",
"cores": [
"melonds",
"melonds_ds"
@@ -62704,10 +62704,10 @@
},
{
"dest": "bios/fbneo/spectrum.zip",
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbneo"
]
@@ -77381,8 +77381,7 @@
}
},
"strip_components": 1,
"archive_size": 5083767,
"optional": true
"archive_size": 5083767
},
{
"ref": "fbneo-samples",
@@ -77616,8 +77615,7 @@
}
},
"strip_components": 0,
"archive_size": 53006540,
"optional": true
"archive_size": 53006540
},
{
"ref": "freeintv-overlays",
@@ -77990,8 +77988,7 @@
}
},
"strip_components": 1,
"archive_size": 21311170,
"optional": true
"archive_size": 21311170
}
]
}
+25 -40
View File
@@ -6,7 +6,7 @@
"platform": "batocera",
"display_name": "Batocera",
"version": "43.1",
"generated": "2026-11-06T07:21:27Z",
"generated": "2026-11-06T13:49:27Z",
"base_destination": "bios",
"detect": [
{
@@ -272,10 +272,10 @@
}
}
],
"total_files": 14699,
"total_size": 9868771215,
"pack_files": 18173,
"pack_size": 9954596505,
"total_files": 14698,
"total_size": 9843335099,
"pack_files": 18172,
"pack_size": 9929160389,
"total_omitted": 426,
"omitted_files": [
{
@@ -10589,20 +10589,20 @@
},
{
"dest": "dsi_firmware.bin",
"sha1": "d2a5af338f09c5cbdd5d7628db5b9c075c69b616",
"sha256": "1d7c771de535e6e07182fc9820ac32e76c6f0b5bcefd256a861fdfab144761ec",
"sha1": "3773f52559d5ac4fc6d8aefe35bce58730ae8181",
"sha256": "a52e281c4dfc8f2da61e7a193d0f40e15eff6f6142ba80bf48ffe755624e2017",
"size": 131072,
"repo_path": "bios/Nintendo/Nintendo DSi/dsi_firmware.bin",
"repo_path": "bios/Nintendo/Nintendo DSi/dsifirmware.bin",
"cores": null,
"systems": [
"nintendo-ds"
],
"alternatives": [
{
"sha1": "d2a5af338f09c5cbdd5d7628db5b9c075c69b616",
"sha256": "1d7c771de535e6e07182fc9820ac32e76c6f0b5bcefd256a861fdfab144761ec",
"sha1": "3773f52559d5ac4fc6d8aefe35bce58730ae8181",
"sha256": "a52e281c4dfc8f2da61e7a193d0f40e15eff6f6142ba80bf48ffe755624e2017",
"size": 131072,
"repo_path": "bios/Nintendo/Nintendo DSi/dsi_firmware.bin",
"repo_path": "bios/Nintendo/Nintendo DSi/dsifirmware.bin",
"cores": [
"melonds",
"melonds_ds"
@@ -179286,10 +179286,10 @@
},
{
"dest": "kick13.rom",
"sha1": "90933936cce43ca9bc6bf375662c076b27e3c458",
"sha256": "1d68ba18412501d2a4b307a0a632b94a50b839c2c7c5ff2df6de2c38b99a921f",
"size": 524288,
"repo_path": "bios/Commodore/Amiga/kick13.rom",
"sha1": "891e9a547772fe0c6c19b610baf8bc4ea7fcb785",
"sha256": "ee05862d8102a08436ac4056da7d549db31625c7d47b24dfb7b3c9a5c113ca53",
"size": 262144,
"repo_path": "bios/Commodore/Amiga/Kickstart-v1.3-rev34.5-1987-Commodore-A500-A1000-A2000-CDTV.rom",
"cores": [
"amiberry"
],
@@ -204302,19 +204302,6 @@
"mesen"
]
},
{
"dest": "macintosh/MinivMacBootv2.dsk",
"sha1": "20bb0271d02b1ab3b4cfe7c8d6b599abdbc5324e",
"sha256": "90dceaece71be101bf709ee20691c9e8486969417ffc51e4d1fb3c11e567f796",
"size": 25165824,
"repo_path": "bios/Apple/Macintosh II/MinivMacBootv2.dsk",
"cores": [
"minivmac"
],
"systems": [
"apple-macintosh-ii"
]
},
{
"dest": "64DD_IPL_JP.n64",
"sha1": "bf861922dcb78c316360e3e742f4f70ff63c9bc3",
@@ -208570,10 +208557,10 @@
},
{
"dest": "spectrum.zip",
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbneo"
]
@@ -210017,10 +210004,10 @@
},
{
"dest": "fbneo/spectrum.zip",
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbneo"
]
@@ -225291,8 +225278,7 @@
}
},
"strip_components": 1,
"archive_size": 5083767,
"optional": true
"archive_size": 5083767
},
{
"ref": "fbneo-samples",
@@ -225526,8 +225512,7 @@
}
},
"strip_components": 0,
"archive_size": 53006540,
"optional": true
"archive_size": 53006540
}
],
"save_directory": {
+23 -36
View File
@@ -6,7 +6,7 @@
"platform": "emudeck",
"display_name": "EmuDeck",
"version": "2.7EA",
"generated": "2026-11-06T07:21:27Z",
"generated": "2026-11-06T13:49:27Z",
"base_destination": "bios",
"detect": [
{
@@ -305,10 +305,10 @@
}
}
],
"total_files": 8396,
"total_size": 7816272260,
"pack_files": 14576,
"pack_size": 7944194336,
"total_files": 8395,
"total_size": 7790836144,
"pack_files": 14575,
"pack_size": 7918758220,
"total_omitted": 37,
"omitted_files": [
{
@@ -68923,10 +68923,10 @@
},
{
"dest": "kick13.rom",
"sha1": "90933936cce43ca9bc6bf375662c076b27e3c458",
"sha256": "1d68ba18412501d2a4b307a0a632b94a50b839c2c7c5ff2df6de2c38b99a921f",
"size": 524288,
"repo_path": "bios/Commodore/Amiga/kick13.rom",
"sha1": "891e9a547772fe0c6c19b610baf8bc4ea7fcb785",
"sha256": "ee05862d8102a08436ac4056da7d549db31625c7d47b24dfb7b3c9a5c113ca53",
"size": 262144,
"repo_path": "bios/Commodore/Amiga/Kickstart-v1.3-rev34.5-1987-Commodore-A500-A1000-A2000-CDTV.rom",
"cores": [
"amiberry"
]
@@ -71984,10 +71984,10 @@
},
{
"dest": "spectrum.zip",
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbneo",
"fbalpha2019"
@@ -89343,10 +89343,10 @@
},
{
"dest": "dsi_firmware.bin",
"sha1": "d2a5af338f09c5cbdd5d7628db5b9c075c69b616",
"sha256": "1d7c771de535e6e07182fc9820ac32e76c6f0b5bcefd256a861fdfab144761ec",
"sha1": "3773f52559d5ac4fc6d8aefe35bce58730ae8181",
"sha256": "a52e281c4dfc8f2da61e7a193d0f40e15eff6f6142ba80bf48ffe755624e2017",
"size": 131072,
"repo_path": "bios/Nintendo/Nintendo DSi/dsi_firmware.bin",
"repo_path": "bios/Nintendo/Nintendo DSi/dsifirmware.bin",
"cores": [
"melonds",
"melonds_ds"
@@ -89455,16 +89455,6 @@
"minivmac"
]
},
{
"dest": "macintosh/MinivMacBootv2.dsk",
"sha1": "20bb0271d02b1ab3b4cfe7c8d6b599abdbc5324e",
"sha256": "90dceaece71be101bf709ee20691c9e8486969417ffc51e4d1fb3c11e567f796",
"size": 25165824,
"repo_path": "bios/Apple/Macintosh II/MinivMacBootv2.dsk",
"cores": [
"minivmac"
]
},
{
"dest": "palmos41-en-m515.rom",
"sha1": "cc4898ee8cae4669fc19e184c5b560c770e731b3",
@@ -96630,10 +96620,10 @@
},
{
"dest": "fbneo/spectrum.zip",
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbneo"
]
@@ -123400,8 +123390,7 @@
}
},
"strip_components": 1,
"archive_size": 5083767,
"optional": true
"archive_size": 5083767
},
{
"ref": "fbneo-samples",
@@ -123635,8 +123624,7 @@
}
},
"strip_components": 0,
"archive_size": 53006540,
"optional": true
"archive_size": 53006540
},
{
"ref": "freeintv-overlays",
@@ -124009,8 +123997,7 @@
}
},
"strip_components": 1,
"archive_size": 21311170,
"optional": true
"archive_size": 21311170
},
{
"ref": "lrps2",
+18 -21
View File
@@ -6,7 +6,7 @@
"platform": "emuelec",
"display_name": "EmuELEC",
"version": "4.8",
"generated": "2026-11-06T07:21:27Z",
"generated": "2026-11-06T13:49:27Z",
"base_destination": "",
"detect": [
{
@@ -21,9 +21,9 @@
],
"standalone_copies": [],
"total_files": 5296,
"total_size": 4141616981,
"total_size": 4141346689,
"pack_files": 9168,
"pack_size": 4255785396,
"pack_size": 4255515104,
"total_omitted": 198,
"omitted_files": [
{
@@ -44327,10 +44327,10 @@
},
{
"dest": "bios/kick13.rom",
"sha1": "90933936cce43ca9bc6bf375662c076b27e3c458",
"sha256": "1d68ba18412501d2a4b307a0a632b94a50b839c2c7c5ff2df6de2c38b99a921f",
"size": 524288,
"repo_path": "bios/Commodore/Amiga/kick13.rom",
"sha1": "891e9a547772fe0c6c19b610baf8bc4ea7fcb785",
"sha256": "ee05862d8102a08436ac4056da7d549db31625c7d47b24dfb7b3c9a5c113ca53",
"size": 262144,
"repo_path": "bios/Commodore/Amiga/Kickstart-v1.3-rev34.5-1987-Commodore-A500-A1000-A2000-CDTV.rom",
"cores": [
"amiberry"
],
@@ -66103,10 +66103,10 @@
},
{
"dest": "bios/spectrum.zip",
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbneo"
]
@@ -68585,10 +68585,10 @@
},
{
"dest": "bios/fbneo/spectrum.zip",
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbneo"
]
@@ -83639,8 +83639,7 @@
}
},
"strip_components": 1,
"archive_size": 5083767,
"optional": true
"archive_size": 5083767
},
{
"ref": "fbneo-samples",
@@ -83874,8 +83873,7 @@
}
},
"strip_components": 0,
"archive_size": 53006540,
"optional": true
"archive_size": 53006540
},
{
"ref": "freeintv-overlays",
@@ -84248,8 +84246,7 @@
}
},
"strip_components": 1,
"archive_size": 21311170,
"optional": true
"archive_size": 21311170
}
]
}
+1 -1
View File
@@ -1 +1 @@
{"files":[["32X_G_BIOS.BIN",256,"bios"],["32X_M_BIOS.BIN",2048,"bios"],["32X_S_BIOS.BIN",1024,"bios"],["3do_arcade_saot.bin",524288,"bios"],["5200.rom",2048,"bios"],["64DD_IPL.bin",4194304,"bios"],["64DD_IPL_DEV.n64",4194304,"bios"],["64DD_IPL_JP.n64",4194304,"bios"],["64DD_IPL_US.n64",4194304,"bios"],["6570-036.rom",2048,"bios"],["68HC05.rom",8192,"bios"],["7800 BIOS (E).rom",16384,"bios"],["7800 BIOS (U).rom",4096,"bios"],["ATARIBAS.ROM",8192,"bios"],["ATARIOSA.ROM",10240,"bios"],["ATARIOSB.ROM",10240,"bios"],["ATARIXL.ROM",16384,"bios"],["AUDIO.ABS",6904,"game_data"],["AUDIOHED.BS1",1280,"game_data"],["AUDIOHED.BS6",1280,"game_data"],["AUDIOT.BS1",267636,"game_data"],["AUDIOT.BS6",267636,"game_data"],["Acorn/basic.rom",16384,"bios"],["Acorn/basic2.rom",16384,"bios"],["Amiga/Kickstart-v1.3-rev34.5-1987-Commodore-A500-A1000-A2000-CDTV.rom",262144,"bios"],["AppleII/apple2e-character.rom",4096,"bios"],["AppleIIgs/apple2gs.chr",4096,"bios"],["BB01R4_OS.ROM",16384,"bios"],["BBCMicro/dfs-2.26.rom",16384,"bios"],["BBCMicro/dfs09.rom",8192,"bios"],["BBCMicro/os12.rom",16384,"bios"],["BEGIN.ABS",12742,"game_data"],["BLOCKS.000",143876,"game_data"],["BLOOD.RFF",3536782,"game_data"],["BONUS.000",161022,"game_data"],["BONUS.0SC",51832,"game_data"],["BONUSMAP.000",6455,"game_data"],["BS-X.bin",1048576,"bios"],["CM32LN_CONTROL.ROM",65536,"bios"],["CM32L_CONTROL.ROM",65536,"bios"],["CM32L_PCM.ROM",1048576,"bios"],["CREDITS.ABS",15237,"game_data"],["Commodore1540/1540.bin",16384,"bios"],["Commodore1540/1541.bin",16384,"bios"],["Complex_4627.bin",1048576,"bios"],["Config/Music.xml",9224,"bios"],["D8039HLC.rom",2048,"bios"],["DOSBOX.SF2",32319396,"bios"],["DUKE.RTS",188954,"game_data"],["DUKE3D.GRP",11035779,"game_data"],["DiskII/state-machine-13.rom",256,"bios"],["DiskII/state-machine-16.rom",256,"bios"],["EGAGRAPH.ABS",320626,"game_data"],["END.0SC",17055,"game_data"],["Electron/ELK130E.rom",16384,"bios"],["Electron/basic.rom",16384,"bios"],["Enterprise/BASIC 1.0 - EPROM 1-2 (198x)(Enterprise).bin",8193,"bios"],["Enterprise/BASIC 1.0 - EPROM 2-2 (198x)(Enterprise).bin",8193,"bios"],["Enterprise/BASIC 1.1 - EPROM 1.1 (198x)(Enterprise).bin",16385,"bios"],["Enterprise/basic10.bin",16384,"bios"],["Enterprise/basic11.bin",16384,"bios"],["Enterprise/basic21.bin",16384,"bios"],["Enterprise/epdos.bin",32768,"bios"],["Enterprise/exdos.bin",16384,"bios"],["Enterprise/exos10.bin",32768,"bios"],["Enterprise/exos20.bin",32768,"bios"],["Enterprise/exos21.bin",32768,"bios"],["Enterprise/exos23.bin",65536,"bios"],["FINALE.ABS",11918,"game_data"],["FMT_ALL.ROM",4194496,"bios"],["FMT_DIC.ROM",524288,"bios"],["FMT_DOS.ROM",524288,"bios"],["FMT_F20.ROM",524288,"bios"],["FMT_FNT.ROM",262144,"bios"],["FMT_SYS.ROM",262144,"bios"],["FONT2.0FN",3819,"game_data"],["FONTBIG.0FN",6463,"game_data"],["FONTINY.0FN",3339,"game_data"],["FONTMN1.0FN",8982,"game_data"],["FONTMN2.0FN",6789,"game_data"],["FONTS.000",14542,"game_data"],["GAMEMAPS.ABS",20433,"game_data"],["GBA/gba_bios.bin",16384,"bios"],["GC/EUR/IPL.bin",2097152,"bios"],["GC/JAP/IPL.bin",2097152,"bios"],["GC/USA/IPL.bin",2097152,"bios"],["GC/dsp_coef.bin",4096,"bios"],["GC/dsp_rom.bin",8192,"bios"],["GC/font_japanese.bin",259626,"bios"],["GC/font_western.bin",6478,"bios"],["GUI.RFF",7145,"game_data"],["HUNTBGIN.RTC",54258,"game_data"],["HUNTBGIN.RTL",103316,"game_data"],["HUNTBGIN.WAD",6436871,"game_data"],["IANIM.BS1",18977,"game_data"],["IANIM.BS6",18977,"game_data"],["IANIM.VSI",18977,"game_data"],["INSTRUCT.0SC",145067,"game_data"],["JiffyDOS_1541-II.bin",16384,"bios"],["JiffyDOS_1571_repl310654.bin",32768,"bios"],["JiffyDOS_1581.bin",32768,"bios"],["JiffyDOS_C128.bin",16384,"bios"],["JiffyDOS_C64.bin",8192,"bios"],["JiffyDOS_SX-64.bin",8192,"bios"],["LEVEL0.000",20390,"game_data"],["LEVEL0.001",36234,"game_data"],["LEVEL0.002",20642,"game_data"],["Load/Firmware/rtl_bt/rtl8723a_fw.bin",24548,"bios"],["Load/Firmware/rtl_bt/rtl8723b_fw.bin",45048,"bios"],["Load/Firmware/rtl_bt/rtl8723d_fw.bin",52080,"bios"],["Load/Firmware/rtl_bt/rtl8761a_fw.bin",74488,"bios"],["Load/Firmware/rtl_bt/rtl8761bu_fw.bin",44484,"bios"],["Load/Firmware/rtl_bt/rtl8821a_fw.bin",37420,"bios"],["Load/Firmware/rtl_bt/rtl8821c_fw.bin",54636,"bios"],["Load/Firmware/rtl_bt/rtl8822b_fw.bin",51176,"bios"],["Load/Firmware/rtl_bt/rtl8822cu_fw.bin",38207,"bios"],["Load/Firmware/rtl_bt/rtl8851bu_fw.bin",49760,"bios"],["Load/Firmware/rtl_bt/rtl8852au_fw.bin",67188,"bios"],["Load/Firmware/rtl_bt/rtl8852btu_fw.bin",128140,"bios"],["Load/Firmware/rtl_bt/rtl8852bu_fw.bin",129733,"bios"],["Load/Firmware/rtl_bt/rtl8852cu_fw.bin",113336,"bios"],["Load/Firmware/rtl_bt/rtl8922au_fw.bin",71360,"bios"],["Load/WiiSD.raw",134217728,"bios"],["LucidaConsole_12.abc",2332,"bios"],["LucidaConsole_12.tga",131090,"bios"],["MACRO.1",1032,"game_data"],["MAINCHAR.000",156281,"game_data"],["MAPHEAD.BS1",834,"game_data"],["MAPTEMP.BS1",90786,"game_data"],["MAR_EX0.ROM",524288,"bios"],["MAR_EX1.ROM",524288,"bios"],["MAR_EX2.ROM",524288,"bios"],["MAR_Line truncated
{"files":[["32X_G_BIOS.BIN",256,"bios"],["32X_M_BIOS.BIN",2048,"bios"],["32X_S_BIOS.BIN",1024,"bios"],["3do_arcade_saot.bin",524288,"bios"],["5200.rom",2048,"bios"],["64DD_IPL.bin",4194304,"bios"],["64DD_IPL_DEV.n64",4194304,"bios"],["64DD_IPL_JP.n64",4194304,"bios"],["64DD_IPL_US.n64",4194304,"bios"],["6570-036.rom",2048,"bios"],["68HC05.rom",8192,"bios"],["7800 BIOS (E).rom",16384,"bios"],["7800 BIOS (U).rom",4096,"bios"],["ATARIBAS.ROM",8192,"bios"],["ATARIOSA.ROM",10240,"bios"],["ATARIOSB.ROM",10240,"bios"],["ATARIXL.ROM",16384,"bios"],["AUDIO.ABS",6904,"game_data"],["AUDIOHED.BS1",1280,"game_data"],["AUDIOHED.BS6",1280,"game_data"],["AUDIOT.BS1",267636,"game_data"],["AUDIOT.BS6",267636,"game_data"],["Acorn/basic.rom",16384,"bios"],["Acorn/basic2.rom",16384,"bios"],["Amiga/Kickstart-v1.3-rev34.5-1987-Commodore-A500-A1000-A2000-CDTV.rom",262144,"bios"],["AppleII/apple2e-character.rom",4096,"bios"],["AppleIIgs/apple2gs.chr",4096,"bios"],["BB01R4_OS.ROM",16384,"bios"],["BBCMicro/dfs-2.26.rom",16384,"bios"],["BBCMicro/dfs09.rom",8192,"bios"],["BBCMicro/os12.rom",16384,"bios"],["BEGIN.ABS",12742,"game_data"],["BLOCKS.000",143876,"game_data"],["BLOOD.RFF",3536782,"game_data"],["BONUS.000",161022,"game_data"],["BONUS.0SC",51832,"game_data"],["BONUSMAP.000",6455,"game_data"],["BS-X.bin",1048576,"bios"],["CM32LN_CONTROL.ROM",65536,"bios"],["CM32L_CONTROL.ROM",65536,"bios"],["CM32L_PCM.ROM",1048576,"bios"],["CREDITS.ABS",15237,"game_data"],["Commodore1540/1540.bin",16384,"bios"],["Commodore1540/1541.bin",16384,"bios"],["Complex_4627.bin",1048576,"bios"],["Config/Music.xml",9224,"bios"],["D8039HLC.rom",2048,"bios"],["DOSBOX.SF2",32319396,"bios"],["DUKE.RTS",188954,"game_data"],["DUKE3D.GRP",11035779,"game_data"],["DiskII/state-machine-13.rom",256,"bios"],["DiskII/state-machine-16.rom",256,"bios"],["EGAGRAPH.ABS",320626,"game_data"],["END.0SC",17055,"game_data"],["Electron/ELK130E.rom",16384,"bios"],["Electron/basic.rom",16384,"bios"],["Enterprise/BASIC 1.0 - EPROM 1-2 (198x)(Enterprise).bin",8193,"bios"],["Enterprise/BASIC 1.0 - EPROM 2-2 (198x)(Enterprise).bin",8193,"bios"],["Enterprise/BASIC 1.1 - EPROM 1.1 (198x)(Enterprise).bin",16385,"bios"],["Enterprise/basic10.bin",16384,"bios"],["Enterprise/basic11.bin",16384,"bios"],["Enterprise/basic21.bin",16384,"bios"],["Enterprise/epdos.bin",32768,"bios"],["Enterprise/exdos.bin",16384,"bios"],["Enterprise/exos10.bin",32768,"bios"],["Enterprise/exos20.bin",32768,"bios"],["Enterprise/exos21.bin",32768,"bios"],["Enterprise/exos23.bin",65536,"bios"],["FINALE.ABS",11918,"game_data"],["FMT_ALL.ROM",4194496,"bios"],["FMT_DIC.ROM",524288,"bios"],["FMT_DOS.ROM",524288,"bios"],["FMT_F20.ROM",524288,"bios"],["FMT_FNT.ROM",262144,"bios"],["FMT_SYS.ROM",262144,"bios"],["FONT2.0FN",3819,"game_data"],["FONTBIG.0FN",6463,"game_data"],["FONTINY.0FN",3339,"game_data"],["FONTMN1.0FN",8982,"game_data"],["FONTMN2.0FN",6789,"game_data"],["FONTS.000",14542,"game_data"],["GAMEMAPS.ABS",20433,"game_data"],["GBA/gba_bios.bin",16384,"bios"],["GC/EUR/IPL.bin",2097152,"bios"],["GC/JAP/IPL.bin",2097152,"bios"],["GC/USA/IPL.bin",2097152,"bios"],["GC/dsp_coef.bin",4096,"bios"],["GC/dsp_rom.bin",8192,"bios"],["GC/font_japanese.bin",259626,"bios"],["GC/font_western.bin",6478,"bios"],["GUI.RFF",7145,"game_data"],["HUNTBGIN.RTC",54258,"game_data"],["HUNTBGIN.RTL",103316,"game_data"],["HUNTBGIN.WAD",6436871,"game_data"],["IANIM.BS1",18977,"game_data"],["IANIM.BS6",18977,"game_data"],["IANIM.VSI",18977,"game_data"],["INSTRUCT.0SC",145067,"game_data"],["JiffyDOS_1541-II.bin",16384,"bios"],["JiffyDOS_1571_repl310654.bin",32768,"bios"],["JiffyDOS_1581.bin",32768,"bios"],["JiffyDOS_C128.bin",16384,"bios"],["JiffyDOS_C64.bin",8192,"bios"],["JiffyDOS_SX-64.bin",8192,"bios"],["LEVEL0.000",20390,"game_data"],["LEVEL0.001",36234,"game_data"],["LEVEL0.002",20642,"game_data"],["Load/Firmware/rtl_bt/rtl8723a_fw.bin",24548,"bios"],["Load/Firmware/rtl_bt/rtl8723b_fw.bin",45048,"bios"],["Load/Firmware/rtl_bt/rtl8723d_fw.bin",52080,"bios"],["Load/Firmware/rtl_bt/rtl8761a_fw.bin",74488,"bios"],["Load/Firmware/rtl_bt/rtl8761bu_fw.bin",44484,"bios"],["Load/Firmware/rtl_bt/rtl8821a_fw.bin",37420,"bios"],["Load/Firmware/rtl_bt/rtl8821c_fw.bin",54636,"bios"],["Load/Firmware/rtl_bt/rtl8822b_fw.bin",51176,"bios"],["Load/Firmware/rtl_bt/rtl8822cu_fw.bin",38207,"bios"],["Load/Firmware/rtl_bt/rtl8851bu_fw.bin",49760,"bios"],["Load/Firmware/rtl_bt/rtl8852au_fw.bin",67188,"bios"],["Load/Firmware/rtl_bt/rtl8852btu_fw.bin",128140,"bios"],["Load/Firmware/rtl_bt/rtl8852bu_fw.bin",129733,"bios"],["Load/Firmware/rtl_bt/rtl8852cu_fw.bin",113336,"bios"],["Load/Firmware/rtl_bt/rtl8922au_fw.bin",71360,"bios"],["Load/WiiSD.raw",134217728,"bios"],["LucidaConsole_12.abc",2332,"bios"],["LucidaConsole_12.tga",131090,"bios"],["MACRO.1",1032,"game_data"],["MAINCHAR.000",156281,"game_data"],["MAPHEAD.BS1",834,"game_data"],["MAPTEMP.BS1",90786,"game_data"],["MAR_EX0.ROM",524288,"bios"],["MAR_EX1.ROM",524288,"bios"],["MAR_EX2.ROM",524288,"bios"],["MAR_Line truncated
+1 -1
View File
@@ -1 +1 @@
{"files":[["32X_G_BIOS.BIN",256,"bios"],["32X_M_BIOS.BIN",2048,"bios"],["32X_S_BIOS.BIN",1024,"bios"],["3do_arcade_saot.bin",524288,"bios"],["3ds/Citra/sysdata/aes_keys.txt",7357,"bios"],["3ds/Citra/sysdata/boot9.bin",65536,"bios"],["3ds/Citra/sysdata/seeddb.bin",53264,"bios"],["3ds/Citra/sysdata/shared_font.bin",3145728,"bios"],["5200.rom",2048,"bios"],["64DD_IPL.bin",4194304,"bios"],["64DD_IPL_DEV.n64",4194304,"bios"],["64DD_IPL_JP.n64",4194304,"bios"],["64DD_IPL_US.n64",4194304,"bios"],["6570-036.rom",2048,"bios"],["68HC05.rom",8192,"bios"],["7800 BIOS (E).rom",16384,"bios"],["7800 BIOS (U).rom",4096,"bios"],["ATARIBAS.ROM",8192,"bios"],["ATARIOSA.ROM",10240,"bios"],["ATARIOSB.ROM",10240,"bios"],["ATARIXL.ROM",16384,"bios"],["Acorn/basic.rom",16384,"bios"],["Amiga/Kickstart-v1.3-rev34.5-1987-Commodore-A500-A1000-A2000-CDTV.rom",262144,"bios"],["AppleII/apple2e-character.rom",4096,"bios"],["AppleIIgs/apple2gs.chr",4096,"bios"],["BB01R4_OS.ROM",16384,"bios"],["BBCMicro/dfs09.rom",8192,"bios"],["BLOCKS.000",143876,"game_data"],["BLOOD.RFF",3536782,"game_data"],["BONUS.000",161022,"game_data"],["BONUS.0SC",51832,"game_data"],["BONUSMAP.000",6455,"game_data"],["BS-X.bin",1048576,"bios"],["CARTS.SHA",33152,"bios"],["CM32LN_CONTROL.ROM",65536,"bios"],["CM32L_CONTROL.ROM",65536,"bios"],["CM32L_PCM.ROM",1048576,"bios"],["CMOS.ROM",52,"bios"],["CYRILLIC.FNT",2048,"bios"],["Citra/sysdata/aes_keys.txt",7357,"bios"],["Citra/sysdata/boot9.bin",65536,"bios"],["Citra/sysdata/seeddb.bin",53264,"bios"],["Citra/sysdata/shared_font.bin",3145728,"bios"],["Commodore1540/1540.bin",16384,"bios"],["Commodore1540/1541.bin",16384,"bios"],["Complex_4627.bin",1048576,"bios"],["D8039HLC.rom",2048,"bios"],["DEFAULT.FNT",2048,"bios"],["DISK.ROM",16384,"bios"],["DOSBOX.SF2",32319396,"bios"],["DUKE.RTS",188954,"game_data"],["DUKE3D.GRP",11035779,"game_data"],["Databases/colecodb.xml",158187,"bios"],["Databases/msxcaswavdb.xml",819679,"bios"],["Databases/msxromdb.xml",930986,"bios"],["Databases/msxsysromdb.xml",157542,"bios"],["Databases/segadb.xml",82318,"bios"],["Databases/svidb.xml",261070,"bios"],["DiskII/state-machine-13.rom",256,"bios"],["DiskII/state-machine-16.rom",256,"bios"],["END.0SC",17055,"game_data"],["Electron/ELK130E.rom",16384,"bios"],["Electron/basic.rom",16384,"bios"],["FMPAC.ROM",65536,"bios"],["FMT_ALL.ROM",4194496,"bios"],["FMT_DIC.ROM",524288,"bios"],["FMT_DOS.ROM",524288,"bios"],["FMT_F20.ROM",524288,"bios"],["FMT_FNT.ROM",262144,"bios"],["FMT_SYS.ROM",262144,"bios"],["FONT2.0FN",3819,"game_data"],["FONTBIG.0FN",6463,"game_data"],["FONTINY.0FN",3339,"game_data"],["FONTMN1.0FN",8982,"game_data"],["FONTMN2.0FN",6789,"game_data"],["FONTS.000",14542,"game_data"],["GBA/gba_bios.bin",16384,"bios"],["GC/EUR/IPL.bin",2097152,"bios"],["GC/EUR/IPL_TRI.bin",2097152,"bios"],["GC/JAP/IPL.bin",2097152,"bios"],["GC/JAP/IPL_TRI.bin",2097152,"bios"],["GC/USA/IPL.bin",2097152,"bios"],["GC/USA/IPL_TRI.bin",2097152,"bios"],["GC/dsp_coef.bin",4096,"bios"],["GC/dsp_rom.bin",8192,"bios"],["GC/font_japanese.bin",259626,"bios"],["GC/font_western.bin",6478,"bios"],["GMASTER.ROM",16384,"bios"],["GMASTER2.ROM",131072,"bios"],["GUI.RFF",7145,"game_data"],["HUNTBGIN.RTC",54258,"game_data"],["HUNTBGIN.RTL",103316,"game_data"],["HUNTBGIN.WAD",6436871,"game_data"],["Help/Script56.chm",1351013,"bios"],["INSTRUCT.0SC",145067,"game_data"],["INTERNAT.FNT",2048,"bios"],["ITALIC.FNT",2048,"bios"],["JAPANESE.FNT",2048,"bios"],["JiffyDOS_1541-II.bin",16384,"bios"],["JiffyDOS_1571_repl310654.bin",32768,"bios"],["JiffyDOS_1581.bin",32768,"bios"],["JiffyDOS_C128.bin",16384,"bios"],["JiffyDOS_C64.bin",8192,"bios"],["JiffyDOS_SX-64.bin",8192,"bios"],["KANJI.ROM",131072,"bios"],["KOREAN.FNT",2048,"bios"],["LEVEL0.000",20390,"game_data"],["LEVEL0.001",36234,"game_data"],["LEVEL0.002",20642,"game_data"],["Load/Firmware/rtl_bt/rtl8723a_fw.bin",24548,"bios"],["Load/Firmware/rtl_bt/rtl8723b_fw.bin",45048,"bios"],["Load/Firmware/rtl_bt/rtl8723d_fw.bin",52080,"bios"],["Load/Firmware/rtl_bt/rtl8761a_fw.bin",74488,"bios"],["Load/Firmware/rtl_bt/rtl8761bu_fw.bin",44484,"bios"],["Load/Firmware/rtl_bt/rtl8821a_fw.bin",37420,"bios"],["Load/Firmware/rtl_bt/rtl8821c_fw.bin",54636,"bios"],["Load/Firmware/rtl_bt/rtl8822b_fw.bin",51176,"bios"],["Load/Firmware/rtl_bt/rtl8822cu_fw.bin",38207,"bios"],["Load/Firmware/rtl_bt/rtl8851bu_fw.bin",49760,"bios"],["Load/Firmware/rtl_bt/rtl8852au_fw.bin",67188,"bios"],["Load/Firmware/rtl_bt/rtl8852btu_fw.bin",128140,"bios"],["Load/Firmware/rtl_bt/rtl8852bu_fw.bin",129733,"bios"],["Load/Firmware/rtl_bt/rtl8852cu_fw.bin",113336,"bios"],["Load/Firmware/rtl_bt/rtl8922au_fw.bin",71360,"bios"],["Load/WiiSD.raw",134217728,"bios"],["MACRO.1",1032,"game_data"],["MAINCHAR.000",156281,"game_data"],["MAR_EX0.ROM",524288,"bios"],["MAR_EX1.ROM",524288,"bios"],["MAR_EX2.ROM",524288,"bios"],["MAR_EX3.ROM",524288,"bios"],["MENU.000",124306,"game_data"],["MENUSNG.PSM",79609,"game_data"],["MSX.ROM",32768,"bios"],["MSX/disk.rom",16384,"bios"],["MSX/fmpac.rom",Line truncated
{"files":[["32X_G_BIOS.BIN",256,"bios"],["32X_M_BIOS.BIN",2048,"bios"],["32X_S_BIOS.BIN",1024,"bios"],["3do_arcade_saot.bin",524288,"bios"],["3ds/Citra/sysdata/aes_keys.txt",7357,"bios"],["3ds/Citra/sysdata/boot9.bin",65536,"bios"],["3ds/Citra/sysdata/seeddb.bin",53264,"bios"],["3ds/Citra/sysdata/shared_font.bin",3145728,"bios"],["5200.rom",2048,"bios"],["64DD_IPL.bin",4194304,"bios"],["64DD_IPL_DEV.n64",4194304,"bios"],["64DD_IPL_JP.n64",4194304,"bios"],["64DD_IPL_US.n64",4194304,"bios"],["6570-036.rom",2048,"bios"],["68HC05.rom",8192,"bios"],["7800 BIOS (E).rom",16384,"bios"],["7800 BIOS (U).rom",4096,"bios"],["ATARIBAS.ROM",8192,"bios"],["ATARIOSA.ROM",10240,"bios"],["ATARIOSB.ROM",10240,"bios"],["ATARIXL.ROM",16384,"bios"],["Acorn/basic.rom",16384,"bios"],["Amiga/Kickstart-v1.3-rev34.5-1987-Commodore-A500-A1000-A2000-CDTV.rom",262144,"bios"],["AppleII/apple2e-character.rom",4096,"bios"],["AppleIIgs/apple2gs.chr",4096,"bios"],["BB01R4_OS.ROM",16384,"bios"],["BBCMicro/dfs09.rom",8192,"bios"],["BLOCKS.000",143876,"game_data"],["BLOOD.RFF",3536782,"game_data"],["BONUS.000",161022,"game_data"],["BONUS.0SC",51832,"game_data"],["BONUSMAP.000",6455,"game_data"],["BS-X.bin",1048576,"bios"],["CARTS.SHA",33152,"bios"],["CM32LN_CONTROL.ROM",65536,"bios"],["CM32L_CONTROL.ROM",65536,"bios"],["CM32L_PCM.ROM",1048576,"bios"],["CMOS.ROM",52,"bios"],["CYRILLIC.FNT",2048,"bios"],["Citra/sysdata/aes_keys.txt",7357,"bios"],["Citra/sysdata/boot9.bin",65536,"bios"],["Citra/sysdata/seeddb.bin",53264,"bios"],["Citra/sysdata/shared_font.bin",3145728,"bios"],["Commodore1540/1540.bin",16384,"bios"],["Commodore1540/1541.bin",16384,"bios"],["Complex_4627.bin",1048576,"bios"],["D8039HLC.rom",2048,"bios"],["DEFAULT.FNT",2048,"bios"],["DISK.ROM",16384,"bios"],["DOSBOX.SF2",32319396,"bios"],["DUKE.RTS",188954,"game_data"],["DUKE3D.GRP",11035779,"game_data"],["Databases/colecodb.xml",158187,"bios"],["Databases/msxcaswavdb.xml",819679,"bios"],["Databases/msxromdb.xml",930986,"bios"],["Databases/msxsysromdb.xml",157542,"bios"],["Databases/segadb.xml",82318,"bios"],["Databases/svidb.xml",261070,"bios"],["DiskII/state-machine-13.rom",256,"bios"],["DiskII/state-machine-16.rom",256,"bios"],["END.0SC",17055,"game_data"],["Electron/ELK130E.rom",16384,"bios"],["Electron/basic.rom",16384,"bios"],["FMPAC.ROM",65536,"bios"],["FMT_ALL.ROM",4194496,"bios"],["FMT_DIC.ROM",524288,"bios"],["FMT_DOS.ROM",524288,"bios"],["FMT_F20.ROM",524288,"bios"],["FMT_FNT.ROM",262144,"bios"],["FMT_SYS.ROM",262144,"bios"],["FONT2.0FN",3819,"game_data"],["FONTBIG.0FN",6463,"game_data"],["FONTINY.0FN",3339,"game_data"],["FONTMN1.0FN",8982,"game_data"],["FONTMN2.0FN",6789,"game_data"],["FONTS.000",14542,"game_data"],["GBA/gba_bios.bin",16384,"bios"],["GC/EUR/IPL.bin",2097152,"bios"],["GC/EUR/IPL_TRI.bin",2097152,"bios"],["GC/JAP/IPL.bin",2097152,"bios"],["GC/JAP/IPL_TRI.bin",2097152,"bios"],["GC/USA/IPL.bin",2097152,"bios"],["GC/USA/IPL_TRI.bin",2097152,"bios"],["GC/dsp_coef.bin",4096,"bios"],["GC/dsp_rom.bin",8192,"bios"],["GC/font_japanese.bin",259626,"bios"],["GC/font_western.bin",6478,"bios"],["GMASTER.ROM",16384,"bios"],["GMASTER2.ROM",131072,"bios"],["GUI.RFF",7145,"game_data"],["HUNTBGIN.RTC",54258,"game_data"],["HUNTBGIN.RTL",103316,"game_data"],["HUNTBGIN.WAD",6436871,"game_data"],["Help/Script56.chm",1351013,"bios"],["INSTRUCT.0SC",145067,"game_data"],["INTERNAT.FNT",2048,"bios"],["ITALIC.FNT",2048,"bios"],["JAPANESE.FNT",2048,"bios"],["JiffyDOS_1541-II.bin",16384,"bios"],["JiffyDOS_1571_repl310654.bin",32768,"bios"],["JiffyDOS_1581.bin",32768,"bios"],["JiffyDOS_C128.bin",16384,"bios"],["JiffyDOS_C64.bin",8192,"bios"],["JiffyDOS_SX-64.bin",8192,"bios"],["KANJI.ROM",131072,"bios"],["KOREAN.FNT",2048,"bios"],["LEVEL0.000",20390,"game_data"],["LEVEL0.001",36234,"game_data"],["LEVEL0.002",20642,"game_data"],["Load/Firmware/rtl_bt/rtl8723a_fw.bin",24548,"bios"],["Load/Firmware/rtl_bt/rtl8723b_fw.bin",45048,"bios"],["Load/Firmware/rtl_bt/rtl8723d_fw.bin",52080,"bios"],["Load/Firmware/rtl_bt/rtl8761a_fw.bin",74488,"bios"],["Load/Firmware/rtl_bt/rtl8761bu_fw.bin",44484,"bios"],["Load/Firmware/rtl_bt/rtl8821a_fw.bin",37420,"bios"],["Load/Firmware/rtl_bt/rtl8821c_fw.bin",54636,"bios"],["Load/Firmware/rtl_bt/rtl8822b_fw.bin",51176,"bios"],["Load/Firmware/rtl_bt/rtl8822cu_fw.bin",38207,"bios"],["Load/Firmware/rtl_bt/rtl8851bu_fw.bin",49760,"bios"],["Load/Firmware/rtl_bt/rtl8852au_fw.bin",67188,"bios"],["Load/Firmware/rtl_bt/rtl8852btu_fw.bin",128140,"bios"],["Load/Firmware/rtl_bt/rtl8852bu_fw.bin",129733,"bios"],["Load/Firmware/rtl_bt/rtl8852cu_fw.bin",113336,"bios"],["Load/Firmware/rtl_bt/rtl8922au_fw.bin",71360,"bios"],["Load/WiiSD.raw",134217728,"bios"],["MACRO.1",1032,"game_data"],["MAINCHAR.000",156281,"game_data"],["MAR_EX0.ROM",524288,"bios"],["MAR_EX1.ROM",524288,"bios"],["MAR_EX2.ROM",524288,"bios"],["MAR_EX3.ROM",524288,"bios"],["MENU.000",124306,"game_data"],["MENUSNG.PSM",79609,"game_data"],["MSX.ROM",32768,"bios"],["MSX/disk.rom",16384,"bios"],["MSX/fmpac.rom",Line truncated
+1 -1
View File
@@ -1 +1 @@
{"files":[["128-0.rom",16384,"bios"],["128-1.rom",16384,"bios"],["128-spanish-0.rom",16384,"bios"],["128-spanish-1.rom",16384,"bios"],["22vp931.zip",1405,"bios"],["32X_G_BIOS.bin",256,"bios"],["32X_M_BIOS.bin",2048,"bios"],["32X_S_BIOS.bin",1024,"bios"],["3c505.zip",10896,"bios"],["3do_arcade_saot.bin",524288,"bios"],["3xtwin.zip",1417,"bios"],["48.rom",16384,"bios"],["4dparprn.zip",409,"bios"],["5200.rom",2048,"bios"],["64DD_IPL.bin",4194304,"bios"],["6570-036.rom",2048,"bios"],["68HC05.rom",8192,"bios"],["7800 BIOS (E).rom",16384,"bios"],["7800 BIOS (U).rom",4096,"bios"],["ATARIBAS.ROM",8192,"bios"],["ATARIOSA.ROM",10240,"bios"],["ATARIOSB.ROM",10240,"bios"],["ATARIXL.ROM",16384,"bios"],["Azahar/Azahar/nand/private/movable.sed",320,"bios"],["Azahar/Azahar/nand/rw/sys/LocalFriendCodeSeed_B",272,"bios"],["Azahar/Azahar/nand/rw/sys/SecureInfo_A",273,"bios"],["Azahar/Azahar/sysdata/keys.txt",7424,"bios"],["Azahar/Azahar/sysdata/otp.bin",256,"bios"],["Azahar/Azahar/sysdata/seeddb.bin",53264,"bios"],["Azahar/Azahar/sysdata/shared_font.bin",3145728,"bios"],["BB01R4_OS.ROM",16384,"bios"],["BBKEmu/A4980/8.BIN",2097152,"bios"],["BBKEmu/A4980/E.BIN",2097152,"bios"],["BIOS.col",8192,"bios"],["BS-X (En) (DRM-Free).bin",1048576,"bios"],["BS-X (En).bin",1048576,"bios"],["BS-X.bin",1048576,"bios"],["CARTS.SHA",33152,"bios"],["CM32LN_CONTROL.ROM",65536,"bios"],["CM32L_CONTROL.ROM",65536,"bios"],["CM32L_PCM.ROM",1048576,"bios"],["CYRILLIC.FNT",2048,"bios"],["Cemu/cafeLibs/erreula.rpl",790080,"bios"],["Cemu/cafeLibs/snd_user.rpl",84032,"bios"],["Cemu/cafeLibs/snduser2.rpl",111360,"bios"],["Cemu/cafeLibs/swkbd.rpl",1116288,"bios"],["Cemu/keys.txt",449507,"bios"],["Cemu/mlc01/sys/title/0005001b/10042400/content/CafeCn.ttf",13110604,"bios"],["Cemu/mlc01/sys/title/0005001b/10042400/content/CafeKr.ttf",2260660,"bios"],["Cemu/mlc01/sys/title/0005001b/10042400/content/CafeStd.ttf",2442464,"bios"],["Cemu/mlc01/sys/title/0005001b/10042400/content/CafeTw.ttf",8229724,"bios"],["Cemu/mlc01/sys/title/0005001b/1004f000/content/00/swkbd/swkbd.pack",1907900,"bios"],["Cemu/mlc01/sys/title/0005001b/10051000/content/00/erreula/erreula.pack",1252759,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/ccerts/WIIU_ACCOUNT_1_CERT.der",1226,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/ccerts/WIIU_ACCOUNT_1_RSA_KEY.aes",1200,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/ccerts/WIIU_COMMON_1_CERT.der",1224,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/ccerts/WIIU_COMMON_1_RSA_KEY.aes",1200,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/ccerts/WIIU_OLIVE_1_CERT.der",1224,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/ccerts/WIIU_OLIVE_1_RSA_KEY.aes",1200,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/ccerts/WIIU_VINO_1_CERT.der",1223,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/ccerts/WIIU_VINO_1_RSA_KEY.aes",1200,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/ccerts/WIIU_WOOD_1_CERT.der",1223,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/ccerts/WIIU_WOOD_1_RSA_KEY.aes",1200,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/ADDTRUST_EXT_CA_ROOT.der",1082,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/BALTIMORE_CYBERTRUST_ROOT_CA.der",891,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/CACERT_NINTENDO_CA.der",897,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/CACERT_NINTENDO_CA_G2.der",1173,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/CACERT_NINTENDO_CA_G3.der",1060,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/CACERT_NINTENDO_CLASS2_CA.der",924,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/CACERT_NINTENDO_CLASS2_CA_G2.der",1200,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/CACERT_NINTENDO_CLASS2_CA_G3.der",1200,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/COMODO_CA.der",980,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/CYBERTRUST_GLOBAL_ROOT_CA.der",933,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/DIGICERT_ASSURED_ID_ROOT_CA.der",955,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/DIGICERT_ASSURED_ID_ROOT_CA_G2.der",922,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/DIGICERT_GLOBAL_ROOT_CA.der",947,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/DIGICERT_GLOBAL_ROOT_CA_G2.der",914,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/DIGICERT_HIGH_ASSURANCE_EV_ROOT_CA.der",969,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/ENTRUST_CA_2048.der",1070,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/ENTRUST_ROOT_CA.der",1173,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/ENTRUST_ROOT_CA_G2.der",1090,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/ENTRUST_SECURE_SERVER_CA.der",1244,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerLine truncated
{"files":[["128-0.rom",16384,"bios"],["128-1.rom",16384,"bios"],["128-spanish-0.rom",16384,"bios"],["128-spanish-1.rom",16384,"bios"],["22vp931.zip",1405,"bios"],["32X_G_BIOS.bin",256,"bios"],["32X_M_BIOS.bin",2048,"bios"],["32X_S_BIOS.bin",1024,"bios"],["3c505.zip",10896,"bios"],["3do_arcade_saot.bin",524288,"bios"],["3xtwin.zip",1417,"bios"],["48.rom",16384,"bios"],["4dparprn.zip",409,"bios"],["5200.rom",2048,"bios"],["64DD_IPL.bin",4194304,"bios"],["6570-036.rom",2048,"bios"],["68HC05.rom",8192,"bios"],["7800 BIOS (E).rom",16384,"bios"],["7800 BIOS (U).rom",4096,"bios"],["ATARIBAS.ROM",8192,"bios"],["ATARIOSA.ROM",10240,"bios"],["ATARIOSB.ROM",10240,"bios"],["ATARIXL.ROM",16384,"bios"],["Azahar/Azahar/nand/private/movable.sed",320,"bios"],["Azahar/Azahar/nand/rw/sys/LocalFriendCodeSeed_B",272,"bios"],["Azahar/Azahar/nand/rw/sys/SecureInfo_A",273,"bios"],["Azahar/Azahar/sysdata/keys.txt",7424,"bios"],["Azahar/Azahar/sysdata/otp.bin",256,"bios"],["Azahar/Azahar/sysdata/seeddb.bin",53264,"bios"],["Azahar/Azahar/sysdata/shared_font.bin",3145728,"bios"],["BB01R4_OS.ROM",16384,"bios"],["BBKEmu/A4980/8.BIN",2097152,"bios"],["BBKEmu/A4980/E.BIN",2097152,"bios"],["BIOS.col",8192,"bios"],["BS-X (En) (DRM-Free).bin",1048576,"bios"],["BS-X (En).bin",1048576,"bios"],["BS-X.bin",1048576,"bios"],["CARTS.SHA",33152,"bios"],["CM32LN_CONTROL.ROM",65536,"bios"],["CM32L_CONTROL.ROM",65536,"bios"],["CM32L_PCM.ROM",1048576,"bios"],["CYRILLIC.FNT",2048,"bios"],["Cemu/cafeLibs/erreula.rpl",790080,"bios"],["Cemu/cafeLibs/snd_user.rpl",84032,"bios"],["Cemu/cafeLibs/snduser2.rpl",111360,"bios"],["Cemu/cafeLibs/swkbd.rpl",1116288,"bios"],["Cemu/keys.txt",449507,"bios"],["Cemu/mlc01/sys/title/0005001b/10042400/content/CafeCn.ttf",13110604,"bios"],["Cemu/mlc01/sys/title/0005001b/10042400/content/CafeKr.ttf",2260660,"bios"],["Cemu/mlc01/sys/title/0005001b/10042400/content/CafeStd.ttf",2442464,"bios"],["Cemu/mlc01/sys/title/0005001b/10042400/content/CafeTw.ttf",8229724,"bios"],["Cemu/mlc01/sys/title/0005001b/1004f000/content/00/swkbd/swkbd.pack",1907900,"bios"],["Cemu/mlc01/sys/title/0005001b/10051000/content/00/erreula/erreula.pack",1252759,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/ccerts/WIIU_ACCOUNT_1_CERT.der",1226,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/ccerts/WIIU_ACCOUNT_1_RSA_KEY.aes",1200,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/ccerts/WIIU_COMMON_1_CERT.der",1224,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/ccerts/WIIU_COMMON_1_RSA_KEY.aes",1200,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/ccerts/WIIU_OLIVE_1_CERT.der",1224,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/ccerts/WIIU_OLIVE_1_RSA_KEY.aes",1200,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/ccerts/WIIU_VINO_1_CERT.der",1223,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/ccerts/WIIU_VINO_1_RSA_KEY.aes",1200,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/ccerts/WIIU_WOOD_1_CERT.der",1223,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/ccerts/WIIU_WOOD_1_RSA_KEY.aes",1200,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/ADDTRUST_EXT_CA_ROOT.der",1082,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/BALTIMORE_CYBERTRUST_ROOT_CA.der",891,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/CACERT_NINTENDO_CA.der",897,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/CACERT_NINTENDO_CA_G2.der",1173,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/CACERT_NINTENDO_CA_G3.der",1060,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/CACERT_NINTENDO_CLASS2_CA.der",924,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/CACERT_NINTENDO_CLASS2_CA_G2.der",1200,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/CACERT_NINTENDO_CLASS2_CA_G3.der",1200,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/COMODO_CA.der",980,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/CYBERTRUST_GLOBAL_ROOT_CA.der",933,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/DIGICERT_ASSURED_ID_ROOT_CA.der",955,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/DIGICERT_ASSURED_ID_ROOT_CA_G2.der",922,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/DIGICERT_GLOBAL_ROOT_CA.der",947,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/DIGICERT_GLOBAL_ROOT_CA_G2.der",914,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/DIGICERT_HIGH_ASSURANCE_EV_ROOT_CA.der",969,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/ENTRUST_CA_2048.der",1070,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/ENTRUST_ROOT_CA.der",1173,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/ENTRUST_ROOT_CA_G2.der",1090,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerts/ENTRUST_SECURE_SERVER_CA.der",1244,"bios"],["Cemu/mlc01/sys/title/0005001b/10054000/content/scerLine truncated
+1 -1
View File
@@ -1 +1 @@
{"files":[["arcade/hiscore.dat",322458,"bios"],["atari2600/stella/KVB1.WAV",4219542,"game_data"],["atari2600/stella/KVB2.WAV",9593878,"game_data"],["atari2600/stella/KVB3.WAV",7676992,"game_data"],["atari2600/stella/KVS1.WAV",3436329,"game_data"],["atari2600/stella/KVS2.WAV",2086275,"game_data"],["atari2600/stella/KVS3.WAV",3720920,"game_data"],["atari2600/stella/KVSHARED.WAV",3059116,"game_data"],["bios/000-lo.lo",131072,"bios"],["bios/128-spanish-0.rom",16384,"bios"],["bios/128-spanish-1.rom",16384,"bios"],["bios/128p-0.rom",16384,"bios"],["bios/128p-1.rom",16384,"bios"],["bios/22vp931.zip",1405,"bios"],["bios/256s-0.rom",16384,"bios"],["bios/256s-1.rom",16384,"bios"],["bios/256s-2.rom",16384,"bios"],["bios/256s-3.rom",16384,"bios"],["bios/2608_BD.WAV",19192,"bios"],["bios/2608_HH.WAV",36722,"bios"],["bios/2608_RIM.WAV",5288,"bios"],["bios/2608_SD.WAV",15558,"bios"],["bios/2608_TOM.WAV",23092,"bios"],["bios/2608_TOP.WAV",57016,"bios"],["bios/32X_G_BIOS.BIN",256,"bios"],["bios/32X_M_BIOS.BIN",2048,"bios"],["bios/32X_S_BIOS.BIN",1024,"bios"],["bios/3c505.zip",10896,"bios"],["bios/3do_arcade_saot.bin",524288,"bios"],["bios/3dobios.zip",2351546,"bios"],["bios/3xtwin.zip",1417,"bios"],["bios/4dparprn.zip",480212,"bios"],["bios/5200.rom",2048,"bios"],["bios/64DD_IPL.bin",4194304,"bios"],["bios/64_cspeech.zip",2011,"bios"],["bios/7800 BIOS (E).rom",16384,"bios"],["bios/7800 BIOS (U).rom",4096,"bios"],["bios/82c606.zip",479847,"bios"],["bios/A78_highscore.bin",16364,"bios"],["bios/APPLE2GS.ROM",131072,"bios"],["bios/ARAB1.ROM",32768,"bios"],["bios/ARABIC.rom",32768,"bios"],["bios/ATARIBAS.ROM",8192,"bios"],["bios/ATARIOSA.ROM",10240,"bios"],["bios/ATARIOSB.ROM",10240,"bios"],["bios/ATARIXL.ROM",16384,"bios"],["bios/AmigaVision.rom",524288,"bios"],["bios/Atari Jaguar (World).j64",131072,"bios"],["bios/BB01R4_OS.ROM",16384,"bios"],["bios/BEERIDE.ROM",16384,"bios"],["bios/BIOS.col",8192,"bios"],["bios/BS-X (En) (DRM-Free).bin",1048576,"bios"],["bios/BS-X (En).bin",1048576,"bios"],["bios/BS-X.bin",1048576,"bios"],["bios/CARTS.SHA",33152,"bios"],["bios/CCNPATCH.cas",1481,"bios"],["bios/CCNPATCH.wav",71748,"bios"],["bios/CM32LN_CONTROL.ROM",65536,"bios"],["bios/CM32L_CONTROL.ROM",65536,"bios"],["bios/CM32L_PCM.ROM",1048576,"bios"],["bios/CYRILLIC.FNT",2048,"bios"],["bios/Cemu/cafeLibs/erreula.rpl",790080,"bios"],["bios/Cemu/cafeLibs/snd_user.rpl",84032,"bios"],["bios/Cemu/cafeLibs/snduser2.rpl",111360,"bios"],["bios/Cemu/cafeLibs/swkbd.rpl",1116288,"bios"],["bios/Cemu/keys.txt",449507,"bios"],["bios/Cemu/otp.bin",1024,"bios"],["bios/Cemu/resources/sharedFonts/CafeCn.ttf",9664448,"bios"],["bios/Cemu/resources/sharedFonts/CafeKr.ttf",5626464,"bios"],["bios/Cemu/resources/sharedFonts/CafeStd.ttf",5363768,"bios"],["bios/Cemu/resources/sharedFonts/CafeTw.ttf",6593548,"bios"],["bios/Cemu/seeprom.bin",512,"bios"],["bios/Cemu/shareddata.bin",33554432,"bios"],["bios/Complex.bin",1048576,"bios"],["bios/Complex_4627.bin",1048576,"bios"],["bios/Complex_4627v1.03.bin",1048576,"bios"],["bios/DBPATCH.cas",1481,"bios"],["bios/DBPATCH.wav",71900,"bios"],["bios/DEFAULT.FNT",2048,"bios"],["bios/DISK.ROM",16384,"bios"],["bios/DOSBOX.SF2",32319396,"bios"],["bios/FMPAC.ROM",65536,"bios"],["bios/FMPAC16.ROM",33152,"bios"],["bios/FONT.ROM",288768,"bios"],["bios/GBA/gba_bios.bin",16384,"bios"],["bios/GC/EUR/IPL.bin",2097152,"bios"],["bios/GC/JAP/IPL.bin",2097152,"bios"],["bios/GC/USA/IPL.bin",2097152,"bios"],["bios/GC/dsp_coef.bin",4096,"bios"],["bios/GC/dsp_rom.bin",8192,"bios"],["bios/GC/font_japanese.bin",259626,"bios"],["bios/GC/font_western.bin",6478,"bios"],["bios/GCVMX80.ROM",8192,"bios"],["bios/HANGUL.rom",131072,"bios"],["bios/INTERNAT.FNT",2048,"bios"],["bios/ITALIC.FNT",2048,"bios"],["bios/JAPANESE.FNT",2048,"bios"],["bios/JISYO.ROM",524288,"bios"],["bios/JiffyDOS_1541-II.bin",16384,"bios"],["bios/JiffyDOS_1571_repl310654.bin",32768,"bios"],["bios/JiffyDOS_1581.bin",32768,"bios"],["bios/JiffyDOS_C64.bin",8192,"bios"],["bios/JiffyDOS_SX-64.bin",8192,"bios"],["bios/KANJI.ROM",131072,"bios"],["bios/KANJI1.ROM",131072,"bios"],["bios/KOREAN.FNT",2048,"bios"],["bios/Load/Firmware/rtl_bt/rtl8723a_fw.bin",24548,"bios"],["bios/Load/Firmware/rtl_bt/rtl8723b_fw.bin",45048,"bios"],["bios/Load/Firmware/rtl_bt/rtl8723d_fw.bin",52080,"bios"],["bios/Load/Firmware/rtl_bt/rtl8761a_fw.bin",74488,"bios"],["bios/Load/Firmware/rtl_bt/rtl8761bu_fw.bin",44484,"bios"],["bios/Load/Firmware/rtl_bt/rtl8821a_fw.bin",37420,"bios"],["bios/Load/Firmware/rtl_bt/rtl8821c_fw.bin",54636,"bios"],["bios/Load/Firmware/rtl_bt/rtl8822b_fw.bin",51176,"bios"],["bios/Load/Firmware/rtl_bt/rtl8822cu_fw.bin",38207,"bios"],["bios/Load/Firmware/rtl_bt/rtl8851bu_fw.bin",49760,"bios"],["bios/Load/Firmware/rtl_bt/rtl8852au_fw.bin",67188,"bios"],["bios/Load/Firmware/rtl_bt/rtl8852btu_fw.bin",128140,"bios"],["bios/Load/Firmware/rtl_bt/rtl8852bu_fw.bin",129733,"bios"],["bios/Load/Firmware/rtl_bt/rtl8852cu_fw.bin",113336,"bios"],["bios/Load/Firmware/rtl_bt/rtl8922au_fw.bin",71360,"bios"Line truncated
{"files":[["arcade/hiscore.dat",322458,"bios"],["atari2600/stella/KVB1.WAV",4219542,"game_data"],["atari2600/stella/KVB2.WAV",9593878,"game_data"],["atari2600/stella/KVB3.WAV",7676992,"game_data"],["atari2600/stella/KVS1.WAV",3436329,"game_data"],["atari2600/stella/KVS2.WAV",2086275,"game_data"],["atari2600/stella/KVS3.WAV",3720920,"game_data"],["atari2600/stella/KVSHARED.WAV",3059116,"game_data"],["bios/000-lo.lo",131072,"bios"],["bios/128-spanish-0.rom",16384,"bios"],["bios/128-spanish-1.rom",16384,"bios"],["bios/128p-0.rom",16384,"bios"],["bios/128p-1.rom",16384,"bios"],["bios/22vp931.zip",1405,"bios"],["bios/256s-0.rom",16384,"bios"],["bios/256s-1.rom",16384,"bios"],["bios/256s-2.rom",16384,"bios"],["bios/256s-3.rom",16384,"bios"],["bios/2608_BD.WAV",19192,"bios"],["bios/2608_HH.WAV",36722,"bios"],["bios/2608_RIM.WAV",5288,"bios"],["bios/2608_SD.WAV",15558,"bios"],["bios/2608_TOM.WAV",23092,"bios"],["bios/2608_TOP.WAV",57016,"bios"],["bios/32X_G_BIOS.BIN",256,"bios"],["bios/32X_M_BIOS.BIN",2048,"bios"],["bios/32X_S_BIOS.BIN",1024,"bios"],["bios/3c505.zip",10896,"bios"],["bios/3do_arcade_saot.bin",524288,"bios"],["bios/3dobios.zip",2351546,"bios"],["bios/3xtwin.zip",1417,"bios"],["bios/4dparprn.zip",480212,"bios"],["bios/5200.rom",2048,"bios"],["bios/64DD_IPL.bin",4194304,"bios"],["bios/64_cspeech.zip",2011,"bios"],["bios/7800 BIOS (E).rom",16384,"bios"],["bios/7800 BIOS (U).rom",4096,"bios"],["bios/82c606.zip",479847,"bios"],["bios/A78_highscore.bin",16364,"bios"],["bios/APPLE2GS.ROM",131072,"bios"],["bios/ARAB1.ROM",32768,"bios"],["bios/ARABIC.rom",32768,"bios"],["bios/ATARIBAS.ROM",8192,"bios"],["bios/ATARIOSA.ROM",10240,"bios"],["bios/ATARIOSB.ROM",10240,"bios"],["bios/ATARIXL.ROM",16384,"bios"],["bios/AmigaVision.rom",524288,"bios"],["bios/Atari Jaguar (World).j64",131072,"bios"],["bios/BB01R4_OS.ROM",16384,"bios"],["bios/BEERIDE.ROM",16384,"bios"],["bios/BIOS.col",8192,"bios"],["bios/BS-X (En) (DRM-Free).bin",1048576,"bios"],["bios/BS-X (En).bin",1048576,"bios"],["bios/BS-X.bin",1048576,"bios"],["bios/CARTS.SHA",33152,"bios"],["bios/CCNPATCH.cas",1481,"bios"],["bios/CCNPATCH.wav",71748,"bios"],["bios/CM32LN_CONTROL.ROM",65536,"bios"],["bios/CM32L_CONTROL.ROM",65536,"bios"],["bios/CM32L_PCM.ROM",1048576,"bios"],["bios/CYRILLIC.FNT",2048,"bios"],["bios/Cemu/cafeLibs/erreula.rpl",790080,"bios"],["bios/Cemu/cafeLibs/snd_user.rpl",84032,"bios"],["bios/Cemu/cafeLibs/snduser2.rpl",111360,"bios"],["bios/Cemu/cafeLibs/swkbd.rpl",1116288,"bios"],["bios/Cemu/keys.txt",449507,"bios"],["bios/Cemu/otp.bin",1024,"bios"],["bios/Cemu/resources/sharedFonts/CafeCn.ttf",9664448,"bios"],["bios/Cemu/resources/sharedFonts/CafeKr.ttf",5626464,"bios"],["bios/Cemu/resources/sharedFonts/CafeStd.ttf",5363768,"bios"],["bios/Cemu/resources/sharedFonts/CafeTw.ttf",6593548,"bios"],["bios/Cemu/seeprom.bin",512,"bios"],["bios/Cemu/shareddata.bin",33554432,"bios"],["bios/Complex.bin",1048576,"bios"],["bios/Complex_4627.bin",1048576,"bios"],["bios/Complex_4627v1.03.bin",1048576,"bios"],["bios/DBPATCH.cas",1481,"bios"],["bios/DBPATCH.wav",71900,"bios"],["bios/DEFAULT.FNT",2048,"bios"],["bios/DISK.ROM",16384,"bios"],["bios/DOSBOX.SF2",32319396,"bios"],["bios/FMPAC.ROM",65536,"bios"],["bios/FMPAC16.ROM",33152,"bios"],["bios/FONT.ROM",288768,"bios"],["bios/GBA/gba_bios.bin",16384,"bios"],["bios/GC/EUR/IPL.bin",2097152,"bios"],["bios/GC/JAP/IPL.bin",2097152,"bios"],["bios/GC/USA/IPL.bin",2097152,"bios"],["bios/GC/dsp_coef.bin",4096,"bios"],["bios/GC/dsp_rom.bin",8192,"bios"],["bios/GC/font_japanese.bin",259626,"bios"],["bios/GC/font_western.bin",6478,"bios"],["bios/GCVMX80.ROM",8192,"bios"],["bios/HANGUL.rom",131072,"bios"],["bios/INTERNAT.FNT",2048,"bios"],["bios/ITALIC.FNT",2048,"bios"],["bios/JAPANESE.FNT",2048,"bios"],["bios/JISYO.ROM",524288,"bios"],["bios/JiffyDOS_1541-II.bin",16384,"bios"],["bios/JiffyDOS_1571_repl310654.bin",32768,"bios"],["bios/JiffyDOS_1581.bin",32768,"bios"],["bios/JiffyDOS_C64.bin",8192,"bios"],["bios/JiffyDOS_SX-64.bin",8192,"bios"],["bios/KANJI.ROM",131072,"bios"],["bios/KANJI1.ROM",131072,"bios"],["bios/KOREAN.FNT",2048,"bios"],["bios/Load/Firmware/rtl_bt/rtl8723a_fw.bin",24548,"bios"],["bios/Load/Firmware/rtl_bt/rtl8723b_fw.bin",45048,"bios"],["bios/Load/Firmware/rtl_bt/rtl8723d_fw.bin",52080,"bios"],["bios/Load/Firmware/rtl_bt/rtl8761a_fw.bin",74488,"bios"],["bios/Load/Firmware/rtl_bt/rtl8761bu_fw.bin",44484,"bios"],["bios/Load/Firmware/rtl_bt/rtl8821a_fw.bin",37420,"bios"],["bios/Load/Firmware/rtl_bt/rtl8821c_fw.bin",54636,"bios"],["bios/Load/Firmware/rtl_bt/rtl8822b_fw.bin",51176,"bios"],["bios/Load/Firmware/rtl_bt/rtl8822cu_fw.bin",38207,"bios"],["bios/Load/Firmware/rtl_bt/rtl8851bu_fw.bin",49760,"bios"],["bios/Load/Firmware/rtl_bt/rtl8852au_fw.bin",67188,"bios"],["bios/Load/Firmware/rtl_bt/rtl8852btu_fw.bin",128140,"bios"],["bios/Load/Firmware/rtl_bt/rtl8852bu_fw.bin",129733,"bios"],["bios/Load/Firmware/rtl_bt/rtl8852cu_fw.bin",113336,"bios"],["bios/Load/Firmware/rtl_bt/rtl8922au_fw.bin",71360,"bios"Line truncated
+1 -1
View File
@@ -1 +1 @@
{"files":[["128-0.rom",16384,"bios"],["128-1.rom",16384,"bios"],["128-spanish-0.rom",16384,"bios"],["128-spanish-1.rom",16384,"bios"],["22vp931.zip",1405,"bios"],["3c505.zip",10896,"bios"],["3do_arcade_saot.bin",524288,"bios"],["3xtwin.zip",1417,"bios"],["48.rom",16384,"bios"],["4dparprn.zip",409,"bios"],["5200.rom",2048,"bios"],["6570-036.rom",2048,"bios"],["68HC05.rom",8192,"bios"],["7800 BIOS (E).rom",16384,"bios"],["7800 BIOS (U).rom",4096,"bios"],["ATARIBAS.ROM",8192,"bios"],["ATARIOSA.ROM",10240,"bios"],["ATARIOSB.ROM",10240,"bios"],["ATARIXL.ROM",16384,"bios"],["BB01R4_OS.ROM",16384,"bios"],["BIOS.col",8192,"bios"],["BS-X.bin",1048576,"bios"],["CARTS.SHA",33152,"bios"],["CYRILLIC.FNT",2048,"bios"],["D8039HLC.rom",2048,"bios"],["DISK.ROM",16384,"bios"],["Databases/msxromdb.xml",930986,"bios"],["FMPAC.ROM",65536,"bios"],["FMPAC16.ROM",16384,"bios"],["GBA/gba_bios.bin",16384,"bios"],["GC/EUR/IPL.bin",2097152,"bios"],["GC/JAP/IPL.bin",2097152,"bios"],["GC/USA/IPL.bin",2097152,"bios"],["GC/dsp_coef.bin",4096,"bios"],["GC/dsp_rom.bin",8192,"bios"],["GC/font_japanese.bin",259626,"bios"],["GC/font_western.bin",6478,"bios"],["Gram Kracker.ctg",7587,"bios"],["ITALIC.FNT",2048,"bios"],["JiffyDOS_SX-64.bin",8192,"bios"],["KANJI.ROM",131072,"bios"],["Load/Firmware/rtl_bt/rtl8723a_fw.bin",24548,"bios"],["Load/Firmware/rtl_bt/rtl8723b_fw.bin",45048,"bios"],["Load/Firmware/rtl_bt/rtl8723d_fw.bin",52080,"bios"],["Load/Firmware/rtl_bt/rtl8761a_fw.bin",74488,"bios"],["Load/Firmware/rtl_bt/rtl8761bu_fw.bin",44484,"bios"],["Load/Firmware/rtl_bt/rtl8821a_fw.bin",37420,"bios"],["Load/Firmware/rtl_bt/rtl8821c_fw.bin",54636,"bios"],["Load/Firmware/rtl_bt/rtl8822b_fw.bin",51176,"bios"],["Load/Firmware/rtl_bt/rtl8822cu_fw.bin",38207,"bios"],["Load/Firmware/rtl_bt/rtl8851bu_fw.bin",49760,"bios"],["Load/Firmware/rtl_bt/rtl8852au_fw.bin",67188,"bios"],["Load/Firmware/rtl_bt/rtl8852btu_fw.bin",128140,"bios"],["Load/Firmware/rtl_bt/rtl8852bu_fw.bin",129733,"bios"],["Load/Firmware/rtl_bt/rtl8852cu_fw.bin",113336,"bios"],["Load/Firmware/rtl_bt/rtl8922au_fw.bin",71360,"bios"],["Load/WiiSD.raw",134217728,"bios"],["MSX.ROM",32768,"bios"],["MSX2.ROM",32768,"bios"],["MSX2EXT.ROM",16384,"bios"],["MSX2P.ROM",32768,"bios"],["MSX2PEXT.ROM",16384,"bios"],["MSXDOS2.ROM",65536,"bios"],["Machines/Shared Roms/MSX.rom",32768,"bios"],["MesenNesDB.txt",548608,"game_data"],["MesenPalette.pal",192,"bios"],["NstDatabase.xml",1009534,"bios"],["PAINTER.ROM",65536,"bios"],["PPSSPP/ppge_atlas.zim",666530,"bios"],["ROM_OS_BB01R59",16384,"bios"],["ROM_OS_BB01R59A",16384,"bios"],["ROM_OS_BB02R3V4",16384,"bios"],["ROM_OS_CC01R4",16384,"bios"],["RS232.ROM",16640,"bios"],["SCPH-10000.bin",4194304,"bios"],["SCPH-10000.mec",4,"bios"],["SCPH-30004R.bin",4194304,"bios"],["SCPH-39001.bin",4194304,"bios"],["SCPH-50009_BIOS_V10_CHN_190.BIN",4194304,"bios"],["SCPH-50009_BIOS_V10_CHN_190.nvm",1024,"bios"],["SCPH-50009_BIOS_V10_CHN_190.rom1",524288,"bios"],["SCPH-50009_BIOS_V10_CHN_190.rom2",524288,"bios"],["SCPH-70004.BIN",4194304,"bios"],["SCPH-70004.rom1",524288,"bios"],["SCPH-70004_BIOS_V12_EUR_200.rom2",8192,"bios"],["SCPH-70006_BIOS_V12_HK_200.nvm",1024,"bios"],["SCPH-70008_BIOS_V12_RUS_200.BIN",4194304,"bios"],["SCPH-70008_BIOS_V12_RUS_200.nvm",1024,"bios"],["SCPH-75008_BIOS_V14_RUS_220.nvm",1024,"bios"],["SCPH-77008_BIOS_V15_RUS_220.nvm",1024,"bios"],["SCPH-90006_BIOS_VX_HK _230.nvm",1024,"bios"],["SCPH-90006_BIOS_VX_HK _230.rom1",524288,"bios"],["SCPH1001.BIN",524288,"bios"],["SCPH30004R.nvm",1024,"bios"],["SGB1.sfc",262144,"bios"],["SGB2.sfc",524288,"bios"],["SegaCDBIOS9303.bin",131072,"bios"],["SkyEmu/cgb_boot.bin",2304,"bios"],["SkyEmu/dmg_rom.bin",256,"bios"],["SkyEmu/firmware.bin",262144,"bios"],["SkyEmu/gba_bios.bin",16384,"bios"],["SkyEmu/nds7.bin",16384,"bios"],["SkyEmu/nds9.bin",4096,"bios"],["StudyBox.bin",262144,"bios"],["TI-994A.ctg",32292,"bios"],["Wii/clientca.pem",1005,"bios"],["Wii/clientcakey.pem",609,"bios"],["Wii/rootca.pem",897,"bios"],["Wii/shared2/sys/SYSCONF",16384,"bios"],["Wii/title/00000001/00000002/data/setting.txt",256,"bios"],["XEGAME.ROM",8192,"bios"],["[BIOS] Atari Jaguar CD (World).j64",262144,"bios"],["[BIOS] Atari Jaguar Developer CD (World).j64",262144,"bios"],["a1000kbd_de.zip",1331,"bios"],["a1000kbd_dk.zip",1331,"bios"],["a1000kbd_fr.zip",1331,"bios"],["a1000kbd_gb.zip",1331,"bios"],["a1000kbd_it.zip",1331,"bios"],["a1000kbd_se.zip",1331,"bios"],["a1000kbd_us.zip",1331,"bios"],["a1060-bios-2.05.rom",16384,"bios"],["a1060-bios-2.06.rom",16384,"bios"],["a1200kbd_rb.zip",1476,"bios"],["a1cass.zip",509,"bios"],["a2000kbd_ch.zip",1335,"bios"],["a2000kbd_de.zip",1335,"bios"],["a2000kbd_dk.zip",1335,"bios"],["a2000kbd_es.zip",1335,"bios"],["a2000kbd_fr.zip",1335,"bios"],["a2000kbd_g80_de.zip",1151,"bios"],["a2000kbd_g80_dk.zip",1151,"bios"],["a2000kbd_g80_gb.zip",1151,"bios"],["a2000kbd_g80_se.zip",1151,"bios"],["a2000kbd_g80_us.zip",1151,"bios"],["a2000kbd_gb.zip",1335,"bios"],["a2000kbd_it.zip",1335,"bios"],["a2000kbd_no.zip",1335Line truncated
{"files":[["128-0.rom",16384,"bios"],["128-1.rom",16384,"bios"],["128-spanish-0.rom",16384,"bios"],["128-spanish-1.rom",16384,"bios"],["22vp931.zip",1405,"bios"],["3c505.zip",10896,"bios"],["3do_arcade_saot.bin",524288,"bios"],["3xtwin.zip",1417,"bios"],["48.rom",16384,"bios"],["4dparprn.zip",409,"bios"],["5200.rom",2048,"bios"],["6570-036.rom",2048,"bios"],["68HC05.rom",8192,"bios"],["7800 BIOS (E).rom",16384,"bios"],["7800 BIOS (U).rom",4096,"bios"],["ATARIBAS.ROM",8192,"bios"],["ATARIOSA.ROM",10240,"bios"],["ATARIOSB.ROM",10240,"bios"],["ATARIXL.ROM",16384,"bios"],["BB01R4_OS.ROM",16384,"bios"],["BIOS.col",8192,"bios"],["BS-X.bin",1048576,"bios"],["CARTS.SHA",33152,"bios"],["CYRILLIC.FNT",2048,"bios"],["D8039HLC.rom",2048,"bios"],["DISK.ROM",16384,"bios"],["Databases/msxromdb.xml",930986,"bios"],["FMPAC.ROM",65536,"bios"],["FMPAC16.ROM",16384,"bios"],["GBA/gba_bios.bin",16384,"bios"],["GC/EUR/IPL.bin",2097152,"bios"],["GC/JAP/IPL.bin",2097152,"bios"],["GC/USA/IPL.bin",2097152,"bios"],["GC/dsp_coef.bin",4096,"bios"],["GC/dsp_rom.bin",8192,"bios"],["GC/font_japanese.bin",259626,"bios"],["GC/font_western.bin",6478,"bios"],["Gram Kracker.ctg",7587,"bios"],["ITALIC.FNT",2048,"bios"],["JiffyDOS_SX-64.bin",8192,"bios"],["KANJI.ROM",131072,"bios"],["Load/Firmware/rtl_bt/rtl8723a_fw.bin",24548,"bios"],["Load/Firmware/rtl_bt/rtl8723b_fw.bin",45048,"bios"],["Load/Firmware/rtl_bt/rtl8723d_fw.bin",52080,"bios"],["Load/Firmware/rtl_bt/rtl8761a_fw.bin",74488,"bios"],["Load/Firmware/rtl_bt/rtl8761bu_fw.bin",44484,"bios"],["Load/Firmware/rtl_bt/rtl8821a_fw.bin",37420,"bios"],["Load/Firmware/rtl_bt/rtl8821c_fw.bin",54636,"bios"],["Load/Firmware/rtl_bt/rtl8822b_fw.bin",51176,"bios"],["Load/Firmware/rtl_bt/rtl8822cu_fw.bin",38207,"bios"],["Load/Firmware/rtl_bt/rtl8851bu_fw.bin",49760,"bios"],["Load/Firmware/rtl_bt/rtl8852au_fw.bin",67188,"bios"],["Load/Firmware/rtl_bt/rtl8852btu_fw.bin",128140,"bios"],["Load/Firmware/rtl_bt/rtl8852bu_fw.bin",129733,"bios"],["Load/Firmware/rtl_bt/rtl8852cu_fw.bin",113336,"bios"],["Load/Firmware/rtl_bt/rtl8922au_fw.bin",71360,"bios"],["Load/WiiSD.raw",134217728,"bios"],["MSX.ROM",32768,"bios"],["MSX2.ROM",32768,"bios"],["MSX2EXT.ROM",16384,"bios"],["MSX2P.ROM",32768,"bios"],["MSX2PEXT.ROM",16384,"bios"],["MSXDOS2.ROM",65536,"bios"],["Machines/Shared Roms/MSX.rom",32768,"bios"],["MesenNesDB.txt",548608,"game_data"],["MesenPalette.pal",192,"bios"],["NstDatabase.xml",1009534,"bios"],["PAINTER.ROM",65536,"bios"],["PPSSPP/ppge_atlas.zim",666530,"bios"],["ROM_OS_BB01R59",16384,"bios"],["ROM_OS_BB01R59A",16384,"bios"],["ROM_OS_BB02R3V4",16384,"bios"],["ROM_OS_CC01R4",16384,"bios"],["RS232.ROM",16640,"bios"],["SCPH-10000.bin",4194304,"bios"],["SCPH-10000.mec",4,"bios"],["SCPH-30004R.bin",4194304,"bios"],["SCPH-39001.bin",4194304,"bios"],["SCPH-50009_BIOS_V10_CHN_190.BIN",4194304,"bios"],["SCPH-50009_BIOS_V10_CHN_190.nvm",1024,"bios"],["SCPH-50009_BIOS_V10_CHN_190.rom1",524288,"bios"],["SCPH-50009_BIOS_V10_CHN_190.rom2",524288,"bios"],["SCPH-70004.BIN",4194304,"bios"],["SCPH-70004.rom1",524288,"bios"],["SCPH-70004_BIOS_V12_EUR_200.rom2",8192,"bios"],["SCPH-70006_BIOS_V12_HK_200.nvm",1024,"bios"],["SCPH-70008_BIOS_V12_RUS_200.BIN",4194304,"bios"],["SCPH-70008_BIOS_V12_RUS_200.nvm",1024,"bios"],["SCPH-75008_BIOS_V14_RUS_220.nvm",1024,"bios"],["SCPH-77008_BIOS_V15_RUS_220.nvm",1024,"bios"],["SCPH-90006_BIOS_VX_HK _230.nvm",1024,"bios"],["SCPH-90006_BIOS_VX_HK _230.rom1",524288,"bios"],["SCPH1001.BIN",524288,"bios"],["SCPH30004R.nvm",1024,"bios"],["SGB1.sfc",262144,"bios"],["SGB2.sfc",524288,"bios"],["SegaCDBIOS9303.bin",131072,"bios"],["SkyEmu/cgb_boot.bin",2304,"bios"],["SkyEmu/dmg_rom.bin",256,"bios"],["SkyEmu/firmware.bin",262144,"bios"],["SkyEmu/gba_bios.bin",16384,"bios"],["SkyEmu/nds7.bin",16384,"bios"],["SkyEmu/nds9.bin",4096,"bios"],["StudyBox.bin",262144,"bios"],["TI-994A.ctg",32292,"bios"],["Wii/clientca.pem",1005,"bios"],["Wii/clientcakey.pem",609,"bios"],["Wii/rootca.pem",897,"bios"],["Wii/shared2/sys/SYSCONF",16384,"bios"],["Wii/title/00000001/00000002/data/setting.txt",256,"bios"],["XEGAME.ROM",8192,"bios"],["[BIOS] Atari Jaguar CD (World).j64",262144,"bios"],["[BIOS] Atari Jaguar Developer CD (World).j64",262144,"bios"],["a1000kbd_de.zip",1331,"bios"],["a1000kbd_dk.zip",1331,"bios"],["a1000kbd_fr.zip",1331,"bios"],["a1000kbd_gb.zip",1331,"bios"],["a1000kbd_it.zip",1331,"bios"],["a1000kbd_se.zip",1331,"bios"],["a1000kbd_us.zip",1331,"bios"],["a1060-bios-2.05.rom",16384,"bios"],["a1060-bios-2.06.rom",16384,"bios"],["a1200kbd_rb.zip",1476,"bios"],["a1cass.zip",509,"bios"],["a2000kbd_ch.zip",1335,"bios"],["a2000kbd_de.zip",1335,"bios"],["a2000kbd_dk.zip",1335,"bios"],["a2000kbd_es.zip",1335,"bios"],["a2000kbd_fr.zip",1335,"bios"],["a2000kbd_g80_de.zip",1151,"bios"],["a2000kbd_g80_dk.zip",1151,"bios"],["a2000kbd_g80_gb.zip",1151,"bios"],["a2000kbd_g80_se.zip",1151,"bios"],["a2000kbd_g80_us.zip",1151,"bios"],["a2000kbd_gb.zip",1335,"bios"],["a2000kbd_it.zip",1335,"bios"],["a2000kbd_no.zip",1335Line truncated
+1 -1
View File
@@ -1 +1 @@
{"arcade":{"fbneo":{"file":"arcade/fbneo.json","gzip_size":115955,"sha256":"88961c9a6be804772baa767f6ee3a9162478c30c60fe55c8363d8fe4fbc909da","size":423362},"flycast":{"file":"arcade/flycast.json","gzip_size":1841,"sha256":"957189a6e993fda08e21c90ffc6ad94aed9ca9e6dd9ed8c7724e29db036791cb","size":5441},"mame":{"file":"arcade/mame.json","gzip_size":154527,"sha256":"b12010301293a218ecfac45706d81a26c3ac0c27eebeca7409bc8f6ce0163e9e","size":604648},"mame0258":{"file":"arcade/mame0258.json","gzip_size":141151,"sha256":"7ecff1979ed2ac123ea3ba4825dde6e2c31906415165fabefc9af93fa48a6de4","size":556059},"mame0278":{"file":"arcade/mame0278.json","gzip_size":148595,"sha256":"7881e3516f451ec83e886aaf41ebac9d60f497e1f954f49749d52890d7955cbf","size":582797},"mame2000":{"file":"arcade/mame2000.json","gzip_size":8624,"sha256":"f0d69b0872ecfc2845eeb7304543e5b17c11db82060b5514c206b6962ed08263","size":23316},"mame2003":{"file":"arcade/mame2003.json","gzip_size":17456,"sha256":"3b44e2a92c80a8f104b7781fcc1c776d025ad2cf4986638efa3ea041baa9a56d","size":48929},"mame2003_plus":{"file":"arcade/mame2003_plus.json","gzip_size":21077,"sha256":"2857283556fa49c20d8160ed113465bf0c2e643ed0b8acd2d38266a78be8e25e","size":62373},"mame2010":{"file":"arcade/mame2010.json","gzip_size":30869,"sha256":"50b1b381b4b07463f69f1f4c512dd1c98a78d4d0e9c3aeaf49b7b1b007b42152","size":96528},"mame2015":{"file":"arcade/mame2015.json","gzip_size":86990,"sha256":"afeb8c32f651421f74c6de057b0c0b837acd14c533b5160bb31f4411e0afffec","size":360117},"mame2016":{"file":"arcade/mame2016.json","gzip_size":101249,"sha256":"1f75147977d9d082a38b8f8e47a02b301f3d6e6db97c9b9282f3e7f27f26ee47","size":406190}},"containers":{"7z":{"description":"Per-file CRCs and sizes sit in the header at the end of the archive, LZMA-compressed by default (kEncodedHeader). One LZMA decode of the header, independent of the archive size, gives them. Python's lzma is an optional module.","re_read":true,"signature":{"bytes_hex":"377abcaf271c","offset":0},"source_ref":"ip7z/7zip@b88c6bc0 DOC/7zFormat.txt:171-189, DOC/7zFormat.txt:318-334, CPP/7zip/Archive/7z/7zHandlerOut.cpp:859"},"cd-sector":{"description":"User data of a CD sector. In a 2048-byte image (.iso) sector N starts at N * 2048. In a raw 2352-byte image it starts at N * 2352 plus 16 for Mode 1 and plus 24 for Mode 2 Form 1 (12 sync bytes, a 4-byte header, and for Mode 2 an 8-byte subheader).","re_read":true,"sector_size":{"iso":2048,"raw":2352},"source_ref":"stenzek/duckstation@526b4a12 src/util/iso_reader.cpp:157-171, src/util/cd_image.h:28-34","user_data_offset":{"mode1":16,"mode2":24}},"chd-v5":{"description":"MAME compressed hunks, big-endian. The header holds sizes, codecs and hashes only, never the system or the region. The overall SHA-1 is what MAME software lists record. Neither SHA-1 equals a Redump track hash: chdman hashes 2448-byte frames (subcode included, zero-filled), pads each track to 4 frames and byte-swaps audio, all tracks in one stream.","fields":{"compressors":{"encoding":"fourcc4","length":16,"offset":16},"header_length":{"encoding":"u32be","length":4,"offset":8,"value":124},"hunk_bytes":{"encoding":"u32be","length":4,"offset":56},"logical_bytes":{"encoding":"u64be","length":8,"offset":32},"map_offset":{"encoding":"u64be","length":8,"offset":40},"metadata_offset":{"encoding":"u64be","length":8,"offset":48},"overall_sha1":{"encoding":"hex","length":20,"offset":84},"parent_sha1":{"encoding":"hex","length":20,"offset":104},"raw_sha1":{"encoding":"hex","length":20,"offset":64},"unit_bytes":{"encoding":"u32be","length":4,"offset":60},"version":{"encoding":"u32be","length":4,"offset":12,"value":5}},"magic":{"bytes":"MComprHD","offset":0},"media_tags":{"CHCD":"cd","CHGD":"gd-rom","CHGT":"gd-rom","CHT2":"cd","CHTR":"cd","DVD ":"dvd","GDDD":"hard-disk"},"metadata_entry":{"description":"16-byte entry header, payload follows. Linked list from metadata_offset.","flags":{"encoding":"u8","length":1,"offset":4},"length":{"encoding":"u24be","length":3,"offset":5},"next":{"encoding":"u64be","length":8,"offset":8},"tag":{"encoding":"ascii","length":4,"offset":0}},"re_read":true,"source_ref":"mamedev/mame@f34f0250 src/lib/util/chd.h:148-162, src/lib/util/chd.cpp:2021-2061, src/lib/util/chd.cpp:2822-2831, src/lib/util/chd.h:212-235, src/lib/util/chd.cpp:1709-1749, src/tools/chdman.cpp:443-445, src/tools/chdman.cpp:2195-2203, src/lib/util/cdrom.cpp:2669-2672, src/emu/romload.cpp:1211"},"gamecube-disc":{"description":"Where disc offset 0 sits inside each container Dolphin opens.","formats":{"ciso":{"disc_header_at":32768,"magic":"CISO"},"gcz":{"disc_header_at":null,"magic_u32le":2970337281,"note":"block 0 is zlib unless bit 63 of its pointer is set"},"iso":{"disc_header_at":0,"magic":null},"rvz":{"disc_header_at":88,"magic":"RVZ\u0001","note":"first 0x80 disc bytes copied into header 2"},"wbfs":{"disc_header_at":null,"magic":"WBFS","note":"disc offset 0 at wlba[0] << wbfs_sector_shift"},"wia":{"disc_header_at":88,"magic":"WIA\u0001","note":Line truncated
{"arcade":{"fbneo":{"file":"arcade/fbneo.json","gzip_size":115955,"sha256":"88961c9a6be804772baa767f6ee3a9162478c30c60fe55c8363d8fe4fbc909da","size":423362},"flycast":{"file":"arcade/flycast.json","gzip_size":1841,"sha256":"957189a6e993fda08e21c90ffc6ad94aed9ca9e6dd9ed8c7724e29db036791cb","size":5441},"mame":{"file":"arcade/mame.json","gzip_size":154527,"sha256":"b12010301293a218ecfac45706d81a26c3ac0c27eebeca7409bc8f6ce0163e9e","size":604648},"mame0258":{"file":"arcade/mame0258.json","gzip_size":141151,"sha256":"7ecff1979ed2ac123ea3ba4825dde6e2c31906415165fabefc9af93fa48a6de4","size":556059},"mame0278":{"file":"arcade/mame0278.json","gzip_size":148595,"sha256":"7881e3516f451ec83e886aaf41ebac9d60f497e1f954f49749d52890d7955cbf","size":582797},"mame2000":{"file":"arcade/mame2000.json","gzip_size":8624,"sha256":"f0d69b0872ecfc2845eeb7304543e5b17c11db82060b5514c206b6962ed08263","size":23316},"mame2003":{"file":"arcade/mame2003.json","gzip_size":17456,"sha256":"3b44e2a92c80a8f104b7781fcc1c776d025ad2cf4986638efa3ea041baa9a56d","size":48929},"mame2003_plus":{"file":"arcade/mame2003_plus.json","gzip_size":21077,"sha256":"2857283556fa49c20d8160ed113465bf0c2e643ed0b8acd2d38266a78be8e25e","size":62373},"mame2010":{"file":"arcade/mame2010.json","gzip_size":30869,"sha256":"50b1b381b4b07463f69f1f4c512dd1c98a78d4d0e9c3aeaf49b7b1b007b42152","size":96528},"mame2015":{"file":"arcade/mame2015.json","gzip_size":86990,"sha256":"afeb8c32f651421f74c6de057b0c0b837acd14c533b5160bb31f4411e0afffec","size":360117},"mame2016":{"file":"arcade/mame2016.json","gzip_size":101249,"sha256":"1f75147977d9d082a38b8f8e47a02b301f3d6e6db97c9b9282f3e7f27f26ee47","size":406190}},"containers":{"7z":{"description":"Per-file CRCs and sizes sit in the header at the end of the archive, LZMA-compressed by default (kEncodedHeader). One LZMA decode of the header, independent of the archive size, gives them. Python's lzma is an optional module.","re_read":true,"signature":{"bytes_hex":"377abcaf271c","offset":0},"source_ref":"ip7z/7zip@b88c6bc0 DOC/7zFormat.txt:171-189, DOC/7zFormat.txt:318-334, CPP/7zip/Archive/7z/7zHandlerOut.cpp:859"},"cd-sector":{"description":"User data of a CD sector. In a 2048-byte image (.iso) sector N starts at N * 2048. In a raw 2352-byte image it starts at N * 2352 plus 16 for Mode 1 and plus 24 for Mode 2 Form 1 (12 sync bytes, a 4-byte header, and for Mode 2 an 8-byte subheader).","re_read":true,"sector_size":{"iso":2048,"raw":2352},"source_ref":"stenzek/duckstation@526b4a12 src/util/iso_reader.cpp:157-171, src/util/cd_image.h:28-34","user_data_offset":{"mode1":16,"mode2":24}},"chd-v5":{"description":"MAME compressed hunks, big-endian. The header holds sizes, codecs and hashes only, never the system or the region. The overall SHA-1 is what MAME software lists record. Neither SHA-1 equals a Redump track hash: chdman hashes 2448-byte frames (subcode included, zero-filled), pads each track to 4 frames and byte-swaps audio, all tracks in one stream.","fields":{"compressors":{"encoding":"fourcc4","length":16,"offset":16},"header_length":{"encoding":"u32be","length":4,"offset":8,"value":124},"hunk_bytes":{"encoding":"u32be","length":4,"offset":56},"logical_bytes":{"encoding":"u64be","length":8,"offset":32},"map_offset":{"encoding":"u64be","length":8,"offset":40},"metadata_offset":{"encoding":"u64be","length":8,"offset":48},"overall_sha1":{"encoding":"hex","length":20,"offset":84},"parent_sha1":{"encoding":"hex","length":20,"offset":104},"raw_sha1":{"encoding":"hex","length":20,"offset":64},"unit_bytes":{"encoding":"u32be","length":4,"offset":60},"version":{"encoding":"u32be","length":4,"offset":12,"value":5}},"magic":{"bytes":"MComprHD","offset":0},"media_tags":{"CHCD":"cd","CHGD":"gd-rom","CHGT":"gd-rom","CHT2":"cd","CHTR":"cd","DVD ":"dvd","GDDD":"hard-disk"},"metadata_entry":{"description":"16-byte entry header, payload follows. Linked list from metadata_offset.","flags":{"encoding":"u8","length":1,"offset":4},"length":{"encoding":"u24be","length":3,"offset":5},"next":{"encoding":"u64be","length":8,"offset":8},"tag":{"encoding":"ascii","length":4,"offset":0}},"re_read":true,"source_ref":"mamedev/mame@f34f0250 src/lib/util/chd.h:148-162, src/lib/util/chd.cpp:2021-2061, src/lib/util/chd.cpp:2822-2831, src/lib/util/chd.h:212-235, src/lib/util/chd.cpp:1709-1749, src/tools/chdman.cpp:443-445, src/tools/chdman.cpp:2195-2203, src/lib/util/cdrom.cpp:2669-2672, src/emu/romload.cpp:1211"},"gamecube-disc":{"description":"Where disc offset 0 sits inside each container Dolphin opens.","formats":{"ciso":{"disc_header_at":32768,"magic":"CISO"},"gcz":{"disc_header_at":null,"magic_u32le":2970337281,"note":"block 0 is zlib unless bit 63 of its pointer is set"},"iso":{"disc_header_at":0,"magic":null},"rvz":{"disc_header_at":88,"magic":"RVZ\u0001","note":"first 0x80 disc bytes copied into header 2"},"wbfs":{"disc_header_at":null,"magic":"WBFS","note":"disc offset 0 at wlba[0] << wbfs_sector_shift"},"wia":{"disc_header_at":88,"magic":"WIA\u0001","note":Line truncated
+25 -40
View File
@@ -6,7 +6,7 @@
"platform": "knulli",
"display_name": "KNULLI",
"version": "20260511",
"generated": "2026-11-06T07:21:27Z",
"generated": "2026-11-06T13:49:27Z",
"base_destination": "bios",
"detect": [
{
@@ -29,10 +29,10 @@
}
],
"standalone_copies": [],
"total_files": 9574,
"total_size": 9693434698,
"pack_files": 13218,
"pack_size": 9796992041,
"total_files": 9573,
"total_size": 9667998582,
"pack_files": 13217,
"pack_size": 9771555925,
"total_omitted": 425,
"omitted_files": [
{
@@ -9434,20 +9434,20 @@
},
{
"dest": "dsi_firmware.bin",
"sha1": "d2a5af338f09c5cbdd5d7628db5b9c075c69b616",
"sha256": "1d7c771de535e6e07182fc9820ac32e76c6f0b5bcefd256a861fdfab144761ec",
"sha1": "3773f52559d5ac4fc6d8aefe35bce58730ae8181",
"sha256": "a52e281c4dfc8f2da61e7a193d0f40e15eff6f6142ba80bf48ffe755624e2017",
"size": 131072,
"repo_path": "bios/Nintendo/Nintendo DSi/dsi_firmware.bin",
"repo_path": "bios/Nintendo/Nintendo DSi/dsifirmware.bin",
"cores": null,
"systems": [
"nintendo-ds"
],
"alternatives": [
{
"sha1": "d2a5af338f09c5cbdd5d7628db5b9c075c69b616",
"sha256": "1d7c771de535e6e07182fc9820ac32e76c6f0b5bcefd256a861fdfab144761ec",
"sha1": "3773f52559d5ac4fc6d8aefe35bce58730ae8181",
"sha256": "a52e281c4dfc8f2da61e7a193d0f40e15eff6f6142ba80bf48ffe755624e2017",
"size": 131072,
"repo_path": "bios/Nintendo/Nintendo DSi/dsi_firmware.bin",
"repo_path": "bios/Nintendo/Nintendo DSi/dsifirmware.bin",
"cores": [
"melonds",
"melonds_ds"
@@ -111760,10 +111760,10 @@
},
{
"dest": "kick13.rom",
"sha1": "90933936cce43ca9bc6bf375662c076b27e3c458",
"sha256": "1d68ba18412501d2a4b307a0a632b94a50b839c2c7c5ff2df6de2c38b99a921f",
"size": 524288,
"repo_path": "bios/Commodore/Amiga/kick13.rom",
"sha1": "891e9a547772fe0c6c19b610baf8bc4ea7fcb785",
"sha256": "ee05862d8102a08436ac4056da7d549db31625c7d47b24dfb7b3c9a5c113ca53",
"size": 262144,
"repo_path": "bios/Commodore/Amiga/Kickstart-v1.3-rev34.5-1987-Commodore-A500-A1000-A2000-CDTV.rom",
"cores": [
"amiberry"
],
@@ -136968,19 +136968,6 @@
"mesen"
]
},
{
"dest": "macintosh/MinivMacBootv2.dsk",
"sha1": "20bb0271d02b1ab3b4cfe7c8d6b599abdbc5324e",
"sha256": "90dceaece71be101bf709ee20691c9e8486969417ffc51e4d1fb3c11e567f796",
"size": 25165824,
"repo_path": "bios/Apple/Macintosh II/MinivMacBootv2.dsk",
"cores": [
"minivmac"
],
"systems": [
"apple-macintosh-ii"
]
},
{
"dest": "64DD_IPL_JP.n64",
"sha1": "bf861922dcb78c316360e3e742f4f70ff63c9bc3",
@@ -141134,10 +141121,10 @@
},
{
"dest": "spectrum.zip",
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbneo"
]
@@ -142551,10 +142538,10 @@
},
{
"dest": "fbneo/spectrum.zip",
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbneo"
]
@@ -157933,8 +157920,7 @@
}
},
"strip_components": 1,
"archive_size": 5083767,
"optional": true
"archive_size": 5083767
},
{
"ref": "fbneo-samples",
@@ -158168,8 +158154,7 @@
}
},
"strip_components": 0,
"archive_size": 53006540,
"optional": true
"archive_size": 53006540
},
{
"ref": "lrps2",
+32 -48
View File
@@ -6,7 +6,7 @@
"platform": "lakka",
"display_name": "Lakka",
"version": "v6.1",
"generated": "2026-11-06T07:21:27Z",
"generated": "2026-11-06T13:49:27Z",
"base_destination": "system",
"detect": [
{
@@ -20,10 +20,10 @@
}
],
"standalone_copies": [],
"total_files": 8331,
"total_size": 7012353677,
"pack_files": 12472,
"pack_size": 7127472497,
"total_files": 8330,
"total_size": 6986921635,
"pack_files": 12471,
"pack_size": 7102040455,
"total_omitted": 37,
"omitted_files": [
{
@@ -2883,10 +2883,10 @@
],
"alternatives": [
{
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbneo"
]
@@ -6335,10 +6335,10 @@
},
{
"dest": "dsi_firmware.bin",
"sha1": "d2a5af338f09c5cbdd5d7628db5b9c075c69b616",
"sha256": "1d7c771de535e6e07182fc9820ac32e76c6f0b5bcefd256a861fdfab144761ec",
"sha1": "3773f52559d5ac4fc6d8aefe35bce58730ae8181",
"sha256": "a52e281c4dfc8f2da61e7a193d0f40e15eff6f6142ba80bf48ffe755624e2017",
"size": 131072,
"repo_path": "bios/Nintendo/Nintendo DSi/dsi_firmware.bin",
"repo_path": "bios/Nintendo/Nintendo DSi/dsifirmware.bin",
"cores": null,
"systems": [
"nintendo-ds",
@@ -6349,10 +6349,10 @@
],
"alternatives": [
{
"sha1": "d2a5af338f09c5cbdd5d7628db5b9c075c69b616",
"sha256": "1d7c771de535e6e07182fc9820ac32e76c6f0b5bcefd256a861fdfab144761ec",
"sha1": "3773f52559d5ac4fc6d8aefe35bce58730ae8181",
"sha256": "a52e281c4dfc8f2da61e7a193d0f40e15eff6f6142ba80bf48ffe755624e2017",
"size": 131072,
"repo_path": "bios/Nintendo/Nintendo DSi/dsi_firmware.bin",
"repo_path": "bios/Nintendo/Nintendo DSi/dsifirmware.bin",
"cores": [
"melonds",
"melonds_ds"
@@ -6425,10 +6425,10 @@
]
},
{
"sha1": "d2b17224e156ee5e55b5d8d9f323b1c9b86dd951",
"sha256": "28a13952901b4065ef3f08c3252b49a00b6525e301b7ddaa3a390b4c7cbef901",
"sha1": "c7c7570bfe51c3c7c5da3b01331b94e7e7cb4f53",
"sha256": "12a03016ba07cfd874fc002df49a2c6eb2414eb7cfa395c2043035ec5e9193e8",
"size": 65536,
"repo_path": "bios/Nintendo/Nintendo DSi/dsi_bios7.bin",
"repo_path": "bios/Nintendo/Nintendo DSi/NDS_Bios7i.bin",
"systems": [
"nintendo-ds"
]
@@ -6481,10 +6481,10 @@
]
},
{
"sha1": "db61fa39ddbc5f5ed71fb19cda47609ef0201723",
"sha256": "664c608bd6ccfe583e87b3b924afa00f8697dc7ca92eeb6d206d68abb03d2e10",
"sha1": "719b9eef33692406d7170ff526069615759c4dfc",
"sha256": "6e9f70b51dc4f26289b597f14e2513620c2af964374a95f4c5a62b5cad199afc",
"size": 65536,
"repo_path": "bios/Nintendo/Nintendo DSi/dsi_bios9.bin",
"repo_path": "bios/Nintendo/Nintendo DSi/NDS_Bios9i.bin",
"systems": [
"nintendo-ds"
]
@@ -84900,10 +84900,10 @@
},
{
"dest": "kick13.rom",
"sha1": "90933936cce43ca9bc6bf375662c076b27e3c458",
"sha256": "1d68ba18412501d2a4b307a0a632b94a50b839c2c7c5ff2df6de2c38b99a921f",
"size": 524288,
"repo_path": "bios/Commodore/Amiga/kick13.rom",
"sha1": "891e9a547772fe0c6c19b610baf8bc4ea7fcb785",
"sha256": "ee05862d8102a08436ac4056da7d549db31625c7d47b24dfb7b3c9a5c113ca53",
"size": 262144,
"repo_path": "bios/Commodore/Amiga/Kickstart-v1.3-rev34.5-1987-Commodore-A500-A1000-A2000-CDTV.rom",
"cores": [
"amiberry"
],
@@ -107907,19 +107907,6 @@
"apple-macintosh-ii"
]
},
{
"dest": "macintosh/MinivMacBootv2.dsk",
"sha1": "20bb0271d02b1ab3b4cfe7c8d6b599abdbc5324e",
"sha256": "90dceaece71be101bf709ee20691c9e8486969417ffc51e4d1fb3c11e567f796",
"size": 25165824,
"repo_path": "bios/Apple/Macintosh II/MinivMacBootv2.dsk",
"cores": [
"minivmac"
],
"systems": [
"apple-macintosh-ii"
]
},
{
"dest": "Mupen64plus/font.ttf",
"sha1": "1d7f6fa0c34e3d50be52c16a0816bebac309fe41",
@@ -113116,10 +113103,10 @@
},
{
"dest": "spectrum.zip",
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbalpha2019"
]
@@ -130677,8 +130664,7 @@
}
},
"strip_components": 1,
"archive_size": 5083767,
"optional": true
"archive_size": 5083767
},
{
"ref": "fbneo-samples",
@@ -130912,8 +130898,7 @@
}
},
"strip_components": 0,
"archive_size": 53006540,
"optional": true
"archive_size": 53006540
},
{
"ref": "freeintv-overlays",
@@ -131286,8 +131271,7 @@
}
},
"strip_components": 1,
"archive_size": 21311170,
"optional": true
"archive_size": 21311170
},
{
"ref": "yaps2-resources",
+23 -27
View File
@@ -6,7 +6,7 @@
"platform": "myminui",
"display_name": "MyMinUI",
"version": "2026-08-09",
"generated": "2026-11-06T07:21:27Z",
"generated": "2026-11-06T13:49:27Z",
"base_destination": "",
"detect": [
{
@@ -18,9 +18,9 @@
],
"standalone_copies": [],
"total_files": 474,
"total_size": 1484127899,
"total_size": 1484111603,
"pack_files": 7420,
"pack_size": 1655778479,
"pack_size": 1655762183,
"total_omitted": 6,
"omitted_files": [
{
@@ -3910,20 +3910,20 @@
},
{
"dest": "Bios/FBN/spectrum.zip",
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbneo"
]
},
{
"dest": "Bios/NG/spectrum.zip",
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbneo"
]
@@ -4570,10 +4570,10 @@
},
{
"dest": "Bios/FBN/fbneo/spectrum.zip",
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbneo"
]
@@ -5170,10 +5170,10 @@
},
{
"dest": "Bios/NG/fbneo/spectrum.zip",
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbneo"
]
@@ -18958,8 +18958,7 @@
}
},
"strip_components": 1,
"archive_size": 5083767,
"optional": true
"archive_size": 5083767
},
{
"ref": "fbneo-cheats",
@@ -32689,8 +32688,7 @@
}
},
"strip_components": 1,
"archive_size": 5083767,
"optional": true
"archive_size": 5083767
},
{
"ref": "fbneo-samples",
@@ -32924,8 +32922,7 @@
}
},
"strip_components": 0,
"archive_size": 53006540,
"optional": true
"archive_size": 53006540
},
{
"ref": "fbneo-samples",
@@ -33159,8 +33156,7 @@
}
},
"strip_components": 0,
"archive_size": 53006540,
"optional": true
"archive_size": 53006540
}
]
}
+13 -15
View File
@@ -6,7 +6,7 @@
"platform": "nextui",
"display_name": "NextUI",
"version": "2026-10-20",
"generated": "2026-11-06T07:21:27Z",
"generated": "2026-11-06T13:49:27Z",
"base_destination": "",
"detect": [
{
@@ -18,9 +18,9 @@
],
"standalone_copies": [],
"total_files": 402,
"total_size": 708038193,
"total_size": 708030045,
"pack_files": 4094,
"pack_size": 794465422,
"pack_size": 794457274,
"total_omitted": 4,
"omitted_files": [
{
@@ -4085,10 +4085,10 @@
},
{
"dest": "Bios/FBN/spectrum.zip",
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbneo"
]
@@ -4685,10 +4685,10 @@
},
{
"dest": "Bios/FBN/fbneo/spectrum.zip",
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbneo"
]
@@ -19366,8 +19366,7 @@
}
},
"strip_components": 1,
"archive_size": 5083767,
"optional": true
"archive_size": 5083767
},
{
"ref": "fbneo-samples",
@@ -19601,8 +19600,7 @@
}
},
"strip_components": 0,
"archive_size": 53006540,
"optional": true
"archive_size": 53006540
}
]
}
+20 -33
View File
@@ -6,7 +6,7 @@
"platform": "recalbox",
"display_name": "Recalbox",
"version": "10.1.1",
"generated": "2026-11-06T07:21:27Z",
"generated": "2026-11-06T13:49:27Z",
"base_destination": "bios",
"detect": [
{
@@ -280,9 +280,9 @@
}
],
"total_files": 3719,
"total_size": 4640853737,
"total_size": 4640583445,
"pack_files": 7193,
"pack_size": 4726679027,
"pack_size": 4726408735,
"total_omitted": 62,
"omitted_files": [
{
@@ -3474,17 +3474,6 @@
"cores": null,
"systems": [
"macintosh"
],
"alternatives": [
{
"sha1": "20bb0271d02b1ab3b4cfe7c8d6b599abdbc5324e",
"sha256": "90dceaece71be101bf709ee20691c9e8486969417ffc51e4d1fb3c11e567f796",
"size": 25165824,
"repo_path": "bios/Apple/Macintosh II/MinivMacBootv2.dsk",
"cores": [
"minivmac"
]
}
]
},
{
@@ -38536,10 +38525,10 @@
},
{
"dest": "kick13.rom",
"sha1": "90933936cce43ca9bc6bf375662c076b27e3c458",
"sha256": "1d68ba18412501d2a4b307a0a632b94a50b839c2c7c5ff2df6de2c38b99a921f",
"size": 524288,
"repo_path": "bios/Commodore/Amiga/kick13.rom",
"sha1": "891e9a547772fe0c6c19b610baf8bc4ea7fcb785",
"sha256": "ee05862d8102a08436ac4056da7d549db31625c7d47b24dfb7b3c9a5c113ca53",
"size": 262144,
"repo_path": "bios/Commodore/Amiga/Kickstart-v1.3-rev34.5-1987-Commodore-A500-A1000-A2000-CDTV.rom",
"cores": [
"amiberry"
],
@@ -42727,10 +42716,10 @@
},
{
"dest": "dsi_firmware.bin",
"sha1": "d2a5af338f09c5cbdd5d7628db5b9c075c69b616",
"sha256": "1d7c771de535e6e07182fc9820ac32e76c6f0b5bcefd256a861fdfab144761ec",
"sha1": "3773f52559d5ac4fc6d8aefe35bce58730ae8181",
"sha256": "a52e281c4dfc8f2da61e7a193d0f40e15eff6f6142ba80bf48ffe755624e2017",
"size": 131072,
"repo_path": "bios/Nintendo/Nintendo DSi/dsi_firmware.bin",
"repo_path": "bios/Nintendo/Nintendo DSi/dsifirmware.bin",
"cores": [
"melonds"
]
@@ -44683,10 +44672,10 @@
},
{
"dest": "spectrum.zip",
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbneo"
]
@@ -47545,10 +47534,10 @@
},
{
"dest": "fbneo/spectrum.zip",
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbneo"
]
@@ -62834,8 +62823,7 @@
}
},
"strip_components": 1,
"archive_size": 5083767,
"optional": true
"archive_size": 5083767
},
{
"ref": "fbneo-samples",
@@ -63069,8 +63057,7 @@
}
},
"strip_components": 0,
"archive_size": 53006540,
"optional": true
"archive_size": 53006540
}
],
"save_directory": {
+32 -48
View File
@@ -6,7 +6,7 @@
"platform": "retroarch",
"display_name": "RetroArch",
"version": "v1.22.2",
"generated": "2026-11-06T07:21:27Z",
"generated": "2026-11-06T13:49:27Z",
"base_destination": "system",
"detect": [
{
@@ -643,10 +643,10 @@
}
}
],
"total_files": 8339,
"total_size": 7105536529,
"pack_files": 14922,
"pack_size": 7247569893,
"total_files": 8338,
"total_size": 7080104487,
"pack_files": 14921,
"pack_size": 7222137851,
"total_omitted": 37,
"omitted_files": [
{
@@ -3515,10 +3515,10 @@
],
"alternatives": [
{
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbneo"
]
@@ -6780,10 +6780,10 @@
},
{
"dest": "dsi_firmware.bin",
"sha1": "d2a5af338f09c5cbdd5d7628db5b9c075c69b616",
"sha256": "1d7c771de535e6e07182fc9820ac32e76c6f0b5bcefd256a861fdfab144761ec",
"sha1": "3773f52559d5ac4fc6d8aefe35bce58730ae8181",
"sha256": "a52e281c4dfc8f2da61e7a193d0f40e15eff6f6142ba80bf48ffe755624e2017",
"size": 131072,
"repo_path": "bios/Nintendo/Nintendo DSi/dsi_firmware.bin",
"repo_path": "bios/Nintendo/Nintendo DSi/dsifirmware.bin",
"cores": null,
"systems": [
"nintendo-ds",
@@ -6794,10 +6794,10 @@
],
"alternatives": [
{
"sha1": "d2a5af338f09c5cbdd5d7628db5b9c075c69b616",
"sha256": "1d7c771de535e6e07182fc9820ac32e76c6f0b5bcefd256a861fdfab144761ec",
"sha1": "3773f52559d5ac4fc6d8aefe35bce58730ae8181",
"sha256": "a52e281c4dfc8f2da61e7a193d0f40e15eff6f6142ba80bf48ffe755624e2017",
"size": 131072,
"repo_path": "bios/Nintendo/Nintendo DSi/dsi_firmware.bin",
"repo_path": "bios/Nintendo/Nintendo DSi/dsifirmware.bin",
"cores": [
"melonds",
"melonds_ds"
@@ -6870,10 +6870,10 @@
]
},
{
"sha1": "d2b17224e156ee5e55b5d8d9f323b1c9b86dd951",
"sha256": "28a13952901b4065ef3f08c3252b49a00b6525e301b7ddaa3a390b4c7cbef901",
"sha1": "c7c7570bfe51c3c7c5da3b01331b94e7e7cb4f53",
"sha256": "12a03016ba07cfd874fc002df49a2c6eb2414eb7cfa395c2043035ec5e9193e8",
"size": 65536,
"repo_path": "bios/Nintendo/Nintendo DSi/dsi_bios7.bin",
"repo_path": "bios/Nintendo/Nintendo DSi/NDS_Bios7i.bin",
"systems": [
"nintendo-ds"
]
@@ -6926,10 +6926,10 @@
]
},
{
"sha1": "db61fa39ddbc5f5ed71fb19cda47609ef0201723",
"sha256": "664c608bd6ccfe583e87b3b924afa00f8697dc7ca92eeb6d206d68abb03d2e10",
"sha1": "719b9eef33692406d7170ff526069615759c4dfc",
"sha256": "6e9f70b51dc4f26289b597f14e2513620c2af964374a95f4c5a62b5cad199afc",
"size": 65536,
"repo_path": "bios/Nintendo/Nintendo DSi/dsi_bios9.bin",
"repo_path": "bios/Nintendo/Nintendo DSi/NDS_Bios9i.bin",
"systems": [
"nintendo-ds"
]
@@ -85825,10 +85825,10 @@
},
{
"dest": "kick13.rom",
"sha1": "90933936cce43ca9bc6bf375662c076b27e3c458",
"sha256": "1d68ba18412501d2a4b307a0a632b94a50b839c2c7c5ff2df6de2c38b99a921f",
"size": 524288,
"repo_path": "bios/Commodore/Amiga/kick13.rom",
"sha1": "891e9a547772fe0c6c19b610baf8bc4ea7fcb785",
"sha256": "ee05862d8102a08436ac4056da7d549db31625c7d47b24dfb7b3c9a5c113ca53",
"size": 262144,
"repo_path": "bios/Commodore/Amiga/Kickstart-v1.3-rev34.5-1987-Commodore-A500-A1000-A2000-CDTV.rom",
"cores": [
"amiberry"
],
@@ -108877,19 +108877,6 @@
"apple-macintosh-ii"
]
},
{
"dest": "macintosh/MinivMacBootv2.dsk",
"sha1": "20bb0271d02b1ab3b4cfe7c8d6b599abdbc5324e",
"sha256": "90dceaece71be101bf709ee20691c9e8486969417ffc51e4d1fb3c11e567f796",
"size": 25165824,
"repo_path": "bios/Apple/Macintosh II/MinivMacBootv2.dsk",
"cores": [
"minivmac"
],
"systems": [
"apple-macintosh-ii"
]
},
{
"dest": "Mupen64plus/font.ttf",
"sha1": "1d7f6fa0c34e3d50be52c16a0816bebac309fe41",
@@ -114171,10 +114158,10 @@
},
{
"dest": "spectrum.zip",
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbalpha2019"
]
@@ -140789,8 +140776,7 @@
}
},
"strip_components": 1,
"archive_size": 5083767,
"optional": true
"archive_size": 5083767
},
{
"ref": "fbneo-samples",
@@ -141024,8 +141010,7 @@
}
},
"strip_components": 0,
"archive_size": 53006540,
"optional": true
"archive_size": 53006540
},
{
"ref": "freeintv-overlays",
@@ -141398,8 +141383,7 @@
}
},
"strip_components": 1,
"archive_size": 21311170,
"optional": true
"archive_size": 21311170
},
{
"ref": "ppsspp-assets",
+24 -73
View File
@@ -6,7 +6,7 @@
"platform": "retrobat",
"display_name": "RetroBat",
"version": "8.3.1",
"generated": "2026-11-06T07:21:27Z",
"generated": "2026-11-06T13:49:27Z",
"base_destination": "bios",
"detect": [
{
@@ -285,9 +285,9 @@
}
],
"total_files": 5540,
"total_size": 8524998789,
"total_size": 8524728497,
"pack_files": 9104,
"pack_size": 8632115024,
"pack_size": 8631844732,
"total_omitted": 203,
"omitted_files": [
{
@@ -8612,29 +8612,6 @@
"systems": [
"nintendo-ds"
],
"slot_choices": [
{
"sha1": "719b9eef33692406d7170ff526069615759c4dfc",
"sha256": "6e9f70b51dc4f26289b597f14e2513620c2af964374a95f4c5a62b5cad199afc",
"size": 65536,
"repo_path": "bios/Nintendo/Nintendo DSi/NDS_Bios9i.bin",
"cores": [
"melonds",
"melonds_ds"
]
}
],
"declared_choices": [
{
"sha1": "db61fa39ddbc5f5ed71fb19cda47609ef0201723",
"sha256": "664c608bd6ccfe583e87b3b924afa00f8697dc7ca92eeb6d206d68abb03d2e10",
"size": 65536,
"repo_path": "bios/Nintendo/Nintendo DSi/dsi_bios9.bin",
"systems": [
"nintendo-ds"
]
}
],
"alternatives": [
{
"sha1": "719b9eef33692406d7170ff526069615759c4dfc",
@@ -8658,29 +8635,6 @@
"systems": [
"nintendo-ds"
],
"slot_choices": [
{
"sha1": "c7c7570bfe51c3c7c5da3b01331b94e7e7cb4f53",
"sha256": "12a03016ba07cfd874fc002df49a2c6eb2414eb7cfa395c2043035ec5e9193e8",
"size": 65536,
"repo_path": "bios/Nintendo/Nintendo DSi/NDS_Bios7i.bin",
"cores": [
"melonds",
"melonds_ds"
]
}
],
"declared_choices": [
{
"sha1": "d2b17224e156ee5e55b5d8d9f323b1c9b86dd951",
"sha256": "28a13952901b4065ef3f08c3252b49a00b6525e301b7ddaa3a390b4c7cbef901",
"size": 65536,
"repo_path": "bios/Nintendo/Nintendo DSi/dsi_bios7.bin",
"systems": [
"nintendo-ds"
]
}
],
"alternatives": [
{
"sha1": "c7c7570bfe51c3c7c5da3b01331b94e7e7cb4f53",
@@ -8696,20 +8650,20 @@
},
{
"dest": "dsi_firmware.bin",
"sha1": "d2a5af338f09c5cbdd5d7628db5b9c075c69b616",
"sha256": "1d7c771de535e6e07182fc9820ac32e76c6f0b5bcefd256a861fdfab144761ec",
"sha1": "3773f52559d5ac4fc6d8aefe35bce58730ae8181",
"sha256": "a52e281c4dfc8f2da61e7a193d0f40e15eff6f6142ba80bf48ffe755624e2017",
"size": 131072,
"repo_path": "bios/Nintendo/Nintendo DSi/dsi_firmware.bin",
"repo_path": "bios/Nintendo/Nintendo DSi/dsifirmware.bin",
"cores": null,
"systems": [
"nintendo-ds"
],
"alternatives": [
{
"sha1": "d2a5af338f09c5cbdd5d7628db5b9c075c69b616",
"sha256": "1d7c771de535e6e07182fc9820ac32e76c6f0b5bcefd256a861fdfab144761ec",
"sha1": "3773f52559d5ac4fc6d8aefe35bce58730ae8181",
"sha256": "a52e281c4dfc8f2da61e7a193d0f40e15eff6f6142ba80bf48ffe755624e2017",
"size": 131072,
"repo_path": "bios/Nintendo/Nintendo DSi/dsi_firmware.bin",
"repo_path": "bios/Nintendo/Nintendo DSi/dsifirmware.bin",
"cores": [
"melonds",
"melonds_ds"
@@ -45198,10 +45152,10 @@
},
{
"dest": "kick13.rom",
"sha1": "90933936cce43ca9bc6bf375662c076b27e3c458",
"sha256": "1d68ba18412501d2a4b307a0a632b94a50b839c2c7c5ff2df6de2c38b99a921f",
"size": 524288,
"repo_path": "bios/Commodore/Amiga/kick13.rom",
"sha1": "891e9a547772fe0c6c19b610baf8bc4ea7fcb785",
"sha256": "ee05862d8102a08436ac4056da7d549db31625c7d47b24dfb7b3c9a5c113ca53",
"size": 262144,
"repo_path": "bios/Commodore/Amiga/Kickstart-v1.3-rev34.5-1987-Commodore-A500-A1000-A2000-CDTV.rom",
"cores": [
"amiberry"
],
@@ -72720,10 +72674,10 @@
},
{
"dest": "spectrum.zip",
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbneo"
]
@@ -73748,10 +73702,10 @@
},
{
"dest": "fbneo/spectrum.zip",
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbneo"
]
@@ -89076,8 +89030,7 @@
}
},
"strip_components": 1,
"archive_size": 5083767,
"optional": true
"archive_size": 5083767
},
{
"ref": "fbneo-samples",
@@ -89311,8 +89264,7 @@
}
},
"strip_components": 0,
"archive_size": 53006540,
"optional": true
"archive_size": 53006540
},
{
"ref": "freeintv-overlays",
@@ -89685,8 +89637,7 @@
}
},
"strip_components": 1,
"archive_size": 21311170,
"optional": true
"archive_size": 21311170
}
],
"save_directory": {
+27 -43
View File
@@ -6,7 +6,7 @@
"platform": "retrodeck",
"display_name": "RetroDECK",
"version": "0.10.10b",
"generated": "2026-11-06T07:21:27Z",
"generated": "2026-11-06T13:49:27Z",
"base_destination": "",
"detect": [
{
@@ -292,10 +292,10 @@
"source": "bios/dc/dc_nvmem.bin"
}
],
"total_files": 8870,
"total_size": 8948288224,
"pack_files": 12783,
"pack_size": 9064975510,
"total_files": 8869,
"total_size": 8922852108,
"pack_files": 12782,
"pack_size": 9039539394,
"total_omitted": 66,
"omitted_files": [
{
@@ -35173,20 +35173,20 @@
},
{
"dest": "bios/spectrum.zip",
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": null,
"systems": [
"arcade"
],
"alternatives": [
{
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbalpha2019"
]
@@ -121078,10 +121078,10 @@
},
{
"dest": "bios/kick13.rom",
"sha1": "90933936cce43ca9bc6bf375662c076b27e3c458",
"sha256": "1d68ba18412501d2a4b307a0a632b94a50b839c2c7c5ff2df6de2c38b99a921f",
"size": 524288,
"repo_path": "bios/Commodore/Amiga/kick13.rom",
"sha1": "891e9a547772fe0c6c19b610baf8bc4ea7fcb785",
"sha256": "ee05862d8102a08436ac4056da7d549db31625c7d47b24dfb7b3c9a5c113ca53",
"size": 262144,
"repo_path": "bios/Commodore/Amiga/Kickstart-v1.3-rev34.5-1987-Commodore-A500-A1000-A2000-CDTV.rom",
"cores": [
"amiberry"
],
@@ -128674,10 +128674,10 @@
},
{
"dest": "bios/dsi_firmware.bin",
"sha1": "d2a5af338f09c5cbdd5d7628db5b9c075c69b616",
"sha256": "1d7c771de535e6e07182fc9820ac32e76c6f0b5bcefd256a861fdfab144761ec",
"sha1": "3773f52559d5ac4fc6d8aefe35bce58730ae8181",
"sha256": "a52e281c4dfc8f2da61e7a193d0f40e15eff6f6142ba80bf48ffe755624e2017",
"size": 131072,
"repo_path": "bios/Nintendo/Nintendo DSi/dsi_firmware.bin",
"repo_path": "bios/Nintendo/Nintendo DSi/dsifirmware.bin",
"cores": [
"melonds",
"melonds_ds"
@@ -128768,19 +128768,6 @@
"apple-macintosh-ii"
]
},
{
"dest": "bios/macintosh/MinivMacBootv2.dsk",
"sha1": "20bb0271d02b1ab3b4cfe7c8d6b599abdbc5324e",
"sha256": "90dceaece71be101bf709ee20691c9e8486969417ffc51e4d1fb3c11e567f796",
"size": 25165824,
"repo_path": "bios/Apple/Macintosh II/MinivMacBootv2.dsk",
"cores": [
"minivmac"
],
"systems": [
"apple-macintosh-ii"
]
},
{
"dest": "bios/palmos41-en-m515.rom",
"sha1": "cc4898ee8cae4669fc19e184c5b560c770e731b3",
@@ -135975,10 +135962,10 @@
},
{
"dest": "bios/fbneo/spectrum.zip",
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbneo"
]
@@ -153141,8 +153128,7 @@
}
},
"strip_components": 1,
"archive_size": 5083767,
"optional": true
"archive_size": 5083767
},
{
"ref": "fbneo-samples",
@@ -153376,8 +153362,7 @@
}
},
"strip_components": 0,
"archive_size": 53006540,
"optional": true
"archive_size": 53006540
},
{
"ref": "freeintv-overlays",
@@ -153750,8 +153735,7 @@
}
},
"strip_components": 1,
"archive_size": 21311170,
"optional": true
"archive_size": 21311170
},
{
"ref": "yaps2-resources",
+34 -60
View File
@@ -6,7 +6,7 @@
"platform": "retropie",
"display_name": "RetroPie",
"version": "4.8.12",
"generated": "2026-11-06T07:21:27Z",
"generated": "2026-11-06T13:49:27Z",
"base_destination": "BIOS",
"detect": [
{
@@ -16,10 +16,10 @@
}
],
"standalone_copies": [],
"total_files": 8684,
"total_size": 8721213852,
"pack_files": 14760,
"pack_size": 8839596934,
"total_files": 8683,
"total_size": 8695781810,
"pack_files": 14759,
"pack_size": 8814164892,
"total_omitted": 347,
"omitted_files": [
{
@@ -6391,10 +6391,10 @@
],
"alternatives": [
{
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbneo"
]
@@ -9835,10 +9835,10 @@
},
{
"dest": "dsi_firmware.bin",
"sha1": "d2a5af338f09c5cbdd5d7628db5b9c075c69b616",
"sha256": "1d7c771de535e6e07182fc9820ac32e76c6f0b5bcefd256a861fdfab144761ec",
"sha1": "3773f52559d5ac4fc6d8aefe35bce58730ae8181",
"sha256": "a52e281c4dfc8f2da61e7a193d0f40e15eff6f6142ba80bf48ffe755624e2017",
"size": 131072,
"repo_path": "bios/Nintendo/Nintendo DSi/dsi_firmware.bin",
"repo_path": "bios/Nintendo/Nintendo DSi/dsifirmware.bin",
"cores": null,
"systems": [
"nintendo-ds",
@@ -9849,10 +9849,10 @@
],
"alternatives": [
{
"sha1": "d2a5af338f09c5cbdd5d7628db5b9c075c69b616",
"sha256": "1d7c771de535e6e07182fc9820ac32e76c6f0b5bcefd256a861fdfab144761ec",
"sha1": "3773f52559d5ac4fc6d8aefe35bce58730ae8181",
"sha256": "a52e281c4dfc8f2da61e7a193d0f40e15eff6f6142ba80bf48ffe755624e2017",
"size": 131072,
"repo_path": "bios/Nintendo/Nintendo DSi/dsi_firmware.bin",
"repo_path": "bios/Nintendo/Nintendo DSi/dsifirmware.bin",
"cores": [
"melonds",
"melonds_ds"
@@ -9925,10 +9925,10 @@
]
},
{
"sha1": "d2b17224e156ee5e55b5d8d9f323b1c9b86dd951",
"sha256": "28a13952901b4065ef3f08c3252b49a00b6525e301b7ddaa3a390b4c7cbef901",
"sha1": "c7c7570bfe51c3c7c5da3b01331b94e7e7cb4f53",
"sha256": "12a03016ba07cfd874fc002df49a2c6eb2414eb7cfa395c2043035ec5e9193e8",
"size": 65536,
"repo_path": "bios/Nintendo/Nintendo DSi/dsi_bios7.bin",
"repo_path": "bios/Nintendo/Nintendo DSi/NDS_Bios7i.bin",
"systems": [
"nintendo-ds"
]
@@ -9981,10 +9981,10 @@
]
},
{
"sha1": "db61fa39ddbc5f5ed71fb19cda47609ef0201723",
"sha256": "664c608bd6ccfe583e87b3b924afa00f8697dc7ca92eeb6d206d68abb03d2e10",
"sha1": "719b9eef33692406d7170ff526069615759c4dfc",
"sha256": "6e9f70b51dc4f26289b597f14e2513620c2af964374a95f4c5a62b5cad199afc",
"size": 65536,
"repo_path": "bios/Nintendo/Nintendo DSi/dsi_bios9.bin",
"repo_path": "bios/Nintendo/Nintendo DSi/NDS_Bios9i.bin",
"systems": [
"nintendo-ds"
]
@@ -17029,21 +17029,11 @@
"size": 262144,
"repo_path": "bios/Commodore/Amiga/Kickstart-v1.3-rev34.5-1987-Commodore-A500-A1000-A2000-CDTV.rom",
"cores": [
"fs-uae"
"fs-uae",
"amiberry"
],
"systems": [
"commodore-amiga"
],
"alternatives": [
{
"sha1": "90933936cce43ca9bc6bf375662c076b27e3c458",
"sha256": "1d68ba18412501d2a4b307a0a632b94a50b839c2c7c5ff2df6de2c38b99a921f",
"size": 524288,
"repo_path": "bios/Commodore/Amiga/kick13.rom",
"cores": [
"amiberry"
]
}
]
},
{
@@ -113681,19 +113671,6 @@
"apple-macintosh-ii"
]
},
{
"dest": "macintosh/MinivMacBootv2.dsk",
"sha1": "20bb0271d02b1ab3b4cfe7c8d6b599abdbc5324e",
"sha256": "90dceaece71be101bf709ee20691c9e8486969417ffc51e4d1fb3c11e567f796",
"size": 25165824,
"repo_path": "bios/Apple/Macintosh II/MinivMacBootv2.dsk",
"cores": [
"minivmac"
],
"systems": [
"apple-macintosh-ii"
]
},
{
"dest": "vMac.ROM",
"sha1": "32daf772960c7ed31f41b95055968532b81d0896",
@@ -117642,10 +117619,10 @@
},
{
"dest": "amiga/kick13.rom",
"sha1": "90933936cce43ca9bc6bf375662c076b27e3c458",
"sha256": "1d68ba18412501d2a4b307a0a632b94a50b839c2c7c5ff2df6de2c38b99a921f",
"size": 524288,
"repo_path": "bios/Commodore/Amiga/kick13.rom",
"sha1": "891e9a547772fe0c6c19b610baf8bc4ea7fcb785",
"sha256": "ee05862d8102a08436ac4056da7d549db31625c7d47b24dfb7b3c9a5c113ca53",
"size": 262144,
"repo_path": "bios/Commodore/Amiga/Kickstart-v1.3-rev34.5-1987-Commodore-A500-A1000-A2000-CDTV.rom",
"cores": [
"uae4all"
],
@@ -119381,10 +119358,10 @@
},
{
"dest": "spectrum.zip",
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbalpha2019"
]
@@ -146474,8 +146451,7 @@
}
},
"strip_components": 1,
"archive_size": 5083767,
"optional": true
"archive_size": 5083767
},
{
"ref": "fbneo-samples",
@@ -146709,8 +146685,7 @@
}
},
"strip_components": 0,
"archive_size": 53006540,
"optional": true
"archive_size": 53006540
},
{
"ref": "freeintv-overlays",
@@ -147083,8 +147058,7 @@
}
},
"strip_components": 1,
"archive_size": 21311170,
"optional": true
"archive_size": 21311170
},
{
"ref": "yaps2-resources",
+25 -54
View File
@@ -6,7 +6,7 @@
"platform": "rocknix",
"display_name": "ROCKNIX",
"version": "20261001",
"generated": "2026-11-06T07:21:27Z",
"generated": "2026-11-06T13:49:27Z",
"base_destination": "bios",
"detect": [
{
@@ -21,10 +21,10 @@
}
],
"standalone_copies": [],
"total_files": 7328,
"total_size": 8216898220,
"pack_files": 13677,
"pack_size": 8360738317,
"total_files": 7327,
"total_size": 8191462104,
"pack_files": 13676,
"pack_size": 8335302201,
"total_omitted": 115,
"omitted_files": [
{
@@ -2122,21 +2122,13 @@
"nintendo-ds"
],
"alternatives": [
{
"sha1": "d2b17224e156ee5e55b5d8d9f323b1c9b86dd951",
"sha256": "28a13952901b4065ef3f08c3252b49a00b6525e301b7ddaa3a390b4c7cbef901",
"size": 65536,
"repo_path": "bios/Nintendo/Nintendo DSi/dsi_bios7.bin",
"cores": [
"dsperate"
]
},
{
"sha1": "c7c7570bfe51c3c7c5da3b01331b94e7e7cb4f53",
"sha256": "12a03016ba07cfd874fc002df49a2c6eb2414eb7cfa395c2043035ec5e9193e8",
"size": 65536,
"repo_path": "bios/Nintendo/Nintendo DSi/NDS_Bios7i.bin",
"cores": [
"dsperate",
"melonds",
"melonds_ds"
]
@@ -2154,21 +2146,13 @@
"nintendo-ds"
],
"alternatives": [
{
"sha1": "db61fa39ddbc5f5ed71fb19cda47609ef0201723",
"sha256": "664c608bd6ccfe583e87b3b924afa00f8697dc7ca92eeb6d206d68abb03d2e10",
"size": 65536,
"repo_path": "bios/Nintendo/Nintendo DSi/dsi_bios9.bin",
"cores": [
"dsperate"
]
},
{
"sha1": "719b9eef33692406d7170ff526069615759c4dfc",
"sha256": "6e9f70b51dc4f26289b597f14e2513620c2af964374a95f4c5a62b5cad199afc",
"size": 65536,
"repo_path": "bios/Nintendo/Nintendo DSi/NDS_Bios9i.bin",
"cores": [
"dsperate",
"melonds",
"melonds_ds"
]
@@ -2187,10 +2171,10 @@
],
"alternatives": [
{
"sha1": "d2a5af338f09c5cbdd5d7628db5b9c075c69b616",
"sha256": "1d7c771de535e6e07182fc9820ac32e76c6f0b5bcefd256a861fdfab144761ec",
"sha1": "3773f52559d5ac4fc6d8aefe35bce58730ae8181",
"sha256": "a52e281c4dfc8f2da61e7a193d0f40e15eff6f6142ba80bf48ffe755624e2017",
"size": 131072,
"repo_path": "bios/Nintendo/Nintendo DSi/dsi_firmware.bin",
"repo_path": "bios/Nintendo/Nintendo DSi/dsifirmware.bin",
"cores": [
"dsperate",
"melonds",
@@ -55104,10 +55088,10 @@
},
{
"dest": "kick13.rom",
"sha1": "90933936cce43ca9bc6bf375662c076b27e3c458",
"sha256": "1d68ba18412501d2a4b307a0a632b94a50b839c2c7c5ff2df6de2c38b99a921f",
"size": 524288,
"repo_path": "bios/Commodore/Amiga/kick13.rom",
"sha1": "891e9a547772fe0c6c19b610baf8bc4ea7fcb785",
"sha256": "ee05862d8102a08436ac4056da7d549db31625c7d47b24dfb7b3c9a5c113ca53",
"size": 262144,
"repo_path": "bios/Commodore/Amiga/Kickstart-v1.3-rev34.5-1987-Commodore-A500-A1000-A2000-CDTV.rom",
"cores": [
"amiberry"
]
@@ -57966,10 +57950,10 @@
},
{
"dest": "spectrum.zip",
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbneo",
"fbalpha2019"
@@ -76026,16 +76010,6 @@
"minivmac"
]
},
{
"dest": "macintosh/MinivMacBootv2.dsk",
"sha1": "20bb0271d02b1ab3b4cfe7c8d6b599abdbc5324e",
"sha256": "90dceaece71be101bf709ee20691c9e8486969417ffc51e4d1fb3c11e567f796",
"size": 25165824,
"repo_path": "bios/Apple/Macintosh II/MinivMacBootv2.dsk",
"cores": [
"minivmac"
]
},
{
"dest": "palmos41-en-m515.rom",
"sha1": "cc4898ee8cae4669fc19e184c5b560c770e731b3",
@@ -82669,10 +82643,10 @@
},
{
"dest": "fbneo/spectrum.zip",
"sha1": "e5403cb209cf0df473bf1251cade7e70f94644fb",
"sha256": "4fd9bd458e6082144dd9120db6884a1b32de7810674b46632f6ccbec5f5b71a3",
"size": 16506,
"repo_path": "bios/Arcade/Arcade/spectrum.zip",
"sha1": "9428d8b7c6d4db78f00a58915dccdf33f3b5d98b",
"sha256": "5be93f9bc5a16d2fac29da18e9021ee3c86c0acab57022dbe6c0722ce8d18eac",
"size": 12432,
"repo_path": "bios/Arcade/Arcade/spec48k.zip",
"cores": [
"fbneo"
]
@@ -109453,8 +109427,7 @@
}
},
"strip_components": 1,
"archive_size": 5083767,
"optional": true
"archive_size": 5083767
},
{
"ref": "fbneo-samples",
@@ -109688,8 +109661,7 @@
}
},
"strip_components": 0,
"archive_size": 53006540,
"optional": true
"archive_size": 53006540
},
{
"ref": "freeintv-overlays",
@@ -110062,8 +110034,7 @@
}
},
"strip_components": 1,
"archive_size": 21311170,
"optional": true
"archive_size": 21311170
},
{
"ref": "lrps2",
+2 -12
View File
@@ -6,7 +6,7 @@
"platform": "romm",
"display_name": "RomM",
"version": "5.4.0",
"generated": "2026-11-05T18:33:47Z",
"generated": "2026-11-06T13:49:27Z",
"base_destination": "bios",
"detect": [
{
@@ -26,7 +26,7 @@
"total_size": 872654387,
"pack_files": 467,
"pack_size": 872654387,
"total_omitted": 777,
"total_omitted": 776,
"omitted_files": [
{
"dest": "32X_G_BIOS.BIN",
@@ -3016,16 +3016,6 @@
"mame2003"
]
},
{
"dest": "macintosh/MinivMacBootv2.dsk",
"name": "MinivMacBootv2.dsk",
"system": "",
"required": false,
"reason": "below_platform_folder",
"cores": [
"minivmac"
]
},
{
"dest": "mame2003-plus/artwork/blueshrk.zip",
"name": "blueshrk.zip",
+3 -1
View File
@@ -1011,7 +1011,9 @@ platforms:
# EmuHawk finds firmware by SHA1 against FirmwareDatabase.FirmwareRecords
# and its cores are its own builds (CoreNames.cs): no libretro profile
# describes what it reads, so the database alone decides, as MiSTer's
# BiosDB does.
# BiosDB does. emulators/bizhawk.yml also documents the options the scan
# never takes, so it is not listed here, and --region, --one-per-slot
# and --no-game-data are refused for this platform.
cores: []
target_scraper: null
target_source: null
+3
View File
@@ -117,6 +117,9 @@
},
"by_shadowed_alias": {
"$ref": "#/$defs/listIndex"
},
"by_proven_name": {
"$ref": "#/$defs/listIndex"
}
}
}
+2 -2
View File
@@ -25,8 +25,8 @@ def accepts(entry: dict, path: Path, mode: str) -> bool:
member = names.get(entry["zipped_file"].casefold())
return bool(member) and hashlib.new(digest, archive.read(member)).hexdigest() in values
actual = hashlib.new(digest, path.read_bytes()).hexdigest()
if entry.get("zip_digest") != "composite" and any(actual.startswith(v) for v in values):
return True # a truncated md5 (Batocera) compares by its prefix
if entry.get("zip_digest") != "composite" and actual in values:
return True # whole digests, as batocera-systems:1088 compares them
if digest == DIGESTS["md5"] and path.suffix.lower() == ".zip": # Recalbox: members in name order
with zipfile.ZipFile(path) as archive:
names = sorted(name for name in archive.namelist() if not name.endswith("/"))
+61 -15
View File
@@ -1509,6 +1509,15 @@ def resolve_local_file(
names_to_try.append(hint_base)
md5_list = parse_md5_list(file_entry.get("md5"))
files_db = db.get("files", {})
by_md5 = db.get("indexes", {}).get("by_md5", {})
# A value cut short stands for the one held md5 it starts, and only
# then (cut_md5_owner): the dump it names is still name-guarded below.
cut_owners = {
cut: owner for cut in md5_list
if len(cut) < 32 and (owner := cut_md5_owner(cut, by_md5))
}
md5_list = [cut_owners.get(value, value) for value in md5_list]
sha1_candidates = [
str(value).strip().lower()
for value in (sha1 if isinstance(sha1, list) else [sha1] if sha1 else [])
@@ -1536,8 +1545,6 @@ def resolve_local_file(
has_strong_hash = bool(
sha1_candidates or sha256_candidates or md5_list or crc_candidates
)
files_db = db.get("files", {})
by_md5 = db.get("indexes", {}).get("by_md5", {})
by_name = db.get("indexes", {}).get("by_name", {})
by_path_suffix = db.get("indexes", {}).get("by_path_suffix", {})
@@ -1558,7 +1565,7 @@ def resolve_local_file(
# With zipped_file the MD5 identifies the member, not the container.
if md5_list and not zipped_file:
actual_md5 = str(entry.get("md5", "")).lower()
if not any(actual_md5.startswith(expected) for expected in md5_list):
if actual_md5 not in md5_list:
return None
statuses.append("md5_exact")
if crc_candidates:
@@ -1642,20 +1649,13 @@ def resolve_local_file(
sha1_match = by_md5.get(md5_candidate)
if sha1_match and sha1_match in files_db:
path = files_db[sha1_match]["path"]
# Full MD5 (32 chars) is a strong identifier: trust it
# without name guard. Truncated MD5 still needs name check
# to avoid cross-contamination.
# A full md5 as declared is a strong identifier: trusted
# without name guard. One completed from a cut value still
# needs the name check to avoid cross-contamination.
status = _record_match_status(sha1_match)
if status and os.path.exists(path):
if len(md5_candidate) >= 32 or _md5_name_ok(path):
if md5_candidate not in cut_owners.values() or _md5_name_ok(path):
return path, status
if len(md5_candidate) < 32:
for db_md5, db_sha1 in by_md5.items():
if db_md5.startswith(md5_candidate) and db_sha1 in files_db:
path = files_db[db_sha1]["path"]
status = _record_match_status(db_sha1)
if status and os.path.exists(path) and _md5_name_ok(path):
return path, status
# 2b. Path suffix lookup is useful for same-named regional files, but it
# is identity evidence only when no content hash was declared. A stale
@@ -1776,9 +1776,15 @@ def resolve_local_file(
# none of them answers. melonDS Nightly's dsi_nand.bin is read at
# dsi/nand.bin: with the DSi image absent from the checkout, the
# basename let the Wii nand.bin outrank the entry's own DSi variant.
# A name whose held file no declaration proves, while declarations
# of that name prove another dump beside it, means that dump: the
# DSi devkit boot ROMs filed as dsi_bios7.bin went to RetroBat.
by_proven_name = db.get("indexes", {}).get("by_proven_name", {})
for tier in (own_names, names_to_try[len(own_names):]):
for try_name in tier:
for match_sha1 in by_name.get(try_name, []):
for match_sha1 in (
by_proven_name.get(try_name) or by_name.get(try_name, [])
):
if match_sha1 in files_db and _size_ok(match_sha1):
path = files_db[match_sha1]["path"]
if os.path.exists(path) and path not in candidates:
@@ -2830,6 +2836,45 @@ def preferred_profile(index: dict[str, set[str]], name: str) -> str | None:
return name if name in claimants else sorted(claimants)[0]
def without_profile_blind(
platforms: list[str],
flags: list[str],
platforms_dir: str,
profiles: dict[str, dict],
target_cores: dict[str, set[str] | None] | None,
is_all: bool,
) -> list[str]:
"""The platforms a narrowing read from profiles can apply to.
Regions, search order and game data are read from the profiles of the
cores a platform runs. MiSTer and BizHawk declare `cores: []`: a
--region, --one-per-slot or --no-game-data pack of theirs withdrew
nothing while its name and README said it had. A named platform is
refused (exit 1). Under --all it is left out with a notice. generate_pack
and verify both read this.
"""
if not flags:
return platforms
blind = [
name for name in platforms
if not resolve_platform_cores(
load_platform_config(name, platforms_dir),
profiles,
target_cores=(target_cores or {}).get(name),
)
]
for name in blind:
message = (
f"{name} runs no core a profile describes, and {', '.join(flags)} "
"reads the profiles"
)
if not is_all:
print(f"ERROR: {message}: drop {', '.join(flags)}", file=sys.stderr)
sys.exit(1)
print(f" {message}: left out")
return [name for name in platforms if name not in blind]
def resolve_platform_cores(
config: dict,
profiles: dict[str, dict],
@@ -3635,6 +3680,7 @@ from hashing import ( # noqa: E402,F401
md5sum,
md5_composite,
parse_md5_list,
cut_md5_owner,
_ALL_ALGORITHMS,
_md5_composite_cache,
)
+1 -4
View File
@@ -317,10 +317,7 @@ def _record_carries(sha1: str, record: dict, declared: dict[str, set[str]]) -> b
**{field: str(record.get(field) or "").lower() for field in ("md5", "sha256", "crc32")},
}
return any(
actual[field] and (
actual[field] in values
or (field == "md5" and any(len(v) < 32 and actual[field].startswith(v) for v in values))
)
actual[field] and actual[field] in values
for field, values in declared.items()
)
+4 -32
View File
@@ -22,11 +22,6 @@ from common import _norm_system_id, resolve_platform_cores, unresolved_platform_
from exporter.baseline import HASH_FIELDS, NativeSystem, _hash_values
from launchers import _names as launcher_names
# Batocera cuts some md5 to 29 characters: the prefix still names the dump.
_FULL_MD5 = 32
_CUT_MD5 = 29
def _tails(path: str) -> list[str]:
"""Every trailing run of segments of a path, longest first."""
parts = [p for p in path.casefold().strip("/").split("/") if p]
@@ -48,22 +43,12 @@ def _declared_hashes(entry: dict) -> dict[str, set[str]]:
return {f: values for f, values in found.items() if values}
def _same(declared: str, accepted: str) -> bool:
"""Equal, or a cut md5 that starts the accepted one."""
return declared == accepted or (
_CUT_MD5 <= len(declared) < _FULL_MD5 and accepted.startswith(declared)
)
def _accepts(accepted: set[str], declared: dict[str, set[str]]) -> bool:
"""True when the hashes a profile entry accepts, the members of its
archive included, hold one the platform entry declares."""
for values in declared.values():
if values & accepted:
return True
cut = [d for d in values if _CUT_MD5 <= len(d) < _FULL_MD5]
if cut and any(a.startswith(d) for d in cut for a in accepted):
return True
return False
@@ -72,7 +57,7 @@ def _contradicts(profile_entry: dict, declared: dict[str, set[str]]) -> bool:
the profile entry describes another dump under the same name."""
for field_name, values in declared.items():
own = set(_hash_values(profile_entry, field_name))
if own and not any(_same(d, a) for d in values for a in own):
if own and not set(values) & set(own):
return True
return False
@@ -158,10 +143,7 @@ class ReadEvidence:
hashes = {
v for f in (*HASH_FIELDS, "alt_md5") for v in _hash_values(entry, f)
}
if hashes & self.hashes or any(
len(v) < _FULL_MD5 and any(h.startswith(v) for h in self.hashes)
for v in hashes if len(v) >= _CUT_MD5
):
if hashes & self.hashes:
return "hash"
full = "/" + (tails[0] if tails else "")
if any("/" + d in full for d in self.directories):
@@ -188,7 +170,7 @@ class ProofIndex:
def __init__(self, readers: list[ReadEvidence]) -> None:
self._index: dict[str, dict[str, set[int]]] = {
kind: {} for kind in ("tail", "launched", "name", "hash", "cut", "dir", "tree", "member")
kind: {} for kind in ("tail", "launched", "name", "hash", "dir", "tree", "member")
}
for position, evidence in enumerate(readers):
for kind, keys in (
@@ -199,11 +181,6 @@ class ProofIndex:
):
for key in keys:
self._index[kind].setdefault(key, set()).add(position)
# A cut md5 names any hash it is the start of.
for value in evidence.hashes:
for length in range(_CUT_MD5, _FULL_MD5):
if len(value) >= length:
self._index["cut"].setdefault(value[:length], set()).add(position)
def _hits(self, kind: str, keys: Iterable[str]) -> set[int]:
table = self._index[kind]
@@ -224,7 +201,6 @@ class ProofIndex:
hashes = {
v for f in (*HASH_FIELDS, "alt_md5") for v in _hash_values(entry, f)
}
cut = {v for v in hashes if _CUT_MD5 <= len(v) < _FULL_MD5}
# "/" + d in "/" + path: d is a run of whole segments ending in "/",
# so it is a run of the path's segments before the last one.
parts = tails[0].split("/") if tails else []
@@ -236,7 +212,7 @@ class ProofIndex:
"path": self._hits("tail", tails[:-1]),
"launcher": self._hits("launched", names | last),
"name": self._hits("name", names | last),
"hash": self._hits("hash", hashes) | self._hits("cut", cut),
"hash": self._hits("hash", hashes),
"directory": self._hits("dir", runs),
"data_directory": self._hits("tree", runs)
| self._index["member"].get(tails[0] if tails else "", set()),
@@ -463,10 +439,6 @@ class EntryCategories:
for value in values:
for position, f in by_hash_index.get(value, ()):
found[position] = f
if _CUT_MD5 <= len(value) < _FULL_MD5:
for accepted, hits in by_hash_index.items():
if accepted.startswith(value):
found.update(hits)
if found:
return [cited(found[p]) for p in sorted(found)]
named = {position: f for n in names for position, f in by_name_index.get(n, ())}
+73
View File
@@ -318,6 +318,76 @@ def shadowed_alias_index(
return {alias: sorted(sha1s) for alias, sha1s in sorted(index.items())}
def _declarations(platforms_dir: Path, emulators_dir: Path) -> list[dict]:
"""Every file entry the registered platforms and the profiles declare."""
sources = [
platforms_dir / f"{name}.yml"
for name in list_registered_platforms(str(platforms_dir))
] if platforms_dir.is_dir() else []
entries: list[dict] = []
for source in sources:
with open(source) as f:
config = yaml_load(f) or {}
for system in (config.get("systems") or {}).values():
entries.extend(system.get("files") or [])
if emulators_dir.is_dir():
for source in source_yaml_paths(emulators_dir):
with open(source) as f:
entries.extend((yaml_load(f) or {}).get("files") or [])
return entries
def proven_name_index(
files: dict, indexes: dict, declarations: list[dict]
) -> dict[str, list[str]]:
"""Names whose held primary no declaration proves, mapped to the primaries
of the same directory that declarations of that name prove by hash.
A hashless entry takes a name's file by name alone. The collection files
the DSi Panda devkit boot ROMs as dsi_bios7.bin and dsi_bios9.bin, with
the eMMC key-Y zeroed, while every hash declared under those names
designates a retail dump beside them: RetroBat and dsperate were served
the devkit ROMs. Another revision kept in .variants/ is not a primary,
and a dump filed elsewhere is another machine's file.
"""
by_hash = {
"sha1": {sha1: sha1 for sha1 in files},
"md5": indexes.get("by_md5", {}),
"crc32": indexes.get("by_crc32", {}),
"sha256": indexes.get("by_sha256", {}),
}
proven: dict[str, set[str]] = {}
for entry in declarations:
# A zipped_file hash is the member's, not the file the name designates.
if not isinstance(entry, dict) or entry.get("zipped_file"):
continue
name = str(entry.get("name") or "").rsplit("/", 1)[-1]
if not name:
continue
for kind, index in by_hash.items():
for value in _as_list(entry.get(kind)):
held = index.get(value)
if held in files:
proven.setdefault(name, set()).add(held)
result: dict[str, list[str]] = {}
for name, designated in sorted(proven.items()):
primaries = {
sha1 for sha1 in indexes.get("by_name", {}).get(name, [])
if sha1 in files and "/.variants/" not in files[sha1]["path"]
}
if not primaries or primaries & designated:
continue
homes = {os.path.dirname(files[sha1]["path"]) for sha1 in primaries}
beside = [
sha1 for sha1 in designated
if "/.variants/" not in files[sha1]["path"]
and os.path.dirname(files[sha1]["path"]) in homes
]
if beside:
result[name] = sorted(beside, key=lambda sha1: files[sha1]["path"])
return result
def load_cache(cache_path: str) -> dict:
"""Load cache file if it exists."""
try:
@@ -476,6 +546,9 @@ def _generate(args: argparse.Namespace) -> int:
indexes = build_indexes(files, aliases)
indexes["by_shadowed_alias"] = shadowed_alias_index(shadowed, indexes["by_name"])
indexes["by_proven_name"] = proven_name_index(
files, indexes, _declarations(Path("platforms"), Path("emulators"))
)
total_size = sum(entry["size"] for entry in files.values())
database = {
+70 -13
View File
@@ -76,6 +76,7 @@ from common import (
load_database,
load_emulator_profiles,
load_platform_config,
without_profile_blind,
MANUFACTURER_PREFIXES,
require_yaml,
ProfileSelectionError,
@@ -373,13 +374,25 @@ def _platform_pack_stem(
rep_cfg = load_platform_config(representative, platforms_dir)
version = rep_cfg.get("version", rep_cfg.get("dat_version", ""))
version_tag = f"_{_name_part(str(version))}" if version else ""
return platform_pack_prefix(group_platforms, representative, platforms_dir) + version_tag
def platform_pack_prefix(
group_platforms: list[str], representative: str, platforms_dir: str
) -> str:
"""Platform part of a pack name without the version.
The site reads a pack's version back by removing this prefix: a version
may hold an underscore (AmberELEC prerelease-20261019_1835).
"""
if len(group_platforms) <= 1:
return _name_part(rep_cfg.get("platform", representative), "_") + version_tag
rep_cfg = load_platform_config(representative, platforms_dir)
return _name_part(rep_cfg.get("platform", representative), "_")
names = [
load_platform_config(p, platforms_dir).get("platform", p)
for p in group_platforms
]
return "_".join(_name_part(n) for n in names) + version_tag
return "_".join(_name_part(n) for n in names)
def platform_list_version(config: dict, platform: str) -> str:
@@ -685,6 +698,9 @@ def _select_variants(
one_per_slot: bool,
required_only: bool = False,
undeclared: list[dict] | None = None,
zip_contents: dict | None = None,
data_registry: dict | None = None,
slot_overrides: dict[str, str] | None = None,
) -> tuple[set, list, list]:
"""Which regional and slot alternatives this pack leaves out.
@@ -714,6 +730,9 @@ def _select_variants(
required_only=required_only,
held_out=held,
undeclared=undeclared,
zip_contents=zip_contents,
data_registry=data_registry,
slot_overrides=slot_overrides,
)
if regions:
region_index = region_mod.platform_region_index(
@@ -968,7 +987,8 @@ def generate_pack(
region_drops, region_fallbacks, slot_undecidable = _select_variants(
config, pack_systems, emulators_dir, db, base_dest, emu_profiles,
target_cores, source, regions, one_per_slot, required_only,
undeclared=undeclared,
undeclared=undeclared, zip_contents=zip_contents,
data_registry=data_registry, slot_overrides=slot_overrides,
)
with (
@@ -1646,6 +1666,9 @@ def generate_emulator_pack(
) -> str | None:
"""Generate a ZIP pack for specific emulator profiles.
Returns the path, "" when no file is needed (verify --emulator reports
0/0 OK), None on failure.
`pack_name` is the caller's own file name: the system pack names its
archive after the system, and joining 23 SNES emulator names went past
the 255 bytes a file name may hold. `system_ids` keeps only the entries
@@ -1680,8 +1703,14 @@ def generate_emulator_pack(
if record is None:
os.makedirs(output_dir, exist_ok=True)
data_registry = load_data_dir_registry(
platforms_dir or os.path.join(os.path.dirname(__file__), "..", "platforms")
)
region_drops: set[str] = (
emulator_region_drops(selected, standalone, regions, required_only, db)
emulator_region_drops(
selected, standalone, regions, required_only, db,
zip_contents=zip_contents, data_registry=data_registry,
)
if regions
else set()
)
@@ -1712,9 +1741,6 @@ def generate_emulator_pack(
missing_files.append(name)
data_dir_notices: list[str] = []
data_registry = load_data_dir_registry(
platforms_dir or os.path.join(os.path.dirname(__file__), "..", "platforms")
)
with (
contextlib.nullcontext(record) if record is not None
@@ -1984,10 +2010,16 @@ def generate_emulator_pack(
)
# Remove empty ZIP (no files packed and no missing = nothing to ship)
if record is None and total_files + data_files == 0 and not (
nothing_needed = total_files + data_files == 0 and not (
missing_files or rejected_files or instruction_files or unsourceable_files
):
)
if record is None and nothing_needed:
os.unlink(zip_path)
# What verify --emulator reports as 0/0 OK: no file is needed, so
# no pack is written and the run succeeds. Printed with the path,
# the run named a file it had just removed and exited 1.
print(f" {', '.join(display_names)}: no file needed, no pack written")
return ""
# Report. The members of data trees are counted apart: verify --emulator
# counts the profile's files, and folding 3500 tree members into the
@@ -2044,7 +2076,10 @@ def generate_system_pack(
offline: bool | None = None,
platforms_dir: str | None = None,
) -> str | None:
"""Generate a ZIP pack for all emulators supporting given system IDs."""
"""Generate a ZIP pack for all emulators supporting given system IDs.
Returns the path, "" when no file is needed, None on failure.
"""
profiles = load_emulator_profiles(emulators_dir)
matching = profiles_for_systems(profiles, system_ids, standalone)
@@ -2108,7 +2143,7 @@ def generate_system_pack(
final_dir=output_dir,
)
if not result:
return None
return result
new_path = os.path.join(output_dir, final_name)
os.replace(result, new_path)
return new_path
@@ -3722,7 +3757,7 @@ def _main(held: contextlib.ExitStack) -> None:
offline=args.offline,
platforms_dir=args.platforms_dir,
)
if not built:
if built is None:
sys.exit(1)
return
@@ -3743,7 +3778,7 @@ def _main(held: contextlib.ExitStack) -> None:
offline=args.offline,
platforms_dir=args.platforms_dir,
)
if not built:
if built is None:
sys.exit(1)
return
@@ -3787,6 +3822,20 @@ def _main(held: contextlib.ExitStack) -> None:
platforms = _platforms_with_systems(
args, platforms, system_filter, emu_profiles, target_cores_cache
)
platforms = without_profile_blind(
platforms,
[
flag for flag, given in (
("--region", getattr(args, "regions", None)),
("--one-per-slot", getattr(args, "one_per_slot", False)),
("--no-game-data", getattr(args, "no_game_data", False)),
) if given
],
args.platforms_dir,
emu_profiles,
target_cores_cache if args.target else None,
args.all,
)
data_registry = load_data_dir_registry(args.platforms_dir)
# The output directory is claimed before the data directory refresh: a
@@ -4365,6 +4414,9 @@ def _manifest_selection(
required_only: bool,
regions: list[str] | None,
undeclared: list[dict] | None = None,
zip_contents: dict | None = None,
data_registry: dict | None = None,
slot_overrides: dict[str, str] | None = None,
) -> tuple[set[str], SelectionIndex, set[str]]:
"""Destinations a region list removes, the groups the installer replays,
and the destinations the builder holds.
@@ -4388,6 +4440,9 @@ def _manifest_selection(
extras_out=extras,
held_out=held,
undeclared=undeclared,
zip_contents=zip_contents,
data_registry=data_registry,
slot_overrides=slot_overrides,
)
region_index = region_mod.platform_region_index(
config, emu_profiles, target_cores
@@ -4667,6 +4722,8 @@ def generate_manifest(
region_drops, selection, builder_held = _manifest_selection(
config, pack_systems, emulators_dir, db, base_dest, emu_profiles,
target_cores, source, required_only, regions, undeclared=undeclared,
zip_contents=zip_contents, data_registry=data_registry,
slot_overrides=slot_overrides,
)
# Phase 1: baseline files
+25 -5
View File
@@ -608,11 +608,26 @@ def _release_date(tag: str) -> str:
return f"{moment.day} {moment.strftime('%B %Y')}"
def _pack_version(pack_name: str) -> str:
def _pack_version(pack_name: str, platforms: list[str]) -> str:
"""The platform version a pack was built for, from its name
(Batocera_43.1_BIOS_Pack.zip is 43.1)."""
(Batocera_43.1_BIOS_Pack.zip is 43.1).
Read past the platform part the builder writes, not at the last
underscore: AmberELEC_prerelease-20261019_1835 read as 1835.
"""
from generate_pack import platform_pack_prefix # noqa: PLC0415
stem = pack_name.removesuffix("_BIOS_Pack.zip")
return stem.rsplit("_", 1)[1] if "_" in stem else ""
prefix = platform_pack_prefix(
platforms, platforms[0], str(siteinputs.current().platforms)
) + "_"
return stem[len(prefix):] if stem.startswith(prefix) else ""
def _pack_platforms(platform_name: str, record: dict, pack_name: str) -> list[str]:
"""The platforms a release pack was built for, the one asked first."""
listed = list(record.get("packs", {}).get(pack_name, {}).get("platforms") or [])
return listed or [platform_name]
def release_line(platform_name: str, record: dict) -> list[str]:
@@ -631,7 +646,9 @@ def release_line(platform_name: str, record: dict) -> list[str]:
]
config = load_platform_config(platform_name, str(siteinputs.current().platforms))
page_version = str(config.get("version") or "")
pack_version = _pack_version(pack_name)
pack_version = _pack_version(
pack_name, _pack_platforms(platform_name, record, pack_name)
)
if page_version and pack_version and page_version.lstrip("v") != pack_version.lstrip("v"):
display = config.get("platform", platform_name)
lines.append(f"This pack was built for {display} {pack_version}. The command "
@@ -658,7 +675,10 @@ def setup_version(platform_name: str, record: dict | None = None) -> str:
except FileNotFoundError:
return ""
pack_name = release_record.pack_name_for(platform_name, record or {})
version = (_pack_version(pack_name) if pack_name else "") or str(config.get("version") or "")
version = (
_pack_version(pack_name, _pack_platforms(platform_name, record or {}, pack_name))
if pack_name else ""
) or str(config.get("version") or "")
if not version:
return ""
return f"{config.get('platform', platform_name)} {version.removeprefix('v')}"
+15
View File
@@ -11,6 +11,7 @@ import zipfile
import zlib
from pathlib import Path
from typing import BinaryIO
from collections.abc import Iterable
_ALL_ALGORITHMS = frozenset({"sha1", "md5", "sha256", "crc32", "adler32"})
@@ -130,6 +131,20 @@ def md5_composite_of(source: str | Path | BinaryIO) -> str:
h.update(zf.read(name))
return h.hexdigest()
def cut_md5_owner(cut: str, md5s: Iterable[str]) -> str | None:
"""The one md5 a value cut short starts, None when none or several do.
The single rule for a cut md5, read by the scraper, the resolver and
--from-md5. It names a dump, it never verifies one: Batocera compares
the whole string (batocera-systems:1088), so every verdict compares
exact digests.
"""
if not cut or len(cut) >= 32:
return None
found = {md5 for md5 in md5s if md5.startswith(cut)}
return found.pop() if len(found) == 1 else None
def parse_hash_list(raw: str | list | int | None) -> list[str]:
"""Normalize any hash field into its accepted values, lowercase.
+25 -15
View File
@@ -250,23 +250,33 @@ def _pin_verified(
passed off as the one verified. None when the name moved in between.
"""
revision = os.path.join(dest_dir, VERIFIED_STORE, snapshot[0]["sha1"])
os.makedirs(revision, exist_ok=True)
final = os.path.join(revision, name)
if os.path.isfile(final):
return final
scratch = os.path.join(revision, f".{os.getpid()}.{os.urandom(4).hex()}.tmp")
try:
os.link(path, scratch)
except FileNotFoundError:
return None
try:
if os.stat(scratch).st_ino != snapshot[2]:
return None
os.replace(scratch, final)
return final
finally:
# A prune removes an empty revision directory: one that went between
# makedirs and link is made again, once.
for _attempt in range(2):
os.makedirs(revision, exist_ok=True)
# The link must hold the inode just verified. An older link left by a
# copy that lost its cache name has one link left, and the prune of
# this very download removed it after it was returned.
with contextlib.suppress(FileNotFoundError):
os.unlink(scratch)
if os.stat(final).st_ino == snapshot[2]:
return final
scratch = os.path.join(revision, f".{os.getpid()}.{os.urandom(4).hex()}.tmp")
try:
os.link(path, scratch)
except FileNotFoundError:
if not os.path.exists(path):
return None
continue
try:
if os.stat(scratch).st_ino != snapshot[2]:
return None
os.replace(scratch, final)
return final
finally:
with contextlib.suppress(FileNotFoundError):
os.unlink(scratch)
return None
def _prune_verified(dest_dir: str) -> None:
+47 -13
View File
@@ -1222,8 +1222,14 @@ def _collect_emulator_extras(
)
continue
if claimants is not None:
# Keyed as extra_region_key keys the extra that wins the path: a
# losing claim kept the bare path, and on RetroDECK (declared
# root bios/) verify --region listed Rustation's scph1002b.bin
# as packed while the builder had withdrawn bios/scph1002b.bin.
claimants[(u.get("emulator", ""), u.get("name", ""), u.get("path") or "")] = (
sanitize_pack_path(placements[0][0])
prefixed_destination(
sanitize_pack_path(placements[0][0]), declared_root(config)
)
)
for dest, full_dest in placements:
candidates = [
@@ -1633,17 +1639,26 @@ def report_owned_by_systems(report: list[dict], system_ids: list[str]) -> list[d
]
def _ships(config: dict, file_entry: dict, db: dict) -> bool:
def _ships(
config: dict,
file_entry: dict,
db: dict,
zip_contents: dict | None,
data_registry: dict | None,
override: str | None,
) -> bool:
"""Whether the builder packs this declaration: resolved, and not refused
by a hash frontend. A dump whose md5 Recalbox would reject is left out
of the pack, so it cannot win a regional slot over a file that ships.
Resolved with the builder's own inputs: without the data directories,
AmberELEC's bluemsx config.ini read as missing while the pack held it.
"""
from packresolve import resolve_declaration
from validation import baseline_verdict
# The builder's resolution: no destination hint, release assets included.
path, status = resolve_declaration(
file_entry, db, "bios", None, None, None, offline=True,
file_entry, db, "bios", zip_contents, data_registry, override, offline=True,
)
if not path:
return False
@@ -1668,6 +1683,9 @@ def platform_region_groups(
extras_out: list[dict] | None = None,
held_out: set[str] | None = None,
undeclared: list[dict] | None = None,
zip_contents: dict | None = None,
data_registry: dict | None = None,
slot_overrides: dict[str, str] | None = None,
) -> tuple[dict[str, list[tuple[str, str]]], dict[tuple[str, str, str], str]]:
"""Group a platform's pack candidates the way region filtering reads them.
@@ -1682,7 +1700,9 @@ def platform_region_groups(
two answer differently on the same request. `extras_out` receives the
core extras that were grouped, for the install manifest. ``undeclared``
is the gap report when the caller holds it (undeclared_report, with the
same target_cores and include_all).
same target_cores and include_all). ``zip_contents``, ``data_registry``
and ``slot_overrides`` (keyed by full pack destination) are the ones the
builder resolves with, so a held declaration is the one the pack ships.
"""
groups: dict[str, list[tuple[str, str]]] = {}
for sys_id, system in systems.items():
@@ -1695,8 +1715,10 @@ def platform_region_groups(
)
if dest:
members.append((dest, file_entry.get("name", "")))
full_dest = f"{base_dest}/{dest}" if base_dest else dest
if held_out is not None and db is not None and _ships(
config, file_entry, db
config, file_entry, db, zip_contents, data_registry,
(slot_overrides or {}).get(full_dest),
):
held_out.add(dest)
@@ -1799,6 +1821,8 @@ def emulator_region_drops(
regions: list[str],
required_only: bool = False,
db: dict | None = None,
zip_contents: dict | None = None,
data_registry: dict | None = None,
) -> set[str]:
"""Destinations an emulator-mode `--region` withdraws.
@@ -1810,7 +1834,8 @@ def emulator_region_drops(
With `db`, a requested-region file the collection lacks never displaces
a held one, as in platform mode: a held scph5501.bin was withdrawn for a
Japanese image nobody had collected, and the pack shipped no PlayStation
BIOS at all.
BIOS at all. ``zip_contents`` and ``data_registry`` are the ones the
emulator pack resolves with.
"""
import region as region_mod
from packpaths import _resolve_destination
@@ -1832,27 +1857,36 @@ def emulator_region_drops(
(dest, fe.get("name", ""))
)
if held is not None and _emulator_ships(
fe, emu_name, profile, db, dest, validation_index
fe, emu_name, profile, db, validation_index,
zip_contents, data_registry,
):
held.add(dest)
return region_mod.resolve_region_drops(region_groups, region_index, regions, held)
def _emulator_ships(
file_entry: dict, emu_name: str, profile: dict, db: dict, dest: str,
validation_index: dict,
file_entry: dict, emu_name: str, profile: dict, db: dict,
validation_index: dict, zip_contents: dict | None, data_registry: dict | None,
) -> bool:
"""Whether the emulator pack ships this entry: held, and not refused by
the core's own check, the test _ships applies on the platform side.
Resolved as generate_emulator_pack resolves: without the data
directories, dolphin-mmjr2's nwc24msg.cfg read as missing while the pack
held it.
"""
from packresolve import resolve_file
from validation import validated_choice, with_archive_members
local, _status = resolve_local_file(
local, status = resolve_file(
{**with_archive_members(file_entry, profile.get("files", [])),
"source_profile": emu_name},
db, dest_hint=dest,
db, "bios", zip_contents,
dest_hint=file_entry.get("path", ""),
data_dir_registry=data_registry,
offline=True,
)
if not local:
if status in ("not_found", "user_provided") or not local:
return False
_chosen, disagreement = validated_choice(
file_entry, local, db, validation_index, "bios", None, emulators={emu_name},
+6 -5
View File
@@ -14,6 +14,7 @@ import urllib.request
from pathlib import Path
from largefiles import fetch_large_file
from hashing import cut_md5_owner
from common import (
declared_hash_verdict,
resolution_is_hash_exact,
@@ -203,8 +204,8 @@ def pending_release_asset(
return None
# Digest length in hex digits -> kind. 29 is the MD5 Batocera writes with
# its last three digits cut, matched by prefix as the resolver does.
# Digest length in hex digits -> kind. A 29-digit MD5 is a value cut short,
# looked up as the resolver looks one up (cut_md5_owner).
_HASH_KINDS = {8: "crc32", 29: "md5", 32: "md5", 40: "sha1", 64: "sha256"}
_HEX_DIGITS = re.compile(r"[0-9a-f]+")
_WORD = re.compile(r"[0-9A-Za-z]+")
@@ -289,9 +290,9 @@ def sha1_for_hash(hash_type: str, hash_val: str, db: dict) -> str | None:
elif hash_type == "md5":
by_md5 = indexes.get("by_md5", {})
sha1 = by_md5.get(hash_val)
if sha1 is None and len(hash_val) < 32:
prefixed = {v for k, v in by_md5.items() if k.startswith(hash_val)}
sha1 = prefixed.pop() if len(prefixed) == 1 else None
if sha1 is None:
owner = cut_md5_owner(hash_val, by_md5)
sha1 = by_md5.get(owner) if owner else None
else:
sha1 = next(
(k for k, e in files_db.items() if e.get("sha256") == hash_val), None
+8
View File
@@ -30,6 +30,7 @@ from packextras import platform_region_groups
from packpaths import _flat
from nativemode import reads_file_contents
import region as region_mod
import slots
from packresolve import resolve_declaration, resolve_file
from exporter.candidates import BIOS, EntryCategories
from gamedata import without_game_data
@@ -706,6 +707,7 @@ def verify_pack_against_platform(
config, emu_profiles, target_cores
)
held: set[str] = set()
held_zip_contents = build_zip_contents_index(db) if db is not None else {}
region_groups, _extra_dests = platform_region_groups(
config,
expected_systems,
@@ -718,6 +720,12 @@ def verify_pack_against_platform(
include_all=(source == "truth"),
required_only=required_only,
held_out=held,
zip_contents=held_zip_contents,
data_registry=data_registry,
slot_overrides=slots.pack_overrides(
config, emu_profiles, db, held_zip_contents, data_registry,
target_cores=target_cores, source=source,
) if db is not None else None,
)
region_drops = region_mod.resolve_region_drops(
region_groups, region_index, regions, held
+11 -8
View File
@@ -29,14 +29,15 @@ from common import copy_file_atomic, load_database
def gitignored_paths(gitignore: str) -> set[str]:
"""Paths the repository keeps out of git, as written in .gitignore."""
try:
with open(gitignore) as f:
return {
line.strip() for line in f if line.strip().startswith("bios/")
}
except FileNotFoundError:
return set()
"""Paths the repository keeps out of git, as written in .gitignore.
A missing file raises: read as empty, it left nothing to restore and
nothing unsatisfied, and the run exited 0 with every asset absent.
"""
with open(gitignore) as f:
return {
line.strip() for line in f if line.strip().startswith("bios/")
}
def index_cache(cache_dir: str) -> dict[str, str]:
@@ -144,6 +145,8 @@ def main() -> None:
help="the .gitignore listing release-asset files (default: %(default)s)",
)
args = parser.parse_args()
if not os.path.isfile(args.gitignore):
parser.error(f"no file at {args.gitignore}: it lists the release assets")
_restored, unsatisfied = restore(args.cache, args.db, args.gitignore)
if unsatisfied:
raise SystemExit(1)
+6 -5
View File
@@ -18,6 +18,7 @@ from pathlib import Path
from common import yaml_load
from hashing import cut_md5_owner
from safeparse import yaml_load_upstream
from .base_scraper import (
@@ -312,15 +313,15 @@ def _load_md5_index() -> dict[str, str]:
def _resolve_truncated_md5(md5: str, md5_index: dict[str, str]) -> str:
"""Resolve a truncated MD5 to its full 32-char version via prefix match."""
"""Resolve a truncated MD5 to its full 32-char version (cut_md5_owner)."""
if not md5 or len(md5) == 32:
return md5
if not _MD5_RE.match(md5):
return md5
matches = [k for k in md5_index if k.startswith(md5)]
if len(matches) == 1:
print(f" fixed truncated md5: {md5} -> {matches[0]}", file=sys.stderr)
return matches[0]
owner = cut_md5_owner(md5, md5_index)
if owner:
print(f" fixed truncated md5: {md5} -> {owner}", file=sys.stderr)
return owner
return md5
+28
View File
@@ -20,6 +20,7 @@ feeds the report this module prints.
from __future__ import annotations
import os
import zlib
from dataclasses import dataclass, field
from typing import TYPE_CHECKING
@@ -892,10 +893,37 @@ def _accepted_by_all(path: str, entries: list[dict], db: dict) -> bool:
for field_name in ("md5", "sha1", "sha256", "crc32"):
declared = _declared_hashes(entry, field_name)
if declared and str(record.get(field_name, "")).lower() not in declared:
if field_name == "crc32" and _headerless_crc32(path, record, entry) in declared:
continue
return False
return True
COPIER_HEADER = 512
def _headerless_crc32(path: str, record: dict, entry: dict) -> str | None:
"""The crc32 of a file past its 512-byte copier header, when the entry
declares both the file's size and the size without the header.
Geargrafx drops the header when the file is 512 bytes over the expected
size and computes the crc32 on the rest (src/media.cpp:754-773). The
profile lists both sizes. EmuELEC's headered syscard3.pce (crc32
64f78e3c) is the 6d9a73ef image the profile names.
"""
sizes = entry.get("size")
declared = sizes if isinstance(sizes, list) else [sizes]
size = record.get("size")
if not isinstance(size, int) or not {size, size - COPIER_HEADER} <= set(declared):
return None
try:
with open(path, "rb") as f:
f.seek(COPIER_HEADER)
return f"{zlib.crc32(f.read()):08x}"
except OSError:
return None
def _same_file_family(paths: list[str]) -> bool:
"""Whether the paths are one file and its own pinned variants.
+3 -5
View File
@@ -857,8 +857,8 @@ def frontend_digest_matches(
resolve_local_file calls a file `hash_mismatch` when any declared hash
disagrees, but a frontend compares one digest. verify_entry_md5 reads it
too: Batocera compares a truncated md5 by prefix and Recalbox hashes a
ZIP by its members. Under SIZE_AND_ANY_HASH (RomM) the declared size must
too: Recalbox hashes a ZIP by its members. Batocera compares the whole
md5 string (batocera-systems:1088), so a value cut short accepts nothing. Under SIZE_AND_ANY_HASH (RomM) the declared size must
match and then any one of md5, sha1 and crc32 does: a mistyped hash next
to a right one does not withhold the file, a wrong size does.
"""
@@ -918,9 +918,7 @@ def digest_verdict(
# Recalbox hashes a .zip by its members only (Bios.cpp:64-68), so the
# container's own md5 answers nothing there.
composite_only = file_entry.get("zip_digest") == "composite"
if not composite_only and any(
actual == d or (len(d) < 32 and actual.startswith(d)) for d in declared
):
if not composite_only and actual in declared:
return True
member_digest = composite()
return bool(member_digest) and member_digest.lower() in declared
+29 -5
View File
@@ -67,6 +67,7 @@ from common import (
load_database,
load_emulator_profiles,
load_platform_config,
without_profile_blind,
resolve_system_arg,
print_platform_listing,
select_systems,
@@ -1189,12 +1190,13 @@ def verify_platform(
else load_emulator_profiles(emulators_dir)
)
base_dest = config.get("base_destination", "")
pack_overrides = slots.pack_overrides(
config, profiles, db, zip_contents, data_dir_registry,
target_cores=target_cores,
)
slot_overrides = {
(key[len(base_dest) + 1:] if base_dest and key.startswith(f"{base_dest}/") else key): path
for key, path in slots.pack_overrides(
config, profiles, db, zip_contents, data_dir_registry,
target_cores=target_cores,
).items()
for key, path in pack_overrides.items()
}
# Build HLE + validation indexes from emulator profiles
@@ -1258,6 +1260,9 @@ def verify_platform(
target_cores=target_cores,
required_only=required_only,
held_out=held,
zip_contents=zip_contents,
data_registry=data_dir_registry,
slot_overrides=pack_overrides,
)
region_index = region_mod.platform_region_index(config, profiles, target_cores)
region_drops = region_mod.resolve_region_drops(
@@ -2138,7 +2143,10 @@ def verify_emulator(
if regions:
from packextras import emulator_region_drops
region_drops = emulator_region_drops(selected, standalone, regions, required_only, db=db)
region_drops = emulator_region_drops(
selected, standalone, regions, required_only, db=db,
zip_contents=zip_contents, data_registry=data_registry,
)
# The emulator pack walks profiles in name order and keeps the first
# file at a path, folding case: a later profile's different file there
@@ -2998,6 +3006,22 @@ def _main(held: contextlib.ExitStack) -> None:
print(f"ERROR: {reason}", file=sys.stderr)
sys.exit(1)
# generate_pack refuses these on a platform whose cores no profile
# describes, and the report answers the same request the same way.
platforms = without_profile_blind(
platforms,
[
flag for flag, given in (
("--region", requested_regions),
("--no-game-data", getattr(args, "no_game_data", False)),
) if given
],
args.platforms_dir,
emu_profiles,
target_cores_cache if args.target else None,
args.all,
)
# Group identical platforms (same function as generate_pack)
groups = group_identical_platforms(
platforms, args.platforms_dir, target_cores_cache if args.target else None
+34 -9
View File
@@ -1377,23 +1377,29 @@ class OneBaselineVerdict(unittest.TestCase):
)
def test_the_builder_accepts_what_verify_accepts(self):
"""verify took a 29-character md5 by prefix and a ZIP by its
composite, but the builder compared exact md5s and refused both when
another declared hash disagreed."""
"""verify took a ZIP by its composite, but the builder compared exact
md5s and refused it when another declared hash disagreed. A value cut
short accepts nothing: Batocera compares the whole md5 string
(batocera-systems:1088), and verify accepted any prefix, down to one
digit."""
import hashlib
from scripts.common import md5_composite
from scripts.validation import baseline_verdict
from scripts.validation import baseline_verdict, digest_verdict
with tempfile.TemporaryDirectory(dir=TMP_ROOT) as directory:
loose = Path(directory) / "abc.bin"
loose.write_bytes(b"abc")
truncated = {"name": "abc.bin", "md5": hashlib.md5(b"abc").hexdigest()[:29],
"crc32": "deadbeef"}
self.assertEqual(
baseline_verdict(truncated, str(loose), "hash_mismatch", "md5"),
("frontend_digest_exact", None),
md5 = hashlib.md5(b"abc").hexdigest()
truncated = {"name": "abc.bin", "md5": md5[:29], "crc32": "deadbeef"}
self.assertIsNotNone(
baseline_verdict(truncated, str(loose), "hash_mismatch", "md5")[1]
)
for length in (1, 29, 31):
self.assertFalse(
digest_verdict({"md5": md5[:length]}, 3, lambda: {"md5": md5}, "md5")
)
self.assertTrue(digest_verdict({"md5": md5}, 3, lambda: {"md5": md5}, "md5"))
archive = self._archive(Path(directory), "rom.bin")
composite = {"name": "dragon32.zip", "md5": md5_composite(archive),
"crc32": "deadbeef"}
@@ -2138,6 +2144,25 @@ class CheckoutCompletenessRegressions(unittest.TestCase):
finally:
os.chdir(cwd)
def test_restore_without_its_registry_fails(self):
"""A mistyped --gitignore read as an empty registry: nothing to
restore, nothing unsatisfied, exit 0 with every asset absent."""
import subprocess
from scripts.restore_large_files import gitignored_paths
with tempfile.TemporaryDirectory(dir=TMP_ROOT) as directory:
missing = str(Path(directory) / "absent")
with self.assertRaises(FileNotFoundError):
gitignored_paths(missing)
proc = subprocess.run(
[sys.executable, str(ROOT / "scripts" / "restore_large_files.py"),
"--gitignore", missing, "--cache", directory],
capture_output=True, text=True, timeout=120,
)
self.assertEqual(proc.returncode, 2, proc.stdout + proc.stderr)
self.assertIn("lists the release assets", proc.stderr)
def test_restore_refuses_a_copy_replaced_after_the_index(self):
"""The cache is hashed first and copied later: another run that
replaced the cached name in between put its bytes at a path the
+2 -1
View File
@@ -660,10 +660,11 @@ class ShortMd5Handling(unittest.TestCase):
scraper = inspect.getsource(batocera_scraper)
self.assertIn("_resolve_truncated_md5(value, md5_index) for value in values", scraper)
resolver = inspect.getsource(common.resolve_local_file)
self.assertIn("if len(md5_candidate) < 32:", resolver)
self.assertIn("cut_md5_owner(cut, by_md5)", resolver)
self.assertIn("_md5_name_ok(path)", resolver)
section = _section(_page("verification-modes.md"), "MD5 shorter than 32 characters (Batocera)")
self.assertIn("_resolve_truncated_md5", section)
self.assertIn("cut_md5_owner", section)
class RegistryKeysDocumented(unittest.TestCase):
+48
View File
@@ -6376,6 +6376,54 @@ struct BurnDriver BurnDrvneogeo = {
[f for f in os.listdir(out) if f.endswith(".zip")] if os.path.isdir(out) else []
)
def test_an_emulator_needing_no_file_succeeds_like_verify(self):
"""Handy requires no file. --required-only removed the empty ZIP,
printed its path and exited 1, while verify reported 0/0 OK."""
import subprocess
repo = os.path.join(os.path.dirname(__file__), "..")
out = os.path.join(self.root, "no_file_needed")
proc = subprocess.run(
[sys.executable, "scripts/generate_pack.py", "--emulator", "handy",
"--required-only", "--offline", "--output-dir", out],
capture_output=True, text=True, cwd=repo, timeout=300,
)
self.assertEqual(proc.returncode, 0, proc.stdout + proc.stderr)
self.assertIn("no file needed, no pack written", proc.stdout)
self.assertNotIn(".zip", proc.stdout)
verify = subprocess.run(
[sys.executable, "scripts/verify.py", "--emulator", "handy", "--required-only"],
capture_output=True, text=True, cwd=repo, timeout=300,
)
self.assertEqual(verify.returncode, proc.returncode)
def test_a_platform_without_cores_refuses_profile_narrowings(self):
"""MiSTer and BizHawk declare cores: []. --region, --one-per-slot
and --no-game-data read the profiles, so their packs withdrew
nothing under a name and README that said otherwise."""
import subprocess
repo = os.path.join(os.path.dirname(__file__), "..")
out = os.path.join(self.root, "blind")
runs = [
["scripts/generate_pack.py", "--platform", "misterfpga", "--region", "us"],
["scripts/generate_pack.py", "--platform", "misterfpga", "--one-per-slot"],
["scripts/generate_pack.py", "--platform", "misterfpga", "--no-game-data"],
["scripts/generate_pack.py", "--platform", "bizhawk", "--manifest",
"--region", "us"],
["scripts/verify.py", "--platform", "bizhawk", "--region", "us"],
]
for argv in runs:
extra = ["--offline", "--output-dir", out] if "generate_pack" in argv[0] else []
with self.subTest(argv=argv):
proc = subprocess.run(
[sys.executable, *argv, *extra],
capture_output=True, text=True, cwd=repo, timeout=300,
)
self.assertEqual(proc.returncode, 1, proc.stdout + proc.stderr)
self.assertIn("runs no core a profile describes", proc.stderr)
self.assertFalse(os.listdir(out) if os.path.isdir(out) else [])
def test_a_full_pack_is_not_announced_as_narrowed(self):
from generate_pack import _build_readme, _narrowings
+6 -5
View File
@@ -61,10 +61,11 @@ class EachProfileEntryIsHashedOnce(unittest.TestCase):
cats = EntryCategories(_config(["core"], []), profiles)
real = candidates._entry_hashes
with mock.patch.object(candidates, "_entry_hashes", side_effect=real) as counted:
for md5 in ("a" * 32, "a" * 29):
self.assertEqual(cats.category({"name": "a.bin", "md5": md5}, "a.bin", "s"), BIOS)
for _ in range(2):
self.assertEqual(cats.category({"name": "a.bin", "md5": "a" * 32}, "a.bin", "s"), BIOS)
self.assertEqual(counted.call_count, 1)
self.assertTrue(candidates._accepts({"a" * 32}, {"md5": {"a" * 29}}))
# A cut md5 verifies nothing: Batocera compares the whole string.
self.assertFalse(candidates._accepts({"a" * 32}, {"md5": {"a" * 29}}))
self.assertFalse(candidates._accepts({"a" * 32}, {"md5": {"b" * 32}}))
class Category(unittest.TestCase):
@@ -242,8 +243,8 @@ class AProfileIsIndexedOncePerKind(unittest.TestCase):
def test_the_index_answers_as_the_scan_did(self):
cases = [
({"name": "one.bin", "md5": "2" * 32}, BIOS, [{"name": "one.bin", "source_ref": "a.c:3"}]),
# A cut md5 (Batocera's 29 characters) matches by prefix.
({"name": "x", "md5": "1" * 29}, BIOS, [{"name": "one.bin", "source_ref": "a.c:2"}]),
# A cut md5 proves nothing: hashes compare whole.
({"name": "x", "md5": "1" * 29}, BIOS, []),
({"name": "one.bin"}, BIOS, [
{"name": "one.bin", "source_ref": "a.c:2", "by": "name"},
{"name": "one.bin", "source_ref": "a.c:3", "by": "name"},
+30
View File
@@ -228,6 +228,36 @@ class LargeFileCacheTest(unittest.TestCase):
self.assertEqual(cached.read_bytes(), rebuilt)
self.assertEqual(len(gets), 1)
def test_an_orphan_link_is_never_returned(self):
"""A revision link whose cache name was removed has one link left.
Downloaded again with the same bytes, the old link was returned and
the prune of that same download removed it."""
self._serve(PAYLOAD_A, [])
sha1 = hashlib.sha1(PAYLOAD_A).hexdigest()
first = common.fetch_large_file("asset.bin", dest_dir=self.dir, expected_sha1=sha1)
self.assertTrue(first and os.path.isfile(first))
os.unlink(Path(self.dir) / "asset.bin")
with mock.patch.object(largefiles, "ORPHAN_GRACE", -1):
second = common.fetch_large_file(
"asset.bin", dest_dir=self.dir, expected_sha1=sha1
)
self.assertTrue(second and os.path.isfile(second))
self.assertTrue(os.path.samefile(second, Path(self.dir) / "asset.bin"))
def test_a_cache_hit_relinks_an_orphan(self):
"""The cache name was replaced by a copy with the same bytes: the hit
handed out the old link, which a prune elsewhere would remove."""
self._serve(PAYLOAD_A, [])
sha1 = hashlib.sha1(PAYLOAD_A).hexdigest()
common.fetch_large_file("asset.bin", dest_dir=self.dir, expected_sha1=sha1)
cached = Path(self.dir) / "asset.bin"
os.unlink(cached)
cached.write_bytes(PAYLOAD_A)
hit = common.fetch_large_file(
"asset.bin", dest_dir=self.dir, expected_sha1=sha1, offline=True
)
self.assertTrue(os.path.samefile(hit, cached))
def test_a_revision_the_release_still_serves_is_kept(self):
cached = Path(self.dir) / "asset.bin"
cached.write_bytes(PAYLOAD_A)
+44 -1
View File
@@ -6,11 +6,14 @@ names live in the platform's ``launchers:`` layer. Copied into a profile as
aliases, they claimed that xemu opens them, and xemu-libretro offers
Complex_4627_v1.03.bin, not Complex_4627v1.03.bin (ui/xemu-libretro.c:115-118).
Two checks read the committed data:
Three checks read the committed data:
- an alias equal to a name a launcher of the same emulator chooses is kept
only when the entry's own note or description names it in a sentence that
speaks of no platform, next to a ``source_ref`` into the emulator's code;
- an entry whose note names its own file only in sentences about a platform
is a launcher's choice: Mini vMac opens no MinivMacBootv2.dsk, the .cmd
Recalbox writes names it;
- no entry cites a platform's launcher script as its source.
"""
@@ -44,6 +47,13 @@ LAUNCHER_REF = re.compile(
r"\bemuDeck\w*\.sh\b|\bscriptmodules/|\(launcher\)",
)
# Entries whose name is the one a platform's launcher picks, kept because
# the code takes any name and the entry needs one.
NAMED_FOR_A_LAUNCHER = {
("pcsx_rearmed_standalone", "SCPH1001.BIN"):
"the code lists any 512 KiB file (frontend/menu.c:2619-2628)",
}
# Profiles whose entries still rest on a launcher, with the fact that blocks
# reading the emulator itself.
LAUNCHER_SOURCED = {
@@ -121,6 +131,39 @@ class ProfileAliasesAreCodeNames(unittest.TestCase):
"code, stated in the entry's note with its source_ref, or removed",
)
def test_an_entry_named_only_by_a_launcher_is_not_the_emulators(self) -> None:
launchers = _launcher_names()
offenders = []
for key, profile in _profiles().items():
emulator_names = {key} | {str(c) for c in profile.get("cores") or []}
for entry in profile.get("files") or []:
name = str(entry.get("name") or "").rsplit("/", 1)[-1]
if (key, name) in NAMED_FOR_A_LAUNCHER or not any(
emulator in emulator_names
for _platform, emulator in launchers.get(name.casefold(), ())
):
continue
prose = _text(entry.get("note")) + " " + _text(entry.get("description"))
if name in prose and not _named_without_platform(name, prose):
offenders.append(f"{key}: {name}")
self.assertEqual(
offenders, [],
"an entry whose own note names it only as a platform's choice "
"belongs to that platform's launchers: layer",
)
def test_rosalies_mupen_gui_names_stay_out_of_mupen64plus(self) -> None:
"""RetroBat's mupen64 generator configures Rosalie's Mupen GUI and
writes IPL_USA.n64 and IPL_DEV.n64 into its config
(Mupen64.Generator.cs:232-238). Mupen64Plus fixes no IPL name."""
profiles = _profiles()
for key in ("mupen64plus", "mupen64plus-ae", "m64plus-fz"):
aliases = {
str(a) for entry in profiles[key].get("files") or []
for a in entry.get("aliases") or []
}
self.assertFalse(aliases & {"IPL_USA.n64", "IPL_DEV.n64"}, key)
def test_check_catches_a_launcher_name(self) -> None:
self.assertFalse(_named_without_platform(
"cerbios.bin", "Batocera writes bios/cerbios.bin into flashrom_path.",
+127
View File
@@ -0,0 +1,127 @@
"""A name means the dump its declarations prove, not whatever is filed under it.
The collection files the DSi Panda (Japan) (Intense) devkit boot ROMs as
dsi_bios7.bin and dsi_bios9.bin. Their eMMC key-Y at 0x8308 is zeroed, so a
retail NAND cannot be opened with them. Every hash declared under those names
(Batocera's md5, melonDS's crc32) designates a retail dump in the same
directory, yet RetroBat and dsperate, which declare no hash, were served the
devkit ROMs by the name step.
"""
from __future__ import annotations
import tests # noqa: F401 offline, scratch under tmp/, the suite's own cache
import hashlib
import json
import os
import shutil
import sys
import tempfile
import unittest
import zlib
from pathlib import Path
REPO_ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(REPO_ROOT / "scripts"))
import generate_db # noqa: E402
from common import resolve_local_file # noqa: E402
DEVKIT = b"D" * 64
RETAIL = b"R" * 64
OTHER = b"O" * 64
def record(path: str, data: bytes) -> dict:
return {
"path": path,
"name": path.rsplit("/", 1)[-1],
"size": len(data),
"md5": hashlib.md5(data).hexdigest(),
"crc32": f"{zlib.crc32(data):08x}",
"sha256": hashlib.sha256(data).hexdigest(),
}
class ProvenNameIndex(unittest.TestCase):
def setUp(self):
self.files = {
hashlib.sha1(DEVKIT).hexdigest(): record("bios/N/DSi/dsi_bios7.bin", DEVKIT),
hashlib.sha1(RETAIL).hexdigest(): record("bios/N/DSi/biosdsi7.bin", RETAIL),
hashlib.sha1(OTHER).hexdigest(): record("bios/X/Y/other.bin", OTHER),
}
self.indexes = generate_db.build_indexes(self.files, {})
def index(self, declarations: list[dict]) -> dict:
return generate_db.proven_name_index(self.files, self.indexes, declarations)
def test_name_points_at_the_proven_dump_beside_it(self):
declared = [{"name": "dsi_bios7.bin", "md5": hashlib.md5(RETAIL).hexdigest()}]
self.assertEqual(
self.index(declared),
{"dsi_bios7.bin": [hashlib.sha1(RETAIL).hexdigest()]},
)
def test_a_proven_holder_keeps_its_name(self):
declared = [
{"name": "dsi_bios7.bin", "md5": hashlib.md5(RETAIL).hexdigest()},
{"name": "dsi_bios7.bin", "crc32": f"{zlib.crc32(DEVKIT):08x}"},
]
self.assertEqual(self.index(declared), {})
def test_a_dump_filed_elsewhere_proves_nothing(self):
declared = [{"name": "dsi_bios7.bin", "md5": hashlib.md5(OTHER).hexdigest()}]
self.assertEqual(self.index(declared), {})
def test_a_member_hash_proves_nothing(self):
declared = [{
"name": "dsi_bios7.bin",
"md5": hashlib.md5(RETAIL).hexdigest(),
"zipped_file": "x.bin",
}]
self.assertEqual(self.index(declared), {})
class HashlessEntryTakesTheProvenDump(unittest.TestCase):
def test_resolver_reads_the_index(self):
(REPO_ROOT / "tmp").mkdir(exist_ok=True)
root = Path(tempfile.mkdtemp(dir=REPO_ROOT / "tmp"))
self.addCleanup(shutil.rmtree, root, True)
previous = os.getcwd()
os.chdir(root)
self.addCleanup(os.chdir, previous)
Path("bios/N/DSi").mkdir(parents=True)
Path("bios/N/DSi/dsi_bios7.bin").write_bytes(DEVKIT)
Path("bios/N/DSi/biosdsi7.bin").write_bytes(RETAIL)
files = {
hashlib.sha1(DEVKIT).hexdigest(): record("bios/N/DSi/dsi_bios7.bin", DEVKIT),
hashlib.sha1(RETAIL).hexdigest(): record("bios/N/DSi/biosdsi7.bin", RETAIL),
}
indexes = generate_db.build_indexes(files, {})
db = {"files": files, "indexes": indexes}
entry = {"name": "dsi_bios7.bin", "size": 64}
self.assertEqual(
resolve_local_file(entry, db)[0], "bios/N/DSi/dsi_bios7.bin"
)
indexes["by_proven_name"] = generate_db.proven_name_index(
files, indexes,
[{"name": "dsi_bios7.bin", "md5": hashlib.md5(RETAIL).hexdigest()}],
)
self.assertEqual(
resolve_local_file(entry, db), ("bios/N/DSi/biosdsi7.bin", "name_exact")
)
class TheCollectionServesRetailRoms(unittest.TestCase):
def test_dsi_boot_roms(self):
db = json.loads((REPO_ROOT / "database.json").read_text())
index = db["indexes"].get("by_proven_name", {})
for name in ("dsi_bios7.bin", "dsi_bios9.bin"):
held = [db["files"][sha1]["path"] for sha1 in index.get(name, [])]
self.assertTrue(held, name)
self.assertFalse(any(path.endswith(f"/{name}") for path in held), held)
if __name__ == "__main__":
unittest.main()
+32
View File
@@ -100,5 +100,37 @@ class TheGroupTakesThePlatformSpelling(unittest.TestCase):
)
class ALosingClaimIsKeyedLikeTheWinner(unittest.TestCase):
"""RetroDECK writes its BIOS under bios/. The extra that won a path was
keyed bios/scph1002b.bin, the losing claims bare scph1002b.bin, so verify
--region never matched them against the drops and listed Rustation's
copies as packed while the builder had withdrawn them."""
def test_a_losing_claim_carries_the_declared_root(self):
import os
from common import declared_root, load_database, load_emulator_profiles
from common import load_platform_config
from packextras import platform_region_groups
previous = os.getcwd()
os.chdir(REPO_ROOT)
self.addCleanup(os.chdir, previous)
config = load_platform_config("retrodeck", "platforms")
root = declared_root(config)
self.assertTrue(root)
_groups, claims = platform_region_groups(
config, config["systems"], "emulators", load_database("database.json"),
config.get("base_destination", ""), load_emulator_profiles("emulators"),
)
rustation = {
name: dest for (emulator, name, _path), dest in claims.items()
if emulator == "Rustation" and name.startswith("scph")
}
self.assertTrue(rustation)
for name, dest in rustation.items():
self.assertEqual(dest, f"{root}/{name}")
if __name__ == "__main__":
unittest.main()
+60 -3
View File
@@ -43,9 +43,66 @@ class ARefusedDumpHoldsNothing(unittest.TestCase):
"by_path_suffix": {}},
}
entry = {"name": "us.bin", "md5": "0" * 32}
self.assertFalse(_ships({"verification_mode": "md5"}, entry, db))
self.assertTrue(_ships({"verification_mode": "existence"}, entry, db))
self.assertTrue(_ships({"verification_mode": "md5"}, {"name": "us.bin"}, db))
def ships(config: dict, fe: dict) -> bool:
return _ships(config, fe, db, None, None, None)
self.assertFalse(ships({"verification_mode": "md5"}, entry))
self.assertTrue(ships({"verification_mode": "existence"}, entry))
self.assertTrue(ships({"verification_mode": "md5"}, {"name": "us.bin"}))
class ADataDirectoryCopyIsHeld(unittest.TestCase):
"""The region pass resolves with the builder's inputs.
Without the data directories, AmberELEC's config.ini (served from the
bluemsx tree) and dolphin-mmjr2's nwc24msg.cfg (served from the Dolphin
Sys tree) read as missing while both packs held them.
"""
@classmethod
def setUpClass(cls):
if not (REPO_ROOT / "data" / "bluemsx").is_dir() or not (
REPO_ROOT / "data" / "dolphin-sys"
).is_dir():
raise unittest.SkipTest("data/ not refreshed")
previous = os.getcwd()
os.chdir(REPO_ROOT)
try:
from common import load_data_dir_registry, load_database
from common import load_emulator_profiles, load_platform_config
cls.db = load_database("database.json")
cls.registry = load_data_dir_registry("platforms")
cls.profiles = load_emulator_profiles("emulators")
cls.amberelec = load_platform_config("amberelec", "platforms")
finally:
os.chdir(previous)
def setUp(self):
previous = os.getcwd()
os.chdir(REPO_ROOT)
self.addCleanup(os.chdir, previous)
def test_platform_declaration_from_a_data_tree(self):
entry = next(
fe for fe in self.amberelec["systems"]["coleco-colecovision"]["files"]
if fe["destination"].endswith("Dina/config.ini")
)
self.assertTrue(
_ships(self.amberelec, entry, self.db, {}, self.registry, None)
)
def test_emulator_entry_from_a_data_tree(self):
from packextras import _emulator_ships
from validation import _build_validation_index
profile = self.profiles["dolphin-mmjr2"]
entry = next(
fe for fe in profile["files"] if fe.get("name") == "nwc24msg.cfg"
)
index = _build_validation_index({"dolphin-mmjr2": profile})
self.assertTrue(_emulator_ships(
entry, "dolphin-mmjr2", profile, self.db, index, {}, self.registry,
))
if __name__ == "__main__":
+14 -1
View File
@@ -443,7 +443,8 @@ class PackNamesItsVersion(unittest.TestCase):
if not release_record.pack_for("batocera", record):
self.skipTest("release.json has no Batocera pack")
block = generate_site._pack_buttons("batocera")
version = generate_site._pack_version(release_record.pack_name_for("batocera", record))
name = release_record.pack_name_for("batocera", record)
version = generate_site._pack_version(name, ["batocera"])
self.assertIn(f"Made for Batocera {version}. "
+ generate_site.other_version("batocera"), block)
@@ -454,6 +455,18 @@ class PackNamesItsVersion(unittest.TestCase):
line = generate_site.version_line("retrobat", record, named=len(released) > 1)
self.assertEqual(line, generate_site.other_version("retrobat"))
def test_a_version_with_an_underscore_is_read_whole(self):
"""AmberELEC's prerelease-20261019_1835 read as 1835, and the page
said the pack was built for another version."""
from generate_pack import _platform_pack_stem
version = load_platform_config("amberelec", "platforms")["version"]
name = _platform_pack_stem(["amberelec"], "amberelec", "platforms") + "_BIOS_Pack.zip"
self.assertEqual(generate_site._pack_version(name, ["amberelec"]), version)
record = {"tag": "v2026.10.10", "packs": {name: {
"assets": [name], "platforms": ["amberelec"]}}}
self.assertEqual(len(generate_site.release_line("amberelec", record)), 1)
def test_another_version_is_sent_to_the_check_commands(self):
"""A ZIP reader read "Run `--check` after copying." with no command."""
line = generate_site.other_version("emudeck")
+2 -1
View File
@@ -547,7 +547,8 @@ class AFolderCheckAgreesWithTheVerifier(unittest.TestCase):
for entry in contract["systems"]["s"]["files"]
]
self.assertEqual(found, expected)
self.assertEqual([v for _d, v in found], ["ok", "wrong", "ok", "wrong", "ok", "missing"])
# plain.bin declares a cut md5: Batocera compares the whole string.
self.assertEqual([v for _d, v in found], ["ok", "wrong", "wrong", "wrong", "ok", "missing"])
def test_batocera_from_the_csv_matches_the_verifier(self):
"""A check driven by platform-files.csv, with zipped_file, gives the
+36
View File
@@ -994,6 +994,42 @@ class TwoPathsHoldingOneContentAgree(unittest.TestCase):
self.assertFalse(slots._satisfies(different, platform, db))
class ACopierHeaderIsNotAnotherImage(unittest.TestCase):
"""Geargrafx drops a 512-byte header before the crc32 (src/media.cpp:
754-773). EmuELEC's headered syscard3.pce was reported contested, though
the core reads it as the 6d9a73ef image its profile lists."""
def test_headered_file_satisfies_the_profile(self):
import zlib # noqa: PLC0415
image = b"S" * 1024
with tempfile.TemporaryDirectory() as tmp:
headered = Path(tmp, "headered.pce")
headered.write_bytes(b"\0" * 512 + image)
plain = Path(tmp, "plain.pce")
plain.write_bytes(image)
crc = f"{zlib.crc32(image):08x}"
db = {"files": {
"a" * 40: {"path": str(headered), "size": 1536,
"crc32": f"{zlib.crc32(headered.read_bytes()):08x}"},
"b" * 40: {"path": str(plain), "size": 1024, "crc32": crc},
}}
platform = Claim("platform", "syscard3.pce", "syscard3.pce",
local_path=str(headered), status="md5_exact")
profile = Claim(
"profile", "syscard3.pce", "syscard3.pce", emulator="geargrafx",
local_path=str(plain), status="crc32_exact",
entry={"name": "syscard3.pce", "crc32": [crc], "size": [1024, 1536]},
)
self.assertTrue(slots._satisfies(profile, platform, db))
one_size = Claim(
"profile", "syscard3.pce", "syscard3.pce", emulator="geargrafx",
local_path=str(plain), status="crc32_exact",
entry={"name": "syscard3.pce", "crc32": [crc], "size": 1024},
)
self.assertFalse(slots._satisfies(one_size, platform, db))
class TheSlotsSummaryClosesTheRun(unittest.TestCase):
"""The totals came before the collision section and ignored it, and the
help said the default run fails on conflicts the pack should settle,
+2 -2
View File
@@ -232,8 +232,8 @@ System ID consistency matters for cross-platform operations. The same console mu
are available.
- An MD5 shorter than 32 characters is completed when exactly one MD5 in
`database.json` starts with it, as the Batocera scraper does
(`_resolve_truncated_md5`), and kept as written otherwise. The resolution layer
matches what remains by prefix.
(`_resolve_truncated_md5`, through `cut_md5_owner`), and kept as written
otherwise. A value kept short verifies nothing.
Scraped data reflects what the upstream declares, which can differ from what the emulator source reads. The scraper's job is faithful transcription of upstream data, not correction. Corrections happen in the emulator profiles (source-verified) and in `_shared.yml` (curated). If a scraper meets a hash or filename that differs from the emulator source, log a warning and still include the upstream value. The divergence will surface during truth diffing.
+5
View File
@@ -144,6 +144,11 @@ Three rules keep a filtered pack usable:
- **Untagged files always survive.** Most BIOS are not regional and carry no
`region:` at all.
Regions, the search order `--one-per-slot` reads and the game data
`--no-game-data` cuts all come from the profiles of the cores a platform runs.
MiSTer and BizHawk declare no cores, their own databases decide, so the three
flags are refused for them. Under `--all` they are left out with a notice.
What this does and does not do: it shrinks the pack. It does not change how cores
pick a BIOS. Most cores already select per region from fixed filename lists driven
by the game's region (PicoDrive in `libretro.c`, Genesis Plus GX in `loadrom.c`),
+8 -1
View File
@@ -102,7 +102,8 @@ Upstream sources Scrapers parse generate_db.py scans
es_bios.xml (recalbox) (SHA1 primary key,
core-info .info files indexes: by_md5, by_name,
FirmwareDatabase.cs by_crc32, by_sha256, by_path_suffix,
by_shadowed_alias)
by_shadowed_alias,
by_proven_name)
bios_db.json.zip (MiSTer)
MAME/FBNeo source
@@ -427,6 +428,12 @@ profile aliases a primary's name keeps out of `by_name` (`by_shadowed_alias`)
answer, within that maker's folder: AmberELEC's `nec-pc-88` `DISK.ROM` is QUASI88's
`n88sub.rom`, not the MSX disk ROM.
A name whose held file no declaration proves by hash, while declarations of that
name prove another dump in the same directory, answers with that dump
(`by_proven_name`). The collection files the DSi Panda devkit boot ROMs as
`dsi_bios7.bin` and `dsi_bios9.bin`, and every hash declared under those names
designates a retail dump beside them.
## Platform inheritance
Platform configs support `inherits:` to share definitions.
+16 -16
View File
@@ -410,13 +410,13 @@ A RetroArch dry run into an empty folder, with the list of 2026-11-06, printed t
```
Fetching file index for retroarch...
106 files read from RetroArch's save directory go to a folder per core under /home/me/.config/retroarch/saves
14930 files (6.7 GB)
3260 BIOS files (4.1 GB), 5089 game data files (2.5 GB) and 6581 data files (135.5 MB).
14929 files (6.7 GB)
3259 BIOS files (4.1 GB), 5089 game data files (2.5 GB) and 6581 data files (135.5 MB).
Game data: files a game or a game engine reads, of no use to the other cores. Data files: the files an emulator reads from a data folder of its own, such as Dolphin's Sys and PPSSPP's assets.
Not installable: 37 files are not in the collection, 2 of them required.
Checking existing files...
0 in place, 14930 missing, 0 wrong copies
0 in place, 14929 missing, 0 wrong copies
```
<!-- /generated: dry-run -->
@@ -475,13 +475,13 @@ few minutes on a memory card, because every file is hashed:
```
Fetching file index for batocera...
23 files read from Batocera's save directory go to a folder per system under /userdata/saves
18171 files (9.3 GB)
3155 BIOS files (4.4 GB), 11544 game data files (4.8 GB) and 3472 data files (81.8 MB).
18170 files (9.2 GB)
3154 BIOS files (4.3 GB), 11544 game data files (4.8 GB) and 3472 data files (81.8 MB).
Game data: files a game or a game engine reads, of no use to the other cores. Data files: the files an emulator reads from a data folder of its own, such as Dolphin's Sys and PPSSPP's assets.
Not installable: 426 files are not in the collection, 80 of them required.
Checking existing files...
0 in place, 18171 missing, 0 wrong copies
0 in place, 18170 missing, 0 wrong copies
```
<!-- /generated: run-index -->
@@ -496,10 +496,10 @@ as the log of the run below:
<!-- generated: run-download -->
```
Downloading 14699 files (9.2 GB)...
Downloading 14698 files (9.2 GB)...
Press Ctrl+C to stop. Running the same command again carries on from here.
[1/14699] panafz1.bin ok
[2/14699] panafz10.bin ok
[1/14698] panafz1.bin ok
[2/14698] panafz10.bin ok
```
<!-- /generated: run-download -->
@@ -511,8 +511,8 @@ command again picks up where it stopped.
<!-- generated: run-end -->
```
Done. 18171 files installed.
Installed: 3155 BIOS files, 11544 game data files and 3472 data files.
Done. 18170 files installed.
Installed: 3154 BIOS files, 11544 game data files and 3472 data files.
BIOS folder: /userdata/bios
426 files were not installed: the collection does not hold them, or its copy fails their check.
Needed to start an emulator (1 file):
@@ -566,7 +566,7 @@ The same command with `--check` reads the folder and writes nothing:
```
Checking existing files...
18171 in place, 0 missing, 0 wrong copies
18170 in place, 0 missing, 0 wrong copies
Everything is in place.
```
@@ -760,8 +760,8 @@ by `scripts/generate_installer_doc.py`):
<!-- generated: line-menu -->
```
RetroArch: 14930 files, 6.7 GB.
3260 BIOS files (4.1 GB), 5089 game data files (2.5 GB) and 6581 data files (135.5 MB).
RetroArch: 14929 files, 6.7 GB.
3259 BIOS files (4.1 GB), 5089 game data files (2.5 GB) and 6581 data files (135.5 MB).
Game data: files a game or a game engine reads, of no use to the other cores. Data files: the files an emulator reads from a data folder of its own, such as Dolphin's Sys and PPSSPP's assets.
BIOS folder: /home/me/.config/retroarch/system
Not available here, and needed to start its emulator: sfiii2a.zip (Capcom Cps3). Your own copy goes in the BIOS folder.
@@ -775,8 +775,8 @@ RetroArch: 14930 files, 6.7 GB.
Counted again for your choices. Nothing is written before Enter.
RetroArch: 9841 files, 4.2 GB.
3260 BIOS files (4.1 GB) and 6581 data files (135.5 MB). 5089 game data files left out.
RetroArch: 9840 files, 4.2 GB.
3259 BIOS files (4.1 GB) and 6581 data files (135.5 MB). 5089 game data files left out.
Game data: files a game or a game engine reads, of no use to the other cores. Data files: the files an emulator reads from a data folder of its own, such as Dolphin's Sys and PPSSPP's assets.
BIOS folder: /home/me/.config/retroarch/system
Not available here, and needed to start its emulator: sfiii2a.zip (Capcom Cps3). Your own copy goes in the BIOS folder.
+1 -1
View File
@@ -107,7 +107,7 @@ RetroDECK: 2007/2008 OK, 1 untested [md5]
UNTESTED (required): nintendo-ds/dsifirmware.bin: declared hash contradicted by the local file
DISCREPANCY: nintendo-snes/sgb2.boot.rom: RetroDECK says OK but supersnes9x says size mismatch: got 524288, accepted [256]
supersnes9x [size]
Core files: 1764 in pack, 1 required missing, 26 optional missing (--verbose lists them)
Core files: 1763 in pack, 1 required missing, 26 optional missing (--verbose lists them)
Core files held but not packed: 154 (142 installed with its emulator, 8 read below a save folder per system and no system runs the core there, 4 a packed file occupies its directory)
MISSING (required): FinalBurn Neo needs sfiii2a.zip (1 file)
Bundled with their emulator, not collected: 20 (--verbose lists them)
+1 -1
View File
@@ -54,7 +54,7 @@ Every module in `tests/`, by the area it guards.
| Area | Fixtures | Modules |
|------|----------|---------|
| Core regression suites | synthetic | `test_e2e`, `test_audit_regressions`, `test_tool_messages` |
| File resolution and identity | synthetic + collection | `test_adler32_resolution`, `test_agnostic_scan`, `test_agnostic_scan_mode`, `test_agnostic_scope`, `test_agnostic_substitute`, `test_archive_build`, `test_archive_choice`, `test_archive_recipes`, `test_bios_companions`, `test_bundled_identity`, `test_casefold_cache`, `test_db_aliases`, `test_declared_names`, `test_derivations`, `test_directory_entries`, `test_extra_identity`, `test_foreign_tree`, `test_foreign_tree_names`, `test_frontend_digest`, `test_game_data_homonyms`, `test_hashing`, `test_identity`, `test_maker_folder_names`, `test_md5_pack_context`, `test_name_tiebreak`, `test_nec_filing`, `test_np2_fonts`, `test_owner_resolution`, `test_path_suffix`, `test_resolution_evidence`, `test_sega_filing`, `test_shipped_content`, `test_twin_declaration_status`, `test_twin_declarations`, `test_validated_choice`, `test_variant_choice`, `test_variant_identity`, `test_zipped_member` |
| File resolution and identity | synthetic + collection | `test_adler32_resolution`, `test_agnostic_scan`, `test_agnostic_scan_mode`, `test_agnostic_scope`, `test_agnostic_substitute`, `test_archive_build`, `test_archive_choice`, `test_archive_recipes`, `test_bios_companions`, `test_bundled_identity`, `test_casefold_cache`, `test_db_aliases`, `test_declared_names`, `test_derivations`, `test_directory_entries`, `test_extra_identity`, `test_foreign_tree`, `test_foreign_tree_names`, `test_frontend_digest`, `test_game_data_homonyms`, `test_hashing`, `test_identity`, `test_maker_folder_names`, `test_md5_pack_context`, `test_name_tiebreak`, `test_nec_filing`, `test_np2_fonts`, `test_owner_resolution`, `test_path_suffix`, `test_proven_name`, `test_resolution_evidence`, `test_sega_filing`, `test_shipped_content`, `test_twin_declaration_status`, `test_twin_declarations`, `test_validated_choice`, `test_variant_choice`, `test_variant_identity`, `test_zipped_member` |
| Verification, cross-reference and profile checks | synthetic + profiles | `test_bios_layout`, `test_cache_independent_counts`, `test_case_insensitive_platforms`, `test_checks_have_values`, `test_core_file_fills_declaration`, `test_core_size_refusal`, `test_cross_reference_sources`, `test_crypto_aes`, `test_crypto_unique_data`, `test_crypto_verify`, `test_entry_categories`, `test_file_consumers`, `test_fileless_audit`, `test_flycast_layout`, `test_gap_settlement`, `test_hidden_extras`, `test_launcher_aliases`, `test_launcher_layer`, `test_native_mode`, `test_no_case_collisions`, `test_path_conflict_status`, `test_path_null_copies`, `test_profile_checks`, `test_profile_names`, `test_profile_paths`, `test_profile_repositories`, `test_romm_hash_rule`, `test_shared_groups`, `test_standalone_links`, `test_standalone_mode`, `test_undeclared_dedup`, `test_unplaced_extras`, `test_validation_scope`, `test_verify_all_dir`, `test_verify_data_dir_notice`, `test_verify_emulator_evidence`, `test_verify_listing`, `test_verify_pack_choice`, `test_verify_release_asset` |
| Packs and manifests | synthetic + real packs | `test_artifact_lock`, `test_atomic_artifacts`, `test_batocera_cores`, `test_core_data_trees`, `test_deterministic_zip`, `test_emulator_pack_counts`, `test_finalize_pack_names`, `test_large_file_cache`, `test_libretro_layout`, `test_manifest_entry`, `test_minui_platform`, `test_no_game_data`, `test_pack_conformance_dirs`, `test_pack_core_extras`, `test_pack_counts`, `test_pack_destinations`, `test_pack_failures`, `test_pack_file_names`, `test_pack_grouping`, `test_pack_integrity`, `test_pack_member_identity`, `test_pack_readme`, `test_platform_inheritance`, `test_platform_keys`, `test_release_packs`, `test_required_only_archives`, `test_required_only_twins`, `test_save_root`, `test_split_extras`, `test_split_names`, `test_split_pack`, `test_system_pack_extras`, `test_system_pack_parity`, `test_torrentzip`, `test_which_pack` |
| Slots and regions | synthetic + profiles | `test_region`, `test_region_agnostic_scan`, `test_region_groups`, `test_region_held`, `test_region_platform_index`, `test_region_required_only`, `test_slot`, `test_slots`, `test_slots_shipped_file` |
+10 -2
View File
@@ -88,8 +88,10 @@ Batocera's script compares the full string ([`batocera-systems:1088`](https://gi
shorter than 32 characters matches no file there. The Batocera scraper completes such
a value when exactly one MD5 in `database.json` starts with it
(`_resolve_truncated_md5` in `scripts/scraper/batocera_scraper.py`) and keeps it as
written otherwise. `resolve_local_file` matches a value still shorter than 32
characters by prefix, and only for a file whose name the entry also names.
written otherwise. `resolve_local_file` and `--from-md5` read a value still shorter
than 32 characters by the same rule (`cut_md5_owner` in `scripts/hashing.py`), and the
resolver keeps the file only when its name is one the entry names. Every verdict
compares whole digests, as Batocera does: a cut value never verifies a file.
### md5_composite (Recalbox ZIP verification)
@@ -398,6 +400,12 @@ by name. QUASI88 reads that name as `n88sub.rom`, the 2 KB PC-88 disk ROM, and
that is now the file served. An entry that names its emulator is placed by that
emulator's tree instead.
Step 6 reads a name through `by_proven_name` first. A name lands there when no
declaration of it proves the held file by hash, while declarations of it prove
another primary in the same directory. `dsi_bios7.bin` holds the DSi Panda devkit
boot ROM, whose eMMC key-Y is zeroed, and every md5 and crc32 declared under that
name designates a retail dump: an entry with no hash gets the retail ROM.
The `hash_mismatch` status means a file with the right name or path exists but its hash
does not match. This still resolves to a local path (the file is present), but verification
will report it as UNTESTED with a reason string showing the expected vs actual hash prefix.