jevsnes.git / third-party / rust / jgenesis / backend / gb-core / src / interrupts.rs

Game Boy interrupt registers, which didn't seem to naturally fit anywhere else

3use crate::sm83::InterruptType;
4use bincode::{Decode, Encode};
6#[derive(Debug, Clone, Default, Encode, Decode)]
7pub struct InterruptRegisters {
8    enabled: u8,
9    flags: u8,
10}
11
12impl InterruptRegisters {
13    pub fn read_ie(&self) -> u8 {
14        // TODO should bits 5-7 read 1?
15        self.enabled | 0xE0
16    }
17
18    pub fn write_ie(&mut self, value: u8) {
19        self.enabled = value & 0x1F;
20    }
21
22    pub fn read_if(&self) -> u8 {
23        self.flags | 0xE0
24    }
25
26    pub fn write_if(&mut self, value: u8) {
27        self.flags = value & 0x1F;
28    }
29
30    pub fn set_flag(&mut self, interrupt_type: InterruptType) {
31        log::trace!("Interrupt flag set: {interrupt_type:?}");
32
33        self.flags |= interrupt_type.register_mask();
34    }
35
36    pub fn clear_flag(&mut self, interrupt_type: InterruptType) {
37        log::trace!("Interrupt flag cleared: {interrupt_type:?}");
38
39        self.flags &= !interrupt_type.register_mask();
40    }
41}