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:

Registerbit 7bit 6
CXM0PM0–P1M0–P0
CXM1PM1–P0M1–P1
CXP0FBP0–PFP0–BL
CXP1FBP1–PFP1–BL
CXM0FBM0–PFM0–BL
CXM1FBM1–PFM1–BL
CXBLPFBL–PF(unused)
CXPPMMP0–P1M0–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 BIT drops bit 7 into the N flag and bit 6 into the V flag, so a single BIT plus a branch checks a collision without disturbing any register — the subject of the next page.