Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libsnes/bsnes/snes/memory/memory.cpp
2 views
1
#include <snes/snes.hpp>
2
3
#define MEMORY_CPP
4
namespace SNES {
5
6
Bus bus;
7
8
unsigned Bus::mirror(unsigned addr, unsigned size) {
9
unsigned base = 0;
10
if(size) {
11
unsigned mask = 1 << 23;
12
while(addr >= size) {
13
while(!(addr & mask)) mask >>= 1;
14
addr -= mask;
15
if(size > mask) {
16
size -= mask;
17
base += mask;
18
}
19
mask >>= 1;
20
}
21
base += addr;
22
}
23
return base;
24
}
25
26
void Bus::map(
27
MapMode mode,
28
unsigned bank_lo, unsigned bank_hi,
29
unsigned addr_lo, unsigned addr_hi,
30
const function<uint8 (unsigned)> &rd,
31
const function<void (unsigned, uint8)> &wr,
32
unsigned base, unsigned length
33
) {
34
assert(bank_lo <= bank_hi && bank_lo <= 0xff);
35
assert(addr_lo <= addr_hi && addr_lo <= 0xffff);
36
unsigned id = idcount++;
37
assert(id < 255);
38
reader[id] = rd;
39
writer[id] = wr;
40
41
if(length == 0) length = (bank_hi - bank_lo + 1) * (addr_hi - addr_lo + 1);
42
43
unsigned offset = 0;
44
for(unsigned bank = bank_lo; bank <= bank_hi; bank++) {
45
for(unsigned addr = addr_lo; addr <= addr_hi; addr++) {
46
unsigned destaddr = (bank << 16) | addr;
47
if(mode == MapMode::Linear) destaddr = mirror(base + offset++, length);
48
if(mode == MapMode::Shadow) destaddr = mirror(base + destaddr, length);
49
lookup[(bank << 16) | addr] = id;
50
target[(bank << 16) | addr] = destaddr;
51
}
52
}
53
}
54
55
void Bus::map_reset() {
56
function<uint8 (unsigned)> reader = [](unsigned) { return cpu.regs.mdr; };
57
function<void (unsigned, uint8)> writer = [](unsigned, uint8) {};
58
59
idcount = 0;
60
map(MapMode::Direct, 0x00, 0xff, 0x0000, 0xffff, reader, writer);
61
}
62
63
void Bus::map_xml() {
64
for(auto &m : cartridge.mapping) {
65
map(m.mode, m.banklo, m.bankhi, m.addrlo, m.addrhi, m.read, m.write, m.offset, m.size);
66
}
67
}
68
69
Bus::Bus() {
70
lookup = new uint8 [16 * 1024 * 1024];
71
target = new uint32[16 * 1024 * 1024];
72
}
73
74
Bus::~Bus() {
75
delete[] lookup;
76
delete[] target;
77
}
78
79
}
80
81