An accessible, cross-platform build of KEGS - Kent Dickey's Apple IIgs emulator - packaged with SDL3 for macOS, Linux, and Windows.
GSplus wraps the KEGS core in a single SDL3 application that builds and runs the same way on macOS, Linux, and Windows. It is focused on the SDL3 build - if you want the native macOS or Windows versions, use KEGS directly. GSplus tracks the KEGS version it's based on (currently 1.38).
![]() |
![]() |
![]() |
![]() |
Like any IIgs emulator, GSplus needs an Apple IIgs ROM file to boot. Without one it starts into a configuration screen with nothing to run. The ROM is Apple's copyrighted firmware, so GSplus can't ship it — you supply your own.
Which ROM: the IIgs shipped with two ROM versions. ROM 03 (256 KB, the later model) is the usual choice; ROM 01 (128 KB) is also fully supported. GSplus does not support the early ROM 0.
Where to put it: name the file ROM, ROM.01, or ROM.03 and place it in
your home directory, next to the app, or next to your config.kegs. GSplus picks
it up automatically. You can also select one at runtime: press F4 → ROM File
Selection → ROM File and browse to it. A handful of other common names
(APPLE2GS.ROM, APPLE2GS.ROM2, xgs.rom, 342-0077-b, …) are recognized too.
Finding one: the cleanest option is to dump the ROM from a real Apple IIgs you
own — KEGS includes a short BASIC program that does it, in
upstream/kegs/doc/README.ROM.files.txt.
Otherwise, the IIgs ROM is long-unsupported software that's widely circulated
online: a web search for "Apple IIgs ROM 03" (or ROM 01) generally turns one
up, and the Internet Archive hosts MAME sets that contain a usable ROM. That same
README.ROM.files.txt lists the exact filenames KEGS accepts and how to extract
or convert a MAME-format dump.
Did it work? A valid ROM 01 file is exactly 128 KB and a ROM 03 is 256 KB. If GSplus boots to the "Check startup device" screen, the ROM loaded fine — it just needs a disk. Press F4 to mount a disk image, or drag one onto the window.
Prebuilt apps are attached to each release. The builds aren't code-signed yet, so your OS may warn that the app is from an unidentified developer the first time you run it. This is expected:
Windows - SmartScreen blocks unsigned downloads. Click More info → Run
anyway. If the .exe won't start after unzipping, right-click it →
Properties → tick Unblock → OK. Keep SDL3.dll next to the .exe.
macOS - the app is only ad-hoc signed, so Gatekeeper flags it. Right-click
the app → Open, then confirm Open. If macOS still refuses, run
xattr -dr com.apple.quarantine /Applications/GSplus.app.
Linux - the .tar.gz relies on a system SDL3 (libsdl3 from your package
manager). A self-contained AppImage is planned.
This is an early reboot - expect rough edges. SDL3 video, input, and audio are working on macOS, Linux, and Windows.
Some features that are a part of the SDL3 build:
- Window & display options -
-fullscreen,-borderless,-noaspect,-highdpi,-novsync,-nohwaccel, plus window position; F11 toggles fullscreen. - Screenshot capture - F10 writes the framebuffer to disk.
- Gamepad support - cross-platform SDL_Gamepad mapped to the IIgs joystick. A connected gamepad is used automatically (with hotplug); without one, the numeric keypad emulates the joystick. The stick's circular travel is remapped to the square range Apple joysticks have, so games can reach the corners. Override either behavior in the config menu (F4) under Joystick Configuration.
- Terminal debugger - a REPL for the built-in 65816 debugger from the controlling terminal.
- Drag-and-drop disk loading - drop a disk image on the window and GSplus guesses the slot from its size.
- CRT scanline simulator -
-scanline <0-100>, Shift+F11 to toggle. - Curved CRT effect -
-crt 1with-crtcurve/-crtmask, Ctrl+F11 to toggle. Screen curvature, RGB phosphor mask, bloom, and vignette; composes with the scanline simulator. - One cross-platform build - the same SDL3 app and CMake build on macOS, Linux, and Windows, with prebuilt downloads for each.
The following hotkeys let you dynamically change many of the emulator settings,
but you can also edit most settings by hitting F4 for the configuration menu.
| Key | Action | Source |
|---|---|---|
| F1 | Open-Apple (⌘) modifier, for keyboards without an Apple/Command key | KEGS/GS+ |
| F4 | Open the configuration menu (mount disks, pick a ROM, settings) | KEGS/GS+ |
| F5 | Toggle the status line | KEGS/GS+ |
| F6 | Cycle emulation speed (1 MHz / 2.8 MHz / fast) | KEGS/GS+ |
| F7 | Toggle the debugger | KEGS/GS+ |
| Shift + F7 | Toggle fast disk emulation | KEGS/GS+ |
| F8 | Grab / release the mouse (warp + hide pointer) | KEGS/GS+ |
| F9 | Invert paddles | KEGS/GS+ |
| Shift + F9 | Swap paddles | KEGS/GS+ |
| Ctrl + F9 | Copy screen text to the clipboard | KEGS/GS+ |
| F10 | Save a screenshot | GS+ |
| F11 | Toggle fullscreen | GS+ |
| Shift + F11 | Toggle the CRT scanline effect | GS+ |
| Ctrl + F11 | Toggle the CRT curved screen effect | GS+ |
| Ctrl + F12 | Reset the IIgs (Ctrl-Reset) | KEGS/GS+ |
You can also drag & drop a disk image onto the window to mount it (slot guessed from size).
GSplus builds with CMake (Ninja generator). SDL3 is used if installed, otherwise built from source automatically. From the repository root:
cmake -G Ninja -B build -S gsplus/src
cmake --build build --target gsplus-sdlThis produces the GSplus app:
- macOS:
build/GSplus.app - Linux:
build/gsplus - Windows:
build/gsplus.exe(withSDL3.dllalongside)
macOS (Homebrew, plus the Xcode Command Line Tools):
brew install cmake ninja sdl3Linux (Debian/Ubuntu) - the X11/Wayland/audio packages are SDL3's build dependencies:
sudo apt install cmake ninja-build build-essential git \
libx11-dev libxext-dev libxrandr-dev libxcursor-dev libxi-dev \
libxfixes-dev libxss-dev libxtst-dev libxinerama-dev \
libwayland-dev wayland-protocols libdecor-0-dev libxkbcommon-dev \
libdrm-dev libgbm-dev libegl1-mesa-dev libgl1-mesa-dev libgles2-mesa-dev \
libpulse-dev libasound2-dev libpipewire-0.3-dev libsndio-dev \
libdbus-1-dev libudev-dev libibus-1.0-devWindows (MSYS2, in the MINGW64 shell):
pacman -S git mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake mingw-w64-x86_64-ninja- KEGS latest is tracked in the
./upstreamdirectory. - An
upstreambranch is updated whenever there's a new KEGS version and merged tomain. - This makes it easy to track KEGS changes somewhat independently of the GSplus work.
I've tried to reboot GSplus many times over the past few years and each time I'd sink weeks into building and packaging a new release, and then life would pull me away for months, sometimes years, and momentum would die. I made the decision to use AI to allow me to provide the emulator I wanted to have, which is controversial even for me. But then again, this isn't any different than what I see in every modern development shop. Things have changed dramatically over the past few years. But I want to be clear about AI usage, and that I feel comfortable using it as a tool that needs a lot of oversight.
KEGS is a brilliant piece of pure C, and is proof that you don't need AI to write great software. Kent Dickey did the hard, beautiful work. The AI here is a pragmatic crutch to keep my reboot alive between the demands of real life.
If you want the canonical emulator, go straight to KEGS. It's great!
I'm just over here having fun making the emulator extensions that I find useful or interesting. I hope it helps some other people connect to the incredible machine that is the Apple IIgs. Peace!
- Dagen




