12class InterruptController {
14 InterruptController() =
default;
15 ~InterruptController() =
default;
17 u8 read(u16 address)
const {
18 if (address == 0xFF0F)
return interrupt_flag | 0xE0;
19 if (address == 0xFFFF)
return interrupt_enable;
23 void write(u16 address, u8 value) {
24 if (address == 0xFF0F) {
25 interrupt_flag = value | 0xE0;
26 }
else if (address == 0xFFFF) {
27 interrupt_enable = value;
31 void request_interrupt(InterruptType type) {
32 interrupt_flag |=
static_cast<u8
>(type);
35 void clear_interrupt_flag(InterruptType type) {
36 interrupt_flag &= ~static_cast<u8>(type);
39 bool has_pending_interrupts()
const {
40 return (interrupt_flag & interrupt_enable & 0x1F) != 0;
43 u8 get_if()
const {
return interrupt_flag; }
44 u8 get_ie()
const {
return interrupt_enable; }
46 void set_if(u8 value) { interrupt_flag = value | 0xE0; }
47 void set_ie(u8 value) { interrupt_enable = value; }
50 interrupt_flag = 0xE1;
51 interrupt_enable = 0x00;
55 u8 interrupt_flag = 0xE1;
56 u8 interrupt_enable = 0x00;