Start here

Moving an existing project across

You do not port anything. Name the dialect your source is already written in and assemble it. The rest of this page is how to check that for yourself before you rely on it.

Prove it produces the same bytes

The useful first step is not to switch. It is to build both ways and compare.

acme -f cbm -o theirs.prg main.asm
asm198x --dialect acme --prg main.asm -o ours.prg
cmp theirs.prg ours.prg && echo identical

That is the same comparison the differential suites run, on your source instead of ours. If the files match, nothing about your build has changed except which binary produced it.

The same shape works for the other front doors:

pasmo --bin main.asm theirs.bin
asm198x --dialect pasmo main.asm -o ours.bin
cmp theirs.bin ours.bin

Projects in more than one file

-I adds a directory to the include search path. It is repeatable, and searched in the order given:

asm198x --dialect acme -I src -I lib main.asm -o main.bin

Each dialect keeps its own spelling, because your source already has one. The table is generated from the same declarations the assembler dispatches from, so a dialect that gains an include appears here without anyone remembering to add it:

Dialect Source file Binary file
acme !src, !source !bin, !binary
ca65 .include .incbin
65816 .include .incbin
huc6280 .include .incbin
vasm include incbin
lwasm include, use, incl, lib includebin
rgbasm include incbin
pasmo include incbin
sjasmplus .include, include .incbin, incbin
8080 include binclude
6800 include binclude
1802 include binclude
8048 include binclude
scmp include binclude
f8 include binclude
2650 include binclude
tms7000 include binclude
pdp11 include binclude
tms9900 include binclude
cp1610 include binclude
z8000 include binclude

Not implemented means the dialect has the directive and asm198x does not read it — your source is valid and the gap is here. Today there is one: a multi-file pasmo project will not assemble, and it is the thing to check first if that is your project. A dash would mean the dialect has no such directive at all, and nothing here does.

The output your build already expects

If your build ends by wrapping a flat binary into a loadable file, that step may not be needed:

Flag Produces
--prg A C64 program with its two-byte load address
--sna A 48K Spectrum snapshot — needs end <addr> for the entry point
--gb-rom A padded Game Boy cartridge ROM with finalised header checksums
--exe An Amiga hunk executable

Without one of these you get the flat binary, which is what your existing packaging step is presumably already fed.

What might not match

Where we differ lists every known difference, what each one is, and whether it is pending work or a settled position. It is a short list, and reading it is faster than discovering one.

If your source is refused rather than assembled differently, that is not on that list — it is a gap, and worth reporting with the source that triggered it. --message-format=json gives a structured diagnostic if that is easier to attach than a terminal scrape.

Keeping both for a while

Nothing stops you running both assemblers over the same source in CI and comparing bytes, exactly as above. That is what this project does against eight reference assemblers on every change, and it is the cheapest possible way to find out that something moved.