Copperline 0.12.0: the browser build and the big boxes
0.12.0 is out, six days after 0.11.0, and it takes the emulator to some new places. The whole machine now compiles to WebAssembly and runs client-side in your browser, the big-box A3000 and A4000 boot AmigaOS from their onboard SCSI and IDE controllers, the host-directory mounts introduced in 0.11.0 have gone writable, and a JSON-RPC control protocol drives live sessions from scripts. Alongside those: SCSI CD-ROM drives with CD audio, any controller in either game port, printers and audio samplers on the parallel port, and a round of chip-bus and display accuracy fixes.
As always, it is a hardware-behaviour release: when something doesn't run, the fix models the underlying Amiga subsystem rather than special-casing the title.
Copperline in your browser
Open copperline.dev/try and the same cycle-driven core boots the bundled AROS ROM in a few seconds - compiled to WebAssembly and running entirely client-side, so nothing you load leaves your machine. You can pick a Kickstart ROM and disk images from the page, drop them straight onto the window, or point URL query parameters at them. There is a keyboard joystick, touch input with a trackpad-style mouse and an on-screen joystick, and fullscreen - including on iPhone Safari, which needed its own fallback. And when something does go wrong, a prefilled GitHub bug-report link captures the machine state so the report arrives ready to investigate.
The big boxes boot
New A3000 and A4000 machine profiles, each booting 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.
The big-box support - Ramsey, Fat Gary, the Super DMAC and the A4000 IDE - was contributed by Bernie Innocenti (@codewiz), who had a big hand in this release well beyond it.
Host mounts go writable
The [[filesys]] volumes from 0.11.0 were read-only; now
the guest reads and writes the host's files directly. Amiga protection
bits, comments and datestamps persist to UAE-style .uaem
sidecars, host UTF-8 filenames map to AmigaDOS Latin-1,
delete-protection is honoured, and ACTION_EXAMINE_ALL is
implemented for modern directory scanners. The launcher gained a Host
Mounts tab with per-mount access control, and readonly =
true still exports a directory write-protected when that is
what you want. Also Bernie's work, along with the move of the services
board from A-line traps to MMIO registers underneath it.
A protocol for driving the machine
Copperline began as an emulator you could hand to an AI agent; the
Copperline Control Protocol gives that idea a stable wire format.
--control opens a JSON-RPC 2.0 server on loopback TCP
(with a copperline-ctl client alongside) for 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, so a script can drive the machine
you are watching. The details are in the
control protocol guide.
CD-ROM on the SCSI bus
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. Plain
.iso images now load in the CDTV and CD32 drives too, not
just CUE/BIN.
Any controller in either port
Both game ports now take any device, as on a real Amiga:
mouse, joystick, a cd32 pad,
analogue paddles on the POT pins - whose counter model
was finished for the occasion - or none, hot-pluggable
from the runtime menu. Scripted input flags aim at either port, and
two-mouse and two-joystick setups get sensible host keyboard
mappings.
One behaviour 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 and the
keyboard passes through to the Amiga - and the cursor-key joystick is
an explicit opt-in with joystick = "keyboard". Existing
configs with "auto" still parse.
The parallel port
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. The sampler was contributed by Lee Hobson (@hobbo91).
Hardware accuracy fixes
- Chip RAM mirrors across the full chip window by Agnus address reach, so a loader that parks its stack above the installed chip RAM sees the mirror instead of a bus fault - an Action Replay-style boot guru was the regression example. Custom registers likewise mirror into the empty chip-register decode space the way Gary resolves them, which un-sticks Kickstart 1.2's memory-sizing probe (a yellow-screen boot).
- 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; and sprite DMA fetches land in a hardware-true display-latch view, so stale sprite rows can no longer leak into later frames.
- Every ECS Agnus reports the same chipset ID, matching real chips.
ACTION_SEEKoffsets are sign-extended, so negative-offset seeks from big files land where AmigaDOS expects.
Debugging and tooling
--waveform out.vcdcaptures chipset signals as a VCD trace for GTKWave, with trigger and duration windows, and the control protocol brackets captures at runtime.- The GDB stub reports program-load (LoadSeg) events, so a debugger can break at the entry point of a program loaded inside the guest - and the stub now survives client disconnects.
[debug] log_unmappedlogs 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.rtc_timeseeds the battery clock to a fixed instant and ticks it in emulated time, so time-dependent guest software can be tested reproducibly;rtc_frozenpins the clock exactly.- Disk images now drag-and-drop onto the window - in the desktop app as well as the browser.
- The manual now publishes as a themed HTML site at copperline.dev/docs on every release, and a public AGENTS.md documents the headless workflow for AI coding agents.
- The bundled AROS boot ROM was rebuilt with upstream boot-time optimizations - thanks to @warpdesign for those - so the out-of-the-box no-Kickstart boot is dramatically faster.
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, and 0.11.0 configs continue to parse, with the
joystick = "auto" behaviour change described above the
one thing to check.
Get it
Builds for macOS, Linux and Windows are on the release page, and the Homebrew tap is updated. Or skip the download entirely: copperline.dev/try is the same emulator.
- Andrew Hutchings (LinuxJedi) · linuxjedi.co.uk