summaryrefslogtreecommitdiffstatshomepage
path: root/src/frontend
diff options
context:
space:
mode:
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
commit796b585f722b5d74d9c2f7db839baaa6a332a4b0 (patch)
tree4da30d37ce6fe35cd9e8e43f77940d68ca06497b /src/frontend
parent54f759260123e01dfd37473d3d9497882dc7f86f (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.cpp22
-rw-r--r--src/frontend/mame/ui/devopt.cpp21
-rw-r--r--src/frontend/mame/ui/info.cpp7
-rw-r--r--src/frontend/mame/ui/miscmenu.cpp50
-rw-r--r--src/frontend/mame/ui/selgame.cpp11
-rw-r--r--src/frontend/mame/ui/selmenu.cpp29
-rw-r--r--src/frontend/mame/ui/utils.cpp5
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;