Agnus: The Amiga's Memory Master
DMA controller, Blitter, and Copper in one package
Agnus coordinated all memory access on the Amiga, housing the Blitter for fast graphics and the Copper for beam-synchronised effects.
Overview
Agnus was the Amiga’s traffic controller. Every memory access—from the 68000, the Blitter, the display hardware, audio playback—flowed through Agnus. It allocated time slots fairly, ensuring smooth graphics and audio while letting the CPU work during the gaps.
Fast facts
- Function: DMA controller, Blitter engine, Copper coprocessor.
- Versions: 8361 (NTSC), 8367 (PAL), 8370/8372 (Fat Agnus), 8375 (Super Agnus).
- Chip RAM: 512KB (original), 1MB (Fat), 2MB (Super/ECS).
- DMA channels: 25 independent channels for different purposes.
DMA slot allocation
Agnus divides each scanline into time slots:
| Slots | Purpose |
|---|---|
| 0-3 | Disk DMA |
| 4-7 | Audio channels 0-3 |
| 8-15 | Sprites 0-7 |
| 16-17 | Reserved |
| 18-53 | Bitplane DMA (display) |
| Remaining | CPU and Blitter |
The CPU and Blitter share leftover slots, with Blitter taking priority when running.
Chip versions
| Chip | Chip RAM | Notes |
|---|---|---|
| 8361/8367 | 512KB | Original A1000, early A500 |
| 8370/8372 | 1MB | ”Fat Agnus” - larger package |
| 8375 | 2MB | ECS “Super Agnus” |
| Alice | 2MB | AGA replacement in A1200/A4000 |
The Blitter
The Blitter is a DMA engine within Agnus that performs:
- Block copies: rectangular memory moves.
- Logic operations: combine up to three sources with minterm logic.
- Area fill: flood-fill between edges.
- Line drawing: hardware-accelerated lines.
Blitter sources
| Source | Purpose |
|---|---|
| A | Source/mask data |
| B | Source data |
| C | Destination read (for merge) |
| D | Destination write |
Minterm operations
The Blitter combines sources using an 8-bit minterm value:
Result = (A AND B AND C) * bit7 +
(A AND B AND NOT C) * bit6 +
... and so on for all 8 combinations
Common minterms:
$F0: Copy A to D (ignore B, C)$CA: Cookie-cut (A masks B onto C)$5A: XOR A with C
The Copper
The Copper is a coprocessor with just three instructions:
| Instruction | Opcode | Purpose |
|---|---|---|
| WAIT | 0001 | Wait for beam position |
| MOVE | 0000 | Write to register |
| SKIP | 0001 + skip bit | Conditional skip |
Copper list example
dc.w $0180, $0000 ; COLOR00 = black
dc.w $2c07, $fffe ; WAIT for line $2c
dc.w $0180, $0f00 ; COLOR00 = red
dc.w $5007, $fffe ; WAIT for line $50
dc.w $0180, $00f0 ; COLOR00 = green
dc.w $ffff, $fffe ; End (wait forever)
Copper capabilities
- Palette changes: different colours per scanline (copper rainbows).
- Mode switches: change resolution mid-screen.
- Sprite repositioning: move sprites to different locations per frame.
- Register pokes: modify nearly any hardware register.
Key registers
| Register | Address | Purpose |
|---|---|---|
| DMACON | $DFF096 | DMA control |
| DMACONR | $DFF002 | DMA control read |
| BLTCON0 | $DFF040 | Blitter control |
| COP1LC | $DFF080 | Copper list 1 pointer |
| COP2LC | $DFF084 | Copper list 2 pointer |
| COPJMP1 | $DFF088 | Restart Copper list 1 |