The symptom of the problem was in the form of a rythmic click sound popping in the left channel.
Diving deep into Kirby's binary, I found out that channel B and channel
A are playing too different pcm buffers simultationsly: A is enabled for
the right channel and B is enabled for the left.
I found out that the game's sound driver was using VCOUNT in order to syncornize the audio,
but in some occassions the fifo DMA was not disabled in time, causing the DMA to
fill the fifo in additional 16 bytes of garbage residing next to channel
B's pcmBuffer.
After a thorough check-up of the GPU state machine, I find out that I
stay in VBLANK for 1 line too long, and that's what caused the audio
buffer to de-sync with the gpu emulation.
This commit fixes this issue.
Former-commit-id: e0f20bd01b8abf62da486e2501cff197a9a22763
This solve many graphical glitches with normal sprites in:
- Kirby - Nightmare in Dreamland
- DragonBall Advanced Adventure
- DragonBall Supersonic Warriors
Former-commit-id: aa7813720ca86c0ff0a3111f245d35765112d750
This fixes the glitch in dma_demo.gba where the rendering of the circle
was off by a scanline.
Former-commit-id: 907fefd548b6557ce46e06a99d0bc6ab83a8f332
I have fought very hard against the rust ownership model,
In the end for DMA to play nice with my code, I had to resort to use
unsafe code for now..
The DMA implementation itself is not accurate to say the least, but will
have to do for now.
Tonc's dma_demo.gba plays but with a visual glitch.
Former-commit-id: 3b9cdcb2d09c78701290f2c48b77f9f3487e85c9