diff options
author | 2014-03-15 21:26:02 +0000 | |
---|---|---|
committer | 2014-03-15 21:26:02 +0000 | |
commit | fc3c93f7b532a09d9b6e0bef825907f11974d41e (patch) | |
tree | 1c15fe281ac710f8a6417a2b27c037798c4089b3 /src/emu | |
parent | 872845c6b386a4d09e659cc8c9fa0a398f7528d7 (diff) |
(MESS) wangpc: devcb2. (nw)
Diffstat (limited to 'src/emu')
-rw-r--r-- | src/emu/bus/wangpc/wangpc.c | 135 | ||||
-rw-r--r-- | src/emu/bus/wangpc/wangpc.h | 134 |
2 files changed, 105 insertions, 164 deletions
diff --git a/src/emu/bus/wangpc/wangpc.c b/src/emu/bus/wangpc/wangpc.c index 4574fdbe832..ec3782f5cc6 100644 --- a/src/emu/bus/wangpc/wangpc.c +++ b/src/emu/bus/wangpc/wangpc.c @@ -9,15 +9,14 @@ **********************************************************************/ -#include "emu.h" -#include "emuopts.h" #include "wangpc.h" //************************************************************************** -// GLOBAL VARIABLES +// DEVICE DEFINITIONS //************************************************************************** +const device_type WANGPC_BUS = &device_creator<wangpcbus_device>; const device_type WANGPC_BUS_SLOT = &device_creator<wangpcbus_slot_device>; @@ -31,8 +30,8 @@ const device_type WANGPC_BUS_SLOT = &device_creator<wangpcbus_slot_device>; //------------------------------------------------- wangpcbus_slot_device::wangpcbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : - device_t(mconfig, WANGPC_BUS_SLOT, "Wang PC bus slot", tag, owner, clock, "wangpcbus_slot", __FILE__), - device_slot_interface(mconfig, *this) + device_t(mconfig, WANGPC_BUS_SLOT, "Wang PC bus slot", tag, owner, clock, "wangpcbus_slot", __FILE__), + device_slot_interface(mconfig, *this) { } @@ -51,61 +50,26 @@ void wangpcbus_slot_device::device_start() { m_bus = machine().device<wangpcbus_device>(WANGPC_BUS_TAG); device_wangpcbus_card_interface *dev = dynamic_cast<device_wangpcbus_card_interface *>(get_card_device()); - if (dev) m_bus->add_wangpcbus_card(dev, m_sid); + if (dev) m_bus->add_card(dev, m_sid); } - -//************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - -const device_type WANGPC_BUS = &device_creator<wangpcbus_device>; - - -//------------------------------------------------- -// device_config_complete - perform any -// operations now that the configuration is -// complete -//------------------------------------------------- - -void wangpcbus_device::device_config_complete() -{ - // inherit a copy of the static data - const wangpcbus_interface *intf = reinterpret_cast<const wangpcbus_interface *>(static_config()); - if (intf != NULL) - { - *static_cast<wangpcbus_interface *>(this) = *intf; - } - - // or initialize to defaults if none provided - else - { - memset(&m_out_irq2_cb, 0, sizeof(m_out_irq2_cb)); - memset(&m_out_irq3_cb, 0, sizeof(m_out_irq3_cb)); - memset(&m_out_irq4_cb, 0, sizeof(m_out_irq4_cb)); - memset(&m_out_irq5_cb, 0, sizeof(m_out_irq5_cb)); - memset(&m_out_irq6_cb, 0, sizeof(m_out_irq6_cb)); - memset(&m_out_irq7_cb, 0, sizeof(m_out_irq7_cb)); - memset(&m_out_drq1_cb, 0, sizeof(m_out_drq1_cb)); - memset(&m_out_drq2_cb, 0, sizeof(m_out_drq2_cb)); - memset(&m_out_drq3_cb, 0, sizeof(m_out_drq3_cb)); - memset(&m_out_ioerror_cb, 0, sizeof(m_out_ioerror_cb)); - } -} - - - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - //------------------------------------------------- // wangpcbus_device - constructor //------------------------------------------------- wangpcbus_device::wangpcbus_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : - device_t(mconfig, WANGPC_BUS, "Wang PC bus", tag, owner, clock, "wangpcbus", __FILE__) + device_t(mconfig, WANGPC_BUS, "Wang PC bus", tag, owner, clock, "wangpcbus", __FILE__), + m_write_irq2(*this), + m_write_irq3(*this), + m_write_irq4(*this), + m_write_irq5(*this), + m_write_irq6(*this), + m_write_irq7(*this), + m_write_drq1(*this), + m_write_drq2(*this), + m_write_drq3(*this), + m_write_ioerror(*this) { } @@ -117,33 +81,24 @@ wangpcbus_device::wangpcbus_device(const machine_config &mconfig, const char *ta void wangpcbus_device::device_start() { // resolve callbacks - m_out_irq2_func.resolve(m_out_irq2_cb, *this); - m_out_irq3_func.resolve(m_out_irq3_cb, *this); - m_out_irq4_func.resolve(m_out_irq4_cb, *this); - m_out_irq5_func.resolve(m_out_irq5_cb, *this); - m_out_irq6_func.resolve(m_out_irq6_cb, *this); - m_out_irq7_func.resolve(m_out_irq7_cb, *this); - m_out_drq1_func.resolve(m_out_drq1_cb, *this); - m_out_drq2_func.resolve(m_out_drq2_cb, *this); - m_out_drq3_func.resolve(m_out_drq3_cb, *this); - m_out_ioerror_func.resolve(m_out_ioerror_cb, *this); -} - - -//------------------------------------------------- -// device_reset - device-specific reset -//------------------------------------------------- - -void wangpcbus_device::device_reset() -{ + m_write_irq2.resolve_safe(); + m_write_irq3.resolve_safe(); + m_write_irq4.resolve_safe(); + m_write_irq5.resolve_safe(); + m_write_irq6.resolve_safe(); + m_write_irq7.resolve_safe(); + m_write_drq1.resolve_safe(); + m_write_drq2.resolve_safe(); + m_write_drq3.resolve_safe(); + m_write_ioerror.resolve_safe(); } //------------------------------------------------- -// add_wangpcbus_card - add S100 card +// add_card - add card //------------------------------------------------- -void wangpcbus_device::add_wangpcbus_card(device_wangpcbus_card_interface *card, int sid) +void wangpcbus_device::add_card(device_wangpcbus_card_interface *card, int sid) { m_device_list.append(*card); @@ -224,18 +179,6 @@ WRITE16_MEMBER( wangpcbus_device::sad_w ) } -WRITE_LINE_MEMBER( wangpcbus_device::irq2_w ) { m_out_irq2_func(state); } -WRITE_LINE_MEMBER( wangpcbus_device::irq3_w ) { m_out_irq3_func(state); } -WRITE_LINE_MEMBER( wangpcbus_device::irq4_w ) { m_out_irq4_func(state); } -WRITE_LINE_MEMBER( wangpcbus_device::irq5_w ) { m_out_irq5_func(state); } -WRITE_LINE_MEMBER( wangpcbus_device::irq6_w ) { m_out_irq6_func(state); } -WRITE_LINE_MEMBER( wangpcbus_device::irq7_w ) { m_out_irq7_func(state); } -WRITE_LINE_MEMBER( wangpcbus_device::drq1_w ) { m_out_drq1_func(state); } -WRITE_LINE_MEMBER( wangpcbus_device::drq2_w ) { m_out_drq2_func(state); } -WRITE_LINE_MEMBER( wangpcbus_device::drq3_w ) { m_out_drq3_func(state); } -WRITE_LINE_MEMBER( wangpcbus_device::ioerror_w ) { m_out_ioerror_func(state); } - - //------------------------------------------------- // dack_r - DMA read //------------------------------------------------- @@ -279,15 +222,6 @@ void wangpcbus_device::dack_w(address_space &space, int line, UINT8 data) } } -READ8_MEMBER( wangpcbus_device::dack0_r ) { return dack_r(space, 0); } -WRITE8_MEMBER( wangpcbus_device::dack0_w ) { dack_w(space, 0, data); } -READ8_MEMBER( wangpcbus_device::dack1_r ) { return dack_r(space, 1); } -WRITE8_MEMBER( wangpcbus_device::dack1_w ) { dack_w(space, 1, data); } -READ8_MEMBER( wangpcbus_device::dack2_r ) { return dack_r(space, 2); } -WRITE8_MEMBER( wangpcbus_device::dack2_w ) { dack_w(space, 2, data); } -READ8_MEMBER( wangpcbus_device::dack3_r ) { return dack_r(space, 3); } -WRITE8_MEMBER( wangpcbus_device::dack3_w ) { dack_w(space, 3, data); } - //------------------------------------------------- // tc_w - terminal count @@ -314,23 +248,14 @@ WRITE_LINE_MEMBER( wangpcbus_device::tc_w ) // device_wangpcbus_card_interface - constructor //------------------------------------------------- -device_wangpcbus_card_interface::device_wangpcbus_card_interface(const machine_config &mconfig, device_t &device) - : device_slot_card_interface(mconfig, device) +device_wangpcbus_card_interface::device_wangpcbus_card_interface(const machine_config &mconfig, device_t &device) : + device_slot_card_interface(mconfig, device) { m_slot = dynamic_cast<wangpcbus_slot_device *>(device.owner()); } //------------------------------------------------- -// ~device_wangpcbus_card_interface - destructor -//------------------------------------------------- - -device_wangpcbus_card_interface::~device_wangpcbus_card_interface() -{ -} - - -//------------------------------------------------- // SLOT_INTERFACE( wangpc_cards ) //------------------------------------------------- diff --git a/src/emu/bus/wangpc/wangpc.h b/src/emu/bus/wangpc/wangpc.h index 55f2423e80c..11af0a455ca 100644 --- a/src/emu/bus/wangpc/wangpc.h +++ b/src/emu/bus/wangpc/wangpc.h @@ -33,14 +33,8 @@ // INTERFACE CONFIGURATION MACROS //************************************************************************** -#define MCFG_WANGPC_BUS_ADD(_config) \ - MCFG_DEVICE_ADD(WANGPC_BUS_TAG, WANGPC_BUS, 0) \ - MCFG_DEVICE_CONFIG(_config) - - -#define WANGPC_BUS_INTERFACE(_name) \ - const wangpcbus_interface (_name) = - +#define MCFG_WANGPC_BUS_ADD() \ + MCFG_DEVICE_ADD(WANGPC_BUS_TAG, WANGPC_BUS, 0) #define MCFG_WANGPC_BUS_SLOT_ADD(_tag, _sid, _slot_intf, _def_slot) \ MCFG_DEVICE_ADD(_tag, WANGPC_BUS_SLOT, 0) \ @@ -48,6 +42,36 @@ wangpcbus_slot_device::static_set_wangpcbus_slot(*device, _sid); +#define MCFG_WANGPC_BUS_IRQ2_CALLBACK(_write) \ + devcb = &wangpcbus_device::set_irq2_wr_callback(*device, DEVCB2_##_write); + +#define MCFG_WANGPC_BUS_IRQ3_CALLBACK(_write) \ + devcb = &wangpcbus_device::set_irq3_wr_callback(*device, DEVCB2_##_write); + +#define MCFG_WANGPC_BUS_IRQ4_CALLBACK(_write) \ + devcb = &wangpcbus_device::set_irq4_wr_callback(*device, DEVCB2_##_write); + +#define MCFG_WANGPC_BUS_IRQ5_CALLBACK(_write) \ + devcb = &wangpcbus_device::set_irq5_wr_callback(*device, DEVCB2_##_write); + +#define MCFG_WANGPC_BUS_IRQ6_CALLBACK(_write) \ + devcb = &wangpcbus_device::set_irq6_wr_callback(*device, DEVCB2_##_write); + +#define MCFG_WANGPC_BUS_IRQ7_CALLBACK(_write) \ + devcb = &wangpcbus_device::set_irq7_wr_callback(*device, DEVCB2_##_write); + +#define MCFG_WANGPC_BUS_DRQ1_CALLBACK(_write) \ + devcb = &wangpcbus_device::set_drq1_wr_callback(*device, DEVCB2_##_write); + +#define MCFG_WANGPC_BUS_DRQ2_CALLBACK(_write) \ + devcb = &wangpcbus_device::set_drq2_wr_callback(*device, DEVCB2_##_write); + +#define MCFG_WANGPC_BUS_DRQ3_CALLBACK(_write) \ + devcb = &wangpcbus_device::set_drq3_wr_callback(*device, DEVCB2_##_write); + +#define MCFG_WANGPC_BUS_IOERROR_CALLBACK(_write) \ + devcb = &wangpcbus_device::set_ioerror_wr_callback(*device, DEVCB2_##_write); + //************************************************************************** // TYPE DEFINITIONS @@ -58,7 +82,7 @@ class wangpcbus_device; class wangpcbus_slot_device : public device_t, - public device_slot_interface + public device_slot_interface { public: // construction/destruction @@ -81,36 +105,30 @@ private: extern const device_type WANGPC_BUS_SLOT; -// ======================> wangpcbus_interface - -struct wangpcbus_interface -{ - devcb_write_line m_out_irq2_cb; - devcb_write_line m_out_irq3_cb; - devcb_write_line m_out_irq4_cb; - devcb_write_line m_out_irq5_cb; - devcb_write_line m_out_irq6_cb; - devcb_write_line m_out_irq7_cb; - devcb_write_line m_out_drq1_cb; - devcb_write_line m_out_drq2_cb; - devcb_write_line m_out_drq3_cb; - devcb_write_line m_out_ioerror_cb; -}; - class device_wangpcbus_card_interface; // ======================> wangpcbus_device -class wangpcbus_device : public device_t, - public wangpcbus_interface +class wangpcbus_device : public device_t { public: // construction/destruction wangpcbus_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); ~wangpcbus_device() { m_device_list.detach_all(); } - void add_wangpcbus_card(device_wangpcbus_card_interface *card, int sid); + template<class _Object> static devcb2_base &set_irq2_wr_callback(device_t &device, _Object object) { return downcast<wangpcbus_device &>(device).m_write_irq2.set_callback(object); } + template<class _Object> static devcb2_base &set_irq3_wr_callback(device_t &device, _Object object) { return downcast<wangpcbus_device &>(device).m_write_irq3.set_callback(object); } + template<class _Object> static devcb2_base &set_irq4_wr_callback(device_t &device, _Object object) { return downcast<wangpcbus_device &>(device).m_write_irq4.set_callback(object); } + template<class _Object> static devcb2_base &set_irq5_wr_callback(device_t &device, _Object object) { return downcast<wangpcbus_device &>(device).m_write_irq5.set_callback(object); } + template<class _Object> static devcb2_base &set_irq6_wr_callback(device_t &device, _Object object) { return downcast<wangpcbus_device &>(device).m_write_irq6.set_callback(object); } + template<class _Object> static devcb2_base &set_irq7_wr_callback(device_t &device, _Object object) { return downcast<wangpcbus_device &>(device).m_write_irq7.set_callback(object); } + template<class _Object> static devcb2_base &set_drq1_wr_callback(device_t &device, _Object object) { return downcast<wangpcbus_device &>(device).m_write_drq1.set_callback(object); } + template<class _Object> static devcb2_base &set_drq2_wr_callback(device_t &device, _Object object) { return downcast<wangpcbus_device &>(device).m_write_drq2.set_callback(object); } + template<class _Object> static devcb2_base &set_drq3_wr_callback(device_t &device, _Object object) { return downcast<wangpcbus_device &>(device).m_write_drq3.set_callback(object); } + template<class _Object> static devcb2_base &set_ioerror_wr_callback(device_t &device, _Object object) { return downcast<wangpcbus_device &>(device).m_write_ioerror.set_callback(object); } + + void add_card(device_wangpcbus_card_interface *card, int sid); // computer interface DECLARE_READ16_MEMBER( mrdc_r ); @@ -122,46 +140,44 @@ public: UINT8 dack_r(address_space &space, int line); void dack_w(address_space &space, int line, UINT8 data); - DECLARE_READ8_MEMBER( dack0_r ); - DECLARE_WRITE8_MEMBER( dack0_w ); - DECLARE_READ8_MEMBER( dack1_r ); - DECLARE_WRITE8_MEMBER( dack1_w ); - DECLARE_READ8_MEMBER( dack2_r ); - DECLARE_WRITE8_MEMBER( dack2_w ); - DECLARE_READ8_MEMBER( dack3_r ); - DECLARE_WRITE8_MEMBER( dack3_w ); + DECLARE_READ8_MEMBER( dack0_r ) { return dack_r(space, 0); } + DECLARE_WRITE8_MEMBER( dack0_w ) { dack_w(space, 0, data); } + DECLARE_READ8_MEMBER( dack1_r ) { return dack_r(space, 1); } + DECLARE_WRITE8_MEMBER( dack1_w ) { dack_w(space, 1, data); } + DECLARE_READ8_MEMBER( dack2_r ) { return dack_r(space, 2); } + DECLARE_WRITE8_MEMBER( dack2_w ) { dack_w(space, 2, data); } + DECLARE_READ8_MEMBER( dack3_r ) { return dack_r(space, 3); } + DECLARE_WRITE8_MEMBER( dack3_w ) { dack_w(space, 3, data); } DECLARE_WRITE_LINE_MEMBER( tc_w ); // peripheral interface - DECLARE_WRITE_LINE_MEMBER( irq2_w ); - DECLARE_WRITE_LINE_MEMBER( irq3_w ); - DECLARE_WRITE_LINE_MEMBER( irq4_w ); - DECLARE_WRITE_LINE_MEMBER( irq5_w ); - DECLARE_WRITE_LINE_MEMBER( irq6_w ); - DECLARE_WRITE_LINE_MEMBER( irq7_w ); - DECLARE_WRITE_LINE_MEMBER( drq1_w ); - DECLARE_WRITE_LINE_MEMBER( drq2_w ); - DECLARE_WRITE_LINE_MEMBER( drq3_w ); - DECLARE_WRITE_LINE_MEMBER( ioerror_w ); + DECLARE_WRITE_LINE_MEMBER( irq2_w ) { m_write_irq2(state); } + DECLARE_WRITE_LINE_MEMBER( irq3_w ) { m_write_irq3(state); } + DECLARE_WRITE_LINE_MEMBER( irq4_w ) { m_write_irq4(state); } + DECLARE_WRITE_LINE_MEMBER( irq5_w ) { m_write_irq5(state); } + DECLARE_WRITE_LINE_MEMBER( irq6_w ) { m_write_irq6(state); } + DECLARE_WRITE_LINE_MEMBER( irq7_w ) { m_write_irq7(state); } + DECLARE_WRITE_LINE_MEMBER( drq1_w ) { m_write_drq1(state); } + DECLARE_WRITE_LINE_MEMBER( drq2_w ) { m_write_drq2(state); } + DECLARE_WRITE_LINE_MEMBER( drq3_w ) { m_write_drq3(state); } + DECLARE_WRITE_LINE_MEMBER( ioerror_w ) { m_write_ioerror(state); } protected: // device-level overrides virtual void device_start(); - virtual void device_reset(); - virtual void device_config_complete(); private: - devcb_resolved_write_line m_out_irq2_func; - devcb_resolved_write_line m_out_irq3_func; - devcb_resolved_write_line m_out_irq4_func; - devcb_resolved_write_line m_out_irq5_func; - devcb_resolved_write_line m_out_irq6_func; - devcb_resolved_write_line m_out_irq7_func; - devcb_resolved_write_line m_out_drq1_func; - devcb_resolved_write_line m_out_drq2_func; - devcb_resolved_write_line m_out_drq3_func; - devcb_resolved_write_line m_out_ioerror_func; + devcb2_write_line m_write_irq2; + devcb2_write_line m_write_irq3; + devcb2_write_line m_write_irq4; + devcb2_write_line m_write_irq5; + devcb2_write_line m_write_irq6; + devcb2_write_line m_write_irq7; + devcb2_write_line m_write_drq1; + devcb2_write_line m_write_drq2; + devcb2_write_line m_write_drq3; + devcb2_write_line m_write_ioerror; simple_list<device_wangpcbus_card_interface> m_device_list; }; @@ -181,7 +197,7 @@ class device_wangpcbus_card_interface : public device_slot_card_interface public: // construction/destruction device_wangpcbus_card_interface(const machine_config &mconfig, device_t &device); - virtual ~device_wangpcbus_card_interface(); + virtual ~device_wangpcbus_card_interface() { } device_wangpcbus_card_interface *next() const { return m_next; } |