Copperline 0.15.0: an MT-32, your real hard disks, and sockets with nothing to install
This release is about peripherals. An emulated Roland MT-32, front panel included, now answers on the MIDI port, so game soundtracks written for it can play through it. The machine can be handed one of the host's real hard disks, such as a CF card in a reader, a USB drive or a drive on a SATA port, and reads the medium as its own. A new HostSocket board gives guest applications BSD sockets with no TCP/IP stack to install in the guest.
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. The pop-up menu is redesigned as a tree. The display gains integer scaling, a performance overlay and a choice of monitor bezels, including a 1084. The browser build gains a screen keyboard and performance work for phones. As always, 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 synthesizer engine is
mt32-rs,
grown from Munt. A front panel with the module's own buttons sits
under the display, and starting the module 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 a patch editor or librarian
needs. You supply the control and PCM ROM images, as with a
Kickstart.
Contributed by Lee Hobson (@hobbo91).
Your real hard disks
[[host_disk]], or 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 as it is, with its own Rigid Disk Block,
partitions and 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.
Several safeguards apply. The disk the host is running from is never offered or 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. 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 to a real host OS socket.
It needs no configuration, interface address or 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 is vendored, no C++ toolchain is
needed, 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 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, with no external library, and mount in any drive bay,
always write-protected. CD-ROM drives (CD32, CDTV and the SCSI
CD-ROM) now also take chdman v5 .chd images alongside
BIN/CUE and ISO.
A redesigned menu
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, and ticks show what is on.
Trailing dots are reserved for rows that open something. The menu
uses the same wording as the launcher, and
menu_scale = "2x" draws it double size. Contributed by
Lee Hobson.
The 1084 face
[display] bezel now chooses a monitor front: the 1084 or
the plainer classic frame. The 1084 is the Commodore monitor many
Amigas were sold with, and its moulding follows the face at every
strength. 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. Lee Hobson contributed the 1084 bezel style
and the choice of frames.
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 pixel-exact picture.
perf_overlay (or Cmd/Alt+P) shows emulated
fps, speed factor, per-frame cost, host utilization, 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. It presents on the 1084 monitor by default, and when iOS kills the page's audio session it rebuilds the audio stack in place. A performance pass for weak hosts adds render stride, identical-frame reuse, simd128 with a wasm-opt pass and fat LTO, and removes redundant render and presentation work. 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, so a plain 1.3 machine now boots 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). 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. 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, so an A4091 machine now boots SCSI out of the box (Bernie Innocenti).
- The surface re-syncs to the host window before every draw, so fullscreen transitions no longer leave a stale picture. The canvas follows a resize the platform adjusted, and the offscreen GPU tests serialize 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. Lee also contributed 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 only 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. 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. Only the display changes; the machine underneath is the same.
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 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