summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Ivan Vangelista <mesgnet@yahoo.it>2014-04-02 16:37:21 +0000
committer Ivan Vangelista <mesgnet@yahoo.it>2014-04-02 16:37:21 +0000
commita19ec247750b7f606ac6a3cd60c7c10b9477cf3c (patch)
treea44e645662c77fa6c8ab9adbb3f3a747afa78b84 /src
parent880613a70aff06efeac97398ae6cad2c8bd52040 (diff)
lh5810_device: converted to devcb2 (nw)
Diffstat (limited to 'src')
-rw-r--r--src/emu/machine/lh5810.c63
-rw-r--r--src/emu/machine/lh5810.h57
-rw-r--r--src/mess/drivers/pc1500.c17
3 files changed, 59 insertions, 78 deletions
diff --git a/src/emu/machine/lh5810.c b/src/emu/machine/lh5810.c
index c64e478b17f..296a28a60ec 100644
--- a/src/emu/machine/lh5810.c
+++ b/src/emu/machine/lh5810.c
@@ -19,33 +19,6 @@
const device_type LH5810 = &device_creator<lh5810_device>;
-
-//-------------------------------------------------
-// device_config_complete - perform any
-// operations now that the configuration is
-// complete
-//-------------------------------------------------
-
-void lh5810_device::device_config_complete()
-{
- // inherit a copy of the static data
- const lh5810_interface *intf = reinterpret_cast<const lh5810_interface *>(static_config());
- if (intf != NULL)
- *static_cast<lh5810_interface *>(this) = *intf;
-
- // or initialize to defaults if none provided
- else
- {
- memset(&m_porta_r_cb, 0, sizeof(m_porta_r_cb));
- memset(&m_porta_w_cb, 0, sizeof(m_porta_w_cb));
- memset(&m_portb_r_cb, 0, sizeof(m_portb_r_cb));
- memset(&m_portb_w_cb, 0, sizeof(m_portb_w_cb));
- memset(&m_portc_w_cb, 0, sizeof(m_portc_w_cb));
- memset(&m_out_int_cb, 0, sizeof(m_out_int_cb));
- }
-}
-
-
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
@@ -55,7 +28,13 @@ void lh5810_device::device_config_complete()
//-------------------------------------------------
lh5810_device::lh5810_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
- : device_t(mconfig, LH5810, "LH5810", tag, owner, clock, "lh5810", __FILE__)
+ : device_t(mconfig, LH5810, "LH5810", tag, owner, clock, "lh5810", __FILE__),
+ m_porta_r_cb(*this),
+ m_porta_w_cb(*this),
+ m_portb_r_cb(*this),
+ m_portb_w_cb(*this),
+ m_portc_w_cb(*this),
+ m_out_int_cb(*this)
{
}
@@ -67,12 +46,12 @@ lh5810_device::lh5810_device(const machine_config &mconfig, const char *tag, dev
void lh5810_device::device_start()
{
// resolve callbacks
- m_porta_r_func.resolve(m_porta_r_cb, *this);
- m_porta_w_func.resolve(m_porta_w_cb, *this);
- m_portb_r_func.resolve(m_portb_r_cb, *this);
- m_portb_w_func.resolve(m_portb_w_cb, *this);
- m_portc_w_func.resolve(m_portc_w_cb, *this);
- m_out_int_func.resolve(m_out_int_cb, *this);
+ m_porta_r_cb.resolve_safe(0);
+ m_porta_w_cb.resolve_safe();
+ m_portb_r_cb.resolve_safe(0);
+ m_portb_w_cb.resolve_safe();
+ m_portc_w_cb.resolve_safe();
+ m_out_int_cb.resolve_safe();
// register for state saving
save_item(NAME(m_irq));
@@ -109,7 +88,7 @@ READ8_MEMBER( lh5810_device::data_r )
return m_reg[offset];
case LH5810_IF:
- if (BIT(m_portb_r_func(0) & ~m_reg[LH5810_DDB], 7))
+ if (BIT(m_portb_r_cb(0) & ~m_reg[LH5810_DDB], 7))
m_reg[offset] |= 2;
else
m_reg[offset] &= 0xfd;
@@ -120,12 +99,12 @@ READ8_MEMBER( lh5810_device::data_r )
return (m_reg[offset]&0x0f) | (m_irq<<4) | (BIT(m_reg[LH5810_OPB],7)<<5);
case LH5810_OPA:
- m_reg[offset] = (m_reg[offset] & m_reg[LH5810_DDA]) | (m_porta_r_func(0) & ~m_reg[LH5810_DDA]);
+ m_reg[offset] = (m_reg[offset] & m_reg[LH5810_DDA]) | (m_porta_r_cb(0) & ~m_reg[LH5810_DDA]);
return m_reg[offset];
case LH5810_OPB:
- m_reg[offset] = (m_reg[offset] & m_reg[LH5810_DDB]) | (m_portb_r_func(0) & ~m_reg[LH5810_DDB]);
- m_out_int_func((m_reg[offset] & 0x80 && m_reg[LH5810_MSK] & 0x02) ? ASSERT_LINE : CLEAR_LINE);
+ m_reg[offset] = (m_reg[offset] & m_reg[LH5810_DDB]) | (m_portb_r_cb(0) & ~m_reg[LH5810_DDB]);
+ m_out_int_cb((m_reg[offset] & 0x80 && m_reg[LH5810_MSK] & 0x02) ? ASSERT_LINE : CLEAR_LINE);
return m_reg[offset];
default:
@@ -175,18 +154,18 @@ WRITE8_MEMBER( lh5810_device::data_w )
case LH5810_OPA:
m_reg[offset] = (data & m_reg[LH5810_DDA]) | (m_reg[offset] & ~m_reg[LH5810_DDA]);
- m_porta_w_func(0, m_reg[offset]);
+ m_porta_w_cb((offs_t)0, m_reg[offset]);
break;
case LH5810_OPB:
m_reg[offset] = (data & m_reg[LH5810_DDB]) | (m_reg[offset] & ~m_reg[LH5810_DDB]);
- m_portb_w_func(0, m_reg[offset]);
- m_out_int_func((m_reg[offset] & 0x80 && m_reg[LH5810_MSK] & 0x02) ? ASSERT_LINE : CLEAR_LINE);
+ m_portb_w_cb((offs_t)0, m_reg[offset]);
+ m_out_int_cb((m_reg[offset] & 0x80 && m_reg[LH5810_MSK] & 0x02) ? ASSERT_LINE : CLEAR_LINE);
break;
case LH5810_OPC:
m_reg[offset] = data;
- m_portc_w_func(0, m_reg[offset]);
+ m_portc_w_cb((offs_t)0, m_reg[offset]);
break;
}
}
diff --git a/src/emu/machine/lh5810.h b/src/emu/machine/lh5810.h
index 3a5e9c5eee1..4f70a48db84 100644
--- a/src/emu/machine/lh5810.h
+++ b/src/emu/machine/lh5810.h
@@ -38,9 +38,23 @@ enum
// INTERFACE CONFIGURATION MACROS
//*************************************************************************
-#define MCFG_LH5810_ADD(_tag, _config) \
- MCFG_DEVICE_ADD((_tag), LH5810, 0) \
- MCFG_DEVICE_CONFIG(_config)
+#define MCFG_LH5810_PORTA_R_CB(_devcb) \
+ devcb = &lh5810_device::set_porta_r_callback(*device, DEVCB2_##_devcb);
+
+#define MCFG_LH5810_PORTA_W_CB(_devcb) \
+ devcb = &lh5810_device::set_porta_w_callback(*device, DEVCB2_##_devcb);
+
+#define MCFG_LH5810_PORTB_R_CB(_devcb) \
+ devcb = &lh5810_device::set_portb_r_callback(*device, DEVCB2_##_devcb);
+
+#define MCFG_LH5810_PORTB_W_CB(_devcb) \
+ devcb = &lh5810_device::set_portb_w_callback(*device, DEVCB2_##_devcb);
+
+#define MCFG_LH5810_PORTC_W_CB(_devcb) \
+ devcb = &lh5810_device::set_portc_w_callback(*device, DEVCB2_##_devcb);
+
+#define MCFG_LH5810_OUT_INT_CB(_devcb) \
+ devcb = &lh5810_device::set_out_int_callback(*device, DEVCB2_##_devcb); //currently unused
@@ -48,28 +62,21 @@ enum
// TYPE DEFINITIONS
//*************************************************************************
-// ======================> lh5810_interface
-
-struct lh5810_interface
-{
- devcb_read8 m_porta_r_cb; //port A read
- devcb_write8 m_porta_w_cb; //port A write
- devcb_read8 m_portb_r_cb; //port B read
- devcb_write8 m_portb_w_cb; //port B write
- devcb_write8 m_portc_w_cb; //port C write
-
- devcb_write_line m_out_int_cb; //IRQ callback
-};
-
// ======================> lh5810_device
-class lh5810_device : public device_t,
- public lh5810_interface
+class lh5810_device : public device_t
{
public:
// construction/destruction
lh5810_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ template<class _Object> static devcb2_base &set_porta_r_callback(device_t &device, _Object object) { return downcast<lh5810_device &>(device).m_porta_r_cb.set_callback(object); }
+ template<class _Object> static devcb2_base &set_porta_w_callback(device_t &device, _Object object) { return downcast<lh5810_device &>(device).m_porta_w_cb.set_callback(object); }
+ template<class _Object> static devcb2_base &set_portb_r_callback(device_t &device, _Object object) { return downcast<lh5810_device &>(device).m_portb_r_cb.set_callback(object); }
+ template<class _Object> static devcb2_base &set_portb_w_callback(device_t &device, _Object object) { return downcast<lh5810_device &>(device).m_portb_w_cb.set_callback(object); }
+ template<class _Object> static devcb2_base &set_portc_w_callback(device_t &device, _Object object) { return downcast<lh5810_device &>(device).m_portc_w_cb.set_callback(object); }
+ template<class _Object> static devcb2_base &set_out_int_callback(device_t &device, _Object object) { return downcast<lh5810_device &>(device).m_out_int_cb.set_callback(object); }
+
DECLARE_READ8_MEMBER( data_r );
DECLARE_WRITE8_MEMBER( data_w );
@@ -77,16 +84,16 @@ protected:
// device-level overrides
virtual void device_start();
virtual void device_reset();
- virtual void device_config_complete();
private:
- devcb_resolved_read8 m_porta_r_func;
- devcb_resolved_write8 m_porta_w_func;
- devcb_resolved_read8 m_portb_r_func;
- devcb_resolved_write8 m_portb_w_func;
- devcb_resolved_write8 m_portc_w_func;
- devcb_resolved_write_line m_out_int_func;
+ devcb2_read8 m_porta_r_cb; //port A read
+ devcb2_write8 m_porta_w_cb; //port A write
+ devcb2_read8 m_portb_r_cb; //port B read
+ devcb2_write8 m_portb_w_cb; //port B write
+ devcb2_write8 m_portc_w_cb; //port C write
+
+ devcb2_write_line m_out_int_cb; //IRQ callback
UINT8 m_reg[0x10];
UINT8 m_irq;
diff --git a/src/mess/drivers/pc1500.c b/src/mess/drivers/pc1500.c
index 995443354ee..69bb6d67304 100644
--- a/src/mess/drivers/pc1500.c
+++ b/src/mess/drivers/pc1500.c
@@ -264,16 +264,6 @@ PALETTE_INIT_MEMBER(pc1500_state, pc1500)
palette.set_pen_color(1, rgb_t(92, 83, 88));
}
-static const lh5810_interface lh5810_pc1500_config =
-{
- DEVCB_DRIVER_MEMBER(pc1500_state, port_a_r), //port A read
- DEVCB_DRIVER_MEMBER(pc1500_state, kb_matrix_w), //port A write
- DEVCB_DRIVER_MEMBER(pc1500_state, port_b_r), //port B read
- DEVCB_NULL, //port B write
- DEVCB_DRIVER_MEMBER(pc1500_state, port_c_w), //port C write
- DEVCB_CPU_INPUT_LINE("maincpu", LH5801_LINE_MI) //IRQ callback
-};
-
static MACHINE_CONFIG_START( pc1500, pc1500_state )
MCFG_CPU_ADD("maincpu", LH5801, 1300000) //1.3 MHz
MCFG_CPU_PROGRAM_MAP( pc1500_mem )
@@ -292,7 +282,12 @@ static MACHINE_CONFIG_START( pc1500, pc1500_state )
MCFG_PALETTE_ADD("palette", 2)
MCFG_PALETTE_INIT_OWNER(pc1500_state, pc1500)
- MCFG_LH5810_ADD("lh5810", lh5810_pc1500_config)
+ MCFG_DEVICE_ADD("lh5810", LH5810, 0)
+ MCFG_LH5810_PORTA_R_CB(READ8(pc1500_state, port_a_r))
+ MCFG_LH5810_PORTA_W_CB(WRITE8(pc1500_state, kb_matrix_w))
+ MCFG_LH5810_PORTB_R_CB(READ8(pc1500_state, port_b_r))
+ MCFG_LH5810_PORTC_W_CB(WRITE8(pc1500_state, port_c_w))
+ MCFG_LH5810_OUT_INT_CB(INPUTLINE("maincpu", LH5801_LINE_MI))
MCFG_UPD1990A_ADD("upd1990a", XTAL_32_768kHz, NULL, NULL)
MACHINE_CONFIG_END