diff --git a/src/emu/ioport.c b/src/emu/ioport.c index 656977b4367..2f11cac3ada 100644 --- a/src/emu/ioport.c +++ b/src/emu/ioport.c @@ -245,6 +245,7 @@ struct ioport_field_live ioport_value value; // current value of this port UINT8 impulse; // counter for impulse controls bool last; // were we pressed last time? + bool toggle; // current toggle setting digital_joystick::direction_t joydir; // digital joystick direction index astring name; // overridden name }; @@ -1813,6 +1814,12 @@ void ioport_field::get_user_settings(user_settings &settings) settings.centerdelta = m_live->analog->centerdelta(); settings.reverse = m_live->analog->reverse(); } + + // non-analog settings + else + { + settings.toggle = m_live->toggle; + } } @@ -1845,6 +1852,12 @@ void ioport_field::set_user_settings(const user_settings &settings) m_live->analog->m_centerdelta = settings.centerdelta; m_live->analog->m_reverse = settings.reverse; } + + // non-analog settings + else + { + m_live->toggle = settings.toggle; + } } @@ -2036,12 +2049,12 @@ void ioport_field::frame_update(ioport_value &result, bool mouse_down) // if this is a switch-down event, handle impulse and toggle if (changed && curstate) { - // impluse controls: reset the impulse counter + // impulse controls: reset the impulse counter if (effective_impulse != 0 && m_live->impulse == 0) m_live->impulse = effective_impulse; // toggle controls: flip the toggle state or advance to the next setting - if (toggle()) + if (m_live->toggle) { if (m_settinglist.count() == 0) m_live->value ^= m_mask; @@ -2060,7 +2073,7 @@ void ioport_field::frame_update(ioport_value &result, bool mouse_down) // for toggle switches, the current value is folded into the port's default value // so we always return FALSE here - if (toggle()) + if (m_live->toggle) curstate = false; // additional logic to restrict digital joysticks @@ -2262,6 +2275,7 @@ ioport_field_live::ioport_field_live(ioport_field &field, analog_field *analog) value(field.defvalue()), impulse(0), last(0), + toggle(field.toggle()), joydir(digital_joystick::JOYDIR_COUNT) { // fill in the basic values @@ -3187,11 +3201,20 @@ bool ioport_manager::load_game_config(xml_data_node *portnode, int type, int pla if (newseq[seqtype][0] != INPUT_CODE_INVALID) field->live().seq[seqtype] = newseq[seqtype]; - // for non-analog fields, fetch the value + // fetch configurable attributes + // for non-analog fields if (field->live().analog == NULL) + { + // fetch the value field->live().value = xml_get_attribute_int(portnode, "value", field->defvalue()); + + // fetch yes/no for toggle setting + const char *togstring = xml_get_attribute_string(portnode, "toggle", NULL); + if (togstring != NULL) + field->live().toggle = (strcmp(togstring, "yes") == 0); + } - // for analog fields, fetch configurable analog attributes + // for analog fields else { // get base attributes @@ -3338,7 +3361,10 @@ void ioport_manager::save_game_inputs(xml_data_node *parentnode) // non-analog changes if (!field->is_analog()) + { changed |= ((field->live().value & field->mask()) != (field->defvalue() & field->mask())); + changed |= (field->live().toggle != field->toggle()); + } // analog changes else @@ -3373,6 +3399,8 @@ void ioport_manager::save_game_inputs(xml_data_node *parentnode) { if ((field->live().value & field->mask()) != (field->defvalue() & field->mask())) xml_set_attribute_int(portnode, "value", field->live().value & field->mask()); + if (field->live().toggle != field->toggle()) + xml_set_attribute(portnode, "toggle", field->live().toggle ? "yes" : "no"); } // write out analog changes diff --git a/src/emu/ioport.h b/src/emu/ioport.h index 3bc1e65fe94..934bac1bbb2 100644 --- a/src/emu/ioport.h +++ b/src/emu/ioport.h @@ -1078,6 +1078,7 @@ public: INT32 delta; // for analog controls INT32 centerdelta; // for analog controls bool reverse; // for analog controls + bool toggle; // for non-analog controls }; void get_user_settings(user_settings &settings); void set_user_settings(const user_settings &settings);