Start of re-factoring for cycle accuracy. Still a mess but (barely) doesn't crash.
Part two of the cycle accurate timing fixes.
Sprite 0 hit is in the wrong place now but everything else seems to be working OK; I can move ahead with the pixel at a time PPU now. The problem I was having with the rolling screen was because the NES.java scanline and pixel were not the same as the scanline and pixel in the PPU and everything was desynchronizing from there.
Part three of timing rewrite.
Turns out that most games really don't like it when every single instruction takes one more clock cycle than it should. Who knew?
Also fixed location of sprite 0 hit.
Anyway, now compatibility is (mostly) back where it was before. And that's good enough for one day.