I forgot to mention that another way to correct the problem would be to vertically-delay drawing the sprite...so that writes to the GR register don't take effect until the next encounter (so it doesn't matter what cycle on a scanline it is written to).
But IMO it's easier just to delay calling WSYNC until you have all relevant sprite info ready for the registers for that scanline...IF there are only a couple of objects anyway.
Without changing much of the existing program, the ripple can be avoided by doing this:
Remove the store to WSYNC at the top of Scanloop.
Remove the store to ENAM1 at the top of Finishball.
Just above SkipActivatePlayer, use the X register to load and store instead of A.
Just below SkipActivatePlayer, write A to WSYNC and ENAM1.
Also skip erasing the GRP0 on every line as mentioned previously.
That ensures that GRP0 is updated before the electron beam gets too far into drawing the current scanline

No ripple unless PLAYERLEFTBOUNDRY is less than 2.
If you want to lower PLAYERLEFTBOUNDRY, you can set it to 1...then remove the LDA #0 when deciding when to draw the player and just use LAX on the next line instead. Movement or repositioning logic would need editing if you wanted the player to be able to move right to the edge (PLAYERLEFTBOUNDRY=0).
Edited by Nukey Shay, Mon Jun 7, 2010 9:07 PM.