Skip to content

Commit 7cd8a0c

Browse files
FDS: Adjust to transfer flag timing
- Disk transfer flag (bit 1 or register read $4030) is not set independently from the disk irq state. Transfer flag is automatically enabled when DiskSeekIRQ decrements to zero, meaning byte transfer is done and does not wait for disk irq. Flag is reset after serviced in $4030, $4031, $4024. (fix Putt Putt Golf)
1 parent 3a17e2a commit 7cd8a0c

File tree

1 file changed

+58
-101
lines changed

1 file changed

+58
-101
lines changed

src/fds.c

Lines changed: 58 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ static uint16 mapperFDS_blocklen; /* length of current block */
102102
static uint16 mapperFDS_diskaddr; /* current address relative to blockstart */
103103
static uint8 mapperFDS_diskaccess; /* disk needs to be accessed at least once
104104
before writing */
105+
static uint8 mapperFDS_transferflag;
105106

106107
#define BYTES_PER_SIDE 65500
107108

@@ -154,8 +155,24 @@ static void FDSPower(void) {
154155
MapIRQHook = FDSFix;
155156
GameStateRestore = FDSStateRestore;
156157

157-
SetReadHandler(0x4020, 0x5FFF, FDSRead);
158-
SetWriteHandler(0x4020, 0x5FFF, FDSWrite);
158+
SetReadHandler(0x4030, 0x4033, FDSRead);
159+
SetWriteHandler(0x4020, 0x4025, FDSWrite);
160+
161+
SetReadHandler(0x4040, 0x407F, FDSWaveRead);
162+
SetReadHandler(0x4090, 0x4090, FDSEnvVolumeRead);
163+
SetReadHandler(0x4092, 0x4092, FDSEnvModRead);
164+
165+
SetWriteHandler(0x4040, 0x407F, FDSWaveWrite);
166+
SetWriteHandler(0x4080, 0x4080, FDSSReg0Write);
167+
SetWriteHandler(0x4082, 0x4082, FDSSReg1Write);
168+
SetWriteHandler(0x4083, 0x4083, FDSSReg2Write);
169+
SetWriteHandler(0x4084, 0x4084, FDSSReg3Write);
170+
SetWriteHandler(0x4085, 0x4085, FDSSReg4Write);
171+
SetWriteHandler(0x4086, 0x4086, FDSSReg5Write);
172+
SetWriteHandler(0x4087, 0x4087, FDSSReg6Write);
173+
SetWriteHandler(0x4088, 0x4088, FDSSReg7Write);
174+
SetWriteHandler(0x4089, 0x4089, FDSSReg8Write);
175+
SetWriteHandler(0x408A, 0x408A, FDSSReg9Write);
159176

160177
SetWriteHandler(0x6000, 0xDFFF, CartBW);
161178
SetReadHandler(0x6000, 0xFFFF, CartBR);
@@ -176,6 +193,7 @@ static void FDSPower(void) {
176193
mapperFDS_blocklen = 0;
177194
mapperFDS_diskaddr = 0;
178195
mapperFDS_diskaccess = 0;
196+
mapperFDS_transferflag = FALSE;
179197
}
180198

181199
static uint8 isDiskInserted(void) {
@@ -238,6 +256,7 @@ static void FDSFix(int a) {
238256
if (DiskSeekIRQ > 0) {
239257
DiskSeekIRQ -= a;
240258
if (DiskSeekIRQ <= 0) {
259+
mapperFDS_transferflag = TRUE;
241260
if (mapperFDS_control & 0x80) {
242261
X6502_IRQBegin(FCEU_IQEXT2);
243262
}
@@ -246,91 +265,66 @@ static void FDSFix(int a) {
246265
}
247266

248267
static DECLFR(FDSRead) {
249-
uint8 ret = 0;
268+
uint8 ret = cpu.openbus;
250269

251270
if (!DiskIOEnabled) {
252271
return ret;
253272
}
254273

255-
if ((A >= 0x4040) && (A <= 0x407F)) {
256-
return FDSWaveRead(A);
257-
}
258-
259274
switch (A) {
260275
case 0x4030:
261-
ret = 0x80;
262-
263-
/* Cheap hack. */
264-
if (cpu.IRQlow & FCEU_IQEXT) {
265-
ret |= 1;
266-
}
267-
if (cpu.IRQlow & FCEU_IQEXT2) {
268-
ret |= 2;
269-
}
270-
#ifdef FCEUDEF_DEBUGGER
271-
if (!fceuindbg)
272-
#endif
273-
{
274-
X6502_IRQEnd(FCEU_IQEXT);
275-
X6502_IRQEnd(FCEU_IQEXT2);
276-
}
276+
ret &= 0x2C;
277+
ret |= (cpu.IRQlow & FCEU_IQEXT) ? 0x01 : 0;
278+
ret |= mapperFDS_transferflag ? 0x02 : 0;
279+
ret |= 0x80; /* disk is readable/writeable */
280+
X6502_IRQEnd(FCEU_IQEXT);
281+
X6502_IRQEnd(FCEU_IQEXT2);
282+
mapperFDS_transferflag = FALSE;
277283
return ret;
278284

279285
case 0x4031:
280286
ret = 0xFF;
281-
if (isDiskInserted() && (mapperFDS_control & 0x04)) {
282-
mapperFDS_diskaccess = 1;
283-
if (mapperFDS_diskaddr < mapperFDS_blocklen) {
284-
ret = disk_read(mapperFDS_blockstart + mapperFDS_diskaddr);
285-
switch (mapperFDS_blockID) {
286-
case DSK_FILEHDR:
287-
switch (mapperFDS_diskaddr) {
288-
case 13: mapperFDS_filesize = ret; break;
289-
case 14: mapperFDS_filesize |= (ret << 8); break;
290-
default: break;
291-
}
292-
break;
287+
if (!isDiskInserted()) {
288+
return ret;
289+
}
290+
if (!(mapperFDS_control & 0x04)) {
291+
return ret;
292+
}
293+
mapperFDS_diskaccess = 1;
294+
if (mapperFDS_diskaddr < mapperFDS_blocklen) {
295+
ret = disk_read(mapperFDS_blockstart + mapperFDS_diskaddr);
296+
switch (mapperFDS_blockID) {
297+
case DSK_FILEHDR:
298+
switch (mapperFDS_diskaddr) {
299+
case 13: mapperFDS_filesize = ret; break;
300+
case 14: mapperFDS_filesize |= (ret << 8); break;
301+
default: break;
293302
}
294-
mapperFDS_diskaddr++;
303+
break;
295304
}
296-
DiskSeekIRQ = 150;
297-
X6502_IRQEnd(FCEU_IQEXT2);
305+
mapperFDS_diskaddr++;
298306
}
307+
DiskSeekIRQ = 150;
308+
X6502_IRQEnd(FCEU_IQEXT2);
309+
mapperFDS_transferflag = FALSE;
299310
return ret;
300311

301312
case 0x4032:
302-
ret = 0x40;
303-
if (!isDiskInserted()) {
304-
ret |= 5;
305-
}
306-
if (!isDiskInserted() || !(mapperFDS_control & 0x01) ||
307-
(mapperFDS_control & 0x02)) {
308-
ret |= 2;
309-
}
313+
ret &= 0xF8;
314+
/* disk not inserted, not writable */
315+
ret |= !isDiskInserted() ? 0x05 : 0;
316+
/* disk not inserted, not motorOn, resettransfer */
317+
ret |= (!isDiskInserted() || !(mapperFDS_control & 0x01) || (mapperFDS_control & 0x02)) ? 0x02 : 0;
310318
return ret;
311319

312320
case 0x4033:
313321
return 0x80; /* battery */
314-
315-
case 0x4090:
316-
return FDSEnvVolumeRead(A);
317-
318-
case 0x4092:
319-
return FDSEnvModRead(A);
320322
}
321323

322-
return cpu.openbus;
324+
return ret;
323325
}
324326

325327
static DECLFW(FDSWrite) {
326-
if (!DiskIOEnabled && (A >= 0x4024)) {
327-
return;
328-
}
329-
330-
if ((A >= 0x4040) && (A <= 0x407F)) {
331-
FDSWaveWrite(A, V);
332-
}
333-
334328
switch (A) {
335329
case 0x4020:
336330
IRQLatch &= 0xFF00;
@@ -381,6 +375,9 @@ static DECLFW(FDSWrite) {
381375
mapperFDS_diskaddr++;
382376
}
383377
}
378+
DiskSeekIRQ = 150;
379+
X6502_IRQEnd(FCEU_IQEXT2);
380+
mapperFDS_transferflag = FALSE;
384381
break;
385382

386383
case 0x4025:
@@ -424,46 +421,6 @@ static DECLFW(FDSWrite) {
424421
mapperFDS_control = V;
425422
setmirror(((V >> 3) & 1) ^ 1);
426423
break;
427-
428-
case 0x4080:
429-
FDSSReg0Write(A, V);
430-
break;
431-
432-
case 0x4082:
433-
FDSSReg1Write(A, V);
434-
break;
435-
436-
case 0x4083:
437-
FDSSReg2Write(A, V);
438-
break;
439-
440-
case 0x4084:
441-
FDSSReg3Write(A, V);
442-
break;
443-
444-
case 0x4085:
445-
FDSSReg4Write(A, V);
446-
break;
447-
448-
case 0x4086:
449-
FDSSReg5Write(A, V);
450-
break;
451-
452-
case 0x4087:
453-
FDSSReg6Write(A, V);
454-
break;
455-
456-
case 0x4088:
457-
FDSSReg7Write(A, V);
458-
break;
459-
460-
case 0x4089:
461-
FDSSReg8Write(A, V);
462-
break;
463-
464-
case 0x408A:
465-
FDSSReg9Write(A, V);
466-
break;
467424
}
468425
}
469426

0 commit comments

Comments
 (0)