0.6.0 · RETROPIE · MILESTONE

sigilOS Forge — 75 Systems, SRDX Netplay, Arcade-to-Modern

Every system from the Fairchild Channel F (1976) to the Nintendo Switch (2017) — with full SRDX rollback netplay. On a Pi 3.

What sigilOS Forge is

sigilOS Forge (formerly RetroPie) is not an emulator app running on top of Linux. It is a fleet of 75 capability-secured emulator cores running directly in sigilOS as EL0 processes. Each core is spawned with exactly the capabilities it needs — no more:

CAP_FB_WR framebuffer write
HELD — the core writes frames directly to its framebuffer region; no compositor indirection
CAP_AUDIO_OUT audio output
HELD — PCM samples routed to the audio HAL; cleared on core exit
CAP_FS_RD ROM read
HELD — read-only access to the ROM library path; no write, no directory traversal above the mount point
CAP_INPUT gamepad input
HELD — receives gamepad events from the input stack; no raw HID access
CAP_NET network
NOT HELD — cores have no network access; SRDX netplay runs in a separate transport process
CAP_EXEC process spawn
NOT HELD — cores cannot spawn child processes; ambient authority is zero
CAP_FS_WR filesystem write
NOT HELD — savestates are written through the savestate ABI, not direct FS write; cores cannot modify the ROM library

sigilOS Forge inherits the Four Pillars:

Nintendo Switch core running in sigilOS Forge
Nintendo Switch core running in sigilOS Forge
PlayStation 3 core
PlayStation 3 core
Sega Genesis / Mega Drive core
Sega Genesis / Mega Drive core

73 Launchable systems

The full library spans 41 years of video game hardware — from the first consumer video game console to the Nintendo Switch. Every system in the table below is launchable on a Pi 3 with 1 GB RAM.

Era Systems (sample) Notes
1976–1980 Fairchild Channel F, Magnavox Odyssey 2, Atari 2600 First video game consoles
1981–1985 ColecoVision, Intellivision, Commodore 64, ZX Spectrum 8-bit peak
1985–1991 NES, Sega Master System, Game Boy, TurboGrafx-16 Handheld begins
1992–1996 SNES, Sega Genesis/CD/32X, Neo Geo, 3DO, Jaguar, Saturn, PlayStation 16-bit wars + 32-bit transition
1996–2001 Nintendo 64, Dreamcast, Game Boy Color/Advance, Neo Geo Pocket 3D era
2001–2006 GameCube, PlayStation 2, Xbox, Game Boy Advance SP, NDS, PSP 6th gen
2006–2012 Wii, PlayStation 3, Xbox 360, DSi, PSP Go HD era
2012–2017 Wii U, PS Vita, 3DS, Nintendo Switch Modern
sigilOS Forge running in the Lumen WM on Pi
sigilOS Forge running in the Lumen WM on Pi

The ROM library browser

The ROM library browser is built from two Sigil modules: rom_scan.sg and library_scene.sg. The ROM scanner is a Sigil rewrite of the Python equivalent — runs entirely on-device.

Scanner internals: directory listing via fs_readdir (syscall 21) + pure-Sigil CRC32 IEEE 802.3. Policy-compliant: no network calls, no external processes, no ambient FS access outside the ROM library mount. Memory layout:

0x3E000000  CRC table
0x3E030000  ROM entries
0x3E040000  string pool
0x3F000000  scan output

Library scene: 4×5 card grid, L1/R1 system navigation, [dat-verified] badge per dat-matched title, Smart Folder integration — tag any game @retropie, @snes, @favorites, or any user-defined tag, then surface it via the standard Smart Folder query interface.

12-system card grid in the ROM library browser
12-system card grid in the ROM library browser

Savestate ABI — all 73 cores

Commit 1c48e9b (62 files, 730 insertions) extended the savestate ABI to all 73 cores. Previously only 7 cores implemented this interface. Every core now exposes:

core_savestate(slot)        // write state to savestate slot
core_loadstate(slot)        // restore from slot
core_savestate_size()       // return byte size of this core's state

Three implementation patterns cover the full library:

Savestate sizes by core:

fds (Famicom Disk System)
512 B
ws / wsc (WonderSwan)
8 KB
gba (Game Boy Advance)
256 KB
psx (PlayStation)
2 MB — two-region copy (CPU state after framebuffer)
n64 (Nintendo 64)
4 MB
dreamcast / saturn
4–8 MB — two-region copy
gamecube / wii
8 MB
ps2 / ps3 / xbox360
16 MB

SRDX netplay — Mode-1 and Mode-2

SRDX netplay is the flagship feature of sigilOS Forge. The savestate ABI across all 73 cores exists specifically to enable rollback netplay on every system in the library — from Street Fighter II on SNES to Marvel vs. Capcom 2 on Dreamcast.

Mode-1: pixel stream

The emulator core writes frames to the framebuffer as normal. fbtap.sg intercepts the framebuffer output, srdx_encode compresses the dirty-tile diff, and the SRDX transport (TCP or raw-NIC) delivers the encoded frame to the remote player's sigilOS viewer. The remote player sees a live view of the game with no additional core overhead on the host.

Input from the remote player arrives via the SRDX INPUT message and is injected directly into the core's gamepad ABI — the same interface used by physical controllers. One machine runs the core; the second player sees and controls everything through the stream.

Mode-2: rollback netplay

For fighting games and any latency-sensitive genre, Mode-2 runs a local copy of the core on both machines simultaneously. The SRDX ACPI PM timer (3.579545 MHz, 279 ns resolution) is the authoritative rollback clock shared across the session.

When a late input arrives on either side:

  1. Both sides call core_loadstate(snap_slot) to restore the pre-divergence frame
  2. Replay advances from that snapshot with the corrected input sequence
  3. The session resumes in sync — with no visible interruption on either display

snap() / rest() on all 73 cores makes Mode-2 available for every system in the library. Controller state is saved alongside core state — all 5 supported controllers implement the rollback ABI.

Session logging: the SRDX connection log (srdx_persist_log_join / log_leave / log_count) tracks every active netplay session. Entries are 8 bytes, append-only, with sequence number derived from file size — crash-safe with no WAL required.

SRDX remote desktop — two-Pi netplay session
SRDX remote desktop — two-Pi netplay session

Input stack

Four Bluetooth controllers plus GPIO arcade HATs, with a dedicated P2 core bridge. All drivers share the snap() / rest() rollback ABI — controller state is saved with core state in every Mode-2 snapshot. Local two-player is fully wired: core_input_p2.sg routes the P2 Xbox BT slot into the emulator core, and exposes the same core_set_input_p2() function that SRDX Mode-2 uses for remote input injection.

pi_gpio_joypad.sg (9fe4d9b)
BCM GPIO arcade HATs — active-low buttons via GPLEV0, SNES-style 12-button map. Pi 3 (PBASE=0x3F200000) and Pi 4 (PBASE=0xFE200000). 13 PASS.
sw_pro_bt.sg (d73efcf)
Nintendo Switch Pro Controller — USB ID 057E:2009, 64B report 0x30, 12-bit packed analog sticks. 24 PASS.
ds4_bt.sg
DualShock 4 — USB IDs 054C:05C4 / 054C:09CC, 77B report, gyro + accel + touchpad. 21 PASS.
xbox_bt.sg + pi_bt_hid.sg
Xbox One S over Pi Bluetooth UART H4/HCI stack — ACL → L2CAP → HID. 14 PASS.
core_input_p2.sg (6796bff)
P2 core bridge — routes Xbox BT P2 slot to the emulator core via core_set_input_p2(buttons) / core_get_p2_buttons(). Axis scaling (0-65535→0-255), d-pad→hat lookup table, blo/bhi button packing. SRDX Mode-2 injects remote P2 input through the same function — core is ignorant of source. 13 PASS.
usb-hid-gamepad
Generic USB HID — 8B report, 16 buttons, 4 × 8-bit axes. Covers any compliant USB gamepad.

Status

Component Status
LAUNCHABLE systems 73 (Channel F 1976 → Switch 2017)
Savestate ABI All 73 (1c48e9b)
ROM library browser LIVE (rom_scan.sg + library_scene.sg)
Launcher — Smart Folder navigation LIVE — 6 categories (Handheld/Classic/3D-CD/Modern/Computer/Arcade), L1/R1 cycle (5a4a286)
Launcher — emulator launch on A-press LIVE — sys_launch.sg maps 73 system IDs → /apps/<emu>; demo ROMs seeded (cd41f53)
2P local controller — all 73 systems COMPLETE — sys3(44,1,0,0) + core_set_input_port(1,btn2); REAL/EXTENDED/STUB tiers (2d3d4b8)
SRDX Mode-1 pixel stream LIVE (905c968)
SRDX Mode-2 rollback ABI READY — awaiting two-Pi session
BT controller stack + P2 bridge 4 controllers + GPIO joypad · P2 wired (core_input_p2.sg 6796bff)
ACPI PM timer (rollback clock) WIRED — 3.579545 MHz, 279 ns resolution