< all news

Copperline 0.15.0: an MT-32, your real hard disks, and sockets with nothing to install

This is the release where the machine's peripherals arrive. A Roland MT-32 now answers on the MIDI port - the whole module, front panel and all - so the game soundtracks written for it finally play the way their composers heard them. The machine can be handed one of the host's real hard disks - a CF card in a reader, a USB drive, a drive on a SATA port - and reads the medium as its own, RDB, partitions and all. And a new HostSocket board gives guest applications BSD sockets with no TCP/IP stack to install in the guest at all.

Underneath, the physical floppy path is rebuilt on FluxBridge, CopperlineHQ's own pure-Rust library, so real drives no longer need a vendored C++ library behind them. Around the machine, the pop-up menu is redesigned as a proper tree, the display gains integer scaling, a performance overlay and a choice of monitor bezels including an authentic 1084, and the browser build grows a screen keyboard and serious performance work for phones. As always it is a hardware-behaviour release: compatibility fixes model the underlying Amiga subsystems rather than individual titles.

An MT-32 on the MIDI port

[midi] midi_out = "mt32" routes the machine's MIDI port to an emulated MT-32 built into Copperline, mixed beside Paula's output - the synthesiser engine is mt32-rs, grown from Munt. It is the whole unit, not just the sound: a front panel sits under the display with the module's own buttons, starting it with them held reaches the service screens, ROM Play plays the demo songs the control ROM carries, and there is a choice of display styles. midi_in = "mt32" wires the module's MIDI OUT back to the machine, which is what a patch editor or librarian needs. The control and PCM ROM images are yours to supply, like a Kickstart.

Contributed by Lee Hobson (@hobbo91).

Your real hard disks

[[host_disk]] - and the launcher's new page - hands the machine one of the host's real disks on Linux, macOS and Windows. The Amiga sees the medium exactly as it is: its own Rigid Disk Block, its own partitions, its own filesystem. Nothing is copied, and no RDB is invented over a disk that has none. Attach points cover IDE master / slave and SCSI IDs 0-6, and --list-disks shows what the host has.

The safety model is strict: the disk the host is running from is never offered and never opened; the first open asks the host's permission (polkit, authopen, Administrator); the host's volumes on the disk are unmounted while the machine holds it; attaches are read-only unless writes are explicitly allowed; and a launcher-written fingerprint follows a disk to a changed device name only when the match is unambiguous. Contributed by Lee Hobson.

Sockets with nothing to install

The new HostSocket board gives guest applications a bsdsocket.library backed by a host-side TCP/IP stack - the library autoboots from the board's ROM, so there is nothing to install or boot in the guest. It takes the same backends as the A2065 (nat, bridge, loopback, none) plus an Amiberry-style "host" backend that hands each socket operation straight to a real host OS socket: zero configuration, no interface address, no privileges, and the guest's sockets go out on the host's own network identity. gethostbyname() resolves through the host OS resolver by default. Contributed by Simon Dick (@sidick).

FluxBridge

Physical floppy drives are now driven by FluxBridge, CopperlineHQ's own pure-Rust library, grown from a port of Rob Smith's FloppyDriveBridge - nothing vendored, no C++ toolchain, and Cargo.lock pins the exact revision. Reads stream each track as the platter turns it, a written track is not read back until the platter actually has it, and captured revolutions replay at real or double speed (replay_speed). This build drives Greaseweazle controllers; DrawBridge and SupercardPro configs are refused with an error saying what is available. Contributed by Lee Hobson.

Native IPF and CHD

IPF disk images are read by a direct CAPS decoder built into Copperline - no external library - and mount in any drive bay, always write-protected. CD-ROM drives (CD32, CDTV and the SCSI CD-ROM alike) now also take chdman v5 .chd images alongside BIN/CUE and ISO.

A menu that is a proper tree

The pop-up menu is redesigned as a tree you walk with keys or pointer through one cursor: categories open on hover, each level opens beside the row that opened it, ticks show what is on, and the trailing dots are reserved for rows that open something. It says the same words the launcher does, and menu_scale = "2x" draws it double size. Contributed by Lee Hobson.

The 1084 face

[display] bezel now chooses a monitor front: the 1084 - the monitor the Amiga shipped with, its moulding following the face at every strength - or the plainer classic frame. The CRT shader preset's face geometry now matches the 1084 tube datasheet, the picture meets the bezel's moulded insert, and overscan fills the glass like a real raster. The 1084 bezel style and the choice of frames were contributed by Lee Hobson.

Integer scaling and a performance overlay

[display] scaling = "integer" fits the largest whole-number multiple of the canvas, centred and point-sampled, in the spirit of WinUAE and Amiberry - pair it with pixel_aspect = "square" for a fully pixel-exact picture. perf_overlay (or Cmd/Alt+P) shows emulated fps, speed factor, per-frame cost, host utilisation, audio health and pacer slips in the corner of the display; captures never include it.

The browser build on phones

copperline.dev/try now draws an on-screen A600 keyboard for phones and tablets (or summons the device's own keyboard beside it), presents on the 1084 monitor by default, and survives iOS killing the page's audio session by rebuilding the audio stack in place. Under the hood a weak-host performance pass - render stride, identical-frame reuse, simd128 with a wasm-opt pass, fat LTO, and the removal of redundant render and presentation work - buys real headroom on modest hardware. Audio steps from its own clock when the browser starves animation frames, and under sustained load the picture degrades before the machine does.

A 1.3 machine that boots from a folder

0.14.0 mounted host-directory volumes under Kickstart 1.3; 0.15.0 boots AmigaDOS from them, shaping the boot node the way 1.3-proven autoboot drivers do. A plain 1.3 machine now boots straight into a Workbench that lives in a folder on the host. Contributed by Simon Dick.

Hardware accuracy fixes

  • Bitplanes 7 and 8 are fetched by the AGA lo-res fetch unit, so 8-bitplane lo-res displays get their full palette depth - the Pinball Fantasies CD32 table colours - and CPU palette pre-pass writes resolve against the live BPLCON3.
  • Scroll taps fold at the absolute-grid arrival phase in wide fetch modes, fixing the fold boundary - the Roots II AGA folder.
  • The HAM hold colour is carried across the DIW left edge, so a HAM display that opens early no longer shows a wrong-colour fringe - Lemmings 2's green edge.
  • The 68020 and the chip bus now share one clock timeline, with posted chip writes and a read-return sync clock, calibrated against timing measured on a real A1200 - and the earlier result-forwarding model is retracted on the same evidence. timing-test/ gains the real-A1200 ground-truth column, a chip-bus access-phase probe and bfprobe, a 68020 bit-field cost probe.
  • A 68020 memory bit field transfers at the width it spans, and the three-byte operand is sized by the port that answers it.
  • A track just written to a bridged real drive is not read back until the platter actually has it.
  • An undrained host pty no longer blocks the emulator (Bernie Innocenti).
  • A Z3660 rect copy honours its minterm (Bernie Innocenti).

Desktop, tooling and platform

  • The A4091 defaults to the open-source v42.39 autoboot ROM, bundled with its full third-party notices - an A4091 machine now boots SCSI out of the box (Bernie Innocenti).
  • The surface re-syncs to the host window before every draw - no more stale pictures after fullscreen transitions - the canvas follows a resize the platform adjusted, and the offscreen GPU tests serialise on one shared device helper, fixing a Windows access violation.
  • The 68k core moves to the published m68k 0.7 crate, and a pre-release hardening pass updates the dependency tree.
  • The bundled AROS ROM is refreshed to upstream master.
  • The web pipeline pins modern binaryen and smoke-loads the published bundle before it goes out, and MIDI tests are isolated from the host's real devices.

Contributed this cycle

This cycle, for the first time, most of the new code came from outside the project - external contributors wrote more lines than I did. That feels like a milestone worth marking.

Lee Hobson (@hobbo91) contributed four of the cycle's headline features: the MT-32 module with its front panel (and the mt32-rs engine port that powers it), real host hard disks on all three desktop platforms, the FluxBridge rewrite that takes the physical-floppy path pure-Rust, and the menu redesign - plus the 1084 bezel style and the choice of frames.

Simon Dick (@sidick) contributed the HostSocket board and its Amiberry-style host backend (including real MSG_OOB handling), wired diag_vec through for WASM plugin boards so they can autoboot, and made hostfs volumes bootable under Kickstart 1.3.

Bernie Innocenti (@codewiz) bundled the open-source A4091 boot ROM as the default, fixed the Z3660's rect-copy minterm, and stopped an undrained pty from blocking the emulator.

Compatibility notes

Save states from 0.14.0 do not load in 0.15.0. The serialized machine shape changed several times this cycle, so the state format version moves from 44 to 50. Re-create snapshots after upgrading.

Physical floppy configs may need a small edit. The move from the vendored FloppyBridge library to FluxBridge changes the bridge surface:

  • This build drives Greaseweazle controllers. A config asking for bridge = "drawbridge" or "supercardpro" is refused at parse time with an error naming what is available (FluxBridge carries those protocols for the future, but Copperline compiles in the drivers it supports and the launcher offers exactly those).
  • bridge_speed (a percentage) is replaced by replay_speed = "normal" | "fast". The old key is still accepted at 100 or 200 - the only two values that ever meant something distinct - and refused otherwise.
  • bridge_auto_cache is gone, and a config carrying it is refused. The bridge now serves a captured track while the platter is still turning it, which is what the cache was for.

One key changed shape, compatibly: [display] bezel is now a named choice - "off", "1084" or "classic" - because there is more than one frame to choose. The old boolean form is still accepted, and true means the 1084. And one default changed: an A4091 SCSI board with no ROM path now boots the bundled open-source A4091 ROM instead of requiring you to supply an EPROM image; machines that set an explicit ROM path are unaffected.

copperline.dev/try now fronts the picture with the 1084 monitor by default - a display change only; the machine underneath is unchanged.

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.

Copperline also has a Patreon. Nothing there buys a feature or a place in the queue - monthly support goes towards development time, real hardware to measure the emulator against, and the code-signing subscriptions that would let the downloads open without a warning.

- Andrew Hutchings (LinuxJedi) · linuxjedi.co.uk