diff options
Diffstat (limited to 'src/emu/devcb.cpp')
| -rw-r--r-- | src/emu/devcb.cpp | 37 |
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 //------------------------------------------------- |
