The Collision Registers#
The TIA tracks collisions between its six drawable objects — the two players, two missiles, the ball, and the playfield. Six objects make 15 possible pairs, and the chip reports them across eight read-only registers.
Detection is geometric, and it latches#
As the beam paints each visible pixel, the TIA asks a simple question: are two objects both lit here? If so, it sets the corresponding collision bit. Two things follow from that:
- It’s purely geometric. Collision depends only on whether both objects have a pixel turned on at the same spot — not their colors, not their drawing priority. Transparent parts of a sprite don’t collide, so detection matches the visible shape — effectively pixel-perfect.
- It latches. The bit records that the overlap happened at least once during the frame and stays set. It does not tell you where, or how many times — just yes/no, and it remains yes until you clear it (next page).
Which register reports which pair#
Each register devotes its top two bits to two collision pairs: bit 7 and bit 6. The full map:
Spelled out, bit 7 / bit 6 of each register:
| Register | bit 7 | bit 6 |
|---|---|---|
CXM0P | M0–P1 | M0–P0 |
CXM1P | M1–P0 | M1–P1 |
CXP0FB | P0–PF | P0–BL |
CXP1FB | P1–PF | P1–BL |
CXM0FB | M0–PF | M0–BL |
CXM1FB | M1–PF | M1–BL |
CXBLPF | BL–PF | (unused) |
CXPPMM | P0–P1 | M0–M1 |
You don’t need to memorize this — you need to know it exists, and to look up the one or two pairs your game actually cares about. A Pong clone watches CXBLPF (ball hits wall) and the ball-versus-player bits; a shooter watches the missile-versus-player registers.
The bits live in 7 and 6 for a reason: it makes them cheap to test. Reading a register with
BITdrops bit 7 into the N flag and bit 6 into the V flag, so a singleBITplus a branch checks a collision without disturbing any register — the subject of the next page.