summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Ryan Holtz <rholtz@batcountryentertainment.com>2010-08-27 05:37:56 +0000
committer Ryan Holtz <rholtz@batcountryentertainment.com>2010-08-27 05:37:56 +0000
commit4cc59054e0f8c95d7429a4792802bd3f0be73aff (patch)
treef0726e9aeb7c94436079386d150b3eb0fb8525af
parent04aa0a09eb1d89ce905fe7dd523d92b0ef8b0f0f (diff)
Updated the INS 8154 RAM I/O device to no longer be legacy. [Harmony]
Non-whatsnew note: For MESS.
-rw-r--r--src/emu/machine/6821pia.c2
-rw-r--r--src/emu/machine/ins8154.c262
-rw-r--r--src/emu/machine/ins8154.h116
3 files changed, 227 insertions, 153 deletions
diff --git a/src/emu/machine/6821pia.c b/src/emu/machine/6821pia.c
index 9daf6e88caa..d6026d20632 100644
--- a/src/emu/machine/6821pia.c
+++ b/src/emu/machine/6821pia.c
@@ -85,7 +85,9 @@ void pia6821_device_config::device_config_complete()
// inherit a copy of the static data
const pia6821_interface *intf = reinterpret_cast<const pia6821_interface *>(static_config());
if (intf != NULL)
+ {
*static_cast<pia6821_interface *>(this) = *intf;
+ }
// or initialize to defaults if none provided
else
diff --git a/src/emu/machine/ins8154.c b/src/emu/machine/ins8154.c
index 27d3e80c5ee..54e818a1b73 100644
--- a/src/emu/machine/ins8154.c
+++ b/src/emu/machine/ins8154.c
@@ -11,6 +11,7 @@
#include "emu.h"
#include "ins8154.h"
+#include "devhelpr.h"
/***************************************************************************
@@ -30,85 +31,135 @@ enum
/***************************************************************************
- TYPE DEFINITIONS
+ IMPLEMENTATION
***************************************************************************/
-typedef struct _ins8154_state ins8154_state;
-struct _ins8154_state
+//**************************************************************************
+// DEVICE CONFIGURATION
+//**************************************************************************
+
+GENERIC_DEVICE_CONFIG_SETUP(ins8154, "INS8154")
+
+//-------------------------------------------------
+// device_config_complete - perform any
+// operations now that the configuration is
+// complete
+//-------------------------------------------------
+
+void ins8154_device_config::device_config_complete()
{
- /* i/o lines */
- devcb_resolved_read8 in_a_func;
- devcb_resolved_write8 out_a_func;
- devcb_resolved_read8 in_b_func;
- devcb_resolved_write8 out_b_func;
- devcb_resolved_write_line out_irq_func;
-
- /* registers */
- UINT8 in_a; /* Input Latch Port A */
- UINT8 in_b; /* Input Latch Port B */
- UINT8 out_a; /* Output Latch Port A */
- UINT8 out_b; /* Output Latch Port B */
- UINT8 mdr; /* Mode Definition Register */
- UINT8 odra; /* Output Definition Register Port A */
- UINT8 odrb; /* Output Definition Register Port B */
-};
+ // inherit a copy of the static data
+ const ins8154_interface *intf = reinterpret_cast<const ins8154_interface *>(static_config());
+ if (intf != NULL)
+ {
+ *static_cast<ins8154_interface *>(this) = *intf;
+ }
+ // or initialize to defaults if none provided
+ else
+ {
+ memset(&m_in_a_func, 0, sizeof(m_in_a_func));
+ memset(&m_in_b_func, 0, sizeof(m_in_b_func));
+ memset(&m_out_a_func, 0, sizeof(m_out_a_func));
+ memset(&m_out_b_func, 0, sizeof(m_out_b_func));
+ memset(&m_out_irq_func, 0, sizeof(m_out_irq_func));
+ }
+}
+
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
-/*****************************************************************************
- INLINE FUNCTIONS
-*****************************************************************************/
+const device_type INS8154 = ins8154_device_config::static_alloc_device_config;
-INLINE ins8154_state *get_safe_token(running_device *device)
+//-------------------------------------------------
+// ins8154_device - constructor
+//-------------------------------------------------
+
+ins8154_device::ins8154_device(running_machine &_machine, const ins8154_device_config &config)
+ : device_t(_machine, config),
+ m_config(config)
{
- assert(device != NULL);
- assert(device->type() == INS8154);
- return (ins8154_state *)downcast<legacy_device_base *>(device)->token();
}
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
-/***************************************************************************
- IMPLEMENTATION
-***************************************************************************/
+void ins8154_device::device_start()
+{
+ /* resolve callbacks */
+ devcb_resolve_read8(&m_in_a_func, &m_config.m_in_a_func, this);
+ devcb_resolve_write8(&m_out_a_func, &m_config.m_out_a_func, this);
+ devcb_resolve_read8(&m_in_b_func, &m_config.m_in_b_func, this);
+ devcb_resolve_write8(&m_out_b_func, &m_config.m_out_b_func, this);
+ devcb_resolve_write_line(&m_out_irq_func, &m_config.m_out_irq_func, this);
+
+ /* register for state saving */
+ state_save_register_device_item(this, 0, m_in_a);
+ state_save_register_device_item(this, 0, m_in_b);
+ state_save_register_device_item(this, 0, m_out_a);
+ state_save_register_device_item(this, 0, m_out_b);
+ state_save_register_device_item(this, 0, m_mdr);
+ state_save_register_device_item(this, 0, m_odra);
+ state_save_register_device_item(this, 0, m_odrb);
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void ins8154_device::device_reset()
+{
+ m_in_a = 0;
+ m_in_b = 0;
+ m_out_a = 0;
+ m_out_b = 0;
+ m_mdr = 0;
+ m_odra = 0;
+ m_odrb = 0;
+}
-READ8_DEVICE_HANDLER( ins8154_r )
+
+READ8_DEVICE_HANDLER_TRAMPOLINE(ins8154, ins8154_r)
{
- ins8154_state *ins8154 = get_safe_token(device);
UINT8 val = 0xff;
if (offset > 0x24)
{
if (VERBOSE)
- logerror("%s: INS8154 '%s' Read from invalid offset %02x!\n", cpuexec_describe_context(device->machine), device->tag(), offset);
+ {
+ logerror("%s: INS8154 '%s' Read from invalid offset %02x!\n", cpuexec_describe_context(&m_machine), tag(), offset);
+ }
return 0xff;
}
switch (offset)
{
case 0x20:
- if (ins8154->in_a_func.read != NULL)
- val = devcb_call_read8(&ins8154->in_a_func, 0);
- ins8154->in_a = val;
+ val = devcb_call_read8(&m_in_a_func, 0);
+ m_in_a = val;
break;
case 0x21:
- if (ins8154->in_b_func.read != NULL)
- val = devcb_call_read8(&ins8154->in_b_func, 0);
- ins8154->in_b = val;
+ val = devcb_call_read8(&m_in_b_func, 0);
+ m_in_b = val;
break;
default:
if (offset < 0x08)
{
- if (ins8154->in_a_func.read != NULL)
- val = (devcb_call_read8(&ins8154->in_a_func, 0) << (8 - offset)) & 0x80;
- ins8154->in_a = val;
+ val = (devcb_call_read8(&m_in_a_func, 0) << (8 - offset)) & 0x80;
+ m_in_a = val;
}
else
{
- if (ins8154->in_b_func.read != NULL)
- val = (devcb_call_read8(&ins8154->in_b_func, 0) << (8 - (offset >> 4))) & 0x80;
- ins8154->in_b = val;
+ val = (devcb_call_read8(&m_in_b_func, 0) << (8 - (offset >> 4))) & 0x80;
+ m_in_b = val;
}
break;
}
@@ -116,68 +167,74 @@ READ8_DEVICE_HANDLER( ins8154_r )
return val;
}
-WRITE8_DEVICE_HANDLER( ins8154_porta_w )
+WRITE8_DEVICE_HANDLER_TRAMPOLINE(ins8154, ins8154_porta_w)
{
- ins8154_state *ins8154 = get_safe_token(device);
-
- ins8154->out_a = data;
+ m_out_a = data;
/* Test if any pins are set as outputs */
- if (ins8154->odra)
- devcb_call_write8(&ins8154->out_a_func, 0, (data & ins8154->odra) | (ins8154->odra ^ 0xff));
+ if (m_odra)
+ {
+ devcb_call_write8(&m_out_a_func, 0, (data & m_odra) | (m_odra ^ 0xff));
+ }
}
-WRITE8_DEVICE_HANDLER( ins8154_portb_w )
+WRITE8_DEVICE_HANDLER_TRAMPOLINE(ins8154, ins8154_portb_w)
{
- ins8154_state *ins8154 = get_safe_token(device);
-
- ins8154->out_b = data;
+ m_out_b = data;
/* Test if any pins are set as outputs */
- if (ins8154->odrb)
- devcb_call_write8(&ins8154->out_b_func, 0, (data & ins8154->odrb) | (ins8154->odrb ^ 0xff));
+ if (m_odrb)
+ {
+ devcb_call_write8(&m_out_b_func, 0, (data & m_odrb) | (m_odrb ^ 0xff));
+ }
}
-WRITE8_DEVICE_HANDLER( ins8154_w )
+WRITE8_DEVICE_HANDLER_TRAMPOLINE(ins8154, ins8154_w)
{
- ins8154_state *ins8154 = get_safe_token(device);
-
if (offset > 0x24)
{
if (VERBOSE)
- logerror("%s: INS8154 '%s' Write %02x to invalid offset %02x!\n", cpuexec_describe_context(device->machine), device->tag(), data, offset);
+ {
+ logerror("%s: INS8154 '%s' Write %02x to invalid offset %02x!\n", cpuexec_describe_context(&m_machine), tag(), data, offset);
+ }
return;
}
switch (offset)
{
case 0x20:
- ins8154_porta_w(device, 0, data);
+ ins8154_porta_w(0, data);
break;
case 0x21:
- ins8154_portb_w(device, 0, data);
+ ins8154_portb_w(0, data);
break;
case 0x22:
if (VERBOSE)
- logerror("%s: INS8154 '%s' ODRA set to %02x\n", cpuexec_describe_context(device->machine), device->tag(), data);
+ {
+ logerror("%s: INS8154 '%s' ODRA set to %02x\n", cpuexec_describe_context(&m_machine), tag(), data);
+ }
- ins8154->odra = data;
+ m_odra = data;
break;
case 0x23:
if (VERBOSE)
- logerror("%s: INS8154 '%s' ODRB set to %02x\n", cpuexec_describe_context(device->machine), device->tag(), data);
+ {
+ logerror("%s: INS8154 '%s' ODRB set to %02x\n", cpuexec_describe_context(&m_machine), tag(), data);
+ }
- ins8154->odrb = data;
+ m_odrb = data;
break;
case 0x24:
if (VERBOSE)
- logerror("%s: INS8154 '%s' MDR set to %02x\n", cpuexec_describe_context(device->machine), device->tag(), data);
+ {
+ logerror("%s: INS8154 '%s' MDR set to %02x\n", cpuexec_describe_context(&m_machine), tag(), data);
+ }
- ins8154->mdr = data;
+ m_mdr = data;
break;
default:
@@ -186,11 +243,11 @@ WRITE8_DEVICE_HANDLER( ins8154_w )
/* Set bit */
if (offset < 0x08)
{
- ins8154_porta_w(device, 0, ins8154->out_a |= offset & 0x07);
+ ins8154_porta_w(0, m_out_a |= offset & 0x07);
}
else
{
- ins8154_portb_w(device, 0, ins8154->out_b |= (offset >> 4) & 0x07);
+ ins8154_portb_w(0, m_out_b |= (offset >> 4) & 0x07);
}
}
else
@@ -198,75 +255,14 @@ WRITE8_DEVICE_HANDLER( ins8154_w )
/* Clear bit */
if (offset < 0x08)
{
- ins8154_porta_w(device, 0, ins8154->out_a & ~(offset & 0x07));
+ ins8154_porta_w(0, m_out_a & ~(offset & 0x07));
}
else
{
- ins8154_portb_w(device, 0, ins8154->out_b & ~((offset >> 4) & 0x07));
+ ins8154_portb_w(0, m_out_b & ~((offset >> 4) & 0x07));
}
}
break;
}
}
-
-
-/*****************************************************************************
- DEVICE INTERFACE
-*****************************************************************************/
-
-static DEVICE_START( ins8154 )
-{
- ins8154_state *ins8154 = get_safe_token(device);
- const ins8154_interface *intf = (const ins8154_interface *)device->baseconfig().static_config();
-
- /* validate some basic stuff */
- assert(intf != NULL);
-
- /* resolve callbacks */
- devcb_resolve_read8(&ins8154->in_a_func, &intf->in_a_func, device);
- devcb_resolve_write8(&ins8154->out_a_func, &intf->out_a_func, device);
- devcb_resolve_read8(&ins8154->in_b_func, &intf->in_b_func, device);
- devcb_resolve_write8(&ins8154->out_b_func, &intf->out_b_func, device);
- devcb_resolve_write_line(&ins8154->out_irq_func, &intf->out_irq_func, device);
-
- /* register for state saving */
- state_save_register_device_item(device, 0, ins8154->in_a);
- state_save_register_device_item(device, 0, ins8154->in_b);
- state_save_register_device_item(device, 0, ins8154->out_a);
- state_save_register_device_item(device, 0, ins8154->out_b);
- state_save_register_device_item(device, 0, ins8154->mdr);
- state_save_register_device_item(device, 0, ins8154->odra);
- state_save_register_device_item(device, 0, ins8154->odrb);
-}
-
-static DEVICE_RESET( ins8154 )
-{
- ins8154_state *ins8154 = get_safe_token(device);
-
- ins8154->in_a = 0;
- ins8154->in_b = 0;
- ins8154->out_a = 0;
- ins8154->out_b = 0;
- ins8154->mdr = 0;
- ins8154->odra = 0;
- ins8154->odrb = 0;
-}
-
-
-/***************************************************************************
- DEVICE GETINFO
-***************************************************************************/
-
-static const char DEVTEMPLATE_SOURCE[] = __FILE__;
-
-#define DEVTEMPLATE_ID(p,s) p##ins8154##s
-#define DEVTEMPLATE_FEATURES DT_HAS_START | DT_HAS_RESET
-#define DEVTEMPLATE_NAME "INS8154"
-#define DEVTEMPLATE_FAMILY "INS8154"
-#define DEVTEMPLATE_VERSION "1.1"
-#define DEVTEMPLATE_CREDITS "Copyright MESS Team"
-#include "devtempl.h"
-
-
-DEFINE_LEGACY_DEVICE(INS8154, ins8154);
diff --git a/src/emu/machine/ins8154.h b/src/emu/machine/ins8154.h
index 7448445b60f..df3fc8d4842 100644
--- a/src/emu/machine/ins8154.h
+++ b/src/emu/machine/ins8154.h
@@ -28,32 +28,117 @@
***************************************************************************/
+#pragma once
+
#ifndef __INS8154_H__
#define __INS8154_H__
-#include "devlegcy.h"
-#include "devcb.h"
+#include "emu.h"
+
+
+
+/***************************************************************************
+ DEVICE CONFIGURATION MACROS
+***************************************************************************/
+
+#define MDRV_INS8154_ADD(_tag, _intrf) \
+ MDRV_DEVICE_ADD(_tag, INS8154, 0) \
+ MDRV_DEVICE_CONFIG(_intrf)
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
-typedef struct _ins8154_interface ins8154_interface;
-struct _ins8154_interface
+
+// ======================> ins8154_interface
+
+struct ins8154_interface
+{
+ devcb_read8 m_in_a_func;
+ devcb_write8 m_out_a_func;
+ devcb_read8 m_in_b_func;
+ devcb_write8 m_out_b_func;
+ devcb_write_line m_out_irq_func;
+};
+
+
+
+// ======================> ins8154_device_config
+
+class ins8154_device_config : public device_config,
+ public ins8154_interface
+{
+ friend class ins8154_device;
+
+ // construction/destruction
+ ins8154_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock);
+
+public:
+ // allocators
+ static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock);
+ virtual device_t *alloc_device(running_machine &machine) const;
+
+protected:
+ // device_config overrides
+ virtual void device_config_complete();
+};
+
+
+
+// ======================> ins8154_device
+
+class ins8154_device : public device_t
{
- devcb_read8 in_a_func;
- devcb_write8 out_a_func;
- devcb_read8 in_b_func;
- devcb_write8 out_b_func;
- devcb_write_line out_irq_func;
+ friend class ins8154_device_config;
+
+ // construction/destruction
+ ins8154_device(running_machine &_machine, const ins8154_device_config &_config);
+
+public:
+
+ UINT8 ins8154_r(UINT32 offset);
+ void ins8154_w(UINT32 offset, UINT8 data);
+
+ void ins8154_porta_w(UINT32 offset, UINT8 data);
+ void ins8154_portb_w(UINT32 offset, UINT8 data);
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+ virtual void device_post_load() { }
+ virtual void device_clock_changed() { }
+
+private:
+
+ /* i/o lines */
+ devcb_resolved_read8 m_in_a_func;
+ devcb_resolved_write8 m_out_a_func;
+ devcb_resolved_read8 m_in_b_func;
+ devcb_resolved_write8 m_out_b_func;
+ devcb_resolved_write_line m_out_irq_func;
+
+ /* registers */
+ UINT8 m_in_a; /* Input Latch Port A */
+ UINT8 m_in_b; /* Input Latch Port B */
+ UINT8 m_out_a; /* Output Latch Port A */
+ UINT8 m_out_b; /* Output Latch Port B */
+ UINT8 m_mdr; /* Mode Definition Register */
+ UINT8 m_odra; /* Output Definition Register Port A */
+ UINT8 m_odrb; /* Output Definition Register Port B */
+
+ const ins8154_device_config &m_config;
};
-DECLARE_LEGACY_DEVICE(INS8154, ins8154);
+
+// device type definition
+extern const device_type INS8154;
+
/***************************************************************************
- FUNCTION PROTOTYPES
+ PROTOTYPES
***************************************************************************/
READ8_DEVICE_HANDLER( ins8154_r );
@@ -63,13 +148,4 @@ WRITE8_DEVICE_HANDLER( ins8154_porta_w );
WRITE8_DEVICE_HANDLER( ins8154_portb_w );
-/***************************************************************************
- DEVICE CONFIGURATION MACROS
-***************************************************************************/
-
-#define MDRV_INS8154_ADD(_tag, _intrf) \
- MDRV_DEVICE_ADD(_tag, INS8154, 0) \
- MDRV_DEVICE_CONFIG(_intrf)
-
-
#endif /* __INS8154_H__ */