Add TRS-80, RX-78, Sega AI entries; refactor tools

Add many MAME/MESS BIOS entries (TRS-80 family, Bandai RX-78, Sega AI) and update docs/navigation counts (README, mkdocs). Remove empty supplemental file references from database.json and update generated timestamps and totals. Harden and refactor tooling: add MAX_RESPONSE_SIZE limited reader in base_scraper, make target scrapers an abstract base, narrow exception handling in the Batocera targets parser, and switch generate_pack.py and verify.py to use build_target_cores_cache (simplifies target config loading and error handling). verify.py also loads supplemental cross-reference names and accepts them through verify_platform. Update tests to import from updated modules (validation/truth). Misc: small bugfix for case-insensitive path conflict check.
This commit is contained in:
Abdessamad Derraz
2026-03-29 23:04:30 +02:00
parent a08c730805
commit 0c5cde83e1
11 changed files with 658 additions and 92 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,245** verified files across **357** systems, ready to extract into your emulator's BIOS directory.
**7,244** verified files across **387** systems, ready to extract into your emulator's BIOS directory.
## Quick Install
@@ -45,13 +45,13 @@ Each file is checked against the emulator's source code to match what the code a
- **10 platforms** supported with platform-specific verification
- **328 emulators** profiled from source (RetroArch cores + standalone)
- **357 systems** covered (NES, SNES, PlayStation, Saturn, Dreamcast, ...)
- **7,245 files** verified with MD5, SHA1, CRC32 checksums
- **387 systems** covered (NES, SNES, PlayStation, Saturn, Dreamcast, ...)
- **7,244 files** verified with MD5, SHA1, CRC32 checksums
- **9266 MB** total collection size
## Supported systems
NES, SNES, Nintendo 64, GameCube, Wii, Game Boy, Game Boy Advance, Nintendo DS, Nintendo 3DS, Switch, PlayStation, PlayStation 2, PlayStation 3, PSP, PS Vita, Mega Drive, Saturn, Dreamcast, Game Gear, Master System, Neo Geo, Atari 2600, Atari 7800, Atari Lynx, Atari ST, MSX, PC Engine, TurboGrafx-16, ColecoVision, Intellivision, Commodore 64, Amiga, ZX Spectrum, Arcade (MAME), and 323+ more.
NES, SNES, Nintendo 64, GameCube, Wii, Game Boy, Game Boy Advance, Nintendo DS, Nintendo 3DS, Switch, PlayStation, PlayStation 2, PlayStation 3, PSP, PS Vita, Mega Drive, Saturn, Dreamcast, Game Gear, Master System, Neo Geo, Atari 2600, Atari 7800, Atari Lynx, Atari ST, MSX, PC Engine, TurboGrafx-16, ColecoVision, Intellivision, Commodore 64, Amiga, ZX Spectrum, Arcade (MAME), and 353+ more.
Full list with per-file details: **[https://abdess.github.io/retrobios/](https://abdess.github.io/retrobios/)**
@@ -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-29T14:15:30Z*
*Auto-generated on 2026-03-29T21:00:40Z*

View File

@@ -1,6 +1,6 @@
{
"generated_at": "2026-03-29T20:52:06Z",
"total_files": 7245,
"generated_at": "2026-03-29T21:04:08Z",
"total_files": 7244,
"total_size": 9715681216,
"files": {
"520d3d1b5897800af47f92efd2444a26b7a7dead": {
@@ -36133,16 +36133,6 @@
"crc32": "c1815325",
"adler32": "c48a690f"
},
"da39a3ee5e6b4b0d3255bfef95601890afd80709": {
"path": "bios/NEC/PC-98/key.txt",
"name": "key.txt",
"size": 0,
"sha1": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"md5": "d41d8cd98f00b204e9800998ecf8427e",
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"crc32": "00000000",
"adler32": "00000001"
},
"3518193b8207bdebf22c1380c2db8c554baff329": {
"path": "bios/NEC/PC-98/n88.rom",
"name": "n88.rom",
@@ -76069,7 +76059,6 @@
"38d32748ae49d1815b0614970849fd40": "78ba9960f135372825ab7244b5e4e73a810002ff",
"8b52de9032ea62153dc783151306595f": "0877ffb4b4d1c18283468be3579b72ed8c22e3ac",
"72ea51443070f0e9212bfc9b793ee28e": "a2fb11c000ed7c976520622cfb7940ed6ddc904e",
"d41d8cd98f00b204e9800998ecf8427e": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"22be239bc0c4298bc0561252eed98633": "3518193b8207bdebf22c1380c2db8c554baff329",
"e28fe3f520bea594350ea8fb00395370": "d1ae642aed4f0584eeb81ff50180db694e5101d4",
"a8e298da7ac947669bcb1ff25cee0a83": "4ae4d37409ff99411a623da9f6a44192170a854e",
@@ -89999,9 +89988,6 @@
"ide.rom": [
"0877ffb4b4d1c18283468be3579b72ed8c22e3ac"
],
"key.txt": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709"
],
"n88_1.rom": [
"4ae4d37409ff99411a623da9f6a44192170a854e"
],
@@ -102454,9 +102440,6 @@
"custom0.sf2": [
"286b2e1fb21cc79851da01666db6c0b0e88f25e3"
],
"Custom.dat": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709"
],
"tos106de.img": [
"3b8cf5ffa41b252eb67f8824f94608fa4005d6dd"
],
@@ -107087,7 +107070,6 @@
"456d9fc7": "78ba9960f135372825ab7244b5e4e73a810002ff",
"d402842f": "0877ffb4b4d1c18283468be3579b72ed8c22e3ac",
"c1815325": "a2fb11c000ed7c976520622cfb7940ed6ddc904e",
"00000000": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"ffd68be0": "3518193b8207bdebf22c1380c2db8c554baff329",
"61984bab": "d1ae642aed4f0584eeb81ff50180db694e5101d4",
"7ad5d943": "4ae4d37409ff99411a623da9f6a44192170a854e",
@@ -127186,9 +127168,6 @@
"zc210/sf2/custom0.sf2": [
"286b2e1fb21cc79851da01666db6c0b0e88f25e3"
],
"zc210/sfx/Custom.dat": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709"
],
"zc210/zcdata.dat": [
"33b50cec88bc1569431a7885c0cc2692fddb004b"
]

View File

@@ -49,7 +49,9 @@ systems:
- coleco-adam
- crvision
- entex-advision
- sega-ai
- sega-beena
- bandai-rx78
- camplynx
- tiger-game-com
- gamepark-gp32
@@ -63,10 +65,11 @@ systems:
- casio-pv2000
- pegasus
- pcw
- trs80
notes: |
Rolling release tracking mamedev/mame upstream (currently 0.286).
80 BIOS root sets + 19 system ROM sets (apple2gs, astrocade, adam, advision, apfm1000, beena, camplynx, casloopy, crvision, fm7, gamate, gamecom, gamepock, gmaster, gp32, laser310, pcw, pegasus, pv2000). romload.cpp
80 BIOS root sets + 22 system ROM sets (apple2gs, astrocade, adam, advision, apfm1000, beena, camplynx, casloopy, crvision, fm7, gamate, gamecom, gamepock, gmaster, gp32, laser310, pcw, pegasus, pv2000, rx78, segaai, trs80). romload.cpp
unmodified. No hiscore support.
Paths under system_dir/mame/ (artwork, cheat, hash, ini, plugins,
samples, crosshair). ROM search: content_dir + system_dir/mame/bios +
@@ -780,6 +783,59 @@ files:
size: 32768
crc32: ed336d29
# Bandai RX-78
- name: rx78.zip
required: true
category: bios_zip
system: bandai-rx78
source_ref: "src/mame/bandai/rx78.cpp:559"
note: "MACHINE_NOT_WORKING."
contents:
- name: ipl.rom
description: "IPL boot ROM"
size: 8192
crc32: a194ea53
# Sega AI Computer
- name: segaai.zip
required: true
category: bios_zip
system: sega-ai
source_ref: "src/mame/sega/segaai.cpp:730-739"
contents:
- name: mpr-7689.ic5
description: "OS ROM with SEGA PROLOG (128KB)"
size: 131072
crc32: 62402ac9
- name: e000 8_24.ic3
description: "EPROM bank E000"
size: 65536
crc32: c8b6a539
- name: f000 7_21.ic4
description: "EPROM bank F000"
size: 65536
crc32: 64d6cd8c
- name: mpr-7619.ic14
description: "UPD7759 speech ROM bank 0"
size: 131072
crc32: d1aea002
- name: mpr-7620.ic15
description: "UPD7759 speech ROM bank 1"
size: 131072
crc32: e042754b
- name: segaai_soundbox.zip
required: false
category: bios_zip
system: sega-ai
source_ref: "src/devices/bus/segaai/soundbox.cpp:152-155"
note: "Sound Box expansion (AI-2002) with YM2151 FM + music keyboard"
contents:
- name: ai-snd-2002-cecb.bin
description: "Sound Box expansion ROM"
size: 65536
crc32: ef2dabc0
# Camputers Lynx 48K
- name: lynx48k.zip
required: true
@@ -1171,3 +1227,260 @@ files:
size: 8192
crc32: a64d450a
# Tandy TRS-80 family
# Model I (trs80.cpp): trs80 (Level I, parent, WORKING), trs80l2 (Level II, parent),
# eg3003 (EACA Video Genie, parent), sys80/sys80p (clones), ht1080z/ht1080z2/ht108064 (clones).
# Model III/4/4P (trs80m3.cpp): trs80m3 (parent), trs80m4/trs80m4p/cp500 (clones).
# Z80-based home computers (1977-1983). Only trs80 (Level I) is MACHINE_SUPPORTS_SAVE;
# all others MACHINE_NOT_WORKING. Software lists: trs80_cass, trs80_flop, trs80_quik.
- name: trs80.zip
required: true
category: bios_zip
system: trs80
source_ref: "src/mame/trs/trs80.cpp:567-584"
note: "TRS-80 Model I Level I Basic (1977). Only fully working TRS-80 machine in MAME."
contents:
- name: level1.rom
description: "Level I BASIC ROM (4KB)"
size: 4096
crc32: 70d06dff
- name: mcm6670p.z29
description: "MCM6670P character generator ROM"
size: 1024
crc32: 0033f2b9
- name: trs80l2.zip
required: true
category: bios_zip
system: trs80
source_ref: "src/mame/trs/trs80.cpp:587-603"
note: |
TRS-80 Model I Level II Basic (1978). Separate parent machine from trs80 (Level I).
2 BIOS variants: Radio Shack Level II and R/S L2 (alternate dumps).
MACHINE_NOT_WORKING.
contents:
- name: rom-a.z1
description: "Level II ROM A (default)"
size: 4096
crc32: 37c59db2
- name: rom-b.z2
description: "Level II ROM B (default)"
size: 4096
crc32: "05818718"
- name: rom-c.z3
description: "Level II ROM C (default)"
size: 4096
crc32: 306e5d66
- name: rom-a_alt.z1
description: "Level II ROM A (alternate dump)"
size: 4096
crc32: be46faf5
- name: rom-b_alt.z2
description: "Level II ROM B (alternate dump)"
size: 4096
crc32: 6c791c2d
- name: rom-c_alt.z3
description: "Level II ROM C (alternate dump)"
size: 4096
crc32: 55b3ad13
- name: mcm6670p.z29
description: "MCM6670P character generator ROM"
size: 1024
crc32: 0033f2b9
- name: eg3003.zip
required: false
category: bios_zip
system: trs80
source_ref: "src/mame/trs/trs80.cpp:608-617"
note: |
EACA Video Genie EG3003 (1980). TRS-80 Level II compatible clone.
Parent for sys80/sys80p/ht1080z/ht1080z2/ht108064 clones.
MACHINE_NOT_WORKING.
contents:
- name: 3001.z10
description: "ROM A (BASIC part 1)"
size: 4096
crc32: 8f5214de
- name: 3002.z11
description: "ROM B (BASIC part 2)"
size: 4096
crc32: 46e88fbf
- name: 3003.z12
description: "ROM C (BASIC part 3)"
size: 4096
crc32: 306e5d66
- name: tcs-ext.z13
description: "TCS extension ROM"
size: 2048
crc32: 8f2ac112
- name: tcs-ext.z25
description: "TCS character generator ROM"
size: 2048
crc32: 150c5f1f
- name: sys80.zip
required: false
category: bios_zip
system: trs80
source_ref: "src/mame/trs/trs80.cpp:620-632"
note: "EACA System-80 (1980). Clone of eg3003 with different extension ROM. sys80p (50 Hz) shares ROMs."
contents:
- name: sys80.z13
description: "System-80 extension ROM"
size: 2048
crc32: 2a851e33
- name: 2513.z25
description: "Character generator ROM"
size: 1024
crc32: 0033f2b9
- name: ht1080z.zip
required: false
category: bios_zip
system: trs80
source_ref: "src/mame/trs/trs80.cpp:637-646"
note: "Hiradastechnika HT-1080Z Series I (1983). Hungarian clone of eg3003."
contents:
- name: ht1080z.z25
description: "HT-1080Z character generator ROM"
size: 2048
crc32: e8c59d4f
- name: ht1080z2.zip
required: false
category: bios_zip
system: trs80
source_ref: "src/mame/trs/trs80.cpp:649-658"
note: "Hiradastechnika HT-1080Z Series II (1984). Clone of eg3003."
contents:
- name: ht1080z2.z13
description: "HT-1080Z II extension ROM"
size: 2048
crc32: "07415ac6"
- name: ht1080z2.z25
description: "HT-1080Z II character generator ROM"
size: 2048
crc32: 6728f0ab
- name: ht108064.zip
required: false
category: bios_zip
system: trs80
source_ref: "src/mame/trs/trs80.cpp:661-670"
note: "Hiradastechnika HT-1080Z/64 (1985). 64-column clone of eg3003."
contents:
- name: 3001_64.z10
description: "ROM A (64-col BASIC part 1)"
size: 4096
crc32: 59ec132e
- name: 3002_64.z11
description: "ROM B (64-col BASIC part 2)"
size: 4096
crc32: a7a73e8c
- name: ht108064.z13
description: "HT-1080Z/64 extension ROM"
size: 2048
crc32: fc12bd28
- name: ht108064.z25
description: "HT-1080Z/64 character generator ROM"
size: 2048
crc32: e76b73a4
- name: trs80m3.zip
required: true
category: bios_zip
system: trs80
source_ref: "src/mame/trs/trs80m3.cpp:483-519"
note: |
TRS-80 Model III (1980). Parent for trs80m4/trs80m4p/cp500 clones.
4 BIOS variants: Level 2 ROM C Rev C (default), Rev B, Network III v2 (student),
Level 1. MACHINE_NOT_WORKING.
contents:
- name: 8041364.u104
description: "Level 2 ROM A"
size: 8192
crc32: ec0c6daa
- name: 8040332.u105
description: "Level 2 ROM B"
size: 4096
crc32: ed4ee921
- name: 8040316c.u106
description: "Level 2 ROM C Rev C (default)"
size: 2048
crc32: c8f79433
- name: 8040316b.u106
description: "Level 2 ROM C Rev B"
size: 2048
crc32: 84a5702d
- name: 276a.u106
description: "Network III v2 ROM C"
size: 2048
crc32: 7d38720a
- name: 8040032.u104
description: "Level 1 BIOS"
size: 4096
crc32: 6418d641
- name: 8044316a.u36
description: "Character generator ROM (rev A)"
size: 2048
crc32: 444c8b60
- name: trs80m4.zip
required: false
category: bios_zip
system: trs80
source_ref: "src/mame/trs/trs80m3.cpp:522-528"
note: |
TRS-80 Model 4 (1980). Clone of trs80m3. BAD_DUMP combined ROM
(should be split into 3 like trs80m3). MACHINE_NOT_WORKING.
contents:
- name: trs80m4.rom
description: "Combined system ROM (BAD_DUMP)"
size: 14336
crc32: 1a92d54d
- name: 8044316a.u36
description: "Character generator ROM"
size: 2048
crc32: 444c8b60
- name: trs80m4p.zip
required: false
category: bios_zip
system: trs80
source_ref: "src/mame/trs/trs80m3.cpp:530-539"
note: |
TRS-80 Model 4P (1983). Clone of trs80m3. Completely different memory map;
Model III ROMs loaded from boot disk, only a bootloader ROM on board.
2 BIOS variants: gate array (default) and disk loader hack.
MACHINE_NOT_WORKING.
contents:
- name: 8075332.u69
description: "Bootloader ROM"
size: 4096
crc32: 3a738aa9
- name: trs80m4p_loader_hack.rom
description: "Disk loader hack ROM"
size: 504
crc32: 7ff336f4
- name: 8049007.u103
description: "Character generator ROM"
size: 2048
crc32: 1ac44bea
- name: cp500.zip
required: false
category: bios_zip
system: trs80
source_ref: "src/mame/trs/trs80m3.cpp:541-550"
note: "Prologica CP-500 (1982). Brazilian TRS-80 Model III clone. MACHINE_NOT_WORKING."
contents:
- name: s_8407_cn62516n_cp500a_prologica_83.ci111
description: "Combined system + boot ROM"
size: 16384
crc32: c2fc1b92
- name: 100.105.ci36
description: "Character generator ROM"
size: 2048
crc32: 1765931e

View File

@@ -17,6 +17,7 @@ systems:
- coleco-adam
- crvision
- entex-advision
- bandai-rx78
- mattel-aquarius
- camplynx
- cgenie
@@ -38,6 +39,7 @@ systems:
- mz80k
- pegasus
- supracan
- trs80
notes: |
SUBTARGET=mess build from libretro/mame. Same source, same CORE_NAME ("mame"),
@@ -60,9 +62,9 @@ notes: |
Astrocade, Casio Loopy, Casio PV-2000, Coleco Adam, VTech CreatiVision, Entex
Adventure Vision, EACA Colour Genie, Acorn Atom, Tiger game.com,
Bit Corporation Gamate, Epoch Game Pocket Computer, Hartung Game
Master, Funtech Super A'Can, Technosys Aamber Pegasus and VTech
Laser 310 system ROMs required for software loading (not IS_BIOS_ROOT
but functionally BIOS).
Master, Funtech Super A'Can, Technosys Aamber Pegasus, VTech
Laser 310 and TRS-80 family system ROMs required for software loading
(not IS_BIOS_ROOT but functionally BIOS).
Apple II: 4 machine ROM sets (apple2, apple2p, apple2e, apple2ee) plus
5 peripheral device ROM sets (disk controllers, CompactFlash, speech).
@@ -698,6 +700,19 @@ files:
size: 512
crc32: 81e95975
# Bandai RX-78
- name: rx78.zip
required: true
category: bios_zip
system: bandai-rx78
source_ref: "src/mame/bandai/rx78.cpp:559"
note: "MACHINE_NOT_WORKING."
contents:
- name: ipl.rom
description: "IPL boot ROM"
size: 8192
crc32: a194ea53
# VTech CreatiVision
- name: crvision.zip
required: true
@@ -1593,3 +1608,260 @@ files:
description: "Lockout chip ROM key"
size: 16
crc32: 0ba78597
# Tandy TRS-80 family
# Model I (trs80.cpp): trs80 (Level I, parent, WORKING), trs80l2 (Level II, parent),
# eg3003 (EACA Video Genie, parent), sys80/sys80p (clones), ht1080z/ht1080z2/ht108064 (clones).
# Model III/4/4P (trs80m3.cpp): trs80m3 (parent), trs80m4/trs80m4p/cp500 (clones).
# Z80-based home computers (1977-1983). Only trs80 (Level I) is MACHINE_SUPPORTS_SAVE;
# all others MACHINE_NOT_WORKING. Software lists: trs80_cass, trs80_flop, trs80_quik.
- name: trs80.zip
required: true
category: bios_zip
system: trs80
source_ref: "src/mame/trs/trs80.cpp:567-584"
note: "TRS-80 Model I Level I Basic (1977). Only fully working TRS-80 machine in MAME."
contents:
- name: level1.rom
description: "Level I BASIC ROM (4KB)"
size: 4096
crc32: 70d06dff
- name: mcm6670p.z29
description: "MCM6670P character generator ROM"
size: 1024
crc32: 0033f2b9
- name: trs80l2.zip
required: true
category: bios_zip
system: trs80
source_ref: "src/mame/trs/trs80.cpp:587-603"
note: |
TRS-80 Model I Level II Basic (1978). Separate parent machine from trs80 (Level I).
2 BIOS variants: Radio Shack Level II and R/S L2 (alternate dumps).
MACHINE_NOT_WORKING.
contents:
- name: rom-a.z1
description: "Level II ROM A (default)"
size: 4096
crc32: 37c59db2
- name: rom-b.z2
description: "Level II ROM B (default)"
size: 4096
crc32: "05818718"
- name: rom-c.z3
description: "Level II ROM C (default)"
size: 4096
crc32: 306e5d66
- name: rom-a_alt.z1
description: "Level II ROM A (alternate dump)"
size: 4096
crc32: be46faf5
- name: rom-b_alt.z2
description: "Level II ROM B (alternate dump)"
size: 4096
crc32: 6c791c2d
- name: rom-c_alt.z3
description: "Level II ROM C (alternate dump)"
size: 4096
crc32: 55b3ad13
- name: mcm6670p.z29
description: "MCM6670P character generator ROM"
size: 1024
crc32: 0033f2b9
- name: eg3003.zip
required: false
category: bios_zip
system: trs80
source_ref: "src/mame/trs/trs80.cpp:608-617"
note: |
EACA Video Genie EG3003 (1980). TRS-80 Level II compatible clone.
Parent for sys80/sys80p/ht1080z/ht1080z2/ht108064 clones.
MACHINE_NOT_WORKING.
contents:
- name: 3001.z10
description: "ROM A (BASIC part 1)"
size: 4096
crc32: 8f5214de
- name: 3002.z11
description: "ROM B (BASIC part 2)"
size: 4096
crc32: 46e88fbf
- name: 3003.z12
description: "ROM C (BASIC part 3)"
size: 4096
crc32: 306e5d66
- name: tcs-ext.z13
description: "TCS extension ROM"
size: 2048
crc32: 8f2ac112
- name: tcs-ext.z25
description: "TCS character generator ROM"
size: 2048
crc32: 150c5f1f
- name: sys80.zip
required: false
category: bios_zip
system: trs80
source_ref: "src/mame/trs/trs80.cpp:620-632"
note: "EACA System-80 (1980). Clone of eg3003 with different extension ROM. sys80p (50 Hz) shares ROMs."
contents:
- name: sys80.z13
description: "System-80 extension ROM"
size: 2048
crc32: 2a851e33
- name: 2513.z25
description: "Character generator ROM"
size: 1024
crc32: 0033f2b9
- name: ht1080z.zip
required: false
category: bios_zip
system: trs80
source_ref: "src/mame/trs/trs80.cpp:637-646"
note: "Hiradastechnika HT-1080Z Series I (1983). Hungarian clone of eg3003."
contents:
- name: ht1080z.z25
description: "HT-1080Z character generator ROM"
size: 2048
crc32: e8c59d4f
- name: ht1080z2.zip
required: false
category: bios_zip
system: trs80
source_ref: "src/mame/trs/trs80.cpp:649-658"
note: "Hiradastechnika HT-1080Z Series II (1984). Clone of eg3003."
contents:
- name: ht1080z2.z13
description: "HT-1080Z II extension ROM"
size: 2048
crc32: "07415ac6"
- name: ht1080z2.z25
description: "HT-1080Z II character generator ROM"
size: 2048
crc32: 6728f0ab
- name: ht108064.zip
required: false
category: bios_zip
system: trs80
source_ref: "src/mame/trs/trs80.cpp:661-670"
note: "Hiradastechnika HT-1080Z/64 (1985). 64-column clone of eg3003."
contents:
- name: 3001_64.z10
description: "ROM A (64-col BASIC part 1)"
size: 4096
crc32: 59ec132e
- name: 3002_64.z11
description: "ROM B (64-col BASIC part 2)"
size: 4096
crc32: a7a73e8c
- name: ht108064.z13
description: "HT-1080Z/64 extension ROM"
size: 2048
crc32: fc12bd28
- name: ht108064.z25
description: "HT-1080Z/64 character generator ROM"
size: 2048
crc32: e76b73a4
- name: trs80m3.zip
required: true
category: bios_zip
system: trs80
source_ref: "src/mame/trs/trs80m3.cpp:483-519"
note: |
TRS-80 Model III (1980). Parent for trs80m4/trs80m4p/cp500 clones.
4 BIOS variants: Level 2 ROM C Rev C (default), Rev B, Network III v2 (student),
Level 1. MACHINE_NOT_WORKING.
contents:
- name: 8041364.u104
description: "Level 2 ROM A"
size: 8192
crc32: ec0c6daa
- name: 8040332.u105
description: "Level 2 ROM B"
size: 4096
crc32: ed4ee921
- name: 8040316c.u106
description: "Level 2 ROM C Rev C (default)"
size: 2048
crc32: c8f79433
- name: 8040316b.u106
description: "Level 2 ROM C Rev B"
size: 2048
crc32: 84a5702d
- name: 276a.u106
description: "Network III v2 ROM C"
size: 2048
crc32: 7d38720a
- name: 8040032.u104
description: "Level 1 BIOS"
size: 4096
crc32: 6418d641
- name: 8044316a.u36
description: "Character generator ROM (rev A)"
size: 2048
crc32: 444c8b60
- name: trs80m4.zip
required: false
category: bios_zip
system: trs80
source_ref: "src/mame/trs/trs80m3.cpp:522-528"
note: |
TRS-80 Model 4 (1980). Clone of trs80m3. BAD_DUMP combined ROM
(should be split into 3 like trs80m3). MACHINE_NOT_WORKING.
contents:
- name: trs80m4.rom
description: "Combined system ROM (BAD_DUMP)"
size: 14336
crc32: 1a92d54d
- name: 8044316a.u36
description: "Character generator ROM"
size: 2048
crc32: 444c8b60
- name: trs80m4p.zip
required: false
category: bios_zip
system: trs80
source_ref: "src/mame/trs/trs80m3.cpp:530-539"
note: |
TRS-80 Model 4P (1983). Clone of trs80m3. Completely different memory map;
Model III ROMs loaded from boot disk, only a bootloader ROM on board.
2 BIOS variants: gate array (default) and disk loader hack.
MACHINE_NOT_WORKING.
contents:
- name: 8075332.u69
description: "Bootloader ROM"
size: 4096
crc32: 3a738aa9
- name: trs80m4p_loader_hack.rom
description: "Disk loader hack ROM"
size: 504
crc32: 7ff336f4
- name: 8049007.u103
description: "Character generator ROM"
size: 2048
crc32: 1ac44bea
- name: cp500.zip
required: false
category: bios_zip
system: trs80
source_ref: "src/mame/trs/trs80m3.cpp:541-550"
note: "Prologica CP-500 (1982). Brazilian TRS-80 Model III clone. MACHINE_NOT_WORKING."
contents:
- name: s_8407_cn62516n_cp500a_prologica_83.ci111
description: "Combined system + boot ROM"
size: 16384
crc32: c2fc1b92
- name: 100.105.ci36
description: "Character generator ROM"
size: 2048
crc32: 1765931e

View File

@@ -194,7 +194,7 @@ nav:
- vitaQuakeII: emulators/vitaquake2.md
- yabasanshiro: emulators/yabasanshiro.md
- Yuzu: emulators/yuzu.md
- Community forks (108):
- Community forks (109):
- EightyOne: emulators/81.md
- a5200: emulators/a5200.md
- Anarch: emulators/anarch.md
@@ -236,6 +236,7 @@ nav:
- Gambatte: emulators/gambatte.md
- Genesis Plus GX: emulators/genesis_plus_gx.md
- gpSP: emulators/gpsp.md
- GSplus: emulators/gsplus.md
- Handy: emulators/handy.md
- higan (SFC Accuracy): emulators/higan_sfc.md
- LRPS2: emulators/lrps2.md
@@ -427,7 +428,7 @@ nav:
- PCSX-ReARMed: emulators/pcsx_rearmed.md
- Launchers (1):
- Dolphin Launcher: emulators/dolphin_launcher.md
- Other (25):
- Other (24):
- ares: emulators/ares.md
- Beetle GBA (Mednafen): emulators/beetle_gba.md
- BigPEmu: emulators/bigpemu.md
@@ -436,7 +437,6 @@ nav:
- Demul: emulators/demul.md
- eka2l1: emulators/eka2l1.md
- ep128emu-core: emulators/ep128emu.md
- GSplus: emulators/gsplus.md
- Lexaloffle: emulators/lexaloffle.md
- Model 2 Emulator: emulators/model2.md
- openMSX: emulators/openmsx.md

View File

@@ -27,9 +27,9 @@ from pathlib import Path
sys.path.insert(0, os.path.dirname(__file__))
from common import (
MANUFACTURER_PREFIXES,
build_zip_contents_index, check_inside_zip, compute_hashes,
fetch_large_file, group_identical_platforms, list_emulator_profiles,
list_platform_system_ids, list_registered_platforms,
build_target_cores_cache, build_zip_contents_index, check_inside_zip,
compute_hashes, fetch_large_file, group_identical_platforms,
list_emulator_profiles, list_platform_system_ids, list_registered_platforms,
filter_systems_by_target, list_system_ids, load_database,
load_data_dir_registry, load_emulator_profiles, load_platform_config,
md5_composite, require_yaml, resolve_local_file,
@@ -950,7 +950,7 @@ def generate_pack(
src = os.path.join(root, fname)
rel = os.path.relpath(src, local_path)
full = f"{dd_prefix}/{rel}"
if full in seen_destinations or full.lower() in seen_lower and case_insensitive:
if full in seen_destinations or (full.lower() in seen_lower and case_insensitive):
continue
if _has_path_conflict(full, seen_destinations, seen_parents):
continue
@@ -1913,25 +1913,13 @@ def main():
target_cores_cache: dict[str, set[str] | None] = {}
if args.target:
from common import load_target_config
skip = []
for p in platforms:
try:
target_cores_cache[p] = load_target_config(p, args.target, args.platforms_dir)
except FileNotFoundError:
if args.all:
target_cores_cache[p] = None
else:
print(f"ERROR: No target config for platform '{p}'", file=sys.stderr)
sys.exit(1)
except ValueError as e:
if args.all:
print(f"INFO: Skipping {p}: {e}")
skip.append(p)
else:
print(f"ERROR: {e}", file=sys.stderr)
sys.exit(1)
platforms = [p for p in platforms if p not in skip]
try:
target_cores_cache, platforms = build_target_cores_cache(
platforms, args.target, args.platforms_dir, is_all=args.all,
)
except (FileNotFoundError, ValueError) as e:
print(f"ERROR: {e}", file=sys.stderr)
sys.exit(1)
groups = group_identical_platforms(platforms, args.platforms_dir,
target_cores_cache if args.target else None)

View File

@@ -47,6 +47,24 @@ class ChangeSet:
return ", ".join(parts) if parts else "no changes"
MAX_RESPONSE_SIZE = 50 * 1024 * 1024 # 50 MB
def _read_limited(resp: object, max_bytes: int = MAX_RESPONSE_SIZE) -> bytes:
"""Read an HTTP response with a size limit to prevent OOM."""
chunks: list[bytes] = []
total = 0
while True:
chunk = resp.read(65536) # type: ignore[union-attr]
if not chunk:
break
total += len(chunk)
if total > max_bytes:
raise ValueError(f"Response exceeds {max_bytes} byte limit")
chunks.append(chunk)
return b"".join(chunks)
class BaseScraper(ABC):
"""Abstract base class for platform BIOS requirement scrapers."""
@@ -63,7 +81,7 @@ class BaseScraper(ABC):
try:
req = urllib.request.Request(self.url, headers={"User-Agent": "retrobios-scraper/1.0"})
with urllib.request.urlopen(req, timeout=30) as resp:
self._raw_data = resp.read().decode("utf-8")
self._raw_data = _read_limited(resp).decode("utf-8")
return self._raw_data
except urllib.error.URLError as e:
raise ConnectionError(f"Failed to fetch {self.url}: {e}") from e

View File

@@ -6,18 +6,20 @@ from __future__ import annotations
import importlib
import pkgutil
from abc import ABC, abstractmethod
from pathlib import Path
class BaseTargetScraper:
class BaseTargetScraper(ABC):
"""Base class for target scrapers."""
def __init__(self, url: str = ""):
self.url = url
@abstractmethod
def fetch_targets(self) -> dict:
"""Fetch targets and their core lists. Returns dict matching target YAML format."""
raise NotImplementedError
...
def write_output(self, data: dict, output_path: str) -> None:
"""Write target data to YAML file."""

View File

@@ -152,7 +152,7 @@ def _condition_holds(condition: str, active: frozenset[str]) -> bool:
try:
result, _ = _check_condition(tokens, 0, active)
return result
except Exception:
except (IndexError, ValueError, TypeError):
return True # conservative: include on parse failure

View File

@@ -30,11 +30,11 @@ from pathlib import Path
sys.path.insert(0, os.path.dirname(__file__))
from common import (
build_zip_contents_index, check_inside_zip, compute_hashes,
filter_systems_by_target, group_identical_platforms, list_emulator_profiles,
list_system_ids, load_data_dir_registry, load_emulator_profiles,
load_platform_config, md5sum, md5_composite, require_yaml, resolve_local_file,
resolve_platform_cores,
build_target_cores_cache, build_zip_contents_index, check_inside_zip,
compute_hashes, filter_systems_by_target, group_identical_platforms,
list_emulator_profiles, list_system_ids, load_data_dir_registry,
load_emulator_profiles, load_platform_config, md5sum, md5_composite,
require_yaml, resolve_local_file, resolve_platform_cores,
)
yaml = require_yaml()
@@ -504,6 +504,7 @@ def verify_platform(
emu_profiles: dict | None = None,
target_cores: set[str] | None = None,
data_dir_registry: dict | None = None,
supplemental_names: set[str] | None = None,
) -> dict:
"""Verify all BIOS files for a platform, including cross-reference gaps."""
mode = config.get("verification_mode", "existence")
@@ -601,10 +602,11 @@ def verify_platform(
status_counts[s] = status_counts.get(s, 0) + 1
# Cross-reference undeclared files
from cross_reference import _build_supplemental_index
data_names = _build_supplemental_index()
if supplemental_names is None:
from cross_reference import _build_supplemental_index
supplemental_names = _build_supplemental_index()
undeclared = find_undeclared_files(config, emulators_dir, db, emu_profiles,
target_cores=target_cores, data_names=data_names)
target_cores=target_cores, data_names=supplemental_names)
exclusions = find_exclusion_notes(config, emulators_dir, emu_profiles, target_cores=target_cores)
# Ground truth coverage
@@ -1260,29 +1262,20 @@ def main():
target_cores_cache: dict[str, set[str] | None] = {}
if args.target:
from common import load_target_config
skip = []
for p in platforms:
try:
target_cores_cache[p] = load_target_config(p, args.target, args.platforms_dir)
except FileNotFoundError:
if args.all:
target_cores_cache[p] = None
else:
print(f"ERROR: No target config for platform '{p}'", file=sys.stderr)
sys.exit(1)
except ValueError as e:
if args.all:
print(f"INFO: Skipping {p}: {e}")
skip.append(p)
else:
print(f"ERROR: {e}", file=sys.stderr)
sys.exit(1)
platforms = [p for p in platforms if p not in skip]
try:
target_cores_cache, platforms = build_target_cores_cache(
platforms, args.target, args.platforms_dir, is_all=args.all,
)
except (FileNotFoundError, ValueError) as e:
print(f"ERROR: {e}", file=sys.stderr)
sys.exit(1)
# Group identical platforms (same function as generate_pack)
groups = group_identical_platforms(platforms, args.platforms_dir,
target_cores_cache if args.target else None)
from cross_reference import _build_supplemental_index
suppl_names = _build_supplemental_index()
all_results = {}
group_results: list[tuple[dict, list[str]]] = []
for group_platforms, representative in groups:
@@ -1291,6 +1284,7 @@ def main():
result = verify_platform(
config, db, args.emulators_dir, emu_profiles,
target_cores=tc, data_dir_registry=data_registry,
supplemental_names=suppl_names,
)
names = [load_platform_config(p, args.platforms_dir).get("platform", p) for p in group_platforms]
group_results.append((result, names))

View File

@@ -1494,7 +1494,7 @@ class TestE2E(unittest.TestCase):
def test_112_build_ground_truth(self):
"""build_ground_truth returns per-emulator detail for a filename."""
from common import build_ground_truth
from validation import build_ground_truth
profiles = load_emulator_profiles(self.emulators_dir)
index = _build_validation_index(profiles)
gt = build_ground_truth("present_req.bin", index)
@@ -1510,7 +1510,7 @@ class TestE2E(unittest.TestCase):
def test_113_build_ground_truth_empty(self):
"""build_ground_truth returns [] for unknown filename."""
from common import build_ground_truth
from validation import build_ground_truth
profiles = load_emulator_profiles(self.emulators_dir)
index = _build_validation_index(profiles)
gt = build_ground_truth("nonexistent.bin", index)
@@ -3010,7 +3010,7 @@ class TestE2E(unittest.TestCase):
def test_104_diff_truth_normalized_system_ids(self):
"""Diff matches systems with different ID formats via normalization."""
from common import diff_platform_truth
from truth import diff_platform_truth
truth = {
"systems": {