summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
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
commit2e199e3e83e03cb48c2c899818bea6583207dfab (patch)
tree68d1ae0eccd5b34113a7f52b1fdfef830d894311
parentd0793e644deb26d82b901198d64a28d1c07257e9 (diff)
Fixed PORT_CONDITION to look relative to device (no whatsnew)
-rw-r--r--src/emu/inptport.c36
-rw-r--r--src/emu/inptport.h2
-rw-r--r--src/emu/uimenu.c6
-rw-r--r--src/emu/validity.c16
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)
{