Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libsnes/bsnes/snes/chip/superfx/timing/timing.cpp
2 views
1
#ifdef SUPERFX_CPP
2
3
void SuperFX::add_clocks(unsigned clocks) {
4
if(regs.romcl) {
5
regs.romcl -= min(clocks, regs.romcl);
6
if(regs.romcl == 0) {
7
regs.sfr.r = 0;
8
regs.romdr = bus_read((regs.rombr << 16) + regs.r[14]);
9
}
10
}
11
12
if(regs.ramcl) {
13
regs.ramcl -= min(clocks, regs.ramcl);
14
if(regs.ramcl == 0) {
15
bus_write(0x700000 + (regs.rambr << 16) + regs.ramar, regs.ramdr);
16
}
17
}
18
19
step(clocks);
20
synchronize_cpu();
21
}
22
23
void SuperFX::rombuffer_sync() {
24
if(regs.romcl) add_clocks(regs.romcl);
25
}
26
27
void SuperFX::rombuffer_update() {
28
regs.sfr.r = 1;
29
regs.romcl = memory_access_speed;
30
}
31
32
uint8 SuperFX::rombuffer_read() {
33
rombuffer_sync();
34
return regs.romdr;
35
}
36
37
void SuperFX::rambuffer_sync() {
38
if(regs.ramcl) add_clocks(regs.ramcl);
39
}
40
41
uint8 SuperFX::rambuffer_read(uint16 addr) {
42
rambuffer_sync();
43
return bus_read(0x700000 + (regs.rambr << 16) + addr);
44
}
45
46
void SuperFX::rambuffer_write(uint16 addr, uint8 data) {
47
rambuffer_sync();
48
regs.ramcl = memory_access_speed;
49
regs.ramar = addr;
50
regs.ramdr = data;
51
}
52
53
void SuperFX::r14_modify(uint16 data) {
54
regs.r[14].data = data;
55
rombuffer_update();
56
}
57
58
void SuperFX::r15_modify(uint16 data) {
59
regs.r[15].data = data;
60
r15_modified = true;
61
}
62
63
void SuperFX::update_speed() {
64
//force SuperFX1 mode?
65
if(clockmode == 1) {
66
cache_access_speed = 2;
67
memory_access_speed = 6;
68
return;
69
}
70
71
//force SuperFX2 mode?
72
if(clockmode == 2) {
73
cache_access_speed = 1;
74
memory_access_speed = 5;
75
regs.cfgr.ms0 = 0; //cannot use high-speed multiplication in 21MHz mode
76
return;
77
}
78
79
//default: allow S-CPU to select mode
80
cache_access_speed = (regs.clsr ? 1 : 2);
81
memory_access_speed = (regs.clsr ? 5 : 6);
82
if(regs.clsr) regs.cfgr.ms0 = 0; //cannot use high-speed multiplication in 21MHz mode
83
}
84
85
void SuperFX::timing_reset() {
86
update_speed();
87
r15_modified = false;
88
89
regs.romcl = 0;
90
regs.romdr = 0;
91
92
regs.ramcl = 0;
93
regs.ramar = 0;
94
regs.ramdr = 0;
95
}
96
97
#endif
98
99