This repository has been archived on 2024-12-14. You can view files and clone it, but cannot push or open issues or pull requests.
rustboyadvance-ng/src/core/interrupt.rs

55 lines
1.3 KiB
Rust
Raw Normal View History

use super::arm7tdmi::{exception::Exception, Core};
use crate::bit::BitIndex;
#[derive(Debug, Primitive, Copy, Clone, PartialEq)]
#[allow(non_camel_case_types)]
pub enum Interrupt {
LCD_VBlank = 0,
LCD_HBlank = 1,
LCD_VCounterMatch = 2,
Timer0_Overflow = 3,
Timer1_Overflow = 4,
Timer2_Overflow = 5,
Timer3_Overflow = 6,
SerialCommunication = 7,
DMA0 = 8,
DMA1 = 9,
DMA2 = 10,
DMA3 = 11,
Keypad = 12,
GamePak = 13,
}
#[derive(Debug)]
pub struct InterruptController {
pub interrupt_master_enable: bool,
pub interrupt_enable: u16,
pub interrupt_flags: u16,
}
impl InterruptController {
pub fn new() -> InterruptController {
InterruptController {
interrupt_master_enable: false,
interrupt_enable: 0,
interrupt_flags: 0,
}
}
pub fn interrupts_disabled(&self, cpu: &Core) -> bool {
cpu.cpsr.irq_disabled() | (self.interrupt_master_enable)
}
pub fn request_irq(&mut self, cpu: &mut Core, irq: Interrupt) {
if self.interrupts_disabled(cpu) {
return;
}
let irq_bit_index = irq as usize;
if self.interrupt_enable.bit(irq_bit_index) {
self.interrupt_flags = 1 << irq_bit_index;
cpu.exception(Exception::Irq);
}
}
}