Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libsnes/bsnes/snes/alt/smp/memory.cpp
2 views
1
unsigned SMP::port_read(unsigned addr) {
2
return apuram[0xf4 + (addr & 3)];
3
}
4
5
void SMP::port_write(unsigned addr, unsigned data) {
6
apuram[0xf4 + (addr & 3)] = data;
7
}
8
9
unsigned SMP::mmio_read(unsigned addr) {
10
switch(addr) {
11
12
case 0xf2:
13
return status.dsp_addr;
14
15
case 0xf3:
16
return dsp.read(status.dsp_addr & 0x7f);
17
18
case 0xf4:
19
case 0xf5:
20
case 0xf6:
21
case 0xf7:
22
synchronize_cpu();
23
return cpu.port_read(addr);
24
25
case 0xf8:
26
return status.ram00f8;
27
28
case 0xf9:
29
return status.ram00f9;
30
31
case 0xfd: {
32
unsigned result = timer0.stage3_ticks & 15;
33
timer0.stage3_ticks = 0;
34
return result;
35
}
36
37
case 0xfe: {
38
unsigned result = timer1.stage3_ticks & 15;
39
timer1.stage3_ticks = 0;
40
return result;
41
}
42
43
case 0xff: {
44
unsigned result = timer2.stage3_ticks & 15;
45
timer2.stage3_ticks = 0;
46
return result;
47
}
48
49
}
50
51
return 0x00;
52
}
53
54
void SMP::mmio_write(unsigned addr, unsigned data) {
55
switch(addr) {
56
57
case 0xf1:
58
status.iplrom_enable = data & 0x80;
59
60
if(data & 0x30) {
61
synchronize_cpu();
62
if(data & 0x20) {
63
cpu.port_write(3, 0x00);
64
cpu.port_write(2, 0x00);
65
}
66
if(data & 0x10) {
67
cpu.port_write(1, 0x00);
68
cpu.port_write(0, 0x00);
69
}
70
}
71
72
if(timer2.enable == false && (data & 0x04)) {
73
timer2.stage2_ticks = 0;
74
timer2.stage3_ticks = 0;
75
}
76
timer2.enable = data & 0x04;
77
78
if(timer1.enable == false && (data & 0x02)) {
79
timer1.stage2_ticks = 0;
80
timer1.stage3_ticks = 0;
81
}
82
timer1.enable = data & 0x02;
83
84
if(timer0.enable == false && (data & 0x01)) {
85
timer0.stage2_ticks = 0;
86
timer0.stage3_ticks = 0;
87
}
88
timer0.enable = data & 0x01;
89
90
break;
91
92
case 0xf2:
93
status.dsp_addr = data;
94
break;
95
96
case 0xf3:
97
if(status.dsp_addr & 0x80) break;
98
dsp.write(status.dsp_addr, data);
99
break;
100
101
case 0xf4:
102
case 0xf5:
103
case 0xf6:
104
case 0xf7:
105
synchronize_cpu();
106
port_write(addr, data);
107
break;
108
109
case 0xf8:
110
status.ram00f8 = data;
111
break;
112
113
case 0xf9:
114
status.ram00f9 = data;
115
break;
116
117
case 0xfa:
118
timer0.target = data;
119
break;
120
121
case 0xfb:
122
timer1.target = data;
123
break;
124
125
case 0xfc:
126
timer2.target = data;
127
break;
128
129
}
130
}
131
132