bool emu_options::parse_slot_devices(int argc, char *argv[], astring &error_string, const char *name, const char *value) { // an initial parse to capture the initial set of values bool result = core_options::parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string); // keep adding slot options until we stop seeing new stuff bool isfirstpass = true; while (add_slot_options(isfirstpass)) { result = core_options::parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string); isfirstpass = false; } // add device options and reparse add_device_options(true); if (name != NULL && exists(name)) set_value(name, value, OPTION_PRIORITY_CMDLINE, error_string); result = core_options::parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string); int num = 0; do { num = options_count(); update_slot_options(); result = core_options::parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string); } while (num != options_count()); return result; }
bool emu_options::parse_slot_devices(int argc, char *argv[], std::string &error_string, const char *name, const char *value, const software_part *swpart) { // an initial parse to capture the initial set of values bool result; core_options::parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string); // keep adding slot options until we stop seeing new stuff while (add_slot_options(swpart)) core_options::parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string); // add device options and reparse add_device_options(); if (name != nullptr && exists(name)) set_value(name, value, OPTION_PRIORITY_SUBCMD, error_string); core_options::parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string); int num; do { num = options_count(); update_slot_options(swpart); result = core_options::parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string); } while (num != options_count()); update_cached_options(); return result; }
void emu_options::update_slot_options() { // look up the system configured by name; if no match, do nothing const game_driver *cursystem = system(); if (cursystem == NULL) return; machine_config config(*cursystem, *this); // iterate through all slot devices slot_interface_iterator iter(config.root_device()); for (device_slot_interface *slot = iter.first(); slot != NULL; slot = iter.next()) { // retrieve info about the device instance const char *name = slot->device().tag() + 1; if (exists(name) && slot->first_option() != NULL) { std::string defvalue; slot->get_default_card_software(defvalue); if (defvalue.length() > 0) { set_default_value(name, defvalue.c_str()); const device_slot_option *option = slot->option(defvalue.c_str()); set_flag(name, ~OPTION_FLAG_INTERNAL, (option != NULL && !option->selectable()) ? OPTION_FLAG_INTERNAL : 0); } } } while (add_slot_options(false)); add_device_options(false); }
void emu_options::set_system_name(const char *name) { // remember the original system name std::string old_system_name(system_name()); // if the system name changed, fix up the device options if (old_system_name.compare(name)!=0) { // first set the new name std::string error; set_value(OPTION_SYSTEMNAME, name, OPTION_PRIORITY_CMDLINE, error); assert(error.empty()); // remove any existing device options and then add them afresh remove_device_options(); while (add_slot_options()) { } // then add the options add_device_options(); int num; do { num = options_count(); update_slot_options(); } while(num != options_count()); } }
bool emu_options::parse_slot_devices(int argc, char *argv[], astring &error_string, const char *name, const char *value) { bool isfirst = true; bool result = core_options::parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string); while (add_slot_options(isfirst)) { result = core_options::parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string); isfirst = false; } add_device_options(true); if (name && exists(name)) { set_value(name, value, OPTION_PRIORITY_CMDLINE, error_string); } result = core_options::parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string); update_slot_options(); while (add_slot_options(false)); add_device_options(true); result = core_options::parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string); return result; }
void emu_options::set_system_name(const char *name) { // remember the original system name astring old_system_name(system_name()); // if the system name changed, fix up the device options if (old_system_name != name) { // first set the new name astring error; set_value(OPTION_SYSTEMNAME, name, OPTION_PRIORITY_CMDLINE, error); assert(!error); // remove any existing device options remove_device_options(); bool isfirst = true; while (add_slot_options(isfirst)) { isfirst = false; } // then add the options add_device_options(true); } }
void emu_options::update_slot_options(const software_part *swpart) { // look up the system configured by name; if no match, do nothing const game_driver *cursystem = system(); if (cursystem == nullptr) return; machine_config config(*cursystem, *this); // iterate through all slot devices slot_interface_iterator iter(config.root_device()); for (device_slot_interface *slot = iter.first(); slot != nullptr; slot = iter.next()) { // retrieve info about the device instance const char *name = slot->device().tag() + 1; if (exists(name) && !slot->option_list().empty()) { std::string defvalue = slot->get_default_card_software(); if (defvalue.empty()) { // keep any non-default setting if (priority(name) > OPTION_PRIORITY_DEFAULT) continue; // reinstate the actual default value as configured if (slot->default_option() != nullptr) defvalue.assign(slot->default_option()); } // set the value and hide the option if not selectable set_default_value(name, defvalue.c_str()); const device_slot_option *option = slot->option(defvalue.c_str()); set_flag(name, ~OPTION_FLAG_INTERNAL, (option != nullptr && !option->selectable()) ? OPTION_FLAG_INTERNAL : 0); } } while (add_slot_options(swpart)) { } add_device_options(); }
void emu_options::set_system_name(const char *name) { // remember the original system name std::string old_system_name(system_name()); bool new_system = old_system_name.compare(name)!=0; // if the system name changed, fix up the device options if (new_system) { // first set the new name std::string error; set_value(OPTION_SYSTEMNAME, name, OPTION_PRIORITY_CMDLINE, error); assert(error.empty()); // remove any existing device options remove_device_options(); } else { // revert device options set for the old software revert(OPTION_PRIORITY_SUBCMD, OPTION_PRIORITY_SUBCMD); } // get the new system const game_driver *cursystem = system(); if (cursystem == nullptr) return; if (*software_name() != 0) { std::string sw_load(software_name()); std::string sw_list, sw_name, sw_part, sw_instance, option_errors, error_string; int left = sw_load.find_first_of(':'); int middle = sw_load.find_first_of(':', left + 1); int right = sw_load.find_last_of(':'); sw_list = sw_load.substr(0, left - 1); sw_name = sw_load.substr(left + 1, middle - left - 1); sw_part = sw_load.substr(middle + 1, right - middle - 1); sw_instance = sw_load.substr(right + 1); sw_load.assign(sw_load.substr(0, right)); // look up the software part machine_config config(*cursystem, *this); software_list_device *swlist = software_list_device::find_by_name(config, sw_list.c_str()); software_info *swinfo = swlist != nullptr ? swlist->find(sw_name.c_str()) : nullptr; software_part *swpart = swinfo != nullptr ? swinfo->find_part(sw_part.c_str()) : nullptr; // then add the options if (new_system) { while (add_slot_options(swpart)) { } add_device_options(); } set_value(OPTION_SOFTWARENAME, sw_name.c_str(), OPTION_PRIORITY_CMDLINE, error_string); if (exists(sw_instance.c_str())) set_value(sw_instance.c_str(), sw_load.c_str(), OPTION_PRIORITY_SUBCMD, error_string); int num; do { num = options_count(); update_slot_options(swpart); } while(num != options_count()); } else if (new_system) { // add the options afresh while (add_slot_options()) { } add_device_options(); int num; do { num = options_count(); update_slot_options(); } while(num != options_count()); } }