Copperline 0.9.0: the FPU deep-dive
0.9.0 is out. The headline is a long 68881/68882 FPU accuracy pass. Alongside it come explicit joystick input selection, save states that restore without the original ROM, hard-disk volume names, and fixes to CIA, Paula, keyboard, Denise, sprite, bitplane, RTC and display timing.
As with every release so far, when something doesn't run, the fix models the underlying Amiga subsystem more faithfully rather than special-casing the title. That approach is slower, but each fix tends to repair a whole class of software instead of one program.
The FPU pass
Until now the FPU computed in the host's f64 double precision. That is close, but a real 68881 works in 80-bit extended precision, and software can tell the difference. The m68k core now has:
- an 80-bit extended register file backed by pure-Rust softfloat arithmetic, with no host FPU involved,
- extended-precision kernels for exp, log, trig, inverse trig and the hyperbolics,
- exact
FMOVECRconstants, matching the ROM tables in the real chip, - packed-decimal reals, memory and immediate-source monadic operations,
FPCRrounding-mode propagation andFPSRexception bytes,- exact
FMOD/FREMquotient handling.
Save states are versioned, and 0.9.0 bumps the format to carry the 80-bit register snapshots. Older state files are refused with a version error rather than loaded across incompatible layouts.
The machine no longer guesses your joystick
The choice between keyboard joystick emulation and a physical gamepad
used to be implicit. Now there is a status-bar toggle, a menu entry, a
launcher control and an
[input] joystick = "gamepad" | "keyboard" config setting, so
you choose the input mode explicitly.
Save states without the ROM
--load-state can now restore a snapshot without opening the
original Kickstart file first. The save state carries the whole machine, so
Copperline only needs a placeholder until the state replaces it. This helps
when a bug report comes with a state attached and you don't have the
reporter's exact ROM.
The small hardware fixes
- CIA one-shot timers keep the START bit visible through the auto-started interval, because some software polls the running state to time the one-shot.
- Floppy motor spin-up and spin-down state now flows through the same controller path that disk DMA and status reads use.
- The keyboard MCU accepts KDAT handshake pulses from the Amiga side that are shorter than the nominal width in the Hardware Reference Manual.
- POTGO-driven high pins hold their POTxDAT counters at zero, which is how software reads fully charged paddle and button lines.
- Early hi-res DDFSTRT output is word-aligned, late-DDF first words sample complete plane latches, and per-frame collision accumulation is gated by CLXDAT observation.
Each of these was prompted by a real program.
Housekeeping
The vendored m68k fork moved from vendor/m68k to
crates/m68k and is packaged as copperline-m68k,
making the dependency boundary explicit. The battery-backed RTC now reports
host local time, and COPPERLINE_RTC_FIXED_SECS is still there
when a replay needs determinism. Directory and generated hard disks can
carry configured AmigaDOS volume names. Menu popups size themselves to their
widest label.
Get it
Builds for macOS, Linux and Windows are on the release page, and the Homebrew tap is updated. No config changes are required from 0.8.0. The new settings are optional and default to the old behaviour.
- Andrew Hutchings (LinuxJedi) · linuxjedi.co.uk