GameBoy Emulator 1
Game Boy emulator core and tooling
Loading...
Searching...
No Matches
interrupt_controller.hpp
1#pragma once
2#include "common.hpp"
3
4enum class InterruptType : u8 {
5 VBlank = 0x01,
6 LCDStat = 0x02,
7 Timer = 0x04,
8 Serial = 0x08,
9 Joypad = 0x10
10};
11
12class InterruptController {
13public:
14 InterruptController() = default;
15 ~InterruptController() = default;
16
17 u8 read(u16 address) const {
18 if (address == 0xFF0F) return interrupt_flag | 0xE0;
19 if (address == 0xFFFF) return interrupt_enable;
20 return 0xFF;
21 }
22
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;
28 }
29 }
30
31 void request_interrupt(InterruptType type) {
32 interrupt_flag |= static_cast<u8>(type);
33 }
34
35 void clear_interrupt_flag(InterruptType type) {
36 interrupt_flag &= ~static_cast<u8>(type);
37 }
38
39 bool has_pending_interrupts() const {
40 return (interrupt_flag & interrupt_enable & 0x1F) != 0;
41 }
42
43 u8 get_if() const { return interrupt_flag; }
44 u8 get_ie() const { return interrupt_enable; }
45
46 void set_if(u8 value) { interrupt_flag = value | 0xE0; }
47 void set_ie(u8 value) { interrupt_enable = value; }
48
49 void reset() {
50 interrupt_flag = 0xE1;
51 interrupt_enable = 0x00;
52 }
53
54private:
55 u8 interrupt_flag = 0xE1;
56 u8 interrupt_enable = 0x00;
57};
Definition timer.hpp:7