Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Copperline

Abstract

Copperline is a cycle-driven Commodore Amiga emulator (OCS, ECS, and AGA) written in Rust. This document covers using the emulator, configuring machines from the A500 to the CD32, describing Zorro expansion boards, the interactive and headless debuggers, and the internal architecture: the per-colour-clock chip-bus timing model, the chipset modules, and the beam-event-replay video pipeline.

Keywords:amigaemulatorocsecsrust

Copperline is a cycle-driven Commodore Amiga emulator (OCS, ECS, and AGA) written in Rust. Cycle-driven means the whole machine -- the 68000-family CPU, Agnus, Denise, Paula, the CIAs, the floppy subsystem, and the chip bus that ties them together -- advances on one colour-clock timeline: the chip bus is arbitrated per colour clock, the Copper and blitter are scheduled per DMA slot with the hardware bus sequences, and the Paula IPL pipe plus 68000 interrupt sampling are modelled. That timing model is what lets it run the current cycle-sensitive OCS and AGA regression set, as well as Kickstart, Workbench, games, and CDTV/CD32 titles.

The project home is copperline.dev; the source lives on GitHub.

Spaceballs' State of the Art running in Copperline

Spaceballs’ State of the Art (1992), a cycle-exact OCS stress test, running in Copperline.

Where to start

Design principles

Two rules shape every change in Copperline:

  1. Hardware first. There are no branches keyed to game, demo, ROM, or file names. Compatibility problems are fixed by modelling the underlying chip behaviour; software titles appear only as regression examples.

  2. Determinism. The emulated core is deterministic and independent of the host: a headless unthrottled run and a real-time windowed run produce the same emulated result when given the same inputs and media. That is what makes headless captures reproducible, and it is also what lets the debugger step backwards.