summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/ioport.c
diff options
context:
space:
mode:
author Miodrag Milanovic <mmicko@gmail.com>2012-05-16 07:24:41 +0000
committer Miodrag Milanovic <mmicko@gmail.com>2012-05-16 07:24:41 +0000
commitf182f80a1dba9e0a1cd261539eee8dd0b22cfa8e (patch)
tree933064761b5cde8ed9ab3bdeaa1d69b156210934 /src/emu/ioport.c
parentc40f1ad464e1bea7ab520e74b175cce08264dcd3 (diff)
port changed regression fix (no whatsnew)
Diffstat (limited to 'src/emu/ioport.c')
-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
//-------------------------------------------------