batch re-profiled nekop2 through pokemini. mupen64plus renamed to
mupen64plus_next. new profiles: nes, mupen64plus_next.
validation functions (_build_validation_index, check_file_validation)
consolidated in common.py — single source of truth for verify.py
and generate_pack.py. pipeline 100% consistent on all 6 platforms.
moved _mame_clones.json out of bios/ (was indexed by generate_db.py
as BIOS file). clone resolution now in common.py resolve_local_file
so all tools (verify, pack, cross_reference) resolve clones
transparently. removed duplicate clone code from generate_pack.py.
added error handling on os.remove in dedup.py. consistency check
now passes for Batocera/EmuDeck/Lakka/RetroArch (4/6 platforms).
non-ZIP files with different names but same content (64DD_IPL_US.n64
vs IPL_USA.n64) are now preserved — each name may be needed by a
different emulator. only same-name duplicates and MAME ZIP clones
are removed. added empty directory cleanup post-dedup.
all ZIP files (neogeo.zip, pgm.zip, etc.) are rebuilt with fixed
metadata before packing: sorted filenames, epoch timestamps, fixed
permissions, deflate level 9. same ROM atoms = same ZIP hash, always.
115 internal ZIPs verified identical across two independent builds.
enables version-agnostic ZIP assembly from ROM atoms indexed by CRC32.
post-generation verification: reopen each ZIP, hash every file,
check against database.json. inject manifest.json inside each pack
(self-documenting: path, sha1, md5, size, status per file).
generate SHA256SUMS.txt alongside packs for download verification.
validation index now uses sets for hashes and sizes to support
multiple valid ROM versions (MT-32 v1.04-v2.07, CM-32L variants).
69 tests pass, pipeline complete.
beetle_pce: +core_classification, +upstream, cores=[mednafen_pce],
alt_names→aliases. 6 files confirmed loaded by code.
mame: removed 19 phantom XaviX entries (MACHINE_IS_BIOS_ROOT commented
out in source). 80 real BIOS sets verified.
mame2010: fixed galgbios.zip source_ref, documented cheat.zip as
non-functional in libretro port (cheatpath never initialized).
ishiiruka: trimmed verbose advisory notes to factual descriptions.
mamearcade: added system: field to 29 bios_zip entries, 24 new systems.
mednafen_ngp: removed redundant cores: on alias, added note:.
mednafen_gba: normalized validation format to flow sequence.
pure python GF(2^233) field arithmetic, binary curve point operations,
and ECDSA-SHA256 on sect233r1. verifies OTP CTCert against nintendo
root CA public key. zero dependencies. sign+verify round-trip tested,
n*G=O verified, wrong key/message rejection confirmed.
pure python RSA-2048 PKCS1v15 SHA256 for SecureInfo_A,
LocalFriendCodeSeed_B, movable.sed. AES-128-CBC + SHA256 for otp.bin.
keys extracted from azahar default_keys.h, added RSA/ECC sections
to aes_keys.txt. sect233r1 ECC not reproducible (binary field curve).
adler32 hash via zlib.adler32(), min_size/max_size range checks,
signature/crypto tracked as non-reproducible (console-specific keys).
compute_hashes now returns adler32. 69 tests pass including 3 new
tests for adler32, size ranges, and crypto tracking.
trackball BIOS (236-bios.sp1, 236-bios_japan_hack.sp1) for irrmaze,
PCB BIOS (sp-4x.sp1, spj.sp1) for ms5pcb/svcpcb/kf2k3pcb. all carry
BRF_ESS flag in d_neogeo.cpp, verified against source.
Replace bios_zips section with structured files entries (category:
bios_zip, contents: with name/description/size/crc32) across all 4
MAME profiles. Profile mame2000 from source (was false alias of
mame2003_plus). Adds neogeo.zip, decocass.zip, hiscore.dat, cheat.dat.
add core_classification and upstream to all five profiles. kronos:
add ROM cartridge files (mpr-18811-mx.ic1, mpr-19367-mx.ic1), add
archive: field to STV blobs, remove unverified MD5 hashes, fix
cores list (remove yabause_libretro). jumpnbump: fix incorrect
note about embedded data. lowresnx, lutro, m2000: add missing
classification fields.
add --emulator, --system, --standalone, --list-emulators, --list-systems
to verify.py and generate_pack.py. packs are RTU with data directories,
regional BIOS variants, and archive support.
validation: field per file (size, crc32, md5, sha1) with conflict
detection. by_path_suffix index in database.json for regional variant
resolution via dest_hint. restructure GameCube IPL to regional subdirs.
66 E2E tests, full pipeline verified.
Move 17 case-colliding BIOS variants to .variants/ so Windows
and macOS clones no longer lose files. Existence-based platforms
keep the primary, MD5-based platforms resolve from .variants/.
Also fix resolve_local_file zipped_file resolution: when multiple
ZIPs share a name, verify the inner ROM exists before accepting
a candidate. Fixes adam_fdc.zip resolving to the wrong archive.
Batocera upstream has a truncated 29-char MD5 for zx48.rom.
The scraper now resolves truncated hashes via prefix match
against database.json, preventing schema validation failures.