OSDN Git Service

[VM][FM7] Apply changes of MB8877:: to FM7 series.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Thu, 15 Dec 2022 14:29:01 +0000 (23:29 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Thu, 15 Dec 2022 14:29:01 +0000 (23:29 +0900)
Set "motor on" flag by fdc's rdy signal.
Before reading this flag from FDC by accessing MAINIO $FD1D.

source/src/vm/fm7/floppy.cpp
source/src/vm/fm7/floppy_2HD.cpp
source/src/vm/fm7/fm7.cpp
source/src/vm/fm7/fm7.h
source/src/vm/fm7/fm7_common.h
source/src/vm/fm7/fm7_mainio.cpp

index 8575cae..f9dfb6b 100644 (file)
@@ -43,8 +43,6 @@ void FM7_MAINIO::reset_fdc(void)
                fdc_drvsel = 0x7c | fdc->read_signal(SIG_MB8877_DRIVEREG);
                irqreg_fdc = 0x00; //0b00000000;
        }
-       //fdc_motor = (fdc->read_signal(SIG_MB8877_MOTOR) != 0);
-       fdc_motor = false;
        
 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
        defined(_FM77AV20) || defined(_FM77AV20EX)
@@ -67,7 +65,7 @@ void FM7_MAINIO::reset_fdc(void)
        irqstat_fdc = false;
        irqmask_mfd = true;
        if(connect_fdc) {
-               set_fdc_motor(fdc_motor);
+               set_fdc_motor(false);
        }
 }
        
@@ -121,7 +119,7 @@ void FM7_MAINIO::set_fdc_track(uint8_t val)
        } else {
                d = fdc_drvsel & 0x03;
        }
-#if 1
+
        DISK *disk = fdc->get_disk_handler(d);
        if(disk->media_type != MEDIA_TYPE_2D){
                if(config.special_debug_fdc)  out_debug_log(_T("NOTE: MEDIA TYPE IS 2DD"));
@@ -130,7 +128,7 @@ void FM7_MAINIO::set_fdc_track(uint8_t val)
                if(config.special_debug_fdc)  out_debug_log(_T("NOTE: MEDIA TYPE IS 2D"));
                //if(disk->drive_type != DRIVE_TYPE_2D) val >>= 1;
        }
-#endif
+
 #endif 
        fdc->write_io8(1, val);
 //#ifdef _FM7_FDC_DEBUG        
@@ -184,7 +182,6 @@ uint8_t FM7_MAINIO::get_fdc_motor(void)
        bool bv;
        
        if(!connect_fdc) return 0xff;
-       fdc_motor = (fdc->read_signal(SIG_MB8877_MOTOR) != 0) ? true : false;
        //fdc_drvsel = fdc->read_signal(SIG_MB8877_READ_DRIVE_REG);
        drv = fdc_drvsel & 0x03;
        val = val | (fdc_drvsel & 0x03);
@@ -194,8 +191,8 @@ uint8_t FM7_MAINIO::get_fdc_motor(void)
        if((fdc_drvsel & 0x40) != 0) {
                drv = fdc_drive_table[drv & 0x03];
        }
-#endif 
-       fdc_motor = fdc_motor & (fdc->get_drive_type(drv) != DRIVE_TYPE_UNK);
+#endif
+       // Note: OK? 2022-12-15 K.O
        if(fdc_motor) val |= 0x80;
 //#ifdef _FM7_FDC_DEBUG        
        if(config.special_debug_fdc)  out_debug_log(_T("FDC: Get motor/Drive: $%02x"), val);
@@ -222,29 +219,25 @@ uint8_t FM7_MAINIO::get_fdc_fd1c(void)
 
 void FM7_MAINIO::set_fdc_fd1d(uint8_t val)
 {
-       bool backup_motor = fdc_motor;
        bool f;
+       uint8_t drv = val & 0x03;
        if(!connect_fdc) return;
        if((val & 0x80) != 0) {
                f = true;
        } else {
                f = false;
        }
-
+       fdc_drvsel = val;
 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
        defined(_FM77AV20) || defined(_FM77AV20EX)
        if((val & 0x40) == 0) {
-               fdc->write_signal(SIG_MB8877_DRIVEREG, fdc_drive_table[val & 0x03], 0x03);
-       } else {
-               fdc->write_signal(SIG_MB8877_DRIVEREG, val, 0x03);
+               drv = fdc_drive_table[drv];
        }
-       fdc_drvsel = val;
-#else
-       fdc->write_signal(SIG_MB8877_DRIVEREG, val, 0x03);
-       fdc_drvsel = val;
-#endif 
-
-       if(f != backup_motor) {
+#endif
+       bool mdrv_flag = fdc->is_drive_ready(drv);
+       fdc->write_signal(SIG_MB8877_DRIVEREG, drv, 0x03);
+       
+       if(f != mdrv_flag) {
                if(event_fdc_motor >= 0) cancel_event(this, event_fdc_motor);
                if(f) {
                        register_event(this, EVENT_FD_MOTOR_ON, 1000.0 * 300.0, false, &event_fdc_motor); // Motor ON After 0.3Sec.
@@ -343,16 +336,9 @@ void FM7_MAINIO::set_fdc_motor(bool flag)
 {
        if(!connect_fdc) return;
        uint8_t val;
-       fdc->write_signal(SIG_MB8877_MOTOR, flag ? 0x01 : 0x00, 0x01);
-       val = fdc_drvsel & 0x03;
-#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
-       defined(_FM77AV20) || defined(_FM77AV20EX)
-       if((fdc_drvsel & 0x40) == 0) {
-               val = fdc_drive_table[val & 0x03];
-       }
-#endif
-       fdc_motor = (fdc->read_signal(SIG_MB8877_MOTOR) != 0);
-       fdc_motor = fdc_motor & (fdc->get_drive_type(val) != DRIVE_TYPE_UNK);
+       // OK? 2022-12-15 K.O
+       fdc->write_signal(SIG_MB8877_MOTOR, flag ? 0xffffffff : 0x00, 0xffffffff);
+
        if(config.special_debug_fdc) out_debug_log(_T("FDC: MOTOR=%d VAL=$%02x"), flag, val);
 }
 
index 9226d39..0f95ff8 100644 (file)
@@ -46,14 +46,14 @@ void FM7_MAINIO::reset_fdc_2HD(void)
        fdc_2HD_drvsel = 0x7c | (fdc_2HD->read_signal(SIG_MB8877_DRIVEREG) & 0x03);
        irqreg_fdc_2HD = 0x00; //0b00000000;
        //fdc_2HD_motor = (fdc_2HD->read_signal(SIG_MB8877_MOTOR) != 0);
-       fdc_2HD_motor = false;
+       //fdc_2HD_motor = false;
                
        if(event_fdc_motor_2HD >= 0) cancel_event(this, event_fdc_motor_2HD);
        event_fdc_motor_2HD = -1;
        //irqstat_2HD_fdc = false;
        //irqmask_2HD_mfd = true;
        if(connect_fdc_2HD) {
-               set_fdc_motor_2HD(fdc_2HD_motor);
+               set_fdc_motor_2HD(false);
        }
 #endif
 }
@@ -171,8 +171,7 @@ uint8_t FM7_MAINIO::get_fdc_motor_2HD(void)
 #if defined(HAS_2HD)
        uint8_t val = 0x7c; //0b01111100;
        if(!(connect_fdc_2HD) || (fdc_2HD == NULL)) return 0xff;
-       fdc_2HD_motor = (fdc_2HD->read_signal(SIG_MB8877_MOTOR) != 0) ? true : false;
-       fdc_2HD_motor = fdc_2HD_motor & (fdc_2HD->get_drive_type(fdc_2HD_drvsel & 3) != DRIVE_TYPE_UNK);
+       // 20221215 K.O OK?
        if(fdc_2HD_motor) val |= 0x80;
        val = val | (fdc_2HD_drvsel & 0x03);
        // OK?
@@ -211,7 +210,6 @@ uint8_t FM7_MAINIO::get_fdc_fd1c_2HD(void)
 void FM7_MAINIO::set_fdc_fd1d_2HD(uint8_t val)
 {
 #if defined(HAS_2HD)
-       bool backup_motor = fdc_2HD_motor;
        bool f;
        if(!(connect_fdc_2HD) || (fdc_2HD == NULL)) return;
        if((val & 0x80) != 0) {
@@ -219,11 +217,12 @@ void FM7_MAINIO::set_fdc_fd1d_2HD(uint8_t val)
        } else {
                f = false;
        }
-
-       fdc_2HD->write_signal(SIG_MB8877_DRIVEREG, val, 0x03);
+       drv = val & 0x03;
+       bool mdrv_flag = fdc_2HD->is_drive_ready(drv);
+       fdc_2HD->write_signal(SIG_MB8877_DRIVEREG, drv, 0x03);
        fdc_2HD_drvsel = val;
 
-       if(f != backup_motor) {
+       if(f != mdrv_flag) {
                if(event_fdc_motor_2HD >= 0) cancel_event(this, event_fdc_motor_2HD);
                // OK?
                if(f) {
@@ -319,9 +318,8 @@ void FM7_MAINIO::set_fdc_motor_2HD(bool flag)
 {
 #if defined(HAS_2HD)
        if(!(connect_fdc_2HD) || (fdc_2HD == NULL)) return;
-       fdc_2HD->write_signal(SIG_MB8877_MOTOR, flag ? 0x01 : 0x00, 0x01);
-       fdc_2HD_motor = (fdc_2HD->read_signal(SIG_MB8877_MOTOR) != 0);
-       fdc_2HD_motor = fdc_2HD_motor & (fdc_2HD->get_drive_type(fdc_2HD_drvsel & 3) != DRIVE_TYPE_UNK);
+       // OK? 20221215 K.O
+       fdc_2HD->write_signal(SIG_MB8877_MOTOR, flag ? 0xffffffff : 0x00, 0xffffffff);
 #endif
 }
 
index 32c6905..6cd5a80 100644 (file)
@@ -270,7 +270,6 @@ VM::VM(EMU_TEMPLATE* parent_emu): VM_TEMPLATE(parent_emu)
        mainmem = new FM7_MAINMEM(this, emu);
        display = new DISPLAY(this, emu);
 
-
 # if defined(_FM77AV20) || defined(_FM77AV40) || defined(_FM77AV20EX) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
        g_rs232c_dtr = new AND(this, emu);
        g_rs232c_dtr->set_mask(SIG_AND_BIT_0);
@@ -611,6 +610,7 @@ void VM::connect_bus(void)
                        //FDC
                        fdc->set_context_irq(mainio, FM7_MAINIO_FDC_IRQ, 0x1);
                        fdc->set_context_drq(mainio, FM7_MAINIO_FDC_DRQ, 0x1);
+                       fdc->set_context_rdy(mainio, SIG_FM7_MAINIO_FDC_MOTOR, 0xffffffff); // OK?
                        mainio->set_context_fdc(fdc);
                }
 #if defined(_FM8) || (_FM7) || (_FMNEW7)
@@ -621,6 +621,7 @@ void VM::connect_bus(void)
                //FDC
                fdc_2HD->set_context_irq(mainio, FM7_MAINIO_FDC_IRQ_2HD, 0x1);
                fdc_2HD->set_context_drq(mainio, FM7_MAINIO_FDC_DRQ_2HD, 0x1);
+               fdc_2HD->set_context_rdy(mainio, SIG_FM7_MAINIO_FDC_MOTOR_2HD, 0xffffffff); 
                mainio->set_context_fdc_2HD(fdc_2HD);
        }
 #endif 
index 5dc7533..6043cd4 100644 (file)
@@ -25,7 +25,7 @@
 #define USE_PRINTER_TYPE 4
 #define USE_AY_3_8910_AS_PSG
 
-#define INDEPENDENT_CAPS_KANA_LED
+//#define INDEPENDENT_CAPS_KANA_LED
 #define USE_KEY_LOCKED
 #define USE_AUTO_KEY           5
 #define USE_AUTO_KEY_RELEASE   6
@@ -386,6 +386,13 @@ static const _TCHAR *joy_button_captions[] = {
        _T("Button #2(2nd)"),
 };
 #endif
+#ifdef USE_LED_DEVICE
+static const _TCHAR *led_device_caption[] = {
+       _T("INS:"),
+       _T("KANA:"),
+       _T("CAP:"),
+};
+#endif
 
 /*
  * NOTE:
index ab63d46..afde0cf 100644 (file)
@@ -255,6 +255,8 @@ enum {
        FM7_MAINIO_FDC_DRQ_2HD,
        FM7_MAINIO_FDC_IRQ_2HD,
        
+       SIG_FM7_MAINIO_FDC_MOTOR,
+       SIG_FM7_MAINIO_FDC_MOTOR_2HD,
 };
 // SUB
 enum {
index 5c6bc9d..123a3b8 100644 (file)
@@ -103,6 +103,7 @@ FM7_MAINIO::FM7_MAINIO(VM_TEMPLATE* parent_vm, EMU_TEMPLATE* parent_emu) : DEVIC
 #if defined(HAS_2HD)   
        drqstat_fdc_2hd = false;
        irqstat_fdc_2hd = false;
+       
 #endif
        // FD05
        extdet_neg = false;
@@ -174,10 +175,13 @@ void FM7_MAINIO::initialize()
        event_beep_oneshot = -1;
        event_timerirq = -1;
        event_fdc_motor = -1;
+       fdc_motor = false;
        lpt_type = config.printer_type;
        fdc_cmdreg = 0x00;
 #if defined(HAS_2HD)
        event_fdc_motor_2HD = -1;
+       fdc_2HD_motor = false;
+       
 #endif
 #if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
        boot_ram = false;
@@ -326,7 +330,9 @@ void FM7_MAINIO::reset()
        // FD17
        intstat_opn = false;
        intstat_mouse = false;
-
+#if defined(HAS_2HD)
+       reset_fdc_2HD();
+#endif
        do_irq();
 
 //#if !defined(_FM8)
@@ -1079,6 +1085,9 @@ void FM7_MAINIO::write_signal(int id, uint32_t data, uint32_t mask)
        case FM7_MAINIO_FDC_IRQ:
                set_irq_mfd(val_b);
                break;
+       case SIG_FM7_MAINIO_FDC_MOTOR:
+               fdc_motor = ((data & mask) != 0) ? true : false;
+               break;
 #if defined(HAS_2HD)
        case FM7_MAINIO_FDC_DRQ_2HD:
                set_drq_mfd_2HD(val_b);
@@ -1086,6 +1095,9 @@ void FM7_MAINIO::write_signal(int id, uint32_t data, uint32_t mask)
        case FM7_MAINIO_FDC_IRQ_2HD:
                set_irq_mfd_2HD(val_b);
                break;
+       case SIG_FM7_MAINIO_FDC_MOTOR_2HD:
+               fdc_2HD_motor = ((data & mask) != 0) ? true : false;
+               break;
 #endif
 #if defined(HAS_DMA)
        case FM7_MAINIO_DMA_INT: