summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu
diff options
context:
space:
mode:
author Curt Coder <curtcoder@mail.com>2014-03-15 21:26:02 +0000
committer Curt Coder <curtcoder@mail.com>2014-03-15 21:26:02 +0000
commitfc3c93f7b532a09d9b6e0bef825907f11974d41e (patch)
tree1c15fe281ac710f8a6417a2b27c037798c4089b3 /src/emu
parent872845c6b386a4d09e659cc8c9fa0a398f7528d7 (diff)
(MESS) wangpc: devcb2. (nw)
Diffstat (limited to 'src/emu')
-rw-r--r--src/emu/bus/wangpc/wangpc.c135
-rw-r--r--src/emu/bus/wangpc/wangpc.h134
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; }