diff options
author | Aaron Giles <aaron@aarongiles.com> | 2011-05-11 22:50:01 +0000 |
---|---|---|
committer | Aaron Giles <aaron@aarongiles.com> | 2011-05-11 22:50:01 +0000 |
commit | b56339a9a0d7dfab176f120ae5418fa3ddcd7959 (patch) | |
tree | 7562973e9e7cd197082ca1efe05021f939e53988 /src/emu/inptport.c | |
parent | fda7ea574d5bc46d587058d5e9eb41d85a0b8903 (diff) |
Changed input read/write and crosshair callbacks into delegates.
Changed signature for callbacks to take an input_field_config
reference instead of pointer.
Diffstat (limited to 'src/emu/inptport.c')
-rw-r--r-- | src/emu/inptport.c | 59 |
1 files changed, 39 insertions, 20 deletions
diff --git a/src/emu/inptport.c b/src/emu/inptport.c index e20f5059840..b0f1ba723b0 100644 --- a/src/emu/inptport.c +++ b/src/emu/inptport.c @@ -1486,7 +1486,7 @@ input_port_value input_port_read_direct(const input_port_config *port) if (input_condition_true(port->machine(), &device_field->field->condition)) { /* replace the bits with bits from the device */ - input_port_value newval = (*device_field->field->read)(*device_field->device, device_field->field, device_field->field->read_param); + input_port_value newval = device_field->field->read(*device_field->field, device_field->field->read_param); device_field->oldval = newval; result = (result & ~device_field->field->mask) | ((newval << device_field->shift) & device_field->field->mask); } @@ -1608,8 +1608,8 @@ int input_port_get_crosshair_position(running_machine &machine, int player, floa value += field->crossoffset; /* apply custom mapping if necessary */ - if (field->crossmapper != NULL) - value = (*field->crossmapper)(field, value); + if (!field->crossmapper.isnull()) + value = field->crossmapper(*field, value); /* handle X axis */ if (field->crossaxis == CROSSHAIR_AXIS_X) @@ -1732,7 +1732,7 @@ void input_port_write_direct(const input_port_config *port, input_port_value dat /* if the bits have write, call the handler */ if (device_field->oldval != newval) { - (*device_field->field->write)(*device_field->device, device_field->field, device_field->field->write_param, device_field->oldval, newval); + device_field->field->write(*device_field->field, device_field->field->write_param, device_field->oldval, newval); device_field->oldval = newval; } @@ -2002,12 +2002,26 @@ static astring *get_keyboard_key_name(const input_field_config *field) states based on the tokens -------------------------------------------------*/ +inline const char *get_device_tag(const device_t &device, const char *tag, astring &finaltag) +{ + if (strcmp(tag, DEVICE_SELF) == 0) + finaltag.cpy(device.tag()); + else if (strcmp(tag, DEVICE_SELF_OWNER) == 0) + { + assert(device.owner() != NULL); + finaltag.cpy(device.owner()->tag()); + } + else + device.subtag(finaltag, tag); + return finaltag; +} + static void init_port_state(running_machine &machine) { const char *joystick_map_default = machine.options().joystick_map(); input_port_private *portdata = machine.input_port_data; - const input_field_config *field; - const input_port_config *port; + input_field_config *field; + input_port_config *port; /* allocate live structures to mirror the configuration */ for (port = machine.m_portlist.first(); port != NULL; port = port->next()) @@ -2058,19 +2072,29 @@ static void init_port_state(running_machine &machine) } /* if this entry has device input, allocate memory for the tracking structure */ - if (field->read != NULL) + astring devicetag; + if (!field->read.isnull()) { - *readdevicetail = init_field_device_info(field,field->read_device); + *readdevicetail = init_field_device_info(field, get_device_tag(port->owner(), field->read_device, devicetag)); + field->read.late_bind(*(*readdevicetail)->device); readdevicetail = &(*readdevicetail)->next; } /* if this entry has device output, allocate memory for the tracking structure */ - if (field->write != NULL) + if (!field->write.isnull()) { - *writedevicetail = init_field_device_info(field,field->write_device); + *writedevicetail = init_field_device_info(field, get_device_tag(port->owner(), field->write_device, devicetag)); + field->write.late_bind(*(*writedevicetail)->device); writedevicetail = &(*writedevicetail)->next; } + /* if this entry has device output, allocate memory for the tracking structure */ + if (!field->crossmapper.isnull()) + { + device_t *device = machine.device(get_device_tag(port->owner(), field->crossmapper_device, devicetag)); + field->crossmapper.late_bind(*device); + } + /* Name keyboard key names */ if ((field->type == IPT_KEYBOARD || field->type == IPT_KEYPAD) && (field->name == NULL)) { @@ -2184,10 +2208,7 @@ static device_field_info *init_field_device_info(const input_field_config *field for (mask = field->mask; !(mask & 1); mask >>= 1) info->shift++; - if (device_name != NULL) - info->device = field->machine().device(device_name); - else - info->device = &field->port().owner(); + info->device = (device_name != NULL) ? field->machine().device(device_name) : &field->port().owner(); info->oldval = field->defvalue >> info->shift; return info; @@ -2536,7 +2557,7 @@ g_profiler.start(PROFILER_INPUT); /* if the bits have write, call the handler */ if (device_field->oldval != newval) { - (*device_field->field->write)(*device_field->device, device_field->field, device_field->field->write_param, device_field->oldval, newval); + device_field->field->write(*device_field->field, device_field->field->write_param, device_field->oldval, newval); device_field->oldval = newval; } @@ -2910,12 +2931,10 @@ input_field_config::input_field_config(input_port_config &port, int _type, input flags(0), impulse(0), name(_name), - read(NULL), read_param(NULL), - read_device(NULL), - write(NULL), + read_device(DEVICE_SELF), write_param(NULL), - write_device(NULL), + write_device(DEVICE_SELF), min(0), max(_maskbits), sensitivity(0), @@ -2925,7 +2944,7 @@ input_field_config::input_field_config(input_port_config &port, int _type, input crossscale(0), crossoffset(0), crossaltaxis(0), - crossmapper(NULL), + crossmapper_device(DEVICE_SELF), full_turn_count(0), remap_table(NULL), way(0), |