diff options
author | AJR <ajrhacker@users.noreply.github.com> | 2018-02-20 19:30:29 -0500 |
---|---|---|
committer | AJR <ajrhacker@users.noreply.github.com> | 2018-02-20 19:30:29 -0500 |
commit | 9545f58030546ebd76cc4e39f2788850e9ee1052 (patch) | |
tree | d5e2b846a7c32698a11b10d638fda610cae6e13f | |
parent | a8632acec6d632114b85a5e056d33bb8c7636ab1 (diff) |
devcb: Fix validation problem with chained callbacks (nw)
-rw-r--r-- | src/emu/devcb.cpp | 16 | ||||
-rw-r--r-- | src/emu/devcb.h | 4 |
2 files changed, 12 insertions, 8 deletions
diff --git a/src/emu/devcb.cpp b/src/emu/devcb.cpp index 96746823c96..f29d1ed439c 100644 --- a/src/emu/devcb.cpp +++ b/src/emu/devcb.cpp @@ -145,11 +145,12 @@ void devcb_base::resolve_space() // devcb_read_base - constructor //------------------------------------------------- -devcb_read_base::devcb_read_base(device_t &device, u64 defmask) +devcb_read_base::devcb_read_base(device_t &device, u64 defmask, bool chained) : devcb_base(device, defmask), m_adapter(&devcb_read_base::read_unresolved_adapter) { - device.m_input_callbacks.push_back(this); + if (!chained) + device.m_input_callbacks.push_back(this); } @@ -177,7 +178,7 @@ void devcb_read_base::devcb_reset() devcb_read_base &devcb_read_base::chain_alloc() { // set up the chained callback pointer - m_chain.reset(new devcb_read_base(m_device, m_defmask)); + m_chain.reset(new devcb_read_base(*this)); return *m_chain; } @@ -465,11 +466,12 @@ void devcb_read_base::validity_check(validity_checker &valid) const // devcb_write_base - constructor //------------------------------------------------- -devcb_write_base::devcb_write_base(device_t &device, u64 defmask) +devcb_write_base::devcb_write_base(device_t &device, u64 defmask, bool chained) : devcb_base(device, defmask), m_adapter(&devcb_write_base::write_unresolved_adapter) { - device.m_output_callbacks.push_back(this); + if (!chained) + device.m_output_callbacks.push_back(this); } @@ -497,7 +499,7 @@ void devcb_write_base::devcb_reset() devcb_write_base &devcb_write_base::chain_alloc() { // set up the chained callback pointer - m_chain.reset(new devcb_write_base(m_device, m_defmask)); + m_chain.reset(new devcb_write_base(m_device, m_defmask, true)); return *m_chain; } @@ -628,6 +630,8 @@ void devcb_write_base::validity_check(validity_checker &valid) const switch (m_type) { case CALLBACK_NONE: + break; + case CALLBACK_CONSTANT: case CALLBACK_LOG: case CALLBACK_IOPORT: diff --git a/src/emu/devcb.h b/src/emu/devcb.h index bdb3b0d6997..20d19161bff 100644 --- a/src/emu/devcb.h +++ b/src/emu/devcb.h @@ -244,7 +244,7 @@ class devcb_read_base : public devcb_base { protected: // construction/destruction - devcb_read_base(device_t &device, u64 defmask); + devcb_read_base(device_t &device, u64 defmask, bool chained = false); public: // callback configuration @@ -300,7 +300,7 @@ class devcb_write_base : public devcb_base { protected: // construction/destruction - devcb_write_base(device_t &device, u64 defmask); + devcb_write_base(device_t &device, u64 defmask, bool chained = false); public: // callback configuration |