GameBoy Emulator 1
Game Boy emulator core and tooling
Loading...
Searching...
No Matches
mmu.hpp
1#pragma once
2#include "common.hpp"
3#include <array>
4#include <vector>
5#include <memory>
6
7class Cartridge;
8class PPU;
9class Timer;
11
12class MMU {
13private:
14 // Ownership pointers for default constructor fallbacks
15 std::unique_ptr<Cartridge> dummy_cartridge;
16 std::unique_ptr<InterruptController> dummy_ic;
17 std::unique_ptr<Timer> dummy_timer;
18 std::unique_ptr<PPU> dummy_ppu;
19
20 // References used for routing
21 Cartridge* cartridge = nullptr;
22 PPU* ppu = nullptr;
23 Timer* timer = nullptr;
24 InterruptController* ic = nullptr;
25
26 std::array<u8, 0x2000> wram{}; // Work RAM (0xC000 - 0xDFFF)
27 std::array<u8, 0x7F> hram{}; // High RAM (0xFF80 - 0xFFFE)
28 std::array<u8, 0x80> io_regs{}; // Other IO registers (0xFF00 - 0xFF7F)
29
30 u8 joypad_select = 0x30;
31 u8 action_buttons = 0x0F;
32 u8 direction_buttons = 0x0F;
33
34 mutable u64 read_count = 0;
35 mutable u64 write_count = 0;
36
37 void perform_dma(u8 value);
38
39public:
40 MMU();
41 MMU(Cartridge& cartridge, PPU& ppu, Timer& timer, InterruptController& ic);
42 ~MMU();
43
44 u8 read(u16 address) const;
45 void write(u16 address, u8 value);
46
47 bool map_rom(const std::vector<u8>& rom_data);
48 void reset();
49
50 void step_timer(int cycles);
51
52 // Joypad state interface
53 void set_joypad_state(u8 action, u8 direction);
54 u8 get_joypad_state() const;
55
56 // Statistics
57 u64 get_read_count() const { return read_count; }
58 u64 get_write_count() const { return write_count; }
59 u8 get_current_rom_bank() const;
60
61 // Serialization
62 std::vector<u8> dump_memory() const;
63 bool load_memory(const std::vector<u8>& dump);
64};
Definition ppu.hpp:16
Definition timer.hpp:7