mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-11-11 12:33:53 -06:00
chore: merge pack and resolver fixes
This commit is contained in:
commit
70f530516d
66 files changed
+1294
-786
No files matched your search
@@ -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
|
||||
```
|
||||
|
||||

|
||||
|
||||
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
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
@@ -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.
|
||||
@@ -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]
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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 @@
|
||||
{"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 @@
|
||||
{"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 @@
|
||||
{"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 @@
|
||||
{"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 @@
|
||||
{"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 @@
|
||||
{"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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -117,6 +117,9 @@
|
||||
},
|
||||
"by_shadowed_alias": {
|
||||
"$ref": "#/$defs/listIndex"
|
||||
},
|
||||
"by_proven_name": {
|
||||
"$ref": "#/$defs/listIndex"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
@@ -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,
|
||||
)
|
||||
|
||||
@@ -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()
|
||||
)
|
||||
|
||||
|
||||
@@ -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, ())}
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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')}"
|
||||
|
||||
@@ -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
@@ -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
@@ -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},
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"},
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.",
|
||||
|
||||
@@ -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()
|
||||
@@ -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()
|
||||
@@ -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__":
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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`),
|
||||
|
||||
@@ -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
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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` |
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in new issue
Block a user