Skip to content

Copperline 0.18.0

Choose a tag to compare

@LinuxJedi LinuxJedi released this 29 Aug 10:23
· 549 commits to main since this release

Copperline 0.18.0 is the CD release. The CD32's Full Motion Video module -- Commodore's MPEG cartridge -- is emulated end to end, so Video CDs play and FMV-aware titles run their MPEG sequences on an emulated CD32 exactly as they do with the real cartridge in the expansion bay. Underneath it, the CD32 drive model was calibrated against a real PAL CD32 with a purpose-built probe disc and a filmed cold boot: spin-up, seek times and command pacing are now measured quantities, and the emulated cold boot tracks the real machine's to within 50 milliseconds -- close enough that Fightin' Spirit, which depends on the exact boot-time memory layout, boots from the unmodified disc for the first time. Around the CD story: CDXL video plays from cooked ISOs, Nero NRG images mount, cue sheets take WAVE and MP3 audio tracks, a new copperline-import-uae tool converts WinUAE, Amiberry and FS-UAE configurations, a Hayes-compatible modem answers on the serial port, run-ahead trims input latency, and AGA sprite, fetch and palette fidelity was pushed to pixel-exact against the vAmigaTS references. As always it is a hardware-behavior release: compatibility fixes model the underlying Amiga subsystems rather than individual titles.

Compatibility notes

Save states from 0.17.0 do not load in 0.18.0. The FMV module, the calibrated drive model and the vertical display-window flop all changed the serialized machine shape, so the state format version moves from 61 to 70. Re-create snapshots after upgrading.

CD32 and CDTV now default to no floppy drive, like the real machines. [floppy] drives accepts 0-4 mechanisms and puts one back (drives = 1, or --floppy-drives 1); every other profile keeps its DF0 default. The launcher understands driveless CD machines and now lists a mounted disc's tracks.

The lide.device IDE boards now autoboot out of the box. A fitted board defaults to a bundled build of LIV2's open-source ROM (lide.rom for ripple/ride, lide-atbus.rom for atbus2008, plus the CD-filesystem second bank where the board supports banking) instead of requiring a user-supplied download. rom = "" opts back into the old hardware-only mode, and an explicit path is still honored. Each drive slot also gets its own key -- drive0..drive3 in (channel, master/slave) order, the same shape as [ide] and [scsi] -- with each drive's boot priority under it; the older positional drives = [...] array is still read.

No configuration keys were removed or renamed. Everything else is additive: [machine] fmv_rom, [emulation] run_ahead_frames / --run-ahead, [serial] mode = "modem" with its telnet, session and [serial.phonebook] keys and --serial-session, the [lide] per-slot keys, .nrg images, and WAVE/MP3 cue tracks.

Highlights

  • The CD32 Full Motion Video module. [machine] fmv_rom fits Commodore's MPEG cartridge as the first Zorro II board in a CD32: the CL450 video processor and L64111 audio decoder interfaces, the module's RAM and ROM, and the analogue keying path that mixes decoded video with Denise's output, with Video CD frames scaled across the full capture aperture. MPEG-1 video decodes through CopperlineHQ's safe pure-Rust plmpeg port and MPEG Layer II audio through Symphonia. Video CDs play, and FMV titles run their MPEG sequences -- Cannon Fodder's filmed intro plays before the game loads and runs to gameplay deterministically. MODE2/2336 and MODE2/2352 tracks are read through cue, NRG and CHD images alike. The 256 KiB v40.30 cartridge ROM is yours to supply, like a Kickstart. One caveat: with the module fitted, booting a CD needs a real Kickstart for now -- the cartridge carries its own KS-era cd.device that takes over the bundled AROS ROM's boot path; an upstream AROS fix is in progress.
  • A CD32 drive calibrated against real hardware. A purpose-built probe disc (tools/cd32-probe, included, with the measured result tables in its README) and a filmed cold boot turned the drive model's guesses into measurements: a spin-up gate on the first lead-in dump (8.8 s cold, 3.5 s warm), TOC dumps that complete before the next queued command acts, a measured seek curve replacing the single-slot seek, TX DMA that folds to its 256-byte page the way Kickstart's producer expects, and unmapped address space billed at its measured bus cost. The emulated cold boot now enters the startup-sequence at 14.36 emulated seconds against 14.31 filmed -- and because the boot show never runs with a bootable disc spinning up, chip RAM is laid out as on the real machine: Fightin' Spirit boots unpatched to the credits, and discs inserted at the idle screen or mid-show now boot like a real lid close.
  • CDXL from cooked ISOs. Reads from a bare .iso now synthesize complete raw Mode 1 sectors -- EDC and P/Q parity included -- so CDXL video plays from cooked images and CDTV-trademark boots work on the CD32 profile; cached TOC transport is paced independently of optical sector delivery.
  • More CD image formats. Nero NRG images mount everywhere a cue sheet does, and cue sheets accept WAVE and MP3 audio tracks with PREGAP/POSTGAP lines honored -- a ripped game with compressed audio tracks plays its soundtrack without re-mastering.
  • copperline-import-uae. A converter that turns a WinUAE, Amiberry or FS-UAE configuration into Copperline TOML -- machine model, CPU/FPU, RAM sizes, chipset, Kickstart, floppies (FS-UAE swap lists become a playlist), hard drives and directory mounts, CDs, RTC, audio, joystick ports and the [lide]/[scsi]/[toccata] boards. It is honest about the rest: approximations are commented at the line they produced, and everything with no equivalent is listed at the end of the file it writes, so "considered and skipped" is distinguishable from "not yet handled". The output is validated exactly as copperline --config would load it. Contributed by Simon Dick. See docs/guide/import-uae.md.
  • A modem on the serial port. [serial] mode = "modem" puts a Hayes AT-command modem on Paula's serial port, so Term, NComm and BBS doors that expect dial commands, result codes, carrier semantics and the +++ escape get them, instead of the raw byte bridge of the tcp modes. It answers inbound calls (RING, S0 auto-answer, ATA), dials from a config-file phonebook, speaks enough telnet NVT for real BBS servers, persists AT&W profiles to a sidecar file, and carries a WiModem232 compatibility layer verified against the real unit's manual, so published community setup guides run verbatim. A scripted-session transport (--serial-session) replays a dial-out byte-for-byte for deterministic headless runs. Contributed by Simon Dick. See docs/guide/modem.md for the command set and a BBS quick-start.
  • Run-ahead. [emulation] run_ahead_frames (0-4, --run-ahead, or Emulation Settings > Run Ahead) trims perceived input latency: each refresh commits one ordinary frame, snapshots it, silently executes future frames, presents the last, and restores the snapshot. It is guarded rather than reckless -- whenever a frame could touch host state the snapshot cannot rewind (writable media, live serial, recording, control clients, and more), the setting goes inactive with the reason shown in the menu, and a burst that cannot restore its anchor disables the feature rather than let speculative frames become the timeline.
  • AGA fidelity. Lisa's sprite serializer is now modeled in 35 ns samples, so SHRES sprites (SPRES=11) are distinct from hires ones and render the 4:4:2:1 width staircase photographed on a real A1200; both SHRES playfield halves survive priority and composition. Alice's wide-fetch address phases are modeled -- FMODE 10 page-mode duplication and unaligned aliasing included -- along with the per-resolution DMA ceilings, Lisa's banked BPLCON2.RDRAM palette readback and the one-hires-pixel COLOR write delay. The sparse vAmigaTS AGA sweep's two worst cases went from 16.179% and 70.931% mismatch to 0.000%, and the repo's AGA golden probes are now cross-checked against vAmiga 5.0b1 (the comparer tool is included).
  • The browser demo grows a second, writable drive. copperline.dev/try now wires DF1 and keeps floppy images writable in memory, so two-disk software installs and saves within the session.
  • Smaller things. The full build's menu offers Quit as its last row, holding Select quits on the standard gamepad layout, and calibration takes alternate direction bindings; the launcher's Storage, Video/Display and Serial pages were restructured (boot priority lives with its drive, the serial address is proper host and port fields); the CCP honors at_seconds on input.joy/input.mouse/input.analogue and the debugger disassembles 68020+ full-format extension words; and the user guide and debugger docs got a full audit pass with a completed table of contents.

Hardware accuracy fixes

  • The vertical display window is a set/reset flop. DIWSTRT.V sets it, DIWSTOP.V clears it, the frame's last raster line resets it (judged against the fixed standard line, not the programmed height), an empty window (DIWSTRT.V == DIWSTOP.V) never opens, and the flop's state survives save states and the frame wrap. LOF holds steady outside interlace, and the deinterlacer detects field-blind weave phase. Kang Fu's interlaced CD32 menus and Nexus 7's scene transitions render correctly; three new golden probes pin the behavior.
  • AGA sprite palette banks were transposed. Even sprites read their colors through BPLCON4's ESPRM nibble and odd/attached pairs through OSPRM -- Copperline had them swapped. Alongside it, a Copper fetch may ride the line-end refresh slot (only the CPU and blitter stall on it), and the blitter's deadline predictor mirrors the refresh carve-out. Both fixes carry golden probes (Nexus 7's credits were the witness).
  • A DDFSTRT rewrite is judged at its comparator commit clock. Moving DDFSTRT behind the beam mid-line means the comparator never matches and the line's fetch is dropped -- restarting a wide-FMODE fetch mid-unit desynced the planes (Microcosm's control panel). Pinned against vAmiga 5.0b1.
  • Dual-playfield sprite priority follows the winning playfield. The playfield that wins the pixel judges the sprite against its own BPLCON2 priority code, not a fixed field (the bin Chuck Rock 2's Junior hides behind).
  • COPJMP strobes fire on reads too, returning the floating-bus residue (Sleepwalker's jerky animation). And BPLCON1 scroll fills a bitplane-DMA block's first line from its own pre-window fetch, exactly as on interior lines -- the old suppression modeled a shifter history real Denise does not have (the black notch in Super Skidmarks' CD32 menu corners).
  • HAM8 stays on the history-dependent resolver, fixing a 0.17.0 regression where an indexed-cache shortcut broke HAM8 scenes.
  • Paula re-frames WORDSYNC reads on every DSKSYNC match, not just the first, and disk DMA armed while the drive has no disk or a stopped motor stays pending until real cells arrive, instead of completing against phantom data. CLXCON2 joins live collision decoding on AGA.
  • Akiko fixes: CDINTREQ reads return the raw request latches rather than the masked value (Jim Power's CD32 loader polls them raw), RX DMA wraps within its 256-byte response page, and plays into data tracks are refused with the real firmware's error. The bundled AROS ROM was refreshed three times this cycle with upstream fixes Copperline contributed: a cd.device interrupt-service fix, a ciab.resource handshake fix, and a dosboot stale-IORequest fix.
  • Picasso II BitBLT: the NOR and NAND raster-op encodings were transposed, the BLT address counters are left where the transfer stopped, and the source end derives from the source the mode actually reads (Bernie Innocenti).
  • SHRES half-pixel composition on the classic canvas was corrected as part of the sprite work.

Desktop, tooling and platform

  • Hardened media and save-state parsers. New fuzz targets exercise the untrusted media and save-state parsers, and the campaign's findings are fixed: CHD headers and compressed maps are bounded before the decoder acts on them, and the save-state reader never sizes an allocation from the stream's own length prefix.
  • Supply-chain CI. cargo deny enforces the dependency advisory and license policy, the declared minimum Rust version is built in CI, and scheduled dependency updates cover every workspace in the repo.
  • cputest in the exit status. The nightly WinUAE cputest conformance run reports its verdict through the runner's exit code, so a regression fails the workflow instead of hiding in the log.
  • m68k 0.11.6, with the browser demo's CI smoke test extended to driveless machines.

External contributions

  • Simon Dick (@sidick) built two of the cycle's headliners -- the copperline-import-uae converter and the Hayes/WiModem232 modem -- and rounded out the lide.device boards with the bundled boot ROMs, per-slot drive configuration and their launcher page.
  • Lee Hobson (@hobbo91) restructured the launcher's Storage, Video/Display and Serial pages: boot priority lives with its drive, SCSI rows align, the window and picture settings part ways, and a serial address is entered as proper host and port fields.
  • Bernie Innocenti (@codewiz) fixed the Picasso II's transposed NOR/NAND raster ops and its BLT address-counter semantics.

Installation

Browser (no install): copperline.dev/try

macOS (Homebrew):

brew tap copperlinehq/copperline https://github.com/CopperlineHQ/Copperline
brew install copperline

macOS (DMG): download Copperline-0.18.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.18.0-x86_64.AppImage below, then:

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

Windows: download and extract the portable Copperline-0.18.0-win-x64.zip (or Copperline-0.18.0-win-arm64.zip on ARM) below.

From source:

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

The bundled AROS boot ROM lets Copperline run out of the box, CD32 discs included. A real Kickstart ROM and disk, hard-disk, or CD images are still required to run most commercial Amiga software; these are not included. The FMV module ROM and the MT-32 ROMs are likewise yours to supply.

Full changelog: v0.17.0...v0.18.0