Copperlist
An Amiga cracktro, chip by chip, for Resolume

What it does
An FFGL source plugin for Resolume Arena and Avenue: an Amiga cracktro, not drawn to look like one but written against an emulation of the chips that made them look that way. The Amiga's copper is a tiny co-processor that waits for the video beam to reach a screen position and then writes a hardware register, usually a colour. A copper bar is nothing but colour-register writes at the start of scanlines.
So Copperlist emulates the part of the chipset whose constraints you can see — chip RAM, the copper reading real two-word instructions out of it, 32 twelve-bit colour registers, five low-resolution bitplanes, eight 16-pixel sprites and the blitter — and the demo is C++ that builds a copper list and issues blits every field, as the original coders' vertical-blank routines did. Nothing in the demo can reach a pixel any other way, so the look cannot cheat.
What falls out: a bar is horizontal and one line tall per colour step, because a write lasts until the next one; two bars that cross show the later write, never a blend; and a colour change in the middle of a line lands on the copper's own grid, a WAIT resolving four low-resolution pixels and each MOVE costing eight. There are 4,096 colours and not one more. The starfield is three sprites, re-positioned by the copper on every line that has a star. The scroller moves by whole pixels and its wave by whole lines, because each column is a separate blit. The cube is the blitter's line mode, and filled it is an area fill. Colour cycling is three registers rotated, and fewer bitplanes means fewer colours and fewer scenes.
The emulation runs fields, not frames: PAL at 320×256 and 50 Hz or NTSC at 320×200 and 60 Hz, from the host clock, and a 60 fps composition repeats fields rather than interpolating one. Integer scaling shows the chip's picture at whole multiples, letterboxed, with the copper bars running on into the border as they did on a monitor; Fit and Fit Smooth fill the frame, with a non-square pixel aspect derived from the colour clock. Every scene is switched off by the control that already says how many.
- An emulated copper, blitter, bitplanes, sprites and 12-bit palette, with the cracktro written against them
- Copper bars with count, height, speed and palette, and a Bar Wave that starts each bar on the copper's grid
- A sine scroller with your own text, blitted a column at a time, and colour cycling
- A three-layer starfield of sprites multiplexed by the copper
- A wireframe or filled cube from the blitter's line mode, and up to 16 bobs on four paths
- PAL or NTSC fields at 50 or 60 Hz, and one to five bitplanes
- Integer, Fit or Fit Smooth scaling, non-square or square pixels, and a border, black or transparent background
- Universal macOS bundle and a Windows x64 DLL
Where it stands
v0.1.0, and honestly early. The chipset is measured, not asserted, by an offline harness that drives the real plugin class and reads the emulated chip's own memory and picture, then the rendered output at two rasters: across 8,544 bar lines every colour change lands on the copper's four-pixel grid and none is closer than one MOVE, 8 px, with 1,177 pairs exactly 8 px apart; on 5,982 crossing lines no pixel is a colour no MOVE wrote — never a blend; 576 blitter lines, through every octant and 40 fields of cube edges, differ from a closed-form Bresenham by 0 pixels; the field number is exactly floor(t × 50) over 18 runs of 600 frames, including from Resolume's measured ~499 million ms clock; every channel of 17.6 million output pixels is a multiple of 17; a field reached by running is byte-identical to the same field reached by a jump; the scroller moves by exactly one whole-pixel shift a field; Integer output is the chip's picture bit for bit, and the PAL rectangle measures 936 × 720 against 935.68 × 720. Eleven negative controls and a one-character mutation of the shipped shader are caught. All 24 sweepable controls change the picture. Render cost on macOS is about 0.86 ms a field for the emulation on the CPU, whatever the output size, and 0.89 ms/frame at 720p, 0.89 at 1080p and 0.99 at 4K when every frame is a new field. It has not yet been loaded into Resolume on macOS. On Windows it has: a build of this source loads, registers and renders in Resolume Arena 7.27.1 on software rendering (win-lab, no GPU), with every parameter as declared; 23 of its controls could not be shown moving there, because a source that never stands still raises the gate's noise floor above what one control changes. The emulation leaves out what does not show — the 68000, audio, interrupts — and DMA slot contention, so with five bitplanes the copper is never delayed as a real machine's would be. There is a user guide; a browser demo, which is a port rather than the plugin; no OpenFX port. The macOS builds are signed and notarised. Check it in your own rig before trusting it in a show.
Watch it running
Nothing loads from YouTube until you press play.Watch it there instead