Skip to content

Copperline 0.12.0

Latest

Choose a tag to compare

@LinuxJedi LinuxJedi released this 18 Jul 05:57

Copperline 0.12.0 takes the emulator to new places: it now runs in the browser as a WebAssembly build, boots the big-box A3000 and A4000 with their onboard SCSI and IDE controllers, mounts host directories as fully writable AmigaDOS volumes, and grows a JSON-RPC control protocol for scripted live sessions. On the hardware side this release adds SCSI CD-ROM drives with CD audio, puts any controller device in either game port, plugs printers and audio samplers into the parallel port, and lands a round of chip-bus mirroring and display accuracy fixes. As always it is a hardware-behavior release: compatibility fixes model the underlying Amiga subsystems rather than individual titles.

Known issues

  • Windows: pressing Run on the configuration screen crashes 0.12.0 (#225). The Windows build quits silently the moment a machine is started from the launcher's Run button, whatever the settings, config, or ROM. Windows gives a program's main thread 1 MiB of stack where macOS and Linux give 8 MiB, and 0.12.0's machine construction outgrew that limit when invoked from inside the window event loop. The fix (#227, thanks @hobbo91) links Windows binaries with an 8 MiB main-thread stack and ships in the next release; until then, use 0.11.0 on Windows.

Compatibility notes

Save states from 0.11.0 do not load in 0.12.0: the serialized machine shape changed several times this cycle (sprite display latches, the guest battery clock, per-port controllers, the big-box chipsets), so the state format version moved from 27 to 32. Re-create snapshots after upgrading.

No config file changes are required; all new sections and keys are optional additions, and 0.11.0 configs continue to parse. One behavior change to note: the [input] joystick mode no longer has an "auto" keyboard fallback. The default is now "gamepad" (a physical pad drives the port, the keyboard passes through to the Amiga), and the cursor-key joystick mapping is an explicit opt-in with joystick = "keyboard". Existing configs with joystick = "auto" still parse (it maps to "gamepad").

Highlights

  • Copperline in the browser. A WebAssembly build of the emulator runs entirely client-side, and is live at copperline.dev/try: it boots the bundled AROS ROM out of the box, loads your own Kickstart and disk images from the page (or straight from URL query parameters), and supports drag-and-drop, a keyboard joystick, touch input with a trackpad-style mouse and an on-screen joystick, and fullscreen on iPhone Safari. A prefilled GitHub bug-report link captures the machine state when something goes wrong.
  • A3000 and A4000 machine profiles. The big-box Amigas boot, each off its own built-in disk controller: the A3000 brings the Super DMAC with the onboard WD33C93 SCSI bus, the A4000 the motherboard IDE port at $DD2020, and both the Ramsey memory controller, the Fat Gary bus controller, and a motherboard battery clock. The profiles are new and still incomplete, but both boot AmigaOS from their native controllers. A new rom_scsi_device_disable knob skips the ROM's scsi.device when its bus has no drives, saving the boot-time probe of an empty bus.
  • Writable host-directory mounts. The [[filesys]] HOSTFS volumes introduced in 0.11.0 are no longer read-only: the guest now reads and writes the host's files directly, with Amiga protection bits, comments, and datestamps persisted to .uaem metadata sidecars, host UTF-8 filenames mapped to AmigaDOS Latin-1, delete-protection honored, and ACTION_EXAMINE_ALL supported for modern directory scanners. The services board moved from A-line traps to MMIO registers, packets are routed by explicit mount unit, and the launcher gained a Host Mounts tab with per-mount read-write/read-only access control (readonly = true exports a directory write-protected).
  • Copperline Control Protocol. A JSON-RPC 2.0 interface over loopback TCP (--control, with the copperline-ctl client) drives live sessions from scripts and AI agents: breakpoints and stepping, input injection, media swaps, screenshots, save states, and streaming observability (frame, serial, interrupt, and media event subscriptions with bounded queues), plus runtime-bracketed instruction traces and waveform captures. --control-gui attaches the same server to a windowed session. See docs/debugger/control.md.
  • SCSI CD-ROM drives. A [scsi] unit path ending in .cue or .iso attaches a CD-ROM drive at that SCSI ID on any of the supported controllers. CD audio tracks play through the machine's audio output, and discs swap at runtime via the status-bar CD buttons, drag-and-drop, or --insert-cd-after.
  • Any controller in either game port. Both game ports now take any device, as on a real Amiga: mouse, joystick, cd32 pad, analogue paddles on the POT pins, or none ([input] port1/port2, --port1/--port2, hot-pluggable from the runtime menu). Scripted input flags aim at either port, --pot-after scripts analogue positions, and two-mouse and two-joystick setups get sensible host keyboard mappings.
  • Parallel-port peripherals. The Centronics port is now a modelled connector with pluggable devices: a printer that captures the raw strobed byte stream to a host file, and an 8-bit audio sampler fed from a host capture device -- the emulated equivalent of a classic parallel-port digitizer cartridge, usable from AudioMaster, ProTracker, OctaMED, and friends. The BUSY/POUT/SEL status lines are driven by the attached peripheral.
  • Deterministic guest clock. rtc_time seeds the battery clock to a fixed instant and ticks it in emulated time, so the guest boots to the same time on every run -- the way to test time-dependent guest software reproducibly. rtc_frozen pins the clock exactly, and the control protocol reads and sets it at runtime.

Hardware accuracy fixes

  • Chip bus. Chip RAM mirrors across the full chip window by Agnus address reach, so loaders that park the stack above the installed chip RAM see the mirror instead of a bus fault (an Action Replay-style boot guru was the regression example). Custom registers mirror into the empty chip-register decode space the way Gary resolves them, which un-sticks Kickstart 1.2's memory-sizing probe (yellow-screen boot).
  • Denise display path. OCS/ECS BPLCON1 scroll nibbles count lo-res pixels at every resolution, fixing a first-column wrap in hi-res Kickstart 2.05 boot screens; early hi-res DDF content renders inside an early display window (ECS overscan programs); and sprite DMA fetches land in a hardware-true display-latch view, so stale sprite rows can no longer leak into later frames.
  • Agnus identity. Every ECS Agnus reports the same chipset ID, matching real chips.
  • Filesystem/DOS ABI. ACTION_SEEK offsets are sign-extended, negative-offset seeks from big files now land where AmigaDOS expects.
  • POT circuit. The POT counter and pot-line models were finished alongside the analogue controller support.

Debugging and tooling

  • Waveform export. --waveform out.vcd captures chipset signals as a VCD trace for GTKWave, with --wave-trigger/--wave-duration windows, and the control protocol brackets captures at runtime.
  • GDB stub. Program-load (LoadSeg) events let a debugger break at the entry point of a program loaded inside the guest, and the stub survives client disconnects and reconnects.
  • Unmapped-access logging. [debug] log_unmapped logs every CPU access that no device decodes, scoped to an address window -- the quick way to find registers a guest expects that Copperline does not provide yet.
  • Docs site. The themed HTML manual now publishes to copperline.dev/docs on release, and a public AGENTS.md documents the headless workflow for AI coding agents.
  • The frame analyzer snaps a pre-display scrub selection to the frame end instead of showing a stale picture.

External contributions

  • Bernie Innocenti (@codewiz) contributed the A3000 and A4000 machine support (the Ramsey memory controller, the Fat Gary bus controller, the Super DMAC with the onboard WD33C93 SCSI bus, and the A4000 motherboard IDE), host-directory write support with .uaem sidecar metadata and Latin-1 filename mapping, ACTION_EXAMINE_ALL, the MMIO services-board rework with per-unit packet routing, the launcher Host Mounts tab and access control, unmapped-access logging, the uniform ECS Agnus chipset ID, the empty-bus scsi.device skip, and the ACTION_SEEK sign-extension fix.
  • Lee Hobson (@hobbo91) contributed the parallel-port audio sampler.
  • Thanks to @warpdesign for the upstream AROS boot-time optimizations: the bundled AROS boot ROM was rebuilt to include them, and the out-of-the-box no-Kickstart boot is now dramatically faster.

Installation

Browser (no install): copperline.dev/try

macOS (Homebrew):

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

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

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

Windows: download and extract the portable Copperline-0.12.0-win-x64.zip below. Note the known issue above: this build crashes when a machine is started from the configuration screen, so Windows users should stay on 0.11.0 until the next release.

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.11.0...v0.12.0