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:
parent
ad1db4dc2e
commit
6a6dccf4d8
|
@ -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));
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue