use crate::memory_mapped::MemoryMapped; pub enum Interrupt { VBlank = 0, HBlank = 1, VCounter = 2, Timer0 = 3, Timer1 = 4, Timer2 = 5, Timer3 = 6, Serial = 7, Dma0 = 8, Dma1 = 9, Dma2 = 10, Dma3 = 11, Keypad = 12, Gamepak = 13, } const ENABLED_INTERRUPTS: MemoryMapped = unsafe { MemoryMapped::new(0x04000200) }; const INTERRUPTS_ENABLED: MemoryMapped = unsafe { MemoryMapped::new(0x04000208) }; pub fn enable(interrupt: Interrupt) { let _interrupt_token = temporary_interrupt_disable(); let interrupt = interrupt as usize; let enabled = ENABLED_INTERRUPTS.get() | (1 << (interrupt as u16)); ENABLED_INTERRUPTS.set(enabled); } pub fn disable(interrupt: Interrupt) { let _interrupt_token = temporary_interrupt_disable(); let interrupt = interrupt as usize; let enabled = ENABLED_INTERRUPTS.get() & !(1 << (interrupt as u16)); ENABLED_INTERRUPTS.set(enabled); } pub struct Disable {} impl Drop for Disable { fn drop(&mut self) { enable_interrupts(); } } pub fn temporary_interrupt_disable() -> Disable { disable_interrupts(); Disable {} } pub fn enable_interrupts() { INTERRUPTS_ENABLED.set(1); } pub(crate) fn disable_interrupts() { INTERRUPTS_ENABLED.set(0); }