From d6c366d8c6a8870f53baf8af44ed0585c5b53e48 Mon Sep 17 00:00:00 2001 From: AJR Date: Thu, 19 Jul 2018 10:46:32 -0400 Subject: vip: Give the expansion bus full access to N and TPB (nw) --- src/devices/bus/vip/exp.cpp | 57 +++++++++++++++++++++++---- src/devices/bus/vip/exp.h | 27 +++++++------ src/devices/bus/vip/vp550.cpp | 4 +- src/devices/bus/vip/vp550.h | 2 +- src/devices/bus/vip/vp575.cpp | 18 ++++++++- src/devices/bus/vip/vp575.h | 3 +- src/mame/drivers/vip.cpp | 89 ++++++++++++++++++------------------------- src/mame/includes/vip.h | 49 +++++++++++------------- 8 files changed, 145 insertions(+), 104 deletions(-) diff --git a/src/devices/bus/vip/exp.cpp b/src/devices/bus/vip/exp.cpp index 3b9fce990ec..70467c57839 100644 --- a/src/devices/bus/vip/exp.cpp +++ b/src/devices/bus/vip/exp.cpp @@ -140,7 +140,7 @@ void vip_expansion_slot_device::io_w(address_space &space, offs_t offset, uint8_ // dma_r - dma read //------------------------------------------------- -uint8_t vip_expansion_slot_device::dma_r(address_space &space, offs_t offset) +READ8_MEMBER(vip_expansion_slot_device::dma_r) { uint8_t data = 0; @@ -157,7 +157,7 @@ uint8_t vip_expansion_slot_device::dma_r(address_space &space, offs_t offset) // dma_w - dma write //------------------------------------------------- -void vip_expansion_slot_device::dma_w(address_space &space, offs_t offset, uint8_t data) +WRITE8_MEMBER(vip_expansion_slot_device::dma_w) { if (m_card != nullptr) { @@ -182,12 +182,53 @@ uint32_t vip_expansion_slot_device::screen_update(screen_device &screen, bitmap_ return value; } -READ_LINE_MEMBER( vip_expansion_slot_device::ef1_r ) { int state = CLEAR_LINE; if (m_card != nullptr) state = m_card->vip_ef1_r(); return state; } -READ_LINE_MEMBER( vip_expansion_slot_device::ef3_r ) { int state = CLEAR_LINE; if (m_card != nullptr) state = m_card->vip_ef3_r(); return state; } -READ_LINE_MEMBER( vip_expansion_slot_device::ef4_r ) { int state = CLEAR_LINE; if (m_card != nullptr) state = m_card->vip_ef4_r(); return state; } -void vip_expansion_slot_device::sc_w(int data) { if (m_card != nullptr) m_card->vip_sc_w(data); } -WRITE_LINE_MEMBER( vip_expansion_slot_device::q_w ) { if (m_card != nullptr) m_card->vip_q_w(state); } -WRITE_LINE_MEMBER( vip_expansion_slot_device::run_w ) { if (m_card != nullptr) m_card->vip_run_w(state); } +READ_LINE_MEMBER(vip_expansion_slot_device::ef1_r) +{ + int state = CLEAR_LINE; + if (m_card != nullptr) + state = m_card->vip_ef1_r(); + return state; +} + +READ_LINE_MEMBER(vip_expansion_slot_device::ef3_r) +{ + int state = CLEAR_LINE; + if (m_card != nullptr) + state = m_card->vip_ef3_r(); + return state; +} + +READ_LINE_MEMBER(vip_expansion_slot_device::ef4_r) +{ + int state = CLEAR_LINE; + if (m_card != nullptr) + state = m_card->vip_ef4_r(); + return state; +} + +WRITE8_MEMBER(vip_expansion_slot_device::sc_w) +{ + if (m_card != nullptr) + m_card->vip_sc_w(offset, data); +} + +WRITE_LINE_MEMBER(vip_expansion_slot_device::q_w) +{ + if (m_card != nullptr) + m_card->vip_q_w(state); +} + +WRITE_LINE_MEMBER(vip_expansion_slot_device::tpb_w) +{ + if (m_card != nullptr) + m_card->vip_tpb_w(state); +} + +WRITE_LINE_MEMBER(vip_expansion_slot_device::run_w) +{ + if (m_card != nullptr) + m_card->vip_run_w(state); +} diff --git a/src/devices/bus/vip/exp.h b/src/devices/bus/vip/exp.h index b9bc3235fa7..dfca23fc038 100644 --- a/src/devices/bus/vip/exp.h +++ b/src/devices/bus/vip/exp.h @@ -91,20 +91,21 @@ public: void program_w(address_space &space, offs_t offset, uint8_t data, int cdef, int *minh); uint8_t io_r(address_space &space, offs_t offset); void io_w(address_space &space, offs_t offset, uint8_t data); - uint8_t dma_r(address_space &space, offs_t offset); - void dma_w(address_space &space, offs_t offset, uint8_t data); + DECLARE_READ8_MEMBER(dma_r); + DECLARE_WRITE8_MEMBER(dma_w); uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - DECLARE_READ_LINE_MEMBER( ef1_r ); - DECLARE_READ_LINE_MEMBER( ef3_r ); - DECLARE_READ_LINE_MEMBER( ef4_r ); - void sc_w(int data); - DECLARE_WRITE_LINE_MEMBER( q_w ); - DECLARE_WRITE_LINE_MEMBER( run_w ); + DECLARE_READ_LINE_MEMBER(ef1_r); + DECLARE_READ_LINE_MEMBER(ef3_r); + DECLARE_READ_LINE_MEMBER(ef4_r); + DECLARE_WRITE8_MEMBER(sc_w); + DECLARE_WRITE_LINE_MEMBER(q_w); + DECLARE_WRITE_LINE_MEMBER(tpb_w); + DECLARE_WRITE_LINE_MEMBER(run_w); // cartridge interface - DECLARE_WRITE_LINE_MEMBER( interrupt_w ) { m_write_int(state); } - DECLARE_WRITE_LINE_MEMBER( dma_out_w ) { m_write_dma_out(state); } - DECLARE_WRITE_LINE_MEMBER( dma_in_w ) { m_write_dma_in(state); } + DECLARE_WRITE_LINE_MEMBER(interrupt_w) { m_write_int(state); } + DECLARE_WRITE_LINE_MEMBER(dma_out_w) { m_write_dma_out(state); } + DECLARE_WRITE_LINE_MEMBER(dma_in_w) { m_write_dma_in(state); } protected: // device-level overrides @@ -144,10 +145,12 @@ protected: virtual int vip_ef3_r() { return CLEAR_LINE; } virtual int vip_ef4_r() { return CLEAR_LINE; } - virtual void vip_sc_w(int data) { } + virtual void vip_sc_w(int n, int sc) { } virtual void vip_q_w(int state) { } + virtual void vip_tpb_w(int state) { } + virtual void vip_run_w(int state) { } vip_expansion_slot_device *m_slot; diff --git a/src/devices/bus/vip/vp550.cpp b/src/devices/bus/vip/vp550.cpp index b52f6ec5ade..97c4628e985 100644 --- a/src/devices/bus/vip/vp550.cpp +++ b/src/devices/bus/vip/vp550.cpp @@ -136,9 +136,9 @@ void vp550_device::vip_program_w(address_space &space, offs_t offset, uint8_t da // vip_sc_w - status code write //------------------------------------------------- -void vp550_device::vip_sc_w(int data) +void vp550_device::vip_sc_w(int n, int sc) { - if (BIT(data, 1)) + if (BIT(sc, 1)) { if (LOG) logerror("VP550 '%s' Clear Interrupt\n", tag()); diff --git a/src/devices/bus/vip/vp550.h b/src/devices/bus/vip/vp550.h index c61bf8d7e86..20b2cf8e8de 100644 --- a/src/devices/bus/vip/vp550.h +++ b/src/devices/bus/vip/vp550.h @@ -37,7 +37,7 @@ protected: // device_vip_expansion_card_interface overrides virtual void vip_program_w(address_space &space, offs_t offset, uint8_t data, int cdef, int *minh) override; - virtual void vip_sc_w(int data) override; + virtual void vip_sc_w(int n, int sc) override; virtual void vip_q_w(int state) override; virtual void vip_run_w(int state) override; diff --git a/src/devices/bus/vip/vp575.cpp b/src/devices/bus/vip/vp575.cpp index 6505e2938ed..c69ccc5bade 100644 --- a/src/devices/bus/vip/vp575.cpp +++ b/src/devices/bus/vip/vp575.cpp @@ -267,11 +267,12 @@ int vp575_device::vip_ef4_r() // vip_sc_w - status code write //------------------------------------------------- -void vp575_device::vip_sc_w(int data) +void vp575_device::vip_sc_w(int n, int sc) { + address_space &space = machine().dummy_space(); for (auto & elem : m_expansion_slot) { - elem->sc_w(data); + elem->sc_w(space, n, sc); } } @@ -289,6 +290,19 @@ void vp575_device::vip_q_w(int state) } +//------------------------------------------------- +// vip_tpb_w - TPB write +//------------------------------------------------- + +void vp575_device::vip_tpb_w(int state) +{ + for (auto & elem : m_expansion_slot) + { + elem->tpb_w(state); + } +} + + //------------------------------------------------- // vip_run_w - RUN write //------------------------------------------------- diff --git a/src/devices/bus/vip/vp575.h b/src/devices/bus/vip/vp575.h index 604af9716dd..41a18053276 100644 --- a/src/devices/bus/vip/vp575.h +++ b/src/devices/bus/vip/vp575.h @@ -44,8 +44,9 @@ protected: virtual int vip_ef1_r() override; virtual int vip_ef3_r() override; virtual int vip_ef4_r() override; - virtual void vip_sc_w(int data) override; + virtual void vip_sc_w(int n, int sc) override; virtual void vip_q_w(int state) override; + virtual void vip_tpb_w(int state) override; virtual void vip_run_w(int state) override; private: diff --git a/src/mame/drivers/vip.cpp b/src/mame/drivers/vip.cpp index 6544d79cbf0..408843aba00 100644 --- a/src/mame/drivers/vip.cpp +++ b/src/mame/drivers/vip.cpp @@ -263,7 +263,7 @@ void vip_state::update_interrupts() // read - //------------------------------------------------- -READ8_MEMBER( vip_state::read ) +READ8_MEMBER(vip_state::read) { int cs = BIT(offset, 15) || m_8000; int cdef = !((offset >= 0xc00) && (offset < 0x1000)); @@ -288,7 +288,7 @@ READ8_MEMBER( vip_state::read ) // write - //------------------------------------------------- -WRITE8_MEMBER( vip_state::write ) +WRITE8_MEMBER(vip_state::write) { int cs = BIT(offset, 15) || m_8000; int cdef = !((offset >= 0xc00) && (offset < 0x1000)); @@ -307,7 +307,7 @@ WRITE8_MEMBER( vip_state::write ) // io_r - //------------------------------------------------- -READ8_MEMBER( vip_state::io_r ) +READ8_MEMBER(vip_state::io_r) { uint8_t data = m_exp->io_r(space, offset); @@ -336,7 +336,7 @@ READ8_MEMBER( vip_state::io_r ) // io_w - //------------------------------------------------- -WRITE8_MEMBER( vip_state::io_w ) +WRITE8_MEMBER(vip_state::io_w) { m_exp->io_w(space, offset, data); @@ -399,7 +399,7 @@ void vip_state::vip_io(address_map &map) // INPUT_PORTS( vip ) //------------------------------------------------- -INPUT_CHANGED_MEMBER( vip_state::reset_w ) +INPUT_CHANGED_MEMBER(vip_state::reset_w ) { m_exp->run_w(newval); @@ -409,7 +409,7 @@ INPUT_CHANGED_MEMBER( vip_state::reset_w ) } } -INPUT_CHANGED_MEMBER( vip_state::beeper_w ) +INPUT_CHANGED_MEMBER(vip_state::beeper_w ) { m_beeper->set_output_gain(0, newval ? 0.80 : 0); } @@ -452,34 +452,34 @@ INPUT_PORTS_END // COSMAC_INTERFACE( cosmac_intf ) //------------------------------------------------- -READ_LINE_MEMBER( vip_state::clear_r ) +READ_LINE_MEMBER(vip_state::clear_r ) { return BIT(m_run->read(), 0); } -READ_LINE_MEMBER( vip_state::ef1_r ) +READ_LINE_MEMBER(vip_state::ef1_r ) { return m_vdc_ef1 || m_exp->ef1_r(); } -READ_LINE_MEMBER( vip_state::ef2_r ) +READ_LINE_MEMBER(vip_state::ef2_r ) { m_leds[LED_TAPE] = m_cassette->input() > 0 ? 1 : 0; return (m_cassette->input() < 0) ? ASSERT_LINE : CLEAR_LINE; } -READ_LINE_MEMBER( vip_state::ef3_r ) +READ_LINE_MEMBER(vip_state::ef3_r ) { return !BIT(m_keypad->read(), m_keylatch) || m_byteio_ef3 || m_exp_ef3; } -READ_LINE_MEMBER( vip_state::ef4_r ) +READ_LINE_MEMBER(vip_state::ef4_r ) { return m_byteio_ef4 || m_exp_ef4; } -WRITE_LINE_MEMBER( vip_state::q_w ) +WRITE_LINE_MEMBER(vip_state::q_w ) { // sound output m_beeper->write(machine().dummy_space(), NODE_01, state); @@ -494,43 +494,26 @@ WRITE_LINE_MEMBER( vip_state::q_w ) m_exp->q_w(state); } -READ8_MEMBER( vip_state::dma_r ) -{ - return m_exp->dma_r(space, offset); -} - -WRITE8_MEMBER( vip_state::dma_w ) -{ - m_vdc->dma_w(space, offset, data); - - m_exp->dma_w(space, offset, data); -} - -WRITE8_MEMBER( vip_state::sc_w ) -{ - m_exp->sc_w(data); -} - //------------------------------------------------- // CDP1861_INTERFACE( vdc_intf ) //------------------------------------------------- -WRITE_LINE_MEMBER( vip_state::vdc_int_w ) +WRITE_LINE_MEMBER(vip_state::vdc_int_w ) { m_vdc_int = state; update_interrupts(); } -WRITE_LINE_MEMBER( vip_state::vdc_dma_out_w ) +WRITE_LINE_MEMBER(vip_state::vdc_dma_out_w ) { m_vdc_dma_out = state; update_interrupts(); } -WRITE_LINE_MEMBER( vip_state::vdc_ef1_w ) +WRITE_LINE_MEMBER(vip_state::vdc_ef1_w ) { m_vdc_ef1 = state; } @@ -567,7 +550,7 @@ DISCRETE_SOUND_END // VIP_BYTEIO_PORT_INTERFACE( byteio_intf ) //------------------------------------------------- -WRITE_LINE_MEMBER( vip_state::byteio_inst_w ) +WRITE_LINE_MEMBER(vip_state::byteio_inst_w) { if (!state) { @@ -580,21 +563,21 @@ WRITE_LINE_MEMBER( vip_state::byteio_inst_w ) // VIP_EXPANSION_INTERFACE( expansion_intf ) //------------------------------------------------- -WRITE_LINE_MEMBER( vip_state::exp_int_w ) +WRITE_LINE_MEMBER(vip_state::exp_int_w) { m_exp_int = state; update_interrupts(); } -WRITE_LINE_MEMBER( vip_state::exp_dma_out_w ) +WRITE_LINE_MEMBER(vip_state::exp_dma_out_w) { m_exp_dma_out = state; update_interrupts(); } -WRITE_LINE_MEMBER( vip_state::exp_dma_in_w ) +WRITE_LINE_MEMBER(vip_state::exp_dma_in_w) { m_exp_dma_in = state; @@ -716,26 +699,28 @@ QUICKLOAD_LOAD_MEMBER( vip_state, vip ) MACHINE_CONFIG_START(vip_state::vip) // basic machine hardware - MCFG_DEVICE_ADD(CDP1802_TAG, CDP1802, XTAL(3'521'280)/2) - MCFG_DEVICE_PROGRAM_MAP(vip_mem) - MCFG_DEVICE_IO_MAP(vip_io) - MCFG_COSMAC_WAIT_CALLBACK(CONSTANT(1)) - MCFG_COSMAC_CLEAR_CALLBACK(READLINE(*this, vip_state, clear_r)) - MCFG_COSMAC_EF1_CALLBACK(READLINE(*this, vip_state, ef1_r)) - MCFG_COSMAC_EF2_CALLBACK(READLINE(*this, vip_state, ef2_r)) - MCFG_COSMAC_EF3_CALLBACK(READLINE(*this, vip_state, ef3_r)) - MCFG_COSMAC_EF4_CALLBACK(READLINE(*this, vip_state, ef4_r)) - MCFG_COSMAC_Q_CALLBACK(WRITELINE(*this, vip_state, q_w)) - MCFG_COSMAC_DMAR_CALLBACK(READ8(*this, vip_state, dma_r)) - MCFG_COSMAC_DMAW_CALLBACK(WRITE8(*this, vip_state, dma_w)) - MCFG_COSMAC_SC_CALLBACK(WRITE8(*this, vip_state, sc_w)) + CDP1802(config, m_maincpu, 3.52128_MHz_XTAL / 2); + m_maincpu->set_addrmap(AS_PROGRAM, &vip_state::vip_mem); + m_maincpu->set_addrmap(AS_IO, &vip_state::vip_io); + m_maincpu->wait_cb().set_constant(1); + m_maincpu->clear_cb().set(FUNC(vip_state::clear_r)); + m_maincpu->ef1_cb().set(FUNC(vip_state::ef1_r)); + m_maincpu->ef2_cb().set(FUNC(vip_state::ef2_r)); + m_maincpu->ef3_cb().set(FUNC(vip_state::ef3_r)); + m_maincpu->ef4_cb().set(FUNC(vip_state::ef4_r)); + m_maincpu->q_cb().set(FUNC(vip_state::q_w)); + m_maincpu->dma_rd_cb().set(m_exp, FUNC(vip_expansion_slot_device::dma_r)); + m_maincpu->dma_wr_cb().set(m_vdc, FUNC(cdp1861_device::dma_w)); + m_maincpu->dma_wr_cb().append(m_exp, FUNC(vip_expansion_slot_device::dma_w)); + m_maincpu->sc_cb().set(m_exp, FUNC(vip_expansion_slot_device::sc_w)); + m_maincpu->tpb_cb().set(m_exp, FUNC(vip_expansion_slot_device::tpb_w)); // video hardware - MCFG_DEVICE_ADD(CDP1861_TAG, CDP1861, XTAL(3'521'280)/2) + MCFG_DEVICE_ADD(CDP1861_TAG, CDP1861, 3.52128_MHz_XTAL / 2) MCFG_CDP1861_IRQ_CALLBACK(WRITELINE(*this, vip_state, vdc_int_w)) MCFG_CDP1861_DMA_OUT_CALLBACK(WRITELINE(*this, vip_state, vdc_dma_out_w)) MCFG_CDP1861_EFX_CALLBACK(WRITELINE(*this, vip_state, vdc_ef1_w)) - MCFG_CDP1861_SCREEN_ADD(CDP1861_TAG, SCREEN_TAG, XTAL(3'521'280)/2) + MCFG_CDP1861_SCREEN_ADD(CDP1861_TAG, SCREEN_TAG, 3.52128_MHz_XTAL / 2) MCFG_SCREEN_UPDATE_DRIVER(vip_state, screen_update) // sound hardware @@ -745,7 +730,7 @@ MACHINE_CONFIG_START(vip_state::vip) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) MCFG_VIP_BYTEIO_PORT_ADD(VIP_BYTEIO_PORT_TAG, vip_byteio_cards, nullptr, WRITELINE(*this, vip_state, byteio_inst_w)) - MCFG_VIP_EXPANSION_SLOT_ADD(VIP_EXPANSION_SLOT_TAG, XTAL(3'521'280)/2, vip_expansion_cards, nullptr) + MCFG_VIP_EXPANSION_SLOT_ADD(VIP_EXPANSION_SLOT_TAG, 3.52128_MHz_XTAL / 2, vip_expansion_cards, nullptr) MCFG_VIP_EXPANSION_SLOT_INT_CALLBACK(WRITELINE(*this, vip_state, exp_int_w)) MCFG_VIP_EXPANSION_SLOT_DMA_OUT_CALLBACK(WRITELINE(*this, vip_state, exp_dma_out_w)) MCFG_VIP_EXPANSION_SLOT_DMA_IN_CALLBACK(WRITELINE(*this, vip_state, exp_dma_in_w)) diff --git a/src/mame/includes/vip.h b/src/mame/includes/vip.h index 6dd295a0ed3..df8436fff58 100644 --- a/src/mame/includes/vip.h +++ b/src/mame/includes/vip.h @@ -56,38 +56,35 @@ public: void vp111(machine_config &config); void vip(machine_config &config); - DECLARE_INPUT_CHANGED_MEMBER( reset_w ); - DECLARE_INPUT_CHANGED_MEMBER( beeper_w ); + DECLARE_INPUT_CHANGED_MEMBER(reset_w); + DECLARE_INPUT_CHANGED_MEMBER(beeper_w); private: uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); void update_interrupts(); - DECLARE_READ8_MEMBER( read ); - DECLARE_WRITE8_MEMBER( write ); - DECLARE_READ8_MEMBER( io_r ); - DECLARE_WRITE8_MEMBER( io_w ); - - DECLARE_READ_LINE_MEMBER( clear_r ); - DECLARE_READ_LINE_MEMBER( ef1_r ); - DECLARE_READ_LINE_MEMBER( ef2_r ); - DECLARE_READ_LINE_MEMBER( ef3_r ); - DECLARE_READ_LINE_MEMBER( ef4_r ); - DECLARE_WRITE_LINE_MEMBER( q_w ); - DECLARE_READ8_MEMBER( dma_r ); - DECLARE_WRITE8_MEMBER( dma_w ); - DECLARE_WRITE8_MEMBER( sc_w ); - - DECLARE_WRITE_LINE_MEMBER( vdc_int_w ); - DECLARE_WRITE_LINE_MEMBER( vdc_dma_out_w ); - DECLARE_WRITE_LINE_MEMBER( vdc_ef1_w ); - - DECLARE_WRITE_LINE_MEMBER( byteio_inst_w ); - - DECLARE_WRITE_LINE_MEMBER( exp_int_w ); - DECLARE_WRITE_LINE_MEMBER( exp_dma_out_w ); - DECLARE_WRITE_LINE_MEMBER( exp_dma_in_w ); + DECLARE_READ8_MEMBER(read); + DECLARE_WRITE8_MEMBER(write); + DECLARE_READ8_MEMBER(io_r); + DECLARE_WRITE8_MEMBER(io_w); + + DECLARE_READ_LINE_MEMBER(clear_r); + DECLARE_READ_LINE_MEMBER(ef1_r); + DECLARE_READ_LINE_MEMBER(ef2_r); + DECLARE_READ_LINE_MEMBER(ef3_r); + DECLARE_READ_LINE_MEMBER(ef4_r); + DECLARE_WRITE_LINE_MEMBER(q_w); + + DECLARE_WRITE_LINE_MEMBER(vdc_int_w); + DECLARE_WRITE_LINE_MEMBER(vdc_dma_out_w); + DECLARE_WRITE_LINE_MEMBER(vdc_ef1_w); + + DECLARE_WRITE_LINE_MEMBER(byteio_inst_w); + + DECLARE_WRITE_LINE_MEMBER(exp_int_w ); + DECLARE_WRITE_LINE_MEMBER(exp_dma_out_w); + DECLARE_WRITE_LINE_MEMBER(exp_dma_in_w); DECLARE_QUICKLOAD_LOAD_MEMBER( vip ); -- cgit v1.2.3