It probably doesn't have anything to do with $2002, as that is just a register the game can poll for a few things -- namely sprite 0 hit.
Most likely culprit is code in between frames is taking too long and the game is missing its window to set the scroll. X scroll looks fine because that is reset every scanline, but Y scroll is only reset at the start of the frame, and if the game doesn't specify what Y scroll it wants before that happens, the entire frame will be thrown off.
I would say watch writes to $2005. They come in pairs -- first will be the X scroll and second will be the Y scroll. Specifically, make sure the Y scroll happens before pixel ~200 of the prerender scanline (which is either "scanline -1" or "scanline 262" depending on how the emu shows it -- I honestly don't know).