Skip to content

Commit c7cec91

Browse files
OpenBIOS: Refactor card driver
1 parent 4e42a6b commit c7cec91

File tree

2 files changed

+48
-115
lines changed

2 files changed

+48
-115
lines changed

src/mips/common/hardware/sio.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,12 @@ enum {
6767
SIO_STAT_ACK = (1 << 7), // ACK signal level (input)
6868
SIO_STAT_CTS = (1 << 8), // Clear to Send (output), unused on SIO0
6969
SIO_STAT_IRQ = (1 << 9), // Interrupt Request
70-
};
70+
};
71+
72+
static inline uint8_t __attribute__((always_inline)) exchangeByte(uint8_t b) {
73+
uint8_t ret = SIOS[0].fifo; // may throw away
74+
SIOS[0].fifo = b;
75+
SIOS[0].ctrl |= SIO_CTRL_ERRRES;
76+
IREG = ~IRQ_CONTROLLER;
77+
return ret;
78+
}

src/mips/openbios/sio0/card.c

Lines changed: 39 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -96,25 +96,17 @@ int __attribute__((section(".ramtext"))) mcReadHandler() {
9696

9797
switch (g_mcOperation) {
9898
case 1:
99-
g_sio0Mask = port == 0 ? 0x0000 : 0x2000;
100-
SIOS[0].ctrl = g_sio0Mask | 0x1003;
101-
SIOS[0].fifo; // throw away
102-
SIOS[0].fifo = (g_mcDeviceId[port] & 0x0f) + 0x81;
103-
SIOS[0].ctrl |= 0x0010;
104-
IREG = ~IRQ_CONTROLLER;
99+
g_sio0Mask = port == 0 ? 0x0000 : SIO_CTRL_PORTSEL;
100+
SIOS[0].ctrl = g_sio0Mask | SIO_CTRL_TXEN | SIO_CTRL_ACKIRQEN
101+
| SIO_CTRL_DTR;
102+
exchangeByte((g_mcDeviceId[port] & 0x0f) + 0x81);
105103
g_mcActionInProgress = 1;
106104
break;
107105
case 2:
108-
SIOS[0].fifo; // throw away
109-
SIOS[0].fifo = 'R';
110-
SIOS[0].ctrl |= 0x0010;
111-
IREG = ~IRQ_CONTROLLER;
106+
exchangeByte('R');
112107
break;
113108
case 3:
114-
b = SIOS[0].fifo;
115-
SIOS[0].fifo = 0;
116-
SIOS[0].ctrl |= 0x0010;
117-
IREG = ~IRQ_CONTROLLER;
109+
b = exchangeByte(0);
118110
if (g_skipErrorOnNewCard) return 0;
119111
if ((b & 0x08) == 0) return 0;
120112
g_skipErrorOnNewCard = 0; // durr?
@@ -126,77 +118,47 @@ int __attribute__((section(".ramtext"))) mcReadHandler() {
126118
return -1;
127119
break;
128120
case 4:
129-
b = SIOS[0].fifo;
130-
SIOS[0].fifo = 0;
131-
SIOS[0].ctrl |= 0x0010;
132-
IREG = ~IRQ_CONTROLLER;
121+
b = exchangeByte(0);
133122
if (b != 0x5a) return -1;
134123
break;
135124
case 5:
136-
b = SIOS[0].fifo;
137-
SIOS[0].fifo = sector >> 8;
138-
SIOS[0].ctrl |= 0x0010;
139-
IREG = ~IRQ_CONTROLLER;
125+
b = exchangeByte(sector >> 8);
140126
if (b != 0x5d) return -1;
141127
break;
142128
case 6:
143-
SIOS[0].fifo; // throw away
144-
SIOS[0].fifo = sector;
145-
SIOS[0].ctrl |= 0x0010;
146-
IREG = ~IRQ_CONTROLLER;
129+
exchangeByte(sector);
147130
break;
148131
case 7:
149-
SIOS[0].fifo; // throw away
150-
SIOS[0].fifo = 0;
151-
SIOS[0].ctrl |= 0x0010;
152-
IREG = ~IRQ_CONTROLLER;
132+
exchangeByte(0);
153133
break;
154134
case 8:
155-
b = SIOS[0].fifo;
156-
SIOS[0].fifo = 0;
157-
SIOS[0].ctrl |= 0x0010;
158-
IREG = ~IRQ_CONTROLLER;
135+
b = exchangeByte(0);
159136
if (b != 0x5c) return -1;
160137
break;
161138
case 9:
162-
b = SIOS[0].fifo;
163-
SIOS[0].fifo = 0;
164-
SIOS[0].ctrl |= 0x0010;
165-
IREG = ~IRQ_CONTROLLER;
139+
b = exchangeByte(0);
166140
if (b != 0x5d) return -1;
167141
break;
168142
case 10:
169-
b = SIOS[0].fifo;
170-
SIOS[0].fifo = 0;
171-
SIOS[0].ctrl |= 0x0010;
172-
IREG = ~IRQ_CONTROLLER;
143+
b = exchangeByte(0);
173144
if (b != (sector >> 8)) return -1;
174145
g_mcChecksum[port] = (sector ^ (sector >> 8)) & 0xff;
175146
s_mcCommand[port] = 0;
176147
break;
177148
case 11:
178-
b = SIOS[0].fifo;
179-
SIOS[0].fifo = s_mcCommand[port];
180-
SIOS[0].ctrl |= 0x0010;
181-
IREG = ~IRQ_CONTROLLER;
149+
b = exchangeByte(s_mcCommand[port]);
182150
if (b != (sector & 0xff)) return -1;
183151
g_mcFastTrackActive = 1;
184152
break;
185153
case 12:
186-
b = SIOS[0].fifo;
187-
SIOS[0].fifo = 0;
188-
SIOS[0].ctrl |= 0x0010;
189-
IREG = ~IRQ_CONTROLLER;
154+
b = exchangeByte(0);
190155
buffer[0x7f] = b;
191156
g_mcChecksum[port] ^= b;
192157
break;
193158
case 13:
194-
b = SIOS[0].fifo;
195-
SIOS[0].fifo = 0;
196-
SIOS[0].ctrl |= 0x0010;
197-
IREG = ~IRQ_CONTROLLER;
159+
b = exchangeByte(0);
198160
if (b != g_mcChecksum[port]) return -1;
199-
while ((SIOS[0].stat & 2) == 0);
161+
while ((SIOS[0].stat & SIO_STAT_RXRDY) == 0);
200162
return SIOS[0].fifo == 0x47 ? 1 : -1;
201163
default:
202164
return -1;
@@ -213,25 +175,17 @@ int __attribute__((section(".ramtext"))) mcWriteHandler() {
213175

214176
switch (g_mcOperation) {
215177
case 1:
216-
g_sio0Mask = port == 0 ? 0x0000 : 0x2000;
217-
SIOS[0].ctrl = g_sio0Mask | 0x1003;
218-
SIOS[0].fifo; // throw away
219-
SIOS[0].fifo = (g_mcDeviceId[port] & 0x0f) + 0x81;
220-
SIOS[0].ctrl |= 0x0010;
221-
IREG = ~IRQ_CONTROLLER;
178+
g_sio0Mask = port == 0 ? 0x0000 : SIO_CTRL_PORTSEL;
179+
SIOS[0].ctrl = g_sio0Mask | SIO_CTRL_TXEN | SIO_CTRL_ACKIRQEN
180+
| SIO_CTRL_DTR;
181+
exchangeByte((g_mcDeviceId[port] & 0x0f) + 0x81);
222182
g_mcActionInProgress = 1;
223183
break;
224184
case 2:
225-
SIOS[0].fifo; // throw away
226-
SIOS[0].fifo = 'W';
227-
SIOS[0].ctrl |= 0x0010;
228-
IREG = ~IRQ_CONTROLLER;
185+
exchangeByte('W');
229186
break;
230187
case 3:
231-
b = SIOS[0].fifo;
232-
SIOS[0].fifo = 0;
233-
SIOS[0].ctrl |= 0x0010;
234-
IREG = ~IRQ_CONTROLLER;
188+
b = exchangeByte(0);
235189
s_mcFlagByte[port] = b;
236190
if (g_skipErrorOnNewCard) return 0;
237191
if ((b & 0x08) == 0) return 0;
@@ -244,55 +198,34 @@ int __attribute__((section(".ramtext"))) mcWriteHandler() {
244198
return -1;
245199
break;
246200
case 4:
247-
b = SIOS[0].fifo;
248-
SIOS[0].fifo = 0;
249-
SIOS[0].ctrl |= 0x0010;
250-
IREG = ~IRQ_CONTROLLER;
201+
b = exchangeByte(0);
251202
if (b != 0x5a) return -1;
252203
break;
253204
case 5:
254-
b = SIOS[0].fifo;
255-
SIOS[0].fifo = sector >> 8;
256-
SIOS[0].ctrl |= 0x0010;
257-
IREG = ~IRQ_CONTROLLER;
205+
b = exchangeByte(sector >> 8);
258206
if (b != 0x5d) return -1;
259207
g_mcChecksum[port] = sector >> 8;
260208
break;
261209
case 6:
262-
SIOS[0].fifo; // throw away
263-
SIOS[0].fifo = sector & 0xff;
264-
SIOS[0].ctrl |= 0x0010;
265-
IREG = ~IRQ_CONTROLLER;
210+
exchangeByte(sector & 0xff);
266211
g_mcChecksum[port] ^= sector & 0xff;
267212
g_mcFastTrackActive = 1;
268213
break;
269214
case 7:
270215
SIOS[0].fifo; // throw away
271-
SIOS[0].fifo; // throw away
272-
SIOS[0].fifo = g_mcChecksum[port];
273-
SIOS[0].ctrl |= 0x0010;
274-
IREG = ~IRQ_CONTROLLER;
216+
exchangeByte(g_mcChecksum[port]);
275217
break;
276218
case 8:
277-
SIOS[0].fifo; // throw away
278-
SIOS[0].fifo = 0;
279-
SIOS[0].ctrl |= 0x0010;
280-
IREG = ~IRQ_CONTROLLER;
219+
exchangeByte(0);
281220
break;
282221
case 9:
283-
b = SIOS[0].fifo;
284-
SIOS[0].fifo = 0;
285-
SIOS[0].ctrl |= 0x0010;
286-
IREG = ~IRQ_CONTROLLER;
222+
b = exchangeByte(0);
287223
if (b != 0x5c) return -1;
288224
break;
289225
case 10:
290-
b = SIOS[0].fifo;
291-
SIOS[0].fifo = 0;
292-
SIOS[0].ctrl |= 0x0010;
293-
IREG = ~IRQ_CONTROLLER;
226+
b = exchangeByte(0);
294227
if (b != 0x5d) return -1;
295-
while ((SIOS[0].stat & 2) == 0);
228+
while ((SIOS[0].stat & SIO_STAT_RXRDY) == 0);
296229
if (!g_skipErrorOnNewCard && ((s_mcFlagByte[port] & 4) != 0)) {
297230
g_mcLastPort = g_mcPortFlipping;
298231
g_skipErrorOnNewCard = 0; // whyyyy
@@ -315,28 +248,20 @@ int __attribute__((section(".ramtext"))) mcInfoHandler() {
315248
port = g_mcPortFlipping;
316249
switch (g_mcOperation) {
317250
case 1:
318-
g_sio0Mask = port == 0 ? 0x0000 : 0x2000;
319-
SIOS[0].ctrl = g_sio0Mask | 0x1003;
320-
SIOS[0].fifo; // throw away
321-
SIOS[0].fifo = (g_mcDeviceId[port] & 0x0f) + 0x81;
322-
SIOS[0].ctrl = SIOS[0].ctrl | 0x0010;
323-
IREG = ~IRQ_CONTROLLER;
251+
g_sio0Mask = port == 0 ? 0x0000 : SIO_CTRL_PORTSEL;
252+
SIOS[0].ctrl = g_sio0Mask | SIO_CTRL_TXEN | SIO_CTRL_ACKIRQEN
253+
| SIO_CTRL_DTR;
254+
exchangeByte((g_mcDeviceId[port] & 0x0f) + 0x81);
324255
g_mcActionInProgress = 1;
325256
break;
326257
case 2:
327-
SIOS[0].fifo; // throw away
328-
SIOS[0].fifo = 'R';
329-
SIOS[0].ctrl = SIOS[0].ctrl | 0x0010;
330-
IREG = ~IRQ_CONTROLLER;
258+
exchangeByte('R');
331259
break;
332260
case 3:
333-
b = SIOS[0].fifo;
334-
SIOS[0].fifo = 0;
335-
SIOS[0].ctrl = SIOS[0].ctrl | 0x0010;
336-
IREG = ~IRQ_CONTROLLER;
261+
262+
b = exchangeByte(0);
337263
if (g_skipErrorOnNewCard) return 0;
338264
if ((b & 0x0c) == 0) break;
339-
340265
g_skipErrorOnNewCard = 0;
341266
g_mcFlags[port] = 1;
342267
g_mcLastPort = g_mcPortFlipping;
@@ -352,7 +277,7 @@ int __attribute__((section(".ramtext"))) mcInfoHandler() {
352277
case 4:
353278
b = SIOS[0].fifo;
354279
if (!g_mcCardInfoPatchActivated) SIOS[0].fifo = 0;
355-
SIOS[0].ctrl |= 0x0010;
280+
SIOS[0].ctrl |= SIO_CTRL_ERRRES;
356281
IREG = ~IRQ_CONTROLLER;
357282
return (b == 0x5a) ? 1 : -1;
358283
default:

0 commit comments

Comments
 (0)