agb/src/interrupt.rs
2021-03-08 02:06:45 +00:00

57 lines
1.3 KiB
Rust

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<u16> = unsafe { MemoryMapped::new(0x04000200) };
const INTERRUPTS_ENABLED: MemoryMapped<u16> = 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);
}