GB Video: Fix timing for vblank IRQs

This commit is contained in:
Jeffrey Pfau 2016-04-16 10:39:35 -07:00
parent 4d839d03b4
commit 7539742689
1 changed files with 14 additions and 8 deletions

View File

@ -143,29 +143,35 @@ int32_t GBVideoProcessEvents(struct GBVideo* video, int32_t cycles) {
case 1: case 1:
// TODO: One M-cycle delay // TODO: One M-cycle delay
++video->ly; ++video->ly;
video->stat = GBRegisterSTATSetLYC(video->stat, lyc == video->ly); if (video->ly == GB_VIDEO_VERTICAL_TOTAL_PIXELS + 1) {
if (video->ly == GB_VIDEO_VERTICAL_TOTAL_PIXELS) {
video->ly = 0; video->ly = 0;
video->p->memory.io[REG_LY] = video->ly;
video->nextMode = GB_VIDEO_MODE_2_LENGTH; video->nextMode = GB_VIDEO_MODE_2_LENGTH;
video->mode = 2; video->mode = 2;
if (GBRegisterSTATIsOAMIRQ(video->stat)) { if (GBRegisterSTATIsOAMIRQ(video->stat)) {
video->p->memory.io[REG_IF] |= (1 << GB_IRQ_LCDSTAT); video->p->memory.io[REG_IF] |= (1 << GB_IRQ_LCDSTAT);
GBUpdateIRQs(video->p);
} }
} else { break;
video->nextMode = GB_VIDEO_HORIZONTAL_LENGTH; } else if (video->ly == GB_VIDEO_VERTICAL_TOTAL_PIXELS) {
}
if (video->ly == GB_VIDEO_VERTICAL_TOTAL_PIXELS - 1) {
video->p->memory.io[REG_LY] = 0; video->p->memory.io[REG_LY] = 0;
video->nextMode = GB_VIDEO_HORIZONTAL_LENGTH - 8;
} else if (video->ly == GB_VIDEO_VERTICAL_TOTAL_PIXELS - 1) {
video->p->memory.io[REG_LY] = video->ly;
video->nextMode = 8;
} else { } else {
video->p->memory.io[REG_LY] = video->ly; video->p->memory.io[REG_LY] = video->ly;
video->nextMode = GB_VIDEO_HORIZONTAL_LENGTH;
} }
if (GBRegisterSTATIsLYCIRQ(video->stat) && lyc == video->ly) {
video->stat = GBRegisterSTATSetLYC(video->stat, lyc == video->p->memory.io[REG_LY]);
if (GBRegisterSTATIsLYCIRQ(video->stat) && lyc == video->p->memory.io[REG_LY]) {
video->p->memory.io[REG_IF] |= (1 << GB_IRQ_LCDSTAT); video->p->memory.io[REG_IF] |= (1 << GB_IRQ_LCDSTAT);
GBUpdateIRQs(video->p);
} }
if (video->p->memory.mbcType == GB_MBC7 && video->p->memory.rotation && video->p->memory.rotation->sample) { if (video->p->memory.mbcType == GB_MBC7 && video->p->memory.rotation && video->p->memory.rotation->sample) {
video->p->memory.rotation->sample(video->p->memory.rotation); video->p->memory.rotation->sample(video->p->memory.rotation);
} }
GBUpdateIRQs(video->p);
break; break;
case 2: case 2:
_cleanOAM(video, video->ly); _cleanOAM(video, video->ly);