Skip to content

Copperline 0.11.0

Latest

Choose a tag to compare

@LinuxJedi LinuxJedi released this 12 Jul 17:59

Copperline 0.11.0 focuses on hardware fidelity and performance: host directories can now be mounted (and booted) as native AmigaDOS volumes, the blitter's BLTPRI bus fence and the 68000's microcode write ordering are modelled much more closely, sprite serialization and several display paths were fixed against cross-emulator and real-hardware references, frame-time spikes on slower hosts were eliminated, and a golden-render timing-probe suite now guards chipset timing in CI. As always it is a hardware-behavior release: compatibility fixes model the underlying Amiga subsystems rather than individual titles.

The display regressions noted as known issues in 0.10.0 are fixed in this release.

Required config changes

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 [scsi] A2091 setup keeps working unchanged; an [a4091] section must be renamed to [scsi] with controller = "a4091".

All other new options ([[filesys]] mounts, [serial] mode = "pty") are optional additions, and omitted configs continue to parse.

Save states are compatible in both directions with 0.10.0: the state format version is unchanged.

Highlights

  • Host directories as AmigaDOS volumes. New [[filesys]] config mounts host directories as HOSTFS volumes through an autoconfig services board and a resident guest handler: full file I/O with FFS path semantics, file attributes from host permissions and .uaem sidecars, optional write protection, host path-escape hardening, warm-reboot survival, and bootable volumes via bootpri — a Workbench directory on the host can now boot the machine directly.
  • Blitter BLTPRI bus fence. BLTPRI 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, BLS pressure follows the blitter's per-slot micro-cycle, a blit with no channels enabled asserts no fence, and line-blit startup was shortened. This class fixes MFM-decoding trackloaders that rely on exact CPU/blitter interleaving (a Jim Power boot crash was the regression example).
  • 68000/68010 microcode write-ordering pass. 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/BCD/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 division internal clocks, quick and bit ops, and 68020 Bcc long-displacement gating. The external RESET instruction is now modelled as a true warm reset.
  • Sprite serialization fixes. 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 these improve 180 of 186 vAmigaTS sprite cases and fix long-standing demo sprite placement bugs.
  • Frame-spike elimination. Profiling on an i5-class machine (issue #99) removed per-colour-clock table copies in the bus hot path, per-pixel palette copies and a quadratic sprite-multiplexer scan in the renderer, and added p50/p90/p99/max frame-time reporting to --benchmark-until. Worst-case core frame time on the profiled workload dropped from 100.8 ms to 16.1 ms and audio underruns disappeared.
  • Golden-render CI suite. 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/chip-bus timing rows plus DDF/DIW, sprite-position, blitter-pace, collision, and audio-enable probes. Intentional timing-model changes must re-bless the renders, so every chipset timing diff is reviewed as an image diff.

Hardware accuracy fixes

  • Copper. A post-WAIT wake-up must land on a colour clock free of fixed DMA; copper-sourced sprite repositions carry the WAIT-comparator lookahead; the closed-DIW border repaint follows per-pixel COLOR00 writes (fixes raced copper-chunky effects).
  • Agnus DMA and blitter. Fixed DMA slots are aligned with the hardware DAS table, BLS pressure is gated by the blitter micro-cycle, line blitter startup timing was shortened, and VHPOSR readback lead was tuned against the probe rows.
  • Denise display path. Bitplane scroll-in starts from empty line state; a BPLCON1 scroll covering an off-grid DDFSTRT catches the floor reload slot; hi-res bitplane content flushes at the 2H-196 window edge; AGA border sprites are suppressed during border blank; sprite DMA owns same-line reuse data.
  • Renderer and presentation. The renderer no longer synthesizes a picture for a line whose fetch never ran (phantom-line artifacts in overscan scrollers), and the TV aperture is black-padded past the framebuffer edge instead of repeating the last column.
  • Floppy. DSKLEN arming no longer waits for drive-ready: a spinning-up drive arms disk DMA normally, as on real hardware (fixes trackloader disk swaps that double-write DSKLEN right after motor-on, e.g. Shadow of the Beast disk 2). Step-click sound is gated on the /TRK0 sensor and the stepper mechanism floor.
  • Save states. Mid-blit state serializes deterministically (two saves of the same machine are byte-identical), backed by a new regression test that resumes a mid-blit save under live Copper and interrupt load and compares the continued timeline byte-for-byte.

External contributions

  • Bernie Innocenti (@codewiz) contributed the host-directory HOSTFS filesystem (services board, guest handler, DOS ABI layer, and boot support), the serial PTY sink (mode = "pty"), the unified [scsi] controller selection with its launcher picker, A4091 CTEST8.CLF FIFO clearing, and 68040 write-fault reporting in writeback slot 3.

Other improvements

  • timing-test/ gained the ddfprobe suite, manual/DMA sprite position probes, blitter-pace and audio-enable probes, and a 96-sector boot loader; tools/rowphase.py performs content-anchored per-beam-row comparison across Copperline, vAmiga, and FS-UAE output.
  • The debugger gained headless exception catchpoints, address filtering for CPU read traces, and low-memory blit crash diagnostics.
  • CI now runs the golden-render suite in parallel, boots DiagROM as a smoke test, and keeps the Windows/macOS/Linux packaging workflows as release build checks.
  • Documentation covers the [[filesys]] mounts, the unified SCSI configuration, and the expanded timing-probe workflow.

Installation

macOS (Homebrew):

brew tap LinuxJedi/copperline https://github.com/LinuxJedi/Copperline
brew install copperline

macOS (DMG): download Copperline-0.11.0-macos-universal.dmg below, open it, and drag Copperline.app to Applications. The app is ad-hoc signed but not notarized, so first launch may require right-clicking the app and choosing Open.

Linux (AppImage): download Copperline-0.11.0-x86_64.AppImage below, then:

chmod +x Copperline-0.11.0-*.AppImage
./Copperline-0.11.0-*.AppImage

Windows: download and extract the portable Copperline-0.11.0-win-x64.zip below.

From source:

cargo build --release
./target/release/copperline

The bundled AROS boot ROM lets Copperline run out of the box. A real Kickstart ROM and disk, hard-disk, or CD images are still required to run commercial Amiga software; these are not included.

Full changelog: v0.10.0...v0.11.0