Ian wrote:Would it make sense to just ignore 3d timing for a bit and maybe look at the 2d timing?
The tilegen I guess isn't double buffered at all, there is no front/back buffer for it?
So all the data for it is probably uploaded in the vblank period
Scud has many of these

I can't view imgur links at work so I'll check out the image tonight from home but I can confirm with 99.9999999% certainty that the tile generator uses no buffering of any kind and draws in sync with the raster beam. You are absolutely correct that the data for the tile gen should be uploaded during the VBL period. This is how it was done on every other tilegen-based system from the 80's and 90's that I've looked at (with the exception of intentionally updating mid-frame during HBL in order to create fancy effects; not applicable here).
I've made the most progress with Scud Plus's inner loop but that's not saying much: I haven't translated most of it. I may not need to. When I get some time, I'll try to piece together roughly the order in which things are done.
Fighting Vipers 2 would require a deeper dive because it seems to be doing something more complicated with respect to timing.