From 740e2df797e99d064a7d16f8cebd6a747faadefe Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Tue, 17 Dec 2019 12:11:53 +1100 Subject: [PATCH] romident: find software lists attached to devices that aren't in any system by default (e.g. spectrum_mgt_flop) --- src/frontend/mame/media_ident.cpp | 90 ++++++++++++++----------------- 1 file changed, 39 insertions(+), 51 deletions(-) diff --git a/src/frontend/mame/media_ident.cpp b/src/frontend/mame/media_ident.cpp index dc88fae4365..9881e992a51 100644 --- a/src/frontend/mame/media_ident.cpp +++ b/src/frontend/mame/media_ident.cpp @@ -332,73 +332,61 @@ void media_identifier::digest_data(std::vector &info, char const *nam void media_identifier::match_hashes(std::vector &info) { - std::unordered_set listnames; - - // iterate over drivers - m_drivlist.reset(); - while (m_drivlist.next()) - { - // iterate over regions and files within the region - device_t &device = m_drivlist.config()->root_device(); - for (romload::region const ®ion : romload::entries(device.rom_region()).get_regions()) - { - for (romload::file const &rom : region.get_files()) + auto match_device = + [&info, listnames = std::unordered_set()] (device_t &device) mutable { - util::hash_collection const romhashes(rom.get_hashdata()); - if (!romhashes.flag(util::hash_collection::FLAG_NO_DUMP)) + // iterate over regions and files within the region + for (romload::region const ®ion : romload::entries(device.rom_region()).get_regions()) { - for (file_info &file : info) - file.match(device, rom, romhashes); - } - } - } - - // next iterate over softlists - for (software_list_device &swlistdev : software_list_device_iterator(device)) - { - if (listnames.insert(swlistdev.list_name()).second) - { - for (software_info const &swinfo : swlistdev.get_info()) - { - for (software_part const &part : swinfo.parts()) + for (romload::file const &rom : region.get_files()) { - for (rom_entry const *region = part.romdata().data(); region; region = rom_next_region(region)) + util::hash_collection const romhashes(rom.get_hashdata()); + if (!romhashes.flag(util::hash_collection::FLAG_NO_DUMP)) { - for (rom_entry const *rom = rom_first_file(region); rom; rom = rom_next_file(rom)) + for (file_info &file : info) + file.match(device, rom, romhashes); + } + } + } + + // next iterate over softlists + for (software_list_device &swlistdev : software_list_device_iterator(device)) + { + if (!listnames.insert(swlistdev.list_name()).second) + continue; + + for (software_info const &swinfo : swlistdev.get_info()) + { + for (software_part const &part : swinfo.parts()) + { + for (rom_entry const *region = part.romdata().data(); region; region = rom_next_region(region)) { - util::hash_collection romhashes(ROM_GETHASHDATA(rom)); - if (!romhashes.flag(util::hash_collection::FLAG_NO_DUMP)) + for (rom_entry const *rom = rom_first_file(region); rom; rom = rom_next_file(rom)) { - for (file_info &file : info) - file.match(swlistdev.list_name(), swinfo, *rom, romhashes); + util::hash_collection romhashes(ROM_GETHASHDATA(rom)); + if (!romhashes.flag(util::hash_collection::FLAG_NO_DUMP)) + { + for (file_info &file : info) + file.match(swlistdev.list_name(), swinfo, *rom, romhashes); + } } } } } } - } - } - } + }; - // iterator over devices + // iterate over drivers + m_drivlist.reset(); + while (m_drivlist.next()) + match_device(m_drivlist.config()->root_device()); + + // iterator over registered device types machine_config config(GAME_NAME(___empty), m_drivlist.options()); machine_config::token const tok(config.begin_configuration(config.root_device())); for (device_type type : registered_device_types) { - // iterate over regions and files within the region - device_t *const device = config.device_add("_tmp", type, 0); - for (romload::region const ®ion : romload::entries(device->rom_region()).get_regions()) - { - for (romload::file const &rom : region.get_files()) - { - util::hash_collection const romhashes(rom.get_hashdata()); - if (!romhashes.flag(util::hash_collection::FLAG_NO_DUMP)) - { - for (file_info &file : info) - file.match(*device, rom, romhashes); - } - } - } + match_device(*config.device_add("_tmp", type, 0)); config.device_remove("_tmp"); } }