lcd status interrupts

This commit is contained in:
Alex Janka 2023-02-08 11:11:39 +11:00
parent 2dab3623e9
commit 465b8454f6

View file

@ -266,7 +266,29 @@ impl CPU {
fn set_lcd_status(&mut self) {
let mut stat = self.memory.get(0xFF41);
stat = set_or_clear_bit(stat, 2, self.memory.get(0xFF44) == self.memory.get(0xFF45));
let lyc_eq_ly_enabled = get_bit(stat, 6);
let mode_2_enabled = get_bit(stat, 5);
let mode_1_vblank_enabled = get_bit(stat, 4);
let mode_0_hblank_enabled = get_bit(stat, 3);
let lyc_eq_ly = self.memory.get(0xFF44) == self.memory.get(0xFF45);
let mode_2 = self.gpu.mode == DrawMode::Mode2;
let mode_1_vblank = self.gpu.mode == DrawMode::VBlank;
let mode_0_hblank = self.gpu.mode == DrawMode::HBlank;
let mut irq = self.memory.get(0xFF0F);
if (lyc_eq_ly_enabled && lyc_eq_ly)
|| (mode_2_enabled && mode_2)
|| (mode_1_vblank_enabled && mode_1_vblank)
|| (mode_0_hblank_enabled && mode_0_hblank)
{
irq = set_bit(irq, 1);
self.memory.set(0xFF0F, irq);
}
stat = set_or_clear_bit(stat, 2, lyc_eq_ly);
stat = set_or_clear_bit(
stat,
1,