diff --git a/bios/Other/opentyrian/dpmi16bi.ovl b/bios/Other/opentyrian/dpmi16bi.ovl new file mode 100644 index 00000000..a38dd371 Binary files /dev/null and b/bios/Other/opentyrian/dpmi16bi.ovl differ diff --git a/bios/Other/opentyrian/exitmsg.bin b/bios/Other/opentyrian/exitmsg.bin new file mode 100644 index 00000000..46eac1d9 --- /dev/null +++ b/bios/Other/opentyrian/exitmsg.bin @@ -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 ³ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ                                                                                 \ No newline at end of file diff --git a/bios/Other/opentyrian/loudness.awe b/bios/Other/opentyrian/loudness.awe new file mode 100644 index 00000000..0aa86022 Binary files /dev/null and b/bios/Other/opentyrian/loudness.awe differ diff --git a/bios/Other/opentyrian/modems.txt b/bios/Other/opentyrian/modems.txt new file mode 100644 index 00000000..22b40f73 --- /dev/null +++ b/bios/Other/opentyrian/modems.txt @@ -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" diff --git a/bios/Other/opentyrian/netarena.pcx b/bios/Other/opentyrian/netarena.pcx new file mode 100644 index 00000000..facb11b3 Binary files /dev/null and b/bios/Other/opentyrian/netarena.pcx differ diff --git a/bios/Other/opentyrian/netfont1.pcx b/bios/Other/opentyrian/netfont1.pcx new file mode 100644 index 00000000..d18dd31e Binary files /dev/null and b/bios/Other/opentyrian/netfont1.pcx differ diff --git a/bios/Other/opentyrian/netfont2.pcx b/bios/Other/opentyrian/netfont2.pcx new file mode 100644 index 00000000..963fe972 Binary files /dev/null and b/bios/Other/opentyrian/netfont2.pcx differ diff --git a/bios/Other/opentyrian/netmega.pcx b/bios/Other/opentyrian/netmega.pcx new file mode 100644 index 00000000..472fbc26 Binary files /dev/null and b/bios/Other/opentyrian/netmega.pcx differ diff --git a/bios/Other/opentyrian/netset.pcx b/bios/Other/opentyrian/netset.pcx new file mode 100644 index 00000000..f9d6ff07 Binary files /dev/null and b/bios/Other/opentyrian/netset.pcx differ diff --git a/bios/Other/opentyrian/netterm.int b/bios/Other/opentyrian/netterm.int new file mode 100644 index 00000000..8e4fb8fb Binary files /dev/null and b/bios/Other/opentyrian/netterm.int differ diff --git a/bios/Other/opentyrian/order.tfp b/bios/Other/opentyrian/order.tfp new file mode 100644 index 00000000..bf42beff Binary files /dev/null and b/bios/Other/opentyrian/order.tfp differ diff --git a/bios/Other/opentyrian/setup.box b/bios/Other/opentyrian/setup.box new file mode 100644 index 00000000..b6317503 Binary files /dev/null and b/bios/Other/opentyrian/setup.box differ diff --git a/bios/Other/opentyrian/setup.ini b/bios/Other/opentyrian/setup.ini new file mode 100644 index 00000000..33c5666a --- /dev/null +++ b/bios/Other/opentyrian/setup.ini @@ -0,0 +1,6 @@ +[INFO] +NETTYPE="4" +MODEMPHONE="" +LANGUAGE="English" +LANG="1" +LNG="INT" diff --git a/bios/Other/opentyrian/setup.int b/bios/Other/opentyrian/setup.int new file mode 100644 index 00000000..10fbaa5f Binary files /dev/null and b/bios/Other/opentyrian/setup.int differ diff --git a/bios/Other/opentyrian/shipedit.pcx b/bios/Other/opentyrian/shipedit.pcx new file mode 100644 index 00000000..f1fca3e2 Binary files /dev/null and b/bios/Other/opentyrian/shipedit.pcx differ diff --git a/bios/Other/opentyrian/tyrian.ico b/bios/Other/opentyrian/tyrian.ico new file mode 100644 index 00000000..ba77c68e Binary files /dev/null and b/bios/Other/opentyrian/tyrian.ico differ diff --git a/bios/Other/opentyrian/tyrset.pcx b/bios/Other/opentyrian/tyrset.pcx new file mode 100644 index 00000000..f9d6ff07 Binary files /dev/null and b/bios/Other/opentyrian/tyrset.pcx differ diff --git a/bios/Other/opentyrian/user1.shp b/bios/Other/opentyrian/user1.shp new file mode 100644 index 00000000..9a52eb02 Binary files /dev/null and b/bios/Other/opentyrian/user1.shp differ diff --git a/bios/Other/opentyrian/user2.shp b/bios/Other/opentyrian/user2.shp new file mode 100644 index 00000000..67b73967 Binary files /dev/null and b/bios/Other/opentyrian/user2.shp differ diff --git a/scripts/dedup.py b/scripts/dedup.py index 81327d1a..b7dbdd62 100644 --- a/scripts/dedup.py +++ b/scripts/dedup.py @@ -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", } diff --git a/tests/test_cache_independent_counts.py b/tests/test_cache_independent_counts.py new file mode 100644 index 00000000..be2e4f6e --- /dev/null +++ b/tests/test_cache_independent_counts.py @@ -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() diff --git a/wiki/tools.md b/wiki/tools.md index 719c025e..37f89ecc 100644 --- a/wiki/tools.md +++ b/wiki/tools.md @@ -677,7 +677,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 |