summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
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
commit9545f58030546ebd76cc4e39f2788850e9ee1052 (patch)
treed5e2b846a7c32698a11b10d638fda610cae6e13f
parenta8632acec6d632114b85a5e056d33bb8c7636ab1 (diff)
devcb: Fix validation problem with chained callbacks (nw)
-rw-r--r--src/emu/devcb.cpp16
-rw-r--r--src/emu/devcb.h4
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