chore: merge the archive recipe follow-ups

This commit is contained in:
Abdessamad Derraz committed 2026-10-22 15:10:14 +02:00
commit f18cfa1f5c
50 files changed
+161 -10

No files matched your search

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.
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.
+1
View File
@@ -0,0 +1 @@
                                                                                ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÙ                           Thank you for playing                            À¿³                            ÄÄ ÄÄ ÄÄ T y r i a n ÄÄÄ ÄÄ Ä                              ³ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´³       This game is NOT shareware. Please enjoy it but don't copy it.         ³³                                                                              ³³  If you want to see more great games from Epic MegaGames, visit us Online.   ³³                                                                              ³³ If you have a CompuServe account just GO EPIC at any CompuServe Prompt.      ³³ Here, you can get all of Epic's Shareware games, receive technical support,  ³³ or engage in casual conversation about any Epic product with other           ³³ CompuServe users.                                                            ³³                                                                              ³³ For all the latest Epic News, and links to Epic Distribution sites, visit    ³³ our World Wide Web site at http://www.epicgames.com                          ³ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄH o w Ät o Äo r d e r ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´³                                                                              ³³  W r i t e t o :                C a l l u s :                 V i s i t u s o n l i n e :          ³³  E p i c M e g a G a m e s           8 0 0 - 9 7 2 - 7 4 3 4 ( O r d e r s ) C o m p u S e r v e : G O E P I C       ³³  1 0 4 0 6 H o l b r o o k D r i v e     3 0 1 - 9 8 3 - 9 7 7 1 ( S u p p o r t ) B B S : 4 1 4 - 7 8 9 - 4 2 1 0         ³³  P o t o m a c , M D 2 0 8 5 4 U S A + 4 4 - 1 7 6 7 - 2 6 0 - 9 0 3 ( U K )    I n t e r n e t :                 ³³   0 - 4 0 8 9 9 6 8 4 - 0 ( G D R )      o r d e r s @ e p i c g a m e s . c o m ³ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ                                                                                
Binary file not shown.
+52
View File
@@ -0,0 +1,52 @@
[MODEMS]
Data
"Standard 9600 Baud Modem,9600,AT &F &C1 &D2 &Q5 &K0 S46=0",
"Standard 14.4 Baud Modem,14400,AT &F &C1 &D2 &Q5 &K0 S46=0",
"Acubit 14.4 fax v32,14400,AT &F &C1 &D2 %C0 \N1",
"AT&T Data Port 14.4 FaxModem,14400,AT &F &C1 &D2 S41=3 \N0 %C0",
"Boca 14.4 fax,14400,AT &F &C1 &D2 \N0 \G0 &K0 %C0 N0",
"Cardinal 14.4 v32,14400,AT &F &C1 &D2 N0",
"Cardinal 9600fax,14400,AT &F &C1 &D2 &Q6 &K0 %C0 \N0 N0",
"Digicom Scout Plus 14.4 Fax,14400,AT &F &C1 &D2 *M0 *E0",
"Gateway Telepath 14.4 fax,14400,AT &F &C1 &D2 B0 N0 \N0 %C0 &K0",
"Gateway Telepath 550,14400,AT &F &C1 &D2 S27=32 S15=16 S13=64 &B0 &H2 &I1 &K0 &M0",
"GVC 14.4 fax,14400,AT &F &C1 &D2 S46=0 N0 &K0",
"GVC 14.4 MNP2-5 v42,14400,AT &F &C1 &D2 %C0 \N0 B8",
"Hayes Optima 14.4 #1,14400,AT &F &C1 &D2 \N0",
"Hayes Optima 14.4 #2,14400,AT &F &C1 &D2 S46=0 N0 &K0",
"Hayes Optima 28.8,28800,AT &F &C1 &D2 &K0 &M0 &Q5 S46=136",
"Hayes Ultra 14.4,14400,AT &F &C1 &D2 &Q5 &K0",
"Identity Internal,14400,AT &F &C1 &D2 B8 %C0 \Q0 \N1",
"Infotel 14.4,14400,AT &F &C1 &D2 &Q6 %C0 N0 &K0",
"Intel 14.4,14400,AT &F &C1 &D2 \N0 \Q0 \J1 \V0",
"Intel 14.4 ext,14400,AT &F &C1 &D2 \N0 /Q0",
"Intel 14.4 fax,14400,AT &F N0 &D2 &C1 &Q6 &K0 S0=1",
"Intel 14.4i,14400,AT &F &C1 &D2 B8 %C0 H0 \N0 \Q0",
"Intel 14.4i fax,14400,AT &F &C1 &D2 \N0 \Q0",
"MegaHertz C596FM,14400,AT &F &C1 &D2 \N1 \J0 %C0",
"Rockwell 14400,14400,AT &F &C1 &D2 N0 S46=0 &K0 %C0",
"Practical Perip 14.4FX v32,14400,AT &F &C1 &D2 &K0 &Q5 S46=0",
"Redicard v.32 bis 14.4,14400,AT &F &C1 &D2 %C \N",
"Smart One 1442F,14400,AT &F &C1 &D2 %C0 &K0 S95=44 S46=0",
"SupraFax 14.4,14400,AT &F &C1 &D2 &Q6 &K %C0 \N1 S37=6 S0=1",
"SupraFax 14.4 v32,14400,AT &F &C1 &D2 S46=136 %C0",
"SupraFax 14.4 v32-,14400,AT &F &C1 &D2 S46=136 M1 Q0 D2",
"Telebit Worldblazer 14.4,14400,AT &F &C1 &D2 S51=4 S180=0 S183=8 S190=0 L1",
"Telepath 550,14400,AT &F &C1 &D2 &M0 &K0 S0=1",
"USR Sportster 14.4 v32 fax,14400,AT &F &A0 &B1 &C1 &D2 &M0 &H0 &I0 &K0 S27=48",
"USRobotics 14.4 fax,14400,AT &F &A0 &B1 &C1 &D2 &M0 &H0 &I0 &K0 S27=48",
"USRobotics 14.4 v32 fax,14400,AT &F &A0 &B1 &C1 &D2 &M0 &H0 &I0 &K0 S27=48",
"USRobotics Sportster 14.4,14400,AT &F &A0 &B1 &C1 &D2 &M0 &H0 &I0 &K0 S27=48",
"Viva 14.4,14400,AT &F &C1 &D2 \N0",
"Viva 14.4i fax,14400,AT &F &C1 &D2 \N0 \Q0 \J1 \VI",
"VivaFax 14.4,14400,AT &F &C1 &D2 N0 \N1 %C0 &K0",
"VivaFax 14.4,14400,AT &F &C1 &D2 \Q0 &M0 %C0 B8 \N1",
"ZOOM 14.4,14400,AT &F &C1 &D2 &K0 &Q6 %C0 \G0 \N0 S46=136",
"ZOOM 14.4 v32 v42 fax,14400,AT &F &C1 &D2 &K0 &Q6 %C0 \G0 \N0 S46=136",
"ZOOM VFP 14.4,14400,AT &F &C1 &D2 &K0 &Q6 %C0 \G0 \N0 S46=136",
"ZOOM VFX v32,14400,AT &F &C1 &D2 &K0 &Q6 %C0 \G0 \N0 S46=136",
"ZOOM VXP 14.4 v42,14400,AT &F &C1 &D2 &K0 &Q6 %C0 \G0 \N0 S46=136",
"Zoomfax VFP v32,14400,AT &F &C1 &D2 &K0 &Q6 %C0 \G0 \N0 S46=136",
"ZyXel 14.4,14400,AT &F &C1 &D2 \N0",
"ZyXEL U-1496 14.4,14400,AT &F &C1 &D2 S46=0 &K0"
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.
+6
View File
@@ -0,0 +1,6 @@
[INFO]
NETTYPE="4"
MODEMPHONE=""
LANGUAGE="English"
LANG="1"
LNG="INT"
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 766 B

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+3 -3
View File
@@ -588,13 +588,13 @@ files:
source_ref: "upstream src/burn/drv/pgm/d_pgm.cpp:887"
- name: "svg_bios.u49"
archive: pgm.zip
archive: svgpcb.zip
system: igs-pgm
required: false
size: 131072
crc32: "3346401f"
note: "68K BIOS V0001 custom (05/13/05) for SVG PCB"
source_ref: "upstream src/burn/drv/pgm/d_pgm.cpp:928"
note: "68K BIOS V0001 custom (05/13/05) for SVG PCB, in the svgpcb ROM list"
source_ref: "upstream src/burn/drv/pgm/d_pgm.cpp:928, 7035"
# -------------------------------------------------------
# Capcom CPS-3 (per-game BIOS, no shared archive)
+3
View File
@@ -70,6 +70,9 @@ NODEDUP_DIRS = {
# MAME's support trees (hash, plugins) are read by path as a whole, and
# two MAME versions share most of their software lists byte for byte.
"mame",
# The Tyrian 2.1 distribution ships netset.pcx and tyrset.pcx with the
# same bytes, and EmuELEC places both names under ports/opentyrian/.
"opentyrian",
}
+32 -6
View File
@@ -20,9 +20,12 @@ REPO_ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(REPO_ROOT / "scripts"))
# Sets whose archive also carries the ROMs of devices the machine references
# (listxml device_ref): the NAOMI boards pull the JVS I/O board and the Maple
# interface, and MAME finds those ROMs in the machine's own archive too.
# (listxml device_ref). A device looks for its ROMs under its own name, then
# under the system's (device_t::searchpath, src/emu/device.cpp:140-152), so
# MAME finds them in the machine's own archive too. A device set is not a
# system: the devices it holds are never looked for in its archive.
DEVICE_ROMS = {
# NAOMI boards: the JVS I/O board and the Maple interface
"airlbios.zip": ("jvs13551.zip", "mie.zip"),
"f355bios.zip": ("jvs13551.zip", "mie.zip"),
"f355dlx.zip": ("jvs13551.zip", "mie.zip"),
@@ -30,18 +33,41 @@ DEVICE_ROMS = {
"naomi.zip": ("jvs13551.zip", "mie.zip"),
"naomi2.zip": ("jvs13551.zip", "mie.zip"),
"naomigd.zip": ("jvs13551.zip", "mie.zip"),
# Teletext character ROM: SAA5050 in bbcmet (acorn/bbcm.cpp:701), which
# bbcm builds on (line 764)
"bbcm.zip": ("saa5050.zip",),
# DragonDOS, the default cartridge (trs/dragon.cpp:544, 562)
"dragon32.zip": ("dragon_fdc.zip",),
"dragon64.zip": ("dragon_fdc.zip",),
# PC-80S31 disk unit (nec/pc6001.cpp:1644 through pc6601_fdc_config,
# nec/pc8001.cpp:1257)
"pc6001mk2sr.zip": ("pc80s31.zip",),
"pc8001mk2sr.zip": ("pc80s31.zip",),
}
# Archives that share a set name without being that set.
NOT_ROMSETS = {"samples", "artwork"}
# The defect added whole slot-option trees, dozens of members at a time.
MIN_EXTRA = 3
MIN_EXTRA = 1
# Kept as they are: rewriting them would drop bytes the collection holds
# nowhere else, and no recipe names the set those bytes belong to.
# nowhere else, or they are another emulator's archive under a MAME set name.
KEPT = {
"bios/Acorn/BBC Micro/.variants/bbcb.zip": "zdfs-0.90.rom is held only here",
"bios/Acorn/BBC Micro/.variants/bbcb.zip": (
"MAME 0.150's bbcb loads its DFS ROMs from the machine archive "
"(src/mess/drivers/bbc.c ROM_START(bbcb)), older than every imported "
"listxml; zdfs-0.90.rom is held only here"
),
"bios/Arcade/Arcade/.variants/cvs.zip.3c69f366": (
"the 2001 mame.dk distribution of cvs.zip; its cvs.txt is held only here"
),
"bios/Mattel/Aquarius/.variants/aquarius_ar.zip.73026a45": (
"a platform pack copy; its TMCTV.png is held only here"
),
"bios/Sega/Dreamcast/dc.zip": (
"RetroBat's dc/dc.zip holds dc_boot.bin and dc_flash.bin, the names the "
"Dreamcast BIOS goes by outside MAME, not MAME's dc set"
),
}
+63
View File
@@ -0,0 +1,63 @@
"""A platform's coverage does not depend on which data caches are on disk.
EmuELEC declares 19 files of the Tyrian 2.1 distribution that bios/ did not
hold (setup.ini, netterm.int...). They resolved only through data/opentyrian,
the cache refresh_data_dirs.py fills from a release asset, so verify gave
544/572 in a checkout with that cache and 525/572 in a fresh worktree, for the
same commit. A file a platform declares is collected in bios/; a data
directory cache is not a collection.
"""
from __future__ import annotations
import os
import sys
import unittest
from pathlib import Path
REPO_ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(REPO_ROOT / "scripts"))
class DeclaredFilesResolveWithoutDataCaches(unittest.TestCase):
def test_no_platform_entry_rests_on_a_data_directory_cache(self):
from common import ( # noqa: PLC0415
build_zip_contents_index,
list_registered_platforms,
load_data_dir_registry,
load_database,
load_platform_config,
)
from packresolve import resolve_declaration # noqa: PLC0415
platforms_dir = REPO_ROOT / "platforms"
registry = load_data_dir_registry(str(platforms_dir))
caches = [
entry["local_cache"] for entry in registry.values()
if (REPO_ROOT / entry.get("local_cache", "")).is_dir()
]
if not caches or not (REPO_ROOT / "database.json").is_file():
self.skipTest("no data directory cache on disk (refresh_data_dirs.py fills them)")
cwd = os.getcwd()
os.chdir(REPO_ROOT)
try:
db = load_database("database.json")
zip_contents = build_zip_contents_index(db)
offenders = []
for platform in list_registered_platforms(str(platforms_dir), include_archived=True):
config = load_platform_config(platform, str(platforms_dir))
for sys_id, system in config.get("systems", {}).items():
for entry in system.get("files", []) or []:
path, status = resolve_declaration(
entry, db, "bios", zip_contents, registry, None, offline=True,
)
if status.startswith("data_dir"):
offenders.append(f"{platform} {sys_id} {entry.get('name')}: {path}")
finally:
os.chdir(cwd)
self.assertEqual(offenders, [], "\n".join(offenders))
if __name__ == "__main__":
unittest.main()
+1 -1
View File
@@ -678,7 +678,7 @@ python scripts/refresh_stale.py --only platforms,targets --jobs 6
| Script | Purpose |
|--------|---------|
| `common.py` | Shared library: hash computation, file resolution, platform config loading, emulator profiles, target filtering |
| `dedup.py` | Deduplicate `bios/` (`--dry-run`, `--bios-dir`): byte-identical copies are deleted and one kept. Identical MAME sets under other names stay one file, named in `_mame_clones.json`. Trees addressed by path are left alone (`NODEDUP_DIRS`): BBK, Bungie, C-Dogs SDL, Ikemen GO, PinMAME, RPG Maker, ScummVM, Softdisk, TheXTech, splitwolf, Theme Hospital, c64-emu, tzdata |
| `dedup.py` | Deduplicate `bios/` (`--dry-run`, `--bios-dir`): byte-identical copies are deleted and one kept. Identical MAME sets under other names stay one file, named in `_mame_clones.json`. Trees addressed by path are left alone (`NODEDUP_DIRS`): BBK, Bungie, C-Dogs SDL, Ikemen GO, PinMAME, RPG Maker, ScummVM, Softdisk, TheXTech, splitwolf, Theme Hospital, c64-emu, opentyrian, tzdata |
| `identity.py` | One content filed under two identities: groups `bios/` by content and reports a group that crosses manufacturers outside `KNOWN_SHARED` (`--strict` exits 1, pipeline step 3a) |
| `slots.py` | Destinations the platform and a core both claim, and how the pack settles each (`--platform`, `--include-archived`, `--target`, `--json`, `--strict`, and pipeline step 3b passes the run's own `--include-archived` and `--target`) |
| `region_audit.py` | Confront every profile `region:` with the regions No-Intro names for the same dump (`--json`, `--db`, `--emulators-dir`). An opinion, never an authority: the code decides, and a disagreement is a line to read in the emulator's source |