summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/devcb.c
diff options
context:
space:
mode:
author Miodrag Milanovic <mmicko@gmail.com>2012-10-11 13:45:30 +0000
committer Miodrag Milanovic <mmicko@gmail.com>2012-10-11 13:45:30 +0000
commit22aabcf0d73bc79c79ab9cddd89fdc5aeb70febf (patch)
tree4aa14f4811ffcdbb3884bd0d2b75329ce5f7f1b5 /src/emu/devcb.c
parent33428514a3aec6a79e26a0e41ba6083b65c00c5b (diff)
device callback support for 32bit and 64bit handlers (no whatsnew)
Diffstat (limited to 'src/emu/devcb.c')
-rw-r--r--src/emu/devcb.c270
1 files changed, 270 insertions, 0 deletions
diff --git a/src/emu/devcb.c b/src/emu/devcb.c
index 1a27454d59c..e9ad0d87210 100644
--- a/src/emu/devcb.c
+++ b/src/emu/devcb.c
@@ -51,6 +51,10 @@ UINT8 devcb_resolved_read8::s_null;
UINT8 devcb_resolved_write8::s_null;
UINT8 devcb_resolved_read16::s_null;
UINT8 devcb_resolved_write16::s_null;
+UINT8 devcb_resolved_read32::s_null;
+UINT8 devcb_resolved_write32::s_null;
+UINT8 devcb_resolved_read64::s_null;
+UINT8 devcb_resolved_write64::s_null;
@@ -921,3 +925,269 @@ void devcb_resolved_write16::to_input(offs_t offset, UINT16 data, UINT16 mask)
{
m_object.execute->set_input_line(m_helper.input_line, (data & 1) ? ASSERT_LINE : CLEAR_LINE);
}
+
+//**************************************************************************
+// DEVCB RESOLVED WRITE32
+//**************************************************************************
+
+//-------------------------------------------------
+// devcb_resolved_write32 - empty constructor
+//-------------------------------------------------
+
+devcb_resolved_write32::devcb_resolved_write32()
+{
+ m_object.port = NULL;
+ m_helper.write_line = NULL;
+}
+
+
+//-------------------------------------------------
+// resolve - resolve to a delegate from a static
+// structure definition
+//-------------------------------------------------
+
+void devcb_resolved_write32::resolve(const devcb_write32 &desc, device_t &device)
+{
+ switch (desc.type)
+ {
+ default:
+ case DEVCB_TYPE_NULL:
+ m_helper.null_indicator = &s_null;
+ *static_cast<devcb_write32_delegate *>(this) = devcb_write32_delegate(&devcb_resolved_write32::to_null, "(null)", this);
+ break;
+
+ case DEVCB_TYPE_IOPORT:
+ m_object.port = devcb_resolver::resolve_port(desc.tag, device);
+ *static_cast<devcb_write32_delegate *>(this) = devcb_write32_delegate(&devcb_resolved_write32::to_port, desc.tag, this);
+ break;
+
+ case DEVCB_TYPE_DEVICE:
+ m_object.device = devcb_resolver::resolve_device(desc.index, desc.tag, device);
+ if (desc.writedevice != NULL)
+ {
+ m_helper.write32_device = desc.writedevice;
+ *static_cast<devcb_write32_delegate *>(this) = devcb_write32_delegate(&devcb_resolved_write32::to_write32, desc.name, this);
+ }
+ else
+ {
+ m_helper.write_line = desc.writeline;
+ *static_cast<devcb_write32_delegate *>(this) = devcb_write32_delegate(&devcb_resolved_write32::to_writeline, desc.name, this);
+ }
+ break;
+
+ case DEVCB_TYPE_LEGACY_SPACE:
+ m_object.space = &devcb_resolver::resolve_space(desc.index, desc.tag, device);
+ *static_cast<devcb_write32_delegate *>(this) = devcb_write32_delegate(desc.writespace, desc.name, m_object.space);
+ break;
+
+ case DEVCB_TYPE_INPUT_LINE:
+ m_object.execute = devcb_resolver::resolve_execute_interface(desc.tag, device);
+ m_helper.input_line = desc.index;
+ *static_cast<devcb_write32_delegate *>(this) = devcb_write32_delegate(&devcb_resolved_write32::to_input, desc.tag, this);
+ break;
+
+ case DEVCB_TYPE_UNMAP:
+ m_helper.null_indicator = &s_null;
+ m_object.device = &device;
+ *static_cast<devcb_write32_delegate *>(this) = devcb_write32_delegate(&devcb_resolved_write32::to_unmap, "unmap", this);
+ break;
+ }
+}
+
+
+//-------------------------------------------------
+// to_null - helper to handle a NULL write
+//-------------------------------------------------
+
+void devcb_resolved_write32::to_null(offs_t offset, UINT32 data, UINT32 mask)
+{
+}
+
+
+//-------------------------------------------------
+// to_unmap - helper to handle a unmap write
+//-------------------------------------------------
+
+void devcb_resolved_write32::to_unmap(offs_t offset, UINT32 data, UINT32 mask)
+{
+ logerror("%s: unmapped devcb write %s & %s\n",
+ m_object.device->tag(),
+ core_i64_format(data, 2 * sizeof(UINT32),false),
+ core_i64_format(mask, 2 * sizeof(UINT32),false));
+}
+
+//-------------------------------------------------
+// to_port - helper to convert to an I/O port
+// value from a line value
+//-------------------------------------------------
+
+void devcb_resolved_write32::to_port(offs_t offset, UINT32 data, UINT32 mask)
+{
+ m_object.port->write(data, mask);
+}
+
+
+//-------------------------------------------------
+// to_write32 - helper to convert to a 32-bit
+// memory read value from a line value
+//-------------------------------------------------
+
+void devcb_resolved_write32::to_write32(offs_t offset, UINT32 data, UINT32 mask)
+{
+ (*m_helper.write32_device)(m_object.device, m_object.device->machine().driver_data()->generic_space(), offset, data, mask);
+}
+
+
+//-------------------------------------------------
+// to_write32 - helper to convert to a 32-bit
+// memory read value from a line value
+//-------------------------------------------------
+
+void devcb_resolved_write32::to_writeline(offs_t offset, UINT32 data, UINT32 mask)
+{
+ (*m_helper.write_line)(m_object.device, (data & 1) ? ASSERT_LINE : CLEAR_LINE);
+}
+
+
+//-------------------------------------------------
+// to_input - helper to convert to a device input
+// value from a line value
+//-------------------------------------------------
+
+void devcb_resolved_write32::to_input(offs_t offset, UINT32 data, UINT32 mask)
+{
+ m_object.execute->set_input_line(m_helper.input_line, (data & 1) ? ASSERT_LINE : CLEAR_LINE);
+}
+
+//**************************************************************************
+// DEVCB RESOLVED WRITE64
+//**************************************************************************
+
+//-------------------------------------------------
+// devcb_resolved_write64 - empty constructor
+//-------------------------------------------------
+
+devcb_resolved_write64::devcb_resolved_write64()
+{
+ m_object.port = NULL;
+ m_helper.write_line = NULL;
+}
+
+
+//-------------------------------------------------
+// resolve - resolve to a delegate from a static
+// structure definition
+//-------------------------------------------------
+
+void devcb_resolved_write64::resolve(const devcb_write64 &desc, device_t &device)
+{
+ switch (desc.type)
+ {
+ default:
+ case DEVCB_TYPE_NULL:
+ m_helper.null_indicator = &s_null;
+ *static_cast<devcb_write64_delegate *>(this) = devcb_write64_delegate(&devcb_resolved_write64::to_null, "(null)", this);
+ break;
+
+ case DEVCB_TYPE_IOPORT:
+ m_object.port = devcb_resolver::resolve_port(desc.tag, device);
+ *static_cast<devcb_write64_delegate *>(this) = devcb_write64_delegate(&devcb_resolved_write64::to_port, desc.tag, this);
+ break;
+
+ case DEVCB_TYPE_DEVICE:
+ m_object.device = devcb_resolver::resolve_device(desc.index, desc.tag, device);
+ if (desc.writedevice != NULL)
+ {
+ m_helper.write64_device = desc.writedevice;
+ *static_cast<devcb_write64_delegate *>(this) = devcb_write64_delegate(&devcb_resolved_write64::to_write64, desc.name, this);
+ }
+ else
+ {
+ m_helper.write_line = desc.writeline;
+ *static_cast<devcb_write64_delegate *>(this) = devcb_write64_delegate(&devcb_resolved_write64::to_writeline, desc.name, this);
+ }
+ break;
+
+ case DEVCB_TYPE_LEGACY_SPACE:
+ m_object.space = &devcb_resolver::resolve_space(desc.index, desc.tag, device);
+ *static_cast<devcb_write64_delegate *>(this) = devcb_write64_delegate(desc.writespace, desc.name, m_object.space);
+ break;
+
+ case DEVCB_TYPE_INPUT_LINE:
+ m_object.execute = devcb_resolver::resolve_execute_interface(desc.tag, device);
+ m_helper.input_line = desc.index;
+ *static_cast<devcb_write64_delegate *>(this) = devcb_write64_delegate(&devcb_resolved_write64::to_input, desc.tag, this);
+ break;
+
+ case DEVCB_TYPE_UNMAP:
+ m_helper.null_indicator = &s_null;
+ m_object.device = &device;
+ *static_cast<devcb_write64_delegate *>(this) = devcb_write64_delegate(&devcb_resolved_write64::to_unmap, "unmap", this);
+ break;
+ }
+}
+
+
+//-------------------------------------------------
+// to_null - helper to handle a NULL write
+//-------------------------------------------------
+
+void devcb_resolved_write64::to_null(offs_t offset, UINT64 data, UINT64 mask)
+{
+}
+
+
+//-------------------------------------------------
+// to_unmap - helper to handle a unmap write
+//-------------------------------------------------
+
+void devcb_resolved_write64::to_unmap(offs_t offset, UINT64 data, UINT64 mask)
+{
+ logerror("%s: unmapped devcb write %s & %s\n",
+ m_object.device->tag(),
+ core_i64_format(data, 2 * sizeof(UINT64),false),
+ core_i64_format(mask, 2 * sizeof(UINT64),false));
+}
+
+//-------------------------------------------------
+// to_port - helper to convert to an I/O port
+// value from a line value
+//-------------------------------------------------
+
+void devcb_resolved_write64::to_port(offs_t offset, UINT64 data, UINT64 mask)
+{
+ m_object.port->write(data, mask);
+}
+
+
+//-------------------------------------------------
+// to_write64 - helper to convert to a 64-bit
+// memory read value from a line value
+//-------------------------------------------------
+
+void devcb_resolved_write64::to_write64(offs_t offset, UINT64 data, UINT64 mask)
+{
+ (*m_helper.write64_device)(m_object.device, m_object.device->machine().driver_data()->generic_space(), offset, data, mask);
+}
+
+
+//-------------------------------------------------
+// to_write64 - helper to convert to a 64-bit
+// memory read value from a line value
+//-------------------------------------------------
+
+void devcb_resolved_write64::to_writeline(offs_t offset, UINT64 data, UINT64 mask)
+{
+ (*m_helper.write_line)(m_object.device, (data & 1) ? ASSERT_LINE : CLEAR_LINE);
+}
+
+
+//-------------------------------------------------
+// to_input - helper to convert to a device input
+// value from a line value
+//-------------------------------------------------
+
+void devcb_resolved_write64::to_input(offs_t offset, UINT64 data, UINT64 mask)
+{
+ m_object.execute->set_input_line(m_helper.input_line, (data & 1) ? ASSERT_LINE : CLEAR_LINE);
+}