diff options
author | Miodrag Milanovic <mmicko@gmail.com> | 2011-06-22 12:54:34 +0000 |
---|---|---|
committer | Miodrag Milanovic <mmicko@gmail.com> | 2011-06-22 12:54:34 +0000 |
commit | 2e199e3e83e03cb48c2c899818bea6583207dfab (patch) | |
tree | 68d1ae0eccd5b34113a7f52b1fdfef830d894311 | |
parent | d0793e644deb26d82b901198d64a28d1c07257e9 (diff) |
Fixed PORT_CONDITION to look relative to device (no whatsnew)
-rw-r--r-- | src/emu/inptport.c | 36 | ||||
-rw-r--r-- | src/emu/inptport.h | 2 | ||||
-rw-r--r-- | src/emu/uimenu.c | 6 | ||||
-rw-r--r-- | src/emu/validity.c | 16 |
4 files changed, 33 insertions, 27 deletions
diff --git a/src/emu/inptport.c b/src/emu/inptport.c index a3ca39af306..553941da11e 100644 --- a/src/emu/inptport.c +++ b/src/emu/inptport.c @@ -1115,7 +1115,7 @@ const char *input_field_setting_name(const input_field_config *field) /* scan the list of settings looking for a match on the current value */ for (setting = field->settinglist().first(); setting != NULL; setting = setting->next()) - if (input_condition_true(field->machine(), &setting->condition)) + if (input_condition_true(field->machine(), &setting->condition, field->port().owner())) if (setting->value == field->state->value) return setting->name; @@ -1137,7 +1137,7 @@ int input_field_has_previous_setting(const input_field_config *field) /* scan the list of settings looking for a match on the current value */ for (setting = field->settinglist().first(); setting != NULL; setting = setting->next()) - if (input_condition_true(field->machine(), &setting->condition)) + if (input_condition_true(field->machine(), &setting->condition, field->port().owner())) return (setting->value != field->state->value); return FALSE; @@ -1161,7 +1161,7 @@ void input_field_select_previous_setting(const input_field_config *field) /* scan the list of settings looking for a match on the current value */ prevsetting = NULL; for (setting = field->settinglist().first(); setting != NULL; setting = setting->next()) - if (input_condition_true(field->machine(), &setting->condition)) + if (input_condition_true(field->machine(), &setting->condition, field->port().owner())) { if (setting->value == field->state->value) { @@ -1176,7 +1176,7 @@ void input_field_select_previous_setting(const input_field_config *field) if (!found_match) { for (prevsetting = field->settinglist().first(); prevsetting != NULL; prevsetting = prevsetting->next()) - if (input_condition_true(field->machine(), &prevsetting->condition)) + if (input_condition_true(field->machine(), &prevsetting->condition, field->port().owner())) break; } @@ -1201,7 +1201,7 @@ int input_field_has_next_setting(const input_field_config *field) /* scan the list of settings looking for a match on the current value */ for (setting = field->settinglist().first(); setting != NULL; setting = setting->next()) - if (input_condition_true(field->machine(), &setting->condition)) + if (input_condition_true(field->machine(), &setting->condition, field->port().owner())) { if (found) return TRUE; @@ -1229,20 +1229,20 @@ void input_field_select_next_setting(const input_field_config *field) /* scan the list of settings looking for a match on the current value */ nextsetting = NULL; for (setting = field->settinglist().first(); setting != NULL; setting = setting->next()) - if (input_condition_true(field->machine(), &setting->condition)) + if (input_condition_true(field->machine(), &setting->condition, field->port().owner())) if (setting->value == field->state->value) break; /* if we found one, scan forward for the next valid one */ if (setting != NULL) for (nextsetting = setting->next(); nextsetting != NULL; nextsetting = nextsetting->next()) - if (input_condition_true(field->machine(), &nextsetting->condition)) + if (input_condition_true(field->machine(), &nextsetting->condition, field->port().owner())) break; /* if we hit the end, search from the beginning */ if (nextsetting == NULL) for (nextsetting = field->settinglist().first(); nextsetting != NULL; nextsetting = nextsetting->next()) - if (input_condition_true(field->machine(), &nextsetting->condition)) + if (input_condition_true(field->machine(), &nextsetting->condition, field->port().owner())) break; /* update the value to the previous one */ @@ -1430,7 +1430,7 @@ input_port_value input_port_read_direct(const input_port_config *port) /* update read values */ for (device_field = port->state->readdevicelist; device_field != NULL; device_field = device_field->next) - if (input_condition_true(port->machine(), &device_field->field->condition)) + if (input_condition_true(port->machine(), &device_field->field->condition, port->owner())) { /* replace the bits with bits from the device */ input_port_value newval = device_field->field->read(*device_field->field, device_field->field->read_param); @@ -1452,7 +1452,7 @@ input_port_value input_port_read_direct(const input_port_config *port) /* merge in analog portions */ for (analog = port->state->analoglist; analog != NULL; analog = analog->next) - if (input_condition_true(port->machine(), &analog->field->condition)) + if (input_condition_true(port->machine(), &analog->field->condition, port->owner())) { /* start with the raw value */ INT32 value = analog->accum; @@ -1541,7 +1541,7 @@ int input_port_get_crosshair_position(running_machine &machine, int player, floa for (port = machine.m_portlist.first(); port != NULL; port = port->next()) for (field = port->first_field(); field != NULL; field = field->next()) if (field->player == player && field->crossaxis != CROSSHAIR_AXIS_NONE) - if (input_condition_true(machine, &field->condition)) + if (input_condition_true(machine, &field->condition, port->owner())) { analog_field_state *analog = field->state->analog; INT32 rawvalue = apply_analog_settings(analog->accum, analog) & (analog->field->mask >> analog->shift); @@ -1617,7 +1617,7 @@ void input_port_update_defaults(running_machine &machine) /* first compute the default value for the entire port */ for (field = port->first_field(); field != NULL; field = field->next()) - if (input_condition_true(machine, &field->condition)) + if (input_condition_true(machine, &field->condition, port->owner())) port->state->defvalue = (port->state->defvalue & ~field->mask) | (field->state->value & field->mask); } } @@ -1672,7 +1672,7 @@ void input_port_write_direct(const input_port_config *port, input_port_value dat 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)) + if (device_field->field->type == IPT_OUTPUT && input_condition_true(port->machine(), &device_field->field->condition, port->owner())) { input_port_value newval = ( (port->state->outputvalue ^ device_field->field->defvalue ) & device_field->field->mask) >> device_field->shift; @@ -1724,7 +1724,7 @@ void input_port_write_safe(running_machine &machine, const char *tag, input_port if the given condition attached is true -------------------------------------------------*/ -int input_condition_true(running_machine &machine, const input_condition *condition) +int input_condition_true(running_machine &machine, const input_condition *condition,device_t &owner) { input_port_value condvalue; @@ -1733,7 +1733,9 @@ int input_condition_true(running_machine &machine, const input_condition *condit return TRUE; /* otherwise, read the referenced port */ - condvalue = input_port_read(machine, condition->tag); + astring conditiontag; + owner.subtag(conditiontag, condition->tag); + condvalue = input_port_read(machine, conditiontag.cstr()); /* based on the condition encoded, determine truth */ switch (condition->condition) @@ -2455,7 +2457,7 @@ g_profiler.start(PROFILER_INPUT); /* now loop back and modify based on the inputs */ for (field = port->first_field(); field != NULL; field = field->next()) - if (input_condition_true(port->machine(), &field->condition)) + if (input_condition_true(port->machine(), &field->condition, port->owner())) { /* accumulate VBLANK bits */ if (field->type == IPT_VBLANK) @@ -2480,7 +2482,7 @@ g_profiler.start(PROFILER_INPUT); /* call device line write handlers */ newvalue = input_port_read_direct(port); 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)) + if (device_field->field->type != IPT_OUTPUT && input_condition_true(port->machine(), &device_field->field->condition, port->owner())) { input_port_value newval = (newvalue & device_field->field->mask) >> device_field->shift; diff --git a/src/emu/inptport.h b/src/emu/inptport.h index 6e98213ad97..ee045a6b485 100644 --- a/src/emu/inptport.h +++ b/src/emu/inptport.h @@ -1242,7 +1242,7 @@ void input_port_write_safe(running_machine &machine, const char *tag, input_port /* ----- misc helper functions ----- */ /* return the TRUE if the given condition attached is true */ -int input_condition_true(running_machine &machine, const input_condition *condition); +int input_condition_true(running_machine &machine, const input_condition *condition,device_t &owner); /* convert an input_port_token to a default string */ const char *input_port_string_from_token(const char *token); diff --git a/src/emu/uimenu.c b/src/emu/uimenu.c index 929a385dff8..4f33bd49db5 100644 --- a/src/emu/uimenu.c +++ b/src/emu/uimenu.c @@ -1868,7 +1868,7 @@ static void menu_input_specific_populate(running_machine &machine, ui_menu *menu const char *name = input_field_name(field); /* add if we match the group and we have a valid name */ - if (name != NULL && input_condition_true(machine, &field->condition) && + if (name != NULL && input_condition_true(machine, &field->condition, port->owner()) && (field->category == 0 || input_category_active(machine, field->category)) && ((field->type == IPT_OTHER && field->name != NULL) || input_type_group(machine, field->type, field->player) != IPG_INVALID)) { @@ -2216,7 +2216,7 @@ static void menu_settings_populate(running_machine &machine, ui_menu *menu, sett /* loop over input ports and set up the current values */ for (port = machine.m_portlist.first(); port != NULL; port = port->next()) for (field = port->fieldlist().first(); field != NULL; field = field->next()) - if (field->type == type && input_condition_true(machine, &field->condition)) + if (field->type == type && input_condition_true(machine, &field->condition, port->owner())) { UINT32 flags = 0; @@ -2470,7 +2470,7 @@ static void menu_analog_populate(running_machine &machine, ui_menu *menu) /* loop over input ports and add the items */ for (port = machine.m_portlist.first(); port != NULL; port = port->next()) for (field = port->fieldlist().first(); field != NULL; field = field->next()) - if (input_type_is_analog(field->type) && input_condition_true(machine, &field->condition)) + if (input_type_is_analog(field->type) && input_condition_true(machine, &field->condition, port->owner())) { input_field_user_settings settings; int use_autocenter = FALSE; diff --git a/src/emu/validity.c b/src/emu/validity.c index af9a3efb00c..7424e351cae 100644 --- a/src/emu/validity.c +++ b/src/emu/validity.c @@ -1038,10 +1038,12 @@ static bool validate_inputs(driver_enumerator &drivlist, int_map &defstr_map, io if (field->condition.tag != NULL) { /* find a matching port */ - for (scanport = portlist.first(); scanport != NULL; scanport = scanport->next()) - if (strcmp(field->condition.tag, scanport->tag()) == 0) + for (scanport = portlist.first(); scanport != NULL; scanport = scanport->next()) { + astring porttag; + port->owner().subtag(porttag, field->condition.tag); + if (strcmp(porttag.cstr(), scanport->tag()) == 0) break; - + } /* if none, error */ if (scanport == NULL) { @@ -1055,10 +1057,12 @@ static bool validate_inputs(driver_enumerator &drivlist, int_map &defstr_map, io if (setting->condition.tag != NULL) { /* find a matching port */ - for (scanport = portlist.first(); scanport != NULL; scanport = scanport->next()) - if (strcmp(setting->condition.tag, scanport->tag()) == 0) + for (scanport = portlist.first(); scanport != NULL; scanport = scanport->next()) { + astring porttag; + port->owner().subtag(porttag, setting->condition.tag); + if (strcmp(porttag.cstr(), scanport->tag()) == 0) break; - + } /* if none, error */ if (scanport == NULL) { |