Re: [stella] zero-read

Subject: Re: [stella] zero-read
From: "Eckhard Stolberg" <Eckhard_Stolberg@xxxxxx>
Date: Sun, 11 Feb 2001 16:05:09 +0100
> If you can do a CXCLR (clear all collision collision latches) closely
> before this routine so that you can ensure that no collisions of any one
> particular type will occur between the CXCLR and this routine, you can use
> that collision register.  (example: $x4 contains the collision latches for
> missile 0 - playfield and missile 0 - ball.  You can use $x4 to always
> return 0 upon read, if you can ensure that such a collision will not
> happen between a STA CXCLR instruction and this routine, which will be
> true if either you're not using missile 0, you're not using PF or ball, or
> you're in vblank.)

Unfortunately that's only a possible zero not a guaranteed one.
The lower bits in the collision registers are undefined. I _think_
that in most cases the VCS only drives the two collision bits
and leaves the other six data bits to whatevers was on the bus.
So if you would read from $x4, you would get a value of $x4
with the two highest bits set according to the collision latches.

Video Pinball and the CompuMate both rely on this behaviour,
which is why it took so long to emulate them correctly. But
there also _might_ be some timing issues here, that _might_ affect
the lower bits depending on how you read the register or something
like that. For example Video Pinball plays fine on the 7800, while
the CompuMate doesn't, because it returns a different value for
the collision register in question than the 2600 would.

So the only register that _might_ return zero most of the time
would be $00, when none of it's collisions have been detected.
But that's not a guarantee either.

Ciao, Eckhard Stolberg

Archives (includes files) at
Unsub & more at

Current Thread