for(i = 0; i < 8; i++) config.ignore_crc[i] = false;
# endif
#endif
+ for(i = 0; i <8; i++) config.fdd_hack_fast_transfer[i] = false;
#if defined(USE_SOUND_DEVICE_TYPE) && defined(SOUND_DEVICE_TYPE_DEFAULT)
config.sound_device_type = SOUND_DEVICE_TYPE_DEFAULT;
#endif
config.ignore_crc[drv] = GetPrivateProfileBool(_T("Control"), _tag, config.ignore_crc[drv], config_path);
}
}
+ {
+ _TCHAR _tag[128];
+ for(drv = 0; drv < 8; drv++) {
+ memset(_tag, 0x00, sizeof(_tag));
+ _stprintf_s(_tag, 64, _T("FDDFastTransfer_%d"), drv + 1);
+ config.fdd_hack_fast_transfer[drv] =
+ (GetPrivateProfileBool(_T("Control"),
+ _tag,
+ config.fdd_hack_fast_transfer[drv] ? 1 : 0,
+ config_path) != 0) ? true : false;
+ }
+ }
#endif
+
#ifdef USE_TAPE
config.tape_sound = GetPrivateProfileBool(_T("Control"), _T("TapeSound"), config.tape_sound, config_path);
config.wave_shaper = GetPrivateProfileBool(_T("Control"), _T("WaveShaper"), config.wave_shaper, config_path);
WritePrivateProfileBool(_T("Control"), _tag, config.ignore_crc[drv], config_path);
}
}
-
+ {
+ _TCHAR _tag[128];
+ for(drv = 0; drv < 8; drv++) {
+ memset(_tag, 0x00, sizeof(_tag));
+ _stprintf_s(_tag, 64, _T("FDDFastTransfer_%d"), drv + 1);
+ WritePrivateProfileBool(_T("Control"),
+ _tag,
+ config.fdd_hack_fast_transfer[drv] ? 1 : 0,
+ config_path);
+ }
+ }
+
#endif
#ifdef USE_TAPE
WritePrivateProfileBool(_T("Control"), _T("TapeSound"), config.tape_sound, config_path);
} \
now_seek = after_seek = true; \
}
+
#define REGISTER_DRQ_EVENT() { \
double usec = disk[drvreg]->get_usec_per_bytes(1) - passed_usec(prev_drq_clock); \
if(usec < 4) { \
usec = 4; \
} else if(usec > 24 && disk[drvreg]->is_special_disk == SPECIAL_DISK_X1_ALPHA) { \
usec = 24; \
- } \
+ } else if(config.fdd_hack_fast_transfer[drvreg]) { \
+ usec = 4; \
+ }\
if(register_id[EVENT_DRQ] != -1) { \
cancel_event(this, register_id[EVENT_DRQ]); \
register_id[EVENT_DRQ] = -1; \
} \
register_event(this, (EVENT_DRQ << 8) | (cmdtype & 0xff), usec, false, ®ister_id[EVENT_DRQ]); \
}
+
#define REGISTER_LOST_EVENT() { \
if(register_id[EVENT_LOST] != -1) { \
cancel_event(this, register_id[EVENT_LOST]); \
if(seektrk == fdc[drvreg].track) {
// auto update
if((cmdreg & 0xf0) == 0) {
- datareg = 0;
+ datareg = seektrk;
}
status |= search_track();
now_seek = false;
set_irq(true);
#ifdef _FDC_DEBUG_LOG
- emu->out_debug_log(_T("FDC\tSEEK END\n"));
+ emu->out_debug_log(_T("FDC\tSEEKn"));
#endif
} else {
REGISTER_SEEK_EVENT();
trkreg = fdc[drvreg].track;
}
if((cmdreg & 0xf0) == 0) {
- datareg = 0;
+ datareg = seektrk;
}
status |= search_track();
now_seek = false;
seektrk = 0;
seekvct = true;
-
- REGISTER_SEEK_EVENT();
- REGISTER_EVENT(EVENT_SEEKEND, 300);
+#if 1
+ if(fdc[drvreg].track != seektrk) {
+ REGISTER_SEEK_EVENT();
+ } else {
+ REGISTER_EVENT(EVENT_SEEKEND, 300.0 * 1000.0);
+ }
+#else
+ fdc[drvreg].track = seektrk;
+ if((cmdreg & 0x10) || ((cmdreg & 0xf0) == 0)) {
+ trkreg = fdc[drvreg].track;
+ }
+ if((cmdreg & 0xf0) == 0) {
+ datareg = seektrk;
+ }
+ status |= search_track();
+ now_seek = false;
+ set_irq(true);
+#ifdef _FDC_DEBUG_LOG
+ emu->out_debug_log(_T("FDC\tSEEKn"));
+#endif
+#endif
}
void MB8877::cmd_seek()
cmdtype = FDC_CMD_TYPE1;
status = FDC_ST_HEADENG | FDC_ST_BUSY;
-#if 0
- seektrk = fdc[drvreg].track + datareg - trkreg;
-#else
seektrk = datareg;
-#endif
seektrk = (seektrk > 83) ? 83 : (seektrk < 0) ? 0 : seektrk;
seekvct = !(datareg > trkreg);
- REGISTER_SEEK_EVENT();
- REGISTER_EVENT(EVENT_SEEKEND, 300);
+#if 1
+ if(fdc[drvreg].track != seektrk) {
+ REGISTER_SEEK_EVENT();
+ } else {
+ REGISTER_EVENT(EVENT_SEEKEND, 300.0 * 1000.0);
+ }
+#else
+ fdc[drvreg].track = seektrk;
+ if((cmdreg & 0x10) || ((cmdreg & 0xf0) == 0)) {
+ trkreg = fdc[drvreg].track;
+ }
+ if((cmdreg & 0xf0) == 0) {
+ datareg = seektrk;
+ }
+ status |= search_track();
+ now_seek = false;
+ set_irq(true);
+#ifdef _FDC_DEBUG_LOG
+ emu->out_debug_log(_T("FDC\tSEEKn"));
+#endif
+#endif
}
void MB8877::cmd_step()
seektrk = (fdc[drvreg].track < 83) ? fdc[drvreg].track + 1 : 83;
seekvct = false;
- REGISTER_SEEK_EVENT();
- REGISTER_EVENT(EVENT_SEEKEND, 300);
+#if 1
+ if(fdc[drvreg].track != seektrk) {
+ REGISTER_SEEK_EVENT();
+ } else {
+ REGISTER_EVENT(EVENT_SEEKEND, 300.0 * 1000.0);
+ }
+#else
+ fdc[drvreg].track = seektrk;
+ if((cmdreg & 0x10) || ((cmdreg & 0xf0) == 0)) {
+ trkreg = fdc[drvreg].track;
+ }
+ if((cmdreg & 0xf0) == 0) {
+ datareg = seektrk;
+ }
+ status |= search_track();
+ now_seek = false;
+ set_irq(true);
+#ifdef _FDC_DEBUG_LOG
+ emu->out_debug_log(_T("FDC\tSEEKn"));
+#endif
+#endif
+ //REGISTER_SEEK_EVENT();
+ //REGISTER_EVENT(EVENT_SEEKEND, 300);
}
void MB8877::cmd_stepout()
seektrk = (fdc[drvreg].track > 0) ? fdc[drvreg].track - 1 : 0;
seekvct = true;
- REGISTER_SEEK_EVENT();
- REGISTER_EVENT(EVENT_SEEKEND, 300);
+#if 1
+ if(fdc[drvreg].track != seektrk) {
+ REGISTER_SEEK_EVENT();
+ } else {
+ REGISTER_EVENT(EVENT_SEEKEND, 300.0 * 1000.0);
+ }
+#else
+ fdc[drvreg].track = seektrk;
+ if((cmdreg & 0x10) || ((cmdreg & 0xf0) == 0)) {
+ trkreg = fdc[drvreg].track;
+ }
+ if((cmdreg & 0xf0) == 0) {
+ datareg = seektrk;
+ }
+ status |= search_track();
+ now_seek = false;
+ set_irq(true);
+#ifdef _FDC_DEBUG_LOG
+ emu->out_debug_log(_T("FDC\tSEEKn"));
+#endif
+#endif
+ //REGISTER_SEEK_EVENT();
+ //REGISTER_EVENT(EVENT_SEEKEND, 300);
}
void MB8877::cmd_readdata()
CC = CC | CC_II | CC_IF; // 0x50
pPC = RM16_PAIR(0xfffc);
// printf("NMI occured PC=0x%04x VECTOR=%04x SP=%04x \n",rpc.w.l,pPC.w.l,S);
- int_state |= MC6809_SYNC_OUT;
- int_state &= ~MC6809_NMI_BIT; // $FE1E
+ int_state |= MC6809_CWAI_OUT;
+ int_state &= ~(MC6809_NMI_BIT | MC6809_SYNC_IN | MC6809_SYNC_OUT | MC6809_CWAI_IN); // $FF1E
}
}
CC = CC | CC_IF | CC_II;
pPC = RM16_PAIR(0xfff6);
- int_state |= MC6809_SYNC_OUT;
+ int_state |= MC6809_CWAI_OUT;
+ int_state &= ~(MC6809_SYNC_IN | MC6809_SYNC_OUT | MC6809_CWAI_IN);
// printf("Firq occured PC=0x%04x VECTOR=%04x SP=%04x \n",rpc.w.l,pPC.w.l,S);
}
}
CC |= CC_II;
pPC = RM16_PAIR(0xfff8);
- int_state |= MC6809_SYNC_OUT;
+ int_state |= MC6809_CWAI_OUT;
+ int_state &= ~(MC6809_SYNC_IN | MC6809_SYNC_OUT | MC6809_CWAI_IN);
+
// printf("IRQ occured PC=0x%04x VECTOR=%04x SP=%04x \n",rpc.w.l,pPC.w.l,S);
}