Copperline 0.12.0: the browser build and the big boxes
0.12.0 is out, six days after 0.11.0. 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 are now writable, and a JSON-RPC control protocol drives live sessions from scripts. Alongside those come 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, 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. It is compiled to WebAssembly and runs entirely client-side, so nothing you load leaves your machine. You can pick a Kickstart ROM and disk images from the page, drop them 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. iPhone Safari needed its own fullscreen fallback. If something goes wrong, a prefilled GitHub bug-report link includes the machine state in the report.
The big boxes boot
There are new A3000 and A4000 machine profiles, each booting from its
own built-in disk controller. The A3000 brings the Super DMAC with the
onboard WD33C93 SCSI bus, and the A4000 the motherboard IDE port at
$DD2020. Both have the Ramsey memory controller, the Fat Gary bus
controller and a motherboard battery clock. The profiles are new and
still incomplete. A new rom_scsi_device_disable option
skips the ROM's scsi.device when its bus has no drives, which saves the
boot-time probe of an empty bus.
Bernie Innocenti (@codewiz) contributed the big-box support: Ramsey, Fat Gary, the Super DMAC and the A4000 IDE. Bernie's contributions to this release go well beyond that.
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, and 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.
This is also Bernie's work, as is 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, and 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. It covers breakpoints
and stepping, input injection, media swaps, screenshots and save states.
It also streams frame, serial, interrupt and media event subscriptions
with bounded queues, and brackets instruction traces and waveform
captures at runtime. --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 as well
as 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, or none.
Devices are hot-pluggable from the runtime menu, and the POT counter
model was finished to support the paddles. Scripted input flags can
target either port, and two-mouse and two-joystick setups get sensible
host keyboard mappings.
One behaviour change: the [input] joystick mode no longer
has an "auto" keyboard fallback. The default is now
"gamepad", where a physical pad drives the port and the
keyboard passes through to the Amiga. 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 captures the raw strobed byte stream to a host file. An 8-bit audio sampler, fed from a host capture device, is the emulated equivalent of a parallel-port digitizer cartridge and is usable from AudioMaster, ProTracker, OctaMED and similar programs. The attached peripheral drives the BUSY / POUT / SEL status lines. The sampler was contributed by Lee Hobson (@hobbo91).
Hardware accuracy fixes
- Chip RAM mirrors across the full chip window according to 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. That un-sticks Kickstart 1.2's memory-sizing probe, which caused 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. Sprite DMA fetches land in a display-latch view that matches the hardware, so stale sprite rows 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.- The GDB stub reports program-load (LoadSeg) events, so a debugger can break at the entry point of a program loaded inside the guest. The stub also survives client disconnects now.
[debug] log_unmappedlogs every CPU access that no device decodes, scoped to an address window. It is a 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 can now be dragged and dropped 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, so the default no-Kickstart boot is much faster. Thanks to @warpdesign for those.
Compatibility notes
Save states from 0.11.0 do not load in 0.12.0. The serialized machine
layout 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. The one
thing to check is the joystick = "auto" behaviour change
described above.
Get it
Builds for macOS, Linux and Windows are on the release page, and the Homebrew tap is updated. Or skip the download: copperline.dev/try runs the same emulator.
- Andrew Hutchings (LinuxJedi) · linuxjedi.co.uk