The **Copper** (Co-Processor) is a tiny DMA-driven programmable engine inside Agnus (OCS/ECS) or Alice (AGA). It executes a list of instructions — the **copper list** — in lockstep with the video beam as it sweeps across the CRT. Its sole purpose is to write values to custom chip registers at precise screen positions.
Despite having only **3 instructions** and no arithmetic, branching, or memory read capability, the Copper is what gives the Amiga its distinctive visual character.
### Where It Lives in the System
```mermaid
graph LR
subgraph Agnus/Alice ["Agnus / Alice Chip"]
Copper["Copper<br/>(reads copper list via DMA)"]
DMA["DMA Controller"]
Beam["Beam Counter"]
end
subgraph Denise/Lisa ["Denise / Lisa Chip"]
Palette["Colour Registers"]
BPL["Bitplane Control"]
SPR["Sprite Control"]
end
subgraph Memory
CopList["Copper List<br/>(Chip RAM only!)"]
end
Beam -- "current V,H position" --> Copper
CopList -- "DMA fetch" --> Copper
Copper -- "register writes" --> Palette
Copper -- "register writes" --> BPL
Copper -- "register writes" --> SPR
Copper -- "register writes" --> DMA
```
**Key points:**
- The Copper reads its program from **Chip RAM** via DMA — no CPU involvement
- It writes directly to custom chip registers (the same `$DFF000–$DFF1FE` space)
- It synchronises with the **beam counter** — it knows exactly where the electron beam is
- The CPU can modify the copper list in memory at any time; changes take effect next frame
### What the Copper Can Do
| Capability | How | Typical Use |
|---|---|---|
| **Per-line colour changes** | WAIT for line → MOVE to COLORxx | Gradient skies, rainbow bars, water effects |
| **Split-screen displays** | Change bitplane pointers mid-frame | Status bar + scrolling game area |
| **Parallax scrolling** | Change BPLCON1 scroll offset at different lines | Multi-layer side-scrollers |
| **Resolution mixing** | Change BPLCON0 mid-frame | HiRes title bar + LoRes gameplay |
| **Sprite multiplexing** | Repoint sprite DMA pointers after sprite ends | 24+ sprites using 8 physical slots |
| **Palette animation** | CPU modifies copper list words each frame | Cycling water, fire, lava |
| V counter wraps at 255 | PAL lines 256–311 require a double-WAIT trick |
| Chip RAM only | The copper list itself must reside in Chip RAM (DMA-accessible) |
### How the System Uses It
**AmigaOS** — `graphics.library` builds the system copper list automatically when you call `MakeVPort()` / `LoadView()`. This list sets up bitplane pointers, sprite pointers, display window, and palette for every ViewPort. User code adds instructions via `UCopList`.
**Games (system takeover)** — Disable the OS display system, point COP1LC to your own copper list, and have total control. The copper list typically sets up the display, changes colours per line, and handles sprite multiplexing.
**Demos** — Push the Copper to its limits: hundreds of colour changes per frame, dynamic copper list generation, and tricks like "copper bars" (changing colours mid-scanline using horizontal WAITs).
---
## Instruction Set
The Copper has exactly **3 instructions**, each 32 bits (2 words):
### MOVE — Write to Register
```
Word 1: RRRRRRRR R0000000 R = register address (9 bits)
Word 2: DDDDDDDD DDDDDDDD D = 16-bit data value
Constraints:
- Register address must be even ($000–$1FE range)
- Registers below COPCON threshold ($040) are protected by default
- COPCON ($02E) bit 1 can unlock dangerous registers ($000–$03E)