Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libsnes/bsnes/snes/chip/superfx/mmio/mmio.cpp
2 views
1
#ifdef SUPERFX_CPP
2
3
uint8 SuperFX::mmio_read(unsigned addr) {
4
cpu.synchronize_coprocessors();
5
addr &= 0xffff;
6
7
if(addr >= 0x3100 && addr <= 0x32ff) {
8
return cache_mmio_read(addr - 0x3100);
9
}
10
11
if(addr >= 0x3000 && addr <= 0x301f) {
12
return regs.r[(addr >> 1) & 15] >> ((addr & 1) << 3);
13
}
14
15
switch(addr) {
16
case 0x3030: {
17
return regs.sfr >> 0;
18
}
19
20
case 0x3031: {
21
uint8 r = regs.sfr >> 8;
22
regs.sfr.irq = 0;
23
cpu.regs.irq = 0;
24
return r;
25
}
26
27
case 0x3034: {
28
return regs.pbr;
29
}
30
31
case 0x3036: {
32
return regs.rombr;
33
}
34
35
case 0x303b: {
36
return regs.vcr;
37
}
38
39
case 0x303c: {
40
return regs.rambr;
41
}
42
43
case 0x303e: {
44
return regs.cbr >> 0;
45
}
46
47
case 0x303f: {
48
return regs.cbr >> 8;
49
}
50
}
51
52
return 0x00;
53
}
54
55
void SuperFX::mmio_write(unsigned addr, uint8 data) {
56
cpu.synchronize_coprocessors();
57
addr &= 0xffff;
58
59
if(addr >= 0x3100 && addr <= 0x32ff) {
60
return cache_mmio_write(addr - 0x3100, data);
61
}
62
63
if(addr >= 0x3000 && addr <= 0x301f) {
64
unsigned n = (addr >> 1) & 15;
65
if((addr & 1) == 0) {
66
regs.r[n] = (regs.r[n] & 0xff00) | data;
67
} else {
68
regs.r[n] = (data << 8) | (regs.r[n] & 0xff);
69
}
70
71
if(addr == 0x301f) regs.sfr.g = 1;
72
return;
73
}
74
75
switch(addr) {
76
case 0x3030: {
77
bool g = regs.sfr.g;
78
regs.sfr = (regs.sfr & 0xff00) | (data << 0);
79
if(g == 1 && regs.sfr.g == 0) {
80
regs.cbr = 0x0000;
81
cache_flush();
82
}
83
} break;
84
85
case 0x3031: {
86
regs.sfr = (data << 8) | (regs.sfr & 0x00ff);
87
} break;
88
89
case 0x3033: {
90
regs.bramr = data;
91
} break;
92
93
case 0x3034: {
94
regs.pbr = data & 0x7f;
95
cache_flush();
96
} break;
97
98
case 0x3037: {
99
regs.cfgr = data;
100
update_speed();
101
} break;
102
103
case 0x3038: {
104
regs.scbr = data;
105
} break;
106
107
case 0x3039: {
108
regs.clsr = data;
109
update_speed();
110
} break;
111
112
case 0x303a: {
113
regs.scmr = data;
114
} break;
115
}
116
}
117
118
#endif
119
120