GameBoy Emulator 1
Game Boy emulator core and tooling
Loading...
Searching...
No Matches
cartridge.hpp
1#pragma once
2
3#include <vector>
4#include <string>
5#include "common.hpp"
6
7typedef struct { // Memory Map
8 u8 entry[4]; // 0x0100-0x0103
9 u8 nintendo_logo[0x30]; // 0x0104-0x0133
10 char title[16]; // 0x0134-0x0143
11 u16 new_lic_code; // 0x0144-0x0145
12 u8 sgb_flag; // 0x0146
13 u8 type; // 0x0147
14 u8 rom_size; // 0x0148
15 u8 ram_size; // 0x0149
16 u8 dest_code; // 0x014A
17 u8 old_lic_code; // 0x014B
18 u8 version; // 0x014C
19 u8 checksum; // 0x014D
20 u16 global_checksum; // 0x014E-0x014F
22
23class Cartridge {
24public:
25 Cartridge();
26 explicit Cartridge(const std::vector<u8>& rom_data);
27 ~Cartridge() = default;
28
29 bool load_rom(const std::vector<u8>& rom_data);
30
31 u8 read(u16 address) const;
32 void write(u16 address, u8 value);
33 void reset();
34
35 std::string get_title() const { return title; }
36 u8 get_mbc_type() const { return header.type; }
37 u8 get_rom_size_code() const { return header.rom_size; }
38 u8 get_ram_size_code() const { return header.ram_size; }
39 const std::vector<u8>& get_rom_bytes() const { return rom; }
40
41 u8 get_current_rom_bank() const { return current_rom_bank; }
42 void set_current_rom_bank(u8 bank) { current_rom_bank = bank; }
43
44 const std::vector<u8>& get_ram_bytes() const { return ram; }
45 std::vector<u8>& get_ram_bytes_mutable() { return ram; }
46 void set_ram_bytes(const std::vector<u8>& ram_data) { ram = ram_data; }
47
48 bool is_ram_enabled() const { return ram_enabled; }
49 void set_ram_enabled(bool enabled) { ram_enabled = enabled; }
50
51private:
52 enum class MBCType {
53 None,
54 MBC1,
55 MBC3,
56 MBC5
57 };
58 MBCType mbc_type = MBCType::None;
59
60 std::vector<u8> rom;
61 std::vector<u8> ram;
62 rom_header header{};
63 std::string title;
64
65 u8 current_rom_bank = 1;
66 u8 current_ram_bank = 0;
67 bool ram_enabled = false;
68 u8 banking_mode = 0;
69 u8 rom_bank_low = 1;
70 u8 rom_bank_high = 0;
71};