summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/abc1600.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/abc1600.cpp')
-rw-r--r--src/mame/drivers/abc1600.cpp171
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");