diff options
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 |
commit | 6de642fc2ecb7dac5582b98fdda85999bb498734 (patch) | |
tree | 28e86f762fb3de90e43456c5c679282e5763f11c | |
parent | 1a1af6a3bbcec084b2cd111e8139555bf5fef0c1 (diff) |
abc1600: Implemented Luxor 4105 SASI card according to schematics. [Curt Coder, Dataindustrier AB DIAB Intressegrupp]
-rw-r--r-- | src/devices/bus/abcbus/abcbus.h | 6 | ||||
-rw-r--r-- | src/devices/bus/abcbus/lux4105.cpp | 288 | ||||
-rw-r--r-- | src/devices/bus/abcbus/lux4105.h | 14 | ||||
-rw-r--r-- | src/mame/drivers/abc1600.cpp | 171 | ||||
-rw-r--r-- | src/mame/includes/abc1600.h | 27 |
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; }; |