emulator: EightyOne type: libretro source: "https://github.com/libretro/81-libretro" profiled_date: "2026-03-18" core_version: "1.0a" display_name: "Sinclair - ZX 81 (EightyOne)" cores: - 81 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). 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. 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. No external BIOS or firmware files are needed. 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