← News

FantASM 2.3.0 is available

November 1, 2026FantASM

FantASM 2.3.0 is available to download. A .nex carries a loading screen of any kind, a generic device builds for a 64 KiB machine with no ROM, and !static_assert fails a build on a condition settled once every label is final. 59 faults are fixed, 29 of them wrong output given in silence.

Breaking

  • A constant or define named after a directive is case-sensitive. MESSAGE equ 7 is reached by MESSAGE only. Spell the reference as the definition is spelled.
  • A bit number past 7 in bit, set or res is an error (E1023), no longer configurable in [lint]. It warned and then encoded bit 0.
  • A macro’s arguments must match its parameters (E1033). A call with an extra or a missing argument used to assemble.
  • A source given on the command line is built in place of the project’s targets. Use --only to build a target.
  • Recipes run in the project file’s directory, in [tasks] and [target.tasks]. Write their paths relative to fantasm.toml.
  • _page of a label on zx128 is the 8 KiB page in a linked build, as in a direct one: 10 for $4000, where a link gave 5.
  • An IF must close in the file that opened it (E1074).

Added

  • Loading screens in a .nex [!nex screen, !nex palette, !nex copper]: every kind, from a file — .nxi and .sl2 included — or from display memory, with a palette. A screen survives an object build and fantasm link -f nex writes it. A program bank loaded over the screen is warned of (W1233).
  • A generic device [-d generic]: 64 KiB of RAM, no ROM, no paging.
  • !static_assert fails the build when its expression is zero once every label is final.
  • An fxi region kind BANKED, one region per page that page= and window= sections fill.
  • in f,(c), the same instruction as in (c).

Fixed

59 fixes, and the worst of each group:

  • 17 wrong output, silently — --gc-modules swept a routine called just after ENDMODULE; invalid instructions such as ld (c),a and jp (ix+1) assembled as valid ones; a value defined further down and too big for its operand was truncated.
  • 12 wrong output from a link, silently — label arithmetic and $ in an object linked to the wrong value; a page= section overwrote code placed at an address; a constant from another object was cut to 16 bits.
  • 10 in the language server — a request was answered from the last file assembled; other open files were assembled from disk, not from their unsaved text; renaming count also renamed Gfx.count.
  • 7 sources that should have assembled, or should not have — != with no space before it; ld (ix+d),n with a name as the value; extra .nex banks counted toward -M.
  • 4 in builds and projects — fantasm init wrote projects that did not build; a pre_build recipe could not generate its own target’s main.
  • 4 in diagnostics — the caret was misaligned on lines with tabs; F1072 and E1036 printed twice.
  • 3 links that should have succeeded — an archive with no index was not searched; --gc-sections swept a region reached only through _run, _load or _size.
  • 2 crashes — an assert_mem span past 64K aborted the process; linking an empty section at $0000 panicked.

13 new diagnostic codes: 1228 to 1237, 1240, 1252 and 1253. An object carrying a loading screen or a difference of labels in two sections is refused by an older linker. Test coverage expanded from 2,015 to 2,189 tests.

Every change is in the full changelog under [2.3.0].

Get it from the Downloads page.