2026-09-13

Weekly open source: an Amiga in rsemu, and a kernel and an assembler on a Sunday

The week had two halves. Monday to Saturday went to projects that already existed: rsemu, the pure-Rust emulator, gained a whole Amiga 500 chipset and filled out its STM32 board, purecrypto went through a long security review, and fstool learned to run with no allocator at all. Sunday was different. Two new projects started that day, about a hundred commits each: kintane, an operating system kernel in Rust, and rsasm, an assembler for many CPU architectures.

rsemu: an Amiga 500, and an STM32 board

rsemu is a multiplatform emulator in pure Rust, built "from the bottom up": address spaces, clock domains, wires, buses and a translation IR come first, and machines are described in .machine files rather than compiled in. This week (about 250 commits) it went in three directions:

  • An Amiga 500. The MOS 8520 CIA, Paula (interrupts, disk DMA, the pot pins), Denise (playfields, HAM, sprites, collisions), Agnus, and then "the whole A500 chipset running together". Then the internal floppy, with ADF images encoded into the MFM tracks trackdisk reads, plus the keyboard protocol and mouse quadrature: "an A500 you can see, type at and point at". Kickstart is read from media the user already owns.
  • The STM32F407 board. About twenty peripherals: EXTI and SYSCFG, timers with input capture, watchdogs, DMA with its request matrix, SDIO, RCC clock gating, an RTC, RNG, the HASH processor, the L4 Firewall, the flash interface with PCROP and RDP. It also gained the FPv4-SP floating-point extension and the DWT cycle counter, plus a set of external parts: an ATECC508A/608 secure element, an ST25DV NFC tag, SSD1306 and ST7789 displays, QSPI PSRAM and a matrix keypad. The gdb stub can now load into flash.
  • Speed and correctness. An aarch64 JIT backend, so jit-host isn't just the interpreter on non-x86-64 hosts. Stores no longer end a translated block on x86, RISC-V and A64 (on RISC-V that was "worth 29.3% of a real boot"). A benchmark against QEMU, and litmus tests in parallel mode, which turned up a torn load and non-atomic A64 and RISC-V atomics. Both are fixed.

purecrypto: secp256k1-zkp, and an audit pass

purecrypto, the no_std crypto toolkit under the rest of the stack, went from v0.8.2 to v0.8.6 in about 230 commits. The new features are Bitcoin-side. BIP340 Schnorr signatures, then a set of zero-knowledge modules modelled on secp256k1-zkp: ECDSA adaptor signatures, sign-to-contract, Pedersen commitments and Confidential Assets generators, asset surjection proofs, Borromean-ring range proofs ("byte-exact with the reference"), half-aggregation of Schnorr signatures, and Elements/Liquid ring-signature whitelisting. There is also an allocation-free secp256k1 ECDSA, and several of the zkp modules no longer need alloc.

Most of the commits were fixes from a review. QUIC never processes 1-RTT packets before the handshake completes, and only adopts keys and connection IDs from packets that authenticate. TLS session tickets are bound to the listener's trust config. Spoofed DTLS flights can no longer wedge a handshake. RSA mixes fresh randomness into its blinders. A new public zeroize module replaced the hand-written secret wipes throughout the crate.

fstool: filesystems with no heap

fstool builds, inspects, converts and repacks disk images and filesystems. This week (v0.4.27 to v0.4.31) it gained per-format Cargo features and a no_std core for embedded targets. "No-alloc" is now the floor and alloc is additive. On top of that come FAT12/16/32 "with no allocator at all" (bounded cluster walks, fuzzed), and allocator-free exFAT and littlefs drivers on a shared storage layer. The no-alloc work is already in use: CatCard's SD driver "accept[s] exFAT cards too (fstool 0.4.31, still no heap)". The rest was a long round of correctness fixes from an independent review, across ext4, XFS, NTFS, APFS, HFS+, f2fs, exFAT, qcow2, DMG, LUKS, ISO 9660 and the archive formats.

kintane: a kernel for many kinds of machine

kintane is "a modular operating system kernel written in Rust, targeting the full range from microcontrollers without an MMU to multi-socket SMP machines". The central idea is portability through the type system instead of the preprocessor. Architecture differences are traits and associated constants, so code that maps a page doesn't exist on a target with no MMU, rather than being #ifdef-ed out. It is built by kbuild, a purpose-built tool (cargo isn't the build system). Its native ABI is capability-based, and a per-process Linux personality is planned to run unmodified Linux binaries. The name is 欽 (regard, attend to) plus 種 (seed, kind): "a kernel that attends to the many kinds of machine".

Its first day went well past the design documents: x86-64, i686 (with PAE) and aarch64 from one source, then riscv32 without an MMU and a Cortex-M3 port that executes in place with the MPU guarding. It already has preemptive threads, a buddy allocator, demand paging with copy-on-write and huge pages, W^X, capability handles and channels. On top of that: SMP through the local APIC and INIT-SIPI on x86-64 and PSCI on aarch64, ACPI and PCI enumeration, its own BIOS and UEFI loaders, loadable modules, and finally "the first native userspace program, run and graded at boot".

rsasm: one assembler, many CPUs

rsasm is an assembler in Rust that aims to "accept the asm text people actually have, target many CPUs, and let one source file emit code for more than one of them". Every encoding is checked byte for byte against an independent assembler (GNU as, llvm-mc, NASM, vasm), and the reference assemblers are pinned by checksum. In its first day it went from an x86-64 skeleton to fourteen backends:

  • x86 with SIMD from MMX through AVX-512, AArch64, ARM A32/Thumb, RISC-V RV32/RV64 IMAFDC, PowerPC, MIPS and SPARC
  • the 6502, Z80 and 8080, and m68k from the 68000 to the 68020 in both Motorola and GNU syntax
  • SuperH, Renesas RX and RL78, V850/RH850 and NEC's 78K0, with the Renesas CC-RX / CC-RL / CC-RH source dialects

ELF32 and ELF64 objects and flat binaries come out the other end, along with GNU-style macros (.macro, .rept, .irp). A cross-assembler differential harness runs in CI.

Also this week

  • CatCard, the clean-room Rust firmware for Coldcard hardware wallets, moved wholesale onto purecrypto and got real USB: an OTG device driver, HID transport, upgrades staged over USB, and a log ring. It also got an SD-card stack written "to be diagnosable rather than trusted", which can install firmware from a card, plus mk5 board support and a live RNG analyzer.
  • teamclaude, the multi-account proxy for Claude Code and Codex, had a hardening sweep: the loopback exemption, MITM tunnels, OAuth callback, config writes and the TUI. It also gained a Docker image published to ghcr.io and a tsc strict-mode ratchet in CI (1.1.17 to 1.1.20).
  • puressh had its own security review (sshd accounting, known_hosts revocation, strict KEX, the FFI). Its protocol layers moved under puressh::hazmat for v0.1.7.
  • atelier, a minimal-TUI AI coding harness on rsurl, added apply_patch, a todo list, web_fetch, MCP resources and prompts, and JSONL request tracing.
  • oxideav-mod pinned FastTracker 2 XM playback against a black-box oracle: envelopes, vibrato, arpeggio, order flow, ping-pong loops.
  • psql, the Go SQL builder and ORM, added dialect feature flags and advanced PostgreSQL/CockroachDB features. intlrs closed eight ECMA-402 number-formatting divergences.

Next week

kintane and rsasm have the most ground to cover after one day each: the kernel heads toward drivers and a userland, and the assembler toward more targets and object formats. rsemu keeps adding machines on its shared core. CatCard builds the wallet itself on top of working USB and SD.