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 writeCAP_AUDIO_OUT audio outputCAP_FS_RD ROM readCAP_INPUT gamepad inputCAP_NET networkCAP_EXEC process spawnCAP_FS_WR filesystem writesigilOS Forge inherits the Four Pillars:
- FAST — near-native dynarec on every applicable core; GPU-first display path (software 2D fallback for Pi 3 1 GB)
- EFFICIENT — Pi 3 / 1 GB is the floor and the target, not an afterthought. Every core is profiled against that ceiling
- SECURE — per-core EL0 isolation; ROM read via
CAP_FS_RDonly; no ambient authority; a compromised core has no path to the network or to other cores' memory - STABLE — one crashed core cannot affect other cores or the Lumen WM. Fault boundaries are process boundaries
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 |
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.
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:
- Old-ABI wrapper (11 cores:
coleco,i8080,atari,c64,genesis,msx,pce,sms,sg1000,snes,zx) — thin delegation wrappers over the pre-existing state routines - Single-region copy (most new cores) — RAM + CPU state lives contiguously before the framebuffer; one memcpy in, one out
- Two-region copy (
psx,n64,saturn,dreamcast, and similar) — CPU state lives after the framebuffer; saves two non-contiguous regions to skip the large framebuffer allocation entirely
Savestate sizes by core:
fds (Famicom Disk System)ws / wsc (WonderSwan)gba (Game Boy Advance)psx (PlayStation)n64 (Nintendo 64)dreamcast / saturngamecube / wiips2 / ps3 / xbox360SRDX 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:
- Both sides call
core_loadstate(snap_slot)to restore the pre-divergence frame - Replay advances from that snapshot with the corrected input sequence
- 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.
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)sw_pro_bt.sg (d73efcf)ds4_bt.sgxbox_bt.sg + pi_bt_hid.sgcore_input_p2.sg (6796bff)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-gamepadStatus
| 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 |