summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/emu/clifront.cpp259
-rw-r--r--src/emu/clifront.h1
-rw-r--r--src/emu/cliopts.cpp1
-rw-r--r--src/emu/cliopts.h1
-rw-r--r--src/emu/drivenum.cpp46
-rw-r--r--src/emu/drivenum.h26
-rw-r--r--src/emu/ui/imgcntrl.cpp1
-rw-r--r--src/emu/ui/imgcntrl.h2
-rw-r--r--src/emu/ui/inputmap.h2
-rw-r--r--src/emu/ui/mainmenu.h2
-rw-r--r--src/emu/ui/menu.cpp1
-rw-r--r--src/emu/ui/miscmenu.h1
-rw-r--r--src/emu/ui/selgame.cpp1
-rw-r--r--src/emu/ui/selgame.h1
-rw-r--r--src/emu/ui/simpleselgame.cpp1
-rw-r--r--src/emu/ui/simpleselgame.h3
-rw-r--r--src/emu/ui/slotopt.h2
-rw-r--r--src/emu/ui/ui.cpp1
-rw-r--r--src/emu/validity.cpp2
-rw-r--r--src/osd/sdl/man/mame.621
-rw-r--r--src/osd/sdl/man/mess.625
21 files changed, 336 insertions, 64 deletions
diff --git a/src/emu/clifront.cpp b/src/emu/clifront.cpp
index 0679d419099..1c3c7b31f70 100644
--- a/src/emu/clifront.cpp
+++ b/src/emu/clifront.cpp
@@ -229,7 +229,7 @@ int cli_frontend::execute(int argc, char **argv)
// if a game was specified, wasn't a wildcard, and our error indicates this was the
// reason for failure, offer some suggestions
- if (m_result == MAMERR_NO_SUCH_GAME && *(m_options.system_name()) != 0 && strchr(m_options.system_name(), '*') == nullptr && m_options.system() == nullptr)
+ if (m_result == MAMERR_NO_SUCH_GAME && *(m_options.system_name()) != 0 && strchr(m_options.system_name(), '*') == nullptr)
{
// get the top 16 approximate matches
driver_enumerator drivlist(m_options);
@@ -326,7 +326,16 @@ void cli_frontend::listsource(const char *gamename)
// iterate through drivers and output the info
while (drivlist.next())
- osd_printf_info("%-16s %s\n", drivlist.driver().name, core_filename_extract_base(drivlist.driver().source_file).c_str());
+ {
+ osd_printf_info("%-16s @%s", drivlist.driver().name, core_filename_extract_base(drivlist.driver().source_file).c_str());
+ int bios = drivlist.bios_root();
+ if (bios != -1)
+ osd_printf_info(" :%s", drivlist.driver(bios).name);
+ int parent = drivlist.non_bios_clone();
+ if (parent != -1)
+ osd_printf_info(" ^%s", drivlist.driver(parent).name);
+ osd_printf_info("\n");
+ }
}
@@ -339,39 +348,123 @@ void cli_frontend::listclones(const char *gamename)
{
// start with a filtered list of drivers
driver_enumerator drivlist(m_options, gamename);
- int original_count = drivlist.count();
+
+ // return an error if none found
+ if (drivlist.count() == 0)
+ throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename);
+
+ // find the parent sets and BIOSes of the matching drivers
+ driver_enumerator parentlist(m_options);
+ driver_enumerator bioslist(m_options);
+ parentlist.exclude_all();
+ bioslist.exclude_all();
+ while (drivlist.next())
+ {
+ // check if we have a non-bios clone
+ int clone_of = drivlist.non_bios_clone();
+ if (clone_of != -1)
+ {
+ // add the parent to the list
+ drivlist.include(clone_of);
+ parentlist.include(clone_of);
+ }
+
+ // add BIOS roots to a separate list
+ int bios = drivlist.bios_root();
+ if (bios != -1)
+ bioslist.include(bios);
+ }
// iterate through the remaining ones to see if their parent matches
+ drivlist.reset();
while (drivlist.next_excluded())
{
// if we have a non-bios clone and it matches, keep it
- int clone_of = drivlist.clone();
- if (clone_of != -1 && (drivlist.driver(clone_of).flags & MACHINE_IS_BIOS_ROOT) == 0)
- if (drivlist.matches(gamename, drivlist.driver(clone_of).name))
- drivlist.include();
+ int clone_of = drivlist.non_bios_clone();
+ if (clone_of != -1 && drivlist.included(clone_of))
+ {
+ drivlist.include();
+ parentlist.include(clone_of);
+ }
}
- // return an error if none found
- if (drivlist.count() == 0)
+ if (parentlist.count() == 0)
+ osd_printf_info("No clones found for games matching '%s'\n", gamename);
+ else
{
- // see if we match but just weren't a clone
- if (original_count == 0)
- throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename);
- else
- osd_printf_info("Found %d matches for '%s' but none were clones\n", drivlist.count(), gamename);
- return;
+ // iterate through the list of parents
+ parentlist.reset();
+ bool first = true;
+ while (parentlist.next())
+ {
+ int bios = parentlist.bios_root();
+
+ // print a separate header for each parent
+ if (!first)
+ osd_printf_info("\n");
+ first = false;
+ if (bios == -1)
+ osd_printf_info("Clones of \"%s\" (%s):\n", parentlist.driver().description, parentlist.driver().name);
+ else
+ {
+ osd_printf_info("Clones of \"%s\" (%s, %s BIOS):\n", parentlist.driver().description, parentlist.driver().name, parentlist.driver(bios).name);
+ drivlist.exclude(bios);
+ }
+
+ // prevent further output about parent
+ drivlist.exclude(parentlist.current());
+
+ // iterate through drivers
+ drivlist.reset();
+ while (drivlist.next())
+ {
+ // keep clones of the same parent together
+ if (drivlist.is_clone_of(parentlist.current()))
+ {
+ // output the info and remove the driver from the list
+ osd_printf_info("%-18s\"%s\"\n", drivlist.driver().name, drivlist.driver().description);
+ drivlist.exclude();
+ }
+ }
+ }
}
- // print the header
- osd_printf_info("Name: Clone of:\n");
+ // sort non-clone sets by BIOS, if any
+ bioslist.reset();
+ while (bioslist.next() && drivlist.count() != 0)
+ {
+ // iterate over the remaining drivers
+ bool first = true;
+ drivlist.reset();
+ while (drivlist.next())
+ {
+ if (drivlist.bios_root() == bioslist.current())
+ {
+ // print a header for the BIOS
+ if (first)
+ {
+ osd_printf_info("\nOther sets (%s BIOS):\n", bioslist.driver().name);
+ drivlist.exclude(bioslist.current());
+ first = false;
+ }
- // iterate through drivers and output the info
- drivlist.reset();
- while (drivlist.next())
+ // output the info and remove the driver from the list
+ osd_printf_info("%-18s\"%s\"\n", drivlist.driver().name, drivlist.driver().description);
+ drivlist.exclude();
+ }
+ }
+ }
+
+ // finally list any remaining matching drivers that have no clones
+ if (drivlist.count() != 0)
{
- int clone_of = drivlist.clone();
- if (clone_of != -1 && (drivlist.driver(clone_of).flags & MACHINE_IS_BIOS_ROOT) == 0)
- osd_printf_info("%-16s %-8s\n", drivlist.driver().name, drivlist.driver(clone_of).name);
+ // print a header
+ osd_printf_info("\nUnique sets:\n");
+
+ // iterate and output the info
+ drivlist.reset();
+ while (drivlist.next())
+ osd_printf_info("%-18s\"%s\"\n", drivlist.driver().name, drivlist.driver().description);
}
}
@@ -421,6 +514,125 @@ void cli_frontend::listbrothers(const char *gamename)
//-------------------------------------------------
+// listtree - output a tree of matching games,
+// their parents and BIOS roots, separated by
+// source file
+//-------------------------------------------------
+
+void cli_frontend::listtree(const char *gamename)
+{
+ // start with a filtered list of drivers; return an error if none found
+ driver_enumerator initial_drivlist(m_options, gamename);
+ if (initial_drivlist.count() == 0)
+ throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename);
+
+ // scan through the initially-selected drivers
+ bool first = true;
+ while (initial_drivlist.next())
+ {
+ // get the source file and print the header
+ if (!first)
+ osd_printf_info("\n");
+ first = false;
+ const char *source = initial_drivlist.driver().source_file;
+ osd_printf_info("Drivers in source file %s:\n", core_filename_extract_base(source).c_str());
+
+ // build a new brother list for each source file
+ driver_enumerator drivlist(m_options);
+ driver_enumerator brotherlist(m_options);
+ driver_enumerator bioslist(m_options);
+ drivlist.exclude_all();
+ brotherlist.exclude_all();
+ bioslist.exclude_all();
+
+ // walk the initial driver list and mark those with the same source
+ initial_drivlist.reset();
+ while (initial_drivlist.next())
+ {
+ if (strcmp(initial_drivlist.driver().source_file, source) == 0)
+ {
+ brotherlist.include(initial_drivlist.current());
+ int parent = initial_drivlist.non_bios_clone();
+ drivlist.include(parent != -1 ? parent : initial_drivlist.current());
+ int bios = initial_drivlist.bios_root();
+ if (bios != -1)
+ bioslist.include(bios);
+ initial_drivlist.exclude();
+ }
+ }
+
+ // output the entries found for each source file (with BIOS root)
+ bioslist.reset();
+ while (bioslist.next())
+ {
+ if (strcmp(bioslist.driver().source_file, source) != 0)
+ osd_printf_info("%-16s (BIOS root in %s)\n", bioslist.driver().name, core_filename_extract_base(bioslist.driver().source_file).c_str());
+ else
+ {
+ osd_printf_info("%-16s %s\n", bioslist.driver().name, bioslist.driver().description);
+ brotherlist.exclude(bioslist.current());
+ drivlist.exclude(bioslist.current());
+ }
+ drivlist.reset();
+ while (drivlist.next())
+ {
+ // drivers with this BIOS
+ if (drivlist.bios_root() != bioslist.current())
+ continue;
+
+ // print the parent
+ if (strcmp(drivlist.driver().source_file, source) != 0)
+ osd_printf_info(" %-16s (parent set in %s)\n", drivlist.driver().name, core_filename_extract_base(drivlist.driver().source_file).c_str());
+ else
+ {
+ osd_printf_info(" %-16s %s\n", drivlist.driver().name, drivlist.driver().description);
+ brotherlist.exclude(drivlist.current());
+ }
+
+ // print the clones
+ brotherlist.reset();
+ while (brotherlist.next())
+ {
+ if (!brotherlist.is_clone_of(drivlist.current()))
+ continue;
+ osd_printf_info(" %-16s %s\n", brotherlist.driver().name, brotherlist.driver().description);
+ brotherlist.exclude();
+ }
+ drivlist.exclude();
+ }
+ }
+
+ // output the entries found for each source file (no BIOS root)
+ drivlist.reset();
+ while (drivlist.next())
+ {
+ // print the parent
+ if (strcmp(drivlist.driver().source_file, source) != 0)
+ osd_printf_info("%-16s (parent set in %s)\n", drivlist.driver().name, core_filename_extract_base(drivlist.driver().source_file).c_str());
+ else
+ {
+ osd_printf_info("%-16s %s\n", drivlist.driver().name, drivlist.driver().description);
+ brotherlist.exclude(drivlist.current());
+ }
+
+ // print the clones
+ brotherlist.reset();
+ while (brotherlist.next())
+ {
+ if (!brotherlist.is_clone_of(drivlist.current()))
+ continue;
+ osd_printf_info(" %-16s %s\n", brotherlist.driver().name, brotherlist.driver().description);
+ brotherlist.exclude();
+ }
+ }
+
+ // reset for next source
+ initial_drivlist.reset();
+ }
+}
+
+
+//-------------------------------------------------
// listcrc - output the CRC and name of all ROMs
// referenced by the emulator
//-------------------------------------------------
@@ -1654,6 +1866,7 @@ void cli_frontend::execute_commands(const char *exename)
{ CLICOMMAND_LISTSOURCE, &cli_frontend::listsource },
{ CLICOMMAND_LISTCLONES, &cli_frontend::listclones },
{ CLICOMMAND_LISTBROTHERS, &cli_frontend::listbrothers },
+ { CLICOMMAND_LISTTREE, &cli_frontend::listtree },
{ CLICOMMAND_LISTCRC, &cli_frontend::listcrc },
{ CLICOMMAND_LISTDEVICES, &cli_frontend::listdevices },
{ CLICOMMAND_LISTSLOTS, &cli_frontend::listslots },
diff --git a/src/emu/clifront.h b/src/emu/clifront.h
index 584261660db..52000c47c29 100644
--- a/src/emu/clifront.h
+++ b/src/emu/clifront.h
@@ -41,6 +41,7 @@ public:
void listsource(const char *gamename = "*");
void listclones(const char *gamename = "*");
void listbrothers(const char *gamename = "*");
+ void listtree(const char *gamename = "*");
void listcrc(const char *gamename = "*");
void listroms(const char *gamename = "*");
void listsamples(const char *gamename = "*");
diff --git a/src/emu/cliopts.cpp b/src/emu/cliopts.cpp
index ba2cb33afe9..5c72fe4fbe8 100644
--- a/src/emu/cliopts.cpp
+++ b/src/emu/cliopts.cpp
@@ -33,6 +33,7 @@ const options_entry cli_options::s_option_entries[] =
{ CLICOMMAND_LISTSOURCE ";ls", "0", OPTION_COMMAND, "driver sourcefile" },
{ CLICOMMAND_LISTCLONES ";lc", "0", OPTION_COMMAND, "show clones" },
{ CLICOMMAND_LISTBROTHERS ";lb", "0", OPTION_COMMAND, "show \"brothers\", or other drivers from same sourcefile" },
+ { CLICOMMAND_LISTTREE ";lt", "0", OPTION_COMMAND, "show drivers in tree format" },
{ CLICOMMAND_LISTCRC, "0", OPTION_COMMAND, "CRC-32s" },
{ CLICOMMAND_LISTROMS ";lr", "0", OPTION_COMMAND, "list required roms for a driver" },
{ CLICOMMAND_LISTSAMPLES, "0", OPTION_COMMAND, "list optional samples for a driver" },
diff --git a/src/emu/cliopts.h b/src/emu/cliopts.h
index ce0cb7a9c58..2165b0c385a 100644
--- a/src/emu/cliopts.h
+++ b/src/emu/cliopts.h
@@ -34,6 +34,7 @@
#define CLICOMMAND_LISTSOURCE "listsource"
#define CLICOMMAND_LISTCLONES "listclones"
#define CLICOMMAND_LISTBROTHERS "listbrothers"
+#define CLICOMMAND_LISTTREE "listtree"
#define CLICOMMAND_LISTCRC "listcrc"
#define CLICOMMAND_LISTROMS "listroms"
#define CLICOMMAND_LISTSAMPLES "listsamples"
diff --git a/src/emu/drivenum.cpp b/src/emu/drivenum.cpp
index 99d3498c6a4..20bf37570c2 100644
--- a/src/emu/drivenum.cpp
+++ b/src/emu/drivenum.cpp
@@ -54,14 +54,42 @@ int driver_list::find(const char *name)
// account wildcards in the wildstring
//-------------------------------------------------
-bool driver_list::matches(const char *wildstring, const char *string)
+bool driver_list::matches(const char *wildstring, const game_driver &driver)
{
// can only match internal drivers if the wildstring starts with an underscore
- if (string[0] == '_' && (wildstring == nullptr || wildstring[0] != '_'))
+ if (driver.name[0] == '_' && (wildstring == nullptr || wildstring[0] != '_'))
return false;
+ // null matches any normal driver
+ if (wildstring == nullptr)
+ return true;
+
+ // special case: match on parent name
+ if (wildstring[0] == '^')
+ {
+ int clone_index = non_bios_clone(driver);
+ if (clone_index == -1)
+ return (wildstring[1] == '\0') || (core_stricmp(wildstring+1, driver.name) == 0);
+ else
+ return (core_stricmp(wildstring+1, s_drivers_sorted[clone_index]->name) == 0);
+ }
+
+ // special case: match on BIOS name
+ if (wildstring[0] == ':')
+ {
+ int bios_index = bios_root(driver);
+ if (bios_index == -1)
+ return (driver.flags & MACHINE_IS_BIOS_ROOT) && ((wildstring[1] == '\0') || (core_stricmp(wildstring+1, driver.name) == 0));
+ else
+ return (core_stricmp(wildstring+1, s_drivers_sorted[bios_index]->name) == 0);
+ }
+
+ // special case: match on source filename
+ if (wildstring[0] == '@')
+ return (core_stricmp(wildstring+1, core_filename_extract_base(driver.source_file).c_str()) == 0);
+
// match everything else normally
- return (wildstring == nullptr || core_strwildcmp(wildstring, string) == 0);
+ return (core_strwildcmp(wildstring, driver.name) == 0);
}
@@ -215,7 +243,7 @@ int driver_enumerator::filter(const char *filterstring)
// match name against each driver in the list
for (int index = 0; index < s_driver_count; index++)
- if (matches(filterstring, s_drivers_sorted[index]->name))
+ if (matches(filterstring, *s_drivers_sorted[index]))
include(index);
return m_filtered_count;
@@ -253,7 +281,7 @@ void driver_enumerator::include_all()
// always exclude the empty driver
int empty = find("___empty");
assert(empty != -1);
- m_included[empty] = 0;
+ exclude(empty);
}
@@ -313,9 +341,15 @@ bool driver_enumerator::next_excluded()
void driver_enumerator::find_approximate_matches(const char *string, int count, int *results)
{
#undef rand
+ // skip leading nonalphanumeric characters
+ if (string != nullptr)
+ {
+ while (string[0] != '\0' && !isalnum(string[0]))
+ string++;
+ }
// if no name, pick random entries
- if (string == nullptr || string[0] == 0)
+ if (string == nullptr || string[0] == '\0')
{
// seed the RNG first
srand(osd_ticks());
diff --git a/src/emu/drivenum.h b/src/emu/drivenum.h
index faaf685304a..1f9d23e5c65 100644
--- a/src/emu/drivenum.h
+++ b/src/emu/drivenum.h
@@ -35,21 +35,23 @@ public:
// any item by index
static const game_driver &driver(int index) { assert(index >= 0 && index < s_driver_count); return *s_drivers_sorted[index]; }
- static int clone(int index) { return find(driver(index).parent); }
- static int non_bios_clone(int index) { int result = find(driver(index).parent); return (result != -1 && (driver(result).flags & MACHINE_IS_BIOS_ROOT) == 0) ? result : -1; }
- static int compatible_with(int index) { return find(driver(index).compatible_with); }
+ static int clone(int index) { return clone(driver(index)); }
+ static int non_bios_clone(int index) { return non_bios_clone(driver(index)); }
+ static int bios_root(int index) { return bios_root(driver(index)); }
+ static int compatible_with(int index) { return compatible_with(driver(index)); }
// any item by driver
- static int clone(const game_driver &driver) { int index = find(driver); assert(index != -1); return clone(index); }
- static int non_bios_clone(const game_driver &driver) { int index = find(driver); assert(index != -1); return non_bios_clone(index); }
- static int compatible_with(const game_driver &driver) { int index = find(driver); assert(index != -1); return compatible_with(index); }
+ static int clone(const game_driver &driver) { return find(driver.parent); }
+ static int non_bios_clone(const game_driver &driver) { int result = find(driver.parent); return (result != -1 && (driver_list::driver(result).flags & MACHINE_IS_BIOS_ROOT) == 0) ? result : -1; }
+ static int bios_root(const game_driver &driver) { int result = find(driver.parent); return (result == -1) ? -1 : ((driver_list::driver(result).flags & MACHINE_IS_BIOS_ROOT) == 0) ? bios_root(result) : result; }
+ static int compatible_with(const game_driver &driver) { return find(driver.compatible_with); }
// general helpers
static int find(const char *name);
static int find(const game_driver &driver) { return find(driver.name); }
// static helpers
- static bool matches(const char *wildstring, const char *string);
+ static bool matches(const char *wildstring, const game_driver &driver);
static int penalty_compare(const char *source, const char *target);
protected:
@@ -84,9 +86,12 @@ public:
// current item
const game_driver &driver() const { return driver_list::driver(m_current); }
machine_config &config() const { return config(m_current, m_options); }
- int clone() { return driver_list::clone(m_current); }
- int non_bios_clone() { return driver_list::non_bios_clone(m_current); }
- int compatible_with() { return driver_list::compatible_with(m_current); }
+ int clone() const { return driver_list::clone(m_current); }
+ int non_bios_clone() const { return driver_list::non_bios_clone(m_current); }
+ int bios_root() const { return driver_list::bios_root(m_current); }
+ int compatible_with() const { return driver_list::compatible_with(m_current); }
+ bool is_clone_of(int index) const { return strcmp(driver_list::driver(index).name, driver_list::driver(m_current).parent) == 0; }
+ bool is_clone_of(const game_driver &driver) const { return strcmp(driver.name, driver_list::driver(m_current).parent) == 0; }
void include() { include(m_current); }
void exclude() { exclude(m_current); }
@@ -100,6 +105,7 @@ public:
using driver_list::driver;
using driver_list::clone;
using driver_list::non_bios_clone;
+ using driver_list::bios_root;
using driver_list::compatible_with;
// filtering/iterating
diff --git a/src/emu/ui/imgcntrl.cpp b/src/emu/ui/imgcntrl.cpp
index 8f3dbeca75b..8fd709ede00 100644
--- a/src/emu/ui/imgcntrl.cpp
+++ b/src/emu/ui/imgcntrl.cpp
@@ -9,6 +9,7 @@
***************************************************************************/
#include "emu.h"
+#include "drivenum.h"
#include "ui/ui.h"
#include "ui/menu.h"
#include "ui/imgcntrl.h"
diff --git a/src/emu/ui/imgcntrl.h b/src/emu/ui/imgcntrl.h
index 3d978ed617c..669098a4306 100644
--- a/src/emu/ui/imgcntrl.h
+++ b/src/emu/ui/imgcntrl.h
@@ -13,8 +13,6 @@
#ifndef __UI_IMGCNTRL_H__
#define __UI_IMGCNTRL_H__
-#include "drivenum.h"
-
// ======================> ui_menu_control_device_image
class ui_menu_control_device_image : public ui_menu {
diff --git a/src/emu/ui/inputmap.h b/src/emu/ui/inputmap.h
index 32ad48092ea..f49df47b892 100644
--- a/src/emu/ui/inputmap.h
+++ b/src/emu/ui/inputmap.h
@@ -13,8 +13,6 @@
#ifndef __UI_INPUTMAP_H__
#define __UI_INPUTMAP_H__
-//#include "drivenum.h"
-
class ui_menu_input_groups : public ui_menu {
public:
ui_menu_input_groups(running_machine &machine, render_container *container);
diff --git a/src/emu/ui/mainmenu.h b/src/emu/ui/mainmenu.h
index 0684e230ad8..1a734e706bc 100644
--- a/src/emu/ui/mainmenu.h
+++ b/src/emu/ui/mainmenu.h
@@ -13,8 +13,6 @@
#ifndef __UI_MAINMENU_H__
#define __UI_MAINMENU_H__
-#include "drivenum.h"
-
class ui_menu_main : public ui_menu {
public:
ui_menu_main(running_machine &machine, render_container *container);
diff --git a/src/emu/ui/menu.cpp b/src/emu/ui/menu.cpp
index f831ffa725f..42fdf6fae34 100644
--- a/src/emu/ui/menu.cpp
+++ b/src/emu/ui/menu.cpp
@@ -9,6 +9,7 @@
*********************************************************************/
#include "emu.h"
+#include "drivenum.h"
#include "rendutil.h"
#include "cheat.h"
#include "uiinput.h"
diff --git a/src/emu/ui/miscmenu.h b/src/emu/ui/miscmenu.h
index f43c4a6b2ba..49ef7355bca 100644
--- a/src/emu/ui/miscmenu.h
+++ b/src/emu/ui/miscmenu.h
@@ -13,7 +13,6 @@
#ifndef __UI_MISCMENU_H__
#define __UI_MISCMENU_H__
-#include "drivenum.h"
#include "crsshair.h"
class ui_menu_keyboard_mode : public ui_menu {
diff --git a/src/emu/ui/selgame.cpp b/src/emu/ui/selgame.cpp
index 592e24ebb41..b882edeeb7a 100644
--- a/src/emu/ui/selgame.cpp
+++ b/src/emu/ui/selgame.cpp
@@ -10,6 +10,7 @@
#include "emu.h"
#include "emuopts.h"
+#include "drivenum.h"
#include "ui/ui.h"
#include "ui/menu.h"
#include "uiinput.h"
diff --git a/src/emu/ui/selgame.h b/src/emu/ui/selgame.h
index 4c1cf548d60..f0c8f5fd6c5 100644
--- a/src/emu/ui/selgame.h
+++ b/src/emu/ui/selgame.h
@@ -13,7 +13,6 @@
#ifndef __UI_MAIN_H__
#define __UI_MAIN_H__
-#include "drivenum.h"
#include "ui/menu.h"
class ui_menu_select_game : public ui_menu
diff --git a/src/emu/ui/simpleselgame.cpp b/src/emu/ui/simpleselgame.cpp
index 0c0705e8414..671af78ec19 100644
--- a/src/emu/ui/simpleselgame.cpp
+++ b/src/emu/ui/simpleselgame.cpp
@@ -10,6 +10,7 @@
#include "emu.h"
#include "emuopts.h"
+#include "drivenum.h"
#include "ui/ui.h"
#include "ui/menu.h"
#include "uiinput.h"
diff --git a/src/emu/ui/simpleselgame.h b/src/emu/ui/simpleselgame.h
index 316e3747b2f..2106fc54638 100644
--- a/src/emu/ui/simpleselgame.h
+++ b/src/emu/ui/simpleselgame.h
@@ -13,9 +13,10 @@
#ifndef __UI_SIMPLESELGAME_H__
#define __UI_SIMPLESELGAME_H__
-#include "drivenum.h"
#include "menu.h"
+class driver_enumerator;
+
class ui_simple_menu_select_game : public ui_menu {
public:
ui_simple_menu_select_game(running_machine &machine, render_container *container, const char *gamename);
diff --git a/src/emu/ui/slotopt.h b/src/emu/ui/slotopt.h
index 86cf75102de..665ad7ceedf 100644
--- a/src/emu/ui/slotopt.h
+++ b/src/emu/ui/slotopt.h
@@ -13,8 +13,6 @@
#ifndef __UI_SLOTOPT_H__
#define __UI_SLOTOPT_H__
-//#include "drivenum.h"
-
class ui_menu_slot_devices : public ui_menu {
public:
ui_menu_slot_devices(running_machine &machine, render_container *container);
diff --git a/src/emu/ui/ui.cpp b/src/emu/ui/ui.cpp
index c92e700b433..6e779e05c13 100644
--- a/src/emu/ui/ui.cpp
+++ b/src/emu/ui/ui.cpp
@@ -10,6 +10,7 @@
#include "emu.h"
#include "emuopts.h"
+#include "drivenum.h"
#include "video/vector.h"
#include "machine/laserdsc.h"
#include "render.h"
diff --git a/src/emu/validity.cpp b/src/emu/validity.cpp
index 4acc8d991ad..6c41213c1df 100644
--- a/src/emu/validity.cpp
+++ b/src/emu/validity.cpp
@@ -211,7 +211,7 @@ bool validity_checker::check_all_matching(const char *string)
// then iterate over all drivers and check them
m_drivlist.reset();
while (m_drivlist.next())
- if (m_drivlist.matches(string, m_drivlist.driver().name))
+ if (m_drivlist.matches(string, m_drivlist.driver()))
validate_one(m_drivlist.driver());
// cleanup
diff --git a/src/osd/sdl/man/mame.6 b/src/osd/sdl/man/mame.6
index de5b6216041..93fd3b85853 100644
--- a/src/osd/sdl/man/mame.6
+++ b/src/osd/sdl/man/mame.6
@@ -91,22 +91,31 @@ games are listed; however, you can limit this list by specifying a
driver name or wildcard after the \-listfull command.
.TP
.B \-listsource, \-ls \fR[\fIgamename\fR|\fIwildcard\fR]
-Displays a list of drivers and the names of the source files their game
-drivers live in. Useful for finding which driver a game runs on in
-order to fix bugs. By default all games are listed; however, you can
+Displays a list of drivers, the names of the source files their game
+drivers live in, and their parent sets and BIOS roots, if any. These
+are listed in the form of wildcards that will match all drivers with
+similar properties. By default all games are listed; however, you can
limit this list by specifying a driver name or wildcard after the
\-listsource command.
.TP
.B \-listclones, \-lc \fR[\fIgamename\fR|\fIwildcard\fR]
-Displays a list of clones. By default all clones are listed; however,
-you can limit this list by specifying a driver name or wildcard after
-the \-listclones command.
+Displays a list of clones, sorted under their parent sets. By default
+all drivers are listed; however, you can limit this list to clones of
+certain drivers by specifying a name or wildcard after the \-listclones
+command.
.TP
.B \-listbrothers, \-lb \fR[\fIgamename\fR|\fIwildcard\fR]
Displays a list of "brothers" or other drivers from same sourcefile.
By default all games are listed; however, you can limit this list by
specifying a driver name or wildcard after the \-listbrothers command.
.TP
+.B \-listtree, \-lt \fR[\fIgamename\fR|\fIwildcard\fR]
+Displays a list of driver names and descriptions in tree format.
+Clones are listed under their parent sets, and drivers are grouped
+together with their "brothers" from the same sourcefile. By default
+all games are listed; however, you can limit this list by specifying a
+driver name or wildcard.
+.TP
.B \-listcrc
Displays a full list of CRCs of all ROM images referenced by all
drivers within MAME code.
diff --git a/src/osd/sdl/man/mess.6 b/src/osd/sdl/man/mess.6
index f1932d48f03..6121879d2ab 100644
--- a/src/osd/sdl/man/mess.6
+++ b/src/osd/sdl/man/mess.6
@@ -113,20 +113,31 @@ systems are listed; however, you can limit this list by specifying a
driver name or wildcard.
.TP
.B \-listsource, \-ls \fR[\fIsystem\fR|\fIwildcard\fR]
-Displays a list of drivers and the names of the source files their system
-drivers live in. Useful for finding which driver a system runs on in
-order to fix bugs. By default all systems are listed; however, you can
-limit this list by specifying a driver name or wildcard.
+Displays a list of drivers, the names of the source files their system
+drivers live in, and their parent sets and BIOS roots, if any. These
+are listed in the form of wildcards that will match all drivers with
+similar properties. By default all systems are listed; however, you
+can limit this list by specifying a driver name or wildcard after the
+\-listsource command.
.TP
.B \-listclones, \-lc \fR[\fIsystem\fR|\fIwildcard\fR]
-Displays a list of clones. By default all clones are listed; however,
-you can limit this list by specifying a driver name or wildcard.
+Displays a list of clones, sorted under their parent sets. By default
+all drivers are listed; however, you can limit this list to clones of
+certain drivers by specifying a name or wildcard after the \-listclones
+command.
.TP
.B \-listbrothers, \-lb \fR[\fIsystem\fR|\fIwildcard\fR]
Displays a list of "brothers" or other drivers from same sourcefile.
By default all systems are listed; however, you can limit this list by
specifying a driver name or wildcard.
.TP
+.B \-listtree, \-lt \fR[\fIsystem\fR|\fIwildcard\fR]
+Displays a list of driver names and descriptions in tree format.
+Clones are listed under their parent sets, and drivers are grouped
+together with their "brothers" from the same sourcefile. By default
+all systems are listed; however, you can limit this list by specifying
+a driver name or wildcard.
+.TP
.B \-listcrc
Displays a full list of CRCs of all ROM images referenced by all
drivers within MESS code.
@@ -174,7 +185,7 @@ Output the list of available media for the system.
.B \-listsoftware, \-lsoft
Output the list of known software for the system.
.TP
-.B \-verifysoftware, \-vsoft \fR[\fIgamename\fR|\fIwildcard\fR]
+.B \-verifysoftware, \-vsoft \fR[\fIsystem\fR|\fIwildcard\fR]
Checks for invalid or missing ROM images in your software lists.
By default all drivers that have valid ZIP files or directories
in the rompath are verified; however, you can limit this list by