chore: refactor GBA Display Timings

This change should reflect that the Hblank bit of DISPSTAT is toggled on all scanlines
while also ensuring that the Vblank bit is set on all Vblank scanlines
This commit is contained in:
Rekai Nyangadzayi Musuka 2022-10-21 05:12:03 -03:00
parent 8926026b5b
commit 8e383d55d7
1 changed files with 11 additions and 27 deletions

View File

@ -36,26 +36,26 @@ pub const Scheduler = struct {
std.debug.panic("[Scheduler] Somehow, a u64 overflowed", .{}); std.debug.panic("[Scheduler] Somehow, a u64 overflowed", .{});
}, },
.HBlank => { .HBlank => {
// The End of a Hblank // The End of a Hblank (During Draw or Vblank)
const scanline = bus.io.vcount.scanline.read(); const old_scanline = bus.io.vcount.scanline.read();
const new_scanline = scanline + 1; const scanline = (old_scanline + 1) % 228;
// TODO: Should this be done @ end of Draw instead of end of Hblank? bus.io.vcount.scanline.write(scanline);
bus.ppu.drawScanline(&bus.io); bus.io.dispstat.hblank.unset();
bus.io.vcount.scanline.write(new_scanline); if (scanline < 160) {
if (new_scanline < 160) {
// Transitioning to another Draw // Transitioning to another Draw
self.push(.Draw, self.tick + (240 * 4)); self.push(.Draw, self.tick + (240 * 4));
} else { } else {
// Transitioning to a Vblank // Transitioning to a Vblank
bus.io.dispstat.vblank.set(); if (scanline < 227) bus.io.dispstat.vblank.set() else bus.io.dispstat.vblank.unset();
self.push(.VBlank, self.tick + (308 * 4));
self.push(.VBlank, self.tick + (240 * 4));
} }
}, },
.Draw => { .Draw => {
// The end of a Draw // The end of a Draw
bus.ppu.drawScanline(&bus.io);
// Transitioning to a Hblank // Transitioning to a Hblank
bus.io.dispstat.hblank.set(); bus.io.dispstat.hblank.set();
@ -63,23 +63,7 @@ pub const Scheduler = struct {
}, },
.VBlank => { .VBlank => {
// The end of a Vblank // The end of a Vblank
self.push(.HBlank, self.tick + (68 * 4));
const scanline = bus.io.vcount.scanline.read();
const new_scanline = scanline + 1;
bus.io.vcount.scanline.write(new_scanline);
if (new_scanline == 227) bus.io.dispstat.vblank.unset();
if (new_scanline < 228) {
// Transition to another Vblank
self.push(.VBlank, self.tick + (308 * 4));
} else {
// Transition to another Draw
bus.io.vcount.scanline.write(0); // Reset Scanline
// DISPSTAT was disabled on scanline 227
self.push(.Draw, self.tick + (240 * 4));
}
}, },
} }
} }