mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-04-20 15:52:35 -05:00
feat: add doom engine wad files, emulatorjs base config
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
Complete BIOS and firmware packs for RetroArch, Batocera, Recalbox, Lakka, RetroPie, EmuDeck, RetroBat, and RetroDECK.
|
||||
|
||||
**6,733** verified files across **294** systems, ready to extract into your emulator's BIOS directory.
|
||||
**6,748** verified files across **294** systems, ready to extract into your emulator's BIOS directory.
|
||||
|
||||
## Download BIOS packs
|
||||
|
||||
@@ -18,17 +18,18 @@ Pick your platform, download the ZIP, extract to the BIOS path.
|
||||
| RetroBat | 331 | `bios/` | [Download](../../releases/latest) |
|
||||
| RetroDECK | 2007 | `~/retrodeck/bios/` | [Download](../../releases/latest) |
|
||||
| RetroPie | 448 | `BIOS/` | [Download](../../releases/latest) |
|
||||
| RomM | 374 | `bios/{platform_slug}/` | [Download](../../releases/latest) |
|
||||
|
||||
## What's included
|
||||
|
||||
BIOS, firmware, and system files for consoles from Atari to PlayStation 3.
|
||||
Each file is checked against the emulator's source code to match what the code actually loads at runtime.
|
||||
|
||||
- **8 platforms** supported with platform-specific verification
|
||||
- **9 platforms** supported with platform-specific verification
|
||||
- **306 emulators** profiled from source (RetroArch cores + standalone)
|
||||
- **294 systems** covered (NES, SNES, PlayStation, Saturn, Dreamcast, ...)
|
||||
- **6,733 files** verified with MD5, SHA1, CRC32 checksums
|
||||
- **5044 MB** total collection size
|
||||
- **6,748 files** verified with MD5, SHA1, CRC32 checksums
|
||||
- **5251 MB** total collection size
|
||||
|
||||
## Supported systems
|
||||
|
||||
@@ -42,12 +43,13 @@ Full list with per-file details: **[https://abdess.github.io/retrobios/](https:/
|
||||
|----------|----------|----------|----------|---------|
|
||||
| Batocera | 359/359 (100.0%) | 358 | 1 | 0 |
|
||||
| EmuDeck | 161/161 (100.0%) | 161 | 0 | 0 |
|
||||
| Lakka | 448/448 (100.0%) | 440 | 8 | 0 |
|
||||
| Recalbox | 346/346 (100.0%) | 341 | 5 | 0 |
|
||||
| RetroArch | 448/448 (100.0%) | 440 | 8 | 0 |
|
||||
| RetroBat | 331/331 (100.0%) | 330 | 1 | 0 |
|
||||
| RetroDECK | 2007/2007 (100.0%) | 2001 | 6 | 0 |
|
||||
| RetroPie | 448/448 (100.0%) | 440 | 8 | 0 |
|
||||
| Lakka | 448/448 (100.0%) | 448 | 0 | 0 |
|
||||
| Recalbox | 346/346 (100.0%) | 346 | 0 | 0 |
|
||||
| RetroArch | 448/448 (100.0%) | 448 | 0 | 0 |
|
||||
| RetroBat | 331/331 (100.0%) | 331 | 0 | 0 |
|
||||
| RetroDECK | 2007/2007 (100.0%) | 2007 | 0 | 0 |
|
||||
| RetroPie | 448/448 (100.0%) | 448 | 0 | 0 |
|
||||
| RomM | 374/374 (100.0%) | 359 | 15 | 0 |
|
||||
|
||||
## How it works
|
||||
|
||||
@@ -65,6 +67,7 @@ Per-file hashes, emulator profiles, gap analysis, cross-reference: **[https://ab
|
||||
|
||||
## Contributors
|
||||
|
||||
<a href="https://github.com/PixNyb"><img src="https://avatars.githubusercontent.com/u/40770831?v=4" width="50" title="PixNyb"></a>
|
||||
<a href="https://github.com/monster-penguin"><img src="https://avatars.githubusercontent.com/u/266009589?v=4" width="50" title="monster-penguin"></a>
|
||||
|
||||
|
||||
@@ -76,4 +79,4 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
|
||||
|
||||
This repository provides BIOS files for personal backup and archival purposes.
|
||||
|
||||
*Auto-generated on 2026-03-25T16:17:06Z*
|
||||
*Auto-generated on 2026-03-25T22:12:06Z*
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+476
-248
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"generated_at": "2026-03-25T15:41:49Z",
|
||||
"total_files": 6733,
|
||||
"total_size": 5288644732,
|
||||
"generated_at": "2026-03-25T22:06:53Z",
|
||||
"total_files": 6748,
|
||||
"total_size": 5505760050,
|
||||
"files": {
|
||||
"520d3d1b5897800af47f92efd2444a26b7a7dead": {
|
||||
"path": "bios/3DO Company/3DO/3do_arcade_saot.bin",
|
||||
@@ -27713,6 +27713,156 @@
|
||||
"crc32": "0636e0be",
|
||||
"adler32": "0ca77de6"
|
||||
},
|
||||
"eca9cff1014ce5081804e193588d96c6ddb35432": {
|
||||
"path": "bios/Id Software/Doom/CHEX.WAD",
|
||||
"name": "CHEX.WAD",
|
||||
"size": 12361532,
|
||||
"sha1": "eca9cff1014ce5081804e193588d96c6ddb35432",
|
||||
"md5": "25485721882b050afa96a56e5758dd52",
|
||||
"sha256": "d8eb5277918883f490fb1a4be3c9a8588df2dbaee6dc4beb8df4929148bbffb1",
|
||||
"crc32": "298dd5b5",
|
||||
"adler32": "4026602b"
|
||||
},
|
||||
"7742089b4468a736cadb659a7deca3320fe6dcbd": {
|
||||
"path": "bios/Id Software/Doom/DOOM.WAD",
|
||||
"name": "DOOM.WAD",
|
||||
"size": 11159840,
|
||||
"sha1": "7742089b4468a736cadb659a7deca3320fe6dcbd",
|
||||
"md5": "1cd63c5ddff1bf8ce844237f580e9cf3",
|
||||
"sha256": "ff2c301b8719465a6e386a512bfa319931b7f64ea517d337c5a47afe03951902",
|
||||
"crc32": "723e60f9",
|
||||
"adler32": "e85f4707"
|
||||
},
|
||||
"5b2e249b9c5133ec987b3ea77596381dc0d6bc1d": {
|
||||
"path": "bios/Id Software/Doom/DOOM1.WAD",
|
||||
"name": "DOOM1.WAD",
|
||||
"size": 4196020,
|
||||
"sha1": "5b2e249b9c5133ec987b3ea77596381dc0d6bc1d",
|
||||
"md5": "f0cefca49926d00903cf57551d901abe",
|
||||
"sha256": "1d7d43be501e67d927e415e0b8f3e29c3bf33075e859721816f652a526cac771",
|
||||
"crc32": "162b696a",
|
||||
"adler32": "3bca9a2a"
|
||||
},
|
||||
"7ec7652fcfce8ddc6e801839291f0e28ef1d5ae7": {
|
||||
"path": "bios/Id Software/Doom/DOOM2.WAD",
|
||||
"name": "DOOM2.WAD",
|
||||
"size": 14604584,
|
||||
"sha1": "7ec7652fcfce8ddc6e801839291f0e28ef1d5ae7",
|
||||
"md5": "25e1459ca71d321525f84628f45ca8cd",
|
||||
"sha256": "10d67824b11025ddd9198e8cfc87ca335ee6e2d3e63af4180fa9b8a471893255",
|
||||
"crc32": "ec8725db",
|
||||
"adler32": "03bcce6c"
|
||||
},
|
||||
"d510c877031bbd5f3d198581a2c8651e09b9861f": {
|
||||
"path": "bios/Id Software/Doom/DOOM2F.WAD",
|
||||
"name": "DOOM2F.WAD",
|
||||
"size": 14607420,
|
||||
"sha1": "d510c877031bbd5f3d198581a2c8651e09b9861f",
|
||||
"md5": "3cb02349b3df649c86290907eed64e7b",
|
||||
"sha256": "ab6d457050daee95fb763040f753fce44a4852883dafdb520b00cc8426e6bda0",
|
||||
"crc32": "27eaae69",
|
||||
"adler32": "13e6449b"
|
||||
},
|
||||
"ae363db8cd5645e1753d9bacc82cc0724e8e7f21": {
|
||||
"path": "bios/Id Software/Doom/DOOM64.WAD",
|
||||
"name": "DOOM64.WAD",
|
||||
"size": 15103284,
|
||||
"sha1": "ae363db8cd5645e1753d9bacc82cc0724e8e7f21",
|
||||
"md5": "e16e17f59afe7b3297f53ebe7e9de815",
|
||||
"sha256": "902e88504c55cb8f6e03774ba57a272565a65332f08578c3c6fa68972766db2e",
|
||||
"crc32": "cb10a53d",
|
||||
"adler32": "1d624237"
|
||||
},
|
||||
"f489d479371df32f6d280a0cb23b59a35ba2b833": {
|
||||
"path": "bios/Id Software/Doom/HERETIC.WAD",
|
||||
"name": "HERETIC.WAD",
|
||||
"size": 14189976,
|
||||
"sha1": "f489d479371df32f6d280a0cb23b59a35ba2b833",
|
||||
"md5": "66d686b1ed6d35ff103f15dbd30e0341",
|
||||
"sha256": "12541f82e1d326b456b89411f8c54b895e775a611580f66b78558e898b2eaafa",
|
||||
"crc32": "5b16049e",
|
||||
"adler32": "065166bc"
|
||||
},
|
||||
"b4c50ca9bea07f7c35250a1a11906091971c05ae": {
|
||||
"path": "bios/Id Software/Doom/HERETIC1.WAD",
|
||||
"name": "HERETIC1.WAD",
|
||||
"size": 5120920,
|
||||
"sha1": "b4c50ca9bea07f7c35250a1a11906091971c05ae",
|
||||
"md5": "ae779722390ec32fa37b0d361f7d82f8",
|
||||
"sha256": "3ab2f21828877e49e5eb3220785aaf8798050b7c4132003b5db7b8f3678bede4",
|
||||
"crc32": "22d3f0ca",
|
||||
"adler32": "6110f0ac"
|
||||
},
|
||||
"081f6a2024643b54ef4a436a85508539b6d20a1e": {
|
||||
"path": "bios/Id Software/Doom/HEXDD.WAD",
|
||||
"name": "HEXDD.WAD",
|
||||
"size": 4440584,
|
||||
"sha1": "081f6a2024643b54ef4a436a85508539b6d20a1e",
|
||||
"md5": "78d5898e99e220e4de64edaa0e479593",
|
||||
"sha256": "ea5e34c9f7eb677c593f125a0c45db2aaf2d98b8f6e9d50bd683a655aeec531f",
|
||||
"crc32": "fd5eb11d",
|
||||
"adler32": "6b8e0546"
|
||||
},
|
||||
"4b53832f0733c1e29e5f1de2428e5475e891af29": {
|
||||
"path": "bios/Id Software/Doom/HEXEN.WAD",
|
||||
"name": "HEXEN.WAD",
|
||||
"size": 20083672,
|
||||
"sha1": "4b53832f0733c1e29e5f1de2428e5475e891af29",
|
||||
"md5": "abb033caf81e26f12a2103e1fa25453f",
|
||||
"sha256": "f74b857076b3ffe2597d0e05bdecc687496e6e8a9582d7a47db681e0e78e4001",
|
||||
"crc32": "dca9114c",
|
||||
"adler32": "7ebb3585"
|
||||
},
|
||||
"90361e2a538d2388506657252ae41aceeb1ba360": {
|
||||
"path": "bios/Id Software/Doom/PLUTONIA.WAD",
|
||||
"name": "PLUTONIA.WAD",
|
||||
"size": 17420824,
|
||||
"sha1": "90361e2a538d2388506657252ae41aceeb1ba360",
|
||||
"md5": "75c8cf89566741fa9d22447604053bd7",
|
||||
"sha256": "a83b00c636fa3308286e76b1b3153fc14507caf994b0450770421260b08efed8",
|
||||
"crc32": "48d1453c",
|
||||
"adler32": "63916b81"
|
||||
},
|
||||
"bc0a110bf27aee89a0b2fc8111e2391ede891b8d": {
|
||||
"path": "bios/Id Software/Doom/STRIFE0.WAD",
|
||||
"name": "STRIFE0.WAD",
|
||||
"size": 9934413,
|
||||
"sha1": "bc0a110bf27aee89a0b2fc8111e2391ede891b8d",
|
||||
"md5": "bb545b9c4eca0ff92c14d466b3294023",
|
||||
"sha256": "f7f557657cbfd5c7eacaaf9d8aaf3e80512467b51ebfb7c567078ef9bf648ef8",
|
||||
"crc32": "93c144dd",
|
||||
"adler32": "70416de4"
|
||||
},
|
||||
"64c13b951a845ca7f8081f68138a6181557458d1": {
|
||||
"path": "bios/Id Software/Doom/STRIFE1.WAD",
|
||||
"name": "STRIFE1.WAD",
|
||||
"size": 28377364,
|
||||
"sha1": "64c13b951a845ca7f8081f68138a6181557458d1",
|
||||
"md5": "2fed2031a5b03892106e0f117f17901f",
|
||||
"sha256": "81e4d4402853392fbf2ebf52f9c19cf97754a84f6dd3e5919036241de1ffe52a",
|
||||
"crc32": "4234ace5",
|
||||
"adler32": "a0bc562a"
|
||||
},
|
||||
"9fbc66aedef7fe3bae0986cdb9323d2b8db4c9d3": {
|
||||
"path": "bios/Id Software/Doom/TNT.WAD",
|
||||
"name": "TNT.WAD",
|
||||
"size": 18195736,
|
||||
"sha1": "9fbc66aedef7fe3bae0986cdb9323d2b8db4c9d3",
|
||||
"md5": "4e158d9953c79ccf97bd0663244cc6b6",
|
||||
"sha256": "c0a9c29d023af2737953663d0e03177d9b7b7b64146c158dcc2a07f9ec18f353",
|
||||
"crc32": "903dcc27",
|
||||
"adler32": "cd062fca"
|
||||
},
|
||||
"ec6883100d807b894a98f426d024d22c77b63e7f": {
|
||||
"path": "bios/Id Software/Doom/VOICES.WAD",
|
||||
"name": "VOICES.WAD",
|
||||
"size": 27319149,
|
||||
"sha1": "ec6883100d807b894a98f426d024d22c77b63e7f",
|
||||
"md5": "082234d6a3f7086424856478b5aa9e95",
|
||||
"sha256": "3f7a9c37a23dc30bb3b8415e782ea6c78d59e6b2ed4b50ae255ff0365349110c",
|
||||
"crc32": "cd12ebcf",
|
||||
"adler32": "28b023c9"
|
||||
},
|
||||
"5f4aed208301449c2e9514edfd325fe9dead76fa": {
|
||||
"path": "bios/Id Software/Doom/prboom.wad",
|
||||
"name": "prboom.wad",
|
||||
@@ -70107,6 +70257,21 @@
|
||||
"8ecd11275ad418d302cd358b408b01ec": "10f1a7204f69b82a18bc94a3010c9660aec0c802",
|
||||
"ec2a977f0c0645dd284010160caec636": "c0ee6f9443fa82c0fef5d497b3e76aa3077f1865",
|
||||
"19d55c537767a7424a8e376d62fc2ac0": "72c60172fb1ba77c9b24b06b7755f0a16f0b3a13",
|
||||
"25485721882b050afa96a56e5758dd52": "eca9cff1014ce5081804e193588d96c6ddb35432",
|
||||
"1cd63c5ddff1bf8ce844237f580e9cf3": "7742089b4468a736cadb659a7deca3320fe6dcbd",
|
||||
"f0cefca49926d00903cf57551d901abe": "5b2e249b9c5133ec987b3ea77596381dc0d6bc1d",
|
||||
"25e1459ca71d321525f84628f45ca8cd": "7ec7652fcfce8ddc6e801839291f0e28ef1d5ae7",
|
||||
"3cb02349b3df649c86290907eed64e7b": "d510c877031bbd5f3d198581a2c8651e09b9861f",
|
||||
"e16e17f59afe7b3297f53ebe7e9de815": "ae363db8cd5645e1753d9bacc82cc0724e8e7f21",
|
||||
"66d686b1ed6d35ff103f15dbd30e0341": "f489d479371df32f6d280a0cb23b59a35ba2b833",
|
||||
"ae779722390ec32fa37b0d361f7d82f8": "b4c50ca9bea07f7c35250a1a11906091971c05ae",
|
||||
"78d5898e99e220e4de64edaa0e479593": "081f6a2024643b54ef4a436a85508539b6d20a1e",
|
||||
"abb033caf81e26f12a2103e1fa25453f": "4b53832f0733c1e29e5f1de2428e5475e891af29",
|
||||
"75c8cf89566741fa9d22447604053bd7": "90361e2a538d2388506657252ae41aceeb1ba360",
|
||||
"bb545b9c4eca0ff92c14d466b3294023": "bc0a110bf27aee89a0b2fc8111e2391ede891b8d",
|
||||
"2fed2031a5b03892106e0f117f17901f": "64c13b951a845ca7f8081f68138a6181557458d1",
|
||||
"4e158d9953c79ccf97bd0663244cc6b6": "9fbc66aedef7fe3bae0986cdb9323d2b8db4c9d3",
|
||||
"082234d6a3f7086424856478b5aa9e95": "ec6883100d807b894a98f426d024d22c77b63e7f",
|
||||
"72ae1b47820fcc93cc0df9c428d0face": "5f4aed208301449c2e9514edfd325fe9dead76fa",
|
||||
"dbaa5c4e20a11000d1c4db3a2a28f374": "f3f2a11f3ecd91cd62d74c3acfad68a4cc6ddbd9",
|
||||
"c011b428819eea4a80b455c245a5a04d": "9259b87edfe9b9f6d0749788a75a6ccf158f50aa",
|
||||
@@ -82071,6 +82236,51 @@
|
||||
"ALI1429G.AMW": [
|
||||
"72c60172fb1ba77c9b24b06b7755f0a16f0b3a13"
|
||||
],
|
||||
"CHEX.WAD": [
|
||||
"eca9cff1014ce5081804e193588d96c6ddb35432"
|
||||
],
|
||||
"DOOM.WAD": [
|
||||
"7742089b4468a736cadb659a7deca3320fe6dcbd"
|
||||
],
|
||||
"DOOM1.WAD": [
|
||||
"5b2e249b9c5133ec987b3ea77596381dc0d6bc1d"
|
||||
],
|
||||
"DOOM2.WAD": [
|
||||
"7ec7652fcfce8ddc6e801839291f0e28ef1d5ae7"
|
||||
],
|
||||
"DOOM2F.WAD": [
|
||||
"d510c877031bbd5f3d198581a2c8651e09b9861f"
|
||||
],
|
||||
"DOOM64.WAD": [
|
||||
"ae363db8cd5645e1753d9bacc82cc0724e8e7f21"
|
||||
],
|
||||
"HERETIC.WAD": [
|
||||
"f489d479371df32f6d280a0cb23b59a35ba2b833"
|
||||
],
|
||||
"HERETIC1.WAD": [
|
||||
"b4c50ca9bea07f7c35250a1a11906091971c05ae"
|
||||
],
|
||||
"HEXDD.WAD": [
|
||||
"081f6a2024643b54ef4a436a85508539b6d20a1e"
|
||||
],
|
||||
"HEXEN.WAD": [
|
||||
"4b53832f0733c1e29e5f1de2428e5475e891af29"
|
||||
],
|
||||
"PLUTONIA.WAD": [
|
||||
"90361e2a538d2388506657252ae41aceeb1ba360"
|
||||
],
|
||||
"STRIFE0.WAD": [
|
||||
"bc0a110bf27aee89a0b2fc8111e2391ede891b8d"
|
||||
],
|
||||
"STRIFE1.WAD": [
|
||||
"64c13b951a845ca7f8081f68138a6181557458d1"
|
||||
],
|
||||
"TNT.WAD": [
|
||||
"9fbc66aedef7fe3bae0986cdb9323d2b8db4c9d3"
|
||||
],
|
||||
"VOICES.WAD": [
|
||||
"ec6883100d807b894a98f426d024d22c77b63e7f"
|
||||
],
|
||||
"prboom.wad": [
|
||||
"5f4aed208301449c2e9514edfd325fe9dead76fa"
|
||||
],
|
||||
@@ -93221,6 +93431,207 @@
|
||||
"SCPH-70004_BIOS_V12_EUR_200.ROM2": [
|
||||
"1bae895fbdd658cfb56c53cc2139282cc1e778de"
|
||||
],
|
||||
"tos100uk.img": [
|
||||
"9a6e4c88533a9eaa4d55cdc040e47443e0226eb2"
|
||||
],
|
||||
"tos106de.img": [
|
||||
"3b8cf5ffa41b252eb67f8824f94608fa4005d6dd"
|
||||
],
|
||||
"tos206us.img": [
|
||||
"ee58768bdfc602c9b14942ce5481e97dd24e7c83"
|
||||
],
|
||||
"saturn_bios.bin": [
|
||||
"2b8cb4f87580683eb4d760e4ed210813d667f0a2",
|
||||
"df94c5b4d47eb3cc404d88b33a8fda237eaf4720"
|
||||
],
|
||||
"sega-saturn:af5828fdff51384f99b3c4926be27762": [
|
||||
"2b8cb4f87580683eb4d760e4ed210813d667f0a2"
|
||||
],
|
||||
"bios7.bin": [
|
||||
"24f67bdea115a2c847c8813a262502ee1607b7df"
|
||||
],
|
||||
"bios9.bin": [
|
||||
"bfaac75f101c135e32e2aaf541de6b1be4c8c62d"
|
||||
],
|
||||
"dsi_bios7.bin": [
|
||||
"a3aa751eb6bdaaf8a827ba9e03576a6f1ab0f547"
|
||||
],
|
||||
"dsi_bios9.bin": [
|
||||
"7bf549b8be9e48ab0cdc9b0fdadd49a5131f97eb"
|
||||
],
|
||||
"gb_bios.bin": [
|
||||
"4ed31ec6b0b175bb109c0eb5fd3d193da823339f",
|
||||
"1db57a1e8b6e4096f811587f9eab0c6675fd9755"
|
||||
],
|
||||
"dmg0_rom.bin": [
|
||||
"4ed31ec6b0b175bb109c0eb5fd3d193da823339f",
|
||||
"1db57a1e8b6e4096f811587f9eab0c6675fd9755"
|
||||
],
|
||||
"sgb_bios.bin": [
|
||||
"aa2f50a77dfb4823da96ba99309085a3c6278515",
|
||||
"369e6eb5e0c975eaa52a4a3f6ee07b2a3c3c16de",
|
||||
"f282b3aaf98f8423dab7d77f1aa0192be630f2fb"
|
||||
],
|
||||
"sgb1.boot.rom": [
|
||||
"aa2f50a77dfb4823da96ba99309085a3c6278515"
|
||||
],
|
||||
"SGB1.sfc": [
|
||||
"973e10840db683cf3faf61bd443090786b3a9f04"
|
||||
],
|
||||
"SGB1.sfc/program.rom": [
|
||||
"973e10840db683cf3faf61bd443090786b3a9f04"
|
||||
],
|
||||
"SGB2.sfc": [
|
||||
"e5b2922ca137051059e4269b236d07a22c07bc84"
|
||||
],
|
||||
"SGB2.sfc/program.rom": [
|
||||
"e5b2922ca137051059e4269b236d07a22c07bc84"
|
||||
],
|
||||
"fs-a1gt_kanjifont.rom": [
|
||||
"5aff2d9b6efc723bc395b0f96f0adfa83cc54a49"
|
||||
],
|
||||
"fs-a1wsx_kanjifont.rom": [
|
||||
"5aff2d9b6efc723bc395b0f96f0adfa83cc54a49"
|
||||
],
|
||||
"yrw801.rom": [
|
||||
"32760893ce06dbe3930627755ba065cc3d8ec6ca"
|
||||
],
|
||||
"fs-a1wsx_msx2psub.rom": [
|
||||
"fe0254cbfc11405b79e7c86c7769bd6322b04995"
|
||||
],
|
||||
"MSX2PEXT.rom": [
|
||||
"fe0254cbfc11405b79e7c86c7769bd6322b04995"
|
||||
],
|
||||
"fs-a1wsx_kanjibasic.rom": [
|
||||
"dcc3a67732aa01c4f2ee8d1ad886444a4dbafe06"
|
||||
],
|
||||
"fs-a1wsx_disk.rom": [
|
||||
"7ed7c55e0359737ac5e68d38cb6903f9e5d7c2b6"
|
||||
],
|
||||
"kick37350.A600": [
|
||||
"02843c4253bbd29aba535b0aa3bd9a85034ecde4"
|
||||
],
|
||||
"amiga-os-120.rom": [
|
||||
"11f9e62cf299f72184835b7b2a70a16333fc0d88"
|
||||
],
|
||||
"Kickstart v1.2 rev 33.180 (1986)(Commodore)(A500-A2000)[!].rom": [
|
||||
"11f9e62cf299f72184835b7b2a70a16333fc0d88"
|
||||
],
|
||||
"Kickstart v1.2 rev 33.180 (1986)(Commodore)(A500-A1000-A2000).rom": [
|
||||
"11f9e62cf299f72184835b7b2a70a16333fc0d88"
|
||||
],
|
||||
"amiga-os-130.rom": [
|
||||
"891e9a547772fe0c6c19b610baf8bc4ea7fcb785"
|
||||
],
|
||||
"Kickstart v1.3 rev 34.5 (1987)(Commodore)(A500-A1000-A2000-CDTV)[!].rom": [
|
||||
"891e9a547772fe0c6c19b610baf8bc4ea7fcb785"
|
||||
],
|
||||
"Kickstart v1.3 rev 34.5 (1987)(Commodore)(A500-A1000-A2000-CDTV).rom": [
|
||||
"891e9a547772fe0c6c19b610baf8bc4ea7fcb785"
|
||||
],
|
||||
"amiga-os-204.rom": [
|
||||
"c5839f5cb98a7a8947065c3ed2f14f5f42e334a1"
|
||||
],
|
||||
"Kickstart v2.04 rev 37.175 (1991)(Commodore)(A500+)[!].rom": [
|
||||
"c5839f5cb98a7a8947065c3ed2f14f5f42e334a1"
|
||||
],
|
||||
"Kickstart v2.04 rev 37.175 (1991)(Commodore)(A500+).rom": [
|
||||
"c5839f5cb98a7a8947065c3ed2f14f5f42e334a1"
|
||||
],
|
||||
"amiga-os-310-a600.rom": [
|
||||
"3b7f1493b27e212830f989f26ca76c02049f09ca"
|
||||
],
|
||||
"Kickstart v3.1 rev 40.63 (1993)(Commodore)(A500-A600-A2000)[!].rom": [
|
||||
"3b7f1493b27e212830f989f26ca76c02049f09ca"
|
||||
],
|
||||
"Kickstart v3.1 rev 40.63 (1993)(Commodore)(A500-A600-A2000).rom": [
|
||||
"3b7f1493b27e212830f989f26ca76c02049f09ca"
|
||||
],
|
||||
"amiga-ext-130-cdtv.rom": [
|
||||
"7ba40ffa17e500ed9fed041f3424bd81d9c907be"
|
||||
],
|
||||
"amiga-os-130-cdtv-ext.rom": [
|
||||
"7ba40ffa17e500ed9fed041f3424bd81d9c907be"
|
||||
],
|
||||
"CDTV Extended-ROM v1.0 (1991)(Commodore)(CDTV)[!].rom": [
|
||||
"7ba40ffa17e500ed9fed041f3424bd81d9c907be"
|
||||
],
|
||||
"CDTV Extended-ROM v1.0 (1992)(Commodore)(CDTV).rom": [
|
||||
"7ba40ffa17e500ed9fed041f3424bd81d9c907be"
|
||||
],
|
||||
"amiga-os-300-a1200.rom": [
|
||||
"70033828182fffc7ed106e5373a8b89dda76faa5"
|
||||
],
|
||||
"Kickstart v3.0 rev 39.106 (1992)(Commodore)(A1200)[!].rom": [
|
||||
"70033828182fffc7ed106e5373a8b89dda76faa5"
|
||||
],
|
||||
"amiga-os-310-a1200.rom": [
|
||||
"e21545723fe8374e91342617604f1b3d703094f1"
|
||||
],
|
||||
"AmigaVision.rom": [
|
||||
"e21545723fe8374e91342617604f1b3d703094f1"
|
||||
],
|
||||
"Kickstart v3.1 rev 40.68 (1993)(Commodore)(A1200)[!].rom": [
|
||||
"e21545723fe8374e91342617604f1b3d703094f1"
|
||||
],
|
||||
"Kickstart v3.1 rev 40.68 (1993)(Commodore)(A1200).rom": [
|
||||
"e21545723fe8374e91342617604f1b3d703094f1"
|
||||
],
|
||||
"amiga-os-310-a4000.rom": [
|
||||
"5fe04842d04a489720f0f4bb0e46948199406f49"
|
||||
],
|
||||
"Kickstart v3.1 rev 40.68 (1993)(Commodore)(A4000).rom": [
|
||||
"5fe04842d04a489720f0f4bb0e46948199406f49"
|
||||
],
|
||||
"amiga-os-310-cd32.rom": [
|
||||
"3525be8887f79b5929e017b42380a79edfee542d"
|
||||
],
|
||||
"Kickstart v3.1 rev 40.60 (1993)(Commodore)(CD32).rom": [
|
||||
"3525be8887f79b5929e017b42380a79edfee542d"
|
||||
],
|
||||
"amiga-ext-310-cd32.rom": [
|
||||
"5bef3d628ce59cc02a66e6e4ae0da48f60e78f7f"
|
||||
],
|
||||
"amiga-os-310-cd32-ext.rom": [
|
||||
"5bef3d628ce59cc02a66e6e4ae0da48f60e78f7f"
|
||||
],
|
||||
"CD32 Extended-ROM rev 40.60 (1993)(Commodore)(CD32).rom": [
|
||||
"5bef3d628ce59cc02a66e6e4ae0da48f60e78f7f"
|
||||
],
|
||||
"custom0.sf2": [
|
||||
"286b2e1fb21cc79851da01666db6c0b0e88f25e3"
|
||||
],
|
||||
"colecovision.rom": [
|
||||
"45bedc4cbdeac66c7df59e9e599195c778d86a92"
|
||||
],
|
||||
"coleco.rom": [
|
||||
"45bedc4cbdeac66c7df59e9e599195c778d86a92"
|
||||
],
|
||||
"boot.rom": [
|
||||
"45bedc4cbdeac66c7df59e9e599195c778d86a92"
|
||||
],
|
||||
"d2fdc.zip": [
|
||||
"bc39fbd5b9a8d2287ac5d0a42e639fc4d3c2f9d4",
|
||||
"af56c948598291b284a528f3fce06b961dba55e3"
|
||||
],
|
||||
"basic11.rom": [
|
||||
"9451a1a09d8f75944dbd6f91193fc360f1de80ac"
|
||||
],
|
||||
"basic21.bin": [
|
||||
"03bbb386cf530e804363acdfc1d13e64cf28af2e"
|
||||
],
|
||||
"exos21.bin": [
|
||||
"55315b20fecb4441a07ee4bc5dc7153f396e0a2e"
|
||||
],
|
||||
"EXOS21.ROM": [
|
||||
"55315b20fecb4441a07ee4bc5dc7153f396e0a2e"
|
||||
],
|
||||
"zx48.rom": [
|
||||
"5ea7c2b824672e914525d1d5c419d71b84a426a2"
|
||||
],
|
||||
"zxs:48.rom": [
|
||||
"5ea7c2b824672e914525d1d5c419d71b84a426a2"
|
||||
],
|
||||
"sony-playstation:239665b1a3dade1b5a52c06338011044": [
|
||||
"343883a7b555646da8cee54aadd2795b6e7dd070"
|
||||
],
|
||||
@@ -93353,6 +93764,9 @@
|
||||
"sony-playstation:c53ca5908936d412331790f4426c6c33": [
|
||||
"96880d1ca92a016ff054be5159bb06fe03cb4e14"
|
||||
],
|
||||
"PSXONPSP660.BIN": [
|
||||
"96880d1ca92a016ff054be5159bb06fe03cb4e14"
|
||||
],
|
||||
"PSXONPSP660.bin": [
|
||||
"96880d1ca92a016ff054be5159bb06fe03cb4e14"
|
||||
],
|
||||
@@ -93632,13 +94046,6 @@
|
||||
"sega-mega-cd:baca1df271d7c11fe50087c0358f4eb5": [
|
||||
"2b125c0545afa089b617f2558e686ea723bdc06e"
|
||||
],
|
||||
"sega-saturn:af5828fdff51384f99b3c4926be27762": [
|
||||
"2b8cb4f87580683eb4d760e4ed210813d667f0a2"
|
||||
],
|
||||
"saturn_bios.bin": [
|
||||
"2b8cb4f87580683eb4d760e4ed210813d667f0a2",
|
||||
"df94c5b4d47eb3cc404d88b33a8fda237eaf4720"
|
||||
],
|
||||
"sega-saturn:85ec9ca47d8f6807718151cbcca8b964": [
|
||||
"df94c5b4d47eb3cc404d88b33a8fda237eaf4720"
|
||||
],
|
||||
@@ -93660,200 +94067,6 @@
|
||||
"sega-saturn:0306c0e408d6682dd2d86324bd4ac661": [
|
||||
"8c031bf9908fd0142fdd10a9cdd79389f8a3f2fc"
|
||||
],
|
||||
"tos100uk.img": [
|
||||
"9a6e4c88533a9eaa4d55cdc040e47443e0226eb2"
|
||||
],
|
||||
"tos106de.img": [
|
||||
"3b8cf5ffa41b252eb67f8824f94608fa4005d6dd"
|
||||
],
|
||||
"tos206us.img": [
|
||||
"ee58768bdfc602c9b14942ce5481e97dd24e7c83"
|
||||
],
|
||||
"bios7.bin": [
|
||||
"24f67bdea115a2c847c8813a262502ee1607b7df"
|
||||
],
|
||||
"bios9.bin": [
|
||||
"bfaac75f101c135e32e2aaf541de6b1be4c8c62d"
|
||||
],
|
||||
"dsi_bios7.bin": [
|
||||
"a3aa751eb6bdaaf8a827ba9e03576a6f1ab0f547"
|
||||
],
|
||||
"dsi_bios9.bin": [
|
||||
"7bf549b8be9e48ab0cdc9b0fdadd49a5131f97eb"
|
||||
],
|
||||
"gb_bios.bin": [
|
||||
"4ed31ec6b0b175bb109c0eb5fd3d193da823339f",
|
||||
"1db57a1e8b6e4096f811587f9eab0c6675fd9755"
|
||||
],
|
||||
"dmg0_rom.bin": [
|
||||
"4ed31ec6b0b175bb109c0eb5fd3d193da823339f",
|
||||
"1db57a1e8b6e4096f811587f9eab0c6675fd9755"
|
||||
],
|
||||
"sgb_bios.bin": [
|
||||
"aa2f50a77dfb4823da96ba99309085a3c6278515",
|
||||
"369e6eb5e0c975eaa52a4a3f6ee07b2a3c3c16de",
|
||||
"f282b3aaf98f8423dab7d77f1aa0192be630f2fb"
|
||||
],
|
||||
"sgb1.boot.rom": [
|
||||
"aa2f50a77dfb4823da96ba99309085a3c6278515"
|
||||
],
|
||||
"SGB1.sfc": [
|
||||
"973e10840db683cf3faf61bd443090786b3a9f04"
|
||||
],
|
||||
"SGB1.sfc/program.rom": [
|
||||
"973e10840db683cf3faf61bd443090786b3a9f04"
|
||||
],
|
||||
"SGB2.sfc": [
|
||||
"e5b2922ca137051059e4269b236d07a22c07bc84"
|
||||
],
|
||||
"SGB2.sfc/program.rom": [
|
||||
"e5b2922ca137051059e4269b236d07a22c07bc84"
|
||||
],
|
||||
"fs-a1gt_kanjifont.rom": [
|
||||
"5aff2d9b6efc723bc395b0f96f0adfa83cc54a49"
|
||||
],
|
||||
"fs-a1wsx_kanjifont.rom": [
|
||||
"5aff2d9b6efc723bc395b0f96f0adfa83cc54a49"
|
||||
],
|
||||
"yrw801.rom": [
|
||||
"32760893ce06dbe3930627755ba065cc3d8ec6ca"
|
||||
],
|
||||
"fs-a1wsx_msx2psub.rom": [
|
||||
"fe0254cbfc11405b79e7c86c7769bd6322b04995"
|
||||
],
|
||||
"MSX2PEXT.rom": [
|
||||
"fe0254cbfc11405b79e7c86c7769bd6322b04995"
|
||||
],
|
||||
"fs-a1wsx_kanjibasic.rom": [
|
||||
"dcc3a67732aa01c4f2ee8d1ad886444a4dbafe06"
|
||||
],
|
||||
"fs-a1wsx_disk.rom": [
|
||||
"7ed7c55e0359737ac5e68d38cb6903f9e5d7c2b6"
|
||||
],
|
||||
"kick37350.A600": [
|
||||
"02843c4253bbd29aba535b0aa3bd9a85034ecde4"
|
||||
],
|
||||
"amiga-os-120.rom": [
|
||||
"11f9e62cf299f72184835b7b2a70a16333fc0d88"
|
||||
],
|
||||
"Kickstart v1.2 rev 33.180 (1986)(Commodore)(A500-A2000)[!].rom": [
|
||||
"11f9e62cf299f72184835b7b2a70a16333fc0d88"
|
||||
],
|
||||
"Kickstart v1.2 rev 33.180 (1986)(Commodore)(A500-A1000-A2000).rom": [
|
||||
"11f9e62cf299f72184835b7b2a70a16333fc0d88"
|
||||
],
|
||||
"amiga-os-130.rom": [
|
||||
"891e9a547772fe0c6c19b610baf8bc4ea7fcb785"
|
||||
],
|
||||
"Kickstart v1.3 rev 34.5 (1987)(Commodore)(A500-A1000-A2000-CDTV)[!].rom": [
|
||||
"891e9a547772fe0c6c19b610baf8bc4ea7fcb785"
|
||||
],
|
||||
"Kickstart v1.3 rev 34.5 (1987)(Commodore)(A500-A1000-A2000-CDTV).rom": [
|
||||
"891e9a547772fe0c6c19b610baf8bc4ea7fcb785"
|
||||
],
|
||||
"amiga-os-204.rom": [
|
||||
"c5839f5cb98a7a8947065c3ed2f14f5f42e334a1"
|
||||
],
|
||||
"Kickstart v2.04 rev 37.175 (1991)(Commodore)(A500+)[!].rom": [
|
||||
"c5839f5cb98a7a8947065c3ed2f14f5f42e334a1"
|
||||
],
|
||||
"Kickstart v2.04 rev 37.175 (1991)(Commodore)(A500+).rom": [
|
||||
"c5839f5cb98a7a8947065c3ed2f14f5f42e334a1"
|
||||
],
|
||||
"amiga-os-310-a600.rom": [
|
||||
"3b7f1493b27e212830f989f26ca76c02049f09ca"
|
||||
],
|
||||
"Kickstart v3.1 rev 40.63 (1993)(Commodore)(A500-A600-A2000)[!].rom": [
|
||||
"3b7f1493b27e212830f989f26ca76c02049f09ca"
|
||||
],
|
||||
"Kickstart v3.1 rev 40.63 (1993)(Commodore)(A500-A600-A2000).rom": [
|
||||
"3b7f1493b27e212830f989f26ca76c02049f09ca"
|
||||
],
|
||||
"amiga-ext-130-cdtv.rom": [
|
||||
"7ba40ffa17e500ed9fed041f3424bd81d9c907be"
|
||||
],
|
||||
"amiga-os-130-cdtv-ext.rom": [
|
||||
"7ba40ffa17e500ed9fed041f3424bd81d9c907be"
|
||||
],
|
||||
"CDTV Extended-ROM v1.0 (1991)(Commodore)(CDTV)[!].rom": [
|
||||
"7ba40ffa17e500ed9fed041f3424bd81d9c907be"
|
||||
],
|
||||
"CDTV Extended-ROM v1.0 (1992)(Commodore)(CDTV).rom": [
|
||||
"7ba40ffa17e500ed9fed041f3424bd81d9c907be"
|
||||
],
|
||||
"amiga-os-300-a1200.rom": [
|
||||
"70033828182fffc7ed106e5373a8b89dda76faa5"
|
||||
],
|
||||
"Kickstart v3.0 rev 39.106 (1992)(Commodore)(A1200)[!].rom": [
|
||||
"70033828182fffc7ed106e5373a8b89dda76faa5"
|
||||
],
|
||||
"amiga-os-310-a1200.rom": [
|
||||
"e21545723fe8374e91342617604f1b3d703094f1"
|
||||
],
|
||||
"AmigaVision.rom": [
|
||||
"e21545723fe8374e91342617604f1b3d703094f1"
|
||||
],
|
||||
"Kickstart v3.1 rev 40.68 (1993)(Commodore)(A1200)[!].rom": [
|
||||
"e21545723fe8374e91342617604f1b3d703094f1"
|
||||
],
|
||||
"Kickstart v3.1 rev 40.68 (1993)(Commodore)(A1200).rom": [
|
||||
"e21545723fe8374e91342617604f1b3d703094f1"
|
||||
],
|
||||
"amiga-os-310-a4000.rom": [
|
||||
"5fe04842d04a489720f0f4bb0e46948199406f49"
|
||||
],
|
||||
"Kickstart v3.1 rev 40.68 (1993)(Commodore)(A4000).rom": [
|
||||
"5fe04842d04a489720f0f4bb0e46948199406f49"
|
||||
],
|
||||
"amiga-os-310-cd32.rom": [
|
||||
"3525be8887f79b5929e017b42380a79edfee542d"
|
||||
],
|
||||
"Kickstart v3.1 rev 40.60 (1993)(Commodore)(CD32).rom": [
|
||||
"3525be8887f79b5929e017b42380a79edfee542d"
|
||||
],
|
||||
"amiga-ext-310-cd32.rom": [
|
||||
"5bef3d628ce59cc02a66e6e4ae0da48f60e78f7f"
|
||||
],
|
||||
"amiga-os-310-cd32-ext.rom": [
|
||||
"5bef3d628ce59cc02a66e6e4ae0da48f60e78f7f"
|
||||
],
|
||||
"CD32 Extended-ROM rev 40.60 (1993)(Commodore)(CD32).rom": [
|
||||
"5bef3d628ce59cc02a66e6e4ae0da48f60e78f7f"
|
||||
],
|
||||
"custom0.sf2": [
|
||||
"286b2e1fb21cc79851da01666db6c0b0e88f25e3"
|
||||
],
|
||||
"colecovision.rom": [
|
||||
"45bedc4cbdeac66c7df59e9e599195c778d86a92"
|
||||
],
|
||||
"coleco.rom": [
|
||||
"45bedc4cbdeac66c7df59e9e599195c778d86a92"
|
||||
],
|
||||
"boot.rom": [
|
||||
"45bedc4cbdeac66c7df59e9e599195c778d86a92"
|
||||
],
|
||||
"d2fdc.zip": [
|
||||
"bc39fbd5b9a8d2287ac5d0a42e639fc4d3c2f9d4",
|
||||
"af56c948598291b284a528f3fce06b961dba55e3"
|
||||
],
|
||||
"basic11.rom": [
|
||||
"9451a1a09d8f75944dbd6f91193fc360f1de80ac"
|
||||
],
|
||||
"basic21.bin": [
|
||||
"03bbb386cf530e804363acdfc1d13e64cf28af2e"
|
||||
],
|
||||
"exos21.bin": [
|
||||
"55315b20fecb4441a07ee4bc5dc7153f396e0a2e"
|
||||
],
|
||||
"EXOS21.ROM": [
|
||||
"55315b20fecb4441a07ee4bc5dc7153f396e0a2e"
|
||||
],
|
||||
"zx48.rom": [
|
||||
"5ea7c2b824672e914525d1d5c419d71b84a426a2"
|
||||
],
|
||||
"zxs:48.rom": [
|
||||
"5ea7c2b824672e914525d1d5c419d71b84a426a2"
|
||||
],
|
||||
"apple2gs1.rom": [
|
||||
"e4fc7560b69d062cb2da5b1ffbe11cd1ca03cc37"
|
||||
],
|
||||
@@ -93900,12 +94113,6 @@
|
||||
"d64tano.rom": [
|
||||
"1983b4fb398e3dd9668d424c666c5a0b3f1e2b69"
|
||||
],
|
||||
"d64_1.rom": [
|
||||
"f119506eaa3b4b70b9aa0dd83761e8cbe043d042"
|
||||
],
|
||||
"fs-5500_disk.rom": [
|
||||
"78cd7f847e77fd8cd51a647efb2725ba93f4c471"
|
||||
],
|
||||
"pcfxbios.bin": [
|
||||
"1a77fd83e337f906aecab27a1604db064cf10074"
|
||||
],
|
||||
@@ -93919,6 +94126,12 @@
|
||||
"plus3e-3.rom": [
|
||||
"65f031caa8148a5493afe42c41f4929deab26b4e"
|
||||
],
|
||||
"d64_1.rom": [
|
||||
"f119506eaa3b4b70b9aa0dd83761e8cbe043d042"
|
||||
],
|
||||
"fs-5500_disk.rom": [
|
||||
"78cd7f847e77fd8cd51a647efb2725ba93f4c471"
|
||||
],
|
||||
"a1000kbd_fr.zip": [
|
||||
"93d36de4d5d376c521a9ca99722f659e60d177f2"
|
||||
],
|
||||
@@ -98129,6 +98342,21 @@
|
||||
"0f3e6586": "10f1a7204f69b82a18bc94a3010c9660aec0c802",
|
||||
"e75945f3": "c0ee6f9443fa82c0fef5d497b3e76aa3077f1865",
|
||||
"0636e0be": "72c60172fb1ba77c9b24b06b7755f0a16f0b3a13",
|
||||
"298dd5b5": "eca9cff1014ce5081804e193588d96c6ddb35432",
|
||||
"723e60f9": "7742089b4468a736cadb659a7deca3320fe6dcbd",
|
||||
"162b696a": "5b2e249b9c5133ec987b3ea77596381dc0d6bc1d",
|
||||
"ec8725db": "7ec7652fcfce8ddc6e801839291f0e28ef1d5ae7",
|
||||
"27eaae69": "d510c877031bbd5f3d198581a2c8651e09b9861f",
|
||||
"cb10a53d": "ae363db8cd5645e1753d9bacc82cc0724e8e7f21",
|
||||
"5b16049e": "f489d479371df32f6d280a0cb23b59a35ba2b833",
|
||||
"22d3f0ca": "b4c50ca9bea07f7c35250a1a11906091971c05ae",
|
||||
"fd5eb11d": "081f6a2024643b54ef4a436a85508539b6d20a1e",
|
||||
"dca9114c": "4b53832f0733c1e29e5f1de2428e5475e891af29",
|
||||
"48d1453c": "90361e2a538d2388506657252ae41aceeb1ba360",
|
||||
"93c144dd": "bc0a110bf27aee89a0b2fc8111e2391ede891b8d",
|
||||
"4234ace5": "64c13b951a845ca7f8081f68138a6181557458d1",
|
||||
"903dcc27": "9fbc66aedef7fe3bae0986cdb9323d2b8db4c9d3",
|
||||
"cd12ebcf": "ec6883100d807b894a98f426d024d22c77b63e7f",
|
||||
"a5751b99": "5f4aed208301449c2e9514edfd325fe9dead76fa",
|
||||
"7f9a2c1e": "f3f2a11f3ecd91cd62d74c3acfad68a4cc6ddbd9",
|
||||
"26dc3fba": "9259b87edfe9b9f6d0749788a75a6ccf158f50aa",
|
||||
@@ -115312,6 +115540,42 @@
|
||||
"1c1a0d8c9f4c446ccd7470516b215ddca5052fb2",
|
||||
"80080644289ed93d71a1103992a154cc9802b2fa",
|
||||
"434bc0b4eb4827da0773ec0795aadc5162569a07",
|
||||
"9a6e4c88533a9eaa4d55cdc040e47443e0226eb2",
|
||||
"3b8cf5ffa41b252eb67f8824f94608fa4005d6dd",
|
||||
"ee58768bdfc602c9b14942ce5481e97dd24e7c83",
|
||||
"2b8cb4f87580683eb4d760e4ed210813d667f0a2",
|
||||
"24f67bdea115a2c847c8813a262502ee1607b7df",
|
||||
"bfaac75f101c135e32e2aaf541de6b1be4c8c62d",
|
||||
"a3aa751eb6bdaaf8a827ba9e03576a6f1ab0f547",
|
||||
"7bf549b8be9e48ab0cdc9b0fdadd49a5131f97eb",
|
||||
"4ed31ec6b0b175bb109c0eb5fd3d193da823339f",
|
||||
"aa2f50a77dfb4823da96ba99309085a3c6278515",
|
||||
"973e10840db683cf3faf61bd443090786b3a9f04",
|
||||
"e5b2922ca137051059e4269b236d07a22c07bc84",
|
||||
"5aff2d9b6efc723bc395b0f96f0adfa83cc54a49",
|
||||
"32760893ce06dbe3930627755ba065cc3d8ec6ca",
|
||||
"fe0254cbfc11405b79e7c86c7769bd6322b04995",
|
||||
"dcc3a67732aa01c4f2ee8d1ad886444a4dbafe06",
|
||||
"7ed7c55e0359737ac5e68d38cb6903f9e5d7c2b6",
|
||||
"02843c4253bbd29aba535b0aa3bd9a85034ecde4",
|
||||
"11f9e62cf299f72184835b7b2a70a16333fc0d88",
|
||||
"891e9a547772fe0c6c19b610baf8bc4ea7fcb785",
|
||||
"c5839f5cb98a7a8947065c3ed2f14f5f42e334a1",
|
||||
"3b7f1493b27e212830f989f26ca76c02049f09ca",
|
||||
"7ba40ffa17e500ed9fed041f3424bd81d9c907be",
|
||||
"70033828182fffc7ed106e5373a8b89dda76faa5",
|
||||
"e21545723fe8374e91342617604f1b3d703094f1",
|
||||
"5fe04842d04a489720f0f4bb0e46948199406f49",
|
||||
"3525be8887f79b5929e017b42380a79edfee542d",
|
||||
"5bef3d628ce59cc02a66e6e4ae0da48f60e78f7f",
|
||||
"44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3",
|
||||
"286b2e1fb21cc79851da01666db6c0b0e88f25e3",
|
||||
"45bedc4cbdeac66c7df59e9e599195c778d86a92",
|
||||
"bc39fbd5b9a8d2287ac5d0a42e639fc4d3c2f9d4",
|
||||
"9451a1a09d8f75944dbd6f91193fc360f1de80ac",
|
||||
"03bbb386cf530e804363acdfc1d13e64cf28af2e",
|
||||
"55315b20fecb4441a07ee4bc5dc7153f396e0a2e",
|
||||
"5ea7c2b824672e914525d1d5c419d71b84a426a2",
|
||||
"343883a7b555646da8cee54aadd2795b6e7dd070",
|
||||
"1a8d6f9453111b1d317bb7dae300495fbf54600c",
|
||||
"b06f4a861f74270be819aa2a07db8d0563a7cc4e",
|
||||
@@ -115427,7 +115691,6 @@
|
||||
"f5f60f03501908962446ee02fc27d98694dd157d",
|
||||
"328a3228c29fba244b9db2055adc1ec4f7a87e6b",
|
||||
"2b125c0545afa089b617f2558e686ea723bdc06e",
|
||||
"2b8cb4f87580683eb4d760e4ed210813d667f0a2",
|
||||
"df94c5b4d47eb3cc404d88b33a8fda237eaf4720",
|
||||
"3bb41feb82838ab9a35601ac666de5aacfd17a58",
|
||||
"faa8ea183a6d7bbe5d4e03bb1332519800d3fbc3",
|
||||
@@ -115435,41 +115698,6 @@
|
||||
"49d8493008fa715ca0c94d99817a5439d6f2c796",
|
||||
"8a22710e09ce75f39625894366cafe503ed1942d",
|
||||
"8c031bf9908fd0142fdd10a9cdd79389f8a3f2fc",
|
||||
"9a6e4c88533a9eaa4d55cdc040e47443e0226eb2",
|
||||
"3b8cf5ffa41b252eb67f8824f94608fa4005d6dd",
|
||||
"ee58768bdfc602c9b14942ce5481e97dd24e7c83",
|
||||
"24f67bdea115a2c847c8813a262502ee1607b7df",
|
||||
"bfaac75f101c135e32e2aaf541de6b1be4c8c62d",
|
||||
"a3aa751eb6bdaaf8a827ba9e03576a6f1ab0f547",
|
||||
"7bf549b8be9e48ab0cdc9b0fdadd49a5131f97eb",
|
||||
"4ed31ec6b0b175bb109c0eb5fd3d193da823339f",
|
||||
"aa2f50a77dfb4823da96ba99309085a3c6278515",
|
||||
"973e10840db683cf3faf61bd443090786b3a9f04",
|
||||
"e5b2922ca137051059e4269b236d07a22c07bc84",
|
||||
"5aff2d9b6efc723bc395b0f96f0adfa83cc54a49",
|
||||
"32760893ce06dbe3930627755ba065cc3d8ec6ca",
|
||||
"fe0254cbfc11405b79e7c86c7769bd6322b04995",
|
||||
"dcc3a67732aa01c4f2ee8d1ad886444a4dbafe06",
|
||||
"7ed7c55e0359737ac5e68d38cb6903f9e5d7c2b6",
|
||||
"02843c4253bbd29aba535b0aa3bd9a85034ecde4",
|
||||
"11f9e62cf299f72184835b7b2a70a16333fc0d88",
|
||||
"891e9a547772fe0c6c19b610baf8bc4ea7fcb785",
|
||||
"c5839f5cb98a7a8947065c3ed2f14f5f42e334a1",
|
||||
"3b7f1493b27e212830f989f26ca76c02049f09ca",
|
||||
"7ba40ffa17e500ed9fed041f3424bd81d9c907be",
|
||||
"70033828182fffc7ed106e5373a8b89dda76faa5",
|
||||
"e21545723fe8374e91342617604f1b3d703094f1",
|
||||
"5fe04842d04a489720f0f4bb0e46948199406f49",
|
||||
"3525be8887f79b5929e017b42380a79edfee542d",
|
||||
"5bef3d628ce59cc02a66e6e4ae0da48f60e78f7f",
|
||||
"44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3",
|
||||
"286b2e1fb21cc79851da01666db6c0b0e88f25e3",
|
||||
"45bedc4cbdeac66c7df59e9e599195c778d86a92",
|
||||
"bc39fbd5b9a8d2287ac5d0a42e639fc4d3c2f9d4",
|
||||
"9451a1a09d8f75944dbd6f91193fc360f1de80ac",
|
||||
"03bbb386cf530e804363acdfc1d13e64cf28af2e",
|
||||
"55315b20fecb4441a07ee4bc5dc7153f396e0a2e",
|
||||
"5ea7c2b824672e914525d1d5c419d71b84a426a2",
|
||||
"e4fc7560b69d062cb2da5b1ffbe11cd1ca03cc37",
|
||||
"bc32bc0e8902946663998f56aea52be597d9e361",
|
||||
"014881a959e045e00f4db8f52955200865d40280",
|
||||
@@ -115479,12 +115707,12 @@
|
||||
"04990aa1c3a3fc7294ec884b81deaa89832df614",
|
||||
"e3c8986bb1d44269c4587b04f1ca27a70b0aaa2e",
|
||||
"1983b4fb398e3dd9668d424c666c5a0b3f1e2b69",
|
||||
"f119506eaa3b4b70b9aa0dd83761e8cbe043d042",
|
||||
"78cd7f847e77fd8cd51a647efb2725ba93f4c471",
|
||||
"1a77fd83e337f906aecab27a1604db064cf10074",
|
||||
"93407ea10d2f30ab96a314d8eca44fe160aea734",
|
||||
"94d44d7f9529ec1642ba3771ed3c5f756d5bc872",
|
||||
"65f031caa8148a5493afe42c41f4929deab26b4e",
|
||||
"f119506eaa3b4b70b9aa0dd83761e8cbe043d042",
|
||||
"78cd7f847e77fd8cd51a647efb2725ba93f4c471",
|
||||
"93d36de4d5d376c521a9ca99722f659e60d177f2",
|
||||
"b22847ad1d8c5ee0fff41b3bd31aab6cbf8778ea",
|
||||
"e35eda0cc2c11da92c0a6c222f314d84e623b29e",
|
||||
|
||||
@@ -54,6 +54,7 @@ nav:
|
||||
- RetroBat: platforms/retrobat.md
|
||||
- RetroDECK: platforms/retrodeck.md
|
||||
- RetroPie: platforms/retropie.md
|
||||
- RomM: platforms/romm.md
|
||||
- Systems:
|
||||
- Overview: systems/index.md
|
||||
- 3DO Company: systems/3do-company.md
|
||||
|
||||
+2
-1
@@ -93,4 +93,5 @@ Full libretro docs: `https://docs.libretro.com/library/<core>/`
|
||||
| RetroBat | md5 | MD5 check via JSON config | `batocera-systems.json` |
|
||||
| EmuDeck | md5 | MD5 whitelist per system | `checkBIOS.sh` |
|
||||
| Recalbox | md5 | multi-hash comma-separated | `es_bios.xml` + `Bios.cpp` |
|
||||
| RomM | md5 | MD5 | `known_bios_files.json` |
|
||||
| RetroDECK | md5 | MD5 per file via component manifests | `api_data_processing.sh` |
|
||||
| RomM | md5 | size + any hash (MD5/SHA1/CRC32) | `firmware.py` |
|
||||
|
||||
+11
-7
@@ -86,6 +86,17 @@ platforms:
|
||||
# Each component/<name>/component_manifest.json declares BIOS requirements
|
||||
# Scraper enumerates top-level dirs via GitHub API, fetches each manifest directly
|
||||
|
||||
romm:
|
||||
config: romm.yml
|
||||
status: active
|
||||
logo: "https://avatars.githubusercontent.com/u/168586850"
|
||||
scraper: romm
|
||||
source_url: "https://raw.githubusercontent.com/rommapp/romm/master/backend/models/fixtures/known_bios_files.json"
|
||||
source_format: json
|
||||
hash_type: sha1
|
||||
schedule: monthly
|
||||
inherits_from: emulatorjs # cores inherited from emulatorjs.yml
|
||||
|
||||
retropie:
|
||||
config: retropie.yml
|
||||
status: archived # Last release: v4.8 (March 2022) - no update in 4 years
|
||||
@@ -93,10 +104,3 @@ platforms:
|
||||
scraper: null
|
||||
cores: all_libretro
|
||||
schedule: null
|
||||
|
||||
romm:
|
||||
config: romm.yml
|
||||
status: active
|
||||
logo: "https://raw.githubusercontent.com/rommapp/romm/master/.github/resources/isotipo.png"
|
||||
scraper: romm
|
||||
schedule: monthly
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
# EmulatorJS base config (not a standalone platform).
|
||||
# Provides the core list for platforms that use EmulatorJS as their emulation engine.
|
||||
# Source: emulatorjs/emulatorjs data/src/consts.js + emulatorjs/build cores.json
|
||||
# RomM mapping: rommapp/romm frontend/src/utils/index.ts (_EJS_CORES_MAP)
|
||||
platform: EmulatorJS
|
||||
version: "4.2.3"
|
||||
homepage: "https://emulatorjs.org"
|
||||
source: "https://github.com/emulatorjs/emulatorjs"
|
||||
cores:
|
||||
- a5200
|
||||
- beetle_vb
|
||||
- cap32
|
||||
- crocods
|
||||
- desmume
|
||||
- desmume2015
|
||||
- dosbox_pure
|
||||
- fbalpha2012_cps1
|
||||
- fbalpha2012_cps2
|
||||
- fbneo
|
||||
- fceumm
|
||||
- freeintv
|
||||
- fuse
|
||||
- gambatte
|
||||
- gearcoleco
|
||||
- genesis_plus_gx
|
||||
- handy
|
||||
- mame2003
|
||||
- mame2003_plus
|
||||
- mednafen_ngp
|
||||
- mednafen_pce
|
||||
- mednafen_pcfx
|
||||
- mednafen_psx_hw
|
||||
- mednafen_wswan
|
||||
- melonds
|
||||
- mgba
|
||||
- mupen64plus_next
|
||||
- nestopia
|
||||
- opera
|
||||
- parallel_n64
|
||||
- pcsx_rearmed
|
||||
- picodrive
|
||||
- ppsspp
|
||||
- prboom
|
||||
- prosystem
|
||||
- puae
|
||||
- same_cdi
|
||||
- smsplus
|
||||
- snes9x
|
||||
- stella2014
|
||||
- vice_x128
|
||||
- vice_x64
|
||||
- vice_x64sc
|
||||
- vice_xpet
|
||||
- vice_xplus4
|
||||
- vice_xvic
|
||||
- virtualjaguar
|
||||
- yabause
|
||||
+1578
-1206
File diff suppressed because it is too large
Load Diff
@@ -26,7 +26,7 @@ import urllib.error
|
||||
from pathlib import Path
|
||||
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
from common import load_database, load_platform_config
|
||||
from common import list_registered_platforms, load_database, load_platform_config
|
||||
|
||||
try:
|
||||
import yaml
|
||||
@@ -381,10 +381,9 @@ def main():
|
||||
db = load_database(args.db)
|
||||
|
||||
if args.all:
|
||||
platforms = []
|
||||
for f in Path(args.platforms_dir).glob("*.yml"):
|
||||
if not f.name.startswith("_"):
|
||||
platforms.append(f.stem)
|
||||
platforms = list_registered_platforms(
|
||||
args.platforms_dir, include_archived=True,
|
||||
)
|
||||
elif args.platform:
|
||||
platforms = [args.platform]
|
||||
else:
|
||||
|
||||
@@ -167,6 +167,31 @@ def load_data_dir_registry(platforms_dir: str = "platforms") -> dict:
|
||||
return data.get("data_directories", {})
|
||||
|
||||
|
||||
def list_registered_platforms(
|
||||
platforms_dir: str = "platforms",
|
||||
include_archived: bool = False,
|
||||
) -> list[str]:
|
||||
"""List platforms registered in _registry.yml.
|
||||
|
||||
Only registered platforms generate packs and appear in CI.
|
||||
Unregistered YAMLs (e.g., emulatorjs.yml) are base configs for inheritance.
|
||||
"""
|
||||
registry_path = os.path.join(platforms_dir, "_registry.yml")
|
||||
if not os.path.exists(registry_path):
|
||||
return []
|
||||
with open(registry_path) as f:
|
||||
registry = yaml.safe_load(f) or {}
|
||||
platforms = []
|
||||
for name, meta in sorted(registry.get("platforms", {}).items()):
|
||||
status = meta.get("status", "active")
|
||||
if status == "archived" and not include_archived:
|
||||
continue
|
||||
config_path = os.path.join(platforms_dir, meta.get("config", f"{name}.yml"))
|
||||
if os.path.exists(config_path):
|
||||
platforms.append(name)
|
||||
return platforms
|
||||
|
||||
|
||||
def resolve_local_file(
|
||||
file_entry: dict,
|
||||
db: dict,
|
||||
|
||||
@@ -25,7 +25,7 @@ except ImportError:
|
||||
sys.exit(1)
|
||||
|
||||
sys.path.insert(0, os.path.dirname(__file__))
|
||||
from common import load_database, load_emulator_profiles, load_platform_config
|
||||
from common import list_registered_platforms, load_database, load_emulator_profiles, load_platform_config
|
||||
|
||||
DEFAULT_EMULATORS_DIR = "emulators"
|
||||
DEFAULT_PLATFORMS_DIR = "platforms"
|
||||
@@ -36,10 +36,8 @@ def load_platform_files(platforms_dir: str) -> tuple[dict[str, set[str]], dict[s
|
||||
"""Load all platform configs and collect declared filenames + data_directories per system."""
|
||||
declared = {}
|
||||
platform_data_dirs = {}
|
||||
for f in sorted(Path(platforms_dir).glob("*.yml")):
|
||||
if f.name.startswith("_"):
|
||||
continue
|
||||
config = load_platform_config(f.stem, platforms_dir)
|
||||
for platform_name in list_registered_platforms(platforms_dir, include_archived=True):
|
||||
config = load_platform_config(platform_name, platforms_dir)
|
||||
for sys_id, system in config.get("systems", {}).items():
|
||||
for fe in system.get("files", []):
|
||||
name = fe.get("name", "")
|
||||
|
||||
@@ -18,7 +18,7 @@ from datetime import datetime, timezone
|
||||
from pathlib import Path
|
||||
|
||||
sys.path.insert(0, os.path.dirname(__file__))
|
||||
from common import compute_hashes
|
||||
from common import compute_hashes, list_registered_platforms
|
||||
|
||||
CACHE_DIR = ".cache"
|
||||
CACHE_FILE = os.path.join(CACHE_DIR, "db_cache.json")
|
||||
@@ -353,9 +353,8 @@ def _collect_all_aliases(files: dict) -> dict:
|
||||
if platforms_dir.is_dir():
|
||||
try:
|
||||
import yaml
|
||||
for config_file in platforms_dir.glob("*.yml"):
|
||||
if config_file.name.startswith("_"):
|
||||
continue
|
||||
for platform_name in list_registered_platforms(str(platforms_dir), include_archived=True):
|
||||
config_file = platforms_dir / f"{platform_name}.yml"
|
||||
try:
|
||||
with open(config_file) as f:
|
||||
config = yaml.safe_load(f) or {}
|
||||
|
||||
@@ -27,9 +27,10 @@ sys.path.insert(0, os.path.dirname(__file__))
|
||||
from common import (
|
||||
_build_validation_index, build_zip_contents_index, check_file_validation,
|
||||
check_inside_zip, compute_hashes, fetch_large_file, filter_files_by_mode,
|
||||
group_identical_platforms, list_emulator_profiles, list_system_ids,
|
||||
load_database, load_data_dir_registry, load_emulator_profiles,
|
||||
load_platform_config, md5_composite, resolve_local_file,
|
||||
group_identical_platforms, list_emulator_profiles, list_registered_platforms,
|
||||
list_system_ids, load_database, load_data_dir_registry,
|
||||
load_emulator_profiles, load_platform_config, md5_composite,
|
||||
resolve_local_file,
|
||||
)
|
||||
from deterministic_zip import rebuild_zip_deterministic
|
||||
|
||||
@@ -820,13 +821,8 @@ def generate_system_pack(
|
||||
|
||||
|
||||
def list_platforms(platforms_dir: str) -> list[str]:
|
||||
"""List available platform names from YAML files."""
|
||||
platforms = []
|
||||
for f in sorted(Path(platforms_dir).glob("*.yml")):
|
||||
if f.name.startswith("_"):
|
||||
continue
|
||||
platforms.append(f.stem)
|
||||
return platforms
|
||||
"""List available platform names from registry."""
|
||||
return list_registered_platforms(platforms_dir, include_archived=True)
|
||||
|
||||
|
||||
def main():
|
||||
@@ -901,9 +897,9 @@ def main():
|
||||
|
||||
# Platform mode (existing)
|
||||
if args.all:
|
||||
sys.path.insert(0, os.path.dirname(__file__))
|
||||
from list_platforms import list_platforms as _list_active
|
||||
platforms = _list_active(include_archived=args.include_archived)
|
||||
platforms = list_registered_platforms(
|
||||
args.platforms_dir, include_archived=args.include_archived,
|
||||
)
|
||||
elif args.platform:
|
||||
platforms = [args.platform]
|
||||
else:
|
||||
|
||||
@@ -18,7 +18,7 @@ from datetime import datetime, timezone
|
||||
from pathlib import Path
|
||||
|
||||
sys.path.insert(0, os.path.dirname(__file__))
|
||||
from common import load_database, load_platform_config
|
||||
from common import list_registered_platforms, load_database, load_platform_config
|
||||
from verify import verify_platform
|
||||
|
||||
def compute_coverage(platform_name: str, platforms_dir: str, db: dict) -> dict:
|
||||
@@ -80,10 +80,7 @@ def generate_readme(db: dict, platforms_dir: str) -> str:
|
||||
size_mb = total_size / (1024 * 1024)
|
||||
ts = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
|
||||
|
||||
platform_names = sorted(
|
||||
p.stem for p in Path(platforms_dir).glob("*.yml")
|
||||
if not p.name.startswith("_")
|
||||
)
|
||||
platform_names = list_registered_platforms(platforms_dir, include_archived=True)
|
||||
|
||||
coverages = {}
|
||||
for name in platform_names:
|
||||
@@ -135,6 +132,7 @@ def generate_readme(db: dict, platforms_dir: str) -> str:
|
||||
"RetroPie": "`BIOS/`",
|
||||
"RetroDECK": "`~/retrodeck/bios/`",
|
||||
"EmuDeck": "`Emulation/bios/`",
|
||||
"RomM": "`bios/{platform_slug}/`",
|
||||
}
|
||||
|
||||
for name, cov in sorted(coverages.items(), key=lambda x: x[1]["platform"]):
|
||||
|
||||
@@ -26,7 +26,7 @@ except ImportError:
|
||||
sys.exit(1)
|
||||
|
||||
sys.path.insert(0, os.path.dirname(__file__))
|
||||
from common import load_database, load_emulator_profiles, load_platform_config
|
||||
from common import list_registered_platforms, load_database, load_emulator_profiles, load_platform_config
|
||||
from generate_readme import compute_coverage
|
||||
from verify import verify_platform
|
||||
|
||||
@@ -2044,10 +2044,7 @@ def main():
|
||||
registry = (yaml.safe_load(f) or {}).get("platforms", {})
|
||||
|
||||
# Load platform configs
|
||||
platform_names = [
|
||||
p.stem for p in Path(args.platforms_dir).glob("*.yml")
|
||||
if not p.name.startswith("_")
|
||||
]
|
||||
platform_names = list_registered_platforms(args.platforms_dir, include_archived=True)
|
||||
|
||||
print("Computing platform coverage...")
|
||||
coverages = {}
|
||||
|
||||
@@ -17,45 +17,16 @@ import argparse
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
try:
|
||||
import yaml
|
||||
except ImportError:
|
||||
yaml = None
|
||||
sys.path.insert(0, os.path.dirname(__file__))
|
||||
from common import list_registered_platforms
|
||||
|
||||
PLATFORMS_DIR = "platforms"
|
||||
|
||||
|
||||
def _load_registry(platforms_dir: str = PLATFORMS_DIR) -> dict:
|
||||
"""Load _registry.yml if available."""
|
||||
registry_path = Path(platforms_dir) / "_registry.yml"
|
||||
if yaml and registry_path.exists():
|
||||
with open(registry_path) as f:
|
||||
return yaml.safe_load(f) or {}
|
||||
return {}
|
||||
|
||||
|
||||
def list_platforms(include_archived: bool = False) -> list[str]:
|
||||
"""List platform config files, filtering by status from _registry.yml."""
|
||||
platforms_dir = Path(PLATFORMS_DIR)
|
||||
if not platforms_dir.is_dir():
|
||||
return []
|
||||
|
||||
registry = _load_registry(str(platforms_dir))
|
||||
registry_platforms = registry.get("platforms", {})
|
||||
|
||||
platforms = []
|
||||
for f in sorted(platforms_dir.glob("*.yml")):
|
||||
if f.name.startswith("_"):
|
||||
continue
|
||||
name = f.stem
|
||||
status = registry_platforms.get(name, {}).get("status", "active")
|
||||
if status == "archived" and not include_archived:
|
||||
continue
|
||||
platforms.append(name)
|
||||
|
||||
return platforms
|
||||
return list_registered_platforms(PLATFORMS_DIR, include_archived=include_archived)
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
+154
-60
@@ -2,48 +2,116 @@
|
||||
"""Scraper for RomM BIOS requirements.
|
||||
|
||||
Source: https://github.com/rommapp/romm
|
||||
Format: known_bios_files.json in backend/models/fixtures/
|
||||
Hash: MD5 (primary), SHA1, CRC
|
||||
Format: JSON fixture mapping "slug:filename" to {size, crc, md5, sha1}
|
||||
Hash: SHA1 primary (all four hashes available per entry)
|
||||
|
||||
RomM stores BIOS requirements in known_bios_files.json,
|
||||
it contains bios files for all emulators, and is formatted as a mapping of "<console>:<bios_file>": { "size": "<size_in_bytes>", "crc": "<crc>", "md5": "<md5>", "sha1": "<sha1>" }.
|
||||
RomM stores known BIOS hashes in known_bios_files.json. At startup, the
|
||||
fixture is loaded into Redis. When scanning or uploading firmware, RomM
|
||||
verifies: file size must match AND at least one hash (MD5, SHA1, CRC32)
|
||||
must match (firmware.py:verify_file_hashes).
|
||||
|
||||
RomM hashes files as opaque blobs (no ZIP content inspection). Arcade
|
||||
BIOS ZIPs are matched by their container hash, which varies by MAME
|
||||
version and ZIP tool. This is a known limitation (rommapp/romm#2888).
|
||||
|
||||
Folder structure: {library}/bios/{platform_slug}/{filename} (flat).
|
||||
Slugs are IGDB-style platform identifiers.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
try:
|
||||
from .base_scraper import BaseScraper, BiosRequirement, fetch_github_latest_version
|
||||
except ImportError:
|
||||
sys.path.insert(0, str(Path(__file__).parent.parent))
|
||||
from scraper.base_scraper import BaseScraper, BiosRequirement, fetch_github_latest_version
|
||||
from base_scraper import BaseScraper, BiosRequirement, fetch_github_latest_version
|
||||
|
||||
PLATFORM_NAME = "RomM"
|
||||
PLATFORM_NAME = "romm"
|
||||
|
||||
BIOS_REPO = "rommapp/romm"
|
||||
BIOS_BRANCH = "master"
|
||||
BIOS_FILE = "backend/models/fixtures/known_bios_files.json"
|
||||
BIOS_URL = (
|
||||
f"https://raw.githubusercontent.com/{BIOS_REPO}/refs/heads/{BIOS_BRANCH}/{BIOS_FILE}"
|
||||
SOURCE_URL = (
|
||||
"https://raw.githubusercontent.com/rommapp/romm/"
|
||||
"master/backend/models/fixtures/known_bios_files.json"
|
||||
)
|
||||
|
||||
GITHUB_REPO = "rommapp/romm"
|
||||
|
||||
# IGDB slug -> retrobios system ID
|
||||
SLUG_MAP: dict[str, str] = {
|
||||
"3do": "3do",
|
||||
"64dd": "nintendo-64dd",
|
||||
"acpc": "amstrad-cpc",
|
||||
"amiga": "commodore-amiga",
|
||||
"arcade": "arcade",
|
||||
"atari-st": "atari-st",
|
||||
"atari5200": "atari-5200",
|
||||
"atari7800": "atari-7800",
|
||||
"atari8bit": "atari-400-800",
|
||||
"colecovision": "coleco-colecovision",
|
||||
"dc": "sega-dreamcast",
|
||||
"doom": "doom",
|
||||
"enterprise": "enterprise-64-128",
|
||||
"fairchild-channel-f": "fairchild-channel-f",
|
||||
"fds": "nintendo-fds",
|
||||
"gamegear": "sega-game-gear",
|
||||
"gb": "nintendo-gb",
|
||||
"gba": "nintendo-gba",
|
||||
"gbc": "nintendo-gbc",
|
||||
"genesis": "sega-mega-drive",
|
||||
"intellivision": "mattel-intellivision",
|
||||
"j2me": "j2me",
|
||||
"lynx": "atari-lynx",
|
||||
"mac": "apple-macintosh-ii",
|
||||
"msx": "microsoft-msx",
|
||||
"msx2": "microsoft-msx",
|
||||
"nds": "nintendo-ds",
|
||||
"neo-geo-cd": "snk-neogeo-cd",
|
||||
"nes": "nintendo-nes",
|
||||
"ngc": "nintendo-gamecube",
|
||||
"odyssey-2-slash-videopac-g7000": "magnavox-odyssey2",
|
||||
"pc-9800-series": "nec-pc-98",
|
||||
"pc-fx": "nec-pc-fx",
|
||||
"pokemon-mini": "nintendo-pokemon-mini",
|
||||
"ps2": "sony-playstation-2",
|
||||
"psp": "sony-psp",
|
||||
"psx": "sony-playstation",
|
||||
"satellaview": "nintendo-satellaview",
|
||||
"saturn": "sega-saturn",
|
||||
"scummvm": "scummvm",
|
||||
"segacd": "sega-mega-cd",
|
||||
"sharp-x68000": "sharp-x68000",
|
||||
"sms": "sega-master-system",
|
||||
"snes": "nintendo-snes",
|
||||
"sufami-turbo": "nintendo-sufami-turbo",
|
||||
"super-gb": "nintendo-sgb",
|
||||
"tg16": "nec-pc-engine",
|
||||
"tvc": "videoton-tvc",
|
||||
"videopac-g7400": "philips-videopac",
|
||||
"wolfenstein": "wolfenstein-3d",
|
||||
"x1": "sharp-x1",
|
||||
"xbox": "microsoft-xbox",
|
||||
"zxs": "sinclair-zx-spectrum",
|
||||
}
|
||||
|
||||
|
||||
class Scraper(BaseScraper):
|
||||
"""RomM BIOS scraper from known_bios_files.json."""
|
||||
"""Scraper for RomM known_bios_files.json."""
|
||||
|
||||
def __init__(self, url = BIOS_URL):
|
||||
super().__init__(url)
|
||||
def __init__(self, url: str = SOURCE_URL):
|
||||
super().__init__(url=url)
|
||||
self._parsed: dict | None = None
|
||||
|
||||
def fetch_metadata(self) -> dict:
|
||||
version = fetch_github_latest_version(BIOS_REPO) or "unknown"
|
||||
return {
|
||||
"name": PLATFORM_NAME,
|
||||
"version": version,
|
||||
"homepage": "https://romm.app",
|
||||
"source": self.url,
|
||||
}
|
||||
def _parse_json(self) -> dict:
|
||||
if self._parsed is not None:
|
||||
return self._parsed
|
||||
|
||||
raw = self._fetch_raw()
|
||||
try:
|
||||
self._parsed = json.loads(raw)
|
||||
except json.JSONDecodeError as e:
|
||||
raise ValueError(f"Failed to parse JSON: {e}") from e
|
||||
return self._parsed
|
||||
|
||||
def fetch_requirements(self) -> list[BiosRequirement]:
|
||||
"""Parse known_bios_files.json and return BIOS requirements."""
|
||||
@@ -52,43 +120,61 @@ class Scraper(BaseScraper):
|
||||
if not self.validate_format(raw):
|
||||
raise ValueError("known_bios_files.json format validation failed")
|
||||
|
||||
roms = json.loads(raw)
|
||||
data = self._parse_json()
|
||||
requirements = []
|
||||
|
||||
for key, info in roms.items():
|
||||
for key, entry in data.items():
|
||||
if ":" not in key:
|
||||
continue
|
||||
system, name = key.split(":", 1)
|
||||
|
||||
igdb_slug, filename = key.split(":", 1)
|
||||
system = SLUG_MAP.get(igdb_slug)
|
||||
if not system:
|
||||
print(f"Warning: unmapped IGDB slug '{igdb_slug}'", file=sys.stderr)
|
||||
continue
|
||||
|
||||
sha1 = (entry.get("sha1") or "").strip() or None
|
||||
md5 = (entry.get("md5") or "").strip() or None
|
||||
crc32 = (entry.get("crc") or "").strip() or None
|
||||
size = int(entry["size"]) if entry.get("size") else None
|
||||
|
||||
requirements.append(BiosRequirement(
|
||||
name=name,
|
||||
name=filename,
|
||||
system=system,
|
||||
size=int(info.get("size", 0)),
|
||||
crc32=info.get("crc"),
|
||||
md5=info.get("md5"),
|
||||
sha1=info.get("sha1"),
|
||||
sha1=sha1,
|
||||
md5=md5,
|
||||
crc32=crc32,
|
||||
size=size,
|
||||
destination=f"{igdb_slug}/{filename}",
|
||||
required=True,
|
||||
))
|
||||
|
||||
return requirements
|
||||
|
||||
def validate_format(self, raw_data: str) -> bool:
|
||||
"""Validate that the raw data is a JSON object with the expected structure."""
|
||||
"""Validate that raw_data is a JSON dict with slug:filename keys."""
|
||||
try:
|
||||
data = json.loads(raw_data)
|
||||
if not isinstance(data, dict):
|
||||
return False
|
||||
for key, value in data.items():
|
||||
if ":" not in key or not isinstance(value, dict):
|
||||
return False
|
||||
if not all(k in value for k in ("size", "crc", "md5", "sha1")):
|
||||
return False
|
||||
return True
|
||||
except json.JSONDecodeError:
|
||||
except (json.JSONDecodeError, TypeError):
|
||||
return False
|
||||
|
||||
if not isinstance(data, dict):
|
||||
return False
|
||||
|
||||
for key in list(data.keys())[:5]:
|
||||
if ":" not in key:
|
||||
return False
|
||||
_, entry = key.split(":", 1), data[key]
|
||||
if not isinstance(data[key], dict):
|
||||
return False
|
||||
if "md5" not in data[key] and "sha1" not in data[key]:
|
||||
return False
|
||||
|
||||
return len(data) > 0
|
||||
|
||||
def generate_platform_yaml(self) -> dict:
|
||||
"""Generate platform YAML content for RomM."""
|
||||
"""Generate a platform YAML config dict from scraped data."""
|
||||
requirements = self.fetch_requirements()
|
||||
metadata = self.fetch_metadata()
|
||||
|
||||
systems: dict[str, dict] = {}
|
||||
for req in requirements:
|
||||
@@ -97,34 +183,42 @@ class Scraper(BaseScraper):
|
||||
|
||||
entry: dict = {
|
||||
"name": req.name,
|
||||
"destination": f"{req.system}/{req.name}",
|
||||
"size": req.size,
|
||||
"crc": req.crc32,
|
||||
"md5": req.md5,
|
||||
"sha1": req.sha1,
|
||||
"destination": req.destination,
|
||||
"required": req.required,
|
||||
}
|
||||
if req.sha1:
|
||||
entry["sha1"] = req.sha1
|
||||
if req.md5:
|
||||
entry["md5"] = req.md5
|
||||
if req.crc32:
|
||||
entry["crc32"] = req.crc32
|
||||
if req.size:
|
||||
entry["size"] = req.size
|
||||
|
||||
systems[req.system]["files"].append(entry)
|
||||
|
||||
version = ""
|
||||
tag = fetch_github_latest_version(GITHUB_REPO)
|
||||
if tag:
|
||||
version = tag
|
||||
|
||||
return {
|
||||
"platform": metadata["name"],
|
||||
"version": metadata["version"],
|
||||
"homepage": metadata["homepage"],
|
||||
"source": metadata["source"],
|
||||
"inherits": "emulatorjs",
|
||||
"platform": "RomM",
|
||||
"version": version,
|
||||
"homepage": "https://romm.app",
|
||||
"source": SOURCE_URL,
|
||||
"base_destination": "bios",
|
||||
"hash_type": "md5",
|
||||
"hash_type": "sha1",
|
||||
"verification_mode": "md5",
|
||||
"cores": [],
|
||||
"systems": systems,
|
||||
}
|
||||
|
||||
|
||||
def main():
|
||||
try:
|
||||
from .base_scraper import scraper_cli
|
||||
except ImportError:
|
||||
sys.path.insert(0, str(Path(__file__).parent.parent))
|
||||
from scraper.base_scraper import scraper_cli
|
||||
from scripts.scraper.base_scraper import scraper_cli
|
||||
scraper_cli(Scraper, "Scrape RomM BIOS requirements")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -25,7 +25,7 @@ import sys
|
||||
from pathlib import Path
|
||||
|
||||
sys.path.insert(0, os.path.dirname(__file__))
|
||||
from common import compute_hashes, load_database as _load_database
|
||||
from common import compute_hashes, list_registered_platforms, load_database as _load_database
|
||||
|
||||
try:
|
||||
import yaml
|
||||
@@ -107,9 +107,8 @@ def load_platform_hashes(platforms_dir: str) -> dict:
|
||||
if not os.path.isdir(platforms_dir) or yaml is None:
|
||||
return known
|
||||
|
||||
for f in Path(platforms_dir).glob("*.yml"):
|
||||
if f.name.startswith("_"):
|
||||
continue
|
||||
for name in list_registered_platforms(platforms_dir, include_archived=True):
|
||||
f = Path(platforms_dir) / f"{name}.yml"
|
||||
with open(f) as fh:
|
||||
try:
|
||||
config = yaml.safe_load(fh) or {}
|
||||
|
||||
Reference in New Issue
Block a user