Start here

Why asm198x

Keep your source and your syntax. Gain tooling that did not exist for them.

There is nothing to port

Every dialect asm198x reads is somebody else’s assembler — ACME, ca65, pasmo, sjasmplus, lwasm, vasm, RGBDS, and Macro Assembler AS for the rest. Point it at a file you already build and name the dialect it is written in:

asm198x --dialect acme main.asm -o main.bin

That is the whole adoption cost. No conversion pass, no syntax migration, no second copy of the source in a house dialect. Dialects lists all 24, and what each one is the syntax of.

What arrives with it

Capability Scope
One binary, 20 CPUs One install for every machine you target, rather than a toolchain per machine
fmt — canonical layout, idempotent Every dialect
disasm Every dialect
--prg, --sna, --gb-rom, --exe The loader format comes out of the assembler, not a later packaging step
--message-format=json Structured results and diagnostics, for editors and build scripts
--debug A Debug198x sidecar for source-level debugging; flat dialects, plus the ca65 and vasm linked paths
--sym, --listing A symbol table and an address/bytes/source listing

The scope column is the point, and it is checked rather than claimed: a test runs fmt and disasm for every name --dialect accepts, so “every dialect” fails the build on the day it stops being true. These are the shipped surfaces, not a roadmap.

Why trust it with a project that already builds

Because you can check, rather than take it on faith.

Every CPU is arbitrated against a real assembler. The differential suites assemble the same source with the reference tool and compare bytes. 8 tools across 23 instruction sets: ACME, ca65, lwasm, pasmo, RGBDS, sjasmplus, vasm and Macro Assembler AS, which covers the 14 less-travelled ones.

What they produced is recorded, not remembered. 16,840 verdicts, each keyed on the reference tool’s own version string, committed to this repository. CI replays every one of them on machines with none of those tools installed, so a change that alters our output fails against what the real assembler did — not against a fixture somebody wrote by hand.

The curriculum assembles byte-identically. 419 assembly sources from the Code198x curriculum, across the C64, the Amiga, the NES and the Spectrum, in 617 comparisons. Every one matches the reference tool.

Where we differ is published. 4 tracked differences across 13 recorded cases, and the list says what each one is. A tracked difference that silently stops being a difference fails the build.

That last one is the argument. Parity is a claim you would have to believe; a list of where we do not match is one you can read before deciding.

What it will not do

It is not published to crates.io — cargo install asm198x will not find it. Use the installer or an archive.

It does not replace your emulator, your linker for platforms that need a real one, or your build system. It assembles, disassembles and formats.

Ready? Quickstart.