summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Curt Coder <curtcoder@mail.com>2020-08-22 15:59:18 +0300
committer Curt Coder <curtcoder@mail.com>2020-08-22 15:59:18 +0300
commit6de642fc2ecb7dac5582b98fdda85999bb498734 (patch)
tree28e86f762fb3de90e43456c5c679282e5763f11c
parent1a1af6a3bbcec084b2cd111e8139555bf5fef0c1 (diff)
abc1600: Implemented Luxor 4105 SASI card according to schematics. [Curt Coder, Dataindustrier AB DIAB Intressegrupp]
-rw-r--r--src/devices/bus/abcbus/abcbus.h6
-rw-r--r--src/devices/bus/abcbus/lux4105.cpp288
-rw-r--r--src/devices/bus/abcbus/lux4105.h14
-rw-r--r--src/mame/drivers/abc1600.cpp171
-rw-r--r--src/mame/includes/abc1600.h27
5 files changed, 308 insertions, 198 deletions
diff --git a/src/devices/bus/abcbus/abcbus.h b/src/devices/bus/abcbus/abcbus.h
index 402f1325136..1c5721650e4 100644
--- a/src/devices/bus/abcbus/abcbus.h
+++ b/src/devices/bus/abcbus/abcbus.h
@@ -132,7 +132,8 @@ public:
// optional operation overrides for ABC 1600
virtual int abcbus_csb() { return 1; }
virtual uint8_t abcbus_ops() { return 0xff; }
- virtual void abcbus_tren(int state) { }
+ virtual uint8_t abcbus_tren() { return 0xff; }
+ virtual void abcbus_tren(uint8_t data) { }
virtual void abcbus_prac(int state) { }
virtual uint8_t abcbus_exp() { return 0xff; }
virtual int abcbus_xcsb2() { return 1; }
@@ -198,7 +199,8 @@ public:
DECLARE_READ_LINE_MEMBER( xcsb3_r ) { return m_card ? m_card->abcbus_xcsb3() : 1; }
DECLARE_READ_LINE_MEMBER( xcsb4_r ) { return m_card ? m_card->abcbus_xcsb4() : 1; }
DECLARE_READ_LINE_MEMBER( xcsb5_r ) { return m_card ? m_card->abcbus_xcsb5() : 1; }
- DECLARE_WRITE_LINE_MEMBER( tren_w ) { if (m_card) m_card->abcbus_tren(state); }
+ uint8_t read_tren() { return m_card ? m_card->abcbus_tren() : 0xff; }
+ void write_tren(uint8_t data) { if (m_card) m_card->abcbus_tren(data); }
DECLARE_WRITE_LINE_MEMBER( prac_w ) { if (m_card) m_card->abcbus_prac(state); }
void cs_w(uint8_t data) { write_cs(data); }
diff --git a/src/devices/bus/abcbus/lux4105.cpp b/src/devices/bus/abcbus/lux4105.cpp
index 59b4f5191a5..17d51b93144 100644
--- a/src/devices/bus/abcbus/lux4105.cpp
+++ b/src/devices/bus/abcbus/lux4105.cpp
@@ -41,59 +41,7 @@ Notes:
TODO
- - command execution gets stuck in message in phase
-
- 08A88 move.l D7,D0 D0=00000025
- 08A8A lsl.l #5, D0 D0=000004A0
- 08A8C ori.l #$7e000, D0 D0=0007E4A0
- 08A92 movea.l D0, A0 A0=0007E4A0
- 08A94 move.b ($2,A0), D0 D0=0007E4AF
- 08A98 btst #$2, D0
- 08A9C beq $8aa4
- 08AA0 bra $8a88
-
- [:bus2:4105:sasi:0:s1410] state=3.1 change
- [:bus2:4105:sasi:0:s1410] state=3.0 change
- [:bus2:4105:sasi] ctrl .....B.CI stat 0005
- [:bus2:4105:sasi] 0=ICB
- [:bus2:4105:sasi] ctrl .....B.CI stat 0005
- [:bus2:4105:sasi] 0=ICB
- [:bus2:4105:sasi] ctrl .....B.CI stat 0000
- [:bus2:4105:sasi] 0=ICB
- [:bus2:4105:sasi] ctrl ...Q.B.CI stat 0000
- [:bus2:4105:sasi] 0=QICB
- [:bus2:4105:sasi] ctrl ...Q.B.CI stat 0000
- [:bus2:4105:sasi] 0=QICB
- [:bus2:4105:sasi:0:s1410] state=3.4 change
- [:bus2:4105:sasi] ctrl ...Q.B.CI stat 0000
- [:bus2:4105:sasi] 0=QICB
- [:] ':3f' (089A8) STAT 25: 45
- [:bus2:4105:sasi] ctrl ..KQ.B.CI stat 0000
- [:bus2:4105:sasi] 0=QICB
- [:bus2:4105:sasi] 1=K
- [:bus2:4105:sasi:0:s1410] state=3.4 change
- [:bus2:4105:sasi] ctrl ..K..B.CI stat 0000
- [:bus2:4105:sasi] 0=ICB
- [:bus2:4105:sasi] 1=K
- [:bus2:4105:sasi] ctrl .....B.CI stat 0000
- [:bus2:4105:sasi] 0=ICB
- [:bus2:4105:sasi:0:s1410] state=3.3 change
- [:bus2:4105:sasi:0:s1410] state=3.0 change
- [:bus2:4105:sasi] ctrl .....BMCI min 0000
- [:bus2:4105:sasi] 0=MICB
- [:bus2:4105:sasi] ctrl .....BMCI min 0000
- [:bus2:4105:sasi] 0=MICB
- [:bus2:4105:sasi] ctrl .....BMCI min 0000
- [:bus2:4105:sasi] 0=MICB
- [:bus2:4105:sasi] ctrl ...Q.BMCI min 0000
- [:bus2:4105:sasi] 0=QMICB
- [:bus2:4105:sasi] ctrl ...Q.BMCI min 0000
- [:bus2:4105:sasi] 0=QMICB
- [:bus2:4105:sasi:0:s1410] state=3.4 change
- [:bus2:4105:sasi] ctrl ...Q.BMCI min 0000
- [:bus2:4105:sasi] 0=QMICB
- [:] ':3f' (089D4) INP 25: 00
- [:] ':3f' (089E8) STAT 25: 05
+ - sector length error in read check after format
*/
@@ -109,7 +57,9 @@ Notes:
//**************************************************************************
#define SASIBUS_TAG "sasi"
-
+#define DMA_O1 BIT(m_dma, 0)
+#define DMA_O2 BIT(m_dma, 1)
+#define DMA_O3 BIT(m_dma, 2)
//**************************************************************************
@@ -133,6 +83,7 @@ void luxor_4105_device::device_add_mconfig(machine_config &config)
downcast<nscsi_callback_device&>(*device).cd_callback().set(*this, FUNC(luxor_4105_device::write_sasi_cd));
downcast<nscsi_callback_device&>(*device).bsy_callback().set(*this, FUNC(luxor_4105_device::write_sasi_bsy));
downcast<nscsi_callback_device&>(*device).req_callback().set(*this, FUNC(luxor_4105_device::write_sasi_req));
+ downcast<nscsi_callback_device&>(*device).msg_callback().set(*this, FUNC(luxor_4105_device::write_sasi_msg));
downcast<nscsi_callback_device&>(*device).io_callback().set(*this, FUNC(luxor_4105_device::write_sasi_io));
});
}
@@ -164,6 +115,11 @@ INPUT_PORTS_START( luxor_4105 )
PORT_DIPNAME( 0x7f, 0x25, "Card Address" ) PORT_DIPLOCATION("5E:1,2,3,4,5,6,7")
PORT_DIPSETTING( 0x25, "37" )
PORT_DIPSETTING( 0x2d, "45" )
+
+ PORT_START("S1")
+ PORT_CONFNAME( 0x01, 0x01, "DMA Timing" )
+ PORT_CONFSETTING( 0x00, "1043/1044" ) // a. TREN connected via delay circuit to OUT latch enable
+ PORT_CONFSETTING( 0x01, "1045/1046" ) // b. TREN connected directly to OUT latch enable
INPUT_PORTS_END
@@ -206,7 +162,11 @@ void luxor_4105_device::device_start()
{
// state saving
save_item(NAME(m_cs));
+ save_item(NAME(m_data_out));
save_item(NAME(m_dma));
+ save_item(NAME(m_req));
+ save_item(NAME(m_drq));
+ save_item(NAME(m_pren));
}
@@ -217,38 +177,93 @@ void luxor_4105_device::device_start()
void luxor_4105_device::device_reset()
{
m_cs = false;
- m_dma = 0;
+
+ internal_reset();
+}
+
+
+void luxor_4105_device::internal_reset()
+{
+ write_dma_register(0);
+
+ m_data_out = 0;
+
+ m_sasi->sel_w(0);
m_sasi->rst_w(1);
m_sasi->rst_w(0);
-
- m_slot->trrq_w(1);
}
-void luxor_4105_device::update_trrq_int()
+void luxor_4105_device::update_dma()
{
- bool cd = !m_sasi->cd_r();
- bool req = !m_sasi->req_r();
- int trrq = (cd & !req) ? 0 : 1;
-
- if (BIT(m_dma, 5))
+ // IRQ
+ bool cd = m_sasi->cd_r();
+ bool io = m_sasi->io_r();
+ bool req = m_sasi->req_r() && !m_req;
+ m_drq = (!((!cd || !io) && !(!cd && !DMA_O2))) && req;
+ bool irq = !(DMA_O3 && m_pren) || !(DMA_O1 && m_drq);
+ m_slot->irq_w(irq);
+
+ // TRRQ
+ if (DMA_O2)
{
- m_slot->irq_w(trrq ? CLEAR_LINE : ASSERT_LINE);
+ bool trrq = !(!cd && req);
+ m_slot->trrq_w(trrq);
}
else
{
- m_slot->irq_w(CLEAR_LINE);
+ m_slot->trrq_w(1);
}
+}
- if (BIT(m_dma, 6))
- {
- m_slot->trrq_w(trrq);
- }
- else
+
+void luxor_4105_device::update_ack()
+{
+ m_sasi->ack_w(m_sasi->req_r() && (m_sasi->msg_r() || m_req));
+}
+
+
+void luxor_4105_device::write_dma_register(uint8_t data)
+{
+ /*
+
+ bit description
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5 byte interrupt enable?
+ 6 DMA/CPU mode (1=DMA, 0=CPU)?
+ 7 error interrupt enable?
+
+ */
+
+ m_dma = BIT(data, 5) << 2 | BIT(data, 6) << 1 | BIT(data, 7);
+
+ // PREN
+ m_pren = !DMA_O2;
+ m_slot->pren_w(m_pren);
+
+ update_dma();
+}
+
+
+void luxor_4105_device::write_sasi_data(uint8_t data)
+{
+ m_data_out = data;
+
+ if (!m_sasi->io_r())
{
- m_slot->trrq_w(1);
+ m_sasi->write(data);
}
+
+ // clock REQ FF
+ m_req = m_sasi->req_r();
+ update_ack();
+ update_dma();
}
@@ -263,7 +278,7 @@ WRITE_LINE_MEMBER( luxor_4105_device::write_sasi_bsy )
WRITE_LINE_MEMBER( luxor_4105_device::write_sasi_cd )
{
- update_trrq_int();
+ update_dma();
}
@@ -271,10 +286,18 @@ WRITE_LINE_MEMBER( luxor_4105_device::write_sasi_req )
{
if (!state)
{
- m_sasi->ack_w(0);
+ // reset REQ FF
+ m_req = 0;
}
- update_trrq_int();
+ update_ack();
+ update_dma();
+}
+
+
+WRITE_LINE_MEMBER( luxor_4105_device::write_sasi_msg )
+{
+ update_ack();
}
@@ -284,6 +307,12 @@ WRITE_LINE_MEMBER( luxor_4105_device::write_sasi_io )
{
m_sasi->write(0);
}
+ else
+ {
+ m_sasi->write(m_data_out);
+ }
+
+ update_dma();
}
@@ -321,22 +350,25 @@ uint8_t luxor_4105_device::abcbus_stat()
bit description
- 0 ?
- 1 ?
- 2 ?
- 3 ?
+ 0 REQ
+ 1 C/D
+ 2 BSY
+ 3 I/O
4 0
- 5
- 6 ? (tested at 014D9A, after command 08 sent and 1 byte read from SASI, should be 1)
- 7
+ 5 DMA !O3
+ 6 PREN
+ 7 DMA request
*/
- data = m_sasi->req_r();
+ data = m_sasi->req_r() && !m_req;
data |= !m_sasi->cd_r() << 1;
data |= m_sasi->bsy_r() << 2;
data |= !m_sasi->io_r() << 3;
- data |= !m_sasi->msg_r() << 6;
+
+ data |= !DMA_O3 << 5;
+ data |= !m_pren << 6;
+ data |= !m_drq << 7;
}
return data;
@@ -351,19 +383,19 @@ uint8_t luxor_4105_device::abcbus_inp()
{
uint8_t data = 0xff;
- if (m_cs)
+ if (m_sasi->bsy_r())
{
- if (!m_sasi->bsy_r())
- {
- data = m_1e->read();
- }
- else
- {
- data = m_sasi->read();
-
- m_sasi->ack_w(1);
- }
+ data = m_sasi->read();
}
+ else
+ {
+ data = m_1e->read();
+ }
+
+ // clock REQ FF
+ m_req = m_sasi->req_r();
+ update_ack();
+ update_dma();
return data;
}
@@ -377,9 +409,7 @@ void luxor_4105_device::abcbus_out(uint8_t data)
{
if (m_cs)
{
- m_sasi->write(data);
-
- m_sasi->ack_w(1);
+ write_sasi_data(data);
}
}
@@ -405,12 +435,7 @@ void luxor_4105_device::abcbus_c3(uint8_t data)
{
if (m_cs)
{
- m_dma = 0;
-
- m_sasi->sel_w(0);
-
- m_sasi->rst_w(1);
- m_sasi->rst_w(0);
+ internal_reset();
}
}
@@ -423,23 +448,54 @@ void luxor_4105_device::abcbus_c4(uint8_t data)
{
if (m_cs)
{
- /*
+ write_dma_register(data);
+ }
+}
- bit description
- 0
- 1
- 2
- 3
- 4
- 5 byte interrupt enable?
- 6 DMA/CPU mode (1=DMA, 0=CPU)?
- 7 error interrupt enable?
+//-------------------------------------------------
+// abcbus_tren -
+//-------------------------------------------------
- */
+uint8_t luxor_4105_device::abcbus_tren()
+{
+ uint8_t data = 0xff;
+
+ if (m_sasi->bsy_r())
+ {
+ data = m_sasi->read();
+ }
+
+ // clock REQ FF
+ m_req = m_sasi->req_r();
+ update_ack();
+ update_dma();
+
+ return data;
+}
+
+
+//-------------------------------------------------
+// abcbus_tren -
+//-------------------------------------------------
+
+void luxor_4105_device::abcbus_tren(uint8_t data)
+{
+ write_sasi_data(data);
+}
- m_dma = data;
- update_trrq_int();
+//-------------------------------------------------
+// abcbus_prac -
+//-------------------------------------------------
+
+void luxor_4105_device::abcbus_prac(int state)
+{
+ if ((state && DMA_O2) && !m_slot->trrq_r())
+ {
+ // set REQ FF
+ m_req = 1;
+ update_ack();
+ update_dma();
}
}
diff --git a/src/devices/bus/abcbus/lux4105.h b/src/devices/bus/abcbus/lux4105.h
index e2c05d57dba..e6e9317ec70 100644
--- a/src/devices/bus/abcbus/lux4105.h
+++ b/src/devices/bus/abcbus/lux4105.h
@@ -50,13 +50,21 @@ protected:
virtual void abcbus_c1(uint8_t data) override;
virtual void abcbus_c3(uint8_t data) override;
virtual void abcbus_c4(uint8_t data) override;
+ virtual uint8_t abcbus_tren() override;
+ virtual void abcbus_tren(uint8_t data) override;
+ virtual void abcbus_prac(int state) override;
private:
- inline void update_trrq_int();
+ void internal_reset();
+ void update_ack();
+ void update_dma();
+ void write_dma_register(uint8_t data);
+ void write_sasi_data(uint8_t data);
DECLARE_WRITE_LINE_MEMBER( write_sasi_bsy );
DECLARE_WRITE_LINE_MEMBER( write_sasi_cd );
DECLARE_WRITE_LINE_MEMBER( write_sasi_req );
+ DECLARE_WRITE_LINE_MEMBER( write_sasi_msg );
DECLARE_WRITE_LINE_MEMBER( write_sasi_io );
required_device<nscsi_callback_device> m_sasi;
@@ -64,7 +72,11 @@ private:
required_ioport m_5e;
bool m_cs;
+ uint8_t m_data_out;
uint8_t m_dma;
+ bool m_req;
+ bool m_drq;
+ bool m_pren;
};
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");
diff --git a/src/mame/includes/abc1600.h b/src/mame/includes/abc1600.h
index 0165a8e83b4..9a060a4d71f 100644
--- a/src/mame/includes/abc1600.h
+++ b/src/mame/includes/abc1600.h
@@ -62,6 +62,7 @@ public:
abc1600_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, MC68008P8_TAG),
+ m_mac(*this, ABC1600_MAC_TAG),
m_dma0(*this, Z8410AB1_0_TAG),
m_dma1(*this, Z8410AB1_1_TAG),
m_dma2(*this, Z8410AB1_2_TAG),
@@ -82,6 +83,7 @@ public:
{ }
required_device<m68000_base_device> m_maincpu;
+ required_device<abc1600_mac_device> m_mac;
required_device<z80dma_device> m_dma0;
required_device<z80dma_device> m_dma1;
required_device<z80dma_device> m_dma2;
@@ -115,7 +117,11 @@ public:
void fw1_w(uint8_t data);
void spec_contr_reg_w(uint8_t data);
- DECLARE_WRITE_LINE_MEMBER( dbrq_w );
+ void dbrq_w(int state);
+ uint8_t dma0_iorq_r(offs_t offset) { return m_sysfs ? m_mac->dma0_iorq_r(offset) : (m_bus0i->read_tren() & m_bus0x->read_tren()); }
+ void dma0_iorq_w(offs_t offset, uint8_t data) { if (m_sysfs) m_mac->dma0_iorq_w(offset, data); else { m_bus0i->write_tren(data); m_bus0x->write_tren(data); }; }
+ uint8_t dma1_iorq_r(offs_t offset) { return m_sysscc ? m_mac->dma1_iorq_r(offset) : m_bus1->read_tren(); }
+ void dma1_iorq_w(offs_t offset, uint8_t data) { if (m_sysscc) m_mac->dma1_iorq_w(offset, data); else m_bus1->write_tren(data); }
uint8_t cio_pa_r();
uint8_t cio_pb_r();
@@ -123,15 +129,18 @@ public:
uint8_t cio_pc_r();
void cio_pc_w(uint8_t data);
- DECLARE_WRITE_LINE_MEMBER( nmi_w );
+ void nmi_w(int state);
void cpu_space_map(address_map &map);
- DECLARE_WRITE_LINE_MEMBER( fdc_drq_w );
-
- void update_drdy0();
- void update_drdy1();
- void update_drdy2();
+ void update_pren0(int state);
+ void update_pren1(int state);
+ void update_drdy0(int state);
+ void update_drdy1(int state);
+ void sccrq_a_w(int state) { m_sccrq_a = state; update_drdy1(0); }
+ void sccrq_b_w(int state) { m_sccrq_b = state; update_drdy1(0); }
+ void dart_irq_w(int state) { m_dart_irq = state; m_maincpu->set_input_line(M68K_IRQ_5, (m_dart_irq || m_scc_irq) ? ASSERT_LINE : CLEAR_LINE); }
+ void scc_irq_w(int state) { m_scc_irq = state; m_maincpu->set_input_line(M68K_IRQ_5, (m_dart_irq || m_scc_irq) ? ASSERT_LINE : CLEAR_LINE); }
// DMA
int m_dmadis;
@@ -149,6 +158,10 @@ public:
uint8_t m_csb; // card select
int m_atce; // V.24 channel A external clock enable
int m_btce; // V.24 channel B external clock enable
+ bool m_sccrq_a;
+ bool m_sccrq_b;
+ int m_dart_irq;
+ int m_scc_irq;
};