diff --git a/bios/Sinclair/ZX 81/dkchr.rom b/bios/Sinclair/ZX 81/dkchr.rom new file mode 100644 index 00000000..289e5532 Binary files /dev/null and b/bios/Sinclair/ZX 81/dkchr.rom differ diff --git a/bios/Sinclair/ZX 81/zx81.rom b/bios/Sinclair/ZX 81/zx81.rom new file mode 100644 index 00000000..557ddcbc Binary files /dev/null and b/bios/Sinclair/ZX 81/zx81.rom differ diff --git a/database.json b/database.json index afced9e8..92164f78 100644 --- a/database.json +++ b/database.json @@ -1,7 +1,7 @@ { - "generated_at": "2026-03-18T15:11:54Z", - "total_files": 5565, - "total_size": 4908280385, + "generated_at": "2026-03-18T16:37:01Z", + "total_files": 5567, + "total_size": 4908292673, "files": { "520d3d1b5897800af47f92efd2444a26b7a7dead": { "path": "bios/3DO Company/3DO/3do_arcade_saot.bin", @@ -47127,6 +47127,24 @@ "sha256": "8a39aae2b2eb3c9fff09dc0d80bca9ffcb981f1665d9067ea1131129f3353b2b", "crc32": "37f87fac" }, + "04e352ab6d6ca7f50109f67c850d9dc0f467de77": { + "path": "bios/Sinclair/ZX 81/dkchr.rom", + "name": "dkchr.rom", + "size": 4096, + "sha1": "04e352ab6d6ca7f50109f67c850d9dc0f467de77", + "md5": "5cba3a306fbb94454811ba262b27c958", + "sha256": "079ad784af12e6bf0b5c52a7b4d92da5ae4acddd0b13d73ec4221b49636a6c51", + "crc32": "761137d7" + }, + "7b143ee964e9ada89d1f9e88f0bd48d919184cfc": { + "path": "bios/Sinclair/ZX 81/zx81.rom", + "name": "zx81.rom", + "size": 8192, + "sha1": "7b143ee964e9ada89d1f9e88f0bd48d919184cfc", + "md5": "db398d4e4e93a6d4dee3bfe146918219", + "sha256": "14ad84f4243efcd41587ff46ab932d11087043e8d455a1ed2a227b9657828dfa", + "crc32": "4b1dd6eb" + }, "4f4b11ec22326280bdb96e3baf9db4b4cb1d02c5": { "path": "bios/Sinclair/ZX Spectrum/128-0.rom", "name": "128-0.rom", @@ -55327,6 +55345,8 @@ "cc78d4f4900f622bd6de1aed7f52592f": "77511fc58798404701f66b6bbc9cbde06596eba7", "0617321daa182c3f3d6f41fd02fb3275": "e33cdcdb69cd257b0b211ef46e7a8b144637db57", "27fbde30ffc81dbf909d4287be7c0f28": "cede52455ac2a92607b4a16b59a9296f9be3b78e", + "5cba3a306fbb94454811ba262b27c958": "04e352ab6d6ca7f50109f67c850d9dc0f467de77", + "db398d4e4e93a6d4dee3bfe146918219": "7b143ee964e9ada89d1f9e88f0bd48d919184cfc", "b4d2692115a9f2924df92a3cbfb358fb": "4f4b11ec22326280bdb96e3baf9db4b4cb1d02c5", "6e09e5d3c4aef166601669feaaadc01c": "80080644289ed93d71a1103992a154cc9802b2fa", "c1231a70b8129311216acb7479b031d5": "968937b1c750f0ef6205f01c6db4148da4cca4e3", @@ -69789,6 +69809,12 @@ "sram.dat": [ "cede52455ac2a92607b4a16b59a9296f9be3b78e" ], + "dkchr.rom": [ + "04e352ab6d6ca7f50109f67c850d9dc0f467de77" + ], + "zx81.rom": [ + "7b143ee964e9ada89d1f9e88f0bd48d919184cfc" + ], "128-0.rom": [ "4f4b11ec22326280bdb96e3baf9db4b4cb1d02c5" ], @@ -77161,6 +77187,8 @@ "6c7ef608": "77511fc58798404701f66b6bbc9cbde06596eba7", "00eeb408": "e33cdcdb69cd257b0b211ef46e7a8b144637db57", "37f87fac": "cede52455ac2a92607b4a16b59a9296f9be3b78e", + "761137d7": "04e352ab6d6ca7f50109f67c850d9dc0f467de77", + "4b1dd6eb": "7b143ee964e9ada89d1f9e88f0bd48d919184cfc", "e76799d2": "4f4b11ec22326280bdb96e3baf9db4b4cb1d02c5", "b96a36be": "80080644289ed93d71a1103992a154cc9802b2fa", "453d86b2": "968937b1c750f0ef6205f01c6db4148da4cca4e3", diff --git a/emulators/81.yml b/emulators/81.yml index c5a44c1f..2b5c8225 100644 --- a/emulators/81.yml +++ b/emulators/81.yml @@ -1,6 +1,7 @@ emulator: EightyOne -type: libretro +type: standalone + libretro source: "https://github.com/libretro/81-libretro" +upstream: "https://github.com/charlierobson/EightyOne" profiled_date: "2026-03-18" core_version: "1.0a" display_name: "Sinclair - ZX 81 (EightyOne)" @@ -10,43 +11,34 @@ systems: - sinclair-zx81 notes: | - EightyOne is a Sinclair ZX81 emulator ported to libretro. Also supports - ZX80, Jupiter ACE, TS1500, Lambda, R470, TK85, and ZX97LE machines, but - the libretro port hardcodes MACHINEZX81 in retro_load_game (libretro.cpp:393). + Libretro core embeds zx81.rom and dkchr.rom as C arrays (xxd -i at build). + Core never calls RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY. + Standalone EightyOne loads ROMs from filesystem (cwd/ROM/). - ROM loading is in snap.c:487-512. The memory_load() function matches the - requested ROM filename against a compiled-in table and copies from embedded - byte arrays generated by xxd -i at build time (Makefile.libretro:519-522). - Only two ROMs are embedded: zx81.rom (the ZX81 8K BASIC ROM) and dkchr.rom - (dK'tronics character ROM). Any other ROM name logs an error and returns 0. + Original emulator supports ~15 machines (ZX80, ZX81, Jupiter ACE, TS1500, + Lambda, R470, TK85, ZX97LE, Spectrum variants). Libretro port hardcodes + MACHINEZX81 — only zx81.rom and dkchr.rom are embedded. - The core never calls RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY, never opens - files from the filesystem for ROM data, and need_fullpath is set to false - (libretro.cpp:308). All ROM data is baked into the compiled .so/.dll. +files: + # mode: standalone = only needed when running as standalone emulator + # mode: libretro = only needed when running as libretro core + # mode: both (default if absent) = needed in both modes - No external BIOS or firmware files are needed. + # ref: 81-libretro/81/zx81/snap.c:37,489-496 — embedded as bin_ROM_zx81_rom + # ref: EightyOne/Source/zx81/snap.cpp:1219-1279 — open(cwd/ROM/zx81.rom) + - name: zx81.rom + system: sinclair-zx81 + required: true + mode: standalone + size: 8192 + note: "ZX81 8K BASIC ROM. Embedded in libretro core, external for standalone." + source_ref: "EightyOne/Source/zx81/snap.cpp:1264, 81-libretro/81/zx81/snap.c:489" -files: [] - -analysis: - embedded_roms: - zx81_rom: - variable: bin_ROM_zx81_rom - source_file: "bin/ROM/zx81.rom" - build_step: "xxd -i -> C array" - source_ref: "snap.c:489-498" - dkchr_rom: - variable: bin_ROM_dkchr_rom - source_file: "bin/ROM/dkchr.rom" - build_step: "xxd -i -> C array" - source_ref: "snap.c:499-508" - machine_roms: - notes: | - eo.c sets CurRom based on machine type. The libretro port forces - MACHINEZX81 (eo.c:39-41), so CurRom is always zx81.ROM81 which - defaults to "zx81.rom". Other machine ROMs (zx80, ace, ts1500, - lambda, zx97le, ringo470, tk85) are referenced but only zx81.rom - and dkchr.rom are embedded. Selecting other machines would log - "ROM not found" and load nothing. - filesystem_access: false - system_directory_used: false + # ref: 81-libretro/81/zx81/snap.c:38,499-508 — embedded as bin_ROM_dkchr_rom + - name: dkchr.rom + system: sinclair-zx81 + required: false + mode: standalone + size: 4096 + note: "dK'tronics character ROM. Embedded in libretro core." + source_ref: "81-libretro/81/zx81/snap.c:499" diff --git a/scripts/cross_reference.py b/scripts/cross_reference.py index ff0d5300..659d31aa 100644 --- a/scripts/cross_reference.py +++ b/scripts/cross_reference.py @@ -106,6 +106,13 @@ def cross_reference( if not fname: continue + # Skip standalone-only files when comparing against libretro + # platforms (RetroArch, Lakka, etc.). These files are embedded + # in the core and don't need to be in the platform pack. + file_mode = f.get("mode", "both") + if file_mode == "standalone": + continue + in_platform = fname in platform_names in_repo = _find_in_repo(fname, by_name, by_name_lower)