summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/inptport.c
diff options
context:
space:
mode:
author smf- <smf-@users.noreply.github.com>2009-11-24 12:05:35 +0000
committer smf- <smf-@users.noreply.github.com>2009-11-24 12:05:35 +0000
commit2877513af14a8b453e1b44fd1d289554421362ee (patch)
tree159382296a56476b0e587b138315982df4fbf576 /src/emu/inptport.c
parentc09db0e2340c03af8265e18b5077918483ad8bf7 (diff)
Hooked up eepromdev.c using PORT_READ_LINE_DEVICE/PORT_WRITE_LINE_DEVICE in groundfx.c.
Output ports are now affected by IP_ACTIVE_HIGH/IP_ACTIVE_LOW (eepromdev.c has active low cs). The previous value for callbacks in inptport.c is now tracked per field. This saves recalculating it for PORT_CHANGED & conditional fields wouldn't always get updated correctly. Tidied up eepromdev.c interface.
Diffstat (limited to 'src/emu/inptport.c')
-rw-r--r--src/emu/inptport.c36
1 files changed, 16 insertions, 20 deletions
diff --git a/src/emu/inptport.c b/src/emu/inptport.c
index d89b99d9f72..8bb0385aa47 100644
--- a/src/emu/inptport.c
+++ b/src/emu/inptport.c
@@ -204,6 +204,7 @@ struct _device_field_info
const input_field_config * field; /* pointer to the input field referenced */
const device_config * device; /* device */
UINT8 shift; /* shift to apply to the final result */
+ input_port_value oldval; /* last value */
};
@@ -230,8 +231,7 @@ struct _input_port_state
input_port_value defvalue; /* combined default value across the port */
input_port_value digital; /* current value from all digital inputs */
input_port_value vblank; /* value of all IPT_VBLANK bits */
- input_port_value lastvalue; /* last value of the port, to detect changes */
- input_port_value lastwrite; /* last value written to the port, to detect changes */
+ input_port_value outputvalue; /* current value for outputs */
};
@@ -629,11 +629,7 @@ static WRITE_LINE_DEVICE_HANDLER( changed_write_line_device )
{
const device_field_info *device_field = (const device_field_info *) device;
- /* recalculate 'oldval' as it cannot be passed directly */
- input_port_value last = (device_field->field->type == IPT_OUTPUT) ? device_field->field->port->state->lastwrite : device_field->field->port->state->lastvalue;
- input_port_value oldval = (last & device_field->field->mask) >> device_field->shift;
-
- (*device_field->field->changed)(device_field->field, device_field->field->changed_param, oldval, state);
+ (*device_field->field->changed)(device_field->field, device_field->field->changed_param, device_field->oldval, state);
}
@@ -1255,6 +1251,7 @@ input_port_value input_port_read_direct(const input_port_config *port)
{
/* replace the bits with bits from the device */
input_port_value newval = (*device_field->field->read_line_device)(device_field->device);
+ device_field->oldval = newval;
result = (result & ~device_field->field->mask) | ((newval << device_field->shift) & device_field->field->mask);
}
@@ -1473,23 +1470,22 @@ void input_port_write_direct(const input_port_config *port, input_port_value dat
{
/* call device line changed handlers */
device_field_info *device_field;
- input_port_value newvalue = port->state->lastwrite;
- COMBINE_DATA(&newvalue);
+ COMBINE_DATA(&port->state->outputvalue);
for (device_field = port->state->writedevicelist; device_field; device_field = device_field->next)
if (device_field->field->type == IPT_OUTPUT && input_condition_true(port->machine, &device_field->field->condition))
{
- input_port_value oldval = (port->state->lastwrite & device_field->field->mask) >> device_field->shift;
- input_port_value newval = (newvalue & device_field->field->mask) >> device_field->shift;
+ input_port_value newval = ( (port->state->outputvalue ^ device_field->field->defvalue ) & device_field->field->mask) >> device_field->shift;
/* if the bits have changed, call the handler */
- if (oldval != newval)
+ if (device_field->oldval != newval)
+ {
(*device_field->field->write_line_device)(device_field->device, newval);
- }
- /* remember the last value */
- port->state->lastwrite = newvalue;
+ device_field->oldval = newval;
+ }
+ }
}
@@ -2112,16 +2108,16 @@ profiler_mark_start(PROFILER_INPUT);
for (device_field = port->state->writedevicelist; device_field; device_field = device_field->next)
if (device_field->field->type != IPT_OUTPUT && input_condition_true(port->machine, &device_field->field->condition))
{
- input_port_value oldval = (port->state->lastvalue & device_field->field->mask) >> device_field->shift;
input_port_value newval = (newvalue & device_field->field->mask) >> device_field->shift;
/* if the bits have changed, call the handler */
- if (oldval != newval)
+ if (device_field->oldval != newval)
+ {
(*device_field->field->write_line_device)(device_field->device, newval);
- }
- /* remember the last value */
- port->state->lastvalue = newvalue;
+ device_field->oldval = newval;
+ }
+ }
}
/* handle playback/record */