Search › A-Z › E › Emerson Arcadia 2001
Emerson Arcadia 2001
The Emerson Arcadia 2001 (originally the Video Entertainment System) was the first cartridge-based games console, built around the two-chip Signetics 2650 processor. This is an in-browser emulator with a hand-written Signetics 2650 core that renders the console's 128×64 two-bit playfield to a canvas and plugs into the shared debugger, so you can single-step the F8, set breakpoints and inspect memory. With no cartridge it boots the console's built-in Hockey and Tennis.
Runs on: Web browser
Emerson Arcadia 2001 Online Emulator
Play Emerson Arcadia 2001 using JavaScript directly in your browser.
Controls
Configurations
| Configuration | Emulator | Machine | OS | Legal | |
|---|---|---|---|---|---|
| 2650 Demo (public domain) | Emerson Arcadia 2001 | Emerson Arcadia 2001 | open | Open ⛶ |
Machines emulated
Chips
Notes
Embedding
The Arcadia 2001 core is a single hand-written file, arcadia.js, exposing a global Arcadia. It contains a from-scratch Signetics 2650 interpreter plus the Signetics 2637 UVI (video + beeper) and the two keypads. There is no BIOS: the 2650 resets to $0000 and runs the cartridge. Vendor it, load a cartridge, and drive it from a loop you own:
var core = Arcadia.create(canvas); // canvas is the 128x208 screen
core.loadCart(cartBytes); // 2 KB / 4 KB / 8 KB cartridge image
core.reset(); // 2650 IAR = $0000
(function loop(){ core.runFrame(); core.render(); requestAnimationFrame(loop); })();
The machine is plain JavaScript. Everything the host (or the debugger) needs is a method or field on the object:
| Member | Kind | What it does |
|---|---|---|
core.step() | method | Execute exactly one Signetics 2650 instruction; returns its cycle count. The single-step primitive. |
core.runFrame() | method | Run ~14,900 cycles (0.9 MHz / 60 Hz) — one video frame. |
core.regs · core.iar | fields | The 2650 register file (R0, R1-R3 in two banks) and the 15-bit instruction address register (the PC) — read and pokeable live. |
core.psu() · core.psl() | methods | Compose the Program Status Word upper / lower bytes from the live flag fields. |
core.peek(a) · core.poke(a,v) | methods | Side-effect-free read / write of the 15-bit address space — used by the debugger's memory views. |
core.setKey(pad,d,down) | method | Press/release keypad key d on pad 'a' or 'b' — drives the memory-mapped keypad read at 900. |
core.soundActive() · core.soundFreq() · core.soundVolume() | methods | The UVI tone gate, frequency (Hz) and 0…1 volume, read from the sound registers each frame for the host synth. |
Debugger integration
The debugger plug-in (arcadia-2001-debug.js) reads the live core each refresh and calls EmuKit.defineMachine. Because the whole machine is ordinary JavaScript, the only core hook needed is the write callback:
- CPU decoder. The 2650 is neither a 6502 nor a Z80, so a new disassembler lives at
/debugger/src/cpus/s2650.js(registered ass2650) — the full 2650 opcode table with its register/condition field, immediate, relative (7-bit + indirect) and absolute (13-bit + index + indirect) operand forms; unknown bytes decode as.byte. - Registers. R0, R1-R3 (current bank) and the banked R1'-R3', the 15-bit IAR (the PC), the PSU and PSL status bytes and each individual flag (CC, C, IDC, RS, WC, OVF, COM, S, F, II) are read live each refresh and written back through the
setcallbacks. - Memory. Two chips: the whole 15-bit program/UVI space (cartridge + UVI window, disassembled with
s2650) and the UVI window800-AFFon its own for thebitsview — you can watch the character RAM change. Reads are side-effect-free (the keypad read side effects are skipped). - Single step is one
step(). Breakpoints compare the IAR against a set before each instruction; write watchpoints wrap the UVI memory-write path and pause the moment a watched cell is written. Both are host-side, so they cost nothing when the debugger is closed.
Architecture
The Emerson Arcadia 2001 (1982) was one of a wave of 2650-based consoles (Interton VC 4000, MPT-03 and clones all share the design):
- Signetics 2650 CPU — an 8-bit processor with a 15-bit (32 KB) address space in four 8 KB pages, a register file (R0 shared, R1-R3 in two banks selected by
PSL.RS), a two-byte Program Status Word (PSU upper + PSL lower) and an internal 8-level return-address stack. It runs at roughly 0.9 MHz (the 3.58 MHz colour clock divided by four). - Signetics 2637 UVI — a memory-mapped video+sound chip at
800-AFF. A 16×26 character grid (an upper and a lower 16×13 half) over a 128×208 field, characters$00-$37from a built-in font and$38-$3Ffrom eight user-defined patterns, four sprites, an eight-colour palette, and a single programmable tone. - No BIOS — reset jumps straight to cartridge address
$0000; the keypads are read through the UVI window at900and the 2650SENSEline carries vertical sync. - Two 12-key controllers — each a ten-digit keypad plus fire and a joystick; the default demo polls Player 1's keypad.
With no BIOS the console is nothing without a cartridge, so the deliverable default here is a public-domain 2650 program authored for this emulator: it programs the UVI colours, writes a title and a colour bar into the character RAM, turns the beeper on, and loops polling the keypad — proving the CPU, video, sound and input all live.
Sound
This is a Pattern S (authored synthesis) integration. The UVI has a single programmable tone, not a sampled sound chip: register 8FD holds a 7-bit pitch and 8FE holds a 3-bit volume plus a sound-enable gate. The tone frequency is the NTSC horizontal-line rate divided by 2^(pitch+1), so only pitch and volume are under program control — there is nothing to sample from the core and the waveform is synthesised on the host.
Reading the registers. The core exposes core.soundActive() (the enable gate and non-zero volume), core.soundFreq() (the computed frequency in Hz) and core.soundVolume() (0…1). The boot shim reads all three once per video frame.
Tone model. The boot shim runs a phase-accumulator square wave at EmuAudio.sampleRate, retunes it to core.soundFreq() each frame, scales its amplitude by the volume when the gate is open (silence when closed), and emits exactly Math.round(EmuAudio.sampleRate/60) interleaved-stereo Int16 samples per frame (the mono beeper copied to both channels) into the shared EmuAudio sink, so no resampling is needed.
Mute contract. transport.setMute/isMuted delegate to EmuAudio. Audio starts muted (browsers block sound before a gesture); the shell's Sound button unmutes from a real click, which resumes the AudioContext.
Sound support. The UVI tone is fully supported and plays whenever a cartridge programs it; the page starts muted, so click Sound to enable it. Pressing keypad 1-4 raises the pitch.