Skip to content

Dialect roadmap ​

Which machines we could support next, and what each would cost. Tiers are effort, not hardware family: Tier 1 is a language layer over hardware a bundled core already drives, Tier 3 needs a chip emulated first, Tier 4 is blocked. Which core a machine would run on is a column, not a grouping.

src/dialects/registry.ts is the source of truth for what ships; the Shipped table below is pinned to it by dialect-roadmap.test.ts. Before planning anything, look for a shipped sibling - it is by far the cheapest shape - then follow docs/contributing/adding-a-dialect.md.

Status legend: ✅ shipped · 🔨 in progress · ⬜ planned · ⛔ blocked / needs a new emulator core.

Bundled cores ​

The cores are the limiting factor, so a candidate's tier is mostly a question of what its hardware needs on top of one. Their vendoring caveats - what each core does not model, and what the adapters make up for - are in Architecture.

CoreCPULicenceWrapper
Z80.js (Molly Howell)Z80 / 8080MITsrc/emulator/z80/ - vendored; 8080 machines add src/emulator/i8080/
jsbeeb 1.13.1 (Matt Godbolt)6502 / 65C12GPL-3.0-or-latersrc/emulator/bbc/, src/emulator/atom/
viciious (Mike Dean / luxocrates)6510public domainsrc/emulator/c64/
6502.ts (Christian Speckner)6502MITsrc/emulator/6502/ - a bare CPU; each machine adds its own in-tree bus
(none - clean-room interpreter)n/athis projectsrc/dialects/<id>/interpreter/ - no core to vendor, no ROM to redistribute

Shipped ​

Grouped by core. Implementation detail lives in the code and in each machine's reference pages; what a row carries here is the one fact that bears on porting work, plus any gap a program can run into.

MachineDialectCPUCoreNote
Sinclair ZX81zx81Z80Z80.jsReference Z80 wiring: FAST/SLOW, NMI generator, R-register interrupt
Sinclair ZX80zx80Z80Z80.jsInteger BASIC, .O images. No variable watching
ZX Spectrum 48KzxspectrumZ80Z80.js.TAP; scanline ULA contention, so raster bands hold. No floating bus
ZX Spectrum 128K / +2zxspectrum128Z80Z80.jsSibling of zxspectrum plus paging and AY. +2A/+3 not emulated
Amstrad CPC 464cpc464Z80Z80.jsGate Array, CRTC 6845, PPI and AY; .cdt tape
Amstrad CPC 664cpc664Z80Z80.jsSibling of cpc464; BASIC 1.1. Tape only - no FDC, no .dsk
Amstrad CPC 6128cpc6128Z80Z80.jsSibling of cpc464; BASIC 1.1 and 128K banking. Tape only
SAM CoupésamcoupeZ80Z80.jsFour ASIC modes, SAA1099; ROM ships by permission. Discs import-only
Exidy SorcerersorcererZ80Z80.js64×30 mono; the character generator is half RAM, so graphics are definable
Sony HB-10P (MSX1)hb10pZ80Z80.jsTMS9918A VDP and PSG, parameterised for later MSX1s. MSX2 out of scope
MITS Altair 8800altair88008080Z80.js + i8080No video: an 88-2SIO board and a terminal. String churn invisible to stats
Tesla PMD 85-2pmd858080Z80.js + i8080288×256 bitmap; BASIC-G is paged in from a ROM module, not mapped
BBC Micro Model Bbbcmicro6502jsbeebReference jsbeeb integration; CFS cassette over Kansas City FSK
BBC Masterbbcmaster65C12jsbeebSibling of bbcmicro; BASIC IV shares BASIC II's tokens, MOS 3.20
Acorn Atomatom6502jsbeebOwn tokenizer and charset; .atm binaries. No variable watching
Commodore 64commodore646510viciious.prg at $0801, PAL timing. No cassette audio - tape I/O not exposed
Commodore PET 4032pet65026502.tsBASIC 4.0 via the CbmVariant seam; no video chip, screen RAM by chargen
Commodore VIC-20vic2065026502.tsUnexpanded PAL, from-scratch VIC-I renderer; 3583 BASIC bytes free
Apple Iapple165026502.tsWozMon + Integer BASIC; PROMs emulated as logic. No sound, no joystick
Apple IIapple265026502.tsInteger BASIC; text, lo-res and hi-res into one raster. No Disk II
Apple II Plusapple2plus65026502.tsApplesoft on the apple2 board. AND/OR/NOT are logical, not bitwise
Atari 800atari80065026502.tsANTIC, GTIA, POKEY, PIA; AltirraOS and Altirra BASIC redistribute freely
Atari 400atari40065026502.tsSibling of atari800; the RAM figure is the only divergence
TRS-80trs80-interpreterLevel II BASIC, ROM-free; a Z80 + ROM mode waits on a user-supplied image
GE-235ge235-interpreterDartmouth BASIC on a teletype; sibling of ge635. No debugger or watcher
GE-635ge635-interpreterDartmouth 4th ed. on ge235's interpreter, by profile. Strings and MAT

Tier 1 - Language layer only ​

A bundled core, or an interpreter a shipped machine already runs on, covers the hardware, so there is no new emulator work at all: a keyword table, a charset, a memory map, an AI profile and metadata.

src/dialects/bbcmaster/ is the reference implementation - four hand-written files, everything else imported from the sibling, and the whole hardware divergence expressed as one model parameter (new BbcMachine('Master')). cpc664 and atari400 are the same shape. Point docsReference at the base dialect's page and the docs work stays nearly free. A machine name that links out has a plan under dialect-plans/ already written.

StatusMachineBASICCoreNote
⬜TRS-80 Model III / 4Model III BASICinterpreterSource-compatible Level II superset, same display; no ROM question
⬜Honeywell 6000Dartmouth 5th ed.interpreterSame architecture as ge635, post-1970 DTSS; a delegation sibling of it

Tier 2 - New bus, simple display ​

The CPU is free and the display is a memory-mapped character grid or a plain bitmap, with no custom chip to work out first. Wire the core into an in-tree bus as pet and vic20 do, then proceed as for any dialect.

StatusMachineBASICCoreNote
⬜Compukit UK101 / OSI Superboard IIMicrosoft 6502 BASIC6502.ts1K character display, 6850 ACIA, no video chip. Commodore BASIC's ancestor
⬜Mattel AquariusMicrosoft BASIC (subset)Z80.js40×24 text, 80×72 semigraphics; 4K RAM, so very little program space
⬜Nascom 2Microsoft BASICZ80.jsMono character display, programmable charset; a kit machine, so no one config
⬜Commodore CBM 8032Commodore BASIC 4.06502.tsLanguage free via CbmVariant, but the 80-column 6545 CRTC is new

Tier 3 - New bus, custom video or sound chip ​

The CPU is free but a bespoke chip must be emulated before BASIC output is visible. That chip is the gating work; once it renders a frame the rest is a normal dialect, so these promote to Tier 2 rather than shipping directly.

The Electron would be the third BBC-family variant, which is the trigger flagged in src/dialects/bbcmaster/index.ts for factoring the shared language layer into a src/dialects/bbcShared/ module.

StatusMachineBASICCoreNote
⬜Acorn ElectronBBC BASIC II6502.tsBBC language layer free, but jsbeeb has no Electron: needs a ULA bus
⬜Commodore C16 / Plus/4Commodore BASIC 3.56502.tsCbmVariant extension; the TED is video, sound and timers in one chip
⬜Oric-1 / AtmosOric BASIC6502.tsCustom ULA, and no ready-made core to borrow one from
⬜Amstrad CPC 464plus / 6128plus / GX4000Locomotive BASIC 1.1Z80.jsLanguage free from cpc6128, but the ASIC replaces the Gate Array
⬜Enterprise 64 / 128IS-BASICZ80.jsNick and Dave custom chips, both bespoke
⬜Memotech MTX / Tatung Einstein / Sord M5 / Camputers LynxVariousZ80.jsNiche, and a bespoke video implementation each

Tier 4 - Blocked ​

Not a question of effort: each of these lacks something we cannot supply from the tree, or would add nothing the registry does not already cover.

StatusMachineCPUWhy blocked
â›”BBC Model B+ / Master Compact6502jsbeeb ships no such model, so the free BBC language layer has nothing to run on
â›”Commodore PET 2001 / CBM 30326502BASIC 2.0, not the shipped PET's 4.0: a new variant and ROM set for no new gain
â›”Commodore 1288502 + Z80Dual CPU, the VDC beside the VIC-II, BASIC 7.0; its C64 mode adds nothing
â›”Dragon 32 / 64, Tandy CoCo6809No 6809 core bundled, and none vendorable without writing one
â›”Commodore Amiga, Atari ST68000No 68000 core bundled, and the machines are far past the BASIC-in-ROM era

Pre-microcomputer targets ​

Machines older than the microcomputer have no core to reuse and no prospect of one being vendored, so they ship as clean-room interpreters on the TRS-80's pattern. The first of a family pays for the interpreter; the rest share it through a machine profile rather than forking it, which is how the GE-635 shipped - src/emulator/dartmouth/ is parameterised by a DartmouthProfile and the second machine supplied one - and why the Honeywell 6000 now sits in Tier 1 above as a delegation sibling of it.

Adding the GE-235 widened the era bound in src/dialects/registry.test.ts to 1960-1995; widening it again belongs in the plan for the machine that needs it, not in a passing test edit.

The GE-265 is not a machine to add. It is GE's name for the pair the shipped ge235 already models - a GE-235 with a DATANET-30 front end handling the terminals - sold as the GE Mark I service from 1965. So a GE-265 row here would be the GE-235 twice. The Dartmouth BASIC that ran on that pair is the one ge235 implements; every edition from the third on was written for the GE-635, which the fourth edition's own manual says of itself ("the current implementation on a GE-635 time-sharing system", section 2.9) and which its sample sessions date to October 1967. Phase II replaced Phase I at Dartmouth on 1 April 1969.

Acorn Atom language gaps ​

Genuine Atom BASIC features the shipped atom tokenizer does not cover, so they are absent from src/reference/atom.ts too:

  • the memory indirection operators ? (byte), ! (4-byte word) and $ (string) - the Atom's idiomatic replacement for PEEK/POKE;
  • the remainder operator % and the bitwise & (AND), \ (OR) and : (XOR);
  • LEN, COUNT, PTR, BGET/BPUT, EXT, FIN/FOUT and SGET/SPUT.

How a machine gets promoted a tier ​

  1. Tier 1 → shipped: clone src/dialects/bbcmaster/. Import charset, keywords, tokenizer, detokenizer, language, keyboard, samples and targets from the base dialect; own only the memory map, memory blocks, AI profile and metadata; express the hardware delta as a model parameter.
  2. Tier 2 → shipped: follow docs/contributing/adding-a-dialect.md. The work is the tokenizer, the image format and the video snapshot over a new in-tree bus.
  3. Tier 3 → Tier 2: emulate the video (and sound) chip first. Nothing else can be verified until it renders a frame.
  4. Tier 4 → any tier: vendor or write the missing core, or contribute the missing model upstream, then proceed as above.

Move the machine's row into the Shipped table as it registers - the roadmap test fails while a registered dialect is still sitting in a tier.

Released under GNU GPL v3.0. Some ROM images are third-party copyrighted works, separate to this project, strictly for personal/educational purposes.