9 Commits

Author SHA1 Message Date
Abdessamad Derraz
5ee81b30c6 feat: add contributor credits to pack readme 2026-04-02 11:43:06 +02:00
Abdessamad Derraz
b5eae226cd feat: enrich readme contributors with platform attribution 2026-04-02 11:42:40 +02:00
Abdessamad Derraz
fd4606885e feat: add contributor credit to site platform pages 2026-04-02 11:42:31 +02:00
Abdessamad Derraz
ded903ed7a feat: add contributed_by field to retrodeck and romm 2026-04-02 11:41:19 +02:00
Abdessamad Derraz
077392bcd9 docs: add contributor attribution to romm and retrodeck scrapers 2026-04-02 11:41:15 +02:00
Abdessamad Derraz
f4626ce3bd Add MSX2J ROM and update manifests
Add MSX2J.rom (sha1: 0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd, size: 32768) to multiple install manifests and the RetroDECK bios list. Update generated timestamps and adjust total_files/total_size counts in batocera, lakka, recalbox, retroarch, retrobat, and retrodeck manifests. Also bump README verified file count and regenerate the auto-generated timestamp to reflect the new entry.
2026-04-02 10:44:25 +02:00
Abdessamad Derraz
9e184f76fc fix: swanstation ps1_rom.bin accepts multiple sizes
SwanStation accepts PS1 (512KB), PS2 (4MB), and PS3 (0x3E66F0)
BIOS sizes but only uses the first 512KB. MD5 validates the
extracted content, not the full file. List all accepted sizes
to eliminate the false size mismatch discrepancy.

validation.py: support size as list in emulator profiles.
generate_site.py: handle list sizes in emulator page display.

All 18 original hash mismatches are now resolved: 0 discrepancies.
2026-04-02 07:39:30 +02:00
Abdessamad Derraz
fa0ed63718 fix: add psx variant mappings, fix emulator verify path
scph3000.bin v2.1J and scph3500.bin v2.2J already existed under
different primary names (scph3500.bin and scph5000.bin respectively).
Add .variants/ entries so by_name resolves both filenames.

verify_single_emulator now calls _find_best_variant on hash mismatch,
matching the platform-level verification path.
2026-04-02 01:24:24 +02:00
Abdessamad Derraz
c3fa55bd46 feat: add msx2 japanese bios variant for ares
Source: Subtixx/RetroStation MSX2J.rom
SHA256 0c672d86 matches ares desktop-ui/emulator/msx2.cpp:15.
Resolves last MSX2.ROM discrepancy across all platforms.
2026-04-02 01:12:36 +02:00
20 changed files with 347 additions and 90 deletions

View File

@@ -2,7 +2,7 @@
Complete BIOS and firmware packs for Batocera, BizHawk, EmuDeck, Lakka, Recalbox, RetroArch, RetroBat, RetroDECK, RetroPie, and RomM.
**7,295** verified files across **396** systems, ready to extract into your emulator's BIOS directory.
**7,296** verified files across **396** systems, ready to extract into your emulator's BIOS directory.
## Quick Install
@@ -46,7 +46,7 @@ Each file is checked against the emulator's source code to match what the code a
- **10 platforms** supported with platform-specific verification
- **329 emulators** profiled from source (RetroArch cores + standalone)
- **396 systems** covered (NES, SNES, PlayStation, Saturn, Dreamcast, ...)
- **7,295 files** verified with MD5, SHA1, CRC32 checksums
- **7,296 files** verified with MD5, SHA1, CRC32 checksums
- **8765 MB** total collection size
## Supported systems
@@ -130,4 +130,4 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
This repository provides BIOS files for personal backup and archival purposes.
*Auto-generated on 2026-03-31T20:38:37Z*
*Auto-generated on 2026-04-02T05:33:10Z*

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,7 +1,7 @@
{
"generated_at": "2026-04-01T22:48:55Z",
"total_files": 7295,
"total_size": 9190294264,
"generated_at": "2026-04-01T23:11:49Z",
"total_files": 7296,
"total_size": 9190327032,
"files": {
"520d3d1b5897800af47f92efd2444a26b7a7dead": {
"path": "bios/3DO Company/3DO/3do_arcade_saot.bin",
@@ -35053,6 +35053,16 @@
"crc32": "a317e6b4",
"adler32": "0e7344db"
},
"0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd": {
"path": "bios/Microsoft/MSX/.variants/MSX2.ROM.0081ea0d",
"name": "MSX2.ROM",
"size": 32768,
"sha1": "0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd",
"md5": "53bec1c22b30c0a15263e04b91a7814f",
"sha256": "0c672d86ead61a97f49a583b88b7c1905da120645cd44f0c9f2baf4f4631e0b1",
"crc32": "9b3e7b97",
"adler32": "1ce46674"
},
"e90f80a61d94c617850c415e12ad70ac41e66bb7": {
"path": "bios/Microsoft/MSX/.variants/MSX2P.ROM.e90f80a6",
"name": "MSX2P.ROM",
@@ -69813,6 +69823,26 @@
"crc32": "6a0e22a0",
"adler32": "46021520"
},
"e38466a4ba8005fba7e9e3c7b9efeba7205bee3f": {
"path": "bios/Sony/PlayStation/scph3500.bin",
"name": "scph3500.bin",
"size": 524288,
"sha1": "e38466a4ba8005fba7e9e3c7b9efeba7205bee3f",
"md5": "cba733ceeff5aef5c32254f1d617fa62",
"sha256": "6f71ca1e716da761dc53187bd39e00c213f566e55090708fd3e2b4b425c8c989",
"crc32": "bc190209",
"adler32": "a8e56981"
},
"ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d": {
"path": "bios/Sony/PlayStation/scph5000.bin",
"name": "scph5000.bin",
"size": 524288,
"sha1": "ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d",
"md5": "57a06303dfa9cf9351222dfcbb4a29d9",
"sha256": "0c8359870cbac0ea091f1c87f188cd332dcc709753b91cafd9fd44a4a6188197",
"crc32": "24fc7e17",
"adler32": "1ac46cf1"
},
"e340db2696274dda5fdc25e434a914db71e8b02b": {
"path": "bios/Sony/PlayStation/.variants/scph5000.bin.eb201d2d",
"name": "scph5000.bin",
@@ -70013,26 +70043,6 @@
"crc32": "3539def6",
"adler32": "9e7d4faa"
},
"e38466a4ba8005fba7e9e3c7b9efeba7205bee3f": {
"path": "bios/Sony/PlayStation/scph3500.bin",
"name": "scph3500.bin",
"size": 524288,
"sha1": "e38466a4ba8005fba7e9e3c7b9efeba7205bee3f",
"md5": "cba733ceeff5aef5c32254f1d617fa62",
"sha256": "6f71ca1e716da761dc53187bd39e00c213f566e55090708fd3e2b4b425c8c989",
"crc32": "bc190209",
"adler32": "a8e56981"
},
"ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d": {
"path": "bios/Sony/PlayStation/scph5000.bin",
"name": "scph5000.bin",
"size": 524288,
"sha1": "ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d",
"md5": "57a06303dfa9cf9351222dfcbb4a29d9",
"sha256": "0c8359870cbac0ea091f1c87f188cd332dcc709753b91cafd9fd44a4a6188197",
"crc32": "24fc7e17",
"adler32": "1ac46cf1"
},
"b05def971d8ec59f346f2d9ac21fb742e3eb6917": {
"path": "bios/Sony/PlayStation/scph5500.bin",
"name": "scph5500.bin",
@@ -76461,6 +76471,7 @@
"74b0f217fa0e2b8bb5a2f8e2ecc69da3": "bf5fb954db868e523febccc68549ed9187961076",
"acf53887c2d2783dc059a9b442c86b90": "5aff2d9b6efc723bc395b0f96f0adfa83cc54a49",
"364a1a579fe5cb8dba54519bcfcdac0d": "e998f0c441f4f1800ef44e42cd1659150206cf79",
"53bec1c22b30c0a15263e04b91a7814f": "0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd",
"847cc025ffae665487940ff2639540e5": "e90f80a61d94c617850c415e12ad70ac41e66bb7",
"55cca200bbbdd0a1ec5c9d70966c05c0": "4e9384c9d137f0ab65ffc5a78f04cd8c9df6c8b7",
"d6dedca1112ddfda94cc9b2e426b818b": "69dd7344e4dfa7e250973a71bbb3e8aa6fb08d81",
@@ -79937,6 +79948,8 @@
"dc2b9bf8da62ec93e868cfd29f0d067d": "649895efd79d14790eabb362e94eb0622093dfb9",
"e2110b8a2b97a8e0b857a45d32f7e187": "b6a11579caef3875504fcf3831b8e3922746df2c",
"9a09ab7e49b422c007e6d54d7c49b965": "7771d6e90980408f753891648685def6dd42ef6d",
"cba733ceeff5aef5c32254f1d617fa62": "e38466a4ba8005fba7e9e3c7b9efeba7205bee3f",
"57a06303dfa9cf9351222dfcbb4a29d9": "ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d",
"eb201d2d98251a598af467d4347bb62f": "e340db2696274dda5fdc25e434a914db71e8b02b",
"2118230527a9f51bd9216e32fa912842": "1a8d6f9453111b1d317bb7dae300495fbf54600c",
"ca5cfc321f916756e3f0effbfaeba13b": "73107d468fc7cb1d2c5b18b269715dd889ecef06",
@@ -79957,8 +79970,6 @@
"b10f5e0e3d9eb60e5159690680b1e774": "beb0ac693c0dc26daf5665b3314db81480fa5c7c",
"de93caec13d1a141a40a79f5c86168d6": "dbc7339e5d85827c095764fc077b41f78fd2ecae",
"849515939161e62f6b866f6853006780": "b06f4a861f74270be819aa2a07db8d0563a7cc4e",
"cba733ceeff5aef5c32254f1d617fa62": "e38466a4ba8005fba7e9e3c7b9efeba7205bee3f",
"57a06303dfa9cf9351222dfcbb4a29d9": "ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d",
"8dd7d5296a650fac7319bce665a6a53c": "b05def971d8ec59f346f2d9ac21fb742e3eb6917",
"490f666e1afb15b7362b406ed1cea246": "0555c6fae8906f3f09baf5988f00e55f88e9f30b",
"32736f17079d0b2b7024407c39bd3050": "f6bc2d1f5eb6593de7d089c425ac681d6fffd3f0",
@@ -90267,6 +90278,10 @@
"MSX_8020-20bios.rom": [
"e998f0c441f4f1800ef44e42cd1659150206cf79"
],
"MSX2.ROM": [
"0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd",
"6103b39f1e38d1aa2d84b1c3219c44f1abb5436e"
],
"MSX2P.ROM": [
"e90f80a61d94c617850c415e12ad70ac41e66bb7",
"e2fbd56e42da637609d23ae9df9efd1b4241b18a"
@@ -90344,9 +90359,6 @@
"409e82adac40f6bdd18eb6c84e8b2fbdc7fb5498",
"e998f0c441f4f1800ef44e42cd1659150206cf79"
],
"MSX2.ROM": [
"6103b39f1e38d1aa2d84b1c3219c44f1abb5436e"
],
"MSX2EXT.ROM": [
"5c1f9c7fb655e43d38e5dd1fcc6b942b2ff68b02"
],
@@ -99662,10 +99674,14 @@
"scph101_v44.bin": [
"7771d6e90980408f753891648685def6dd42ef6d"
],
"scph5000.bin": [
"e340db2696274dda5fdc25e434a914db71e8b02b",
"scph3500.bin": [
"e38466a4ba8005fba7e9e3c7b9efeba7205bee3f",
"ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d"
],
"scph5000.bin": [
"ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d",
"e340db2696274dda5fdc25e434a914db71e8b02b"
],
"PSX_DTLH2000.bin": [
"1a8d6f9453111b1d317bb7dae300495fbf54600c"
],
@@ -99721,9 +99737,7 @@
"dbc7339e5d85827c095764fc077b41f78fd2ecae"
],
"scph3000.bin": [
"b06f4a861f74270be819aa2a07db8d0563a7cc4e"
],
"scph3500.bin": [
"b06f4a861f74270be819aa2a07db8d0563a7cc4e",
"e38466a4ba8005fba7e9e3c7b9efeba7205bee3f"
],
"scph5500.bin": [
@@ -102655,6 +102669,12 @@
"scph102C.bin": [
"dbc7339e5d85827c095764fc077b41f78fd2ecae"
],
"sony-playstation:cba733ceeff5aef5c32254f1d617fa62": [
"e38466a4ba8005fba7e9e3c7b9efeba7205bee3f"
],
"sony-playstation:57a06303dfa9cf9351222dfcbb4a29d9": [
"ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d"
],
"scph5001.bin": [
"ca7af30b50d9756cbd764640126c454cff658479"
],
@@ -103225,12 +103245,6 @@
"sony-playstation:239665b1a3dade1b5a52c06338011044": [
"343883a7b555646da8cee54aadd2795b6e7dd070"
],
"sony-playstation:cba733ceeff5aef5c32254f1d617fa62": [
"e38466a4ba8005fba7e9e3c7b9efeba7205bee3f"
],
"sony-playstation:57a06303dfa9cf9351222dfcbb4a29d9": [
"ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d"
],
"sony-playstation:81328b966e6dcf7ea1e32e55e1c104bb": [
"15c94da3cc5a38a582429575af4198c487fe893c"
],
@@ -103384,6 +103398,9 @@
"MOONSOUND.rom": [
"32760893ce06dbe3930627755ba065cc3d8ec6ca"
],
"MSX2J.rom": [
"0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd"
],
"MSX2P.rom": [
"e90f80a61d94c617850c415e12ad70ac41e66bb7"
],
@@ -107708,6 +107725,7 @@
"d42f4444": "bf5fb954db868e523febccc68549ed9187961076",
"1f6406fb": "5aff2d9b6efc723bc395b0f96f0adfa83cc54a49",
"a317e6b4": "e998f0c441f4f1800ef44e42cd1659150206cf79",
"9b3e7b97": "0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd",
"19771608": "e90f80a61d94c617850c415e12ad70ac41e66bb7",
"3353dcc6": "4e9384c9d137f0ab65ffc5a78f04cd8c9df6c8b7",
"82312751": "69dd7344e4dfa7e250973a71bbb3e8aa6fb08d81",
@@ -111184,6 +111202,8 @@
"55847d8c": "649895efd79d14790eabb362e94eb0622093dfb9",
"1e26792f": "b6a11579caef3875504fcf3831b8e3922746df2c",
"6a0e22a0": "7771d6e90980408f753891648685def6dd42ef6d",
"bc190209": "e38466a4ba8005fba7e9e3c7b9efeba7205bee3f",
"24fc7e17": "ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d",
"8c93a399": "e340db2696274dda5fdc25e434a914db71e8b02b",
"18d0f7d8": "1a8d6f9453111b1d317bb7dae300495fbf54600c",
"decb22f5": "73107d468fc7cb1d2c5b18b269715dd889ecef06",
@@ -111204,8 +111224,6 @@
"0bad7ea9": "beb0ac693c0dc26daf5665b3314db81480fa5c7c",
"76b880e5": "dbc7339e5d85827c095764fc077b41f78fd2ecae",
"3539def6": "b06f4a861f74270be819aa2a07db8d0563a7cc4e",
"bc190209": "e38466a4ba8005fba7e9e3c7b9efeba7205bee3f",
"24fc7e17": "ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d",
"ff3eeb8c": "b05def971d8ec59f346f2d9ac21fb742e3eb6917",
"8d8cb7e4": "0555c6fae8906f3f09baf5988f00e55f88e9f30b",
"d786f0b9": "f6bc2d1f5eb6593de7d089c425ac681d6fffd3f0",
@@ -115005,6 +115023,7 @@
"0a09940701f40647a2715271b43c9ab0d82bd488871427ad627b7e0f462f5dda": "bf5fb954db868e523febccc68549ed9187961076",
"d87ce758a7171870a2a3e7893e09cbba2bd68ee70b4d0f0e49dd2ecd60aafdd1": "5aff2d9b6efc723bc395b0f96f0adfa83cc54a49",
"1c85dac5536fa3ba6f2cb70deba02ff680b34ac6cc787d2977258bd663a99555": "e998f0c441f4f1800ef44e42cd1659150206cf79",
"0c672d86ead61a97f49a583b88b7c1905da120645cd44f0c9f2baf4f4631e0b1": "0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd",
"ca45b50d49a8199a2b8f74300556367a776df1bb28bf8af24d33e65f0fe37a99": "e90f80a61d94c617850c415e12ad70ac41e66bb7",
"696da03345b9fd27799b8fd92024050a201c020ef730e9006cb8f10bbbf68004": "4e9384c9d137f0ab65ffc5a78f04cd8c9df6c8b7",
"2715b192a9a647c31da88b4e1d778279ff3b40b80f606891732a6023e3039c2d": "69dd7344e4dfa7e250973a71bbb3e8aa6fb08d81",
@@ -118481,6 +118500,8 @@
"42e4124be7623e2e28b1db0d8d426539646faee49d74b71166d8ba5bd7c472ed": "649895efd79d14790eabb362e94eb0622093dfb9",
"3d06d2c469313c2a2128d24fe2e0c71ff99bc2032be89a829a62337187f500b7": "b6a11579caef3875504fcf3831b8e3922746df2c",
"8434528690df0d444dfe4e931eb5501be53df70497e63f4c9a21184631cdbb87": "7771d6e90980408f753891648685def6dd42ef6d",
"6f71ca1e716da761dc53187bd39e00c213f566e55090708fd3e2b4b425c8c989": "e38466a4ba8005fba7e9e3c7b9efeba7205bee3f",
"0c8359870cbac0ea091f1c87f188cd332dcc709753b91cafd9fd44a4a6188197": "ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d",
"8e0383171e67b33e60d5df6394c58843f3b11c7a0b97f3bfcc4319ac2d1f9d18": "e340db2696274dda5fdc25e434a914db71e8b02b",
"7f38da2e456540d267060175a7a1e3b4c39292d964051abd8b322c05367af04f": "1a8d6f9453111b1d317bb7dae300495fbf54600c",
"4018749b3698b8694387beebcbabfb48470513066840f9441459ee4c9f0f39bc": "73107d468fc7cb1d2c5b18b269715dd889ecef06",
@@ -118501,8 +118522,6 @@
"5c0166da24e27deaa82246de8ff0108267fe4bb59f6df0fdec50e05e62448ca4": "beb0ac693c0dc26daf5665b3314db81480fa5c7c",
"42244b0c650821519751b7e77ad1d3222a0125e75586df2b4e84ba693b9809dc": "dbc7339e5d85827c095764fc077b41f78fd2ecae",
"5eb3aee495937558312b83b54323d76a4a015190decd4051214f1b6df06ac34b": "b06f4a861f74270be819aa2a07db8d0563a7cc4e",
"6f71ca1e716da761dc53187bd39e00c213f566e55090708fd3e2b4b425c8c989": "e38466a4ba8005fba7e9e3c7b9efeba7205bee3f",
"0c8359870cbac0ea091f1c87f188cd332dcc709753b91cafd9fd44a4a6188197": "ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d",
"9c0421858e217805f4abe18698afea8d5aa36ff0727eb8484944e00eb5e7eadb": "b05def971d8ec59f346f2d9ac21fb742e3eb6917",
"11052b6499e466bbf0a709b1f9cb6834a9418e66680387912451e971cf8a1fef": "0555c6fae8906f3f09baf5988f00e55f88e9f30b",
"1faaa18fa820a0225e488d9f086296b8e6c46df739666093987ff7d8fd352c09": "f6bc2d1f5eb6593de7d089c425ac681d6fffd3f0",
@@ -123327,6 +123346,9 @@
"openmsx/fs-a1wsx_kanjifont.rom": [
"5aff2d9b6efc723bc395b0f96f0adfa83cc54a49"
],
".variants/MSX2.ROM.0081ea0d": [
"0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd"
],
".variants/MSX2P.ROM.e90f80a6": [
"e90f80a61d94c617850c415e12ad70ac41e66bb7"
],
@@ -132639,6 +132661,8 @@
"dcffe16bd90a723499ad46c641424981338d8378",
"beb0ac693c0dc26daf5665b3314db81480fa5c7c",
"dbc7339e5d85827c095764fc077b41f78fd2ecae",
"e38466a4ba8005fba7e9e3c7b9efeba7205bee3f",
"ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d",
"ca7af30b50d9756cbd764640126c454cff658479",
"1b0dbdb23da9dc0776aac58d0755dc80fea20975",
"339a48f4fcf63e10b5b867b8c93cfd40945faf6c",
@@ -132733,8 +132757,6 @@
"03bbb386cf530e804363acdfc1d13e64cf28af2e",
"55315b20fecb4441a07ee4bc5dc7153f396e0a2e",
"343883a7b555646da8cee54aadd2795b6e7dd070",
"e38466a4ba8005fba7e9e3c7b9efeba7205bee3f",
"ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d",
"15c94da3cc5a38a582429575af4198c487fe893c",
"73107d468fc7cb1d2c5b18b269715dd889ecef06",
"b05def971d8ec59f346f2d9ac21fb742e3eb6917",
@@ -132766,6 +132788,7 @@
"7ed7c55e0359737ac5e68d38cb6903f9e5d7c2b6",
"9d789166e3caf28e4742fe933d962e99618c633d",
"32760893ce06dbe3930627755ba065cc3d8ec6ca",
"0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd",
"e90f80a61d94c617850c415e12ad70ac41e66bb7",
"df48902f5f12af8867ae1a87f255145f0e5e0774",
"04990aa1c3a3fc7294ec884b81deaa89832df614",
@@ -135341,6 +135364,12 @@
".variants/scph101.bin.9a09ab7e": [
"7771d6e90980408f753891648685def6dd42ef6d"
],
".variants/scph3000.bin.e38466a4": [
"e38466a4ba8005fba7e9e3c7b9efeba7205bee3f"
],
".variants/scph3500.bin.ffa7f9a7": [
"ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d"
],
"Oric/microdisc.rom": [
"0d2ef6e67322f48f4b7e08d8bbe68827e2074561"
],

View File

@@ -70,11 +70,12 @@ files:
aliases: []
- name: "ps1_rom.bin"
description: "PS3 (v5.0 06-23-03 A)"
description: "PS3 embedded PS1 BIOS (v5.0 06-23-03 A)"
region: "Auto"
required: false
md5: "81bbe60ba7a3d1cea1d48c14cbcc647b"
size: 4089584
size: [524288, 4194304, 4089584]
validation: [size, md5]
source_ref: "src/core/bios.cpp:70"
note: "Accepts PS1 (512KB), PS2 (4MB), and PS3 (0x3E66F0) sizes. Only first 512KB used."
source_ref: "src/core/bios.h:9, src/core/bios.cpp:70,83"
aliases: []

View File

@@ -4,7 +4,7 @@
"platform": "batocera",
"display_name": "Batocera",
"version": "1.0",
"generated": "2026-04-01T14:41:41Z",
"generated": "2026-04-02T08:32:09Z",
"base_destination": "bios",
"detect": [
{
@@ -15,8 +15,8 @@
}
],
"standalone_copies": [],
"total_files": 1540,
"total_size": 3891615271,
"total_files": 1541,
"total_size": 3891648039,
"files": [
{
"dest": "panafz1.bin",
@@ -2904,6 +2904,15 @@
"blueMSX"
]
},
{
"dest": "Machines/Shared Roms/MSX2J.rom",
"sha1": "0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd",
"size": 32768,
"repo_path": "bios/Microsoft/MSX/.variants/MSX2.ROM.0081ea0d",
"cores": [
"blueMSX"
]
},
{
"dest": "Machines/Shared Roms/MSX2R2.ROM",
"sha1": "ebb7eb540a390509edfd36c84288ba85e63f2d1f",

View File

@@ -4,7 +4,7 @@
"platform": "lakka",
"display_name": "Lakka",
"version": "1.0",
"generated": "2026-04-01T14:42:08Z",
"generated": "2026-04-02T08:32:35Z",
"base_destination": "system",
"detect": [
{
@@ -15,8 +15,8 @@
}
],
"standalone_copies": [],
"total_files": 1620,
"total_size": 5255358024,
"total_files": 1621,
"total_size": 5255390792,
"files": [
{
"dest": "3do_arcade_saot.bin",
@@ -3438,6 +3438,15 @@
"blueMSX"
]
},
{
"dest": "Machines/Shared Roms/MSX2J.rom",
"sha1": "0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd",
"size": 32768,
"repo_path": "bios/Microsoft/MSX/.variants/MSX2.ROM.0081ea0d",
"cores": [
"blueMSX"
]
},
{
"dest": "Machines/Shared Roms/MSX2R2.ROM",
"sha1": "ebb7eb540a390509edfd36c84288ba85e63f2d1f",

View File

@@ -4,7 +4,7 @@
"platform": "recalbox",
"display_name": "Recalbox",
"version": "1.0",
"generated": "2026-04-01T14:42:39Z",
"generated": "2026-04-02T08:33:02Z",
"base_destination": "bios",
"detect": [
{
@@ -15,8 +15,8 @@
}
],
"standalone_copies": [],
"total_files": 1097,
"total_size": 3500142330,
"total_files": 1098,
"total_size": 3500175098,
"files": [
{
"dest": "3do/panafz1.bin",
@@ -851,6 +851,13 @@
"repo_path": "bios/Microsoft/MSX/MSX2EXT.ROM",
"cores": null
},
{
"dest": "Machines/Shared Roms/MSX2J.rom",
"sha1": "0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd",
"size": 32768,
"repo_path": "bios/Microsoft/MSX/.variants/MSX2.ROM.0081ea0d",
"cores": null
},
{
"dest": "Machines/Shared Roms/MSX2P.rom",
"sha1": "e90f80a61d94c617850c415e12ad70ac41e66bb7",

View File

@@ -4,7 +4,7 @@
"platform": "retroarch",
"display_name": "RetroArch",
"version": "1.0",
"generated": "2026-04-01T14:42:08Z",
"generated": "2026-04-02T08:32:35Z",
"base_destination": "system",
"detect": [
{
@@ -33,8 +33,8 @@
}
],
"standalone_copies": [],
"total_files": 1620,
"total_size": 5255358024,
"total_files": 1621,
"total_size": 5255390792,
"files": [
{
"dest": "3do_arcade_saot.bin",
@@ -3456,6 +3456,15 @@
"blueMSX"
]
},
{
"dest": "Machines/Shared Roms/MSX2J.rom",
"sha1": "0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd",
"size": 32768,
"repo_path": "bios/Microsoft/MSX/.variants/MSX2.ROM.0081ea0d",
"cores": [
"blueMSX"
]
},
{
"dest": "Machines/Shared Roms/MSX2R2.ROM",
"sha1": "ebb7eb540a390509edfd36c84288ba85e63f2d1f",

View File

@@ -4,7 +4,7 @@
"platform": "retrobat",
"display_name": "RetroBat",
"version": "1.0",
"generated": "2026-04-01T14:42:50Z",
"generated": "2026-04-02T08:33:12Z",
"base_destination": "bios",
"detect": [
{
@@ -14,8 +14,8 @@
}
],
"standalone_copies": [],
"total_files": 1162,
"total_size": 4297772175,
"total_files": 1163,
"total_size": 4297804943,
"files": [
{
"dest": "panafz1.bin",
@@ -2525,6 +2525,15 @@
"blueMSX"
]
},
{
"dest": "Machines/Shared Roms/MSX2J.rom",
"sha1": "0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd",
"size": 32768,
"repo_path": "bios/Microsoft/MSX/.variants/MSX2.ROM.0081ea0d",
"cores": [
"blueMSX"
]
},
{
"dest": "Machines/Shared Roms/MSX2R2.ROM",
"sha1": "ebb7eb540a390509edfd36c84288ba85e63f2d1f",

View File

@@ -4,7 +4,7 @@
"platform": "retrodeck",
"display_name": "RetroDECK",
"version": "1.0",
"generated": "2026-04-01T14:43:08Z",
"generated": "2026-04-02T08:33:28Z",
"base_destination": "",
"detect": [
{
@@ -15,8 +15,8 @@
}
],
"standalone_copies": [],
"total_files": 3144,
"total_size": 5871582893,
"total_files": 3146,
"total_size": 5871648429,
"files": [
{
"dest": "bios/panafz1.bin",
@@ -11477,6 +11477,13 @@
"repo_path": "bios/Microsoft/MSX/openmsx/yrw801.rom",
"cores": null
},
{
"dest": "bios/MSX2J.rom",
"sha1": "0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd",
"size": 32768,
"repo_path": "bios/Microsoft/MSX/.variants/MSX2.ROM.0081ea0d",
"cores": null
},
{
"dest": "bios/MSX2R2.ROM",
"sha1": "04990aa1c3a3fc7294ec884b81deaa89832df614",
@@ -22300,6 +22307,15 @@
"blueMSX"
]
},
{
"dest": "Machines/Shared Roms/MSX2J.rom",
"sha1": "0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd",
"size": 32768,
"repo_path": "bios/Microsoft/MSX/.variants/MSX2.ROM.0081ea0d",
"cores": [
"blueMSX"
]
},
{
"dest": "Machines/Shared Roms/MSX2R2.ROM",
"sha1": "ebb7eb540a390509edfd36c84288ba85e63f2d1f",

View File

@@ -719,6 +719,10 @@ platforms:
source_format: github_component_manifests
hash_type: md5
schedule: monthly
contributed_by:
- username: monster-penguin
contribution: platform support
pr: 36
cores:
- azahar
- cemu
@@ -758,6 +762,10 @@ platforms:
source_format: json
hash_type: sha1
schedule: monthly
contributed_by:
- username: PixNyb
contribution: platform support
pr: 37
inherits_from: emulatorjs
target_scraper: null
target_source: null

View File

@@ -758,6 +758,7 @@ def _build_readme(
total_files: int,
num_systems: int,
source: str = "full",
contributors: list[dict] | None = None,
) -> str:
"""Build a personalized step-by-step README for each platform pack."""
sep = "=" * 50
@@ -971,7 +972,18 @@ def _build_readme(
" Independent of platform scraper accuracy.\n\n"
)
return header + source_info + guide + footer
credits = ""
if contributors:
credits = "\nCONTRIBUTORS\n\n"
for cb in contributors:
username = cb.get("username", "")
contribution = cb.get("contribution", "")
pr = cb.get("pr")
pr_ref = f" (#{pr})" if pr else ""
credits += f" @{username} - {contribution}{pr_ref}\n"
credits += "\n"
return header + source_info + guide + credits + footer
def _build_agnostic_rename_readme(
@@ -1482,9 +1494,15 @@ def generate_pack(
# README.txt for users -personalized step-by-step per platform
num_systems = len(pack_systems)
_registry_path = Path(platforms_dir) / "_registry.yml"
_pack_registry: dict = {}
if _registry_path.exists():
with open(_registry_path) as _rf:
_pack_registry = (yaml.safe_load(_rf) or {}).get("platforms", {})
readme_text = _build_readme(
platform_name, platform_display, base_dest, total_files, num_systems,
source=source,
contributors=_pack_registry.get(platform_name, {}).get("contributed_by", []),
)
zf.writestr("README.txt", readme_text)

View File

@@ -93,6 +93,20 @@ def fetch_contributors() -> list[dict]:
return []
def _build_contributor_map(registry: dict) -> dict[str, list[dict]]:
"""Map GitHub username to list of {platform, contribution, pr}."""
result: dict[str, list[dict]] = {}
for platform_name, entry in registry.items():
for c in entry.get("contributed_by", []):
username = c["username"]
result.setdefault(username, []).append({
"platform": platform_name,
"contribution": c.get("contribution", ""),
"pr": c.get("pr"),
})
return result
def generate_readme(db: dict, platforms_dir: str) -> str:
total_files = db.get("total_files", 0)
total_size = db.get("total_size", 0)
@@ -101,6 +115,13 @@ def generate_readme(db: dict, platforms_dir: str) -> str:
platform_names = list_registered_platforms(platforms_dir, include_archived=True)
registry_path = Path(platforms_dir) / "_registry.yml"
registry = {}
if registry_path.exists():
import yaml
with open(registry_path) as f:
registry = (yaml.safe_load(f) or {}).get("platforms", {})
from common import load_data_dir_registry
from cross_reference import _build_supplemental_index
@@ -332,19 +353,43 @@ def generate_readme(db: dict, platforms_dir: str) -> str:
contributors = fetch_contributors()
if contributors:
contributor_map = _build_contributor_map(registry)
lines.extend(
[
"## Contributors",
"",
]
)
platform_display: dict[str, str] = {}
for name, cov in coverages.items():
platform_display[name] = cov["platform"]
for c in contributors:
login = c["login"]
avatar = c.get("avatar_url", "")
url = c.get("html_url", f"https://github.com/{login}")
lines.append(
f'<a href="{url}"><img src="{avatar}" width="50" title="{login}"></a>'
)
contributions = contributor_map.get(login, [])
if contributions:
parts = []
for contrib in contributions:
display = platform_display.get(contrib["platform"], contrib["platform"])
pr = contrib.get("pr")
label = display
if pr:
label += f" [#{pr}](https://github.com/Abdess/retrobios/pull/{pr})"
parts.append(label)
desc = ", ".join(parts)
else:
desc = ""
line = f'<a href="{url}"><img src="{avatar}" width="50" title="{login}"></a>'
if desc:
line += f" {desc}"
lines.append(line)
lines.append("")
lines.extend(
@@ -375,6 +420,16 @@ def generate_contributing() -> str:
3. Variants (alternate hashes): `bios/Manufacturer/Console/.variants/`
4. Create a Pull Request - checksums are verified automatically
## Add a new platform
1. Write a scraper in `scripts/scraper/`
2. Create the platform YAML in `platforms/`
3. Register in `platforms/_registry.yml`
4. Submit a Pull Request
Contributors who add platform support are credited in the README,
on the documentation site, and in the BIOS packs.
## File conventions
- Files >50 MB go in GitHub release assets (`large-files` release)

View File

@@ -497,6 +497,17 @@ def generate_platform_page(
lines.append(f"| BIOS path | `{base_dest}/` |")
if homepage:
lines.append(f"| Homepage | [{homepage}]({homepage}) |")
contrib_list = (registry or {}).get(name, {}).get("contributed_by", [])
if contrib_list:
for cb in contrib_list:
username = cb.get("username", "")
contribution = cb.get("contribution", "")
pr = cb.get("pr")
pr_link = f" ([#{pr}]({REPO_URL}/pull/{pr}))" if pr else ""
lines.append(
f"| Contributed by | [@{username}](https://github.com/{username})"
f" - {contribution}{pr_link} |"
)
lines.extend(
[
"",
@@ -865,7 +876,11 @@ def generate_emulators_index(profiles: dict) -> str:
def generate_emulator_page(
name: str, profile: dict, db: dict, platform_files: dict | None = None
name: str,
profile: dict,
db: dict,
platform_files: dict | None = None,
data_names: set[str] | None = None,
) -> str:
if profile.get("type") == "alias":
parent = profile.get("alias_of", profile.get("bios_identical_to", "unknown"))
@@ -1022,15 +1037,52 @@ def generate_emulator_page(
]
)
else:
from cross_reference import _resolve_source
by_name = db.get("indexes", {}).get("by_name", {})
db.get("files", {})
by_name_lower = {k.lower(): k for k in by_name}
by_path_suffix = db.get("indexes", {}).get("by_path_suffix", {})
by_md5 = db.get("indexes", {}).get("by_md5", {})
db_files = db.get("files", {})
def _file_available(f: dict) -> bool:
"""Check if a file is available using the same resolution as cross_reference."""
fname = f.get("name", "")
if not fname:
return False
storage = f.get("storage", "")
if storage in ("release", "large_file"):
return True
src = _resolve_source(
fname, by_name, by_name_lower, data_names, by_path_suffix,
)
if src is not None:
return True
path_field = f.get("path", "")
if path_field and path_field != fname:
src = _resolve_source(
path_field, by_name, by_name_lower, data_names,
by_path_suffix,
)
if src is not None:
return True
md5_raw = f.get("md5", "")
if md5_raw:
for md5_val in md5_raw.split(","):
md5_val = md5_val.strip().lower()
if md5_val and by_md5.get(md5_val):
return True
sha1 = f.get("sha1", "")
if sha1 and sha1 in db_files:
return True
return False
# Stats by category
bios_files = [f for f in files if f.get("category", "bios") == "bios"]
game_data = [f for f in files if f.get("category") == "game_data"]
bios_zips = [f for f in files if f.get("category") == "bios_zip"]
in_repo_count = sum(1 for f in files if f.get("name", "") in by_name)
in_repo_count = sum(1 for f in files if _file_available(f))
missing_count = len(files) - in_repo_count
req_count = sum(1 for f in files if f.get("required"))
opt_count = len(files) - req_count
@@ -1058,7 +1110,7 @@ def generate_emulator_page(
for f in files:
fname = f.get("name", "")
required = f.get("required", False)
in_repo = fname in by_name
in_repo = _file_available(f)
source_ref = f.get("source_ref", "")
mode = f.get("mode", "")
hle = f.get("hle_fallback", False)
@@ -1176,6 +1228,9 @@ def generate_emulator_page(
if fsystem:
details.append(f"System: {_system_link(fsystem, '../')}")
if size:
if isinstance(size, list):
size_str = " / ".join(_fmt_size(s) for s in size)
else:
size_str = _fmt_size(size)
if fmin or fmax:
bounds = []
@@ -1501,19 +1556,32 @@ def generate_gap_analysis(
# ---- Section 3: Core complement (cross-reference provenance) ----
from common import expand_platform_declared_names
all_declared: set[str] = set()
declared: dict[str, set[str]] = {}
for _name, cov in coverages.items():
config = cov["config"]
# Enrich with alias resolution (MD5 -> SHA1 -> canonical name + aliases)
all_declared.update(expand_platform_declared_names(config, db))
for sys_id, system in config.get("systems", {}).items():
for fe in system.get("files", []):
fname = fe.get("name", "")
if fname:
declared.setdefault(sys_id, set()).add(fname)
all_declared.add(fname)
# Only include profiles relevant to at least one platform
unique_profiles = {
k: v
for k, v in profiles.items()
if v.get("type") not in ("alias", "test")
}
relevant_set: set[str] = set()
for _name, cov in coverages.items():
matched = resolve_platform_cores(cov["config"], unique_profiles)
relevant_set.update(matched)
active_profiles = {
k: v for k, v in profiles.items() if v.get("type") != "alias"
k: v for k, v in unique_profiles.items() if k in relevant_set
}
report = run_cross_reference(
@@ -2187,7 +2255,7 @@ def main():
str(docs / "emulators" / "index.md"), generate_emulators_index(profiles)
)
for name, profile in profiles.items():
page = generate_emulator_page(name, profile, db, platform_files)
page = generate_emulator_page(name, profile, db, platform_files, suppl_names)
write_if_changed(str(docs / "emulators" / f"{name}.md"), page)
# Generate cross-reference page

View File

@@ -1,6 +1,8 @@
#!/usr/bin/env python3
"""Scraper for RetroDECK BIOS requirements.
Platform contributed by @monster-penguin (#36).
Source: https://github.com/RetroDECK/components
Format: component_manifest.json per component directory
Hash: MD5 (primary), SHA256 for some entries (melonDS DSi)

View File

@@ -1,6 +1,8 @@
#!/usr/bin/env python3
"""Scraper for RomM BIOS requirements.
Platform contributed by @PixNyb (#37).
Source: https://github.com/rommapp/romm
Format: JSON fixture mapping "slug:filename" to {size, crc, md5, sha1}
Hash: SHA1 primary (all four hashes available per entry)

View File

@@ -102,8 +102,12 @@ def _build_validation_index(profiles: dict) -> dict[str, dict]:
index[fname]["crypto_only"].update(c for c in checks if c in _CRYPTO_CHECKS)
# Size checks
if "size" in checks:
if f.get("size") is not None:
index[fname]["sizes"].add(f["size"])
raw_size = f.get("size")
if raw_size is not None:
if isinstance(raw_size, list):
index[fname]["sizes"].update(raw_size)
else:
index[fname]["sizes"].add(raw_size)
if f.get("min_size") is not None:
cur = index[fname]["min_size"]
index[fname]["min_size"] = (

View File

@@ -1230,6 +1230,17 @@ def verify_emulator(
check = check_file_validation(local_path, name, validation_index)
if check:
reason, _emus = check
better = _find_best_variant(
file_entry, db, local_path, validation_index,
)
if better:
result = {
"name": name,
"status": Status.OK,
"required": required,
"path": better,
}
else:
result = {
"name": name,
"status": Status.UNTESTED,