diff --git a/src/emu/clifront.c b/src/emu/clifront.c index cdbda539abe..20f3c46cf92 100644 --- a/src/emu/clifront.c +++ b/src/emu/clifront.c @@ -197,33 +197,35 @@ int cli_frontend::execute(int argc, char **argv) for (software_part *swpart = software_find_part(swinfo, NULL, NULL); swpart != NULL; swpart = software_part_next(swpart)) { const char *mount = software_part_get_feature(swpart, "automount"); - if (mount==NULL || strcmp(mount,"no")!=0) { - // loop trough all parts - // search for a device with the right interface - const device_image_interface *image = NULL; - for (bool gotone = config.devicelist().first(image); gotone; gotone = image->next(image)) - { - const char *interface = image->image_interface(); - if (interface != NULL) + if (is_software_compatible(swpart, swlist)) { + if (mount==NULL || strcmp(mount,"no")!=0) { + // loop trough all parts + // search for a device with the right interface + const device_image_interface *image = NULL; + for (bool gotone = config.devicelist().first(image); gotone; gotone = image->next(image)) { - if (!strcmp(interface, swpart->interface_)) + const char *interface = image->image_interface(); + if (interface != NULL) { - const char *option = m_options.value(image->brief_instance_name()); - // mount only if not already mounted - if (strlen(option)==0) { - astring val; - val.printf("%s:%s:%s",swlist->list_name,m_options.software_name(),swpart->name); - // call this in order to set slot devices according to mounting - m_options.parse_slot_devices(argc, argv, option_errors, image->instance_name(), val.cstr()); + if (!strcmp(interface, swpart->interface_)) + { + const char *option = m_options.value(image->brief_instance_name()); + // mount only if not already mounted + if (strlen(option)==0) { + astring val; + val.printf("%s:%s:%s",swlist->list_name,m_options.software_name(),swpart->name); + // call this in order to set slot devices according to mounting + m_options.parse_slot_devices(argc, argv, option_errors, image->instance_name(), val.cstr()); + } + break; } - break; } } } + found = TRUE; } } software_list_close(list); - found = TRUE; break; } diff --git a/src/emu/softlist.c b/src/emu/softlist.c index f8d1203b21c..37ddf45cee9 100644 --- a/src/emu/softlist.c +++ b/src/emu/softlist.c @@ -1211,7 +1211,7 @@ static int softlist_penalty_compare(const char *source, const char *target) software_list_find_approx_matches -------------------------------------------------*/ -void software_list_find_approx_matches(software_list *swlist, const char *name, int matches, software_info **list, const char* interface) +void software_list_find_approx_matches(software_list_config *swlistcfg, software_list *swlist, const char *name, int matches, software_info **list, const char* interface) { #undef rand @@ -1238,7 +1238,7 @@ void software_list_find_approx_matches(software_list *swlist, const char *name, software_info *candidate = swinfo; software_part *part = software_find_part(swinfo, NULL, NULL); - if (interface==NULL || !strcmp(interface, part->interface_)) + if ((interface==NULL || !strcmp(interface, part->interface_)) && (is_software_compatible(part, swlistcfg))) { /* pick the best match between driver name and description */ @@ -1442,7 +1442,7 @@ void software_display_matches(const device_list &devlist,emu_options &options, c software_list_parse(list, list->error_proc, NULL); // get the top 5 approximate matches for the selected device interface (i.e. only carts for cartslot, etc.) - software_list_find_approx_matches(list, name, ARRAY_LENGTH(matches), matches, interface); + software_list_find_approx_matches(swlist, list, name, ARRAY_LENGTH(matches), matches, interface); if (matches[0] != 0) { @@ -1677,6 +1677,17 @@ bool load_software_part(emu_options &options, device_image_interface *image, con *full_sw_name = auto_alloc_array( image->device().machine(), char, strlen(swlist_name) + strlen(software_info_ptr->shortname) + strlen(software_part_ptr->name) + 3 ); sprintf( *full_sw_name, "%s:%s:%s", swlist_name, software_info_ptr->shortname, software_part_ptr->name ); + for (device_t *swlists = image->device().machine().devicelist().first(SOFTWARE_LIST); swlists != NULL; swlists = swlists->typenext()) + { + software_list_config *swlist = (software_list_config *)downcast(swlists)->inline_config(); + if (strcmp(swlist->list_name,swlist_name)==0) { + if (!is_software_compatible(software_part_ptr, swlist)) { + mame_printf_warning("WARNING! the set %s might not work on this system due to missing filter(s) '%s'\n",software_info_ptr->shortname,swlist->filter); + } + break; + } + } + { const char *requirement = software_part_get_feature(software_part_ptr, "requirement"); if (requirement!=NULL) { @@ -1776,6 +1787,26 @@ const char *software_part_get_feature(software_part *part, const char *feature_n return retVal; } +/*------------------------------------------------- + is_software_compatible + -------------------------------------------------*/ + +bool is_software_compatible(software_part *swpart, software_list_config *swlist) +{ + const char *compatibility = software_part_get_feature(swpart, "compatibility"); + const char *filter = swlist->filter; + if ((compatibility==NULL) || (filter==NULL)) return TRUE; + astring comp = astring(compatibility,","); + char *filt = core_strdup(filter); + char *token = strtok(filt,","); + while (token!= NULL) + { + if (comp.find(0,astring(token,","))!=-1) return TRUE; + token = strtok (NULL, ","); + } + return FALSE; +} + /*************************************************************************** DEVICE INTERFACE ***************************************************************************/ diff --git a/src/emu/softlist.h b/src/emu/softlist.h index ce4f150cc35..37bb48b07d5 100644 --- a/src/emu/softlist.h +++ b/src/emu/softlist.h @@ -97,6 +97,14 @@ struct _software_list int list_entries; }; +typedef struct _software_list_config software_list_config; +struct _software_list_config +{ + char *list_name; + UINT32 list_type; + const char *filter; +}; + /* Handling a software list */ software_list *software_list_open(emu_options &options, const char *listname, int is_preload, void (*error_proc)(const char *message)); void software_list_close(software_list *swlist); @@ -119,6 +127,8 @@ void software_display_matches(const device_list &devlist, emu_options &options,c const char *software_get_default_slot(const device_list &devlist, emu_options &options, const device_image_interface *image, const char* default_card_slot); void validate_softlists(emu_options &options); + +bool is_software_compatible(software_part *swpart, software_list_config *swlist); /********************************************************************* Driver software list configuration @@ -130,14 +140,6 @@ DECLARE_LEGACY_DEVICE(SOFTWARE_LIST, software_list); #define SOFTWARE_SUPPORTED_PARTIAL 1 #define SOFTWARE_SUPPORTED_NO 2 -typedef struct _software_list_config software_list_config; -struct _software_list_config -{ - char *list_name; - UINT32 list_type; - const char *filter; -}; - #define SOFTWARE_LIST_ORIGINAL_SYSTEM 0 #define SOFTWARE_LIST_COMPATIBLE_SYSTEM 1 diff --git a/src/emu/uiswlist.c b/src/emu/uiswlist.c index 309c4bcfcf4..d0659143c96 100644 --- a/src/emu/uiswlist.c +++ b/src/emu/uiswlist.c @@ -126,20 +126,6 @@ int ui_menu_software_list::compare_entries(const ui_menu_software_entry_info *e1 return result; } -bool ui_menu_software_list::if_compatible(const char *compatibility, const char *filter) -{ - if ((compatibility==NULL) || (filter==NULL)) return TRUE; - astring comp = astring(compatibility,","); - char *filt = core_strdup(filter); - char *token = strtok(filt,","); - while (token!= NULL) - { - if (comp.find(0,astring(token,","))!=-1) return TRUE; - token = strtok (NULL, ","); - } - return FALSE; -} - /* populate a specific list */ ui_menu_software_entry_info *ui_menu_software_list::append_software_entry(software_info *swinfo, device_image_interface* image) @@ -152,8 +138,7 @@ ui_menu_software_entry_info *ui_menu_software_list::append_software_entry(softwa // check if at least one of the parts has the correct interface and add a menu entry only in this case for (software_part *swpart = software_find_part(swinfo, NULL, NULL); swpart != NULL; swpart = software_part_next(swpart)) { - const char *compatibility = software_part_get_feature(swpart, "compatibility"); - if ((strcmp(interface, swpart->interface_) == 0) && if_compatible(compatibility, swlist->filter)) + if ((strcmp(interface, swpart->interface_) == 0) && is_software_compatible(swpart, swlist)) { entry_updated = TRUE; // allocate a new entry diff --git a/src/emu/uiswlist.h b/src/emu/uiswlist.h index 25c0dbc2e69..ad57fc279c8 100644 --- a/src/emu/uiswlist.h +++ b/src/emu/uiswlist.h @@ -55,7 +55,6 @@ private: int compare_entries(const ui_menu_software_entry_info *e1, const ui_menu_software_entry_info *e2, bool shortname); ui_menu_software_entry_info *append_software_entry(software_info *swinfo, device_image_interface* image); bool swinfo_has_multiple_parts(software_info *swinfo, const char *interface); - bool if_compatible(const char *compatibility, const char *filter); }; class ui_menu_software : public ui_menu {