summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/emu/ioport.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/emu/ioport.c b/src/emu/ioport.c
index d2319558244..6c40c0293a1 100644
--- a/src/emu/ioport.c
+++ b/src/emu/ioport.c
@@ -251,6 +251,7 @@ public:
// read/write
void read(ioport_value &result);
void write(ioport_value newval);
+ void port_changed_write(ioport_value newval);
private:
// internal state
@@ -2479,7 +2480,7 @@ void ioport_port::frame_update(ioport_field *mouse_field)
ioport_value newvalue = read();
for (dynamic_field *dynfield = m_live->writelist.first(); dynfield != NULL; dynfield = dynfield->next())
if (dynfield->field().type() != IPT_OUTPUT)
- dynfield->write(newvalue);
+ dynfield->port_changed_write(newvalue);
}
@@ -4006,6 +4007,27 @@ void dynamic_field::write(ioport_value newval)
//-------------------------------------------------
+// port_changed_write - track a change to a value
+// of port changed and call the write callback
+// if there's something new
+//-------------------------------------------------
+
+void dynamic_field::port_changed_write(ioport_value newval)
+{
+ // skip if not enabled
+ if (!m_field.enabled())
+ return;
+
+ // if the bits have changed, call the handler
+ newval = (newval & m_field.mask()) >> m_shift;
+ if (m_oldval != newval)
+ {
+ m_field.m_write(m_field, m_field.m_write_param, m_oldval, newval);
+ m_oldval = newval;
+ }
+}
+
+//-------------------------------------------------
// analog_field - constructor
//-------------------------------------------------