OSDN Git Service

[VM][FM7][SUB] (MAYBE) Fixed bugs around sub attention firq.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Sun, 12 Apr 2015 17:11:30 +0000 (02:11 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Sun, 12 Apr 2015 17:11:30 +0000 (02:11 +0900)
source/src/vm/fm7/display.cpp
source/src/vm/fm7/floppy.cpp
source/src/vm/fm7/fm7.h
source/src/vm/fm7/fm7_mainio.cpp
source/src/vm/fm7/fm7_mainio.h
source/src/vm/fm7/fm7_mainmem.cpp

index 6ea6961..9787353 100644 (file)
@@ -119,6 +119,7 @@ void DISPLAY::reset()
        register_event(this, EVENT_FM7SUB_VSTART, 1.0 * 1000.0, false, &vstart_event_id);   
        register_event(this, EVENT_FM7SUB_DISPLAY_NMI, 20000.0, true, &nmi_event_id); // NEXT CYCLE_
        sub_busy = true;
+       mainio->write_signal(FM7_MAINIO_SUB_BUSY, 0x01, 0x01);
 //     subcpu->reset();
 }
 
@@ -479,21 +480,16 @@ uint8 DISPLAY::get_dpalette(uint32 addr)
 
 void DISPLAY::halt_subcpu(void)
 {
-       bool flag = !(sub_run);
-       if(flag) {
-               sub_busy = true;
-               mainio->write_signal(FM7_MAINIO_SUB_BUSY, 0x01, 0x01);
-               subcpu->write_signal(SIG_CPU_BUSREQ, 0x01, 0x01);
-       }
+       //sub_busy = true;
+       //mainio->write_signal(FM7_MAINIO_SUB_BUSY, 0x01, 0x01);
+       subcpu->write_signal(SIG_CPU_BUSREQ, 0x01, 0x01);
 }
 
 void DISPLAY::go_subcpu(void)
 {
-       bool flag = sub_run;
-       if(flag) {
-               subcpu->write_signal(SIG_CPU_BUSREQ, 0x00, 0x01);
-       }
-   
+       //sub_busy = true;
+       //mainio->write_signal(FM7_MAINIO_SUB_BUSY, 0x01, 0x01);
+       subcpu->write_signal(SIG_CPU_BUSREQ, 0x00, 0x01);
 }
 
 void DISPLAY::enter_display(void)
@@ -551,9 +547,8 @@ void DISPLAY::reset_crtflag(void)
 //SUB:D402:R
 uint8 DISPLAY::acknowledge_irq(void)
 {
-  //if(cancel_request) this->do_irq(false);
+       if(cancel_request) this->do_irq(false);
        cancel_request = false;
-       do_irq(false);
        return 0xff;
 }
 
@@ -1054,7 +1049,7 @@ uint32 DISPLAY::read_signal(int id)
        switch(id) {
                case SIG_FM7_SUB_HALT:
                case SIG_DISPLAY_HALT:
-                       return (halt_flag) ? 0 : 0xffffffff;
+                       return (halt_flag) ? 0xffffffff : 0;
                        break;
                case SIG_DISPLAY_BUSY:
                        return (sub_busy) ? 0x80 : 0;
@@ -1108,18 +1103,17 @@ void DISPLAY::write_signal(int id, uint32 data, uint32 mask)
        int y;
        switch(id) {
                case SIG_FM7_SUB_HALT:
-                       if(cancel_request && flag) {
-                               sub_run = true;
-                               restart_subsystem();
-                               //subcpu->write_signal(SIG_CPU_BUSREQ, 0, 1);
-                               //printf("SUB: HALT : CANCEL\n");
-                               sub_busy = true;
-                               return;
-                       }
-                       halt_flag = flag;
                        if(flag) {
                                sub_busy = true;
+                               mainio->write_signal(FM7_MAINIO_SUB_BUSY, 0x01, 0x01);
                        }
+                       //if(cancel_request && flag && (flag != halt_flag)) {
+                       //      restart_subsystem();
+                               //halt_flag = false;
+                               //printf("SUB: HALT : CANCEL\n");
+                       //      return;
+                       //}
+                       halt_flag = flag;
                        //printf("SUB: HALT : DID STAT=%d\n", flag);   
                        break;
                        case SIG_DISPLAY_HALT:
@@ -1139,22 +1133,19 @@ void DISPLAY::write_signal(int id, uint32 data, uint32 mask)
                                        subcpu->reset();
 #endif
                                        subcpu_resetreq = false;
-                                       restart_subsystem();
                                } else {
-                                       restart_subsystem();
                                }
-#else
-                               restart_subsystem();
 #endif
+                               restart_subsystem();
                        }
-                       //halt_flag = flag;
                        break;
                case SIG_FM7_SUB_CANCEL:
                  //if(flag) {
-                       cancel_request = flag;
                        //printf("MAIN: CANCEL REQUEST TO SUB\n");
-                       do_irq(flag);
-                               //      }
+                       if(flag) {
+                               cancel_request = true;
+                               do_irq(true);
+                       }
                        break;
                case SIG_DISPLAY_CLOCK:
                        if(clock_fast != flag) {
@@ -1837,17 +1828,17 @@ void DISPLAY::write_data8(uint32 addr, uint32 data)
                                reset_vramaccess();
                                break;
                        case 0x0a:
-                               if(clr_count <= 0) {
+                               //if(clr_count <= 0) {
                                        set_subbusy();
-                               } else { // Read once when using clr_foo() to set busy flag.
-                                       double usec = (1000.0 * 1000.0) / 999000.0;
-                                       if(mainio->read_data8(FM7_MAINIO_CLOCKMODE) != FM7_MAINCLOCK_SLOW) usec = (1000.0 * 1000.0) / 2000000.0;
-                                       if(!is_cyclesteal) usec = usec * 3.0;
-                                       usec = (double)clr_count * usec;
-                                       register_event(this, EVENT_FM7SUB_CLR, usec, false, NULL); // NEXT CYCLE_
-                                       reset_subbusy();
-                                       clr_count = 0;
-                               }
+                               //} else { // Read once when using clr_foo() to set busy flag.
+                               //      double usec = (1000.0 * 1000.0) / 999000.0;
+                               //      if(mainio->read_data8(FM7_MAINIO_CLOCKMODE) != FM7_MAINCLOCK_SLOW) usec = (1000.0 * 1000.0) / 2000000.0;
+                               //      if(!is_cyclesteal) usec = usec * 3.0;
+                               //      usec = (double)clr_count * usec;
+                               //      register_event(this, EVENT_FM7SUB_CLR, usec, false, NULL); // NEXT CYCLE_
+                               //      reset_subbusy();
+                               //      clr_count = 0;
+                               //}
                                break;
                        case 0x0d:
                                keyboard->write_signal(SIG_FM7KEY_SET_INSLED, 0x00, 0x01);
@@ -2088,6 +2079,7 @@ void DISPLAY::initialize()
 #endif
        tmp_offset_point.d = 0;
        offset_point = 0;
+       halt_flag = false;
 }
 
 void DISPLAY::release()
index bec7bc1..e42dac8 100644 (file)
@@ -151,7 +151,7 @@ void FM7_MAINIO::set_irq_mfd(bool flag)
                irqreg_fdc &= 0xbf; //0b10111111;
                irqstat_fdc = false;
        }
-       if(backup != irqreg_fdc) do_irq(irqstat_fdc);
+       if(backup != irqreg_fdc) do_irq();
        return;
 }
 
index 4dddffd..5dead0b 100644 (file)
@@ -15,7 +15,6 @@
 #define USE_SOUND_DEVICE_TYPE 8
 #define USE_SCANLINE
 #define USE_DIPSWITCH
-#define USE_BOOT_MODE         4
 #define USE_CPU_TYPE
 #define USE_SPECIAL_RESET
 //#undef  HAS_YM2608
 #endif
 
 #if defined(_FM77_VARIANTS)
-#define USE_BOOT_MODE         3
+#define USE_BOOT_MODE         4
 #elif defined(_FM8)
+#define USE_BOOT_MODE         4
+#elif defined(_FM7) || defined(_FMNEW7)
 #define USE_BOOT_MODE         3
 #else
 #define USE_BOOT_MODE         2
index 95056b4..7ba7df1 100644 (file)
@@ -217,7 +217,7 @@ void FM7_MAINIO::set_port_fd02(uint8 val)
                display->write_signal(SIG_FM7_SUB_KEY_FIRQ, flag ? 1 : 0, 1);
                //printf("KEYBOARD: Interrupted %d\n", flag);
                irqmask_keyboard = flag;
-               do_irq(flag);
+               do_irq();
        }
    
        return;
@@ -240,11 +240,11 @@ void FM7_MAINIO::set_irq_timer(bool flag)
        if(flag && !(irqmask_timer)) {
                irqstat_reg0 &= ~0x04;
                irqstat_timer = true;      
-               if(backup != irqstat_reg0) do_irq(true);
+               if(backup != irqstat_reg0) do_irq();
        } else {
                irqstat_reg0 |= 0x04;
                irqstat_timer = false;     
-               if(backup != irqstat_reg0) do_irq(false);
+               if(backup != irqstat_reg0) do_irq();
        }
        //printf("IRQ TIMER: %02x MASK=%d\n", irqstat_reg0, irqmask_timer);
 }
@@ -255,13 +255,13 @@ void FM7_MAINIO::set_irq_printer(bool flag)
        if(flag && !(irqmask_printer)) {
                irqstat_reg0 &= ~0x02;
                irqstat_printer = true;    
-               if(backup != irqstat_reg0) do_irq(true);
+               if(backup != irqstat_reg0) do_irq();
        } else {
                irqstat_reg0 |= 0x02;
                irqstat_printer = false;           
-               if(backup != irqstat_reg0) do_irq(false);
+               if(backup != irqstat_reg0) do_irq();
        }
-//     if(!irqmask_printer || !flag) do_irq(flag);
+//     if(!irqmask_printer || !flag) do_irq();
 }
 
 void FM7_MAINIO::set_irq_keyboard(bool flag)
@@ -271,12 +271,12 @@ void FM7_MAINIO::set_irq_keyboard(bool flag)
        if(flag) {
                irqstat_reg0 &= ~0x01;
                irqstat_keyboard = true;
-               if(backup != irqstat_reg0) do_irq(true);
+               if(backup != irqstat_reg0) do_irq();
        } else {
                //irqstat_reg0 &= 0b11111110;
                irqstat_reg0 |= 0x01;
                irqstat_keyboard = false;          
-               if(backup != irqstat_reg0) do_irq(false);
+               if(backup != irqstat_reg0) do_irq();
        }
        //printf("MAIN: KEYBOARD: IRQ=%d\n", flag && !(irqmask_keyboard));
 }
@@ -292,7 +292,7 @@ void FM7_MAINIO::set_keyboard(uint32 data)
 }
 
 
-void FM7_MAINIO::do_irq(bool flag)
+void FM7_MAINIO::do_irq(void)
 {
        bool intstat;
        intstat = irqstat_timer | irqstat_keyboard | irqstat_printer;
@@ -310,12 +310,12 @@ void FM7_MAINIO::do_irq(bool flag)
        irqstat_bak = intstat;
 }
 
-void FM7_MAINIO::do_firq(bool flag)
+void FM7_MAINIO::do_firq(void)
 {
        bool firq_stat;
-       firq_stat = firq_break_key || firq_sub_attention; 
+       firq_stat = firq_break_key | firq_sub_attention; 
        //printf("%08d : FIRQ: break=%d attn=%d stat = %d\n", SDL_GetTicks(), firq_break_key, firq_sub_attention, firq_stat);
-       //if(firqstat_bak == firq_stat) return;
+       if(firqstat_bak == firq_stat) return;
        if(firq_stat) {
                maincpu->write_signal(SIG_CPU_FIRQ, 1, 1);
        } else {
@@ -347,21 +347,20 @@ void FM7_MAINIO::do_nmi(bool flag)
 void FM7_MAINIO::set_break_key(bool pressed)
 {
        firq_break_key = pressed;
-       do_firq(pressed);
+       do_firq();
 }
 
 void FM7_MAINIO::set_sub_attention(bool flag)
 {
        firq_sub_attention = flag;
-       do_firq(flag); 
+       do_firq(); 
 }
   
 
 uint8 FM7_MAINIO::get_fd04(void)
 {
-       //uint8 val = display->read_signal(SIG_DISPLAY_BUSY) | ~0x83;
-       uint8 val = ~0x83;
-       if(sub_busy) val |= 0x80;
+       uint8 val = 0x7c;
+       if(display->read_signal(SIG_DISPLAY_BUSY) != 0) val |= 0x80;
        if(!firq_break_key)     val |= 0x02;
        if(!firq_sub_attention) {
                val |= 0x01;
@@ -381,9 +380,8 @@ void FM7_MAINIO::set_fd04(uint8 val)
   // FD05
  uint8 FM7_MAINIO::get_fd05(void)
 {
-  //   uint8 val = (display->read_signal(SIG_DISPLAY_BUSY) == 0) ? 0x00 : 0x80;
        uint8 val;
-       val = (sub_busy) ? 0x80 : 0x00;
+       val = (display->read_signal(SIG_DISPLAY_BUSY) != 0) ? 0xfe : 0x7e;
        if(!extdet_neg) val |= 0x01;
        return val;
 }
@@ -570,7 +568,7 @@ void FM7_MAINIO::write_signal(int id, uint32 data, uint32 mask)
                        set_break_key(val_b);
                        break;
                case FM7_MAINIO_SUB_ATTENTION:
-                       set_sub_attention(val_b);
+                       if(val_b) set_sub_attention(true);
                        break;
                        // FD05
                case FM7_MAINIO_SUB_BUSY:
@@ -593,17 +591,17 @@ void FM7_MAINIO::write_signal(int id, uint32 data, uint32 mask)
                case FM7_MAINIO_OPN_IRQ:
                        if(!connect_opn) break;
                        intstat_opn = val_b;
-                       do_irq(val_b);
+                       do_irq();
                                break;
                case FM7_MAINIO_WHG_IRQ:
                        if(!connect_whg) break;
                        intstat_whg = val_b;
-                       do_irq(val_b);
+                       do_irq();
                                break;
                case FM7_MAINIO_THG_IRQ:
                        if(!connect_thg) break;
                        intstat_thg = val_b;
-                       do_irq(val_b);
+                       do_irq();
                                break;
                case FM7_MAINIO_FDC_DRQ:
                        set_drq_mfd(val_b);
index 5e41563..85ce1ff 100644 (file)
@@ -223,7 +223,7 @@ class FM7_MAINIO : public DEVICE {
        void reset_fdc(void);
        void set_fdc_motor(bool flag);
        
-       void do_irq(bool flag);
+       void do_irq(void);
        void set_irq_timer(bool flag);
        void set_irq_printer(bool flag);
        void set_irq_keyboard(bool flag);
@@ -233,7 +233,7 @@ class FM7_MAINIO : public DEVICE {
        void set_keyboard(uint32 data);  
 
        // FD04
-       void do_firq(bool flag);
+       void do_firq(void);
        void do_nmi(bool flag);
          
        void set_break_key(bool pressed);
index 9693a08..b1f921a 100644 (file)
@@ -363,7 +363,8 @@ uint32 FM7_MAINMEM::read_data8(uint32 addr)
        }
 #if defined(_FM77AV_VARIANTS)
        else if(bank == FM7_MAINMEM_AV_DIRECTACCESS) {
-         if(display->read_signal(SIG_DISPLAY_HALT) != 0) return 0xff; // Not halt
+               if(!sub_halted) return 0xff; // Not halt
+         //if(display->read_signal(SIG_DISPLAY_HALT) != 0) return 0xff; // Not halt
                //printf("READ MMR : %04x to %05x\n", addr, realaddr);
                return display->read_data8(realaddr); // Okay?
        }
@@ -399,7 +400,8 @@ void FM7_MAINMEM::write_data8(uint32 addr, uint32 data)
        }
 #if defined(_FM77AV_VARIANTS)
        else if(bank == FM7_MAINMEM_AV_DIRECTACCESS) {
-                       if(display->read_signal(SIG_DISPLAY_HALT) != 0) return; // Not halt
+                       if(!sub_halted) return; // Not halt
+                       //if(display->read_signal(SIG_DISPLAY_HALT) != 0) return; // Not halt
                //printf("WRITE MMR : %04x to %05x\n", addr, realaddr);
                display->write_data8(realaddr, data); // Okay?
                return;