@@ -102,6 +102,7 @@ static uint16 mapperFDS_blocklen; /* length of current block */
102
102
static uint16 mapperFDS_diskaddr ; /* current address relative to blockstart */
103
103
static uint8 mapperFDS_diskaccess ; /* disk needs to be accessed at least once
104
104
before writing */
105
+ static uint8 mapperFDS_transferflag ;
105
106
106
107
#define BYTES_PER_SIDE 65500
107
108
@@ -154,8 +155,24 @@ static void FDSPower(void) {
154
155
MapIRQHook = FDSFix ;
155
156
GameStateRestore = FDSStateRestore ;
156
157
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 );
159
176
160
177
SetWriteHandler (0x6000 , 0xDFFF , CartBW );
161
178
SetReadHandler (0x6000 , 0xFFFF , CartBR );
@@ -176,6 +193,7 @@ static void FDSPower(void) {
176
193
mapperFDS_blocklen = 0 ;
177
194
mapperFDS_diskaddr = 0 ;
178
195
mapperFDS_diskaccess = 0 ;
196
+ mapperFDS_transferflag = FALSE;
179
197
}
180
198
181
199
static uint8 isDiskInserted (void ) {
@@ -238,6 +256,7 @@ static void FDSFix(int a) {
238
256
if (DiskSeekIRQ > 0 ) {
239
257
DiskSeekIRQ -= a ;
240
258
if (DiskSeekIRQ <= 0 ) {
259
+ mapperFDS_transferflag = TRUE;
241
260
if (mapperFDS_control & 0x80 ) {
242
261
X6502_IRQBegin (FCEU_IQEXT2 );
243
262
}
@@ -246,91 +265,66 @@ static void FDSFix(int a) {
246
265
}
247
266
248
267
static DECLFR (FDSRead ) {
249
- uint8 ret = 0 ;
268
+ uint8 ret = cpu . openbus ;
250
269
251
270
if (!DiskIOEnabled ) {
252
271
return ret ;
253
272
}
254
273
255
- if ((A >= 0x4040 ) && (A <= 0x407F )) {
256
- return FDSWaveRead (A );
257
- }
258
-
259
274
switch (A ) {
260
275
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;
277
283
return ret ;
278
284
279
285
case 0x4031 :
280
286
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 ;
293
302
}
294
- mapperFDS_diskaddr ++ ;
303
+ break ;
295
304
}
296
- DiskSeekIRQ = 150 ;
297
- X6502_IRQEnd (FCEU_IQEXT2 );
305
+ mapperFDS_diskaddr ++ ;
298
306
}
307
+ DiskSeekIRQ = 150 ;
308
+ X6502_IRQEnd (FCEU_IQEXT2 );
309
+ mapperFDS_transferflag = FALSE;
299
310
return ret ;
300
311
301
312
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 ;
310
318
return ret ;
311
319
312
320
case 0x4033 :
313
321
return 0x80 ; /* battery */
314
-
315
- case 0x4090 :
316
- return FDSEnvVolumeRead (A );
317
-
318
- case 0x4092 :
319
- return FDSEnvModRead (A );
320
322
}
321
323
322
- return cpu . openbus ;
324
+ return ret ;
323
325
}
324
326
325
327
static DECLFW (FDSWrite ) {
326
- if (!DiskIOEnabled && (A >= 0x4024 )) {
327
- return ;
328
- }
329
-
330
- if ((A >= 0x4040 ) && (A <= 0x407F )) {
331
- FDSWaveWrite (A , V );
332
- }
333
-
334
328
switch (A ) {
335
329
case 0x4020 :
336
330
IRQLatch &= 0xFF00 ;
@@ -381,6 +375,9 @@ static DECLFW(FDSWrite) {
381
375
mapperFDS_diskaddr ++ ;
382
376
}
383
377
}
378
+ DiskSeekIRQ = 150 ;
379
+ X6502_IRQEnd (FCEU_IQEXT2 );
380
+ mapperFDS_transferflag = FALSE;
384
381
break ;
385
382
386
383
case 0x4025 :
@@ -424,46 +421,6 @@ static DECLFW(FDSWrite) {
424
421
mapperFDS_control = V ;
425
422
setmirror (((V >> 3 ) & 1 ) ^ 1 );
426
423
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 ;
467
424
}
468
425
}
469
426
0 commit comments