OSDN Git Service

[VM][FM7] Add Japanese communication board (日本語通信カード) .
[csp-qt/common_source_project-fm7.git] / source / src / vm / fm7 / fm7_mainio.cpp
index 08f474e..9d48ffc 100644 (file)
@@ -54,6 +54,9 @@ FM7_MAINIO::FM7_MAINIO(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, paren
 #ifdef WITH_Z80
        z80 = NULL;
 #endif 
+#if defined(CAPABLE_JCOMMCARD)
+       jcommcard = NULL;
+#endif
 #if defined(_FM8)
        bubble_casette[0] = NULL;
        bubble_casette[1] = NULL;
@@ -167,6 +170,9 @@ FM7_MAINIO::FM7_MAINIO(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, paren
        initialize_output_signals(&printer_reset_bus);
        initialize_output_signals(&printer_strobe_bus);
        initialize_output_signals(&printer_select_bus);
+       initialize_output_signals(&irq_bus);
+       initialize_output_signals(&firq_bus);
+       initialize_output_signals(&nmi_bus);
        set_device_name(_T("MAIN I/O"));
 }
 
@@ -288,7 +294,8 @@ void FM7_MAINIO::reset()
        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 
-       maincpu->write_signal(SIG_CPU_FIRQ, 0, 1);
+       write_signals(&firq_bus, 0);
+       
 #if defined(HAS_DMA)
        intstat_dma = false;
        dma_addr = 0;
@@ -297,14 +304,10 @@ void FM7_MAINIO::reset()
        reg_fd12 = 0xbc; // 0b10111100
 #endif
 #if defined(WITH_Z80)
-       z80->write_signal(SIG_CPU_BUSREQ, 0xffffffff, 0xffffffff);
+       if(z80 != NULL) z80->write_signal(SIG_CPU_BUSREQ, 0xffffffff, 0xffffffff);
 #endif
        maincpu->write_signal(SIG_CPU_BUSREQ, 0, 0xffffffff);
        maincpu->write_signal(SIG_CPU_HALTREQ, 0, 0xffffffff);
-//#if defined(_FM8)
-//     bubble_casette[0]->reset();
-//     bubble_casette[1]->reset();
-//#endif       
 
 
 #if !defined(_FM8)
@@ -595,6 +598,7 @@ void FM7_MAINIO::set_irq_keyboard(bool flag)
 void FM7_MAINIO::do_irq(void)
 {
        bool intstat;
+       uint32_t nval;
 #if defined(_FM8)
        intstat = intstat_txrdy | intstat_rxrdy | intstat_syndet;
 #else  
@@ -606,30 +610,23 @@ void FM7_MAINIO::do_irq(void)
 # if defined(HAS_DMA)
        intstat = intstat | intstat_dma;
 # endif
-#endif 
-       //printf("%08d : IRQ: REG0=%02x FDC=%02x, stat=%d\n", SDL_GetTicks(), irqstat_reg0, irqstat_fdc, intstat);
-       if(intstat) {
-               maincpu->write_signal(SIG_CPU_IRQ, 1, 1);
-       } else {
-               maincpu->write_signal(SIG_CPU_IRQ, 0, 1);
-       }
+#endif
+       nval = (intstat) ? 0xffffffff : 0;
+       write_signals(&irq_bus, nval);
 }
 
 void FM7_MAINIO::do_firq(void)
 {
        bool firq_stat;
+       uint32_t nval;
        firq_stat = firq_break_key | firq_sub_attention;
-       if(firq_stat) {
-               maincpu->write_signal(SIG_CPU_FIRQ, 1, 1);
-       } else {
-               maincpu->write_signal(SIG_CPU_FIRQ, 0, 1);
-       }
-       //this->out_debug_log(_T("IO: do_firq(). BREAK=%d ATTN=%d"), firq_break_key ? 1 : 0, firq_sub_attention ? 1 : 0);
+       nval = (firq_stat) ? 0xffffffff : 0;
+       write_signals(&firq_bus, nval);
 }
 
 void FM7_MAINIO::do_nmi(bool flag)
 {
-       maincpu->write_signal(SIG_CPU_NMI, flag ? 1 : 0, 1);
+       write_signals(&nmi_bus, (flag) ? 0xffffffff : 0);
 }
 
 
@@ -723,7 +720,7 @@ void FM7_MAINIO::set_fd04(uint8_t val)
                req_z80run = true;
        } else {
                req_z80run = false;
-               z80->write_signal(SIG_CPU_BUSREQ, 1, 1);
+               if(z80 != NULL) z80->write_signal(SIG_CPU_BUSREQ, 1, 1);
        }
 #endif
 }
@@ -955,7 +952,7 @@ void FM7_MAINIO::write_signal(int id, uint32_t data, uint32_t mask)
 #if defined(WITH_Z80)
                case FM7_MAINIO_RUN_Z80:
                        if((req_z80run)/*  && (val_b) */) {
-                               z80->write_signal(SIG_CPU_BUSREQ, 0, 1);
+                               if(z80 != NULL) z80->write_signal(SIG_CPU_BUSREQ, 0, 1);
                                z80_run = true;
                                //z80->reset(); // OK?
                        }
@@ -1232,6 +1229,18 @@ uint32_t FM7_MAINIO::read_data8(uint32_t addr)
                case 0x23: // Kanji ROM
                        retval = (uint32_t) read_kanjidata_right();
                        break;
+#if defined(CAPABLE_JCOMMCARD)
+               case 0x28:
+               case 0x29:
+               case 0x2a:
+               case 0x2b:
+                       if(jcommcard != NULL) {
+                               retval = (uint32_t)(jcommcard->read_io8(addr));
+                       } else {
+                               retval = 0xff;
+                       }
+                       break;
+#endif                 
 #if defined(CAPABLE_KANJI_CLASS2)
                case 0x2e: // Kanji ROM Level2
                        retval = (uint32_t) read_kanjidata_left_l2();
@@ -1483,6 +1492,14 @@ void FM7_MAINIO::write_data8(uint32_t addr, uint32_t data)
                        //write_kanjiaddr_lo((uint8_t)data);
 #endif
                        break;
+#if defined(CAPABLE_JCOMMCARD)
+               case 0x28:
+               case 0x29:
+               case 0x2a:
+               case 0x2b:
+                       if(jcommcard != NULL) jcommcard->write_io8(addr, data);
+                       break;
+#endif                 
 #if defined(CAPABLE_DICTROM)
                case 0x2e: // 
                        mainmem->write_signal(FM7_MAINIO_EXTBANK, data, 0xff);
@@ -1648,7 +1665,7 @@ void FM7_MAINIO::update_config()
        }
        mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, (config.boot_mode == 0) ? 1 : 0, 0x01);
        mainmem->write_signal(FM7_MAINIO_BOOTMODE, bootmode, 0xffffffff);
-#endif 
+#endif
 }
 
 void FM7_MAINIO::event_vline(int v, int clock)