Asm198x
Modern assemblers & disassemblers for retro CPUs
Asm198x is the family's assembler toolchain — one modern, statically-linked, cross-platform binary that assembles and disassembles code for the retro CPUs of the era. Rather than invent a house syntax, each front-end matches a dialect people already use, and the output is checked byte-for-byte against that reference tool.
Why it exists
The period assemblers are dead-OS binaries — you need DOSBox or a full emulator just to run them. The modern community tools mostly work, but they're fragmented: a different program, syntax and build dance per machine, much of it unmaintained C. Asm198x is one well-documented toolchain that spans the family's CPUs. Rescue beats replace.
What it covers
Five CPUs, both directions, every front-end validated byte-identical against the
reference assembler: 6502 (acme for the C64, ca65 for the NES —
with a bounded linker that emits a real .nes ROM),
Z80 (pasmo/pasmonext and sjasmplus, including the Spectrum Next's
Z80N), 68000 (vasm, with Amiga hunk-executable output),
6809 (lwasm), and 65816 (ca65). Assemble →
disassemble → reassemble round-trips byte-for-byte.
How it's used
One binary, one --dialect flag. A few illustrative commands (the full
dialect and flag set is on GitHub):
Assemble C64 source (acme dialect)
asm198x --dialect acme countdown.s -o countdown.bin Assemble + link a finished NES ROM (ca65)
asm198x --dialect ca65 game.asm -o game.nes Disassemble a binary back to source
asm198x --disasm --dialect 6502 --org 0x0200 countdown.bin Why it's in the family
It's the tool that assembles Code198x's lesson code — the C64 (80 units), NES
(32 units) and Spectrum (20 units) curricula all build byte-identical through it,
so the code in a lesson is exactly what the reference assembler produces. The
shared isa spec at its core is also the encoding source of truth that
Emu198x validates its decoders against — one set of facts, three siblings. It's
its own project with its own roadmap, not a Code198x component.