summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author R. Belmont <rb6502@users.noreply.github.com>2016-12-22 12:08:46 -0500
committer GitHub <noreply@github.com>2016-12-22 12:08:46 -0500
commit4d73ed00723cc31cd5eb528d99b08a3d49a6f5b2 (patch)
tree92a9135c275401f2e46ce5ffee6b202b9f28b765
parent71d15052090d6360e8036d1de4981ca1e0b52f5d (diff)
parentff6819374119ac550d2be98eb6bd4a72d5b06b57 (diff)
Merge pull request #1847 from ajrhacker/devcb_chain
Overhaul of devcb (nw)
-rw-r--r--scripts/src/emu.lua2
-rw-r--r--src/emu/devcb.cpp188
-rw-r--r--src/emu/devcb.h149
-rw-r--r--src/emu/dispatch.cpp40
-rw-r--r--src/emu/dispatch.h64
-rw-r--r--src/emu/emu.h1
-rw-r--r--src/mame/drivers/24cdjuke.cpp2
-rw-r--r--src/mame/drivers/dmv.cpp8
-rw-r--r--src/mame/drivers/imolagp.cpp4
-rw-r--r--src/mame/drivers/kopunch.cpp6
-rw-r--r--src/mame/drivers/namcos12.cpp7
-rw-r--r--src/mame/drivers/namcos23.cpp21
12 files changed, 296 insertions, 196 deletions
diff --git a/scripts/src/emu.lua b/scripts/src/emu.lua
index b67226e1576..76cdb16427c 100644
--- a/scripts/src/emu.lua
+++ b/scripts/src/emu.lua
@@ -93,8 +93,6 @@ files {
MAME_DIR .. "src/emu/dislot.h",
MAME_DIR .. "src/emu/disound.cpp",
MAME_DIR .. "src/emu/disound.h",
- MAME_DIR .. "src/emu/dispatch.cpp",
- MAME_DIR .. "src/emu/dispatch.h",
MAME_DIR .. "src/emu/distate.cpp",
MAME_DIR .. "src/emu/distate.h",
MAME_DIR .. "src/emu/divideo.cpp",
diff --git a/src/emu/devcb.cpp b/src/emu/devcb.cpp
index 3d851ee8e2a..12f84a01f5f 100644
--- a/src/emu/devcb.cpp
+++ b/src/emu/devcb.cpp
@@ -22,11 +22,27 @@
devcb_base::devcb_base(device_t &device, u64 defmask)
: m_device(device),
+ m_type(CALLBACK_NONE),
+ m_target_tag(nullptr),
+ m_target_int(0),
+ m_space_tag(nullptr),
+ m_space_num(AS_0),
+ m_space(nullptr),
m_rshift(0),
m_mask(defmask),
+ m_defmask(defmask),
m_xor(0)
{
- reset();
+ m_target.ptr = nullptr;
+}
+
+
+//-------------------------------------------------
+// devcb_base - destructor
+//-------------------------------------------------
+
+devcb_base::~devcb_base()
+{
}
@@ -45,6 +61,8 @@ void devcb_base::reset(callback_type type)
m_target.ptr = nullptr;
m_rshift = 0;
m_mask = ~u64(0);
+ m_xor = 0;
+ devcb_reset();
}
@@ -59,6 +77,26 @@ void devcb_base::resolve_ioport()
m_target.ioport = (m_target_tag != nullptr) ? m_device.owner()->ioport(m_target_tag) : nullptr;
if (m_target.ioport == nullptr)
throw emu_fatalerror("Unable to resolve I/O port callback reference to '%s' in device '%s'\n", m_target_tag, m_device.tag());
+
+ // adjust the mask to match the port bits
+ u64 port_mask = 0;
+ for (const ioport_field &field : m_target.ioport->fields())
+ port_mask |= field.mask();
+ m_mask = shift_mask(port_mask);
+}
+
+
+//-------------------------------------------------
+// resolve_membank - resolve a memory bank or
+// fatal error if we can't find it
+//-------------------------------------------------
+
+void devcb_base::resolve_membank()
+{
+ // attempt to resolve, fatal error if fail
+ m_target.membank = (m_target_tag != nullptr) ? m_device.owner()->membank(m_target_tag) : nullptr;
+ if (m_target.membank == nullptr)
+ throw emu_fatalerror("Unable to resolve memory bank callback reference to '%s' in device '%s'\n", m_target_tag, m_device.tag());
}
@@ -109,27 +147,37 @@ void devcb_base::resolve_space()
devcb_read_base::devcb_read_base(device_t &device, u64 defmask)
: devcb_base(device, defmask),
- m_adapter(nullptr)
+ m_adapter(&devcb_read_base::read_unresolved_adapter)
{
}
//-------------------------------------------------
-// reset - reset/initialize state
+// devcb_reset - reset/initialize local state
//-------------------------------------------------
-void devcb_read_base::reset(callback_type type)
+void devcb_read_base::devcb_reset()
{
- // parent first
- devcb_base::reset(type);
-
- // local stuff
m_readline = read_line_delegate();
m_read8 = read8_delegate();
m_read16 = read16_delegate();
m_read32 = read32_delegate();
m_read64 = read64_delegate();
m_adapter = &devcb_read_base::read_unresolved_adapter;
+ m_chain = nullptr;
+}
+
+
+//-------------------------------------------------
+// chain_alloc - add another callback to the
+// input chain
+//-------------------------------------------------
+
+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));
+ return *m_chain;
}
@@ -160,6 +208,7 @@ void devcb_read_base::resolve()
m_readline.bind_relative_to(*m_device.owner());
m_target_int = 0;
m_adapter = m_readline.isnull() ? &devcb_read_base::read_constant_adapter : &devcb_read_base::read_line_adapter;
+ m_mask = shift_mask(1);
break;
case CALLBACK_8:
@@ -167,6 +216,7 @@ void devcb_read_base::resolve()
m_read8.bind_relative_to(*m_device.owner());
m_target_int = 0;
m_adapter = m_read8.isnull() ? &devcb_read_base::read_constant_adapter : &devcb_read_base::read8_adapter;
+ m_mask = shift_mask(0xff);
break;
case CALLBACK_16:
@@ -174,6 +224,7 @@ void devcb_read_base::resolve()
m_read16.bind_relative_to(*m_device.owner());
m_target_int = 0;
m_adapter = m_read16.isnull() ? &devcb_read_base::read_constant_adapter : &devcb_read_base::read16_adapter;
+ m_mask = shift_mask(0xffff);
break;
case CALLBACK_32:
@@ -181,6 +232,7 @@ void devcb_read_base::resolve()
m_read32.bind_relative_to(*m_device.owner());
m_target_int = 0;
m_adapter = m_read32.isnull() ? &devcb_read_base::read_constant_adapter : &devcb_read_base::read32_adapter;
+ m_mask = shift_mask(0xffffffff);
break;
case CALLBACK_64:
@@ -191,20 +243,30 @@ void devcb_read_base::resolve()
break;
case CALLBACK_IOPORT:
+ name = m_target_tag;
resolve_ioport();
m_target_int = 0;
- m_adapter = (m_target.ioport == nullptr) ? &devcb_read_base::read_constant_adapter : &devcb_read_base::read_ioport_adapter;
+ m_adapter = &devcb_read_base::read_ioport_adapter;
break;
+ case CALLBACK_MEMBANK:
+ throw emu_fatalerror("Device read callbacks can't be connected to bank switches\n");
+
case CALLBACK_LOG:
m_adapter = &devcb_read_base::read_logged_adapter;
+ m_mask = 0;
break;
case CALLBACK_CONSTANT:
+ if (m_xor != 0)
+ throw emu_fatalerror("devcb_read: Attempt to invert constant value (%lX ^ %lX)\n", (unsigned long)shift_mask(m_target_int), (unsigned long)m_xor);
m_adapter = &devcb_read_base::read_constant_adapter;
+ m_mask = shift_mask(m_target_int);
break;
case CALLBACK_INPUTLINE:
+ case CALLBACK_ASSERTLINE:
+ case CALLBACK_CLEARLINE:
throw emu_fatalerror("Device read callbacks can't be connected to input lines\n");
}
}
@@ -212,6 +274,15 @@ void devcb_read_base::resolve()
{
throw emu_fatalerror("devcb_read: Error performing a late bind of type %s to %s (name=%s)\n", binderr.m_actual_type.name(), binderr.m_target_type.name(), name);
}
+
+ // resolve callback chain recursively
+ if (m_chain != nullptr)
+ m_chain->resolve();
+
+ // protect against bus contention (the masks must not overlap)
+ for (const devcb_read_base *chained_cb = m_chain.get(); chained_cb != nullptr; chained_cb = chained_cb->m_chain.get())
+ if ((m_mask & chained_cb->m_mask) != 0)
+ throw emu_fatalerror("Device %s read callback (name=%s) overlaps with chained callback (%lX & %lX)", m_device.tag(), name, (unsigned long)m_mask, (unsigned long)chained_cb->m_mask);
}
@@ -305,14 +376,14 @@ u64 devcb_read_base::read_ioport_adapter(address_space &space, offs_t offset, u6
//-------------------------------------------------
-// read_logged_adapter - log a read and return a
-// constant
+// read_logged_adapter - log a read and return
+// zero
//-------------------------------------------------
u64 devcb_read_base::read_logged_adapter(address_space &space, offs_t offset, u64 mask)
{
- m_device.logerror("%s: read %s\n", m_device.machine().describe_context(), m_target_tag);
- return shift_mask_xor(m_target_int);
+ m_device.logerror("%s: %s\n", m_device.machine().describe_context(), m_target_tag);
+ return 0;
}
@@ -322,7 +393,7 @@ u64 devcb_read_base::read_logged_adapter(address_space &space, offs_t offset, u6
u64 devcb_read_base::read_constant_adapter(address_space &space, offs_t offset, u64 mask)
{
- return shift_mask_xor(m_target_int);
+ return shift_mask(m_target_int);
}
@@ -337,27 +408,37 @@ u64 devcb_read_base::read_constant_adapter(address_space &space, offs_t offset,
devcb_write_base::devcb_write_base(device_t &device, u64 defmask)
: devcb_base(device, defmask),
- m_adapter(nullptr)
+ m_adapter(&devcb_write_base::write_unresolved_adapter)
{
}
//-------------------------------------------------
-// reset - reset/initialize state
+// devcb_reset - reset/initialize local state
//-------------------------------------------------
-void devcb_write_base::reset(callback_type type)
+void devcb_write_base::devcb_reset()
{
- // parent first
- devcb_base::reset(type);
-
- // local stuff
m_writeline = write_line_delegate();
m_write8 = write8_delegate();
m_write16 = write16_delegate();
m_write32 = write32_delegate();
m_write64 = write64_delegate();
m_adapter = &devcb_write_base::write_unresolved_adapter;
+ m_chain = nullptr;
+}
+
+
+//-------------------------------------------------
+// chain_alloc - add another callback to the
+// output chain
+//-------------------------------------------------
+
+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));
+ return *m_chain;
}
@@ -418,6 +499,11 @@ void devcb_write_base::resolve()
m_adapter = (m_target.ioport == nullptr) ? &devcb_write_base::write_noop_adapter : &devcb_write_base::write_ioport_adapter;
break;
+ case CALLBACK_MEMBANK:
+ resolve_membank();
+ m_adapter = (m_target.membank == nullptr) ? &devcb_write_base::write_noop_adapter : &devcb_write_base::write_membank_adapter;
+ break;
+
case CALLBACK_LOG:
m_adapter = &devcb_write_base::write_logged_adapter;
break;
@@ -430,12 +516,26 @@ void devcb_write_base::resolve()
resolve_inputline();
m_adapter = &devcb_write_base::write_inputline_adapter;
break;
+
+ case CALLBACK_ASSERTLINE:
+ resolve_inputline();
+ m_adapter = &devcb_write_base::write_assertline_adapter;
+ break;
+
+ case CALLBACK_CLEARLINE:
+ resolve_inputline();
+ m_adapter = &devcb_write_base::write_clearline_adapter;
+ break;
}
}
catch (binding_type_exception &binderr)
{
throw emu_fatalerror("devcb_write: Error performing a late bind of type %s to %s (name=%s)\n", binderr.m_actual_type.name(), binderr.m_target_type.name(), name);
}
+
+ // resolve callback chain recursively
+ if (m_chain != nullptr)
+ m_chain->resolve();
}
@@ -515,7 +615,7 @@ void devcb_write_base::write64_adapter(address_space &space, offs_t offset, u64
//-------------------------------------------------
-// write_ioport - write from an I/O port
+// write_ioport_adapter - write to an I/O port
//-------------------------------------------------
void devcb_write_base::write_ioport_adapter(address_space &space, offs_t offset, u64 data, u64 mask)
@@ -526,13 +626,25 @@ void devcb_write_base::write_ioport_adapter(address_space &space, offs_t offset,
//-------------------------------------------------
-// write_logged_adapter - logging unresolved
-// adapter
+// write_membank_adapter - switch a memory bank
+//-------------------------------------------------
+
+void devcb_write_base::write_membank_adapter(address_space &space, offs_t offset, u64 data, u64 mask)
+{
+ if (m_target.membank)
+ m_target.membank->set_entry(unshift_mask_xor(data));
+}
+
+
+//-------------------------------------------------
+// write_logged_adapter - log write if masked
+// value is nonzero
//-------------------------------------------------
void devcb_write_base::write_logged_adapter(address_space &space, offs_t offset, u64 data, u64 mask)
{
- m_device.logerror("%s: unresolved devcb write\n", m_device.machine().describe_context());
+ if (unshift_mask_xor(data) != 0)
+ m_device.logerror("%s: %s\n", m_device.machine().describe_context(), m_target_tag);
}
@@ -547,7 +659,7 @@ void devcb_write_base::write_noop_adapter(address_space &space, offs_t offset, u
//-------------------------------------------------
-// write_inputline_adapter - write to an device's
+// write_inputline_adapter - write to a device's
// input line
//-------------------------------------------------
@@ -555,3 +667,27 @@ void devcb_write_base::write_inputline_adapter(address_space &space, offs_t offs
{
m_target.device->execute().set_input_line(m_target_int, unshift_mask_xor(data) & 1);
}
+
+
+//-------------------------------------------------
+// write_assertline_adapter - write to a device's
+// input line
+//-------------------------------------------------
+
+void devcb_write_base::write_assertline_adapter(address_space &space, offs_t offset, u64 data, u64 mask)
+{
+ if (unshift_mask_xor(data) & 1)
+ m_target.device->execute().set_input_line(m_target_int, ASSERT_LINE);
+}
+
+
+//-------------------------------------------------
+// write_clearline_adapter - write to a device's
+// input line
+//-------------------------------------------------
+
+void devcb_write_base::write_clearline_adapter(address_space &space, offs_t offset, u64 data, u64 mask)
+{
+ if (unshift_mask_xor(data) & 1)
+ m_target.device->execute().set_input_line(m_target_int, CLEAR_LINE);
+}
diff --git a/src/emu/devcb.h b/src/emu/devcb.h
index c30f9db431b..58319bd34fa 100644
--- a/src/emu/devcb.h
+++ b/src/emu/devcb.h
@@ -25,9 +25,12 @@
// wrappers for ioports, constants, and loggers
#define DEVCB_NOOP devcb_base::null_desc()
#define DEVCB_IOPORT(_tag) devcb_base::ioport_desc(_tag)
+#define DEVCB_MEMBANK(_tag) devcb_base::membank_desc(_tag)
#define DEVCB_CONSTANT(_value) devcb_base::constant_desc(_value)
-#define DEVCB_LOGGER(_string, _value) devcb_base::logger_desc(_string, _value)
+#define DEVCB_LOGGER(_string) devcb_base::logger_desc(_string)
#define DEVCB_INPUTLINE(_tag, _line) devcb_base::inputline_desc(_tag, _line)
+#define DEVCB_ASSERTLINE(_tag, _line) devcb_base::assertline_desc(_tag, _line)
+#define DEVCB_CLEARLINE(_tag, _line) devcb_base::clearline_desc(_tag, _line)
#define DEVCB_VCC DEVCB_CONSTANT(1)
#define DEVCB_GND DEVCB_CONSTANT(0)
@@ -62,10 +65,14 @@
// machine config helpers to add shift, mask, or address space configuration
#define MCFG_DEVCB_RSHIFT(_shift) devcb->set_rshift(_shift);
#define MCFG_DEVCB_MASK(_mask) devcb->set_mask(_mask);
+#define MCFG_DEVCB_BIT(_bit) devcb->set_rshift(-(_bit)).set_mask(1ULL << (_bit));
#define MCFG_DEVCB_XOR(_xor) devcb->set_xor(_xor);
#define MCFG_DEVCB_INVERT devcb->set_xor(~u64(0));
#define MCFG_DEVCB_ADDRESS_SPACE(_device, _spacenum) devcb->set_space(_device, _spacenum);
+// machine config helpers for chaining callbacks
+#define MCFG_DEVCB_CHAIN_INPUT(_desc) devcb = &downcast<devcb_read_base &>(*devcb).chain_alloc().set_callback(DEVCB_##_desc);
+#define MCFG_DEVCB_CHAIN_OUTPUT(_desc) devcb = &downcast<devcb_write_base &>(*devcb).chain_alloc().set_callback(DEVCB_##_desc);
//**************************************************************************
@@ -92,13 +99,17 @@ protected:
CALLBACK_32,
CALLBACK_64,
CALLBACK_IOPORT,
+ CALLBACK_MEMBANK,
CALLBACK_LOG,
CALLBACK_CONSTANT,
- CALLBACK_INPUTLINE
+ CALLBACK_INPUTLINE,
+ CALLBACK_ASSERTLINE,
+ CALLBACK_CLEARLINE
};
// construction/destruction
devcb_base(device_t &device, u64 defmask);
+ virtual ~devcb_base();
public:
// getters
@@ -124,6 +135,13 @@ public:
const char *m_tag;
};
+ class membank_desc
+ {
+ public:
+ membank_desc(const char *tag) { m_tag = tag; }
+ const char *m_tag;
+ };
+
class constant_desc
{
public:
@@ -134,9 +152,8 @@ public:
class logger_desc
{
public:
- logger_desc(const char *string, u64 value = 0) { m_string = string; m_value = value; }
+ logger_desc(const char *string) { m_string = string; }
const char *m_string;
- u64 m_value;
};
class inputline_desc
@@ -147,20 +164,40 @@ public:
int m_inputnum;
};
+ class assertline_desc
+ {
+ public:
+ assertline_desc(const char *tag, int inputnum) { m_tag = tag; m_inputnum = inputnum; }
+ const char *m_tag;
+ int m_inputnum;
+ };
+
+ class clearline_desc
+ {
+ public:
+ clearline_desc(const char *tag, int inputnum) { m_tag = tag; m_inputnum = inputnum; }
+ const char *m_tag;
+ int m_inputnum;
+ };
+
// shared callback setters
devcb_base &set_callback(null_desc null) { reset(CALLBACK_NONE); return *this; }
devcb_base &set_callback(ioport_desc ioport) { reset(CALLBACK_IOPORT); m_target_tag = ioport.m_tag; return *this; }
+ devcb_base &set_callback(membank_desc membank) { reset(CALLBACK_MEMBANK); m_target_tag = membank.m_tag; return *this; }
devcb_base &set_callback(constant_desc constant) { reset(CALLBACK_CONSTANT); m_target_int = constant.m_value; return *this; }
- devcb_base &set_callback(logger_desc logger) { reset(CALLBACK_LOG); m_target_int = logger.m_value; m_target_tag = logger.m_string; return *this; }
- devcb_base &set_callback(inputline_desc inputline) { reset(CALLBACK_INPUTLINE); m_target_tag = inputline.m_tag; m_target_int = inputline.m_inputnum; return *this; }
+ devcb_base &set_callback(logger_desc logger) { reset(CALLBACK_LOG); m_target_tag = logger.m_string; return *this; }
+ void reset() { reset(CALLBACK_NONE); }
protected:
// internal helpers
+ inline u64 shift_mask(u64 value) const { return ((m_rshift < 0) ? (value << -m_rshift) : (value >> m_rshift)) & m_mask; }
inline u64 shift_mask_xor(u64 value) const { return (((m_rshift < 0) ? (value << -m_rshift) : (value >> m_rshift)) ^ m_xor) & m_mask; }
inline u64 unshift_mask(u64 value) const { return (m_rshift < 0) ? ((value & m_mask) >> -m_rshift) : ((value & m_mask) << m_rshift); }
inline u64 unshift_mask_xor(u64 value) const { return (m_rshift < 0) ? (((value ^ m_xor) & m_mask) >> -m_rshift) : (((value ^ m_xor) & m_mask) << m_rshift); }
- void reset(callback_type type = CALLBACK_NONE);
+ void reset(callback_type type);
+ virtual void devcb_reset() = 0;
void resolve_ioport();
+ void resolve_membank();
void resolve_inputline();
void resolve_space();
@@ -170,6 +207,7 @@ protected:
void * ptr;
device_t * device;
ioport_port * ioport;
+ memory_bank * membank;
};
// configuration
@@ -185,6 +223,7 @@ protected:
callback_target m_target; // resolved pointer to target object
int m_rshift; // right shift to apply to data read
u64 m_mask; // mask to apply to data read
+ const u64 m_defmask; // default mask
u64 m_xor; // XOR to apply to data read
};
@@ -205,6 +244,7 @@ public:
devcb_base &set_callback(read16_delegate func) { reset(CALLBACK_16); m_read16 = func; return *this; }
devcb_base &set_callback(read32_delegate func) { reset(CALLBACK_32); m_read32 = func; return *this; }
devcb_base &set_callback(read64_delegate func) { reset(CALLBACK_64); m_read64 = func; return *this; }
+ devcb_read_base &chain_alloc();
// resolution
void resolve();
@@ -212,8 +252,10 @@ public:
protected:
// internal helpers
- void reset(callback_type type = CALLBACK_NONE);
+ virtual void devcb_reset() override;
+ inline u64 read(address_space &space, offs_t offset, u64 mask);
+private:
// adapters
u64 read_unresolved_adapter(address_space &space, offs_t offset, u64 mask);
u64 read_line_adapter(address_space &space, offs_t offset, u64 mask);
@@ -235,6 +277,7 @@ protected:
// derived state
typedef u64 (devcb_read_base::*adapter_func)(address_space &, offs_t, u64);
adapter_func m_adapter; // actual callback to invoke
+ std::unique_ptr<devcb_read_base> m_chain; // next callback for chained input
};
@@ -254,6 +297,10 @@ public:
devcb_base &set_callback(write16_delegate func) { reset(CALLBACK_16); m_write16 = func; return *this; }
devcb_base &set_callback(write32_delegate func) { reset(CALLBACK_32); m_write32 = func; return *this; }
devcb_base &set_callback(write64_delegate func) { reset(CALLBACK_64); m_write64 = func; return *this; }
+ devcb_base &set_callback(inputline_desc inputline) { reset(CALLBACK_INPUTLINE); m_target_tag = inputline.m_tag; m_target_int = inputline.m_inputnum; return *this; }
+ devcb_base &set_callback(assertline_desc inputline) { reset(CALLBACK_ASSERTLINE); m_target_tag = inputline.m_tag; m_target_int = inputline.m_inputnum; return *this; }
+ devcb_base &set_callback(clearline_desc inputline) { reset(CALLBACK_CLEARLINE); m_target_tag = inputline.m_tag; m_target_int = inputline.m_inputnum; return *this; }
+ devcb_write_base &chain_alloc();
// resolution
void resolve();
@@ -261,8 +308,10 @@ public:
protected:
// internal helpers
- void reset(callback_type type = CALLBACK_NONE);
+ virtual void devcb_reset() override;
+ inline void write(address_space &space, offs_t offset, u64 data, u64 mask);
+private:
// adapters
void write_unresolved_adapter(address_space &space, offs_t offset, u64 data, u64 mask);
void write_line_adapter(address_space &space, offs_t offset, u64 data, u64 mask);
@@ -271,9 +320,12 @@ protected:
void write32_adapter(address_space &space, offs_t offset, u64 data, u64 mask);
void write64_adapter(address_space &space, offs_t offset, u64 data, u64 mask);
void write_ioport_adapter(address_space &space, offs_t offset, u64 data, u64 mask);
+ void write_membank_adapter(address_space &space, offs_t offset, u64 data, u64 mask);
void write_logged_adapter(address_space &space, offs_t offset, u64 data, u64 mask);
void write_noop_adapter(address_space &space, offs_t offset, u64 data, u64 mask);
void write_inputline_adapter(address_space &space, offs_t offset, u64 data, u64 mask);
+ void write_assertline_adapter(address_space &space, offs_t offset, u64 data, u64 mask);
+ void write_clearline_adapter(address_space &space, offs_t offset, u64 data, u64 mask);
// configuration
write_line_delegate m_writeline; // copy of registered line writer
@@ -285,6 +337,7 @@ protected:
// derived state
typedef void (devcb_write_base::*adapter_func)(address_space &, offs_t, u64, u64);
adapter_func m_adapter; // actual callback to invoke
+ std::unique_ptr<devcb_write_base> m_chain; // next callback for chained output
};
@@ -294,8 +347,8 @@ class devcb_read_line : public devcb_read_base
{
public:
devcb_read_line(device_t &device) : devcb_read_base(device, 0xff) { }
- int operator()() { return (this->*m_adapter)(*m_space, 0, 0xffU) & 1; }
- int operator()(address_space &space) { return (this->*m_adapter)((m_space_tag != nullptr) ? *m_space : space, 0, 0xffU) & 1; }
+ int operator()() { return read(*m_space, 0, 0xffU) & 1; }
+ int operator()(address_space &space) { return read((m_space_tag != nullptr) ? *m_space : space, 0, 0xffU) & 1; }
};
@@ -305,8 +358,8 @@ class devcb_read8 : public devcb_read_base
{
public:
devcb_read8(device_t &device) : devcb_read_base(device, 0xff) { }
- u8 operator()(offs_t offset = 0, u8 mask = 0xff) { return (this->*m_adapter)(*m_space, offset, mask) & mask; }
- u8 operator()(address_space &space, offs_t offset = 0, u8 mask = 0xff) { return (this->*m_adapter)((m_space_tag != nullptr) ? *m_space : space, offset, mask) & mask; }
+ u8 operator()(offs_t offset = 0, u8 mask = 0xff) { return read(*m_space, offset, mask) & mask; }
+ u8 operator()(address_space &space, offs_t offset = 0, u8 mask = 0xff) { return read((m_space_tag != nullptr) ? *m_space : space, offset, mask) & mask; }
};
@@ -316,8 +369,8 @@ class devcb_read16 : public devcb_read_base
{
public:
devcb_read16(device_t &device) : devcb_read_base(device, 0xffff) { }
- u16 operator()(offs_t offset = 0, u16 mask = 0xffff) { return (this->*m_adapter)(*m_space, offset, mask) & mask; }
- u16 operator()(address_space &space, offs_t offset = 0, u16 mask = 0xffff) { return (this->*m_adapter)((m_space_tag != nullptr) ? *m_space : space, offset, mask) & mask; }
+ u16 operator()(offs_t offset = 0, u16 mask = 0xffff) { return read(*m_space, offset, mask) & mask; }
+ u16 operator()(address_space &space, offs_t offset = 0, u16 mask = 0xffff) { return read((m_space_tag != nullptr) ? *m_space : space, offset, mask) & mask; }
};
@@ -327,8 +380,8 @@ class devcb_read32 : public devcb_read_base
{
public:
devcb_read32(device_t &device) : devcb_read_base(device, 0xffffffff) { }
- u32 operator()(offs_t offset = 0, u32 mask = 0xffffffff) { return (this->*m_adapter)(*m_space, offset, mask) & mask; }
- u32 operator()(address_space &space, offs_t offset = 0, u32 mask = 0xffffffff) { return (this->*m_adapter)((m_space_tag != nullptr) ? *m_space : space, offset, mask) & mask; }
+ u32 operator()(offs_t offset = 0, u32 mask = 0xffffffff) { return read(*m_space, offset, mask) & mask; }
+ u32 operator()(address_space &space, offs_t offset = 0, u32 mask = 0xffffffff) { return read((m_space_tag != nullptr) ? *m_space : space, offset, mask) & mask; }
};
@@ -338,8 +391,8 @@ class devcb_read64 : public devcb_read_base
{
public:
devcb_read64(device_t &device) : devcb_read_base(device, 0xffffffffffffffffU) { }
- u64 operator()(offs_t offset = 0, u64 mask = 0xffffffffffffffffU) { return (this->*m_adapter)(*m_space, offset, mask) & mask; }
- u64 operator()(address_space &space, offs_t offset = 0, u64 mask = 0xffffffffffffffffU) { return (this->*m_adapter)((m_space_tag != nullptr) ? *m_space : space, offset, mask) & mask; }
+ u64 operator()(offs_t offset = 0, u64 mask = 0xffffffffffffffffU) { return read(*m_space, offset, mask) & mask; }
+ u64 operator()(address_space &space, offs_t offset = 0, u64 mask = 0xffffffffffffffffU) { return read((m_space_tag != nullptr) ? *m_space : space, offset, mask) & mask; }
};
@@ -349,8 +402,8 @@ class devcb_write_line : public devcb_write_base
{
public:
devcb_write_line(device_t &device) : devcb_write_base(device, 0xff) { }
- void operator()(int state) { (this->*m_adapter)(*m_space, 0, state & 1, 0xffU); }
- void operator()(address_space &space, int state) { (this->*m_adapter)((m_space_tag != nullptr) ? *m_space : space, 0, state & 1, 0xffU); }
+ void operator()(int state) { write(*m_space, 0, state & 1, 0xffU); }
+ void operator()(address_space &space, int state) { write((m_space_tag != nullptr) ? *m_space : space, 0, state & 1, 0xffU); }
};
@@ -360,9 +413,9 @@ class devcb_write8 : public devcb_write_base
{
public:
devcb_write8(device_t &device) : devcb_write_base(device, 0xff) { }
- void operator()(u8 data, u8 mask = 0xff) { (this->*m_adapter)(*m_space, 0, data, mask); }
- void operator()(offs_t offset, u8 data, u8 mask = 0xff) { (this->*m_adapter)(*m_space, offset, data, mask); }
- void operator()(address_space &space, offs_t offset, u8 data, u8 mask = 0xff) { (this->*m_adapter)((m_space_tag != nullptr) ? *m_space : space, offset, data, mask); }
+ void operator()(u8 data, u8 mask = 0xff) { write(*m_space, 0, data, mask); }
+ void operator()(offs_t offset, u8 data, u8 mask = 0xff) { write(*m_space, offset, data, mask); }
+ void operator()(address_space &space, offs_t offset, u8 data, u8 mask = 0xff) { write((m_space_tag != nullptr) ? *m_space : space, offset, data, mask); }
};
@@ -372,9 +425,9 @@ class devcb_write16 : public devcb_write_base
{
public:
devcb_write16(device_t &device) : devcb_write_base(device, 0xffff) { }
- void operator()(u16 data, u16 mask = 0xffff) { (this->*m_adapter)(*m_space, 0, data, mask); }
- void operator()(offs_t offset, u16 data, u16 mask = 0xffff) { (this->*m_adapter)(*m_space, offset, data, mask); }
- void operator()(address_space &space, offs_t offset, u16 data, u16 mask = 0xffff) { (this->*m_adapter)((m_space_tag != nullptr) ? *m_space : space, offset, data, mask); }
+ void operator()(u16 data, u16 mask = 0xffff) { write(*m_space, 0, data, mask); }
+ void operator()(offs_t offset, u16 data, u16 mask = 0xffff) { write(*m_space, offset, data, mask); }
+ void operator()(address_space &space, offs_t offset, u16 data, u16 mask = 0xffff) { write((m_space_tag != nullptr) ? *m_space : space, offset, data, mask); }
};
@@ -384,9 +437,9 @@ class devcb_write32 : public devcb_write_base
{
public:
devcb_write32(device_t &device) : devcb_write_base(device, 0xffffffff) { }
- void operator()(u32 data, u32 mask = 0xffffffff) { (this->*m_adapter)(*m_space, 0, data, mask); }
- void operator()(offs_t offset, u32 data, u32 mask = 0xffffffff) { (this->*m_adapter)(*m_space, offset, data, mask); }
- void operator()(address_space &space, offs_t offset, u32 data, u32 mask = 0xffffffff) { (this->*m_adapter)((m_space_tag != nullptr) ? *m_space : space, offset, data, mask); }
+ void operator()(u32 data, u32 mask = 0xffffffff) { write(*m_space, 0, data, mask); }
+ void operator()(offs_t offset, u32 data, u32 mask = 0xffffffff) { write(*m_space, offset, data, mask); }
+ void operator()(address_space &space, offs_t offset, u32 data, u32 mask = 0xffffffff) { write((m_space_tag != nullptr) ? *m_space : space, offset, data, mask); }
};
@@ -396,10 +449,40 @@ class devcb_write64 : public devcb_write_base
{
public:
devcb_write64(device_t &device) : devcb_write_base(device, 0xffffffffffffffffU) { }
- void operator()(u64 data, u64 mask = 0xffffffffffffffffU) { (this->*m_adapter)(*m_space, 0, data, mask); }
- void operator()(offs_t offset, u64 data, u64 mask = 0xffffffffffffffffU) { (this->*m_adapter)(*m_space, offset, data, mask); }
- void operator()(address_space &space, offs_t offset, u64 data, u64 mask = 0xffffffffffffffffU) { (this->*m_adapter)((m_space_tag != nullptr) ? *m_space : space, offset, data, mask); }
+ void operator()(u64 data, u64 mask = 0xffffffffffffffffU) { write(*m_space, 0, data, mask); }
+ void operator()(offs_t offset, u64 data, u64 mask = 0xffffffffffffffffU) { write(*m_space, offset, data, mask); }
+ void operator()(address_space &space, offs_t offset, u64 data, u64 mask = 0xffffffffffffffffU) { write((m_space_tag != nullptr) ? *m_space : space, offset, data, mask); }
};
+
+//**************************************************************************
+// INLINE FUNCTIONS
+//**************************************************************************
+
+//-------------------------------------------------
+// read - generic read callback dispatch
+//-------------------------------------------------
+
+inline u64 devcb_read_base::read(address_space &space, offs_t offset, u64 mask)
+{
+ u64 result = (this->*m_adapter)(space, offset, mask);
+ if (m_chain != nullptr)
+ result |= m_chain->read(space, offset, mask);
+ return result;
+}
+
+
+//-------------------------------------------------
+// write - generic write callback dispatch
+//-------------------------------------------------
+
+inline void devcb_write_base::write(address_space &space, offs_t offset, u64 data, u64 mask)
+{
+ (this->*m_adapter)(space, offset, data, mask);
+ if (m_chain != nullptr)
+ m_chain->write(space, offset, data, mask);
+}
+
+
#endif /* MAME_EMU_DEVCB_H */
diff --git a/src/emu/dispatch.cpp b/src/emu/dispatch.cpp
deleted file mode 100644
index b82fb85daf8..00000000000
--- a/src/emu/dispatch.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Olivier Galibert
-
-#include "emu.h"
-
-const device_type DEVCB_LINE_DISPATCH_2 = &device_creator<devcb_line_dispatch_device<2> >;
-const device_type DEVCB_LINE_DISPATCH_3 = &device_creator<devcb_line_dispatch_device<3> >;
-const device_type DEVCB_LINE_DISPATCH_4 = &device_creator<devcb_line_dispatch_device<4> >;
-const device_type DEVCB_LINE_DISPATCH_5 = &device_creator<devcb_line_dispatch_device<5> >;
-const device_type DEVCB_LINE_DISPATCH_6 = &device_creator<devcb_line_dispatch_device<6> >;
-
-template<> devcb_line_dispatch_device<2>::devcb_line_dispatch_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
- device_t(mconfig, DEVCB_LINE_DISPATCH_2, "Line dispatcher (2 slots)", tag, owner, clock, "devcb_line_dispatch", __FILE__)
-{
- init_fwd();
-}
-
-template<> devcb_line_dispatch_device<3>::devcb_line_dispatch_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
- device_t(mconfig, DEVCB_LINE_DISPATCH_3, "Line dispatcher (3 slots)", tag, owner, clock, "devcb_line_dispatch", __FILE__)
-{
- init_fwd();
-}
-
-template<> devcb_line_dispatch_device<4>::devcb_line_dispatch_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
- device_t(mconfig, DEVCB_LINE_DISPATCH_4, "Line dispatcher (4 slots)", tag, owner, clock, "devcb_line_dispatch", __FILE__)
-{
- init_fwd();
-}
-
-template<> devcb_line_dispatch_device<5>::devcb_line_dispatch_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
- device_t(mconfig, DEVCB_LINE_DISPATCH_5, "Line dispatcher (5 slots)", tag, owner, clock, "devcb_line_dispatch", __FILE__)
-{
- init_fwd();
-}
-
-template<> devcb_line_dispatch_device<6>::devcb_line_dispatch_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
- device_t(mconfig, DEVCB_LINE_DISPATCH_6, "Line dispatcher (6 slots)", tag, owner, clock, "devcb_line_dispatch", __FILE__)
-{
- init_fwd();
-}
diff --git a/src/emu/dispatch.h b/src/emu/dispatch.h
deleted file mode 100644
index 26be42e345e..00000000000
--- a/src/emu/dispatch.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Olivier Galibert
-/***************************************************************************
-
- dispatch.h
-
- Signal dispatching devices.
-
-***************************************************************************/
-
-#pragma once
-
-#ifndef __EMU_H__
-#error Dont include this file directly; include emu.h instead.
-#endif
-
-#ifndef MAME_EMU_DISPATCH_H
-#define MAME_EMU_DISPATCH_H
-
-#define MCFG_LINE_DISPATCH_ADD(_tag, _count) \
- MCFG_DEVICE_ADD(_tag, DEVCB_LINE_DISPATCH_ ## _count, 0)
-
-#define MCFG_LINE_DISPATCH_FWD_CB(_entry, _count, _devcb) \
- devcb = &devcb_line_dispatch_device<_count>::set_fwd_cb(*device, _entry, DEVCB_##_devcb);
-
-extern const device_type DEVCB_LINE_DISPATCH_2;
-extern const device_type DEVCB_LINE_DISPATCH_3;
-extern const device_type DEVCB_LINE_DISPATCH_4;
-extern const device_type DEVCB_LINE_DISPATCH_5;
-extern const device_type DEVCB_LINE_DISPATCH_6;
-
-template<int N> class devcb_line_dispatch_device : public device_t {
-public:
- devcb_line_dispatch_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
- device_t(mconfig, DEVCB_LINE_DISPATCH_2, "DEVCB_LINE_DISPATCH_2", tag, owner, clock, "devcb_line_dispatch_2", __FILE__) { }
-
- void init_fwd() {
- for(auto & elem : fwd_cb)
- elem = new devcb_write_line(*this);
- }
-
- virtual ~devcb_line_dispatch_device() {
- for(auto & elem : fwd_cb)
- delete elem;
- }
-
- template<class _Object> static devcb_base &set_fwd_cb(device_t &device, int entry, _Object object) { return downcast<devcb_line_dispatch_device<N> &>(device).fwd_cb[entry]->set_callback(object); }
-
- WRITE_LINE_MEMBER( in_w ) {
- for(auto & elem : fwd_cb)
- (*(elem))(state);
- }
-
-protected:
- virtual void device_start() override {
- for(auto & elem : fwd_cb)
- elem->resolve_safe();
- }
-
-private:
- devcb_write_line *fwd_cb[N];
-};
-
-#endif // MAME_EMU_DISPATCH_H
diff --git a/src/emu/emu.h b/src/emu/emu.h
index de2105fc68c..65a45a4824d 100644
--- a/src/emu/emu.h
+++ b/src/emu/emu.h
@@ -110,7 +110,6 @@ typedef device_t * (*machine_config_constructor)(machine_config &config, device_
// generic helpers
#include "devcb.h"
-#include "dispatch.h"
#include "drivers/xtal.h"
#include "bookkeeping.h"
#include "video/generic.h"
diff --git a/src/mame/drivers/24cdjuke.cpp b/src/mame/drivers/24cdjuke.cpp
index eb0a0de1e11..9d84a16ac8a 100644
--- a/src/mame/drivers/24cdjuke.cpp
+++ b/src/mame/drivers/24cdjuke.cpp
@@ -293,7 +293,7 @@ static MACHINE_CONFIG_START( midcoin24cdjuke, midcoin24cdjuke_state )
MCFG_I8255_OUT_PORTC_CB(WRITE8(midcoin24cdjuke_state, kb_col_w))
MCFG_DEVICE_ADD("ic31", I8255A, 0)
- MCFG_I8255_OUT_PORTB_CB(LOGGER("PPI8255 - unmapped write port B", 0))
+ MCFG_I8255_OUT_PORTB_CB(LOGGER("PPI8255 - unmapped write port B"))
MCFG_I8255_IN_PORTC_CB(IOPORT("MD4"))
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/dmv.cpp b/src/mame/drivers/dmv.cpp
index 1a1a2d49da0..16dcaaab62e 100644
--- a/src/mame/drivers/dmv.cpp
+++ b/src/mame/drivers/dmv.cpp
@@ -748,10 +748,10 @@ static MACHINE_CONFIG_START( dmv, dmv_state )
MCFG_I8237_OUT_EOP_CB(WRITELINE(dmv_state, dmac_eop))
MCFG_I8237_IN_MEMR_CB(READ8(dmv_state, program_r))
MCFG_I8237_OUT_MEMW_CB(WRITE8(dmv_state, program_w))
- MCFG_I8237_IN_IOR_0_CB(LOGGER("DMA CH1", 0))
- MCFG_I8237_OUT_IOW_0_CB(LOGGER("DMA CH1", 0))
- MCFG_I8237_IN_IOR_1_CB(LOGGER("DMA CH2", 0))
- MCFG_I8237_OUT_IOW_1_CB(LOGGER("DMA CH2", 0))
+ MCFG_I8237_IN_IOR_0_CB(LOGGER("Read DMA CH1"))
+ MCFG_I8237_OUT_IOW_0_CB(LOGGER("Write DMA CH1"))
+ MCFG_I8237_IN_IOR_1_CB(LOGGER("Read DMA CH2"))
+ MCFG_I8237_OUT_IOW_1_CB(LOGGER("Write DMA CH2"))
MCFG_I8237_IN_IOR_2_CB(DEVREAD8("upd7220", upd7220_device, dack_r))
MCFG_I8237_OUT_IOW_2_CB(DEVWRITE8("upd7220", upd7220_device, dack_w))
MCFG_I8237_IN_IOR_3_CB(DEVREAD8("i8272", i8272a_device, mdma_r))
diff --git a/src/mame/drivers/imolagp.cpp b/src/mame/drivers/imolagp.cpp
index 5d490f09009..d1ec0167b0b 100644
--- a/src/mame/drivers/imolagp.cpp
+++ b/src/mame/drivers/imolagp.cpp
@@ -501,8 +501,8 @@ static MACHINE_CONFIG_START( imolagp, imolagp_state )
MCFG_DEVICE_ADD("ppi8255", I8255A, 0)
// mode $91 - ports A & C-lower as input, ports B & C-upper as output
MCFG_I8255_IN_PORTA_CB(IOPORT("IN0"))
- MCFG_I8255_IN_PORTB_CB(LOGGER("PPI8255 - unmapped read port B", 0))
- MCFG_I8255_OUT_PORTB_CB(LOGGER("PPI8255 - unmapped write port B", 0))
+ MCFG_I8255_IN_PORTB_CB(LOGGER("PPI8255 - unmapped read port B"))
+ MCFG_I8255_OUT_PORTB_CB(LOGGER("PPI8255 - unmapped write port B"))
MCFG_I8255_IN_PORTC_CB(IOPORT("IN1"))
/* video hardware */
diff --git a/src/mame/drivers/kopunch.cpp b/src/mame/drivers/kopunch.cpp
index cde3048d39a..37ef8db4194 100644
--- a/src/mame/drivers/kopunch.cpp
+++ b/src/mame/drivers/kopunch.cpp
@@ -244,13 +244,13 @@ static MACHINE_CONFIG_START( kopunch, kopunch_state )
MCFG_DEVICE_ADD("ppi8255_1", I8255A, 0)
// $34 - always $80 (PPI mode 0, ports A & B & C as output)
MCFG_I8255_OUT_PORTA_CB(WRITE8(kopunch_state, coin_w))
- MCFG_I8255_OUT_PORTB_CB(LOGGER("PPI8255 - unmapped write port B", 0))
- MCFG_I8255_OUT_PORTC_CB(LOGGER("PPI8255 - unmapped write port C", 0))
+ MCFG_I8255_OUT_PORTB_CB(LOGGER("PPI8255 - unmapped write port B"))
+ MCFG_I8255_OUT_PORTC_CB(LOGGER("PPI8255 - unmapped write port C"))
MCFG_DEVICE_ADD("ppi8255_2", I8255A, 0)
// $38 - always $89 (PPI mode 0, ports A & B as output, port C as input)
MCFG_I8255_OUT_PORTA_CB(WRITE8(kopunch_state, lamp_w))
- MCFG_I8255_OUT_PORTB_CB(LOGGER("PPI8255 - unmapped write port B", 0))
+ MCFG_I8255_OUT_PORTB_CB(LOGGER("PPI8255 - unmapped write port B"))
MCFG_I8255_IN_PORTC_CB(IOPORT("DSW"))
MCFG_DEVICE_ADD("ppi8255_3", I8255A, 0)
diff --git a/src/mame/drivers/namcos12.cpp b/src/mame/drivers/namcos12.cpp
index 3e847b5fae3..747ee95237f 100644
--- a/src/mame/drivers/namcos12.cpp
+++ b/src/mame/drivers/namcos12.cpp
@@ -1688,13 +1688,10 @@ static MACHINE_CONFIG_START( coh700, namcos12_state )
MCFG_RTC4543_ADD("rtc", XTAL_32_768kHz)
MCFG_RTC4543_DATA_CALLBACK(DEVWRITELINE("sub:sci1", h8_sci_device, rx_w))
- MCFG_LINE_DISPATCH_ADD("clk_dispatch", 2)
- MCFG_LINE_DISPATCH_FWD_CB(0, 2, DEVWRITELINE(":rtc", rtc4543_device, clk_w)) MCFG_DEVCB_INVERT
- MCFG_LINE_DISPATCH_FWD_CB(1, 2, DEVWRITELINE(":namco_settings", namco_settings_device, clk_w))
-
MCFG_DEVICE_MODIFY("sub:sci1")
MCFG_H8_SCI_TX_CALLBACK(DEVWRITELINE(":namco_settings", namco_settings_device, data_w))
- MCFG_H8_SCI_CLK_CALLBACK(DEVWRITELINE(":clk_dispatch", devcb_line_dispatch_device<2>, in_w))
+ MCFG_H8_SCI_CLK_CALLBACK(DEVWRITELINE(":rtc", rtc4543_device, clk_w)) MCFG_DEVCB_INVERT
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE(":namco_settings", namco_settings_device, clk_w))
MCFG_AT28C16_ADD("at28c16", nullptr)
diff --git a/src/mame/drivers/namcos23.cpp b/src/mame/drivers/namcos23.cpp
index 133193de49c..b79ac26831f 100644
--- a/src/mame/drivers/namcos23.cpp
+++ b/src/mame/drivers/namcos23.cpp
@@ -3566,13 +3566,10 @@ static MACHINE_CONFIG_START( gorgon, namcos23_state )
MCFG_RTC4543_ADD("rtc", XTAL_32_768kHz)
MCFG_RTC4543_DATA_CALLBACK(DEVWRITELINE("subcpu:sci1", h8_sci_device, rx_w))
- MCFG_LINE_DISPATCH_ADD("clk_dispatch", 2)
- MCFG_LINE_DISPATCH_FWD_CB(0, 2, DEVWRITELINE(":rtc", rtc4543_device, clk_w)) MCFG_DEVCB_INVERT
- MCFG_LINE_DISPATCH_FWD_CB(1, 2, DEVWRITELINE(":namco_settings", namco_settings_device, clk_w))
-
MCFG_DEVICE_MODIFY("subcpu:sci1")
MCFG_H8_SCI_TX_CALLBACK(DEVWRITELINE(":namco_settings", namco_settings_device, data_w))
- MCFG_H8_SCI_CLK_CALLBACK(DEVWRITELINE(":clk_dispatch", devcb_line_dispatch_device<2>, in_w))
+ MCFG_H8_SCI_CLK_CALLBACK(DEVWRITELINE(":rtc", rtc4543_device, clk_w)) MCFG_DEVCB_INVERT
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE(":namco_settings", namco_settings_device, clk_w))
MCFG_NVRAM_ADD_0FILL("nvram")
@@ -3635,13 +3632,10 @@ static MACHINE_CONFIG_START( s23, namcos23_state )
MCFG_RTC4543_ADD("rtc", XTAL_32_768kHz)
MCFG_RTC4543_DATA_CALLBACK(DEVWRITELINE("subcpu:sci1", h8_sci_device, rx_w))
- MCFG_LINE_DISPATCH_ADD("clk_dispatch", 2)
- MCFG_LINE_DISPATCH_FWD_CB(0, 2, DEVWRITELINE(":rtc", rtc4543_device, clk_w)) MCFG_DEVCB_INVERT
- MCFG_LINE_DISPATCH_FWD_CB(1, 2, DEVWRITELINE(":namco_settings", namco_settings_device, clk_w))
-
MCFG_DEVICE_MODIFY("subcpu:sci1")
MCFG_H8_SCI_TX_CALLBACK(DEVWRITELINE(":namco_settings", namco_settings_device, data_w))
- MCFG_H8_SCI_CLK_CALLBACK(DEVWRITELINE(":clk_dispatch", devcb_line_dispatch_device<2>, in_w))
+ MCFG_H8_SCI_CLK_CALLBACK(DEVWRITELINE(":rtc", rtc4543_device, clk_w)) MCFG_DEVCB_INVERT
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE(":namco_settings", namco_settings_device, clk_w))
MCFG_NVRAM_ADD_0FILL("nvram")
@@ -3715,13 +3709,10 @@ static MACHINE_CONFIG_START( ss23, namcos23_state )
MCFG_RTC4543_ADD("rtc", XTAL_32_768kHz)
MCFG_RTC4543_DATA_CALLBACK(DEVWRITELINE("subcpu:sci1", h8_sci_device, rx_w))
- MCFG_LINE_DISPATCH_ADD("clk_dispatch", 2)
- MCFG_LINE_DISPATCH_FWD_CB(0, 2, DEVWRITELINE(":rtc", rtc4543_device, clk_w)) MCFG_DEVCB_INVERT
- MCFG_LINE_DISPATCH_FWD_CB(1, 2, DEVWRITELINE(":namco_settings", namco_settings_device, clk_w))
-
MCFG_DEVICE_MODIFY("subcpu:sci1")
MCFG_H8_SCI_TX_CALLBACK(DEVWRITELINE(":namco_settings", namco_settings_device, data_w))
- MCFG_H8_SCI_CLK_CALLBACK(DEVWRITELINE(":clk_dispatch", devcb_line_dispatch_device<2>, in_w))
+ MCFG_H8_SCI_CLK_CALLBACK(DEVWRITELINE(":rtc", rtc4543_device, clk_w)) MCFG_DEVCB_INVERT
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE(":namco_settings", namco_settings_device, clk_w))
MCFG_NVRAM_ADD_0FILL("nvram")