OSDN Git Service

[VM][FM8][FM77] Add delay FIRQ/NMI from 2HD/SFD FDC.This is temporally implement.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Wed, 31 Jan 2018 11:19:47 +0000 (20:19 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Wed, 31 Jan 2018 11:19:47 +0000 (20:19 +0900)
source/src/vm/fm7/floppy_2HD.cpp
source/src/vm/fm7/fm7_common.h
source/src/vm/fm7/fm7_mainio.cpp
source/src/vm/fm7/fm7_mainio.h
source/src/vm/mb8877.cpp
source/src/vm/mb8877.h

index e9acbb5..f72ba6b 100644 (file)
@@ -252,6 +252,14 @@ void FM7_MAINIO::set_irq_mfd_2HD(bool flag)
        } else {
                irqreg_fdc_2HD &= 0xbf; //0b10111111;
        }
+#if defined(_FM8) || defined(_FM77_VARIANTS)
+       if(intmode_fdc) { // Temporally implement.
+               double t;
+               if(event_2hd_nmi >= 0) cancel_event(this, event_2hd_nmi);
+               t = (double)nmi_delay;
+               register_event(this, EVENT_FD_NMI_2HD, t, false, &event_2hd_nmi);
+       }
+#endif
 # if defined(_FM77_VARIANTS) // With FM8, $FD1F is alive and not do_irq(), Thanks to Anna_Wu.
        bool backup = irqstat_fdc_2HD;
        flag = flag & intmode_fdc;
@@ -272,6 +280,9 @@ void FM7_MAINIO::set_drq_mfd_2HD(bool flag)
        } else {
                irqreg_fdc_2HD &= 0x7f; //0b01111111;
        }
+#if defined(_FM8) || defined(_FM77_VARIANTS)
+       if(intmode_fdc) do_firq();
+#endif
 # if defined(HAS_DMA)
        if((dmac->read_signal(HD6844_IS_TRANSFER_0) != 0) && (flag)) {
                dmac->write_signal(HD6844_DO_TRANSFER, 0x0, 0xffffffff);
index 63c539d..8a3b2c0 100644 (file)
@@ -106,6 +106,8 @@ enum {
        EVENT_FM7MAINIO_SUBBUSY_SET,
        EVENT_FM7MAINIO_SUBBUSY_RESET,
        EVENT_MOUSE_TIMEOUT,
+       EVENT_FD_NMI_2HD,
+       
        EVENT_FM7SUB_DISPLAY_NMI = 32,
        EVENT_FM7SUB_DISPLAY_NMI_OFF,
        EVENT_FM7SUB_HDISP,
index 4d1b312..3be3d51 100644 (file)
@@ -51,9 +51,13 @@ FM7_MAINIO::FM7_MAINIO(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, paren
        pcm1bit = NULL;
        joystick = NULL;
        fdc = NULL;
- #if defined(HAS_2HD)
+if defined(HAS_2HD)
        fdc_2HD = NULL;
- #endif
+#  if defined(_FM8) || defined(_FM77_VARIANTS)
+       event_2hd_nmi = -1;
+       nmi_delay = 300;
+#  endif
+# endif
        printer = NULL;
        
        kanjiclass1 = NULL;
@@ -210,6 +214,10 @@ void FM7_MAINIO::initialize()
 #else
        bootmode = config.boot_mode & 3;
 #endif
+#if defined(_FM8) || defined(_FM77_VARIANTS)
+       event_2hd_nmi = -1;
+       nmi_delay = 300;
+#endif
        reset_printer();
 }
 
@@ -224,6 +232,11 @@ void FM7_MAINIO::reset()
        beep_flag = false;
        register_event(this, EVENT_BEEP_CYCLE, (1000.0 * 1000.0) / (1200.0 * 2.0), true, &event_beep);
        // Sound
+#if defined(_FM8) || defined(_FM77_VARIANTS)
+       intmode_fdc = false;
+       if(event_2hd_nmi >= 0) cancel_event(this, event_2hd_nmi);
+       event_2hd_nmi = -1;
+#endif
 #if defined(_FM77AV_VARIANTS)
        hotreset = false;
 #endif
@@ -308,7 +321,8 @@ void FM7_MAINIO::reset()
 #elif defined(_FM77_VARIANTS)
        stat_fdmode_2hd = false; //  R/W : bit6, '0' = 2HD, '1' = 2DD. FM-77 Only.
        stat_kanjirom = true;    //  R/W : bit5, '0' = sub, '1' = main. FM-77 Only.
-#endif 
+#endif
+       intmode_fdc = false;
        write_signals(&firq_bus, 0);
        
 #if defined(HAS_DMA)
@@ -619,6 +633,15 @@ void FM7_MAINIO::do_firq(void)
        bool firq_stat;
        uint32_t nval;
        firq_stat = firq_break_key | firq_sub_attention;
+#if defined(HAS_2HD)
+# if defined(_FM8) || defined(_FM77_VARIANTS)
+       if(intmode_fdc) {
+               if((connect_fdc_2HD) && (fdc_2HD != NULL) && ((irqreg_fdc_2HD & 0x80) != 0)) {
+                       firq_stat = true;
+               }
+       }
+# endif
+#endif
        nval = (firq_stat) ? 0xffffffff : 0;
        write_signals(&firq_bus, nval);
 }
@@ -662,6 +685,12 @@ uint8_t FM7_MAINIO::get_fd04(void)
 # else
        val |= 0x18; // For NON-77L4, these bit must be '1'.Thanks to Ryu Takegami.
 # endif
+#elif defined(_FM8)
+       val |= 0x78;
+       // ToDo: MEMORY PARITY ERRO STATUS (if error, bit3 = '1').
+#elif defined(_FM77AV_VARIANTS)
+       val |= 0x6c;
+       val |= 0x10; // ToDo: Hack for OS-9 for 77AV.Really need?
 #else
        val |= 0x7c;
 #endif 
@@ -690,6 +719,7 @@ void FM7_MAINIO::set_fd04(uint8_t val)
        display->write_signal(SIG_DISPLAY_EXTRA_MODE, val, 0xff);
        stat_fdmode_2hd  = ((val & 0x40) == 0);
        stat_kanjirom    = ((val & 0x20) != 0);
+       intmode_fdc      = ((val & 0x04) == 0);
 # if defined(_FM77L4)
        display->write_signal(SIG_DISPLAY_EXTRA_MODE, val & 0x18, 0x18);
 # endif
@@ -1865,6 +1895,10 @@ void FM7_MAINIO::event_callback(int event_id, int err)
                set_fdc_motor_2HD(false);
                event_fdc_motor_2HD = -1;
                break;
+       case EVENT_FD_NMI_2HD:
+               do_nmi(true);
+               event_2hd_nmi = -1;
+               break;
 #endif
        case EVENT_PRINTER_RESET_COMPLETED:                     
                this->write_signals(&printer_reset_bus, 0x00);
@@ -1892,7 +1926,7 @@ void FM7_MAINIO::event_vline(int v, int clock)
 {
 }
 
-#define STATE_VERSION 11
+#define STATE_VERSION 12
 void FM7_MAINIO::save_state_main(FILEIO *state_fio)
 {
        uint32_t addr;
@@ -2069,6 +2103,10 @@ void FM7_MAINIO::save_state(FILEIO *state_fio)
                state_fio->FputUint32_BE(opn_cmdreg[ch]);
                state_fio->FputUint32_BE(opn_ch3mode[ch]);
        }
+#if defined(_FM8) || defined(_FM77_VARIANTS)
+       state_fio->FputInt32_BE(event_2hd_nmi);
+       state_fio->FputUint32_BE(nmi_delay);
+#endif
 }
 
 bool FM7_MAINIO::load_state_main(FILEIO *state_fio, uint32_t version)
@@ -2249,6 +2287,10 @@ bool FM7_MAINIO::load_state(FILEIO *state_fio)
                opn_cmdreg[ch] = state_fio->FgetUint32_BE();
                opn_ch3mode[ch] = state_fio->FgetUint32_BE();
        }
+#if defined(_FM8) || defined(_FM77_VARIANTS)
+       event_2hd_nmi = state_fio->FgetInt32_BE();
+       nmi_delay = state_fio->FgetUint32_BE();
+#endif
        if(version != STATE_VERSION) return false;
        return true;
 }
index 2620f13..4ec2a52 100644 (file)
@@ -41,6 +41,9 @@ class FM7_MAINIO : public DEVICE {
        int event_timerirq;  
        int event_fdc_motor;
        int event_fdc_motor_2HD;
+#if defined(_FM77_VARIANTS)    || defined(_FM8)
+       int event_2hd_nmi;
+#endif 
        outputs_t clock_status;
        outputs_t printer_reset_bus;
        outputs_t printer_strobe_bus;
@@ -109,6 +112,9 @@ class FM7_MAINIO : public DEVICE {
        bool stat_400linecard;//  R/W : bit4, '0' = connected. FM-77 Only.
        //bool stat_400linemode; // R/W : bit3, '0' = 400line, '1' = 200line.
 #endif
+#if defined(_FM77_VARIANTS)    || defined(_FM8)
+       uint32_t nmi_delay;
+#endif 
 #if defined(HAS_2HD)
        bool stat_fdmode_2hd; //  R/W : bit6, '0' = 2HD, '1' = 2DD. FM-77 Only.
 #endif 
index 68a1de6..d186b5c 100644 (file)
@@ -732,7 +732,7 @@ void MB8877::write_signal(int id, uint32_t data, uint32_t mask)
                sidereg = (data & mask) ? 1 : 0;
        } else if(id == SIG_MB8877_MOTOR) {
                motor_on = ((data & mask) != 0);
-       }
+       } 
 }
 
 uint32_t MB8877::read_signal(int ch)
index b98bfd1..cda2efc 100644 (file)
@@ -29,7 +29,7 @@ private:
        // output signals
        outputs_t outputs_irq;
        outputs_t outputs_drq;
-       
+
        // drive noise
        NOISE* d_noise_seek;
        NOISE* d_noise_head_down;