OSDN Git Service

[VM][MB8877][FM7][CONFIG] Add config var: fdd_hack_fast_transfer, workaround of ぎゅわんぶ...
authorK.Ohta <whatisthis.sowhat@gmail.com>
Thu, 30 Jul 2015 18:30:42 +0000 (03:30 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Thu, 30 Jul 2015 18:30:42 +0000 (03:30 +0900)
source/src/config.cpp
source/src/config.h
source/src/vm/mb8877.cpp
source/src/vm/mc6809.cpp

index 1d27034..2059a5c 100644 (file)
@@ -228,6 +228,7 @@ void init_config()
        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
@@ -325,7 +326,20 @@ void load_config()
                        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);
@@ -514,7 +528,18 @@ void save_config()
                        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);
index cc81feb..1729a10 100644 (file)
@@ -129,6 +129,7 @@ typedef struct {
 #endif
 #ifdef USE_FD1
        bool ignore_crc[8];
+       bool fdd_hack_fast_transfer[8];
 #endif
 #ifdef USE_TAPE
        bool tape_sound;
index 02fc0f7..67a277f 100644 (file)
@@ -74,19 +74,23 @@ static const int seek_wait_lo[4] = {6000, 12000, 20000, 30000};
        } \
        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, &register_id[EVENT_DRQ]); \
 }
+
 #define REGISTER_LOST_EVENT() { \
        if(register_id[EVENT_LOST] != -1) { \
                cancel_event(this, register_id[EVENT_LOST]); \
@@ -570,13 +574,13 @@ void MB8877::event_callback(int event_id, int err)
                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();
@@ -589,7 +593,7 @@ void MB8877::event_callback(int event_id, int err)
                                trkreg = fdc[drvreg].track;
                        }
                        if((cmdreg & 0xf0) == 0) {
-                               datareg = 0;
+                               datareg = seektrk;
                        }
                        status |= search_track();
                        now_seek = false;
@@ -750,9 +754,27 @@ void MB8877::cmd_restore()
        
        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()
@@ -761,16 +783,31 @@ 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()
@@ -792,8 +829,29 @@ void MB8877::cmd_stepin()
        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()
@@ -805,8 +863,29 @@ 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()
index 56008ad..fc88fd5 100644 (file)
@@ -316,8 +316,8 @@ void MC6809::cpu_nmi(void)
        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
 }
 
 
@@ -333,7 +333,8 @@ void MC6809::cpu_firq(void)
        }
        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);
 }
 
@@ -354,7 +355,9 @@ void MC6809::cpu_irq(void)
        }
        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);
 }