emulator: Eternal Computer type: libretro core_classification: community_fork source: "https://codeberg.org/iyzsong/eternal-libretro" upstream: "https://github.com/adriancable/eternal" source_commit: "13adf143aea822ebc1ee23722a80e93a7979e4c9" upstream_commit: "17c8ab87de7f308f48f4990ed62c48b86173797d" profiled_date: "2026-09-17" core_version: "0.0" display_name: "Eternal Computer" cores: - eternal systems: - eternal-computer notes: | Virtual machine for the Eternal Software Initiative architecture, a Subleq variant with indirect operands, a keyboard port, a console port, a wall clock at word 64 and a timer interrupt through word 0. Adrian Cable's reference machines are vm/vm.c (SDL3 framebuffer) and vm/vm_console.c, and the libretro core by iyzsong carries the same loop in libretro.c:186-222. Machine memory is a static array of 3<<27 words, 1.5 GiB, cleared again when the content is unloaded (libretro.c:360-364). The framebuffer is its last 800x512 words (libretro.c:9-13, 22-23), pushed to the frontend as XRGB8888 on every retro_run (libretro.c:330-334). The content is the whole machine image. retro_load_game copies the buffer the frontend hands over to word 0, refuses an image larger than memory and starts the interpreter on a thread (libretro.c:302-314). need_fullpath is false and the accepted extensions are capsule and bootimage (libretro.c:275-282). The upstream machines fread the same file into mem (vm/vm.c:45-48, vm/vm_console.c:32). A boot image comes out of tools/make_boot_image.py applied to a Subleq ELF: a boot block of text_start bytes, with the interrupt vector at word 0, the saved PC at word 1, the initial stack pointer at word 4, the framebuffer word address at word 6 and the constants 0, -1 and 1 at words 36, 38 and 39, followed by the flat binary (tools/make_boot_image.py:34-68). The upstream repository ships capsules/vmlinux.bootimage.xz, ESI Linux with busybox, Doom, nano, lynx and htop in its initramfs, 110 MiB once decompressed. The frontend does not open xz, so the image is decompressed before loading. Nothing else is read. retro_set_environment registers the log interface and the keyboard callback and nothing more (libretro.c:238-249), and the core never asks for a system, save or content directory and opens no file itself. Keyboard events are translated to USB HID usage IDs and queued eight deep (libretro.c:36-184). Console output goes to the host stdout with write (libretro.c:205-206). A fetched C of zero halts the machine and asks the frontend to shut down (libretro.c:196-199). No savestate (libretro.c:336-339), no memory map, no audio. files: []