diff options
Diffstat (limited to 'src/mame/drivers/abc1600.cpp')
-rw-r--r-- | src/mame/drivers/abc1600.cpp | 171 |
1 files changed, 99 insertions, 72 deletions
diff --git a/src/mame/drivers/abc1600.cpp b/src/mame/drivers/abc1600.cpp index 89e2ab0bb6b..1b48416616c 100644 --- a/src/mame/drivers/abc1600.cpp +++ b/src/mame/drivers/abc1600.cpp @@ -17,7 +17,7 @@ sa(40,0) y 5 - necd5126a + micr1325a How to install OS: ------------------ @@ -66,8 +66,6 @@ - CIO - optimize timers! - port C, open drain output bit PC1 (RTC/NVRAM data) - - hard disk - - 4105 SASI interface card - connect RS-232 printer port - Z80 SCC/DART interrupt chain - Z80 SCC DMA request @@ -463,19 +461,16 @@ void abc1600_state::spec_contr_reg_w(uint8_t data) m_sysscc = state; m_cio->pb5_w(!state); - m_bus1->pren_w(!state); - update_drdy1(); + update_drdy1(0); break; case 7: // SYSFS m_sysfs = state; m_cio->pb6_w(!state); - m_bus0i->pren_w(!state); - m_bus0x->pren_w(!state); - update_drdy0(); + update_drdy0(0); break; } } @@ -549,7 +544,23 @@ INPUT_PORTS_END // Z80DMA 0 //------------------------------------------------- -void abc1600_state::update_drdy0() +void abc1600_state::update_pren0(int state) +{ + if (m_sysfs) + { + // floppy + m_dma0->iei_w(0); + } + else + { + // BUS0I/BUS0X + bool pren0 = m_bus0i->pren_r() && m_bus0x->pren_r(); + + m_dma0->iei_w(!pren0); + } +} + +void abc1600_state::update_drdy0(int state) { if (m_sysfs) { @@ -574,28 +585,32 @@ WRITE_LINE_MEMBER( abc1600_state::dbrq_w ) // Z80DMA 1 //------------------------------------------------- -void abc1600_state::update_drdy1() +void abc1600_state::update_pren1(int state) { if (m_sysscc) { // SCC - m_dma1->rdy_w(1); + m_dma1->iei_w(1); } else { // BUS1 - m_dma1->rdy_w(m_bus1->trrq_r()); + m_dma1->iei_w(!m_bus1->pren_r()); } } -//------------------------------------------------- -// Z80DMA 2 -//------------------------------------------------- - -void abc1600_state::update_drdy2() +void abc1600_state::update_drdy1(int state) { - // Winchester - m_dma2->rdy_w(1); + if (m_sysscc) + { + // SCC + m_dma1->rdy_w(m_sccrq_a && m_sccrq_b); + } + else + { + // BUS1 + m_dma1->rdy_w(m_bus1->trrq_r()); + } } //------------------------------------------------- @@ -688,7 +703,7 @@ uint8_t abc1600_state::cio_pb_r() PB7 FINT */ - + uint8_t data = 0; data |= !m_sysscc << 5; @@ -779,11 +794,6 @@ static void abc1600_floppies(device_slot_interface &device) device.option_add("525qd", FLOPPY_525_QD); } -WRITE_LINE_MEMBER( abc1600_state::fdc_drq_w ) -{ - update_drdy0(); -} - //------------------------------------------------- // ABC1600BUS_INTERFACE( abcbus_intf ) @@ -822,7 +832,10 @@ void abc1600_state::machine_start() save_item(NAME(m_bus0)); save_item(NAME(m_csb)); save_item(NAME(m_atce)); - save_item(NAME(m_btce)); + save_item(NAME(m_sccrq_a)); + save_item(NAME(m_sccrq_b)); + save_item(NAME(m_scc_irq)); + save_item(NAME(m_dart_irq)); } @@ -863,35 +876,39 @@ void abc1600_state::abc1600(machine_config &config) ABC1600_MOVER(config, ABC1600_MOVER_TAG, 0); // devices - abc1600_mac_device &mac(ABC1600_MAC(config, "mac", 0)); - mac.set_addrmap(AS_PROGRAM, &abc1600_state::mac_mem); - mac.set_cpu_tag(m_maincpu); + ABC1600_MAC(config, m_mac, 0); + m_mac->set_addrmap(AS_PROGRAM, &abc1600_state::mac_mem); + m_mac->set_cpu_tag(m_maincpu); Z80DMA(config, m_dma0, 64_MHz_XTAL / 16); m_dma0->out_busreq_callback().set(FUNC(abc1600_state::dbrq_w)); m_dma0->out_bao_callback().set(m_dma1, FUNC(z80dma_device::bai_w)); - m_dma0->in_mreq_callback().set(ABC1600_MAC_TAG, FUNC(abc1600_mac_device::dma0_mreq_r)); - m_dma0->out_mreq_callback().set(ABC1600_MAC_TAG, FUNC(abc1600_mac_device::dma0_mreq_w)); - m_dma0->in_iorq_callback().set(ABC1600_MAC_TAG, FUNC(abc1600_mac_device::dma0_iorq_r)); - m_dma0->out_iorq_callback().set(ABC1600_MAC_TAG, FUNC(abc1600_mac_device::dma0_iorq_w)); + m_dma0->in_mreq_callback().set(m_mac, FUNC(abc1600_mac_device::dma0_mreq_r)); + m_dma0->out_mreq_callback().set(m_mac, FUNC(abc1600_mac_device::dma0_mreq_w)); + m_dma0->out_ieo_callback().set(m_bus0i, FUNC(abcbus_slot_device::prac_w)); + //m_dma0->out_ieo_callback().set(m_bus0x, FUNC(abcbus_slot_device::prac_w)); + m_dma0->in_iorq_callback().set(FUNC(abc1600_state::dma0_iorq_r)); + m_dma0->out_iorq_callback().set(FUNC(abc1600_state::dma0_iorq_w)); Z80DMA(config, m_dma1, 64_MHz_XTAL / 16); m_dma1->out_busreq_callback().set(FUNC(abc1600_state::dbrq_w)); m_dma1->out_bao_callback().set(m_dma2, FUNC(z80dma_device::bai_w)); - m_dma1->in_mreq_callback().set(ABC1600_MAC_TAG, FUNC(abc1600_mac_device::dma1_mreq_r)); - m_dma1->out_mreq_callback().set(ABC1600_MAC_TAG, FUNC(abc1600_mac_device::dma1_mreq_w)); - m_dma1->in_iorq_callback().set(ABC1600_MAC_TAG, FUNC(abc1600_mac_device::dma1_iorq_r)); - m_dma1->out_iorq_callback().set(ABC1600_MAC_TAG, FUNC(abc1600_mac_device::dma1_iorq_w)); + m_dma1->in_mreq_callback().set(m_mac, FUNC(abc1600_mac_device::dma1_mreq_r)); + m_dma1->out_mreq_callback().set(m_mac, FUNC(abc1600_mac_device::dma1_mreq_w)); + m_dma1->out_ieo_callback().set(m_bus1, FUNC(abcbus_slot_device::prac_w)); + m_dma1->in_iorq_callback().set(FUNC(abc1600_state::dma1_iorq_r)); + m_dma1->out_iorq_callback().set(FUNC(abc1600_state::dma1_iorq_w)); Z80DMA(config, m_dma2, 64_MHz_XTAL / 16); m_dma2->out_busreq_callback().set(FUNC(abc1600_state::dbrq_w)); - m_dma2->in_mreq_callback().set(ABC1600_MAC_TAG, FUNC(abc1600_mac_device::dma2_mreq_r)); - m_dma2->out_mreq_callback().set(ABC1600_MAC_TAG, FUNC(abc1600_mac_device::dma2_mreq_w)); - m_dma2->in_iorq_callback().set(ABC1600_MAC_TAG, FUNC(abc1600_mac_device::dma2_iorq_r)); - m_dma2->out_iorq_callback().set(ABC1600_MAC_TAG, FUNC(abc1600_mac_device::dma2_iorq_w)); + m_dma2->in_mreq_callback().set(m_mac, FUNC(abc1600_mac_device::dma2_mreq_r)); + m_dma2->out_mreq_callback().set(m_mac, FUNC(abc1600_mac_device::dma2_mreq_w)); + m_dma2->out_ieo_callback().set(m_bus2, FUNC(abcbus_slot_device::prac_w)); + m_dma2->in_iorq_callback().set(m_bus2, FUNC(abcbus_slot_device::read_tren)); + m_dma2->out_iorq_callback().set(m_bus2, FUNC(abcbus_slot_device::write_tren)); Z80DART(config, m_dart, 64_MHz_XTAL / 16); - m_dart->out_int_callback().set_inputline(m_maincpu, M68K_IRQ_5); // shared with SCC + m_dart->out_int_callback().set(FUNC(abc1600_state::dart_irq_w)); m_dart->out_txda_callback().set(RS232_PR_TAG, FUNC(rs232_port_device::write_txd)); //m_dart->out_dtra_callback().set(RS232_PR_TAG, FUNC(rs232_port_device::write_dcd)); //m_dart->out_rtsa_callback().set(RS232_PR_TAG, FUNC(rs232_port_device::write_cts)); @@ -903,14 +920,14 @@ void abc1600_state::abc1600(machine_config &config) kb.out_keydown_handler().set(m_dart, FUNC(z80dart_device::dcdb_w)); rs232_port_device &rs232pr(RS232_PORT(config, RS232_PR_TAG, default_rs232_devices, nullptr)); - rs232pr.rxd_handler().set(Z8470AB1_TAG, FUNC(z80dart_device::rxa_w)); - //rs232pr.rts_handler().set(Z8470AB1_TAG, FUNC(z80dart_device::ctsa_w)); - //rs232pr.dtr_handler().set(Z8470AB1_TAG, FUNC(z80dart_device::dcda_w)); + rs232pr.rxd_handler().set(m_dart, FUNC(z80dart_device::rxa_w)); + //rs232pr.rts_handler().set(m_dart, FUNC(z80dart_device::ctsa_w)); + //rs232pr.dtr_handler().set(m_dart, FUNC(z80dart_device::dcda_w)); SCC8530N(config, m_scc, 64_MHz_XTAL / 16); - m_scc->out_int_callback().set_inputline(MC68008P8_TAG, M68K_IRQ_5); - //m_scc->out_wreqa_callback().set(FUNC(abc1600_state::sccrq_w)); - //m_scc->out_wreqb_callback().set(FUNC(abc1600_state::sccrq_w)); + m_scc->out_int_callback().set(FUNC(abc1600_state::scc_irq_w)); + m_scc->out_wreqa_callback().set(FUNC(abc1600_state::sccrq_a_w)); + m_scc->out_wreqb_callback().set(FUNC(abc1600_state::sccrq_b_w)); m_scc->out_txda_callback().set(RS232_A_TAG, FUNC(rs232_port_device::write_txd)); m_scc->out_dtra_callback().set(RS232_A_TAG, FUNC(rs232_port_device::write_dtr)); m_scc->out_rtsa_callback().set(RS232_A_TAG, FUNC(rs232_port_device::write_rts)); @@ -919,15 +936,16 @@ void abc1600_state::abc1600(machine_config &config) m_scc->out_rtsb_callback().set(RS232_B_TAG, FUNC(rs232_port_device::write_rts)); rs232_port_device &rs232a(RS232_PORT(config, RS232_A_TAG, default_rs232_devices, nullptr)); - rs232a.rxd_handler().set(Z8530B1_TAG, FUNC(scc8530_device::rxa_w)); - rs232a.cts_handler().set(Z8530B1_TAG, FUNC(scc8530_device::ctsa_w)); - rs232a.dcd_handler().set(Z8530B1_TAG, FUNC(scc8530_device::dcda_w)); - rs232a.ri_handler().set(Z8530B1_TAG, FUNC(scc8530_device::synca_w)); + rs232a.rxd_handler().set(m_scc, FUNC(scc8530_device::rxa_w)); + rs232a.cts_handler().set(m_scc, FUNC(scc8530_device::ctsa_w)); + rs232a.dcd_handler().set(m_scc, FUNC(scc8530_device::dcda_w)); + rs232a.ri_handler().set(m_scc, FUNC(scc8530_device::synca_w)); + rs232_port_device &rs232b(RS232_PORT(config, RS232_B_TAG, default_rs232_devices, nullptr)); - rs232b.rxd_handler().set(Z8530B1_TAG, FUNC(scc8530_device::rxb_w)); - rs232b.cts_handler().set(Z8530B1_TAG, FUNC(scc8530_device::ctsb_w)); - rs232b.dcd_handler().set(Z8530B1_TAG, FUNC(scc8530_device::dcdb_w)); - rs232b.ri_handler().set(Z8530B1_TAG, FUNC(scc8530_device::syncb_w)); + rs232b.rxd_handler().set(m_scc, FUNC(scc8530_device::rxb_w)); + rs232b.cts_handler().set(m_scc, FUNC(scc8530_device::ctsb_w)); + rs232b.dcd_handler().set(m_scc, FUNC(scc8530_device::dcdb_w)); + rs232b.ri_handler().set(m_scc, FUNC(scc8530_device::syncb_w)); Z8536(config, m_cio, 64_MHz_XTAL / 16); m_cio->irq_wr_cb().set_inputline(MC68008P8_TAG, M68K_IRQ_2); @@ -943,27 +961,36 @@ void abc1600_state::abc1600(machine_config &config) FD1797(config, m_fdc, 64_MHz_XTAL / 64); m_fdc->intrq_wr_callback().set(m_cio, FUNC(z8536_device::pb7_w)); - m_fdc->drq_wr_callback().set(FUNC(abc1600_state::fdc_drq_w)); + m_fdc->drq_wr_callback().set(FUNC(abc1600_state::update_drdy0)); FLOPPY_CONNECTOR(config, SAB1797_02P_TAG":0", abc1600_floppies, nullptr, floppy_image_device::default_floppy_formats); FLOPPY_CONNECTOR(config, SAB1797_02P_TAG":1", abc1600_floppies, nullptr, floppy_image_device::default_floppy_formats); FLOPPY_CONNECTOR(config, SAB1797_02P_TAG":2", abc1600_floppies, "525qd", floppy_image_device::default_floppy_formats); - abcbus_slot_device &bus0i(ABCBUS_SLOT(config, "bus0i", 64_MHz_XTAL / 16, abc1600bus_cards, nullptr)); - bus0i.irq_callback().set(m_cio, FUNC(z8536_device::pa7_w)); - abcbus_slot_device &bus0x(ABCBUS_SLOT(config, "bus0x", 64_MHz_XTAL / 16, abc1600bus_cards, nullptr)); - bus0x.irq_callback().set(m_cio, FUNC(z8536_device::pa6_w)); - bus0x.nmi_callback().set(FUNC(abc1600_state::nmi_w)); - bus0x.xint2_callback().set(m_cio, FUNC(z8536_device::pa2_w)); - bus0x.xint3_callback().set(m_cio, FUNC(z8536_device::pa3_w)); - bus0x.xint4_callback().set(m_cio, FUNC(z8536_device::pa4_w)); - bus0x.xint5_callback().set(m_cio, FUNC(z8536_device::pa5_w)); - abcbus_slot_device &bus1(ABCBUS_SLOT(config, "bus1", 64_MHz_XTAL / 16, abc1600bus_cards, nullptr)); - bus1.irq_callback().set(m_cio, FUNC(z8536_device::pa1_w)); - abcbus_slot_device &bus2(ABCBUS_SLOT(config, "bus2", 64_MHz_XTAL / 16, abc1600bus_cards, "4105")); - bus2.irq_callback().set(m_cio, FUNC(z8536_device::pa0_w)); - //bus2.pren_callback().set(Z8410AB1_2_TAG, FUNC(z80dma_device::iei_w)); - bus2.trrq_callback().set(Z8410AB1_2_TAG, FUNC(z80dma_device::rdy_w)); + ABCBUS_SLOT(config, m_bus0i, 64_MHz_XTAL / 16, abc1600bus_cards, nullptr); + m_bus0i->irq_callback().set(m_cio, FUNC(z8536_device::pa7_w)); + m_bus0i->pren_callback().set(FUNC(abc1600_state::update_pren0)); + m_bus0i->trrq_callback().set(FUNC(abc1600_state::update_drdy0)); + + ABCBUS_SLOT(config, m_bus0x, 64_MHz_XTAL / 16, abc1600bus_cards, nullptr); + m_bus0x->irq_callback().set(m_cio, FUNC(z8536_device::pa6_w)); + m_bus0x->nmi_callback().set(FUNC(abc1600_state::nmi_w)); + m_bus0x->xint2_callback().set(m_cio, FUNC(z8536_device::pa2_w)); + m_bus0x->xint3_callback().set(m_cio, FUNC(z8536_device::pa3_w)); + m_bus0x->xint4_callback().set(m_cio, FUNC(z8536_device::pa4_w)); + m_bus0x->xint5_callback().set(m_cio, FUNC(z8536_device::pa5_w)); + m_bus0x->pren_callback().set(FUNC(abc1600_state::update_pren0)); + m_bus0x->trrq_callback().set(FUNC(abc1600_state::update_drdy0)); + + ABCBUS_SLOT(config, m_bus1, 64_MHz_XTAL / 16, abc1600bus_cards, nullptr); + m_bus1->irq_callback().set(m_cio, FUNC(z8536_device::pa1_w)); + m_bus1->pren_callback().set(FUNC(abc1600_state::update_pren1)); + m_bus1->trrq_callback().set(FUNC(abc1600_state::update_drdy1)); + + ABCBUS_SLOT(config, m_bus2, 64_MHz_XTAL / 16, abc1600bus_cards, "4105"); + m_bus2->irq_callback().set(m_cio, FUNC(z8536_device::pa0_w)); + m_bus2->pren_callback().set(m_dma2, FUNC(z80dma_device::iei_w)); + m_bus2->trrq_callback().set(m_dma2, FUNC(z80dma_device::rdy_w)); // internal ram RAM(config, RAM_TAG).set_default_size("1M"); |