Files
libretro/emulators/eternal.yml
T

55 lines
2.6 KiB
YAML

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;
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); 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: []