Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libsnes/bsnes/gameboy/cartridge/mbc1/mbc1.cpp
2 views
1
#ifdef CARTRIDGE_CPP
2
3
uint8 Cartridge::MBC1::mmio_read(uint16 addr) {
4
if((addr & 0xc000) == 0x0000) { //$0000-3fff
5
return cartridge.rom_read(addr);
6
}
7
8
if((addr & 0xc000) == 0x4000) { //$4000-7fff
9
if(mode_select == 0) {
10
return cartridge.rom_read((ram_select << 19) | (rom_select << 14) | (addr & 0x3fff));
11
} else {
12
return cartridge.rom_read((rom_select << 14) | (addr & 0x3fff));
13
}
14
}
15
16
if((addr & 0xe000) == 0xa000) { //$a000-bfff
17
if(ram_enable) {
18
if(mode_select == 0) {
19
return cartridge.ram_read(addr & 0x1fff);
20
} else {
21
return cartridge.ram_read((ram_select << 13) | (addr & 0x1fff));
22
}
23
}
24
return 0x00;
25
}
26
27
return 0x00;
28
}
29
30
void Cartridge::MBC1::mmio_write(uint16 addr, uint8 data) {
31
if((addr & 0xe000) == 0x0000) { //$0000-1fff
32
ram_enable = (data & 0x0f) == 0x0a;
33
return;
34
}
35
36
if((addr & 0xe000) == 0x2000) { //$2000-3fff
37
rom_select = (data & 0x1f) + ((data & 0x1f) == 0);
38
return;
39
}
40
41
if((addr & 0xe000) == 0x4000) { //$4000-5fff
42
ram_select = data & 0x03;
43
return;
44
}
45
46
if((addr & 0xe000) == 0x6000) { //$6000-7fff
47
mode_select = data & 0x01;
48
return;
49
}
50
51
if((addr & 0xe000) == 0xa000) { //$a000-bfff
52
if(ram_enable) {
53
if(mode_select == 0) {
54
cartridge.ram_write(addr & 0x1fff, data);
55
} else {
56
cartridge.ram_write((ram_select << 13) | (addr & 0x1fff), data);
57
}
58
}
59
return;
60
}
61
}
62
63
void Cartridge::MBC1::power() {
64
ram_enable = false;
65
rom_select = 0x01;
66
ram_select = 0x00;
67
mode_select = 0;
68
}
69
70
#endif
71
72