@@ -95,20 +95,11 @@ auto Cartridge::RTC::controlRead() -> n8 {
95
95
n8 data = 0 ;
96
96
data.bit (0 ,3 ) = command;
97
97
data.bit (4 ) = active;
98
- data.bit (7 ) = 1 ; // 0 = busy; 1 = ready for command
98
+ data.bit (7 ) = ready;
99
99
return data;
100
100
}
101
101
102
102
auto Cartridge::RTC::controlWrite (n5 data) -> void {
103
- // TODO: This probably isn't right, but will do unless someone tries to
104
- // cancel an RTC command mid-execution.
105
- if (active) {
106
- if (!data.bit (4 ) || command != data.bit (0 ,3 )) {
107
- debug (unimplemented, " [RTC] Port 0xCA write during command processing = " , data);
108
- }
109
- return ;
110
- }
111
-
112
103
command = data.bit (0 ,3 );
113
104
active = data.bit (4 );
114
105
@@ -132,12 +123,11 @@ auto Cartridge::RTC::controlWrite(n5 data) -> void {
132
123
case 0x0A : { // no-op
133
124
index = 0 ;
134
125
} break ;
135
- default : {
136
- active = 0 ;
137
- } break ;
138
126
}
139
127
140
- if (active && command.bit (0 )) fetch ();
128
+ ready = 1 ;
129
+ if (active && command.bit (0 )) fetch ();
130
+ if (active && !command.bit (0 )) write (fetchedData);
141
131
}
142
132
143
133
auto Cartridge::RTC::fetch () -> void {
@@ -181,22 +171,25 @@ auto Cartridge::RTC::fetch() -> void {
181
171
data = 0xFF ;
182
172
if (++index >= 2 ) active = 0 ;
183
173
} break ;
184
- default : {
185
- active = 0 ;
186
- } break ;
187
174
}
188
175
176
+ ready = 1 ;
189
177
fetchedData = data;
190
178
}
191
179
192
180
auto Cartridge::RTC::read () -> n8 {
193
181
n8 data = fetchedData;
182
+
183
+ if (!active) ready = 0 ;
194
184
if (active && command.bit (0 )) fetch ();
195
185
196
186
return data;
197
187
}
198
188
199
189
auto Cartridge::RTC::write (n8 data) -> void {
190
+ fetchedData = data;
191
+
192
+ if (!active) ready = 0 ;
200
193
if (active && !command.bit (0 )) switch (command & 0x0E ) {
201
194
case 0x02 : { // STATUS
202
195
status ().bit (6 ) = data.bit (6 );
@@ -259,6 +252,7 @@ auto Cartridge::RTC::power() -> void {
259
252
260
253
command = 0 ;
261
254
active = 0 ;
255
+ ready = 0 ;
262
256
index = 0 ;
263
257
counter = 0 ;
264
258
fetchedData = 0xFF ;
0 commit comments