Search › A-Z › S › SUPER-CHIP / XO-CHIP
SUPER-CHIP / XO-CHIP
A self-authored, browser-based interpreter for the modern CHIP-8 extensions: SUPER-CHIP (SCHIP) and XO-CHIP, plus the base CHIP-8 they build on. SUPER-CHIP adds a 128×64 hi-res display, hardware scrolling, 16×16 sprites and a big font; XO-CHIP adds up to four colours via two bit-planes, a 64 KB address space, ranged register save/load and sampled audio. It runs open Octojam homebrew from John Earnest's chip8Archive and plugs into the site's full instruction-level debugger.
Runs on: Web browser
SUPER-CHIP / XO-CHIP Online Emulator
Play SUPER-CHIP / XO-CHIP using JavaScript directly in your browser.
Controls
Configurations
| Configuration | Emulator | Machine | OS | Legal | |
|---|---|---|---|---|---|
| Into The GarlicScape (XO-CHIP) | SUPER-CHIP / XO-CHIP | XO-CHIP | open | Open ⛶ | |
| Black Rainbow (SUPER-CHIP) | SUPER-CHIP / XO-CHIP | SUPER-CHIP | open | Open ⛶ | |
| An Evening to Die For (XO-CHIP) | SUPER-CHIP / XO-CHIP | XO-CHIP | open | Open ⛶ | |
| Super NeatBoy (XO-CHIP) | SUPER-CHIP / XO-CHIP | XO-CHIP | open | Open ⛶ | |
| Octoma (XO-CHIP) | SUPER-CHIP / XO-CHIP | XO-CHIP | open | Open ⛶ | |
| Skyward (XO-CHIP) | SUPER-CHIP / XO-CHIP | XO-CHIP | open | Open ⛶ | |
| Truck Simul8or (XO-CHIP) | SUPER-CHIP / XO-CHIP | XO-CHIP | open | Open ⛶ | |
| Octopeg (SUPER-CHIP) | SUPER-CHIP / XO-CHIP | SUPER-CHIP | open | Open ⛶ | |
| Eaty The Alien (SUPER-CHIP) | SUPER-CHIP / XO-CHIP | SUPER-CHIP | open | Open ⛶ | |
| Super Octogon (SUPER-CHIP) | SUPER-CHIP / XO-CHIP | SUPER-CHIP | open | Open ⛶ | |
| Rockto (SUPER-CHIP) | SUPER-CHIP / XO-CHIP | SUPER-CHIP | open | Open ⛶ | |
| Sub-Terr8nia (SUPER-CHIP) | SUPER-CHIP / XO-CHIP | SUPER-CHIP | open | Open ⛶ |
Machines emulated
Chips
Notes
Embedding
The core is a single self-contained file, schip.js, exporting a global SCHIP. It implements the whole CHIP-8 family superset — base CHIP-8, SUPER-CHIP and XO-CHIP — selected per ROM by a profile string that only flips a handful of behavioural quirks.
Own the loop. SCHIP.boot() ships a self-driving requestAnimationFrame loop, but a debugger cannot pause that. So the embed calls SCHIP.create() for a bare vm (no loop, no ROM) and drives it itself:
var vm = SCHIP.create({ canvas: canvas, speed: 30, profile: 'xochip' });
fetch(romUrl).then(r => r.arrayBuffer()).then(ab => {
vm.load(new Uint8Array(ab)); // resets + copies the ROM to $200
(function loop(){ vm.tick(); requestAnimationFrame(loop); })();
});
vm.tick() runs vm.speed instructions then services the 60 Hz timers and repaints; vm.step() is one instruction. The embed publishes both, plus the vm itself, on window.EMU_BOOT so the shared debugger can reach in.
Debugger integration
The whole machine is plain JavaScript state, so nothing had to be added to the core to expose it — the debug plug-in (schip-debug.js) reads vm.V, vm.I, vm.pc, vm.mem, vm.gfx and friends directly and writes them back through the register set() hooks.
| Capability | Technique |
|---|---|
| Single-step | vm.step() executes exactly one opcode (it advances PC and mutates state, but never touches the RAF clock). |
| Registers | V0-VF, I, PC, SP, DT, ST and the XO-CHIP plane selector are read live each refresh and written back into the typed arrays. |
| Disassembly | A new schip decoder (/debugger/src/cpus/schip.js) — a superset of chip8 adding the SCHIP scroll/font/RPL and XO-CHIP plane/audio/long-I opcodes. |
| Breakpoints | When the PC-breakpoint set is non-empty the loop steps one instruction at a time and halts before executing a watched PC. |
| Watchpoints | Write watchpoints are host-side: while any address is watched the loop snapshots those bytes before each instruction and pauses the moment one changes — no write hook needed inside the core. |
Memory is exposed side-effect-free as five chips: the 64 KB RAM (hex/disasm/bits), the call stack, the 128×64 framebuffer, the RPL user flags and the XO-CHIP audio pattern buffer.
Architecture
CHIP-8 is a 1977 byte-code virtual machine for the COSMAC VIP. This core runs it and its two popular extensions from one interpreter:
- CHIP-8 — 64×32 monochrome, 4 KB RAM, sixteen 8-bit registers V0-VF, a 12-bit index I, two 60 Hz timers and a 16-key hex keypad.
- SUPER-CHIP — the HP-48 calculator extension: a 128×64 hi-res mode, hardware scrolling (
00CN/00FB/00FC), 16×16 sprites (DXY0), a 10-byte "big" font (FX30) and RPL user flags (FX75/FX85). - XO-CHIP — the modern extension: up to four colours via two independent bit-planes (
FX01plane select), a 64 KB address space with a 16-bit index register (F000long load), ranged register save/load (5XY2/5XY3), vertical scroll (00DN) and a 128-bit sampled audio buffer (F002,FX3Apitch).
The three profiles differ only in quirks: SUPER-CHIP shifts in place, does not advance I on FX55/FX65 and uses BXNN; CHIP-8 and XO-CHIP shift from Vy, advance I and use BNNN. Sprites clip at the screen edge on SCHIP/XO-CHIP and wrap on CHIP-8. The ROMs here are open Octojam homebrew from John Earnest's chip8Archive.