diff options
author | Vas Crabb <vas@vastheman.com> | 2017-09-18 14:23:08 +1000 |
---|---|---|
committer | Vas Crabb <vas@vastheman.com> | 2017-09-18 14:23:08 +1000 |
commit | 796b585f722b5d74d9c2f7db839baaa6a332a4b0 (patch) | |
tree | 4da30d37ce6fe35cd9e8e43f77940d68ca06497b /src/frontend | |
parent | 54f759260123e01dfd37473d3d9497882dc7f86f (diff) |
Turn most of the ROM entry accessor macros into templates, and make them work on tiny_rom_entry/rom_entry pointers/references, also claw back a little performance lost in the ROM entry refactoring
Diffstat (limited to 'src/frontend')
-rw-r--r-- | src/frontend/mame/info.cpp | 22 | ||||
-rw-r--r-- | src/frontend/mame/ui/devopt.cpp | 21 | ||||
-rw-r--r-- | src/frontend/mame/ui/info.cpp | 7 | ||||
-rw-r--r-- | src/frontend/mame/ui/miscmenu.cpp | 50 | ||||
-rw-r--r-- | src/frontend/mame/ui/selgame.cpp | 11 | ||||
-rw-r--r-- | src/frontend/mame/ui/selmenu.cpp | 29 | ||||
-rw-r--r-- | src/frontend/mame/ui/utils.cpp | 5 |
7 files changed, 74 insertions, 71 deletions
diff --git a/src/frontend/mame/info.cpp b/src/frontend/mame/info.cpp index 460c3f8c3e2..42c1667f86a 100644 --- a/src/frontend/mame/info.cpp +++ b/src/frontend/mame/info.cpp @@ -649,21 +649,23 @@ void info_xml_creator::output_sampleof(device_t &device) void info_xml_creator::output_bios(device_t const &device) { // first determine the default BIOS name - std::string defaultname; - for (const rom_entry &rom : device.rom_region_vector()) - if (ROMENTRY_ISDEFAULT_BIOS(&rom)) - defaultname = ROM_GETNAME(&rom); + char const *defaultname(nullptr); + for (tiny_rom_entry const *rom = device.rom_region(); rom && !ROMENTRY_ISEND(rom); ++rom) + { + if (ROMENTRY_ISDEFAULT_BIOS(rom)) + defaultname = rom->name; + } // iterate over ROM entries and look for BIOSes - for (const rom_entry &rom : device.rom_region_vector()) + for (tiny_rom_entry const *rom = device.rom_region(); rom && !ROMENTRY_ISEND(rom); ++rom) { - if (ROMENTRY_ISSYSTEM_BIOS(&rom)) + if (ROMENTRY_ISSYSTEM_BIOS(rom)) { // output extracted name and descriptions fprintf(m_output, "\t\t<biosset"); - fprintf(m_output, " name=\"%s\"", util::xml::normalize_string(ROM_GETNAME(&rom))); - fprintf(m_output, " description=\"%s\"", util::xml::normalize_string(ROM_GETHASHDATA(&rom))); - if (defaultname == ROM_GETNAME(&rom)) + fprintf(m_output, " name=\"%s\"", util::xml::normalize_string(rom->name)); + fprintf(m_output, " description=\"%s\"", util::xml::normalize_string(rom->hashdata)); + if (defaultname && !std::strcmp(defaultname, rom->name)) fprintf(m_output, " default=\"yes\""); fprintf(m_output, "/>\n"); } @@ -707,7 +709,7 @@ void info_xml_creator::output_rom(driver_enumerator *drivlist, device_t &device) if (!is_disk && is_bios) { // scan backwards through the ROM entries - for (const rom_entry *brom = rom - 1; brom != device.rom_region(); brom--) + for (const rom_entry *brom = rom - 1; brom != &device.rom_region_vector().front(); brom--) { if (ROMENTRY_ISSYSTEM_BIOS(brom)) { diff --git a/src/frontend/mame/ui/devopt.cpp b/src/frontend/mame/ui/devopt.cpp index 1d7f81036d6..1b683b4418b 100644 --- a/src/frontend/mame/ui/devopt.cpp +++ b/src/frontend/mame/ui/devopt.cpp @@ -145,25 +145,28 @@ void menu_device_config::populate(float &customtop, float &custombottom) int bios = 0; if (dev->rom_region()) { - std::string bios_str; // first loop through roms in search of default bios (shortname) - for (const rom_entry &rom : dev->rom_region_vector()) - if (ROMENTRY_ISDEFAULT_BIOS(&rom)) - bios_str.assign(ROM_GETNAME(&rom)); + char const *bios_str(nullptr); + for (const tiny_rom_entry *rom = dev->rom_region(); !ROMENTRY_ISEND(rom); ++rom) + { + if (ROMENTRY_ISDEFAULT_BIOS(rom)) + bios_str = rom->name; + } // then loop again to count bios options and to get the default bios complete name - for (const rom_entry &rom : dev->rom_region_vector()) + char const *bios_desc(nullptr); + for (const tiny_rom_entry *rom = dev->rom_region(); !ROMENTRY_ISEND(rom); ++rom) { - if (ROMENTRY_ISSYSTEM_BIOS(&rom)) + if (ROMENTRY_ISSYSTEM_BIOS(rom)) { bios++; - if (bios_str.compare(ROM_GETNAME(&rom))==0) - bios_str.assign(ROM_GETHASHDATA(&rom)); + if (bios_str && !std::strcmp(bios_str, rom->name)) + bios_desc = rom->hashdata; } } if (bios) - util::stream_format(str, "* BIOS settings:\n %d options [default: %s]\n", bios, bios_str.c_str()); + util::stream_format(str, "* BIOS settings:\n %d options [default: %s]\n", bios, bios_desc ? bios_desc : bios_str ? bios_str : ""); } int input = 0, input_mj = 0, input_hana = 0, input_gamble = 0, input_analog = 0, input_adjust = 0; diff --git a/src/frontend/mame/ui/info.cpp b/src/frontend/mame/ui/info.cpp index 93480a17a34..4e184e19727 100644 --- a/src/frontend/mame/ui/info.cpp +++ b/src/frontend/mame/ui/info.cpp @@ -84,8 +84,11 @@ machine_static_info::machine_static_info(machine_config const &config, ioport_li m_imperfect_features |= device.type().imperfect_features(); // look for BIOS options - for (rom_entry const &rom : device.rom_region_vector()) - if (ROMENTRY_ISSYSTEM_BIOS(&rom)) { m_has_bioses = true; break; } + for (tiny_rom_entry const *rom = device.rom_region(); !m_has_bioses && rom && !ROMENTRY_ISEND(rom); ++rom) + { + if (ROMENTRY_ISSYSTEM_BIOS(rom)) + m_has_bioses = true; + } // if we don't have ports passed in, build here if (!ports) diff --git a/src/frontend/mame/ui/miscmenu.cpp b/src/frontend/mame/ui/miscmenu.cpp index 3aec236ab72..89a86760851 100644 --- a/src/frontend/mame/ui/miscmenu.cpp +++ b/src/frontend/mame/ui/miscmenu.cpp @@ -79,17 +79,16 @@ void menu_bios_selection::populate(float &customtop, float &custombottom) /* cycle through all devices for this system */ for (device_t &device : device_iterator(machine().root_device())) { - if (device.rom_region() != nullptr && !ROMENTRY_ISEND(device.rom_region())) + tiny_rom_entry const *rom(device.rom_region()); + if (rom && !ROMENTRY_ISEND(rom)) { const char *val = "default"; - for (const rom_entry *rom = device.rom_region(); !ROMENTRY_ISEND(rom); rom++) + for ( ; !ROMENTRY_ISEND(rom); rom++) { if (ROMENTRY_ISSYSTEM_BIOS(rom) && ROM_GETBIOSFLAGS(rom) == device.system_bios()) - { - val = ROM_GETHASHDATA(rom); - } + val = rom->hashdata; } - item_append(device.owner() == nullptr ? "driver" : device.tag()+1, val, FLAG_LEFT_ARROW | FLAG_RIGHT_ARROW, (void *)&device); + item_append(!device.owner() ? "driver" : (device.tag() + 1), val, FLAG_LEFT_ARROW | FLAG_RIGHT_ARROW, (void *)&device); } } @@ -118,13 +117,14 @@ void menu_bios_selection::handle() { device_t *dev = (device_t *)menu_event->itemref; int cnt = 0; - for (const rom_entry &rom : dev->rom_region_vector()) + for (const tiny_rom_entry *rom = dev->rom_region(); rom && !ROMENTRY_ISEND(rom); ++rom) { - if (ROMENTRY_ISSYSTEM_BIOS(&rom)) cnt ++; + if (ROMENTRY_ISSYSTEM_BIOS(rom)) + ++cnt; } int val = dev->system_bios() + ((menu_event->iptkey == IPT_UI_LEFT) ? -1 : +1); - if (val<1) val=cnt; - if (val>cnt) val=1; + if (val < 1) val = cnt; + if (val > cnt) val = 1; dev->set_system_bios(val); if (strcmp(dev->tag(),":")==0) { machine().options().set_value("bios", val-1, OPTION_PRIORITY_CMDLINE); @@ -804,40 +804,38 @@ void menu_machine_configure::setup_bios() if (m_drv->rom == nullptr) return; - auto entries = rom_build_entries(m_drv->rom); - std::string specbios(m_opts.bios()); - std::string default_name; - for (const rom_entry &rom : entries) - if (ROMENTRY_ISDEFAULT_BIOS(&rom)) - default_name = ROM_GETNAME(&rom); + char const *default_name(nullptr); + for (tiny_rom_entry const *rom = m_drv->rom; !ROMENTRY_ISEND(rom); ++rom) + { + if (ROMENTRY_ISDEFAULT_BIOS(rom)) + default_name = rom->name; + } std::size_t bios_count = 0; - for (const rom_entry &rom : entries) + for (tiny_rom_entry const *rom = m_drv->rom; !ROMENTRY_ISEND(rom); ++rom) { - if (ROMENTRY_ISSYSTEM_BIOS(&rom)) + if (ROMENTRY_ISSYSTEM_BIOS(rom)) { - std::string name(ROM_GETHASHDATA(&rom)); - std::string biosname(ROM_GETNAME(&rom)); - int bios_flags = ROM_GETBIOSFLAGS(&rom); - std::string bios_number = std::to_string(bios_flags - 1); + std::string name(rom->hashdata); + u32 const bios_flags(ROM_GETBIOSFLAGS(rom)); + std::string const bios_number(std::to_string(bios_flags - 1)); // check biosnumber and name - if (bios_number == specbios || biosname == specbios) + if ((bios_number == specbios) || (specbios == rom->name)) m_curbios = bios_count; - if (biosname == default_name) + if (default_name && !std::strcmp(rom->name, default_name)) { name.append(_(" (default)")); if (specbios == "default") m_curbios = bios_count; } - m_bios.emplace_back(name, bios_flags - 1); + m_bios.emplace_back(std::move(name), bios_flags - 1); bios_count++; } } - } //------------------------------------------------- diff --git a/src/frontend/mame/ui/selgame.cpp b/src/frontend/mame/ui/selgame.cpp index e35d5923957..774fde789a9 100644 --- a/src/frontend/mame/ui/selgame.cpp +++ b/src/frontend/mame/ui/selgame.cpp @@ -503,10 +503,7 @@ void menu_select_game::build_available_list() { // FIXME: can't use the convenience macros tiny ROM entries auto const is_required_rom = - [] (tiny_rom_entry const &rom) - { - return ((rom.flags & ROMENTRY_TYPEMASK) == ROMENTRYTYPE_ROM) && ((rom.flags & ROM_OPTIONALMASK) != ROM_OPTIONAL) && !std::strchr(rom.hashdata, '!'); - }; + [] (tiny_rom_entry const &rom) { return ROMENTRY_ISFILE(rom) && !ROM_ISOPTIONAL(rom) && !std::strchr(rom.hashdata, '!'); }; for (std::size_t x = 0; total > x; ++x) { game_driver const &driver(driver_list::driver(x)); @@ -514,7 +511,7 @@ void menu_select_game::build_available_list() { bool noroms(true); tiny_rom_entry const *rom; - for (rom = driver.rom; (rom->flags & ROMENTRY_TYPEMASK) != ROMENTRYTYPE_END; ++rom) + for (rom = driver.rom; !ROMENTRY_ISEND(rom); ++rom) { // check optional and NO_DUMP if (is_required_rom(*rom)) @@ -539,14 +536,14 @@ void menu_select_game::build_available_list() { // check if clone < parent noroms = true; - for ( ; noroms && rom && ((rom->flags & ROMENTRY_TYPEMASK) != ROMENTRYTYPE_END); ++rom) + for ( ; noroms && !ROMENTRY_ISEND(rom); ++rom) { if (is_required_rom(*rom)) { util::hash_collection const hashes(rom->hashdata); bool found(false); - for (tiny_rom_entry const *parentrom = parent.rom; !found && ((parentrom->flags & ROMENTRY_TYPEMASK) != ROMENTRYTYPE_END); ++parentrom) + for (tiny_rom_entry const *parentrom = parent.rom; !found && !ROMENTRY_ISEND(parentrom); ++parentrom) { if (is_required_rom(*parentrom) && (rom->length == parentrom->length)) { diff --git a/src/frontend/mame/ui/selmenu.cpp b/src/frontend/mame/ui/selmenu.cpp index 03b749ea8a0..00ccd64548a 100644 --- a/src/frontend/mame/ui/selmenu.cpp +++ b/src/frontend/mame/ui/selmenu.cpp @@ -2384,28 +2384,29 @@ bool menu_select_launch::has_multiple_bios(game_driver const &driver, s_bios &bi if (!driver.rom) return false; - auto const entries = rom_build_entries(driver.rom); - - std::string default_name; - for (const rom_entry &rom : entries) - if (ROMENTRY_ISDEFAULT_BIOS(&rom)) - default_name = ROM_GETNAME(&rom); + char const *default_name(nullptr); + for (tiny_rom_entry const *rom = driver.rom; !ROMENTRY_ISEND(rom); ++rom) + { + if (ROMENTRY_ISDEFAULT_BIOS(rom)) + default_name = rom->name; + } - for (const rom_entry &rom : entries) + for (tiny_rom_entry const *rom = driver.rom; !ROMENTRY_ISEND(rom); ++rom) { - if (ROMENTRY_ISSYSTEM_BIOS(&rom)) + if (ROMENTRY_ISSYSTEM_BIOS(rom)) { - std::string name(ROM_GETHASHDATA(&rom)); - std::string bname(ROM_GETNAME(&rom)); - int bios_flags = ROM_GETBIOSFLAGS(&rom); + std::string name(rom->hashdata); + u32 const bios_flags(ROM_GETBIOSFLAGS(rom)); - if (bname == default_name) + if (default_name && !std::strcmp(rom->name, default_name)) { name.append(_(" (default)")); - biosname.emplace(biosname.begin(), name, bios_flags - 1); + biosname.emplace(biosname.begin(), std::move(name), bios_flags - 1); } else - biosname.emplace_back(name, bios_flags - 1); + { + biosname.emplace_back(std::move(name), bios_flags - 1); + } } } return biosname.size() > 1U; diff --git a/src/frontend/mame/ui/utils.cpp b/src/frontend/mame/ui/utils.cpp index bd5d87f774e..7c369398a1d 100644 --- a/src/frontend/mame/ui/utils.cpp +++ b/src/frontend/mame/ui/utils.cpp @@ -700,10 +700,9 @@ public: virtual bool apply(ui_system_info const &system) const override { - for (tiny_rom_entry const *rom = system.driver->rom; ((rom->flags & ROMENTRY_TYPEMASK) != ROMENTRYTYPE_END) && rom->name; ++rom) + for (tiny_rom_entry const *rom = system.driver->rom; !ROMENTRY_ISEND(rom); ++rom) { - // FIXME: can't use the convenience macros tiny ROM entries - if ((ROMENTRYTYPE_REGION == (rom->flags & ROMENTRY_TYPEMASK)) && (ROMREGION_DATATYPEDISK == (rom->flags & ROMREGION_DATATYPEMASK))) + if (ROMENTRY_ISREGION(rom) && ROMREGION_ISDISKDATA(rom)) return true; } return false; |