This looks a lot cleaner. It helps if I don't process off the end of a span list.
While there are presumably DSP issues causing portions of the tank to either not show up or draw incorrectly, I'm not sure if it's that my processing of the list and the associated framebuffers is wrong (i.e. ending early), or if it's that the DSP isn't actually issuing enough data to draw the full tank. I do see a few "pulled" triangles every so often, so there might still be DSP issues lurking.
But at this point I believe the DSP is in better shape than I'd expected, and the real problem is figuring out how the rasterizer hardware works: How does it get hidden, how does it get shown, how are the 2 layers combined, that sort of thing. If anyone is willing to take a stab at it, I'm willing to commit my changes to a branch.