Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libsnes/bsnes/snes/chip/superfx/memory/memory.cpp
2 views
1
#ifdef SUPERFX_CPP
2
3
uint8 SuperFX::bus_read(unsigned addr) {
4
if((addr & 0xc00000) == 0x000000) { //$00-3f:0000-7fff, $00-3f:8000-ffff
5
while(!regs.scmr.ron && scheduler.sync != Scheduler::SynchronizeMode::All) {
6
add_clocks(6);
7
synchronize_cpu();
8
}
9
return cartridge.rom.read((((addr & 0x3f0000) >> 1) | (addr & 0x7fff)) & rom_mask);
10
}
11
12
if((addr & 0xe00000) == 0x400000) { //$40-5f:0000-ffff
13
while(!regs.scmr.ron && scheduler.sync != Scheduler::SynchronizeMode::All) {
14
add_clocks(6);
15
synchronize_cpu();
16
}
17
return cartridge.rom.read(addr & rom_mask);
18
}
19
20
if((addr & 0xe00000) == 0x600000) { //$60-7f:0000-ffff
21
while(!regs.scmr.ran && scheduler.sync != Scheduler::SynchronizeMode::All) {
22
add_clocks(6);
23
synchronize_cpu();
24
}
25
return cartridge.ram.read(addr & ram_mask);
26
}
27
}
28
29
void SuperFX::bus_write(unsigned addr, uint8 data) {
30
if((addr & 0xe00000) == 0x600000) { //$60-7f:0000-ffff
31
while(!regs.scmr.ran && scheduler.sync != Scheduler::SynchronizeMode::All) {
32
add_clocks(6);
33
synchronize_cpu();
34
}
35
return cartridge.ram.write(addr & ram_mask, data);
36
}
37
}
38
39
uint8 SuperFX::op_read(uint16 addr) {
40
uint16 offset = addr - regs.cbr;
41
if(offset < 512) {
42
if(cache.valid[offset >> 4] == false) {
43
unsigned dp = offset & 0xfff0;
44
unsigned sp = (regs.pbr << 16) + ((regs.cbr + dp) & 0xfff0);
45
for(unsigned n = 0; n < 16; n++) {
46
add_clocks(memory_access_speed);
47
cache.buffer[dp++] = bus_read(sp++);
48
}
49
cache.valid[offset >> 4] = true;
50
} else {
51
add_clocks(cache_access_speed);
52
}
53
return cache.buffer[offset];
54
}
55
56
if(regs.pbr <= 0x5f) {
57
//$[00-5f]:[0000-ffff] ROM
58
rombuffer_sync();
59
add_clocks(memory_access_speed);
60
return bus_read((regs.pbr << 16) + addr);
61
} else {
62
//$[60-7f]:[0000-ffff] RAM
63
rambuffer_sync();
64
add_clocks(memory_access_speed);
65
return bus_read((regs.pbr << 16) + addr);
66
}
67
}
68
69
uint8 SuperFX::peekpipe() {
70
uint8 result = regs.pipeline;
71
regs.pipeline = op_read(regs.r[15]);
72
r15_modified = false;
73
return result;
74
}
75
76
uint8 SuperFX::pipe() {
77
uint8 result = regs.pipeline;
78
regs.pipeline = op_read(++regs.r[15]);
79
r15_modified = false;
80
return result;
81
}
82
83
void SuperFX::cache_flush() {
84
for(unsigned n = 0; n < 32; n++) cache.valid[n] = false;
85
}
86
87
uint8 SuperFX::cache_mmio_read(uint16 addr) {
88
addr = (addr + regs.cbr) & 511;
89
return cache.buffer[addr];
90
}
91
92
void SuperFX::cache_mmio_write(uint16 addr, uint8 data) {
93
addr = (addr + regs.cbr) & 511;
94
cache.buffer[addr] = data;
95
if((addr & 15) == 15) cache.valid[addr >> 4] = true;
96
}
97
98
void SuperFX::memory_reset() {
99
rom_mask = cartridge.rom.size() - 1;
100
ram_mask = cartridge.ram.size() - 1;
101
102
for(unsigned n = 0; n < 512; n++) cache.buffer[n] = 0x00;
103
for(unsigned n = 0; n < 32; n++) cache.valid[n] = false;
104
for(unsigned n = 0; n < 2; n++) {
105
pixelcache[n].offset = ~0;
106
pixelcache[n].bitpend = 0x00;
107
}
108
}
109
110
#endif
111
112