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 andbfprobe, 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 byreplay_speed = "normal" | "fast". The old key is still accepted at100or200- the only two values that ever meant something distinct - and refused otherwise.bridge_auto_cacheis 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