developping my Shinobi port, I have sometimes garbled frames. I must do something wrong.
Here's some example (taken from Gens, but it happens too with Fusion, I didn't try yet with real hardware) :

The next frame, for comparison :

Here is how the main loop works :
1) read joypad entry
2) disable ints
3) check collisions
4) update characters state
5) compute scroll value
6) compute screen position of all sprites
7) update all sprites
8) enable ints
9) wait for vblank.
The update all sprites things works as follows :
* each sprite attributes is updated using VDP_setSprite (so using SGDK sprite cache)
* if a new frame must be displayed, the ROM locations of patterns data is stored in a table.
Then, during vint, the following is done :
* if the pattern data table has entries, they are DMA-copied into VRAM (I've tried disabling the DMA with same results)
* then VDP_updateSprite() is called to update the SAT using SGDK sprite cache
Since I disable/enable ints in main loop while setting patterns data table and sprite cache, and the VRAM transfers is done all at once during Vint, I'd have expected maybe frame drops (if steps 3 to 6 takes more than 1/60th second) but not garbled graphics.
Maybe the cause is that the DMA-copy from ROM to VRAM takes too much time, but there are around 40 (max 96, but it doesn't actually happen) patterns to update in the frame. From the pictures though, it's quite clear the SAT is written before the patterns were shipped to VRAM.
Or my logic is wrong.