< all news

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_SEEK offsets are sign-extended, so negative-offset seeks from big files land where AmigaDOS expects.

Debugging and tooling

  • --waveform out.vcd captures 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_unmapped logs 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_time seeds the battery clock to a fixed instant and ticks it in emulated time, so time-dependent guest software can be tested reproducibly. rtc_frozen pins 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