diff --git a/bios/Acorn/BBC/.variants/bbcm.zip.4cc3e25a b/bios/Acorn/BBC/.variants/bbcm.zip.4cc3e25a new file mode 100644 index 00000000..ba7b9e8b Binary files /dev/null and b/bios/Acorn/BBC/.variants/bbcm.zip.4cc3e25a differ diff --git a/bios/Apple/Apple II/.variants/apple2gs.zip.ca867966 b/bios/Apple/Apple II/.variants/apple2gs.zip.ca867966 new file mode 100644 index 00000000..26d063bb Binary files /dev/null and b/bios/Apple/Apple II/.variants/apple2gs.zip.ca867966 differ diff --git a/bios/Arcade/Arcade/.variants/ar_bios.zip.ecb945ab b/bios/Arcade/Arcade/.variants/ar_bios.zip.ecb945ab new file mode 100644 index 00000000..600d70ea Binary files /dev/null and b/bios/Arcade/Arcade/.variants/ar_bios.zip.ecb945ab differ diff --git a/bios/Arcade/Arcade/.variants/aristmk5.zip.e0d5faae b/bios/Arcade/Arcade/.variants/aristmk5.zip.e0d5faae new file mode 100644 index 00000000..1f2724af Binary files /dev/null and b/bios/Arcade/Arcade/.variants/aristmk5.zip.e0d5faae differ diff --git a/bios/Arcade/Arcade/.variants/aristmk6.zip.b49dd731 b/bios/Arcade/Arcade/.variants/aristmk6.zip.b49dd731 new file mode 100644 index 00000000..fe913454 Binary files /dev/null and b/bios/Arcade/Arcade/.variants/aristmk6.zip.b49dd731 differ diff --git a/bios/Arcade/Arcade/.variants/awbios.zip.58fa329c b/bios/Arcade/Arcade/.variants/awbios.zip.58fa329c new file mode 100644 index 00000000..a8d8c758 Binary files /dev/null and b/bios/Arcade/Arcade/.variants/awbios.zip.58fa329c differ diff --git a/bios/Arcade/Arcade/.variants/coh3002t.zip.db439f9b b/bios/Arcade/Arcade/.variants/coh3002t.zip.db439f9b new file mode 100644 index 00000000..12c73d0f Binary files /dev/null and b/bios/Arcade/Arcade/.variants/coh3002t.zip.db439f9b differ diff --git a/bios/Arcade/Arcade/.variants/cvs.zip.95581230 b/bios/Arcade/Arcade/.variants/cvs.zip.95581230 new file mode 100644 index 00000000..91621c12 Binary files /dev/null and b/bios/Arcade/Arcade/.variants/cvs.zip.95581230 differ diff --git a/bios/Arcade/Arcade/.variants/iteagle.zip.bfae6c69 b/bios/Arcade/Arcade/.variants/iteagle.zip.bfae6c69 new file mode 100644 index 00000000..f959d4e6 Binary files /dev/null and b/bios/Arcade/Arcade/.variants/iteagle.zip.bfae6c69 differ diff --git a/bios/Arcade/Arcade/.variants/macsbios.zip.2d8bb01c b/bios/Arcade/Arcade/.variants/macsbios.zip.2d8bb01c new file mode 100644 index 00000000..527fa0a7 Binary files /dev/null and b/bios/Arcade/Arcade/.variants/macsbios.zip.2d8bb01c differ diff --git a/bios/Arcade/Arcade/.variants/neogeo.zip.0c69efec b/bios/Arcade/Arcade/.variants/neogeo.zip.0c69efec new file mode 100644 index 00000000..12e60fc6 Binary files /dev/null and b/bios/Arcade/Arcade/.variants/neogeo.zip.0c69efec differ diff --git a/bios/Arcade/Arcade/.variants/neogeo.zip.4ccf6682 b/bios/Arcade/Arcade/.variants/neogeo.zip.4ccf6682 new file mode 100644 index 00000000..ecd1a1d6 Binary files /dev/null and b/bios/Arcade/Arcade/.variants/neogeo.zip.4ccf6682 differ diff --git a/bios/Arcade/Arcade/.variants/neogeo.zip.74df3258 b/bios/Arcade/Arcade/.variants/neogeo.zip.74df3258 new file mode 100644 index 00000000..8bd1589b Binary files /dev/null and b/bios/Arcade/Arcade/.variants/neogeo.zip.74df3258 differ diff --git a/bios/Arcade/Arcade/.variants/nss.zip.248e7c57 b/bios/Arcade/Arcade/.variants/nss.zip.248e7c57 new file mode 100644 index 00000000..53244e01 Binary files /dev/null and b/bios/Arcade/Arcade/.variants/nss.zip.248e7c57 differ diff --git a/bios/Arcade/Arcade/.variants/nss.zip.cba0bd8c b/bios/Arcade/Arcade/.variants/nss.zip.cba0bd8c new file mode 100644 index 00000000..39a6119d Binary files /dev/null and b/bios/Arcade/Arcade/.variants/nss.zip.cba0bd8c differ diff --git a/bios/Arcade/Arcade/.variants/playch10.zip.f6937dd2 b/bios/Arcade/Arcade/.variants/playch10.zip.f6937dd2 new file mode 100644 index 00000000..ca5dc71c Binary files /dev/null and b/bios/Arcade/Arcade/.variants/playch10.zip.f6937dd2 differ diff --git a/bios/Arcade/Arcade/.variants/sammymdl.zip.984f99b1 b/bios/Arcade/Arcade/.variants/sammymdl.zip.984f99b1 new file mode 100644 index 00000000..f5c1597c Binary files /dev/null and b/bios/Arcade/Arcade/.variants/sammymdl.zip.984f99b1 differ diff --git a/bios/Arcade/Arcade/.variants/sfcbox.zip.91a23266 b/bios/Arcade/Arcade/.variants/sfcbox.zip.91a23266 new file mode 100644 index 00000000..c0c3a0b8 Binary files /dev/null and b/bios/Arcade/Arcade/.variants/sfcbox.zip.91a23266 differ diff --git a/bios/Arcade/Arcade/.variants/taitogn.zip.07896f33 b/bios/Arcade/Arcade/.variants/taitogn.zip.07896f33 new file mode 100644 index 00000000..0ca304f6 Binary files /dev/null and b/bios/Arcade/Arcade/.variants/taitogn.zip.07896f33 differ diff --git a/bios/Arcade/MAME/.variants/fmnew7.zip.9c457ba7 b/bios/Arcade/MAME/.variants/fmnew7.zip.9c457ba7 new file mode 100644 index 00000000..f14170b6 Binary files /dev/null and b/bios/Arcade/MAME/.variants/fmnew7.zip.9c457ba7 differ diff --git a/bios/Arcade/MAME/.variants/ht108064.zip.e5351d56 b/bios/Arcade/MAME/.variants/ht108064.zip.e5351d56 new file mode 100644 index 00000000..24e5f5d4 Binary files /dev/null and b/bios/Arcade/MAME/.variants/ht108064.zip.e5351d56 differ diff --git a/bios/Arcade/MAME/.variants/ht1080z.zip.db201616 b/bios/Arcade/MAME/.variants/ht1080z.zip.db201616 new file mode 100644 index 00000000..6e0f239c Binary files /dev/null and b/bios/Arcade/MAME/.variants/ht1080z.zip.db201616 differ diff --git a/bios/Arcade/MAME/.variants/ht1080z2.zip.9109d2b7 b/bios/Arcade/MAME/.variants/ht1080z2.zip.9109d2b7 new file mode 100644 index 00000000..a41a8a04 Binary files /dev/null and b/bios/Arcade/MAME/.variants/ht1080z2.zip.9109d2b7 differ diff --git a/bios/Arcade/MAME/.variants/sys80.zip.5dacef66 b/bios/Arcade/MAME/.variants/sys80.zip.5dacef66 new file mode 100644 index 00000000..6f123a2e Binary files /dev/null and b/bios/Arcade/MAME/.variants/sys80.zip.5dacef66 differ diff --git a/bios/Mattel/Aquarius/.variants/aquarius2.zip.e8ce522e b/bios/Mattel/Aquarius/.variants/aquarius2.zip.e8ce522e new file mode 100644 index 00000000..b59734b2 Binary files /dev/null and b/bios/Mattel/Aquarius/.variants/aquarius2.zip.e8ce522e differ diff --git a/emulators/mame4droid.yml b/emulators/mame4droid.yml index 70306df9..e29273d5 100644 --- a/emulators/mame4droid.yml +++ b/emulators/mame4droid.yml @@ -531,7 +531,7 @@ files: category: bios_zip system: sammy-atomiswave description: "Atomiswave Bios" - source_ref: "upstream src/mame/drivers/naomi.c:6625" + source_ref: "upstream src/mame/drivers/naomi.c:2161-2163, 2216-2221, 6625" contents: - name: "bios.ic23_l" size: 65536 diff --git a/tests/test_archive_choice.py b/tests/test_archive_choice.py index 0a76ac38..87e79a55 100644 --- a/tests/test_archive_choice.py +++ b/tests/test_archive_choice.py @@ -218,6 +218,51 @@ class TheArchiveHoldingTheCoreMembers(unittest.TestCase): self.assertNotIn('{"name": archive', source) +class EveryDeclaredLayoutIsHeld(unittest.TestCase): + """mame4droid reads awbios.zip as MAME 0.139 laid it out, bios.ic23_l + alone, and every copy held the later bios0/bios1.ic23 split: the core + found no BIOS in the archive the pack shipped under its name. A + ``contents:`` list names one version of a set, and the collection must + hold that version, served to the profile that declares it.""" + + def test_a_copy_holds_each_declared_layout_and_is_served(self): + import json + + from common import load_emulator_profiles, resolve_local_file, zip_member_crcs + + database = REPO_ROOT / "database.json" + if not (REPO_ROOT / "bios").is_dir() or not database.exists(): + self.skipTest("bios/ or database.json is absent") + db = json.loads(database.read_text()) + by_name = db["indexes"]["by_name"] + previous = os.getcwd() + os.chdir(REPO_ROOT) + self.addCleanup(os.chdir, previous) + short, unserved = [], [] + for emu, profile in load_emulator_profiles("emulators").items(): + for entry in profile.get("files") or []: + if entry.get("category") != "bios_zip" or entry.get("unsourceable"): + continue + crcs = {str(m["crc32"]).lower() for m in entry.get("contents") or [] + if m.get("crc32")} + names = [entry["name"], *(entry.get("aliases") or [])] + copies = [ + db["files"][sha1]["path"] for name in names + for sha1 in by_name.get(name, []) if sha1 in db["files"] + ] + copies = [path for path in copies if Path(path).exists()] + if not crcs or not copies: + continue + if not any(crcs <= zip_member_crcs(path) for path in copies): + short.append(f"{emu}: {entry['name']}") + continue + path, _status = resolve_local_file(entry, db) + if not path or not crcs <= zip_member_crcs(path): + unserved.append(f"{emu}: {entry['name']} -> {path}") + self.assertEqual(short, []) + self.assertEqual(unserved, []) + + class AnArchiveHashedByItsMembers(unittest.TestCase): """Recalbox hashes a .zip with Zip::Md5Composite (Bios.cpp:64-68). Its neocdz.zip pin is neocd.bin's md5, which is also the composite of a