Skip to content

Emulator JtyOne

Retro Jack edited this page Jun 9, 2026 · 5 revisions

JtyOne — Sinclair ZX81

JtyOne (Simon Holdsworth) is a port of Mike Wynne's EightyOne. The ZX81 bundle is small and quiet — the smallest screen, the smallest emulator, the smallest games.

Where we started

JtyOne is GPL-2.0. Pure JavaScript, no WASM, no build step. The runtime exports a global object and writes to an emulator canvas + status span.

The launch flow

play.html reads ?game=<key> from the URL, fetches games.json, gets a {rom, type} record per entry, and hands it off to JtyOne's loader. rom is the file path; type distinguishes .p files (snapshot, loads instantly) from .tap files (real tape image, real load time).

The display

ZX81's native screen is 256×192 monochrome (one screen = 1 KB of character memory). JtyOne renders to a canvas that we constrain via standard genx-frame CSS:

#emulator_canvas {
  box-shadow: 2px 2px 10px rgba(0, 0, 0, .7);
  image-rendering: pixelated;
}

Below the canvas, the upstream code expects an #emulator_status span for tape position / loader messages. We kept it (small, low-vis text) for tape-loading feedback.

Joystick / keyboard input

ZX81 was keyboard-only — no joystick port on the original hardware. JtyOne maps the joystick directions to the period-correct ZX81 keys (Q/A/O/P for the four directions, on Sinclair games that use them) but most of our entries respond to direct key input from qaop + Enter for fire.

File formats

  • .p — ZX81 snapshot. Instant load.
  • .p81 — alternative snapshot format with a filename header.
  • .tap — tape image. Real-time loading; the screen flickers for ~30 seconds while LOAD "" runs.

We default to .p where available.

Bundle layout

emulators/jtyone/
├── play.html
├── zx81_emu.js          ← JtyOne runtime
├── controls.html
├── games.json
├── roms/                ← system ROM
└── tapes/
    └── *.p / *.tap

Related

Clone this wiki locally