Copperline 0.11.0: boot from a host directory
0.11.0 is out, five days after 0.10.0. The most visible change: host directories now mount - and boot - as native AmigaDOS volumes. Underneath it is a fidelity-and-performance release: the blitter's BLTPRI bus fence and the 68000's microcode write ordering are modelled much more closely, sprite serialization was fixed against cross-emulator and real-hardware references, worst-case frame times on slower hosts dropped by a factor of six, and a golden-render probe suite now guards chipset timing in CI.
The display regressions listed as known issues in 0.10.0 are fixed in this release. And as always: when something doesn't run, the fix models the underlying Amiga subsystem rather than special-casing the title.
Host directories as AmigaDOS volumes
A new [[filesys]] config section mounts a host directory as
an AmigaDOS volume, served live through an autoconfig services board and
a resident guest handler. No disk image is built - the guest always sees
the current host contents. Protection bits, comments and datestamps come
from host permissions and UAE-style .uaem sidecars, the
volumes survive a warm reboot, and a bootpri above the
floppy's puts them ahead in the boot-device vote - so a Workbench
directory on the host can boot the machine directly.
The volumes are read-only for now: writes fail the same way a write-protected disk does. The older IDE / SCSI directory route is still there when the guest needs to write, but that one stays session-only.
The filesystem - services board, guest handler, typed DOS ABI layer and
boot support - was contributed by Bernie Innocenti
(@codewiz),
who also added a serial PTY sink ([serial] mode = "pty") and
unified the SCSI configuration (see the config note below).
The blitter fence
BLTPRI - the "blitter nasty" bit - now asserts BLS against the CPU the way Agnus does: the CPU is fenced off the chip bus during a blit's warm-up window, the fence pressure follows the blitter's per-slot micro-cycle, and a blit with no channels enabled asserts no fence at all. This matters for MFM-decoding trackloaders that rely on exact CPU / blitter interleaving; the regression example was a Jim Power boot crash.
68000 microcode write ordering
A long series ordering register writes, ALU and address-calculation tails
and internal clocks against prefetch and bus sync the way the microcode
does: EOR / EXG / the BCD ops / Scc / MOVEM / ADDX / SUBX, MOVE USP,
MOVEA, MOVE from SR, delayed SR writes, 68010 SR read ordering and long
shift timing, CHK trap timing, multiply and divide internal clocks, the
quick and bit ops, and 68020 Bcc long-displacement gating. The external
RESET instruction is now modelled as a true warm reset.
Sprites, measured with a ruler
Two sprite serialization fixes, measured rather than guessed. Denise emits a sprite's first pixel one lo-res pixel after the horizontal comparator match - measured against FS-UAE and vAmiga with new ruler probes - and a DATA-armed sprite keeps serializing on every line, across frames, until SPRxCTL disarms it. Together they improve 180 of the 186 vAmigaTS sprite cases and fix long-standing demo sprite placement bugs.
Hunting frame spikes
Issue #99
reported audio underruns on an i5-class machine. Profiling found three
hot spots: per-colour-clock table copies in the bus hot path, per-pixel
palette copies in the renderer, and a quadratic sprite-multiplexer scan.
All three are gone, and --benchmark-until now reports
p50 / p90 / p99 / max frame times so it stays measurable. On the profiled
workload, worst-case core frame time dropped from 100.8 ms to 16.1 ms,
and the underruns disappeared.
Golden renders in CI
Every cargo test --release run now boots the committed
timing-test/ probe binaries on the bundled AROS ROM and
compares their rendered output pixel-for-pixel against blessed
references: CPU and chip-bus timing rows plus DDF / DIW, sprite-position,
blitter-pace, collision and audio-enable probes. An intentional
timing-model change has to re-bless the renders, so every chipset timing
diff gets reviewed as an image diff.
The smaller fixes
- A post-WAIT Copper wake-up lands on a colour clock free of fixed DMA, and the closed-DIW border repaint follows per-pixel COLOR00 writes - fixing raced copper-chunky effects.
- DSKLEN arming no longer waits for drive-ready: a spinning-up drive arms disk DMA normally, as on real hardware. This fixes trackloader disk swaps that double-write DSKLEN right after motor-on - Shadow of the Beast disk 2 was the example.
- The renderer no longer synthesizes a picture for a line whose fetch never ran (phantom lines in overscan scrollers), and the TV aperture is black-padded past the framebuffer edge instead of repeating the last column.
- Mid-blit save states serialize deterministically - two saves of the same paused machine are byte-identical - backed by a regression test that resumes a mid-blit save under live Copper and interrupt load and compares the continued timeline byte for byte.
- Plus bitplane scroll-in from empty line state, the hi-res flush at the 2H-196 window edge, AGA border sprites suppressed during border blank, and more in the full notes.
Config changes
One breaking change: the experimental [a4091] section from
0.10.0 is gone. Both SCSI boards now live under [scsi] with
a controller key - "a2091" (the default) or
"a4091". An existing A2091 setup keeps working unchanged.
Save states are compatible with 0.10.0 in both directions; the format
version did not change.
Get it
Builds for macOS, Linux and Windows are on the release page, and the Homebrew tap is updated.
- Andrew Hutchings (LinuxJedi) · linuxjedi.co.uk