EmuNews

Copperline

LinuxJedi/Copperline

15 tracked updates · latest 5 days ago

GitHub

Copperline 1.1.0

v1.1.0 release
Release notes · 13 files

Copperline 1.1.0 is the first feature release of the 1.x series. Hard drives can now run at the speed of the period drives each Amiga shipped with. The MMU-less 68EC030, 68EC040 and 68EC060 are new CPU choices. The JIT is much faster on fast-RAM code and heavy disk I/O, and has a new "fastest" speed. A500 CIA, interrupt and bus timing are corrected against measurements of a real A500. It also includes every fix made on the 1.x branch since 1.0.1.

Before upgrading

  • Netplay peers must all run 1.1.0. Players and spectators need the same build.
  • Recreate RetroArch save states after updating the core. The core's states carry a build fingerprint that includes the release version.
  • Desktop save states from 1.0.x still load. The CIA chunks are migrated to their new layout. A resumed 1.0.x state continues under the corrected timing, so it can drift from what 1.0.x would have produced (a factory A500 state from 1.0.1 still renders byte-identical frames). States saved by 1.1.0 do not load in 1.0.x, which reports that the state comes from a newer Copperline.
  • Emulated timing has moved. The CIA, interrupt and bus corrections change when some events happen on every machine. Headless scripts and --expect-screenshot images tuned to an exact frame may need new timestamps or new captures.
  • A copperline.toml beside the executable now boots on its own. Startup checks --config, then ./copperline.toml, then a copperline.toml beside the executable (or beside Copperline.app, or beside the .AppImage), then the saved default. If you keep a file with that name there, it now takes over from the saved default. --factory skips it.
  • Relative media paths are also looked for in the [paths] media folders. The working directory is still tried first, so every path that worked before finds the same file.
  • The bundled AROS ROM leaves 1,776 bytes less free memory when a program starts.
  • Going back to 1.0.x: 1.0.x refuses configuration files that use the new keys and values: [cpu] speed, the 68EC030, 68EC040 and 68EC060 models, the drive timing and spin_up keys, and [[drive_profile]] tables.

Period hard-drive timing

Until now every hard-disk transfer finished within the access that started it. timing = "period" on [ide], [scsi] or [lide] (or --hd-timing period) models the drive each machine shipped with instead, so a hard-disk Amiga loads, boots and benchmarks at that drive's speed:

Machine Drive
A600 Conner CP2024
A1200 Conner CP2064
A4000 Seagate ST3144A
A3000, and an A2091 in a big-box machine Quantum LPS 52S
A590 Seagate ST125N
A4091 Seagate Hawk 1LP
lide boards WD AC2120

The model covers command overhead, a seek curve fitted to each datasheet's track-to-track, average and full-stroke times, rotational latency from the platter's position, zoned media rates with track and cylinder skew, read-ahead, write caching, spin-up, standby and head parking. The 22 built-in profiles come from the manufacturers' manuals; --list-drive-profiles prints them, timing also takes a profile id, and [[drive_profile]] tables add your own, optionally based on a built-in one. spin_up = true also models the power-on spin-up. Each controller reports "not ready" the way its hardware does: IDE through BSY and DRQ, the WD33C93 (A2091, A590, A3000) through REQ, and the A4091's 53C710 by stalling its SCRIPTS processor. The launcher's Emulation page has Hard drive timing and Drive spin-up rows. The default stays instant, which behaves exactly as before. See drive timing.

68EC030, 68EC040 and 68EC060

The three MMU-less "EC" parts are selectable as [cpu] model / --cpu and in the launcher. They keep their family's caches, stock clock and 32-bit bus, and each answers the MMU instructions as its silicon does: the 68EC030's access control unit (AC0, AC1, ACUSR and PTEST matches), the 68EC040's access control registers, and the 68EC060's no-op MMU instructions. The 68EC040 and 68EC060 have no FPU, so fpu = true is refused for them; the 68EC030 can still take a 68881/68882.

copperline-import-uae now imports these parts and the 68EC020, and three older bugs in its CPU mapping are fixed: WinUAE and Amiberry 68030 and 68060 configurations no longer import as a 68020 or 68040, FS-UAE configurations import their CPU at all, and FS-UAE's A1200 preset imports as the 68EC020 it is.

JIT speed

  • A "fastest" CPU speed. [cpu] speed = "fastest" (--cpu-speed fastest) with the JIT lets the CPU clock rise while the host has time to spare, keeping the chipset and emulated time in step with real time, like WinUAE's "Fastest possible". It never drops below clock_mhz. It trades determinism for speed, so runs with it are not reproducible; the default, fixed, is unchanged.
  • Fast RAM and ROM code runs much faster. The JIT's direct memory window now works with the 68020-68060 cache models on, follows the bank the code is running from, and covers every RAM and ROM region rather than one bank. Code in fast RAM and ROM runs in batches up to the next hardware event. On an Intel MacBook Pro in fastest mode, the batching change alone took benchwork-040 on an A4000/040 from 1.95x to 2.43x the speed of a real 25 MHz 68040.
  • Heavy hard-disk I/O no longer slows the machine down. copperhf.device and the SCSI disk commands move each request's sectors in one host read or write, and copy the buffer into guest memory in one go. 40 emulated seconds of 512 KB reads under Kickstart 3.2 took 154 seconds before and 20 after; under the JIT, AROS writes went from 502 seconds to 42.
  • Cache control instructions (MOVEC to CACR, CINV, CPUSH) now take effect before the next instruction fetch under the JIT, not at the end of the batch, so code rewritten in place and then cleared from the cache no longer runs stale instructions.

#796 has the details. Thanks to @dlundqvist for the report and for testing the changes as they landed.

A500 timing

@HakatomOy measured a PAL A500 with test ROMs on OneROM and a logic analyzer, and corrected Copperline against the results:

  • CIA timer start, reload and readback, the serial port, the timer outputs on port B, and interrupt latching, which now holds until the ICR is read.
  • How the CPU samples interrupts, and its clock while stopped in STOP.
  • When a CPU write to chip RAM lands relative to the DMA that follows it in the same bus cycle.
  • Playfield collision masks and visibility.

Each change comes with the measurements and new test programs (timing-test/a500-*.asm, cia-movem-irq) that check it on every build.

Configuration and launcher

  • A copperline.toml beside the executable boots straight into its machine, skipping the launcher, much like WinUAE's default.uae. An installation can carry its own default machine. See configuration.
  • A relative ROM, disk or CD path that is not in the working directory is looked for in the matching [paths] folder: roms, floppies, harddrives or cds. rom = "KICK31.ROM" finds roms/KICK31.ROM.
  • The launcher's Save dialog has a Save button that writes back to the file you last loaded or saved, alongside Save As, Save default and Reset default. Save As and Load open in that file's folder.
  • File dialogs remember the folder they were last used in for each kind of file (configurations, floppies, hard drives, CDs, ROMs, save states, WHDLoad games and so on), for the session.

RTG display

  • RTG screens now scale to whole multiples of the host display under integer scaling. A 640x480 board screen reached only 1x on a 1920x1080 display, and now reaches 2x (#828).
  • Menus and panels open over RTG screens without dropping the board to a lower-resolution picture, and the performance overlay, on-screen messages and REC badge appear over RTG screens, at the picture's corners (#816).

Input

  • The captured mouse moves the pointer the same distance at any window size and display scale. Before, enlarging the picture made the pointer move further for the same hand movement (#830).
  • On X11 and Windows, switching to the window with a keyboard shortcut could leave the Amiga holding a key and repeating it. The key presses the system replays when a window gains the focus are now ignored (#817).

Windows installers

Windows downloads now include per-user installers for x64 and ARM64, alongside the portable ZIPs. The installer adds a Start menu shortcut and an optional desktop shortcut, updates an existing installation in place, and its uninstaller keeps your configurations, saves and media. Like the ZIPs, it is not code-signed.

Headless runs and debugging

  • --eject-disk-after SECS DFN ejects a floppy on schedule and leaves the drive empty, through the same path as the status-bar eject button. It works in --script files, and --record-input now records ejects made from the status bar or the control protocol. Thanks to @warpdesign.
  • The control protocol's new disk.fault.* methods inject deterministic faults into image-backed drives: dropped, torn or reordered writes, ignored flushes, stale or corrupt reads, media errors, delays and simulated power cuts. They cover copperhf, PCMCIA, IDE, SCSI, plain ADF floppies and (for reads) CDs, and the policies survive save states. See disk fault injection. Thanks to @sidick.

Fixes

  • Skeleton Krew on the CD32 jumped its scenery one 64-pixel step left, with black or wrapped columns at the right, while scrolling. On ECS and AGA a DDFSTRT below $18 only arms the fetch, which starts at $18; the wide-fetch scroll took its phase from the register instead (#836). Thanks to @warpdesign for the report.
  • HOSTFS volumes with the default boot priority and the HOSTCLIP clipboard device were offered as boot devices on Kickstart 3.x, so an A3000 with no disk booted to a shell instead of the insert-disk screen (#834). Thanks to @dlundqvist.
  • Old-format Nero (.nrg) CD images failed to mount or read the wrong lead-out, because their cue addresses are BCD-coded. UFO: Enemy Unknown on the CD32 now boots from one.
  • The A2065's LANCE sees the board's RAM only with address line 15 set, and the CSR3 byte-swap bit is applied to frame data, as on a real A3000 with an Ameristar A2065. Thanks to @tinic.
  • The m68k CPU core moves to 0.15.0. Its fixes include the 68030 MMU's address translation cache, MC68000 DIVU/DIVS timing and overflow, and extended-precision and FMOVE rounding.

AROS ROM

The bundled AROS ROM is rebuilt from upstream master 1fef6c415e. WaitTOF() works after a program takes over the hardware, OwnBlitter() and DisownBlitter() preserve their registers as Kickstart 3.1 does, more blits go through the blitter, CD32 cd.device keeps its read-ahead and takes word arguments for CD_PAUSE and CD_PLAYTRACK, PowerPacker and Imploder self-decrunching programs run from the Shell, and AROS no longer prints a boot trace to the serial port. See assets/aros/README.md for the full list.

Other changes

  • Security updates: wasmtime 36.0.20 (RUSTSEC-2026-0379, -0380 and -0424), rustls-webpki 0.103.16 (RUSTSEC-2026-0382 and others), ctutils 0.4.5 (RUSTSEC-2026-0385), and the build-time zstd crates (RUSTSEC-2026-0391, -0398, -0403 and -0410). chd moves from the patched fork to its 0.3.5 release, then to 0.4.0.
  • The PDF manual includes the new disk fault injection chapter.
  • Dependency updates: m68k 0.15.0, arboard, iroh, cc and others.

Thanks to the patrons whose support pays for the hardware used to check the emulation; to @HakatomOy, @sidick, @warpdesign and @tinic for code; to @dlundqvist and @warpdesign for reports and testing on GitHub; and to everyone who reported problems on Discord.

Downloads

  • macOS: universal DMG for Apple Silicon and Intel, macOS 14.2 or newer. It is ad-hoc signed, not notarized; see the included first-launch instructions.
  • Windows: installers and portable ZIPs for x64 and ARM64.
  • Linux: x86-64 AppImage, command-line tools archive and a separate bridged-network helper archive.
  • RetroArch: core ZIPs for Linux x86-64, macOS Apple Silicon and Windows x86-64. Install them manually using the libretro guide.
  • Manual and checksums: the PDF manual and Copperline-1.1.0-SHA256SUMS.txt are attached below.
  • Browser: try Copperline without installing it.

Homebrew users can run brew update followed by brew upgrade copperline. For a new installation:

brew tap copperlinehq/copperline https://github.com/CopperlineHQ/Copperline
brew trust copperlinehq/copperline
brew install copperline

Homebrew 7 and later load formulae only from taps you have trusted; on an older Homebrew, leave out the brew trust line.

Source builds require Rust 1.95 or newer: cargo build --release --locked. The open AROS boot ROM is included; supply your own commercial game media and any required Kickstart ROMs.

Full changelog: v1.0.1...v1.1.0

Copperline 1.0.1

v1.0.1 release
Release notes · 11 files

Copperline 1.0.1 is the first maintenance release for 1.0. Most of it fixes problems reported against 1.0.0: an AGA display fetch error, a blitter race on fast CPUs, warm reboots on the A3000 and A4000, the 68060 FPU at reset, the copperhf hard-disk driver, and a window-resize hang on Windows. Menu settings are now remembered between launches, and screenshots save the picture as you see it.

Before upgrading

  • Netplay peers must all run 1.0.1. Players and spectators need the same build.
  • Recreate RetroArch save states after updating the core. The core's states carry a build fingerprint that includes the release version. Desktop .clstate files still load: the save-state format has not changed, and a 1.0.0 state resumes byte-for-byte as it does in 1.0.0.
  • Settings changed from the menu are now saved. In 1.0.0 they lasted for the session. Now a change made from the menu, a hotkey or the status bar is written into your saved default configuration, which is created if you do not have one. Sessions started with --config, a ./copperline.toml or --factory leave their files alone, and scheduled headless runs never write. See settings the menu remembers.
  • The screenshot shortcuts have changed. Cmd+S / Alt+S and the status-bar camera now save the picture as it is displayed (see below). Native 1:1 screenshots have their own shortcut, Cmd+Option+S on macOS and Ctrl+Alt+S on Linux and Windows. The Video Settings -> Native Screenshot Button item is gone. [recording] native_screenshot_button is still accepted, so configurations load, but it is ignored. --native-screenshots still selects native captures for --screenshot-after and --expect-screenshot.
  • Native screenshots of interlaced screens are now full height. A 640x512 laced screen saves at 640x512, not 640x256. Expectation images made with --native-screenshots on an interlaced screen need re-capturing.
  • --mouse-to-after and --pen-after coordinates now match --screenshot-after pixels, as the documentation always said. 1.0.0 used the coordinates of the unframed field, so scripts tuned to that may need new targets. The control protocol's input.mouse_to and input.pen keep their capture.screenshot coordinates.
  • The 68060 starts with its FPU disabled, as on real 68060 boards, and 68060.library turns it on. Without that library a 68060 system runs with no FPU, even with fpu = true.
  • Going back to 1.0.0: 1.0.0 refuses configuration files that use the new [display] track_display or [audio] floppy_sounds_set keys.

AGA bitplane fetch stop

AGA's Alice keeps the hardwired $D8 bitplane fetch stop, just as ECS Agnus does. The stop is lifted only while BEAMCON0 selects HARDDIS or VARBEAMEN, or BPLCON0 selects super-hires or ultra-hires. Copperline treated every AGA machine as if HARDDIS were set and let the fetch run to $E0. A program that sets DDFSTOP past $D8 then fetched an extra word on every line, and its picture slanted further down the screen. Pacmania under WHDLoad on an A1200 is one example. A new test program checks the stop and each control that lifts it.

Blitter on 68020 and faster CPUs

BBUSY drops with the last cycle of a blit, two colour clocks before the final word is written. A 68020 or faster CPU polling DMACONR can start setting up the next blit inside that gap. Copperline let a BLTCON0 write there cancel the pending write, so the final word was lost, and for a one-word, one-line blit the whole result. The end-of-blit register write-back could also overwrite registers already set for the next blit. Now BLTCON0 cancels the pending write only while BBUSY is set, and the registers are written back once, when BBUSY drops. A 68000 is too slow to hit the gap. This fixes bitplanes missing from small graphics.library copies on an A4000 with Kickstart 3.2 (#573). Thanks to @codewiz for the report.

Warm reboots on the A3000 and A4000

Fat Gary's COLDBOOT flag is set when the power comes on and stays clear after that. Copperline set it again on every keyboard reset and RESET instruction, so Kickstart treated each warm reboot as a cold start. The Kickstart 3.2 boot menu's device choice was ignored, and anything meant to survive a reboot, such as RAD: and resident modules, was lost. COLDBOOT now survives the reset line and is set only at power-on. The A600 and A1200 were not affected.

68060 FPU

Kickstart builds the 68881/68882/68040 form of an empty FPU state frame into each new task. A 68060 with its FPU enabled reads that frame at a different size, so the task starts at the wrong address: Kickstart 3.1 showed a black screen and AmigaVision's SetPatch crashed. Real 68060 boards disable the FPU on every reset and 68060.library enables it, and Copperline now does the same. LC060 and EC060 configurations (fpu = false) report the right processor ID and really have no FPU, where before they ran with a working one. The m68k core is updated to 0.14.6, which fixes the 68060's FSAVE/FRESTORE empty frame size and runs FINT/FINTRZ natively (#771). Thanks to @HakatomOy for the report and for pointing to the upstream fix.

copperhf hard disks

Three fixes to the bundled copperhf.device, all found on an A3000 with Kickstart 3.2.3:

  • HDToolBox 3.1 found no drives when unit 0 was empty, and stopped after unit 0 otherwise. Opening an empty unit now fails with the same error scsi.device returns.
  • With the JIT on a 68040 or 68060, WaitIO could return before a request finished, which could overwrite AbsExecBase and crash the machine. Queued requests are now marked in progress before the device is told about them.
  • A partition with a four-character name could fail to mount from 32-bit motherboard RAM: it showed in the boot menu but not in Workbench. The driver built two names without a closing NUL.

Screenshots

Cmd+S / Alt+S and the camera button now save the picture as it is displayed, at its displayed size, with the current crop, scaling, tint, CRT shader, bezel and stickers. Open menus and overlays are included, and the status bar and window margins are not. Native 1:1 screenshots moved to Cmd+Option+S / Ctrl+Alt+S and Recording -> Save Native Screenshot (1:1), and now weave both fields of an interlaced screen into one full-height image. See saving screenshots.

Settings

  • Menu, hotkey and status-bar changes are written through to the saved default, as described above. This covers the controller ports, joystick input mode, autofire, mouse sensitivity, rewind, run-ahead, the warp limit, floppy speed, clipboard sharing, and the Video and Audio settings. Only the settings you change are written.
  • The launcher's Run and Save no longer drop settings it has no rows for, such as rewind, autofire rate, ports 3 and 4, clipboard and recording settings, screen centring, PCMCIA, ZZ9000 and battery-clock keys.
  • The launcher says why a configuration file it opened is invalid, instead of quietly using factory settings.
  • An unreadable or broken saved default no longer stops Copperline from starting. It logs a warning and starts with the built-in defaults, leaving the file as it is. A broken --config or ./copperline.toml is still an error.

Track display and floppy sound sets

Two small additions, both off by default:

  • [display] track_display = "cylinder" makes the status bar's drive counter show the cylinder and side, so track 81 reads 40.1. Video Settings -> Track Display switches it while running, and the launcher has a Track display row. Thanks to @mnemo70 for the request (#777).
  • [audio] floppy_sounds_set plays a WinUAE or FS-UAE floppy sound sample set instead of the synthesized drive sounds. Put a set's drive_*_NAME.wav files in Documents/Copperline/Floppy Sounds and give its name, or give a path to where WinUAE or FS-UAE keeps it. Copperline ships no sets. The launcher's Audio page has a Floppy sound set row, and copperline-import-uae converts the WinUAE and FS-UAE settings. See audio settings.

Input

  • A fast high-resolution mouse could move the pointer backwards. The Amiga's mouse counters are 8 bits wide, so a movement of 128 counts or more between two reads wraps around. Host mouse motion is now limited to 63 counts per axis per frame. Scripted, control-protocol and netplay motion are unchanged.
  • While you hold a key or mouse button in warp mode, and for 0.75 seconds after, Copperline runs at normal speed, so a key tap no longer repeats and double-clicks work. Warp stays engaged.
  • --mouse-to-after waits for the pointer to move one field at a time, since software reads the mouse once per vertical blank, and no longer gives up on targets it can reach.

Windows window resizing

On Windows, resizing the main window could hang Copperline and slow down the whole computer (reported with an AMD GPU). Frames queued for the old window size were retried at that size forever. Copperline now drops a frame the window has been resized past. Earlier builds can avoid the problem with COPPERLINE_THREADED_PRESENT=0 or WGPU_BACKEND=dx12.

Other changes

  • Dropping a ZIP file onto the window starts it with WHDLoad only if it contains a WHDLoad slave. Other ZIPs, such as a zipped ADF, are inserted as floppy disks (#778). Thanks to @mnemo70.
  • The A2065 Ethernet board honours its station address, multicast filter and promiscuous mode, as the Am7990 LANCE does, instead of accepting every frame. Thanks to @tinic.
  • Source-level debugging in VS Code works with programs built by AmigaPorts amiga-gcc with -g, which pack their DWARF debug sections into one hunk. Thanks to @tinic.
  • The mouse wheel and trackpad scroll the WHDLoad game library.
  • WHDLoad 20.1: whdload.de replaced its WHDLoad download with version 20.1, which 1.0.0's game library refused to install because the checksum had changed. 1.0.1, tools/fetch-whdload.sh and the Homebrew formula accept the new archive.
  • Security updates: ruzstd 0.9.1, through a patched chd, for RUSTSEC-2026-0344 (a crafted CHD image could make Copperline allocate gigabytes and abort), rustls 0.23.46 for RUSTSEC-2026-0346 to 0349, and wasmtime 36.0.18. zip moves to 9.0.4 because every 8.x release was yanked.
  • The Flatpak build manifest is removed. It was never published on Flathub; Linux releases are the AppImage, the tools archive and source builds.
  • Dependency updates: m68k 0.14.6, tokio, serde_json, sha2, syn, zerocopy and others.

Thanks to the patrons whose support pays for the hardware used to check the emulation, to @tinic for code, to @codewiz, @HakatomOy and @mnemo70 for reports on GitHub, and to everyone who reported problems with 1.0.0 on Discord.

Downloads

  • macOS: universal DMG for Apple Silicon and Intel, macOS 14.2 or newer. It is ad-hoc signed, not notarized; see the included first-launch instructions.
  • Windows: portable ZIPs for x64 and ARM64.
  • Linux: x86-64 AppImage, command-line tools archive and a separate bridged-network helper archive.
  • RetroArch: core ZIPs for Linux x86-64, macOS Apple Silicon and Windows x86-64. Install them manually using the libretro guide.
  • Manual and checksums: the PDF manual and Copperline-1.0.1-SHA256SUMS.txt are attached below.
  • Browser: try Copperline without installing it.

Homebrew users can run brew update followed by brew upgrade copperline. For a new installation:

brew tap copperlinehq/copperline https://github.com/CopperlineHQ/Copperline
brew install copperline

Source builds require Rust 1.95 or newer: cargo build --release --locked. The open AROS boot ROM is included; supply your own commercial game media and any required Kickstart ROMs.

Full changelog: v1.0.0...v1.0.1

Copperline 1.0.0

v1.0.0 release
Release notes · 11 files

Copperline 1.0.0 is the first stable release. It follows two weeks of testing of 1.0.0-rc.1 and is the 23rd release since the source went public on 14 June.

This release adds Smart framing and native 1:1 screenshots, more control over where and how the window opens, VHD hard-disk images, a fix for AGA sprites that use scan-doubling, and a Check for updates button that only contacts GitHub when you press it.

Copperline 1.0 at a glance

  • Machines: A1000, A500, A500+, A600, A1200, A3000, A4000, CDTV and CD32, with OCS, ECS and AGA chipsets and 68000 to 68060 CPUs, FPUs and MMUs.
  • Accuracy: the CPU and custom chips run on one colour-clock timeline, with the chip bus shared out cycle by cycle. Timing is checked against a real A1200, A4000 and CD32, and 45 test programs are compared pixel for pixel on every change.
  • Ready to run: the open AROS ROM is bundled, as are ROMs for the A2091, A4091 and IDE boards, the CD32 FMV module and the HRTMon freezer. WHDLoad packages and Amiga programs boot directly.
  • Media and expansion: floppy images including IPF and SCP, real drives through a Greaseweazle, IDE and SCSI hard disks, CDs, host folders, RTG graphics cards, Ethernet, bsdsocket.library without a TCP/IP stack, and built-in MT-32 (with your own ROMs) and General MIDI synthesizers.
  • Playing: save states, rewind, run-ahead, CRT shaders and a 1084 monitor front, gamepads, and rollback netplay for up to four players with up to eight spectators.
  • Developing: a debugger beside the live display with reverse stepping, a frame analyzer, GDB, VS Code source debugging, profiling, a control protocol and an MCP server.
  • Everywhere: macOS, Windows and Linux builds, a browser version and a RetroArch core.

The manual covers all of it.

Before upgrading

  • macOS 14.2 or newer is required, and the app now says so. Copperline has needed macOS 14.2 since 0.16.0 because of the Core Audio functions it uses, but the app declared 11.0, so older systems launched it and it crashed. macOS now refuses to open it with the standard "requires a newer version of macOS" message. Homebrew requires Sonoma.
  • Netplay peers must all run 1.0.0. Players and spectators need the same build.
  • Recreate RetroArch save states after updating the core. The core's states carry a build fingerprint that includes the release version. Desktop .clstate files from 0.20.0, 0.21.0 and 1.0.0-rc.1 still load.
  • Volume is no longer saved in save states. Loading a state, rewinding, run-ahead and netplay rollback now keep your current volume, mono and stereo settings and audio filter choice.
  • The window title has changed. By default it now shows the version, machine and boot ROM, and no longer includes the git commit. Window-manager rules that match the old title need updating; [display] title sets your own.
  • Guest writes to $BFFF00-$BFFF07 now print debug output (see below). This follows [emulation] uaelib, which is on by default; set it to false to turn off both the uaelib trap and the debug ports.

Upgrading from 0.21.0 or earlier? Also read the 1.0.0-rc.1 notes. The netplay protocol changed, high-density floppy images are refused, some command-line combinations are now errors, and --run PROG --exit-on-return on its own runs without a window.

Smart framing

The TV overscan setting crops the picture to roughly what a television showed, but software that placed its picture a little off-centre lost part of it at the edges. The CD32 boot logo is one example. The new Smart framing keeps the TV crop and moves it sideways to follow the display window the program sets up. It moves by at most eight lo-res pixels, only after the position has held for 25 frames, and stays put through blank frames, so the picture does not wander. Manual centring still works on top of it.

Combined with autocrop and integer scaling, Smart fits the whole detected display at the largest whole-pixel scale, using the full captured raster rather than the TV crop. Odd multiples are now possible: with the status bar hidden, a 320x200 PAL picture fits at 5x on a 1920x1080 screen.

[display]
overscan = "smart"
autocrop = true
scaling = "integer"

Video Settings -> Framing switches between TV, Smart and Full overscan while a program runs, and the launcher's Overscan row offers the same choices. The browser version has Smart framing too. TV remains the default. See display settings.

Native 1:1 screenshots

Recording -> Save Native Screenshot (1:1) saves the Amiga's own pixels, cropped to the display window, before any scaling, aspect correction, shaders, deinterlacing or tint. A lo-res 320x256 screen saves as 320x256, and a hires screen at 640x256. Mixed-resolution frames keep the finest detail present, and RTG screens save at the board's resolution.

  • Camera button: Video Settings -> Native Screenshot Button ([recording] native_screenshot_button) makes the status-bar camera and Cmd+S / Alt+S save native screenshots.
  • Headless: --native-screenshots applies to --screenshot-after and --expect-screenshot.
  • Control protocol: capture.screenshot {"native": true}, also available as the MCP tool's native option.

Window size, position and monitor

  • --window-scale ([display] window_scale) opens the window at 0.5 to 4 times its normal size.
  • --maximized ([display] maximized) opens a normal window maximized. The last of --maximized, --full-screen and --windowed wins.
  • --monitor ([display] monitor) picks the display the window opens on and goes fullscreen on, by number or name. --list-monitors prints the choices. The launcher has a Host monitor row.
  • --window-position X Y ([display] position) places the window relative to that monitor. The launcher has a Window position field.

On Wayland the compositor decides where windows go, so only the fullscreen monitor can be chosen there. See the configuration guide.

The window title now shows the machine and the boot ROM, identified by name for known Kickstarts. [display] title takes a template with {app}, {version}, {machine}, {rom} and {hash} placeholders. On macOS, About Copperline in the application menu opens Copperline's own About panel.

VHD hard disks

Fixed and dynamic VHD images, the format WinUAE and Virtual PC create, now attach read/write on every hard-disk controller: IDE, SCSI, lide, copperhf, PCMCIA and SF2000. Before, a .vhd was opened as a raw image, so a fixed VHD showed its footer to the Amiga as an extra sector and a dynamic one read as garbage. Writes to a dynamic VHD allocate blocks the way qemu and WinUAE do.

Images are recognised by their contents rather than their name. Differencing VHDs are refused with instructions for merging them into their parent, and VHDX is not supported. Thanks to @boingball for the report.

Bundled A2091 ROM 42.41

The bundled open A2091/A590 ROM uses Fast RAM that the controller can reach for its bounce buffers, falling back to Chip RAM, and overlaps the next read with copying the previous one. Bounce buffers are needed when the destination is odd-aligned or above 16 MB, such as accelerator or Zorro III memory. Before, they always came from Chip RAM. A transfer that runs past the block-number limit of the shorter SCSI commands now uses a longer command instead of wrapping around to the start of the disk. Thanks to @luvwagn for the report.

AGA sprite scan-doubling

With SSCAN2 set in FMODE, Lisa ignores the top bit of a sprite's horizontal start, so its comparator matches twice on each line, 256 lo-res pixels apart. A sprite appears at each match that comes after its DMA data has arrived: at the second match only if the data was late for the first, or at both. Copperline showed every such sprite once, at the first match, whether or not its data had arrived. It now models both matches, using the FMODE value and sprite state at each beam position, and collision detection sees the same positions. This fixes the corrupted first-stage background in Castlevania AGA on the CD32. Thanks to @warpdesign for the report.

For developers

  • WinUAE debug ports. Guest code can print formatted messages by writing arguments to $BFFF00 and a format-string pointer to $BFFF04, as under WinUAE. Messages appear in the terminal, the debugger console and the control protocol's event.debug stream. Emulated timing does not change. See memory-mapped debug output.
  • Debugger console. The console keeps the last 500 guest debug lines from before it was opened, and shows new lines straight away while the machine is paused.
  • Profiling. The buffer of pending instruction samples is capped at 262,144 entries. Dropped samples are reported, and a Bartman profile export refuses to write an incomplete capture.
  • WASM board plugins can write back to their own file resources through a new resource_write import, enabled in the board manifest. Thanks to @sidick.

Check for updates

The About panel has a Check for updates button. Pressing it sends one request to GitHub's latest-release API with a Copperline/<version> user agent, and offers to open the release page if a newer version is out. Nothing is checked at startup or in the background, and nothing is stored. The privacy policy describes it.

Bundled AROS ROM refresh

The bundled AROS ROM is rebuilt from upstream master 949d6834f8 with no local patches. A program started with --run on a 1 MB A500 or a 2 MB A1200 has about 35 KB more free memory than with rc.1. Other upstream changes that reach the ROM include:

  • cia.resource now lays out its base like Kickstart, so programs that patch CIA interrupt vectors in place work.
  • Exec honours SetFunction() patches of its scheduler entry points.
  • CD32 pad reading and cd.device audio playback are fixed.
  • Graphics, Intuition, DOS, file system and console fixes.

Other changes

  • Click the speaker icon in the status bar to mute and unmute. Thanks to @warpdesign.
  • [input] middle_click_release, also on the launcher's Input page, lets the middle mouse button release a captured mouse. It is off by default, so middle clicks still reach the Amiga.
  • The launcher explains greyed-out IDE and CD rows more clearly. Thanks to @sidick.
  • Create Image no longer offers .chd for new hard disks, which it writes as raw HDF images.
  • Standalone game bundles made with tools/publish now remember their Framing and Autocrop choices between launches, and declare macOS 14.2 as their minimum.
  • wasmtime 36.0.16 fixes RUSTSEC-2026-0316. This affects only WebAssembly plugin boards on the desktop.
  • The m68k CPU core is updated to 0.14.3, with an interpreter fix and faster JIT code.
  • Dependency updates: iroh 1.3.0, wat, cc, syn and zerocopy.

Thanks to the patrons whose support pays for the hardware used to check the emulation, to @mmoroca, @boingball, @luvwagn and @warpdesign for this cycle's reports, to @sidick and @warpdesign for code, and to everyone who has tested, reported problems and contributed on the way to 1.0 (listed in CREDITS.md).

Downloads

  • macOS: universal DMG for Apple Silicon and Intel, macOS 14.2 or newer. It is ad-hoc signed, not notarized; see the included first-launch instructions.
  • Windows: portable ZIPs for x64 and ARM64.
  • Linux: x86-64 AppImage, command-line tools archive and a separate bridged-network helper archive.
  • RetroArch: core ZIPs for Linux x86-64, macOS Apple Silicon and Windows x86-64. Install them manually using the libretro guide.
  • Manual and checksums: the PDF manual and Copperline-1.0.0-SHA256SUMS.txt are attached below.
  • Browser: try Copperline without installing it.

Homebrew users can run brew update followed by brew upgrade copperline. For a new installation:

brew tap copperlinehq/copperline https://github.com/CopperlineHQ/Copperline
brew install copperline

Source builds require Rust 1.95 or newer: cargo build --release --locked. The open AROS boot ROM is included; supply your own commercial game media and any required Kickstart ROMs.

Full changelog: v1.0.0-rc.1...v1.0.0

Release notes · 11 files

This is the first release candidate for Copperline 1.0. If testing does not turn up problems that need a second candidate, the next release will be 1.0.0.

This cycle brings three- and four-player netplay on the desktop, debugger watchpoints on device registers with a timed trace of CD32 drive commands, a refreshed AROS ROM, and a review of the whole manual against the program, which also found and fixed a few mismatches in the program itself.

Please try your usual games, demos and configurations with it. Anything that worked in 0.21.0 and does not work here is exactly what a release candidate is for: open an issue with the configuration and the software involved.

Before upgrading

  • Netplay peers must all run 1.0.0-rc.1. The wire protocol moved to version 3 to carry up to four players, so a 0.21.0 peer cannot join.
  • Recreate RetroArch save states after updating the core. The core's states carry a build fingerprint that includes the release version. Desktop .clstate files from 0.20.0 and 0.21.0 still load; states from 0.19 and earlier do not.
  • High-density floppy images are refused. Copperline's drives are double-density units. A 22-sector UAE extended ADF used to be squeezed into one double-density revolution and crash the guest; it is now refused when inserted, with a message saying why. The RetroArch core accepts only 880 KiB ADFs.
  • Some command-line combinations are now errors instead of being silently ignored: --control with --expect-screenshot; --insert-cd-after with --benchmark-until, --gdb or --control; --exit-on-return with --gdb or --control; and --pen-after under netplay.
  • --run PROG --exit-on-return on its own now runs without a window, unthrottled, as the documentation already described. Add --control-gui or --gdb-gui to keep a window.

Three and four players over netplay

Desktop netplay now seats two to four players. Players three and four use the parallel-port four-player adapter, just as they would sitting at one Amiga: two switch joysticks, no mouse and no CD32 buttons.

Player 1 hosts and everyone else connects to the host, which passes each player's input on to the others. Only the host needs to be reachable, and all players must be connected before the game starts. This works over direct IP and over the encrypted Internet connection, and spectators can still watch.

  • Launcher: the host sets Players, and Local player offers ports 3 and 4.
  • Command line: the host passes --netplay-players 3 or 4 and may repeat --netplay-peer once per guest, or leave it out to admit anyone with the session code.
  • The host's machine needs the adapter fitted with a joystick in each socket in use. A printer or sampler on the parallel port is still refused.

Browser games stay two-player, since a web page has no parallel port. See the netplay guide.

Watch device registers and trace the CD32 drive

The existing watchpoints compare memory before and after each instruction, which cannot work for a device register: reading one has side effects, such as popping a byte from Akiko's command port or clearing a CIA interrupt flag. MMIO watches are taken at the CPU's own bus access instead. Every data access to the watched range is recorded with its address, size, value, direction, PC, frame, beam position and colour clock. They work on Akiko, the CIAs, Gayle, Zorro boards, custom registers and RAM.

A new CD command trace records each packet the CD32 sends its drive: the decoded command, sector range, speed, reply and outcome, with emulated timestamps for when the host issued it and when the drive parsed, executed, answered, delivered its first sector and finished. It is a host-side record and never feeds back into the emulation.

Both are available everywhere the debugger is:

  • Debugger window: MMIO on the Break tab, and a new CD tab listing commands newest first.
  • Console: MWATCH (or MW) and CDTRACE.
  • Headless: COPPERLINE_DBG_MMIO=ADDR[:LEN[:CLASS]] and COPPERLINE_DBG_CD=1.
  • Control protocol and MCP: break.add {"kind": "mmio", ...}, a non-stopping mmio event stream, cd.trace and event.cd.

An armed MMIO watch switches the CPU to its precise loop and disables run-ahead, like the other debugger hooks. See the debugger window guide.

Bundled AROS ROM refresh

The bundled AROS ROM is rebuilt from upstream master f1ec64f45a with no local patches. Every part of the AROS pull request the previous refresh carried is now merged upstream. Changes that reach the ROM include:

  • Hires screens are no longer sheared by four bytes per line. AROS programmed DDFSTOP one fetch unit past the hardware stop at $D8.
  • Interrupt handlers restore INTENA's master bit, so a program that enables interrupts itself under Disable() no longer freezes at the first vertical blank.
  • DOS packets and loaded program hunks come from the top of free memory, keeping the low block contiguous for older software.
  • Screen user Copper lists, CD32 cd.device playback and reads, Kickstart-compatible OpenLibrary version handling, afs-handler read-ahead, ATAPI handling, and Shell and console fixes.

The ROM banks have more room: the extension bank had 682 bytes spare and now has about 15.5 KiB. Free memory at boot is 800 bytes lower than with the previous ROM.

The new memory placement exposed two Copperline bugs, both fixed: --coverage could count the next command's instructions as the program's, and the VS Code profiler command sometimes captured no frames.

Documentation checked against the program

Every chapter of the manual, all 238 custom-register pages and copperline.example.toml were checked against the source. Wrong defaults, labels, offsets and paths are corrected, and flags, configuration keys, control-protocol methods, console commands, launcher pages and environment variables that had never been documented now are. The manual also gains a table of built-in boards, the WASM socket ABI, a Cargo features table and the test-asset workflow. Linux instructions now say plainly that Copperline is not on Flathub: the AppImage is the download, and the Flatpak is something you build yourself.

The review also found places where the program disagreed with the hardware or with itself:

  • The debugger decoded ADKCON bit names one bit too high (WORDSYNC is bit 10), showed KILLEHB on bit 10 (that is ZDCTEN; KILLEHB is bit 9), and always hid bit 1 of DDFSTRT and DDFSTOP. The DDF decode now follows the fitted Agnus revision, using the same mask as the fetch sequencer.
  • --help lost duplicate MT-32 entries and has corrected screenshot, .zip, gamepad-mouse and lide entries.
  • The shortcuts panel no longer overflows and lists the filter, gain and sensitivity keys it was missing. The audio filter message now says On or Off, as the menu does.
  • The control protocol's MCP tool descriptions and schemas now match their handlers.

Other changes

  • Detaching a serial port could briefly show the guest a port asserting DSR, CTS and CD. The lines are now released before the port is marked detached.
  • The launcher's Create Floppy page still makes high-density images for other emulators and real Amigas, and now warns that Copperline's own drives will refuse them.
  • Dependency updates: toml, toml_edit, ringbuf, wasmtime 36.0.15, ureq and wat.

Thanks to the patrons whose support pays for the hardware used to check the emulation, to everyone who has reported problems and tested fixes, and to everyone who has contributed code on the way to 1.0 (listed in CREDITS.md).

Downloads

  • macOS: universal DMG for Apple Silicon and Intel. It is ad-hoc signed, not notarized; see the included first-launch instructions.
  • Windows: portable ZIPs for x64 and ARM64.
  • Linux: x86-64 AppImage, command-line tools archive and a separate bridged-network helper archive.
  • RetroArch: core ZIPs for Linux x86-64, macOS Apple Silicon and Windows x86-64. Install them manually using the libretro guide.
  • Manual and checksums: the PDF manual and Copperline-1.0.0-rc.1-SHA256SUMS.txt are attached below.
  • Browser: try Copperline without installing it.

Homebrew users can run brew update followed by brew upgrade copperline. For a new installation:

brew tap copperlinehq/copperline https://github.com/CopperlineHQ/Copperline
brew install copperline

Source builds require Rust 1.95 or newer: cargo build --release --locked. The open AROS boot ROM is included; supply your own commercial game media and any required Kickstart ROMs.

Full changelog: v0.21.0...v1.0.0-rc.1

Release notes · 11 files

Copperline 0.21.0 adds spectators to Netplay, connects four local controllers on desktop and in RetroArch, and reduces the work needed to put each frame on screen. It also fixes file-picker crashes and changes two defaults that could upset otherwise working games.

Before upgrading

  • Clipboard sharing is now off by default. It fits an extra autoconfig board, which changes the Amiga's memory layout. That caused a hang in Lotus Esprit Turbo Challenge under 0.20. Enable it explicitly with --clipboard or [clipboard] share = true when you want it. An existing configuration that explicitly enables sharing keeps doing so.
  • The CD32 FMV cartridge is now optional. A stock CD32 starts with an empty cartridge slot. To use the bundled open FMV ROM, select Fit in the launcher's FMV row or set top-level fmv = true. A named fmv_rom still fits that ROM. Configurations that relied on the old implicit default need this setting for FMV playback; ordinary CD32 games no longer inherit the cartridge's changes to memory layout and boot timing.
  • Use matching builds for Netplay, including spectators. Desktop connects to desktop; browser connects to browser. There are still two active players. RetroArch uses its own Netplay system.
  • Recreate RetroArch save states after updating the core. The libretro payload now checks a fingerprint that includes the release version and rejects mismatched builds. Desktop states retain the chunked format introduced in 0.20; states from 0.19 and earlier still cannot load. Disk images and saves made inside games are unaffected.

Invite people to watch

Netplay hosts can admit up to eight spectators. They can join before the game begins or while it is running, receive the host's setup and media, and replay the confirmed input history to catch up. Watching runs a local emulated Amiga, so there is no video stream to encode. A long-running game takes longer to catch up with.

  • Desktop: choose the spectator count in the host's Netplay settings. Internet hosts generate a separate spectator invitation; watchers choose Watch and paste that code. Direct IP spectators connect to the host's existing UDP port with the session code.
  • Browser: Host game provides a separate spectator link with copy, share and QR controls. Open that link and choose Watch game. The host can continue using the local machine while waiting for player 2; the shared game cold-boots when that player connects.
  • Spectators follow the players a few frames behind, verify checkpoints, and receive synchronized floppy changes. They cannot send input or change disks. A spectator leaving or losing the connection does not stop the players.

See the Netplay guide for setup, supported configurations and limits. Mixed operating systems and browser engines still need qualification.

Four local controllers

The desktop now reads four independent gamepads through the two Amiga game ports and the parallel-port joystick adapter. Select Multitap (4 joysticks) in the launcher, set both native ports to Joystick, and use gamepad input mode. The cursor-key and numeric-keypad mappings can fill spare player slots. Unplugging a controller releases its input without moving the other players between ports.

The libretro core now exposes the adapter as controller ports 3 and 4. In RetroArch's Quick Menu → Controls, select Parallel-port joystick (multitap) for those ports. The adapter sockets start disconnected. This adds local four-player control for games such as Super Skidmarks; it does not expand Copperline's built-in Netplay beyond two players.

RetroArch's save-state buffers are also sized to the loaded machine instead of reserving 64 MiB for every session. Typical one-floppy A500 and A1200 sessions reserve about 14 MiB and 18 MiB respectively, reducing rollback memory use and checksum work. Larger configurations and WHDLoad volumes need more space.

Display and desktop fixes

  • Less presentation overhead. Repeated TV-aperture calculations and row copies have been removed, eligible pictures use a GPU drawing path, and a worker handles texture upload and presentation. Core changes avoid redundant DMA decoding and Copper WAIT checks while preserving the emulated timeline.
  • A VSync switch. Video Settings → VSync changes presentation live and is saved as [display] vsync. It defaults on. Turning it off can reduce latency where supported, at the cost of possible tearing; PAL output still has an uneven cadence on a mismatched display refresh rate.
  • An optional lower-resolution backing texture. [display] hidpi_texture = false reduces texture and copy work on high-density displays. Integer scaling keeps its appearance; smooth scaling can show differences in fine interlaced detail. Screenshots and recordings are unaffected.
  • Wayland presentation scheduling now accounts for pending frames and presentation feedback, with additional Linux smoke coverage.
  • Windows renderer selection tries accelerated OpenGL when automatic selection finds a CPU renderer. Explicit WGPU_BACKEND and WGPU_ADAPTER_NAME choices are respected.
  • Native file pickers: Windows dialogs keep the window responsive, and macOS uses sheets to avoid the event-loop crash when resizing a picker on macOS 27. Picker audio suspension and resume handling are consistent across the launcher and runtime menus.
  • Clean shutdown on macOS: closing the window or quitting no longer deadlocks while the presentation worker releases the window.
  • Windows Explorer launches no longer open an unwanted console; command-line use retains terminal output. The executable also gains its application icon and version resources.
  • Menu improvements: PCMCIA gets a dedicated submenu, Emulation and Cartridge settings move to more useful positions, and Netplay's enable control uses the same stepper style as neighbouring settings.

Other changes

  • New Kickstart 1.3 regression coverage for copperhf.device verifies FFS partitions with a period-compatible FastFileSystem. The reported crash came from using a newer filesystem binary that requires libraries absent from 1.3. The documentation now explains the mismatch and records the board's product ID.
  • Dependency updates include the rustls fix for RUSTSEC-2026-0285. The existing egui/pixels/wgpu renderer versions remain together.
  • Parallel directory-image tests now allocate unique temporary directories, avoiding collisions between tests.

Thanks to Lee Hobson (@hobbo91) for the file-picker and menu work, Simon Dick (@sidick) for the copperhf investigation and documentation, and everyone reporting problems, testing builds and supporting Copperline.

Downloads

  • macOS: universal DMG for Apple Silicon and Intel. It is ad-hoc signed, not notarized; see the included first-launch instructions.
  • Windows: portable ZIPs for x64 and ARM64.
  • Linux: x86-64 AppImage, command-line tools archive and a separate bridged-network helper archive.
  • RetroArch: core ZIPs for Linux x86-64, macOS Apple Silicon and Windows x86-64. Install them manually using the libretro guide.
  • Manual and checksums: the PDF manual and Copperline-0.21.0-SHA256SUMS.txt are attached below.
  • Browser: try Copperline without installing it.

Homebrew users can run brew update followed by brew upgrade copperline. For a new installation:

brew tap copperlinehq/copperline https://github.com/CopperlineHQ/Copperline
brew install copperline

Source builds require Rust 1.95 or newer: cargo build --release --locked. The open AROS boot ROM is included; supply your own commercial game media and any required Kickstart ROMs.

Full changelog: v0.20.0…v0.21.0

Release notes · 11 files

Copperline 0.20.0 adds two-player Netplay, a rebuilt debugging workspace, and a libretro core for RetroArch. There are also new ways to save and share a session, more hardware to connect, and a substantial change to how save states survive future releases.

Before upgrading

  • Recreate save states from 0.19 and earlier. The old flat state format has been replaced with individually versioned subsystem chunks. This is a one-time break at this release; the new format can tolerate many future field changes and migrate individual chunks. It does not promise that every future state will load in every build. Disk images and ordinary in-game saves are unaffected.
  • Netplay needs matching builds. Desktop connects to desktop; browser connects to browser. Those two transports cannot connect to each other, and RetroArch uses its own netplay system. Mixed operating systems and browser engines have not yet been qualified. Native Netplay currently supports two players; the new four-player adapter is a separate local input feature.
  • Clipboard sharing is enabled in normal desktop sessions, and it changes the machine. It can stop some software from running. Text can move between the host and the Amiga through clipboard.device, but the bridge is a unit of the Copperline services board, so switching it on puts an autoconfig board on the Zorro chain that your configured Amiga does not otherwise have. Kickstart binds that board at boot, and every memory allocation after it lands somewhere else. Most software cannot tell. Some can: Lotus Esprit Turbo Challenge loads and then sits on a black screen with no music, because in the shifted layout the Copper reads a list the game has not written yet and finds a word that decodes as a write to INTENA, which switches off the interrupt the game is waiting for. If a game or demo hangs or misbehaves under 0.20.0 but worked in 0.19, turn clipboard sharing off and cold-boot: Input Settings → Share Clipboard, [clipboard] share = false, or --no-clipboard. It is already off in headless and Netplay sessions, and #683 makes it off in every session unless you ask for it.
  • Paula's output and the bundled AROS ROM have changed. Audio now uses a band-limited mixer. The refreshed AROS ROM uses less guest memory and includes the upstream fix for the process-stack minimum. Deterministic captures made with an older build may differ.

Play together

Desktop Netplay offers Internet invitations with encrypted connections, NAT traversal and relay fallback, as well as direct UDP connections. The host transfers the machine configuration, ROMs and supported game media to the joining player, and both machines cold-boot together. The host can change floppy disks during play: both peers pause, verify the replacement and resume at the same emulated frame. IPF protection-track timing is preserved during transfer. Display and volume preferences stay local.

Browser Netplay has invitation links, QR sharing and automatic setup transfer. Both players run the Amiga locally; WebRTC carries setup data and input, with TURN fallback on the hosted page. DF0 and DF1 swaps and ejections are synchronized. Two-mouse games are supported on desktop and in the browser, including two-player Lemmings.

Both implementations use rollback: predict late input, restore an earlier machine snapshot when necessary, then replay to catch up. See the Netplay guide for setup and supported configurations, or watch two-player Lemmings over the Internet.

A new debugging workspace

The Amiga display, debugger, Frame Analyzer and Console now share the main window. Use the Play / Debug switch, or Cmd+B on macOS and Alt+B on Linux/Windows. Drag the divider to resize the display and inspectors; CPU registers, disassembly and memory panes also resize independently.

The inspectors use a shared GPU-rendered UI with selectable text, normal copy/paste, scrollbars and a bundled Hack font. Memory can be edited in place in either hex or ASCII. Tabs indicate which inspectors are open and which are capturing, keep their state when hidden, and can be closed individually. Following an address from the Frame Analyzer opens the corresponding memory or disassembly view. Returning to Play keeps the workspace ready for the next visit.

Stepping now advances a CPU parked in STOP to the interrupt that wakes it. The disassembler also fixes opcode collisions, instruction lengths, model-specific opcodes and absolute-word address formatting.

Copperline in RetroArch

The new libretro core supports A500, A1200 and CD32 machines; PAL and NTSC; floppy and CD playlists; WHDLoad packages; keyboard, mouse, joystick and CD32-pad input; and portable save states. AROS is embedded, so the core boots without additional ROM files.

RetroArch disk controls handle swapping. Floppy writes are kept in the frontend's save directory, and CD32 EEPROM is exposed as save RAM. The memory map supports RetroArch's memory viewer and cheat search. Two-gamepad rollback Netplay uses RetroArch's own session controls.

Download the platform's libretro ZIP below and install the core manually. It is not yet in RetroArch's Online Updater. The prebuilt cores cover Linux x86-64, macOS Apple Silicon and Windows x86-64; other targets can be built from source. See the libretro guide.

Saves, clips and automation

  • Save-state thumbnails. The Load State browser shows the picture, machine, media and emulated time for each snapshot. The menu and Cmd/Alt+Shift+L both open it. copperline-ctl state-info reads that metadata without restoring the machine and can extract its thumbnail.
  • GIF clips. Save the last few seconds from the desktop's recording ring, or schedule a reproducible clip with --gif-after and --gif-seconds.
  • Typed input and screenshot checks. --type-after types text into the guest. --expect-screenshot compares a scheduled frame against a PNG, writes actual and difference images on failure, and returns a failing exit status.
  • Guest return codes and coverage. --run --exit-on-return returns the AmigaDOS result to the host shell. --coverage writes lcov line and function coverage from the guest's debug information. Guest code can also end a run through uaelib ExitEmu.
  • Find the first divergence. copperline-ctl diverge compares two builds or configurations, narrows a mismatch to its first frame, then steps through it to locate a differing instruction, memory byte or timing result.
  • CLI tools in the downloads. copperline-ctl and copperline-import-uae now ship in the desktop release packages alongside the emulator.

Hardware, audio and fixes

  • A parallel-port four-player joystick adapter, with ports 3 and 4 available to scripted input as well as local controllers.
  • Light pen and light gun input, with beam-position latching through the board's Agnus connection.
  • An A600/A1200 PCMCIA slot with SRAM and CompactFlash/IDE cards, card insertion/ejection and the Gayle register interface.
  • CHD hard-disk images, extending compressed-image support beyond CDs.
  • Real host serial ports connected to Paula's UART.
  • The SF2000 accelerator's Zorro II SD controller, contributed by Matt Harlum, with SD-over-SPI command handling and a boot-ROM interface.
  • Cleaner Paula audio. Output transitions are band-limited onto the host mixer grid; mixer phase follows the emulated clock, and mix headroom follows the reconstruction kernel.
  • Storage and display fixes. copperhf.device DMA now keeps the CPU's data cache coherent. Intel Mac fullscreen border corruption and desktop Netplay display stalls during continuous mouse motion are fixed. Redundant blitter overlay and indexed-colour table work has been removed.
  • Updated CPU and boot ROM. m68k 0.13.0 and AROS master 311afcc057 plus the memory-footprint reduction from AROS PR 1179. The former local 8 KiB process-stack patch is now upstream.

Thanks to Matt Harlum (@LIV2) for the SF2000 SD controller, Simon Dick (@sidick) for the copperhf cache-coherency fix, and Volker Schwaberow (@vschwaberow) for the disassembler corrections. Thanks also to everyone testing Copperline and supporting its development.

Downloads

  • macOS: the universal DMG supports Apple Silicon and Intel. It is ad-hoc signed, not notarized; see its README for first-launch instructions. Homebrew users can run brew update && brew upgrade copperline.
  • Linux: the x86-64 AppImage, a tools archive containing copperline-ctl and copperline-import-uae, and a separate network-helper archive for bridged networking.
  • Windows: portable ZIPs for x64 and ARM64.
  • RetroArch: the three libretro ZIPs described above.
  • Manual: the PDF below, or the online documentation.
  • Checksums: Copperline-0.20.0-SHA256SUMS.txt covers all ten release downloads.
  • Browser: copperline.dev/try, with no installation.

For a fresh Homebrew installation:

brew tap copperlinehq/copperline https://github.com/CopperlineHQ/Copperline
brew install copperline

Building from source requires Rust 1.95 or newer:

cargo build --release --locked
./target/release/copperline

Copperline includes the open AROS boot ROM. Supply your own commercial game media and any required Kickstart ROMs; they are not included.

Full changelog: v0.19.0…v0.20.0

Copperline 0.19.0

v0.19.0 release
Release notes · 6 files

Copperline 0.19.0 is the developer release. An Amiga program can now be debugged at source level from Visual Studio Code -- breakpoints, stepping, Step Back, variables, custom-chip registers and source-mapped CPU profiles -- through a new Debug Adapter Protocol server, and Bartman's Amiga C/C++ extension runs on Copperline with its visual CPU/DMA, Copper, bitmap and blitter profiler fed by the emulator's own per-colour-clock bus captures. Around that: an MCP server so AI coding agents can drive a live machine, a WinUAE-compatible uaelib trap with KPrintF and on-screen debug overlays, an HRTMon freezer cartridge, CPU chip-bus wait attribution and live Kickstart symbols in the Frame Analyzer, warp boot, and WinUAE save-state import. Away from the debugger: open-source replacements for the CD32 FMV cartridge ROM (with a Video CD player) and the A2091/A590 boot ROM, Simon Dick's emulator-native copperhf.device hard-disk controller, uncapped integer scaling with per-axis pixel-aspect fitting and display-window autocrop, --run on a bare Kickstart 1.3, and a bundled AROS ROM refresh. As always it is a hardware-behavior release: the Paula floppy, Akiko CD, Agnus display-fetch and 68030/68040 timing fixes below model the underlying subsystems rather than individual titles.

Compatibility notes

Save states from 0.18.0 do not load in 0.19.0. The uaelib trap, the freezer cartridge, the copperhf board, the Akiko command buffer and the floppy read-shifter framing all changed the serialized machine shape, so the state format version moves from 70 to 79. Re-create snapshots after upgrading. Saves are now written atomically (a temp file renamed over the old one, so a failed save never destroys the previous snapshot) and expansion boards carry permanent wire IDs, so a state written by one feature build is no longer misread by another.

Your host data has moved to Documents, and nothing migrates it for you. Configs, the launcher's saved default, save states, screenshots, recordings, NVRAM, traces, gamepad calibrations, keymaps and the WHDLoad library and saves now live in ~/Documents/Copperline/ on macOS and Linux and %USERPROFILE%\Documents\Copperline\ on Windows, instead of the hidden ~/.config/copperline/ / %APPDATA%\copperline\ tree. Move or copy the old directory to the new location once; otherwise Copperline starts at factory settings with empty save slots and no WHDLoad library. Portable installs (portable.txt) and publisher-kit players are unaffected.

The CD32 profile now fits an FMV cartridge by default. A CD32 configuration that names no fmv_rom boots with the bundled open-source FMV ROM as its first Zorro II board, so the guest sees cd32mpeg.device and, under Kickstart, a Video CD player. fmv_rom = "" (or the launcher's Remove button on the FMV module ROM row) gives a stock CD32; an explicit path to Commodore's v40.30 image still wins.

The A2091/A590 no longer needs a dumped ROM. [scsi] controller = "a2091" with no rom used to be a configuration error; it now loads the bundled open-source A2091 boot ROM. A real image named in rom (or rom plus rom_odd) is used exactly as before.

The uaelib trap is on. Every non-CDTV machine has a 32-byte readable stub at $F0FF60, and a guest warpmode(1) genuinely unpaces a windowed session until warpmode(0), the warp hotkey or power off. [emulation] uaelib = false leaves $F0FF60 unmapped.

Emulated 68030 and 68040 speed changed. m68k 0.12.1 runs the 68030 on the MC68020UM tables and gives the 68040 a single-issue pipeline model, both calibrated against a real A4000 (see below). 68000/010/020/060 timing is unchanged. Separately, the 68000 interrupt-recognition pipe now keeps one deadline per source and bounds an idle STOP nap by a latched interrupt, so handlers that used to be entered a nap late now enter on time; that moves the emulated timeline of any run that depended on the old behavior.

No configuration keys were removed or renamed. Everything else is additive: [emulation] auto_launch, warp_boot, warp_boot_idle, warp_until, uaelib, uaelib_files; [cartridge] model and rom; [copperhf] unit0..unit6; [display] autocrop; and the flags --warp-boot, --warp-until, --cartridge, --freeze-after, --gdb-gui, --gdb-dialect, --load-uss, --video, --run-stack and --run-detach. --run under --control/--control-gui now stops once with reason loadseg when the program loads, as --gdb already did; scripts that expect to run straight through need one more continue.

Highlights

  • Source-level debugging in VS Code. copperline-ctl --dap is a Debug Adapter Protocol server built on the control protocol, and tools/vscode-copperline packages it as a VS Code extension (debug type copperline). A launch.json names the Amiga executable and the machine (model, chip, slow, rom, factory...); F5 boots the bundled AROS ROM or a Kickstart from 1.3 up, warp-boots to the program and stops at main. From there: source, function, instruction, data and exception breakpoints with machine-evaluated conditions (d0 == 5, [$DFF006] != 0); Step Over/Into/Out at statement or instruction granularity; Step Back and Reverse Continue from the snapshot ring; Registers (FPU included), Locals, Globals and a Chipset scope with every custom register; hovers and watch expressions; Memory and Disassembly views with per-instruction cycle counts and live ROM names such as [exec] AllocMem+$12; a Debug Console that carries KPrintF and serial output and accepts raw !method {json} control-protocol calls. The toolbar opens Copperline's native Debugger, Console and Frame Analyzer windows, a Custom Registers tree documents every register's bits and access rules, and Profile captures one or more frames as a source-mapped .cpuprofile with a [Bus wait] child separating chip-DMA contention from CPU work. Debug information comes from vasm LINE hunks, amiga-gcc 6.5's DWARF hunk, or an ELF sibling from Bartman's m68k-amiga-elf-gcc (DWARF 4/5, including relocatable -r multi-file builds, whose debug-section relocations the reader applies itself). nvim-dap and any other DAP client work the same way over stdio or --dap-listen. Command palette extras: Init Amiga Project (vasm, amiga-gcc, vbcc or Bartman toolchains), Convert EXE to ADF and Profile File Size. See docs/debugger/vscode.md and docs/debugger/dap.md.
  • Bartman's Amiga C/C++ extension runs on Copperline. A public fork of the extension (LinuxJedi/vscode-amiga-debug, branch copperline-backend; upstream PR 307) adds amiga.emulator = "copperline". Copperline supplies the other half: --gdb-gui attaches the GDB stub to the interactive window, --gdb-dialect bartman speaks the patched GDB's wire contract (qOffsets per hunk, the $FFFFFFFF return-from-ROM breakpoint, monitor reset, DBG: output), monitor profile writes the extension's binary profile format from the precise sampler and full bus trace, and a windowed launch waits paused until GDB connects so the guest cannot outrun its debugger. The result is Bartman's visual profiler on a cycle-driven machine: the CPU call-stack and DMA/blitter timeline, the displayed bitmap inferred from the recorded Copper writes (or a bitmap the guest registered by name), the Copper list, blitter A/B/C/D channel previews per blit, and the per-function profiler tree. Six real captures are in docs/debugger/vscode-bartman.md, with a pinned, reproducible install of the fork.
  • Profiling and chip-bus tracing. profile.start/profile.stop/profile.status stream one JSON record per committed frame: chip-bus ownership per Agnus owner, blit records, the guest's idle clocks, optionally the per-colour-clock owner grid in vAmiga's DMA-debugger letter code and a screenshot per frame. "samples": true records every retired instruction with its PC, colour-clock cost and optional registers, plus live call stacks from a client-supplied unwind table; copperline-ctl profile-report converts a capture to a Chrome .cpuprofile or Bartman annotations. frame.slots and the bus event family expose a full 24-byte record per raster colour clock (register, DMA kind and subtype, size, IPL, CIA E-clock phase, address, data, and a hardware-event mask: blitter start/finish, Copper WAIT wake, DDF strobes, VB/VS/LOF, CIA IRQ pins, STOP entry and wake). The Frame Analyzer's Beam tab gains a CPU wait view (W) that attributes every colour clock the 68000 lost to the DMA class that held the bus, with a per-line stall gutter and the top stalled PCs; CPUWAIT prints the same in the console. blit.render reconstructs any channel of any blit from the captured DMA words, the new Blits tab shows sources and result side by side, Copper MOVE slots are drawn on the beam, and capture.screenshot can overlay blit destinations, chip-RAM overdraw heat or Denise pixel provenance. copperline-ctl profile profiles a saved .clstate or WinUAE .uss offline.
  • Live Kickstart symbols. ROM addresses in call stacks, disassembly, stalled-PC lists and profiles are resolved from the running guest -- Exec's library and device lists, their LVO jump tables and the resident list -- against a table of public AmigaOS LVO names, so names follow SetFunction() patches and work on any Kickstart or AROS revision without a per-ROM address database (WHO ADDR, symbols.resolve, symbols.rom).
  • A WinUAE-compatible uaelib trap. $F0FF60 answers the calls Bartman's template makes: warpmode() unpaces the window, KPrintF lands on stdout and in the debugger console as DBG: lines, debug_register_bitmap/_palette/_copperlist feed a new Frame Analyzer Resources tab (decoded bitmap previews, palette swatches, disassembled Copper lists, heat-map presets per resource, PNG export) and the debug control-protocol events, debug_start_idle/stop_idle account the guest's idle time per frame, and the overlay commands (debug_rect, debug_text...) are drawn on the windowed presentation without ever reaching screenshots or captures. debug_load/debug_save are available behind [emulation] uaelib_files, sandboxed below the program's directory. The trap is 32 bytes of real 68k code decoded on the bus; there is no A-line or TRAP hook.
  • An MCP server. copperline-ctl --mcp exposes every control-protocol method as an MCP tool (95 tools, one per method with dots mapped to underscores) plus session_launch, session_attach, events_next and friends, so Claude Code, Cursor or any MCP client can boot a machine, set breakpoints, step, read memory and receive screenshots as image blocks. claude mcp add copperline -- copperline-ctl --mcp is the whole setup.
  • HRTMon freezer cartridge. [cartridge] model = "hrtmon" (or --cartridge hrtmon) fits an Action Replay-style cartridge with HRTMon 2.39 built reproducibly from the upstream GPL source: a 1 MiB bank at $A10000, a configuration block written from the fitted boards at reset, a shadow of every custom and CIA register copied into the bank on a freeze, and the freeze itself as a level-7 NMI through the current VBR that the 68000 takes at the next instruction boundary whatever the SR mask. Tools > Freeze or Cmd/Alt+Shift+B in the window, --freeze-after SECS headless, cartridge.freeze over the protocol; x in the monitor returns to the interrupted program.
  • Warp boot and auto-launch. --warp-boot runs any configuration unpaced from power-on until its floppy and hard-disk activity has been idle for warp_boot_idle seconds (10 by default; CD audio deliberately does not count), then re-paces with audio; --warp-until SECS warps to an absolute emulated time. Both have launcher rows, and Lee Hobson's [emulation] auto_launch makes a saved default boot straight past the launcher screen, so a double-click lands on a settled Workbench.
  • Open ROM replacements. The CD32 FMV cartridge now works without Commodore's image: a clean-room GPL ROM (fmv-rom/) installs cd32mpeg.device, whose worker reads Mode-2 sectors through the host cd.device and feeds the CL450 and L64111 ports (no proprietary microcode is copied), plus a videocd.library and version-41 cdstrap that cold-boot a White Book Video CD into a track player under Kickstart; under AROS the matching driver merged upstream in AROS PR 1089. Cannon Fodder's filmed intro plays on both paths. The A2091/A590 gets a clean-room 64 KiB autoboot ROM (a2091-rom/): scsi.device 42.40 derived from the A4091 software, an RDB automounter with Kickstart 1.3 support, a WD33C93 transport that uses the DMAC for even-aligned chip-side buffers and a chip-RAM bounce buffer otherwise, and a build that also emits split U13/U12 EPROM halves for a real board.
  • copperhf.device. Copperline's own zero-cost hard-disk controller, the analogue of uaehf.device: a Zorro II board with a doorbell/completion-queue register block, an autoboot ROM with an RDB mounter that autoboots on Kickstart 1.3 as well as 2.0+ and AROS, the full trackdisk family (TD64, NSD, HD_SCSICMD with autosense, disk-change interrupts and TD_EJECT), and a completion time that is a pure function of emulated time so host disk speed never reaches the guest. [copperhf] unit0..unit6 take RDB hardfiles, bare images, .hdz and host directories; copperhf.attach/copperhf.eject swap them live; the launcher's Storage page gains a Copperline HD sub-page; and copperline-import-uae now maps WinUAE uaeN drives onto it. Contributed by Simon Dick.
  • Display scaling and autocrop. A new WGSL scaler pass replaces the pixels crate's built-in draw, so integer scaling is no longer capped at 4x on a 5K or 6K display. Under the default tv pixel aspect, integer scaling now presents the unresampled square canvas with a separate whole-number factor per axis chosen to approximate the glass's pixel shape (a 200-line NTSC game with autocrop on a 1080p display is drawn at 2x5). [display] autocrop crops the presentation to the display window the hardware actually programs -- the renderer's own per-line DIW bounds over rows carrying fetched bitplane data, with a latch that adopts growth immediately and shrinks only after half a second of stability -- and works for programmable DblPAL/Multiscan/31 kHz scans too. Captures keep their aperture. The browser demo at copperline.dev/try gains the same Scaling and Autocrop controls.
  • WinUAE save-state import. --load-uss reads a WinUAE .uss AmigaStateFile, derives the machine from its chunks, verifies the ROM by CRC and restores CPU, custom, Copper, bitplane, blitter, CIA, palette, sprite and audio state. It is an approximate interchange for resident code, not cycle-exact resumption; docs/guide/winuae-state.md has the coverage table.
  • --run on a bare Kickstart 1.3. The staged boot volume now carries small GPL 68000 FailAt, CD, Stack, Echo and Execute commands, so a direct executable launch reaches LoadSeg on a 1.3 ROM with no Workbench files (detached launches still need 2.0+ or AROS). --run-stack, --run-detach and --video PAL|NTSC join the launch flags.
  • Smaller things. Every custom-chip register now has a documentation page under docs/reference/custom-registers/ -- bit fields, access side effects, AGA readback, Copperline's own limits -- compiled at build time into the IO Map, the console's CUSTOM REG, custom.dump, the DAP Chipset scope and the VS Code register tree; --gdb-gui and --control-gui can share one window, with warp holds released per client; regs.get reports FPU registers, run_until takes a pc_outside window, watchpoints can be read or read/write, and the GDB stub gains Z3/Z4; the About panel thanks patron Sphair.

Hardware accuracy fixes

  • Every drive's motor latch clocks on its own /SEL edge. DF0 was modelled level-sensitive, so a loader that restored a stale CIA-B PRB shadow with MTR high while still selected stopped the motor it had just started; DF0's /RDY now also mirrors /TRK0 while its motor is off. Alongside it: the 68000 IPL recognition pipe keeps one deadline per interrupt source and bounds an idle STOP nap by an interrupt already latched in INTREQ, the pre-display sprite DMA lines are replayed slot by slot at their own beam time so a descriptor rewritten from the vertical-blank interrupt is seen when the hardware would see it, and a trackloader parked on DSKSYNC no longer costs a whole-revolution cell scan per idle slice (Spooky Town under Kickstart 1.3 was the witness, compared against a vAmiga 5 reference frame).
  • DSKBYTR is framed by the read shifter. Paula frames the byte with the shifter's bit counter, the one a WORDSYNC match resets, not the track's own byte grid, so bytes read off an IPF or flux track at an arbitrary sync phase were shifted; WORDEQUAL is now the comparator's live one-cell level, and IPF density models 3..9 (Copylock, Speedlock, Brierley) decode with the mastered variable cell timing instead of uniform 2 us cells. Lemmings' Copylock key-track check passes (issue #610).
  • Akiko delivers subcode frames during CD-DA play. The Q channel is regenerated from the TOC (control, track, index counting a pregap down, track-relative and absolute MSF in BCD, inverted CRC-16) at 75 Hz with the subcode interrupt, and the SubQ command reports the running position; Liberation's intro, which busy-waits on CD_ADDFRAMEINT, plays through. The TX DMA now drains the guest's 256-byte command ring into a drive-side buffer while a lead-in dump streams, instead of consuming one byte per delivered packet, so discs with more than about 25 tracks no longer lap the ring and produce checksum-error replies the real drive never sends (Pinball Illusions, 39 tracks).
  • Agnus cancels a fetch run carried past the last display line. The bitplane sequencer honours DDFSTOP only at the next fetch-unit boundary, so a hires window whose last unit overruns the line end carries BPRUN into the next line; Agnus drops it with the vertical flop on the DIWSTOP.V line, which Copperline did not, painting one phantom row below the display. A new ddfprobe-vspill golden pins it (45 goldens now).
  • 68030 and 68040 timing calibrated on a real A4000. A new bootable accelprobe measured exception round trips, jsr/rts, movem, cpushl, chip and fast RAM read/write rates and the SetPatch MMU table walk on a BFG9060, an A3640 and a Commodore 68030 board against the CIA E-clock. The scaled-68000 approximation over-billed plain 68040 execution about 2-2.5x while the real 68030's core figures matched the A1200's 68020; m68k 0.12.1 moves the 68030 onto the MC68020UM tables and gives the 68040 a single-issue pipeline model. The fast-RAM speed-class and CPU-slot bridge billing the probe also exposed remain open.
  • Toccata: the AD1848 mixer fallback held the last DAC sample forever after the codec stopped (a permanent DC offset), and disabling playback while capture stayed enabled left playback active; both fixed by Simon Dick.
  • Bundled AROS ROM refreshed to upstream master a3cfa659ed: the open cd32mpeg.device and CDXL work (PR 1089, carrying Copperline's sector-ordering fix), the CD32 chip-memory savings and CDXL presentation series (PRs 1109 and 1125), exec spinlocks, and a smaller ROM footprint. One local patch keeps the DOS process-stack floor at 8 KiB, because upstream's new 4 KiB floor overflowed the shell under --run.

Desktop, tooling and platform

  • Save-state persistence. A failed or interrupted save no longer truncates the previous snapshot, and expansion boards serialize with permanent wire IDs instead of feature-dependent enum indices.
  • Headless debugging is timeline-transparent. A release test now proves that arming any COPPERLINE_DBG_* breakpoint, watch, trace or dump leaves the emulated timeline byte-identical, so instruments can be layered onto one run; the one exception, [cpu] jit, logs a warning when it falls back to precise timing.
  • CI builds a lot faster. A ci cargo profile drops fat LTO for the test binaries (macOS CI from about 40 minutes to about 4), packaging caches are isolated per job, and the derived fuzz lockfile and Flatpak cargo-sources list are generated on demand instead of tracked.
  • Documentation. New chapters for VS Code, the Bartman fork, the DAP adapter, profiling and WinUAE state import; the custom-register reference; a full refresh of the guide, debugger and internals chapters against the current implementation.
  • Guest code builds with the amiga-gcc:gcc-v16.2 image; m68k 0.12.1, toml_edit 0.25, syn 3 and routine dependency updates.

External contributions

  • Simon Dick (@sidick) built copperhf.device, Copperline's emulator-native autoboot hard-disk controller, from the Zorro board and guest ROM through the launcher page and copperline-import-uae mapping, and fixed the Toccata's stopped-codec DC offset.
  • Lee Hobson (@hobbo91) added the launcher's auto-launch and moved host data out of the hidden config tree into Documents.
  • Bartman (@BartmanAbyss) wrote the Amiga C/C++ extension whose Copperline backend is proposed in vscode-amiga-debug PR 307; the fork used in the docs is public and pinned.

Installation

Browser (no install): copperline.dev/try

macOS (Homebrew):

brew tap copperlinehq/copperline https://github.com/CopperlineHQ/Copperline
brew install copperline

macOS (DMG): download Copperline-0.19.0-macos-universal.dmg below, open it, and drag Copperline.app to Applications. The app is ad-hoc signed but not notarized, so first launch may require right-clicking the app and choosing Open.

Linux (AppImage): download Copperline-0.19.0-x86_64.AppImage below, then:

chmod +x Copperline-0.19.0-*.AppImage
./Copperline-0.19.0-*.AppImage

Windows: download and extract the portable Copperline-0.19.0-win-x64.zip (or Copperline-0.19.0-win-arm64.zip on ARM) below.

From source:

cargo build --release
./target/release/copperline

VS Code: build copperline and copperline-ctl from this tag, then package the extension from tools/vscode-copperline (docs/debugger/vscode.md); the Bartman fork install is in docs/debugger/vscode-bartman.md.

The bundled AROS boot ROM lets Copperline run out of the box, CD32 discs and the FMV cartridge included, and the A2091 and lide.device boards autoboot with their bundled open ROMs. A real Kickstart ROM and disk, hard-disk, or CD images are still required to run most commercial Amiga software; these are not included. The MT-32 ROMs are likewise yours to supply.

Full changelog: https://github.com/CopperlineHQ/Copperline/compare/v0.18.0...v0.19.0

Copperline 0.18.0

v0.18.0 release
Release notes · 6 files

Copperline 0.18.0 is the CD release. The CD32's Full Motion Video module -- Commodore's MPEG cartridge -- is emulated end to end, so Video CDs play and FMV-aware titles run their MPEG sequences on an emulated CD32 exactly as they do with the real cartridge in the expansion bay. Underneath it, the CD32 drive model was calibrated against a real PAL CD32 with a purpose-built probe disc and a filmed cold boot: spin-up, seek times and command pacing are now measured quantities, and the emulated cold boot tracks the real machine's to within 50 milliseconds -- close enough that Fightin' Spirit, which depends on the exact boot-time memory layout, boots from the unmodified disc for the first time. Around the CD story: CDXL video plays from cooked ISOs, Nero NRG images mount, cue sheets take WAVE and MP3 audio tracks, a new copperline-import-uae tool converts WinUAE, Amiberry and FS-UAE configurations, a Hayes-compatible modem answers on the serial port, run-ahead trims input latency, and AGA sprite, fetch and palette fidelity was pushed to pixel-exact against the vAmigaTS references. As always it is a hardware-behavior release: compatibility fixes model the underlying Amiga subsystems rather than individual titles.

Compatibility notes

Save states from 0.17.0 do not load in 0.18.0. The FMV module, the calibrated drive model and the vertical display-window flop all changed the serialized machine shape, so the state format version moves from 61 to 70. Re-create snapshots after upgrading.

CD32 and CDTV now default to no floppy drive, like the real machines. [floppy] drives accepts 0-4 mechanisms and puts one back (drives = 1, or --floppy-drives 1); every other profile keeps its DF0 default. The launcher understands driveless CD machines and now lists a mounted disc's tracks.

The lide.device IDE boards now autoboot out of the box. A fitted board defaults to a bundled build of LIV2's open-source ROM (lide.rom for ripple/ride, lide-atbus.rom for atbus2008, plus the CD-filesystem second bank where the board supports banking) instead of requiring a user-supplied download. rom = "" opts back into the old hardware-only mode, and an explicit path is still honored. Each drive slot also gets its own key -- drive0..drive3 in (channel, master/slave) order, the same shape as [ide] and [scsi] -- with each drive's boot priority under it; the older positional drives = [...] array is still read.

No configuration keys were removed or renamed. Everything else is additive: [machine] fmv_rom, [emulation] run_ahead_frames / --run-ahead, [serial] mode = "modem" with its telnet, session and [serial.phonebook] keys and --serial-session, the [lide] per-slot keys, .nrg images, and WAVE/MP3 cue tracks.

Highlights

  • The CD32 Full Motion Video module. [machine] fmv_rom fits Commodore's MPEG cartridge as the first Zorro II board in a CD32: the CL450 video processor and L64111 audio decoder interfaces, the module's RAM and ROM, and the analogue keying path that mixes decoded video with Denise's output, with Video CD frames scaled across the full capture aperture. MPEG-1 video decodes through CopperlineHQ's safe pure-Rust plmpeg port and MPEG Layer II audio through Symphonia. Video CDs play, and FMV titles run their MPEG sequences -- Cannon Fodder's filmed intro plays before the game loads and runs to gameplay deterministically. MODE2/2336 and MODE2/2352 tracks are read through cue, NRG and CHD images alike. The 256 KiB v40.30 cartridge ROM is yours to supply, like a Kickstart. One caveat: with the module fitted, booting a CD needs a real Kickstart for now -- the cartridge carries its own KS-era cd.device that takes over the bundled AROS ROM's boot path; an upstream AROS fix is in progress.
  • A CD32 drive calibrated against real hardware. A purpose-built probe disc (tools/cd32-probe, included, with the measured result tables in its README) and a filmed cold boot turned the drive model's guesses into measurements: a spin-up gate on the first lead-in dump (8.8 s cold, 3.5 s warm), TOC dumps that complete before the next queued command acts, a measured seek curve replacing the single-slot seek, TX DMA that folds to its 256-byte page the way Kickstart's producer expects, and unmapped address space billed at its measured bus cost. The emulated cold boot now enters the startup-sequence at 14.36 emulated seconds against 14.31 filmed -- and because the boot show never runs with a bootable disc spinning up, chip RAM is laid out as on the real machine: Fightin' Spirit boots unpatched to the credits, and discs inserted at the idle screen or mid-show now boot like a real lid close.
  • CDXL from cooked ISOs. Reads from a bare .iso now synthesize complete raw Mode 1 sectors -- EDC and P/Q parity included -- so CDXL video plays from cooked images and CDTV-trademark boots work on the CD32 profile; cached TOC transport is paced independently of optical sector delivery.
  • More CD image formats. Nero NRG images mount everywhere a cue sheet does, and cue sheets accept WAVE and MP3 audio tracks with PREGAP/POSTGAP lines honored -- a ripped game with compressed audio tracks plays its soundtrack without re-mastering.
  • copperline-import-uae. A converter that turns a WinUAE, Amiberry or FS-UAE configuration into Copperline TOML -- machine model, CPU/FPU, RAM sizes, chipset, Kickstart, floppies (FS-UAE swap lists become a playlist), hard drives and directory mounts, CDs, RTC, audio, joystick ports and the [lide]/[scsi]/[toccata] boards. It is honest about the rest: approximations are commented at the line they produced, and everything with no equivalent is listed at the end of the file it writes, so "considered and skipped" is distinguishable from "not yet handled". The output is validated exactly as copperline --config would load it. Contributed by Simon Dick. See docs/guide/import-uae.md.
  • A modem on the serial port. [serial] mode = "modem" puts a Hayes AT-command modem on Paula's serial port, so Term, NComm and BBS doors that expect dial commands, result codes, carrier semantics and the +++ escape get them, instead of the raw byte bridge of the tcp modes. It answers inbound calls (RING, S0 auto-answer, ATA), dials from a config-file phonebook, speaks enough telnet NVT for real BBS servers, persists AT&W profiles to a sidecar file, and carries a WiModem232 compatibility layer verified against the real unit's manual, so published community setup guides run verbatim. A scripted-session transport (--serial-session) replays a dial-out byte-for-byte for deterministic headless runs. Contributed by Simon Dick. See docs/guide/modem.md for the command set and a BBS quick-start.
  • Run-ahead. [emulation] run_ahead_frames (0-4, --run-ahead, or Emulation Settings > Run Ahead) trims perceived input latency: each refresh commits one ordinary frame, snapshots it, silently executes future frames, presents the last, and restores the snapshot. It is guarded rather than reckless -- whenever a frame could touch host state the snapshot cannot rewind (writable media, live serial, recording, control clients, and more), the setting goes inactive with the reason shown in the menu, and a burst that cannot restore its anchor disables the feature rather than let speculative frames become the timeline.
  • AGA fidelity. Lisa's sprite serializer is now modeled in 35 ns samples, so SHRES sprites (SPRES=11) are distinct from hires ones and render the 4:4:2:1 width staircase photographed on a real A1200; both SHRES playfield halves survive priority and composition. Alice's wide-fetch address phases are modeled -- FMODE 10 page-mode duplication and unaligned aliasing included -- along with the per-resolution DMA ceilings, Lisa's banked BPLCON2.RDRAM palette readback and the one-hires-pixel COLOR write delay. The sparse vAmigaTS AGA sweep's two worst cases went from 16.179% and 70.931% mismatch to 0.000%, and the repo's AGA golden probes are now cross-checked against vAmiga 5.0b1 (the comparer tool is included).
  • The browser demo grows a second, writable drive. copperline.dev/try now wires DF1 and keeps floppy images writable in memory, so two-disk software installs and saves within the session.
  • Smaller things. The full build's menu offers Quit as its last row, holding Select quits on the standard gamepad layout, and calibration takes alternate direction bindings; the launcher's Storage, Video/Display and Serial pages were restructured (boot priority lives with its drive, the serial address is proper host and port fields); the CCP honors at_seconds on input.joy/input.mouse/input.analogue and the debugger disassembles 68020+ full-format extension words; and the user guide and debugger docs got a full audit pass with a completed table of contents.

Hardware accuracy fixes

  • The vertical display window is a set/reset flop. DIWSTRT.V sets it, DIWSTOP.V clears it, the frame's last raster line resets it (judged against the fixed standard line, not the programmed height), an empty window (DIWSTRT.V == DIWSTOP.V) never opens, and the flop's state survives save states and the frame wrap. LOF holds steady outside interlace, and the deinterlacer detects field-blind weave phase. Kang Fu's interlaced CD32 menus and Nexus 7's scene transitions render correctly; three new golden probes pin the behavior.
  • AGA sprite palette banks were transposed. Even sprites read their colors through BPLCON4's ESPRM nibble and odd/attached pairs through OSPRM -- Copperline had them swapped. Alongside it, a Copper fetch may ride the line-end refresh slot (only the CPU and blitter stall on it), and the blitter's deadline predictor mirrors the refresh carve-out. Both fixes carry golden probes (Nexus 7's credits were the witness).
  • A DDFSTRT rewrite is judged at its comparator commit clock. Moving DDFSTRT behind the beam mid-line means the comparator never matches and the line's fetch is dropped -- restarting a wide-FMODE fetch mid-unit desynced the planes (Microcosm's control panel). Pinned against vAmiga 5.0b1.
  • Dual-playfield sprite priority follows the winning playfield. The playfield that wins the pixel judges the sprite against its own BPLCON2 priority code, not a fixed field (the bin Chuck Rock 2's Junior hides behind).
  • COPJMP strobes fire on reads too, returning the floating-bus residue (Sleepwalker's jerky animation). And BPLCON1 scroll fills a bitplane-DMA block's first line from its own pre-window fetch, exactly as on interior lines -- the old suppression modeled a shifter history real Denise does not have (the black notch in Super Skidmarks' CD32 menu corners).
  • HAM8 stays on the history-dependent resolver, fixing a 0.17.0 regression where an indexed-cache shortcut broke HAM8 scenes.
  • Paula re-frames WORDSYNC reads on every DSKSYNC match, not just the first, and disk DMA armed while the drive has no disk or a stopped motor stays pending until real cells arrive, instead of completing against phantom data. CLXCON2 joins live collision decoding on AGA.
  • Akiko fixes: CDINTREQ reads return the raw request latches rather than the masked value (Jim Power's CD32 loader polls them raw), RX DMA wraps within its 256-byte response page, and plays into data tracks are refused with the real firmware's error. The bundled AROS ROM was refreshed three times this cycle with upstream fixes Copperline contributed: a cd.device interrupt-service fix, a ciab.resource handshake fix, and a dosboot stale-IORequest fix.
  • Picasso II BitBLT: the NOR and NAND raster-op encodings were transposed, the BLT address counters are left where the transfer stopped, and the source end derives from the source the mode actually reads (Bernie Innocenti).
  • SHRES half-pixel composition on the classic canvas was corrected as part of the sprite work.

Desktop, tooling and platform

  • Hardened media and save-state parsers. New fuzz targets exercise the untrusted media and save-state parsers, and the campaign's findings are fixed: CHD headers and compressed maps are bounded before the decoder acts on them, and the save-state reader never sizes an allocation from the stream's own length prefix.
  • Supply-chain CI. cargo deny enforces the dependency advisory and license policy, the declared minimum Rust version is built in CI, and scheduled dependency updates cover every workspace in the repo.
  • cputest in the exit status. The nightly WinUAE cputest conformance run reports its verdict through the runner's exit code, so a regression fails the workflow instead of hiding in the log.
  • m68k 0.11.6, with the browser demo's CI smoke test extended to driveless machines.

External contributions

  • Simon Dick (@sidick) built two of the cycle's headliners -- the copperline-import-uae converter and the Hayes/WiModem232 modem -- and rounded out the lide.device boards with the bundled boot ROMs, per-slot drive configuration and their launcher page.
  • Lee Hobson (@hobbo91) restructured the launcher's Storage, Video/Display and Serial pages: boot priority lives with its drive, SCSI rows align, the window and picture settings part ways, and a serial address is entered as proper host and port fields.
  • Bernie Innocenti (@codewiz) fixed the Picasso II's transposed NOR/NAND raster ops and its BLT address-counter semantics.

Installation

Browser (no install): copperline.dev/try

macOS (Homebrew):

brew tap copperlinehq/copperline https://github.com/CopperlineHQ/Copperline
brew install copperline

macOS (DMG): download Copperline-0.18.0-macos-universal.dmg below, open it, and drag Copperline.app to Applications. The app is ad-hoc signed but not notarized, so first launch may require right-clicking the app and choosing Open.

Linux (AppImage): download Copperline-0.18.0-x86_64.AppImage below, then:

chmod +x Copperline-0.18.0-*.AppImage
./Copperline-0.18.0-*.AppImage

Windows: download and extract the portable Copperline-0.18.0-win-x64.zip (or Copperline-0.18.0-win-arm64.zip on ARM) below.

From source:

cargo build --release
./target/release/copperline

The bundled AROS boot ROM lets Copperline run out of the box, CD32 discs included. A real Kickstart ROM and disk, hard-disk, or CD images are still required to run most commercial Amiga software; these are not included. The FMV module ROM and the MT-32 ROMs are likewise yours to supply.

Full changelog: https://github.com/CopperlineHQ/Copperline/compare/v0.17.0...v0.18.0

Copperline 0.17.0

v0.17.0 release
Release notes · 6 files

Copperline 0.17.0 is the audio release. Coppersynth puts a General MIDI sound module on the other end of the Amiga's MIDI cable -- a sixteen-part SoundFont synthesizer in the style of a Roland Sound Canvas, with an SC-55-style front panel under the display and an MT-32 translation layer in front, so a game that talks to an MT-32 plays with no ROMs and no configuration. Beside it arrive two Zorro II sound boards: a MacroSystem Toccata, the AD1848 card the stock toccata.audio AHI driver expects, and an MHI MPEG audio decoder board that lets AmigaAMP play MP3 on a plain 68000. Every one of those sources -- and Paula's four channels, the drive noises, CD-DA and the MT-32 -- now flows through one mixer that can write each of them to its own WAV, and the debugger's Audio tab grows a row per source with state, oscilloscope and mute. Elsewhere, CD32 discs cold-boot on the bundled AROS ROM with no Kickstart at all, a publisher kit builds a launcher-free player for a single game, most gamepads work out of the box and can drive the whole UI, the About page got a makeover, and RTG gains the Graffity boards. As always it is a hardware-behavior release: compatibility fixes model the underlying Amiga subsystems rather than individual titles.

Compatibility notes

Save states from 0.16.0 do not load in 0.17.0. Three new boards, the Akiko fixes and the gamepad mouse all changed the serialized machine shape, so the state format version moves from 54 to 61. Re-create snapshots after upgrading.

Gamepads no longer need calibrating first. A controller found in the bundled SDL_GameControllerDB (or identified by the platform driver) uses a fixed standard layout. A saved calibration for a pad always wins over the database, so existing setups are untouched -- but a calibration made before 0.17.0 for a pad the database also knows may have a stick reversed; Copperline logs a one-time hint, and recalibrating once fixes it.

No configuration keys were removed or renamed. Everything new this cycle is additive ([toccata], [mhi], [zz9k], the [serial] coppersynth_* keys, [audio] stem_granularity, [input] port1 = "gamepad-mouse", the Graffity [rtg] card values) and no default changed. Two new files to know about: Coppersynth keeps its battery-backed settings in coppersynth.nvram in the NVRAM folder, and the MHI board's guest library is not installed automatically -- copy guest/mhi/mhi_copperline.library into LIBS:mhi/ on the Amiga side.

Windows on ARM gets its own portable zip from this release, and the default build no longer needs a C compiler on any platform.

Highlights

  • Coppersynth. A built-in General MIDI sound module: sixteen parts, GS and NRPN handling, reverb and chorus, and an SC-55mkII-style front panel with the real unit's button grammar -- part and system menus, variation banks, GS init, the demo sequences, and the power-on combinations -- whose settings survive power cycles like the real unit's battery. The GeneralUser GS bank by S. Christian Collins is embedded, so it needs no files; any .sf2 (or a .zip holding one) loads in its place. An MT-32 translation layer (auto, on or off) turns a game's MT-32 instrument uploads and drum map into General MIDI as it plays, and its LCD shows the messages games send. Its audio is mixed beside Paula's, so MIDI music and Amiga sound effects play together. Select it with [serial] midi_out = "coppersynth", --midi-out coppersynth, the launcher's I/O Ports tab or the in-window MIDI Out menu, and switch between it and the bit-exact MT-32 without a restart. The synthesizer lives in its own crate, CopperlineHQ/Coppersynth. Contributed by Lee Hobson.
  • A Toccata sound board. [toccata] enabled = true fits a register-accurate MacroSystem Toccata: the AD1848 codec's indexed registers, the board's own 1024-byte FIFO with its half-empty interrupt and little-endian word quirk, all fourteen sample rates from 5512 to 48000 Hz, 8- and 16-bit mono and stereo. The stock open-source toccata.audio AHI driver runs unmodified, so AHI-aware software gets 16-bit sound with no Copperline-specific driver. Contributed by Simon Dick.
  • An MHI MPEG audio decoder board. [mhi] enabled = true fits a Copperline-native Zorro II board serving the Amiga MHI API -- the hardware-decode backend players such as AmigaAMP use -- through a ported mhi_copperline.library. MP3 decodes at essentially zero guest CPU cost on a stock 68000, with working volume, pan, bass, mid and treble, and the bitstream is consumed at the decoded audio's emulated-time rate so warp and replay stay deterministic. The board's register protocol is published as a bus-agnostic contract (docs/internals/mhi.md) that any emulator could implement; the decoder is the pure-Rust Symphonia. Contributed by Simon Dick.
  • Audio stems. An AudioMux now sits between every audio producer and the host, and --audio-stems DIR --audio-stems-mode master,source,channel writes the mixed master, one WAV per source (paula, drivesounds, cdda, mt32, coppersynth, toccata, mhi) and one per Paula channel -- driven by emulated time, so two runs of the same scenario produce byte-identical files that can serve as regression goldens. [audio] stem_granularity sets the default list. Contributed by Simon Dick.
  • The debugger hears every source. The Audio tab's four Paula channel rows gain a row for each line-mixed source the machine has: CD-DA, MIDI (the MT-32 with its control-ROM version, or Coppersynth), Toccata (playback state, latched rate and format, FIFO fill) and MHI (transport, native rate, queue depth, parameter latches), each with a status line, an oscilloscope of its mixed stereo level and a developer mute.
  • CD32 discs boot on the bundled AROS ROM. copperline --factory --model CD32 --insert-cd-after 0 game.cue now cold-boots a CD32 title with no Kickstart. On Copperline's side, Akiko's drive protocol was corrected against Kickstart's and AROS's cd.device -- TOC dump order, command execution paced in emulated time, masked interrupt-request reads, the media-status byte, and DMA that reaches every RAM bank in the low 16 MB rather than the chip-RAM slice -- and the bundled ROM picked up four upstream AROS series Copperline contributed: CD32 CD boot through CDVDFS, an appliance-quiet boot with no requesters on a pad-only machine, the Kickstart-private lowlevel.library requester-gate vectors CD32 titles call blind, and an m68k low-memory series that frees well over a megabyte of chip RAM at boot (a CD32 with a disc in the drive: 164 KiB free before, 1.48 MB after). Pinball Fantasies and Pinball Illusions cold-boot from CD to playable tables on a chip-only CD32.
  • A publisher kit. tools/publish --manifest game.toml builds a dedicated, launcher-free player for one game: a small binary (14.6 MB against the full build's 55) that boots straight into the title with the machine and RAM fixed at build time, no status bar, no debugger, and an in-game menu carrying only what an end user changes -- CRT shader and strength, bezel, fullscreen, controller setup, and save states if the publisher opts in. The distributable bundles the player, the game as a sidecar file, the AROS ROM pair and the license documents for macOS (an ad-hoc-signed .app), Linux and Windows; the game is never embedded in the binary, so publishing a commercial title needs no license exception. The same work gave the full build a gamepad Menu button and a Shader Strength menu row. See docs/guide/publishing.md.
  • Gamepads work out of the box. The bundled SDL_GameControllerDB identifies most pads and gives them a fixed layout -- d-pad and left stick for directions, the south face button for fire or CD32 red, east blue, west green, north yellow, Start for play/pause, shoulders and triggers for reverse and forward, Select/Back or the guide button for the menu -- with SDL_GAMECONTROLLERCONFIG honored for personal mappings and calibration kept as the override. An optional hold-to-quit hotkey quits after a 1.5-second hold with an on-screen countdown, and COPPERLINE_DIAG_GAMEPAD=1 logs every pad event and where its mapping came from.
  • Keyboard and controller navigation of the whole UI. Everything the mouse can reach in the launcher, the menu, the status bar and the overlay panels is now reachable with the arrow keys, Return and Esc, or a pad's d-pad, fire and second button -- a console-style path from the couch through every setting. A new [input] port1 = "gamepad-mouse" device is the same quadrature mouse the Amiga already sees, moved by the gamepad as well as the host mouse, so mouse-driven software plays from a pad. Contributed by Lee Hobson.
  • An About page worth opening, and a launcher sweep. The About panel is rebuilt: a sliding title, contributors and sponsors arriving one by one over a three-layer copper-and-silver wave, and a machine readout that identifies the fitted ROM by checksum, bundled AROS included. The launcher's I/O Ports tab splits into Serial Port, Parallel Port, Networking and Audio pages, on/off rows become steppers, the ROM tab names the chosen Kickstart's name, version and revision, and submenus open on a hover dwell. Contributed by Lee Hobson.
  • Graffity RTG boards. [rtg] card = "graffityz2" or "graffityz3" fits Ateo Concepts' Graffity, which reuses the Picasso II+'s CL-GD5428 core under its own manufacturer ID and window layout, with 1 or 2 MB of VRAM and the stock Graffity.card Picasso96 driver. Contributed by Simon Dick.
  • A ZZ9000 SDK crypto accelerator board. [zz9k] enabled = true fits a bundled WASM plugin board register-compatible with the MNT ZZ9000's SDK v2 service platform, under the ZZ9000's own identity, so the unmodified zz9000-sdk software -- its transport library, the zz9k-* tools and the accelerated AmiSSL build -- gets host-speed SHA-2, BLAKE2s, HMAC, Poly1305, ChaCha20-Poly1305, AES-GCM, X25519 and P-256 key exchange and ECDSA/RSA verification from an emulated 68k. Pure compute, so it is deterministic, replay-safe and save-state-exact.
  • Smaller things. The front-panel HDD LED now lights for the lide.device-compatible Zorro IDE board (Matt Harlum); a WHDLoad library folder of unpacked games under letter shelves is walked into instead of listed as one entry per letter; and the MHI and Toccata boards each get a fit toggle on the launcher's Audio page.

Hardware accuracy fixes

  • Denise's horizontal window is a flip-flop. The display window's horizontal edges are set and cleared by exact comparator matches; a DIWSTOP beyond the counter's wrap never matches, so the window stays open across lines, and a DIWSTRT match on an already-open window is a no-op. Copperline now paints the playfield a carried-open window reveals left of DIWSTRT, matching photographed A500 behavior (the clipped left edge of the Grandslam logo in the Chambers of Shaolin intro). Golden probe renders were re-blessed against vAmiga.
  • Fixed raster centring. A standard PAL or NTSC frame is presented with the calibrated centring constant rather than a shift derived from the effective display-window span, so a late-opening window no longer drags the picture 89 pixels left and blanks the right border (Volker Schwaberow).
  • Akiko drive protocol and DMA. The TOC dump streams track entries before the session entries, commands execute about a millisecond after the guest's write rather than inside it, CDINTREQ reads return the masked request, a present disc reports media status $83, and command, response and sector DMA resolves through the whole 24-bit address space -- the fixes behind the CD32 AROS boot above.
  • CD32 pad shift register. The pad's 4021 shift register follows the Blue line only while loading, so holding Blue no longer makes a game read all seven buttons as pressed.

Desktop, tooling and platform

  • Windows ARM64 joins the CI matrix and the release assets (Copperline-0.17.0-win-arm64.zip).
  • No C compiler needed. The MHI decoder moved from minimp3 to the pure-Rust Symphonia, removing the last C compile from the default feature set.
  • macOS CoreMIDI. One CoreMIDI client per process lifetime, fixing an intermittent MIDIClientCreate failed that could block MIDI until relaunch (Lee Hobson).
  • Gamepad calibration binds on press with hold-to-skip, so pads that report a control held at rest calibrate correctly; the Open menu and Quit steps are optional (Lee Hobson).
  • A structural clean-up split the oversized window, config and floppy modules and the CLI parser into directories, with every golden render bit-identical before and after; the RTG texture path warns and skips a frame instead of panicking; diagnostic dumps are reproducible; a save-state round-trip test and a nightly WinUAE cputest 68000 conformance workflow join CI.
  • --gdb now sits behind a default-on gdb Cargo feature (the player kit builds without it), and the vAmigaTS harness asserts the 4:3 glass geometry.

External contributions

Copperline welcomes a new contributor this cycle: Matt Harlum (@LIV2), author of the open-source lide.device whose board arrived in 0.16.0, who lit the HDD LED for it in his first PR. Welcome aboard.

  • Lee Hobson (@hobbo91) wrote the headline feature -- Coppersynth, the front panel and its own crate -- and then the keyboard and controller navigation of the entire UI with the gamepad mouse, the new About page, the launcher sweep and I/O Ports pages, and the CoreMIDI fix. Lee also topped the commit count this cycle, 89 to the maintainer's 77, a first.
  • Simon Dick (@sidick) contributed the other half of the audio story: the audio mux and stem capture, the Toccata board, the MHI decoder board through four milestones, and the Graffity RTG boards.
  • Volker Schwaberow (@vschwaberow) fixed the raster centring shift.
  • Brazen Gameplay, building Urb-X Warriors: The Lost City with Copperline beside real AGA hardware, have announced that the game will ship in a Copperline-wrapped edition; the publisher kit, the CD32 work on the AROS ROM and the chip-RAM headroom all grew out of that.

Installation

Browser (no install): copperline.dev/try

macOS (Homebrew):

brew tap copperlinehq/copperline https://github.com/CopperlineHQ/Copperline
brew install copperline

macOS (DMG): download Copperline-0.17.0-macos-universal.dmg below, open it, and drag Copperline.app to Applications. The app is ad-hoc signed but not notarized, so first launch may require right-clicking the app and choosing Open.

Linux (AppImage): download Copperline-0.17.0-x86_64.AppImage below, then:

chmod +x Copperline-0.17.0-*.AppImage
./Copperline-0.17.0-*.AppImage

Windows: download and extract the portable Copperline-0.17.0-win-x64.zip (or Copperline-0.17.0-win-arm64.zip on ARM) below.

From source:

cargo build --release
./target/release/copperline

The bundled AROS boot ROM lets Copperline run out of the box -- including, from this release, CD32 discs. A real Kickstart ROM and disk, hard-disk, or CD images are still required to run most commercial Amiga software; these are not included. Coppersynth needs nothing extra; the MT-32 still needs its ROMs.

Full changelog: https://github.com/CopperlineHQ/Copperline/compare/v0.16.0...v0.17.0

Copperline 0.16.0

v0.16.0 release
Release notes · 5 files

Copperline 0.16.0 is the release where the machine meets the people who make and play its software. A WHDLoad-installed game now boots straight from its archive -- copperline --whdload Turrican.lha and nothing else -- and the launcher grows a proper game library around that, with details and cover art fetched from OpenRetro. On the other side of the same coin, --run warp-boots a freshly built Amiga executable from the host filesystem for people writing new Amiga software, and several of this cycle's accuracy fixes came out of exactly that use: Brazen Gameplay are developing Urb-X Warriors, a new commercial Amiga game, with Copperline on the desk beside real AGA hardware, and their field reports drove fixes from Agnus pointer semantics to floating-bus reads. Storage grows a built-in lide.device-compatible IDE board with ATAPI CD-ROM support, OFS directory mounts that boot Kickstart 1.3, a Create Image workshop for fresh ADFs and HDFs, and gzip-compressed hardfiles. Around the machine: configurable output paths with an opt-in portable mode, Kickstart ROM identification by checksum, an on-screen keyboard and picture centring on the desktop, bezel sticker decals, and IPF images in the browser build. As always it is a hardware-behavior release: compatibility fixes model the underlying Amiga subsystems rather than individual titles.

Compatibility notes

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

Output files move out of the working directory. Everything Copperline produces -- screenshots, save states, video and input recordings, NVRAM, traces, waveform captures -- now lands in named folders under the host-data directory instead of the process working directory, and a new optional [paths] section moves any of them (plus where empty file dialogs open). Explicit CLI paths (--screenshot-after and friends) are still used exactly as written, and legacy battmem.nvram / cd32-nvram.bin files in the working directory keep being used from there -- real game saves are never silently relocated.

A saved default configuration now auto-loads. The launcher's Save button offers Save As / Save default / Reset default; a saved default is what Copperline starts with when neither --config nor ./copperline.toml names one. For reproducible runs on a machine you do not control, pass --factory to ignore it.

Highlights

  • Direct WHDLoad boot. --whdload game.lha boots a WHDLoad-installed game package directly -- no Workbench disk, no hand-built hard drive. The package is extracted once into a per-game library so savegames persist on the host, a boot volume is regenerated around the real WHDLoad program each launch, and the machine is derived from the slave header (the canonical A1200 with 8 MB fast RAM unless your config says otherwise). Kickstart images are identified by content using the same CRC WHDLoad itself uses -- byte-swapped dumps, doubled images and Cloanto-encrypted ROMs are all recognised -- and a slave demanding a missing image fails naming the exact file it wants. The WHDLoad and skick support archives are fetched with pinned checksums at packaging time (tools/fetch-whdload.sh); Kickstart ROMs remain yours to supply.
  • A game library. The launcher's WHDLoad page grows into a browsable collection: point it at a folder of games as .lha, .zip or plain directories, and it lists them with details and cover art from OpenRetro, A-Z shortcuts to jump the list, and drag-and-drop of a package onto a running machine to reboot into it. Contributed by Lee Hobson.
  • --run: a developer warp launch. copperline --run build/hello stages a minimal boot volume, mounts the executable's directory live, and warp-boots until the guest OS loads the program -- about one wall-clock second to reach your code on the bundled AROS ROM, in the spirit of the vscode-amiga-debug workflow. With --gdb the session stops at the program's first instruction, and the control protocol gains a loadseg breakpoint kind for scripted sessions. It composes with every headless flag, so a CI run can build an Amiga binary and screenshot it running.
  • A lide.device IDE board, and ATAPI everywhere. A new built-in Zorro II IDE board is compatible with LIV2's open-source lide.device (RIPPLE, RIDE and AT-Bus 2008 personalities). On top of it, ATAPI CD-ROM support arrives across all three IDE surfaces -- Gayle, the A4000's motherboard port and the new board -- so a .cue/.iso/.chd path on any IDE drive slot attaches a real IDE CD-ROM drive, and [[host_disk]] can hand a real host disk to a lide channel. Contributed by Simon Dick.
  • OFS directory mounts boot Kickstart 1.3. A hard-drive slot pointing at a host directory can now build its volume as OFS (filesystem = "ofs"), the filesystem every Kickstart ROM since 1.2 carries -- so a directory mount boots a genuine 1.3 machine to Workbench with no FFS handler installed anywhere. Contributed by Simon Dick.
  • A Create Image workshop. Storage -> Create Image... makes fresh disk images from inside the launcher: DD or HD floppies, standard or extended ADF, any of the eight DOS types, boot code and volume name; hard-disk images to 9999 MB/GB with or without an RDB, custom geometry, boot priority and sparse allocation. Contributed by Lee Hobson.
  • Configurable paths, portable mode and a default config. A new [paths] section names where each kind of output lands, one launcher page edits it, relative entries follow a movable base -- and a portable.txt next to the executable makes the whole installation self-contained, saves and all, for an emulator on a USB stick. Contributed by Lee Hobson.
  • Kickstart ROMs identified by checksum. A ROM file's name is whatever its dumper called it; Copperline now says which Kickstart it actually is -- 67 known images from 1.0 to 3.2.3, including betas, prototypes and the CD32/CDTV extended ROMs -- in the startup banner, the About panel, the ROM-load OSD and the launcher's ROM tab.
  • The desktop grows an on-screen keyboard and picture controls. The A600 keyboard strip from the browser build arrives in the desktop window with a status-bar toggle, and H/V-centre controls nudge the TV picture the way a monitor's front-panel knobs did.
  • Bezels, refined and yours. The 1084 front is rebuilt against fresh reference photography (contributed by Lee Hobson), the tube now shows the whole captured raster, and a bezel stickers folder puts your own decals on the case -- the same features on desktop and web alike.
  • The browser build reads IPF images, offers both monitor fronts, and untangles Esc from fullscreen with the Keyboard Lock API -- tap Esc to release the mouse, hold it to leave fullscreen.
  • Storage and capture odds. Gzip-compressed hardfiles (.hdz) open directly with session-only writes; DMS archives with non-linear track layouts extract correctly; the launcher's Storage Browse dialog picks directories; serial TCP addresses are typed straight into the I/O Ports tab; and --screenshot-after / --save-state-after now repeat, so one run can capture a whole sequence.

Hardware accuracy fixes

  • BPLxPT is one live counter. Agnus bitplane pointers are never reloaded at vertical blank, and a CPU half-write merges into the DMA-advanced live value -- the behavior a display that rewrites its pointers mid-frame depends on.
  • Wide-fetch origin. An AGA display fetching 64 pixels per gulp is placed from the absolute wide-fetch grid, so the first gulp sits left of the display window instead of leaking a seam onto it.
  • Floating bus on write-only registers. Reading a write-only custom register returns the residue of the last driven chip-bus cycle, not a clean zero -- so guest code that reads BPLCON3 back and trusts the result now misbehaves exactly as it does on real silicon. Reported from real AGA hardware by Brazen Gameplay during Urb-X Warriors development.
  • AGA palette banking. CPU palette writes resolve against the live BPLCON3 bank, and an out-of-range playfield priority blanks the playfield on Denise only, matching photographed real-chip behavior (the Bubble and Squeak and Alfred Chicken in-game graphics).
  • IDE per-device registers. Each ATA device keeps its own cylinder registers, as on real hardware where the signature a driver probes belongs to the selected device.
  • RAM power-on fill. Cold-boot RAM contents are configurable -- zero, seeded random or a fixed 16-bit pattern -- for software whose behavior depends on what a real machine's DRAM woke up holding.
  • Volume labels in Latin-1. Host volume names are converted to the Amiga's own character set, so an accented label survives the trip into AmigaDOS (Volker Schwaberow).

Desktop, tooling and platform

  • Deterministic control stepping. Stopping a session at an exact time through the control protocol no longer perturbs the timeline: a single run_until and the same span sampled in ten stops now end on the identical cycle, so an investigation can add observation points without changing what it observes. COPPERLINE_DBG_LISTCHECK audits Exec list integrity as a bounded one-report diagnostic.
  • Tool windows no longer swallow input. Opening the debugger or another tool window leaves main-window Amiga input alive.
  • WasmBoard fault isolation. A trapping WASM plugin board is isolated permanently instead of re-trapping every frame, and its DMA commits transactionally (Volker Schwaberow).
  • Faster host-mounted volumes. A two-level case-insensitive LRU path cache speeds up directory-mounted filesystems (Volker Schwaberow).
  • Debugger fixes. The memory-scan address is masked to the bus width and copper-list disassembly aligns to the list start (Volker Schwaberow), and the disassembler's ALU formatting is deduplicated (Volker Schwaberow).
  • HostSocket. The bsdsocket.library LVO table extends through the real end of the jump table, so software indexing deep LVOs finds them (Simon Dick).
  • Dependencies. The dependency tree moves to current releases; the m68k core at 0.10.14 fixes a real 68000 MOVEM.L bus-order bug that corrupted lide.device sector reads under real Kickstart.
  • Homebrew installs from the release archive again (the v0.15.0 formula needed a fix).

External contributions

Copperline welcomes a new contributor this cycle: Volker Schwaberow (@vschwaberow), who arrived with five merged PRs -- WasmBoard fault isolation and transactional DMA, the host-filesystem path cache, two debugger fixes, Latin-1 volume labels and a disassembler cleanup. Welcome aboard.

  • Lee Hobson (@hobbo91) again wrote more code this cycle than the maintainer did: the WHDLoad game library with OpenRetro details and cover art plus its A-Z navigation, the Create Image workshop, the configurable-paths system with portable mode and the saved default config, and the rebuilt 1084 bezel.
  • Simon Dick (@sidick) contributed the lide.device-compatible IDE board with ATAPI CD-ROM and host-disk support, OFS for directory-mounted hard drives (booting real Kickstart 1.3 to Workbench), the launcher's directory picker, and the full-length bsdsocket LVO table.
  • Brazen Gameplay, who are using Copperline to develop Urb-X Warriors: The Lost City, a new 16-bit Amiga game, fed back findings from running their work-in-progress on Copperline beside real AGA hardware. The floating-bus model, the BPLxPT live-counter fix, the wide-fetch origin fix and the deterministic control stepping all trace to that collaboration. If a new commercial Amiga platformer sounds like your thing, their Kickstarter page is the place to follow it.

Installation

Browser (no install): copperline.dev/try

macOS (Homebrew):

brew tap copperlinehq/copperline https://github.com/CopperlineHQ/Copperline
brew install copperline

macOS (DMG): download Copperline-0.16.0-macos-universal.dmg below, open it, and drag Copperline.app to Applications. The app is ad-hoc signed but not notarized, so first launch may require right-clicking the app and choosing Open.

Linux (AppImage): download Copperline-0.16.0-x86_64.AppImage below, then:

chmod +x Copperline-0.16.0-*.AppImage
./Copperline-0.16.0-*.AppImage

Windows: download and extract the portable Copperline-0.16.0-win-x64.zip below.

From source:

cargo build --release
./target/release/copperline

The bundled AROS boot ROM lets Copperline run out of the box. A real Kickstart ROM and disk, hard-disk, or CD images are still required to run commercial Amiga software; these are not included. WHDLoad boot fetches its freeware support archives at packaging time, and the Kickstart images it stages are likewise yours to supply.

Full changelog: https://github.com/CopperlineHQ/Copperline/compare/v0.15.0...v0.16.0

Copperline 0.15.0

v0.15.0 release
Release notes · 5 files

Copperline 0.15.0 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. A new HostSocket board gives guest applications BSD sockets with no TCP/IP stack to install in the guest at all. And 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 and weak hosts. As always it is a hardware-behavior release: compatibility fixes model the underlying Amiga subsystems rather than individual titles.

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, since a track's first read always streams at the platter's own pace -- 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.

One default changed: an A4091 SCSI board with no ROM path now boots the bundled open-source A4091 ROM (v42.39) instead of requiring you to supply an EPROM image. Machines that set an explicit ROM path are unaffected.

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

Highlights

  • A Roland MT-32. [midi] midi_out = "mt32" routes the machine's MIDI port to an emulated MT-32 built into Copperline -- the synthesiser engine is mt32-rs, grown from Munt -- mixed beside Paula's output. It is the whole unit, not just the sound: a front panel under the display with the module's own buttons, the service screens when started holding them, ROM Play for the demo songs the control ROM carries, and 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.
  • 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. 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. Attach points cover IDE master/slave and SCSI IDs 0-6; --list-disks shows what the host has. Contributed by Lee Hobson.
  • HostSocket networking. A new 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.
  • 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, 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). 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 redesigned menu. The pop-up menu is now a proper tree: walk it 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 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.
  • The browser build on phones. The copperline.dev/try page draws an on-screen A600 keyboard for phones and tablets (or summons the device's own keyboard beside it), presents on the 1084 monitor, 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.
  • 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/Amiberry -- pair 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.
  • Booting from a host folder under Kickstart 1.3. 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

  • AGA lo-res fetch. 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.
  • Wide-FMODE scroll. Scroll taps fold at the absolute-grid arrival phase in wide fetch modes, fixing the fold boundary (the Roots II AGA folder).
  • HAM at the left edge. 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).
  • 68020+ chip access. The 020 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.
  • 68020 bit fields. A memory bit field transfers at the width it spans, and the three-byte operand is sized by the port that answers it.
  • Floppy writes. A track just written to a bridged real drive is not read back until the platter actually has it.
  • Serial. An undrained host pty no longer blocks the emulator (Bernie Innocenti).
  • Z3660 RTG. A rect copy honours its minterm (Bernie Innocenti).

Desktop, tooling and platform

  • A4091 boot ROM bundled. 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).
  • Window robustness. 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 serialize on one shared device helper, fixing a Windows access violation.
  • Dependencies. The 68k core moves to the published m68k 0.7 crate, and a pre-release hardening pass updates the dependency tree.
  • Bundled AROS ROM refreshed to upstream master.
  • CI. The web pipeline pins modern binaryen and smoke-loads the published bundle before it goes out; MIDI tests are isolated from the host's real devices.

External contributions

This cycle, for the first time, most of the new code came from outside the project -- external contributors wrote more lines than the maintainer did:

  • 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 frame choice.
  • 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.

Installation

Browser (no install): copperline.dev/try

macOS (Homebrew):

brew tap copperlinehq/copperline https://github.com/CopperlineHQ/Copperline
brew install copperline

macOS (DMG): download Copperline-0.15.0-macos-universal.dmg below, open it, and drag Copperline.app to Applications. The app is ad-hoc signed but not notarized, so first launch may require right-clicking the app and choosing Open.

Linux (AppImage): download Copperline-0.15.0-x86_64.AppImage below, then:

chmod +x Copperline-0.15.0-*.AppImage
./Copperline-0.15.0-*.AppImage

Windows: download and extract the portable Copperline-0.15.0-win-x64.zip below.

From source:

cargo build --release
./target/release/copperline

The bundled AROS boot ROM lets Copperline run out of the box. A real Kickstart ROM and disk, hard-disk, or CD images are still required to run commercial Amiga software; these are not included. The MT-32's control and PCM ROMs are likewise yours to supply.

Full changelog: https://github.com/CopperlineHQ/Copperline/compare/v0.14.0...v0.15.0

Copperline 0.14.0

v0.14.0 release
Release notes · 5 files

Copperline 0.14.0 is the release where the emulator reaches out of the host machine. It drives real 3.5" floppy drives through DrawBridge, Greaseweazle and SupercardPro controllers, so the machine in the window reads the disks on your desk; it attaches the guest's Ethernet card straight to a host network adapter, so the Amiga sits on the real LAN; and it brings RTG to the 24-bit machines with the Zorro II Picasso II and Picasso II+, so an A2000-class machine gets high-colour Workbench too. Around the machine, the window learns to look like the monitor it deserves -- CRT shaders, screen tints and a 1084-style front bezel -- and picks up rewind, quick-save slots, autofire and input remapping. Underneath, an experimental JIT CPU mode runs accelerator-class speeds, and a WinUAE-inspired debugging suite lands: a chipset-misuse validator, a self-modifying-code detector, per-DMA-channel watchpoints and a memory heat map. As always it is a hardware-behavior release: compatibility fixes model the underlying Amiga subsystems rather than individual titles.

Compatibility notes

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

No config file changes are required -- no TOML key or CLI flag was removed or renamed, the new keys are all additive, and no existing default changed. Two behavioral notes:

  • The bundled AROS boot ROM was refreshed (three times: an NTSC boot fix, an input-event buffering fix, and a final sync to upstream), so machines booting the bundled ROM behave slightly differently out of the box -- NTSC configurations now boot without the previous warning.
  • A machine with a bridged (real) floppy drive is paced to wall-clock time -- a real mechanism cannot warp -- so headless runs against a bridge are no longer unthrottled. Image-backed machines are unaffected.

Highlights

  • Real floppy drives. Any drive bay can host a real 3.5" mechanism through Rob Smith's FloppyBridge, which is built into Copperline by cargo -- nothing to install. [floppy.df1] bridge = "greaseweazle" (or "drawbridge", "supercardpro") puts the physical drive on the emulated bus: the guest reads, writes and steps the real disk, drive mechanics stay real-time, and the port auto-detects (bridge_port, bridge_cable and bridge_density override). A per-bay launcher page configures it, and bridge serving speeds were subsequently tuned so loading from a real drive is as quick as the mechanism allows. Contributed by Lee Hobson.
  • Picasso II and Picasso II+ RTG. The Village Tronic Picasso II (CL-GD5426) and Picasso II+ (CL-GD5428) are emulated as Zorro II autoconfig boards driven by the unmodified Picasso96 PicassoII.card driver. Because they are Zorro II cards they work with 24-bit CPUs, so RTG Workbench is no longer reserved for the big boxes -- a stock-CPU machine with Zorro slots gets high-colour screens too. [rtg] card = "picasso2plus" selects one, vram = "1M"|"2M" sizes it, and the Z3660 remains the default Zorro III card on 32-bit-bus machines.
  • Bridged Ethernet. The A2065 gains [a2065] net = "bridge", which attaches the guest's complete Ethernet frames directly to a named host adapter (interface = "en0"; list candidates with --list-net-interfaces). The Amiga becomes a first-class citizen of the LAN -- DHCP from your router, static addressing, local servers -- on Linux, macOS and Windows, with Wi-Fi supported best-effort. The user-mode NAT backend from 0.13.0 remains the zero-setup default.
  • Experimental JIT CPU mode. [cpu] jit = true switches a 68020 or later to the m68k core's batch/trace-JIT path: the machine behaves like an ideal accelerator at clock_mhz, one instruction per CPU clock with zero-wait fast RAM -- a 50 MHz 68040 runs on the order of 50 MIPS, and the launcher's clock presets now reach 100 and 200 MHz. The on-chip cache models stay active and chip/slow RAM keep their shared-bus arbitration, as on a real accelerator; cycle-counted chip-level effects no longer line up, which is why it is off by default.
  • Rewind and quick-save slots. [emulation] rewind (or the Rewind menu item) records the whole machine at an interval into a bounded memory budget, and Cmd+Z / Alt+Z steps it back -- a 512K A500 buys minutes of history. Ten numbered quick-save slots sit alongside: Cmd/Alt+<digit> saves, Cmd/Alt+Shift+<digit> loads, no dialog, no file to name.
  • The window becomes a monitor. A GPU shader pass over the display offers three built-in CRT presets -- scanlines, mask and crt -- or loads your own WGSL file, mixed in by shader_strength. [display] bezel (toggle live with Cmd+M / Alt+M) frames the picture in a 1084-style monitor front, with a Copperline badge and a power LED that follows the guest's /LED line and burns brighter while the audio filter is engaged; a HDD LED lights on host-folder filesystem access. [display] tint filters the screen through black-and-white, green or amber monochrome phosphor, or sepia. All of it is window-only: screenshots, frame dumps and headless captures are never shader-processed, tinted or framed.
  • Input quality-of-life. Autofire pulses a held fire button at 3-30 Hz on emulated time (scripted input is never gated, so replays stay exact). The new Input Mapping window edits the keyboard-joystick and shortcut maps with one-meaning-per-key validation. Host mouse sensitivity is adjustable from quarter to quadruple speed, and a mouse-capture policy chooses between click-to-grab, grab-on-focus and manual-only (Cmd+G / Alt+G), fixing three capture defects along the way.
  • A debugging suite. The headless debugger and debugger GUI gain a WinUAE-inspired set: a custom-register access validator that reports chipset misuse with the PC that caused it ([debug] validate_chipset) backed by a last-writer table, a self-modifying-code detector (detect_smc), bus-error injection, per-DMA-channel and PC-qualified watchpoints, blitter/floppy/keyboard hardware-misuse checks, and a memory heat map tab in the Frame Analyzer showing where the frame's traffic lands. The console dumps ExecBase scheduler state and struct Task. Scripting gains absolute pointer positioning -- --mouse-to-after SECS X Y steers the pointer to a screen pixel via a sprite-0 servo -- and the control protocol adds capture.region_digest, a run-until-stable-frame target, watch qualifiers in break.list, and scheduled input that survives session reconnects.
  • Host volumes under Kickstart 1.3. Host-directory (hostfs) volumes now mount under Kickstart 1.3, so a plain 1.3 machine can read and write a folder on the host. Contributed by Simon Dick.
  • Browser build. The web build gains PAL/NTSC machine selection with overscan and tint display controls, remembers the Kickstart across visits, names its save states alongside the quick slot, and holds a screen wake lock so a long game does not dim the phone. The hosted copperline.dev/try page installs as a PWA and boots offline.
  • Performance. A four-part optimisation pass over the render and chipset hot paths -- DDF arbitration, planar row conversion, caching of stable display and DMA line work, and idle/repeated-frame presentation -- cuts host CPU cost across the board, and an idle launcher no longer spins a busy redraw loop.

Hardware accuracy fixes

  • HAM select timing. A mid-line write that flips HAM lands in Denise's colour-selection phase, not the bitplane phase, matching measured hardware -- fixes stale colours in HAM demos that switch mid-screen.
  • Manual bitplane writes. CPU/Copper-written BPLxDAT batches snap to the serialiser's word-load grid, fixing displays that hand-feed the serialiser (the Hamazing Hexagon left edge).
  • 68020 pipeline. The 020 charges its pipeline refill on taken branches per the datasheet tables, with the DBcc refill folded into its table entry (Cubic Dream's 020 timing).
  • Sprite DMA. A DMA sprite line disarmed by a CTL write before its HSTART is cancelled, as on real Denise (the Hybris status panel).
  • 68000 split writes. A 68000's word write split across the services board's MMIO doorbell fires the doorbell correctly (Simon Dick).
  • Z3660 blitter. Planar blits honour their minterm, and P2D NOTSRC looks up the complemented pen (Bernie Innocenti).
  • Presentation. Geometry latches across border-only frames (no more one-frame jumps when a loader blanks the screen), and the live TV view centres on the captured aperture; the NTSC TV-aperture crop extends to standard 60 Hz scans.

Desktop, tooling and platform

  • Launcher. CD folds into a Storage tab with footer sub-page navigation, hard disks gain a Boot Priority sub-page, unavailable settings dim in place instead of vanishing, and a pass of cosmetic tidy-ups lands across the tabs. In the config, a hard drive can be a table -- unit0 = { path = "wb.hdf", bootpri = 6 } -- to set boot priority and directory-mount volume names.
  • Audio filter override. [audio] audio_filter = "auto"|"on"|"off" (and Cmd+A / Alt+A) forces Paula's low-pass filter regardless of the guest, with the power LED reflecting it as on the real machine (Lee Hobson).
  • Window state. Fullscreen and status-bar visibility persist in the config, manual resizes survive status-bar toggles, tool windows resize correctly, Wayland resizes apply synchronously (Bernie Innocenti), and cursor hits map correctly under fractional display scaling.
  • The 68k core is now the published m68k crate. The vendored fork moved to crates.io as m68k 0.3, so Copperline builds against the published package (Ben Letchford). The Flatpak moves to Freedesktop SDK 25.08 (Ben Letchford).
  • Bundled AROS ROM refreshed to upstream, picking up the NTSC boot fix and an input-event buffering fix.
  • CI. Functional boot smokes now run on Linux, macOS and Windows -- including the released artifacts -- A2065 networking is exercised in CI, and the Windows checks fan out from a shared build.

External contributions

  • Lee Hobson (@hobbo91) contributed real floppy drive support through FloppyBridge -- the headline feature of the cycle -- plus the faster bridge serving speeds and a round of bridge-mode fixes, the Paula audio-filter override with the power LED rework, adjustable mouse sensitivity, persisted window state, the status-bar resize fixes, and a series of launcher improvements: the Storage tab, the Boot Priority sub-page, dimmed unavailable settings and cosmetic tidy-ups.
  • Bernie Innocenti (@codewiz) fixed the Z3660's planar-blit minterms and P2D NOTSRC lookup, made Wayland window resizes apply synchronously, improved the console's task-state reporting, and let the OS helpers follow exec structures into A3000/A4000 motherboard RAM.
  • Simon Dick (@sidick) made hostfs volumes mount under Kickstart 1.3 and fixed MMIO doorbells for the 68000's split word writes.
  • Nicolas Ramz (@warpdesign) lit the HDD LED on host-folder filesystem access and redesigned the reset button glyph.
  • Ben Letchford (@benletchford) moved the 68k core to the published crates.io m68k 0.3 crate and updated the Flatpak to Freedesktop SDK 25.08.

Installation

Browser (no install): copperline.dev/try

macOS (Homebrew):

brew tap copperlinehq/copperline https://github.com/CopperlineHQ/Copperline
brew install copperline

macOS (DMG): download Copperline-0.14.0-macos-universal.dmg below, open it, and drag Copperline.app to Applications. The app is ad-hoc signed but not notarized, so first launch may require right-clicking the app and choosing Open.

Linux (AppImage): download Copperline-0.14.0-x86_64.AppImage below, then:

chmod +x Copperline-0.14.0-*.AppImage
./Copperline-0.14.0-*.AppImage

Windows: download and extract the portable Copperline-0.14.0-win-x64.zip below.

From source:

cargo build --release
./target/release/copperline

The bundled AROS boot ROM lets Copperline run out of the box. A real Kickstart ROM and disk, hard-disk, or CD images are still required to run commercial Amiga software; these are not included.

Full changelog: https://github.com/CopperlineHQ/Copperline/compare/v0.13.0...v0.14.0

Copperline 0.13.0

v0.13.0 release
Release notes · 4 files

Copperline 0.13.0 is the release where the emulated machine grows past the classic chipset. It gains RTG graphics through the Z3660 Zorro III board, so Workbench runs in high-colour, high-resolution Picasso96 screens; it fills in the big-box memory maps with Ramsey motherboard fast RAM and CPU-slot accelerator RAM; it puts a real Ethernet card on the bus with a user-mode NAT backend that needs no privileges or setup; and it dials a telnet BBS from the browser over emulated serial. A deep pass on 68040/68030 exception dispatch under the MMU, together with a corrected 31 kHz programmable-scan display path, is enough to boot Debian Linux/m68k to a pixel-sharp login prompt. As always it is a hardware-behavior release: compatibility fixes model the underlying Amiga subsystems rather than individual titles.

Compatibility notes

Save states from 0.12.0 do not load in 0.13.0. The serialized machine shape changed repeatedly this cycle (the RTG board, motherboard and accelerator RAM, the Ricoh battery clock and its battery RAM, the rebuilt drive-sound engine), so the state format version moves from 32 to 40. Re-create snapshots after upgrading.

No config file changes are required -- no TOML key or CLI flag was removed or renamed, and 0.12.0 configs continue to parse. Several defaults changed, which is what to check if a machine behaves differently:

  • An RTG card is now fitted by default on any machine whose CPU has a 32-bit address bus -- the stock A3000 and A4000, or any profile given a 68020+ full-bus CPU. A Zorro III board joins the autoconfig chain; [rtg] card = "none" removes it.
  • A3000 and A4000 profiles come with 4 MB of Ramsey motherboard fast RAM fitted. [memory] motherboard = "0" removes it.
  • A3000 and A4000 now default to the Ricoh RP5C01 battery clock rather than the OKI MSM6242. AmigaOS probes for either part so the difference was invisible, but Linux/m68k hard-assumes the Ricoh on big boxes. [machine] rtc_chip overrides.
  • A battmem.nvram file is created in the working directory on any machine with an RP5C01 fitted, so the clock's battery RAM persists across runs. [machine] battmem = "" keeps it session-only.
  • The 68020 and A1200 profiles run at a different (more accurate) speed. A1200 SysInfo moves from 1.61x to 1.10x CPU and 5.52x to 3.55x chip against reference. Anything calibrated against the old, too-fast A1200 will behave differently.
  • Machines with no battery clock now correctly report that they have none. A floating $DC0000 bus previously made AmigaOS believe a clock was fitted and invent a date; affected guests now say Battery Backed up Clock not found, which is what the real machine says.
  • Drive sounds sound different, rebuilt from measurements of real mechanisms; the read-gated hiss layer is gone.

Highlights

  • RTG graphics. The Z3660 accelerator's FPGA RTG core is emulated as a Zorro III autoconfig board with a 128 MB window, driven by the unmodified open-source Z3660.card Picasso96 driver: Workbench in 8, 16 and 32-bit RTG modes, blitter operations, DRAWLINE, planar-to-chunky and planar-to-direct blits, hardware-sprite compositing including wide and doubled sprites, native-resolution presentation with chipset fallback, and pixel-centre screenshot downscaling. The card is selected with [rtg] card or the launcher's System tab, and comes fitted by default wherever the machine can host one. Contributed by Bernie Innocenti.
  • Linux/m68k boots. A pass over the 68040/68030 core takes exception dispatch through the MMU the way real silicon does, and fixes the MOVES fault frame, writeback data, invalid-fetch faults, autovector handling, and FSAVE/FRESTORE across all control addressing modes. Together with the display work below, Debian 3.1 for m68k goes from dying in a Line-F handler to running a console at a login prompt on an A4000/68040.
  • Correct 31 kHz programmable-scan display. The Denise H counter restarts at 0, DIW-relative placement scales properly in super-hi-res, and presentation anchors at the HSYNC pulse like a real multisync monitor -- the Linux amifb console was losing about 22 characters off every line. Super-hi-res colour output is also fixed: each 35 ns sample resolves through the full palette instead of a two-bit pair encoding, which is what turned Tux green and fringed text red and cyan, and a double-width 35 ns canvas makes programmable SHRES pixel-sharp.
  • Big-box memory maps. Ramsey-controlled motherboard fast RAM sits in 32-bit local space on the A3000 and A4000, sized by Kickstart's own probe ([memory] motherboard, 1M-4M in 1M steps or 8M/12M/16M). The A4000 gains its $04000000-$06FFFFFF motherboard expansion space up to 64 MB, and any 32-bit-CPU profile -- including an accelerated A1200 -- gains CPU-slot accelerator fast RAM up to 128 MB ([memory] accelerator).
  • Ethernet that just works. The A2065 gains a slirp-style user-mode NAT backend ([a2065] net = "nat", --a2065-net nat, or the launcher's I/O Ports tab): outbound IPv4 for the guest with no privileges, no host drivers and no setup, identically on Linux, macOS and Windows. The guest sees 10.0.2.15/24 with a built-in BOOTP/DHCP server. The Am7990 LANCE model was hardened until a real SANA-II a2065.device works end to end.
  • Telnet BBS over emulated serial. A browser WebSocket bridge with a full telnet NVT layer runs a BBS from the browser build through plain serial.device, and the desktop dials out natively with [serial] mode = "tcp-connect" / --serial-connect HOST:PORT. Dialling is gated on the guest asserting DTR and going quiet, so boot chatter cannot leak into a session as phantom keypresses.
  • Configurable floppy speed. [floppy] speed / --floppy-speed runs drives at 100 (default), 200, 400 or 800 percent, or 0 for turbo. The percentage modes stay bit-identical per cell and turbo still runs through the ordinary bit engine; drive mechanics -- spin-up, stepping, settle -- always stay real-time, so the acceleration cannot break loaders that time the mechanism.
  • Authentic drive sounds. Step, seek and spin voices were re-synthesized against spectra measured from real A500 and A600 mechanisms: a step clack with its rebound cluster, seek buzz as a measured harmonic comb, and revolution-locked spin texture. No sample data ships; it is all synthesis.
  • The browser build became a real frontend. Machine model select (A500 or AGA A1200, live-switchable carrying ROM and disks across the rebuild), save states as downloadable .clstate files interchangeable with desktop builds plus an IndexedDB quick slot that survives a page reload, gamepads in both ports for two-player, pause and screenshot-to-clipboard, a front-panel status strip with LEDs and a track counter, a copperline.json site config file, a Kickstart list select for site-served ROMs, mono audio, and fullscreen that keeps 4:3 on any page shell.

Hardware accuracy fixes

  • AGA display. Alien Breed II's horizontal scroll jump is fixed by modelling how Agnus masks an off-grid DDFSTRT to the fetch grid on wide FMODE, folding BPLCON1 scroll taps into the early masked fetch start (band map corroborated against FS-UAE). The FMODE SSCAN2 high-bit mask is modelled in the rendered, manual and collision sprite paths, so sprite HSTART $165 correctly aliases $065.
  • 68020 timing. The MC68020 model now follows the datasheet Cache Case and Worst Case tables, requiring the whole instruction stream including extension words to be cached before it can claim the Cache Case, and models the A1200 Alice data-return phase.
  • Battery clock presence. The $DC0000 page's byte lanes are modelled -- the MSM6242 is a 4-bit part on the low lane, and the unfitted odd lane reads $40 as measured on real A500 hardware -- so Kickstart 1.3 stops inventing a date out of DMA noise.
  • Byte-swapped ROM images. ROMs stored in EPROM-programmer byte order are detected from the header and swapped on load, so they boot like their conventional twins. Hi/lo split chip pairs remain unsupported.
  • CD32 NVRAM. Saved games are no longer silently lost when the backing-file write fails: the dirty bit clears only after a successful write, so the flush retries on the next I2C STOP.
  • Machine profiles built directly rather than through the config pipeline now derive their Agnus and Denise revisions and CPU-implied FPU and cache defaults, which is why the browser A1200 was detecting only half its chip RAM.
  • Zorro bus-master DMA reaches motherboard and accelerator RAM, so an A4091 finds its SCSI units on the A4000 profile, and the host-filesystem services board decodes the new RAM banks.

Desktop, tooling and platform

  • Fullscreen and status bar. Borderless fullscreen toggles with Cmd+F / Alt+F, and the status bar hides with Cmd+Shift+F / Alt+Shift+F, the display scaling up into the reclaimed space.
  • Headless capture needs no display server. --screenshot-after and --dump-frames drive a windowless loop with no winit event loop or window at all, so capture runs work over SSH, in sandboxes, and from agent sessions where creating a window would abort or hang. Screenshots are byte-identical to the old path, and a run whose machine halts early now errors instead of hanging.
  • Crash reports. Panics write a copperline-crash.txt report next to the executable with version, host, timestamp, message and a forced backtrace -- Windows double-click launches previously lost the panic entirely.
  • Windows launcher fix. Pressing Run on the configuration screen no longer crashes Windows builds; the main thread is linked with an 8 MiB stack instead of the 1 MiB Windows reserves by default. This was the known issue that shipped with 0.12.0.
  • Launcher. Serial and Parallel merge into one I/O Ports tab, the printer becomes a selectable device with an output-file browser, Host Mounts moves under Hard Disk, the A2065 gains a picker, and a config's unreadable ROM keeps its underlying cause in the status line instead of reading like progress.
  • Security and dependencies. anyhow, memmap2 and quick-xml move for RUSTSEC advisories, and the WASM plugin host moves from an unmaintained wasmtime pin to the 36 LTS tip.
  • Bundled AROS ROM refreshed to upstream master, picking up m68k boot-time optimizations, the boot-animation rendering fix, Workbench and console speedups, and a fix for the Boot Options menu crashing on machines with RDB drives on an A4091.

External contributions

  • Bernie Innocenti (@codewiz) contributed the Z3660 RTG video board -- the project's first RTG card and the single largest contribution of the cycle -- including the [rtg] card selection, the launcher RTG picker, and bulk CLUT palette upload so 8-bit RTG screens work with current Z3660.card firmware. He also fixed Zorro bus-master DMA reaching motherboard and accelerator RAM (which is what stopped the A4091 finding SCSI units on the A4000), and made host-directory file handles writable so Workbench can snapshot icons on a HOSTFS volume.
  • Lee Hobson (@hobbo91) fixed the Windows configuration-screen crash that shipped with 0.12.0, built the merged I/O Ports launcher tab with the printer device and the Host Mounts sub-page, added the hide-status-bar shortcut and menu item, fixed fullscreen scaling when going fullscreen before pressing Run, and made the launcher keep the underlying cause when a config's ROM cannot be read.

Installation

Browser (no install): copperline.dev/try

macOS (Homebrew):

brew tap copperlinehq/copperline https://github.com/CopperlineHQ/Copperline
brew install copperline

macOS (DMG): download Copperline-0.13.0-macos-universal.dmg below, open it, and drag Copperline.app to Applications. The app is ad-hoc signed but not notarized, so first launch may require right-clicking the app and choosing Open.

Linux (AppImage): download Copperline-0.13.0-x86_64.AppImage below, then:

chmod +x Copperline-0.13.0-*.AppImage
./Copperline-0.13.0-*.AppImage

Windows: download and extract the portable Copperline-0.13.0-win-x64.zip below.

From source:

cargo build --release
./target/release/copperline

The bundled AROS boot ROM lets Copperline run out of the box. A real Kickstart ROM and disk, hard-disk, or CD images are still required to run commercial Amiga software; these are not included.

Full changelog: https://github.com/CopperlineHQ/Copperline/compare/v0.12.0...v0.13.0

Copperline 0.12.0

v0.12.0 release
Release notes · 4 files

Copperline 0.12.0 takes the emulator to new places: it now runs in the browser as a WebAssembly build, boots the big-box A3000 and A4000 with their onboard SCSI and IDE controllers, mounts host directories as fully writable AmigaDOS volumes, and grows a JSON-RPC control protocol for scripted live sessions. On the hardware side this release adds SCSI CD-ROM drives with CD audio, puts any controller device in either game port, plugs printers and audio samplers into the parallel port, and lands a round of chip-bus mirroring and display accuracy fixes. As always it is a hardware-behavior release: compatibility fixes model the underlying Amiga subsystems rather than individual titles.

Known issues

  • Windows: pressing Run on the configuration screen crashes 0.12.0 (#225). The Windows build quits silently the moment a machine is started from the launcher's Run button, whatever the settings, config, or ROM. Windows gives a program's main thread 1 MiB of stack where macOS and Linux give 8 MiB, and 0.12.0's machine construction outgrew that limit when invoked from inside the window event loop. The fix (#227, thanks @hobbo91) links Windows binaries with an 8 MiB main-thread stack and ships in the next release; until then, use 0.11.0 on Windows.

Compatibility notes

Save states from 0.11.0 do not load in 0.12.0: the serialized machine shape 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 additions, and 0.11.0 configs continue to parse. One behavior change to note: the [input] joystick mode no longer has an "auto" keyboard fallback. The default is now "gamepad" (a physical pad drives the port, the keyboard passes through to the Amiga), and the cursor-key joystick mapping is an explicit opt-in with joystick = "keyboard". Existing configs with joystick = "auto" still parse (it maps to "gamepad").

Highlights

  • Copperline in the browser. A WebAssembly build of the emulator runs entirely client-side, and is live at copperline.dev/try: it boots the bundled AROS ROM out of the box, loads your own Kickstart and disk images from the page (or straight from URL query parameters), and supports drag-and-drop, a keyboard joystick, touch input with a trackpad-style mouse and an on-screen joystick, and fullscreen on iPhone Safari. A prefilled GitHub bug-report link captures the machine state when something goes wrong.
  • A3000 and A4000 machine profiles. The big-box Amigas boot, each off its own built-in disk controller: the A3000 brings the Super DMAC with the onboard WD33C93 SCSI bus, the A4000 the motherboard IDE port at $DD2020, and both the Ramsey memory controller, the Fat Gary bus controller, and a motherboard battery clock. The profiles are new and still incomplete, but both boot AmigaOS from their native controllers. A new rom_scsi_device_disable knob skips the ROM's scsi.device when its bus has no drives, saving the boot-time probe of an empty bus.
  • Writable host-directory mounts. The [[filesys]] HOSTFS volumes introduced in 0.11.0 are no longer read-only: the guest now reads and writes the host's files directly, with Amiga protection bits, comments, and datestamps persisted to .uaem metadata sidecars, host UTF-8 filenames mapped to AmigaDOS Latin-1, delete-protection honored, and ACTION_EXAMINE_ALL supported for modern directory scanners. The services board moved from A-line traps to MMIO registers, packets are routed by explicit mount unit, and the launcher gained a Host Mounts tab with per-mount read-write/read-only access control (readonly = true exports a directory write-protected).
  • Copperline Control Protocol. A JSON-RPC 2.0 interface over loopback TCP (--control, with the copperline-ctl client) drives live sessions from scripts and AI agents: breakpoints and stepping, input injection, media swaps, screenshots, save states, and streaming observability (frame, serial, interrupt, and media event subscriptions with bounded queues), plus runtime-bracketed instruction traces and waveform captures. --control-gui attaches the same server to a windowed session. See docs/debugger/control.md.
  • SCSI CD-ROM drives. 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.
  • Any controller in either game port. Both game ports now take any device, as on a real Amiga: mouse, joystick, cd32 pad, analogue paddles on the POT pins, or none ([input] port1/port2, --port1/--port2, hot-pluggable from the runtime menu). Scripted input flags aim at either port, --pot-after scripts analogue positions, and two-mouse and two-joystick setups get sensible host keyboard mappings.
  • Parallel-port peripherals. The Centronics port is now a modelled connector with pluggable devices: a printer that captures the raw strobed byte stream to a host file, and an 8-bit audio sampler fed from a host capture device -- the emulated equivalent of a classic parallel-port digitizer cartridge, usable from AudioMaster, ProTracker, OctaMED, and friends. The BUSY/POUT/SEL status lines are driven by the attached peripheral.
  • Deterministic guest clock. rtc_time seeds the battery clock to a fixed instant and ticks it in emulated time, so the guest boots to the same time on every run -- the way to test time-dependent guest software reproducibly. rtc_frozen pins the clock exactly, and the control protocol reads and sets it at runtime.

Hardware accuracy fixes

  • Chip bus. Chip RAM mirrors across the full chip window by Agnus address reach, so loaders that park the stack above the installed chip RAM see the mirror instead of a bus fault (an Action Replay-style boot guru was the regression example). Custom registers mirror into the empty chip-register decode space the way Gary resolves them, which un-sticks Kickstart 1.2's memory-sizing probe (yellow-screen boot).
  • Denise display path. 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 (ECS overscan programs); and sprite DMA fetches land in a hardware-true display-latch view, so stale sprite rows can no longer leak into later frames.
  • Agnus identity. Every ECS Agnus reports the same chipset ID, matching real chips.
  • Filesystem/DOS ABI. ACTION_SEEK offsets are sign-extended, negative-offset seeks from big files now land where AmigaDOS expects.
  • POT circuit. The POT counter and pot-line models were finished alongside the analogue controller support.

Debugging and tooling

  • Waveform export. --waveform out.vcd captures chipset signals as a VCD trace for GTKWave, with --wave-trigger/--wave-duration windows, and the control protocol brackets captures at runtime.
  • GDB stub. Program-load (LoadSeg) events let a debugger break at the entry point of a program loaded inside the guest, and the stub survives client disconnects and reconnects.
  • Unmapped-access logging. [debug] log_unmapped logs every CPU access that no device decodes, scoped to an address window -- the quick way to find registers a guest expects that Copperline does not provide yet.
  • Docs site. The themed HTML manual now publishes to copperline.dev/docs on release, and a public AGENTS.md documents the headless workflow for AI coding agents.
  • The frame analyzer snaps a pre-display scrub selection to the frame end instead of showing a stale picture.

External contributions

  • Bernie Innocenti (@codewiz) contributed the A3000 and A4000 machine support (the Ramsey memory controller, the Fat Gary bus controller, the Super DMAC with the onboard WD33C93 SCSI bus, and the A4000 motherboard IDE), host-directory write support with .uaem sidecar metadata and Latin-1 filename mapping, ACTION_EXAMINE_ALL, the MMIO services-board rework with per-unit packet routing, the launcher Host Mounts tab and access control, unmapped-access logging, the uniform ECS Agnus chipset ID, the empty-bus scsi.device skip, and the ACTION_SEEK sign-extension fix.
  • Lee Hobson (@hobbo91) contributed the parallel-port audio sampler.
  • Thanks to @warpdesign for the upstream AROS boot-time optimizations: the bundled AROS boot ROM was rebuilt to include them, and the out-of-the-box no-Kickstart boot is now dramatically faster.

Installation

Browser (no install): copperline.dev/try

macOS (Homebrew):

brew tap LinuxJedi/copperline https://github.com/LinuxJedi/Copperline
brew install copperline

macOS (DMG): download Copperline-0.12.0-macos-universal.dmg below, open it, and drag Copperline.app to Applications. The app is ad-hoc signed but not notarized, so first launch may require right-clicking the app and choosing Open.

Linux (AppImage): download Copperline-0.12.0-x86_64.AppImage below, then:

chmod +x Copperline-0.12.0-*.AppImage
./Copperline-0.12.0-*.AppImage

Windows: download and extract the portable Copperline-0.12.0-win-x64.zip below. Note the known issue above: this build crashes when a machine is started from the configuration screen, so Windows users should stay on 0.11.0 until the next release.

From source:

cargo build --release
./target/release/copperline

The bundled AROS boot ROM lets Copperline run out of the box. A real Kickstart ROM and disk, hard-disk, or CD images are still required to run commercial Amiga software; these are not included.

Full changelog: https://github.com/LinuxJedi/Copperline/compare/v0.11.0...v0.12.0

Copperline 0.11.0

v0.11.0 release
Release notes · 4 files

Copperline 0.11.0 focuses on hardware fidelity and performance: host directories can now be mounted (and booted) as native AmigaDOS volumes, the blitter's BLTPRI bus fence and the 68000's microcode write ordering are modelled much more closely, sprite serialization and several display paths were fixed against cross-emulator and real-hardware references, frame-time spikes on slower hosts were eliminated, and a golden-render timing-probe suite now guards chipset timing in CI. As always it is a hardware-behavior release: compatibility fixes model the underlying Amiga subsystems rather than individual titles.

The display regressions noted as known issues in 0.10.0 are fixed in this release.

Required config changes

The experimental [a4091] section from 0.10.0 is gone: both SCSI boards now live under [scsi] with a controller key ("a2091", the default, or "a4091"). An existing [scsi] A2091 setup keeps working unchanged; an [a4091] section must be renamed to [scsi] with controller = "a4091".

All other new options ([[filesys]] mounts, [serial] mode = "pty") are optional additions, and omitted configs continue to parse.

Save states are compatible in both directions with 0.10.0: the state format version is unchanged.

Highlights

  • Host directories as AmigaDOS volumes. New [[filesys]] config mounts host directories as HOSTFS volumes through an autoconfig services board and a resident guest handler: full file I/O with FFS path semantics, file attributes from host permissions and .uaem sidecars, optional write protection, host path-escape hardening, warm-reboot survival, and bootable volumes via bootpri — a Workbench directory on the host can now boot the machine directly.
  • Blitter BLTPRI bus fence. BLTPRI now asserts BLS against the CPU the way Agnus does: the CPU is fenced off the chip bus during a blit's warm-up window, BLS pressure follows the blitter's per-slot micro-cycle, a blit with no channels enabled asserts no fence, and line-blit startup was shortened. This class fixes MFM-decoding trackloaders that rely on exact CPU/blitter interleaving (a Jim Power boot crash was the regression example).
  • 68000/68010 microcode write-ordering pass. A long series ordering register writes, ALU and address-calculation tails, and internal clocks against prefetch and bus sync the way the microcode does: EOR/EXG/BCD/Scc/MOVEM/ADDX/SUBX/MOVE USP/MOVEA/MOVE from SR, delayed SR writes, 68010 SR read ordering and long shift timing, CHK trap timing, multiply and division internal clocks, quick and bit ops, and 68020 Bcc long-displacement gating. The external RESET instruction is now modelled as a true warm reset.
  • Sprite serialization fixes. Denise emits a sprite's first pixel one lo-res pixel after the horizontal comparator match (measured against FS-UAE and vAmiga with new ruler probes), and a DATA-armed sprite keeps serializing on every line — across frames — until SPRxCTL disarms it. Together these improve 180 of 186 vAmigaTS sprite cases and fix long-standing demo sprite placement bugs.
  • Frame-spike elimination. Profiling on an i5-class machine (issue #99) removed per-colour-clock table copies in the bus hot path, per-pixel palette copies and a quadratic sprite-multiplexer scan in the renderer, and added p50/p90/p99/max frame-time reporting to --benchmark-until. Worst-case core frame time on the profiled workload dropped from 100.8 ms to 16.1 ms and audio underruns disappeared.
  • Golden-render CI suite. Every cargo test --release run now boots the committed timing-test/ probe binaries on the bundled AROS ROM and compares their rendered output pixel-for-pixel against blessed references: CPU/chip-bus timing rows plus DDF/DIW, sprite-position, blitter-pace, collision, and audio-enable probes. Intentional timing-model changes must re-bless the renders, so every chipset timing diff is reviewed as an image diff.

Hardware accuracy fixes

  • Copper. A post-WAIT wake-up must land on a colour clock free of fixed DMA; copper-sourced sprite repositions carry the WAIT-comparator lookahead; the closed-DIW border repaint follows per-pixel COLOR00 writes (fixes raced copper-chunky effects).
  • Agnus DMA and blitter. Fixed DMA slots are aligned with the hardware DAS table, BLS pressure is gated by the blitter micro-cycle, line blitter startup timing was shortened, and VHPOSR readback lead was tuned against the probe rows.
  • Denise display path. Bitplane scroll-in starts from empty line state; a BPLCON1 scroll covering an off-grid DDFSTRT catches the floor reload slot; hi-res bitplane content flushes at the 2H-196 window edge; AGA border sprites are suppressed during border blank; sprite DMA owns same-line reuse data.
  • Renderer and presentation. The renderer no longer synthesizes a picture for a line whose fetch never ran (phantom-line artifacts in overscan scrollers), and the TV aperture is black-padded past the framebuffer edge instead of repeating the last column.
  • Floppy. DSKLEN arming no longer waits for drive-ready: a spinning-up drive arms disk DMA normally, as on real hardware (fixes trackloader disk swaps that double-write DSKLEN right after motor-on, e.g. Shadow of the Beast disk 2). Step-click sound is gated on the /TRK0 sensor and the stepper mechanism floor.
  • Save states. Mid-blit state serializes deterministically (two saves of the same machine are byte-identical), backed by a new regression test that resumes a mid-blit save under live Copper and interrupt load and compares the continued timeline byte-for-byte.

External contributions

  • Bernie Innocenti (@codewiz) contributed the host-directory HOSTFS filesystem (services board, guest handler, DOS ABI layer, and boot support), the serial PTY sink (mode = "pty"), the unified [scsi] controller selection with its launcher picker, A4091 CTEST8.CLF FIFO clearing, and 68040 write-fault reporting in writeback slot 3.

Other improvements

  • timing-test/ gained the ddfprobe suite, manual/DMA sprite position probes, blitter-pace and audio-enable probes, and a 96-sector boot loader; tools/rowphase.py performs content-anchored per-beam-row comparison across Copperline, vAmiga, and FS-UAE output.
  • The debugger gained headless exception catchpoints, address filtering for CPU read traces, and low-memory blit crash diagnostics.
  • CI now runs the golden-render suite in parallel, boots DiagROM as a smoke test, and keeps the Windows/macOS/Linux packaging workflows as release build checks.
  • Documentation covers the [[filesys]] mounts, the unified SCSI configuration, and the expanded timing-probe workflow.

Installation

macOS (Homebrew):

brew tap LinuxJedi/copperline https://github.com/LinuxJedi/Copperline
brew install copperline

macOS (DMG): download Copperline-0.11.0-macos-universal.dmg below, open it, and drag Copperline.app to Applications. The app is ad-hoc signed but not notarized, so first launch may require right-clicking the app and choosing Open.

Linux (AppImage): download Copperline-0.11.0-x86_64.AppImage below, then:

chmod +x Copperline-0.11.0-*.AppImage
./Copperline-0.11.0-*.AppImage

Windows: download and extract the portable Copperline-0.11.0-win-x64.zip below.

From source:

cargo build --release
./target/release/copperline

The bundled AROS boot ROM lets Copperline run out of the box. A real Kickstart ROM and disk, hard-disk, or CD images are still required to run commercial Amiga software; these are not included.

Full changelog: https://github.com/LinuxJedi/Copperline/compare/v0.10.0...v0.11.0