@noita-ts/nasm
v0.1.0
Published
The NASM assembler as a platform-gated npm package, plus the TSTL plugin that assembles inline `asm()` x86 patches at build time.
Readme
@noita-ts/nasm
The NASM assembler as an npm package, together with the TSTL
plugin that assembles inline asm() x86 patches at build time — see
asm-plugin.md for the patch format, the reloc macro and the
plugin's types.
npm i -D @noita-ts/nasm// tsconfig.json
{
"tstl": { "luaPlugins": [{ "name": "@noita-ts/nasm/asm-plugin" }] }
}/// <reference types="@noita-ts/nasm/asm" />
// relocs and labels are parsed from the source, at the type level:
const patch = asm(`
target: reloc
entry:
jmp [target]
`);
patch({ target: addr });
// patch.raw, patch.vars.target, patch.labels.entryThe assembled patches are plain { asm, vars, labels } tables and don't depend
on anything else; @noita-ts/ffi is what you'd normally use to
actually inject them at runtime.
The binary path is also exposed directly, for CommonJS too
(require('@noita-ts/nasm')), since the TSTL plugin hook that assembles patches
is synchronous:
import { nasmPath } from '@noita-ts/nasm'; // absolute path to the executablePlatform packages
The binaries live in one package per platform:
| package | binary |
| -------------------------- | ---------- |
| @noita-ts/nasm-linux-x64 | nasm |
| @noita-ts/nasm-win32-x64 | nasm.exe |
They're listed here as optionalDependencies and each declares os/cpu, so
npm downloads only the one matching the current machine and silently skips the
rest — you never depend on them by name. Adding a platform means publishing a
new @noita-ts/nasm-<os>-<cpu> and listing it in index.cjs + the
optionalDependencies here.
If the matching package is missing (installed with --no-optional, or a
node_modules/lockfile copied from another platform), importing this package
throws explaining which package is absent.
