Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libsnes/bsnes/gameboy/cartridge/cartridge.cpp
2 views
1
#include <gameboy/gameboy.hpp>
2
3
#include <nall/crc32.hpp>
4
5
#define CARTRIDGE_CPP
6
namespace GameBoy {
7
8
#include "mbc0/mbc0.cpp"
9
#include "mbc1/mbc1.cpp"
10
#include "mbc2/mbc2.cpp"
11
#include "mbc3/mbc3.cpp"
12
#include "mbc5/mbc5.cpp"
13
#include "mmm01/mmm01.cpp"
14
#include "huc1/huc1.cpp"
15
#include "huc3/huc3.cpp"
16
#include "serialization.cpp"
17
Cartridge cartridge;
18
19
void Cartridge::load(System::Revision revision, const string &markup, const uint8_t *data, unsigned size) {
20
if(size == 0) size = 32768;
21
romdata = allocate<uint8>(romsize = size, 0xff);
22
if(data) memcpy(romdata, data, size);
23
24
info.mapper = Mapper::Unknown;
25
info.ram = false;
26
info.battery = false;
27
info.rtc = false;
28
info.rumble = false;
29
30
info.romsize = 0;
31
info.ramsize = 0;
32
33
XML::Document document(markup);
34
35
auto &mapperid = document["cartridge"]["mapper"].data;
36
if(mapperid == "none" ) info.mapper = Mapper::MBC0;
37
if(mapperid == "MBC1" ) info.mapper = Mapper::MBC1;
38
if(mapperid == "MBC2" ) info.mapper = Mapper::MBC2;
39
if(mapperid == "MBC3" ) info.mapper = Mapper::MBC3;
40
if(mapperid == "MBC5" ) info.mapper = Mapper::MBC5;
41
if(mapperid == "MMM01") info.mapper = Mapper::MMM01;
42
if(mapperid == "HuC1" ) info.mapper = Mapper::HuC1;
43
if(mapperid == "HuC3" ) info.mapper = Mapper::HuC3;
44
45
info.rtc = document["cartridge"]["rtc"].data == "true";
46
info.rumble = document["cartridge"]["rumble"].data == "true";
47
48
info.romsize = numeral(document["cartridge"]["rom"]["size"].data);
49
info.ramsize = numeral(document["cartridge"]["ram"]["size"].data);
50
info.battery = document["cartridge"]["ram"]["battery"].data == "true";
51
52
switch(info.mapper) { default:
53
case Mapper::MBC0: mapper = &mbc0; break;
54
case Mapper::MBC1: mapper = &mbc1; break;
55
case Mapper::MBC2: mapper = &mbc2; break;
56
case Mapper::MBC3: mapper = &mbc3; break;
57
case Mapper::MBC5: mapper = &mbc5; break;
58
case Mapper::MMM01: mapper = &mmm01; break;
59
case Mapper::HuC1: mapper = &huc1; break;
60
case Mapper::HuC3: mapper = &huc3; break;
61
}
62
63
ramdata = (uint8_t*)interface->allocSharedMemory("SGB_CARTRAM",ramsize = info.ramsize);
64
system.load(revision);
65
66
loaded = true;
67
sha256 = nall::sha256(romdata, romsize);
68
}
69
70
void Cartridge::unload() {
71
if(loaded == false) return;
72
73
if(romdata) { delete[] romdata; romdata = 0; }
74
if(ramdata) { interface->freeSharedMemory(ramdata); }
75
loaded = false;
76
}
77
78
uint8 Cartridge::rom_read(unsigned addr) {
79
if(addr >= romsize) addr %= romsize;
80
return romdata[addr];
81
}
82
83
void Cartridge::rom_write(unsigned addr, uint8 data) {
84
if(addr >= romsize) addr %= romsize;
85
romdata[addr] = data;
86
}
87
88
uint8 Cartridge::ram_read(unsigned addr) {
89
if(ramsize == 0) return 0x00;
90
if(addr >= ramsize) addr %= ramsize;
91
return ramdata[addr];
92
}
93
94
void Cartridge::ram_write(unsigned addr, uint8 data) {
95
if(ramsize == 0) return;
96
if(addr >= ramsize) addr %= ramsize;
97
ramdata[addr] = data;
98
}
99
100
uint8 Cartridge::mmio_read(uint16 addr) {
101
if(addr == 0xff50) return 0x00;
102
103
if(bootrom_enable) {
104
const uint8 *data = nullptr;
105
switch(system.revision()) { default:
106
case System::Revision::GameBoy: data = System::BootROM::dmg; break;
107
case System::Revision::SuperGameBoy: data = System::BootROM::sgb; break;
108
case System::Revision::GameBoyColor: data = System::BootROM::cgb; break;
109
}
110
if(addr >= 0x0000 && addr <= 0x00ff) return data[addr];
111
if(addr >= 0x0200 && addr <= 0x08ff && system.cgb()) return data[addr - 256];
112
}
113
114
return mapper->mmio_read(addr);
115
}
116
117
void Cartridge::mmio_write(uint16 addr, uint8 data) {
118
if(bootrom_enable && addr == 0xff50) {
119
bootrom_enable = false;
120
return;
121
}
122
123
mapper->mmio_write(addr, data);
124
}
125
126
void Cartridge::power() {
127
bootrom_enable = true;
128
129
mbc0.power();
130
mbc1.power();
131
mbc2.power();
132
mbc3.power();
133
mbc5.power();
134
mmm01.power();
135
huc1.power();
136
huc3.power();
137
138
for(unsigned n = 0x0000; n <= 0x7fff; n++) bus.mmio[n] = this;
139
for(unsigned n = 0xa000; n <= 0xbfff; n++) bus.mmio[n] = this;
140
bus.mmio[0xff50] = this;
141
}
142
143
Cartridge::Cartridge() {
144
loaded = false;
145
romdata = 0;
146
ramdata = 0;
147
}
148
149
Cartridge::~Cartridge() {
150
unload();
151
}
152
153
}
154
155