If I was to guess, I'd say that status register read might actually be the swap buffer command. It seems to get called exactly once per frame, normally after all the data has been sent to the GPU for that frame. (Either that or its at the start which seems unlikely.)
Games also seem to sync with it at the very beginning. Ie they will flood read the register until it returns 0, and then continue rendering normally. This seems to be the only time we ever return 0 for the register read.
Here is a quick log from scud
- Code: Select all
WritePolygonRAM
WriteHighCullingRAM
flush
swapbuffers
status 2
WritePolygonRAM
WriteHighCullingRAM
swapbuffers
flush
status 2
WritePolygonRAM
WriteHighCullingRAM
flush
swapbuffers
status 2
WritePolygonRAM
WriteHighCullingRAM
flush
swapbuffers
status 2
WritePolygonRAM
swapbuffers
WriteHighCullingRAM
flush
status 2
WritePolygonRAM
WriteHighCullingRAM
flush
create format 0 x: 384 y: 0 width: 128 height: 256
swapbuffers
status 2
WritePolygonRAM
WriteHighCullingRAM
flush
swapbuffers
status 2
WritePolygonRAM
WriteHighCullingRAM
flush
swapbuffers
status 2
WritePolygonRAM
WriteHighCullingRAM
flush
swapbuffers
status 2
WritePolygonRAM
WriteHighCullingRAM
flush
swapbuffers
status 2
WritePolygonRAM
WriteHighCullingRAM
flush
swapbuffers
status 2
WritePolygonRAM
swapbuffers
WriteHighCullingRAM
flush
status 2
swapbuffers
WritePolygonRAM
WriteHighCullingRAM
flush
status 2
swapbuffers
WritePolygonRAM
WriteHighCullingRAM
flush
status 2
WritePolygonRAM
WriteHighCullingRAM
flush
swapbuffers
status 2
WritePolygonRAM
WriteHighCullingRAM
flush
swapbuffers
status 2
Scud seems to write data as per the SDK we have. Ie poly ram -> culling ram -> flush -> swap buffers()
Sega bass fishing does the updates totally differently
ie
- Code: Select all
-----> deleting 0 1536 256 128 128
WriteHighCullingRAM
flush
create format 0 x: 1536 y: 256 width: 128 height: 128
WritePolygonRAM
swapbuffers
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WriteTexturePort
flush
status 2
-----> deleting 0 1536 256 128 128
WriteHighCullingRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WriteTexturePort
create format 0 x: 1536 y: 256 width: 128 height: 128
flush
swapbuffers
status 2
-----> deleting 0 1536 256 128 128
WriteHighCullingRAM
flush
create format 0 x: 1536 y: 256 width: 128 height: 128
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
swapbuffers
WriteTexturePort
flush
status 2
-----> deleting 0 1536 256 128 128
WriteHighCullingRAM
flush
create format 0 x: 1536 y: 256 width: 128 height: 128
WritePolygonRAM
swapbuffers
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WriteTexturePort
flush
status 2
-----> deleting 0 1536 256 128 128
WriteHighCullingRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
create format 0 x: 1536 y: 256 width: 128 height: 128
swapbuffers
WriteTexturePort
flush
status 2
-----> deleting 0 1536 256 128 128
WriteHighCullingRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
create format 0 x: 1536 y: 256 width: 128 height: 128
WriteTexturePort
swapbuffers
flush
status 2
-----> deleting 0 1536 256 128 128
WriteHighCullingRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WriteTexturePort
create format 0 x: 1536 y: 256 width: 128 height: 128
flush
swapbuffers
-----> deleting 0 1536 256 128 128
status 2
WriteHighCullingRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
create format 0 x: 1536 y: 256 width: 128 height: 128
WritePolygonRAM
flush
WritePolygonRAM
flush
swapbuffers
WriteTexturePort
flush
-----> deleting 0 1536 256 128 128
status 2
WriteHighCullingRAM
create format 0 x: 1536 y: 256 width: 128 height: 128
flush
swapbuffers
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WriteTexturePort
flush
status 2
-----> deleting 0 1536 256 128 128
WriteHighCullingRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WriteTexturePort
create format 0 x: 1536 y: 256 width: 128 height: 128
flush
swapbuffers
-----> deleting 0 1536 256 128 128
status 2
WriteHighCullingRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WriteTexturePort
create format 0 x: 1536 y: 256 width: 128 height: 128
flush
swapbuffers
status 2
-----> deleting 0 1536 256 128 128
WriteHighCullingRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
WritePolygonRAM
flush
Bass fishing appears to be doing
Culling Ram -> Flush() -> PolyRam -> Flush() -> PolyRam -> Flush() -> TexturePort -> Flush() -> Swap Buffers
This is also the reason why MAME runs sega bass fishing at like 1fps, because it's drawing a frame after each flush command. But you can see the frame is only complete after it does a texture port write. But given what I know, it seems that the database must be complete enough for a frame render after a flush command.