summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/devcb.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/devcb.cpp')
-rw-r--r--src/emu/devcb.cpp37
1 files changed, 36 insertions, 1 deletions
diff --git a/src/emu/devcb.cpp b/src/emu/devcb.cpp
index 540c8d249c9..fe8deacfba1 100644
--- a/src/emu/devcb.cpp
+++ b/src/emu/devcb.cpp
@@ -60,7 +60,7 @@ void devcb_base::reset(callback_type type)
m_space = nullptr;
m_target.ptr = nullptr;
m_rshift = 0;
- m_mask = ~u64(0);
+ m_mask = m_defmask;
m_xor = 0;
devcb_reset();
}
@@ -101,6 +101,17 @@ void devcb_base::resolve_membank()
//-------------------------------------------------
+// resolve_output - resolve an output item
+//-------------------------------------------------
+
+void devcb_base::resolve_output()
+{
+ assert(m_target_tag != nullptr);
+ m_target.item = &m_device.machine().output().find_or_create_item(m_target_tag, 0);
+}
+
+
+//-------------------------------------------------
// resolve_inputline - resolve a device and input
// number or fatal error if we can't find it
//-------------------------------------------------
@@ -254,6 +265,9 @@ void devcb_read_base::resolve()
case CALLBACK_MEMBANK:
throw emu_fatalerror("Device read callbacks can't be connected to bank switches\n");
+ case CALLBACK_OUTPUT:
+ throw emu_fatalerror("Device read callbacks can't be connected to output items\n");
+
case CALLBACK_LOG:
m_adapter = &devcb_read_base::read_logged_adapter;
m_mask = 0;
@@ -444,6 +458,10 @@ void devcb_read_base::validity_check(validity_checker &valid) const
osd_printf_error("Device read callbacks can't be connected to bank switches\n");
break;
+ case CALLBACK_OUTPUT:
+ osd_printf_error("Device read callbacks can't be connected to output items\n");
+ break;
+
case CALLBACK_INPUTLINE:
case CALLBACK_ASSERTLINE:
case CALLBACK_CLEARLINE:
@@ -566,6 +584,11 @@ void devcb_write_base::resolve()
m_adapter = (m_target.membank == nullptr) ? &devcb_write_base::write_noop_adapter : &devcb_write_base::write_membank_adapter;
break;
+ case CALLBACK_OUTPUT:
+ resolve_output();
+ m_adapter = (m_target.item == nullptr) ? &devcb_write_base::write_noop_adapter : &devcb_write_base::write_output_adapter;
+ break;
+
case CALLBACK_LOG:
m_adapter = &devcb_write_base::write_logged_adapter;
break;
@@ -636,6 +659,7 @@ void devcb_write_base::validity_check(validity_checker &valid) const
case CALLBACK_LOG:
case CALLBACK_IOPORT:
case CALLBACK_MEMBANK:
+ case CALLBACK_OUTPUT:
break;
case CALLBACK_LINE:
@@ -770,6 +794,17 @@ void devcb_write_base::write_membank_adapter(address_space &space, offs_t offset
//-------------------------------------------------
+// write_output_adapter - set an output item
+//-------------------------------------------------
+
+void devcb_write_base::write_output_adapter(address_space &space, offs_t offset, u64 data, u64 mask)
+{
+ if (m_target.item)
+ m_target.item->set(unshift_mask_xor(data));
+}
+
+
+//-------------------------------------------------
// write_logged_adapter - log write if masked
// value is nonzero
//-------------------------------------------------