summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Aaron Giles <aaron@aarongiles.com>2011-04-13 20:31:00 +0000
committer Aaron Giles <aaron@aarongiles.com>2011-04-13 20:31:00 +0000
commit00d745ca7752d2f96e842a7f23e157c0d2c40bdf (patch)
tree9b6a3dcda7d0ff05b098fe0823fe4d09f6d0e6b4 /src
parentf99e1a5da63f996cd07fae98d42c2e5ff389adef (diff)
(Big tangle of changes that all happened as I was looking into the ROM
loader rewrite, which is still in progress....) Replaced mamedriv.c with a new driver list mechanism that is generated by the build tools. The emulator core now expects the presence of a file called src/$(TARGET)/$(SUBTARGET).lst which is just a raw list of driver names, one per line. C and C++ comments are still permitted. This file is parsed by a new build tool makelist which extracts the driver names, sorts them, and generates a file called drivlist.c, which is consumed by the core. [Aaron Giles] Added new osdcore function osd_malloc_array() which is identical to osd_malloc() but obviously hints that the underlying allocation is for an array. Updated all callers to use the appropriate form. Modified the Windows allocator to only use guard pages for array-style allocations, allowing us to enable them once again in debug builds. [Aaron Giles] Created new static class driver_list to wrap accesses to the list of available drivers. Improved speed of driver lookups by relying on the presorting done by makelist. [Aaron Giles] Created helper class driver_enumerator as a helper for iterating through the list of drivers. This class supports basic filtering and iteration, and also serves as a temporary cache of machine_configs. [Aaron Giles] Created cli_frontend object to wrap all the CLI handling code in clifront.c. Updated/simplified all the code to take advantage of the driver_enumerator. [Aaron Giles] Created media_auditor object to wrap all the auditing functions in audit.c. Updated all users to the new interface. Note that the new auditing mechanism is slightly out of sync with the romload code in terms of finding ROMs owned by devices, so it may mis-report some issues until the new ROM loading code is in. [Aaron Giles] Added concept of a per-device searchpath. For most devices, their searchpath is just the short name of the device. For driver_devices, the searchpath is driver[;parent[;bios]]. This searchpath will eventually be used by the rom loader to find ROMs. For now it is used by the media auditor only. [Aaron Giles] Created info_xml_creator object to wrap all the info generation functions in info.c. Converted the file to C++ and cleaned up the input processing code. [Aaron Giles] (not for whatsnew ... Known issues: auditing of CHDs appears busted, and debug builds report unfreed memory if you use the built-in game picker)
Diffstat (limited to 'src')
-rw-r--r--src/build/build.mak17
-rw-r--r--src/build/makelist.c203
-rw-r--r--src/emu/audit.c693
-rw-r--r--src/emu/audit.h221
-rw-r--r--src/emu/clifront.c1936
-rw-r--r--src/emu/clifront.h84
-rw-r--r--src/emu/config.c6
-rw-r--r--src/emu/cpu/mips/dismips.c6
-rw-r--r--src/emu/debug/textbuf.c4
-rw-r--r--src/emu/devcpu.c1
-rw-r--r--src/emu/devintrf.c24
-rw-r--r--src/emu/devintrf.h6
-rw-r--r--src/emu/devlegcy.c1
-rw-r--r--src/emu/devlegcy.h2
-rw-r--r--src/emu/diimage.c7
-rw-r--r--src/emu/driver.c482
-rw-r--r--src/emu/driver.h156
-rw-r--r--src/emu/drivers/empty.c12
-rw-r--r--src/emu/emu.mak1
-rw-r--r--src/emu/emualloc.c51
-rw-r--r--src/emu/emualloc.h30
-rw-r--r--src/emu/emuopts.c15
-rw-r--r--src/emu/emutempl.h31
-rw-r--r--src/emu/hash.c4
-rw-r--r--src/emu/hash.h2
-rw-r--r--src/emu/info.c1862
-rw-r--r--src/emu/info.h77
-rw-r--r--src/emu/layout/pinball.lay (renamed from src/mame/layout/pinball.lay)0
-rw-r--r--src/emu/machine.c13
-rw-r--r--src/emu/mame.c2
-rw-r--r--src/emu/render.c8
-rw-r--r--src/emu/rendlay.c4
-rw-r--r--src/emu/romload.c19
-rw-r--r--src/emu/sound/bsmt2000.c3
-rw-r--r--src/emu/sound/wavwrite.c6
-rw-r--r--src/emu/ui.c28
-rw-r--r--src/emu/uimenu.c102
-rw-r--r--src/emu/validity.c74
-rw-r--r--src/lib/util/astring.h1
-rw-r--r--src/lib/util/corestr.c2
-rw-r--r--src/mame/machine/gaelco3d.c6
-rw-r--r--src/mame/machine/md_cart.c4
-rw-r--r--src/mame/mame.lst12225
-rw-r--r--src/mame/mame.mak5
-rw-r--r--src/mame/mamedriv.c12225
-rw-r--r--src/mame/tiny.c70
-rw-r--r--src/mame/tiny.lst68
-rw-r--r--src/mame/tiny.mak1
-rw-r--r--src/osd/osdcore.h22
-rw-r--r--src/osd/osdmini/minimain.c10
-rw-r--r--src/osd/osdmini/minimisc.c12
-rw-r--r--src/osd/sdl/draw13.c2
-rw-r--r--src/osd/sdl/sdldir.c8
-rw-r--r--src/osd/sdl/sdlfile.c8
-rw-r--r--src/osd/sdl/sdlmain.c3
-rw-r--r--src/osd/sdl/sdlos_macosx.c20
-rw-r--r--src/osd/sdl/sdlos_os2.c18
-rw-r--r--src/osd/sdl/sdlos_unix.c20
-rw-r--r--src/osd/sdl/sdlos_win32.c71
-rw-r--r--src/osd/sdl/sdlwork.c2
-rw-r--r--src/osd/sdl/strconv.c4
-rw-r--r--src/osd/windows/strconv.c8
-rw-r--r--src/osd/windows/winalloc.c618
-rw-r--r--src/osd/windows/winmain.c3
-rw-r--r--src/osd/windows/winmisc.c70
65 files changed, 15830 insertions, 15869 deletions
diff --git a/src/build/build.mak b/src/build/build.mak
index 721346a3f6c..21116a9a4df 100644
--- a/src/build/build.mak
+++ b/src/build/build.mak
@@ -20,17 +20,20 @@ OBJDIRS += \
FILE2STR_TARGET = $(BUILDOUT)/file2str$(BUILD_EXE)
MAKEDEP_TARGET = $(BUILDOUT)/makedep$(BUILD_EXE)
+MAKELIST_TARGET = $(BUILDOUT)/makelist$(BUILD_EXE)
PNG2BDC_TARGET = $(BUILDOUT)/png2bdc$(BUILD_EXE)
VERINFO_TARGET = $(BUILDOUT)/verinfo$(BUILD_EXE)
ifeq ($(TARGETOS),win32)
FILE2STR = $(subst /,\,$(FILE2STR_TARGET))
MAKEDEP = $(subst /,\,$(MAKEDEP_TARGET))
+MAKELIST = $(subst /,\,$(MAKELIST_TARGET))
PNG2BDC = $(subst /,\,$(PNG2BDC_TARGET))
VERINFO = $(subst /,\,$(VERINFO_TARGET))
else
FILE2STR = $(FILE2STR_TARGET)
MAKEDEP = $(MAKEDEP_TARGET)
+MAKELIST = $(MAKELIST_TARGET)
PNG2BDC = $(PNG2BDC_TARGET)
VERINFO = $(VERINFO_TARGET)
endif
@@ -39,6 +42,7 @@ ifneq ($(CROSS_BUILD),1)
BUILD += \
$(FILE2STR_TARGET) \
$(MAKEDEP_TARGET) \
+ $(MAKELIST_TARGET) \
$(PNG2BDC_TARGET) \
$(VERINFO_TARGET) \
@@ -71,6 +75,19 @@ $(MAKEDEP_TARGET): $(MAKEDEPOBJS) $(LIBUTIL) $(LIBOCORE) $(ZLIB)
#-------------------------------------------------
+# makelist
+#-------------------------------------------------
+
+MAKELISTOBJS = \
+ $(BUILDOBJ)/makelist.o \
+
+$(MAKELIST_TARGET): $(MAKELISTOBJS) $(LIBUTIL) $(LIBOCORE) $(ZLIB)
+ @echo Linking $@...
+ $(LD) $(LDFLAGS) $^ $(LIBS) -o $@
+
+
+
+#-------------------------------------------------
# png2bdc
#-------------------------------------------------
diff --git a/src/build/makelist.c b/src/build/makelist.c
new file mode 100644
index 00000000000..c28a14a61e8
--- /dev/null
+++ b/src/build/makelist.c
@@ -0,0 +1,203 @@
+/***************************************************************************
+
+ makelist.c
+
+ Create and sort the driver list.
+
+****************************************************************************
+
+ Copyright Aaron Giles
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name 'MAME' nor the names of its contributors may be
+ used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+***************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include "corefile.h"
+
+
+#define MAX_DRIVERS 65536
+
+static const char *drivlist[MAX_DRIVERS];
+
+
+//-------------------------------------------------
+// driver_sort_callback - compare two items in
+// a string array
+//-------------------------------------------------
+
+int sort_callback(const void *elem1, const void *elem2)
+{
+ const char **item1 = (const char **)elem1;
+ const char **item2 = (const char **)elem2;
+ return strcmp(*item1, *item2);
+}
+
+
+//-------------------------------------------------
+// main - primary entry point
+//-------------------------------------------------
+
+int main(int argc, char *argv[])
+{
+ // needs at least 1 argument
+ if (argc < 2)
+ {
+ fprintf(stderr,
+ "Usage:\n"
+ " makelist <source.lst>\n"
+ );
+ return 0;
+ }
+
+ // extract arguments
+ const char *srcfile = argv[1];
+
+ // read source file
+ void *buffer;
+ UINT32 length;
+ file_error filerr = core_fload(srcfile, &buffer, &length);
+ if (filerr != FILERR_NONE)
+ {
+ fprintf(stderr, "Unable to read source file '%s'\n", srcfile);
+ return 1;
+ }
+
+ // rip through it to find all drivers
+ int drivcount = 0;
+ char *srcptr = (char *)buffer;
+ char *endptr = srcptr + length;
+ int linenum = 1;
+ bool in_comment = false;
+ while (srcptr < endptr)
+ {
+ char c = *srcptr++;
+
+ // count newlines
+ if (c == 13 || c == 10)
+ {
+ if (c == 13 && *srcptr == 10)
+ srcptr++;
+ linenum++;
+ continue;
+ }
+
+ // skip any spaces
+ if (isspace(c))
+ continue;
+
+ // look for end of C comment
+ if (in_comment && c == '*' && *srcptr == '/')
+ {
+ srcptr++;
+ in_comment = false;
+ continue;
+ }
+
+ // skip anything else inside a C comment
+ if (in_comment)
+ continue;
+
+ // look for start of C comment
+ if (c == '/' && *srcptr == '*')
+ {
+ srcptr++;
+ in_comment = true;
+ continue;
+ }
+
+ // if we hit a C++ comment, scan to the end of line
+ if (c == '/' && *srcptr == '/')
+ {
+ while (srcptr < endptr && *srcptr != 13 && *srcptr != 10)
+ srcptr++;
+ continue;
+ }
+
+ // extract the driver name
+ char drivname[32];
+ drivname[0] = 0;
+ srcptr--;
+ for (int pos = 0; srcptr < endptr && pos < ARRAY_LENGTH(drivname) - 1 && !isspace(*srcptr); pos++)
+ {
+ drivname[pos] = *srcptr++;
+ drivname[pos+1] = 0;
+ }
+
+ // verify the name as valid
+ for (char *drivch = drivname; *drivch != 0; drivch++)
+ {
+ if ((*drivch >= 'a' && *drivch <= 'z') || (*drivch >= '0' && *drivch <= '9') || *drivch == '_')
+ continue;
+ fprintf(stderr, "%s:%d - Invalid character '%c' in driver \"%s\"\n", srcfile, linenum, *drivch, drivname);
+ return 1;
+ }
+
+ // add it to the list
+ char *name = (char *)malloc(strlen(drivname) + 1);
+ strcpy(name, drivname);
+ drivlist[drivcount++] = name;
+ }
+
+ // add a reference to the ___empty driver
+ drivlist[drivcount++] = "___empty";
+
+ // output a count
+ if (drivcount == 0)
+ {
+ fprintf(stderr, "No drivers found\n");
+ return 1;
+ }
+ fprintf(stderr, "%d drivers found\n", drivcount);
+
+ // sort the list
+ qsort(drivlist, drivcount, sizeof(*drivlist), sort_callback);
+
+ // start with a header
+ printf("#include \"emu.h\"\n\n");
+
+ // output the list of externs first
+ for (int index = 0; index < drivcount; index++)
+ printf("GAME_EXTERN(%s);\n", drivlist[index]);
+ printf("\n");
+
+ // then output the array
+ printf("const game_driver * const driver_list::s_drivers_sorted[%d] =\n", drivcount);
+ printf("{\n");
+ for (int index = 0; index < drivcount; index++)
+ printf("\t&GAME_NAME(%s)%s\n", drivlist[index], (index == drivcount - 1) ? "" : ",");
+ printf("};\n");
+ printf("\n");
+
+ // also output a global count
+ printf("int driver_list::s_driver_count = %d;\n", drivcount);
+
+ return 0;
+}
diff --git a/src/emu/audit.c b/src/emu/audit.c
index 76b9ab5dbee..1393a335737 100644
--- a/src/emu/audit.c
+++ b/src/emu/audit.c
@@ -4,8 +4,36 @@
ROM set auditing functions.
- Copyright Nicola Salmoria and the MAME Team.
- Visit http://mamedev.org for licensing and usage restrictions.
+****************************************************************************
+
+ Copyright Aaron Giles
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name 'MAME' nor the names of its contributors may be
+ used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
***************************************************************************/
@@ -17,510 +45,419 @@
#include "sound/samples.h"
+//**************************************************************************
+// CORE FUNCTIONS
+//**************************************************************************
-/***************************************************************************
- FUNCTION PROTOTYPES
-***************************************************************************/
-
-static void audit_one_rom(emu_options &options, const rom_entry *rom, const char *regiontag, const game_driver *gamedrv, const char *validation, audit_record *record);
-static void audit_one_disk(emu_options &options, const rom_entry *rom, const game_driver *gamedrv, const char *validation, audit_record *record);
-static int rom_used_by_parent(emu_options &options, const game_driver *gamedrv, const hash_collection &romhashes, const game_driver **parent);
-
-
-
-/***************************************************************************
- INLINE FUNCTIONS
-***************************************************************************/
+//-------------------------------------------------
+// media_auditor - constructor
+//-------------------------------------------------
-/*-------------------------------------------------
- set_status - shortcut for setting status and
- substatus values
--------------------------------------------------*/
-
-INLINE void set_status(audit_record *record, UINT8 status, UINT8 substatus)
+media_auditor::media_auditor(const driver_enumerator &enumerator)
+ : m_enumerator(enumerator),
+ m_validation(AUDIT_VALIDATE_FULL),
+ m_searchpath(NULL)
{
- record->status = status;
- record->substatus = substatus;
}
+//-------------------------------------------------
+// audit_media - audit the media described by the
+// currently-enumerated driver
+//-------------------------------------------------
-/***************************************************************************
- CORE FUNCTIONS
-***************************************************************************/
-
-/*-------------------------------------------------
- audit_images - validate the ROM and disk
- images for a game
--------------------------------------------------*/
-
-int audit_images(emu_options &options, const game_driver *gamedrv, const char *validation, audit_record **audit)
+media_auditor::summary media_auditor::audit_media(const char *validation)
{
- machine_config config(*gamedrv, options);
- const rom_entry *region, *rom;
- const rom_source *source;
- audit_record *record;
- int anyfound = FALSE;
- int anyrequired = FALSE;
- int allshared = TRUE;
- int records;
-
- /* determine the number of records we will generate */
- records = 0;
- bool source_is_gamedrv = true;
- for (source = rom_first_source(config); source != NULL; source = rom_next_source(*source))
- {
- for (region = rom_first_region(*source); region != NULL; region = rom_next_region(region))
- for (rom = rom_first_file(region); rom != NULL; rom = rom_next_file(rom))
- if (ROMREGION_ISROMDATA(region) || ROMREGION_ISDISKDATA(region))
- {
- if (source_is_gamedrv && !ROM_ISOPTIONAL(rom))
- {
- hash_collection hashes(ROM_GETHASHDATA(rom));
- if (!hashes.flag(hash_collection::FLAG_NO_DUMP))
- {
- anyrequired = TRUE;
- if (allshared && !rom_used_by_parent(options, gamedrv, hashes, NULL))
- allshared = FALSE;
- }
- }
- records++;
- }
+ // start fresh
+ m_record_list.reset();
- source_is_gamedrv = false;
- }
+ // store validation for later
+ m_validation = validation;
- if (records > 0)
+ // iterate over ROM sources and regions
+ bool anyfound = false;
+ bool anyrequired = false;
+ for (const rom_source *source = rom_first_source(m_enumerator.config()); source != NULL; source = rom_next_source(*source))
{
- /* allocate memory for the records */
- *audit = global_alloc_array_clear(audit_record, records);
- record = *audit;
-
- /* iterate over ROM sources and regions */
- bool source_is_gamedrv = true;
- for (source = rom_first_source(config); source != NULL; source = rom_next_source(*source))
- {
- for (region = rom_first_region(*source); region != NULL; region = rom_next_region(region))
+ // determine the search path for this source and iterate through the regions
+ m_searchpath = source->searchpath();
+
+ // also determine if this is the driver's specific ROMs or not
+ bool source_is_gamedrv = (dynamic_cast<const driver_device_config_base *>(source) != NULL);
+
+ // now iterate over regions and ROMs within
+ for (const rom_entry *region = rom_first_region(*source); region != NULL; region = rom_next_region(region))
+ for (const rom_entry *rom = rom_first_file(region); rom; rom = rom_next_file(rom))
{
- const char *regiontag = ROMREGION_ISLOADBYNAME(region) ? ROM_GETNAME(region) : NULL;
- for (rom = rom_first_file(region); rom; rom = rom_next_file(rom))
- {
- /* audit a file */
- if (ROMREGION_ISROMDATA(region))
- {
- audit_one_rom(options, rom, regiontag, gamedrv, validation, record);
- }
-
- /* audit a disk */
- else if (ROMREGION_ISDISKDATA(region))
- {
- audit_one_disk(options, rom, gamedrv, validation, record);
- }
-
- else
- {
- continue;
- }
-
- if (source_is_gamedrv && record->status != AUDIT_STATUS_NOT_FOUND && (allshared || !rom_used_by_parent(options, gamedrv, record->exphashes, NULL)))
- anyfound = TRUE;
-
- record++;
- }
+ hash_collection hashes(ROM_GETHASHDATA(rom));
+
+ // if a dump exists, then at least one entry is required
+ if (!hashes.flag(hash_collection::FLAG_NO_DUMP))
+ anyrequired = true;
+
+ // audit a file
+ audit_record *record = NULL;
+ if (ROMREGION_ISROMDATA(region))
+ record = audit_one_rom(rom);
+
+ // audit a disk
+ else if (ROMREGION_ISDISKDATA(region))
+ record = audit_one_disk(rom);
+
+ // skip if no record
+ if (record == NULL)
+ continue;
+
+ // if we got a record back,
+ if (record->status() != audit_record::STATUS_NOT_FOUND && source_is_gamedrv && also_used_by_parent(hashes) == -1)
+ anyfound = true;
}
- source_is_gamedrv = false;
- }
}
- /* if we found nothing, we don't have the set at all */
+ // if we found nothing, we don't have the set at all
if (!anyfound && anyrequired)
- {
- global_free(*audit);
- *audit = NULL;
- records = 0;
- }
-
- return records;
+ m_record_list.reset();
+
+ // return a summary
+ return summarize();
}
-/*-------------------------------------------------
- audit_samples - validate the samples for a
- game
--------------------------------------------------*/
+//-------------------------------------------------
+// audit_samples - validate the samples for the
+// currently-enumerated driver
+//-------------------------------------------------
-int audit_samples(emu_options &options, const game_driver *gamedrv, audit_record **audit)
+media_auditor::summary media_auditor::audit_samples()
{
- machine_config config(*gamedrv, options);
- audit_record *record;
- int records = 0;
- int sampnum;
-
- /* count the number of sample records attached to this driver */
- const device_config_sound_interface *sound = NULL;
- for (bool gotone = config.m_devicelist.first(sound); gotone; gotone = sound->next(sound))
- if (sound->devconfig().type() == SAMPLES)
- {
- const samples_interface *intf = (const samples_interface *)sound->devconfig().static_config();
-
- if (intf->samplenames != NULL)
- {
- /* iterate over samples in this entry */
- for (sampnum = 0; intf->samplenames[sampnum] != NULL; sampnum++)
- if (intf->samplenames[sampnum][0] != '*')
- records++;
- }
- }
-
- /* if no records, just quit now */
- if (records == 0)
- goto skip;
-
- /* allocate memory for the records */
- *audit = global_alloc_array_clear(audit_record, records);
- record = *audit;
+ // start fresh
+ m_record_list.reset();
- /* now iterate over sample entries */
- for (bool gotone = config.m_devicelist.first(sound); gotone; gotone = sound->next(sound))
- if (sound->devconfig().type() == SAMPLES)
+ // iterate over sample entries
+ for (const device_config *devconfig = m_enumerator.config().first_device(); devconfig != NULL; devconfig = devconfig->next())
+ if (devconfig->type() == SAMPLES)
{
- const samples_interface *intf = (const samples_interface *)sound->devconfig().static_config();
- const char *sharedname = NULL;
-
+ const samples_interface *intf = reinterpret_cast<const samples_interface *>(devconfig->static_config());
if (intf->samplenames != NULL)
{
- /* iterate over samples in this entry */
- for (sampnum = 0; intf->samplenames[sampnum] != NULL; sampnum++)
+ // by default we just search using the driver name
+ astring searchpath(m_enumerator.driver().name);
+
+ // iterate over samples in this entry
+ for (int sampnum = 0; intf->samplenames[sampnum] != NULL; sampnum++)
+ {
+ // starred entries indicate an additional searchpath
if (intf->samplenames[sampnum][0] == '*')
- sharedname = &intf->samplenames[sampnum][1];
- else
{
- /* attempt to access the file from the game driver name */
- emu_file file(options.sample_path(), OPEN_FLAG_READ | OPEN_FLAG_NO_PRELOAD);
- file_error filerr = file.open(gamedrv->name, PATH_SEPARATOR, intf->samplenames[sampnum]);
-
- /* attempt to access the file from the shared driver name */
- if (filerr != FILERR_NONE && sharedname != NULL)
- filerr = file.open(sharedname, PATH_SEPARATOR, intf->samplenames[sampnum]);
-
- /* fill in the record */
- record->type = AUDIT_FILE_SAMPLE;
- record->name = intf->samplenames[sampnum];
+ searchpath.cat(";").cat(&intf->samplenames[sampnum][1]);
+ continue;
+ }
+
+ // create a new record
+ audit_record &record = m_record_list.append(*global_alloc(audit_record(intf->samplenames[sampnum], audit_record::MEDIA_SAMPLE)));
+
+ // look for the files
+ emu_file file(m_enumerator.options().sample_path(), OPEN_FLAG_READ | OPEN_FLAG_NO_PRELOAD);
+ path_iterator path(searchpath);
+ astring curpath;
+ while (path.next(curpath, intf->samplenames[sampnum]))
+ {
+ // attempt to access the file
+ file_error filerr = file.open(curpath);
if (filerr == FILERR_NONE)
- set_status(record++, AUDIT_STATUS_GOOD, SUBSTATUS_GOOD);
+ record.set_status(audit_record::STATUS_GOOD, audit_record::SUBSTATUS_GOOD);
else
- set_status(record++, AUDIT_STATUS_NOT_FOUND, SUBSTATUS_NOT_FOUND);
+ record.set_status(audit_record::STATUS_NOT_FOUND, audit_record::SUBSTATUS_NOT_FOUND);
}
+ }
}
}
-
-skip:
- return records;
+
+ // return a summary
+ return summarize();
}
-/*-------------------------------------------------
- audit_summary - output a summary given a
- list of audit records
--------------------------------------------------*/
+//-------------------------------------------------
+// summary - generate a summary, with an optional
+// string format
+//-------------------------------------------------
-int audit_summary(const game_driver *gamedrv, int count, const audit_record *records, int output)
+media_auditor::summary media_auditor::summarize(astring *string)
{
- int overall_status = CORRECT;
- int recnum;
-
- /* no count AND no records means not found */
- if (count == 0 && records == NULL)
+ // no count AND no records means not found
+ if (m_record_list.count() == 0)
return NOTFOUND;
- /* loop over records */
- for (recnum = 0; recnum < count; recnum++)
+ // loop over records
+ summary overall_status = CORRECT;
+ for (audit_record *record = m_record_list.first(); record != NULL; record = record->next())
{
- const audit_record *record = &records[recnum];
- int best_new_status = INCORRECT;
+ summary best_new_status = INCORRECT;
- /* skip anything that's fine */
- if (record->substatus == SUBSTATUS_GOOD)
+ // skip anything that's fine
+ if (record->substatus() == audit_record::SUBSTATUS_GOOD)
continue;
- /* output the game name, file name, and length (if applicable) */
- if (output)
+ // output the game name, file name, and length (if applicable)
+ if (string != NULL)
{
- mame_printf_info("%-8s: %s", gamedrv->name, record->name);
- if (record->explength > 0)
- mame_printf_info(" (%d bytes)", record->explength);
- mame_printf_info(" - ");
+ string->catprintf("%-12s: %s", m_enumerator.driver().name, record->name());
+ if (record->expected_length() > 0)
+ string->catprintf(" (%d bytes)", record->expected_length());
+ string->catprintf(" - ");
}
- /* use the substatus for finer details */
- switch (record->substatus)
+ // use the substatus for finer details
+ switch (record->substatus())
{
- case SUBSTATUS_GOOD_NEEDS_REDUMP:
- if (output) mame_printf_info("NEEDS REDUMP\n");
+ case audit_record::SUBSTATUS_GOOD_NEEDS_REDUMP:
+ if (string != NULL) string->catprintf("NEEDS REDUMP\n");
best_new_status = BEST_AVAILABLE;
break;
- case SUBSTATUS_FOUND_NODUMP:
- if (output) mame_printf_info("NO GOOD DUMP KNOWN\n");
+ case audit_record::SUBSTATUS_FOUND_NODUMP:
+ if (string != NULL) string->catprintf("NO GOOD DUMP KNOWN\n");
best_new_status = BEST_AVAILABLE;
break;
- case SUBSTATUS_FOUND_BAD_CHECKSUM:
- if (output)
+ case audit_record::SUBSTATUS_FOUND_BAD_CHECKSUM:
+ if (string != NULL)
{
astring tempstr;
- mame_printf_info("INCORRECT CHECKSUM:\n");
- mame_printf_info("EXPECTED: %s\n", record->exphashes.macro_string(tempstr));
- mame_printf_info(" FOUND: %s\n", record->hashes.macro_string(tempstr));
+ string->catprintf("INCORRECT CHECKSUM:\n");
+ string->catprintf("EXPECTED: %s\n", record->expected_hashes().macro_string(tempstr));
+ string->catprintf(" FOUND: %s\n", record->actual_hashes().macro_string(tempstr));
}
break;
- case SUBSTATUS_FOUND_WRONG_LENGTH:
- if (output) mame_printf_info("INCORRECT LENGTH: %d bytes\n", record->length);
+ case audit_record::SUBSTATUS_FOUND_WRONG_LENGTH:
+ if (string != NULL) string->catprintf("INCORRECT LENGTH: %d bytes\n", record->actual_length());
break;
- case SUBSTATUS_NOT_FOUND:
- if (output) mame_printf_info("NOT FOUND\n");
+ case audit_record::SUBSTATUS_NOT_FOUND:
+ if (string != NULL) string->catprintf("NOT FOUND\n");
break;
- case SUBSTATUS_NOT_FOUND_NODUMP:
- if (output) mame_printf_info("NOT FOUND - NO GOOD DUMP KNOWN\n");
+ case audit_record::SUBSTATUS_NOT_FOUND_NODUMP:
+ if (string != NULL) string->catprintf("NOT FOUND - NO GOOD DUMP KNOWN\n");
best_new_status = BEST_AVAILABLE;
break;
- case SUBSTATUS_NOT_FOUND_OPTIONAL:
- if (output) mame_printf_info("NOT FOUND BUT OPTIONAL\n");
+ case audit_record::SUBSTATUS_NOT_FOUND_OPTIONAL:
+ if (string != NULL) string->catprintf("NOT FOUND BUT OPTIONAL\n");
best_new_status = BEST_AVAILABLE;
break;
- case SUBSTATUS_NOT_FOUND_PARENT:
- if (output) mame_printf_info("NOT FOUND (shared with parent)\n");
+ case audit_record::SUBSTATUS_NOT_FOUND_PARENT:
+ if (string != NULL) string->catprintf("NOT FOUND (shared with parent)\n");
break;
- case SUBSTATUS_NOT_FOUND_BIOS:
- if (output) mame_printf_info("NOT FOUND (BIOS)\n");
+ case audit_record::SUBSTATUS_NOT_FOUND_BIOS:
+ if (string != NULL) string->catprintf("NOT FOUND (BIOS)\n");
break;
+
+ default:
+ assert(false);
}
- /* downgrade the overall status if necessary */
+ // downgrade the overall status if necessary
overall_status = MAX(overall_status, best_new_status);
}
-
return overall_status;
}
+//-------------------------------------------------
+// audit_one_rom - validate a single ROM entry
+//-------------------------------------------------
-/***************************************************************************
- UTILITIES
-***************************************************************************/
-
-/*-------------------------------------------------
- audit_one_rom - validate a single ROM entry
--------------------------------------------------*/
-
-static void audit_one_rom(emu_options &options, const rom_entry *rom, const char *regiontag, const game_driver *gamedrv, const char *validation, audit_record *record)
+audit_record *media_auditor::audit_one_rom(const rom_entry *rom)
{
- const game_driver *drv;
- UINT32 crc = 0;
+ // allocate and append a new record
+ audit_record &record = m_record_list.append(*global_alloc(audit_record(*rom, audit_record::MEDIA_ROM)));
- /* fill in the record basics */
- record->type = AUDIT_FILE_ROM;
- record->name = ROM_GETNAME(rom);
- record->exphashes.from_internal_string(ROM_GETHASHDATA(rom));
- record->length = 0;
- record->explength = rom_file_size(rom);
-
- /* see if we have a CRC and extract it if so */
- bool has_crc = record->exphashes.crc(crc);
+ // see if we have a CRC and extract it if so
+ UINT32 crc = 0;
+ bool has_crc = record.expected_hashes().crc(crc);
- /* find the file and checksum it, getting the file length along the way */
- for (drv = gamedrv; drv != NULL; drv = driver_get_clone(drv))
+ // find the file and checksum it, getting the file length along the way
+ emu_file file(m_enumerator.options().media_path(), OPEN_FLAG_READ | OPEN_FLAG_NO_PRELOAD);
+ path_iterator path(m_searchpath);
+ astring curpath;
+ while (path.next(curpath, record.name()))
{
- emu_file file(options.media_path(), OPEN_FLAG_READ | OPEN_FLAG_NO_PRELOAD);
-
- /* open the file if we can */
+ // open the file if we can
file_error filerr;
if (has_crc)
- filerr = file.open(drv->name, PATH_SEPARATOR, ROM_GETNAME(rom), crc);
+ filerr = file.open(curpath, crc);
else
- filerr = file.open(drv->name, PATH_SEPARATOR, ROM_GETNAME(rom));
+ filerr = file.open(curpath);
+
+ // if it worked, get the actual length and hashes, then stop
if (filerr == FILERR_NONE)
{
- record->hashes = file.hashes(validation);
- record->length = (UINT32)file.size();
+ record.set_actual(file.hashes(m_validation), file.size());
break;
}
}
+
+ // compute the final status
+ compute_status(record, rom, record.actual_length() != 0);
+ return &record;
+}
- /* if not found, check the region as a backup */
- if (record->length == 0 && regiontag != NULL)
- {
- emu_file file(options.media_path(), OPEN_FLAG_READ | OPEN_FLAG_NO_PRELOAD);
-
- /* open the file if we can */
- file_error filerr;
- if (has_crc)
- filerr = file.open(regiontag, PATH_SEPARATOR, ROM_GETNAME(rom), crc);
- else
- filerr = file.open(regiontag, PATH_SEPARATOR, ROM_GETNAME(rom));
- if (filerr == FILERR_NONE)
- {
- record->hashes = file.hashes(validation);
- record->length = (UINT32)file.size();
- }
- }
-
- /* if we failed to find the file, set the appropriate status */
- if (record->length == 0)
- {
- const game_driver *parent;
-
- /* no good dump */
- if (record->exphashes.flag(hash_collection::FLAG_NO_DUMP))
- set_status(record, AUDIT_STATUS_NOT_FOUND, SUBSTATUS_NOT_FOUND_NODUMP);
-
- /* optional ROM */
- else if (ROM_ISOPTIONAL(rom))
- set_status(record, AUDIT_STATUS_NOT_FOUND, SUBSTATUS_NOT_FOUND_OPTIONAL);
- /* not found and used by parent */
- else if (rom_used_by_parent(options, gamedrv, record->exphashes, &parent))
- set_status(record, AUDIT_STATUS_NOT_FOUND, (parent->flags & GAME_IS_BIOS_ROOT) ? SUBSTATUS_NOT_FOUND_BIOS : SUBSTATUS_NOT_FOUND_PARENT);
+//-------------------------------------------------
+// audit_one_disk - validate a single disk entry
+//-------------------------------------------------
- /* just plain old not found */
- else
- set_status(record, AUDIT_STATUS_NOT_FOUND, SUBSTATUS_NOT_FOUND);
- }
+audit_record *media_auditor::audit_one_disk(const rom_entry *rom)
+{
+ // allocate and append a new record
+ audit_record &record = m_record_list.append(*global_alloc(audit_record(*rom, audit_record::MEDIA_DISK)));
- /* if we did find the file, do additional verification */
- else
+ // open the disk
+ emu_file *source_file;
+ chd_file *source;
+ chd_error err = open_disk_image(m_enumerator.options(), &m_enumerator.driver(), rom, &source_file, &source, NULL);
+
+ // if we succeeded, get the hashes
+ if (err == CHDERR_NONE)
{
- /* length mismatch */
- if (record->explength != record->length)
- set_status(record, AUDIT_STATUS_FOUND_INVALID, SUBSTATUS_FOUND_WRONG_LENGTH);
-
- /* found but needs a dump */
- else if (record->exphashes.flag(hash_collection::FLAG_NO_DUMP))
- set_status(record, AUDIT_STATUS_GOOD, SUBSTATUS_FOUND_NODUMP);
-
- /* incorrect hash */
- else if (record->exphashes != record->hashes)
- set_status(record, AUDIT_STATUS_FOUND_INVALID, SUBSTATUS_FOUND_BAD_CHECKSUM);
+ static const UINT8 nullhash[20] = { 0 };
+ chd_header header = *chd_get_header(source);
+ hash_collection hashes;
- /* correct hash but needs a redump */
- else if (record->exphashes.flag(hash_collection::FLAG_BAD_DUMP))
- set_status(record, AUDIT_STATUS_GOOD, SUBSTATUS_GOOD_NEEDS_REDUMP);
+ // if there's an MD5 or SHA1 hash, add them to the output hash
+ if (memcmp(nullhash, header.md5, sizeof(header.md5)) != 0)
+ hashes.add_from_buffer(hash_collection::HASH_MD5, header.md5, sizeof(header.md5));
+ if (memcmp(nullhash, header.sha1, sizeof(header.sha1)) != 0)
+ hashes.add_from_buffer(hash_collection::HASH_SHA1, header.sha1, sizeof(header.sha1));
+
+ // update the actual values
+ record.set_actual(hashes);
- /* just plain old good */
- else
- set_status(record, AUDIT_STATUS_GOOD, SUBSTATUS_GOOD);
+ // close the file and release the source
+ chd_close(source);
+ global_free(source_file);
}
+
+ // compute the final status
+ compute_status(record, rom, record.actual_length() != 0);
+ return &record;
}
-/*-------------------------------------------------
- audit_one_disk - validate a single disk entry
--------------------------------------------------*/
+//-------------------------------------------------
+// compute_status - compute a detailed status
+// based on the information we have
+//-------------------------------------------------
-static void audit_one_disk(emu_options &options, const rom_entry *rom, const game_driver *gamedrv, const char *validation, audit_record *record)
+void media_auditor::compute_status(audit_record &record, const rom_entry *rom, bool found)
{
- emu_file *source_file;
- chd_file *source;
- chd_error err;
-
- /* fill in the record basics */
- record->type = AUDIT_FILE_DISK;
- record->name = ROM_GETNAME(rom);
- record->exphashes.from_internal_string(ROM_GETHASHDATA(rom));
-
- /* open the disk */
- err = open_disk_image(options, gamedrv, rom, &source_file, &source, NULL);
-
- /* if we failed, report the error */
- if (err != CHDERR_NONE)
+ // if not found, provide more details
+ if (!found)
{
- /* out of memory */
- if (err == CHDERR_OUT_OF_MEMORY)
- set_status(record, AUDIT_STATUS_ERROR, SUBSTATUS_ERROR);
+ int parent;
+
+ // no good dump
+ if (record.expected_hashes().flag(hash_collection::FLAG_NO_DUMP))
+ record.set_status(audit_record::STATUS_NOT_FOUND, audit_record::SUBSTATUS_NOT_FOUND_NODUMP);
- /* not found but it's not good anyway */
- else if (record->exphashes.flag(hash_collection::FLAG_NO_DUMP))
- set_status(record, AUDIT_STATUS_NOT_FOUND, SUBSTATUS_NOT_FOUND_NODUMP);
+ // optional ROM
+ else if (ROM_ISOPTIONAL(rom))
+ record.set_status(audit_record::STATUS_NOT_FOUND, audit_record::SUBSTATUS_NOT_FOUND_OPTIONAL);
- /* not found but optional */
- else if (DISK_ISOPTIONAL(rom))
- set_status(record, AUDIT_STATUS_NOT_FOUND, SUBSTATUS_NOT_FOUND_OPTIONAL);
+ // not found and used by parent
+ else if ((parent = also_used_by_parent(record.expected_hashes())) != -1)
+ {
+ if (m_enumerator.driver(parent).flags & GAME_IS_BIOS_ROOT)
+ record.set_status(audit_record::STATUS_NOT_FOUND, audit_record::SUBSTATUS_NOT_FOUND_BIOS);
+ else
+ record.set_status(audit_record::STATUS_NOT_FOUND, audit_record::SUBSTATUS_NOT_FOUND_PARENT);
+ }
- /* not found at all */
+ // just plain old not found
else
- set_status(record, AUDIT_STATUS_NOT_FOUND, SUBSTATUS_NOT_FOUND);
+ record.set_status(audit_record::STATUS_NOT_FOUND, audit_record::SUBSTATUS_NOT_FOUND);
}
-
- /* if we succeeded, validate it */
+
+ // if found, provide more details
else
{
- static const UINT8 nullhash[20] = { 0 };
- chd_header header = *chd_get_header(source);
-
- /* if there's an MD5 or SHA1 hash, add them to the output hash */
- if (memcmp(nullhash, header.md5, sizeof(header.md5)) != 0)
- record->hashes.add_from_buffer(hash_collection::HASH_MD5, header.md5, sizeof(header.md5));
- if (memcmp(nullhash, header.sha1, sizeof(header.sha1)) != 0)
- record->hashes.add_from_buffer(hash_collection::HASH_SHA1, header.sha1, sizeof(header.sha1));
+ // length mismatch
+ if (record.expected_length() != record.actual_length())
+ record.set_status(audit_record::STATUS_FOUND_INVALID, audit_record::SUBSTATUS_FOUND_WRONG_LENGTH);
- /* found but needs a dump */
- if (record->exphashes.flag(hash_collection::FLAG_NO_DUMP))
- set_status(record, AUDIT_STATUS_GOOD, SUBSTATUS_FOUND_NODUMP);
+ // found but needs a dump
+ else if (record.expected_hashes().flag(hash_collection::FLAG_NO_DUMP))
+ record.set_status(audit_record::STATUS_GOOD, audit_record::SUBSTATUS_FOUND_NODUMP);
- /* incorrect hash */
- else if (record->exphashes != record->hashes)
- set_status(record, AUDIT_STATUS_FOUND_INVALID, SUBSTATUS_FOUND_BAD_CHECKSUM);
+ // incorrect hash
+ else if (record.expected_hashes() != record.actual_hashes())
+ record.set_status(audit_record::STATUS_FOUND_INVALID, audit_record::SUBSTATUS_FOUND_BAD_CHECKSUM);
- /* correct hash but needs a redump */
- else if (record->exphashes.flag(hash_collection::FLAG_BAD_DUMP))
- set_status(record, AUDIT_STATUS_GOOD, SUBSTATUS_GOOD_NEEDS_REDUMP);
+ // correct hash but needs a redump
+ else if (record.expected_hashes().flag(hash_collection::FLAG_BAD_DUMP))
+ record.set_status(audit_record::STATUS_GOOD, audit_record::SUBSTATUS_GOOD_NEEDS_REDUMP);
- /* just plain good */
+ // just plain old good
else
- set_status(record, AUDIT_STATUS_GOOD, SUBSTATUS_GOOD);
-
- chd_close(source);
- global_free(source_file);
+ record.set_status(audit_record::STATUS_GOOD, audit_record::SUBSTATUS_GOOD);
}
}
-/*-------------------------------------------------
- rom_used_by_parent - determine if a given
- ROM is also used by the parent
--------------------------------------------------*/
+//-------------------------------------------------
+// also_used_by_parent - return the index in the
+// enumerator of the parent who also owns a media
+// entry with the same hashes
+//-------------------------------------------------
-static int rom_used_by_parent(emu_options &options, const game_driver *gamedrv, const hash_collection &romhashes, const game_driver **parent)
+int media_auditor::also_used_by_parent(const hash_collection &romhashes)
{
- const game_driver *drv;
+ // iterate up the parent chain
+ for (int drvindex = m_enumerator.find(m_enumerator.driver().parent); drvindex != -1; drvindex = m_enumerator.find(m_enumerator.driver(drvindex).parent))
- /* iterate up the parent chain */
- for (drv = driver_get_clone(gamedrv); drv != NULL; drv = driver_get_clone(drv))
- {
- machine_config config(*drv, options);
- const rom_entry *region;
- const rom_entry *rom;
-
- /* see if the parent has the same ROM or not */
- for (const rom_source *source = rom_first_source(config); source != NULL; source = rom_next_source(*source))
- for (region = rom_first_region(*source); region; region = rom_next_region(region))
- for (rom = rom_first_file(region); rom; rom = rom_next_file(rom))
+ // see if the parent has the same ROM or not
+ for (const rom_source *source = rom_first_source(m_enumerator.config(drvindex)); source != NULL; source = rom_next_source(*source))
+ for (const rom_entry *region = rom_first_region(*source); region; region = rom_next_region(region))
+ for (const rom_entry *rom = rom_first_file(region); rom; rom = rom_next_file(rom))
{
hash_collection hashes(ROM_GETHASHDATA(rom));
if (!hashes.flag(hash_collection::FLAG_NO_DUMP) && hashes == romhashes)
- {
- if (parent != NULL)
- *parent = drv;
- return TRUE;
- }
+ return drvindex;
}
- }
- return FALSE;
+ // nope, return -1
+ return -1;
+}
+
+
+//-------------------------------------------------
+// audit_record - constructor
+//-------------------------------------------------
+
+audit_record::audit_record(const rom_entry &media, media_type type)
+ : m_next(NULL),
+ m_type(type),
+ m_status(STATUS_ERROR),
+ m_substatus(SUBSTATUS_ERROR),
+ m_name(ROM_GETNAME(&media)),
+ m_explength(rom_file_size(&media)),
+ m_length(0)
+{
+ m_exphashes.from_internal_string(ROM_GETHASHDATA(&media));
+}
+
+audit_record::audit_record(const char *name, media_type type)
+ : m_next(NULL),
+ m_type(type),
+ m_status(STATUS_ERROR),
+ m_substatus(SUBSTATUS_ERROR),
+ m_name(name),
+ m_explength(0),
+ m_length(0)
+{
}
diff --git a/src/emu/audit.h b/src/emu/audit.h
index 3b6eaffd4a2..00964e91417 100644
--- a/src/emu/audit.h
+++ b/src/emu/audit.h
@@ -4,8 +4,36 @@
ROM, disk, and sample auditing functions.
- Copyright Nicola Salmoria and the MAME Team.
- Visit http://mamedev.org for licensing and usage restrictions.
+****************************************************************************
+
+ Copyright Aaron Giles
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name 'MAME' nor the names of its contributors may be
+ used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
***************************************************************************/
@@ -18,84 +46,145 @@
-/***************************************************************************
- CONSTANTS
-***************************************************************************/
+//**************************************************************************
+// CONSTANTS
+//**************************************************************************
-/* hashes to use for validation */
+// hashes to use for validation
#define AUDIT_VALIDATE_FAST "R" /* CRC only */
#define AUDIT_VALIDATE_FULL "RS" /* CRC + SHA1 */
-/* return values from audit_verify_roms and audit_verify_samples */
-enum
-{
- CORRECT = 0,
- BEST_AVAILABLE,
- INCORRECT,
- NOTFOUND
-};
-/* image types for audit_record.type */
-enum
-{
- AUDIT_FILE_ROM = 0,
- AUDIT_FILE_DISK,
- AUDIT_FILE_SAMPLE
-};
-/* status values for audit_record.status */
-enum
-{
- AUDIT_STATUS_GOOD = 0,
- AUDIT_STATUS_FOUND_INVALID,
- AUDIT_STATUS_NOT_FOUND,
- AUDIT_STATUS_ERROR
-};
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
-/* substatus values for audit_record.substatus */
-enum
-{
- SUBSTATUS_GOOD = 0,
- SUBSTATUS_GOOD_NEEDS_REDUMP,
- SUBSTATUS_FOUND_NODUMP,
- SUBSTATUS_FOUND_BAD_CHECKSUM,
- SUBSTATUS_FOUND_WRONG_LENGTH,
- SUBSTATUS_NOT_FOUND,
- SUBSTATUS_NOT_FOUND_NODUMP,
- SUBSTATUS_NOT_FOUND_OPTIONAL,
- SUBSTATUS_NOT_FOUND_PARENT,
- SUBSTATUS_NOT_FOUND_BIOS,
- SUBSTATUS_ERROR = 100
-};
+// ======================> audit_record
-
-/***************************************************************************
- TYPE DEFINITIONS
-***************************************************************************/
-
-typedef struct _audit_record audit_record;
-struct _audit_record
+// holds the result of auditing a single item
+class audit_record
{
- UINT8 type; /* type of item that was audited */
- UINT8 status; /* status of audit on this item */
- UINT8 substatus; /* finer-detail status */
- const char * name; /* name of item */
- UINT32 explength; /* expected length of item */
- UINT32 length; /* actual length of item */
- hash_collection exphashes; /* expected hash data */
- hash_collection hashes; /* actual hash information */
+ friend class simple_list<audit_record>;
+
+public:
+ // media types
+ enum media_type
+ {
+ MEDIA_ROM = 0,
+ MEDIA_DISK,
+ MEDIA_SAMPLE
+ };
+
+ // status values
+ enum audit_status
+ {
+ STATUS_GOOD = 0,
+ STATUS_FOUND_INVALID,
+ STATUS_NOT_FOUND,
+ STATUS_ERROR
+ };
+
+ // substatus values
+ enum audit_substatus
+ {
+ SUBSTATUS_GOOD = 0,
+ SUBSTATUS_GOOD_NEEDS_REDUMP,
+ SUBSTATUS_FOUND_NODUMP,
+ SUBSTATUS_FOUND_BAD_CHECKSUM,
+ SUBSTATUS_FOUND_WRONG_LENGTH,
+ SUBSTATUS_NOT_FOUND,
+ SUBSTATUS_NOT_FOUND_NODUMP,
+ SUBSTATUS_NOT_FOUND_OPTIONAL,
+ SUBSTATUS_NOT_FOUND_PARENT,
+ SUBSTATUS_NOT_FOUND_BIOS,
+ SUBSTATUS_ERROR = 100
+ };
+
+ // construction/destruction
+ audit_record(const rom_entry &media, media_type type);
+ audit_record(const char *name, media_type type);
+
+ // getters
+ audit_record *next() const { return m_next; }
+ media_type type() const { return m_type; }
+ audit_status status() const { return m_status; }
+ audit_substatus substatus() const { return m_substatus; }
+ const char *name() const { return m_name; }
+ UINT64 expected_length() const { return m_explength; }
+ UINT64 actual_length() const { return m_length; }
+ const hash_collection &expected_hashes() const { return m_exphashes; }
+ const hash_collection &actual_hashes() const { return m_hashes; }
+
+ // setters
+ void set_status(audit_status status, audit_substatus substatus)
+ {
+ m_status = status;
+ m_substatus = substatus;
+ }
+
+ void set_actual(const hash_collection &hashes, UINT64 length = 0)
+ {
+ m_hashes = hashes;
+ m_length = length;
+ }
+
+private:
+ // internal state
+ audit_record * m_next;
+ media_type m_type; /* type of item that was audited */
+ audit_status m_status; /* status of audit on this item */
+ audit_substatus m_substatus; /* finer-detail status */
+ const char * m_name; /* name of item */
+ UINT64 m_explength; /* expected length of item */
+ UINT64 m_length; /* actual length of item */
+ hash_collection m_exphashes; /* expected hash data */
+ hash_collection m_hashes; /* actual hash information */
};
+// ======================> media_auditor
-/***************************************************************************
- FUNCTION PROTOTYPES
-***************************************************************************/
-
-int audit_images(emu_options &options, const game_driver *gamedrv, const char *validation, audit_record **audit);
-int audit_samples(emu_options &options, const game_driver *gamedrv, audit_record **audit);
-int audit_summary(const game_driver *gamedrv, int count, const audit_record *records, int output);
+// class which manages auditing of items
+class media_auditor
+{
+public:
+ // summary values
+ enum summary
+ {
+ CORRECT = 0,
+ NONE_NEEDED,
+ BEST_AVAILABLE,
+ INCORRECT,
+ NOTFOUND
+ };
+
+ // construction/destruction
+ media_auditor(const driver_enumerator &enumerator);
+
+ // getters
+ audit_record *first() const { return m_record_list.first(); }
+ int count() const { return m_record_list.count(); }
+
+ // audit operations
+ summary audit_media(const char *validation = AUDIT_VALIDATE_FULL);
+ summary audit_samples();
+ summary summarize(astring *output = NULL);
+
+private:
+ // internal helpers
+ audit_record *audit_one_rom(const rom_entry *rom);
+ audit_record *audit_one_disk(const rom_entry *rom);
+ void compute_status(audit_record &record, const rom_entry *rom, bool found);
+ int also_used_by_parent(const hash_collection &romhashes);
+
+ // internal state
+ simple_list<audit_record> m_record_list;
+ const driver_enumerator & m_enumerator;
+ const char * m_validation;
+ const char * m_searchpath;
+};
#endif /* __AUDIT_H__ */
diff --git a/src/emu/clifront.c b/src/emu/clifront.c
index 81435650c34..6035aa0e77f 100644
--- a/src/emu/clifront.c
+++ b/src/emu/clifront.c
@@ -56,42 +56,6 @@
#endif
-/***************************************************************************
- TYPE DEFINITIONS
-***************************************************************************/
-
-struct romident_status
-{
- int total; /* total files processed */
- int matches; /* number of matches found */
- int nonroms; /* number of non-ROM files found */
-};
-
-
-
-/***************************************************************************
- FUNCTION PROTOTYPES
-***************************************************************************/
-
-static void execute_commands(cli_options &options, const char *exename);
-static void display_help(void);
-
-/* informational functions */
-static void info_verifyroms(emu_options &options, const char *gamename);
-static void info_verifysamples(emu_options &options, const char *gamename);
-static void info_romident(emu_options &options, const char *gamename);
-static void info_listmedia(emu_options &options, const char *gamename);
-static void info_listsoftware(emu_options &options, const char *gamename);
-
-/* utilities */
-static void romident(emu_options &options, const char *filename, romident_status *status);
-static void identify_file(emu_options &options, const char *name, romident_status *status);
-static void identify_data(emu_options &options, const char *name, const UINT8 *data, int length, romident_status *status);
-static void match_roms(emu_options &options, const hash_collection &hashes, int length, int *found);
-static void display_suggestions(const char *gamename);
-
-
-
//**************************************************************************
// COMMAND-LINE OPTIONS
//**************************************************************************
@@ -146,45 +110,55 @@ cli_options::cli_options()
-/***************************************************************************
- CORE IMPLEMENTATION
-***************************************************************************/
+//**************************************************************************
+// CLI FRONTEND
+//**************************************************************************
+
+//-------------------------------------------------
+// cli_frontend - constructor
+//-------------------------------------------------
+
+cli_frontend::cli_frontend(cli_options &options, osd_interface &osd)
+ : m_options(options),
+ m_osd(osd),
+ m_result(MAMERR_NONE)
+{
+ // begin tracking memory
+ track_memory(true);
+}
+
+
+//-------------------------------------------------
+// ~cli_frontend - destructor
+//-------------------------------------------------
-static void display_suggestions(const char *gamename)
+cli_frontend::~cli_frontend()
{
- const game_driver *matches[10];
- int drvnum;
-
- /* get the top 10 approximate matches */
- driver_list_get_approx_matches(drivers, gamename, ARRAY_LENGTH(matches), matches);
-
- /* print them out */
- fprintf(stderr, "\n\"%s\" approximately matches the following\n"
- "supported " GAMESNOUN " (best match first):\n\n", gamename);
- for (drvnum = 0; drvnum < ARRAY_LENGTH(matches); drvnum++)
- if (matches[drvnum] != NULL)
- fprintf(stderr, "%-18s%s\n", matches[drvnum]->name, matches[drvnum]->description);
+ // report any unfreed memory on clean exits
+ track_memory(false);
+ if (m_result == MAMERR_NONE)
+ dump_unfreed_mem();
}
//-------------------------------------------------
-// cli_execute - execute a game via the standard
+// execute - execute a game via the standard
// command line interface
//-------------------------------------------------
-int cli_execute(cli_options &options, osd_interface &osd, int argc, char **argv)
+int cli_frontend::execute(int argc, char **argv)
{
// wrap the core execution in a try/catch to field all fatal errors
- int result = MAMERR_NONE;
+ m_result = MAMERR_NONE;
try
{
// parse the command line, adding any system-specific options
astring option_errors;
- if (!options.parse_command_line(argc, argv, option_errors))
+ if (!m_options.parse_command_line(argc, argv, option_errors))
{
// if we failed, check for no command and a system name first; in that case error on the name
- if (strlen(options.command()) == 0 && options.system() == NULL && strlen(options.system_name()) > 0)
- throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "Unknown system '%s'", options.system_name());
+ if (strlen(m_options.command()) == 0 && m_options.system() == NULL && strlen(m_options.system_name()) > 0)
+ throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "Unknown system '%s'", m_options.system_name());
// otherwise, error on the options
throw emu_fatalerror(MAMERR_INVALID_CONFIG, "%s", option_errors.trimspace().cstr());
@@ -197,19 +171,19 @@ int cli_execute(cli_options &options, osd_interface &osd, int argc, char **argv)
core_filename_extract_base(&exename, argv[0], TRUE);
// if we have a command, execute that
- if (strlen(options.command()) != 0)
- execute_commands(options, exename);
+ if (strlen(m_options.command()) != 0)
+ execute_commands(exename);
// otherwise, check for a valid system
else
{
// if we can't find it, give an appropriate error
- const game_driver *system = options.system();
- if (system == NULL && strlen(options.system_name()) > 0)
- throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "Unknown system '%s'", options.system_name());
+ const game_driver *system = m_options.system();
+ if (system == NULL && strlen(m_options.system_name()) > 0)
+ throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "Unknown system '%s'", m_options.system_name());
// otherwise just run the game
- result = mame_execute(options, osd);
+ m_result = mame_execute(m_options, m_osd);
}
}
@@ -218,577 +192,605 @@ int cli_execute(cli_options &options, osd_interface &osd, int argc, char **argv)
{
astring string(fatal.string());
fprintf(stderr, "%s\n", string.trimspace().cstr());
- result = (fatal.exitcode() != 0) ? fatal.exitcode() : MAMERR_FATALERROR;
+ m_result = (fatal.exitcode() != 0) ? fatal.exitcode() : MAMERR_FATALERROR;
// if a game was specified, wasn't a wildcard, and our error indicates this was the
// reason for failure, offer some suggestions
- if (result == MAMERR_NO_SUCH_GAME && strlen(options.system_name()) > 0 && strchr(options.system_name(), '*') == NULL && options.system() == NULL)
- display_suggestions(options.system_name());
+ if (m_result == MAMERR_NO_SUCH_GAME && strlen(m_options.system_name()) > 0 && strchr(m_options.system_name(), '*') == NULL && m_options.system() == NULL)
+ {
+ // get the top 10 approximate matches
+ driver_enumerator drivlist(m_options);
+ int matches[10];
+ drivlist.find_approximate_matches(m_options.system_name(), ARRAY_LENGTH(matches), matches);
+
+ // print them out
+ fprintf(stderr, "\n\"%s\" approximately matches the following\n"
+ "supported " GAMESNOUN " (best match first):\n\n", m_options.system_name());
+ for (int matchnum = 0; matchnum < ARRAY_LENGTH(matches); matchnum++)
+ if (matches[matchnum] != -1)
+ fprintf(stderr, "%-18s%s\n", drivlist.driver(matches[matchnum]).name, drivlist.driver(matches[matchnum]).description);
+ }
}
catch (emu_exception &)
{
fprintf(stderr, "Caught unhandled emulator exception\n");
- result = MAMERR_FATALERROR;
+ m_result = MAMERR_FATALERROR;
}
catch (std::bad_alloc &)
{
fprintf(stderr, "Out of memory!\n");
- result = MAMERR_FATALERROR;
+ m_result = MAMERR_FATALERROR;
}
// handle any other exceptions
catch (...)
{
fprintf(stderr, "Caught unhandled exception\n");
- result = MAMERR_FATALERROR;
+ m_result = MAMERR_FATALERROR;
}
- // report any unfreed memory on clean exits
- if (result == MAMERR_NONE)
- dump_unfreed_mem();
- return result;
+ return m_result;
}
//-------------------------------------------------
-// execute_commands - execute various frontend
-// commands
+// listxml - output the XML data for one or more
+// games
//-------------------------------------------------
-static void execute_commands(cli_options &options, const char *exename)
+void cli_frontend::listxml(const char *gamename)
{
- // help?
- if (strcmp(options.command(), CLICOMMAND_HELP) == 0)
- {
- display_help();
- return;
- }
-
- // showusage?
- if (strcmp(options.command(), CLICOMMAND_SHOWUSAGE) == 0)
- {
- astring helpstring;
-#ifndef MESS
- mame_printf_info("Usage: %s [%s] [options]\n\nOptions:\n%s", exename, GAMENOUN, options.output_help(helpstring));
-#else
- mame_printf_info("Usage: %s [%s] [media] [software] [options]\n\nOptions:\n%s", exename, GAMENOUN, options.output_help(helpstring));
-#endif
- return;
- }
-
- // validate?
- if (strcmp(options.command(), CLICOMMAND_VALIDATE) == 0)
- {
- validate_drivers(options);
- return;
- }
-
- // other commands need the INIs parsed
- astring option_errors;
- options.parse_standard_inis(option_errors);
- if (option_errors)
- printf("%s\n", option_errors.cstr());
-
- // createconfig?
- if (strcmp(options.command(), CLICOMMAND_CREATECONFIG) == 0)
- {
- // attempt to open the output file
- emu_file file(OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- if (file.open(CONFIGNAME ".ini") != FILERR_NONE)
- throw emu_fatalerror("Unable to create file " CONFIGNAME ".ini\n");
-
- // generate the updated INI
- astring initext;
- file.puts(options.output_ini(initext));
- return;
- }
-
- // showconfig?
- if (strcmp(options.command(), CLICOMMAND_SHOWCONFIG) == 0)
- {
- // print the INI text
- astring initext;
- printf("%s\n", options.output_ini(initext));
- return;
- }
-
- // all other commands call out to one of these helpers
- static const struct
- {
- const char *option;
- void (*function)(emu_options &options, const char *gamename);
- } info_commands[] =
- {
- { CLICOMMAND_LISTXML, cli_info_listxml },
- { CLICOMMAND_LISTFULL, cli_info_listfull },
- { CLICOMMAND_LISTSOURCE, cli_info_listsource },
- { CLICOMMAND_LISTCLONES, cli_info_listclones },
- { CLICOMMAND_LISTBROTHERS, cli_info_listbrothers },
- { CLICOMMAND_LISTCRC, cli_info_listcrc },
- { CLICOMMAND_LISTDEVICES, cli_info_listdevices },
- { CLICOMMAND_LISTROMS, cli_info_listroms },
- { CLICOMMAND_LISTSAMPLES, cli_info_listsamples },
- { CLICOMMAND_VERIFYROMS, info_verifyroms },
- { CLICOMMAND_VERIFYSAMPLES, info_verifysamples },
- { CLICOMMAND_LISTMEDIA, info_listmedia },
- { CLICOMMAND_LISTSOFTWARE, info_listsoftware },
- { CLICOMMAND_ROMIDENT, info_romident }
- };
-
- // find the command
- for (int cmdindex = 0; cmdindex < ARRAY_LENGTH(info_commands); cmdindex++)
- if (strcmp(options.command(), info_commands[cmdindex].option) == 0)
- {
- // parse any relevant INI files before proceeding
- const char *sysname = options.system_name();
- (*info_commands[cmdindex].function)(options, (sysname[0] == 0) ? "*" : sysname);
- return;
- }
+ // determine which drivers to output; return an error if none found
+ driver_enumerator drivlist(m_options, gamename);
+ if (drivlist.count() == 0)
+ throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename);
- // if we get here, we don't know what has been requested
- throw emu_fatalerror(MAMERR_INVALID_CONFIG, "Unknown command '%s' specified", options.command());
+ // create the XML and print it to stdout
+ info_xml_creator creator(drivlist);
+ creator.output(stdout);
}
-/*-------------------------------------------------
- display_help - display help to standard
- output
--------------------------------------------------*/
-
-static void display_help(void)
+//-------------------------------------------------
+// listfull - output the name and description of
+// one or more games
+//-------------------------------------------------
+
+void cli_frontend::listfull(const char *gamename)
{
-#ifndef MESS
- mame_printf_info("M.A.M.E. v%s - Multiple Arcade Machine Emulator\n"
- "Copyright Nicola Salmoria and the MAME Team\n\n", build_version);
- mame_printf_info("%s\n", mame_disclaimer);
- mame_printf_info("Usage: MAME gamename [options]\n\n"
- " MAME -showusage for a brief list of options\n"
- " MAME -showconfig for a list of configuration options\n"
- " MAME -createconfig to create a " CONFIGNAME ".ini\n\n"
- "For usage instructions, please consult the file windows.txt\n");
-#else
- mess_display_help();
-#endif
-}
-
-
-
-/***************************************************************************
- INFORMATIONAL FUNCTIONS
-***************************************************************************/
+ // determine which drivers to output; return an error if none found
+ driver_enumerator drivlist(m_options, gamename);
+ if (drivlist.count() == 0)
+ throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename);
-/*-------------------------------------------------
- cli_info_listxml - output the XML data for one
- or more games
--------------------------------------------------*/
+ // print the header
+ mame_printf_info("Name: Description:\n");
-void cli_info_listxml(emu_options &options, const char *gamename)
-{
- print_mame_xml(stdout, drivers, gamename, options);
+ // iterate through drivers and output the info
+ while (drivlist.next())
+ if ((drivlist.driver().flags & GAME_NO_STANDALONE) == 0)
+ mame_printf_info("%-18s\"%s\"\n", drivlist.driver().name, drivlist.driver().description);
}
-/*-------------------------------------------------
- cli_info_listfull - output the name and
- description of one or more games
--------------------------------------------------*/
+//-------------------------------------------------
+// listsource - output the name and source
+// filename of one or more games
+//-------------------------------------------------
-void cli_info_listfull(emu_options &options, const char *gamename)
+void cli_frontend::listsource(const char *gamename)
{
- int count = 0;
-
- /* iterate over drivers */
- for (int drvindex = 0; drivers[drvindex] != NULL; drvindex++)
- if ((drivers[drvindex]->flags & GAME_NO_STANDALONE) == 0 && mame_strwildcmp(gamename, drivers[drvindex]->name) == 0)
- {
- /* print the header on the first one */
- if (count == 0)
- mame_printf_info("Name: Description:\n");
-
- /* output the remaining information */
- mame_printf_info("%-18s\"%s\"\n", drivers[drvindex]->name, drivers[drvindex]->description);
- count++;
- }
-
- /* return an error if none found */
- if (count == 0)
+ // determine which drivers to output; return an error if none found
+ driver_enumerator drivlist(m_options, gamename);
+ if (drivlist.count() == 0)
throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename);
+
+ // iterate through drivers and output the info
+ astring filename;
+ while (drivlist.next())
+ mame_printf_info("%-16s %s\n", drivlist.driver().name, core_filename_extract_base(&filename, drivlist.driver().source_file, FALSE)->cstr());
}
-/*-------------------------------------------------
- cli_info_listsource - output the name and source
- filename of one or more games
--------------------------------------------------*/
+//-------------------------------------------------
+// listclones - output the name and parent of all
+// clones matching the given pattern
+//-------------------------------------------------
-void cli_info_listsource(emu_options &options, const char *gamename)
+void cli_frontend::listclones(const char *gamename)
{
- int count = 0;
- astring filename;
+ // start with a filtered list of drivers
+ driver_enumerator drivlist(m_options, gamename);
+ int original_count = drivlist.count();
+
+ // iterate through the remaining ones to see if their parent matches
+ 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 & GAME_IS_BIOS_ROOT) == 0)
+ if (drivlist.matches(gamename, drivlist.driver(clone_of).name))
+ drivlist.include();
+ }
+
+ // return an error if none found
+ if (drivlist.count() == 0)
+ {
+ // 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
+ mame_printf_info("Found %d matches for '%s' but none were clones\n", drivlist.count(), gamename);
+ return;
+ }
- /* iterate over drivers */
- for (int drvindex = 0; drivers[drvindex] != NULL; drvindex++)
- if (mame_strwildcmp(gamename, drivers[drvindex]->name) == 0)
- {
- /* output the remaining information */
- mame_printf_info("%-16s %s\n", drivers[drvindex]->name, core_filename_extract_base(&filename, drivers[drvindex]->source_file, FALSE)->cstr());
- count++;
- }
+ // print the header
+ mame_printf_info("Name: Clone of:\n");
- /* return an error if none found */
- if (count == 0)
- throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename);
+ // iterate through drivers and output the info
+ drivlist.reset();
+ while (drivlist.next())
+ {
+ int clone_of = drivlist.clone();
+ if (clone_of != -1)
+ mame_printf_info("%-16s %-8s\n", drivlist.driver().name, drivlist.driver(clone_of).name);
+ }
}
-/*-------------------------------------------------
- cli_info_listclones - output the name and source
- filename of one or more games
--------------------------------------------------*/
+//-------------------------------------------------
+// listbrothers - for each matching game, output
+// the list of other games that share the same
+// source file
+//-------------------------------------------------
-void cli_info_listclones(emu_options &options, const char *gamename)
+void cli_frontend::listbrothers(const char *gamename)
{
- int count = 0, drvcnt = 0;
-
- for (int drvindex = 0; drivers[drvindex] != NULL; drvindex++)
- if (mame_strwildcmp(gamename, drivers[drvindex]->name) == 0)
- drvcnt++;
-
- if (drvcnt == 0)
+ // 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);
- /* iterate over drivers */
- for (int drvindex = 0; drivers[drvindex] != NULL; drvindex++)
- {
- const game_driver *clone_of = driver_get_clone(drivers[drvindex]);
+ // for the final list, start with an empty driver list
+ driver_enumerator drivlist(m_options);
+ drivlist.exclude_all();
- /* if we are a clone, and either our name matches the gamename, or the clone's name matches, display us */
- if (clone_of != NULL && (clone_of->flags & GAME_IS_BIOS_ROOT) == 0)
- if (mame_strwildcmp(gamename, drivers[drvindex]->name) == 0 || mame_strwildcmp(gamename, clone_of->name) == 0)
- {
- /* print the header on the first one */
- if (count == 0)
- mame_printf_info("Name: Clone of:\n");
+ // scan through the initially-selected drivers
+ while (initial_drivlist.next())
+ {
+ // if we are already marked in the final list, we don't need to do anything
+ if (drivlist.included(initial_drivlist.current()))
+ continue;
+
+ // otherwise, walk excluded items in the final list and mark any that match
+ drivlist.reset();
+ while (drivlist.next_excluded())
+ if (strcmp(drivlist.driver().source_file, initial_drivlist.driver().source_file) == 0)
+ drivlist.include();
+ }
+
+ // print the header
+ mame_printf_info("Source file: Name: Parent:\n");
- /* output the remaining information */
- mame_printf_info("%-16s %-8s\n", drivers[drvindex]->name, clone_of->name);
- count++;
- }
+ // output the entries found
+ drivlist.reset();
+ astring filename;
+ while (drivlist.next())
+ {
+ int clone_of = drivlist.clone();
+ mame_printf_info("%-16s %-16s %-16s\n", core_filename_extract_base(&filename, drivlist.driver().source_file, FALSE)->cstr(), drivlist.driver().name, (clone_of == -1 ? "" : drivlist.driver(clone_of).name));
}
}
-/*-------------------------------------------------
- cli_info_listbrothers - output the name and
- source filename of one or more games
--------------------------------------------------*/
+//-------------------------------------------------
+// listcrc - output the CRC and name of all ROMs
+// referenced by the emulator
+//-------------------------------------------------
-void cli_info_listbrothers(emu_options &options, const char *gamename)
+void cli_frontend::listcrc(const char *gamename)
{
- UINT8 *didit = global_alloc_array_clear(UINT8, driver_list_get_count(drivers));
- int count = 0;
- astring filename;
+ // determine which drivers to output; return an error if none found
+ driver_enumerator drivlist(m_options, gamename);
+ if (drivlist.count() == 0)
+ throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename);
- /* iterate over drivers */
- for (int drvindex = 0; drivers[drvindex] != NULL; drvindex++)
- if (!didit[drvindex] && mame_strwildcmp(gamename, drivers[drvindex]->name) == 0)
- {
- didit[drvindex] = TRUE;
- if (count > 0)
- mame_printf_info("\n");
- mame_printf_info("%s ... other drivers in %s:\n", drivers[drvindex]->name, core_filename_extract_base(&filename, drivers[drvindex]->source_file, FALSE)->cstr());
-
- /* now iterate again over drivers, finding those with the same source file */
- for (int matchindex = 0; drivers[matchindex]; matchindex++)
- if (matchindex != drvindex && strcmp(drivers[drvindex]->source_file, drivers[matchindex]->source_file) == 0)
+ // iterate through matches, and then through ROMs
+ while (drivlist.next())
+ for (const rom_source *source = rom_first_source(drivlist.config()); source != NULL; source = rom_next_source(*source))
+ for (const rom_entry *region = rom_first_region(*source); region; region = rom_next_region(region))
+ for (const rom_entry *rom = rom_first_file(region); rom; rom = rom_next_file(rom))
{
- const char *matchstring = (mame_strwildcmp(gamename, drivers[matchindex]->name) == 0) ? "-> " : " ";
- const game_driver *clone_of = driver_get_clone(drivers[matchindex]);
-
- if (clone_of != NULL && (clone_of->flags & GAME_IS_BIOS_ROOT) == 0)
- mame_printf_info("%s%-16s [%s]\n", matchstring, drivers[matchindex]->name, clone_of->name);
- else
- mame_printf_info("%s%s\n", matchstring, drivers[matchindex]->name);
- didit[matchindex] = TRUE;
+ // if we have a CRC, display it
+ UINT32 crc;
+ if (hash_collection(ROM_GETHASHDATA(rom)).crc(crc))
+ mame_printf_info("%08x %-16s %s\n", crc, ROM_GETNAME(rom), drivlist.driver().description);
}
-
- count++;
- }
-
- /* return an error if none found */
- global_free(didit);
- if (count == 0)
- throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename);
}
-/*-------------------------------------------------
- cli_info_listcrc - output the CRC and name of
- all ROMs referenced by MAME
--------------------------------------------------*/
+//-------------------------------------------------
+// listroms - output the list of ROMs referenced
+// by a given game or set of games
+//-------------------------------------------------
-void cli_info_listcrc(emu_options &options, const char *gamename)
+void cli_frontend::listroms(const char *gamename)
{
- int count = 0;
+ // determine which drivers to output; return an error if none found
+ driver_enumerator drivlist(m_options, gamename);
+ if (drivlist.count() == 0)
+ throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename);
- /* iterate over drivers */
- for (int drvindex = 0; drivers[drvindex] != NULL; drvindex++)
- if (mame_strwildcmp(gamename, drivers[drvindex]->name) == 0)
- {
- machine_config config(*drivers[drvindex], options);
- const rom_entry *region, *rom;
- const rom_source *source;
-
- /* iterate over sources, regions, and then ROMs within the region */
- for (source = rom_first_source(config); source != NULL; source = rom_next_source(*source))
- for (region = rom_first_region(*source); region; region = rom_next_region(region))
- for (rom = rom_first_file(region); rom; rom = rom_next_file(rom))
+ // iterate through matches
+ astring tempstr;
+ bool first = true;
+ while (drivlist.next())
+ {
+ // print a header
+ if (!first)
+ mame_printf_info("\n");
+ first = false;
+ mame_printf_info("ROMs required for driver \"%s\".\n"
+ "Name Size Checksum\n", drivlist.driver().name);
+
+ // iterate through roms
+ for (const rom_source *source = rom_first_source(drivlist.config()); source != NULL; source = rom_next_source(*source))
+ for (const rom_entry *region = rom_first_region(*source); region; region = rom_next_region(region))
+ for (const rom_entry *rom = rom_first_file(region); rom; rom = rom_next_file(rom))
+ {
+ // accumulate the total length of all chunks
+ int length = -1;
+ if (ROMREGION_ISROMDATA(region))
+ length = rom_file_size(rom);
+
+ // start with the name
+ const char *name = ROM_GETNAME(rom);
+ mame_printf_info("%-20s ", name);
+
+ // output the length next
+ if (length >= 0)
+ mame_printf_info("%7d", length);
+ else
+ mame_printf_info(" ");
+
+ // output the hash data
+ hash_collection hashes(ROM_GETHASHDATA(rom));
+ if (!hashes.flag(hash_collection::FLAG_NO_DUMP))
{
- /* if we have a CRC, display it */
- UINT32 crc;
- if (hash_collection(ROM_GETHASHDATA(rom)).crc(crc))
- mame_printf_info("%08x %-12s %s\n", crc, ROM_GETNAME(rom), drivers[drvindex]->description);
+ if (hashes.flag(hash_collection::FLAG_BAD_DUMP))
+ mame_printf_info(" BAD");
+ mame_printf_info(" %s", hashes.macro_string(tempstr));
}
+ else
+ mame_printf_info(" NO GOOD DUMP KNOWN");
- count++;
- }
-
- /* return an error if none found */
- if (count == 0)
- throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename);
+ // end with a CR
+ mame_printf_info("\n");
+ }
+ }
}
-/*-------------------------------------------------
- cli_info_listroms - output the list of ROMs
- referenced by a given game or set of games
--------------------------------------------------*/
+//-------------------------------------------------
+// listsamples - output the list of samples
+// referenced by a given game or set of games
+//-------------------------------------------------
-void cli_info_listroms(emu_options &options, const char *gamename)
+void cli_frontend::listsamples(const char *gamename)
{
- int count = 0;
- astring tempstr;
+ // determine which drivers to output; return an error if none found
+ driver_enumerator drivlist(m_options, gamename);
+ if (drivlist.count() == 0)
+ throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename);
- /* iterate over drivers */
- for (int drvindex = 0; drivers[drvindex] != NULL; drvindex++)
- if (mame_strwildcmp(gamename, drivers[drvindex]->name) == 0)
- {
- machine_config config(*drivers[drvindex], options);
-
- /* print the header */
- if (count > 0)
- mame_printf_info("\n");
- mame_printf_info("This is the list of the ROMs required for driver \"%s\".\n"
- "Name Size Checksum\n", drivers[drvindex]->name);
-
- /* iterate over sources, regions and then ROMs within the region */
- for (const rom_source *source = rom_first_source(config); source != NULL; source = rom_next_source(*source))
- for (const rom_entry *region = rom_first_region(*source); region != NULL; region = rom_next_region(region))
- for (const rom_entry *rom = rom_first_file(region); rom != NULL; rom = rom_next_file(rom))
- {
- /* accumulate the total length of all chunks */
- int length = -1;
- if (ROMREGION_ISROMDATA(region))
- length = rom_file_size(rom);
-
- /* start with the name */
- const char *name = ROM_GETNAME(rom);
- mame_printf_info("%-20s ", name);
-
- /* output the length next */
- if (length >= 0)
- mame_printf_info("%7d", length);
- else
- mame_printf_info(" ");
-
- /* output the hash data */
- hash_collection hashes(ROM_GETHASHDATA(rom));
- if (!hashes.flag(hash_collection::FLAG_NO_DUMP))
- {
- if (hashes.flag(hash_collection::FLAG_BAD_DUMP))
- mame_printf_info(" BAD");
- mame_printf_info(" %s", hashes.macro_string(tempstr));
- }
- else
- mame_printf_info(" NO GOOD DUMP KNOWN");
+ // iterate over drivers, looking for SAMPLES devices
+ bool first = true;
+ while (drivlist.next())
+ {
+ // see if we have samples
+ const device_config *devconfig;
+ for (devconfig = drivlist.config().first_device(); devconfig != NULL; devconfig = devconfig->next())
+ if (devconfig->type() == SAMPLES)
+ break;
+ if (devconfig == NULL)
+ continue;
+
+ // print a header
+ if (!first)
+ mame_printf_info("\n");
+ first = false;
+ mame_printf_info("Samples required for driver \"%s\".\n", drivlist.driver().name);
+
+ // iterate over samples devices
+ for ( ; devconfig != NULL; devconfig = devconfig->next())
+ if (devconfig->type() == SAMPLES)
+ {
+ // if the list is legit, walk it and print the sample info
+ const char *const *samplenames = reinterpret_cast<const samples_interface *>(devconfig->static_config())->samplenames;
+ if (samplenames != NULL)
+ for (int sampnum = 0; samplenames[sampnum] != NULL; sampnum++)
+ if (samplenames[sampnum][0] != '*')
+ mame_printf_info("%s\n", samplenames[sampnum]);
+ }
+ }
+}
- /* end with a CR */
- mame_printf_info("\n");
- }
- count++;
- }
+//-------------------------------------------------
+// listdevices - output the list of devices
+// referenced by a given game or set of games
+//-------------------------------------------------
- if (count == 0)
+void cli_frontend::listdevices(const char *gamename)
+{
+ // determine which drivers to output; return an error if none found
+ driver_enumerator drivlist(m_options, gamename);
+ if (drivlist.count() == 0)
throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename);
+
+ // iterate over drivers, looking for SAMPLES devices
+ bool first = true;
+ while (drivlist.next())
+ {
+ // print a header
+ if (!first)
+ printf("\n");
+ first = false;
+ printf("Driver %s (%s):\n", drivlist.driver().name, drivlist.driver().description);
+
+ // iterate through devices
+ for (const device_config *devconfig = drivlist.config().first_device(); devconfig != NULL; devconfig = devconfig->next())
+ {
+ printf(" %s ('%s')", devconfig->name(), devconfig->tag());
+
+ UINT32 clock = devconfig->clock();
+ if (clock >= 1000000000)
+ printf(" @ %d.%02d GHz\n", clock / 1000000000, (clock / 10000000) % 100);
+ else if (clock >= 1000000)
+ printf(" @ %d.%02d MHz\n", clock / 1000000, (clock / 10000) % 100);
+ else if (clock >= 1000)
+ printf(" @ %d.%02d kHz\n", clock / 1000, (clock / 10) % 100);
+ else if (clock > 0)
+ printf(" @ %d Hz\n", clock);
+ else
+ printf("\n");
+ }
+ }
}
-/*-------------------------------------------------
- cli_info_listsamples - output the list of samples
- referenced by a given game or set of games
--------------------------------------------------*/
+//-------------------------------------------------
+// listmedia - output the list of image devices
+// referenced by a given game or set of games
+//-------------------------------------------------
-void cli_info_listsamples(emu_options &options, const char *gamename)
+void cli_frontend::listmedia(const char *gamename)
{
- int count = 0;
+ // determine which drivers to output; return an error if none found
+ driver_enumerator drivlist(m_options, gamename);
+ if (drivlist.count() == 0)
+ throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename);
- /* iterate over drivers */
- for (int drvindex = 0; drivers[drvindex] != NULL; drvindex++)
- if (mame_strwildcmp(gamename, drivers[drvindex]->name) == 0)
- {
- machine_config config(*drivers[drvindex], options);
- const device_config_sound_interface *sound = NULL;
+ // print header
+ printf(" SYSTEM MEDIA NAME (brief) IMAGE FILE EXTENSIONS SUPPORTED \n");
+ printf("---------- -------------------- ------------------------------------\n");
- /* find samples interfaces */
- for (bool gotone = config.m_devicelist.first(sound); gotone; gotone = sound->next(sound))
- if (sound->devconfig().type() == SAMPLES)
- {
- const char *const *samplenames = ((const samples_interface *)sound->devconfig().static_config())->samplenames;
- int sampnum;
+ // iterate over drivers
+ while (drivlist.next())
+ {
+ // iterate
+ const device_config_image_interface *imagedev = NULL;
+ bool first = true;
+ for (bool gotone = drivlist.config().m_devicelist.first(imagedev); gotone; gotone = imagedev->next(imagedev))
+ {
+ // extract the shortname with parentheses
+ astring paren_shortname;
+ paren_shortname.format("(%s)", imagedev->brief_instance_name());
- /* if the list is legit, walk it and print the sample info */
- if (samplenames != NULL)
- for (sampnum = 0; samplenames[sampnum] != NULL; sampnum++)
- mame_printf_info("%s\n", samplenames[sampnum]);
- }
+ // output the line, up to the list of extensions
+ printf("%-13s%-12s%-8s ", first ? drivlist.driver().name : "", imagedev->instance_name(), paren_shortname.cstr());
- count++;
+ // get the extensions and print them
+ astring extensions(imagedev->file_extensions());
+ for (int start = 0, end = extensions.chr(0, ','); ; start = end + 1, end = extensions.chr(start, ','))
+ {
+ astring curext(extensions, start, (end == -1) ? -1 : end - 1);
+ printf(".%-5s", curext.cstr());
+ if (end == -1)
+ break;
+ }
+
+ // end the line
+ printf("\n");
+ first = false;
}
-
- if (count == 0)
- throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename);
+
+ // if we didn't get any at all, just print a none line
+ if (first)
+ printf("%-13s(none)\n", drivlist.driver().name);
+ }
}
-/*-------------------------------------------------
- cli_info_listdevices - output the list of
- devices referenced by a given game or set of
- games
--------------------------------------------------*/
+//-------------------------------------------------
+// verifyroms - verify the ROM sets of one or
+// more games
+//-------------------------------------------------
-void cli_info_listdevices(emu_options &options, const char *gamename)
+void cli_frontend::verifyroms(const char *gamename)
{
- int count = 0;
-
- /* iterate over drivers */
- for (int drvindex = 0; drivers[drvindex] != NULL; drvindex++)
- if (mame_strwildcmp(gamename, drivers[drvindex]->name) == 0)
- {
- machine_config config(*drivers[drvindex], options);
+ // determine which drivers to output; return an error if none found
+ driver_enumerator drivlist(m_options, gamename);
+ if (drivlist.count() == 0)
+ throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename);
- if (count != 0)
- printf("\n");
- printf("Driver %s (%s):\n", drivers[drvindex]->name, drivers[drvindex]->description);
+ int correct = 0;
+ int incorrect = 0;
+ int notfound = 0;
- /* iterate through devices */
- for (const device_config *devconfig = config.m_devicelist.first(); devconfig != NULL; devconfig = devconfig->next())
+ // iterate over drivers
+ media_auditor auditor(drivlist);
+ while (drivlist.next())
+ {
+ // audit the ROMs in this set
+ media_auditor::summary summary = auditor.audit_media(AUDIT_VALIDATE_FAST);
+
+ // output the summary of the audit
+ astring summary_string;
+ auditor.summarize(&summary_string);
+ mame_printf_info("%s", summary_string.cstr());
+
+ // if not found, count that and leave it at that
+ if (summary == media_auditor::NOTFOUND)
+ notfound++;
+
+ // else display information about what we discovered
+ else
+ {
+ // output the name of the driver and its clone
+ mame_printf_info("romset %s ", drivlist.driver().name);
+ int clone_of = drivlist.clone();
+ if (clone_of != -1)
+ mame_printf_info("[%s] ", drivlist.driver(clone_of).name);
+
+ // switch off of the result
+ switch (summary)
{
- printf(" %s ('%s')", devconfig->name(), devconfig->tag());
-
- UINT32 clock = devconfig->clock();
- if (clock >= 1000000000)
- printf(" @ %d.%02d GHz\n", clock / 1000000000, (clock / 10000000) % 100);
- else if (clock >= 1000000)
- printf(" @ %d.%02d MHz\n", clock / 1000000, (clock / 10000) % 100);
- else if (clock >= 1000)
- printf(" @ %d.%02d kHz\n", clock / 1000, (clock / 10) % 100);
- else if (clock > 0)
- printf(" @ %d Hz\n", clock);
- else
- printf("\n");
+ case media_auditor::INCORRECT:
+ mame_printf_info("is bad\n");
+ incorrect++;
+ break;
+
+ case media_auditor::CORRECT:
+ mame_printf_info("is good\n");
+ correct++;
+ break;
+
+ case media_auditor::BEST_AVAILABLE:
+ mame_printf_info("is best available\n");
+ correct++;
+ break;
+
+ default:
+ break;
}
-
- count++;
}
+ }
- if (count == 0)
- throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename);
+ // clear out any cached files
+ zip_file_cache_clear();
+
+ // if we didn't get anything at all, display a generic end message
+ if (correct + incorrect == 0)
+ {
+ if (notfound > 0)
+ throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "romset \"%s\" not found!\n", gamename);
+ else
+ throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "romset \"%s\" not supported!\n", gamename);
+ }
+
+ // otherwise, print a summary
+ else
+ {
+ if (incorrect > 0)
+ throw emu_fatalerror(MAMERR_MISSING_FILES, "%d romsets found, %d were OK.\n", correct + incorrect, correct);
+ mame_printf_info("%d romsets found, %d were OK.\n", correct, correct);
+ }
}
-/*-------------------------------------------------
- info_verifyroms - verify the ROM sets of
- one or more games
--------------------------------------------------*/
+//-------------------------------------------------
+// info_verifysamples - verify the sample sets of
+// one or more games
+//-------------------------------------------------
-static void info_verifyroms(emu_options &options, const char *gamename)
+void cli_frontend::verifysamples(const char *gamename)
{
+ // determine which drivers to output; return an error if none found
+ driver_enumerator drivlist(m_options, gamename);
+ if (drivlist.count() == 0)
+ throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename);
+
int correct = 0;
int incorrect = 0;
int notfound = 0;
- /* iterate over drivers */
- for (int drvindex = 0; drivers[drvindex] != NULL; drvindex++)
- if (mame_strwildcmp(gamename, drivers[drvindex]->name) == 0)
+ // iterate over drivers
+ media_auditor auditor(drivlist);
+ while (drivlist.next())
+ {
+ // audit the samples in this set
+ media_auditor::summary summary = auditor.audit_samples();
+
+ // output the summary of the audit
+ astring summary_string;
+ auditor.summarize(&summary_string);
+ mame_printf_info("%s", summary_string.cstr());
+
+ // if not found, print a message and set the flag
+ if (summary == media_auditor::NOTFOUND)
{
- audit_record *audit;
- int audit_records;
- int res;
-
- /* audit the ROMs in this set */
- audit_records = audit_images(options, drivers[drvindex], AUDIT_VALIDATE_FAST, &audit);
- res = audit_summary(drivers[drvindex], audit_records, audit, TRUE);
- if (audit_records > 0)
- global_free(audit);
-
- /* if not found, count that and leave it at that */
- if (res == NOTFOUND)
- notfound++;
+ mame_printf_error("sampleset \"%s\" not found!\n", drivlist.driver().name);
+ notfound++;
+ }
- /* else display information about what we discovered */
- else
+ // else display information about what we discovered
+ else
+ {
+ // output the name of the driver and its clone
+ mame_printf_info("sampleset %s ", drivlist.driver().name);
+ int clone_of = drivlist.clone();
+ if (clone_of != -1)
+ mame_printf_info("[%s] ", drivlist.driver(clone_of).name);
+
+ // switch off of the result
+ switch (summary)
{
- const game_driver *clone_of;
-
- /* output the name of the driver and its clone */
- mame_printf_info("romset %s ", drivers[drvindex]->name);
- clone_of = driver_get_clone(drivers[drvindex]);
- if (clone_of != NULL)
- mame_printf_info("[%s] ", clone_of->name);
-
- /* switch off of the result */
- switch (res)
- {
- case INCORRECT:
- mame_printf_info("is bad\n");
- incorrect++;
- break;
-
- case CORRECT:
- mame_printf_info("is good\n");
- correct++;
- break;
-
- case BEST_AVAILABLE:
- mame_printf_info("is best available\n");
- correct++;
- break;
- }
+ case media_auditor::INCORRECT:
+ mame_printf_info("is bad\n");
+ incorrect++;
+ break;
+
+ case media_auditor::CORRECT:
+ mame_printf_info("is good\n");
+ correct++;
+ break;
+
+ case media_auditor::BEST_AVAILABLE:
+ mame_printf_info("is best available\n");
+ correct++;
+ break;
+
+ default:
+ break;
}
}
+ }
- /* clear out any cached files */
+ // clear out any cached files
zip_file_cache_clear();
- /* if we didn't get anything at all, display a generic end message */
+ // if we didn't get anything at all, display a generic end message
if (correct + incorrect == 0)
{
if (notfound > 0)
- throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "romset \"%s\" not found!\n", gamename);
+ throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "sampleset \"%s\" not found!\n", gamename);
else
- throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "romset \"%s\" not supported!\n", gamename);
+ throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "sampleset \"%s\" not supported!\n", gamename);
}
- /* otherwise, print a summary */
+ // otherwise, print a summary
else
{
if (incorrect > 0)
- throw emu_fatalerror(MAMERR_MISSING_FILES, "%d romsets found, %d were OK.\n", correct + incorrect, correct);
- mame_printf_info("%d romsets found, %d were OK.\n", correct, correct);
+ throw emu_fatalerror(MAMERR_MISSING_FILES, "%d samplesets found, %d were OK.\n", correct + incorrect, correct);
+ mame_printf_info("%d samplesets found, %d were OK.\n", correct, correct);
}
}
+
+
+#if 0
/*-------------------------------------------------
info_listsoftware - output the list of
software supported by a given game or set of
@@ -798,37 +800,31 @@ static void info_verifyroms(emu_options &options, const char *gamename)
identifying duplicate lists.
-------------------------------------------------*/
-static void info_listsoftware(emu_options &options, const char *gamename)
+static void info_listsoftware(const char *gamename)
{
FILE *out = stdout;
- int nr_lists = 0;
- char ** lists = NULL;
- int list_idx = 0;
- /* First determine the maximum number of lists we might encounter */
- for ( int drvindex = 0; drivers[drvindex] != NULL; drvindex++ )
- {
- if ( mame_strwildcmp( gamename, drivers[drvindex]->name ) == 0 )
- {
- /* allocate the machine config */
- machine_config config(*drivers[drvindex], options);
+ // determine which drivers to output; return an error if none found
+ driver_enumerator drivlist(m_options, gamename);
+ if (drivlist.count() == 0)
+ throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename);
- for (const device_config *dev = config.m_devicelist.first(SOFTWARE_LIST); dev != NULL; dev = dev->typenext())
- {
- software_list_config *swlist = (software_list_config *)downcast<const legacy_device_config_base *>(dev)->inline_config();
+ // first determine the maximum number of lists we might encounter
+ int list_count = 0;
+ while (drivlist.next())
+ for (const device_config *dev = drivlist.config().m_devicelist.first(SOFTWARE_LIST); dev != NULL; dev = dev->typenext())
+ {
+ software_list_config *swlist = (software_list_config *)downcast<const legacy_device_config_base *>(dev)->inline_config();
- for ( int i = 0; i < DEVINFO_STR_SWLIST_MAX - DEVINFO_STR_SWLIST_0; i++ )
- {
- if ( swlist->list_name[i] && *swlist->list_name[i] && (swlist->list_type == SOFTWARE_LIST_ORIGINAL_SYSTEM))
- nr_lists++;
- }
- }
+ for (int listnum = 0; listnum < DEVINFO_STR_SWLIST_MAX - DEVINFO_STR_SWLIST_0; listnum++)
+ if (swlist->list_name[listnum] && *swlist->list_name[listnum] && swlist->list_type == SOFTWARE_LIST_ORIGINAL_SYSTEM)
+ list_count++;
}
- }
- lists = global_alloc_array( char *, nr_lists );
+ // allocate a list
+ astring *lists = global_alloc_array(astring, list_count);
- if (nr_lists)
+ if (list_count)
{
fprintf( out,
"<?xml version=\"1.0\"?>\n"
@@ -902,664 +898,602 @@ static void info_listsoftware(emu_options &options, const char *gamename)
);
}
- for ( int drvindex = 0; drivers[drvindex] != NULL; drvindex++ )
- {
- if ( mame_strwildcmp( gamename, drivers[drvindex]->name ) == 0 )
+ drivlist.reset();
+ list_count = 0;
+ while (drivlist.next())
+ for (const device_config *dev = drivlist.config().m_devicelist.first(SOFTWARE_LIST); dev != NULL; dev = dev->typenext())
{
- /* allocate the machine config */
- machine_config config(*drivers[drvindex], options);
+ software_list_config *swlist = (software_list_config *)downcast<const legacy_device_config_base *>(dev)->inline_config();
- for (const device_config *dev = config.m_devicelist.first(SOFTWARE_LIST); dev != NULL; dev = dev->typenext())
+ for (int listnum = 0; listnum < DEVINFO_STR_SWLIST_MAX - DEVINFO_STR_SWLIST_0; listnum++)
{
- software_list_config *swlist = (software_list_config *)downcast<const legacy_device_config_base *>(dev)->inline_config();
-
- for ( int i = 0; i < DEVINFO_STR_SWLIST_MAX - DEVINFO_STR_SWLIST_0; i++ )
+ if (swlist->list_name[listnum] && *swlist->list_name[listnum] && swlist->list_type == SOFTWARE_LIST_ORIGINAL_SYSTEM)
{
- if ( swlist->list_name[i] && *swlist->list_name[i] && (swlist->list_type == SOFTWARE_LIST_ORIGINAL_SYSTEM))
+ software_list *list = software_list_open(m_options, swlist->list_name[listnum], FALSE, NULL);
+
+ if ( list )
{
- software_list *list = software_list_open( options, swlist->list_name[i], FALSE, NULL );
+ /* Verify if we have encountered this list before */
+ bool seen_before = false;
+ for (int seen_index = 0; seen_index < list_count && !seen_before; seen_index++)
+ if (lists[seen_index] == swlist->list_name[listnum])
+ seen_before = true;
- if ( list )
+ if (!seen_before)
{
- /* Verify if we have encountered this list before */
- bool seen_before = false;
- for ( int l = 0; l < list_idx && !seen_before; l++ )
- {
- if ( ! strcmp( swlist->list_name[i], lists[l] ) )
- {
- seen_before = true;
- }
- }
+ lists[list_count++] = swlist->list_name[i];
+ software_list_parse( list, NULL, NULL );
+
+ fprintf(out, "\t<softwarelist name=\"%s\" description=\"%s\">\n", swlist->list_name[i], xml_normalize_string(software_list_get_description(list)) );
- if ( ! seen_before )
+ for ( software_info *swinfo = software_list_find( list, "*", NULL ); swinfo != NULL; swinfo = software_list_find( list, "*", swinfo ) )
{
- lists[list_idx] = core_strdup( swlist->list_name[i] );
- list_idx++;
- software_list_parse( list, NULL, NULL );
+ fprintf( out, "\t\t<software name=\"%s\"", swinfo->shortname );
+ if ( swinfo->parentname != NULL )
+ fprintf( out, " cloneof=\"%s\"", swinfo->parentname );
+ if ( swinfo->supported == SOFTWARE_SUPPORTED_PARTIAL )
+ fprintf( out, " supported=\"partial\"" );
+ if ( swinfo->supported == SOFTWARE_SUPPORTED_NO )
+ fprintf( out, " supported=\"no\"" );
+ fprintf( out, ">\n" );
+ fprintf( out, "\t\t\t<description>%s</description>\n", xml_normalize_string(swinfo->longname) );
+ fprintf( out, "\t\t\t<year>%s</year>\n", xml_normalize_string( swinfo->year ) );
+ fprintf( out, "\t\t\t<publisher>%s</publisher>\n", xml_normalize_string( swinfo->publisher ) );
+
+ for ( software_part *part = software_find_part( swinfo, NULL, NULL ); part != NULL; part = software_part_next( part ) )
+ {
+ fprintf( out, "\t\t\t<part name=\"%s\"", part->name );
+ if ( part->interface_ )
+ fprintf( out, " interface=\"%s\"", part->interface_ );
- fprintf(out, "\t<softwarelist name=\"%s\" description=\"%s\">\n", swlist->list_name[i], xml_normalize_string(software_list_get_description(list)) );
+ fprintf( out, ">\n");
- for ( software_info *swinfo = software_list_find( list, "*", NULL ); swinfo != NULL; swinfo = software_list_find( list, "*", swinfo ) )
- {
- fprintf( out, "\t\t<software name=\"%s\"", swinfo->shortname );
- if ( swinfo->parentname != NULL )
- fprintf( out, " cloneof=\"%s\"", swinfo->parentname );
- if ( swinfo->supported == SOFTWARE_SUPPORTED_PARTIAL )
- fprintf( out, " supported=\"partial\"" );
- if ( swinfo->supported == SOFTWARE_SUPPORTED_NO )
- fprintf( out, " supported=\"no\"" );
- fprintf( out, ">\n" );
- fprintf( out, "\t\t\t<description>%s</description>\n", xml_normalize_string(swinfo->longname) );
- fprintf( out, "\t\t\t<year>%s</year>\n", xml_normalize_string( swinfo->year ) );
- fprintf( out, "\t\t\t<publisher>%s</publisher>\n", xml_normalize_string( swinfo->publisher ) );
-
- for ( software_part *part = software_find_part( swinfo, NULL, NULL ); part != NULL; part = software_part_next( part ) )
+ if ( part->featurelist )
{
- fprintf( out, "\t\t\t<part name=\"%s\"", part->name );
- if ( part->interface_ )
- fprintf( out, " interface=\"%s\"", part->interface_ );
+ feature_list *list = part->featurelist;
- fprintf( out, ">\n");
-
- if ( part->featurelist )
+ while( list )
{
- feature_list *list = part->featurelist;
-
- while( list )
- {
- fprintf( out, "\t\t\t\t<feature name=\"%s\" value=\"%s\" />\n", list->name, list->value );
- list = list->next;
- }
+ fprintf( out, "\t\t\t\t<feature name=\"%s\" value=\"%s\" />\n", list->name, list->value );
+ list = list->next;
}
+ }
- /* TODO: display rom region information */
- for ( const rom_entry *region = part->romdata; region; region = rom_next_region( region ) )
- {
- int is_disk = ROMREGION_ISDISKDATA(region);
+ /* TODO: display rom region information */
+ for ( const rom_entry *region = part->romdata; region; region = rom_next_region( region ) )
+ {
+ int is_disk = ROMREGION_ISDISKDATA(region);
- if (!is_disk)
- fprintf( out, "\t\t\t\t<dataarea name=\"%s\" size=\"%d\">\n", ROMREGION_GETTAG(region), ROMREGION_GETLENGTH(region) );
- else
- fprintf( out, "\t\t\t\t<diskarea name=\"%s\">\n", ROMREGION_GETTAG(region) );
+ if (!is_disk)
+ fprintf( out, "\t\t\t\t<dataarea name=\"%s\" size=\"%d\">\n", ROMREGION_GETTAG(region), ROMREGION_GETLENGTH(region) );
+ else
+ fprintf( out, "\t\t\t\t<diskarea name=\"%s\">\n", ROMREGION_GETTAG(region) );
- for ( const rom_entry *rom = rom_first_file( region ); rom && !ROMENTRY_ISREGIONEND(rom); rom++ )
+ for ( const rom_entry *rom = rom_first_file( region ); rom && !ROMENTRY_ISREGIONEND(rom); rom++ )
+ {
+ if ( ROMENTRY_ISFILE(rom) )
{
- if ( ROMENTRY_ISFILE(rom) )
+ if (!is_disk)
+ fprintf( out, "\t\t\t\t\t<rom name=\"%s\" size=\"%d\"", xml_normalize_string(ROM_GETNAME(rom)), rom_file_size(rom) );
+ else
+ fprintf( out, "\t\t\t\t\t<disk name=\"%s\"", xml_normalize_string(ROM_GETNAME(rom)) );
+
+ /* dump checksum information only if there is a known dump */
+ hash_collection hashes(ROM_GETHASHDATA(rom));
+ if (!hashes.flag(hash_collection::FLAG_NO_DUMP))
{
- if (!is_disk)
- fprintf( out, "\t\t\t\t\t<rom name=\"%s\" size=\"%d\"", xml_normalize_string(ROM_GETNAME(rom)), rom_file_size(rom) );
- else
- fprintf( out, "\t\t\t\t\t<disk name=\"%s\"", xml_normalize_string(ROM_GETNAME(rom)) );
-
- /* dump checksum information only if there is a known dump */
- hash_collection hashes(ROM_GETHASHDATA(rom));
- if (!hashes.flag(hash_collection::FLAG_NO_DUMP))
- {
- astring tempstr;
- for (hash_base *hash = hashes.first(); hash != NULL; hash = hash->next())
- fprintf(out, " %s=\"%s\"", hash->name(), hash->string(tempstr));
- }
-
- if (!is_disk)
- fprintf( out, " offset=\"0x%x\"", ROM_GETOFFSET(rom) );
-
- if ( hashes.flag(hash_collection::FLAG_BAD_DUMP) )
- fprintf( out, " status=\"baddump\"" );
- if ( hashes.flag(hash_collection::FLAG_NO_DUMP) )
- fprintf( out, " status=\"nodump\"" );
-
- if (is_disk)
- fprintf( out, " writeable=\"%s\"", (ROM_GETFLAGS(rom) & DISK_READONLYMASK) ? "no" : "yes");
-
- if ((ROM_GETFLAGS(rom) & ROM_SKIPMASK) == ROM_SKIP(1))
- fprintf( out, " loadflag=\"load16_byte\"" );
-
- if ((ROM_GETFLAGS(rom) & ROM_SKIPMASK) == ROM_SKIP(3))
- fprintf( out, " loadflag=\"load32_byte\"" );
-
- if (((ROM_GETFLAGS(rom) & ROM_SKIPMASK) == ROM_SKIP(2)) && ((ROM_GETFLAGS(rom) & ROM_GROUPMASK) == ROM_GROUPWORD))
- {
- if (!(ROM_GETFLAGS(rom) & ROM_REVERSEMASK))
- fprintf( out, " loadflag=\"load32_word\"" );
- else
- fprintf( out, " loadflag=\"load32_word_swap\"" );
- }
-
- if (((ROM_GETFLAGS(rom) & ROM_SKIPMASK) == ROM_SKIP(6)) && ((ROM_GETFLAGS(rom) & ROM_GROUPMASK) == ROM_GROUPWORD))
- {
- if (!(ROM_GETFLAGS(rom) & ROM_REVERSEMASK))
- fprintf( out, " loadflag=\"load64_word\"" );
- else
- fprintf( out, " loadflag=\"load64_word_swap\"" );
- }
-
- if (((ROM_GETFLAGS(rom) & ROM_SKIPMASK) == ROM_NOSKIP) && ((ROM_GETFLAGS(rom) & ROM_GROUPMASK) == ROM_GROUPWORD))
- {
- if (!(ROM_GETFLAGS(rom) & ROM_REVERSEMASK))
- fprintf( out, " loadflag=\"load32_dword\"" );
- else
- fprintf( out, " loadflag=\"load16_word_swap\"" );
- }
-
- fprintf( out, "/>\n" );
+ astring tempstr;
+ for (hash_base *hash = hashes.first(); hash != NULL; hash = hash->next())
+ fprintf(out, " %s=\"%s\"", hash->name(), hash->string(tempstr));
}
- else if ( ROMENTRY_ISRELOAD(rom) )
+
+ if (!is_disk)
+ fprintf( out, " offset=\"0x%x\"", ROM_GETOFFSET(rom) );
+
+ if ( hashes.flag(hash_collection::FLAG_BAD_DUMP) )
+ fprintf( out, " status=\"baddump\"" );
+ if ( hashes.flag(hash_collection::FLAG_NO_DUMP) )
+ fprintf( out, " status=\"nodump\"" );
+
+ if (is_disk)
+ fprintf( out, " writeable=\"%s\"", (ROM_GETFLAGS(rom) & DISK_READONLYMASK) ? "no" : "yes");
+
+ if ((ROM_GETFLAGS(rom) & ROM_SKIPMASK) == ROM_SKIP(1))
+ fprintf( out, " loadflag=\"load16_byte\"" );
+
+ if ((ROM_GETFLAGS(rom) & ROM_SKIPMASK) == ROM_SKIP(3))
+ fprintf( out, " loadflag=\"load32_byte\"" );
+
+ if (((ROM_GETFLAGS(rom) & ROM_SKIPMASK) == ROM_SKIP(2)) && ((ROM_GETFLAGS(rom) & ROM_GROUPMASK) == ROM_GROUPWORD))
{
- fprintf( out, "\t\t\t\t\t<rom size=\"%d\" offset=\"0x%x\" loadflag=\"reload\" />\n", ROM_GETLENGTH(rom), ROM_GETOFFSET(rom) );
+ if (!(ROM_GETFLAGS(rom) & ROM_REVERSEMASK))
+ fprintf( out, " loadflag=\"load32_word\"" );
+ else
+ fprintf( out, " loadflag=\"load32_word_swap\"" );
}
- else if ( ROMENTRY_ISCONTINUE(rom) )
+
+ if (((ROM_GETFLAGS(rom) & ROM_SKIPMASK) == ROM_SKIP(6)) && ((ROM_GETFLAGS(rom) & ROM_GROUPMASK) == ROM_GROUPWORD))
{
- fprintf( out, "\t\t\t\t\t<rom size=\"%d\" offset=\"0x%x\" loadflag=\"continue\" />\n", ROM_GETLENGTH(rom), ROM_GETOFFSET(rom) );
+ if (!(ROM_GETFLAGS(rom) & ROM_REVERSEMASK))
+ fprintf( out, " loadflag=\"load64_word\"" );
+ else
+ fprintf( out, " loadflag=\"load64_word_swap\"" );
}
- else if ( ROMENTRY_ISFILL(rom) )
+
+ if (((ROM_GETFLAGS(rom) & ROM_SKIPMASK) == ROM_NOSKIP) && ((ROM_GETFLAGS(rom) & ROM_GROUPMASK) == ROM_GROUPWORD))
{
- fprintf( out, "\t\t\t\t\t<rom size=\"%d\" offset=\"0x%x\" loadflag=\"fill\" />\n", ROM_GETLENGTH(rom), ROM_GETOFFSET(rom) );
+ if (!(ROM_GETFLAGS(rom) & ROM_REVERSEMASK))
+ fprintf( out, " loadflag=\"load32_dword\"" );
+ else
+ fprintf( out, " loadflag=\"load16_word_swap\"" );
}
- }
- if (!is_disk)
- fprintf( out, "\t\t\t\t</dataarea>\n" );
- else
- fprintf( out, "\t\t\t\t</diskarea>\n" );
+ fprintf( out, "/>\n" );
+ }
+ else if ( ROMENTRY_ISRELOAD(rom) )
+ {
+ fprintf( out, "\t\t\t\t\t<rom size=\"%d\" offset=\"0x%x\" loadflag=\"reload\" />\n", ROM_GETLENGTH(rom), ROM_GETOFFSET(rom) );
+ }
+ else if ( ROMENTRY_ISCONTINUE(rom) )
+ {
+ fprintf( out, "\t\t\t\t\t<rom size=\"%d\" offset=\"0x%x\" loadflag=\"continue\" />\n", ROM_GETLENGTH(rom), ROM_GETOFFSET(rom) );
+ }
+ else if ( ROMENTRY_ISFILL(rom) )
+ {
+ fprintf( out, "\t\t\t\t\t<rom size=\"%d\" offset=\"0x%x\" loadflag=\"fill\" />\n", ROM_GETLENGTH(rom), ROM_GETOFFSET(rom) );
+ }
}
- fprintf( out, "\t\t\t</part>\n" );
+ if (!is_disk)
+ fprintf( out, "\t\t\t\t</dataarea>\n" );
+ else
+ fprintf( out, "\t\t\t\t</diskarea>\n" );
}
- fprintf( out, "\t\t</software>\n" );
+ fprintf( out, "\t\t\t</part>\n" );
}
- fprintf(out, "\t</softwarelist>\n" );
+ fprintf( out, "\t\t</software>\n" );
}
- software_list_close( list );
+ fprintf(out, "\t</softwarelist>\n" );
}
+
+ software_list_close( list );
}
}
}
}
- }
- if (nr_lists)
+ if (list_count > 0)
fprintf( out, "</softwarelists>\n" );
else
fprintf( out, "No software lists found for this system\n" );
global_free( lists );
}
+#endif
-/*-------------------------------------------------
- softlist_match_roms - scan for a matching
- software ROM by hash
--------------------------------------------------*/
-void softlist_match_roms(machine_config &config, const hash_collection &hashes, int length, int *found)
-{
- for (const device_config *dev = config.m_devicelist.first(SOFTWARE_LIST); dev != NULL; dev = dev->typenext())
- {
- software_list_config *swlist = (software_list_config *)downcast<const legacy_device_config_base *>(dev)->inline_config();
-
- for ( int i = 0; i < DEVINFO_STR_SWLIST_MAX - DEVINFO_STR_SWLIST_0; i++ )
- {
- if ( swlist->list_name[i] )
- {
- software_list *list = software_list_open( config.options(), swlist->list_name[i], FALSE, NULL );
-
- for ( software_info *swinfo = software_list_find( list, "*", NULL ); swinfo != NULL; swinfo = software_list_find( list, "*", swinfo ) )
- {
- for ( software_part *part = software_find_part( swinfo, NULL, NULL ); part != NULL; part = software_part_next( part ) )
- {
- for ( const rom_entry *region = part->romdata; region != NULL; region = rom_next_region(region) )
- {
- for ( const rom_entry *rom = rom_first_file(region); rom != NULL; rom = rom_next_file(rom) )
- {
- hash_collection romhashes(ROM_GETHASHDATA(rom));
- if ( hashes == romhashes )
- {
- bool baddump = romhashes.flag(hash_collection::FLAG_BAD_DUMP);
-
- /* output information about the match */
- if (*found != 0)
- mame_printf_info(" ");
- mame_printf_info("= %s%-20s %s:%s %s\n", baddump ? "(BAD) " : "", ROM_GETNAME(rom), swlist->list_name[i], swinfo->shortname, swinfo->longname);
- (*found)++;
- }
- }
- }
- }
- }
-
- software_list_close( list );
- }
- }
- }
-}
-
-/*-------------------------------------------------
- info_listmedia - output the list of image
- devices referenced by a given game or set of
- games
--------------------------------------------------*/
+//-------------------------------------------------
+// romident - identify ROMs by looking for
+// matches in our internal database
+//-------------------------------------------------
-static void info_listmedia(emu_options &options, const char *gamename)
+void cli_frontend::romident(const char *filename)
{
- int count = 0, devcount;
- const device_config_image_interface *dev = NULL;
- const char *src;
- const char *driver_name;
- const char *name;
- const char *shortname;
- char paren_shortname[16];
+ media_identifier ident(m_options);
- printf(" SYSTEM MEDIA NAME (brief) IMAGE FILE EXTENSIONS SUPPORTED \n");
- printf("---------- -------------------- ------------------------------------\n");
-
- /* iterate over drivers */
- for (int drvindex = 0; drivers[drvindex] != NULL; drvindex++)
- if (mame_strwildcmp(gamename, drivers[drvindex]->name) == 0)
- {
- /* allocate the machine config */
- machine_config config(*drivers[drvindex], options);
+ // identify the file, then output results
+ mame_printf_info("Identifying %s....\n", filename);
+ ident.identify(filename);
+ mame_printf_info("%s\n", ident.result());
- driver_name = drivers[drvindex]->name;
-
- devcount = 0;
-
- for (bool gotone = config.m_devicelist.first(dev); gotone; gotone = dev->next(dev))
- {
- src = downcast<const legacy_image_device_config_base *>(dev)->file_extensions();
- name = downcast<const legacy_image_device_config_base *>(dev)->instance_name();
- shortname = downcast<const legacy_image_device_config_base *>(dev)->brief_instance_name();
-
- sprintf(paren_shortname, "(%s)", shortname);
-
- printf("%-13s%-12s%-8s ", driver_name, name, paren_shortname);
- driver_name = " ";
-
- astring extensions(src);
- char *ext = strtok((char*)extensions.cstr(),",");
- while (ext != NULL)
- {
- printf(".%-5s",ext);
- ext = strtok (NULL, ",");
- devcount++;
- }
- printf("\n");
- }
- if (!devcount)
- printf("%-13s(none)\n",driver_name);
-
- count++;
- }
-
- if (!count)
- printf("There are no Computers or Consoles named %s\n", gamename);
-
- if (count == 0)
- throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename);
+ // return the appropriate error code
+ if (ident.matches() == ident.total())
+ return;
+ else if (ident.matches() == ident.total() - ident.nonroms())
+ throw emu_fatalerror(MAMERR_IDENT_NONROMS, "");
+ else if (ident.matches() > 0)
+ throw emu_fatalerror(MAMERR_IDENT_PARTIAL, "");
+ else
+ throw emu_fatalerror(MAMERR_IDENT_NONE, "");
}
-/*-------------------------------------------------
- info_verifysamples - verify the sample sets of
- one or more games
--------------------------------------------------*/
+//-------------------------------------------------
+// execute_commands - execute various frontend
+// commands
+//-------------------------------------------------
-static void info_verifysamples(emu_options &options, const char *gamename)
+void cli_frontend::execute_commands(const char *exename)
{
- int correct = 0;
- int incorrect = 0;
- int notfound = FALSE;
+ // help?
+ if (strcmp(m_options.command(), CLICOMMAND_HELP) == 0)
+ {
+ display_help();
+ return;
+ }
- /* now iterate over drivers */
- for (int drvindex = 0; drivers[drvindex] != NULL; drvindex++)
- if (mame_strwildcmp(gamename, drivers[drvindex]->name) == 0)
- {
- audit_record *audit;
- int audit_records;
- int res;
-
- /* audit the samples in this set */
- audit_records = audit_samples(options, drivers[drvindex], &audit);
- res = audit_summary(drivers[drvindex], audit_records, audit, TRUE);
- if (audit_records > 0)
- global_free(audit);
- else
- continue;
+ // showusage?
+ if (strcmp(m_options.command(), CLICOMMAND_SHOWUSAGE) == 0)
+ {
+ astring helpstring;
+#ifndef MESS
+ mame_printf_info("Usage: %s [%s] [options]\n\nOptions:\n%s", exename, GAMENOUN, m_options.output_help(helpstring));
+#else
+ mame_printf_info("Usage: %s [%s] [media] [software] [options]\n\nOptions:\n%s", exename, GAMENOUN, m_options.output_help(helpstring));
+#endif
+ return;
+ }
- /* if not found, print a message and set the flag */
- if (res == NOTFOUND)
- {
- mame_printf_error("sampleset \"%s\" not found!\n", drivers[drvindex]->name);
- notfound = TRUE;
- }
+ // validate?
+ if (strcmp(m_options.command(), CLICOMMAND_VALIDATE) == 0)
+ {
+ validate_drivers(m_options);
+ return;
+ }
- /* else display information about what we discovered */
- else
- {
- mame_printf_info("sampleset %s ", drivers[drvindex]->name);
+ // other commands need the INIs parsed
+ astring option_errors;
+ m_options.parse_standard_inis(option_errors);
+ if (option_errors)
+ printf("%s\n", option_errors.cstr());
- /* switch off of the result */
- switch (res)
- {
- case INCORRECT:
- mame_printf_info("is bad\n");
- incorrect++;
- break;
-
- case CORRECT:
- mame_printf_info("is good\n");
- correct++;
- break;
-
- case BEST_AVAILABLE:
- mame_printf_info("is best available\n");
- correct++;
- break;
- }
- }
- }
+ // createconfig?
+ if (strcmp(m_options.command(), CLICOMMAND_CREATECONFIG) == 0)
+ {
+ // attempt to open the output file
+ emu_file file(OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
+ if (file.open(CONFIGNAME ".ini") != FILERR_NONE)
+ throw emu_fatalerror("Unable to create file " CONFIGNAME ".ini\n");
- /* clear out any cached files */
- zip_file_cache_clear();
+ // generate the updated INI
+ astring initext;
+ file.puts(m_options.output_ini(initext));
+ return;
+ }
- /* if we didn't get anything at all because of an unsupported set, display message */
- if (correct + incorrect == 0)
+ // showconfig?
+ if (strcmp(m_options.command(), CLICOMMAND_SHOWCONFIG) == 0)
{
- if (!notfound)
- throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename);
- else
- throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "No sample sets found for '%s'", gamename);
+ // print the INI text
+ astring initext;
+ printf("%s\n", m_options.output_ini(initext));
+ return;
}
- /* otherwise, print a summary */
- else
+ // all other commands call out to one of these helpers
+ static const struct
{
- if (incorrect > 0)
- throw emu_fatalerror(MAMERR_MISSING_FILES, "%d sample sets found, %d were OK.\n", correct + incorrect, correct);
- mame_printf_info("%d sample sets found, %d were OK.\n", correct, correct);
- }
+ const char *option;
+ void (cli_frontend::*function)(const char *gamename);
+ } info_commands[] =
+ {
+ { CLICOMMAND_LISTXML, &cli_frontend::listxml },
+ { CLICOMMAND_LISTFULL, &cli_frontend::listfull },
+ { CLICOMMAND_LISTSOURCE, &cli_frontend::listsource },
+ { CLICOMMAND_LISTCLONES, &cli_frontend::listclones },
+ { CLICOMMAND_LISTBROTHERS, &cli_frontend::listbrothers },
+ { CLICOMMAND_LISTCRC, &cli_frontend::listcrc },
+ { CLICOMMAND_LISTDEVICES, &cli_frontend::listdevices },
+ { CLICOMMAND_LISTROMS, &cli_frontend::listroms },
+ { CLICOMMAND_LISTSAMPLES, &cli_frontend::listsamples },
+ { CLICOMMAND_VERIFYROMS, &cli_frontend::verifyroms },
+ { CLICOMMAND_VERIFYSAMPLES, &cli_frontend::verifysamples },
+ { CLICOMMAND_LISTMEDIA, &cli_frontend::listmedia },
+// { CLICOMMAND_LISTSOFTWARE, &cli_frontend::listsoftware },
+ { CLICOMMAND_ROMIDENT, &cli_frontend::romident }
+ };
+
+ // find the command
+ for (int cmdindex = 0; cmdindex < ARRAY_LENGTH(info_commands); cmdindex++)
+ if (strcmp(m_options.command(), info_commands[cmdindex].option) == 0)
+ {
+ // parse any relevant INI files before proceeding
+ const char *sysname = m_options.system_name();
+ (this->*info_commands[cmdindex].function)((sysname[0] == 0) ? "*" : sysname);
+ return;
+ }
+
+ // if we get here, we don't know what has been requested
+ throw emu_fatalerror(MAMERR_INVALID_CONFIG, "Unknown command '%s' specified", m_options.command());
}
-/*-------------------------------------------------
- info_romident - identify ROMs by looking for
- matches in our internal database
--------------------------------------------------*/
+//-------------------------------------------------
+// display_help - display help to standard
+// output
+//-------------------------------------------------
-static void info_romident(emu_options &options, const char *gamename)
+void cli_frontend::display_help()
{
- romident_status status;
+#ifndef MESS
+ mame_printf_info("M.A.M.E. v%s - Multiple Arcade Machine Emulator\n"
+ "Copyright Nicola Salmoria and the MAME Team\n\n", build_version);
+ mame_printf_info("%s\n", mame_disclaimer);
+ mame_printf_info("Usage: MAME gamename [options]\n\n"
+ " MAME -showusage for a brief list of options\n"
+ " MAME -showconfig for a list of configuration options\n"
+ " MAME -createconfig to create a " CONFIGNAME ".ini\n\n"
+ "For usage instructions, please consult the file windows.txt\n");
+#else
+ mess_display_help();
+#endif
+}
- /* do the identification */
- romident(options, gamename, &status);
- /* clear out any cached files */
- zip_file_cache_clear();
+//-------------------------------------------------
+// display_suggestions - display 10 possible
+// matches for a given invalid gamename
+//-------------------------------------------------
- /* return the appropriate error code */
- if (status.matches == status.total)
- return;
- else if (status.matches == status.total - status.nonroms)
- throw emu_fatalerror(MAMERR_IDENT_NONROMS, "");
- else if (status.matches > 0)
- throw emu_fatalerror(MAMERR_IDENT_PARTIAL, "");
- else
- throw emu_fatalerror(MAMERR_IDENT_NONE, "");
+void cli_frontend::display_suggestions(const char *gamename)
+{
}
+//**************************************************************************
+// MEDIA IDENTIFIER
+//**************************************************************************
-/***************************************************************************
- UTILITIES
-***************************************************************************/
-
-/*-------------------------------------------------
- romident - identify files
--------------------------------------------------*/
+//-------------------------------------------------
+// media_identifier - constructor
+//-------------------------------------------------
-static void romident(emu_options &options, const char *filename, romident_status *status)
+media_identifier::media_identifier(cli_options &options)
+ : m_drivlist(options),
+ m_total(0),
+ m_matches(0),
+ m_nonroms(0)
{
- osd_directory *directory;
+}
- /* reset the status */
- memset(status, 0, sizeof(*status));
- /* first try to open as a directory */
- directory = osd_opendir(filename);
+//-------------------------------------------------
+// identify - identify a directory, ZIP file,
+// or raw file
+//-------------------------------------------------
+
+void media_identifier::identify(const char *filename)
+{
+ // first try to open as a directory
+ osd_directory *directory = osd_opendir(filename);
if (directory != NULL)
{
- const osd_directory_entry *entry;
-
- /* iterate over all files in the directory */
- while ((entry = osd_readdir(directory)) != NULL)
+ // iterate over all files in the directory
+ for (const osd_directory_entry *entry = osd_readdir(directory); entry != NULL; entry = osd_readdir(directory))
if (entry->type == ENTTYPE_FILE)
{
astring curfile(filename, PATH_SEPARATOR, entry->name);
- identify_file(options, curfile, status);
+ identify_file(curfile);
}
+
+ // close the directory and be done
osd_closedir(directory);
}
- /* if that failed, and the filename ends with .zip, identify as a ZIP file */
+ // if that failed, and the filename ends with .zip, identify as a ZIP file
else if (core_filename_ends_with(filename, ".zip"))
{
- /* first attempt to examine it as a valid ZIP file */
+ // first attempt to examine it as a valid ZIP file
zip_file *zip = NULL;
zip_error ziperr = zip_file_open(filename, &zip);
if (ziperr == ZIPERR_NONE && zip != NULL)
{
- const zip_file_header *entry;
-
- /* loop over entries in the ZIP, skipping empty files and directories */
- for (entry = zip_file_first_file(zip); entry; entry = zip_file_next_file(zip))
+ // loop over entries in the ZIP, skipping empty files and directories
+ for (const zip_file_header *entry = zip_file_first_file(zip); entry != NULL; entry = zip_file_next_file(zip))
if (entry->uncompressed_length != 0)
{
UINT8 *data = global_alloc_array(UINT8, entry->uncompressed_length);
if (data != NULL)
{
- /* decompress data into RAM and identify it */
+ // decompress data into RAM and identify it
ziperr = zip_file_decompress(zip, data, entry->uncompressed_length);
if (ziperr == ZIPERR_NONE)
- identify_data(options, entry->filename, data, entry->uncompressed_length, status);
+ identify_data(entry->filename, data, entry->uncompressed_length);
global_free(data);
}
}
- /* close up */
+ // close up
zip_file_close(zip);
}
+
+ // clear out any cached files
+ zip_file_cache_clear();
}
- /* otherwise, identify as a raw file */
+ // otherwise, identify as a raw file
else
- identify_file(options, filename, status);
+ identify_file(filename);
}
-/*-------------------------------------------------
- identify_file - identify a file; if it is a
- ZIP file, scan it and identify all enclosed
- files
--------------------------------------------------*/
+//-------------------------------------------------
+// identify_file - identify a file
+//-------------------------------------------------
-static void identify_file(emu_options &options, const char *name, romident_status *status)
+void media_identifier::identify_file(const char *name)
{
- file_error filerr;
- osd_file *file;
- UINT64 length;
-
+ // CHD files need to be parsed and their hashes extracted from the header
if (core_filename_ends_with(name, ".chd"))
{
- chd_file *chd;
- chd_error err;
+ // output the name
astring basename;
- int found = 0;
-
- core_filename_extract_base(&basename, name, FALSE);
- mame_printf_info("%-20s", basename.cstr());
+ m_result.catprintf("%-20s", core_filename_extract_base(&basename, name, FALSE)->cstr());
+ m_total++;
- status->total++;
-
- err = chd_open(name, CHD_OPEN_READ, NULL, &chd);
+ // attempt to open as a CHD; fail if not
+ chd_file *chd;
+ chd_error err = chd_open(name, CHD_OPEN_READ, NULL, &chd);
if (err != CHDERR_NONE)
{
- mame_printf_info("NOT A CHD\n");
- status->nonroms++;
+ m_result.catprintf("NOT A CHD\n");
+ m_nonroms++;
+ return;
}
- else
- {
- chd_header header;
-
- header = *chd_get_header(chd);
- if (header.flags & CHDFLAGS_IS_WRITEABLE)
- {
- mame_printf_info("is a writeable CHD\n");
- }
- else
- {
- static const UINT8 nullhash[20] = { 0 };
- hash_collection hashes;
-
- /* if there's an MD5 or SHA1 hash, add them to the output hash */
- if (memcmp(nullhash, header.md5, sizeof(header.md5)) != 0)
- hashes.add_from_buffer(hash_collection::HASH_MD5, header.md5, sizeof(header.md5));
- if (memcmp(nullhash, header.sha1, sizeof(header.sha1)) != 0)
- hashes.add_from_buffer(hash_collection::HASH_SHA1, header.sha1, sizeof(header.sha1));
- length = header.logicalbytes;
+ // fetch the header and close the file
+ chd_header header = *chd_get_header(chd);
+ chd_close(chd);
- match_roms(options, hashes, length, &found);
-
- if (found == 0)
- {
- mame_printf_info("NO MATCH\n");
- }
-
- /* if we did find it, count it as a match */
- else
- status->matches++;
- }
-
- chd_close(chd);
+ // error on writable CHDs
+ if (header.flags & CHDFLAGS_IS_WRITEABLE)
+ {
+ m_result.catprintf("is a writeable CHD\n");
+ return;
}
+
+ // otherwise, get the hash collection for this CHD
+ static const UINT8 nullhash[20] = { 0 };
+ hash_collection hashes;
+
+ if (memcmp(nullhash, header.md5, sizeof(header.md5)) != 0)
+ hashes.add_from_buffer(hash_collection::HASH_MD5, header.md5, sizeof(header.md5));
+ if (memcmp(nullhash, header.sha1, sizeof(header.sha1)) != 0)
+ hashes.add_from_buffer(hash_collection::HASH_SHA1, header.sha1, sizeof(header.sha1));
+
+ // determine whether this file exists
+ int found = find_by_hash(hashes, header.logicalbytes);
+ if (found == 0)
+ m_result.catprintf("NO MATCH\n");
+ else
+ m_matches++;
}
+
+ // all other files have their hashes computed directly
else
{
- /* open for read and process if it opens and has a valid length */
- filerr = osd_open(name, OPEN_FLAG_READ, &file, &length);
- if (filerr == FILERR_NONE && length > 0 && (UINT32)length == length)
- {
- UINT8 *data = global_alloc_array(UINT8, length);
- if (data != NULL)
- {
- UINT32 bytes;
-
- /* read file data into RAM and identify it */
- filerr = osd_read(file, data, 0, length, &bytes);
- if (filerr == FILERR_NONE)
- identify_data(options, name, data, bytes, status);
- global_free(data);
- }
- osd_close(file);
- }
+ // load the file and process if it opens and has a valid length
+ UINT32 length;
+ void *data;
+ file_error filerr = core_fload(name, &data, &length);
+ if (filerr == FILERR_NONE && length > 0)
+ identify_data(name, reinterpret_cast<UINT8 *>(data), length);
}
}
-/*-------------------------------------------------
- identify_data - identify a buffer full of
- data; if it comes from a .JED file, parse the
- fusemap into raw data first
--------------------------------------------------*/
+//-------------------------------------------------
+// identify_data - identify a buffer full of
+// data; if it comes from a .JED file, parse the
+// fusemap into raw data first
+//-------------------------------------------------
-static void identify_data(emu_options &options, const char *name, const UINT8 *data, int length, romident_status *status)
+void media_identifier::identify_data(const char *name, const UINT8 *data, int length)
{
+ // if this is a '.jed' file, process it into raw bits first
UINT8 *tempjed = NULL;
- astring basename;
- int found = 0;
jed_data jed;
-
- /* if this is a '.jed' file, process it into raw bits first */
if (core_filename_ends_with(name, ".jed") && jed_parse(data, length, &jed) == JEDERR_NONE)
{
- /* now determine the new data length and allocate temporary memory for it */
+ // now determine the new data length and allocate temporary memory for it
length = jedbin_output(&jed, NULL, 0);
tempjed = global_alloc_array(UINT8, length);
- if (tempjed == NULL)
- return;
-
- /* create a binary output of the JED data and use that instead */
jedbin_output(&jed, tempjed, length);
data = tempjed;
}
- /* compute the hash of the data */
+ // compute the hash of the data
hash_collection hashes;
hashes.compute(data, length, hash_collection::HASH_TYPES_CRC_SHA1);
- /* output the name */
- status->total++;
- core_filename_extract_base(&basename, name, FALSE);
- mame_printf_info("%-20s", basename.cstr());
+ // output the name
+ m_total++;
+ astring basename;
+ m_result.catprintf("%-20s", core_filename_extract_base(&basename, name, FALSE)->cstr());
- /* see if we can find a match in the ROMs */
- match_roms(options, hashes, length, &found);
+ // see if we can find a match in the ROMs
+ int found = find_by_hash(hashes, length);
- /* if we didn't find it, try to guess what it might be */
+ // if we didn't find it, try to guess what it might be
if (found == 0)
{
- /* if not a power of 2, assume it is a non-ROM file */
+ // if not a power of 2, assume it is a non-ROM file
if ((length & (length - 1)) != 0)
{
- mame_printf_info("NOT A ROM\n");
- status->nonroms++;
+ m_result.catprintf("NOT A ROM\n");
+ m_nonroms++;
}
- /* otherwise, it's just not a match */
+ // otherwise, it's just not a match
else
- mame_printf_info("NO MATCH\n");
+ m_result.catprintf("NO MATCH\n");
}
- /* if we did find it, count it as a match */
+ // if we did find it, count it as a match
else
- status->matches++;
+ m_matches++;
- /* free any temporary JED data */
+ // free any temporary JED data
global_free(tempjed);
}
-/*-------------------------------------------------
- match_roms - scan for a matching ROM by hash
--------------------------------------------------*/
+//-------------------------------------------------
+// find_by_hash - scan for a file in the list
+// of drivers by hash
+//-------------------------------------------------
-static void match_roms(emu_options &options, const hash_collection &hashes, int length, int *found)
+int media_identifier::find_by_hash(const hash_collection &hashes, int length)
{
- /* iterate over drivers */
- for (int drvindex = 0; drivers[drvindex] != NULL; drvindex++)
- {
- machine_config config(*drivers[drvindex], options);
+ int found = 0;
- /* iterate over sources, regions and files within the region */
- for (const rom_source *source = rom_first_source(config); source != NULL; source = rom_next_source(*source))
- for (const rom_entry *region = rom_first_region(*source); region; region = rom_next_region(region))
- for (const rom_entry *rom = rom_first_file(region); rom; rom = rom_next_file(rom))
+ // iterate over drivers
+ m_drivlist.reset();
+ while (m_drivlist.next())
+ {
+ // iterate over sources, regions and files within the region */
+ for (const rom_source *source = rom_first_source(m_drivlist.config()); source != NULL; source = rom_next_source(*source))
+ for (const rom_entry *region = rom_first_region(*source); region != NULL; region = rom_next_region(region))
+ for (const rom_entry *rom = rom_first_file(region); rom != NULL; rom = rom_next_file(rom))
{
hash_collection romhashes(ROM_GETHASHDATA(rom));
if (!romhashes.flag(hash_collection::FLAG_NO_DUMP) && hashes == romhashes)
{
bool baddump = romhashes.flag(hash_collection::FLAG_BAD_DUMP);
- /* output information about the match */
- if (*found != 0)
+ // output information about the match
+ if (!found)
mame_printf_info(" ");
- mame_printf_info("= %s%-20s %-10s %s\n", baddump ? "(BAD) " : "", ROM_GETNAME(rom), drivers[drvindex]->name, drivers[drvindex]->description);
- (*found)++;
+ mame_printf_info("= %s%-20s %-10s %s\n", baddump ? "(BAD) " : "", ROM_GETNAME(rom), m_drivlist.driver().name, m_drivlist.driver().description);
+ found++;
}
}
- // also check any softlists
- softlist_match_roms( config, hashes, length, found );
+ // next iterate over softlists
+ for (const device_config *dev = m_drivlist.config().m_devicelist.first(SOFTWARE_LIST); dev != NULL; dev = dev->typenext())
+ {
+ software_list_config *swlist = (software_list_config *)downcast<const legacy_device_config_base *>(dev)->inline_config();
+
+ for (int listnum = 0; listnum < DEVINFO_STR_SWLIST_MAX - DEVINFO_STR_SWLIST_0; listnum++)
+ if (swlist->list_name[listnum] != NULL)
+ {
+ software_list *list = software_list_open(m_drivlist.options(), swlist->list_name[listnum], FALSE, NULL);
+
+ for (software_info *swinfo = software_list_find(list, "*", NULL); swinfo != NULL; swinfo = software_list_find(list, "*", swinfo))
+ for (software_part *part = software_find_part(swinfo, NULL, NULL); part != NULL; part = software_part_next(part))
+ for (const rom_entry *region = part->romdata; region != NULL; region = rom_next_region(region))
+ for (const rom_entry *rom = rom_first_file(region); rom != NULL; rom = rom_next_file(rom))
+ {
+ hash_collection romhashes(ROM_GETHASHDATA(rom));
+ if (hashes == romhashes)
+ {
+ bool baddump = romhashes.flag(hash_collection::FLAG_BAD_DUMP);
+
+ // output information about the match
+ if (!found)
+ mame_printf_info(" ");
+ mame_printf_info("= %s%-20s %s:%s %s\n", baddump ? "(BAD) " : "", ROM_GETNAME(rom), swlist->list_name[listnum], swinfo->shortname, swinfo->longname);
+ found++;
+ }
+ }
+
+ software_list_close(list);
+ }
+ }
}
+
+ return found;
}
diff --git a/src/emu/clifront.h b/src/emu/clifront.h
index d240fdf160f..2870309c7a4 100644
--- a/src/emu/clifront.h
+++ b/src/emu/clifront.h
@@ -80,6 +80,7 @@
// TYPE DEFINITIONS
//**************************************************************************
+// cli_options wraps the general emu options with CLI-specific additions
class cli_options : public emu_options
{
public:
@@ -91,22 +92,75 @@ private:
};
+// cli_frontend handles command-line processing and emulator execution
+class cli_frontend
+{
+public:
+ // construction/destruction
+ cli_frontend(cli_options &options, osd_interface &osd);
+ ~cli_frontend();
+
+ // execute based on the incoming argc/argv
+ int execute(int argc, char **argv);
+
+ // direct access to the command operations
+ void listxml(const char *gamename = "*");
+ void listfull(const char *gamename = "*");
+ void listsource(const char *gamename = "*");
+ void listclones(const char *gamename = "*");
+ void listbrothers(const char *gamename = "*");
+ void listcrc(const char *gamename = "*");
+ void listroms(const char *gamename = "*");
+ void listsamples(const char *gamename = "*");
+ void listdevices(const char *gamename = "*");
+ void listmedia(const char *gamename = "*");
+ void verifyroms(const char *gamename = "*");
+ void verifysamples(const char *gamename = "*");
+ void romident(const char *filename);
+
+private:
+ // internal helpers
+ void execute_commands(const char *exename);
+ void display_help();
+ void display_suggestions(const char *gamename);
+
+ // internal state
+ cli_options & m_options;
+ osd_interface & m_osd;
+ int m_result;
+};
+
+
+// media_identifier class identifies media by hash via a search in
+// the driver database
+class media_identifier
+{
+public:
+ // construction/destruction
+ media_identifier(cli_options &options);
+
+ // getters
+ const char *result() const { return m_result; }
+ int total() const { return m_total; }
+ int matches() const { return m_matches; }
+ int nonroms() const { return m_nonroms; }
+
+ // operations
+ void reset() { m_total = m_matches = m_nonroms = 0; m_result.reset(); }
+ void identify(const char *name);
+ void identify_file(const char *name);
+ void identify_data(const char *name, const UINT8 *data, int length);
+ int find_by_hash(const hash_collection &hashes, int length);
+
+private:
+ // internal state
+ driver_enumerator m_drivlist;
+ astring m_result;
+ int m_total;
+ int m_matches;
+ int m_nonroms;
+};
-/***************************************************************************
- FUNCTION PROTOTYPES
-***************************************************************************/
-int cli_execute(cli_options &options, osd_interface &osd, int argc, char **argv);
-
-/* informational functions */
-void cli_info_listxml(emu_options &options, const char *gamename);
-void cli_info_listfull(emu_options &options, const char *gamename);
-void cli_info_listsource(emu_options &options, const char *gamename);
-void cli_info_listclones(emu_options &options, const char *gamename);
-void cli_info_listbrothers(emu_options &options, const char *gamename);
-void cli_info_listcrc(emu_options &options, const char *gamename);
-void cli_info_listroms(emu_options &options, const char *gamename);
-void cli_info_listsamples(emu_options &options, const char *gamename);
-void cli_info_listdevices(emu_options &options, const char *gamename);
#endif /* __CLIFRONT_H__ */
diff --git a/src/emu/config.c b/src/emu/config.c
index 3f1b7e18d93..070f3cd4cc7 100644
--- a/src/emu/config.c
+++ b/src/emu/config.c
@@ -235,13 +235,13 @@ static int config_load_xml(running_machine &machine, emu_file &file, int which_t
case CONFIG_TYPE_CONTROLLER:
{
- const game_driver *clone_of;
+ int clone_of;
/* match on: default, game name, source file name, parent name, grandparent name */
if (strcmp(name, "default") != 0 &&
strcmp(name, machine.system().name) != 0 &&
strcmp(name, srcfile) != 0 &&
- ((clone_of = driver_get_clone(&machine.system())) == NULL || strcmp(name, clone_of->name) != 0) &&
- (clone_of == NULL || ((clone_of = driver_get_clone(clone_of)) == NULL) || strcmp(name, clone_of->name) != 0))
+ ((clone_of = driver_list::clone(machine.system())) == -1 || strcmp(name, driver_list::driver(clone_of).name) != 0) &&
+ (clone_of == -1 || ((clone_of = driver_list::clone(clone_of)) == -1) || strcmp(name, driver_list::driver(clone_of).name) != 0))
continue;
break;
}
diff --git a/src/emu/cpu/mips/dismips.c b/src/emu/cpu/mips/dismips.c
index c549cc1b6a5..339ff26ff3b 100644
--- a/src/emu/cpu/mips/dismips.c
+++ b/src/emu/cpu/mips/dismips.c
@@ -336,6 +336,12 @@ void *malloc_file_line(size_t size, const char *file, int line)
return osd_malloc(size);
}
+void *malloc_array_file_line(size_t size, const char *file, int line)
+{
+ // allocate the memory and fail if we can't
+ return osd_malloc_array(size);
+}
+
void free_file_line( void *memory, const char *file, int line )
{
osd_free( memory );
diff --git a/src/emu/debug/textbuf.c b/src/emu/debug/textbuf.c
index 828887f6b66..08b8fb2214e 100644
--- a/src/emu/debug/textbuf.c
+++ b/src/emu/debug/textbuf.c
@@ -93,7 +93,7 @@ text_buffer *text_buffer_alloc(UINT32 bytes, UINT32 lines)
return NULL;
/* allocate memory for the buffer itself */
- text->buffer = (char *)osd_malloc(bytes);
+ text->buffer = (char *)osd_malloc_array(bytes);
if (!text->buffer)
{
osd_free(text);
@@ -101,7 +101,7 @@ text_buffer *text_buffer_alloc(UINT32 bytes, UINT32 lines)
}
/* allocate memory for the lines array */
- text->lineoffs = (INT32 *)osd_malloc(lines * sizeof(text->lineoffs[0]));
+ text->lineoffs = (INT32 *)osd_malloc_array(lines * sizeof(text->lineoffs[0]));
if (!text->lineoffs)
{
osd_free(text->buffer);
diff --git a/src/emu/devcpu.c b/src/emu/devcpu.c
index 4793308c966..cddecf11f7a 100644
--- a/src/emu/devcpu.c
+++ b/src/emu/devcpu.c
@@ -88,6 +88,7 @@ legacy_cpu_device_config::legacy_cpu_device_config(const machine_config &mconfig
// set the real name
m_name = get_legacy_config_string(DEVINFO_STR_NAME);
m_shortname = get_legacy_config_string(DEVINFO_STR_SHORTNAME);
+ m_searchpath = m_shortname;
}
diff --git a/src/emu/devintrf.c b/src/emu/devintrf.c
index fa221c86d46..6e424c3f9f8 100644
--- a/src/emu/devintrf.c
+++ b/src/emu/devintrf.c
@@ -307,6 +307,30 @@ device_config::device_config(const machine_config &mconfig, device_type type, co
}
+device_config::device_config(const machine_config &mconfig, device_type type, const char *name, const char *shortname, const char *tag, const device_config *owner, UINT32 clock, UINT32 param)
+ : m_next(NULL),
+ m_owner(const_cast<device_config *>(owner)),
+ m_interface_list(NULL),
+ m_type(type),
+ m_clock(clock),
+ m_machine_config(mconfig),
+ m_static_config(NULL),
+ m_input_defaults(NULL),
+ m_name(name),
+ m_shortname(shortname),
+ m_searchpath(shortname),
+ m_tag(tag),
+ m_config_complete(false)
+{
+ // derive the clock from our owner if requested
+ if ((m_clock & 0xff000000) == 0xff000000)
+ {
+ assert(m_owner != NULL);
+ m_clock = m_owner->m_clock * ((m_clock >> 12) & 0xfff) / ((m_clock >> 0) & 0xfff);
+ }
+}
+
+
//-------------------------------------------------
// ~device_config - destructor
//-------------------------------------------------
diff --git a/src/emu/devintrf.h b/src/emu/devintrf.h
index f0996ea47fe..3e05c742089 100644
--- a/src/emu/devintrf.h
+++ b/src/emu/devintrf.h
@@ -262,6 +262,7 @@ class device_config
protected:
// construction/destruction
device_config(const machine_config &mconfig, device_type type, const char *name, const char *tag, const device_config *owner, UINT32 clock, UINT32 param = 0);
+ device_config(const machine_config &mconfig, device_type type, const char *name, const char *shortname, const char *tag, const device_config *owner, UINT32 clock, UINT32 param = 0);
virtual ~device_config();
public:
@@ -289,6 +290,7 @@ public:
UINT32 clock() const { return m_clock; }
const char *name() const { return m_name; }
const char *shortname() const { return m_shortname; }
+ const char *searchpath() const { return m_searchpath; }
const char *tag() const { return m_tag; }
const void *static_config() const { return m_static_config; }
const machine_config &mconfig() const { return m_machine_config; }
@@ -336,7 +338,9 @@ protected:
const input_device_default *m_input_defaults; // devices input ports default overrides
astring m_name; // name of the device
- astring m_shortname; // short name of the device, used for potential romload
+ astring m_shortname; // short name of the device
+ astring m_searchpath; // search path, used for media loading
+
private:
astring m_tag; // tag for this instance
bool m_config_complete; // have we completed our configuration?
diff --git a/src/emu/devlegcy.c b/src/emu/devlegcy.c
index 638153683e6..0b72a5aeb72 100644
--- a/src/emu/devlegcy.c
+++ b/src/emu/devlegcy.c
@@ -62,6 +62,7 @@ legacy_device_config_base::legacy_device_config_base(const machine_config &mconf
// set the proper name
m_name = get_legacy_config_string(DEVINFO_STR_NAME);
m_shortname = get_legacy_config_string(DEVINFO_STR_SHORTNAME);
+ m_searchpath = m_shortname;
}
diff --git a/src/emu/devlegcy.h b/src/emu/devlegcy.h
index f956614bf0c..fc7e2ddd0fb 100644
--- a/src/emu/devlegcy.h
+++ b/src/emu/devlegcy.h
@@ -126,7 +126,7 @@ enum
DEVINFO_STR_FIRST = 0x30000,
DEVINFO_STR_NAME = DEVINFO_STR_FIRST, // R/O: name of the device
- DEVINFO_STR_SHORTNAME, // R/O: short name of device, used in case of romload
+ DEVINFO_STR_SHORTNAME, // R/O: search path of device, used for media loading
DEVINFO_STR_FAMILY, // R/O: family of the device
DEVINFO_STR_VERSION, // R/O: version of the device
DEVINFO_STR_SOURCE_FILE, // R/O: file containing the device implementation
diff --git a/src/emu/diimage.c b/src/emu/diimage.c
index d6200729608..d3c31bb503f 100644
--- a/src/emu/diimage.c
+++ b/src/emu/diimage.c
@@ -383,7 +383,6 @@ bool device_image_interface::try_change_working_directory(const char *subdir)
void device_image_interface::setup_working_directory()
{
- const game_driver *gamedrv;
char *dst = NULL;
osd_get_full_path(&dst,".");
@@ -394,10 +393,10 @@ void device_image_interface::setup_working_directory()
if (try_change_working_directory("software"))
{
/* now down to a directory for this computer */
- gamedrv = &device().machine().system();
- while(gamedrv && !try_change_working_directory(gamedrv->name))
+ int gamedrv = driver_list::find(device().machine().system());
+ while(gamedrv != -1 && !try_change_working_directory(driver_list::driver(gamedrv).name))
{
- gamedrv = driver_get_compatible(gamedrv);
+ gamedrv = driver_list::compatible_with(gamedrv);
}
}
osd_free(dst);
diff --git a/src/emu/driver.c b/src/emu/driver.c
index 582d643168c..d39633d649a 100644
--- a/src/emu/driver.c
+++ b/src/emu/driver.c
@@ -2,10 +2,38 @@
driver.c
- Driver construction helpers.
-
- Copyright Nicola Salmoria and the MAME Team.
- Visit http://mamedev.org for licensing and usage restrictions.
+ Driver enumeration helpers.
+
+****************************************************************************
+
+ Copyright Aaron Giles
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name 'MAME' nor the names of its contributors may be
+ used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
***************************************************************************/
@@ -14,264 +42,332 @@
-/***************************************************************************
- CONSTANTS
-***************************************************************************/
-
-#define DRIVER_LRU_SIZE 10
+//**************************************************************************
+// DRIVER LIST
+//**************************************************************************
+//-------------------------------------------------
+// driver_list - constructor
+//-------------------------------------------------
+driver_list::driver_list()
+{
+}
-/***************************************************************************
- GLOBAL VARIABLES
-***************************************************************************/
-static int driver_lru[DRIVER_LRU_SIZE];
+//-------------------------------------------------
+// find - find a driver by name
+//-------------------------------------------------
+int driver_list::find(const char *name)
+{
+ // if no name, bail
+ if (name == NULL)
+ return -1;
+
+ // create a dummy item for comparison purposes
+ game_driver driver;
+ driver.name = name;
+ game_driver *driverptr = &driver;
+
+ // binary search to find it
+ const game_driver **result = reinterpret_cast<const game_driver **>(bsearch(&driverptr, s_drivers_sorted, s_driver_count, sizeof(*s_drivers_sorted), driver_sort_callback));
+ return (result == NULL) ? -1 : result - s_drivers_sorted;
+}
-/***************************************************************************
- FUNCTION PROTOTYPES
-***************************************************************************/
+//-------------------------------------------------
+// driver_sort_callback - compare two items in
+// an array of game_driver pointers
+//-------------------------------------------------
-static int penalty_compare(const char *source, const char *target);
+int driver_list::driver_sort_callback(const void *elem1, const void *elem2)
+{
+ const game_driver * const *item1 = reinterpret_cast<const game_driver * const *>(elem1);
+ const game_driver * const *item2 = reinterpret_cast<const game_driver * const *>(elem2);
+ return mame_stricmp((*item1)->name, (*item2)->name);
+}
+//-------------------------------------------------
+// penalty_compare - compare two strings for
+// closeness and assign a score.
+//-------------------------------------------------
-/***************************************************************************
- MISC FUNCTIONS
-***************************************************************************/
+int driver_list::penalty_compare(const char *source, const char *target)
+{
+ int gaps = 1;
+ bool last = true;
-/*-------------------------------------------------
- driver_get_name - return a pointer to a
- driver given its name
--------------------------------------------------*/
+ // scan the strings
+ for ( ; *source && *target; target++)
+ {
+ // do a case insensitive match
+ bool match = (tolower((UINT8)*source) == tolower((UINT8)*target));
-const game_driver *driver_get_name(const char *name)
-{
- int lurnum, drvnum;
+ // if we matched, advance the source
+ if (match)
+ source++;
- /* scan the LRU list first */
- for (lurnum = 0; lurnum < DRIVER_LRU_SIZE; lurnum++)
- if (mame_stricmp(drivers[driver_lru[lurnum]]->name, name) == 0)
+ // if the match state changed, count gaps
+ if (match != last)
{
- /* if not first, swap with the head */
- if (lurnum != 0)
- {
- int temp = driver_lru[0];
- driver_lru[0] = driver_lru[lurnum];
- driver_lru[lurnum] = temp;
- }
- return drivers[driver_lru[0]];
+ last = match;
+ if (!match)
+ gaps++;
}
+ }
- /* scan for a match in the drivers -- slow! */
- for (drvnum = 0; drivers[drvnum] != NULL; drvnum++)
- if (mame_stricmp(drivers[drvnum]->name, name) == 0)
- {
- memmove((void *)&driver_lru[1], (void *)&driver_lru[0], sizeof(driver_lru[0]) * (DRIVER_LRU_SIZE - 1));
- driver_lru[0] = drvnum;
- return drivers[drvnum];
- }
+ // penalty if short string does not completely fit in
+ for ( ; *source; source++)
+ gaps++;
+
+ // if we matched perfectly, gaps == 0
+ if (gaps == 1 && *source == 0 && *target == 0)
+ gaps = 0;
- return NULL;
+ return gaps;
}
-/*-------------------------------------------------
- driver_get_clone - return a pointer to the
- clone of a game driver.
--------------------------------------------------*/
-const game_driver *driver_get_clone(const game_driver *driver)
-{
- /* if no clone, easy out */
- if (driver->parent == NULL || (driver->parent[0] == '0' && driver->parent[1] == 0))
- return NULL;
+//**************************************************************************
+// DRIVER ENUMERATOR
+//**************************************************************************
- /* convert the name to a game_driver */
- return driver_get_name(driver->parent);
+//-------------------------------------------------
+// driver_enumerator - constructor
+//-------------------------------------------------
+
+driver_enumerator::driver_enumerator(emu_options &options)
+ : m_current(-1),
+ m_filtered_count(0),
+ m_options(options),
+ m_included(global_alloc_array(UINT8, s_driver_count)),
+ m_config(global_alloc_array_clear(machine_config *, s_driver_count))
+{
+ include_all();
}
-/*-------------------------------------------------
- driver_get_searchpath - return a search path
- for a given driver
--------------------------------------------------*/
+driver_enumerator::driver_enumerator(emu_options &options, const char *string)
+ : m_current(-1),
+ m_filtered_count(0),
+ m_options(options),
+ m_included(global_alloc_array(UINT8, s_driver_count)),
+ m_config(global_alloc_array_clear(machine_config *, s_driver_count))
+{
+ filter(string);
+}
+
-const char *driver_get_searchpath(const game_driver &driver, astring &string)
+driver_enumerator::driver_enumerator(emu_options &options, const game_driver &driver)
+ : m_current(-1),
+ m_filtered_count(0),
+ m_options(options),
+ m_included(global_alloc_array(UINT8, s_driver_count)),
+ m_config(global_alloc_array_clear(machine_config *, s_driver_count))
{
- // create the search path consisting of gamedrv[;parent[;...]]
- string = driver.name;
- for (const game_driver *parent = driver_get_clone(&driver); parent != NULL; parent = driver_get_clone(parent))
- string.cat(";").cat(parent->name);
- return string;
+ filter(driver);
}
-/*-------------------------------------------------
- driver_list_get_approx_matches - find the best
- n matches to a driver name.
--------------------------------------------------*/
+//-------------------------------------------------
+// ~driver_enumerator - destructor
+//-------------------------------------------------
-void driver_list_get_approx_matches(const game_driver * const driverlist[], const char *name, int matches, const game_driver **list)
+driver_enumerator::~driver_enumerator()
{
-#undef rand
+ // free any configs
+ for (int index = 0; index < s_driver_count; index++)
+ global_free(m_config[index]);
- int matchnum, drvnum;
- int *penalty;
+ // free the arrays
+ global_free(m_included);
+ global_free(m_config);
+}
- /* if no name, pick random entries */
- if (name == NULL || name[0] == 0)
- {
- const game_driver **templist;
- int driver_count;
- int shufnum;
- /* allocate a temporary list */
- templist = global_alloc_array(const game_driver *, driver_list_get_count(driverlist));
+//-------------------------------------------------
+// config - return a machine_config for the given
+// driver, allocating on demand if needed
+//-------------------------------------------------
- /* build up a list of valid entries */
- for (drvnum = driver_count = 0; driverlist[drvnum] != NULL; drvnum++)
- if ((driverlist[drvnum]->flags & GAME_NO_STANDALONE) == 0)
- templist[driver_count++] = driverlist[drvnum];
+machine_config &driver_enumerator::config(int index) const
+{
+ assert(index >= 0 && index < s_driver_count);
+ if (m_config[index] == NULL)
+ m_config[index] = global_alloc(machine_config(*s_drivers_sorted[index], m_options));
+ return *m_config[index];
+}
- /* seed the RNG first */
- srand(osd_ticks());
- /* shuffle */
- for (shufnum = 0; shufnum < 4 * driver_count; shufnum++)
- {
- int item1 = rand() % driver_count;
- int item2 = rand() % driver_count;
- const game_driver *temp;
+//-------------------------------------------------
+// filter - filter the driver list against the
+// given string
+//-------------------------------------------------
- temp = templist[item1];
- templist[item1] = templist[item2];
- templist[item2] = temp;
- }
+int driver_enumerator::filter(const char *filterstring)
+{
+ // reset the count
+ exclude_all();
+
+ // 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))
+ include(index);
+
+ return m_filtered_count;
+}
- /* copy out the first few entries */
- for (matchnum = 0; matchnum < matches; matchnum++)
- list[matchnum] = templist[matchnum % driver_count];
- global_free(templist);
- return;
- }
+//-------------------------------------------------
+// filter - filter the driver list against the
+// given driver
+//-------------------------------------------------
- /* allocate some temp memory */
- penalty = global_alloc_array(int, matches);
+int driver_enumerator::filter(const game_driver &driver)
+{
+ // reset the count
+ exclude_all();
+
+ // match name against each driver in the list
+ for (int index = 0; index < s_driver_count; index++)
+ if (s_drivers_sorted[index] == &driver)
+ include(index);
+
+ return m_filtered_count;
+}
- /* initialize everyone's states */
- for (matchnum = 0; matchnum < matches; matchnum++)
- {
- penalty[matchnum] = 9999;
- list[matchnum] = NULL;
- }
- /* scan the entire drivers array */
- for (drvnum = 0; driverlist[drvnum] != NULL; drvnum++)
+//-------------------------------------------------
+// next - get the next driver matching the given
+// filter
+//-------------------------------------------------
+
+bool driver_enumerator::next()
+{
+ // always advance one
+ m_current++;
+
+ // if we have a filter, scan forward to the next match
+ while (m_current < s_driver_count)
{
- int curpenalty, tmp;
+ if (m_included[m_current])
+ break;
+ m_current++;
+ }
- /* skip things that can't run */
- if ((driverlist[drvnum]->flags & GAME_NO_STANDALONE) != 0)
- continue;
+ // return true if we end up in range
+ return (m_current >= 0 && m_current < s_driver_count);
+}
- /* pick the best match between driver name and description */
- curpenalty = penalty_compare(name, driverlist[drvnum]->description);
- tmp = penalty_compare(name, driverlist[drvnum]->name);
- curpenalty = MIN(curpenalty, tmp);
- /* insert into the sorted table of matches */
- for (matchnum = matches - 1; matchnum >= 0; matchnum--)
- {
- /* stop if we're worse than the current entry */
- if (curpenalty >= penalty[matchnum])
- break;
+//-------------------------------------------------
+// next_excluded - get the next driver that is
+// not currently included in the list
+//-------------------------------------------------
- /* as lng as this isn't the last entry, bump this one down */
- if (matchnum < matches - 1)
- {
- penalty[matchnum + 1] = penalty[matchnum];
- list[matchnum + 1] = list[matchnum];
- }
- list[matchnum] = driverlist[drvnum];
- penalty[matchnum] = curpenalty;
- }
+bool driver_enumerator::next_excluded()
+{
+ // always advance one
+ m_current++;
+
+ // if we have a filter, scan forward to the next match
+ while (m_current < s_driver_count)
+ {
+ if (!m_included[m_current])
+ break;
+ m_current++;
}
- /* free our temp memory */
- global_free(penalty);
+ // return true if we end up in range
+ return (m_current >= 0 && m_current < s_driver_count);
}
-/*-------------------------------------------------
- penalty_compare - compare two strings for
- closeness and assign a score.
--------------------------------------------------*/
+//-------------------------------------------------
+// driver_sort_callback - compare two items in
+// an array of game_driver pointers
+//-------------------------------------------------
-static int penalty_compare(const char *source, const char *target)
+void driver_enumerator::find_approximate_matches(const char *string, int count, int *results)
{
- int gaps = 1;
- int last = TRUE;
+#undef rand
- /* scan the strings */
- for ( ; *source && *target; target++)
+ // if no name, pick random entries
+ if (string == NULL || string[0] == 0)
{
- /* do a case insensitive match */
- int match = (tolower((UINT8)*source) == tolower((UINT8)*target));
+ // seed the RNG first
+ srand(osd_ticks());
- /* if we matched, advance the source */
- if (match)
- source++;
+ // allocate a temporary list
+ int *templist = global_alloc_array(int, m_filtered_count);
+ int arrayindex = 0;
+ for (int index = 0; index < s_driver_count; index++)
+ if (m_included[index])
+ templist[arrayindex++] = index;
+ assert(arrayindex == m_filtered_count);
- /* if the match state changed, count gaps */
- if (match != last)
+ // shuffle
+ for (int shufnum = 0; shufnum < 4 * s_driver_count; shufnum++)
{
- last = match;
- if (!match)
- gaps++;
+ int item1 = rand() % m_filtered_count;
+ int item2 = rand() % m_filtered_count;
+ int temp = templist[item1];
+ templist[item1] = templist[item2];
+ templist[item2] = temp;
}
- }
-
- /* penalty if short string does not completely fit in */
- for ( ; *source; source++)
- gaps++;
- /* if we matched perfectly, gaps == 0 */
- if (gaps == 1 && *source == 0 && *target == 0)
- gaps = 0;
+ // copy out the first few entries
+ for (int matchnum = 0; matchnum < count; matchnum++)
+ results[matchnum] = templist[matchnum % m_filtered_count];
- return gaps;
-}
+ global_free(templist);
+ return;
+ }
+ // allocate memory to track the penalty value
+ int *penalty = global_alloc_array(int, count);
-/*-------------------------------------------------
- driver_list_get_count - returns the amount of
- drivers
--------------------------------------------------*/
+ // initialize everyone's states
+ for (int matchnum = 0; matchnum < count; matchnum++)
+ {
+ penalty[matchnum] = 9999;
+ results[matchnum] = -1;
+ }
-int driver_list_get_count(const game_driver * const driverlist[])
-{
- int count;
+ // scan the entire drivers array
+ for (int index = 0; index < s_driver_count; index++)
+ if (m_included[index])
+ {
+ // skip things that can't run
+ if ((s_drivers_sorted[index]->flags & GAME_NO_STANDALONE) != 0)
+ continue;
- for (count = 0; driverlist[count] != NULL; count++) ;
- return count;
-}
+ // pick the best match between driver name and description
+ int curpenalty = penalty_compare(string, s_drivers_sorted[index]->description);
+ int tmp = penalty_compare(string, s_drivers_sorted[index]->name);
+ curpenalty = MIN(curpenalty, tmp);
-/*-------------------------------------------------
- driver_get_compatible - return a pointer to the
- compatible driver.
--------------------------------------------------*/
+ // insert into the sorted table of matches
+ for (int matchnum = count - 1; matchnum >= 0; matchnum--)
+ {
+ // stop if we're worse than the current entry
+ if (curpenalty >= penalty[matchnum])
+ break;
+
+ // as long as this isn't the last entry, bump this one down
+ if (matchnum < count - 1)
+ {
+ penalty[matchnum + 1] = penalty[matchnum];
+ results[matchnum + 1] = results[matchnum];
+ }
+ results[matchnum] = index;
+ penalty[matchnum] = curpenalty;
+ }
+ }
-const game_driver *driver_get_compatible(const game_driver *drv)
-{
- if (driver_get_clone(drv))
- drv = driver_get_clone(drv);
- else if (drv->compatible_with)
- drv = driver_get_name(drv->compatible_with);
- else
- drv = NULL;
- return drv;
+ // free our temp memory
+ global_free(penalty);
}
diff --git a/src/emu/driver.h b/src/emu/driver.h
index 47e64ef6564..c920c0ca5e6 100644
--- a/src/emu/driver.h
+++ b/src/emu/driver.h
@@ -2,10 +2,38 @@
driver.h
- Definitions relating to game drivers.
-
- Copyright Nicola Salmoria and the MAME Team.
- Visit http://mamedev.org for licensing and usage restrictions.
+ Driver enumeration helpers.
+
+****************************************************************************
+
+ Copyright Aaron Giles
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name 'MAME' nor the names of its contributors may be
+ used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
***************************************************************************/
@@ -81,6 +109,108 @@ struct game_driver
};
+// driver_list is a purely static class that wraps the global driver list
+class driver_list
+{
+ DISABLE_COPYING(driver_list);
+
+protected:
+ // construction/destruction
+ driver_list();
+
+public:
+ // getters
+ static int total() { return s_driver_count; }
+
+ // 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 & GAME_IS_BIOS_ROOT) == 0) ? result : -1; }
+ static int compatible_with(int index) { int result = clone(index); return (result != -1) ? result : find(driver(index).compatible_with); }
+
+ // 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); }
+
+ // 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) { return (wildstring == NULL || mame_strwildcmp(wildstring, string) == 0); }
+
+protected:
+ // internal helpers
+ static int driver_sort_callback(const void *elem1, const void *elem2);
+ static int penalty_compare(const char *source, const char *target);
+
+ // internal state
+ static int s_driver_count;
+ static const game_driver * const s_drivers_sorted[];
+};
+
+
+// driver_enumerator enables efficient iteration through the driver list
+class driver_enumerator : public driver_list
+{
+ DISABLE_COPYING(driver_enumerator);
+
+public:
+ // construction/destruction
+ driver_enumerator(emu_options &options);
+ driver_enumerator(emu_options &options, const char *filter);
+ driver_enumerator(emu_options &options, const game_driver &filter);
+ ~driver_enumerator();
+
+ // getters
+ int count() const { return m_filtered_count; }
+ int current() const { return m_current; }
+ emu_options &options() const { return m_options; }
+
+ // current item
+ const game_driver &driver() const { return driver_list::driver(m_current); }
+ machine_config &config() const { return config(m_current); }
+ 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); }
+ void include() { include(m_current); }
+ void exclude() { exclude(m_current); }
+
+ // any item by index
+ bool included(int index) const { assert(index >= 0 && index < s_driver_count); return m_included[index]; }
+ bool excluded(int index) const { assert(index >= 0 && index < s_driver_count); return !m_included[index]; }
+ machine_config &config(int index) const;
+ void include(int index) { assert(index >= 0 && index < s_driver_count); if (!m_included[index]) { m_included[index] = true; m_filtered_count++; } }
+ void exclude(int index) { assert(index >= 0 && index < s_driver_count); if (m_included[index]) { m_included[index] = false; m_filtered_count--; } }
+ using driver_list::driver;
+ using driver_list::clone;
+ using driver_list::non_bios_clone;
+ using driver_list::compatible_with;
+
+ // filtering/iterating
+ int filter(const char *string = NULL);
+ int filter(const game_driver &driver);
+ void include_all() { memset(m_included, 1, sizeof(m_included[0]) * s_driver_count); m_filtered_count = s_driver_count; }
+ void exclude_all() { memset(m_included, 0, sizeof(m_included[0]) * s_driver_count); m_filtered_count = 0; }
+ void reset() { m_current = -1; }
+ bool next();
+ bool next_excluded();
+
+ // general helpers
+ void set_current(int index) { assert(index >= -1 && index <= s_driver_count); m_current = index; }
+ void find_approximate_matches(const char *string, int count, int *results);
+
+private:
+ // internal state
+ int m_current;
+ int m_filtered_count;
+ emu_options & m_options;
+ UINT8 * m_included;
+ machine_config ** m_config;
+};
+
+
/***************************************************************************
MACROS FOR BUILDING GAME DRIVERS
@@ -176,24 +306,8 @@ extern const game_driver GAME_NAME(NAME) = \
GLOBAL VARIABLES
***************************************************************************/
-extern const game_driver * const drivers[];
-
-GAME_EXTERN(empty);
-
-
-
-/***************************************************************************
- FUNCTION PROTOTYPES
-***************************************************************************/
-
-const game_driver *driver_get_name(const char *name);
-const game_driver *driver_get_clone(const game_driver *driver);
-const game_driver *driver_get_compatible(const game_driver *drv);
-
-const char *driver_get_searchpath(const game_driver &driver, astring &string);
+GAME_EXTERN(___empty);
-void driver_list_get_approx_matches(const game_driver * const driverlist[], const char *name, int matches, const game_driver **list);
-int driver_list_get_count(const game_driver * const driverlist[]);
#endif
diff --git a/src/emu/drivers/empty.c b/src/emu/drivers/empty.c
index bea3c2231ab..d4ce7079f31 100644
--- a/src/emu/drivers/empty.c
+++ b/src/emu/drivers/empty.c
@@ -20,7 +20,7 @@
*
*************************************/
-static MACHINE_START( empty )
+static MACHINE_START( ___empty )
{
/* force the UI to show the game select screen */
ui_menu_force_game_select(machine, &machine.render().ui_container());
@@ -34,9 +34,9 @@ static MACHINE_START( empty )
*
*************************************/
-static MACHINE_CONFIG_START( empty, driver_device )
+static MACHINE_CONFIG_START( ___empty, driver_device )
- MCFG_MACHINE_START(empty)
+ MCFG_MACHINE_START(___empty)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
@@ -54,8 +54,8 @@ MACHINE_CONFIG_END
*
*************************************/
-ROM_START( empty )
- ROM_REGION( 0x10, "user1", 0 )
+ROM_START( ___empty )
+ ROM_REGION( 0x10, "user1", ROMREGION_ERASEFF )
ROM_END
@@ -66,4 +66,4 @@ ROM_END
*
*************************************/
-GAME( 2007, empty, 0, empty, 0, 0, ROT0, "MAME", "No Driver Loaded", 0 )
+GAME( 2007, ___empty, 0, ___empty, 0, 0, ROT0, "MAME", "No Driver Loaded", GAME_NO_SOUND )
diff --git a/src/emu/emu.mak b/src/emu/emu.mak
index d336f113876..73663d48c86 100644
--- a/src/emu/emu.mak
+++ b/src/emu/emu.mak
@@ -338,5 +338,6 @@ $(EMUOBJ)/rendlay.o: $(EMULAYOUT)/dualhovu.lh \
$(EMULAYOUT)/voffff20.lh \
$(EMULAYOUT)/lcd.lh \
$(EMULAYOUT)/lcd_rot.lh \
+ $(EMULAYOUT)/pinball.lh \
$(EMUOBJ)/video.o: $(EMULAYOUT)/snap.lh
diff --git a/src/emu/emualloc.c b/src/emu/emualloc.c
index 75b972e0eeb..a3164e8e913 100644
--- a/src/emu/emualloc.c
+++ b/src/emu/emualloc.c
@@ -92,6 +92,7 @@ public:
static UINT64 s_curid; // current ID
static osd_lock * s_lock; // lock for managing the list
static bool s_lock_alloc; // set to true temporarily during lock allocation
+ static bool s_tracking; // set to true when tracking is live
static memory_entry *s_hash[k_hash_prime];// hash table based on pointer
static memory_entry *s_freehead; // pointer to the head of the free list
@@ -118,9 +119,10 @@ resource_pool global_resource_pool;
const zeromem_t zeromem = { };
// globals for memory_entry
-UINT64 memory_entry::s_curid = 0;
+UINT64 memory_entry::s_curid = 1;
osd_lock *memory_entry::s_lock = NULL;
bool memory_entry::s_lock_alloc = false;
+bool memory_entry::s_tracking = false;
memory_entry *memory_entry::s_hash[memory_entry::k_hash_prime] = { NULL };
memory_entry *memory_entry::s_freehead = NULL;
@@ -155,6 +157,31 @@ void *malloc_file_line(size_t size, const char *file, int line)
//-------------------------------------------------
+// malloc_array_file_line - allocate memory with
+// file and line number information, and a hint
+// that this object is an array
+//-------------------------------------------------
+
+void *malloc_array_file_line(size_t size, const char *file, int line)
+{
+ // allocate the memory and fail if we can't
+ void *result = osd_malloc_array(size);
+ if (result == NULL)
+ return NULL;
+
+ // add a new entry
+ memory_entry::allocate(size, result, file, line);
+
+#ifdef MAME_DEBUG
+ // randomize the memory
+ rand_memory(result, size);
+#endif
+
+ return result;
+}
+
+
+//-------------------------------------------------
// free_file_line - free memory with file
// and line number information
//-------------------------------------------------
@@ -189,7 +216,19 @@ void free_file_line(void *memory, const char *file, int line)
// memory
//-------------------------------------------------
-void dump_unfreed_mem(void)
+void track_memory(bool track)
+{
+ memory_entry::s_tracking = track;
+}
+
+
+//-------------------------------------------------
+// dump_unfreed_mem - called from the exit path
+// of any code that wants to check for unfreed
+// memory
+//-------------------------------------------------
+
+void dump_unfreed_mem()
{
#ifdef MAME_DEBUG
memory_entry::report_unfreed();
@@ -446,7 +485,7 @@ memory_entry *memory_entry::allocate(size_t size, void *base, const char *file,
if (s_freehead == NULL)
{
// create a new chunk, and fail if we can't
- memory_entry *entry = reinterpret_cast<memory_entry *>(osd_malloc(memory_block_alloc_chunk * sizeof(memory_entry)));
+ memory_entry *entry = reinterpret_cast<memory_entry *>(osd_malloc_array(memory_block_alloc_chunk * sizeof(memory_entry)));
if (entry == NULL)
{
release_lock();
@@ -468,8 +507,8 @@ memory_entry *memory_entry::allocate(size_t size, void *base, const char *file,
// populate it
entry->m_size = size;
entry->m_base = base;
- entry->m_file = file;
- entry->m_line = line;
+ entry->m_file = s_tracking ? file : NULL;
+ entry->m_line = s_tracking ? line : 0;
entry->m_id = s_curid++;
if (LOG_ALLOCS)
fprintf(stderr, "#%06d, alloc %d bytes (%s:%d)\n", (UINT32)entry->m_id, static_cast<UINT32>(entry->m_size), entry->m_file, (int)entry->m_line);
@@ -561,5 +600,5 @@ void memory_entry::report_unfreed()
release_lock();
if (total > 0)
- fprintf(stderr, "a total of %d bytes were not free()'d\n", total);
+ fprintf(stderr, "a total of %d bytes were not freed\n", total);
}
diff --git a/src/emu/emualloc.h b/src/emu/emualloc.h
index 0a26fcad3ec..e4da24c52a5 100644
--- a/src/emu/emualloc.h
+++ b/src/emu/emualloc.h
@@ -47,9 +47,25 @@
//**************************************************************************
+// DEBUGGING
+//**************************************************************************
+
+// set to 1 to track memory allocated by emualloc.h itself as well
+#define TRACK_SELF_MEMORY (0)
+
+
+
+//**************************************************************************
// MACROS
//**************************************************************************
+// self-allocation helpers
+#if TRACK_SELF_MEMORY
+#define EMUALLOC_SELF_NEW new(__FILE__, __LINE__)
+#else
+#define EMUALLOC_SELF_NEW new
+#endif
+
// pool allocation helpers
#define pool_alloc(_pool, _type) (_pool).add_object(new(__FILE__, __LINE__) _type)
#define pool_alloc_clear(_pool, _type) (_pool).add_object(new(__FILE__, __LINE__, zeromem) _type)
@@ -72,11 +88,13 @@
// allocate memory with file and line number information
void *malloc_file_line(size_t size, const char *file, int line);
+void *malloc_array_file_line(size_t size, const char *file, int line);
// free memory with file and line number information
void free_file_line(void *memory, const char *file, int line);
// called from the exit path of any code that wants to check for unfreed memory
+void track_memory(bool track);
void dump_unfreed_mem();
@@ -100,7 +118,7 @@ ATTR_FORCE_INLINE inline void *operator new(std::size_t size) throw (std::bad_al
ATTR_FORCE_INLINE inline void *operator new[](std::size_t size) throw (std::bad_alloc)
{
- void *result = malloc_file_line(size, NULL, 0);
+ void *result = malloc_array_file_line(size, NULL, 0);
if (result == NULL)
throw std::bad_alloc();
return result;
@@ -130,7 +148,7 @@ ATTR_FORCE_INLINE inline void *operator new(std::size_t size, const char *file,
ATTR_FORCE_INLINE inline void *operator new[](std::size_t size, const char *file, int line) throw (std::bad_alloc)
{
- void *result = malloc_file_line(size, file, line);
+ void *result = malloc_array_file_line(size, file, line);
if (result == NULL)
throw std::bad_alloc();
return result;
@@ -161,7 +179,7 @@ ATTR_FORCE_INLINE inline void *operator new(std::size_t size, const char *file,
ATTR_FORCE_INLINE inline void *operator new[](std::size_t size, const char *file, int line, const zeromem_t &) throw (std::bad_alloc)
{
- void *result = malloc_file_line(size, file, line);
+ void *result = malloc_array_file_line(size, file, line);
if (result == NULL)
throw std::bad_alloc();
memset(result, 0, size);
@@ -270,8 +288,8 @@ public:
bool contains(void *ptrstart, void *ptrend);
void clear();
- template<class T> T *add_object(T* object) { add(*new(__FILE__, __LINE__) resource_pool_object<T>(object)); return object; }
- template<class T> T *add_array(T* array, int count) { add(*new(__FILE__, __LINE__) resource_pool_array<T>(array, count)); return array; }
+ template<class T> T *add_object(T* object) { add(*EMUALLOC_SELF_NEW resource_pool_object<T>(object)); return object; }
+ template<class T> T *add_array(T* array, int count) { add(*EMUALLOC_SELF_NEW resource_pool_array<T>(array, count)); return array; }
private:
static const int k_hash_prime = 193;
@@ -306,7 +324,7 @@ extern const zeromem_t zeromem;
#undef realloc
#undef free
-#define malloc(x) malloc_file_line(x, __FILE__, __LINE__)
+#define malloc(x) malloc_array_file_line(x, __FILE__, __LINE__)
#define calloc(x,y) __error_use_auto_alloc_clear_or_global_alloc_clear_instead__
#define realloc(x,y) __error_realloc_is_dangerous__
#define free(x) free_file_line(x, __FILE__, __LINE__)
diff --git a/src/emu/emuopts.c b/src/emu/emuopts.c
index 69cca4f8b87..7753b8e83ac 100644
--- a/src/emu/emuopts.c
+++ b/src/emu/emuopts.c
@@ -349,12 +349,12 @@ void emu_options::parse_standard_inis(astring &error_string)
}
// then parse the grandparent, parent, and system-specific INIs
- const game_driver *parent = driver_get_clone(cursystem);
- const game_driver *gparent = (parent != NULL) ? driver_get_clone(parent) : NULL;
- if (gparent != NULL)
- parse_one_ini(gparent->name, OPTION_PRIORITY_GPARENT_INI, &error_string);
- if (parent != NULL)
- parse_one_ini(parent->name, OPTION_PRIORITY_PARENT_INI, &error_string);
+ int parent = driver_list::clone(*cursystem);
+ int gparent = (parent != -1) ? driver_list::clone(parent) : -1;
+ if (gparent != -1)
+ parse_one_ini(driver_list::driver(gparent).name, OPTION_PRIORITY_GPARENT_INI, &error_string);
+ if (parent != -1)
+ parse_one_ini(driver_list::driver(parent).name, OPTION_PRIORITY_PARENT_INI, &error_string);
parse_one_ini(cursystem->name, OPTION_PRIORITY_DRIVER_INI, &error_string);
}
@@ -367,7 +367,8 @@ void emu_options::parse_standard_inis(astring &error_string)
const game_driver *emu_options::system() const
{
astring tempstr;
- return driver_get_name(*core_filename_extract_base(&tempstr, system_name(), TRUE));
+ int index = driver_list::find(*core_filename_extract_base(&tempstr, system_name(), TRUE));
+ return (index != -1) ? &driver_list::driver(index) : NULL;
}
diff --git a/src/emu/emutempl.h b/src/emu/emutempl.h
index 74fe8501f6c..c4fd064c155 100644
--- a/src/emu/emutempl.h
+++ b/src/emu/emutempl.h
@@ -245,6 +245,37 @@ private:
};
+// ======================> simple_list_wrapper
+
+// a simple_list_wrapper wraps an existing object with a next pointer so it
+// can live in a simple_list without requiring the object to have a next
+// pointer
+template<class T>
+class simple_list_wrapper
+{
+public:
+ // construction/destruction
+ simple_list_wrapper(T *object)
+ : m_next(NULL),
+ m_object(object) { }
+
+ // operators
+ operator T *() { return m_object; }
+ operator T *() const { return m_object; }
+ T *operator *() { return m_object; }
+ T *operator *() const { return m_object; }
+
+ // getters
+ simple_list_wrapper *next() const { return m_next; }
+ T *object() const { return m_object; }
+
+private:
+ // internal state
+ simple_list_wrapper * m_next;
+ T * m_object;
+};
+
+
// ======================> fixed_allocator
// a fixed_allocator is a simple class that maintains a free pool of objects
diff --git a/src/emu/hash.c b/src/emu/hash.c
index 5d55f26d642..12f94dd1f5f 100644
--- a/src/emu/hash.c
+++ b/src/emu/hash.c
@@ -593,7 +593,7 @@ bool hash_collection::remove(char type)
// crc - return the CRC hash if present
//-------------------------------------------------
-bool hash_collection::crc(UINT32 &result)
+bool hash_collection::crc(UINT32 &result) const
{
// attempt to find the CRC hash; if we fail, return false
hash_base *crchash = hash(HASH_CRC);
@@ -601,7 +601,7 @@ bool hash_collection::crc(UINT32 &result)
return false;
// downcast to a hash_crc and convert to a UINT32
- result = *downcast<hash_crc *>(crchash);
+ result = *downcast<const hash_crc *>(crchash);
return true;
}
diff --git a/src/emu/hash.h b/src/emu/hash.h
index a89c7cee4b2..3f5995edb51 100644
--- a/src/emu/hash.h
+++ b/src/emu/hash.h
@@ -161,7 +161,7 @@ public:
bool remove(char type);
// CRC-specific helpers
- bool crc(UINT32 &result);
+ bool crc(UINT32 &result) const;
hash_base *add_crc(UINT32 crc);
// string conversion
diff --git a/src/emu/info.c b/src/emu/info.c
index d0e39604249..7ee5c261500 100644
--- a/src/emu/info.c
+++ b/src/emu/info.c
@@ -4,8 +4,36 @@
Dumps the MAME internal data as an XML file.
- Copyright Nicola Salmoria and the MAME Team.
- Visit http://mamedev.org for licensing and usage restrictions.
+****************************************************************************
+
+ Copyright Aaron Giles
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name 'MAME' nor the names of its contributors may be
+ used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
***************************************************************************/
@@ -19,7 +47,8 @@
#include <ctype.h>
-/* MESS/MAME configuration */
+
+// MAME vs MESS configuration
#ifdef MESS
#define XML_ROOT "mess"
#define XML_TOP "machine"
@@ -30,522 +59,375 @@
-/***************************************************************************
- TYPE DEFINITIONS
-***************************************************************************/
-
-class parent_info
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+// DTD string describing the data
+const char info_xml_creator::s_dtd_string[] =
+"<!DOCTYPE " XML_ROOT " [\n"
+"<!ELEMENT " XML_ROOT " (" XML_TOP "+)>\n"
+"\t<!ATTLIST " XML_ROOT " build CDATA #IMPLIED>\n"
+"\t<!ATTLIST " XML_ROOT " debug (yes|no) \"no\">\n"
+"\t<!ATTLIST " XML_ROOT " mameconfig CDATA #REQUIRED>\n"
+"\t<!ELEMENT " XML_TOP " (description, year?, manufacturer, biosset*, rom*, disk*, sample*, chip*, display*, sound?, input?, dipswitch*, configuration*, category*, adjuster*, driver?, device*, softwarelist*, ramoption*)>\n"
+"\t\t<!ATTLIST " XML_TOP " name CDATA #REQUIRED>\n"
+"\t\t<!ATTLIST " XML_TOP " sourcefile CDATA #IMPLIED>\n"
+"\t\t<!ATTLIST " XML_TOP " isbios (yes|no) \"no\">\n"
+"\t\t<!ATTLIST " XML_TOP " ismechanical (yes|no) \"no\">\n"
+"\t\t<!ATTLIST " XML_TOP " runnable (yes|no) \"yes\">\n"
+"\t\t<!ATTLIST " XML_TOP " cloneof CDATA #IMPLIED>\n"
+"\t\t<!ATTLIST " XML_TOP " romof CDATA #IMPLIED>\n"
+"\t\t<!ATTLIST " XML_TOP " sampleof CDATA #IMPLIED>\n"
+"\t\t<!ELEMENT description (#PCDATA)>\n"
+"\t\t<!ELEMENT year (#PCDATA)>\n"
+"\t\t<!ELEMENT manufacturer (#PCDATA)>\n"
+"\t\t<!ELEMENT biosset EMPTY>\n"
+"\t\t\t<!ATTLIST biosset name CDATA #REQUIRED>\n"
+"\t\t\t<!ATTLIST biosset description CDATA #REQUIRED>\n"
+"\t\t\t<!ATTLIST biosset default (yes|no) \"no\">\n"
+"\t\t<!ELEMENT rom EMPTY>\n"
+"\t\t\t<!ATTLIST rom name CDATA #REQUIRED>\n"
+"\t\t\t<!ATTLIST rom bios CDATA #IMPLIED>\n"
+"\t\t\t<!ATTLIST rom size CDATA #REQUIRED>\n"
+"\t\t\t<!ATTLIST rom crc CDATA #IMPLIED>\n"
+"\t\t\t<!ATTLIST rom md5 CDATA #IMPLIED>\n"
+"\t\t\t<!ATTLIST rom sha1 CDATA #IMPLIED>\n"
+"\t\t\t<!ATTLIST rom merge CDATA #IMPLIED>\n"
+"\t\t\t<!ATTLIST rom region CDATA #IMPLIED>\n"
+"\t\t\t<!ATTLIST rom offset CDATA #IMPLIED>\n"
+"\t\t\t<!ATTLIST rom status (baddump|nodump|good) \"good\">\n"
+"\t\t\t<!ATTLIST rom optional (yes|no) \"no\">\n"
+"\t\t<!ELEMENT disk EMPTY>\n"
+"\t\t\t<!ATTLIST disk name CDATA #REQUIRED>\n"
+"\t\t\t<!ATTLIST disk md5 CDATA #IMPLIED>\n"
+"\t\t\t<!ATTLIST disk sha1 CDATA #IMPLIED>\n"
+"\t\t\t<!ATTLIST disk merge CDATA #IMPLIED>\n"
+"\t\t\t<!ATTLIST disk region CDATA #IMPLIED>\n"
+"\t\t\t<!ATTLIST disk index CDATA #IMPLIED>\n"
+"\t\t\t<!ATTLIST disk status (baddump|nodump|good) \"good\">\n"
+"\t\t\t<!ATTLIST disk optional (yes|no) \"no\">\n"
+"\t\t<!ELEMENT sample EMPTY>\n"
+"\t\t\t<!ATTLIST sample name CDATA #REQUIRED>\n"
+"\t\t<!ELEMENT chip EMPTY>\n"
+"\t\t\t<!ATTLIST chip name CDATA #REQUIRED>\n"
+"\t\t\t<!ATTLIST chip tag CDATA #IMPLIED>\n"
+"\t\t\t<!ATTLIST chip type (cpu|audio) #REQUIRED>\n"
+"\t\t\t<!ATTLIST chip clock CDATA #IMPLIED>\n"
+"\t\t<!ELEMENT display EMPTY>\n"
+"\t\t\t<!ATTLIST display type (raster|vector|lcd|unknown) #REQUIRED>\n"
+"\t\t\t<!ATTLIST display rotate (0|90|180|270) #REQUIRED>\n"
+"\t\t\t<!ATTLIST display flipx (yes|no) \"no\">\n"
+"\t\t\t<!ATTLIST display width CDATA #IMPLIED>\n"
+"\t\t\t<!ATTLIST display height CDATA #IMPLIED>\n"
+"\t\t\t<!ATTLIST display refresh CDATA #REQUIRED>\n"
+"\t\t\t<!ATTLIST display pixclock CDATA #IMPLIED>\n"
+"\t\t\t<!ATTLIST display htotal CDATA #IMPLIED>\n"
+"\t\t\t<!ATTLIST display hbend CDATA #IMPLIED>\n"
+"\t\t\t<!ATTLIST display hbstart CDATA #IMPLIED>\n"
+"\t\t\t<!ATTLIST display vtotal CDATA #IMPLIED>\n"
+"\t\t\t<!ATTLIST display vbend CDATA #IMPLIED>\n"
+"\t\t\t<!ATTLIST display vbstart CDATA #IMPLIED>\n"
+"\t\t<!ELEMENT sound EMPTY>\n"
+"\t\t\t<!ATTLIST sound channels CDATA #REQUIRED>\n"
+"\t\t<!ELEMENT input (control*)>\n"
+"\t\t\t<!ATTLIST input service (yes|no) \"no\">\n"
+"\t\t\t<!ATTLIST input tilt (yes|no) \"no\">\n"
+"\t\t\t<!ATTLIST input players CDATA #REQUIRED>\n"
+"\t\t\t<!ATTLIST input buttons CDATA #IMPLIED>\n"
+"\t\t\t<!ATTLIST input coins CDATA #IMPLIED>\n"
+"\t\t\t<!ELEMENT control EMPTY>\n"
+"\t\t\t\t<!ATTLIST control type CDATA #REQUIRED>\n"
+"\t\t\t\t<!ATTLIST control minimum CDATA #IMPLIED>\n"
+"\t\t\t\t<!ATTLIST control maximum CDATA #IMPLIED>\n"
+"\t\t\t\t<!ATTLIST control sensitivity CDATA #IMPLIED>\n"
+"\t\t\t\t<!ATTLIST control keydelta CDATA #IMPLIED>\n"
+"\t\t\t\t<!ATTLIST control reverse (yes|no) \"no\">\n"
+"\t\t<!ELEMENT dipswitch (dipvalue*)>\n"
+"\t\t\t<!ATTLIST dipswitch name CDATA #REQUIRED>\n"
+"\t\t\t<!ATTLIST dipswitch tag CDATA #REQUIRED>\n"
+"\t\t\t<!ATTLIST dipswitch mask CDATA #REQUIRED>\n"
+"\t\t\t<!ELEMENT dipvalue EMPTY>\n"
+"\t\t\t\t<!ATTLIST dipvalue name CDATA #REQUIRED>\n"
+"\t\t\t\t<!ATTLIST dipvalue value CDATA #REQUIRED>\n"
+"\t\t\t\t<!ATTLIST dipvalue default (yes|no) \"no\">\n"
+"\t\t<!ELEMENT configuration (confsetting*)>\n"
+"\t\t\t<!ATTLIST configuration name CDATA #REQUIRED>\n"
+"\t\t\t<!ATTLIST configuration tag CDATA #REQUIRED>\n"
+"\t\t\t<!ATTLIST configuration mask CDATA #REQUIRED>\n"
+"\t\t\t<!ELEMENT confsetting EMPTY>\n"
+"\t\t\t\t<!ATTLIST confsetting name CDATA #REQUIRED>\n"
+"\t\t\t\t<!ATTLIST confsetting value CDATA #REQUIRED>\n"
+"\t\t\t\t<!ATTLIST confsetting default (yes|no) \"no\">\n"
+"\t\t<!ELEMENT category (item*)>\n"
+"\t\t\t<!ATTLIST category name CDATA #REQUIRED>\n"
+"\t\t\t<!ELEMENT item EMPTY>\n"
+"\t\t\t\t<!ATTLIST item name CDATA #REQUIRED>\n"
+"\t\t\t\t<!ATTLIST item default (yes|no) \"no\">\n"
+"\t\t<!ELEMENT adjuster EMPTY>\n"
+"\t\t\t<!ATTLIST adjuster name CDATA #REQUIRED>\n"
+"\t\t\t<!ATTLIST adjuster default CDATA #REQUIRED>\n"
+"\t\t<!ELEMENT driver EMPTY>\n"
+"\t\t\t<!ATTLIST driver status (good|imperfect|preliminary) #REQUIRED>\n"
+"\t\t\t<!ATTLIST driver emulation (good|imperfect|preliminary) #REQUIRED>\n"
+"\t\t\t<!ATTLIST driver color (good|imperfect|preliminary) #REQUIRED>\n"
+"\t\t\t<!ATTLIST driver sound (good|imperfect|preliminary) #REQUIRED>\n"
+"\t\t\t<!ATTLIST driver graphic (good|imperfect|preliminary) #REQUIRED>\n"
+"\t\t\t<!ATTLIST driver cocktail (good|imperfect|preliminary) #IMPLIED>\n"
+"\t\t\t<!ATTLIST driver protection (good|imperfect|preliminary) #IMPLIED>\n"
+"\t\t\t<!ATTLIST driver savestate (supported|unsupported) #REQUIRED>\n"
+"\t\t\t<!ATTLIST driver palettesize CDATA #REQUIRED>\n"
+"\t\t<!ELEMENT device (instance*, extension*)>\n"
+"\t\t\t<!ATTLIST device type CDATA #REQUIRED>\n"
+"\t\t\t<!ATTLIST device tag CDATA #IMPLIED>\n"
+"\t\t\t<!ATTLIST device mandatory CDATA #IMPLIED>\n"
+"\t\t\t<!ATTLIST device interface CDATA #IMPLIED>\n"
+"\t\t\t<!ELEMENT instance EMPTY>\n"
+"\t\t\t\t<!ATTLIST instance name CDATA #REQUIRED>\n"
+"\t\t\t\t<!ATTLIST instance briefname CDATA #REQUIRED>\n"
+"\t\t\t<!ELEMENT extension EMPTY>\n"
+"\t\t\t\t<!ATTLIST extension name CDATA #REQUIRED>\n"
+"\t\t<!ELEMENT softwarelist EMPTY>\n"
+"\t\t\t<!ATTLIST softwarelist name CDATA #REQUIRED>\n"
+"\t\t\t<!ATTLIST softwarelist status (original|compatible) #REQUIRED>\n"
+"\t\t<!ELEMENT ramoption (#PCDATA)>\n"
+"\t\t\t<!ATTLIST ramoption default CDATA #IMPLIED>\n"
+"]>";
+
+
+
+//**************************************************************************
+// INFO XML CREATOR
+//**************************************************************************
+
+//-------------------------------------------------
+// info_xml_creator - constructor
+//-------------------------------------------------
+
+info_xml_creator::info_xml_creator(driver_enumerator &drivlist)
+ : m_output(NULL),
+ m_drivlist(drivlist)
{
-public:
- const game_driver *drv;
- machine_config mconfig;
-
- parent_info(const game_driver *drv, emu_options &options) : mconfig(*drv, options)
- {
- this->drv = drv;
- }
-};
-
+}
-/***************************************************************************
- CORE IMPLEMENTATION
-***************************************************************************/
-
-/*-------------------------------------------------
- print_game_switches - print the DIP switch
- settings for a game
--------------------------------------------------*/
+//-------------------------------------------------
+// output_mame_xml - print the XML information
+// for all known games
+//-------------------------------------------------
-static void print_game_switches(FILE *out, const game_driver *game, const ioport_list &portlist)
+void info_xml_creator::output(FILE *out)
{
- const input_port_config *port;
- const input_field_config *field;
-
- /* iterate looking for DIP switches */
- for (port = portlist.first(); port != NULL; port = port->next())
- for (field = port->fieldlist; field != NULL; field = field->next)
- if (field->type == IPT_DIPSWITCH)
- {
- const input_setting_config *setting;
-
- /* output the switch name information */
- fprintf(out, "\t\t<dipswitch name=\"%s\"", xml_normalize_string(input_field_name(field)));
- fprintf(out, " tag=\"%s\"", xml_normalize_string(field->port->tag));
- fprintf(out, " mask=\"%u\"", field->mask);
- fprintf(out, ">\n");
+ m_output = out;
+
+ // output the DTD
+ fprintf(m_output, "<?xml version=\"1.0\"?>\n");
+ fprintf(m_output, "%s\n\n", s_dtd_string);
+
+ // top-level tag
+ fprintf(m_output, "<" XML_ROOT " build=\"%s\" debug=\""
+#ifdef MAME_DEBUG
+ "yes"
+#else
+ "no"
+#endif
+ "\" mameconfig=\"%d\">\n",
+ xml_normalize_string(build_version),
+ CONFIG_VERSION
+ );
- /* loop over settings */
- for (setting = field->settinglist; setting != NULL; setting = setting->next)
- {
- fprintf(out, "\t\t\t<dipvalue name=\"%s\"", xml_normalize_string(setting->name));
- fprintf(out, " value=\"%u\"", setting->value);
- if (setting->value == field->defvalue)
- fprintf(out, " default=\"yes\"");
- fprintf(out, "/>\n");
- }
+ // iterate through the drivers, outputting one at a time
+ while (m_drivlist.next())
+ output_one();
- /* terminate the switch entry */
- fprintf(out, "\t\t</dipswitch>\n");
- }
+ // close the top level tag
+ fprintf(m_output, "</" XML_ROOT ">\n");
}
-/*-------------------------------------------------
- print_game_configs - print the Configuration
- settings for a game
--------------------------------------------------*/
-static void print_game_configs(FILE *out, const game_driver *game, const ioport_list &portlist)
-{
- const input_port_config *port;
- const input_field_config *field;
+//-------------------------------------------------
+// output_one - print the XML information
+// for one particular game driver
+//-------------------------------------------------
- /* iterate looking for configurations */
- for (port = portlist.first(); port != NULL; port = port->next())
- for (field = port->fieldlist; field != NULL; field = field->next)
- if (field->type == IPT_CONFIG)
- {
- const input_setting_config *setting;
+void info_xml_creator::output_one()
+{
+ // no action if not a game
+ const game_driver &driver = m_drivlist.driver();
+ if (driver.flags & GAME_NO_STANDALONE)
+ return;
- /* output the configuration name information */
- fprintf(out, "\t\t<configuration name=\"%s\"", xml_normalize_string(input_field_name(field)));
- fprintf(out, " tag=\"%s\"", xml_normalize_string(field->port->tag));
- fprintf(out, " mask=\"%u\"", field->mask);
- fprintf(out, ">\n");
+ // allocate input ports
+ machine_config &config = m_drivlist.config();
+ ioport_list portlist;
+ input_port_list_init(portlist, driver.ipt, NULL, 0, FALSE, NULL);
+ for (device_config *cfg = config.m_devicelist.first(); cfg != NULL; cfg = cfg->next())
+ if (cfg->input_ports() != NULL)
+ input_port_list_init(portlist, cfg->input_ports(), NULL, 0, FALSE, cfg);
- /* loop over settings */
- for (setting = field->settinglist; setting != NULL; setting = setting->next)
- {
- fprintf(out, "\t\t\t<confsetting name=\"%s\"", xml_normalize_string(setting->name));
- fprintf(out, " value=\"%u\"", setting->value);
- if (setting->value == field->defvalue)
- fprintf(out, " default=\"yes\"");
- fprintf(out, "/>\n");
- }
+ // print the header and the game name
+ fprintf(m_output, "\t<" XML_TOP);
+ fprintf(m_output, " name=\"%s\"", xml_normalize_string(driver.name));
- /* terminate the configuration entry */
- fprintf(out, "\t\t</configuration>\n");
- }
+ // strip away any path information from the source_file and output it
+ const char *start = strrchr(driver.source_file, '/');
+ if (start == NULL)
+ start = strrchr(driver.source_file, '\\');
+ if (start == NULL)
+ start = driver.source_file - 1;
+ fprintf(m_output, " sourcefile=\"%s\"", xml_normalize_string(start + 1));
+
+ // append bios and runnable flags
+ if (driver.flags & GAME_IS_BIOS_ROOT)
+ fprintf(m_output, " isbios=\"yes\"");
+ if (driver.flags & GAME_NO_STANDALONE)
+ fprintf(m_output, " runnable=\"no\"");
+ if (driver.flags & GAME_MECHANICAL)
+ fprintf(m_output, " ismechanical=\"yes\"");
+
+ // display clone information
+ int clone_of = m_drivlist.find(driver.parent);
+ if (clone_of != -1 && !(m_drivlist.driver(clone_of).flags & GAME_IS_BIOS_ROOT))
+ fprintf(m_output, " cloneof=\"%s\"", xml_normalize_string(m_drivlist.driver(clone_of).name));
+ if (clone_of != -1)
+ fprintf(m_output, " romof=\"%s\"", xml_normalize_string(m_drivlist.driver(clone_of).name));
+
+ // display sample information and close the game tag
+ output_sampleof();
+ fprintf(m_output, ">\n");
+
+ // output game description
+ if (driver.description != NULL)
+ fprintf(m_output, "\t\t<description>%s</description>\n", xml_normalize_string(driver.description));
+
+ // print the year only if is a number or another allowed character (? or +)
+ if (driver.year != NULL && strspn(driver.year, "0123456789?+") == strlen(driver.year))
+ fprintf(m_output, "\t\t<year>%s</year>\n", xml_normalize_string(driver.year));
+
+ // print the manufacturer information
+ if (driver.manufacturer != NULL)
+ fprintf(m_output, "\t\t<manufacturer>%s</manufacturer>\n", xml_normalize_string(driver.manufacturer));
+
+ // now print various additional information
+ output_bios();
+ output_rom();
+ output_sample();
+ output_chips();
+ output_display();
+ output_sound();
+ output_input(portlist);
+ output_switches(portlist, IPT_DIPSWITCH, "dipswitch", "dipvalue");
+ output_switches(portlist, IPT_CONFIG, "configuration", "confsetting");
+ output_categories(portlist);
+ output_adjusters(portlist);
+ output_driver();
+ output_images();
+ output_software_list();
+ output_ramoptions();
+
+ // close the topmost tag
+ fprintf(m_output, "\t</" XML_TOP ">\n");
}
-/*-------------------------------------------------
- print_game_adjusters - print the Analog
- Adjusters for a game
--------------------------------------------------*/
-
-static void print_game_adjusters(FILE *out, const game_driver *game, const ioport_list &portlist)
-{
- const input_port_config *port;
- const input_field_config *field;
- /* iterate looking for Adjusters */
- for (port = portlist.first(); port != NULL; port = port->next())
- for (field = port->fieldlist; field != NULL; field = field->next)
- if (field->type == IPT_ADJUSTER)
- {
- /* output the adjuster information */
- fprintf(out, "\t\t<adjuster name=\"%s\" default=\"%d\"/>\n", xml_normalize_string(input_field_name(field)), field->defvalue);
- }
-}
+//------------------------------------------------
+// output_sampleof - print the 'sampleof'
+// attribute, if appropriate
+//-------------------------------------------------
-/*-------------------------------------------------
- print_game_input - print a summary of a game's
- input
--------------------------------------------------*/
-
-static void print_game_input(FILE *out, const game_driver *game, const ioport_list &portlist)
+void info_xml_creator::output_sampleof()
{
- /* fix me -- this needs to be cleaned up to match the core style */
-
-enum {cjoy, cdoublejoy, cAD_stick, cdial, ctrackball, cpaddle, clightgun, cpedal, ckeypad, ckeyboard, ENDCONTROLTYPES};
- int nplayer = 0;
- int nbutton = 0;
- int ncoin = 0;
- //int controlsyes = 0;
- int analogcontrol = 0;
- int i;
- const char* service = 0;
- const char* tilt = 0;
- const char* const control_types[] = {"joy", "doublejoy", "stick", "dial", "trackball", "paddle", "lightgun", "pedal", "keypad", "keyboard"};
- static struct _input_info
- {
- const char * type; /* general type of input */
- const char * Xway; /* 2, 4, or 8 way */
- int analog;
- int keyb;
- int min; /* analog minimum value */
- int max; /* analog maximum value */
- int sensitivity; /* default analog sensitivity */
- int keydelta; /* default analog keydelta */
- int reverse; /* default analog reverse setting */
- } control[ENDCONTROLTYPES];
- const input_port_config *port;
- const input_field_config *field;
-
- for (i = 0; i < ENDCONTROLTYPES; i++)
+ // iterate over sample devices
+ for (const device_config *devconfig = m_drivlist.config().m_devicelist.first(SAMPLES); devconfig != NULL; devconfig = devconfig->typenext())
{
- control[i].type = control_types[i];
- control[i].Xway = NULL;
- control[i].analog = 0;
- control[i].keyb = 0;
- control[i].min = 0;
- control[i].max = 0;
- control[i].sensitivity = 0;
- control[i].keydelta = 0;
- control[i].reverse = 0;
- }
-
- for (port = portlist.first(); port != NULL; port = port->next())
- for (field = port->fieldlist; field != NULL; field = field->next)
- {
+ const char *const *samplenames = ((const samples_interface *)devconfig->static_config())->samplenames;
+ if (samplenames != NULL)
- if (nplayer < field->player + 1)
- nplayer = field->player + 1;
-
- switch (field->type)
+ // iterate over sample names
+ for (int sampnum = 0; samplenames[sampnum] != NULL; sampnum++)
{
- case IPT_JOYSTICK_LEFT:
- case IPT_JOYSTICK_RIGHT:
-
- /* if control not defined, start it off as horizontal 2-way */
- if (control[cjoy].Xway == NULL)
- control[cjoy].Xway = "joy2way";
- else if (strcmp(control[cjoy].Xway,"joy2way") == 0)
- ;
- /* if already defined as vertical, make it 4 or 8 way */
- else if (strcmp(control[cjoy].Xway,"vjoy2way") == 0)
- {
- if (field->way == 4)
- control[cjoy].Xway = "joy4way";
- else
- control[cjoy].Xway = "joy8way";
- }
- //controlsyes = 1;
- break;
-
- case IPT_JOYSTICK_UP:
- case IPT_JOYSTICK_DOWN:
+ // only output sampleof if different from the game name
+ const char *cursampname = samplenames[sampnum];
+ if (cursampname[0] == '*' && strcmp(cursampname + 1, m_drivlist.driver().name) != 0)
+ fprintf(m_output, " sampleof=\"%s\"", xml_normalize_string(cursampname + 1));
- /* if control not defined, start it off as vertical 2-way */
- if (control[cjoy].Xway == NULL)
- control[cjoy].Xway = "vjoy2way";
- else if (strcmp(control[cjoy].Xway,"vjoy2way") == 0)
- ;
- /* if already defined as horiz, make it 4 or 8way */
- else if (strcmp(control[cjoy].Xway,"joy2way") == 0)
- {
- if (field->way == 4)
- control[cjoy].Xway = "joy4way";
- else
- control[cjoy].Xway = "joy8way";
- }
- //controlsyes = 1;
- break;
-
- case IPT_JOYSTICKRIGHT_UP:
- case IPT_JOYSTICKRIGHT_DOWN:
- case IPT_JOYSTICKLEFT_UP:
- case IPT_JOYSTICKLEFT_DOWN:
-
- /* if control not defined, start it off as vertical 2way */
- if (control[cdoublejoy].Xway == NULL)
- control[cdoublejoy].Xway = "vdoublejoy2way";
- else if (strcmp(control[cdoublejoy].Xway,"vdoublejoy2way") == 0)
- ;
- /* if already defined as horiz, make it 4 or 8 way */
- else if (strcmp(control[cdoublejoy].Xway,"doublejoy2way") == 0)
- {
- if (field->way == 4)
- control[cdoublejoy].Xway = "doublejoy4way";
- else
- control[cdoublejoy].Xway = "doublejoy8way";
- }
- //controlsyes = 1;
- break;
-
- case IPT_JOYSTICKRIGHT_LEFT:
- case IPT_JOYSTICKRIGHT_RIGHT:
- case IPT_JOYSTICKLEFT_LEFT:
- case IPT_JOYSTICKLEFT_RIGHT:
-
- /* if control not defined, start it off as horiz 2-way */
- if (control[cdoublejoy].Xway == NULL)
- control[cdoublejoy].Xway = "doublejoy2way";
- else if (strcmp(control[cdoublejoy].Xway,"doublejoy2way") == 0)
- ;
- /* if already defined as vertical, make it 4 or 8 way */
- else if (strcmp(control[cdoublejoy].Xway,"vdoublejoy2way") == 0)
- {
- if (field->way == 4)
- control[cdoublejoy].Xway = "doublejoy4way";
- else
- control[cdoublejoy].Xway = "doublejoy8way";
- }
- //controlsyes = 1;
- break;
-
- /* mark as an analog input, and get analog stats after switch */
- case IPT_PADDLE:
- analogcontrol = cpaddle;
- break;
- case IPT_DIAL:
- analogcontrol = cdial;
- break;
- case IPT_TRACKBALL_X:
- case IPT_TRACKBALL_Y:
- analogcontrol = ctrackball;
- break;
- case IPT_AD_STICK_X:
- case IPT_AD_STICK_Y:
- analogcontrol = cAD_stick;
- break;
- case IPT_LIGHTGUN_X:
- case IPT_LIGHTGUN_Y:
- analogcontrol = clightgun;
- break;
- case IPT_PEDAL:
- case IPT_PEDAL2:
- case IPT_PEDAL3:
- analogcontrol = cpedal;
- break;
-
- case IPT_BUTTON1:
- case IPT_BUTTON2:
- case IPT_BUTTON3:
- case IPT_BUTTON4:
- case IPT_BUTTON5:
- case IPT_BUTTON6:
- case IPT_BUTTON7:
- case IPT_BUTTON8:
- case IPT_BUTTON9:
- case IPT_BUTTON10:
- case IPT_BUTTON11:
- case IPT_BUTTON12:
- case IPT_BUTTON13:
- case IPT_BUTTON14:
- case IPT_BUTTON15:
- case IPT_BUTTON16:
- nbutton = MAX(nbutton, field->type - IPT_BUTTON1 + 1);
- break;
-
- case IPT_COIN1:
- case IPT_COIN2:
- case IPT_COIN3:
- case IPT_COIN4:
- case IPT_COIN5:
- case IPT_COIN6:
- case IPT_COIN7:
- case IPT_COIN8:
- ncoin = MAX(ncoin, field->type - IPT_COIN1 + 1);
-
- case IPT_SERVICE :
- service = "yes";
- break;
-
- case IPT_TILT :
- tilt = "yes";
- break;
-
- case IPT_KEYPAD:
- control[ckeypad].keyb = 1;
- break;
-
- case IPT_KEYBOARD:
- control[ckeyboard].keyb = 1;
- break;
- }
-
- /* get the analog stats */
- if (analogcontrol)
- {
- //controlsyes = 1;
- control[analogcontrol].analog = 1;
-
- if (field->min)
- control[analogcontrol].min = field->min;
- if (field->max)
- control[analogcontrol].max = field->max;
- if (field->sensitivity)
- control[analogcontrol].sensitivity = field->sensitivity;
- if (field->delta)
- control[analogcontrol].keydelta = field->delta;
- if (field->flags & ANALOG_FLAG_REVERSE)
- control[analogcontrol].reverse = 1;
-
- analogcontrol = 0;
- }
- }
-
- fprintf(out, "\t\t<input");
- fprintf(out, " players=\"%d\"", nplayer);
- if (nbutton != 0)
- fprintf(out, " buttons=\"%d\"", nbutton);
- if (ncoin != 0)
- fprintf(out, " coins=\"%d\"", ncoin);
- if (service != NULL)
- fprintf(out, " service=\"%s\"", xml_normalize_string(service));
- if (tilt != NULL)
- fprintf(out, " tilt=\"%s\"", xml_normalize_string(tilt));
- fprintf(out, ">\n");
-
- for (i = 0; i < ENDCONTROLTYPES; i++)
- {
- if (control[i].Xway != NULL)
- fprintf(out, "\t\t\t<control type=\"%s\"/>\n", xml_normalize_string(control[i].Xway));
- if (control[i].analog)
- {
- fprintf(out, "\t\t\t<control type=\"%s\"", xml_normalize_string(control_types[i]));
- if (control[i].min || control[i].max)
- {
- fprintf(out, " minimum=\"%d\"", control[i].min);
- fprintf(out, " maximum=\"%d\"", control[i].max);
+ // must stop here, as there can only be one attribute of the same name
+ return;
}
- if (control[i].sensitivity)
- fprintf(out, " sensitivity=\"%d\"", control[i].sensitivity);
- if (control[i].keydelta)
- fprintf(out, " keydelta=\"%d\"", control[i].keydelta);
- if (control[i].reverse)
- fprintf(out, " reverse=\"yes\"");
-
- fprintf(out, "/>\n");
- }
- if (control[i].keyb)
- {
- fprintf(out, "\t\t\t<control type=\"%s\"/>\n", xml_normalize_string(control_types[i]));
- }
}
- fprintf(out, "\t\t</input>\n");
}
-/*-------------------------------------------------
- print_game_bios - print the BIOS set for a
- game
--------------------------------------------------*/
+//-------------------------------------------------
+// output_bios - print the BIOS set for a
+// game
+//-------------------------------------------------
-static void print_game_bios(FILE *out, const game_driver *game)
+void info_xml_creator::output_bios()
{
- const rom_entry *rom;
-
- /* skip if no ROMs */
- if (game->rom == NULL)
+ // skip if no ROMs
+ if (m_drivlist.driver().rom == NULL)
return;
- /* iterate over ROM entries and look for BIOSes */
- for (rom = game->rom; !ROMENTRY_ISEND(rom); rom++)
+ // iterate over ROM entries and look for BIOSes
+ for (const rom_entry *rom = m_drivlist.driver().rom; !ROMENTRY_ISEND(rom); rom++)
if (ROMENTRY_ISSYSTEM_BIOS(rom))
{
- const char *name = ROM_GETNAME(rom);
- const char *description = ROM_GETHASHDATA(rom);
-
- /* output extracted name and descriptions */
- fprintf(out, "\t\t<biosset");
- fprintf(out, " name=\"%s\"", xml_normalize_string(name));
- fprintf(out, " description=\"%s\"", xml_normalize_string(description));
+ // output extracted name and descriptions
+ fprintf(m_output, "\t\t<biosset");
+ fprintf(m_output, " name=\"%s\"", xml_normalize_string(ROM_GETNAME(rom)));
+ fprintf(m_output, " description=\"%s\"", xml_normalize_string(ROM_GETHASHDATA(rom)));
if (ROM_GETBIOSFLAGS(rom) == 1)
- fprintf(out, " default=\"yes\"");
- fprintf(out, "/>\n");
+ fprintf(m_output, " default=\"yes\"");
+ fprintf(m_output, "/>\n");
}
}
-/*-------------------------------------------------
- get_merge_name - get the rom name from a
- parent set
--------------------------------------------------*/
-
-static const char *get_merge_name(const hash_collection &romhashes, int parents, const parent_info **pinfoarray)
-{
- int parent;
- const char *merge_name = NULL;
-
- for (parent = 0; parent < parents; ++parent)
- {
- const machine_config *pconfig = &pinfoarray[parent]->mconfig;
- const rom_source *psource;
- const rom_entry *pregion, *prom;
-
- /* scan the clone_of ROM for a matching ROM entry */
- for (psource = rom_first_source(*pconfig); psource != NULL; psource = rom_next_source(*psource))
- for (pregion = rom_first_region(*psource); pregion != NULL; pregion = rom_next_region(pregion))
- for (prom = rom_first_file(pregion); prom != NULL; prom = rom_next_file(prom))
- {
- hash_collection phashes(ROM_GETHASHDATA(prom));
- if (!phashes.flag(hash_collection::FLAG_NO_DUMP) && romhashes == phashes)
- {
- merge_name = ROM_GETNAME(prom);
- break;
- }
- }
- }
-
- return merge_name;
-}
+//-------------------------------------------------
+// output_rom - print the roms section of
+// the XML output
+//-------------------------------------------------
-
-/*-------------------------------------------------
- print_game_rom - print the roms section of
- the XML output
--------------------------------------------------*/
-
-static void print_game_rom(FILE *out, const game_driver *game, const machine_config &config)
+void info_xml_creator::output_rom()
{
- const game_driver *clone_of = driver_get_clone(game);
- int rom_type;
- int parents = 0;
- const parent_info *pinfoarray[4];
-
- for (; clone_of != NULL; clone_of = driver_get_clone(clone_of))
- {
- assert_always(parents < ARRAY_LENGTH(pinfoarray), "too many parents");
- pinfoarray[parents++] = global_alloc(parent_info(clone_of, config.options()));
- }
-
- /* iterate over 3 different ROM "types": BIOS, ROMs, DISKs */
- for (rom_type = 0; rom_type < 3; rom_type++)
+ // iterate over 3 different ROM "types": BIOS, ROMs, DISKs
+ for (int rom_type = 0; rom_type < 3; rom_type++)
{
- const rom_source *source;
- const rom_entry *region;
-
- /* iterate over ROM sources: first the game, then any devices */
- for (source = rom_first_source(config); source != NULL; source = rom_next_source(*source))
- for (region = rom_first_region(*source); region != NULL; region = rom_next_region(region))
+ // iterate over ROM sources: first the game, then any devices
+ for (const rom_source *source = rom_first_source(m_drivlist.config()); source != NULL; source = rom_next_source(*source))
+ for (const rom_entry *region = rom_first_region(*source); region != NULL; region = rom_next_region(region))
{
- int is_disk = ROMREGION_ISDISKDATA(region);
- const rom_entry *rom;
+ bool is_disk = ROMREGION_ISDISKDATA(region);
- /* disk regions only work for disks */
+ // disk regions only work for disks
if ((is_disk && rom_type != 2) || (!is_disk && rom_type == 2))
continue;
- /* iterate through ROM entries */
- for (rom = rom_first_file(region); rom != NULL; rom = rom_next_file(rom))
+ // iterate through ROM entries
+ for (const rom_entry *rom = rom_first_file(region); rom != NULL; rom = rom_next_file(rom))
{
- int is_bios = ROM_GETBIOSFLAGS(rom);
+ bool is_bios = ROM_GETBIOSFLAGS(rom);
const char *name = ROM_GETNAME(rom);
int offset = ROM_GETOFFSET(rom);
const char *merge_name = NULL;
char bios_name[100];
- /* BIOS ROMs only apply to bioses */
+ // BIOS ROMs only apply to bioses
if ((is_bios && rom_type != 0) || (!is_bios && rom_type == 0))
continue;
- /* if we have a valid ROM and we are a clone, see if we can find the parent ROM */
+ // if we have a valid ROM and we are a clone, see if we can find the parent ROM
hash_collection hashes(ROM_GETHASHDATA(rom));
- if (!hashes.flag(hash_collection::FLAG_NO_DUMP) && parents > 0)
- {
- merge_name = get_merge_name(hashes, parents, pinfoarray);
- }
+ if (!hashes.flag(hash_collection::FLAG_NO_DUMP))
+ merge_name = get_merge_name(hashes);
- /* scan for a BIOS name */
+ // scan for a BIOS name
bios_name[0] = 0;
if (!is_disk && is_bios)
{
- const rom_entry *brom;
-
- /* scan backwards through the ROM entries */
- for (brom = rom - 1; brom != game->rom; brom--)
+ // scan backwards through the ROM entries
+ for (const rom_entry *brom = rom - 1; brom != m_drivlist.driver().rom; brom--)
if (ROMENTRY_ISSYSTEM_BIOS(brom))
{
strcpy(bios_name, ROM_GETNAME(brom));
@@ -553,281 +435,521 @@ static void print_game_rom(FILE *out, const game_driver *game, const machine_con
}
}
- /* opening tag */
+ // opening tag
if (!is_disk)
- fprintf(out, "\t\t<rom");
+ fprintf(m_output, "\t\t<rom");
else
- fprintf(out, "\t\t<disk");
+ fprintf(m_output, "\t\t<disk");
- /* add name, merge, bios, and size tags */
+ // add name, merge, bios, and size tags */
if (name != NULL && name[0] != 0)
- fprintf(out, " name=\"%s\"", xml_normalize_string(name));
+ fprintf(m_output, " name=\"%s\"", xml_normalize_string(name));
if (merge_name != NULL)
- fprintf(out, " merge=\"%s\"", xml_normalize_string(merge_name));
+ fprintf(m_output, " merge=\"%s\"", xml_normalize_string(merge_name));
if (bios_name[0] != 0)
- fprintf(out, " bios=\"%s\"", xml_normalize_string(bios_name));
+ fprintf(m_output, " bios=\"%s\"", xml_normalize_string(bios_name));
if (!is_disk)
- fprintf(out, " size=\"%d\"", rom_file_size(rom));
+ fprintf(m_output, " size=\"%d\"", rom_file_size(rom));
- /* dump checksum information only if there is a known dump */
+ // dump checksum information only if there is a known dump
if (!hashes.flag(hash_collection::FLAG_NO_DUMP))
{
- /* iterate over hash function types and print out their values */
+ // iterate over hash function types and print m_output their values
astring tempstr;
for (hash_base *hash = hashes.first(); hash != NULL; hash = hash->next())
- fprintf(out, " %s=\"%s\"", hash->name(), hash->string(tempstr));
+ fprintf(m_output, " %s=\"%s\"", hash->name(), hash->string(tempstr));
}
- /* append a region name */
- fprintf(out, " region=\"%s\"", ROMREGION_GETTAG(region));
+ // append a region name
+ fprintf(m_output, " region=\"%s\"", ROMREGION_GETTAG(region));
- /* add nodump/baddump flags */
+ // add nodump/baddump flags
if (hashes.flag(hash_collection::FLAG_NO_DUMP))
- fprintf(out, " status=\"nodump\"");
+ fprintf(m_output, " status=\"nodump\"");
if (hashes.flag(hash_collection::FLAG_BAD_DUMP))
- fprintf(out, " status=\"baddump\"");
+ fprintf(m_output, " status=\"baddump\"");
- /* for non-disk entries, print offset */
+ // for non-disk entries, print offset
if (!is_disk)
- fprintf(out, " offset=\"%x\"", offset);
- /* for disk entries, add the disk index */
+ fprintf(m_output, " offset=\"%x\"", offset);
+
+ // for disk entries, add the disk index
else
- fprintf(out, " index=\"%x\"", DISK_GETINDEX(rom));
+ fprintf(m_output, " index=\"%x\"", DISK_GETINDEX(rom));
- /* add optional flag */
+ // add optional flag
if ((!is_disk && ROM_ISOPTIONAL(rom)) || (is_disk && DISK_ISOPTIONAL(rom)))
- fprintf(out, " optional=\"yes\"");
+ fprintf(m_output, " optional=\"yes\"");
- fprintf(out, "/>\n");
+ fprintf(m_output, "/>\n");
}
}
}
-
- for (; parents > 0; parents--)
- global_free(pinfoarray[parents - 1]);
-}
-
-
-/*-------------------------------------------------
- print_game_sampleof - print the 'sampleof'
- attribute, if appropriate
--------------------------------------------------*/
-
-static void print_game_sampleof(FILE *out, const game_driver *game, const machine_config &config)
-{
- const device_config_sound_interface *sound = NULL;
-
- for (bool gotone = config.m_devicelist.first(sound); gotone; gotone = sound->next(sound))
- if (sound->devconfig().type() == SAMPLES)
- {
- const char *const *samplenames = ((const samples_interface *)sound->devconfig().static_config())->samplenames;
- if (samplenames != NULL)
- {
- int sampnum;
-
- /* iterate over sample names */
- for (sampnum = 0; samplenames[sampnum] != NULL; sampnum++)
- {
- const char *cursampname = samplenames[sampnum];
-
- /* only output sampleof if different from the game name */
- if (cursampname[0] == '*' && strcmp(cursampname + 1, game->name) != 0)
- fprintf(out, " sampleof=\"%s\"", xml_normalize_string(cursampname + 1));
-
- /* must stop here, as there can only be one attribute of the same name */
- return;
- }
- }
- }
}
-/*-------------------------------------------------
- print_game_sample - print a list of all
- samples referenced by a game_driver
--------------------------------------------------*/
+//-------------------------------------------------
+// output_sample - print a list of all
+// samples referenced by a game_driver
+//-------------------------------------------------
-static void print_game_sample(FILE *out, const game_driver *game, const machine_config &config)
+void info_xml_creator::output_sample()
{
- const device_config_sound_interface *sound = NULL;
+ // iterate over sample devices
+ for (const device_config *devconfig = m_drivlist.config().m_devicelist.first(SAMPLES); devconfig != NULL; devconfig = devconfig->typenext())
+ {
+ const char *const *samplenames = ((const samples_interface *)devconfig->static_config())->samplenames;
+ if (samplenames != NULL)
- /* iterate over sound chips looking for samples */
- for (bool gotone = config.m_devicelist.first(sound); gotone; gotone = sound->next(sound))
- if (sound->devconfig().type() == SAMPLES)
- {
- const char *const *samplenames = ((const samples_interface *)sound->devconfig().static_config())->samplenames;
- if (samplenames != NULL)
+ // iterate over sample names
+ for (int sampnum = 0; samplenames[sampnum] != NULL; sampnum++)
{
- int sampnum;
-
- /* iterate over sample names */
- for (sampnum = 0; samplenames[sampnum] != NULL; sampnum++)
- {
- const char *cursampname = samplenames[sampnum];
- int dupnum;
-
- /* ignore the special '*' samplename */
- if (sampnum == 0 && cursampname[0] == '*')
- continue;
+ // ignore the special '*' samplename
+ const char *cursampname = samplenames[sampnum];
+ if (sampnum == 0 && cursampname[0] == '*')
+ continue;
- /* filter out duplicates */
- for (dupnum = 0; dupnum < sampnum; dupnum++)
- if (strcmp(samplenames[dupnum], cursampname) == 0)
- break;
- if (dupnum < sampnum)
- continue;
+ // filter m_output duplicates
+ int dupnum;
+ for (dupnum = 0; dupnum < sampnum; dupnum++)
+ if (strcmp(samplenames[dupnum], cursampname) == 0)
+ break;
+ if (dupnum < sampnum)
+ continue;
- /* output the sample name */
- fprintf(out, "\t\t<sample name=\"%s\"/>\n", xml_normalize_string(cursampname));
- }
+ // output the sample name
+ fprintf(m_output, "\t\t<sample name=\"%s\"/>\n", xml_normalize_string(cursampname));
}
- }
+ }
}
/*-------------------------------------------------
- print_game_chips - print a list of CPU and
+ output_chips - print a list of CPU and
sound chips used by a game
-------------------------------------------------*/
-static void print_game_chips(FILE *out, const game_driver *game, const machine_config &config)
+void info_xml_creator::output_chips()
{
- /* iterate over CPUs */
+ // iterate over executable devices
const device_config_execute_interface *exec = NULL;
- for (bool gotone = config.m_devicelist.first(exec); gotone; gotone = exec->next(exec))
+ for (bool gotone = m_drivlist.config().m_devicelist.first(exec); gotone; gotone = exec->next(exec))
{
- fprintf(out, "\t\t<chip");
- fprintf(out, " type=\"cpu\"");
- fprintf(out, " tag=\"%s\"", xml_normalize_string(exec->devconfig().tag()));
- fprintf(out, " name=\"%s\"", xml_normalize_string(exec->devconfig().name()));
- fprintf(out, " clock=\"%d\"", exec->devconfig().clock());
- fprintf(out, "/>\n");
+ fprintf(m_output, "\t\t<chip");
+ fprintf(m_output, " type=\"cpu\"");
+ fprintf(m_output, " tag=\"%s\"", xml_normalize_string(exec->devconfig().tag()));
+ fprintf(m_output, " name=\"%s\"", xml_normalize_string(exec->devconfig().name()));
+ fprintf(m_output, " clock=\"%d\"", exec->devconfig().clock());
+ fprintf(m_output, "/>\n");
}
- /* iterate over sound chips */
+ // iterate over sound devices
const device_config_sound_interface *sound = NULL;
- for (bool gotone = config.m_devicelist.first(sound); gotone; gotone = sound->next(sound))
+ for (bool gotone = m_drivlist.config().m_devicelist.first(sound); gotone; gotone = sound->next(sound))
{
- fprintf(out, "\t\t<chip");
- fprintf(out, " type=\"audio\"");
- fprintf(out, " tag=\"%s\"", xml_normalize_string(sound->devconfig().tag()));
- fprintf(out, " name=\"%s\"", xml_normalize_string(sound->devconfig().name()));
+ fprintf(m_output, "\t\t<chip");
+ fprintf(m_output, " type=\"audio\"");
+ fprintf(m_output, " tag=\"%s\"", xml_normalize_string(sound->devconfig().tag()));
+ fprintf(m_output, " name=\"%s\"", xml_normalize_string(sound->devconfig().name()));
if (sound->devconfig().clock() != 0)
- fprintf(out, " clock=\"%d\"", sound->devconfig().clock());
- fprintf(out, "/>\n");
+ fprintf(m_output, " clock=\"%d\"", sound->devconfig().clock());
+ fprintf(m_output, "/>\n");
}
}
-/*-------------------------------------------------
- print_game_display - print a list of all the
- displays
--------------------------------------------------*/
+//-------------------------------------------------
+// output_display - print a list of all the
+// displays
+//-------------------------------------------------
-static void print_game_display(FILE *out, const game_driver *game, const machine_config &config)
+void info_xml_creator::output_display()
{
- const screen_device_config *devconfig;
-
- /* iterate over screens */
- for (devconfig = config.first_screen(); devconfig != NULL; devconfig = devconfig->next_screen())
+ // iterate over screens
+ for (const screen_device_config *devconfig = m_drivlist.config().first_screen(); devconfig != NULL; devconfig = devconfig->next_screen())
{
- fprintf(out, "\t\t<display");
+ fprintf(m_output, "\t\t<display");
switch (devconfig->screen_type())
{
- case SCREEN_TYPE_RASTER: fprintf(out, " type=\"raster\""); break;
- case SCREEN_TYPE_VECTOR: fprintf(out, " type=\"vector\""); break;
- case SCREEN_TYPE_LCD: fprintf(out, " type=\"lcd\""); break;
- default: fprintf(out, " type=\"unknown\""); break;
+ case SCREEN_TYPE_RASTER: fprintf(m_output, " type=\"raster\""); break;
+ case SCREEN_TYPE_VECTOR: fprintf(m_output, " type=\"vector\""); break;
+ case SCREEN_TYPE_LCD: fprintf(m_output, " type=\"lcd\""); break;
+ default: fprintf(m_output, " type=\"unknown\""); break;
}
- /* output the orientation as a string */
- switch (game->flags & ORIENTATION_MASK)
+ // output the orientation as a string
+ switch (m_drivlist.driver().flags & ORIENTATION_MASK)
{
case ORIENTATION_FLIP_X:
- fprintf(out, " rotate=\"0\" flipx=\"yes\"");
+ fprintf(m_output, " rotate=\"0\" flipx=\"yes\"");
break;
case ORIENTATION_FLIP_Y:
- fprintf(out, " rotate=\"180\" flipx=\"yes\"");
+ fprintf(m_output, " rotate=\"180\" flipx=\"yes\"");
break;
case ORIENTATION_FLIP_X|ORIENTATION_FLIP_Y:
- fprintf(out, " rotate=\"180\"");
+ fprintf(m_output, " rotate=\"180\"");
break;
case ORIENTATION_SWAP_XY:
- fprintf(out, " rotate=\"90\" flipx=\"yes\"");
+ fprintf(m_output, " rotate=\"90\" flipx=\"yes\"");
break;
case ORIENTATION_SWAP_XY|ORIENTATION_FLIP_X:
- fprintf(out, " rotate=\"90\"");
+ fprintf(m_output, " rotate=\"90\"");
break;
case ORIENTATION_SWAP_XY|ORIENTATION_FLIP_Y:
- fprintf(out, " rotate=\"270\"");
+ fprintf(m_output, " rotate=\"270\"");
break;
case ORIENTATION_SWAP_XY|ORIENTATION_FLIP_X|ORIENTATION_FLIP_Y:
- fprintf(out, " rotate=\"270\" flipx=\"yes\"");
+ fprintf(m_output, " rotate=\"270\" flipx=\"yes\"");
break;
default:
- fprintf(out, " rotate=\"0\"");
+ fprintf(m_output, " rotate=\"0\"");
break;
}
- /* output width and height only for games that are not vector */
+ // output width and height only for games that are not vector
if (devconfig->screen_type() != SCREEN_TYPE_VECTOR)
{
const rectangle &visarea = devconfig->visible_area();
- int dx = visarea.max_x - visarea.min_x + 1;
- int dy = visarea.max_y - visarea.min_y + 1;
-
- fprintf(out, " width=\"%d\"", dx);
- fprintf(out, " height=\"%d\"", dy);
+ fprintf(m_output, " width=\"%d\"", visarea.max_x - visarea.min_x + 1);
+ fprintf(m_output, " height=\"%d\"", visarea.max_y - visarea.min_y + 1);
}
- /* output refresh rate */
- fprintf(out, " refresh=\"%f\"", ATTOSECONDS_TO_HZ(devconfig->refresh()));
+ // output refresh rate
+ fprintf(m_output, " refresh=\"%f\"", ATTOSECONDS_TO_HZ(devconfig->refresh()));
- /* output raw video parameters only for games that are not vector */
- /* and had raw parameters specified */
+ // output raw video parameters only for games that are not vector
+ // and had raw parameters specified
if (devconfig->screen_type() != SCREEN_TYPE_VECTOR && !devconfig->oldstyle_vblank_supplied())
{
int pixclock = devconfig->width() * devconfig->height() * ATTOSECONDS_TO_HZ(devconfig->refresh());
- fprintf(out, " pixclock=\"%d\"", pixclock);
- fprintf(out, " htotal=\"%d\"", devconfig->width());
- fprintf(out, " hbend=\"%d\"", devconfig->visible_area().min_x);
- fprintf(out, " hbstart=\"%d\"", devconfig->visible_area().max_x+1);
- fprintf(out, " vtotal=\"%d\"", devconfig->height());
- fprintf(out, " vbend=\"%d\"", devconfig->visible_area().min_y);
- fprintf(out, " vbstart=\"%d\"", devconfig->visible_area().max_y+1);
+ fprintf(m_output, " pixclock=\"%d\"", pixclock);
+ fprintf(m_output, " htotal=\"%d\"", devconfig->width());
+ fprintf(m_output, " hbend=\"%d\"", devconfig->visible_area().min_x);
+ fprintf(m_output, " hbstart=\"%d\"", devconfig->visible_area().max_x+1);
+ fprintf(m_output, " vtotal=\"%d\"", devconfig->height());
+ fprintf(m_output, " vbend=\"%d\"", devconfig->visible_area().min_y);
+ fprintf(m_output, " vbstart=\"%d\"", devconfig->visible_area().max_y+1);
}
- fprintf(out, " />\n");
+ fprintf(m_output, " />\n");
}
}
-/*-------------------------------------------------
- print_game_sound - print a list of all the
- displays
--------------------------------------------------*/
+//-------------------------------------------------
+// output_sound - print a list of all the
+// displays
+//------------------------------------------------
-static void print_game_sound(FILE *out, const game_driver *game, const machine_config &config)
+void info_xml_creator::output_sound()
{
- int speakers = config.m_devicelist.count(SPEAKER);
+ int speakers = m_drivlist.config().m_devicelist.count(SPEAKER);
- /* if we have no sound, zero out the speaker count */
+ // if we have no sound, zero m_output the speaker count
const device_config_sound_interface *sound = NULL;
- if (!config.m_devicelist.first(sound))
+ if (!m_drivlist.config().m_devicelist.first(sound))
speakers = 0;
- fprintf(out, "\t\t<sound channels=\"%d\"/>\n", speakers);
+ fprintf(m_output, "\t\t<sound channels=\"%d\"/>\n", speakers);
}
-/*-------------------------------------------------
- print_game_driver - print driver status
--------------------------------------------------*/
+//-------------------------------------------------
+// output_input - print a summary of a game's
+// input
+//-------------------------------------------------
-static void print_game_driver(FILE *out, const game_driver *game, const machine_config &config)
+void info_xml_creator::output_input(const ioport_list &portlist)
{
- fprintf(out, "\t\t<driver");
+ // enumerated list of control types
+ enum
+ {
+ ANALOG_TYPE_JOYSTICK,
+ ANALOG_TYPE_DIAL,
+ ANALOG_TYPE_TRACKBALL,
+ ANALOG_TYPE_PADDLE,
+ ANALOG_TYPE_LIGHTGUN,
+ ANALOG_TYPE_PEDAL,
+ ANALOG_TYPE_COUNT
+ };
+
+ // directions
+ const UINT8 DIR_LEFTRIGHT = 0x01;
+ const UINT8 DIR_UPDOWN = 0x02;
+ const UINT8 DIR_4WAY = 0x04;
+ const UINT8 DIR_DUAL = 0x08;
+
+ // initialize the list of control types
+ struct
+ {
+ const char * type; /* general type of input */
+ bool analog;
+ bool keyb;
+ INT32 min; /* analog minimum value */
+ INT32 max; /* analog maximum value */
+ INT32 sensitivity; /* default analog sensitivity */
+ INT32 keydelta; /* default analog keydelta */
+ bool reverse; /* default analog reverse setting */
+ } control_info[ANALOG_TYPE_COUNT];
+
+ memset(&control_info, 0, sizeof(control_info));
+
+ // tracking info as we iterate
+ int nplayer = 0;
+ int nbutton = 0;
+ int ncoin = 0;
+ UINT8 joytype = 0;
+ bool service = false;
+ bool tilt = false;
+ bool keypad = false;
+ bool keyboard = false;
+
+ // iterate over the ports
+ for (const input_port_config *port = portlist.first(); port != NULL; port = port->next())
+ for (const input_field_config *field = port->fieldlist; field != NULL; field = field->next)
+ {
+ int analogtype = -1;
+
+ // track the highest player number
+ if (nplayer < field->player + 1)
+ nplayer = field->player + 1;
+
+ // switch off of the type
+ switch (field->type)
+ {
+ // map which joystick directions are present
+ case IPT_JOYSTICKRIGHT_LEFT:
+ case IPT_JOYSTICKRIGHT_RIGHT:
+ case IPT_JOYSTICKLEFT_LEFT:
+ case IPT_JOYSTICKLEFT_RIGHT:
+ joytype |= DIR_DUAL;
+ // fall through...
+
+ case IPT_JOYSTICK_LEFT:
+ case IPT_JOYSTICK_RIGHT:
+ joytype |= DIR_LEFTRIGHT | ((field->way == 4) ? DIR_4WAY : 0);
+ break;
+
+ case IPT_JOYSTICKRIGHT_UP:
+ case IPT_JOYSTICKRIGHT_DOWN:
+ case IPT_JOYSTICKLEFT_UP:
+ case IPT_JOYSTICKLEFT_DOWN:
+ joytype |= DIR_DUAL;
+ // fall through...
+
+ case IPT_JOYSTICK_UP:
+ case IPT_JOYSTICK_DOWN:
+ joytype |= DIR_UPDOWN | ((field->way == 4) ? DIR_4WAY : 0);
+ break;
+
+ // mark as an analog input, and get analog stats after switch
+ case IPT_PADDLE:
+ control_info[analogtype = ANALOG_TYPE_PADDLE].type = "paddle";
+ break;
+
+ case IPT_DIAL:
+ control_info[analogtype = ANALOG_TYPE_DIAL].type = "dial";
+ analogtype = ANALOG_TYPE_DIAL;
+ break;
+
+ case IPT_TRACKBALL_X:
+ case IPT_TRACKBALL_Y:
+ control_info[analogtype = ANALOG_TYPE_TRACKBALL].type = "trackball";
+ analogtype = ANALOG_TYPE_TRACKBALL;
+ break;
+
+ case IPT_AD_STICK_X:
+ case IPT_AD_STICK_Y:
+ control_info[analogtype = ANALOG_TYPE_JOYSTICK].type = "stick";
+ break;
+
+ case IPT_LIGHTGUN_X:
+ case IPT_LIGHTGUN_Y:
+ control_info[analogtype = ANALOG_TYPE_LIGHTGUN].type = "lightgun";
+ break;
+
+ case IPT_PEDAL:
+ case IPT_PEDAL2:
+ case IPT_PEDAL3:
+ control_info[analogtype = ANALOG_TYPE_PEDAL].type = "pedal";
+ break;
+
+ // track maximum button index
+ case IPT_BUTTON1:
+ case IPT_BUTTON2:
+ case IPT_BUTTON3:
+ case IPT_BUTTON4:
+ case IPT_BUTTON5:
+ case IPT_BUTTON6:
+ case IPT_BUTTON7:
+ case IPT_BUTTON8:
+ case IPT_BUTTON9:
+ case IPT_BUTTON10:
+ case IPT_BUTTON11:
+ case IPT_BUTTON12:
+ case IPT_BUTTON13:
+ case IPT_BUTTON14:
+ case IPT_BUTTON15:
+ case IPT_BUTTON16:
+ nbutton = MAX(nbutton, field->type - IPT_BUTTON1 + 1);
+ break;
+
+ // track maximum coin index
+ case IPT_COIN1:
+ case IPT_COIN2:
+ case IPT_COIN3:
+ case IPT_COIN4:
+ case IPT_COIN5:
+ case IPT_COIN6:
+ case IPT_COIN7:
+ case IPT_COIN8:
+ ncoin = MAX(ncoin, field->type - IPT_COIN1 + 1);
+ break;
+
+ // track presence of these guys
+ case IPT_KEYPAD:
+ keypad = true;
+ break;
+
+ case IPT_KEYBOARD:
+ keyboard = true;
+ break;
+
+ // additional types
+ case IPT_SERVICE:
+ service = true;
+ break;
+
+ case IPT_TILT:
+ tilt = true;
+ break;
+ }
+
+ // get the analog stats
+ if (analogtype != -1)
+ {
+ if (field->min != 0)
+ control_info[analogtype].min = field->min;
+ if (field->max != 0)
+ control_info[analogtype].max = field->max;
+ if (field->sensitivity != 0)
+ control_info[analogtype].sensitivity = field->sensitivity;
+ if (field->delta != 0)
+ control_info[analogtype].keydelta = field->delta;
+ if ((field->flags & ANALOG_FLAG_REVERSE) != 0)
+ control_info[analogtype].reverse = true;
+ }
+ }
+
+ // output the basic info
+ fprintf(m_output, "\t\t<input");
+ fprintf(m_output, " players=\"%d\"", nplayer);
+ if (nbutton != 0)
+ fprintf(m_output, " buttons=\"%d\"", nbutton);
+ if (ncoin != 0)
+ fprintf(m_output, " coins=\"%d\"", ncoin);
+ if (service)
+ fprintf(m_output, " service=\"yes\"");
+ if (tilt)
+ fprintf(m_output, " tilt=\"yes\"");
+ fprintf(m_output, ">\n");
+
+ // output the joystick types
+ if (joytype != 0)
+ {
+ const char *vertical = ((joytype & DIR_LEFTRIGHT) == 0) ? "v" : "";
+ const char *doubletype = ((joytype & DIR_DUAL) != 0) ? "doublejoy" : "joy";
+ const char *way = ((joytype & DIR_LEFTRIGHT) == 0 || (joytype & DIR_UPDOWN) == 0) ? "2way" : ((joytype & DIR_4WAY) != 0) ? "4way" : "8way";
+ fprintf(m_output, "\t\t\t<control type=\"%s%s%s\"/>\n", vertical, doubletype, way);
+ }
+
+ // output analog types
+ for (int type = 0; type < ANALOG_TYPE_COUNT; type++)
+ if (control_info[type].type != NULL)
+ {
+ fprintf(m_output, "\t\t\t<control type=\"%s\"", xml_normalize_string(control_info[type].type));
+ if (control_info[type].min != 0 || control_info[type].max != 0)
+ {
+ fprintf(m_output, " minimum=\"%d\"", control_info[type].min);
+ fprintf(m_output, " maximum=\"%d\"", control_info[type].max);
+ }
+ if (control_info[type].sensitivity != 0)
+ fprintf(m_output, " sensitivity=\"%d\"", control_info[type].sensitivity);
+ if (control_info[type].keydelta != 0)
+ fprintf(m_output, " keydelta=\"%d\"", control_info[type].keydelta);
+ if (control_info[type].reverse)
+ fprintf(m_output, " reverse=\"yes\"");
+
+ fprintf(m_output, "/>\n");
+ }
+
+ // output keypad and keyboard
+ if (keypad)
+ fprintf(m_output, "\t\t\t<control type=\"keypad\"/>\n");
+ if (keyboard)
+ fprintf(m_output, "\t\t\t<control type=\"keyboard\"/>\n");
+
+ fprintf(m_output, "\t\t</input>\n");
+}
+
+
+//-------------------------------------------------
+// output_switches - print the configurations or
+// DIP switch settings
+//-------------------------------------------------
+
+void info_xml_creator::output_switches(const ioport_list &portlist, int type, const char *outertag, const char *innertag)
+{
+ // iterate looking for DIP switches
+ for (const input_port_config *port = portlist.first(); port != NULL; port = port->next())
+ for (const input_field_config *field = port->fieldlist; field != NULL; field = field->next)
+ if (field->type == type)
+ {
+ // output the switch name information
+ fprintf(m_output, "\t\t<%s name=\"%s\"", outertag, xml_normalize_string(input_field_name(field)));
+ fprintf(m_output, " tag=\"%s\"", xml_normalize_string(field->port->tag));
+ fprintf(m_output, " mask=\"%u\"", field->mask);
+ fprintf(m_output, ">\n");
+
+ // loop over settings
+ for (const input_setting_config *setting = field->settinglist; setting != NULL; setting = setting->next)
+ {
+ fprintf(m_output, "\t\t\t<%s name=\"%s\"", innertag, xml_normalize_string(setting->name));
+ fprintf(m_output, " value=\"%u\"", setting->value);
+ if (setting->value == field->defvalue)
+ fprintf(m_output, " default=\"yes\"");
+ fprintf(m_output, "/>\n");
+ }
+
+ // terminate the switch entry
+ fprintf(m_output, "\t\t</%s>\n", outertag);
+ }
+}
+
+
+//-------------------------------------------------
+// output_adjusters - print the Analog
+// Adjusters for a game
+//-------------------------------------------------
+
+void info_xml_creator::output_adjusters(const ioport_list &portlist)
+{
+ // iterate looking for Adjusters
+ for (const input_port_config *port = portlist.first(); port != NULL; port = port->next())
+ for (const input_field_config *field = port->fieldlist; field != NULL; field = field->next)
+ if (field->type == IPT_ADJUSTER)
+ fprintf(m_output, "\t\t<adjuster name=\"%s\" default=\"%d\"/>\n", xml_normalize_string(input_field_name(field)), field->defvalue);
+}
+
+
+//-------------------------------------------------
+// output_driver - print driver status
+//-------------------------------------------------
+
+void info_xml_creator::output_driver()
+{
+ fprintf(m_output, "\t\t<driver");
/* The status entry is an hint for frontend authors */
/* to select working and not working games without */
@@ -837,444 +959,210 @@ static void print_game_driver(FILE *out, const game_driver *game, const machine_
/* some minor issues, games marked as status=preliminary */
/* don't work or have major emulation problems. */
- if (game->flags & (GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION | GAME_NO_SOUND | GAME_WRONG_COLORS))
- fprintf(out, " status=\"preliminary\"");
- else if (game->flags & (GAME_IMPERFECT_COLORS | GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS))
- fprintf(out, " status=\"imperfect\"");
+ if (m_drivlist.driver().flags & (GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION | GAME_NO_SOUND | GAME_WRONG_COLORS))
+ fprintf(m_output, " status=\"preliminary\"");
+ else if (m_drivlist.driver().flags & (GAME_IMPERFECT_COLORS | GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS))
+ fprintf(m_output, " status=\"imperfect\"");
else
- fprintf(out, " status=\"good\"");
+ fprintf(m_output, " status=\"good\"");
- if (game->flags & GAME_NOT_WORKING)
- fprintf(out, " emulation=\"preliminary\"");
+ if (m_drivlist.driver().flags & GAME_NOT_WORKING)
+ fprintf(m_output, " emulation=\"preliminary\"");
else
- fprintf(out, " emulation=\"good\"");
+ fprintf(m_output, " emulation=\"good\"");
- if (game->flags & GAME_WRONG_COLORS)
- fprintf(out, " color=\"preliminary\"");
- else if (game->flags & GAME_IMPERFECT_COLORS)
- fprintf(out, " color=\"imperfect\"");
+ if (m_drivlist.driver().flags & GAME_WRONG_COLORS)
+ fprintf(m_output, " color=\"preliminary\"");
+ else if (m_drivlist.driver().flags & GAME_IMPERFECT_COLORS)
+ fprintf(m_output, " color=\"imperfect\"");
else
- fprintf(out, " color=\"good\"");
+ fprintf(m_output, " color=\"good\"");
- if (game->flags & GAME_NO_SOUND)
- fprintf(out, " sound=\"preliminary\"");
- else if (game->flags & GAME_IMPERFECT_SOUND)
- fprintf(out, " sound=\"imperfect\"");
+ if (m_drivlist.driver().flags & GAME_NO_SOUND)
+ fprintf(m_output, " sound=\"preliminary\"");
+ else if (m_drivlist.driver().flags & GAME_IMPERFECT_SOUND)
+ fprintf(m_output, " sound=\"imperfect\"");
else
- fprintf(out, " sound=\"good\"");
+ fprintf(m_output, " sound=\"good\"");
- if (game->flags & GAME_IMPERFECT_GRAPHICS)
- fprintf(out, " graphic=\"imperfect\"");
+ if (m_drivlist.driver().flags & GAME_IMPERFECT_GRAPHICS)
+ fprintf(m_output, " graphic=\"imperfect\"");
else
- fprintf(out, " graphic=\"good\"");
+ fprintf(m_output, " graphic=\"good\"");
- if (game->flags & GAME_NO_COCKTAIL)
- fprintf(out, " cocktail=\"preliminary\"");
+ if (m_drivlist.driver().flags & GAME_NO_COCKTAIL)
+ fprintf(m_output, " cocktail=\"preliminary\"");
- if (game->flags & GAME_UNEMULATED_PROTECTION)
- fprintf(out, " protection=\"preliminary\"");
+ if (m_drivlist.driver().flags & GAME_UNEMULATED_PROTECTION)
+ fprintf(m_output, " protection=\"preliminary\"");
- if (game->flags & GAME_SUPPORTS_SAVE)
- fprintf(out, " savestate=\"supported\"");
+ if (m_drivlist.driver().flags & GAME_SUPPORTS_SAVE)
+ fprintf(m_output, " savestate=\"supported\"");
else
- fprintf(out, " savestate=\"unsupported\"");
+ fprintf(m_output, " savestate=\"unsupported\"");
- fprintf(out, " palettesize=\"%d\"", config.m_total_colors);
+ fprintf(m_output, " palettesize=\"%d\"", m_drivlist.config().m_total_colors);
- fprintf(out, "/>\n");
+ fprintf(m_output, "/>\n");
}
-/*-------------------------------------------------
- print_game_categories - print the Categories
- settings for a system
--------------------------------------------------*/
-static void print_game_categories(FILE *out, const game_driver *game, const ioport_list &portlist)
-{
- const input_port_config *port;
- const input_field_config *field;
+//-------------------------------------------------
+// output_categories - print the Categories
+// settings for a system
+//-------------------------------------------------
- /* iterate looking for Categories */
- for (port = portlist.first(); port != NULL; port = port->next())
- for (field = port->fieldlist; field != NULL; field = field->next)
+void info_xml_creator::output_categories(const ioport_list &portlist)
+{
+ // iterate looking for Categories
+ for (const input_port_config *port = portlist.first(); port != NULL; port = port->next())
+ for (const input_field_config *field = port->fieldlist; field != NULL; field = field->next)
if (field->type == IPT_CATEGORY)
{
- const input_setting_config *setting;
-
- /* output the category name information */
- fprintf(out, "\t\t<category name=\"%s\">\n", xml_normalize_string(input_field_name(field)));
+ // output the category name information
+ fprintf(m_output, "\t\t<category name=\"%s\">\n", xml_normalize_string(input_field_name(field)));
- /* loop over item settings */
- for (setting = field->settinglist; setting != NULL; setting = setting->next)
+ // loop over item settings
+ for (const input_setting_config *setting = field->settinglist; setting != NULL; setting = setting->next)
{
- fprintf(out, "\t\t\t<item name=\"%s\"", xml_normalize_string(setting->name));
+ fprintf(m_output, "\t\t\t<item name=\"%s\"", xml_normalize_string(setting->name));
if (setting->value == field->defvalue)
- fprintf(out, " default=\"yes\"");
- fprintf(out, "/>\n");
+ fprintf(m_output, " default=\"yes\"");
+ fprintf(m_output, "/>\n");
}
- /* terminate the category entry */
- fprintf(out, "\t\t</category>\n");
+ // terminate the category entry
+ fprintf(m_output, "\t\t</category>\n");
}
}
-/*-------------------------------------------------
- print_game_images - prints out all info on
- image devices
--------------------------------------------------*/
-static void print_game_images(FILE *out, const game_driver *game, const machine_config &config)
+//-------------------------------------------------
+// output_images - prints m_output all info on
+// image devices
+//-------------------------------------------------
+
+void info_xml_creator::output_images()
{
const device_config_image_interface *dev = NULL;
- const char *name;
- const char *shortname;
-
- for (bool gotone = config.m_devicelist.first(dev); gotone; gotone = dev->next(dev))
+ for (bool gotone = m_drivlist.config().m_devicelist.first(dev); gotone; gotone = dev->next(dev))
{
- /* print out device type */
- fprintf(out, "\t\t<device type=\"%s\"", xml_normalize_string(dev->image_type_name()));
+ // print m_output device type
+ fprintf(m_output, "\t\t<device type=\"%s\"", xml_normalize_string(dev->image_type_name()));
- /* does this device have a tag? */
+ // does this device have a tag?
if (dev->devconfig().tag())
- fprintf(out, " tag=\"%s\"", xml_normalize_string(dev->devconfig().tag()));
+ fprintf(m_output, " tag=\"%s\"", xml_normalize_string(dev->devconfig().tag()));
- /* is this device mandatory? */
+ // is this device mandatory?
if (dev->must_be_loaded())
- fprintf(out, " mandatory=\"1\"");
+ fprintf(m_output, " mandatory=\"1\"");
- if (dev->image_interface()[0] )
- fprintf(out, " interface=\"%s\"", xml_normalize_string(dev->image_interface()));
+ if (dev->image_interface()[0])
+ fprintf(m_output, " interface=\"%s\"", xml_normalize_string(dev->image_interface()));
- /* close the XML tag */
- fprintf(out, ">\n");
+ // close the XML tag
+ fprintf(m_output, ">\n");
- name = dev->instance_name();
- shortname = dev->brief_instance_name();
+ const char *name = dev->instance_name();
+ const char *shortname = dev->brief_instance_name();
- fprintf(out, "\t\t\t<instance");
- fprintf(out, " name=\"%s\"", xml_normalize_string(name));
- fprintf(out, " briefname=\"%s\"", xml_normalize_string(shortname));
- fprintf(out, "/>\n");
+ fprintf(m_output, "\t\t\t<instance");
+ fprintf(m_output, " name=\"%s\"", xml_normalize_string(name));
+ fprintf(m_output, " briefname=\"%s\"", xml_normalize_string(shortname));
+ fprintf(m_output, "/>\n");
astring extensions(dev->file_extensions());
- char *ext = strtok((char*)extensions.cstr(),",");
+ char *ext = strtok((char *)extensions.cstr(), ",");
while (ext != NULL)
{
- fprintf(out, "\t\t\t<extension");
- fprintf(out, " name=\"%s\"", xml_normalize_string(ext));
- fprintf(out, "/>\n");
- ext = strtok (NULL, ",");
+ fprintf(m_output, "\t\t\t<extension");
+ fprintf(m_output, " name=\"%s\"", xml_normalize_string(ext));
+ fprintf(m_output, "/>\n");
+ ext = strtok(NULL, ",");
}
- fprintf(out, "\t\t</device>\n");
+ fprintf(m_output, "\t\t</device>\n");
}
}
-/*-------------------------------------------------
- print_game_software_list - print the information
- for all known software lists for this system
--------------------------------------------------*/
-static void print_game_software_list(FILE *out, const game_driver *game, const machine_config &config)
+//-------------------------------------------------
+// output_software_list - print the information
+// for all known software lists for this system
+//-------------------------------------------------
+
+void info_xml_creator::output_software_list()
{
- for (const device_config *dev = config.m_devicelist.first(SOFTWARE_LIST); dev != NULL; dev = dev->typenext())
+ for (const device_config *dev = m_drivlist.config().m_devicelist.first(SOFTWARE_LIST); dev != NULL; dev = dev->typenext())
{
software_list_config *swlist = (software_list_config *)downcast<const legacy_device_config_base *>(dev)->inline_config();
- for ( int i = 0; i < DEVINFO_STR_SWLIST_MAX - DEVINFO_STR_SWLIST_0; i++ )
- {
- if ( swlist->list_name[i] )
+ for (int i = 0; i < DEVINFO_STR_SWLIST_MAX - DEVINFO_STR_SWLIST_0; i++)
+ if (swlist->list_name[i])
{
- fprintf(out, "\t\t<softwarelist name=\"%s\" ", swlist->list_name[i] );
- fprintf(out, "status=\"%s\" />\n", (swlist->list_type == SOFTWARE_LIST_ORIGINAL_SYSTEM) ? "original" : "compatible" );
+ fprintf(m_output, "\t\t<softwarelist name=\"%s\" ", swlist->list_name[i]);
+ fprintf(m_output, "status=\"%s\" />\n", (swlist->list_type == SOFTWARE_LIST_ORIGINAL_SYSTEM) ? "original" : "compatible");
}
- }
}
}
-/* device iteration helpers */
-#define ram_first(config) (config).m_devicelist.first(RAM)
-#define ram_next(previous) ((previous)->typenext())
-/*-------------------------------------------------
- print_game_ramoptions - prints out all RAM
- options for this system
--------------------------------------------------*/
-static void print_game_ramoptions(FILE *out, const game_driver *game, const machine_config &config)
-{
- const device_config *device;
- for (device = ram_first(config); device != NULL; device = ram_next(device))
+//-------------------------------------------------
+// output_ramoptions - prints m_output all RAM
+// options for this system
+//-------------------------------------------------
+
+void info_xml_creator::output_ramoptions()
+{
+ for (const device_config *device = m_drivlist.config().m_devicelist.first(RAM); device != NULL; device = device->typenext())
{
ram_config *ram = (ram_config *)downcast<const legacy_device_config_base *>(device)->inline_config();
- fprintf(out, "\t\t<ramoption default=\"1\">%u</ramoption>\n", ram_parse_string(ram->default_size));
+ fprintf(m_output, "\t\t<ramoption default=\"1\">%u</ramoption>\n", ram_parse_string(ram->default_size));
+
if (ram->extra_options != NULL)
{
- int j;
- int size = strlen(ram->extra_options);
- char * const s = mame_strdup(ram->extra_options);
- char * const e = s + size;
- char *p = s;
- for (j=0;j<size;j++) {
- if (p[j]==',') p[j]=0;
- }
- /* try to parse each option */
- while(p <= e)
+ astring options(ram->extra_options);
+ for (int start, end = options.chr(0, ','); ; start = end + 1, end = options.chr(start, ','))
{
- fprintf(out, "\t\t<ramoption>%u</ramoption>\n", ram_parse_string(p));
- p += strlen(p);
- if (p == e)
+ astring option;
+ option.cpysubstr(options, start, (end == -1) ? -1 : end - start);
+ fprintf(m_output, "\t\t<ramoption>%u</ramoption>\n", ram_parse_string(option));
+ if (end == -1)
break;
- p += 1;
}
-
- osd_free(s);
}
}
}
-/*-------------------------------------------------
- print_game_info - print the XML information
- for one particular game driver
--------------------------------------------------*/
-
-static void print_game_info(FILE *out, const game_driver *game, emu_options &options)
-{
- const game_driver *clone_of;
- machine_config config(*game, options);
- ioport_list portlist;
- const char *start;
-
- /* no action if not a game */
- if (game->flags & GAME_NO_STANDALONE)
- return;
- /* start tracking resources and allocate the machine and input configs */
- input_port_list_init(portlist, game->ipt, NULL, 0, FALSE, NULL);
- for (device_config *cfg = config.m_devicelist.first(); cfg != NULL; cfg = cfg->next())
- {
- if (cfg->input_ports() != NULL)
- input_port_list_init(portlist, cfg->input_ports(), NULL, 0, FALSE, cfg);
- }
-
- /* print the header and the game name */
- fprintf(out, "\t<" XML_TOP);
- fprintf(out, " name=\"%s\"", xml_normalize_string(game->name) );
+//-------------------------------------------------
+// get_merge_name - get the rom name from a
+// parent set
+//-------------------------------------------------
- /* strip away any path information from the source_file and output it */
- start = strrchr(game->source_file, '/');
- if (start == NULL)
- start = strrchr(game->source_file, '\\');
- if (start == NULL)
- start = game->source_file - 1;
- fprintf(out, " sourcefile=\"%s\"", xml_normalize_string(start + 1));
-
- /* append bios and runnable flags */
- if (game->flags & GAME_IS_BIOS_ROOT)
- fprintf(out, " isbios=\"yes\"");
- if (game->flags & GAME_NO_STANDALONE)
- fprintf(out, " runnable=\"no\"");
- if (game->flags & GAME_MECHANICAL)
- fprintf(out, " ismechanical=\"yes\"");
-
- /* display clone information */
- clone_of = driver_get_clone(game);
- if (clone_of != NULL && !(clone_of->flags & GAME_IS_BIOS_ROOT))
- fprintf(out, " cloneof=\"%s\"", xml_normalize_string(clone_of->name));
- if (clone_of != NULL)
- fprintf(out, " romof=\"%s\"", xml_normalize_string(clone_of->name));
-
- /* display sample information and close the game tag */
- print_game_sampleof(out, game, config);
- fprintf(out, ">\n");
-
- /* output game description */
- if (game->description != NULL)
- fprintf(out, "\t\t<description>%s</description>\n", xml_normalize_string(game->description));
-
- /* print the year only if is a number or another allowed character (? or +) */
- if (game->year != NULL && strspn(game->year, "0123456789?+") == strlen(game->year))
- fprintf(out, "\t\t<year>%s</year>\n", xml_normalize_string(game->year));
-
- /* print the manufacturer information */
- if (game->manufacturer != NULL)
- fprintf(out, "\t\t<manufacturer>%s</manufacturer>\n", xml_normalize_string(game->manufacturer));
-
- /* now print various additional information */
- print_game_bios(out, game);
- print_game_rom(out, game, config);
- print_game_sample(out, game, config);
- print_game_chips(out, game, config);
- print_game_display(out, game, config);
- print_game_sound(out, game, config);
- print_game_input(out, game, portlist);
- print_game_switches(out, game, portlist);
- print_game_configs(out, game, portlist);
- print_game_categories(out, game, portlist);
- print_game_adjusters(out, game, portlist);
- print_game_driver(out, game, config);
- print_game_images( out, game, config );
- print_game_software_list( out, game, config );
- print_game_ramoptions( out, game, config );
- /* close the topmost tag */
- fprintf(out, "\t</" XML_TOP ">\n");
-}
-
-
-/*-------------------------------------------------
- print_mame_xml - print the XML information
- for all known games
--------------------------------------------------*/
-
-void print_mame_xml(FILE *out, const game_driver *const games[], const char *gamename, emu_options &options)
+const char *info_xml_creator::get_merge_name(const hash_collection &romhashes)
{
- int drvnum;
-
- fprintf(out,
- "<?xml version=\"1.0\"?>\n"
- "<!DOCTYPE " XML_ROOT " [\n"
- "<!ELEMENT " XML_ROOT " (" XML_TOP "+)>\n"
- "\t<!ATTLIST " XML_ROOT " build CDATA #IMPLIED>\n"
- "\t<!ATTLIST " XML_ROOT " debug (yes|no) \"no\">\n"
- "\t<!ATTLIST " XML_ROOT " mameconfig CDATA #REQUIRED>\n"
- "\t<!ELEMENT " XML_TOP " (description, year?, manufacturer, biosset*, rom*, disk*, sample*, chip*, display*, sound?, input?, dipswitch*, configuration*, category*, adjuster*, driver?, device*, softwarelist*, ramoption*)>\n"
- "\t\t<!ATTLIST " XML_TOP " name CDATA #REQUIRED>\n"
- "\t\t<!ATTLIST " XML_TOP " sourcefile CDATA #IMPLIED>\n"
- "\t\t<!ATTLIST " XML_TOP " isbios (yes|no) \"no\">\n"
- "\t\t<!ATTLIST " XML_TOP " ismechanical (yes|no) \"no\">\n"
- "\t\t<!ATTLIST " XML_TOP " runnable (yes|no) \"yes\">\n"
- "\t\t<!ATTLIST " XML_TOP " cloneof CDATA #IMPLIED>\n"
- "\t\t<!ATTLIST " XML_TOP " romof CDATA #IMPLIED>\n"
- "\t\t<!ATTLIST " XML_TOP " sampleof CDATA #IMPLIED>\n"
- "\t\t<!ELEMENT description (#PCDATA)>\n"
- "\t\t<!ELEMENT year (#PCDATA)>\n"
- "\t\t<!ELEMENT manufacturer (#PCDATA)>\n"
- "\t\t<!ELEMENT biosset EMPTY>\n"
- "\t\t\t<!ATTLIST biosset name CDATA #REQUIRED>\n"
- "\t\t\t<!ATTLIST biosset description CDATA #REQUIRED>\n"
- "\t\t\t<!ATTLIST biosset default (yes|no) \"no\">\n"
- "\t\t<!ELEMENT rom EMPTY>\n"
- "\t\t\t<!ATTLIST rom name CDATA #REQUIRED>\n"
- "\t\t\t<!ATTLIST rom bios CDATA #IMPLIED>\n"
- "\t\t\t<!ATTLIST rom size CDATA #REQUIRED>\n"
- "\t\t\t<!ATTLIST rom crc CDATA #IMPLIED>\n"
- "\t\t\t<!ATTLIST rom md5 CDATA #IMPLIED>\n"
- "\t\t\t<!ATTLIST rom sha1 CDATA #IMPLIED>\n"
- "\t\t\t<!ATTLIST rom merge CDATA #IMPLIED>\n"
- "\t\t\t<!ATTLIST rom region CDATA #IMPLIED>\n"
- "\t\t\t<!ATTLIST rom offset CDATA #IMPLIED>\n"
- "\t\t\t<!ATTLIST rom status (baddump|nodump|good) \"good\">\n"
- "\t\t\t<!ATTLIST rom optional (yes|no) \"no\">\n"
- "\t\t<!ELEMENT disk EMPTY>\n"
- "\t\t\t<!ATTLIST disk name CDATA #REQUIRED>\n"
- "\t\t\t<!ATTLIST disk md5 CDATA #IMPLIED>\n"
- "\t\t\t<!ATTLIST disk sha1 CDATA #IMPLIED>\n"
- "\t\t\t<!ATTLIST disk merge CDATA #IMPLIED>\n"
- "\t\t\t<!ATTLIST disk region CDATA #IMPLIED>\n"
- "\t\t\t<!ATTLIST disk index CDATA #IMPLIED>\n"
- "\t\t\t<!ATTLIST disk status (baddump|nodump|good) \"good\">\n"
- "\t\t\t<!ATTLIST disk optional (yes|no) \"no\">\n"
- "\t\t<!ELEMENT sample EMPTY>\n"
- "\t\t\t<!ATTLIST sample name CDATA #REQUIRED>\n"
- "\t\t<!ELEMENT chip EMPTY>\n"
- "\t\t\t<!ATTLIST chip name CDATA #REQUIRED>\n"
- "\t\t\t<!ATTLIST chip tag CDATA #IMPLIED>\n"
- "\t\t\t<!ATTLIST chip type (cpu|audio) #REQUIRED>\n"
- "\t\t\t<!ATTLIST chip clock CDATA #IMPLIED>\n"
- "\t\t<!ELEMENT display EMPTY>\n"
- "\t\t\t<!ATTLIST display type (raster|vector|lcd|unknown) #REQUIRED>\n"
- "\t\t\t<!ATTLIST display rotate (0|90|180|270) #REQUIRED>\n"
- "\t\t\t<!ATTLIST display flipx (yes|no) \"no\">\n"
- "\t\t\t<!ATTLIST display width CDATA #IMPLIED>\n"
- "\t\t\t<!ATTLIST display height CDATA #IMPLIED>\n"
- "\t\t\t<!ATTLIST display refresh CDATA #REQUIRED>\n"
- "\t\t\t<!ATTLIST display pixclock CDATA #IMPLIED>\n"
- "\t\t\t<!ATTLIST display htotal CDATA #IMPLIED>\n"
- "\t\t\t<!ATTLIST display hbend CDATA #IMPLIED>\n"
- "\t\t\t<!ATTLIST display hbstart CDATA #IMPLIED>\n"
- "\t\t\t<!ATTLIST display vtotal CDATA #IMPLIED>\n"
- "\t\t\t<!ATTLIST display vbend CDATA #IMPLIED>\n"
- "\t\t\t<!ATTLIST display vbstart CDATA #IMPLIED>\n"
- "\t\t<!ELEMENT sound EMPTY>\n"
- "\t\t\t<!ATTLIST sound channels CDATA #REQUIRED>\n"
- "\t\t<!ELEMENT input (control*)>\n"
- "\t\t\t<!ATTLIST input service (yes|no) \"no\">\n"
- "\t\t\t<!ATTLIST input tilt (yes|no) \"no\">\n"
- "\t\t\t<!ATTLIST input players CDATA #REQUIRED>\n"
- "\t\t\t<!ATTLIST input buttons CDATA #IMPLIED>\n"
- "\t\t\t<!ATTLIST input coins CDATA #IMPLIED>\n"
- "\t\t\t<!ELEMENT control EMPTY>\n"
- "\t\t\t\t<!ATTLIST control type CDATA #REQUIRED>\n"
- "\t\t\t\t<!ATTLIST control minimum CDATA #IMPLIED>\n"
- "\t\t\t\t<!ATTLIST control maximum CDATA #IMPLIED>\n"
- "\t\t\t\t<!ATTLIST control sensitivity CDATA #IMPLIED>\n"
- "\t\t\t\t<!ATTLIST control keydelta CDATA #IMPLIED>\n"
- "\t\t\t\t<!ATTLIST control reverse (yes|no) \"no\">\n"
- "\t\t<!ELEMENT dipswitch (dipvalue*)>\n"
- "\t\t\t<!ATTLIST dipswitch name CDATA #REQUIRED>\n"
- "\t\t\t<!ATTLIST dipswitch tag CDATA #REQUIRED>\n"
- "\t\t\t<!ATTLIST dipswitch mask CDATA #REQUIRED>\n"
- "\t\t\t<!ELEMENT dipvalue EMPTY>\n"
- "\t\t\t\t<!ATTLIST dipvalue name CDATA #REQUIRED>\n"
- "\t\t\t\t<!ATTLIST dipvalue value CDATA #REQUIRED>\n"
- "\t\t\t\t<!ATTLIST dipvalue default (yes|no) \"no\">\n"
- "\t\t<!ELEMENT configuration (confsetting*)>\n"
- "\t\t\t<!ATTLIST configuration name CDATA #REQUIRED>\n"
- "\t\t\t<!ATTLIST configuration tag CDATA #REQUIRED>\n"
- "\t\t\t<!ATTLIST configuration mask CDATA #REQUIRED>\n"
- "\t\t\t<!ELEMENT confsetting EMPTY>\n"
- "\t\t\t\t<!ATTLIST confsetting name CDATA #REQUIRED>\n"
- "\t\t\t\t<!ATTLIST confsetting value CDATA #REQUIRED>\n"
- "\t\t\t\t<!ATTLIST confsetting default (yes|no) \"no\">\n"
- "\t\t<!ELEMENT category (item*)>\n"
- "\t\t\t<!ATTLIST category name CDATA #REQUIRED>\n"
- "\t\t\t<!ELEMENT item EMPTY>\n"
- "\t\t\t\t<!ATTLIST item name CDATA #REQUIRED>\n"
- "\t\t\t\t<!ATTLIST item default (yes|no) \"no\">\n"
- "\t\t<!ELEMENT adjuster EMPTY>\n"
- "\t\t\t<!ATTLIST adjuster name CDATA #REQUIRED>\n"
- "\t\t\t<!ATTLIST adjuster default CDATA #REQUIRED>\n"
- "\t\t<!ELEMENT driver EMPTY>\n"
- "\t\t\t<!ATTLIST driver status (good|imperfect|preliminary) #REQUIRED>\n"
- "\t\t\t<!ATTLIST driver emulation (good|imperfect|preliminary) #REQUIRED>\n"
- "\t\t\t<!ATTLIST driver color (good|imperfect|preliminary) #REQUIRED>\n"
- "\t\t\t<!ATTLIST driver sound (good|imperfect|preliminary) #REQUIRED>\n"
- "\t\t\t<!ATTLIST driver graphic (good|imperfect|preliminary) #REQUIRED>\n"
- "\t\t\t<!ATTLIST driver cocktail (good|imperfect|preliminary) #IMPLIED>\n"
- "\t\t\t<!ATTLIST driver protection (good|imperfect|preliminary) #IMPLIED>\n"
- "\t\t\t<!ATTLIST driver savestate (supported|unsupported) #REQUIRED>\n"
- "\t\t\t<!ATTLIST driver palettesize CDATA #REQUIRED>\n"
- "\t\t<!ELEMENT device (instance*, extension*)>\n"
- "\t\t\t<!ATTLIST device type CDATA #REQUIRED>\n"
- "\t\t\t<!ATTLIST device tag CDATA #IMPLIED>\n"
- "\t\t\t<!ATTLIST device mandatory CDATA #IMPLIED>\n"
- "\t\t\t<!ATTLIST device interface CDATA #IMPLIED>\n"
- "\t\t\t<!ELEMENT instance EMPTY>\n"
- "\t\t\t\t<!ATTLIST instance name CDATA #REQUIRED>\n"
- "\t\t\t\t<!ATTLIST instance briefname CDATA #REQUIRED>\n"
- "\t\t\t<!ELEMENT extension EMPTY>\n"
- "\t\t\t\t<!ATTLIST extension name CDATA #REQUIRED>\n"
- "\t\t<!ELEMENT softwarelist EMPTY>\n"
- "\t\t\t<!ATTLIST softwarelist name CDATA #REQUIRED>\n"
- "\t\t\t<!ATTLIST softwarelist status (original|compatible) #REQUIRED>\n"
- "\t\t<!ELEMENT ramoption (#PCDATA)>\n"
- "\t\t\t<!ATTLIST ramoption default CDATA #IMPLIED>\n"
- "]>\n\n"
- "<" XML_ROOT " build=\"%s\" debug=\""
-#ifdef MAME_DEBUG
- "yes"
-#else
- "no"
-#endif
- "\" mameconfig=\"%d\">\n",
- xml_normalize_string(build_version),
- CONFIG_VERSION
- );
-
- for (drvnum = 0; games[drvnum] != NULL; drvnum++)
- if (mame_strwildcmp(gamename, games[drvnum]->name) == 0)
- print_game_info(out, games[drvnum], options);
+ const char *merge_name = NULL;
+
+ // walk the parent chain
+ for (int clone_of = m_drivlist.find(m_drivlist.driver().parent); clone_of != -1; clone_of = m_drivlist.find(m_drivlist.driver(clone_of).parent))
+
+ // look in the parent's ROMs
+ for (const rom_source *psource = rom_first_source(m_drivlist.config(clone_of)); psource != NULL; psource = rom_next_source(*psource))
+ for (const rom_entry *pregion = rom_first_region(*psource); pregion != NULL; pregion = rom_next_region(pregion))
+ for (const rom_entry *prom = rom_first_file(pregion); prom != NULL; prom = rom_next_file(prom))
+ {
+ hash_collection phashes(ROM_GETHASHDATA(prom));
+ if (!phashes.flag(hash_collection::FLAG_NO_DUMP) && romhashes == phashes)
+ {
+ // stop when we find a match
+ merge_name = ROM_GETNAME(prom);
+ break;
+ }
+ }
- fprintf(out, "</" XML_ROOT ">\n");
+ return merge_name;
}
diff --git a/src/emu/info.h b/src/emu/info.h
index 327354e2d6f..5fd260d05bf 100644
--- a/src/emu/info.h
+++ b/src/emu/info.h
@@ -4,8 +4,36 @@
Dumps the MAME internal data as an XML file.
- Copyright Nicola Salmoria and the MAME Team.
- Visit http://mamedev.org for licensing and usage restrictions.
+****************************************************************************
+
+ Copyright Aaron Giles
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name 'MAME' nor the names of its contributors may be
+ used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
***************************************************************************/
@@ -15,12 +43,47 @@
#define __INFO_H__
-/***************************************************************************
- FUNCTION PROTOTYPES
-***************************************************************************/
+//**************************************************************************
+// FUNCTION PROTOTYPES
+//**************************************************************************
+
+// helper class to putput
+class info_xml_creator
+{
+public:
+ // construction/destruction
+ info_xml_creator(driver_enumerator &drivlist);
+
+ // output
+ void output(FILE *out);
+
+private:
+ // internal helper
+ void output_one();
+ void output_sampleof();
+ void output_bios();
+ void output_rom();
+ void output_sample();
+ void output_chips();
+ void output_display();
+ void output_sound();
+ void output_input(const ioport_list &portlist);
+ void output_switches(const ioport_list &portlist, int type, const char *outertag, const char *innertag);
+ void output_adjusters(const ioport_list &portlist);
+ void output_categories(const ioport_list &portlist);
+ void output_driver();
+ void output_images();
+ void output_software_list();
+ void output_ramoptions();
+
+ const char *get_merge_name(const hash_collection &romhashes);
+
+ // internal state
+ FILE * m_output;
+ driver_enumerator & m_drivlist;
-/* print the MAME database in XML format */
-void print_mame_xml(FILE* out, const game_driver* const games[], const char *gamename, emu_options &options);
+ static const char s_dtd_string[];
+};
#endif /* __INFO_H__ */
diff --git a/src/mame/layout/pinball.lay b/src/emu/layout/pinball.lay
index 0372a828ac0..0372a828ac0 100644
--- a/src/mame/layout/pinball.lay
+++ b/src/emu/layout/pinball.lay
diff --git a/src/emu/machine.c b/src/emu/machine.c
index a0ed6794f14..7707468d556 100644
--- a/src/emu/machine.c
+++ b/src/emu/machine.c
@@ -943,8 +943,17 @@ driver_device_config_base::driver_device_config_base(const machine_config &mconf
void driver_device_config_base::static_set_game(device_config *device, const game_driver *game)
{
- downcast<driver_device_config_base *>(device)->m_system = game;
- downcast<driver_device_config_base *>(device)->m_shortname = game->name;
+ driver_device_config_base *base = downcast<driver_device_config_base *>(device);
+
+ base->m_system = game;
+
+ // set the short name to the game's name
+ base->m_shortname = game->name;
+
+ // and set the search path to include all parents
+ base->m_searchpath = game->name;
+ for (int parent = driver_list::clone(*game); parent != -1; parent = driver_list::clone(parent))
+ base->m_searchpath.cat(";").cat(driver_list::driver(parent).name);
}
diff --git a/src/emu/mame.c b/src/emu/mame.c
index 65d671b32ef..ea9452ac2de 100644
--- a/src/emu/mame.c
+++ b/src/emu/mame.c
@@ -157,7 +157,7 @@ int mame_execute(emu_options &options, osd_interface &osd)
const game_driver *system = options.system();
if (system == NULL)
{
- system = &GAME_NAME(empty);
+ system = &GAME_NAME(___empty);
if (firstgame)
started_empty = true;
}
diff --git a/src/emu/render.c b/src/emu/render.c
index 654534d3a52..5ca15bd77da 100644
--- a/src/emu/render.c
+++ b/src/emu/render.c
@@ -1642,10 +1642,10 @@ void render_target::load_layout_files(const char *layoutfile, bool singlefile)
load_layout_file(NULL, m_manager.machine().config().m_default_layout);
// try to load another file based on the parent driver name
- const game_driver *cloneof = driver_get_clone(&system);
- if (cloneof != NULL)
- if (!load_layout_file(cloneof->name, cloneof->name))
- load_layout_file(cloneof->name, "default");
+ int cloneof = driver_list::clone(system);
+ if (cloneof != -1)
+ if (!load_layout_file(driver_list::driver(cloneof).name, driver_list::driver(cloneof).name))
+ load_layout_file(driver_list::driver(cloneof).name, "default");
// now do the built-in layouts for single-screen games
if (m_manager.machine().m_devicelist.count(SCREEN) == 1)
diff --git a/src/emu/rendlay.c b/src/emu/rendlay.c
index c6e03f1c1d6..c3df4c94c9c 100644
--- a/src/emu/rendlay.c
+++ b/src/emu/rendlay.c
@@ -117,6 +117,10 @@
#include "lcd.lh"
#include "lcd_rot.lh"
+// generic dummy pinball layout
+#include "pinball.lh"
+
+
//**************************************************************************
// CONSTANTS
diff --git a/src/emu/romload.c b/src/emu/romload.c
index 760cfc46ac0..46cf9c09d81 100644
--- a/src/emu/romload.c
+++ b/src/emu/romload.c
@@ -614,7 +614,6 @@ static int open_rom_file(rom_load_data *romdata, const char *regiontag, const ro
{
file_error filerr = FILERR_NOT_FOUND;
UINT32 romsize = rom_file_size(romp);
- const game_driver *drv;
/* update status display */
display_loading_rom_message(romdata, ROM_GETNAME(romp));
@@ -626,9 +625,8 @@ static int open_rom_file(rom_load_data *romdata, const char *regiontag, const ro
/* attempt reading up the chain through the parents. It automatically also
attempts any kind of load by checksum supported by the archives. */
romdata->file = NULL;
- for (drv = &romdata->machine().system(); romdata->file == NULL && drv != NULL; drv = driver_get_clone(drv))
- if (drv->name != NULL && *drv->name != 0)
- filerr = common_process_file(romdata->machine().options(), drv->name, has_crc, crc, romp, &romdata->file);
+ for (int drv = driver_list::find(romdata->machine().system()); romdata->file == NULL && drv != -1; drv = driver_list::clone(drv))
+ filerr = common_process_file(romdata->machine().options(), driver_list::driver(drv).name, has_crc, crc, romp, &romdata->file);
/* if the region is load by name, load the ROM from there */
if (romdata->file == NULL && regiontag != NULL)
@@ -1007,7 +1005,6 @@ static void process_rom_entries(rom_load_data *romdata, const char *regiontag, c
chd_error open_disk_image(emu_options &options, const game_driver *gamedrv, const rom_entry *romp, emu_file **image_file, chd_file **image_chd, const char *locationtag)
{
- const game_driver *drv, *searchdrv;
const rom_entry *region, *rom;
const rom_source *source;
file_error filerr;
@@ -1018,8 +1015,8 @@ chd_error open_disk_image(emu_options &options, const game_driver *gamedrv, cons
/* attempt to open the properly named file, scanning up through parent directories */
filerr = FILERR_NOT_FOUND;
- for (searchdrv = gamedrv; searchdrv != NULL && filerr != FILERR_NONE; searchdrv = driver_get_clone(searchdrv))
- filerr = common_process_file(options, searchdrv->name, ".chd", romp, image_file);
+ for (int searchdrv = driver_list::find(*gamedrv); searchdrv != -1 && filerr != FILERR_NONE; searchdrv = driver_list::clone(searchdrv))
+ filerr = common_process_file(options, driver_list::driver(searchdrv).name, ".chd", romp, image_file);
if (filerr != FILERR_NONE)
filerr = common_process_file(options, NULL, ".chd", romp, image_file);
@@ -1114,9 +1111,9 @@ chd_error open_disk_image(emu_options &options, const game_driver *gamedrv, cons
/* otherwise, look at our parents for a CHD with an identical checksum */
/* and try to open that */
hash_collection romphashes(ROM_GETHASHDATA(romp));
- for (drv = gamedrv; drv != NULL; drv = driver_get_clone(drv))
+ for (int drv = driver_list::find(*gamedrv); drv != -1; drv = driver_list::clone(drv))
{
- machine_config config(*drv, options);
+ machine_config config(driver_list::driver(drv), options);
for (source = rom_first_source(config); source != NULL; source = rom_next_source(*source))
for (region = rom_first_region(*source); region != NULL; region = rom_next_region(region))
if (ROMREGION_ISDISKDATA(region))
@@ -1128,8 +1125,8 @@ chd_error open_disk_image(emu_options &options, const game_driver *gamedrv, cons
{
/* attempt to open the properly named file, scanning up through parent directories */
filerr = FILERR_NOT_FOUND;
- for (searchdrv = drv; searchdrv != NULL && filerr != FILERR_NONE; searchdrv = driver_get_clone(searchdrv))
- filerr = common_process_file(options, searchdrv->name, ".chd", rom, image_file);
+ for (int searchdrv = drv; searchdrv != -1 && filerr != FILERR_NONE; searchdrv = driver_list::clone(searchdrv))
+ filerr = common_process_file(options, driver_list::driver(searchdrv).name, ".chd", rom, image_file);
if (filerr != FILERR_NONE)
filerr = common_process_file(options, NULL, ".chd", rom, image_file);
diff --git a/src/emu/sound/bsmt2000.c b/src/emu/sound/bsmt2000.c
index 6293b8b38bd..7e172fc6a98 100644
--- a/src/emu/sound/bsmt2000.c
+++ b/src/emu/sound/bsmt2000.c
@@ -107,13 +107,12 @@ ROM_END
//-------------------------------------------------
bsmt2000_device_config::bsmt2000_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock)
- : device_config(mconfig, static_alloc_device_config, "BSMT2000", tag, owner, clock),
+ : device_config(mconfig, static_alloc_device_config, "BSMT2000", "bsmt2000", tag, owner, clock),
device_config_sound_interface(mconfig, *this),
device_config_memory_interface(mconfig, *this),
m_space_config("samples", ENDIANNESS_LITTLE, 8, 32, 0, NULL, *ADDRESS_MAP_NAME(bsmt2000)),
m_ready_callback(NULL)
{
- m_shortname = "bsmt2000";
}
diff --git a/src/emu/sound/wavwrite.c b/src/emu/sound/wavwrite.c
index 1d318a08b9e..5cd884d7417 100644
--- a/src/emu/sound/wavwrite.c
+++ b/src/emu/sound/wavwrite.c
@@ -126,7 +126,7 @@ void wav_add_data_32(wav_file *wav, INT32 *data, int samples, int shift)
if (!wav) return;
/* allocate temp memory */
- temp = (INT16 *)osd_malloc(samples * sizeof(temp[0]));
+ temp = (INT16 *)osd_malloc_array(samples * sizeof(temp[0]));
if (!temp)
return;
@@ -154,7 +154,7 @@ void wav_add_data_16lr(wav_file *wav, INT16 *left, INT16 *right, int samples)
if (!wav) return;
/* allocate temp memory */
- temp = (INT16 *)osd_malloc(samples * 2 * sizeof(temp[0]));
+ temp = (INT16 *)osd_malloc_array(samples * 2 * sizeof(temp[0]));
if (!temp)
return;
@@ -179,7 +179,7 @@ void wav_add_data_32lr(wav_file *wav, INT32 *left, INT32 *right, int samples, in
if (!wav) return;
/* allocate temp memory */
- temp = (INT16 *)osd_malloc(samples * 2 * sizeof(temp[0]));
+ temp = (INT16 *)osd_malloc_array(samples * 2 * sizeof(temp[0]));
if (!temp)
return;
diff --git a/src/emu/ui.c b/src/emu/ui.c
index 61110734aca..b29ebddc89d 100644
--- a/src/emu/ui.c
+++ b/src/emu/ui.c
@@ -280,7 +280,7 @@ int ui_display_startup_screens(running_machine &machine, int first_time, int sho
/* disable everything if we are using -str for 300 or fewer seconds, or if we're the empty driver,
or if we are debugging */
- if (!first_time || (str > 0 && str < 60*5) || &machine.system() == &GAME_NAME(empty) || (machine.debug_flags & DEBUG_FLAG_ENABLED) != 0)
+ if (!first_time || (str > 0 && str < 60*5) || &machine.system() == &GAME_NAME(___empty) || (machine.debug_flags & DEBUG_FLAG_ENABLED) != 0)
show_gameinfo = show_warnings = show_disclaimer = FALSE;
/* initialize the on-screen display system */
@@ -907,8 +907,6 @@ static astring &warnings_string(running_machine &machine, astring &string)
GAME_IMPERFECT_GRAPHICS | \
GAME_NO_COCKTAIL)
- int i;
-
string.reset();
/* if no warnings, nothing to return */
@@ -955,10 +953,6 @@ static astring &warnings_string(running_machine &machine, astring &string)
/* if there's a NOT WORKING, UNEMULATED PROTECTION or GAME MECHANICAL warning, make it stronger */
if (machine.system().flags & (GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION | GAME_MECHANICAL))
{
- const game_driver *maindrv;
- const game_driver *clone_of;
- int foundworking;
-
/* add the strings for these warnings */
if (machine.system().flags & GAME_UNEMULATED_PROTECTION)
string.cat("The game has protection which isn't fully emulated.\n");
@@ -970,25 +964,25 @@ static astring &warnings_string(running_machine &machine, astring &string)
"It is not possible to fully play this " GAMENOUN ".\n");
/* find the parent of this driver */
- clone_of = driver_get_clone(&machine.system());
- if (clone_of != NULL && !(clone_of->flags & GAME_IS_BIOS_ROOT))
+ driver_enumerator drivlist(machine.options());
+ int maindrv = drivlist.find(machine.system());
+ int clone_of = drivlist.non_bios_clone(maindrv);
+ if (clone_of != -1)
maindrv = clone_of;
- else
- maindrv = &machine.system();
/* scan the driver list for any working clones and add them */
- foundworking = FALSE;
- for (i = 0; drivers[i] != NULL; i++)
- if (drivers[i] == maindrv || driver_get_clone(drivers[i]) == maindrv)
- if ((drivers[i]->flags & (GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION | GAME_MECHANICAL)) == 0)
+ bool foundworking = false;
+ while (drivlist.next())
+ if (drivlist.current() == maindrv || drivlist.clone() == maindrv)
+ if ((drivlist.driver().flags & (GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION | GAME_MECHANICAL)) == 0)
{
/* this one works, add a header and display the name of the clone */
if (!foundworking)
string.cat("\n\nThere are working clones of this game: ");
else
string.cat(", ");
- string.cat(drivers[i]->name);
- foundworking = TRUE;
+ string.cat(drivlist.driver().name);
+ foundworking = true;
}
if (foundworking)
diff --git a/src/emu/uimenu.c b/src/emu/uimenu.c
index efd14614b1b..91addf9ba55 100644
--- a/src/emu/uimenu.c
+++ b/src/emu/uimenu.c
@@ -208,7 +208,7 @@ struct _select_game_state
UINT8 error;
UINT8 rerandomize;
char search[40];
- const game_driver * matchlist[VISIBLE_GAMES_IN_LIST];
+ int matchlist[VISIBLE_GAMES_IN_LIST];
const game_driver * driverlist[1];
};
@@ -245,6 +245,9 @@ static const char priortext[] = "Return to Prior Menu";
static const char backtext[] = "Return to " CAPSTARTGAMENOUN;
static const char exittext[] = "Exit";
+// temporary hack until this is C++-ified
+static driver_enumerator *drivlist;
+
/***************************************************************************
@@ -299,7 +302,6 @@ static void menu_crosshair_populate(running_machine &machine, ui_menu *menu);
static void menu_quit_game(running_machine &machine, ui_menu *menu, void *parameter, void *state);
static void menu_select_game(running_machine &machine, ui_menu *menu, void *parameter, void *state);
static void menu_select_game_populate(running_machine &machine, ui_menu *menu, select_game_state *menustate);
-static int CLIB_DECL menu_select_game_driver_compare(const void *elem1, const void *elem2);
static void menu_select_game_build_driver_list(ui_menu *menu, select_game_state *menustate);
static void menu_select_game_custom_render(running_machine &machine, ui_menu *menu, void *state, void *selectedref, float top, float bottom, float x, float y, float x2, float y2);
@@ -3426,9 +3428,10 @@ static void menu_select_game(running_machine &machine, ui_menu *menu, void *para
/* if no state, allocate some */
if (state == NULL)
{
- state = ui_menu_alloc_state(menu, sizeof(*menustate) + sizeof(menustate->driverlist) * driver_list_get_count(drivers), NULL);
+ state = ui_menu_alloc_state(menu, sizeof(*menustate) + sizeof(menustate->driverlist) * driver_list::total(), NULL);
if (parameter != NULL)
strcpy(((select_game_state *)state)->search, (const char *)parameter);
+ ((select_game_state *)state)->matchlist[0] = -1;
}
menustate = (select_game_state *)state;
@@ -3459,24 +3462,20 @@ static void menu_select_game(running_machine &machine, ui_menu *menu, void *para
/* anything else is a driver */
else
{
- audit_record *audit;
- int audit_records;
- int audit_result;
-
- /* audit the game first to see if we're going to work */
- audit_records = audit_images(menu->machine().options(), driver, AUDIT_VALIDATE_FAST, &audit);
- audit_result = audit_summary(driver, audit_records, audit, FALSE);
- if (audit_records > 0)
- global_free(audit);
-
- /* if everything looks good, schedule the new driver */
- if (audit_result == CORRECT || audit_result == BEST_AVAILABLE)
+ // audit the game first to see if we're going to work
+ driver_enumerator enumerator(machine.options(), *driver);
+ enumerator.next();
+ media_auditor auditor(enumerator);
+ media_auditor::summary summary = auditor.audit_media(AUDIT_VALIDATE_FAST);
+
+ // if everything looks good, schedule the new driver
+ if (summary == media_auditor::CORRECT || summary == media_auditor::BEST_AVAILABLE)
{
machine.schedule_new_driver(*driver);
ui_menu_stack_reset(machine);
}
- /* otherwise, display an error */
+ // otherwise, display an error
else
{
ui_menu_reset(menu, UI_MENU_RESET_REMEMBER_REF);
@@ -3551,18 +3550,19 @@ static void menu_select_game_populate(running_machine &machine, ui_menu *menu, s
}
/* otherwise, rebuild the match list */
- if (menustate->search[0] != 0 || menustate->matchlist[0] == NULL || menustate->rerandomize)
- driver_list_get_approx_matches(menustate->driverlist, menustate->search, matchcount, menustate->matchlist);
+ assert(drivlist != NULL);
+ if (menustate->search[0] != 0 || menustate->matchlist[0] == -1 || menustate->rerandomize)
+ drivlist->find_approximate_matches(menustate->search, matchcount, menustate->matchlist);
menustate->rerandomize = FALSE;
/* iterate over entries */
for (curitem = 0; curitem < matchcount; curitem++)
{
- const game_driver *driver = menustate->matchlist[curitem];
- if (driver != NULL)
+ int curmatch = menustate->matchlist[curitem];
+ if (curmatch != -1)
{
- const game_driver *cloneof = driver_get_clone(driver);
- ui_menu_item_append(menu, driver->name, driver->description, (cloneof == NULL || (cloneof->flags & GAME_IS_BIOS_ROOT)) ? 0 : MENU_FLAG_INVERT, (void *)driver);
+ int cloneof = drivlist->non_bios_clone(curmatch);
+ ui_menu_item_append(menu, drivlist->driver(curmatch).name, drivlist->driver(curmatch).description, (cloneof == -1) ? 0 : MENU_FLAG_INVERT, (void *)&drivlist->driver(curmatch));
}
}
@@ -3579,41 +3579,17 @@ static void menu_select_game_populate(running_machine &machine, ui_menu *menu, s
/*-------------------------------------------------
- menu_select_game_driver_compare - compare the
- names of two drivers
--------------------------------------------------*/
-
-static int CLIB_DECL menu_select_game_driver_compare(const void *elem1, const void *elem2)
-{
- const game_driver **driver1_ptr = (const game_driver **)elem1;
- const game_driver **driver2_ptr = (const game_driver **)elem2;
- const char *driver1 = (*driver1_ptr)->name;
- const char *driver2 = (*driver2_ptr)->name;
-
- while (*driver1 == *driver2 && *driver1 != 0)
- driver1++, driver2++;
- return *driver1 - *driver2;
-}
-
-
-/*-------------------------------------------------
menu_select_game_build_driver_list - build a
list of available drivers
-------------------------------------------------*/
static void menu_select_game_build_driver_list(ui_menu *menu, select_game_state *menustate)
{
- int driver_count = driver_list_get_count(drivers);
- int drivnum, listnum;
- UINT8 *found;
-
- /* create a sorted copy of the main driver list */
- memcpy((void *)menustate->driverlist, drivers, driver_count * sizeof(menustate->driverlist[0]));
- qsort((void *)menustate->driverlist, driver_count, sizeof(menustate->driverlist[0]), menu_select_game_driver_compare);
-
- /* allocate a temporary array to track which ones we found */
- found = (UINT8 *)ui_menu_pool_alloc(menu, (driver_count + 7) / 8);
- memset(found, 0, (driver_count + 7) / 8);
+ // start with an empty list
+ // hack alert: use new directly here to avoid reporting this one-time static memory as unfreed
+ if (drivlist == NULL)
+ drivlist = new driver_enumerator(menu->machine().options());
+ drivlist->exclude_all();
/* open a path to the ROMs and find them in the array */
file_enumerator path(menu->machine().options().media_path());
@@ -3622,9 +3598,6 @@ static void menu_select_game_build_driver_list(ui_menu *menu, select_game_state
/* iterate while we get new objects */
while ((dir = path.next()) != NULL)
{
- game_driver tempdriver;
- game_driver *tempdriver_ptr;
- const game_driver **found_driver;
char drivername[50];
char *dst = drivername;
const char *src;
@@ -3634,23 +3607,16 @@ static void menu_select_game_build_driver_list(ui_menu *menu, select_game_state
*dst++ = tolower((UINT8)*src);
*dst = 0;
- /* find it in the array */
- tempdriver.name = drivername;
- tempdriver_ptr = &tempdriver;
- found_driver = (const game_driver **)bsearch(&tempdriver_ptr, menustate->driverlist, driver_count, sizeof(*menustate->driverlist), menu_select_game_driver_compare);
-
- /* if found, mark the corresponding entry in the array */
- if (found_driver != NULL)
- {
- int index = found_driver - menustate->driverlist;
- found[index / 8] |= 1 << (index % 8);
- }
+ int drivnum = drivlist->find(drivername);
+ if (drivnum != -1)
+ drivlist->include(drivnum);
}
/* now build the final list */
- for (drivnum = listnum = 0; drivnum < driver_count; drivnum++)
- if (found[drivnum / 8] & (1 << (drivnum % 8)))
- menustate->driverlist[listnum++] = menustate->driverlist[drivnum];
+ drivlist->reset();
+ int listnum = 0;
+ while (drivlist->next())
+ menustate->driverlist[listnum++] = &drivlist->driver();
/* NULL-terminate */
menustate->driverlist[listnum] = NULL;
diff --git a/src/emu/validity.c b/src/emu/validity.c
index e15082da3c4..2e0fbbb84d1 100644
--- a/src/emu/validity.c
+++ b/src/emu/validity.c
@@ -314,12 +314,11 @@ static bool validate_inlines(void)
information
-------------------------------------------------*/
-static bool validate_driver(const machine_config &config, game_driver_map &names, game_driver_map &descriptions)
+static bool validate_driver(driver_enumerator &drivlist, game_driver_map &names, game_driver_map &descriptions)
{
- const game_driver &driver = config.gamedrv();
- const game_driver *clone_of;
+ const game_driver &driver = drivlist.driver();
+ const machine_config &config = drivlist.config();
const char *compatible_with;
- const game_driver *other_drv;
bool error = FALSE, is_clone;
const char *s;
@@ -343,27 +342,27 @@ static bool validate_driver(const machine_config &config, game_driver_map &names
/* determine the clone */
is_clone = (strcmp(driver.parent, "0") != 0);
- clone_of = driver_get_clone(&driver);
- if (clone_of && (clone_of->flags & GAME_IS_BIOS_ROOT))
+ int clone_of = drivlist.clone(driver);
+ if (clone_of != -1 && (drivlist.driver(clone_of).flags & GAME_IS_BIOS_ROOT))
is_clone = false;
/* if we have at least 100 drivers, validate the clone */
/* (100 is arbitrary, but tries to avoid tiny.mak dependencies) */
- if (driver_list_get_count(drivers) > 100 && !clone_of && is_clone)
+ if (driver_list::total() > 100 && clone_of == -1 && is_clone)
{
mame_printf_error("%s: %s is a non-existant clone\n", driver.source_file, driver.parent);
error = true;
}
/* look for recursive cloning */
- if (clone_of == &driver)
+ if (clone_of != -1 && &drivlist.driver(clone_of) == &driver)
{
mame_printf_error("%s: %s is set as a clone of itself\n", driver.source_file, driver.name);
error = true;
}
/* look for clones that are too deep */
- if (clone_of != NULL && (clone_of = driver_get_clone(clone_of)) != NULL && (clone_of->flags & GAME_IS_BIOS_ROOT) == 0)
+ if (clone_of != -1 && (clone_of = drivlist.non_bios_clone(clone_of)) != -1)
{
mame_printf_error("%s: %s is a clone of a clone\n", driver.source_file, driver.name);
error = true;
@@ -392,23 +391,23 @@ static bool validate_driver(const machine_config &config, game_driver_map &names
compatible_with = NULL;
/* check for this driver being compatible with a non-existant driver */
- if ((compatible_with != NULL) && (driver_get_name(driver.compatible_with) == NULL))
+ if ((compatible_with != NULL) && (drivlist.find(driver.compatible_with) == -1))
{
mame_printf_error("%s: is compatible with %s, which is not in drivers[]\n", driver.name, driver.compatible_with);
error = true;
}
/* check for clone_of and compatible_with being specified at the same time */
- if ((driver_get_clone(&driver) != NULL) && (compatible_with != NULL))
+ if ((drivlist.clone(driver) != -1) && (compatible_with != NULL))
{
mame_printf_error("%s: both compatible_with and clone_of are specified\n", driver.name);
error = true;
}
/* find any recursive dependencies on the current driver */
- for (other_drv = driver_get_compatible(&driver); other_drv != NULL; other_drv = driver_get_compatible(other_drv))
+ for (int other_drv = drivlist.compatible_with(driver); other_drv != -1; other_drv = drivlist.compatible_with(other_drv))
{
- if (&driver == other_drv)
+ if (&driver == &drivlist.driver(other_drv))
{
mame_printf_error("%s: recursive compatibility\n", driver.name);
error = true;
@@ -432,9 +431,10 @@ static bool validate_driver(const machine_config &config, game_driver_map &names
validate_roms - validate ROM definitions
-------------------------------------------------*/
-static bool validate_roms(const machine_config &config, region_array *rgninfo, game_driver_map &roms)
+static bool validate_roms(driver_enumerator &drivlist, region_array *rgninfo, game_driver_map &roms)
{
- const game_driver &driver = config.gamedrv();
+ const game_driver &driver = drivlist.driver();
+ const machine_config &config = drivlist.config();
int bios_flags = 0, last_bios = 0;
const char *last_rgnname = "???";
const char *last_name = "???";
@@ -579,9 +579,10 @@ static bool validate_roms(const machine_config &config, region_array *rgninfo, g
configurations
-------------------------------------------------*/
-static bool validate_display(const machine_config &config)
+static bool validate_display(driver_enumerator &drivlist)
{
- const game_driver &driver = config.gamedrv();
+ const game_driver &driver = drivlist.driver();
+ const machine_config &config = drivlist.config();
bool palette_modes = false;
bool error = false;
@@ -605,9 +606,10 @@ static bool validate_display(const machine_config &config)
configuration
-------------------------------------------------*/
-static bool validate_gfx(const machine_config &config, region_array *rgninfo)
+static bool validate_gfx(driver_enumerator &drivlist, region_array *rgninfo)
{
- const game_driver &driver = config.gamedrv();
+ const game_driver &driver = drivlist.driver();
+ const machine_config &config = drivlist.config();
bool error = false;
int gfxnum;
@@ -939,12 +941,13 @@ static void validate_dip_settings(const input_field_config *field, const game_dr
validate_inputs - validate input configuration
-------------------------------------------------*/
-static bool validate_inputs(const machine_config &config, int_map &defstr_map, ioport_list &portlist)
+static bool validate_inputs(driver_enumerator &drivlist, int_map &defstr_map, ioport_list &portlist)
{
const input_port_config *scanport;
const input_port_config *port;
const input_field_config *field;
- const game_driver &driver = config.gamedrv();
+ const game_driver &driver = drivlist.driver();
+ const machine_config &config = drivlist.config();
int empty_string_found = FALSE;
char errorbuf[1024];
bool error = false;
@@ -1088,10 +1091,11 @@ static bool validate_inputs(const machine_config &config, int_map &defstr_map, i
checks
-------------------------------------------------*/
-static bool validate_devices(const machine_config &config, const ioport_list &portlist, region_array *rgninfo)
+static bool validate_devices(driver_enumerator &drivlist, const ioport_list &portlist, region_array *rgninfo)
{
bool error = false;
- const game_driver &driver = config.gamedrv();
+ const game_driver &driver = drivlist.driver();
+ const machine_config &config = drivlist.config();
for (const device_config *devconfig = config.m_devicelist.first(); devconfig != NULL; devconfig = devconfig->next())
{
@@ -1126,7 +1130,6 @@ static bool validate_devices(const machine_config &config, const ioport_list &po
void validate_drivers(emu_options &options, const game_driver *curdriver)
{
osd_ticks_t prep = 0;
- osd_ticks_t expansion = 0;
osd_ticks_t driver_checks = 0;
osd_ticks_t rom_checks = 0;
osd_ticks_t gfx_checks = 0;
@@ -1186,9 +1189,10 @@ void validate_drivers(emu_options &options, const game_driver *curdriver)
prep += get_profile_ticks();
/* iterate over all drivers */
- for (int drivnum = 0; drivers[drivnum]; drivnum++)
+ driver_enumerator drivlist(options);
+ while (drivlist.next())
{
- const game_driver &driver = *drivers[drivnum];
+ const game_driver &driver = drivlist.driver();
ioport_list portlist;
region_array rgninfo;
@@ -1198,39 +1202,34 @@ void validate_drivers(emu_options &options, const game_driver *curdriver)
try
{
- /* expand the machine driver */
- expansion -= get_profile_ticks();
- machine_config config(driver, options);
- expansion += get_profile_ticks();
-
/* validate the driver entry */
driver_checks -= get_profile_ticks();
- error = validate_driver(config, names, descriptions) || error;
+ error = validate_driver(drivlist, names, descriptions) || error;
driver_checks += get_profile_ticks();
/* validate the ROM information */
rom_checks -= get_profile_ticks();
- error = validate_roms(config, &rgninfo, roms) || error;
+ error = validate_roms(drivlist, &rgninfo, roms) || error;
rom_checks += get_profile_ticks();
/* validate input ports */
input_checks -= get_profile_ticks();
- error = validate_inputs(config, defstr, portlist) || error;
+ error = validate_inputs(drivlist, defstr, portlist) || error;
input_checks += get_profile_ticks();
/* validate the display */
display_checks -= get_profile_ticks();
- error = validate_display(config) || error;
+ error = validate_display(drivlist) || error;
display_checks += get_profile_ticks();
/* validate the graphics decoding */
gfx_checks -= get_profile_ticks();
- error = validate_gfx(config, &rgninfo) || error;
+ error = validate_gfx(drivlist, &rgninfo) || error;
gfx_checks += get_profile_ticks();
/* validate devices */
device_checks -= get_profile_ticks();
- error = validate_devices(config, portlist, &rgninfo) || error;
+ error = validate_devices(drivlist, portlist, &rgninfo) || error;
device_checks += get_profile_ticks();
}
catch (emu_fatalerror &err)
@@ -1241,7 +1240,6 @@ void validate_drivers(emu_options &options, const game_driver *curdriver)
#if (REPORT_TIMES)
mame_printf_info("Prep: %8dm\n", (int)(prep / 1000000));
- mame_printf_info("Expansion: %8dm\n", (int)(expansion / 1000000));
mame_printf_info("Driver: %8dm\n", (int)(driver_checks / 1000000));
mame_printf_info("ROM: %8dm\n", (int)(rom_checks / 1000000));
mame_printf_info("CPU: %8dm\n", (int)(cpu_checks / 1000000));
diff --git a/src/lib/util/astring.h b/src/lib/util/astring.h
index 86f45ba02d5..6c9deb1128a 100644
--- a/src/lib/util/astring.h
+++ b/src/lib/util/astring.h
@@ -318,6 +318,7 @@ public:
astring(const char *str1, const char *str2, const char *str3, const char *str4) { init().cpy(str1).cat(str2).cat(str3).cat(str4); }
astring(const char *str1, const char *str2, const char *str3, const char *str4, const char *str5) { init().cpy(str1).cat(str2).cat(str3).cat(str4).cat(str5); }
astring(const astring &string) { init().cpy(string); }
+ astring(const astring &string, int start, int count = -1) { init().cpysubstr(string, start, count); }
astring &operator=(const char *string) { return cpy(string); }
astring &operator=(const astring &string) { return cpy(string); }
diff --git a/src/lib/util/corestr.c b/src/lib/util/corestr.c
index 292320a3311..7c244e8a8bd 100644
--- a/src/lib/util/corestr.c
+++ b/src/lib/util/corestr.c
@@ -141,7 +141,7 @@ char *core_strdup(const char *str)
char *cpy = NULL;
if (str != NULL)
{
- cpy = (char *)osd_malloc(strlen(str) + 1);
+ cpy = (char *)osd_malloc_array(strlen(str) + 1);
if (cpy != NULL)
strcpy(cpy, str);
}
diff --git a/src/mame/machine/gaelco3d.c b/src/mame/machine/gaelco3d.c
index 09d0e9eb097..d17dc954181 100644
--- a/src/mame/machine/gaelco3d.c
+++ b/src/mame/machine/gaelco3d.c
@@ -130,7 +130,7 @@ static osd_shared_mem *osd_sharedmem_alloc(const char *path, int create, size_t
if (create)
{
- char *buf = (char *) osd_malloc(size);
+ char *buf = (char *) osd_malloc_array(size);
memset(buf,0, size);
fd = open(path, O_RDWR | O_CREAT, S_IRWXU);
@@ -147,7 +147,7 @@ static osd_shared_mem *osd_sharedmem_alloc(const char *path, int create, size_t
}
os_shmem->creator = 0;
}
- os_shmem->fn = (char *) osd_malloc(strlen(path)+1);
+ os_shmem->fn = (char *) osd_malloc_array(strlen(path)+1);
strcpy(os_shmem->fn, path);
assert(fd != -1);
@@ -178,7 +178,7 @@ static osd_shared_mem *osd_sharedmem_alloc(const char *path, int create, size_t
os_shmem->creator = 0;
- os_shmem->ptr = (void *) osd_malloc(size);
+ os_shmem->ptr = (void *) osd_malloc_array(size);
os_shmem->size = size;
return os_shmem;
}
diff --git a/src/mame/machine/md_cart.c b/src/mame/machine/md_cart.c
index 072706210ce..81061c2e1c5 100644
--- a/src/mame/machine/md_cart.c
+++ b/src/mame/machine/md_cart.c
@@ -1589,7 +1589,7 @@ static int megadrive_load_nonlist(device_image_interface &image)
else if ((rawROM[0x2080] == 'E') && (rawROM[0x2081] == 'A') &&
(rawROM[0x2082] == 'M' || rawROM[0x2082] == 'G'))
{
- tmpROMnew = (unsigned char *)osd_malloc(length);
+ tmpROMnew = global_alloc_array(unsigned char, length);
secondhalf = &tmpROMnew[length >> 1];
if (!tmpROMnew)
@@ -1605,7 +1605,7 @@ static int megadrive_load_nonlist(device_image_interface &image)
ROM[ptr] = secondhalf[ptr >> 1];
ROM[ptr + 1] = tmpROMnew[ptr >> 1];
}
- free(tmpROMnew);
+ global_free(tmpROMnew);
#ifdef LSB_FIRST
for (ptr = 0; ptr < length; ptr += 2)
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
new file mode 100644
index 00000000000..4ddfca24b1e
--- /dev/null
+++ b/src/mame/mame.lst
@@ -0,0 +1,12225 @@
+/******************************************************************************
+
+ mame.lst
+
+ List of all enabled drivers in the system. This file is parsed by
+ makelist.exe, sorted, and output as C code describing the drivers.
+
+****************************************************************************
+
+ Copyright Aaron Giles
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name 'MAME' nor the names of its contributors may be
+ used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+******************************************************************************/
+
+// "Pacman hardware" games
+puckman // (c) 1980 Namco
+puckmana // (c) 1980 Namco
+puckmanf // hack
+puckmanh // hack
+pacman // (c) 1980 Midway
+pacmanf // hack
+puckmod // (c) 1981 Namco
+pacmod // (c) 1981 Midway
+newpuc2 // hack
+newpuc2b // hack
+newpuckx // hack
+pacheart // hack
+bucaner // hack
+hangly // hack
+hangly2 // hack
+hangly3 // hack
+popeyeman // hack
+piranhah // hack
+abscam // hack
+crush // (c) 1981 Kural Samno Electric Ltd
+crushbl // bootleg
+crushbl2 // bootleg 2
+crush2 // (c) 1981 Kural Esco Electric Ltd - bootleg?
+crush3 // Kural Electric Ltd - bootleg?
+crush4 // Kural TWT
+maketrax // (c) 1981 Williams, high score table says KRL (fur Kural)
+maketrxb // (c) 1981 [Kural] (Williams license)
+korosuke // (c) 1981 Kural Electric
+mbrush // 1981 bootleg
+paintrlr // 1981 bootleg
+crushs // 1981 bootleg
+pacplus // (c) 1982 Namco (Midway license)
+joyman // hack
+ctrpllrp // hack
+eyes // (c) 1982 Digitrex Techstar + "Rockola presents"
+eyes2 // (c) 1982 Techstar + "Rockola presents"
+eyeszac // (c) 1982 Zaccaria / bootleg
+mrtnt // (c) 1983 Telko
+gorkans // (c) 1984 Techstar
+eggor // (c) 1983 Telko
+jumpshot // (c) 1985 Bally Midway
+jumpshotp // (c) 1985 Bally Midway
+shootbul // (c) 1985 Bally Midway
+piranha // GL
+piranhao // GL
+nmouse // (c) 1981 Amenip (Palcom Queen River)
+nmouseb // (c) 1981 Amenip Nova Games Ltd.
+mspacman // (c) 1981 Midway // made by General Computer
+mspacmnf // hack
+mspacmat // hack
+woodpeck // (c) 1981 Amenip (Palcom Queen River)
+woodpeca // (c) 1981 Amenip Nova Games Ltd.
+mspacmab // bootleg
+mspacmbe // bootleg
+pacgal // hack
+mspacpls // hack
+ponpoko // (c) 1982 Sigma Ent. Inc.
+ponpokov // (c) 1982 Sigma Ent. Inc. + Venture Line license
+lizwiz // (c) 1985 Techstar + "Sunn presents"
+alibaba // (c) 1982 Sega
+dremshpr // (c) 1982 Sanritsu
+vanvan // (c) 1983 Sanritsu
+vanvank // (c) 1983 Karateco (bootleg?)
+vanvanb // (c) 1983 Karateco (bootleg?)
+bwcasino // (c) 1983 Epos Coropration
+acitya // (c) 1983 Epos Corporation
+theglobp // (c) 1983 Epos Corporation
+sprglobp // (c) 1983 Epos Corporation
+sprglbpg // German bootleg
+beastf // (c) 1984 Epos Corporation
+rocktrv2 // (c) 1986 Triumph Software Inc
+bigbucks // (c) 1986 Dynasoft Inc.
+mschamp // hack by RAYGLO MFG "Zola-Puc" (c) 1992/1993
+mschamps // hack (hack of the Rayglo hack?)
+cannonbp // hack
+
+// S2650 Pacman Kits
+drivfrcp // (c) 1984 Shinkai Inc. (Magic Eletronics Inc. license)
+8bpm // (c) 1985 Seatongrove Ltd (Magic Eletronics USA license)
+porky // (c) 1985 Shinkai Inc. (Magic Eletronics Inc. license)
+
+pengo // 834-0386 (c) 1982 Sega
+pengo2 // 834-0386 (c) 1982 Sega
+pengo2u // 834-0386 (c) 1982 Sega
+pengo3u // 834-0386 (c) 1982 Sega
+pengo4 // 834-0386 (c) 1982 Sega
+pengob // bootleg
+penta // bootleg
+jrpacmbl // bootleg on Pengo HW
+
+jrpacman // (c) 1983 Midway
+
+// Epos games
+megadon // (c) 1982
+catapult // (c) 1982
+suprglob // (c) 1983
+theglob // (c) 1983
+theglob2 // (c) 1983
+theglob3 // (c) 1983
+igmo // (c) 1984
+dealer // (c) 198?
+revenger // (c) 1984
+
+// "Galaxian hardware" games
+galaxian // (c) Namco
+galaxiana // (c) Namco
+galaxianm // (c) Midway
+galaxianmo // (c) Midway
+galaxiant // (c) Taito
+superg // hack
+galapx // hack
+moonaln // [Nichibutsu] (Karateco license) or hack
+galap1 // hack
+galap4 // hack
+galturbo // hack
+swarm // hack
+zerotime // hack
+starfght // hack
+galaxbsf // hack
+kamakazi3 // Video Games (UK) Ltd., hack or bootleg?
+tst_galx // Galaxian Test ROM
+gmgalax // bootleg
+pisces // Subelectro
+piscesb // bootleg
+omni // bootleg
+uniwars // (c) Irem
+gteikoku // (c) Irem
+gteikokb // bootleg
+gteikob2 // bootleg
+spacbatt // bootleg
+spacbat2 // bootleg
+spacempr // bootleg
+skyraidr // bootleg
+batman2 // bootleg
+warofbug // (c) 1981 Armenia
+warofbugg // German Version
+redufo // (c) Artic
+redufob // bootleg
+exodus // Subelectro - bootleg?
+streakng // [1980] Shoei
+streaknga // [1980] Shoei
+pacmanbl // bootleg
+pacmanbla // bootleg
+phoenxp2 // bootleg
+atlantisb // bootleg
+tenspot // (c) 1982 Thomas Automatics
+devilfsg // (c) 1984 Vision / Artic (bootleg?)
+zigzag // (c) 1982 LAX
+zigzag2 // (c) 1982 LAX
+jumpbug // (c) 1981 Rock-ola
+jumpbugb // (c) 1981 Sega
+levers // (c) 1983 Rock-ola
+azurian // (c) 1982 Rait Electronics Ltd
+orbitron // (c) 1982 Signatron USA (Arcade Tv Game List - P.160, Left, 22 from top)
+mooncrgx // bootleg
+mooncrst // (c) 1980 Nichibutsu
+mooncrstu // (c) 1980 Nichibutsu USA
+mooncrsto // (c) 1980 Nichibutsu
+mooncrstg // (c) 1980 Gremlin
+mooncrstuk // (c) 1980 Nichibutsu UK
+smooncrs // Gremlin
+sstarcrs // Taito (Brazil)
+mooncmw // bootleg
+mooncrsb // bootleg
+mooncrs2 // bootleg
+spcdrag // bootleg
+stera // bootleg
+spcdraga // bootleg
+mooncrs3 // bootleg
+fantazia // bootleg
+moonqsr // (c) 1980 Nichibutsu
+mshuttle // (c) 1981 Nichibutsu
+mshuttle2 // (c) 1981 Nichibutsu
+mshuttlej // (c) 1981 Nichibutsu
+mshuttlej2 // (c) 1981 Nichibutsu
+moonal2 // [1980] Nichibutsu
+moonal2b // [1980] Nichibutsu
+supergx // [1980] Nichibutsu
+eagle // [1980] Centuri
+eagle2 // [1980] Centuri
+eagle3 // [1980] Centuri
+spctbird // (c) Fortrek
+skybase // (c) 1982 Omori Electric Co., Ltd.
+checkman // (c) 1982 Zilec-Zenitone
+checkmanj // (c) 1982 Jaleco (Zenitone/Zilec in ROM CM4, and the programmer names)
+dingo // (c) 1983 Ashby Computers and Graphics LTD. + Jaleco license
+dingoe // (c) 1983 Ashby Computers and Graphics LTD. + Jaleco license
+blkhole // TDS (Tokyo Denshi Sekkei)
+kingball // (c) 1980 Namco
+kingballj // (c) 1980 Namco
+scorpionmc // bootleg
+frogg // bootleg
+4in1 // (c) 1981 Armenia / Food and Fun
+bagmanmc // bootleg
+dkongjrm // bootleg
+ozon1 // (c) 1983 Proma
+ladybugg // bootleg
+vpool // bootleg
+drivfrcg // [1984] Shinkai (Magic Electronics USA license)
+drivfrcb // bootleg
+bongo // (c) 1983 Jetsoft
+hunchbkg // (c) 1983 Century
+harem // [1983] I.G.R.
+tazzmang // bootleg
+racknrol // (c) 1986 Status (Shinkia license) (Senko Kit)
+hexpool // (c) 1986 Shinkia (Senko Kit)
+hexpoola // (c) 1986 Shinkia (Senko Kit)
+trvchlng // [1985] Joyland (Senko license)
+luctoday // 1980 Sigma
+chewing // ?? unknown
+catacomb // 1982 MTM Games
+ckongg // 1981 bootleg
+ckongmc // 1981 bootleg
+porter // 1982 bootleg (Arcade TV Game List - P.98, Left, 15 from bottom)
+vstars // 19?? Competitive Video?
+tdpgal // 1983 Design Labs / Thomas Automatics
+
+// Has some similarities with Moon Cresta but Board is very different
+rockclim // (c)1981 Taito
+
+// "Scramble hardware" (and variations) games
+scramble // GX387 (c) 1981 Konami
+scrambles // GX387 (c) 1981 Stern
+scramblebf // bootleg
+scramblebb // bootleg?
+scramblb // bootleg
+scramb2 // bootleg
+explorer // bootleg
+strfbomb // bootleg
+atlantis // (c) 1981 Comsoft
+atlantis2 // (c) 1981 Comsoft
+theend // (c) 1980 Konami
+theends // (c) 1980 Stern
+omega // bootleg
+ckongs // bootleg
+froggers // bootleg
+frogf // bootleg
+amidars // GX337 (c) 1982 Konami
+triplep // (c) 1982 KKI / made by Sanritsu?
+knockout // (c) 1982 KKK
+mariner // (c) 1981 Amenip
+800fath // (c) 1981 Amenip + U.S. Billiards license
+mars // (c) 1981 Artic
+devilfsh // (c) 1982 Artic
+newsin7 // (c) 1983 ATW USA, Inc.
+mrkougar // (c) 1984 ATW
+mrkougar2 // (c) 1984 ATW
+mrkougb // bootleg
+mrkougb2 // bootleg
+hotshock // (c) 1982 E.G. Felaco (Domino license)
+hotshockb // bootleg
+conquer // (c) 1982 ????
+hunchbks // (c) 1983 Century
+hncholms // (c) 1984 Century
+cavelon // (c) 1983 Jetsoft
+sfx // (c) 1983 Nichibutsu
+skelagon // (c) 1983 Nichibutsu USA
+monsterz // (c) 1982 Nihon (Arcade TV Game List - P.102, Left, 20 from top)
+mimonscr // (c) 1982 Universal Video Games (US Copyright Office info - http://cocatalog.loc.gov)
+mimonkey // (c) 1982 bootleg
+mimonsco // (c) 1982 bootleg
+scobra // GX316 (c) 1981 Konami
+scobras // GX316 (c) 1981 Stern
+scobrase // GX316 (c) 1981 Stern
+scobrab // GX316 (c) 1981 Karateco (bootleg?)
+suprheli // bootleg
+stratgyx // GX306 (c) 1981 Konami
+stratgys // GX306 (c) 1981 Stern
+strongx // bootleg
+armorcar // (c) 1981 Stern
+armorcar2 // (c) 1981 Stern
+moonwar // (c) 1981 Stern
+moonwara // (c) 1981 Stern
+spdcoin // (c) 1984 Stern
+darkplnt // (c) 1982 Stern
+tazmania // (c) 1982 Stern
+tazmani2 // (c) 1982 Stern
+calipso // (c) 1982 Tago
+anteater // (c) 1982 Tago
+anteaterg // (c) 1983 TV-Tuning (F.E.G. license)
+anteateruk // (c) 1983 Free Enterprise Games
+rescue // (c) 1982 Stern
+aponow // bootleg
+minefld // (c) 1983 Stern
+losttomb // (c) 1982 Stern
+losttombh // (c) 1982 Stern
+superbon // bootleg
+hustler // GX343 (c) 1981 Konami
+hustlerd // GX343 (c) 1981 Konami + Dynamo Games license
+billiard // bootleg
+hustlerb // bootleg
+hustlerb2 // bootleg
+frogger // GX392 (c) 1981 Konami
+froggers1 // (c) 1981 Sega
+froggers2 // 834-0068 (c) 1981 Sega
+froggermc // 800-3110 (c) 1981 Sega
+amidar // GX337 (c) 1981 Konami
+amidaru // GX337 (c) 1982 Konami + Stern license
+amidaro // GX337 (c) 1982 Konami + Olympia license
+amidarb // bootleg
+amigo // bootleg
+turtles // (c) 1981 Stern
+turpin // (c) 1981 Sega
+600 // GX353 (c) 1981 Konami
+flyboy // (c) 1982 Kaneko
+flyboyb // bootleg
+fastfred // 136009 (c) 1982 Atari
+jumpcoas // (c) 1983 Kaneko
+jumpcoast // (c) 1983 Taito
+boggy84 // (c) 1984 Kaneko
+boggy84b // bootleg
+redrobin // (c) 1986 Elettronolo
+imago // (c) 1984 Acom
+imagoa // (c) 1983 Acom
+scorpion // (c) 1982 Zaccaria
+scorpiona // (c) 1982 Zaccaria
+scorpionb // (c) 1982 Zaccaria
+aracnis // bootleg
+ad2083 // (c) 1983 Midcoin
+turpins // (c) 1981 bootleg
+
+// "Crazy Climber hardware" games
+cclimber // (c) 1980 Nichibutsu
+cclimberj // (c) 1980 Nichibutsu
+ccboot // bootleg
+ccboot2 // bootleg
+
+ckong // (c) 1981 (Falcon?)
+ckongo // bootleg (Orca)
+ckongalc // bootleg (Alca)
+bigkong // bootleg
+monkeyd // bootleg
+
+ckongpt2 // (c) 1981 Falcon
+ckongpt2a // (c) 1981 Falcon
+ckongpt2j // (c) 1981 Falcon
+ckongpt2jeu // bootleg (Jeutel)
+ckongpt2b // bootleg
+
+rpatrol // Orca, from a suspicious set
+rpatrolb // bootleg
+silvland // Falcon
+yamato // (c) 1983 Sega
+yamato2 // (c) 1983 Sega
+toprollr // (c) 1983 Jaleco
+swimmer // (c) 1982 Tehkan
+swimmera // (c) 1982 Tehkan
+swimmerb // (c) 1982 Tehkan
+guzzler // (c) 1983 Tehkan
+cannonb // (c) 1985 Soft
+cannonb2 // (c) 1985 TV Game Gruenberg
+cannonb3 // (c) 1985 Soft
+bagmanf // bootleg on Falcon FCK-00 (Falcon Crazy Kong) PCB
+
+// Nichibutsu games
+gomoku // (c) 1981
+wiping // (c) 1982
+rugrats // (c) 1983
+dacholer // (c) 1983
+kickboy // (c) 1983
+friskyt // (c) 1981
+friskyta // (c) 1981
+radrad // (c) 1982 Nichibutsu USA
+seicross // (c) 1984 + Alice
+sectrzon // (c) 1984 + Alice
+firebatl // (c) 1984 Taito
+clshroad // (c) 1986 Wood Place Inc.
+clshroads // (c) 1986 Wood Place Inc. (Status Games license)
+clshroadd // (c) 1986 Wood Place Inc. (Data East license)
+tubep // (c) 1984 + Fujitek
+tubepb // (c) 1984 + bootleg
+rjammer // (c) 1984 + Alice
+magmax // (c) 1985
+cop01 // (c) 1985
+cop01a // (c) 1985
+mightguy // (c) 1986
+terracre // (c) 1985
+terracreo // (c) 1985
+terracrea // (c) 1985
+terracren // (c) 1985
+amazon // (c) 1986
+amatelas // (c) 1986
+horekid // (c) 1987
+horekidb // bootleg
+boobhack // bootleg
+galivan // (c) 1985
+galivan2 // (c) 1985
+dangar // (c) 1986
+dangar2 // (c) 1986
+dangarb // bootleg
+ninjemak // (c) 1986 (US?)
+youma // (c) 1986 (Japan)
+youma2 // (c) 1986 (Japan)
+youmab // bootleg
+youmab2 // bootleg
+legion // (c) 1986
+legiono // (c) 1986
+terraf // (c) 1987
+terrafb // (c) 1987
+terrafa // (c) 1987
+terrafu // (c) 1987 Nichibutsu USA
+kodure // (c) 1987 (Japan)
+armedf // (c) 1988
+armedff // (c) 1988 Fillmore license
+cclimbr2 // (c) 1988 (Japan)
+cclimbr2a // (c) 1988 (Japan)
+skyrobo // (c) 1989
+bigfghtr // (c) 1989
+
+// Nichibutsu Mahjong games
+hyhoo // (c) 1987
+hyhoo2 // (c) 1987
+
+jangou // (c) 1983
+macha // (c) 1983 Logitec
+// Jangou Night // (c) 1983
+jngolady // (c) 1984
+cntrygrl // (c) 1984 Royal Denshi
+cntrygrla // (c) 1984
+roylcrdn // (c) 1985
+fruitbun // (c) 1984
+luckygrl // (c) 1984 Wing?
+nightgal // (c) 1984
+ngtbunny // (c) 1984
+royalngt // (c) 1984 Royal Denshi
+royalqn
+sexygal // (c) 1985
+sweetgal // (c) 1985
+ngalsumr // (c) 1985
+
+pastelg // (c) 1985
+3ds // (c) 1985
+galds // (c) 1985
+
+crystalg // (c) 1986
+crystal2 // (c) 1986
+nightlov // (c) 1986
+citylove // (c) 1986
+mcitylov // (c) 1986
+apparel // (c) 1986 Central Denshi
+secolove // (c) 1986
+barline // (c) 1986?
+housemnq // (c) 1987
+housemn2 // (c) 1987
+livegal // (c) 1987
+seiha // (c) 1987
+seiham // (c) 1987
+mjgaiden // (c) 1987 Central Denshi
+bijokkoy // (c) 1987
+iemoto // (c) 1987
+iemotom // (c) 1987
+ryuuha // (c) 1987
+ojousan // (c) 1987
+ojousanm // (c) 1987
+bijokkog // (c) 1988
+orangec // (c) 1988 Daiichi Denshi
+orangeci // (c) 1988 Daiichi Denshi
+vipclub // (c) 1988 Daiichi Denshi
+korinai // (c) 1988
+korinaim // (c) 1988
+kaguya // (c) 1988 MIKI SYOUJI
+kaguya2 // (c) 1989 MIKI SYOUJI
+kaguya2f // (c) 1989 MIKI SYOUJI
+otonano // (c) 1988 Apple
+kanatuen // (c) 1988 Panac
+kyuhito // (c) 1988 ROLLER TRON
+mjsikaku // (c) 1988
+mjsikakb // (c) 1988
+mjsikakc // (c) 1988
+mjsikakd // (c) 1988
+mmsikaku // (c) 1988
+mjcamera // (c) 1988 MIKI SYOUJI
+mmcamera // (c) 1988 MIKI SYOUJI
+
+msjiken // (c) 1988
+hanamomo // (c) 1988
+hanamomb // (c) 1988
+telmahjn // (c) 1988
+taiwanmb // (c) 1988
+gionbana // (c) 1989
+idhimitu // (c) 1989 Digital Soft
+mgion // (c) 1989
+mjcamerb // (c) 1989 MIKI SYOUJI
+omotesnd // (c) 1989
+abunai // (c) 1989
+mjfocus // (c) 1989
+mjfocusm // (c) 1989
+peepshow // (c) 1989 AC
+scandal // (c) 1989
+scandalm // (c) 1989
+mgmen89 // (c) 1989
+mjnanpas // (c) 1989 BROOKS
+mjnanpaa // (c) 1989 BROOKS
+mjnanpau // (c) 1989 BROOKS
+pairsnb // (c) 1989
+pairsten // (c) 1989 System Ten
+bananadr // (c) 1989 DIGITAL SOFT
+mladyhtr // (c) 1990
+chinmoku // (c) 1990
+maiko // (c) 1990
+mmaiko // (c) 1990
+hnageman // (c) 1990 Nichibutsu/AV Japan
+hnxmasev // (c) 1990 Nichibutsu/AV Japan
+club90s // (c) 1990
+club90sa // (c) 1990
+lovehous // (c) 1990
+hanaoji // (c) 1991
+
+pstadium // (c) 1990
+triplew1 // (c) 1989
+triplew2 // (c) 1990
+ntopstar // (c) 1990
+mjlstory // (c) 1991
+vanilla // (c) 1991
+finalbny // (c) 1991
+qmhayaku // (c) 1991
+mjgottub // (c) 1991
+galkoku // (c) 1989 Nichibutsu/T.R.TEC
+hyouban // (c) 1989 Nichibutsu/T.R.TEC
+galkaika // (c) 1989 Nichibutsu/T.R.TEC
+tokyogal // (c) 1989
+tokimbsj // (c) 1989
+mcontest // (c) 1989
+uchuuai // (c) 1989
+av2mj1bb // (c) 1991 MIKI SYOUJI/AV JAPAN
+av2mj2rg // (c) 1991 MIKI SYOUJI/AV JAPAN
+
+ohpaipee // (c) 1990 Nichibutsu
+togenkyo // (c) 1990 Nichibutsu
+
+mjuraden // (c) 1992 Nichibutsu/Yubis
+koinomp // (c) 1992
+patimono // (c) 1992
+janbari // (c) 1992 Nichibutsu/Yubis/AV JAPAN
+mjanbari // (c) 1992 Nichibutsu/Yubis/AV JAPAN
+ultramhm // (c) 1993 Apple
+gal10ren // (c) 1993 FUJIC
+renaiclb // (c) 1993 FUJIC
+mjlaman // (c) 1993 Nichibutsu/AV JAPAN
+mkeibaou // (c) 1993
+pachiten // (c) 1993 Nichibutsu/MIKI SYOUJI/AV JAPAN
+sailorws // (c) 1993
+sailorwa // (c) 1993
+sailorwr // (c) 1993
+wcatcher // (c) 1993
+jituroku // (c) 1993 Windom
+yosimoto // (c) 1994 Nichibutsu/Yoshimoto Kougyou
+psailor1 // (c) 1994 SPHINX
+psailor2 // (c) 1994 SPHINX
+otatidai // (c) 1995 SPHINX
+ngpgal // (c) 1991
+mjgottsu // (c) 1991
+bakuhatu // (c) 1991
+cmehyou // (c) 1992 Nichibutsu/Kawakusu
+mmehyou // (c) 1992 Nichibutsu/Kawakusu
+mjkoiura // (c) 1992
+mkoiuraa // (c) 1992
+imekura // (c) 1994 SPHINX/AV JAPAN
+mscoutm // (c) 1994 SPHINX/AV JAPAN
+mjegolf // (c) 1994 FUJIC/AV JAPAN
+
+mhhonban // (c) 199?
+4psimasy // (c) 1994
+musobana // (c) 1995
+niyanpai // (c) 1996
+
+jyunai // (c) 1998
+csplayh5 // (c) 1998
+bikiniko // (c) 1999
+
+// "Phoenix hardware" (and variations) games
+safarir // Shin Nihon Kikaku (SNK)
+phoenix // (c) 1980 Amstar
+phoenixa // (c) 1980 Amstar + Centuri license
+phoenixb // (c) 1980 Amstar + Centuri license
+phoenixt // (c) 1980 Taito
+phoenixj // (c) 1980 Taito
+phoenix3 // bootleg
+phoenixc // bootleg
+condor // bootleg
+fenix // bootleg
+falcon // bootleg
+vautour // bootleg (Jeutel)
+falconz // bootleg
+vautourz // bootleg
+griffon // bootleg (Videotron)
+nextfase // bootleg
+pleiads // (c) 1981 Tehkan
+pleiadbl // bootleg
+pleiadce // (c) 1981 Centuri + Tehkan
+capitol // bootleg?
+survival // (c) 1982 Rock-ola
+naughtyb // (c) 1982 Jaleco
+naughtyba // bootleg
+naughtybc // (c) 1982 Jaleco + Cinematronics
+popflame // (c) 1982 Jaleco
+popflamea // (c) 1982 Jaleco
+popflameb // (c) 1982 Jaleco
+popflamen // (c) 1982 Jaleco
+trvmstr // (c) 1985 Enerdyne Technologies Inc.
+trvmstra // (c) 1985 Enerdyne Technologies Inc.
+trvmstrb // (c) 1985 Enerdyne Technologies Inc.
+trvmstrc // (c) 1985 Enerdyne Technologies Inc.
+trvgns // bootleg
+
+
+
+// Namco games (plus some intruders on similar hardware)
+geebee // [1978] Namco
+geebeeb // [1978] Namco (F.lli Bertolino license)
+geebeeg // [1978] Gremlin
+bombbee // [1979] Namco
+cutieq // (c) 1979 Namco
+navarone // (c) 1980 Namco
+kaitein // [1980] Namco
+kaitei // [1980] K.K. Tokki
+sos // [1980] Namco
+tankbatt // (c) 1980 Namco
+warpwarp // (c) 1981 Namco
+warpwarpr // (c) 1981 [Namco] (Rock-ola license)
+warpwarpr2 // (c) 1981 [Namco] (Rock-ola license)
+rallyx // (c) 1980 Namco
+rallyxa // (c) 1980 Namco
+rallyxm // (c) 1980 Midway
+nrallyx // (c) 1981 Namco
+nrallyxb // (c) 1981 Namco
+jungler // GX327 (c) 1981 Konami
+junglers // GX327 (c) 1981 Stern
+tactcian // GX335 (c) 1982 Sega
+tactcian2 // GX335 (c) 1981 Sega
+locomotn // GX359 (c) 1982 Konami + Centuri license
+gutangtn // GX359 (c) 1982 Konami + Sega license
+cottong // bootleg
+locoboot // bootleg
+commsega // (c) 1983 Sega
+// the following ones all have a custom I/O chip
+bosco // (c) 1981
+boscoo // (c) 1981
+boscoo2 // (c) 1981
+boscomd // (c) 1981 Midway
+boscomdo // (c) 1981 Midway
+galaga // (c) 1981
+galagao // (c) 1981
+galagamw // (c) 1981 Midway
+galagamk // (c) 1981 Midway
+galagamf // (c) 1981 Midway / hack
+gallag // bootleg
+gatsbee // (c) 1984 Uchida / hack
+digdug // (c) 1982
+digdug1 // (c) 1982
+digdugat // 136007 (c) 1982 Atari
+digdugat1 // 136007 (c) 1982 Atari
+dzigzag // bootleg
+digsid // bootleg
+xevious // (c) 1982
+xeviousa // 136018 (c) 1982 + Atari license
+xeviousb // 136018 (c) 1982 + Atari license
+xeviousc // 136018 (c) 1982 + Atari license
+xevios // bootleg
+battles // bootleg
+sxevious // (c) 1984
+sxeviousj // (c) 1984
+superpac // (c) 1982
+superpacm // (c) 1982 Midway
+pacnpal // (c) 1983
+pacnpal2 // (c) 1983
+pacnchmp // (c) 1983
+phozon // (c) 1983
+mappy // (c) 1983
+mappyj // (c) 1983
+digdug2 // (c) 1985
+digdug2o // (c) 1985
+todruaga // (c) 1984
+todruagao // (c) 1984
+todruagas // (c) 1984 pcb manufactured by Sidam
+motos // (c) 1985
+grobda // (c) 1984
+grobda2 // (c) 1984
+grobda3 // (c) 1984
+gaplus // (c) 1984
+gaplusa // (c) 1984
+gapluso // (c) 1984
+galaga3 // (c) 1984
+galaga3m // (c) 1984
+galaga3a // (c) 1984
+// Libble Rabble board (first Japanese game using a 68000)
+liblrabl // (c) 1983
+toypop // (c) 1986
+// Z8000 games
+polepos // (c) 1982
+poleposa // 136014 (c) 1982 + Atari license
+polepos1 // 136014 (c) 1982 Atari
+topracer // bootleg
+topracera // bootleg
+topracern // bootleg
+polepos2 // (c) 1983
+polepos2a // 136014 (c) 1983 + Atari license
+polepos2b // bootleg
+polepos2bi // bootleg
+// no custom I/O in the following, HD63701 (or compatible) microcontroller instead
+pacland // (c) 1984
+paclandj // (c) 1984
+paclandjo // (c) 1984
+paclandjo2 // (c) 1984
+paclandm // (c) 1984 Midway
+drgnbstr // (c) 1984
+skykid // (c) 1985
+skykido // (c) 1985
+skykidd // (c) 1985
+skykids // (c) 1985
+aliensec // (c) 1985
+baraduke // (c) 1985
+metrocrs // (c) 1985
+metrocrsa // (c) 1985
+
+// Namco System 86 games
+hopmappy // (c) 1986
+skykiddx // (c) 1986
+skykiddxo // (c) 1986
+roishtar // (c) 1986
+genpeitd // (c) 1986
+rthunder // (c) 1986 new version
+rthundero // (c) 1986 old version
+wndrmomo // (c) 1987
+
+// Thunder Ceptor HW
+tceptor // (c) 1986
+tceptor2 // (c) 1986
+
+kungfur // (c) 1987
+
+// Namco System 1 games
+shadowld // (c) 1987
+youkaidk // (c) 1987 (Japan new version)
+youkaidko // (c) 1987 (Japan old version)
+dspirit // (c) 1987 (Japan new version)
+dspirito // (c) 1987 (Japan old version)
+dspirita // (c) 1987 (Atari license)
+blazer // (c) 1987 (Japan)
+quester // (c) 1987 (Japan)
+questers // (c) 1987 (Japan)
+pacmania // (c) 1987
+pacmaniaj // (c) 1987 (Japan)
+galaga88 // (c) 1987
+galaga88j // (c) 1987 (Japan)
+ws // (c) 1988 (Japan)
+berabohm // (c) 1988 (Japan)
+berabohmo // (c) 1988 (Japan)
+ // 1988 Alice in Wonderland (English version of Marchen maze)
+mmaze // (c) 1988 (Japan)
+bakutotu // (c) 1988 (Japan)
+wldcourt // (c) 1988 (Japan)
+splatter // (c) 1988 (World)
+splattero // (c) 1988 (World)
+splatterj // (c) 1988 (Japan)
+faceoff // (c) 1988 (Japan)
+rompers // (c) 1989 (Japan)
+romperso // (c) 1989 (Japan)
+blastoff // (c) 1989 (Japan)
+ws89 // (c) 1989 (Japan)
+dangseed // (c) 1989 (Japan)
+ws90 // (c) 1990 (Japan)
+pistoldm // (c) 1990 (Japan)
+boxyboy // (c) 1990 (US)
+soukobdx // (c) 1990 (Japan)
+puzlclub // (c) 1990 (Japan)
+tankfrce // (c) 1991 (US, 2 Player)
+tankfrce4 // (c) 1991 (US, 4 Player)
+tankfrcej // (c) 1991 (Japan)
+
+// Namco System 2 games
+finallap // 87.12 Final Lap
+finallapd // 87.12 Final Lap
+finallapc // 87.12 Final Lap
+finallapjc // 87.12 Final Lap
+finallapjb // 87.12 Final Lap
+assault // (c) 1988
+assaultj // (c) 1988 (Japan)
+assaultp // (c) 1988 (Japan)
+metlhawk // (c) 1988
+metlhawkj // (c) 1988
+ordyne // (c) 1988
+ordynej // (c) 1988
+mirninja // (c) 1988 (Japan)
+phelios // (c) 1988 (Japan)
+dirtfoxj // (c) 1989 (Japan)
+fourtrax // 89.11
+valkyrie // (c) 1989 (Japan)
+finehour // (c) 1989 (Japan)
+burnforc // (c) 1989 (Japan)
+burnforco // (c) 1989 (Japan)
+marvland // (c) 1989 (US)
+marvlandj // (c) 1989 (Japan)
+kyukaidk // (c) 1990 (Japan)
+kyukaidko // (c) 1990 (Japan)
+dsaber // (c) 1990
+dsaberj // (c) 1990 (Japan)
+finalap2 // 90.8 Final Lap 2
+finalap2j // 90.8 Final Lap 2 (Japan)
+gollygho // 91.7 Golly Ghost
+rthun2 // (c) 1990
+rthun2j // (c) 1990 (Japan)
+sgunner // (c) 1990
+sgunnerj // (c) 1990
+sgunner2 // (c) 1991 (US)
+sgunner2j // (c) 1991 (Japan)
+cosmogng // (c) 1991 (US)
+cosmogngj // (c) 1991 (Japan)
+bubbletr // (c) 1992
+finalap3 // 92.9 Final Lap 3
+finalap3a // 92.9 Final Lap 3
+finalap3j // 92.9 Final Lap 3
+finalap3jc // (c) 1992
+luckywld // (c) 1992
+luckywldj // (c) 1992
+suzuka8h // (c) 1992 (World)
+suzuka8hj // (c) 1992 (Japan)
+sws // (c) 1992 (Japan)
+sws92 // (c) 1992 (Japan)
+sws92g // (c) 1992 (Japan)
+suzuk8h2 // (c) 1993 (World)
+sws93 // (c) 1993 (Japan)
+
+// Namco FL games
+speedrcr // (c) 1995
+finalapr // (c) 1995
+finalaprj // (c) 1995
+finalapro // (c) 1995
+
+// Namco NA-1 / NA-2 System games
+bkrtmaq // (c) 1992 (Japan)
+cgangpzl // (c) 1992 (US)
+cgangpzlj // (c) 1992 (Japan)
+exvania // (c) 1992 (Japan)
+fghtatck // (c) 1992 (US)
+fa // (c) 1992 (Japan)
+knckhead // (c) 1992 (World)
+knckheadj // (c) 1992 (Japan)
+swcourt // (c) 1992 (Japan)
+swcourtj // (c) 1992 (Japan)
+emeralda // (c) 1993 (Japan)
+emeraldaj // (c) 1993 (Japan)
+emeraldaja // (c) 1993 (Japan)
+numanath // (c) 1993 (World)
+numanathj // (c) 1993 (Japan)
+quiztou // (c) 1993 (Japan)
+tinklpit // (c) 1993 (Japan)
+xday2 // (c) 1995 (Japan)
+
+// Namco NB-1 / NB-2 System games
+nebulray // (c) 1994 (World)
+nebulrayj // (c) 1994 (Japan)
+ptblank // (c) 1994 (GN2 World)
+gunbuletj // (c) 1994 (GN1 Japan)
+gunbuletw // (c) 1994 (GN3 World)
+gslugrsj // (c) 1993 (Japan)
+gslgr94u // (c) 1994
+gslgr94j // (c) 1994 (Japan)
+sws95 // (c) 1995 (Japan)
+sws96 // (c) 1996 (Japan)
+sws97 // (c) 1997 (Japan)
+vshoot // (c) 1994
+outfxies // (c) 1994 (World)
+outfxiesj // (c) 1994 (Japan)
+machbrkr // (c) 1995 (Japan)
+
+// Namco ND-1 games
+ncv1 // (c) 1995
+ncv1j // (c) 1995 (Japan)
+ncv1j2 // (c) 1995 (Japan)
+ncv2 // (c) 1996
+ncv2j // (c) 1996 (Japan)
+
+// Namco System 21 games
+winrun // (c) 1988
+ // 1989, Winning Run Suzuka Grand Prix
+winrun91 // (c) 1991
+solvalou // (c) 1991 (Japan)
+starblad // (c) 1991
+driveyes // (c) 1992?
+ // 1992, ShimDrive
+aircomb // (c) 1992 (US)
+aircombj // (c) 1992 (Japan)
+cybsled // (c) 1993
+cybsledj // (c) 1993
+
+// Galaxian 3 HW
+gal3 // (c) 1992 (Arcade TV Game List - P.73, Right, 6 from top)
+
+// Namco System 22 games
+ridgerac // (c) 1993
+ridgeracb // (c) 1993
+ridgeracj // (c) 1993
+ridgerac3 // (c) 1993
+rrf // (c) 1993
+acedrvrw // (c) 1994
+alpinerd // (c) 1994
+alpinerc // (c) 1994
+ridgera2 // (c) 1994
+ridgera2j // (c) 1994
+ridgera2ja // (c) 1994
+raveracw // (c) 1995
+raveracj // (c) 1995
+raveracja // (c) 1995
+airco22b // (c) 1995
+alpinr2b // (c) 1995
+alpinr2a // (c) 1995
+cybrcomm // (c) 1995
+cybrcycc // (c) 1995
+timecris // (c) 1995
+timecrisa // (c) 1995
+dirtdash // (c) 1995
+victlapw // (c) 1996
+alpinesa // (c) 1996
+propcycl // (c) 1996
+tokyowar // (c) 1996
+aquajet // (c) 1996
+
+// Namco System 23
+finlflng // July 1997
+motoxgo // November 1997
+rapidrvr // December 1997
+rapidrvr2 // December 1997
+downhill // March 1998
+timecrs2 // April 1998
+timecrs2b // April 1998
+timecrs2c // April 1998
+panicprk // May 1998
+raceon // Race On - September 1998
+gunwars // September 1998
+ // Angler King - March 1999
+500gp // March 1999
+finfurl2 // March 1999
+finfurl2j // March 1999
+ // Guitar Jam - July 1999
+crszone // Crisis Zone - December 1999
+crszonea // Crisis Zone - December 1999
+crszoneb // Crisis Zone - December 1999
+
+// Namco System 246
+sys246
+rrvac
+dragchrn
+netchu02
+scptour
+soulclb2
+soulcl2a
+soulcl2b
+tekken4
+tekken4a
+tekken4b
+timecrs3
+zgundm
+fghtjam
+sukuinuf
+zgundmdx
+gundzaft
+soulclb3
+
+// Namco System 256
+sys256
+tekken51
+kinniku
+taiko9
+taiko10
+
+// Misc Namco games
+25pacman // (c) 2005 Ver 2.0 - Same hardware as 20pacgal
+20pacgal // (c) 2000 Ver 1.08
+20pacgalr4 // (c) 2000 Ver 1.04
+20pacgalr3 // (c) 2000 Ver 1.03
+20pacgalr2 // (c) 2000 Ver 1.02
+20pacgalr1 // (c) 2000 Ver 1.01
+20pacgalr0 // (c) 2000 Ver 1.00
+turrett // (c) 2001 licensed from Dell Electronics
+
+// Universal games
+cosmicg // 7907 (c) 1979
+cosmica // 7910-AII (c) [1979]
+cosmica1 // 7910-A (c) [1979]
+cosmica2 // 7910 (c) 1979
+nomnlnd // 8003 (c) [1980?]
+nomnlndg // 8003 (c) [1980?] + Gottlieb
+magspot // ???? (c) [1980]
+magspot2 // 8013 (c) [1980]
+panic // 8015 (c) 1980
+panic2 // 8015 (c) 1980
+panic3 // 8015 (c) 1980
+panich // 8015 (c) 1980
+panicger // 8015 (c) 1980
+devzone // 8022 (c) [1980]
+devzone2 // 8022 (c) [1980]
+cheekyms // 8004 (c) [1980?]
+zerohour // 8011 (c) Universal
+zerohoura // 8011 (c) Universal
+redclash // (c) 1981 Tehkan
+redclasha // (c) 1981 Tehkan
+redclashk // (c) Kaneko (bootleg?)
+cavenger // 8106 (c) 1981
+ladybug // 8110 (c) 1981
+ladybugb // bootleg
+ladybgb2 // bootleg
+snapjack // ???? (c)
+sraider // ???? (c) 1982 Universal
+dorodon // Falcon
+dorodon2 // Falcon
+mrdo // 8201 (c) 1982
+mrdoy // 8201 (c) 1982
+mrdot // 8201 (c) 1982 + Taito license
+mrdofix // 8201 (c) 1982 + Taito license
+mrlo // bootleg
+mrdu // bootleg
+yankeedo // bootleg
+docastle // 8302 (c) 1983
+docastle2 // 8302 (c) 1983
+docastleo // 8302 (c) 1983
+douni // 8302 (c) 1983
+dorunrun // ???? (c) 1984
+dorunrun2 // ???? (c) 1984
+dorunrunc // ???? (c) 1984
+dorunrunca // ???? (c) 1984
+spiero // ???? (c) 1987
+dowild // ???? (c) 1984
+jjack // ???? (c) 1984
+kickridr // ???? (c) 1984
+idsoccer // ???? (c) 1985
+idsoccera // ???? (c) 1985
+asoccer // 8461 (c) 1987
+superdq // ???? (c) 1984
+superdqs // ???? (c) 1984
+superdqa // ???? (c) 1984
+
+// Nintendo games
+spacefev // (c) 1979 Nintendo
+spacefevo // (c) 1979 Nintendo
+spacefevo2 // (c) 1979 Nintendo
+highsplt // (c) 1979 Nintendo
+highsplta // (c) 1979 Nintendo
+highspltb // (c) 1979 Nintendo
+spacelnc // (c) 1979 Nintendo
+sheriff // (c) 1979 Nintendo
+bandido // (c) 1980 Exidy
+helifire // (c) 1980 Nintendo
+helifirea // (c) 1980 Nintendo
+radarscp // (c) 1980 Nintendo
+radarscp1 // (c) 1980 Nintendo
+dkong // (c) 1981 Nintendo of America
+dkongo // (c) 1981 Nintendo
+dkongj // (c) 1981 Nintendo
+dkongjo // (c) 1981 Nintendo
+dkongjo1 // (c) 1981 Nintendo
+dkongf // hack from Jeff's Romhack
+dkongx // hack
+dkongx11 // hack
+dkongjr // (c) 1982 Nintendo of America
+dkongjrj // (c) 1982 Nintendo
+dkongjnrj // (c) 1982 Nintendo
+dkongjrb // bootleg
+jrking // bootleg
+dkongjre // (c) 1982 Nintendo of America
+dkong3 // (c) 1983 Nintendo of America
+dkong3j // (c) 1983 Nintendo
+dkong3b // bootleg
+mario // (c) 1983 Nintendo of America
+marioe // (c) 1983 Nintendo of America
+marioo // (c) 1983 Nintendo of America
+marioj // (c) 1983 Nintendo
+masao // bootleg
+pestplce // bootleg on donkey kong hw
+spclforc // (c) 1985 Senko Industries (Magic Eletronics Inc. license)
+spcfrcii // (c) 1985 Senko Industries (Magic Eletronics Inc. license)
+8ballact // (c) 1984 Seatongrove Ltd (Magic Eletronics USA license)
+8ballact2 // (c) 1984 Seatongrove Ltd (Magic Eletronics USA license)
+shootgal // (c) 1984 Seatongrove Ltd (Zaccaria license)
+drakton // (c) 1984 Epos Corporation
+drktnjr // (c) 1984 Epos Corporation
+strtheat // (c) 1985 Epos Corporation
+hunchbkd // (c) 1983 Century
+sbdk // (c) 1984 Century
+herbiedk // (c) 1984 CVS
+herodk // (c) 1984 Seatongrove + Crown license
+herodku // (c) 1984 Seatongrove + Crown license
+skyskipr // (c) 1981
+popeye // (c) 1982
+popeyeu // (c) 1982
+popeyef // (c) 1982
+popeyebl // bootleg
+punchout // (c) 1984
+punchita // bootleg
+spnchout // (c) 1984
+spnchoutj // (c) 1984 (Japan)
+armwrest // (c) 1985
+
+// Nintendo Playchoice 10 games
+playch10
+pc_tenis // (c) 1983 Nintendo
+pc_mario // (c) 1983 Nintendo
+pc_bball // (c) 1984 Nintendo of America
+pc_bfght // (c) 1984 Nintendo
+pc_ebike // (c) 1984 Nintendo
+pc_golf // (c) 1984 Nintendo
+pc_kngfu // (c) 1984 Irem (Nintendo license)
+pc_1942 // (c) 1985 Capcom
+pc_smb // (c) 1985 Nintendo
+pc_vball // (c) 1986 Nintendo
+pc_duckh // (c) 1984 Nintendo
+pc_hgaly // (c) 1984 Nintendo
+pc_wgnmn // (c) 1984 Nintendo
+pc_grdus // (c) 1986 Konami
+pc_grdue // (c) 1986 Konami
+pc_tkfld // (c) 1987 Konami (Nintendo of America license)
+pc_pwrst // (c) 1986 Nintendo
+pc_trjan // (c) 1986 Capcom USA (Nintendo of America license)
+pc_cvnia // (c) 1987 Konami (Nintendo of America license)
+pc_dbldr // (c) 1987 Konami (Nintendo of America license)
+pc_rnatk // (c) 1987 Konami (Nintendo of America license)
+pc_rygar // (c) 1987 Tecmo (Nintendo of America license)
+pc_cntra // (c) 1988 Konami (Nintendo of America license)
+pc_goons // (c) 1986 Konami
+pc_mtoid // (c) 1986 Nintendo
+pc_radrc // (c) 1987 Square
+pc_miket // (c) 1987 Nintendo
+pc_rcpam // (c) 1987 Rare
+pc_ngaid // (c) 1989 Tecmo (Nintendo of America license)
+pc_tmnt // (c) 1989 Konami (Nintendo of America license)
+pc_ftqst // (c) 1989 Sunsoft (Nintendo of America license)
+pc_bstar // (c) 1989 SNK (Nintendo of America license)
+pc_tbowl // (c) 1989 Tecmo (Nintendo of America license)
+pc_drmro // (c) 1990 Nintendo
+pc_ynoid // (c) 1990 Capcom USA (Nintendo of America license)
+pc_rrngr // (c) Capcom USA (Nintendo of America license)
+pc_ddrgn // (c) 1988 Technos
+pc_gntlt // (c) 1985 Atari/Tengen (Nintendo of America license)
+pc_smb2 // (c) 1988 Nintendo
+pc_smb3 // (c) 1988 Nintendo
+pc_mman3 // (c) 1990 Capcom USA (Nintendo of America license)
+pc_radr2 // (c) 1990 Square (Nintendo of America license)
+pc_suprc // (c) 1990 Konami (Nintendo of America license)
+pc_tmnt2 // (c) 1990 Konami (Nintendo of America license)
+pc_wcup // (c) 1990 Technos (Nintendo license)
+pc_ngai2 // (c) 1990 Tecmo (Nintendo of America license)
+pc_ngai3 // (c) 1991 Tecmo (Nintendo of America license)
+pc_pwbld // (c) 1991 Taito (Nintendo of America license)
+pc_rkats // (c) 1991 Atlus (Nintendo of America license)
+pc_pinbt // (c) 1988 Rare (Nintendo of America license)
+pc_cshwk // (c) 1989 Rare (Nintendo of America license)
+pc_sjetm // (c) 1990 Rare
+pc_moglf // (c) 1991 Nintendo
+
+// Nintendo VS games
+btlecity // (c) 1985 Namco
+starlstr // (c) 1985 Namco
+cstlevna // (c) 1987 Konami
+cluclu // (c) 1984 Nintendo
+drmario // (c) 1990 Nintendo
+duckhunt // (c) 1985 Nintendo
+excitebk // (c) 1984 Nintendo
+excitebkj // (c) 1984 Nintendo
+goonies // (c) 1986 Konami
+hogalley // (c) 1985 Nintendo
+iceclimb // (c) 1984 Nintendo
+iceclimbj // (c) 1984 Nintendo
+ladygolf // (c) 1984 Nintendo
+ladygolfe // (c) 1984 Nintendo
+machridr // (c) 1985 Nintendo
+machridrj // (c) 1985 Nintendo
+rbibb // (c) 1987 Namco
+rbibba // (c) 1987 Namco
+suprmrio // (c) 1986 Nintendo
+suprmrioa // (c) 1986 Nintendo
+suprmriobl // bootleg
+suprmriobl2 // bootleg
+skatekds // (c) 1988 (hack)
+vsskykid // (c) 1986 Namco
+tkoboxng // (c) 1987 Data East
+smgolf // (c) 1984 Nintendo
+smgolfj // (c) 1984 Nintendo
+vspinbal // (c) 1984 Nintendo
+vspinbalj // (c) 1984 Nintendo
+vsslalom // (c) 1986 Nintendo
+vssoccer // (c) 1985 Nintendo
+vssoccerj // (c) 1985 Nintendo
+vsgradus // (c) 1986 Konami
+platoon // (c) 1987 Ocean
+vstetris // (c) 1988 Atari
+mightybj // (c) 1986 Tecmo
+jajamaru // (c) 1985 Jaleco
+topgun // (c) 1987 Konami
+bnglngby // (c) 1985 Nintendo / Broderbund Software Inc.
+vstennis // (c) 1984 Nintendo
+vstennisj // (c) 1984 Nintendo
+wrecking // (c) 1984 Nintendo
+balonfgt // (c) 1984 Nintendo
+vsmahjng // (c) 1984 Nintendo
+vsbball // (c) 1984 Nintendo
+vsbballj // (c) 1984 Nintendo
+vsbballja // (c) 1984 Nintendo
+vsbballjb // (c) 1984 Nintendo
+iceclmrj // (c) 1984 Nintendo
+vsgshoe // (c) 1986 Nintendo
+supxevs // (c) 1986 Nintendo
+vsfdf // (c) 1986 Sunsoft
+smgolfb // (c) 1985 Nintendo
+
+// NES-based hacks
+multigam // 1992
+multigmb // 1992
+multigm2 // 1992
+multigm3 // 19??
+multigmt
+supergm3 // 1996
+cham24 // 2002
+
+// Famicom Box
+famibox // 1986
+
+// Nintendo Super System Games
+nss
+nss_ssoc // 1992 Human Inc.
+nss_actr // 1992 Enix
+nss_con3 // 1992 Konami
+nss_adam // 1992 Ocean
+nss_aten // 1992 Absolute Entertainment Inc.
+nss_rob3 // 1992 Ocean
+nss_ncaa // 1992 Sculptured Software Inc.
+nss_skin // 1992 Irem
+nss_lwep // 1992 Nintendo
+nss_smw // 1991 Nintendo
+nss_fzer // 1991 Nintendo
+nss_sten // 199? Nintendo
+
+// Super Famicom Box Games
+sfcbox
+//pss61 - Super Mario Kart / Super Mario Collection / Star Fox
+pss62 // 199? T & E Soft / I'Max
+//pss63 - Super Donkey Kong / Super Tetris 2 + Bombliss
+//pss64 - Super Donkey Kong / Super Bomberman 2
+
+
+
+// SNES-based hacks
+kinstb // bootleg
+ffight2b // bootleg
+sblast2b // bootleg
+iron // bootleg
+endless // bootleg
+denseib // bootleg
+
+
+// Midway 8080 b/w games
+seawolf // 596 [1976]
+seawolfo // 596 [1976]
+gunfight // 597 [1975]
+gunfighto // 597 [1975]
+ // 603 - Top Gun [1976]
+tornbase // 605 [1976]
+280zzzap // 610 [1976]
+maze // 611 [1976]
+boothill // 612 [1977]
+checkmat // 615 [1977]
+desertgu // 618 [1977]
+roadrunm // 618 [1977]
+dplay // 619 [1977]
+lagunar // 622 [1977]
+gmissile // 623 [1977]
+m4 // 626 [1977]
+clowns // 630 [1978]
+clowns1 // 630 [1978]
+spacwalk // 640 [1978]
+einning // 642 [1978] Midway
+shuffle // 643 [1978]
+dogpatch // 644 [1977]
+spcenctr // 645 (c) 1980 Midway
+phantom2 // 652 [1979]
+bowler // 730 [1978] Midway
+invaders // 739 [1979]
+blueshrk // 742 [1978]
+invad2ct // 851 (c) 1980 Midway
+invadpt2 // 852 [1980] Taito
+invaddlx // 852 [1980] Midway
+vortex // 852 [1980] Zilec Electronics Ltd.
+moonbase // Taito
+moonbasea // Zeta - Nichibutsu
+ // 870 - Space Invaders Deluxe cocktail
+searthin // bootleg
+searthina // bootleg
+invadrmr // (c) 1978 Model Racing
+modelr // (c) 19?? Model Racing
+spaceatt // (c) 1978 Video Games GMBH
+spaceat2 // (c) 1980 Zenitone-Microsec Ltd
+sinvzen // Zenitone-Microsec Ltd
+superinv // bootleg
+invasion // Sidam
+invasiona // bootleg
+invasionb // bootleg
+invasionrz // bootleg
+invasionrza // bootleg
+sstrangr // (c) 1978 Yachiyo Electronics, Ltd.
+sstrangr2 // (c) 1979 Yachiyo Electronics, Ltd.
+sinvemag // Zenitone-Microsec Ltd.
+jspecter // (c) 1979 Jatre
+jspecter2 // (c) 1979 Jatre
+invrvnge // Zenitone-Microsec Ltd.
+invrvngea // Zenitone-Microsec Ltd. (Dutchford license)
+galxwars // (c) 1979 Universal
+galxwars2 // (c) 1979 Universal
+galxwarst // (c) 1979 Taito?
+starw // bootleg
+lrescue // LR (c) 1979 Taito
+mlander // (c) 1980 Leisure Time Electronics
+lrescuem // Model Racing bootleg
+grescue // bootleg?
+desterth // bootleg
+cosmicmo // Universal
+cosmicm2 // Universal
+rollingc // Nichibutsu
+ozmawars // Shin Nihon Kikaku (SNK)
+ozmawars2 // Shin Nihon Kikaku (SNK)
+solfight // bootleg
+spaceph // Zilec Games
+galactic // (c) 19?? Taito
+spacmiss // bootleg?
+schaser // RT Taito
+schasercv // RT Taito
+lupin3 // LP (c) 1980 Taito
+lupin3a // LP (c) 1980 Taito
+intruder // (c) 1980 GamePlan (Taito)
+spclaser // (c) 1980 GamePlan (Taito)
+laser // (c) 1980 Leisure Time Electronics Inc.
+spcewarl // (c) 1979 Leijac Corporation (Konami)
+polaris // PS (c) 1980 Taito
+polarisa // PS (c) 1980 Taito
+polariso // PS (c) 1980 Taito
+ballbomb // TN (c) 1980 Taito
+indianbt // (c) 1980 Taito
+steelwkr // (c) 1980 Taito
+m79amb // (c) 1977 RamTek
+alieninv // Margamatics
+alieninvp2 // bootleg
+tst_invd // Test ROM
+sitv // (c) 1979 Taito
+sicv // (c) 1979 Taito
+sisv // (c) 1978 Taito
+sisv2 // (c) 1978 Taito
+spacewr3 // bootleg
+invaderl // bootleg
+invader4 // bootleg
+yosakdon // (c) 1979 Yosaku To Donbei
+yosakdona // (c) 1979 Yosaku To Donbei
+spceking // (c) 1978 Leijac Corporation (Konami)
+spcewars // (c) 1978 Sanritsu
+astropal // (c) 19?? Sidam
+cosmo // TDS+Mints
+darthvdr // bootleg
+
+18w // 653 (c) 1979 Midway
+18w2 // 653 (c) 1979 Midway
+sspeedr // 1979 Midway
+
+// Similar but with a M6800 instead of an 8080
+sflush // (c)1979 Taito
+
+// Meadows S2650 games
+lazercmd // [1976?]
+bbonk // [1976?]
+deadeye // [1978?]
+bowl3d // [1978?]
+gypsyjug // [1978?]
+minferno // [1978?]
+medlanes // [1977?]
+
+// CVS games
+cosmos // (c) 1981 Century
+darkwar // (c) 1981 Century
+spacefrt // (c) 1981 Century
+8ball // (c) 1982 Century
+8ball1 // (c) 1982 Century
+logger // (c) 1982 Century
+dazzler // (c) 1982 Century
+diggerc // (c) 1982 Century
+wallst // (c) 1982 Century
+radarzon // (c) 1982 Century
+radarzon1 // (c) 1982 Century
+radarzont // (c) 1982 Tuni Electro Service
+outline // (c) 1982 Century
+goldbug // (c) 1982 Century
+heartatk // (c) 1983 Century Electronics
+hunchbak // (c) 1983 Century
+hunchbaka // (c) 1983 Century
+superbik // (c) 1983 Century
+raiders // (c) 1983 Century Electronics UK
+hero // (c) 1983 Seatongrove (c) 1984 CVS
+huncholy // (c) 1984 Seatongrove (c) CVS
+
+// Zaccaria Hardware (similar to CVS)
+quasar // (c) 1980 Zelco Games Italy
+quasara // (c) 1980 Zelco Games Italy
+
+// Midway "Astrocade" games
+seawolf2 // (c) 1978
+spacezap // (c) 1980
+ebases // (c) 1980
+wow // (c) 1980
+wowg // (c) 1980
+gorf // (c) 1981
+gorfpgm1 // (c) 1981
+gorfpgm1g // (c) 1981
+robby // (c) 1981 Bally Midway
+demndrgn // (c) 1982 Bally Midway
+profpac // (c) 1983 Bally Midway
+tenpindx // (c) 1983 Bally Midway
+
+// Bally Midway MCR games
+// MCR1
+solarfox // (c) 1981
+kick // (c) 1981
+kickman // (c) 1981
+kickc // (c) 1981
+// MCR2
+shollow // (c) 1981
+shollow2 // (c) 1981
+tron // (c) 1982
+tron2 // (c) 1982
+tron3 // (c) 1982
+tron4 // (c) 1982
+kroozr // (c) 1982
+domino // (c) 1982
+wacko // (c) 1982
+twotiger // (c) 1984
+twotigerc // (c) 1984
+// MCR2 + MCR3 sprites
+journey // (c) 1983
+// MCR3
+tapper // (c) 1983
+tappera // (c) 1983
+sutapper // (c) 1983
+rbtapper // (c) 1984
+timber // (c) 1984
+dotron // (c) 1983
+dotrona // (c) 1983
+dotrone // (c) 1983
+nflfoot // (c) 1983 + laserdisk
+demoderb // (c) 1984
+demoderm // (c) 1984
+sarge // (c) 1985
+rampage // (c) 1986
+rampage2 // (c) 1986
+powerdrv // (c) 1986
+stargrds // (c) 1987
+maxrpm // (c) 1986
+spyhunt // (c) 1983
+spyhuntp // (c) 1983
+turbotag // (c) 1985
+crater // (c) 1984
+// MCR 68000
+zwackery // (c) 1984
+xenophob // (c) 1987
+spyhunt2 // (c) 1987
+spyhunt2a // (c) 1987
+intlaser // (c) 1987
+blasted // (c) 1988
+archrivl // (c) 1989
+archrivl2 // (c) 1989
+trisport // (c) 1989
+pigskin // (c) 1990
+pigskina // (c) 1990
+
+// Bally / Sente games
+sentetst
+cshift // (c) 1984
+gghost // (c) 1984
+hattrick // (c) 1984
+otwalls // (c) 1984
+snakepit // (c) 1984
+snakjack // (c) 1984
+stocker // (c) 1984
+triviag1 // (c) 1984
+trivia12 // (c) 1984
+triviag2 // (c) 1984
+triviasp // (c) 1984
+triviayp // (c) 1984
+triviabb // (c) 1984
+triviaes // (c) 1984
+gimeabrk // (c) 1985
+minigolf // (c) 1985
+minigolf2 // (c) 1985
+toggle // (c) 1985
+nametune // (c) 1986
+nametune2 // (c) 1986
+nstocker // (c) 1986
+nstocker2 // (c) 1986
+sfootbal // (c) 1986
+spiker // (c) 1986
+stompin // (c) 1986
+rescraid // (c) 1987
+rescraida // (c) 1987
+grudge // prototype - Bally/Midway
+shrike // (c) 1987
+gridlee // [1983 Videa] prototype - no copyright notice
+
+// Irem games
+// trivia: IREM means "International Rental Electronics Machines"
+andromed // (c) 1979
+ipminvad // M10 no copyright notice (Arcade TV Game List - P.67, Left, 26 from top)
+ipminvad1 // M10 incomplete dump
+ptrmj // M14 (c) 1979
+skychut // Irem [1980]
+spacbeam // M15 no copyright notice
+greenber // Irem
+headoni // Irem no copyright notice (1979 - Arcade TV Game List - P.98, Left, 7 from top
+
+panther // M27 no copyright notice
+redalert // M27 (c) 1981 + "GDI presents"
+demoneye // M27 (c) 1981
+ww3 // M27 (c) 1981
+
+olibochu // M47 (c) 1981 + "GDI presents"
+mpatrol // M52 (c) 1982
+mpatrolw // M52 (c) 1982 + Williams license
+alpha1v // Vision Electronics
+troangel // (c) 1983
+newtangl // (c) 1983
+10yard // (c) 1983
+10yardj // (c) 1983
+vs10yard // (c) 1983/1984
+vs10yardj // (c) 1983/1984
+vs10yardu // (c) 1983/1984
+10yard85 // (c) 1985
+travrusa // (c) 1983
+motorace // (c) 1983 Williams license
+shtrider // (c) 1984 Seibu Kaihatsu
+shtridera // (c) 1984 Seibu Kaihatsu
+wilytowr // M63 (c) 1984
+atomboy // M63 (c) 1985 Irem + Memetron license
+atomboya // M63 (c) 1985 Irem + Memetron license
+fghtbskt // (c) 1984 Paradise Co. Ltd.
+// M62
+kungfum // (c) 1984
+kungfumd // (c) 1984 + Data East license
+spartanx // (c) 1984 (Japan)
+kungfub // bootleg
+kungfub2 // bootleg
+battroad // (c) 1984
+ldrun // (c) 1984 licensed from Broderbund
+ldruna // (c) 1984 licensed from Broderbund
+ldrun2 // (c) 1984 licensed from Broderbund
+ldrun3 // (c) 1985 licensed from Broderbund
+ldrun3j // (c) 1985 licensed from Broderbund
+ldrun4 // (c) 1986 licensed from Broderbund
+lotlot // (c) 1985 licensed from Tokuma Shoten
+kidniki // (c) 1986 + Data East USA license
+kidnikiu // (c) 1986 + Data East USA license
+yanchamr // (c) 1986 (Japan)
+lithero // bootleg
+spelunkr // (c) 1985 licensed from Broderbund
+spelunkrj // (c) 1985 licensed from Broderbund
+spelunk2 // (c) 1986 licensed from Broderbund
+horizon // (c) 1985
+youjyudn // (c) 1986 (Japan)
+
+vigilant // (c) 1988 (World)
+vigilant1 // (c) 1988 (World)
+vigilantu // (c) 1988 (US)
+vigilantj // (c) 1988 (Japan)
+kikcubic // (c) 1988 (Japan)
+kikcubicb // bootleg
+buccanrs // (c) 1989 Duintronic
+buccanrsa // (c) 1989 Duintronic
+// M72 (and derivatives)
+rtype // (c) 1987 (Japan)
+rtypej // (c) 1987 (Japan)
+rtypejp // (c) 1987 (Japan)
+rtypeu // (c) 1987 + Nintendo USA license (US)
+rtypeb // bootleg
+bchopper // (c) 1987
+mrheli // (c) 1987 (Japan)
+nspirit // (c) 1988
+nspiritj // (c) 1988 (Japan)
+imgfight // (c) 1988 (Japan)
+imgfighto // (c) 1988 (Japan)
+loht // (c) 1989
+lohtj // (c) 1989 (Japan)
+lohtb // (c) 1989 (bootleg)
+lohtb2 // (c) 1989 (bootleg)
+xmultipl // (c) 1989 (Japan)
+xmultiplm72 // (c) 1989 (Japan)
+dbreed // (c) 1989
+dbreedm72 // (c) 1989
+rtype2 // (c) 1989
+rtype2j // (c) 1989 (Japan)
+rtype2jc // (c) 1989 (Japan)
+majtitle // (c) 1990 (World)
+majtitlej // (c) 1990 (Japan)
+hharry // (c) 1990 (World)
+hharryu // (c) 1990 Irem America (US)
+dkgensan // (c) 1990 (Japan)
+dkgensanm72 // (c) 1990 (Japan)
+poundfor // (c) 1990 (World)
+poundforj // (c) 1990 (Japan)
+poundforu // (c) 1990 Irem America (US)
+airduel // (c) 1990 (Japan)
+cosmccop // (c) 1991 (World)
+gallop // (c) 1991 (Japan)
+kengo // (c) 1991
+// not M72, but same sound hardware
+sichuan2 // (c) 1989 Tamtex
+sichuan2a // (c) 1989 Tamtex
+shisen // (c) 1989 Tamtex
+matchit // (c) 1989 Tamtex
+// M90
+hasamu // (c) 1991 Irem (Japan)
+dynablst // (c) 1991 Irem (World)
+dynablstb // bootleg
+bombrman // (c) 1991 Irem (Japan)
+atompunk // (c) 1991 Irem America (licensed from Hudson Soft)
+// M97
+bbmanw // (c) 1992 Irem (World)
+bbmanwj // (c) 1992 Irem (Japan)
+bomblord // bootleg
+newapunk // (c) 1992 Irem America (US)
+quizf1 // (c) 1992 Irem (Japan)
+riskchal // (c) 1993 Irem
+gussun // (c) 1993 Irem (Japan)
+matchit2 // (c) 1993 Tamtex
+shisen2 // (c) 1993 Tamtex
+// M92
+gunforce // (c) 1991 Irem (World)
+gunforceu // (c) 1991 Irem America (US)
+gunforcej // (c) 1991 Irem (Japan)
+bmaster // (c) 1991 Irem
+crossbld // (c) 1991 Irem (Japan)
+lethalth // (c) 1991 Irem (World)
+thndblst // (c) 1991 Irem (Japan)
+uccops // (c) 1992 Irem (World)
+uccopsu // (c) 1992 Irem (US)
+uccopsar // (c) 1992 Irem (World)
+uccopsj // (c) 1992 Irem (Japan)
+mysticri // (c) 1992 Irem (World)
+mysticrib // bootleg?
+gunhohki // (c) 1992 Irem (Japan)
+majtitl2 // (c) 1992 Irem (World)
+majtitl2j // (c) 1992 Irem (Japan)
+skingame // (c) 1992 Irem America (US)
+skingame2 // (c) 1992 Irem America (US)
+hook // (c) 1992 Irem (World)
+hooku // (c) 1992 Irem America (US)
+hookj // (c) 1992 Irem (Japan)
+ppan // bootleg
+rtypeleo // (c) 1992 Irem (World)
+rtypeleoj // (c) 1992 Irem (Japan)
+inthunt // (c) 1993 Irem (World)
+inthuntu // (c) 1993 Irem (US)
+kaiteids // (c) 1993 Irem (Japan)
+nbbatman // (c) 1993 Irem America (US)
+leaguemn // (c) 1993 Irem (Japan)
+ssoldier // (c) 1993 Irem America (US)
+psoldier // (c) 1993 Irem (Japan)
+dsoccr94j // (c) 1994 Irem (Japan)
+gunforc2 // (c) 1994 Irem
+geostorm // (c) 1994 Irem (Japan)
+// M107
+firebarr // (c) 1993 Irem (Japan)
+dsoccr94 // (c) 1994 Irem (Data East Corporation license)
+kftgoal // (c) 1994 Jaleco
+wpksoc // (c) 1995 Jaleco
+
+// Gottlieb/Mylstar games (Gottlieb became Mylstar in 1983)
+reactor // GV-100 (c) 1982 Gottlieb
+mplanets // GV-102 (c) 1983 Gottlieb
+mplanetsuk // GV-102 (c) 1983 Gottlieb
+qbert // GV-103 (c) 1982 Gottlieb
+qberta // GV-103 (c) 1982 Gottlieb
+qbertj // GV-103 (c) 1982 Gottlieb + Konami license
+myqbert // GV-103?(c) 1982 Gottlieb
+qberttst // GV-103 (c) 1982 Gottlieb
+qbtrktst // GV-103 (c) 1982 Gottlieb
+insector // GV-??? (c) 1982 Gottlieb - never released
+tylz // GV-??? (c) 1982 Gottlieb - never released
+argusg // GV-??? (c) 1982 Gottlieb - never released
+krull // GV-105 (c) 1983 Gottlieb
+kngtmare // GV-??? (c) 1983 Gottlieb - never released
+sqbert // GV-??? (c) 1983 Mylstar - never released
+mach3 // GV-109 (c) 1983 Mylstar
+cobram3 // ...... (c) 1984 Data East
+usvsthem // GV-??? (c) 198? Mylstar
+3stooges // GV-113 (c) 1984 Mylstar
+qbertqub // GV-119 (c) 1983 Mylstar
+screwloo // GV-123 (c) 1983 Mylstar - never released
+curvebal // GV-134 (c) 1984 Mylstar
+vidvince // GV-??? (c) 1984 Mylstar - never released
+wizwarz // GV-??? (c) 1984 Mylstar - never released
+
+// Taito "Qix hardware" games
+qix // LK (c) 1981 Taito America Corporation
+qixa // LK (c) 1981 Taito America Corporation
+qixb // LK (c) 1981 Taito America Corporation
+qixo // LK (c) 1981 Taito America Corporation
+qix2 // ?? (c) 1981 Taito America Corporation
+sdungeon // SD (c) 1981 Taito America Corporation
+elecyoyo // YY (c) 1982 Taito America Corporation
+elecyoyo2 // YY (c) 1982 Taito America Corporation
+kram // KS (c) 1982 Taito America Corporation
+kram2 // KS (c) 1982 Taito America Corporation
+kram3 // KS (c) 1982 Taito America Corporation
+zookeep // ZA (c) 1982 Taito America Corporation
+zookeep2 // ZA (c) 1982 Taito America Corporation
+zookeep3 // ZA (c) 1982 Taito America Corporation
+slither // (c) 1982 Century II
+slithera // (c) 1982 Century II
+complexx // CX (c) 1984 Taito America Corporation
+
+// Taito SJ System games
+spaceskr // EB (c) 1981 Taito Corporation
+spacecr // CG (c) 1981 Taito Corporation
+junglek // KN (c) 1982 Taito Corporation
+junglekj2 // KN (c) 1982 Taito Corporation
+jungleh // KN (c) 1982 Taito America Corporation
+junglehbr // KN (c) 1982 Taito do Brasil
+piratpet // KN (c) 1982 Taito America Corporation
+jungleby // bootleg
+alpine // RH (c) 1982 Taito Corporation
+alpinea // RH (c) 1982 Taito Corporation
+timetunl // UN (c) 1982 Taito Corporation
+wwestern // WW (c) 1982 Taito Corporation
+wwestern1 // WW (c) 1982 Taito Corporation
+frontlin // FL (c) 1982 Taito Corporation
+elevator // EA (c) 1983 Taito Corporation
+elevatorb // bootleg
+tinstar // A10 (c) 1983 Taito Corporation
+tinstar2 // A10 (c) 1983 Taito Corporation
+waterski // A03 (c) 1983 Taito Corporation
+bioatack // AA8 (c) 1983 Taito Corporation + Fox Video Games license
+hwrace // AC4 (c) 1983 Taito Corporation
+sfposeid // A14 (c) 1984 Taito Corporation
+kikstart // A20 (c) 1984 Taito Corporation
+
+// other Taito games
+fgoal // TF (c) 1979 Taito Corporation
+fgoala // MF (c) 1979 Taito Corporation
+crbaloon // CL (c) 1980 Taito Corporation
+crbaloon2 // CL (c) 1980 Taito Corporation
+sbowling // KB (c) 1982 Taito Corporation
+grchamp // GM (c) 1981 Taito Corporation
+marinedt // MG (c) 1981 Taito Corporation
+changela // ??? (c) 1983 Taito Corporation
+fspiderb // bootleg
+jollyjgr // KD (c) 1982 Taito Corporation
+bking // DM (c) 1982 Taito Corporation
+bking2 // AD6 (c) 1983 Taito Corporation
+bking3 // A24 (c) 1984 Taito Corporation
+chaknpop // A04 (c) 1983 Taito Corporation
+josvolly // AA (c) 1983 Taito Corporation
+gsword // AC (c) 1984 Taito Corporation
+gsword2 // AC (c) 1984 Taito Corporation
+cyclemb // P0 (c) 1984 Taito Corporation [+ Seta]
+pitnrun // PR (c) 1984 Taito Corporation
+pitnruna // PR (c) 1984 Taito Corporation
+lkage // A54 (c) 1984 Taito Corporation
+lkageo // A54 (c) 1984 Taito Corporation
+lkageoo // A54 (c) 1984 Taito Corporation
+lkageb // bootleg
+lkageb2 // bootleg
+lkageb3 // bootleg
+bygone // prototype ? A53 (c) 1985 Taito Corporation
+msisaac // A34 (c) 1985 Taito Corporation
+retofinv // A37 (c) 1985 Taito Corporation
+retofinv1 // bootleg
+retofinv2 // bootleg
+fightrol // (c) 1983 Taito
+rollace // (c) 1983 Williams
+rollace2 // (c) 1983 Williams
+lgp // (c) 1983 Taito
+vsgongf // (c) 1984 Kaneko
+ringfgt // (c) 1984 Taito
+ringfgt2 // (c) 1984 Taito
+fieldday // A23 (c) 1984 Taito
+undoukai // A17 (c) 1984 Taito
+40love // A30 (c) 1984 Taito
+tsamurai // A35 (c) 1985 Taito
+tsamurai2 // A35 (c) 1985 Taito
+tsamuraih // bootleg
+ladymstr // A49 (c) 1985 Taito
+nunchaku // ??? (c) 1985 Taito
+yamagchi // A38 (c) 1985 Taito
+m660 // ??? (c) 1986 Taito America Corporation
+m660j // ??? (c) 1986 Taito Corporation (Japan)
+m660b // bootleg
+alphaxz // AZ (c) 1986 Ed/Wood Place
+buggychl // A22 (c) 1984 Taito Corporation
+buggychlt // A22 (c) 1984 Taito Corporation + Tefri license
+ssrj // A40 (c) 1985 Taito Corporation
+bigevglf // A67 (c) 1986 Taito America Corporation (US)
+bigevglfj // A67 (c) 1986 Taito Corporation (Japan)
+flstory // A45 (c) 1985 Taito Corporation
+flstoryj // A45 (c) 1985 Taito Corporation (Japan)
+onna34ro // A52 (c) 1985 Taito Corporation (Japan)
+onna34roa // A52 (c) 1985 Taito Corporation (Japan)
+victnine // A16 (c) 1985 Taito Corporation (Japan)
+rumba // A23 (c) 1985 Taito Corporation (Japan)
+gladiatr // QB (c) 1986 Taito America Corporation (US)
+ogonsiro // QB (c) 1986 Taito Corporation (Japan)
+greatgur // QB (c) 1986 Taito Corporation (Japan?)
+ppking // QO (c) 1985 Taito America Corporation (US)
+nycaptor // A50 (c) 1985 Taito Corporation
+cyclshtg // A97 (c) 1986 Taito Corporation
+bronx // bootleg
+colt // bootleg
+ksayakyu // ??? (c) 1985 Taito Corporation
+benberob // A26
+halleys // A62 (c) 1986 Taito America Corporation + Coin It (US)
+halleysc // A62 (c) 1986 Taito Corporation (Japan)
+halleycj // A62 (c) 1986 Taito Corporation (Japan)
+halley87 // A62 (c) 1986 Taito Corporation (Japan)
+lsasquad // A64 (c) 1986 Taito Corporation / Taito America (dip switch)
+storming // A64 (c) 1986 Taito Corporation
+daikaiju // A74 (c) 1986 Taito
+tokio // A71 1986
+tokioo // A71 1986
+tokiou // A71 1986
+tokiob // bootleg
+bublbobl // A78 (c) 1986 Taito Corporation
+bublbobl1 // A78 (c) 1986 Taito Corporation
+bublboblr // A78 (c) 1986 Taito America Corporation + Romstar license
+bublboblr1 // A78 (c) 1986 Taito America Corporation + Romstar license
+boblbobl // bootleg
+sboblboa // bootleg
+sboblbob // bootleg
+bub68705 // bootleg
+dland // bootleg
+missb2 // bootleg on enhanced hardware
+bublpong // bootleg on enhanced hardware
+kikikai // A85 (c) 1986 Taito Corporation
+knightb // bootleg
+kicknrun // A87 (c) 1986 Taito Corporation
+kicknrunu // A87 (c) 1986 Taito Corporation
+mexico86 // bootleg (Micro Research)
+darius // A96 (c) 1986 Taito Corporation Japan (World)
+dariusj // A96 (c) 1986 Taito Corporation (Japan)
+dariuso // A96 (c) 1986 Taito Corporation (Japan)
+dariuse // A96 (c) 1986 Taito Corporation (Japan)
+rastan // B04 (c) 1987 Taito Corporation Japan (World)
+rastanu // B04 (c) 1987 Taito America Corporation (US)
+rastanu2 // B04 (c) 1987 Taito America Corporation (US)
+rastsaga // B04 (c) 1987 Taito Corporation (Japan)
+rastsaga1 // B04 (c) 1987 Taito Corporation (Japan)
+topspeed // B14 (c) 1987 Taito Corporation Japan (World)
+topspeedu // B14 (c) 1987 Taito America Corporation (US)
+fullthrl // B14 (c) 1987 Taito Corporation (Japan)
+opwolf // B20 (c) 1987 Taito Corporation Japan (World)
+opwolfa // B20 (c) 1987 Taito Corporation Japan (World)
+opwolfj // B20 (c) 1987 Taito Corporation (Japan)
+opwolfu // B20 (c) 1987 Taito America Corporation (US)
+opwolfb // bootleg
+othunder // B67 (c) 1988 Taito Corporation Japan (World)
+othunderu // B67 (c) 1988 Taito America Corporation (US)
+othunderuo // B67 (c) 1988 Taito America Corporation (US)
+othunderj // B67 (c) 1988 Taito Corporation (Japan)
+rainbow // B22 (c) 1987 Taito Corporation
+rainbowo // B22 (c) 1987 Taito Corporation
+rainbowe // B39 (c) 1988 Taito Corporation
+jumping // bootleg
+arkanoid // A75 (c) 1986 Taito Corporation Japan (World)
+arkanoidu // A75 (c) 1986 Taito America Corporation + Romstar license (US)
+arkanoiduo // A75 (c) 1986 Taito America Corporation + Romstar license (US)
+arkanoidj // A75 (c) 1986 Taito Corporation (Japan)
+arkmcubl // bootleg
+ark1ball // bootleg
+arkangc // bootleg
+arkangc2 // bootleg
+arkblock // bootleg
+arkbloc2 // bootleg
+arkbloc3 // bootleg
+arkgcbl // bootleg
+arkgcbla // bootleg
+paddle2 // bootleg
+block2 // bootleg
+arkatayt // bootleg
+arktayt2 // bootleg
+arkatour // ??? (c) 1987 Taito America Corporation + Romstar license (US)
+tetrsark // ??? (c) D.R.Korea
+hexa // D. R. Korea
+sqix // B03 1987
+sqixr1 // B03 1987
+sqixu // B03 1987
+sqixb1 // bootleg? but (c) 1987
+sqixb2 // bootleg? but (c) 1987
+perestro // (c) 1994 Promat
+perestrof // (c) 1993 Promat / Fuuki
+pbillian // (c) 1986 Taito
+hotsmash // B18 (c) 1987 Taito
+exzisus // B12 (c) 1987 Taito Corporation (Japan)
+exzisusa // B23 (c) 1987 Taito Corporation (Japan)
+minivadr // D26 cabinet test board
+volfied // C04 (c) 1989 Taito Corporation Japan (World)
+volfiedu // C04 (c) 1989 Taito America Corporation (US)
+volfiedj // C04 (c) 1989 Taito Corporation (Japan)
+volfiedjo // C04 (c) 1989 Taito Corporation (Japan)
+bonzeadv // B41 (c) 1988 Taito Corporation Japan (World)
+bonzeadvo // B41 (c) 1988 Taito Corporation Japan (World)
+bonzeadvu // B41 (c) 1988 Taito America Corporation (US)
+jigkmgri // B41 (c) 1988 Taito Corporation (Japan)
+asuka // B68 (c) 1988 Taito Corporation (World)
+asukaj // B68 (c) 1988 Taito Corporation (Japan)
+mofflott // C17 (c) 1989 Taito Corporation (Japan)
+cadash // C21 (c) 1989 Taito Corporation Japan
+cadashj // C21 (c) 1989 Taito Corporation
+cadashu // C21 (c) 1989 Taito America Corporation
+cadashi // C21 (c) 1989 Taito Corporation Japan
+cadashf // C21 (c) 1989 Taito Corporation Japan
+cadashg // C21 (c) 1989 Taito Corporation Japan
+parentj // C42 (c) 199? Taito
+galmedes // (c) 1992 Visco (Japan)
+earthjkr // (c) 1993 Visco (Japan)
+eto // (c) 1994 Visco (Japan)
+wgp // C32 (c) 1989 Taito America Corporation (US)
+wgpj // C32 (c) 1989 Taito Corporation (Japan)
+wgpjoy // C32 (c) 1989 Taito Corporation (Japan)
+wgpjoya // C32 (c) 1989 Taito Corporation (Japan)
+wgp2 // C73 (c) 1990 Taito Corporation (Japan)
+galastrm // C99 (c) 1992 Taito Corporation
+slapshot // D71 (c) 1994 Taito Corporation (Japan)
+opwolf3 // D74 (c) 1994 Taito
+opwolf3u // D74 (c) 1994 Taito
+scessjoe // ??? (c) 1990 Wave / Taito
+ashnojoe // ??? (c) 1990 Wave / Taito
+
+// Taito multi-screen games
+ninjaw // B31 (c) 1987 Taito Corporation Japan (World)
+ninjawj // B31 (c) 1987 Taito Corporation (Japan)
+darius2 // C07 (c) 1989 Taito Corporation (Japan)
+darius2d // C07 (c) 1989 Taito Corporation (Japan)
+darius2do // C07 (c) 1989 Taito Corporation (Japan)
+warriorb // D24 (c) 1991 Taito Corporation (Japan)
+
+// Taito "X"-system games
+superman // B61 (c) 1988 Taito Corporation
+supermanj // B61 (c) 1988 Taito Corporation
+twinhawk // B87 (c) 1989 Taito Corporation Japan (World)
+twinhawku // B87 (c) 1989 Taito America Corporation (US)
+daisenpu // B87 (c) 1989 Taito Corporation (Japan)
+gigandes // (c) 1989 East Technology
+gigandesj // (c) 1989 East Technology
+kyustrkr // (c) 1989 East Technology
+ballbros // no copyright notice
+
+// Taito "tnzs" (Seta) hardware
+plumppop // A98 (c) 1987 Taito Corporation (Japan)
+jpopnics // (c)1992 NICs, based on Plump Pop code
+extrmatn // B06 (c) 1987 Taito Corporation Japan (World)
+extrmatnu // B06 (c) 1987 World Games
+extrmatnj // B06 (c) 1987 Taito Corporation (Japan)
+arknoid2 // B08 (c) 1987 Taito Corporation Japan (World)
+arknoid2u // B08 (c) 1987 Taito America Corporation + Romstar license (US)
+arknoid2j // B08 (c) 1987 Taito Corporation (Japan)
+drtoppel // B19 (c) 1987 Taito Corporation Japan (World)
+drtoppelu // B19 (c) 1987 Taito Corporation (US)
+drtoppelj // B19 (c) 1987 Taito Corporation (Japan)
+kageki // B35 (c) 1988 Taito America Corporation + Romstar license (US)
+kagekij // B35 (c) 1988 Taito Corporation (Japan)
+kagekih // B35 (c) 1992 (hack)
+chukatai // B44 (c) 1988 Taito Corporation Japan (World)
+chukataiu // B44 (c) 1988 Taito Corporation (US)
+chukataij // B44 (c) 1988 Taito Corporation (Japan)
+kabukiz // B50 (c) 1988 Taito Corporation Japan (World)
+kabukizj // B50 (c) 1988 Taito Corporation (Japan)
+tnzs // B53 (c) 1988 Taito Corporation Japan (World) (new logo)
+tnzsj // B53 (c) 1988 Taito Corporation (Japan) (new logo)
+tnzsjo // B53 (c) 1988 Taito Corporation (Japan) (new logo)
+tnzso // B53 (c) 1988 Taito Corporation Japan (World) (old logo)
+tnzsop // B53?(c) 1988 Taito Corporation Japan (World) (old logo)
+insectx // B97 (c) 1989 Taito Corporation Japan (World)
+insectxj // B97 (c) 1989 Taito Corporation (Japan)
+cchance // (c)1987 Taito?
+champbwl // (c)1989 Romstar. not Taito, but the same Seta video chips
+
+// Taito L-System games
+raimais // B36 (c) 1988 Taito Corporation (Japan)
+raimaisj // B36 (c) 1988 Taito Corporation
+raimaisjo // B36 (c) 1988 Taito Corporation
+kurikint // B42 (c) 1988 Taito Corporation Japan (World)
+kurikintu // B42 (c) 1988 Taito America Corporation (US)
+kurikintj // B42 (c) 1988 Taito Corporation (Japan)
+kurikinta // B42 (c) 1988 Taito Corporation Japan (World)
+evilston // C67 (c) 1990 Spacy Industrial, Ltd
+fhawk // B70 (c) 1988 Taito Corporation Japan (World)
+fhawkj // B70 (c) 1988 Taito Corporation (Japan)
+plotting // B96 (c) 1989 Taito Corporation Japan (World)
+plottingu // B96 (c) 1989 Taito Corporation Japan (US)
+plottinga // B96 (c) 1989 Taito Corporation Japan (World)
+plottingb // B96 (c) 1989 Taito Corporation Japan (World)
+flipull // B96 (c) 1989 Taito Corporation Japan (World)
+champwr // C01 (c) 1989 Taito Corporation Japan (World)
+champwru // C01 (c) 1989 Taito America Corporation (US)
+champwrj // C01 (c) 1989 Taito Corporation (Japan)
+puzznic // C20 (c) 1989 Taito Corporation (Japan)
+puzznicj // C20 (c) 1989 Taito Corporation (Japan)
+puzznici // C20 (c) 1989 Taito Corporation (Japan)
+horshoes // C47 (c) 1990 Taito America Corporation (US)
+palamed // C63 (c) 1990 Taito Corporation (Japan)
+cachat // ??? (c) 1993 Taito Corporation (Japan)
+tubeit // ??? no copyright message
+cubybop // ??? no copyright message
+plgirls // (c) 1992 Hot-B.
+plgirls2 // (c) 1993 Hot-B.
+lagirl // plgirls bootleg?
+
+// Taito H-System games
+syvalion // B51 (c) 1988 Taito Corporation (Japan)
+recordbr // B56 (c) 1988 Taito Corporation Japan (World)
+gogold // B56 (c) 1988 Taito Corporation (Japan)
+dleague // C02 (c) 1990 Taito Corporation (Japan)
+
+// Taito B-System games
+masterw // B72 (c) 1989 Taito Corporation Japan (World)
+masterwu // B72 (c) 1989 Taito America Corporation (US)
+masterwj // B72 (c) 1989 Taito Corporation (Japan)
+nastar // B81 (c) 1988 Taito Corporation Japan (World)
+nastarw // B81 (c) 1988 Taito America Corporation (US)
+rastsag2 // B81 (c) 1988 Taito Corporation (Japan)
+rambo3 // B93 (c) 1989 Taito Europe Corporation (Europe)
+rambo3ae // B93 (c) 1989 Taito Europe Corporation (Europe)
+rambo3a // B93 (c) 1989 Taito America Corporation (US)
+crimec // B99 (c) 1989 Taito Corporation Japan (World)
+crimecu // B99 (c) 1989 Taito America Corporation (US)
+crimecj // B99 (c) 1989 Taito Corporation (Japan)
+tetrist // C12 (c) 1989 Sega Enterprises,Ltd. (Japan)
+tetrista // C35 (c) 1989 Sega Enterprises,Ltd. (Japan)
+viofight // C16 (c) 1989 Taito Corporation Japan (World)
+viofightu // C16 (c) 1989 Taito America Corporation (US)
+viofightj // C16 (c) 1989 Taito Corporation (Japan)
+ashura // C43 (c) 1990 Taito Corporation Japan (World)
+ashuraj // C43 (c) 1990 Taito Corporation (Japan)
+ashurau // C43 (c) 1990 Taito America Corporation (US)
+hitice // C59 (c) 1990 Williams (US)
+hiticej // C59 (c) 1990 Midway/Taito Corporation (Japan)
+sbm // C69 (c) 1990 Taito Corporation (Japan)
+selfeena // ??? (c) 1991 East Technology
+silentd // ??? (c) 1992 Taito Corporation Japan (World)
+silentdu // ??? (c) 1992 Taito Corporation Japan (World)
+silentdj // ??? (c) 1992 Taito Corporation (Japan)
+ryujin // ??? (c) 1993 Taito Corporation (Japan)
+qzshowby // D72 (c) 1993 Taito Corporation (Japan)
+pbobble // ??? (c) 1994 Taito Corporation (Japan)
+spacedx // D89 (c) 1994 Taito Corporation (US)
+spacedxj // D89 (c) 1994 Taito Corporation (Japan)
+spacedxo // D89 (c) 1994 Taito Corporation (Japan)
+
+// Taito Z-System games
+contcirc // B33 (c) 1987 Taito Corporation Japan (World)
+contcircu // B33 (c) 1987 Taito America Corporation (US)
+contcircua // B33 (c) 1987 Taito America Corporation (US)
+chasehq // B52 (c) 1988 Taito Corporation Japan (World)
+chasehqj // B52 (c) 1988 Taito Corporation (Japan)
+chasehqu // B52 (c) 1988 Taito America Corporation (US)
+enforce // B58 (c) 1988 Taito Corporation (Japan)
+nightstr // B91 (c) 1989 Taito Corporation Japan (World)
+nightstrj // B91 (c) 1989 Taito Corporation (Japan)
+nightstru // B91 (c) 1989 Taito America Corporation (US)
+sci // C09 (c) 1989 Taito Corporation Japan (World)
+scia // C09 (c) 1989 Taito Corporation Japan (World)
+scij // C09 (c) 1989 Taito Corporation Japan (World)
+sciu // C09 (c) 1989 Taito America Corporation (US)
+scin // C09 (c) 1991 Taito Corporation Japan (Negro Torino hack)
+bshark // C34 (c) 1989 Taito America Corporation (US)
+bsharkj // C34 (c) 1989 Taito Corporation (Japan)
+aquajack // B77 (c) 1990 Taito Corporation Japan (World)
+aquajackj // B77 (c) 1990 Taito Corporation (Japan)
+spacegun // C57 (c) 1990 Taito Corporation Japan (World)
+dblaxle // C78 (c) 1991 Taito America Corporation (US)
+pwheelsj // C78 (c) 1991 Taito Corporation (Japan)
+racingb // C84 (c) 1991 Taito Coropration ..
+
+// Taito Air System games
+topland // B62 (c) 1988 Taito Coporation Japan (World)
+ainferno // C45 (c) 1990 Taito America Corporation (US)
+
+mlanding // ??? (c) 1990 Taito America Corporation (US)
+
+// enhanced Z-System hardware games
+gunbustr // D27 (c) 1992 Taito Corporation (Japan)
+superchs // D46 (c) 1992 Taito America Corporation (US)
+groundfx // D51 (c) 1992 Taito Coporation
+undrfire // D67 (c) 1993 Taito Coporation Japan (World)
+undrfireu // D67 (c) 1993 Taito America Corporation (US)
+undrfirej // D67 (c) 1993 Taito Coporation (Japan)
+cbombers
+
+// Taito F2 games
+finalb // 1989.?? B82 (c) 1988 Taito Corporation Japan (World)
+finalbj // 1989.04 B82 (c) 1988 Taito Corporation (Japan)
+finalbu // 1989.06 B82 (c) 1988 Taito America Corporation (US)
+dondokod // 1989.?? B95 (c) 1989 Taito Corporation Japan (World)
+dondokodu // 1989.?? B95 (c) 1989 Taito America Corporation (US)
+dondokodj // 1989.07 B95 (c) 1989 Taito Corporation (Japan)
+megablst // 1989.?? C11 (c) 1989 Taito Corporation Japan (World)
+megablstu // 1989.?? C11 (c) 1989 Taito America Corporation (US)
+megablstj // 1989.11 C11 (c) 1989 Taito Corporation (Japan)
+thundfox // 1990.?? C28 (c) 1990 Taito Corporation Japan (World)
+thundfoxu // 1990.06 C28 (c) 1990 Taito America Corporation (US)
+thundfoxj // 1990.07 C28 (c) 1990 Taito Corporation (Japan)
+cameltry // 1990.?? C38 (c) 1989 Taito America Corporation (US)
+cameltrya // 1990.?? C38 (c) 1989 Taito America Corporation (US)
+cameltryau // 1990.?? C38 (c) 1989 Taito America Corporation (US)
+cameltryj // 1990.04 C38 (c) 1989 Taito Corporation (Japan)
+qtorimon // 1990.02 C41 (c) 1990 Taito Corporation (Japan)
+liquidk // 1990.?? C49 (c) 1990 Taito Corporation Japan (World)
+liquidku // 1990.?? C49 (c) 1990 Taito America Corporation (US)
+mizubaku // 1990.08 C49 (c) 1990 Taito Corporation (Japan)
+quizhq // 1990.07 C53 (c) 1990 Taito Corporation (Japan)
+ssi // 1990.?? C64 (c) 1990 Taito Corporation Japan (World)
+ssia // 1990.?? C64 (c) 1990 Taito Corporation Japan (World)
+majest12 // 1990.11 C64 (c) 1990 Taito Corporation (Japan)
+ // 1990.12 C64 (US)
+gunfront // 1991.?? C71 (c) 1990 Taito Corporation Japan (World)
+gunfrontj // 1991.01 C71 (c) 1990 Taito Corporation (Japan)
+growl // 1991.?? C74 (c) 1990 Taito Corporation Japan (World)
+growlu // 1991.02 C74 (c) 1990 Taito America Corporation (US)
+runark // 1991.02 C74 (c) 1990 Taito Corporation (Japan)
+mjnquest // 1991.05 C77 (c) 1990 Taito Corporation (Japan)
+mjnquestb // 1991.05 C77 (c) 1990 Taito Corporation (Japan)
+footchmp // 1991.?? C80 (c) 1990 Taito Corporation Japan (World)
+footchmpbl // bootleg
+hthero // 1991.03 C80 (c) 1990 Taito Corporation (Japan)
+euroch92 // 1991.?? (c) 1992 Taito Corporation Japan (World)
+koshien // 1991.04 C81 (c) 1990 Taito Corporation (Japan)
+yuyugogo // 1991.03 C83 (c) 1990 Taito Corporation (Japan)
+ninjak // 1991.?? C85 (c) 1990 Taito Corporation Japan (World)
+ninjakj // 1991.04 C85 (c) 1990 Taito Corporation (Japan)
+ninjaku // 1991.03 C85 (c) 1990 Taito Corporation (Japan)
+solfigtr // 1991.?? C91 (c) 1991 Taito Corporation Japan (World)
+qzquest // 1991.07 C92 (c) 1991 Taito Corporation (Japan)
+pulirula // 1991.?? C98 (c) 1991 Taito Corporation Japan (World)
+pulirulaj // 1991.11 C98 (c) 1991 Taito Corporation (Japan)
+metalb // 1991.?? D16? (c) 1991 Taito Corporation Japan (World)
+metalbj // 1991.11 D12 (c) 1991 Taito Corporation (Japan)
+qzchikyu // 1992.02 D19 (c) 1991 Taito Corporation (Japan)
+yesnoj // 1992.03 D20 (c) 1992 Taito Corporation (Japan)
+deadconx // 1992.?? D28 (c) 1992 Taito Corporation Japan (World)
+deadconxj // 1992.08 D28 (c) 1992 Taito Corporation (Japan)
+dinorex // 1992.?? D39 (c) 1992 Taito Corporation Japan (World)
+dinorexj // 1992.11 D39 (c) 1992 Taito Corporation (Japan)
+dinorexu // 1992.?? D39 (c) 1992 Taito America Corporation (US)
+qjinsei // 1993.03 D48 (c) 1992 Taito Corporation (Japan)
+qcrayon // 1993.08 D55 (c) 1993 Taito Corporation (Japan)
+qcrayon2 // 1994.01 D63 (c) 1993 Taito Corporation (Japan)
+driftout // 1991.10 (c) 1991 Visco
+driveout // bootleg
+
+// Taito F3 games
+ringrage // 1992.?? D21 (c) 1992 Taito Corporation Japan (World)
+ringragej // 1992.09 D21 (c) 1992 Taito Corporation (Japan)
+ringrageu // 1992.02 D21 (c) 1992 Taito America Corporation (US)
+arabianm // 1992.?? D29 (c) 1992 Taito Corporation Japan (World)
+arabianmj // 1992.09 D29 (c) 1992 Taito Corporation (Japan)
+arabianmu // 1992.10 D29 (c) 1992 Taito America Corporation (US)
+ridingf // 1992.?? D34 (c) 1992 Taito Corporation Japan (World)
+ridingfj // 1992.12 D34 (c) 1992 Taito Corporation (Japan)
+ridingfu // 1992.?? D34 (c) 1992 Taito America Corporation (US)
+gseeker // 1992.?? D40 (c) 1992 Taito Corporation Japan (World)
+gseekerj // 1992.12 D40 (c) 1992 Taito Corporation (Japan)
+gseekeru // 1992.?? D40 (c) 1992 Taito America Corporation (US)
+hthero93 // 1993.03 D49 (c) 1992 Taito Corporation (Japan)
+ // 1993.04 D49 (US)
+cupfinal // 1993.?? D49 (c) 1993 Taito Corporation Japan (World)
+trstar // 1993.?? D53 (c) 1993 Taito Corporation Japan (World)
+trstarj // 1993.07 D53 (c) 1993 Taito Corporation (Japan)
+prmtmfgt // 1993.08 D53 (c) 1993 Taito Corporation (US)
+prmtmfgto // 1993.08 D53 (c) 1993 Taito Corporation (US)
+trstaro // 1993.?? D53 (c) 1993 Taito Corporation (World)
+trstaroj // 1993.07 D53 (c) 1993 Taito Corporation (Japan)
+gunlock // 1994.?? D66 (c) 1993 Taito Corporation Japan (World)
+rayforcej // 1994.02 D66 (c) 1993 Taito Corporation (Japan)
+rayforce // 1994.?? D66 (c) 1993 Taito America Corporation (US)
+scfinals // 1994.?? D68 (c) 1993 Taito Corporation Japan (World)
+intcup94 // 1994.?? D78 (c) 1994 Taito (World)
+hthero94 // 1994.09 D78 (c) 1994 Taito (US)
+lightbr // 1994.03 D69 (c) 1993 Taito Corporation Japan (World)
+lightbrj // 1994.03 D69 (c) 1993 Taito Corporation (Japan)
+dungeonm // 1994.?? D69 (c) 1993 Taito Corporation Japan (World)
+dungeonmu // 1994.?? D69 (c) 1993 Taito America Corporation (US)
+kaiserkn // 1994.?? D84 (c) 1994 Taito Corporation Japan (World)
+kaiserknj // 1994.08 D84 (c) 1994 Taito Corporation (Japan)
+gblchmp // 1994.10 D84 (c) 1994 Taito America Corporation (US)
+dankuga // 1994.?? D84? (c) 1994 Taito Corporation (Japan)
+dariusg // 1994.?? D87 (c) 1994 Taito Corporation Japan (World)
+dariusgj // 1994.09 D87 (c) 1994 Taito Corporation (Japan)
+dariusgu // 1994.11 D87 (c) 1994 Taito America Corporation (US)
+dariusgx // 1994.?? D87 (c) 1994 Taito Corporation
+bublbob2 // 1994.?? D90 (c) 1994 Taito Corporation Japan (World)
+bubsymphe // 1994.?? D90 (c) 1994 Taito Corporation Japan (Europe)
+bubsymphu // 1994.10 D90 (c) 1994 Taito America Corporation (US)
+bubsymphj // 1994.10 D90 (c) 1994 Taito Corporation (Japan)
+bubsymphb // bootleg
+spcinvdj // 1994.09 D93 (c) 1994 Taito Corporation (Japan)
+pwrgoal // 1994.?? D94 (c) 1995 Taito Corporation Japan (World)
+hthero95 // 1994.11 D94 (c) 1995 Taito Corporation (Japan)
+hthero95u // 1995.05 D94 (c) 1995 Taito America Corporation (US)
+qtheater // 1995.01 D95 (c) 1994 Taito Corporation (Japan)
+elvactr // 1995.?? E02 (c) 1994 Taito Corporation Japan (World)
+elvactrj // 1995.03 E02 (c) 1994 Taito Corporation (Japan)
+elvact2u // 1995.05 E02 (c) 1994 Taito America Corporation (US)
+spcinv95 // 1995.?? E06 (c) 1995 Taito Corporation Japan (World)
+spcinv95u // 1995.05 E06 (c) 1995 Taito America Corporation (US)
+akkanvdr // 1995.07 E06 (c) 1995 Taito Corporation (Japan)
+twinqix // 1995.03 ??? (c) 1995 Taito America Corporation (US)
+quizhuhu // 1995.07 E08 (c) 1995 Taito Corporation (Japan)
+pbobble2 // 1995.?? E10 (c) 1995 Taito Corporation Japan (World)
+pbobble2o // 1995.?? E10 (c) 1995 Taito Corporation Japan (World)
+pbobble2j // 1995.09 E10 (c) 1995 Taito Corporation (Japan)
+pbobble2u // 1995.11 E10 (c) 1995 Taito America Corporation (US)
+pbobble2x // 1995.12 E10 (c) 1995 Taito Corporation (Japan)
+gekiridn // 1995.11 E11 (c) 1995 Taito Corporation Japan (World)
+gekiridnj // 1995.11 E11 (c) 1995 Taito Corporation (Japan)
+tcobra2 // 1996.?? E15 (c) 1995 Taito Corporation (World)
+tcobra2u // 1996.?? E15 (c) 1995 Taito Corporation (US)
+ktiger2 // 1996.02 E15 (c) 1995 Taito Corporation (Japan)
+bubblem // 1996.?? E21 (c) 1995 Taito Corporation Japan (World)
+bubblemj // 1996.04 E21 (c) 1995 Taito Corporation (Japan)
+cleopatr // 1996.10 E28 (c) 1996 Taito Corporation (Japan)
+pbobble3 // 1996.?? E29 (c) 1996 Taito Corporation (World)
+pbobble3u // 1996.11 E29 (c) 1996 Taito Corporation (US)
+pbobble3j // 1996.11 E29 (c) 1996 Taito Corporation (Japan)
+arkretrn // 1997.03 E36 (c) 1997 Taito Corporation (Japan)
+kirameki // 1997.09 E44 (c) 1997 Taito Corporation (Japan)
+puchicar // 1997.?? E46 (c) 1997 Taito Corporation (World)
+puchicarj // 1997.12 E46 (c) 1997 Taito Corporation (Japan)
+pbobble4 // 1998.?? E49 (c) 1997 Taito Corporation (World)
+pbobble4j // 1998.02 E49 (c) 1997 Taito Corporation (Japan)
+pbobble4u // 1998.?? E49 (c) 1997 Taito Corporation (US)
+popnpop // 1998.?? E51 (c) 1997 Taito Corporation (World)
+popnpopj // 1998.03 E51 (c) 1997 Taito Corporation (Japan)
+popnpopu // 1998.?? E51 (c) 1997 Taito Corporation (US)
+landmakr // 1998.08 E61 (c) 1998 Taito Corporation (Japan)
+landmakrp // 1998.?? E61 (c) 1998 Taito Corporation (World, prototype)
+recalh // prototype
+commandw // prototype
+
+// Taito JC System
+dangcurv // 1995.?? E09 (c) 1995 Taito Corporation
+ // 1995.07 (Japan)
+ // 1995.10 (US)
+landgear // 1996.?? E17 (c) 1995 Taito Corporation Japan (World)
+ // 1996.03 (Japan)
+sidebs // 1996.07 E23 (c) 1996 Taito Corporation (Japan)
+dendeg // 1997.03 E35 (c) 1996 Taito Corporation (Japan)
+sidebs2j // 1997.07 E38 (c) 1997 Taito Corporation (Japan)
+sidebs2 // 1997.?? E38 (c) 1997 Taito Corporation (Japan)
+dendegx // 1997.09 E35 (c) 1996 Taito Corporation (Japan)
+dendeg2 // 1998.03 E52 (c) 1998 Taito Corporation (Japan)
+dendeg2x // 1998.08 E52 (c) 1998 Taito Corporation (Japan)
+
+// Taito "Wolf" System
+pf2012 // E59 (c) 1997 Taito
+
+// Taito PPC JC System
+optiger // 1998.09 E63 (c) 1998 Taito
+
+// Taito Type-Zero System
+taitotz
+batlgear // E68 (c) 1999 Taito
+landhigh // E82 (c) 1999 Taito
+batlgr2 // E87 (c) 2000 Taito
+
+// Toaplan games
+perfrman // (c) 1985 Data East Corporation (Japan)
+perfrmanu // (c) 1985 Data East USA (US)
+tigerh // A47 (c) 1985 Taito America Corporation GX-551 [not a Konami board!]
+tigerhj // A47 (c) 1985 Taito Corporation GX-551 [not a Konami board!]
+tigerhb1 // bootleg but (c) 1985 Taito Corporation
+tigerhb2 // bootleg but (c) 1985 Taito Corporation
+tigerhb3 // bootleg but (c) 1985 Taito Corporation
+alcon // A77 / TP-???
+slapfigh // A77 / TP-???
+slapfigha // A76 / TP-???
+slapfighb1 // bootleg but (c) 1986 Taito Corporation
+slapfighb2 // bootleg but (c) 1986 Taito Corporation
+slapfighb3 // bootleg but (c) 1986 Taito Corporation
+getstar // A68 (c) 1986 Taito Corporation
+getstarj // A68 (c) 1986 Taito Corporation
+gtstarb1 // GX-006 bootleg but (c) 1986 Taito Corporation
+gtstarb2 // GX-006 bootleg but (c) 1986 Taito Corporation
+mjsister // (c) 1986 Toaplan
+
+fshark // B02 / TP-007 (c) 1987 Taito Corporation (World)
+skyshark // B02 / TP-007 (c) 1987 Taito America Corporation + Romstar license (US)
+hishouza // B02 / TP-007 (c) 1987 Taito Corporation (Japan)
+fsharkbt // bootleg
+wardner // B25 / TP-009 (c) 1987 Taito Corporation Japan (World)
+pyros // B25 / TP-009 (c) 1987 Taito America Corporation (US)
+wardnerj // B25 / TP-009 (c) 1987 Taito Corporation (Japan)
+twincobr // B30 / TP-011 (c) 1987 Taito Corporation (World)
+twincobru // B30 / TP-011 (c) 1987 Taito America Corporation + Romstar license (US)
+ktiger // B30 / TP-011 (c) 1987 Taito Corporation (Japan)
+gulfwar2 // (c) 1991 Comad
+
+rallybik // B45 / TP-O12 (c) 1988 Taito
+truxton // B65 / TP-O13B (c) 1988 Taito
+hellfire // B90 / TP-??? (c) 1989 Toaplan + Taito license
+hellfire1 // B90 / TP-??? (c) 1989 Toaplan + Taito license
+hellfire2 // B90 / TP-??? (c) 1989 Toaplan + Taito license
+hellfire3 // B90 / TP-??? (c) 1989 Toaplan + Taito license
+zerowing // TP-O15 (c) 1989 Toaplan
+zerowing2 // TP-O15 (c) 1989 Toaplan
+demonwld // TP-O16 (c) 1990 Toaplan (+ Taito license when set to Japan)
+demonwld1 // TP-O16 (c) 1989 Toaplan + Taito license
+demonwld2 // TP-O16 (c) 1989 Toaplan
+demonwld3 // TP-O16 (c) 1989 Toaplan
+demonwld4 // TP-O16 (c) 1989 Toaplan
+fireshrk // TP-O17 (c) 1990 Toaplan
+fireshrkd // TP-O17 (c) 1990 Toaplan
+fireshrkdh // TP-O17 (c) 1990 Toaplan
+samesame // TP-O17 (c) 1989 Toaplan
+samesame2 // TP-O17 (c) 1989 Toaplan
+outzone // TP-O18 (c) 1990 Toaplan
+outzonea // TP-O18 (c) 1990 Toaplan
+outzoneb // TP-O18 (c) 1990 Toaplan
+outzonec // TP-O18 (c) 1990 Toaplan
+outzoned // TP-O18 (c) 1990 Toaplan
+vimana // TP-O19 (c) 1991 Toaplan (+ Tecmo license when set to Japan)
+vimana1 // TP-O19 (c) 1991 Toaplan (+ Tecmo license when set to Japan)
+vimanan // TP-O19 (c) 1991 Toaplan (+ Nova Apparate GMBH & Co license)
+snowbros // MIN16-02 (c) 1990 Toaplan + Romstar license
+snowbrosa // MIN16-02 (c) 1990 Toaplan + Romstar license
+snowbrosb // MIN16-02 (c) 1990 Toaplan + Romstar license
+snowbrosc // MIN16-02 (c) 1990 Toaplan + Romstar license
+snowbrosj // MIN16-02 (c) 1990 Toaplan
+snowbrosd // MIN16-02 (c) 1990 Toaplan + Dooyong license
+wintbob // bootleg
+honeydol // (c) 1995 Barko Corp
+twinadv // (c) 1995 Barko Corp
+twinadvk // (c) 1995 Barko Corp
+ // SemiCom games on snowbros like hardware
+hyperpac // (c) 1995 SemiCom
+hyperpacb // bootleg
+toppyrap // (c) 1996 SemiCom
+cookbib2 // (c) 1996 SemiCom
+cookbib3 // (c) 1997 SemiCom
+twinkle // (c) 1997 SemiCom
+pzlbreak // (c) 1997 SemiCom
+3in1semi // (c) 1998 SemiCom
+moremore // (c) 1999 SemiCom + Exit
+moremorp // (c) 1999 SemiCom + Exit
+4in1boot // (c) 2002 but bootleg of 1999 release?
+snowbros3 // (c) 2002 but hack / bootleg of snowbros?
+finalttr // (c) 1993 Jeil Computer System
+
+// More Toaplan Games
+tekipaki // TP-020 (c) 1991 Toaplan
+ghox // TP-021 (c) 1991 Toaplan
+ghoxj // TP-021 (c) 1991 Toaplan
+dogyuun // TP-022 (c) 1992 Toaplan
+dogyuuna // TP-022 (c) 1992 Toaplan
+dogyuunt // TP-022 (c) 1992 Toaplan
+kbash // TP-023 (c) 1993 Toaplan
+kbash2 // bootleg
+truxton2 // TP-024 (c) 1992 Toaplan
+pipibibs // TP-025
+pipibibsa // TP-025
+whoopee // TP-025
+pipibibsbl // (c) 1991 Ryouta Kikaku (bootleg)
+fixeight // TP-026 (c) 1992 + Taito license
+fixeightt
+fixeightkt
+fixeightk
+fixeightht
+fixeighth
+fixeighttwt
+fixeighttw
+fixeightat
+fixeighta
+fixeightu
+fixeightut
+fixeightj
+fixeightjt
+fixeightbl // bootleg
+grindstm // TP-027 (c) 1993 Toaplan + Unite Trading license (Korea)
+grindstma // TP-027 (c) 1993 Toaplan + Unite Trading license (Korea)
+vfive // TP-027 (c) 1993 Toaplan (Japan)
+batsugun // TP-030 (c) 1993 Toaplan
+batsuguna // TP-030 (c) 1993 Toaplan
+batsugunsp // TP-??? (c) 1993 Toaplan
+snowbro2 // TP-??? (c) 1994 Hanafram
+sstriker // (c) 1993 Raizing
+sstrikera // (c) 1993 Raizing
+mahoudai // (c) 1993 Raizing + Able license
+kingdmgp // (c) 1994 Raizing/8ing
+shippumd // (c) 1994 Raizing/8ing
+bgaregga // (c) 1996 Raizing/8ing
+bgareggahk // (c) 1996 Raizing/8ing
+bgareggatw // (c) 1996 Raizing/8ing
+bgaregganv // (c) 1996 Raizing/8ing
+bgareggat2 // (c) 1996 Raizing/8ing
+bgareggacn // (c) 1996 Raizing/8ing
+batrider // (c) 1998 Raizing/8ing
+batrideru // (c) 1998 Raizing/8ing
+batriderc // (c) 1998 Raizing/8ing
+batriderj // (c) 1998 Raizing/8ing
+batriderk // (c) 1998 Raizing/8ing
+batriderja // (c) 1998 Raizing/8ing
+batridert // (c) 1998 Raizing/8ing
+bbakraid // (c) 1999 8ing
+bbakraidj // (c) 1999 8ing
+bbakraidja // (c) 1999 8ing
+
+/*
+Toa Plan's board list
+(translated from http://www.aianet.ne.jp/~eisetu/rom/rom_toha.html)
+
+Title ROMno. Remark(1) Remark(2)
+--------------------------------------------------
+Tiger Heli A47 GX-551
+Hishouzame B02 TP-007
+Kyukyoku Tiger B30 TP-011
+Dash Yarou B45 TP-012
+Tatsujin B65 TP-013B M6100649A
+Zero Wing O15 TP-015
+Horror Story O16 TP-016
+Same!Same!Same! O17 TP-017
+Out Zone TP-018
+Vimana TP-019
+Teki Paki O20 TP-020
+Ghox TP-21 TP-021
+Dogyuun TP-022
+Tatsujin Oh TP-024 *1
+Fixeight TP-026
+V-V TP-027
+
+*1 There is a doubt this game uses TP-024 board and TP-025 romsets.
+
+86 Mahjong Sisters Kit 2P 8W+2B HC Mahjong TP-
+88 Dash Kit 2P 8W+2B TP-
+89 Fire Shark Kit 2P 8W+2B VC Shooter TP-017
+89 Twin Hawk Kit 2P 8W+2B VC Shooter TP-
+91 Whoopie Kit 2P 8W+2B HC Action
+92 Teki Paki Kit 2P TP-020
+92 Ghox Kit 2P Paddle+1B VC Action TP-021
+10/92 Dogyuun Kit 2P 8W+2B VC Shooter TP-022
+92/93 Knuckle Bash Atari Games Kit 2P 8W+2B HC Action TP-023
+10/92 Tatsujin II/Truxton II Taito Kit 2P 8W+2B VC Shooter TP-024
+10/92 Truxton II/Tatsujin II Taito Kit 2P 8W+2B VC Shooter TP-024
+ Pipi & Bipi TP-025
+92 Fix Eight Kit 2P 8W+2B VC Action TP-026
+12/92 V - V (5)/Grind Stormer Kit 2P 8W+2B VC Shooter TP-027
+1/93 Grind Stormer/V - V (Five) Kit 2P 8W+2B VC Shooter TP-027
+2/94 Batsugun Kit 2P 8W+2B VC TP-
+4/94 Snow Bros. 2 Kit 2P 8W+2B HC Action TP-
+*/
+
+// Cave games
+// Cave was formed in 1994 from the ruins of Toaplan, like Raizing was.
+pwrinst2 // (c) 1994 Atlus
+pwrinst2j // (c) 1994 Atlus
+plegends // (c) 1994 Atlus
+plegendsj // (c) 1994 Atlus
+mazinger // (c) 1994 Banpresto (country is in EEPROM)
+mazingerj // (c) 1994 Banpresto (country is in EEPROM)
+donpachi // (c) 1995 Atlus/Cave
+donpachij // (c) 1995 Atlus/Cave
+donpachikr // (c) 1995 Atlus/Cave
+donpachihk // (c) 1995 Atlus/Cave
+metmqstr // (c) 1995 Banpresto / Pandorabox
+nmaster // (c) 1995 Banpresto / Pandorabox
+sailormn // (c) 1995 Banpresto (country is in EEPROM)
+sailormnu // (c) 1995 Banpresto (country is in EEPROM)
+sailormnj // (c) 1995 Banpresto (country is in EEPROM)
+sailormnk // (c) 1995 Banpresto (country is in EEPROM)
+sailormnt // (c) 1995 Banpresto (country is in EEPROM)
+sailormnh // (c) 1995 Banpresto (country is in EEPROM)
+sailormno // (c) 1995 Banpresto (country is in EEPROM)
+sailormnou // (c) 1995 Banpresto (country is in EEPROM)
+sailormnoj // (c) 1995 Banpresto (country is in EEPROM)
+sailormnok // (c) 1995 Banpresto (country is in EEPROM)
+sailormnot // (c) 1995 Banpresto (country is in EEPROM)
+sailormnoh // (c) 1995 Banpresto (country is in EEPROM)
+agallet // (c) 1996 Banpresto / Gazelle (country is in EEPROM)
+agalletu // (c) 1996 Banpresto / Gazelle (country is in EEPROM)
+agalletj // (c) 1996 Banpresto / Gazelle (country is in EEPROM)
+agalletk // (c) 1996 Banpresto / Gazelle (country is in EEPROM)
+agallett // (c) 1996 Banpresto / Gazelle (country is in EEPROM)
+agalleth // (c) 1996 Banpresto / Gazelle (country is in EEPROM)
+hotdogst // (c) 1996 Marble
+pacslot // (c) 1996 Namco
+ddonpach // (c) 1997 Atlus/Cave
+ddonpachj // (c) 1997 Atlus/Cave
+dfeveron // (c) 1998 Cave + Nihon System license
+feversos // (c) 1998 Cave + Nihon System license
+esprade // (c) 1998 Atlus/Cave
+espradej // (c) 1998 Atlus/Cave (Japan)
+espradejo // (c) 1998 Atlus/Cave (Japan)
+uopoko // (c) 1998 Cave + Jaleco license
+uopokoj // (c) 1998 Cave + Jaleco license
+guwange // (c) 1999 Atlus/Cave
+gaia // (c) 1999 Noise Factory
+theroes // (c) 2001 Primetek Investments
+korokoro // (c) 1999 Takumi
+crusherm // (c) 1999 Takumi
+tjumpman // (c) 1999 Namco
+
+// Kyugo games
+// Kyugo only made four games: Repulse, Flash Gal, SRD Mission and Air Wolf.
+// Gyrodine was made by Crux. Crux was antecedent of Toa Plan, and spin-off from Orca.
+gyrodine // (c) 1984 Crux
+gyrodinet // (c) 1984 Crux (Taito Corporation license)
+buzzard // (c) 1984 Crux
+repulse // (c) 1985 Sega
+99lstwar // (c) 1985 Proma
+99lstwara // (c) 1985 Proma
+99lstwark // (c) 1985 Kyugo
+sonofphx // bootleg
+flashgal // (c) 1985 Sega
+flashgala // (c) 1985 Sega
+srdmissn // (c) 1986 Taito Corporation
+fx // bootleg
+legend // no copyright notice [1986 Sega/Coreland] (Arcade TV Game List - P.104, Left, 14 from top)
+legendb // no copyright notice [1986 Sega/Coreland] (Arcade TV Game List - P.104, Left, 14 from top)
+airwolf // (c) 1987 Kyugo
+airwolfa // (c) 1987 Kyugo
+skywolf // bootleg
+skywolf2 // bootleg
+skywolf3 // bootleg
+
+// Williams games
+defender // (c) 1980
+defenderg // (c) 1980
+defenderb // (c) 1980
+defenderw // (c) 1980
+defndjeu // bootleg
+tornado1 // bootleg
+tornado2 // bootleg
+zero // bootleg
+zero2 // bootleg
+defcmnd // bootleg
+defence // bootleg
+startrkd // bootleg
+mayday // bootleg
+maydaya // bootleg
+maydayb // bootleg
+colony7 // (c) 1981 Taito
+colony7a // (c) 1981 Taito
+jin // Falcon bootleg/hack
+stargate // (c) 1981
+robotron // (c) 1982
+robotronyo // (c) 1982
+joust // (c) 1982
+joustr // (c) 1982
+joustwr // (c) 1982
+bubbles // (c) 1982
+bubblesr // (c) 1982
+bubblesp // (c) 1982
+splat // (c) 1982
+sinistar // (c) 1982
+sinistar1 // (c) 1982
+sinistar2 // (c) 1982
+playball // (c) 1983
+blaster // (c) 1983
+blaster30 // (c) 1983
+blasterkit // (c) 1983
+spdball // (c) 1985
+alienar // (c) 1985 Duncan Brown
+alienaru // (c) 1985 Duncan Brown
+mysticm // (c) 1983
+tshoot // (c) 1984
+inferno // (c) 1984
+joust2 // (c) 1986
+lottofun // (c) 1987 H.A.R. Management
+
+// Capcom games
+// The following is a COMPLETE list of the Capcom games up to 1997, as shown on
+// their web site. The list is sorted by production date.
+// A comprehensive list of Capcom games with board info can be found here:
+// http://www.arcadeflyers.com/strider/capcom_list.html
+vulgus // 5/1984 (c) 1984
+vulgus2 // 5/1984 (c) 1984
+vulgusj // 5/1984 (c) 1984
+sonson // 7/1984 (c) 1984
+sonsonj // 7/1984 (c) 1984 (Japan)
+higemaru // 9/1984 (c) 1984
+1942 // 12/1984 (c) 1984
+1942a // 12/1984 (c) 1984
+1942abl // bootleg
+1942b // 12/1984 (c) 1984
+1942w // 12/1984 (c) 1984 + Williams Electronics license (c) 1985
+exedexes // 2/1985 (c) 1985
+savgbees // 2/1985 (c) 1985 + Memetron license
+commando // 5/1985 (c) 1985 (World)
+commandou // 5/1985 (c) 1985 + Data East license (US)
+commandoj // 5/1985 (c) 1985 (Japan)
+commandob // bootleg
+sinvasn // Europe original?
+sinvasnb // bootleg
+gng // 9/1985 (c) 1985
+gnga // 9/1985 (c) 1985
+gngbl // bootleg
+gngblita // bootleg
+gngc // 9/1985 (c) 1985
+gngt // 9/1985 (c) 1985
+makaimur // 9/1985 (c) 1985
+makaimurc // 9/1985 (c) 1985
+makaimurg // 9/1985 (c) 1985
+diamond // (c) 1989 KH Video (NOT A CAPCOM GAME but runs on GnG hardware)
+gunsmoke // 11/1985 (c) 1985 (World)
+gunsmokeu // 11/1985 (c) 1985 + Romstar (US)
+gunsmokeua // 11/1985 (c) 1985 (US)
+gunsmokej // 11/1985 (c) 1985 (Japan)
+sectionz // 12/1985 (c) 1985
+sectionza // 12/1985 (c) 1985
+trojan // 4/1986 (c) 1986 (US)
+trojanr // 4/1986 (c) 1986 + Romstar
+trojanj // 4/1986 (c) 1986 (Japan)
+srumbler // 9/1986 (c) 1986
+srumbler2 // 9/1986 (c) 1986
+rushcrsh // 9/1986 (c) 1986
+lwings // 11/1986 (c) 1986
+lwings2 // 11/1986 (c) 1986
+lwingsj // 11/1986 (c) 1986
+lwingsb // 11/1986 (c) 1986 (bootleg)
+sidearms // 12/1986 (c) 1986 (World)
+sidearmsr // 12/1986 (c) 1986 + Romstar license (US)
+sidearmsj // 12/1986 (c) 1986 (Japan)
+turtship // (c) 1988 Philco (NOT A CAPCOM GAME but runs on modified Sidearms hardware)
+turtshipj // (c) 1988 Philco (NOT A CAPCOM GAME but runs on modified Sidearms hardware)
+turtshipk // (c) 1988 Philco (NOT A CAPCOM GAME but runs on modified Sidearms hardware)
+dyger // (c) 1989 Philco (NOT A CAPCOM GAME but runs on modified Sidearms hardware)
+dygera // (c) 1989 Philco (NOT A CAPCOM GAME but runs on modified Sidearms hardware)
+twinfalc // (c) 1989 Philko (Poara Enterprises license) (NOT A CAPCOM GAME but runs on modified Sidearms hardware)
+whizz // (c) 1989 Philco (NOT A CAPCOM GAME but runs on modified Sidearms hardware)
+avengers // 2/1987 (c) 1987 (US)
+avengers2 // 2/1987 (c) 1987 (US)
+buraiken // 2/1987 (c) 1987 (Japan)
+bionicc // 3/1987 (c) 1987 (Euro)
+bionicc1 // 3/1987 (c) 1987 (US)
+bionicc2 // 3/1987 (c) 1987 (US)
+topsecrt // 3/1987 (c) 1987 (Japan)
+1943 // 6/1987 (c) 1987 (Euro)
+1943u // 6/1987 (c) 1987 (US)
+1943j // 6/1987 (c) 1987 (Japan)
+1943b // bootleg
+blktiger // 8/1987 (c) 1987 (US)
+blktigera // 8/1987 (c) 1987 (US)
+blktigerb1 // bootleg
+blktigerb2 // bootleg
+blkdrgon // 8/1987 (c) 1987 (Japan)
+blkdrgonb // bootleg, hacked to say Black Tiger
+sf // 8/1987 (c) 1987 (World)
+sfu // 8/1987 (c) 1987 (US)
+sfua // 8/1987 (c) 1987 (US)
+sfj // 8/1987 (c) 1987 (Japan)
+sfp // 8/1987 (c) 1987
+tigeroad // 11/1987 (c) 1987 + Romstar (US)
+toramich // 11/1987 (c) 1987 (Japan)
+tigeroadb // bootleg
+f1dream // 4/1988 (c) 1988 + Romstar
+f1dreamb // bootleg
+1943kai // 6/1988 (c) 1987 (Japan)
+lastduel // 7/1988 (c) 1988 (US)
+lastduelo // 7/1988 (c) 1988 (US)
+lastduelj // 7/1988 (c) 1988 (Japan)
+lastduelb // bootleg
+madgear // 2/1989 (c) 1989 (US)
+madgearj // 2/1989 (c) 1989 (Japan)
+ledstorm // 1988 (c) 1988 (US)
+ledstorm2 // 1988 (c) 1988 (US)
+// 3/1989 Dokaben (baseball) - see below among "Mitchell" games
+// 8/1989 Dokaben 2 (baseball) - see below among "Mitchell" games
+// 10/1989 Capcom Baseball - see below among "Mitchell" games
+// 11/1989 Capcom World - see below among "Mitchell" games
+// 3/1990 Adventure Quiz 2 Hatena no Dai-Bouken - see below among "Mitchell" games
+// 1/1991 Quiz Tonosama no Yabou - see below among "Mitchell" games
+// 4/1991 Ashita Tenki ni Naare (golf) - see below among "Mitchell" games
+// 5/1991 Ataxx - see below among "Leland" games
+// 6/1991 Quiz Sangokushi - see below among "Mitchell" games
+// 10/1991 Block Block - see below among "Mitchell" games
+// 6/1995 Street Fighter - the Movie - see below among "Incredible Technologies" games
+
+
+// Capcom CPS1 games
+forgottn // 7/1988 (c) 1988 (World)
+forgottnu // 7/1988 (c) 1988 (USA)
+forgottnua // 7/1988 (c) 1988 (USA)
+lostwrld // 7/1988 (c) 1988 (Japan)
+lostwrldo // 7/1988 (c) 1988 (Japan)
+ghouls // 12/1988 (c) 1988 (World)
+ghoulsu // 12/1988 (c) 1988 (USA)
+daimakai // 12/1988 (c) 1988 (Japan)
+daimakair // 12/1988 (c) 1988 (Japan)
+strider // 3/1989 (c) 1989 (not explicitly stated but should be USA)
+striderua // 3/1989 (c) 1989 (not explicitly stated but should be USA)
+striderj // 3/1989 (c) 1989 (Japan)
+striderjr // 3/1989 (c) 1989 (Japan)
+dynwar // 4/1989 (c) 1989 (USA)
+dynwara // 4/1989 (c) 1989 (USA)
+dynwarj // 4/1989 (c) 1989 (Japan)
+dynwarjr // 4/1989 (c) 1989 (Japan)
+willow // 6/1989 (c) 1989 (USA)
+willowo // 6/1989 (c) 1989 (USA)
+willowj // 6/1989 (c) 1989 (Japan)
+unsquad // 8/1989 (c) 1989 (USA)
+area88 // 8/1989 (c) 1989 (Japan)
+area88r // 8/1989 (c) 1989 (Japan)
+ffight // 12/1989 (c) 1989 (World)
+ffightu // 12/1989 (c) 1989 (USA)
+ffightua // 12/01/1990 (c) 1989 (USA)
+ffightub // 13/06/1990 (c) 1989 (USA)
+ffightj // 12/1989 (c) 1989 (Japan)
+ffightj1 // 12/01/1990 (c) 1989 (Japan)
+ffightj2 // 05/03/1990 (c) 1989 (Japan)
+ffightjh // hack
+1941 // 2/1990 (c) 1990 (World)
+1941u // 27/02/1990 (c) 1990 (USA)
+1941j // 2/1990 (c) 1990 (Japan)
+mercs // 02/03/1990 (c) 1990 (World)
+mercsu // 08/06/1990 (c) 1990 (USA)
+mercsur1 // 02/03/1990 (c) 1990 (USA)
+mercsj // 02/03/1990 (c) 1990 (Japan)
+mtwins // 19/06/1990 (c) 1990 (World)
+chikij // 19/06/1990 (c) 1990 (Japan)
+msword // 25/07/1990 (c) 1990 (World)
+mswordr1 // 23/06/1990 (c) 1990 (World)
+mswordu // 25/07/1990 (c) 1990 (USA)
+mswordj // 23/06/1990 (c) 1990 (Japan)
+cawing // 12/10/1990 (c) 1990 (World)
+cawingr1 // 09/10/1990 (c) 1990 (World)
+cawingu // 12/10/1990 (c) 1990 (USA)
+cawingj // 12/10/1990 (c) 1990 (Japan)
+nemo // 30/11/1990 (c) 1990 (World)
+nemoj // 20/11/1990 (c) 1990 (Japan)
+sf2 // 22/05/1991 (c) 1991 (World)
+sf2eb // 14/02/1991 (c) 1991 (World)
+sf2ee // 28/02/1991 (c) 1991 (World)
+sf2ebbl // 14/02/1991 (c) 1991 (World, bootleg)
+sf2ua // 06/02/1991 (c) 1991 (USA)
+sf2ub // 14/02/1991 (c) 1991 (USA)
+sf2ud // 18/03/1991 (c) 1991 (USA)
+sf2ue // 28/02/1991 (c) 1991 (USA)
+sf2uf // 11/04/1991 (c) 1991 (USA)
+sf2ui // 22/05/1991 (c) 1991 (USA)
+sf2uk // 01/11/1991 (c) 1991 (USA)
+sf2j // 10/12/1991 (c) 1991 (Japan)
+sf2ja // 14/02/1991 (c) 1991 (Japan)
+sf2jc // 06/03/1991 (c) 1991 (Japan)
+sf2qp1 // hack
+sf2thndr // hack
+3wonders // 20/05/1991 (c) 1991 (World)
+3wondersu // 20/05/1991 (c) 1991 (USA)
+wonder3 // 20/05/1991 (c) 1991 (Japan)
+3wondersh // hack
+kod // 05/08/1991 (c) 1991 (World)
+kodr1 // 11/07/1991 (c) 1991 (World)
+kodu // 10/09/1991 (c) 1991 (USA)
+kodj // 05/08/1991 (c) 1991 (Japan)
+kodja // 05/08/1991 (c) 1991 (Japan)
+kodb // bootleg
+captcomm // 02/12/1991 (c) 1991 (World)
+captcommr1 // 14/10/1991 (c) 1991 (World)
+captcommu // 28/09/1991 (c) 1991 (USA)
+captcommj // 02/12/1991 (c) 1991 (Japan)
+captcommjr1 // 28/09/1991 (c) 1991 (Japan)
+captcommb // bootleg
+knights // 27/11/1991 (c) 1991 (World)
+knightsu // 27/11/1991 (c) 1991 (USA)
+knightsj // 27/11/1991 (c) 1991 (Japan)
+knightsja // 27/11/1991 (c) 1991 (Japan)
+knightsb // bootleg
+sf2ce // 13/05/1992 (c) 1992 (World)
+sf2ceea // 13/03/1992 (c) 1992 (World)
+sf2ceua // 13/03/1992 (c) 1992 (USA)
+sf2ceub // 13/05/1992 (c) 1992 (USA)
+sf2ceuc // 03/08/1992 (c) 1992 (USA)
+sf2cej // 13/05/1992 (c) 1992 (Japan)
+sf2rb // hack
+sf2rb2 // hack
+sf2rb3 // hack
+sf2red // hack
+sf2v004 // hack
+sf2acc // hack
+sf2accp2 // hack
+sf2dkot2 // hack
+sf2m1 // hack
+sf2m2 // hack
+sf2m3 // hack
+sf2m4 // hack
+sf2m5 // hack
+sf2m6 // hack
+sf2m7 // hack
+sf2yyc // hack
+sf2koryu // hack
+sf2mdt // bootleg
+cworld2j // 11/06/1992 (c) 1992 (Japan)
+varth // 14/07/1992 (c) 1992 (World)
+varthr1 // 12/06/1992 (c) 1992 (World)
+varthu // 12/06/1992 (c) 1992 (USA)
+varthj // 14/07/1992 (c) 1992 (Japan)
+qad // 01/07/1992 (c) 1992 (USA)
+qadj // 21/09/1994 (c) 1994 (Japan)
+wof // 02/10/1992 (c) 1992 (World) (CPS1 + QSound)
+wofu // 31/10/1992 (c) 1992 (USA) (CPS1 + QSound)
+wofa // 05/10/1992 (c) 1992 (Asia) (CPS1 + QSound)
+wofj // 31/10/1992 (c) 1992 (Japan) (CPS1 + QSound)
+wofhfh // bootleg
+sf2hf // 09/12/1992 (c) 1992 (World)
+sf2hfu // 09/12/1992 (c) 1992 (USA)
+sf2hfj // 09/12/1992 (c) 1992 (Japan)
+dino // 01/02/1993 (c) 1993 (World) (CPS1 + QSound)
+dinou // 01/02/1993 (c) 1993 (USA) (CPS1 + QSound)
+dinoj // 01/02/1993 (c) 1993 (Japan) (CPS1 + QSound)
+dinopic // bootleg
+dinopic2 // bootleg
+dinohunt // bootleg
+punisher // 22/04/1993 (c) 1993 (World) (CPS1 + QSound)
+punisheru // 22/04/1993 (c) 1993 (USA) (CPS1 + QSound)
+punisherj // 22/04/1993 (c) 1993 (Japan) (CPS1 + QSound)
+punipic // bootleg
+punipic2 // bootleg
+punipic3 // bootleg
+punisherbz // bootleg
+slammast // 13/07/1993 (c) 1993 (World) (CPS1 + QSound)
+slammastu // 13/07/1993 (c) 1993 (USA) (CPS1 + QSound)
+mbomberj // 13/07/1993 (c) 1993 (Japan) (CPS1 + QSound)
+mbombrd // 06/12/1993 (c) 1993 (World) (CPS1 + QSound)
+mbombrdj // 06/12/1993 (c) 1993 (Japan) (CPS1 + QSound)
+ // 1994 Ken Sei Mogura (not listed on Capcom's site)
+pnickj // 08/06/1994 (c) 1994 Compile + Capcom license (Japan) not listed on Capcom's site
+qtono2j // 23/01/1995 (c) 1995 (Japan)
+pang3 // 01/06/1995 (c) 1995 Mitchell (Euro) not listed on Capcom's site
+pang3n // 11/05/1995 (c) 1995 Mitchell (Euro) not listed on Capcom's site
+pang3j // 11/05/1995 (c) 1995 Mitchell (Japan) not listed on Capcom's site
+megaman // 06/10/1995 (c) 1995 (USA)
+megamana // 06/10/1995 (c) 1995 (Asia)
+rockmanj // 22/09/1995 (c) 1995 (Japan)
+
+fcrash // bootleg of Final Fight
+
+// Capcom CPS2 games
+// list completed by CPS2Shock
+// http://cps2shock.retrogames.com
+ssf2 // 11/09/1993 (c) 1993 (World)
+ssf2u // 11/09/1993 (c) 1993 (USA)
+ssf2a // 05/10/1993 (c) 1993 (Asia)
+ssf2ar1 // 14/09/1993 (c) 1993 (Asia)
+ssf2j // 05/10/1993 (c) 1993 (Japan)
+ssf2jr1 // 11/09/1993 (c) 1993 (Japan)
+ssf2jr2 // 10/09/1993 (c) 1993 (Japan)
+ssf2h // 11/09/1993 (c) 1993 (Hispanic)
+ssf2tb // 11/19/1993 (c) 1993 (World)
+ssf2tbr1 // 11/09/1993 (c) 1993 (World)
+ssf2tbj // 11/09/1993 (c) 1993 (Japan)
+ecofghtr // 03/12/1993 (c) 1994 (World)
+ecofghtru // 15/02/1994 (c) 1994 (USA)
+ecofghtru1 // 03/12/1993 (c) 1994 (USA)
+ecofghtra // 03/12/1993 (c) 1994 (Asia)
+ecofghtrh // 03/12/1993 (c) 1994 (Hispanic)
+uecology // 03/12/1993 (c) 1994 (Japan)
+ddtod // 12/04/1994 (c) 1993 (Euro)
+ddtodr1 // 13/01/1994 (c) 1993 (Euro)
+ddtodu // 25/01/1994 (c) 1993 (USA)
+ddtodur1 // 13/01/1994 (c) 1993 (USA)
+ddtodj // 12/04/1994 (c) 1993 (Japan)
+ddtodjr1 // 25/01/1994 (c) 1993 (Japan)
+ddtodjr2 // 13/01/1994 (c) 1993 (Japan)
+ddtoda // 13/01/1994 (c) 1993 (Asia)
+ddtodh // 12/04/1994 (c) 1993 (Hispanic)
+ddtodhr1 // 25/01/1994 (c) 1993 (Hispanic)
+ddtodhr2 // 13/01/1994 (c) 1993 (Hispanic)
+ssf2t // 23/02/1994 (c) 1994 (World)
+ssf2tu // 23/03/1994 (c) 1994 (USA)
+ssf2tur1 // 23/02/1994 (c) 1994 (USA)
+ssf2ta // 23/02/1994 (c) 1994 (Asia)
+ssf2xj // 23/02/1994 (c) 1994 (Japan)
+avsp // 20/05/1994 (c) 1994 (Euro)
+avspu // 20/05/1994 (c) 1994 (USA)
+avspj // 20/05/1994 (c) 1994 (Japan)
+avspa // 20/05/1994 (c) 1994 (Asia)
+avsph // 20/05/1994 (c) 1994 (Hispanic)
+ // 06/1994? Galum Pa! (not listed on Capcom's site)
+dstlk // 05/07/1994 (c) 1994 (Euro)
+dstlku // 18/08/1994 (c) 1994 (USA)
+dstlkur1 // 05/07/1994 (c) 1994 (USA)
+dstlka // 05/07/1994 (c) 1994 (Asia)
+dstlkh // 18/08/1994 (c) 1994 (Hispanic)
+vampj // 05/07/1994 (c) 1994 (Japan)
+vampja // 05/07/1994 (c) 1994 (Japan)
+vampjr1 // 30/06/1994 (c) 1994 (Japan)
+ringdest // 02/09/1994 (c) 1994 (Euro)
+ringdesta // 31/08/1994 (c) 1994 (Asia)
+smbomb // 31/08/1994 (c) 1994 (Japan)
+smbombr1 // 08/08/1994 (c) 1994 (Japan)
+armwar // 24/10/1994 (c) 1994 (Euro)
+armwarr1 // 11/10/1994 (c) 1994 (Euro)
+armwaru // 24/10/1994 (c) 1994 (USA)
+armwaru1 // 20/09/1994 (c) 1994 (USA)
+pgear // 24/10/1994 (c) 1994 (Japan)
+pgearr1 // 16/09/1994 (c) 1994 (Japan)
+armwara // 20/09/1994 (c) 1994 (Asia)
+xmcota // 05/01/1995 (c) 1994 (Euro)
+xmcotau // 05/01/1995 (c) 1994 (USA)
+xmcotah // 31/03/1995 (c) 1994 (Hispanic)
+xmcotahr1 // 05/01/1995 (c) 1994 (Hispanic)
+xmcotaj // 05/01/1995 (c) 1994 (Japan)
+xmcotaj1 // 22/12/1994 (c) 1994 (Japan)
+xmcotaj2 // 19/12/1994 (c) 1994 (Japan)
+xmcotaj3 // 17/12/1994 (c) 1994 (Japan)
+xmcotaa // 05/01/1995 (c) 1994 (Asia)
+xmcotaar1 // 17/12/1994 (c) 1994 (Asia)
+xmcotajr // 08/12/1994 (c) 1994 (Japan Rent)
+nwarr // 16/03/1995 (c) 1995 (Euro)
+nwarru // 06/04/1995 (c) 1995 (USA)
+nwarrh // 03/04/1995 (c) 1995 (Hispanic)
+nwarrb // 03/04/1995 (c) 1995 (Brazil)
+nwarra // 02/03/1995 (c) 1995 (Asia)
+vhuntj // 02/03/1995 (c) 1995 (Japan)
+vhuntjr1 // 07/03/1995 (c) 1995 (Japan)
+vhuntjr2 // 02/03/1995 (c) 1995 (Japan)
+cybots // 24/04/1995 (c) 1995 (Euro)
+cybotsu // 24/04/1995 (c) 1995 (USA)
+cybotsj // 20/04/1995 (c) 1995 (Japan)
+sfa // 27/07/1995 (c) 1995 (Euro)
+sfar1 // 18/07/1995 (c) 1995 (Euro)
+sfar2 // 27/06/1995 (c) 1995 (Euro)
+sfar3 // 05/06/1995 (c) 1995 (Euro)
+sfau // 27/06/1995 (c) 1995 (USA)
+sfza // 27/06/1995 (c) 1995 (Asia)
+sfzj // 27/07/1995 (c) 1995 (Japan)
+sfzjr1 // 27/06/1995 (c) 1995 (Japan)
+sfzjr2 // 05/06/1995 (c) 1995 (Japan)
+sfzh // 18/07/1995 (c) 1995 (Hispanic)
+sfzhr1 // 27/06/1995 (c) 1995 (Hispanic)
+sfzb // 09/11/1995 (c) 1995 (Brazil)
+sfzbr1 // 27/07/1995 (c) 1995 (Brazil)
+mmancp2u // 06/10/1995 (c) 1995 (Japan)
+rmancp2j // 22/09/1995 (c) 1995 (Japan)
+msh // 24/10/1995 (c) 1995 (Euro)
+mshu // 24/10/1995 (c) 1995 (USA)
+mshj // 17/11/1995 (c) 1995 (Japan)
+mshjr1 // 24/10/1995 (c) 1995 (Japan)
+msha // 24/10/1995 (c) 1995 (Asia)
+mshh // 17/11/1995 (c) 1995 (Hispanic)
+mshb // 17/11/1995 (c) 1995 (Brazil)
+19xx // 07/12/1995 (c) 1996 (USA)
+19xxj // 25/12/1995 (c) 1996 (Japan)
+19xxjr1 // 07/12/1995 (c) 1996 (Japan)
+19xxa // 07/12/1995 (c) 1996 (Asia)
+19xxh // 18/12/1995 (c) 1996 (Hispanic)
+19xxb // 18/12/1995 (c) 1996 (Brazil)
+ddsom // 19/06/1996 (c) 1996 (Euro)
+ddsomr1 // 23/02/1996 (c) 1996 (Euro)
+ddsomr2 // 09/02/1996 (c) 1996 (Euro)
+ddsomr3 // 08/02/1996 (c) 1996 (Euro)
+ddsomu // 19/06/1996 (c) 1996 (USA)
+ddsomur1 // 09/02/1996 (c) 1996 (USA)
+ddsomjr1 // 06/02/1996 (c) 1996 (Japan)
+ddsomj // 19/06/1996 (c) 1996 (Japan)
+ddsoma // 19/06/1996 (c) 1996 (Asia)
+ddsomh // 23/02/1996 (c) 1996 (Hispanic)
+ddsomb // 23/02/1996 (c) 1996 (Brazil)
+sfa2 // 06/03/1996 (c) 1996 (Euro)
+sfa2u // 30/04/1996 (c) 1996 (USA)
+sfa2ur1 // 06/03/1996 (c) 1996 (USA)
+sfz2j // 27/02/1996 (c) 1996 (Japan)
+sfz2a // 27/02/1996 (c) 1996 (Asia)
+sfz2b // 31/05/1996 (c) 1996 (Brazil)
+sfz2br1 // 04/03/1996 (c) 1996 (Brazil)
+sfz2h // 04/03/1996 (c) 1996 (Hispanic)
+sfz2n // 29/02/1996 (c) 1996 (Oceania)
+spf2t // 20/06/1996 (c) 1996 (USA)
+spf2xj // 31/05/1996 (c) 1996 (Japan)
+spf2ta // 29/05/1996 (c) 1996 (Asia)
+spf2th // 31/05/1996 (c) 1996 (Hispanic)
+megaman2 // 08/07/1996 (c) 1996 (USA)
+megaman2a // 08/07/1996 (c) 1996 (Asia)
+rockman2j // 08/07/1996 (c) 1996 (Japan)
+megaman2h // 12/07/1996 (c) 1996 (Hispanic)
+gigamn2 // bootleg
+sfz2al // 26/08/1996 (c) 1996 (Asia)
+sfz2alj // 05/08/1996 (c) 1996 (Japan)
+sfz2alh // 13/08/1996 (c) 1996 (Hispanic)
+sfz2alb // 13/08/1996 (c) 1996 (Brazil)
+qndream // 26/08/1996 (c) 1996 (Japan)
+xmvsf // 04/10/1996 (c) 1996 (Euro)
+xmvsfr1 // 10/09/1996 (c) 1996 (Euro)
+xmvsfu // 23/10/1996 (c) 1996 (USA)
+xmvsfur1 // 04/10/1996 (c) 1996 (USA)
+xmvsfj // 04/10/1996 (c) 1996 (Japan)
+xmvsfjr1 // 10/09/1996 (c) 1996 (Japan)
+xmvsfjr2 // 09/09/1996 (c) 1996 (Japan)
+xmvsfa // 23/10/1996 (c) 1996 (Asia)
+xmvsfar1 // 19/09/1996 (c) 1996 (Asia)
+xmvsfar2 // 10/09/1996 (c) 1996 (Asia)
+xmvsfh // 04/10/1996 (c) 1996 (Hispanic)
+xmvsfb // 23/10/1996 (c) 1996 (Brazil)
+batcir // 19/03/1997 (c) 1997 (Euro)
+batcirj // 19/03/1997 (c) 1997 (Japan)
+batcira // 19/03/1997 (c) 1997 (Asia)
+vsav // 19/05/1997 (c) 1997 (Euro)
+vsavu // 19/05/1997 (c) 1997 (USA)
+vsavj // 19/05/1997 (c) 1997 (Japan)
+vsava // 19/05/1997 (c) 1997 (Asia)
+vsavh // 19/05/1997 (c) 1997 (Hispanic)
+mshvsf // 25/06/1997 (c) 1997 (Euro)
+mshvsfu // 27/08/1997 (c) 1997 (USA)
+mshvsfu1 // 25/06/1997 (c) 1997 (USA)
+mshvsfj // 07/07/1997 (c) 1997 (Japan)
+mshvsfj1 // 02/07/1997 (c) 1997 (Japan)
+mshvsfj2 // 25/06/1997 (c) 1997 (Japan)
+mshvsfh // 25/06/1997 (c) 1997 (Hispanic)
+mshvsfa // 25/06/1997 (c) 1997 (Asia)
+mshvsfa1 // 20/06/1997 (c) 1997 (Asia)
+mshvsfb // 27/08/1997 (c) 1997 (Brazil)
+mshvsfb1 // 25/06/1997 (c) 1997 (Brazil)
+csclub // 17/10/1997 (c) 1997 (Euro)
+csclub1 // 22/07/1997 (c) 1997 (Euro)
+csclubj // 22/07/1997 (c) 1997 (Japan)
+cscluba // 22/07/1997 (c) 1997 (Asia)
+csclubh // 22/07/1997 (c) 1997 (Hispanic)
+sgemf // 04/09/1997 (c) 1997 (USA)
+pfghtj // 04/09/1997 (c) 1997 (Japan)
+sgemfa // 04/09/1997 (c) 1997 (Asia)
+sgemfh // 04/09/1997 (c) 1997 (Hispanic)
+vhunt2r1 // 13/09/1997 (c) 1997 (Japan)
+vhunt2 // 29/09/1997 (c) 1997 (Japan)
+vsav2 // 13/09/1997 (c) 1997 (Japan)
+mvsc // 23/01/1998 (c) 1998 (Euro)
+mvscr1 // 12/01/1998 (c) 1998 (Euro)
+mvscu // 23/01/1998 (c) 1998 (USA)
+mvscur1 // 23/01/1998 (c) 1998 (USA)
+mvscj // 23/01/1998 (c) 1998 (Japan)
+mvscjr1 // 12/01/1998 (c) 1998 (Japan)
+mvsca // 23/01/1998 (c) 1998 (Asia)
+mvscar1 // 12/01/1998 (c) 1998 (Asia)
+mvsch // 23/01/1998 (c) 1998 (Hispanic)
+mvscb // 23/01/1998 (c) 1998 (Brazil)
+sfa3 // 04/09/1998 (c) 1998 (USA)
+sfa3u // 04/09/1998 (c) 1998 (USA)
+sfa3ur1 // 29/06/1998 (c) 1998 (USA)
+sfa3h // 04/09/1998 (c) 1998 (Hispanic)
+sfa3hr1 // 29/06/1998 (c) 1998 (Hispanic)
+sfa3b // 29/06/1998 (c) 1998 (Brazil)
+sfz3j // 04/09/1998 (c) 1998 (Japan)
+sfz3jr1 // 27/07/1998 (c) 1998 (Japan)
+sfz3jr2 // 29/06/1998 (c) 1998 (Japan)
+sfz3a // 04/09/1998 (c) 1998 (Asia)
+sfz3ar1 // 01/07/1998 (c) 1998 (Asia)
+gigawing // 22/02/1999 (c) 1999 Takumi (USA)
+gigawingj // 23/02/1999 (c) 1999 Takumi (Japan)
+gigawinga // 22/02/1999 (c) 1999 Takumi (Asia)
+gigawingh // 22/02/1999 (c) 1999 Takumi (Hispanic)
+gigawingb // 22/02/1999 (c) 1999 Takumi (Brazil)
+jyangoku // 27/05/1999 (c) 1999 (Japan)
+dimahoo // 21/01/2000 (c) 2000 Eighting/Raizing (USA)
+dimahoou // 21/01/2000 (c) 2000 Eighting/Raizing (USA)
+gmahou // 21/01/2000 (c) 2000 Eighting/Raizing (Japan)
+mmatrix // 12/04/2000 (c) 2000 Takumi (USA)
+mmatrixj // 12/04/2000 (c) 2000 Takumi (Japan)
+1944 // 20/06/2000 (c) 2000 Eighting/Raizing (USA)
+1944j // 20/06/2000 (c) 2000 Eighting/Raizing (Japan)
+mpang // 10/10/2000 (c) 2000 Mitchell (Euro)
+mpangr1 // 25/09/2000 (c) 2000 Mitchell (Euro)
+mpangu // 10/10/2000 (c) 2000 Mitchell (USA)
+mpangj // 11/10/2000 (c) 2000 Mitchell (Japan)
+progear // 17/01/2001 (c) 2001 Cave (USA)
+progearj // 17/01/2001 (c) 2001 Cave (Japan)
+progeara // 17/01/2001 (c) 2001 Cave (Asia)
+pzloop2 // 02/03/2001 (c) 2001 Mitchell (Euro)
+pzloop2j // 05/02/2001 (c) 2001 Mitchell (Japan)
+choko // 20/08/2001 (c) 2001 Mitchell (Japan)
+hsf2 // 02/02/2004 (c) 2003, 2004 (USA)
+hsf2j // 22/12/2003 (c) 2003, 2004 (Japan)
+hsf2a // 02/02/2004 (c) 2003, 2004 (Asia)
+
+// CPS2 'Phoenix' bootlegs
+ssf2ud
+ddtodd
+ecofghtrd
+avspd
+dstlku1d
+ringdstd
+xmcotad
+nwarrud
+sfad
+mshud
+19xxd
+sfz2ad
+sfz2jd
+spf2td
+spf2xjd
+ddsomud
+megamn2d
+sfz2ald
+xmvsfu1d
+batcird
+vsavd
+mvscud
+sfa3ud
+gigawingd
+gigawingjd
+1944d
+progearud
+progearjd
+progearjbl
+hsf2d
+ssf2tbd
+ssf2xjd
+sgemfd
+armwar1d
+dimahoud
+mmatrixd
+vhunt2d
+vsav2d
+csclub1d
+cybotsud
+mshvsfu1d
+sfz3jr2d
+
+// Capcom CPS3 games
+redearth // 21/11/1996 (c) 1996 (Euro)
+redeartha // 23/10/1996 (c) 1996 (Euro)
+warzard // 21/11/1996 (c) 1996 (Japan)
+warzarda // 23/10/1996 (c) 1996 (Japan)
+sfiii // 04/02/1997 (c) 1997 (USA)
+sfiiij // 04/02/1997 (c) 1997 (Japan)
+sfiiih // 04/02/1997 (c) 1997 (Hispanic)
+sfiii2 // 30/09/1997 (c) 1997 (USA)
+sfiii2j // 30/09/1997 (c) 1997 (Japan)
+jojo // 08/01/1999 (c) 1998 (USA)
+jojoa // 02/12/1998 (c) 1998 (USA)
+jojoj // 08/01/1999 (c) 1998 (Japan)
+jojoaj // 02/12/1998 (c) 1998 (Japan)
+sfiii3 // 08/06/1999 (c) 1999 (USA)
+sfiii3a // 12/05/1999 (c) 1999 (USA)
+jojoba // 13/09/1999 (c) 1999 (Japan)
+
+sfiiin // 04/02/1997 (c) 1997 (Asia)
+sfiii2n // 30/09/1997 (c) 1997 (Asia)
+jojon // 08/01/1999 (c) 1998 (Asia)
+jojoan // 02/12/1998 (c) 1998 (Asia)
+sfiii3n // 08/06/1999 (c) 1999 (Japan)
+sfiii3an // 12/05/1999 (c) 1999 (Japan)
+jojoban // 13/09/1999 (c) 1999 (Japan)
+jojobane // 13/09/1999 (c) 1999 (Euro)
+
+// Capcom ZN1
+cpzn1
+ts2 // Battle Arena Toshinden 2 (USA 951124)
+ts2j // Battle Arena Toshinden 2 (JAPAN 951124)
+starglad // Star Gladiator (USA 960627)
+stargladj // Star Gladiator (JAPAN 960627)
+sfex // Street Fighter EX (EURO 961219)
+sfexu // Street Fighter EX (USA 961219)
+sfexa // Street Fighter EX (ASIA 961219)
+sfexj // Street Fighter EX (JAPAN 961130)
+glpracr // Gallop Racer (JAPAN Ver 9.01.12)
+sfexp // Street Fighter EX Plus (USA 970407)
+sfexpu1 // Street Fighter EX Plus (USA 970311)
+sfexpj // Street Fighter EX Plus (JAPAN 970311)
+
+// Capcom ZN2
+cpzn2
+rvschool // Rival Schools (USA 971117)
+rvschoola // Rival Schools (ASIA 971117)
+jgakuen // Justice Gakuen (JAPAN 971117)
+sfex2 // Street Fighter EX 2 (USA 980526)
+sfex2j // Street Fighter EX 2 (JAPAN 980312)
+sfex2a // Street Fighter EX 2 (ASIA 980312)
+sfex2h // Street Fighter EX 2 (HISPANIC 980312)
+plsmaswd // Plasma Sword (USA 980316)
+stargld2 // Star Gladiator 2 (JAPAN 980316)
+plsmaswda // Plasma Sword (ASIA 980316)
+tgmj // Tetris The Grand Master (JAPAN 980710)
+techromn // Tech Romancer (EURO 980914)
+techromnu // Tech Romancer (USA 980914)
+kikaioh // Kikaioh (JAPAN 980914)
+sfex2p // Street Fighter EX 2 Plus (USA 990611)
+sfex2pa // Street Fighter EX 2 Plus (ASIA 990611)
+sfex2pj // Street Fighter EX 2 Plus (JAPAN 990611)
+strider2 // Strider 2 (USA 991213)
+strider2a // Strider 2 (ASIA 991213)
+shiryu2 // Strider Hiryu 2 (JAPAN 991213)
+
+alien // (c) 2005
+// Alien Danger
+
+// Tecmo ZN1
+tps
+glpracr2 // Gallop Racer 2 (USA)
+glpracr2j // Gallop Racer 2 (JAPAN)
+glpracr2l // Gallop Racer 2 Link HW (JAPAN)
+doapp // Dead Or Alive ++ (JAPAN)
+cbaj // Cool Boaders Arcade Jam
+shngmtkb // Shanghai Matekibuyuu
+tondemo // Tondemo Crisis (JAPAN)
+glpracr3 // Gallop Racer 3 (JAPAN)
+flamegun // Flame Gunner (USA)
+flamegunj // Flame Gunner (JAPAN)
+lpadv // Logic Pro Adventure (JAPAN)
+tblkkuzu // The Block Kuzushi (JAPAN)
+1on1gov // 1 on 1 Government (JAPAN)
+tecmowcm // Tecmo World Cup Millenium (JAPAN)
+mfjump // Monster Farm Jump (JAPAN)
+
+// Atlus ZN1
+atluspsx
+hvnsgate // Heaven's Gate (JAPAN)
+
+// PS Arcade 95
+psarc95
+beastrzr // Beastorizer (USA)
+bldyroar // Bloody Roar (JAPAN)
+beastrzb // Beastorizer (USA Bootleg)
+bldyror2 // Bloody Roar 2 (WORLD)
+bldyror2u // Bloody Roar 2 (USA)
+bldyror2a // Bloody Roar 2 (ASIA)
+bldyror2j // Bloody Roar 2 (JAPAN)
+brvblade // Brave Blade (WORLD)
+brvbladeu // Brave Blade (USA)
+brvbladea // Brave Blade (ASIA)
+brvbladej // Brave Blade (JAPAN)
+bam2 // Bust a Move 2 (JAPANESE ROM ver. 1999/07/17 10:00:00)
+
+// Atari PSX
+atpsx
+primrag2 // Primal Rage 2
+
+// Acclaim PSX
+acpsx
+nbajamex // NBA Jam Extreme
+jdredd // Judge Dredd (Rev C)
+jdreddb // Judge Dredd (Rev B)
+
+// Video System ZN1
+vspsx
+aerofgts // Aero Fighters Special (TAIWAN)
+sncwgltd // Sonic Wings Limited (JAPAN)
+
+// Taito FX1a
+taitofx1
+sfchamp // Super Football Champ (Ver 2.5O)
+sfchamp24o // Super Football Champ (Ver 2.4O)
+sfchampj // Super Football Champ (Ver 2.4J)
+psyforce // Psychic Force (Ver 2.4O)
+psyforcej // Psychic Force (Ver 2.4J)
+psyforcex // Psychic Force EX (Ver 2.0J)
+mgcldate // Magical Date (JAPAN Ver 2.02J)
+mgcldtex // Magical Date EX (JAPAN Ver 2.01J)
+
+// Taito FX1b
+raystorm // Ray Storm (Ver 2.06A)
+raystormj // Ray Storm (Ver 2.05J)
+ftimpact // Fighters' Impact (Ver 2.02O)
+ftimpactj // Fighters' Impact (Ver 2.02J)
+ftimpcta // Fighters' Impact A (Ver 2.00J)
+gdarius // G-Darius (Ver 2.01J)
+gdariusb // G-Darius (Ver 2.02A)
+gdarius2 // G-Darius Ver.2 (Ver 2.03J)
+
+// Taito GNET
+taitogn
+chaoshea // 1998.10 Chaos Heat (V2.09O)
+chaosheaj // 1998.10 Chaos Heat (V2.08J)
+raycris // 1998.12 Ray Crisis (V2.03J)
+otenamih // 1999.02 Otenami Haiken (Success)
+otenamhf // 2005.04 Otenami Haiken Final (V2.07JC)
+spuzboblj // 1999.03 Super Puzzle Bobble (Japan)
+spuzbobl // 1999.?? Super Puzzle Bobble (V2.05O)
+gobyrc // 1999.?? Go By RC (V2.03O)
+rcdego // 1999.06 RC De Go (V2.03J)
+flipmaze // 1999.09 Flip Maze (V2.04J)
+mahjngoh // 1999.12 Mahjong Oh (V2.06J)
+psyvaria // 2000.03 Psyvariar -Medium Unit- (V2.04J)
+shanghss // 2000.07 Shanghai Shoryu Sairin (V2.03J)
+psyvarrv // 2000.09 Psyvariar -Revision- (V2.04J)
+zokuoten // 2000.12 Zoku Otenamihaiken (V2.03J)
+ // 2000.?? Taito Classic (Success, not released?)
+soutenry // 2001.02 Soutenryu (V2.07J)
+nightrai // 2001.05 Night Raid (V2.03J)
+shikigam // 2001.09 Shikigami no Shiro
+otenki // 2001.10 Otenki Kororin
+usagi // 2001.12 Usagi (V2.02J)
+shangtou // 2002.02 Shanghai Sangokuhaitougi
+xiistag // 2002.07 XII Stag (V2.01J)
+sianniv // 2003.10 Space Invaders Anniversary (V2.02J)
+kollon // 2003.11 Kollon (V2.04J)
+kollonc // 2003.11 Kollon (V2.04JC, Compact Flash version)
+zooo // 2004.05 Zooo
+
+// Namco System 11
+tekken // 1994.?? Tekken (TE4/VER.C)
+tekkena // 1994.?? Tekken (TE2/VER.C)
+tekkenb // 1994.?? Tekken (TE2/VER.B)
+tekkenc // 1994.12 Tekken (TE1/VER.B, Japan)
+tekken2 // 1995.?? Tekken 2 Ver.B (TES3/VER.B)
+tekken2a // 1995.?? Tekken 2 Ver.B (TES2/VER.B)
+ // 1995.10 Tekken 2 Ver.B (TES1/VER.B, Japan)
+tekken2b // 1995.?? Tekken 2 (TES2/VER.A)
+ // 1995.08 Tekken 2 (TES1, Japan)
+souledge1 // 1996.?? Soul Edge (SO3/VER.A)
+souledge1j // 1996.02 Soul Edge (SO1/VER.A, Japan)
+primglex // 1996.03 Prime Goal EX (PG1/VER.A, Japan)
+xevi3dg // 1996.05 Xevious 3D/G (XV31/VER.A, Japan)
+souledge // 1996.?? Soul Edge Ver. II (SO4/VER.C)
+souledgea // 1996.?? Soul Edge Ver. II (SO3/VER.C)
+ // 1996.05 Soul Edge Ver. II (SO1, Japan)
+dunkmnia // 1996.?? Dunk Mania (DM1/VER.C)
+dunkmniaj // 1996.05 Dunk Mania (DM1/VER.C, Japan)
+danceyes // 1996.09 Dancing Eyes (DC1/VER.A, Japan)
+pocketrc // 1997.03 Pocket Racer (PKR1/VER.B, Japan)
+starswep // 1997.07 Star Sweep (STP1/VER.A, Japan)
+myangel3 // 1998.03 Kosodate Quiz My Angel 3 (KQT1/VER.A, Japan)
+ptblank2a // 1999.?? Point Blank 2 (GNB3/VER.A)
+ // 1999.02 Gunbaarl (GNB1, Japan)
+
+// Namco System 12
+tekken3 // 1997.03 Tekken 3 (TET1/VER.E1, Japan)
+tekken3a // 1997.?? Tekken 3 (TET2/VER.B)
+tekken3b // 1997.?? Tekken 3 (TET3/VER.A)
+tekken3c // 1997.?? Tekken 3 (TET2/VER.A)
+lbgrande // 1997.?? Libero Grande (LG2/VER.A)
+ // 1997.12 Libero Grande (LG1, Japan)
+toukon3 // 1997.12 Shin Nihon Pro Wrestling Toukon Retsuden 3 Arcade Edition (TR1/VER.A, Japan)
+ehrgeiz // 1998.?? Ehrgeiz (EG3/VER.A)
+ehrgeiza // 1998.?? Ehrgeiz (EG2/VER.A)
+ehrgeizj // 1998.05 Ehrgeiz (EG1, Japan)
+sws98 // 1998.06 Super World Stadium '98 (SS81/VER.A, Japan)
+soulclbr // 1998.?? Soul Calibur (SOC14/VER.C)
+soulclbrb // 1998.?? Soul Calibur (SOC14/VER.B)
+soulclbrj // 1998.07 Soul Calibur (SOC11/VER.C, Japan)
+soulclbrb2 // 1998.?? Soul Calibur (SOC13/VER.B)
+soulclbrjb // 1998.?? Soul Calibur (SOC11/VER.B, Japan)
+soulclbrja // 1998.?? Soul Calibur (SOC11/VER.A2, Japan)
+ // 1998.07 Techno Drive
+mdhorse // 1998.11 Derby Quiz My Dream Horse (MDH1/VER.A2, Japan)
+ // 1998.12 Attack Pla Rail
+tenkomor // 1998.?? Tenkomori Shooting (TKM2/VER.A1)
+tenkomorj // 1998.12 Tenkomori Shooting (TKM1/VER.A1, Japan)
+pacapp // 1998.12 Paca Paca Passion (PPP1/VER.A2, Japan)
+fgtlayer // 1998.12 Fighting Layer (FTL0/VER.A, Japan)
+ // 1999.01 Bust A Move (Metro)
+ptblank2 // 1999.?? Point Blank 2 (GNB5/VER.A)
+sws99 // 1999.05 Super World Stadium '99 (SS91/VER.A3, Japan)
+ghlpanic // 1999.?? Ghoul Panic (OB2/VER.A)
+ // 1999.07 Oh Bakyuun (OB1, Japan)
+pacapp2 // 1999.07 Paca Paca Passion 2 (PKS1/VER.A, Japan)
+ // 1999.07 Bust A Move 2 (Metro)
+tektagt // 1999.?? Tekken Tag Tournament (TEG3/VER.C1)
+tektagta // 1999.?? Tekken Tag Tournament (TEG3/VER.B)
+tektagtb // 1999.07 Tekken Tag Tournament (TEG1/VER.B, Japan)
+tektagtc // 1999.07 Tekken Tag Tournament (TEG1/VER.A, Japan)
+mrdrillr // 1999.11 Mr Driller (DRI1/VER.A2, Japan)
+ // 1999.12 UmJammer Lammy NOW! (Japan)
+ // 1999.12 Quest for Fame (Japan)
+pacappsp // 1999.12 Paca Paca Passion Special (PSP1/VER.A, Japan)
+kaiunqz // 1999.12 Kaiun Quiz (KW1/VER.A, Japan)
+aquarush // 2000.02 Aqua Rush (AQ1/VER.A1, Japan)
+golgo13 // 2000.03 Golgo 13 (GLG1/VER.A, Japan)
+sws2000 // 2000.03 Super World Stadium 2000 (SS01/VER.A, Japan)
+truckk // 2000.06 Truck Kyousoukyoku (Metro)
+ // 2000.07 Kart Duel
+ // 2000.08 Teknowerk
+g13knd // 2000.10 Golgo 13 Kiseki no Dandou (GLS1/VER.A, Japan)
+sws2001 // 2001.04 Super World Stadium 2001 (SS11/VER.A, Japan)
+
+// Namco System 10
+mrdrilr2 // 2000.07 Mr Driller 2 (DR21 Ver.A)
+mrdrlr2a // 2000.?? Mr Driller 2 (DR22 Ver.A)
+ptblank3 // 2000.12 Point Blank 3 / Gunbalina
+ // 2001.02 Photo Battole
+ // 2001.02 Taiko no Tatsujin
+ // 2001.03 Gahaha Ippatsudou
+mrdrilrg // 2001.03 Mr. Driller G (DRG1 Ver.A)
+ // 2001.07 Golgo 13 Juusei no Requiem
+ // 2001.08 Taiko no Tatsujin 2
+ // 2001.09 Gahaha Ippatsudou 2
+ // 2001.11 Knock Down 2001
+knpuzzle // 2001.12 Kotoba no Puzzle Mojipittan (KPM1 Ver.A)
+gjspace // 2001.12 Gekitoride-Jong Space (10011 Ver.A)
+ // 2002.03 Panicuru Panekuru
+ // 2002.03 Taiko no Tatsujin 3
+startrgn // 2002.07 Star Trigon (STT1 Ver.A)
+ // 2002.07 Tsukkomi Yousei Gips Nice Tsukkomi
+gamshara // 2002.08 Gamshara (10021 Ver.A)
+chocovdr // 2002.10 Uchuu Daisakusen : Chocovader Contactee
+ // 2002.12 Taiko no Tatsujin 4
+ // 2003.04 Seisyun Quiz Colorful High School
+ // 2003.10 Taiko no Tatsujin 5
+ // 2004.07 Taiko no Tatsujin 6
+
+// Konami GQ
+cryptklr // Crypt Killer (GQ420 UAA)
+
+// Konami GV
+konamigv
+kdeadeye // GV054, UA01
+pbball96 // GV017, Japan 1.03
+hyperath // GV021, Japan 1.00
+susume // GV027, Japan 1.20
+btchamp // GV053, UAA01
+weddingr // GX624, JAA
+tokimosh // GE755, JAA
+tokimosp // GE756, JAB
+nagano98 // GX720, EAA
+simpbowl // GQ829, UAA
+
+// Konami System 573
+sys573
+darkhleg // 1998 - Dark Horse Legend (GX706 VER. JAA)
+fbaitbc // 1998 - Fisherman's Bait - A Bass Challenge (GE765 VER. UAB)
+bassangl // 1998 - Bass Angler (GE765 VER. JAA)
+pbballex // 1998 - Powerful Pro Baseball EX (GX802 VER. JAB)
+konam80s // 1998 - Konami 80's AC Special (GC826 VER. EAA)
+konam80u // 1998 - Konami 80's AC Special (GC826 VER. UAA)
+konam80j // 1998 - Konami 80's Gallery (GC826 VER. JAA)
+konam80a // 1998 - Konami 80's AC Special (GC826 VER. AAA)
+konam80k // 1998 - Konami 80's AC Special (GC826 VER. KAA)
+dstage // 1999 - Dancing Stage (GN845 VER. EAA)
+ddru // 1999 - Dance Dance Revolution (GN845 VER. UAA)
+ddrj // 1998 - Dance Dance Revolution - Internet Ranking Ver (GC845 VER. JBA)
+ddrja // 1998 - Dance Dance Revolution (GC845 VER. JAA)
+ddrjb // 1998 - Dance Dance Revolution (GC845 VER. JAB)
+ddra // 1999 - Dance Dance Revolution (GN845 VER. AAA)
+fbait2bc // 1998 - Fisherman's Bait 2 - A Bass Challenge (GE865 VER. UAB)
+bassang2 // 1998 - Bass Angler 2 (GE865 VER. JAA)
+drmn // 1999 - DrumMania (GQ881 VER. JAD)
+gtrfrks // 1999 - Guitar Freaks (GQ886 VER. EAC)
+gtrfrksu // 1999 - Guitar Freaks (GQ886 VER. UAC)
+gtrfrksj // 1999 - Guitar Freaks (GQ886 VER. JAC)
+gtrfrksa // 1999 - Guitar Freaks (GQ886 VER. AAC)
+fbaitmc // 1999 - Fisherman's Bait - Marlin Challenge (GX889 VER. EA)
+fbaitmcu // 1999 - Fisherman's Bait - Marlin Challenge (GX889 VER. UA)
+fbaitmcj // 1999 - Fisherman's Bait - Marlin Challenge (GX889 VER. JA)
+fbaitmca // 1999 - Fisherman's Bait - Marlin Challenge (GX889 VER. AA)
+ddr2m // 1999 - Dance Dance Revolution 2nd Mix (GN895 VER. JAA)
+ddr2ml // 1999 - Dance Dance Revolution 2nd Mix - Link Ver (GE885 VER. JAB)
+ddr2mla // 1999 - Dance Dance Revolution 2nd Mix - Link Ver (GE885 VER. JAA)
+ddrbocd // 1999 - Dance Dance Revolution Best of Cool Dancers (GE892 VER. JAA)
+ddr2mc // 1999 - Dance Dance Revolution 2nd Mix with beatmaniaIIDX CLUB VERSiON (GE896 VER. JAA)
+ddr2mc2 // 1999 - Dance Dance Revolution 2nd Mix with beatmaniaIIDX substream CLUB VERSiON 2 (GE984 VER. JAA)
+gtrfrk2m // 1999 - Guitar Freaks 2nd Mix Ver 1.01 (GQ883 VER. JAD)
+dsftkd // 1999 - Dancing Stage featuring TRUE KiSS DESTiNATiON (G*884 VER. JAA)
+cr589fw // 1999 - CR-589 Firmware (700B04)
+cr589fwa // 1999 - CR-589 Firmware (700A04)
+ddr3mk // 2000 - Dance Dance Revolution 3rd Mix - Ver.Korea2 (GN887 VER. KBA)
+ddr3mka // 2000 - Dance Dance Revolution 3rd Mix - Ver.Korea (GN887 VER. KAA)
+ddr3ma // 1999 - Dance Dance Revolution 3rd Mix (GN887 VER. AAA)
+ddr3mj // 1999 - Dance Dance Revolution 3rd Mix (GN887 VER. JAA)
+ddrsbm // 1999 - Dance Dance Revolution Solo Bass Mix (GQ894 VER. JAA)
+ddrs2k // 1999 - Dance Dance Revolution Solo 2000 (GC905 VER. AAA)
+ddrs2kj // 1999 - Dance Dance Revolution Solo 2000 (GC905 VER. JAA)
+hyperbbc // 1999 - Hyper Bishi Bashi Champ (GX908 1999/08/24 VER. JAA)
+hyperbbck // 1999 - Hyper Bishi Bashi Champ (GX908 1999/08/24 VER. KAA)
+dsfdct // 1999 - Dancing Stage featuring Dreams Come True (GC910 VER. JCA)
+dsfdcta // 1999 - Dancing Stage featuring Dreams Come True (GC910 VER. JAA)
+drmn2m // 1999 - DrumMania 2nd Mix (GE912 VER. JAB)
+drmn2mpu // 1999 - DrumMania 2nd Mix Session Power Up Kit (GE912 VER. JAB)
+dncfrks // 2000 - Dance Freaks (G*874 VER. KAA)
+dmx // 2000 - Dance Maniax (G*874 VER. JAA)
+gunmania // 2000 - GunMania (GL906 VER. JAA)
+fghtmn // 2000 - Fighting Mania (QG918 VER. EAA)
+fghtmna // 2000 - Fighting Mania (QG918 VER. AAA)
+pnchmn // 2000 - Punch Mania: Hokuto No Ken (GQ918 VER. JAB)
+pnchmna // 2000 - Punch Mania: Hokuto No Ken (GQ918 VER. JAB, ALT CD)
+fghtmnk // 2000 - Fighting Mania (QG918 VER. KAA)
+fghtmnu // 2000 - Fighting Mania (QG918 VER. IAA)
+dsem // 2000 - Dancing Stage Euro Mix (G*936 VER. EAA)
+gtrfrk3m // 2000 - Guitar Freaks 3rd Mix (GE949 VER. JAC)
+gtfrk3ma // 2000 - Guitar Freaks 3rd Mix (GE949 VER. JAB)
+gtfrk3mb // 2000 - Guitar Freaks 3rd Mix - security cassette versionup (949JAZ02)
+pnchmn2 // 2000 - Punch Mania 2: Hokuto No Ken (GQA09 JAA)
+salarymc // 2000 - Salary Man Champ (G*A18 VER. JAA)
+ddr3mp // 2000 - Dance Dance Revolution 3rd Mix Plus (G*A22 VER. JAA)
+pcnfrk3m // 2000 - Percussion Freaks 3rd Mix (G*A23 VER. KAA)
+drmn3m // 2000 - DrumMania 3rd Mix (G*A23 VER. JAA)
+gtrfrk4m // 2000 - Guitar Freaks 4th Mix (G*A24 VER. JAA)
+drmn4m // 2000 - DrumMania 4th Mix (G*A25 VER. JAA)
+ddr4m // 2000 - Dance Dance Revolution 4th Mix (G*A33 VER. AAA)
+ddr4mj // 2000 - Dance Dance Revolution 4th Mix (G*A33 VER. JAA)
+ddr4ms // 2000 - Dance Dance Revolution Solo 4th Mix (G*A33 VER. ABA)
+ddr4msj // 2000 - Dance Dance Revolution Solo 4th Mix (G*A33 VER. JBA)
+dsfdr // 2000 - Dancing Stage Featuring Disney's Rave (GCA37JAA)
+ddrusa // 2000 - Dance Dance Revolution USA (G*A44 VER. UAA)
+ddr4mp // 2000 - Dance Dance Revolution 4th Mix Plus (G*A34 VER. JAA)
+ddr4mps // 2000 - Dance Dance Revolution 4th Mix Plus Solo (G*A34 VER. JAA)
+dmx2m // 2000 - Dance Maniax 2nd Mix (G*A39 VER. JAA)
+gtrfrk5m // 2001 - Guitar Freaks 5th Mix (G*A26 VER. JAA)
+ddr5m // 2001 - Dance Dance Revolution 5th Mix (G*A27 VER. JAA)
+dmx2majp // 2001 - Dance Maniax 2nd Mix Append J-Paradise (G*A38 VER. JAA
+mamboagg // 2001 - Mambo A Go-Go (GQA40 VER. JAB)
+drmn5m // 2001 - DrumMania 5th Mix (G*B05 VER. JAA)
+gtrfrk6m // 2001 - Guitar Freaks 6th Mix (G*B06 VER. JAA)
+drmn6m // 2001 - DrumMania 6th Mix (G*B16 VER. JAA)
+gtrfrk7m // 2001 - Guitar Freaks 7th Mix (G*B17 VER. JAA)
+ddrmax // 2001 - DDR Max - Dance Dance Revolution 6th Mix (G*B19 VER. JAA)
+ddrmax2 // 2002 - DDR Max 2 - Dance Dance Revolution 7th Mix (G*B20 VER. JAA)
+mrtlbeat // 2002 - Martial Beat (Martial Beat (G*B47 VER. JBA)
+drmn7m // 2002 - DrumMania 7th Mix power-up ver. (G*C07 VER. JBA)
+drmn7ma // 2002 - DrumMania 7th Mix (G*C07 VER. JAA)
+gtrfrk8m // 2002 - Guitar Freaks 8th Mix power-up ver. (G*C08 VER. JBA)
+gtrfrk8ma // 2002 - Guitar Freaks 8th Mix (G*C08 VER. JAA)
+dsem2 // 2002 - Dancing Stage Euro Mix 2 (G*C23 VER. EAA)
+ddrextrm // 2002 - Dance Dance Revolution Extreme (G*C36 VER. JAA)
+drmn8m // 2003 - DrumMania 8th Mix (G*C38 VER. JAA)
+gtrfrk9m // 2003 - Guitar Freaks 9th Mix (G*C39 VER. JAA)
+drmn9m // 2003 - DrumMania 9th Mix (G*D09 VER. JAA)
+gtfrk10m // 2003 - Guitar Freaks 10th Mix (G*D10 VER. JAB)
+gtfrk10ma // 2003 - Guitar Freaks 10th Mix (G*D10 VER. JAA)
+gtfrk10mb // 2003 - Guitar Freaks 10th Mix eAmusement (G*D10 VER. JBA)
+gtfrk11m // 2004 - Guitar Freaks 11th Mix (G*D39 VER. JAA)
+drmn10m // 2004 - DrumMania 10th Mix (G*D40 VER. JAA)
+
+// Konami Twinkle games
+gq863
+bmiidx
+bmiidxc
+bmiidxca
+bmiidxc2
+bmiidx3
+bmiidx4
+bmiidx6
+bmiidx7
+bmiidx8
+
+// Konami Viper games
+kviper // 1999
+ppp2nd // 2001
+boxingm // 2001
+code1d // 2000
+code1db // 2000
+gticlub2 // 2001
+gticlub2ea // 2001
+jpark3 // 2001
+mocapglf // 2001
+mocapb // 2001
+mocapbj // 2001
+p911 // 2001
+p911uc // 2001
+p911kc // 2001
+p911e // 2001
+p911j // 2001
+p9112 // 2001
+popn9 // 2003
+sscopex // 2001
+sogeki // 2001
+thrild2 // 2001
+thrild2a // 2001
+thrild2c // 2001
+tsurugi // 2001
+tsurugij // 2001
+wcombat // 2002
+wcombatk // 2002
+wcombatj // 2002
+xtrial // 2002
+mfightc // 2002
+mfightcc // 2002
+
+// Mitchell games
+mgakuen // (c) 1988 Yuga
+7toitsu // (c) 1988 Yuga
+mgakuen2 // (c) 1989 Face
+pkladies // (c) 1989 Mitchell
+pkladiesl // (c) 1989 Leprechaun
+pkladiesla // (c) 1989 Leprechaun
+pkladiesbl // bootleg
+dokaben // 3/1989 (c) 1989 Capcom (Japan)
+ // 8/1989 Dokaben 2 (baseball)
+pang // (c) 1989 Mitchell (World)
+pangb // bootleg
+pangbold // bootleg
+pangba // bootleg
+bbros // (c) 1989 Capcom (US) not listed on Capcom's site
+pompingw // (c) 1989 Mitchell (Japan)
+cbasebal // 10/1989 (c) 1989 Capcom (Japan) (different hardware)
+cworld // 11/1989 (QUIZ 1) (c) 1989 Capcom
+hatena // 28/02/1990 (QUIZ 2) (c) 1990 Capcom (Japan)
+spang // 14/09/1990 (c) 1990 Mitchell (World)
+spangj // --/--/1990 (c) 1990 Mitchell (Japan)
+spangbl // bootleg
+sbbros // 01/10/1990 (c) 1990 Mitchell + Capcom (US) not listed on Capcom's site
+marukin // 17/10/1990 (c) 1990 Yuga (Japan)
+qtono1 // 25/12/1990 (QUIZ 3) (c) 1991 Capcom (Japan)
+ // 4/1991 Ashita Tenki ni Naare (golf)
+qsangoku // 07/06/1991 (QUIZ 4) (c) 1991 Capcom (Japan)
+block // 10/09/1991 (c) 1991 Capcom (World)
+blockj // 10/09/1991 (c) 1991 Capcom (Japan)
+blockjoy // 06/11/1991 (c) 1991 Capcom (World) (Joystick version, bad dump?)
+blockbl // bootleg
+
+// Incredible Technologies games
+// http://www.itsgames.com
+capbowl // (c) 1988 Incredible Technologies
+capbowl2 // (c) 1988 Incredible Technologies
+capbowl3 // (c) 1988 Incredible Technologies
+capbowl4 // (c) 1989 Incredible Technologies
+clbowl // (c) 1989 Incredible Technologies
+bowlrama // (c) 1991 P & P Marketing
+wfortune // (c) 1989 GameTek
+wfortunea // (c) 1989 GameTek
+grmatch // (c) 1989 GameTek
+stratab // (c) 1990 Strata/Incredible Technologies
+stratab1 // (c) 1990 Strata/Incredible Technologies
+sstrike // (c) 1990 Strata/Incredible Technologies
+gtg // (c) 1990 Strata/Incredible Technologies
+gtgt // (c) 1990 Strata/Incredible Technologies
+gtgt1 // (c) 1990 Strata/Incredible Technologies
+hstennis // (c) 1990 Strata/Incredible Technologies
+hstennis10 // (c) 1990 Strata/Incredible Technologies
+slikshot // (c) 1990 Grand Products/Incredible Technologies
+slikshot17 // (c) 1990 Grand Products/Incredible Technologies
+slikshot16 // (c) 1990 Grand Products/Incredible Technologies
+dynobop // (c) 1990 Grand Products/Incredible Technologies
+arlingtn // (c) 1991 Strata/Incredible Technologies
+peggle // (c) 1991 Strata/Incredible Technologies
+pegglet // (c) 1991 Strata/Incredible Technologies
+pokrdice // (c) 1991 Strata/Incredible Technologies
+rimrockn // (c) 1991 Strata/Incredible Technologies
+rimrockn20 // (c) 1991 Strata/Incredible Technologies
+rimrockn16 // (c) 1991 Strata/Incredible Technologies
+rimrockn12 // (c) 1991 Strata/Incredible Technologies
+ninclown // (c) 1991 Strata/Incredible Technologies
+gpgolf // (c) 1992 Strata/Incredible Technologies
+gtg2 // (c) 1992 Strata/Incredible Technologies
+gtg2t // (c) 1989 Strata/Incredible Technologies
+gtg2j // (c) 1991 Strata/Incredible Technologies
+neckneck // (c) 1992 Bundra Games/Incredible Technologies
+timekill // (c) 1992 Strata/Incredible Technologies
+timekill131 // (c) 1992 Strata/Incredible Technologies
+timekill121 // (c) 1992 Strata/Incredible Technologies
+hardyard // (c) 1993 Strata/Incredible Technologies
+hardyard10 // (c) 1993 Strata/Incredible Technologies
+bloodstm // (c) 1994 Strata/Incredible Technologies
+bloodstm22 // (c) 1994 Strata/Incredible Technologies
+bloodstm21 // (c) 1994 Strata/Incredible Technologies
+bloodstm11 // (c) 1994 Strata/Incredible Technologies
+pairs // (c) 1994 Strata/Incredible Technologies
+pairsa // (c) 1994 Strata/Incredible Technologies
+hotmemry // (c) 1994 Tuning/Incredible Technologies
+hotmemry11 // (c) 1994 Tuning/Incredible Technologies
+drivedge // (c) 1994 Strata/Incredible Technologies
+wcbowl // (c) 1995 Incredible Technologies
+wcbowl165 // (c) 1995 Incredible Technologies
+wcbowl161 // (c) 1995 Incredible Technologies
+wcbowl16 // (c) 1995 Incredible Technologies
+wcbowl140 // (c) 1995 Incredible Technologies
+wcbowl15 // (c) 1995 Incredible Technologies
+wcbowl14 // (c) 1995 Incredible Technologies
+wcbowl13 // (c) 1995 Incredible Technologies
+wcbowl12 // (c) 1995 Incredible Technologies
+sftm // (c) 1995 Capcom/Incredible Technologies
+sftm110 // (c) 1995 Capcom/Incredible Technologies
+sftm111 // (c) 1995 Capcom/Incredible Technologies
+sftmj // (c) 1995 Capcom/Incredible Technologies
+shufshot // (c) Strata/Incredible Technologies
+shufshot139 // (c) Strata/Incredible Technologies
+shufshot137 // (c) Strata/Incredible Technologies
+wcbowldx // (c) 1999 Incredible Technologies
+
+gt3d // (c) 1995 Incredible Technologies
+gt3dl192 // (c) 1995 Incredible Technologies
+gt3dl191 // (c) 1995 Incredible Technologies
+gt3ds192 // (c) 1995 Incredible Technologies
+gt3dv18 // (c) 1995 Incredible Technologies
+gt3dv17 // (c) 1995 Incredible Technologies
+gt3dv16 // (c) 1995 Incredible Technologies
+gt3dv15 // (c) 1995 Incredible Technologies
+gt3dv14 // (c) 1995 Incredible Technologies
+gt3dt231 // (c) 1995 Incredible Technologies
+gt3dt211 // (c) 1995 Incredible Technologies
+gt97 // (c) 1997 Incredible Technologies
+gt97v122 // (c) 1997 Incredible Technologies
+gt97v121 // (c) 1997 Incredible Technologies
+gt97s121 // (c) 1997 Incredible Technologies
+gt97v120 // (c) 1997 Incredible Technologies
+gt97t240 // (c) 1997 Incredible Technologies
+gt97t243 // (c) 1997 Incredible Technologies
+gt98 // (c) 1998 Incredible Technologies
+gt98v100 // (c) 1998 Incredible Technologies
+gt98s100 // (c) 1998 Incredible Technologies
+gt98t303 // (c) 1998 Incredible Technologies
+gt99 // (c) 1999 Incredible Technologies
+gt99s100 // (c) 1999 Incredible Technologies
+gt99t400 // (c) 1999 Incredible Technologies
+gtroyal // (c) 1999 Incredible Technologies
+gt2k // (c) 2000 Incredible Technologies
+gt2kp100 // (c) 2000 Incredible Technologies
+gt2ks100 // (c) 2000 Incredible Technologies
+gt2kt500 // (c) 2000 Incredible Technologies
+gtsuprem // (c) 2000 Incredible Technologies
+gtclassc // (c) 2001 Incredible Technologies
+gtclasscp // (c) 2001 Incredible Technologies
+gtclasscs // (c) 2001 Incredible Technologies
+
+// Leland games
+cerberus // (c) 1985 Cinematronics
+mayhem // (c) 1985 Cinematronics
+powrplay // (c) 1985 Cinematronics
+wseries // (c) 1985 Cinematronics
+alleymas // (c) 1986 Cinematronics
+upyoural // (c) 1987 Cinematronics
+dangerz // (c) 1986 Cinematronics USA
+basebal2 // (c) 1987 Cinematronics
+dblplay // (c) 1987 Tradewest / Leland
+strkzone // (c) 1988 Leland
+redlin2p // (c) 1987 Cinematronics + Tradewest license
+quarterb // (c) 1987 Leland
+quarterba // (c) 1987 Leland
+viper // (c) 1988 Leland
+teamqb // (c) 1988 Leland
+teamqb2 // (c) 1988 Leland
+aafb // (c) 1989 Leland
+aafbd2p // (c) 1989 Leland
+aafbc // (c) 1989 Leland
+aafbb // (c) 1989 Leland
+offroad // (c) 1989 Leland
+offroadt // (c) 1989 Leland
+offroadt2p // (c) 1989 Leland
+pigout // (c) 1990 Leland
+pigouta // (c) 1990 Leland
+ataxx // (c) 1990 Leland
+ataxxa // (c) 1990 Leland
+ataxxe // (c) 1990 Leland
+ataxxj // (c) 1990 Leland
+wsf // (c) 1990 Leland
+indyheat // (c) 1991 Leland
+brutforc // (c) 1991 Leland
+asylum // (c) 1991 Leland
+
+// Gremlin 8080 games
+// the numbers listed are the range of ROM part numbers
+blockade // 1-4 [1977 Gremlin]
+comotion // 5-7 [1977 Gremlin]
+hustle // 16-21 [1977 Gremlin]
+blasto // [1978 Gremlin]
+mineswpr // [1977 Amutech]
+mineswpr4 // [1977 Amutech]
+
+// Gremlin/Sega "VIC dual game board" games
+// the numbers listed are the range of ROM part numbers
+depthch // 50-55 [1977 Gremlin?]
+depthcho // ? [1977 Gremlin?]
+subhunt // ? [1977 Taito]
+safari // 57-66 [1977 Gremlin?]
+safaria // bootleg?
+frogs // 112-119 [1978 Gremlin?]
+sspaceat // 155-162 (c)
+sspaceat2 // 155-162 (c) 1979 Sega
+sspaceat3 // 155-162 (c) 1979 Sega
+sspaceatc // 139-146 (c)
+sspacaho // ? epr00001.bin - epr00008.bin
+headon // 163-167/192-193 (c) Gremlin
+headonb // 163-167/192-193 (c) Gremlin
+headons // Sidam bootleg
+headonsa // Sidam bootleg
+supcrash // bootleg
+headon2 // ???-??? (c) 1979 Sega
+headon2s // Sidam bootleg
+car2 // bootleg
+ // ???-??? Fortress
+ // ???-??? Gee Bee
+ // 255-270 Head On 2 / Deep Scan
+invho2 // 271-286 (c) 1979 Sega
+nsub // 268-275 (c) 1980 Sega
+samurai // 289-302 + upgrades (c) 1980 Sega
+invinco // 310-318 (c) 1979 Sega
+invds // 367-382 (c) 1979 Sega
+tranqgun // 413-428 (c) 1980 Sega
+ // 450-465 Tranquilizer Gun (different version?)
+ // ???-??? Car Hunt / Deep Scan
+spacetrk // 630-645 (c) 1980 Sega
+spacetrkc // (c) 1980 Sega
+carnival // 651-666 (c) 1980 Sega
+carnivalc // 501-516 (c) 1980 Sega
+carnivalh
+carnivalha
+brdrline // (c) 1980 Sega
+starrkr // (c) 1981 Sega
+brdrlins // Sidam bootleg
+brdrlinb // Karateco bootleg
+digger // 684-691 no copyright notice
+pulsar // 790-805 (c) 1981 Sega
+heiankyo // (c) [1979?] Denki Onkyo
+alphaho // Data East
+
+// Sega G-80 vector games
+spacfury // (c) 1981
+spacfurya // no copyright notice
+spacfuryb // no copyright notice
+zektor // (c) 1982
+tacscan // (c) 1982
+elim2 // (c) 1981 Gremlin
+elim2a // (c) 1981 Gremlin
+elim2c // (c) 1981 Gremlin
+elim4 // (c) 1981 Gremlin
+elim4p // (c) 1981 Gremlin
+startrek // (c) 1982
+
+// Sega G-80 raster games
+astrob // (c) 1981
+astrob2 // (c) 1981
+astrob2a // (c) 1981
+astrob1 // (c) 1981
+astrobg // (c) 1981
+005 // (c) 1981
+monsterb // (c) 1982
+monsterb2 // (c) 1982
+spaceod // (c) 1981
+spaceod2 // (c) 1981
+pignewt // (c) 1983
+pignewta // (c) 1983
+sindbadm // 834-5244 (c) 1983 Sega
+
+// Sega "Zaxxon hardware" games
+zaxxon // (c) 1982
+zaxxonj // (c) 1982
+zaxxon2 // (c) 1982
+zaxxon3 // (c) 1982
+zaxxonb // bootleg
+szaxxon // (c) 1982
+futspy // (c) 1984
+razmataz // modified 834-0213, 834-0214 (c) 1983
+ixion // (c) 1983
+congo // 605-5167 (c) 1983
+tiptop // 605-5167 (c) 1983
+
+// Sega "LaserDisc hardware" games
+astron // (c) 1983
+astronp // (c) 1983
+galaxyr // (c) 1983
+galaxyrp // (c) 1983
+sblazerp // (c) 1983
+cobraseg // (c) ????
+gpworld // (c) 1984
+timetrv // (c) 1991.10 Virtual Image Productions
+
+// Sega SG1000 based games
+chboxing // (c) 1984
+chwrestl // (c) 1985
+dokidoki // (c) 1985
+
+// Sega System 1 / System 2 games
+starjack // 834-5191 (c) 1983 (S1)
+starjacks // (c) 1983 Stern (S1)
+regulus // 834-5328?(c) 1983 (S1)
+reguluso // 834-5328?(c) 1983 (S1)
+regulusu // 834-5328?(c) 1983 (S1)
+upndown // (c) 1983 (S1)
+upndownu // (c) 1983 (S1)
+mrviking // 834-5383 (c) 1984 (S1)
+mrvikingj // 834-5383 (c) 1984 (S1)
+swat // 834-5388 (c) 1984 Coreland / Sega (S1)
+flicky // (c) 1984 (S1)
+flickys2 // (c) 1984 (S1)
+flickyo // (c) 1984 (S1)
+flickys1 // (c) 1984 (S1)
+wmatch // (c) 1984 (S1)
+bullfgt // 834-5478 (c) 1984 Sega / Coreland (S1)
+thetogyu // 834-5478 (c) 1984 Sega / Coreland (S1)
+spatter // 834-5583 (c) 1984 (S1)
+ssanchan // 834-5583 (c) 1984 (S1)
+pitfall2 // 834-5627 [1985?] reprogrammed, (c) 1984 Activision (S1)
+pitfall2a // 834-5627 [1985?] reprogrammed, (c) 1984 Activision (S1)
+pitfall2u // 834-5627 [1985?] reprogrammed, (c) 1984 Activision (S1)
+seganinj // 834-5677 (c) 1985 (S1)
+seganinju // 834-5677 (c) 1985 (S1)
+ninja // 834-5677 (c) 1985 (S1)
+nprinces // 834-5677 (c) 1985 (S1)
+nprinceso // 834-5677 (c) 1985 (S1)
+nprincesu // 834-5677 (c) 1985 (S1)
+nprincesb // bootleg? (S1)
+imsorry // 834-5707 (c) 1985 Coreland / Sega (S1)
+imsorryj // 834-5707 (c) 1985 Coreland / Sega (S1)
+teddybb // 834-5712 (c) 1985 (S1)
+teddybbo // 834-5712 (c) 1985 (S1)
+hvymetal // 834-5745 (c) 1985 (S2?)
+myhero // 834-5755 (c) 1985 (S1)
+sscandal // 834-5755 (c) 1985 Coreland / Sega (S1)
+myherok // 834-5755 (c) 1985 Coreland / Sega (S1)
+shtngmst // 834-5719/5720 (c) 1985 (S2)
+shtngmste // 834-5719/5720 (c) 1985 (S2)
+choplift // 834-5795 (c) 1985, (c) 1982 Dan Gorlin (S2)
+chopliftu // 834-5795 (c) 1985, (c) 1982 Dan Gorlin (S2)
+chopliftbl // bootleg (S2)
+4dwarrio // 834-5918 (c) 1985 Coreland / Sega (S1)
+brain // (c) 1986 Coreland / Sega (S2?)
+raflesia // 834-5753 (c) 1985 Coreland / Sega (S1)
+wboy // 834-5984 (c) 1986 + Escape license (S1)
+wboyo // 834-5984 (c) 1986 + Escape license (S1)
+wboy2 // 834-5984 (c) 1986 + Escape license (S1)
+wboy2u // 834-5984 (c) 1986 + Escape license (S1)
+wboy3 // 834-5984 (c) 1986 + Escape license (S1)
+wboy4 // 834-5984 (c) 1986 + Escape license (S1)
+wboyu // 834-5753 (? maybe a conversion) (c) 1986 + Escape license (S1)
+wbdeluxe // (c) 1986 + Escape license (S1)
+wboysys2 // 834-5984 (c) 1986 + Escape license (S1)
+gardia // 834-6119 (S2?)
+gardiab // bootleg
+nob // (c) Data East
+nobb // bootleg
+blockgal // 834-6303 (S1)
+blockgalb // bootleg
+tokisens // (c) 1987 (from a bootleg board) (S2)
+wbml // bootleg (S2)
+wbmljo // (c) 1987 Sega/Westone (S2)
+wbmljb // (c) 1987 Sega/Westone (S2)
+wbmlb // bootleg? (S2)
+wbmlbg // bootleg (Galaxy Electronics)
+dakkochn // 836-6483? (S2)
+ufosensi // 834-6659 (S2)
+ufosensib // bootleg
+/*
+other System 1 / System 2 games:
+
+WarBall
+DokiDoki Penguin Land *not confirmed
+*/
+
+// Sega System E games (Master System hardware)
+hangonjr // (c) 1985
+transfrm // 834-5803 (c) 1986
+astrofl // 834-5803 (c) 1986
+ridleofp // (c) 1986 Sega / Nasco
+fantzn2 // (c) 1988
+opaopa
+tetrisse // (c) 1988
+
+// other Sega 8-bit games
+turbo // (c) 1981 Sega
+turboa // (c) 1981 Sega
+turbob // (c) 1981 Sega
+subroc3d // (c) 1982 Sega
+buckrog // (c) 1982 Sega
+buckrogn // (c) 1982 Sega
+buckrogn2 // (c) 1982 Sega
+zoom909 // (c) 1982 Sega
+kopunch // 834-0103 (c) 1981 Sega
+suprloco // (c) 1982 Sega
+suprlocoa // (c) 1982 Sega
+dotrikun // cabinet test board
+dotrikun2 // cabinet test board
+spcpostn // (c) 1986 Sega / Nasco"
+angelkds // 833-6599 (c) 1988 Sega / Nasco?
+calorie // (c) 1986 Sega
+calorieb // (c) 1986 Sega (but bootleg)
+
+// Bingo-based games
+bingoc // (c) 1989 Sega
+// Bingo Fantasy // (c) 19?? Sega
+// Bingo Star // (c) 19?? Sega
+// Bingo Party // (c) 1993 Sega
+// BP Phoenix // (c) 1998 Sega
+// BP Special // (c) 2000 Sega
+// BP Multicards // (c) 2002 Sega
+// BP Splash // (c) 2002 Sega
+// Bingo Planet // (c) 1997 Sega
+
+// Enduro Racer / Space Harrier / Hang On
+enduror // (c) 1985 (FD1089B, decrypted)
+enduror1 // (c) 1985 (FD1089B, decrypted)
+endurob2 // (c) 1985 (Beta bootleg)
+endurobl // (c) 1985 (Herb bootleg)
+hangon // (c) 1985 (Rev A)
+hangon1 // (c) 1985
+sharrier // (c) 1985
+sharrier1 // (c) 1985
+shangonro // (c) 1987 (FD1094, decrypted)
+shangonrb // (c) 1992 (but bootleg, hangon hw?)
+
+// Pre-16
+aliensynjo // (c) 1987 (FD1089A, decrypted)
+aliensyn2 // (c) 1987 (FD1089A, decrypted)
+aliensyn5 // (c) 1987 (FD1089B)
+bodyslam // (c) 1986 (8751)
+dumpmtmt // (c) 1986 (Japan)
+mjleague // (c) 1985
+quartet // (c) 1986 (8751)
+quarteta // (c) 1986 (8751)
+quartet2 // (c) 1986 (8751)
+quartet2a // (c) 1986
+
+// System 16A
+aceattaca // (c) 1988 (FD1094, decrypted)
+afighter // (c) 1986 (FD1089A, decrypted)
+alexkidd // (c) 1986 (FD1089A, decrypted)
+alexkidd1 // (c) 1986
+fantzone // (c) 1986 (Unprotected Rev A)
+fantzone1 // (c) 1986 (Unprotected)
+fantzonep // (c) 1986 (NEC 0317-5000, encrypted)
+sdi // (c) 1987 (FD1089B, decrypted)
+shinobi // (c) 1987
+shinobi1 // (c) 1987 (FD1094, decrypted)
+shinobls // (c) 1987 (Star bootleg)
+sjryuko1 // (c) 1988 White Board (FD1089B, decrypted)
+tetris // (c) 1988 (FD1094, decrypted) S16A
+tetris3 // (c) 1988 (FD1094, decrypted) S16A
+timescan1 // (c) 1987 (FD1089B, decrypted)
+wb31 // (c) 1988 Sega / Westone (FD1094, decrypted)
+wb35 // (c) 1988 Sega / Westone (FD1089A, decrypted)
+wb35a // (c) 1988 Sega / Westone (FD1089A, decrypted)
+passsht16a // (c) 1988
+
+// System 16B
+aceattac // (c) 1988 (protected)
+aliensyn // (c) 1987
+aliensyn3 // (c) 1987 (FD1089A, decrypted)
+aliensynj // (c) 1987 (FD1089A, decrypted)
+altbeast // (c) 1988 (8751)
+altbeastj // (c) 1988 (8751)
+altbeast5 // (c) 1988 (8751)
+altbeast4 // (c) 1988 (MC-8123B)
+altbeast2 // (c) 1988 (MC-8123B)
+altbeastj1 // (c) 1988 (protected)
+altbeastj2 // (c) 1988 (protected)
+altbeastj3 // (c) 1988 (FD1094, decrypted)
+aurail // (c) 1990 Sega / Westone
+aurail1 // (c) 1990 Sega / Westone (FD1089B, decrypted)
+aurailj // (C) 1990 Sega / Westone (FD1089A, decrypted)
+bayroute // (c) 1989 Sunsoft / Sega (FD1094, decrypted)
+bayroutej // (c) 1989 Sunsoft / Sega (FD1094, decrypted)
+bayroute1 // (c) 1989 Sunsoft / Sega
+bullet // (c) 1987 (protected)
+cotton // (c) 1990 (FD1094, decrypted)
+cottonu // (c) 1990 (FD1094, decrypted)
+cottonj // (c) 1990 (FD1094, decrypted)
+ddux // (c) 1989 (FD1094, decrypted)
+ddux1 // (c) 1989 (8751)
+dunkshot // (c) 1986 (FD1094, decrypted)
+eswat // (c) 1989 (FD1094, decrypted)
+eswatu // (c) 1989 (FD1094, decrypted)
+eswatj // (c) 1989 (FD1094, decrypted)
+exctleag // (protected)
+fpoint // (c) 1989 (Japan, FD1094, decrypted)
+fpoint1 // (c) 1989 (Japan, FD1094, decrypted)
+goldnaxe // (c) 1989 (8751)
+goldnaxeu // (c) 1989 (protected)
+goldnaxej // (c) 1989 (FD1094, decrypted)
+goldnaxe3 // (c) 1989 (FD1094, decrypted)
+goldnaxe2 // (c) 1989 (8751)
+goldnaxe1 // (c) 1989 (FD1094, decrypted)
+hwchamp // (c) 1987
+hwchampj // (c) 1987 (FD1094, decrypted)
+mvp // (c) 1989 (FD1094, decrypted)
+mvpj // (c) 1989 (FD1094, decrypted)
+passsht // (c) 1988 (FD1094, decrypted)
+passshta // (c) 1988 (FD1094, decrypted)
+passshtj // (c) 1988 (FD1094, decrypted)
+riotcity // (c) 1991 Sega / Westone
+ryukyu // (c) 1990 (FD1094, decrypted)
+sdib // (c) 1987 (FD1089A, decrypted)
+sdibl // (c) 1987 bootleg
+defense // (c) 1987 (FD1094, decrypted)
+shinobi5 // (c) 1987
+shinobi4 // (c) 1987 (MC-8123B)
+shinobi3 // (c) 1987 (MC-8123B)
+shinobi2 // (c) 1987 (FD1094, decrypted)
+sonicbom // (c) 1987 (FD1094, decrypted)
+sjryuko // (c) 1988 White Board (FD1094, decrypted)
+suprleag // (c) 1987 (protected)
+tetris2 // (c) 1988 (FD1094, decrypted) S16B
+tetris1 // (c) 1988 (FD1094, decrypted) S16B
+timescan // (c) 1987
+toryumon // (c) 1995
+tturf // (c) 1989 Sega / Sunsoft (8751)
+tturfu // (c) 1989 Sega / Sunsoft (8751)
+wb3 // (c) 1988 Sega / Westone (8751)
+wb34 // (c) 1988 Sega / Westone (FD1094, decrypted)
+wb33 // (c) 1988 Sega / Westone (FD1094, decrypted)
+wb32 // (c) 1988 Sega / Westone (FD1094, decrypted)
+wrestwar // (c) 1989 (8751)
+wrestwar2 // (c) 1989 (FD1094, decrypted)
+wrestwar1 // (c) 1989 (FD1094, decrypted)
+
+// Philko Boards
+atomicp // (c) 1990 Philko - korean clone board
+snapper // (c) 1990 Philko - korean clone board
+
+// S16 Bootlegs
+bayrouteb1 // (c) 1989 (protected) (bootleg)
+bayrouteb2 // (c) 1989 (protected) (bootleg)
+dduxbl // (c) 1989 (Datsu bootleg)
+eswatbl // BOOTLEG
+fpointbl // (c) 1989 (Datsu bootleg)
+fpointbj // (c) 1989 (Datsu bootleg, Japan)
+goldnaxeb1 // BOOTLEG
+goldnaxeb2 // BOOTLEG
+passht4b // bootleg
+passshtb // bootleg
+shinoblb // (c) 1987 (but bootleg)
+shinobld // (c) 1987 (but bootleg)
+tetrisbl // (c) 1988 (but bootleg)
+beautyb // (c) 1991 AMT
+iqpipe // (c) 1991 AMT
+tturfbl // (c) 1989 (Datsu bootleg)
+wb3bbl // BOOTLEG
+
+// ISG S16 bootleg system
+isgsm
+tetrbx
+shinfz
+
+// System 18
+shdancer // 1989.05 Shadow Dancer (US)
+shdancerj // 1989.11 Shadow Dancer (Japan)
+shdancer1 // 1989.?? Shadow Dancer (World)
+bloxeed // 1989.12 Bloxeed (Japan, FD1094, decrypted)
+ // 1990.04 Bloxeed (US)
+astormu // 1990.04 Alien Storm (US, FD1094, decrypted)
+astormj // 1990.05 Alien Storm (Japan, FD1094, decrypted)
+astorm // 1990.?? Alien Storm (World, protected 2 Players)
+astorm3 // 1990.?? Alien Storm (World, FD1094, decrypted)
+mwalku // 1990.08 Micheal Jackson's Moonwalker (US, FD1094+8751, decrypted)
+mwalkj // 1990.08 Micheal Jackson's Moonwalker (Japan, FD1094+8751, decrypted)
+mwalk // 1990.?? Micheal Jackson's Moonwalker (World, FD1094+8751, decrypted)
+lghost // 1990.?? Laser Ghost (World, FD1094, decrypted)
+ // 1990.12 Laser Ghost (Japan)
+lghostu // 1991.01 Laser Ghost (US, FD1094, decrypted)
+cltchitr // 1991.02 Clutch Hitter (US, FD1094, decrypted)
+cltchitrj // 1991.05 Clutch Hitter (Japan, FD1094, decrypted)
+ddcrewj // 1991.07 D.D.Crew (Japan, FD1094, decrypted)
+ddcrewu // 1991.09 D.D.Crew (US, FD1094, decrypted)
+ddcrew // 1991.?? D.D.Crew (World, FD1094, decrypted)
+ddcrew2 // 1991.?? D.D.Crew (World, FD1094, decrypted)
+ddcrew1 // 1991.?? D.D.Crew (World, FD1094, decrypted)
+wwallyj // 1992.06 Wally wo Sagase! (Japan, FD1094, decrypted)
+wwallyja // 1992.06 Wally wo Sagase! (Japan, FD1094, decrypted)
+desertbr // 1993.?? Desert Breaker (World, FD1094, decrypted)
+desertbrj // 1992.10 Desert Breaker (Japan)
+pontoon
+
+// System18 Bootlegs
+astormbl // BOOTLEG
+astormb2 // BOOTLEG
+shdancbl // BOOTLEG
+mwalkbl // BOOTLEG
+
+
+// Outrun Hardware
+ // 1986.09 Outrun (Japan)
+ // 1986.11 Outrun (US)
+ // 1986.?? Outrun (World)
+outrun // Revision B
+outrunra // Revision A
+outruno // First version
+outrundx // Deluxe version
+outrunb // 1986 (protected beta bootleg)
+ // 1987.04 Super Hang-On (Japan)
+ // 1987.06 Super Hang-On (US)
+ // 1987.?? Super Hang-On (World)
+shangon // 1987 (protected)
+shangon3 // 1987 (FD1089B, decrypted)
+shangon2 // 1987 (FD1089B, decrypted)
+shangon1 // 1987 (FD1089B, decrypted)
+shangonle // 1991
+ // 1989.02 Turbo Outrun (Japan)
+ // 1989.04 Turbo Outrun (US)
+ // 1989.?? Turbo Outrun (World)
+toutrun // 1987 (FD1094, decrypted)
+toutrun3 // 1987 (FD1094, decrypted)
+toutrun2 // 1987 (protected)
+toutrun1 // 1987 (FD1094, decrypted)
+
+// X Board
+aburner // 1987.07 After Burner (Japan)
+aburner2 // 1987.09 After Burner II (Japan)
+thndrbld1 // 1987.12 Thunder Blade (Japan, deluxe/standard)
+thndrbld // 1988.02 Thunder Blade (US?, upright, FD1094, decrypted)
+ // 1989.01 Last Survivor (Japan)
+smgpj // 1989.06 Super Monaco GP (Japan, FD1094, decrypted)
+smgpja // 1989.06 Super Monaco GP (Japan, FD1094, decrypted)
+smgp // 1989.?? Super Monaco GP (World, FD1094, decrypted)
+smgp6 // 1989.?? Super Monaco GP (World, FD1094, decrypted)
+smgp5 // 1989.?? Super Monaco GP (World, FD1094, decrypted)
+smgpu // 1989.08 Super Monaco GP (US, FD1094, decrypted)
+smgpu3 // 1989.08 Super Monaco GP (US, FD1094, decrypted)
+smgpu2 // 1989.08 Super Monaco GP (US, FD1094, decrypted)
+smgpu1 // 1989.08 Super Monaco GP (US, FD1094, decrypted)
+loffirej // 1989.12 Line of Fire (Japan, FD1094, decrypted)
+loffire // 1989.?? Line of Fire (World, FD1094, decrypted)
+loffireu // 1990.04 Line of Fire (US, FD1094, decrypted)
+ // 1990.03 Racing Hero (Japan)
+rachero // 1990.?? Racing Hero (World, FD1094, decrypted)
+abcop // 1990.?? A.B.Cop (World, FD1094, decrypted)
+ // 1991.01 A.B.Cop (Japan)
+ // 1990.10 GP Rider (Japan)
+gprider // 1990.?? GP Rider (World, protected)
+gprider1 // 1990.12 GP Rider (US, FD1094, decrypted)
+
+// Y-Board
+ // 1988.05 Galaxy Force (Japan)
+ // 1988.08 Galaxy Force (US)
+gforce2j // 1988.07 Galaxy Force II (Japan)
+gforce2ja // 1988.07 Galaxy Force II (Japan)
+gforce2 // 1988.?? Galaxy Force II (World)
+ // 1988.12 Galaxy Force II (US)
+ // 1988.08 Power Drift (US)
+pdriftj // 1988.09 Power Drift (Japan)
+pdrift // 1988.?? Power Drift (World)
+pdrifta
+pdrifte
+gloc // 1990.04 G-LOC Air Battle (US)
+ // 1990.05 G-LOC Air Battle (Japan)
+glocr360 // 1990.?? G-LOC (R360, World?)
+strkfgtr // 1991.06 Strike Fighter (Japan)
+rchase // 1991.09 Rail Chase (World)
+rchasej // 1991.09 Rail Chase (Japan)
+ // 1991.09 Rail Chase (US)
+
+// Sega System 24 games
+// disk based
+hotrodj // 1988.03 Hot Rod (Japan)
+hotrod // 1988.?? Hot Rod (World)
+hotroda
+ // 1988.07 Hot Rod (US)
+sspiritj // 1988.10 Scramble Spirits (Japan)
+sspirits // 1988.?? Scramble Spirits (World)
+sspirtfc // 1988.?? Scramble Spirits (protected)
+ // 1988.11 Scramble Spirits (US)
+ggroundj // 1988.11 Gain Ground (Japan, FD1094, decrypted)
+gground // 1989.?? Gain Ground (World, FD1094, decrypted)
+ // 1989.03 Gain Ground (US)
+crkdownj // 1989.03 Crack Down (Japan, FD1094, decrypted)
+crkdown // 1989.?? Crack Down (World, FD1094, decrypted)
+crkdownu // 1989.06 Crack Down (US, FD1094, decrypted)
+sgmastj // 1989.06 Jumbo Ozaki Super Masters (Japan, FD1094, decrypted)
+sgmast // 1989.?? Super Masters Golf (World, protected)
+sgmastc // 1989.?? Jumbo Ozaki Super Masters Golf (World, FD1094, decrypted)
+ // 1989.09 Super Masters Golf (US)
+roughrac // 1990.03 Rough Racer (Japan, FD1094, decrypted)
+bnzabrosj // 1990.06 Bonanza Bros. (Japan)
+bnzabros // 1990.08 Bonanza Bros. (US)
+qsww // 1991.02 Quiz Syukudai wo Wasuremashita! (Japan)
+dcclubfd // 1991.07 Dynamic Country Club (US)
+
+// ROM based
+dcclubj // 1991.06 Dynamic Country Club (Japan)
+dcclub // 1991.?? Dynamic Country Club (World)
+qrouka // 1991.12 Quiz Rouka ni Tattenasai! (Japan)
+mahmajn // 1992.12 Tokorosan no Mahmahjong (Japan)
+quizmeku // 1993.05 Quiz Mekurumeku Story (Japan)
+mahmajn2 // 1994.05 Tokorosan no Mahmahjong 2 (Japan)
+qgh // 1994.09 Quiz Ghost Hunter
+
+// Sega System 32 games
+radm // 1991.?? Rad Mobile (World)
+radmu // 1991.03 Rad Mobile (US)
+ // 1991.02 Rad Mobile (Japan)
+radr // 1991.?? Rad Rally (World)
+radru // 1991.09 Rad Rally (US)
+ // 1991.07 Rad Rally (Japan)
+spidman // 1991.?? Spiderman (World)
+spidmanu // 1991.09 Spiderman (US)
+ // 1991.09 Spiderman (Japan)
+f1en // 1991.?? F-1 Exhaust Note (World)
+ // 1992.01 F-1 Exhaust Note (US)
+ // 1991.11 F-1 Exhaust Note (Japan)
+arabfgt // 1992.?? Arabian Fight (World)
+arabfgtu // 1992.03 Arabian Fight (US)
+arabfgtj // 1992.03 Arabian Fight (Japan)
+arescue // 1992.03 Air Rescur (US)
+ // 1992.04 Air Rescue (Japan)
+ga2 // 1992.?? Golden Axe II (World)
+ga2u // 1992.09 Golden Axe II (US)
+ga2j // 1992.10 Golden Axe Death Adder no Fukusyuu (Japan)
+holo // 1992.?? Hologram Holosseum (US)
+ // 1992.11 Hologram Holosseum (Japan)
+darkedge // 1993.?? Dark Edge (World)
+ // 1993.?? Dark Edge (US)
+darkedgej // 1993.03 Dark Edge (Japan)
+brival // 1993.?? Burning Rival (World)
+brivalj // 1993.08 Burning Rival (Japan)
+f1lap // 1993.?? F-1 Super Lap (World)
+ // 1993.09 F-1 Super Lap (Japan)
+alien3 // 1993.?? Aliens 3 (World)
+alien3u // 1993.11 Aliens 3 (US)
+ // 1993.09 Aliens 3 the Gun (Japan)
+sonic // 1993.09 Sonic the Hedgehog (Japan)
+sonicp // 1993.?? Sonic the Hedgehog (proto, Japan)
+kokoroj2 // 1993.12 Soreike! Kokoroji 2 (Japan)
+jpark // 1994.?? Jurassic Park (World)
+ // 1994.?? Jurassic Park (US)
+ // 1994.02 Jurassic Park (Japan)
+dbzvrvs // 1994.03 Dragon Ball Z V.R.V.S. (Japan)
+jleague // 1994.07 The J League 1994 (Japan)
+svf // 1994.?? Super Visual Football
+svs // 1994.?? Super Visual Soccer
+slipstrm // 1995.?? Slip Stream (Capcom)
+slipstrmh
+
+// Sega Multi System 32 games
+ // 1993.05 Outrunners (Japan)
+orunners // 1993.?? Outrunners (World)
+orunnersu // 1993.06 Outrunners (US)
+harddunkj // 1994.04 Hard Dunk 3on3 (Japan)
+harddunk // 1994.?? Hard Dunk 3on3 (World)
+ // 1993.03 Title Fight (Japan)
+titlef // 1993.?? Title Fight (World)
+titlefu // 1993.04 Title Fight (US)
+ // 1992.07 Stadium Cross (Japan)
+scross // 1992.?? Stadium Cross (World)
+scrossu // 1992.09 Stadium Cross (US)
+
+// Model 1 Games
+vr // 1992.08 Virtua Racing
+vf // 1993.12 Virtua Fighter
+vformula // 1993.?? Virtua Formula
+swa // 1994.04 Star Wars Arcade
+wingwar // 1994.06 Wing War
+wingwarj // 1994.06 Wing War (Japan)
+wingwaru // 1994.09 Wing War (US)
+
+// Sega H1 games
+coolridr // 1995.04 Cool Riders
+
+// Sega ST-V games
+stvbios
+ // 1994.07 Sports Fishing
+gaxeduel // 1995.02 Golden Axe the Duel
+suikoenb // 1995.03 Suiko Enbu (Data East)
+bakubaku // 1995.04 Bakubaku Animal
+vfremix // 1995.06 Virtua Fighter Remix
+ejihon // 1995.07 Ejihon Tantei Jimusyo
+finlarch // 1995.07 Final Arch
+sfish2j // 1995.08 Sports Fishing 2 (Japan)
+shanhigw // 1995.08 Shanghai Banri no Choujou
+sandor // 1995.11 Nido Aru Koto wa Sando-R
+kiwames // 1995.11 Pro Mahjong Kiwame S (Athena)
+sfish2 // 1995.11 Sports Fishing 2 (Export)
+critcrsh // 1995.?? Critter Crusher
+ // 1995.12 Tatakott
+batmanfr // 1996.02 Batman Forever (Acclaim)
+fhboxers // 1996.02 Funky Head Boxers
+vfkids // 1996.03 Virtua Fighter Kids
+pblbeach // 1996.03 Pebble Beach the Great Shot (T&E Soft)
+introdon // 1996.04 Karaoke Quiz Intro Dondon (Sunsoft / Success)
+smleague // 1996.04 Super Major League
+decathlt // 1996.05 Decathlete
+decathlto
+dnmtdeka // 1996.07 Dynamite Deka
+mausuke // 1996.07 Mausuke no Ojama the World (Data East)
+diehard // 1996.08 Die Hard Arcade
+sokyugrt // 1996.09 Soukyuu Gurentai (Raizing / 8ing)
+prikura // 1996.10 Prikura Daisakusen (Atlus)
+magzun // 1996.11 Magical Zunou Power
+puyosun // 1996.12 Puyo Puyo SUN (Compile)
+colmns97 // 1997.01 Columns 97
+shienryu // 1997.02 Shienryu (Warashi)
+vmahjong // 1997.02 Virtual Mahjong (Micronet)
+groovef // 1997.05 Groove on Fight (Atlus)
+nclubv3 // 1997.07 Name Club Ver. 3
+pclub2 // 1997.09 Print Club 2
+thunt // 1997.09 Puzzle & Action Treasure Hunt (Sega (Deniam License))
+thuntk
+winterht // 1997.10 Winter Heat (Data East)
+cotton2 // 1997.11 Cotton 2 (Success)
+hanagumi // 1997.11 Sakura Taisen Hanagumi Taisen Columns
+findlove // 1997.12 Find Love (Daiki / FCF)
+maruchan // 1997.12 Maruchan de Goo!!!
+techbowl // 1997.12 Technical Bowling
+znpwfv // 1997.12 Zen Nippon Pro Wrestling featuring Virtua
+seabass // 1998.02 Sea Bass Fishing (A wave Inc (Able License))
+sasissu // 1998.02 Taisen Tanto-R Sasissu!!
+ // 1998.03 Bass Master Challenge
+twcup98 // 1998.04 Tecmo World Cup '98 (Tecmo)
+grdforce // 1998.05 Guardian Force (Success)
+rsgun // 1998.05 Radient Silver Gun (Treasure)
+astrass // 1998.06 Astra Super Stars (Sunsoft)
+myfairld // 1998.07 My Fair Lady (Micronet)
+othellos // 1998.07 Othello Shiyouyo (Success)
+cottonbm // 1998.09 Cotton Boomerang (Success)
+stress // 1998.10 Stress Busters
+elandore // 1998.11 Touryuu Densetsu Elandore (Sai-Mate)
+sss // 1998.12 Steep Slope Sliders (Capcom / Cave / Victor)
+micrombc // 1999.03 Microman Battle Charge
+pclub2v3 // 1999.03 Print Club 2 Vol. 3
+sanjeon // 1999.04 Sanjun Sujun (Sega / Deniam)
+danchih // 1999.06 Danchi de Hanafuda Okusan Komeya Desuyo! (Altron (Tecmo License))
+ffreveng // 1999.09 Final Fight Revenge (Capcom)
+pclubpok // 1999.11 Print Club Pokemon
+danchiq // 2000.12 Danchi de Quiz Okusan Yontaku Desuyo! (Altron)
+
+// Sega Model 2 Games
+
+// Model 2 (TGPs, Model 1 sound board)
+daytona // 1994.03 Daytona USA
+daytona93
+daytonas
+daytonat // 1993, hack
+daytonam // 1993, hack
+desert // 1994.07 Desert Tank
+vcop // 1994.09 Virtua Cop
+
+// Model 2A-CRX (TGPs, SCSP sound board)
+vf2o // 1994.11 Virtua Fighter 2
+vf2a // 1995.??
+vf2b // 1995.??
+srallyc // 1995.02 Sega Rally Championship - Rev C
+srallycb // 1995.02 Sega Rally Championship - Rev B
+vcop2 // 1995.09 Virtua Cop 2
+vf2 // 1995.09 Virtua Fighter 2.1
+ // 1995.10 Sky Target
+manxtt // 1995.11 Manx T.T.
+ // 1996.08 Dynamite Baseball
+doaa // 1996.11 Dead or Alive
+ // 1997.04 Dynamite Baseball '97
+motoraid // 1997.10 Motor Raid
+zeroguna // 1997.12 Zero Gunner
+dyndeka2 // 1998.05 Dynamite Deka 2
+dynamcop // 1998.09 Dynamic Cop
+pltkidsa // 1999.03 Pilot Kids
+
+// Model 2B-CRX (SHARC, SCSP sound board)
+vstriker // 1995.05 virtua Striker
+vstrikero // 1995.05 virtua Striker
+rchase2 // 1995.06 Rail Chase 2 (Arcade TV Game List - P.104, Left, 12 from top)
+indy500 // 1995.07 Indy 500
+indy500d // 1995.07 Indy 500
+indy500to // 1995.07 Indy 500
+skytargt // 1995.10 Sky Target
+fvipers // 1995.11 Fighting Vipers
+von // 1996.01 Dennou Senki Virtual-On (USA)
+vonj // 1996.01 Dennou Senki Virtual-On (Japan)
+gunblade // 1996.04 Gunblade N.Y.
+schamp // 1996.05 Sonic Championship
+sfight // 1996.05 Sonic the Fighters
+lastbrnx // 1996.06 Last Bronx
+lastbrnxj // 1996.06 Last Bronx (Japan)
+sgt24h // 1996.07 Super GT 24h
+dynabb // 1996.08 Dynamite Baseball
+doa // 1996.11 Dead or Alive
+ // 1997.04 Dynamite Baseball '97
+zerogun // 1997.12 Zero Gunner
+zerogunj // 1997.12 Zero Gunner (Japan)
+dyndeka2b // 1998.05 Dynamite Deka 2
+dynamcopb // 1998.09 Dynamite Cop
+pltkids // 1999.03 Pilot Kids
+
+// Model 2C-CRX (TGPx4, SCSP sound board)
+skisuprg // 1996.12 Sega Ski Super G
+stcc // 1996.09 Sega Touring Car Championship
+stcca // 1996.09 Sega Touring Car Championship
+stccb // 1996.09 Sega Touring Car Championship
+waverunr // 1996.10 Wave Runner
+hotd // 1997.03 The House of the Dead
+topskatr // 1997.05 Top Skater
+topskatru // 1997.05 Top Skater (USA)
+topskatrj // 1997.05 Top Skater (Japan)
+overrev // 1997.09 Overrev
+segawski // 1997.09 Sega Water Ski
+dynamcopc // 1998.09 Dynamite Cop
+bel // 1998.12 Behind Enemy Lines
+
+// Sega Model 3 Games
+
+// Step 1.0
+vf3 // 1996.09 Virtua Fighter 3
+vf3a
+vf3tb // 1997.10 Virtua Fighter 3tb
+bass // 1997.12 Get Bass
+getbass
+ // 1998.03 Get Bass Brast
+
+// Step 1.5
+scud // 1996.12 Scud Race
+scudj
+scuda
+vs215 // 1997.06 Virtua Striker 2
+lostwsga // 1997.07 Lost World Jurassic Park
+scudp // 1997.09 Scud Race Plus
+lemans24 // 1997.09 Le Mans 24
+vs29815 // 1998.05 Virtua Striker 2 ver.98
+
+// Step 2.0
+vs2 // 1997.06 Virtua Striker 2
+harley // 1997.12 Harley Davidson & L.A.Riders
+skichamp // 1998.01 Ski Champ
+srally2 // 1998.02 Sega Rally 2 Championship
+srally2x
+von2 // 1998.03 Dennou Senki Virtual-On Oratorio Tangram
+fvipers2 // 1998.04 Fighting Vipers 2
+vs298 // 1998.05 Virtua Striker 2 ver.98
+vs299 // 1998.12 Virtual Striker 2 ver.99
+vs299b // 1999.?? Virtual Striker 2 ver.99 (rev B)
+vs299a // 1999.?? Virtual Striker 2 ver.99 (rev A)
+vs2v991 // 1999.?? Virtual Striker 2 ver.99.1
+von254g // 1999.05 Dennou Senki Virtual-On Oratorio Tangram ver.5.4
+
+// Step 2.1
+daytona2 // 1998.06 Daytona USA 2
+oceanhun // 1998.09 Ocean Hunter
+spikeout // 1998.09 Spikeout
+dirtdvls // 1998.10 Dirt Devils
+dirtdvlsa
+swtrilgy // 1998.11 Star Wars Trilogy Arcade
+swtrilgya
+ // 1998.11 Magical Torokko Adventure (Japan)
+lamachin // 1998.12 L.A. Machine Guns
+dayto2pe // 1998.12 Daytone USA 2 Power Edition
+ // 1998.12 Virtua Striker 2 ver.99
+spikeofe // 1999.01 Spikeout Final Edition
+magtruck // 1999.03 Magical Truck Adventure (US)
+eca // 1999.10 Kyukyuusya Emergency Call Ambulance
+ecax
+
+
+// Deniam games
+// they run on Sega System 16 video hardware
+logicpro // (c) 1996 Deniam
+croquis // (c) 1996 Deniam (Germany)
+karianx // (c) 1996 Deniam
+logicpr2 // (c) 1997 Deniam (Japan)
+
+
+/*
+Deniam is a Korean company (http://deniam.co.kr).
+
+Game list:
+Title System Date
+---------------- ---------- ----------
+GO!GO! deniam-16b 1995/10/11
+Logic Pro deniam-16b 1996/10/20
+Karian Cross deniam-16b 1997/04/17
+LOTTERY GAME deniam-16c 1997/05/21
+Logic Pro 2 deniam-16c 1997/06/20
+Propose deniam-16c 1997/06/21
+BOMULEUL CHAJARA SEGA ST-V 1997/04/11
+*/
+
+// System C games
+bloxeedc // (c) 1989 Sega / Elorg
+bloxeedu // (c) 1989 Sega / Elorg
+columns // (c) 1990 Sega
+columnsu // (c) 1990 Sega
+columnsj // (c) 1990 Sega
+columns2 // (c) 1990 Sega
+column2j // (c) 1990 Sega
+
+// System C-2 games
+borench // (c) 1990 Sega
+tfrceac // (c) 1990 Sega / Technosoft
+tfrceacj // (c) 1990 Sega / Technosoft
+tfrceacb // bootleg
+twinsqua // (c) 1991 Sega
+ribbit // (c) 1991 Sega
+tantr // (c) 1992 Sega
+tantrkor // (c) 1992 Sega
+tantrbl // bootleg
+tantrbl2 // bootleg
+tantrbl3 // bootleg
+puyo // (c) 1992 Sega / Compile
+puyobl // bootleg
+puyoj // (c) 1992 Sega / Compile
+puyoja // (c) 1992 Sega / Compile
+ichir // (c) 1994 Sega
+ichirk // (c) 1994 Sega
+ichirj // (c) 1994 Sega
+ichirjbl // bootleg
+stkclmns // (c) 1994 Sega
+stkclmnsj // (c) 1994 Sega
+puyopuy2 // (c) 1994 Compile + Sega license
+potopoto // (c) 1994 Sega
+zunkyou // (c) 1994 Sega
+
+// Atlus Print Club 'Games' C-2 board
+pclubj
+pclubjv2
+pclubjv4
+pclubjv5
+
+// Genie Hardware (uses Genesis VDP) also has 'Sun Mixing Co' put into tile ram
+puckpkmn // (c) 2000 Genie
+puckpkmna // (c) 2000 IBS
+topshoot // (c) 1995 Sun Mixing
+
+// Sega MegaTech, the number shown is on the label of the instruction rom
+megatech
+mt_beast // 01
+mt_shar2 // 02
+mt_stbld // 03
+mt_ggolf // 04
+mt_gsocr // 05
+mt_orun // 06
+mt_asyn // 07
+mt_shnbi // 08
+mt_fz // 09
+mt_aftrb // 10
+mt_tfor2 // 11
+ // 12
+mt_astro // 13
+ // 14
+ // 15
+ // 16
+ // 17
+ // 18
+mt_gfoot // 19
+mt_lastb // 20
+mt_wcsoc // 21
+mt_tetri // 22
+mt_gng // 23
+mt_shang // 24
+mt_gaxe // 25
+mt_fwrld // 26
+mt_mystd // 27
+mt_revsh // 28
+mt_parlg // 29
+ // 30
+mt_tgolf // 31
+mt_srbb // 32
+ // 33
+ // 34
+mt_tlbba // 35
+mt_cols // 36
+ // 37
+mt_eswat // 38
+mt_smgp // 39
+mt_mwalk // 40
+mt_crack // 41
+ // 42
+mt_shado // 43
+mt_arrow // 44
+ // 45
+ // 46
+mt_astrm // 47
+mt_wwar // 48
+mt_bbros // 49
+ // 50
+mt_srage // 51
+mt_sonic // 52
+mt_sonia // ^^
+mt_fshrk // 53
+mt_spman // 54
+mt_calga // 55
+ // 56
+mt_gaxe2 // 57
+mt_stf // 58
+mt_mlh // 59
+mt_kcham // 60
+mt_tout // 61
+mt_soni2 // 62
+
+// Sega MegaPlay
+megaplay
+mp_sonic // 01
+mp_gaxe2 // 02
+mp_gslam // 03
+mp_twc // 04
+mp_sor2 // 05
+mp_bio // 06
+mp_soni2 // 07
+ // 08
+mp_shnb3 // 09
+ // 10
+mp_mazin // 11
+mp_col3 // ??
+
+ssf2mdb // MegaDrive-based hack
+aladmdb // MegaDrive-based hack
+mk3mdb // MegaDrive-based hack
+srmdb // MegaDrive-based hack
+
+// Sega Naomi-based (Dreamcast) systems
+naomi
+naomigd
+naomi2
+
+hod2bios // 1998.11 The House of the Dead 2
+hotd2 // 1998.11 The House of the Dead 2
+hotd2o // 1998.11 The House of the Dead 2
+dybbnao // 1998.12 Dynamite Baseball NAOMI
+smlg99 // 1999.?? Super Major League '99
+pstone // 1999.02 Power Stone
+crzytaxi // 1999.02 Crazy Taxi
+zombrvn // 1999.02 Zombie Revenge
+airlbios // 1999.03 Airline Pilots
+alpiltdx
+alpilota
+ggram2 // 1999.04 Giant Gram Zen Nippon Pro-wres 2
+ // 1999.05 Taisen Puzzle Kurutto Stone
+ringout // 1999.06 Ringout 4x4
+f355bios // 1999.07 F355 Challenge
+f355
+f355twin // 1999.07 F355 Challenge Twin
+shangril // 1999.08 Dengen Tenshi Taisen Janshi Shangri-la
+ // 1999.08 Unou Nouryoku Check Machine Touch de UNO!
+vs2_2k // 1999.08 Virtua Striker 2 version 2000
+suchie3 // 1999.09 Idol Janshi Su-Chi-Pi 3
+toyfight // 1999.09 Toy Fighter
+jambo // 1999.09 Jambo! Safari
+ // 1999.09 Super Major League 99
+sgtetris // 1999.10 Sega Tetris
+derbyoc // 1999.10 Derby Owners Club
+doa2 // 1999.11 Dead or Alive 2
+otrigger // 1999.11 Out Trigger
+dybb99 // 1999.11 Dynamite Baseball '99
+ // 1999.12 Mars TV
+samba // 1999.12 Samba de Amigo
+vtennis // 1999.12 Virtua Tennis / Power Smash (ROM)
+vtennisg // 1999.12 Virtua Tennis / Power Smash (GD-ROM)
+puyoda // 1999.12 Puyopuyo DA!
+
+18wheelr // 2000.01 18 Wheeler
+totd // 2000.01 The Typing of the Dead
+spawn // 2000.01 Spawn
+doa2m // 2000.01 Dead or Alive 2 Millenium
+ // 2000.02 Touch de UNO! 2
+virnba // 2000.02 Virtua NBA
+virnbao
+mvsc2 // 2000.03 Marvel vs. Capcom 2
+smarinef // 2000.03 Sega Marine Fishing
+wldkicks // 2000.03 World Kicks
+ // 2000.04 Shin Nippon Pro-wres Toukon Retsuden 4
+pstone2 // 2000.04 Power Stone 2
+qmegamis // 2000.05 Quiz Ah Megamisama
+vonot // 2000.06 Virtual-on Oratorio Tangram M.S.B.S. ver.5.66 2000 edition
+derbyo2k // 2000.06 Derby Owners Club 2000
+ggx // 2000.07 Guilty Gear X
+slasho // 2000.07 Slashout
+slashout
+capsnka // 2000.08 Capcom vs. SNK Millenium Fight 2000
+ // 2000.08 Tokyo Bus Annai
+capsnk // 2000.09 Capcom vs. SNK Millenium Fight 2000
+gram2000 // 2000.09 Giant Gram 2000 Zen Nippon Pro-wres 3
+ // 2000.09 Nittere Shiki! Mirai Yosou Studio
+crackndj // 2000.10 Crackin' DJ
+cspike // 2000.10 Gun Spike
+sstrkfgt // 2000.10 Sega Strike Fighter
+deathcox // 2000.10 Death Crimson OX
+ // 2000.11 Ninja Assault
+confmiss // 2000.11 Confidential Mission // First GD-ROM game?
+shaktamb // 2000.11 Shakatto Tambourine
+wwfroyal // 2000.11 WWF Royal Rumble
+pjustic // 2000.12 Moero Justice Gakuen
+samba2k // 2000.12 Samba de Amigo ver.2000
+sprtjam // 2000.12 Sports Jam
+ // 2000.12 Derby Owners Club 2000 ver.2
+ // 2000.?? World Kicks New ver.
+derbyocw // 2001.?? Derby Owners Club World Edition (Rev. D)
+drbyocwc // 2001.?? Derby Owners Club World Edition (Rev. C)
+f355twn2 // 2001.01 F355 Challenge 2
+gwing2 // 2001.01 Giga Wing 2
+csmash // 2001.01 Cosmic Smash
+csmasho
+sfz3ugd // 2001.02 Street Fighter ZERO3 Upper
+gundmgd // 2001.03 Kidou Senshi Gundam Renpou vs. Zeon
+gundmct // 2001.03 Mobile Suit Gundam: Federation vs. Zeon (cartridge)
+ // 2001.04 Shakatto Tambourine Motto Norinori Shinkyoku Tsuika
+dygolf // 2001.04 Dynamic Golf
+zerogu2 // 2001.05 Zero Gunner 2
+monkeyba // 2001.05 Monkey Ball
+cvsgd // 2001.06 Capcom vs. SNK Pro
+ // 2001.06 Crackin' DJ Part2
+wsbbgd // 2001.06 Super Major League
+spkrbtl // 2001.07 Spikers Battle
+gunsur2 // 2001.07 Gun Survivor 2: Bio Hazard Code Veronica
+starseek // 2001.07 Dokidoki Idol Star Seeker
+cvs2gd // 2001.08 Capcom vs. SNK 2
+wrungp // 2001.08 Wave Runner GP
+gundmxgd // 2001.09 Kidou Senshi Gundam Renpou vs. Zeon DX
+ // 2001.09 Alien Front
+hmgeo // 2001.09 Heavy Metal Geo Matrix
+inunoos // 2001.10 Inu no Osanpo
+derbyoc2 // 2001.10 Derby Owners Club 2
+vtennis2 // 2001.10 Power Smash 2 / Virtua Tennis 2
+vtenis2c // Power Smash 2 / Virtua Tennis 2 (cartridge)
+ // 2001.11 Shakatto Tambourine Cho Powerup Chu
+keyboard // 2001.11 La Keyboardxyu
+ikaruga // 2001.12 Ikaruga
+lupinsho // 2001.12 Lupin the Third: the Shooting
+vathlete // 2002.03 Virtua Athlete
+luptype // 2002.04 Lupin the Third: the Typing
+ggxx // 2002.05 Guilty Gear XX
+mok // 2002.05 The Maze of the Kings
+cleoftp // 2002.05 Cleopatra Fortune +
+chocomk // 2002.06 Musapey no Choco Marker
+ // 2002.07 Mazan
+ // 2002.09 Yonin Uchi Mahjong MJ
+azumanga // 2002.12 Azumanga Daiou Puzzle Bobble
+moeru // 2002.12 Moeru Casinyo
+quizqgd // 2003.01 Quiz Keitai Q mode
+ // 2003.03 Yonin Uchi Mahjong MJ Network Taisen ver.
+ggxxrl // 2003.03 Guilty Gear XX # Reload
+shikgam2 // 2003.04 Shikigami no Shiro 2
+bdrdown // 2003.04 Border Down
+usagui // 2003.06 Usagi Yamashiro Mahjong Hen
+ // 2003.07 Yonin Uchi Mahjong MJ Network Taisen ver. NEW
+oinori // 2003.08 Oinori-daimyoujin Matsuri
+psyvar2 // 2003.11 Psyvariar 2
+puyofev // 2003.11 Puyopuyo Fever
+shootopl // Shootout Pool
+shootpl // 2003.xx Shootout Pool / Shootout Pool Prize
+shootplm // Shootout Pool Medal
+kick4csh // 2004.xx Kick '4' Cash
+tetkiwam // 2004.06 Tetris Kiwamemichi (Arcade TV Game List - P.88, Right, 11 from bottom)
+cfield // 2004.06 Chaos Field
+trizeal // 2004.09 Trizeal
+ // 2005.03 Melty Blood Act Cadenza
+ss2005 // 2005.03 Super Shanghai 2005
+ss2005a // 2005.04 Super Shanghai 2005
+senkoo // 2005.04 Senkou no Rondo
+senko // 2005.08 Senkou no Rondo NEW ver.
+meltybld // 2005.08 Melty Blood Act Cadenza ver.A
+ggxxsla // 2005.09 Guilty Gear XX Slash
+radirgy // 2005.10 Radirgy
+undefeat // 2005.10 Under Defeat
+ // 2005.12 Radirgy (Rev. A)
+kurucham // 2006.03 Kurukuru Chameleon
+trgheart // 2006.05 Trigger Heart Exelica
+ // 2006.07 Touch de Zunou
+senkosp // 2006.08 Senkou no Rondo SP
+jingystm // 2006.09 Jingi Storm
+karous // 2006.11 Karous
+ggxxac // 2006.11 Guilty Gear XX Accent Core
+meltyb // 2006.12 Melty Blood Act Cadenza ver.B
+meltyba // 2006.12 Melty Blood Act Cadenza ver.B (Rev A)
+takoron // 2006.12.16 Noukone Puzzle Takoron
+ // 2007.03 Melty Blood Act Cadenza ver.B Syuuseiban(ver.B2)
+
+ngdup23a // DIMM Firmware Updater
+ngdup23c
+
+ // Releases below use flash/mask ROMs like older NAOMI titles, not GD-ROM as GD-ROM Hardware (Drives and Discs) were no longer being produced
+
+ // 2007.07 Pokasuka Ghost!
+ // 2007.07 Shooting Love
+ // 2007.07 Dynamite Deka EX - Asian dynamite
+ // 2007.09 Rhythm Tengoku
+ // 2008.02 Akatsuki Denkou Senki Ausf.Achse
+ // 2008.06 Illvelo (Illmatic Envelope)
+ // 2008.07 Mamoru Kun wa Norowarete Shimatta!
+ // 2008.09 Melty Blood Actress Again
+ // 2008.12 Melty Blood Actress Again ver.A
+ // 2009.06 Radirgy Noah
+ // 2009.?? Project Cerberus (planned to be released in 2009)
+
+
+
+// NAOMI based (System SP)
+ // 2003.02 Kouchuu Ouja Mushiking
+ // 2004.10 Oshare Majo Love & Berry
+ // 2005.09 Kodai Ouja Kyouryuu King
+ // 2007.06 Issyo ni Wanwan
+ // 2007.06 Konchuu Dash!!
+ // 2007.07 Marine Marine
+ // 2007.11 Magical Dance on Dream Stage
+ // 2008.02 Marine Marine ver.2
+ // 2008.04 Issyo ni Wanwan Waiwai Puppy
+ // 2008.07 Issyo ni Turbo Drive
+
+// NAOMI 2
+vstrik3c // 2001.04 Virtua Striker 3 (rev. C)
+vstrik3cb // 2001.04 Virtua Striker 3 (rev. B)
+vstrik3
+wldrider // 2001.05 Wild Riders
+ // 2001.06 Club Kart
+beachspi // 2001.07 Beach Spikers
+vf4cart // 2001.08.02 Virtua Fighter 4 (cartridge)
+vf4 // 2001.08.02 Virtua Fighter 4 (GD-ROM)
+vf4b // 2001.08.20 Virtua Fighter 4 ver.B
+vf4c // 2002.01.31 Virtua Fighter 4 ver.C
+kingrt66 // 2002.02 The King of Route 66
+initd // 2002.03 Initial D Arcade Stage
+initdexp // 200?.?? Initial D Export Version
+clubkrte // 2002.?? Club Kart: European Session
+ // 2002.06 WCCF SERIE A 2001-2002
+ // 2002.07 Soul Surfer
+vf4evoct // 2002.08 Virtua Fighter 4 Evolution (cartridge)
+vf4evoa // 2002.08 Virtua Fighter 4 Evolution
+ // 2002.11 WCCF SERIE A 2001-2002 ver.1.2
+initdv2j // 2002.12 Initial D Arcade Stage ver.2 rev. B
+initdv2jo // 2002.12 Initial D Arcade Stage ver.2
+initdv2e // 2002.12 Initial D Arcade Stage ver.2
+vf4evo // 2002.12 Virtua Fighter 4 Evolution ver.B
+ // 2003.03 WCCF SERIE A 2001-2002 ver.2.0
+ // 2003.09 WCCF 2002-2003 SERIE A
+ // 2003.?? CYCRAFT Club Kart ver.
+initdv3j // 2004.01 Initial D Arcade Stage ver.3 rev. C
+initdv3jb // 2004.01 Initial D Arcade Stage ver.3 rev. B
+ // 2004.?? Initial D Arcade Stage ver.3 for CYCRAFT
+ // 2004.06 WCCF 2002-2003 SERIE A ver.2.0
+ // 2004.07 Virtua Fighter 4 Final Tuned
+vf4tuneda // 2004.09 Virtua Fighter 4 Final Tuned ver.A
+ // 2004.12 WCCF 2002-2003 ver.2.1
+ // 2005.01 Virtua Fighter 4 final Tuned ver.B
+ // 2005.04 Menkyo no Tetsujin
+ // 2005.06 WCCF European Clubs 2004-2005
+ // 2006.01 WCCF European Clubs 2004-2005 ver.1.1
+ // 2006.03 WCCF European Clubs 2004-2005 ver.1.2
+ // 2006.08 WCCF European Clubs 2005-2006
+ // 2006.10 WCCF European Clubs 2005-2006 bugfix ver.
+vf4tunedd
+vf4tuned // 200?.?? Virtual fighter 4 Final Tuned ver.F
+
+
+// Atomiswave (Dreamcast-based) games
+awbios
+maxspeed // 2002.12 Maximum Speed
+sprtshot // 2002.12 Sports Shooting USA
+ggx15 // 2003.03 Guilty Gear X ver.1.5
+demofist // 2003.06 Demolish Fist
+dolphin // 2003.08 Dolphin Blue
+ggisuka // 2003.12 Guilty Gear Isuka
+ // 2003.12 Sangoku Senki Shichisei Tensei (IGS)
+rumblef // 2004.03 The Rumble Fish
+rangrmsn // 2004.03 Ranger Mission
+salmankt // 2004.06 Salary Man Kintarou Net Select
+kofnw // 2004.07 The King of Fighters Neo Wave
+kofnwj // 2004.07 The King of Fighters Neo Wave (Japan)
+xtrmhunt // 2004.09 Extreme Hunting
+dirtypig // 2004.09 Dirty Pig Skin Football
+ftspeed // 2004.09 Faster than Speed
+kov7sprt // 2004.?? Knights of Valour - The Seven Sprits
+vfurlong // 2005.03 Net Select Keiba Victory Furlong
+rumblef2 // 2005.03 The Rumble Fish 2
+ngbc // 2005.07 NeoGeo Battle Colloseum
+samsptk // 2005.09 Samurai Spirits Tenkaichi Kenkakuden
+kofxi // 2005.10 The King of Fighters XI
+fotns // 2005.12 Hokuto no Ken
+mslug6 // 2006.02 Metal Slug 6
+xtrmhnt2 // 2006.09 Extreme Hunting 2 Tournament Edition
+ // 2008.?? Sega Clay Challenge
+
+// Hikaru
+hikaru // BIOS (c)2000
+braveff // 1999.06 Syouboushi Brave Fire Fighters
+podrace // 2000.06 Star Wars: Racer Arcade
+sgnascar // 2000.09 Nascar Arcade
+pharrier // 2000.12 Planet Harriers
+airtrix // 2001.02 Air Trix
+ // 2001.10 Dennou Senki Virtual-On Force
+ // 2002.04 Dennou Senki Virtual-On Force ver.7.7
+
+// Triforce (GameCube based)
+triforce
+vs2002j // 2002.10 Virtua Striker 2002
+vs2002ex
+ // 2003.06 F-ZERO AX
+avalons // 2003.07 Avalon no Kagi
+ // 2003.08 Avalon no Kagi ver.1.00
+ // 2003.10 Avalon no Kagi ver.1.01
+gekpurya // 2003.10 Gekitou Pro Yakyuu Mizushima Shinji All Stars vs. Pro Yakyuu
+ // 2003.12 Avalon no Kagi ver.1.10
+ // 2003.?? CYCRAFT F-ZERO AX Monster Ride
+ // 2004.04 Avalon no Kagi ver.1.20 Aratanaru Syoukan
+avalon13 // 2004.07 Avalon no Kagi ver.1.30 Konton no Utage
+vs4 // 2004.10 Virtua Striker 4
+vs4j // 2004.10 Virtua Striker 4
+avalon20 // 2004.11 Avalon no Kagi ver.2.0 Chitsujo to Kairitsu
+ // 2005.04 Virtua Striker 4 ver.A
+ // 2005.08 Avalon no Kagi ver.2.5 Kagi Seisen
+ // 2005.12 Mario Kart Arcade Grand Prix
+vs42006 // 2006.05 Virtua Striker 4 ver.2006
+ // 2007.03 Mario Kart Arcade Grand Prix 2
+
+tfupdate // Triforce GDROM Boot Update (GDT-0011)
+
+// Chihiro (X-Box based)
+chihiro
+hotd3 // 2002.12 The House of the Dead III
+crtaxihr // 2003.03 Crazy Taxi High Roller
+vcop3 // 2003.04 Virtua Cop 3
+outr2 // 2003.12 Outrun 2
+ // 2004.03 Sega Network Taisen Mahjong MJ 2
+ollie // 2004.03 Ollie King
+ // 2004.04 Sega Network Taisen Mahjong MJ 2 ver.B
+wangmid // 2004.07 Wangan Midnight Maximum Tune
+mj2 // 2004.07 Sega Network Taisen Mahjong MJ 2 ver.C
+ // 2004.09 Quest of D
+ // 2004.11 Sega Golf Club Network Pro Tour
+ // 2004.12 Sega Network Taisen Mahjong MJ 2 ver.D
+ // 2004.12 Quest of D ver.1.02
+outr2st // 2004.12 Outrun 2 Special Tours
+ // 2004.12 Quest of D ver.1.10
+ghostsqu // 2004.12 Ghost Squad
+ // 2004.12 Quest of D ver.1.10a
+ // 2005.03 Sangokushi Taisen
+gundamos // 2005.03 Kidou Senshi Gundam Battle Operating Simulator
+ // 2005.04 Quest of D ver.1.20
+ // 2005.04 Sega Network Taisen Mahjong MJ 2 ver.E
+wangmid2 // 2005.04 Wangan Midnight Maximum Tune 2
+ // 2005.06 Sangokushi Taisen ver.1.003
+ // 2005.06 Sega Golf Club Network Pro Tour 2005
+ // 2005.06 Quest of D ver.1.20a
+ // 2005.09 Quest of D ver.1.21
+ // 2005.10 Sangokushi Taisen Ranse no Gunrou ver.1.100
+wangmd2b // 2005.10 Wangan Midnight Maximum Tune 2 ver.B
+ // 2005.11 Sangokushi Taisen Ranse no Gunrou ver.1.110
+ // 2005.12 Quest of D Gofu no Keisyousya ver.2.00
+ // 2005.12 Kidou Senshi Gundam 0079 Card Builder
+mj3 // 2005.12 Sega Network Taisen Mahjong MJ 3
+ // 2005.12 Quest of D Gofu no Keisyousya ver.2.01
+scg06nt // 2005.12 Sega Golf Club 2006 Next Tours
+ // 2006.02 Sangokushi Taisen Ranse no Gunrou ver.1.12
+ // 2006.03 Kidou Senshi Gundam 0079 Card Builder ver.1.007
+ // 2006.03 Quest of D Gofu no Keisyousya ver.2.02b
+ // 2006.04 Sega Network Taisen Mahjong MJ 3 ver.A+
+ // 2006.05 Sangokushi Taisen 2
+ // 2006.07 Kidou Senshi Gundam 0079 Card Builder ver.2.00
+ // 2006.09 Sangokushi Taisen 2 ver.2.01
+ // 2006.09 Sega Network Taisen Mahjong MJ 3 ver.B
+ // 2006.09 Kidou Senshi Gundam 0079 Card Builder ver.2.01
+ // 2006.10 Quest of D ver.3.00 Oukoku no Syugosya
+ // 2006.11 Quest of D ver.3.01 Oukoku no Syugosya
+ // 2006.11 Kidou Senshi Gundam 0079 Card Builder ver.2.02
+ // 2007.03 Kidou Senshi Gundam 0083 Card Builder
+ // 2007.03 Sega Network Taisen Mahjong MJ 3 Evolution
+ // 2007.10 Kidou Senshi Gundam 0083 Card Builder Ryouyuu Gekitotsu
+ // 2007.11 Quest of D The Battle Kingdom ver.4.00
+ // 2008.01 Quest of D The Battle Kingdom ver.4.00b
+ // 2008.02 Quest of D The Battle Kingdom ver.4.00c
+ // 2008.06 Quest of D The Battle Kingdom ver.4.01
+
+hshavoc // (c) 1993 Data East
+
+// Data East "Burger Time hardware" games
+lnc // (c) 1981
+zoar // (c) 1982
+btime // (c) 1982
+btime2 // (c) 1982
+btimem // (c) 1982 + Midway
+tisland // (c) 1982
+protennb // bootleg
+cookrace // bootleg
+wtennis // bootleg 1982
+brubber // (c) 1982
+bnj // (c) 1982 + Midway
+caractn // bootleg
+disco // (c) 1982
+discof // (c) 1982
+sdtennis // (c) 1983
+mmonkey // (c) 1982 Technos Japan + Roller Tron
+
+ // cassette system, parent is decocass
+decocass
+ctsttape // ?
+chwy // 01 1980.12 Highway Chase
+ // 02 1980.12 Sengoku Ninjatai
+ // 03 1981.01 Manhattan
+cterrani // 04 1981.02 Terranian
+ // 05 1981.?? Missile Sprinter
+ // 06 1980.12 Nebbler
+castfant // 07 1981.02 Astro Fantasia
+ // 08 1981.03 The Tower
+csuperas // 09 1981.05 Super Astro Fighter
+ // 10 1981.?? Ocean to Ocean (medal)
+clocknch // 11 1981.04 Rock'n Chase
+ // 12 1981.08 Flash Boy/DECO Kid
+cprogolf // 13 1981.08 Pro Golf
+ // 14 1981.06 DS Telejan
+cluckypo // 15 1981.?? Lucky Poker
+ctisland // 16 1982.02 Treasure Island
+ctisland2 // 16
+ctisland3 // 16
+ // 17 1981.10 Bobbit
+cexplore // 18 1982.02 Explorer
+cdiscon1 // 19 1982.04 Disco No.1
+csweetht // 19
+ctornado // 20 1982.05 Tornado
+cmissnx // 21 1982.04 Mission X/Zoar
+cptennis // 22 1982.06 Pro Tennis
+ // 23 1982.?? 18 Hole Pro Golf
+ // 24 1982.07 Tsumego Kaisyou
+ // 25 1982.10 Fishing
+cbtime // 26 1982.08 Hamburger/Burger Time
+cburnrub // 27 1982.11 Burnin' Rubber/Bump'n Jump
+cburnrub2 // 27
+cbnj // 27
+cgraplop // 28 1982.11 Grapelop
+cgraplop2 // 28
+clapapa // 29 1982.11 Lapapa/Rootin' Tootin'
+clapapa2 // 29 // this one doesn't display lapapa anywhere
+ // 30 1983.03 Skater
+cprobowl // 31 1983.03 Pro Bowling
+cnightst // 32 1983.04 Night Star
+cnightst2 // 32
+cprosocc // 33 1982.08 Pro Soccer
+ // 34 1983.09 Super Doubles Tennis
+cflyball // 35 1983.?? Bampoline/Flying Ball
+ // 36 1984.04 Genesis/Boomer Rang'r
+czeroize // 37 1983.10 Zeroize // doesn't work at all
+cscrtry // 38 1984.03 Scrum Try
+cscrtry2 // 38
+cppicf // 39 1984.02 Peter Pepper's Ice Cream Factory
+cppicf2 // 39
+cfghtice // 40 1984.04 Fighting Ice Hockey
+ // 41 1984.05 Oozumou/The Grand Sumo
+ // 42 1984.08 Hellow Gateball // not a typo, this is official spelling
+ // 43 1984.08 Yellow Cab
+cbdash // 44 1985.08 Boulder Dash
+ // UX7 1984.12 Tokyo Mie Shinryoujo
+ // UX8 1985.01 Tokyo Mie Shinryoujo Part 2
+ // UX9 1985.05 Geinoujin Shikaku Shiken
+
+// Data East LD games
+begas // (c) 1983
+begas1 // (c) 1983
+cobra // (c) 1984
+rblaster // (c) 1985
+
+// other Data East games
+madalien // (c) 1980
+madaliena // (c) 1980
+astrof // (c) [1980?]
+astrof2 // (c) [1980?]
+astrof3 // (c) [1980?]
+abattle // Sidam
+abattle2 // Sidam
+afire // Rene Pierre
+acombat // bootleg
+acombato // bootleg
+sstarbtl // bootleg
+spfghmk2 // (c) [1979] Data East Corporation
+spfghmk22 // (c) [1979] Data East Corporation
+tomahawk // (c) 1980 Data East, Inc.
+tomahawk1 // (c) 1980 Data East, Inc.
+progolf // (c) 1981
+progolfa // (c) 1981
+deshoros // (c) 1983
+prosoccr // (c) 1983
+prosport // (c) 1983
+prosporta // (c) 1983
+boomrang // (c) 1983
+boomranga // (c) 1983
+kamikcab // (c) 1984
+yellowcbj // (c) 1984
+yellowcbb // bootleg
+liberate // (c) 1984 Data East Corporation
+dualaslt // (c) 1984 Data East USA (US)
+liberateb // bootleg
+bwings // (c) 1984
+bwingso // (c) 1984
+bwingsa // (c) 1984
+zaviga // (c)
+zavigaj // (c)
+kchamp // (c) 1984 Data East USA (US)
+karatedo // (c) 1984 Data East Corporation (Japan)
+kchampvs // (c) 1984 Data East USA (US)
+kchampvs2 // (c) 1984 Data East USA (US)
+karatevs // (c) 1984 Data East Corporation (Japan)
+compgolf // (c) 1985 Data East Corporation (Japan)
+compgolfo // (c) 1985 Data East Corporation (Japan)
+cntsteer // (c) 1985 Data East Corporation
+zerotrgt // (c) 1985 Data East Corporation
+zerotrgta // (c) 1985 Data East Corporation
+gekitsui // (c) 1985 Data East Corporation (Japan)
+tryout // (c) 1985 Data East Corporation (Japan)
+firetrap // (c) 1986 Data East USA (US)
+firetrapj // (c) 1986 Wood Place Inc. (Japan)
+firetrapbl // bootleg
+metlclsh // (c) 1985 Data East
+chanbara // (c) 1985 Data East
+brkthru // (c) 1986 Data East USA (US)
+brkthruj // (c) 1986 Data East Corporation (Japan)
+forcebrk // (c) 1986 Data East Corporation (Japan)
+darwin // (c) 1986 Data East Corporation (Japan)
+shootout // (c) 1985 Data East USA (US)
+shootoutj // (c) 1985 Data East USA (Japan)
+shootoutb // bootleg
+sidepckt // (c) 1986 Data East Corporation
+sidepcktj // (c) 1986 Data East Corporation
+sidepcktb // bootleg
+exprraid // (c) 1986 Data East USA (US)
+exprraida // (c) 1986 Data East USA (US)
+wexpress // (c) 1986 Data East Corporation (World?)
+wexpressb // bootleg
+wexpressb2 // bootleg
+pcktgal // (c) 1987 Data East Corporation (Japan)
+pcktgalb // bootleg
+pcktgal2 // (c) 1989 Data East Corporation (World?)
+pcktgal2j // (c) 1989 Data East Corporation (World?)
+pokechmp // Korean hack of Pocket Gal
+spool3 // (c) 1989 Data East Corporation (World?)
+spool3i // (c) 1990 Data East Corporation + I-Vics license
+battlera // (c) 1988 Data East Corporation (World)
+bldwolf // (c) 1988 Data East USA (US)
+bldwolfj // (c) 1988 Data East Corporation (Japan)
+actfancr // (c) 1989 Data East Corporation (World)
+actfancr1 // (c) 1989 Data East Corporation (World)
+actfancrj // (c) 1989 Data East Corporation (Japan)
+triothep // (c) 1989 Data East Corporation (World)
+triothepj // (c) 1989 Data East Corporation (Japan)
+
+// Data East 8-bit games
+lastmisn // (c) 1986 Data East USA (US)
+lastmisno // (c) 1986 Data East USA (US)
+lastmisnj // (c) 1986 Data East Corporation (Japan)
+shackled // (c) 1986 Data East USA (US)
+breywood // (c) 1986 Data East Corporation (Japan)
+csilver // (c) 1987 Data East Corporation (Japan)
+csilverj // (c) 1987 Data East Corporation (Japan)
+ghostb // (c) 1987 Data East USA (US)
+ghostb3 // (c) 1987 Data East USA (US)
+meikyuh // (c) 1987 Data East Corporation (Japan)
+meikyuha // (c) 1987 Data East Corporation (Japan)
+srdarwin // (c) 1987 Data East Corporation (World)
+srdarwinj // (c) 1987 Data East Corporation (Japan)
+gondo // (c) 1987 Data East USA (US)
+makyosen // (c) 1987 Data East Corporation (Japan)
+garyoret // (c) 1987 Data East Corporation (Japan)
+cobracom // (c) 1988 Data East Corporation (World)
+cobracomj // (c) 1988 Data East Corporation (Japan)
+oscar // (c) 1988 Data East Corporation (World)
+oscaru // (c) 1987 Data East USA (US)
+oscarj1 // (c) 1987 Data East Corporation (Japan)
+oscarj2 // (c) 1987 Data East Corporation (Japan)
+
+// Data East 16-bit games
+karnov // (c) 1987 Data East USA (US)
+karnovj // (c) 1987 Data East Corporation (Japan)
+wndrplnt // (c) 1987 Data East Corporation (Japan)
+chelnov // (c) 1988 Data East USA (World)
+chelnovu // (c) 1988 Data East USA (US)
+chelnovj // (c) 1988 Data East Corporation (Japan)
+ // the following ones all run on similar hardware
+hbarrel // (c) 1987 Data East USA (US)
+hbarrelw // (c) 1987 Data East Corporation (World)
+baddudes // EI (c) 1988 Data East USA (US)
+drgninja // EG (c) 1988 Data East Corporation (Japan)
+birdtry // (c) 1988 Data East Corporation (Japan)
+robocop // EP? (c) 1988 Data East Corporation (World)
+robocopw // EP? (c) 1988 Data East Corporation (World)
+robocopj // EM (c) 1988 Data East Corporation (Japan)
+robocopu // (c) 1988 Data East USA (US)
+robocopu0 // (c) 1988 Data East USA (US)
+robocopb // bootleg
+automat // bootleg
+hippodrm // EW (c) 1989 Data East USA (US)
+ffantasy // EV (c) 1989 Data East Corporation (Japan)
+ffantasya // EV (c) 1989 Data East Corporation (Japan)
+ffantasybl // bootleg
+slyspy // (c) 1989 Data East USA (US)
+slyspy2 // (c) 1989 Data East USA (US)
+secretag // (c) 1989 Data East Corporation (World)
+secretab // bootleg
+midres // (c) 1989 Data East Corporation (World)
+midresu // (c) 1989 Data East USA (US)
+midresj // (c) 1989 Data East Corporation (Japan)
+midresb // (c) 1989 Data East Corporation (Japan)
+bouldash // (c) 1990 Data East Corporation (World)
+bouldashj // (c) 1990 Data East Corporation (Japan)
+ // end of similar hardware
+stadhero // (c) 1988 Data East Corporation (Japan)
+madmotor // (c) [1989] Mitchell
+ // All these games have a unique code stamped on the mask roms
+vaportra // MAA (c) 1989 Data East Corporation (World)
+vaportra3 // MAA (c) 1989 Data East Corporation (World)
+vaportrau // MAA (c) 1989 Data East Corporation (US)
+kuhga // MAA (c) 1989 Data East Corporation (Japan)
+cbuster // MAB (c) 1990 Data East Corporation (World)
+cbusterw // MAB (c) 1990 Data East Corporation (World)
+cbusterj // MAB (c) 1990 Data East Corporation (Japan)
+twocrude // MAB (c) 1990 Data East USA (US)
+darkseal // MAC (c) 1990 Data East Corporation (World)
+darkseal1 // MAC (c) 1990 Data East Corporation (World)
+darksealj // MAC (c) 1990 Data East Corporation (Japan)
+gatedoom // MAC (c) 1990 Data East Corporation (US)
+gatedoom1 // MAC (c) 1990 Data East Corporation (US)
+edrandy // MAD (c) 1990 Data East Corporation (World)
+edrandy2 // MAD (c) 1990 Data East Corporation (World)
+edrandy1 // MAD (c) 1990 Data East Corporation (World)
+edrandyj // MAD (c) 1990 Data East Corporation (Japan)
+supbtime // MAE (c) 1990 Data East Corporation (World)
+supbtimea // MAE (c) 1990 Data East Corporation (World)
+supbtimej // MAE (c) 1990 Data East Corporation (Japan)
+mutantf // MAF (c) 1992 Data East Corporation (World)
+mutantf4 // MAF (c) 1992 Data East Corporation (World)
+mutantf3 // MAF (c) 1992 Data East Corporation (World)
+deathbrd // MAF (c) 1992 Data East Corporation (Japan)
+cninja // MAG (c) 1991 Data East Corporation (World)
+cninja1 // MAG (c) 1991 Data East Corporation (World)
+cninjau // MAG (c) 1991 Data East Corporation (US)
+joemac // MAG (c) 1991 Data East Corporation (Japan)
+cninjabl // bootleg
+stoneage // bootleg
+robocop2 // MAH (c) 1991 Data East Corporation (World)
+robocop2u // MAH (c) 1991 Data East Corporation (US)
+robocop2j // MAH (c) 1991 Data East Corporation (Japan)
+thndzone // MAJ (c) 1991 Data East Corporation (World)
+dassault // MAJ (c) 1991 Data East Corporation (US)
+dassault4 // MAJ (c) 1991 Data East Corporation (US)
+chinatwn // MAK (c) 1991 Data East Corporation (Japan)
+rohga // MAM (c) 1991 Data East Corporation (Asia/Euro)
+rohga1 // MAM (c) 1991 Data East Corporation (Asia/Euro)
+rohga2 // MAM (c) 1991 Data East Corporation (Asia/Euro)
+rohgah // MAM (c) 1991 Data East Corporation (Hong Kong)
+rohgau // MAM (c) 1991 Data East Corporation (US)
+wolffang // MAM (c) 1991 Data East Corporation (Japan)
+schmeisr // (c) 1993 Hot B
+captaven // MAN (c) 1991 Data East Corporation (Asia)
+captavena // MAN (c) 1991 Data East Corporation (Asia)
+captavene // MAN (c) 1991 Data East Corporation (UK)
+captavenu // MAN (c) 1991 Data East Corporation (US)
+captavenuu // MAN (c) 1991 Data East Corporation (US)
+captavenua // MAN (c) 1991 Data East Corporation (US)
+captavenj // MAN (c) 1991 Data East Corporation (Japan)
+ // MAO ??
+tumblep // MAP (c) 1991 Data East Corporation (World)
+tumblepj // MAP (c) 1991 Data East Corporation (Japan)
+tumbleb // bootleg
+tumbleb2 // bootleg
+jumpkids // (c) 1993 Comad
+jumppop // (c) 2001 ESD
+pangpang // (c) 1994 Dong Gue La Mi Ltd.
+sdfight // (c) 1996 SemiCom
+wlstar // (c) 1995 Mijin
+wondl96 // (c) 1996 SemiCom
+fncywld // (c) 1996 Unico
+htchctch // (c) 1995 SemiCom
+cookbib // (c) 1995 SemiCom
+chokchok // (c) 1995 SemiCom
+metlsavr // (c) 1994
+bcstry // (c) 1997 SemiCom
+bcstrya // (c) 1997 SemiCom
+semibase // (c) 1997 SemiCom
+dquizgo // (c) 1998 SemiCom
+suprtrio // (c) 1994 GameAce
+lemmings // prototype (c) 1991 Data East USA (US)
+ // MAQ ??
+dragngun // MAR (c) 1992 Data East Corporation (US)
+wizdfire // MAS (c) 1992 Data East Corporation (Over Sea)
+wizdfireu // MAS (c) 1992 Data East Corporation (US)
+darkseal2 // MAS (c) 1992 Data East Corporation (Japan)
+funkyjet // MAT (c) 1992 Mitchell
+funkyjetj // MAT (c) 1992 Mitchell
+ // MAU ??
+nitrobal // MAV (c) 1992 Data East Corporation (US)
+gunball // MAV (c) 1992 Data East Corporation (Japan)
+ // MAW ??
+ // MAX ??
+dietgo // MAY (c) 1993
+dietgoe // MAY (c) 1993
+dietgou // MAY (c) 1993
+dietgoj // MAY (c) 1993
+pktgaldx // MAZ (c) 1993 Data East (Euro v3.00)
+pktgaldxj // MAZ (c) 1993
+pktgaldxb // bootleg
+ // MBA ??
+ // MBB ??
+ // MBC ??
+boogwing // MBD (c) 1992 (Euro)
+boogwinga // MBD (c) 1992 (Asia)
+ragtime // MBD (c) 1992 (Japan)
+ragtimea // MBD (c) 1992 (Japan)
+dblewing // MBE (c) 1993 Mitchell
+fghthist // MBF (c) 1993 Data East Corporation (World)
+fghthistu // MBF (c) 1993 Data East Corporation (US)
+fghthista // MBF (c) 1993 Data East Corporation (US)
+fghthistj // MBF (c) 1993 Data East Corporation (Japan)
+hvysmsh // MBG (c) 1993 Data East Corporation (World)
+hvysmsha // MBG (c) 1993 Data East Corporation (Asia)
+hvysmshj // MBG (c) 1993 Data East Corporation (Japan)
+nslasher // MBH (c) 1993 Data East Corporation
+nslasherj // MBH (c) 1993 Data East Corporation (Japan)
+nslashers // MBH (c) 1993 Data East Corporation (Japan)
+ // MBI ??
+ // MBJ ??
+ // MBK ??
+ // MBL ??
+lockload // MBM (c) 1994 Data East Corporation (US)
+lockloadu // MBM (c) 1994 Data East Corporation (US)
+joemacr // MBN (c) 1994
+joemacra // MBN (c) 1994
+ // MBO ??
+ // MBP ??
+ // MBQ ??
+tattass // prototype (c) 1994 Data East Pinball (US)
+tattassa // prototype (c) 1994 Data East Pinball (Asia)
+charlien // MBR (c) 1994 Mitchell
+ // MBS ??
+ // MBT ??
+ // MBU ??
+ // MBV ??
+ // MBW ??
+wcvol95 // MBX (c) 1993 Data East
+ // MBY ??
+backfire // MBZ (c) 1995
+backfirea // MBZ (c) 1995
+ // MCA ??
+prtytime // MCB (c) 1995 Mitchell
+gangonta // MCB (c) 1995 Mitchell
+chainrec // MCC (c) 1994
+magdrop // MCC (c) 1995 Data East
+magdropp // MCC (c) 1995 Data East
+ // MCD ??
+// MCE Dunk Dream 95/Hoops96 See MLC games below
+osman // MCF (c) 1996 Mitchell
+candance // MCF (c) 1996 Mitchell
+sotsugyo // (c) 1995 Mitchell (Atlus license)
+sshangha // (c) 1992 Hot-B
+sshanghab // bootleg
+
+// Data East MLC Games
+hoops96 // MCE (c) 1996 Data East Corporation
+ddream95 // MCE (c) 1996 Data East Corporation
+hoops95 // MCE (c) 1996 Data East Corporation
+avengrgs // MCG (c) 1995 Data East Corporation (World)
+avengrgsj // MCG (c) 1995 Data East Corporation (Japan)
+skullfng // MCH (c) 1996 Data East Corporation (World)
+skullfngj // MCH (c) 1996 Data East Corporation (Japan)
+stadhr96 // MCM (c) 1996 Data East
+stadhr96j // MCM (c) 1996 Data East
+
+// Tehkan / Tecmo games (Tehkan became Tecmo in 1986)
+senjyo // (c) 1983 Tehkan
+starforc // (c) 1984 Tehkan
+starforce // (c) 1984 Tehkan
+starforcb // (c) 1984 Tehkan
+starforca // (c) 1984 Tehkan
+megaforc // (c) 1985 Tehkan + Video Ware license
+baluba // (c) 1986 Able Corp.
+bombjack // (c) 1984 Tehkan
+bombjack2 // (c) 1984 Tehkan
+pbaction // (c) 1985 Tehkan
+pbaction2 // (c) 1985 Tehkan
+pbaction3 // (c) 1985 Tehkan
+pbaction4 // (c) 1985 Tehkan
+pbaction5 // (c) 1985 Tehkan
+ // 6009 Tank Busters
+ponttehk // 6011 - (c) 1985 Tehkan
+lvpoker // ???? - (c) 1985 Tehkan
+lvcards // (c) 1985 Tehkan
+tehkanwc // (c) 1985 Tehkan
+tehkanwcb // bootleg
+tehkanwcc // bootleg
+gridiron // (c) 1985 Tehkan
+teedoff // 6102 - (c) 1986 Tecmo
+solomon // (c) 1986 Tecmo
+solomonj // (c) 1986 Tecmo
+rygar // 6002 - (c) 1986 Tecmo
+rygar2 // 6002 - (c) 1986 Tecmo
+rygar3 // 6002 - (c) 1986 Tecmo
+rygarj // 6002 - (c) 1986 Tecmo
+gemini // (c) 1987 Tecmo
+silkworm // 6217 - (c) 1988 Tecmo
+silkworm2 // 6217 - (c) 1988 Tecmo
+backfirt // bootleg [(c) 1988 Tecmo]
+tbowl // 6206 - (c) 1987 Tecmo
+tbowlj // 6206 - (c) 1987 Tecmo
+shadoww // 6215 - (c) 1988 Tecmo (World)
+shadowwa // 6215 - (c) 1988 Tecmo (World)
+gaiden // 6215 - (c) 1988 Tecmo (US)
+ryukendn // 6215 - (c) 1989 Tecmo (Japan)
+ryukendna // 6215 - (c) 1989 Tecmo (Japan)
+mastninj // bootleg
+wildfang // (c) 1989 Tecmo
+wildfangs // (c) 1989 Tecmo
+tknight // (c) 1989 Tecmo
+stratof // (c) 1991 Tecmo
+raiga // (c) 1991 Tecmo
+drgnbowl // (c) 1992 Nics
+wc90 // (c) 1989 Tecmo
+wc90a // (c) 1989 Tecmo
+wc90b // (c) 1989 Tecmo
+wc90t // (c) 1989 Tecmo
+wc90b1 // bootleg
+wc90b2 // bootleg
+spbactn // 9002 - (c) 1991 Tecmo
+spbactnj // 9002 - (c) 1991 Tecmo
+fstarfrc // (c) 1992 Tecmo
+fstarfrcj // (c) 1992 Tecmo
+ginkun // (c) 1995 Tecmo
+deroon // (c) 1996 Tecmo
+tkdensho // (c) 1996 Tecmo
+tkdenshoa // (c) 1996 Tecmo
+
+// Konami bitmap games
+tutankhm // GX350 (c) 1982 Konami
+tutankhms // GX350 (c) 1982 Stern
+junofrst // GX310 (c) 1983 Konami
+junofrstg // GX310 (c) 1983 Konami + Gottlieb license
+
+// Konami games
+pooyan // GX320 (c) 1982
+pooyans // GX320 (c) 1982 Stern
+pootan // bootleg
+timeplt // GX393 (c) 1982
+timepltc // GX393 (c) 1982 + Centuri license
+timeplta // GX393 (c) 1982 + Atari license
+spaceplt // bootleg
+psurge // (c) 1988 unknown (NOT Konami)
+megazone // GX319 (c) 1983
+megazonea // GX319 (c) 1983
+megazoneb // GX319 (c) 1983 + Kosuka
+megazonec // GX319 (c) 1983 + Kosuka
+megazonei // GX319 (c) 1983 + Interlogic / Kosuka
+pandoras // GX328 (c) 1984 + Interlogic
+gyruss // GX347 (c) 1983
+gyrussce // GX347 (c) 1983 + Centuri license
+gyrussb // bootleg or actual Taito NZ license?
+venus // bootleg
+trackfld // GX361 (c) 1983
+trackfldc // GX361 (c) 1983 + Centuri license
+trackfldnz // (c) 1982 Goldberg Enterprizes Inc.
+hyprolym // GX361 (c) 1983
+hyprolymb // bootleg
+atlantol // bootleg
+wizzquiz // (c) 1985 Konami
+wizzquiza // (c) 1985 Zilec-Zenitone
+reaktor // (c) 1985 Zilec
+mastkin // (c) 1988 Du Tech
+rocnrope // GX364 (c) 1983
+rocnropek // GX364 (c) 1983 + Kosuka
+ropeman // (c) 1983 bootleg
+circusc // GX380 (c) 1984
+circusc2 // GX380 (c) 1984
+circusc3 // GX380 (c) 1984
+circuscc // GX380 (c) 1984 + Centuri license
+circusce // GX380 (c) 1984 + Centuri license
+tp84 // GX388 (c) 1984
+tp84a // GX388 (c) 1984
+tp84b // GX388 (c) 1984
+hyperspt // GX330 (c) 1984 + Centuri
+hypersptb // bootleg
+hpolym84 // GX330 (c) 1984
+sbasketb // GX405 (c) 1984 (Version I, Encrypted)
+sbasketh // GX405 (c) 1984 (Version H, Unprotected)
+sbasketg // GX405 (c) 1984 (Version G, Encrypted)
+sbaskete // GX405 (c) 1984 (Version E, Encrypted)
+mikie // GX469 (c) 1984
+mikiej // GX469 (c) 1984
+mikiehs // GX469 (c) 1984
+roadf // GX461 (c) 1984
+roadf2 // GX461 (c) 1984
+yiear // GX407 (c) 1985
+yiear2 // GX407 (c) 1985
+yieartf // GX361 (c) 1985
+kicker // GX477 (c) 1985
+shaolins // GX477 (c) 1985
+shaolinb // bootleg
+pingpong // GX555 (c) 1985
+merlinmm // (c) 1986 Zilec-Zenitone
+cashquiz // (c) 1986 Zilec-Zenitone
+gberet // GX577 (c) 1985
+rushatck // GX577 (c) 1985
+gberetb // bootleg on different hardware
+mrgoemon // GX621 (c) 1986 (Japan)
+jailbrek // GX507 (c) 1986
+manhatan // GX507 (c) 1986 (Japan)
+jailbrekb // bootleg
+scotrsht // GX545 (c) 1985
+finalizr // GX523 (c) 1985
+finalizrb // bootleg
+ironhors // GX560 (c) 1986
+dairesya // GX560 (c) 1986 (Japan)
+farwest // bootleg
+jackal // GX631 (c) 1986 (World)
+topgunr // GX631 (c) 1986 (US)
+jackalj // GX631 (c) 1986 (Japan)
+topgunbl // bootleg
+ddribble // GX690 (c) 1986
+ddribblep // GX690 (c) 1986
+contra // GX633 (c) 1987
+contra1 // GX633 (c) 1987
+contrab // bootleg
+contraj // GX633 (c) 1987 (Japan)
+contrajb // bootleg
+gryzor // GX633 (c) 1987
+gryzora // GX633 (c) 1987
+combatsc // GX611 (c) 1988
+combatsct // GX611 (c) 1987
+combatscj // GX611 (c) 1987 (Japan)
+bootcamp // GX611 (c) 1987
+combatscb // bootleg
+rockrage // GX620 (c) 1986 (World?)
+rockragea // GX620 (c) 1986 (Prototype?)
+rockragej // GX620 (c) 1986 (Japan)
+mx5000 // GX669 (c) 1987
+flkatck // GX669 (c) 1987 (Japan)
+fastlane // GX752 (c) 1987
+tricktrp // GX771 (c) 1987
+labyrunr // GX771 (c) 1987 (Japan)
+labyrunrk // GX771 (c) 1987 (Japan)
+thehustl // GX765 (c) 1987 (Japan)
+thehustlj // GX765 (c) 1987 (Japan)
+rackemup // GX765 (c) 1987
+battlnts // GX777 (c) 1987
+battlntsj // GX777 (c) 1987 (Japan)
+bladestl // GX797 (c) 1987
+bladestll // GX797 (c) 1987
+bladestle // GX797 (c) 1987
+hcastle // GX768 (c) 1988
+hcastleo // GX768 (c) 1988
+hcastlej // GX768 (c) 1988 (Japan)
+hcastljo // GX768 (c) 1988 (Japan)
+ajax // GX770 (c) 1987
+typhoon // GX770 (c) 1987
+ajaxj // GX770 (c) 1987 (Japan)
+scontra // GX775 (c) 1988
+scontraj // GX775 (c) 1988 (Japan)
+thunderx // GX873 (c) 1988
+thunderxa // GX873 (c) 1988
+thunderxb // GX873 (c) 1988
+thunderxj // GX873 (c) 1988 (Japan)
+mainevt // GX799 (c) 1988
+mainevto // GX799 (c) 1988
+mainevt2p // GX799 (c) 1988
+ringohja // GX799 (c) 1988 (Japan)
+devstors // GX890 (c) 1988
+devstors2 // GX890 (c) 1988
+devstors3 // GX890 (c) 1988
+garuka // GX890 (c) 1988 (Japan)
+88games // GX861 (c) 1988
+konami88 // GX861 (c) 1988
+hypsptsp // GX861 (c) 1988 (Japan)
+gbusters // GX878 (c) 1988
+gbustersa // GX878 (c) 1988
+crazycop // GX878 (c) 1988 (Japan)
+crimfght // GX821 (c) 1989 (US)
+crimfght2 // GX821 (c) 1989 (World)
+crimfghtj // GX821 (c) 1989 (Japan)
+spy // GX857 (c) 1989 (World)
+spyu // GX857 (c) 1989 (US)
+bottom9 // GX891 (c) 1989
+bottom9n // GX891 (c) 1989
+mstadium // GX891 (c) 1989 (Japan)
+blockhl // GX973 (c) 1989
+quarth // GX973 (c) 1989 (Japan)
+aliens // GX875 (c) 1990 (World)
+aliens2 // GX875 (c) 1990 (World)
+aliens3 // GX875 (c) 1990 (World)
+aliensu // GX875 (c) 1990 (US)
+aliensj // GX875 (c) 1990 (Japan)
+aliensj2 // GX875 (c) 1990 (Japan)
+aliensa // GX875 (c) 1990 (Asia)
+suratk // GX911 (c) 1990 (World)
+suratka // GX911 (c) 1990 (Asia)
+suratkj // GX911 (c) 1990 (Japan)
+parodius // GX955 (c) 1990 (World)
+parodiusa // GX955 (c) 1990 (World)
+parodiusj // GX955 (c) 1990 (Japan)
+rollerg // GX999 (c) 1991 (US)
+rollergj // GX999 (c) 1991 (Japan)
+simpsons // GX072 (c) 1991
+simpsons4pa // GX072 (c) 1991
+simpsons2p // GX072 (c) 1991
+simpsons2p2 // GX072 (c) 1991
+simpsons2pa // GX072 (c) 1991 (Asia)
+simpsons2pj // GX072 (c) 1991 (Japan)
+esckids // GX975 (c) 1991 (Asia)
+esckidsj // GX975 (c) 1991 (Japan)
+vendetta // GX081 (c) 1991 (World)
+vendettar // GX081 (c) 1991 (World)
+vendetta2p // GX081 (c) 1991 (World)
+vendetta2pu // GX081 (c) 1991 (Asia)
+vendetta2pd // GX081 (c) 1991 (Asia)
+vendettaj // GX081 (c) 1991 (Japan)
+mogura // GX141 (c) 1991
+wecleman // GX602 (c) 1986
+hotchase // GX763 (c) 1988
+chqflag // GX717 (c) 1988
+chqflagj // GX717 (c) 1988 (Japan)
+ultraman // GX910 (c) 1991 Banpresto/Bandai
+hexion // GX122 (c) 1992
+lethalen // GX191 (c) 1992
+lethalenua // GX191 (c) 1992
+lethalenux // GX191 (c) 1992
+lethaleneab // GX191 (c) 1992
+lethaleneae // GX191 (c) 1992
+lethalenj // GX191 (c) 1992
+tgtpanic // GX601 (c) 1996
+
+// Konami "Nemesis hardware" games
+nemesis // GX456 (c) 1985
+nemesisuk // GX456 (c) 1985
+konamigt // GX561 (c) 1985
+salamand // GX587 (c) 1986
+salamandj // GX587 (c) 1986
+lifefrce // GX587 (c) 1986 (US)
+lifefrcej // GX587 (c) 1986 (Japan)
+blkpnthr // GX604 (c) 1987 (Japan)
+citybomb // GX787 (c) 1987 (World)
+citybombj // GX787 (c) 1987 (Japan)
+kittenk // GX712 (c) 1988
+nyanpani // GX712 (c) 1988 (Japan)
+hcrash // GX790 (c) 1987
+hcrashc // GX790 (c) 1987
+
+// GX400 BIOS based games
+rf2 // GX561 (c) 1985
+twinbee // GX412 (c) 1985
+gradius // GX456 (c) 1985
+gwarrior // GX578 (c) 1985
+
+// Konami "Twin 16" games
+devilw // GX687 (c) 1987
+darkadv // GX687 (c) 1987
+majuu // GX687 (c) 1987 (Japan)
+vulcan // GX785 (c) 1988
+vulcana // GX785 (c) 1988
+vulcanb // GX785 (c) 1988
+gradius2 // GX785 (c) 1988 (Japan)
+gradius2a // GX785 (c) 1988 (Japan)
+gradius2b // GX785 (c) 1988 (Japan)
+cuebrickj // GX903 (c) 1989 (Japan)
+fround // GX870 (c) 1988
+froundl // GX870 (c) 1988
+hpuncher // GX870 (c) 1988 (Japan)
+miaj // GX808 (c) 1989 (Japan)
+
+// (some) Konami 68000 games
+cuebrick // GX903 (c) 1989
+mia // GX808 (c) 1989
+mia2 // GX808 (c) 1989
+tmnt // GX963 (c) 1989 (World)
+tmntu // GX963 (c) 1989 (US)
+tmntua // GX963 (c) 1989 (US)
+tmht // GX963 (c) 1989 (UK)
+tmhta // GX963 (c) 1989 (UK)
+tmntj // GX963 (c) 1990 (Japan)
+tmht2p // GX963 (c) 1989 (UK)
+tmht2pa // GX963 (c) 1989 (UK)
+tmnt2pj // GX963 (c) 1990 (Japan)
+tmnt2po // GX963 (c) 1989 (Oceania)
+punkshot // GX907 (c) 1990 (US)
+punkshot2 // GX907 (c) 1990 (US)
+punkshotj // GX907 (c) 1990 (Japan)
+lgtnfght // GX939 (c) 1990 (World)
+lgtnfghta // GX939 (c) 1990 (Asia)
+lgtnfghtu // GX939 (c) 1990 (US)
+trigon // GX939 (c) 1990 (Japan)
+blswhstl // GX060 (c) 1991
+detatwin // GX060 (c) 1991 (Japan)
+glfgreat // GX061 (c) 1991
+glfgreatj // GX061 (c) 1991 (Japan)
+tmnt2 // GX063 (c) 1991 (US)
+tmnt2a // GX063 (c) 1991 (Asia)
+tmht22pe // GX063 (c) 1991 (UK)
+tmnt22pu // GX063 (c) 1991 (US)
+ssriders // GX064 (c) 1991 (World)
+ssridersebd // GX064 (c) 1991 (World)
+ssridersebc // GX064 (c) 1991 (World)
+ssridersuda // GX064 (c) 1991 (US)
+ssriderseaa // GX064 (c) 1991 (US)
+ssridersuac // GX064 (c) 1991 (US)
+ssridersubc // GX064 (c) 1991 (US)
+ssridersabd // GX064 (c) 1991 (Asia)
+ssridersadd // GX064 (c) 1991 (Asia)
+ssridersjbd // GX064 (c) 1991 (Japan)
+ssridersb // bootleg
+ssriders2 // bootleg
+xmen // GX065 (c) 1992 (US)
+xmenj // GX065 (c) 1992 (Japan)
+xmene // GX065 (c) 1992 (Europe)
+xmen2pe // GX065 (c) 1992 (World)
+xmen2pa // GX065 (c) 1992 (Asia)
+xmen2pj // GX065 (c) 1992 (Japan)
+xmen6p // GX065 (c) 1992
+xmen6pu // GX065 (c) 1992
+xexex // GX067 (c) 1991 (World)
+xexexa // GX067 (c) 1991 (AAA)
+xexexj // GX067 (c) 1991 (Japan)
+asterix // GX068 (c) 1992 (World)
+asterixeac // GX068 (c) 1992 (World)
+asterixeaa // GX068 (c) 1992 (World)
+asterixaad // GX068 (c) 1992 (Asia)
+asterixj // GX068 (c) 1992 (Japan)
+gijoe // GX069 (c) 1991 (World)
+gijoea // GX069 (c) 1991 (World)
+gijoeu // GX069 (c) 1991 (US)
+gijoej // GX069 (c) 1991 (Japan)
+thndrx2 // GX073 (c) 1991 (World)
+thndrx2a // GX073 (c) 1991 (Asia)
+thndrx2j // GX073 (c) 1991 (Japan)
+prmrsocr // GX101 (c) 1993 (Europe)
+prmrsocrj // GX101 (c) 1993 (Japan)
+qgakumon // GX248 (c) 1993 (Japan)
+moomesa // GX151 (c) 1992 (World)
+moomesau // GX151 (c) 1992 (US)
+moomesaua // GX151 (c) 1992 (US)
+moomesaa // GX151 (c) 1992 (Asia)
+moomesabl // bootleg
+bucky // GX173 (c) 1992 (World)
+buckyua // GX173 (c) 1992 (US)
+buckyaa // GX173 (c) 1992 (Asia)
+gaiapols // GX123 (c) 1993 (Europe)
+gaiapolsu // GX123 (c) 1993 (US)
+gaiapolsj // GX123 (c) 1993 (Japan)
+mystwarr // GX128 (c) 1993 (World)
+mystwarru // GX128 (c) 1993 (US)
+mystwarrj // GX128 (c) 1993 (Japan)
+mystwarra // GX128 (c) 1993 (Asia)
+viostorm // GX168 (c) 1993 (Europe)
+viostormu // GX168 (c) 1993 (US)
+viostormub // GX168 (c) 1993 (US)
+viostormj // GX168 (c) 1993 (Japan)
+viostorma // GX168 (c) 1993 (Asia)
+viostormab // GX168 (c) 1993 (Asia)
+mmaulers // GX170 (c) 1993 (Europe)
+dadandrn // GX170 (c) 1993 (Japan)
+metamrph // GX224 (c) 1993 (Europe)
+metamrphu // GX224 (c) 1993 (US)
+metamrphj // GX224 (c) 1993 (Japan)
+mtlchamp // GX234 (c) 1993 (World)
+mtlchamp1 // GX234 (c) 1993 (World)
+mtlchampu // GX234 (c) 1993 (US)
+mtlchampj // GX234 (c) 1993 (Japan)
+mtlchampa // GX234 (c) 1993 (Japan)
+rungun // GX247 (c) 1993 (World)
+runguna // GX247 (c) 1993 (World)
+rungunu // GX247 (c) 1993 (US)
+rungunua // GX247 (c) 1993 (US)
+slmdunkj // GX247 (c) 1993 (Japan)
+dbz // (c) 1993 Banpresto
+dbz2 // (c) 1994 Banpresto
+bishi // GX575 (c) 1996 (Japan)
+sbishi // GX675 (c) 1998 (Japan)
+sbishik // GX675 (c) 1998 (Korea)
+
+// Konami dual 68000 games
+overdriv // GX789 (c) 1990
+gradius3 // GX945 (c) 1989 (Japan)
+gradius3a // GX945 (c) 1989 (Asia)
+gradius3e // GX945 (c) 1989 (World?)
+
+// Konami 68020 games
+plygonet // GX305 (c) 1993
+polynetw // GX305 too? (c) 1993
+
+// Konami System GX games
+konamigx
+
+// GX Type 1
+racinfrc // 1994.?? GX250 (Europe)
+racinfrcu // 1994.03 GX250 (US)
+ // 1994.02 (Japan)
+opengolf // 1994.?? GX218 (Europe)
+opengolf2 // 1994.?? GX218 (Europe)
+ggreats2 // 1994.03 GX218 (Japan)
+ // 1995.03 GX218 (US)
+
+// GX Type 2
+le2 // 1994.?? GX312 (Europe)
+le2u // 1994.04 GX312 (US)
+le2j // 1994.06 GX312 (Japan)
+puzldama // 1994.07 GX315 (Japan)
+gokuparo // 1994.04 GX321 (Japan)
+fantjour // 1994.?? GX321 (Euro)
+fantjoura // 1994.?? GX321 (Asia)
+dragoona // 1995.?? GX417 (Asia)
+dragoonj // 1995.08 GX417 (Japan)
+tbyahhoo // 1995.04 GX424 (Japan)
+tkmmpzdm // 1995.12 GX515 (Japan)
+salmndr2 // 1996.01 GX521 (Japan)
+salmndr2a // 1996.?? GX521 (Asia)
+sexyparo // 1996.02 GX533 (Japan)
+sexyparoa // 1996.02 GX533 (Asia)
+daiskiss // 1996.03 GX535 (Japan)
+tokkae // 1996.10 GX615 (Japan)
+winspike // 1997.?? GX705 (Europe)
+winspikej // 1997.07 GX705 (Japan)
+
+// GX Type 3
+soccerss // 1994.?? GX427 (Europe)
+soccerssj // 1994.12 GX427 (Japan)
+soccerssja // 1994.12 GX427 (Japan)
+soccerssa // 1994.?? GX427 (Asia)
+ // 1995.04 GX427 (US)
+
+// GX Type 4
+vsnetscr // 1996.?? GX627 (Europe)
+vsnetscreb // 1996.?? GX627 (Europe)
+vsnetscru // 1996.?? GX627 (US)
+vsnetscra // 1996.?? GX627 (Asia)
+vsnetscrj // 1996.12 GX627 (Japan)
+rungun2 // 1996.03 GX505 (US)
+slamdnk2 // 1996.03 GX505 (Japan)
+rushhero // 1997.10 GX605 (US)
+
+// 68k + HD
+qdrmfgp // 1994.12 GQ460 (Japan)
+qdrmfgp2 // 1995.09 GE557 (Japan)
+
+// 68000-based gambling games
+kingtut
+moneybnk
+
+// DJ Main
+bm1stmix // GQ753 (c) 1997 (Japan)
+bm2ndmix // GX853 (c) 1998 (Japan)
+bm2ndmxa // GX853 (c) 1998 (Japan)
+bm3rdmix // GX853 (c) 1998 (Japan)
+//bm3rdmxb // GX853 (c) 1998 (Japan)
+bmcompmx // GX858 (c) 1999 (Japan)
+hmcompmx // GX858 (c) 1999
+bm4thmix // GX847 (c) 1999 (Japan)
+bm5thmix // GX981 (c) 1999 (Japan)
+bmclubmx // GX993 (c) 2000 (Japan)
+bmcorerm // GXA05 (c) 1999 (Japan)
+bmdct // GX995 (c) 2000 (Japan)
+bmcompm2 // GX988 (c) 2000 (Japan)
+hmcompm2 // GX988 (c) 2000
+bm6thmix // GXA21 (c) 2001 (Japan)
+bm7thmix // GXB07 (c) 2001 (Japan)
+bmfinal // GXC01 (c) 2002 (Japan)
+
+//popn1 // GX803 (c) 1998 (Japan)
+popn2 // GX831 (c) 1998 (Japan)
+//popn3 // GX980 (c) 1999 (Japan)
+//popnstex // GX970 (c) 1999 (Japan)
+
+// Firebeat games
+ppp // GQ977 (c) 2000
+ppd // GQ977 (c) 2000 (Korea)
+ppp11 // GQ977 (c) 2000
+kbm // GQ974 (c) 2000
+kbm2nd // GCA01 (c) 2000
+kbm3rd // GCA12 (c) 2001
+popn5 // GCA04 (c) 2000
+popn7 // not sure, doesn't boot yet (c) 2001
+
+// PowerPC based Konami games
+fiveside // GX479 (c)1995
+thunderh // GX680 (c)1996 Euro EAA
+thunderhu // GX680 (c)1996 USA UAA
+slrasslt // GX792 (c)1996
+gticlub // GX688 (c)1996 Euro EAA
+gticluba // GX688 (c)1996 Asia AAA
+gticlubj // GX688 (c)1996 Japan JAA
+hangplt // GX685 (c)1997
+nbapbp // GX778 (c)1998
+terabrst // GX715 (c)1998 USA UEL 1998/07/17
+terabrsta // GX715 (c)1998 Asia AAA 1998/02/25
+gradius4 // GX837 (c)1999
+sscope // GX830 (c)1999
+sscopea // GX830 (c)1999
+sscopeb // GX830 (c)1999
+sscopec // GX830 (c)1999
+sscope2 // GX931 (c)2000
+racingj // GX676 (c)1998
+racingj2 // GX888 (c)1999 (EAE)
+racingj2j // GX888 (c)1999 (JAE)
+thrilld // GX713 (c)1998 Japan JAE
+thrilldb // GX713 (c)1998 Japan JAB
+thrilldae // GX713 (c)1998 Europe EAA
+midnrun // GX476 (c)1995
+windheat // GX677 (c)1996
+windheatu // GX677 (c)1996
+windheatj // GX677 (c)1996
+waveshrk // GX678 (c)1996
+
+// Konami M2 games
+polystar // GX623 (c)1997
+totlvice // GX639 (c)1997
+totlvicj // GX639 (c)1997
+btltryst // GX636 (c)1998
+heatof11 // GX703 (c)1998
+evilngt // GX810 (c)1998
+evilngte // GX810 (c)1998
+hellngt // GX810 (c)1998
+
+// Exidy games
+carpolo // (c) 1977
+sidetrac // (c) 1979
+targ // (c) 1980
+targc // (c) 1980
+spectar // (c) 1980
+spectar1 // (c) 1980
+rallys // (c) 1980 Novar (bootleg)
+panzer // (c) 1980 Proel (bootleg)
+phantoma // (c) 1980 Jeutel (bootleg)
+phantom // (c) 1980 Proel (bootleg)
+venture // (c) 1981
+venture2 // (c) 1981
+venture4 // (c) 1981
+teetert // (c) 1981
+mtrap // (c) 1981
+mtrap3 // (c) 1981
+mtrap4 // (c) 1981
+pepper2 // (c) 1982
+hardhat // (c) 1982
+fax // (c) 1983
+fax2 // (c) 1983
+circus // no copyright notice [1977?]
+circusse // bootleg
+robotbwl // no copyright notice
+crash // Exidy [1979?]
+smash // bootleg
+ripcord // Exidy [1977?]
+starfire // Exidy [1979?]
+starfirea // Exidy [1979?]
+fireone // (c) 1979 Exidy
+starfir2 // (c) 1979 Exidy
+victory // (c) 1982
+victorba // (c) 1982
+topgunnr // (c) 1986
+
+// Exidy 440 games
+crossbow // (c) 1983
+cheyenne // (c) 1984
+combat // (c) 1985
+catch22 // (c) 1985
+cracksht // (c) 1985
+claypign // (c) 1986
+chiller // (c) 1986
+topsecex // (c) 1986
+hitnmiss // (c) 1987
+hitnmiss2 // (c) 1987
+whodunit // (c) 1988
+showdown // (c) 1988
+yukon // (c) 1989
+yukon1 // (c) 1989
+
+// Exidy Max-A-Flex
+maxaflex
+mf_achas // (c) 1982 Exidy / First Star Software
+mf_brist // (c) 1983 Exidy / First Star Software
+mf_flip // (c) 1983 Exidy / First Star Software
+mf_bdash // (c) 1984 Exidy / First Star Software
+
+// Atari b/w games
+tank8 // ?????? 1976/04 [6800]
+tank8a // ?????? 1976/04 [6800]
+tank8b // ?????? 1976/04 [6800]
+tank8c // ?????? 1976/04 [6800]
+tank8d // ?????? 1976/04 [6800]
+cball // ?????? prototype 1976/?? [6800]
+copsnrob // 005625 1976/07 [6502]
+flyball // 005629 1976/07 [6502]
+sprint2 // 005922 1976/11 [6502]
+sprint2a // 005922 1976/11 [6502]
+sprint4 // 008716 1977/12 [6502]
+sprint4a // 008716 1977/12 [6502]
+nitedrvr // 006321 1976/10 [6502]
+dominos // 007305 1977/01 [6502]
+triplhnt // 008422-008791 1977/04 [6800]
+sprint8 // ?????? 1977/05 [6800]
+sprint8a // ?????? 1977/05 [6800]
+dragrace // 008505-008521 1977/06 [6800]
+poolshrk // 006281 1977/06 [6800]
+starshp1 // 007513-007531 1977/07 [6502]
+starshpp // 007513-007531 1977/07 [6502]
+superbug // 009115-009467 1977/09 [6800]
+canyon // 009493-009504 1977/10 [6502]
+canyonp // 009493-009504 1977/10 [6502]
+destroyr // 030131-030136 1977/10 [6800]
+destroyr1 // 030131-030136 1977/10 [6800]
+catchp // 008837 prototype 1977/?? [6502]
+sprint1 // 006443 1978/01 [6502]
+ultratnk // 009801 1978/02 [6502]
+skyraid // 009709 1978/03 [6502]
+tourtabl // 030170 1978/03 [6507]
+tourtab2 // 030170 1978/03 [6507]
+avalnche // 030574 1978/04 [6502]
+cascade // bootleg
+firetrk // 030926 1978/06 [6808]
+skydiver // 009787 1978/06 [6800]
+// Smokey Joe // 030926 1978/07 [6502]
+sbrkout3 // 033442-033452 1978/09 [6502]
+sbrkout // 033453-033455 1978/09 [6502]
+atarifb // 033xxx 1978/10 [6502]
+atarifb1 // 033xxx 1978/10 [6502]
+orbit // 033689-033702 1978/11 [6800]
+boxer // ?????? prototype 1978 [6502]
+wolfpack // ?????? prototype [6502]
+mgolf // ?????? prototype 1978 [6502]
+videopin // 034253-034267 1979/02 [6502]
+atarifb4 // 034754 1979/04 [6502]
+subs // 033714 1979/05 [6502]
+bsktball // 034756-034766 1979/05 [6502]
+abaseb // 034711-034738 1979/06 [6502]
+abaseb2 // 034711-034738 1979/06 [6502]
+montecar // 035763-035780 1980/04 [6502]
+soccer // 035222-035260 1980/04 [6502]
+
+// Atari "Missile Command hardware" games
+missile // 035820-035825 (c) 1980
+missile2 // 035820-035825 (c) 1980
+suprmatk // (c) 1980 + (c) 1981 Gencomp
+suprmatkd // (c) 1980 + (c) 1981 Gencomp
+mcombat
+mcombata
+
+// Atari vector games
+llander // 0345xx no copyright notice
+llander1 // 0345xx no copyright notice
+asteroid // 035127-035145 (c) 1979
+asteroid2 // 035127-035145 (c) 1979
+asteroid1 // 035127-035145 no copyright notice
+asteroidb // (bootleg)
+asterock // Sidam bootleg (c) 1979
+meteorts // VCC bootleg (c) 1979
+meteorho // Hoei? bootleg (c) 1980
+astdelux // 0351xx (c) 1980
+astdelux2 // 0351xx (c) 1980
+astdelux1 // 0351xx (c) 1980
+bzone // 0364xx (c) 1980
+bzone2 // 0364xx (c) 1980
+bzonec // 0364xx (c) 1980
+bradley // ?? (c) 1980
+redbaron // 036995-037007 (c) 1980
+tempest // 136002 (c) 1980
+tempest1 // 136002 (c) 1980
+tempest2 // 136002 (c) 1980
+tempest3 // 136002 (c) 1980
+temptube // (hack)
+spacduel // 136006 (c) 1980
+gravitar // 136010 (c) 1982
+gravitar2 // 136010 (c) 1982
+gravp // (proto) (c) 1982
+lunarbat // (proto) (c) 1982
+lunarba1 // (proto) (c) 1982
+quantum // 136016 (c) 1982 // made by Gencomp
+quantum1 // 136016 (c) 1982 // made by Gencomp
+quantump // 136016 (c) 1982 // made by Gencomp
+bwidow // 136017 (c) 1982
+starwars // 136021 (c) 1983
+starwars1 // 136021 (c) 1983
+tomcatsw // (proto) (c) 1983
+mhavoc // 136025 (c) 1983
+mhavoc2 // 136025 (c) 1983
+mhavocp // 136025 (c) 1983
+mhavocrv // (hack)
+alphaone // (proto) (c) 1983
+alphaonea // (proto) (c) 1983
+esb // 136031 (c) 1985
+tomcat // (proto) (c) 1985
+
+// Atari "Centipede hardware" games
+warlords // 037153-037159 (c) 1980
+centiped // 136001 (c) 1980
+centiped2 // 136001 (c) 1980
+centtime // 136001 (c) 1980
+centipdb // (bootleg)
+centipdd // hack by Two Bit Score
+caterplr // (bootleg)
+millpac // Valadon
+magworm // (bootleg)
+mazeinv // (proto) (c) 1982
+milliped // 136013 (c) 1982
+millipdd // hack by Two Bit Score
+qwak // (proto) (c) 1982
+runaway // (proto) (c) 1982
+bullsdrt // (c) 1985 Shinkai
+cmmb162
+
+// misc Atari games
+tunhunt // 136000 (c) 1979
+tunhuntc // 136000 (c) 1981 // licensed to / distributed by Centuri
+liberatr // 136012 (c) 1982
+liberatr2 // 136012 (c) 1982
+foodf // 136020 (c) 1982 // made by Gencomp
+foodf2 // 136020 (c) 1982 // made by Gencomp
+foodfc // 136020 (c) 1982 // made by Gencomp
+ccastles // 136022 (c) 1983
+ccastlesg // 136022 (c) 1983
+ccastlesp // 136022 (c) 1983
+ccastlesf // 136022 (c) 1983
+ccastles3 // 136022 (c) 1983
+ccastles2 // 136022 (c) 1983
+ccastles1 // 136022 (c) 1983
+ccastlesj // 136022 (c) 1983
+cloak // 136023 (c) 1983
+cloaksp // 136023 (c) 1983
+cloakfr // 136023 (c) 1983
+cloakgr // 136023 (c) 1983
+agentx4 // 136023 (c) 1983
+agentx3 // 136023 (c) 1983
+agentx2 // 136023 (c) 1983
+agentx1 // 136023 (c) 1983
+cloud9 // (proto) (c) 1983
+firebeas // (proto) (c) 1983
+barbball // (proto) (c) 1983
+firefox // 136026 (c) 1984
+firefoxa // 136026 (c) 1984
+jedi // 136030 (c) 1984
+
+// Atari System 1 games
+atarisy1 // 136033 (c) 1984
+peterpak // 136028 (c) 1984
+// Marble Madness
+marble // 136033 (c) 1984
+marble2 // 136033 (c) 1984
+marble3 // 136033 (c) 1984
+marble4 // 136033 (c) 1984
+marble5 // 136033 (c) 1984 (LSI Cartridge)
+// Indiana Jones and the Temple of Doom
+indytemp // 136036 (c) 1985
+indytemp2 // 136036 (c) 1985
+indytemp3 // 136036 (c) 1985
+indytemp4 // 136036 (c) 1985
+indytempd // 136036 (c) 1985
+indytempc // 136036 (c) 1985
+// Road Runner
+roadrunn // 136040 (c) 1985
+roadrunn2 // 136040 (c) 1985
+roadrunn1 // 136040 (c) 1985
+// Road Blasters
+roadblst // 136048 (c) 1986, 1987
+roadblstg // 136048 (c) 1986, 1987
+roadblst3 // 136048 (c) 1986, 1987
+roadblstg2 // 136048 (c) 1986, 1987
+roadblst2 // 136048 (c) 1986, 1987
+roadblstg1 // 136048 (c) 1986, 1987
+roadblst1 // 136048 (c) 1986, 1987
+roadblstc // 136048 (c) 1986, 1987
+roadblstcg // 136048 (c) 1986, 1987
+roadblstc1 // 136048 (c) 1986, 1987
+
+// Atari System 2 games
+// Paperboy
+paperboy // 136034 (c) 1984
+paperboyr2 // 136034 (c) 1984
+paperboyr1 // 136034 (c) 1984
+// Super Sprint
+ssprint // 136042 (c) 1986
+ssprint3 // 136042 (c) 1986
+ssprint1 // 136042 (c) 1986
+ssprintg // 136042 (c) 1986
+ssprintg1 // 136042 (c) 1986
+ssprintf // 136042 (c) 1986
+ssprints // 136042 (c) 1986
+// Championship Sprint
+csprint // 136045 (c) 1986
+csprint2 // 136045 (c) 1986
+csprint1 // 136045 (c) 1986
+csprintg // 136045 (c) 1986
+csprintg1 // 136045 (c) 1986
+csprintf // 136045 (c) 1986
+csprints // 136045 (c) 1986
+csprints1 // 136045 (c) 1986
+// 720 Degrees
+720 // 136047 (c) 1986
+720r3 // 136047 (c) 1986
+720r2 // 136047 (c) 1986
+720r1 // 136047 (c) 1986
+720g // 136047 (c) 1986
+720gr1 // 136047 (c) 1986
+// APB.
+apb // 136051 (c) 1987
+apb6 // 136051 (c) 1987
+apb5 // 136051 (c) 1987
+apb4 // 136051 (c) 1987
+apb3 // 136051 (c) 1987
+apb2 // 136051 (c) 1987
+apb1 // 136051 (c) 1987
+apbg // 136051 (c) 1987
+apbf // 136051 (c) 1987
+
+// Atari polygon games
+irobot // 136029 (c) 1983
+// Atari System IV
+laststar // (proto) (c) 1984
+airrace // (proto) (c) 1985
+// Hard Drivin'
+harddriv // 136052 (c) 1988
+harddrivb // 136052 (c) 1988
+harddrivg // 136052 (c) 1988
+harddrivj // 136052 (c) 1988
+harddrivb6 // 136052 (c) 1988
+harddrivj6 // 136052 (c) 1988
+harddrivb5 // 136052 (c) 1988
+harddrivg4 // 136052 (c) 1988
+harddriv3 // 136052 (c) 1988
+harddriv2 // 136052 (c) 1988
+harddriv1 // 136052 (c) 1988
+// Hard Drivin' Compact
+harddrivc // 136068 (c) 1990
+harddrivcg // 136068 (c) 1990
+harddrivcb // 136068 (c) 1990
+harddrivc1 // 136068 (c) 1990
+// Stun Runner
+stunrun // 136070 (c) 1989
+stunrunj // 136070 (c) 1989
+stunrun5 // 136070 (c) 1989
+stunrune // 136070 (c) 1989
+stunrun4 // 136070 (c) 1989
+stunrun3 // 136070 (c) 1989
+stunrun3e // 136070 (c) 1989
+stunrun2 // 136070 (c) 1989
+stunrun2e // 136070 (c) 1989
+stunrun0 // 136070 (c) 1989
+stunrunp // (proto) (c) 1989
+// Race Drivin'
+racedriv // 136077 (c) 1990
+racedrivb // 136077 (c) 1990
+racedrivg // 136077 (c) 1990
+racedriv4 // 136077 (c) 1990
+racedrivb4 // 136077 (c) 1990
+racedrivg4 // 136077 (c) 1990
+racedriv3 // 136077 (c) 1990
+racedriv2 // 136077 (c) 1990
+racedriv1 // 136077 (c) 1990
+racedrivb1 // 136077 (c) 1990
+racedrivg1 // 136077 (c) 1990
+// Race Drivin' Compact
+racedrivc // 136077 (c) 1990
+racedrivcb // 136077 (c) 1990
+racedrivcg // 136077 (c) 1990
+racedrivc4 // 136077 (c) 1990
+racedrivcb4 // 136077 (c) 1990
+racedrivcg4 // 136077 (c) 1990
+racedrivc2 // 136077 (c) 1990
+racedrivc1 // 136077 (c) 1990
+// Race Drivin' Panorama
+racedrivpan // 136077 (c) 1990
+ // 136086 - BMX Heat (proto)
+// Steel Talons
+steeltal // 136087 (c) 1990
+steeltalg // 136087 (c) 1990
+steeltal1 // 136087 (c) 1990
+steeltalp // 136087 (c) 1990
+ // 136088 - Race Drivin' Panorama
+// Street Drivin'
+strtdriv // 136091 (proto)
+// Hard Drivin' Airbourne
+hdrivair // 136098 (proto)
+hdrivairp // 136098 (proto)
+
+// later Atari games
+
+// Gauntlet Hardware
+// Gauntlet
+gauntlet // 136037 (c) 1985
+gauntlets // 136037 (c) 1985
+gauntletj // 136037 (c) 1985
+gauntletg // 136037 (c) 1985
+gauntletj12 // 136037 (c) 1985
+gauntletr9 // 136037 (c) 1985
+gauntletgr8 // 136037 (c) 1985
+gauntletr7 // 136037 (c) 1985
+gauntletgr6 // 136037 (c) 1985
+gauntletr5 // 136037 (c) 1985
+gauntletr4 // 136037 (c) 1985
+gauntletgr3 // 136037 (c) 1985
+gauntletr2 // 136037 (c) 1985
+gauntletr1 // 136037 (c) 1985
+// Gauntlet - 2 Player
+gauntlet2p // 136037 (c) 1985
+gauntlet2pj // 136037 (c) 1985
+gauntlet2pg // 136037 (c) 1985
+gauntlet2pr3 // 136037 (c) 1985
+gauntlet2pj2 // 136037 (c) 1985
+gauntlet2pg1 // 136037 (c) 1985
+// Gauntlet 2
+gaunt2 // 136043 (c) 1986
+gaunt2g // 136043 (c) 1986
+// Gauntlet 2 - 2 Player
+gaunt22p // 136043 (c) 1986
+gaunt22p1 // 136043 (c) 1986
+gaunt22pg // 136043 (c) 1986
+// Vindicators Part II
+vindctr2 // 136059 (c) 1988
+vindctr2r2 // 136059 (c) 1988
+vindctr2r1 // 136059 (c) 1988
+
+// Other Hardware
+
+// Xybots
+xybots // 136054 (c) 1987
+xybotsg // 136054 (c) 1987
+xybotsf // 136054 (c) 1987
+xybots1 // 136054 (c) 1987
+xybots0 // 136054 (c) 1987
+// Blasteroids
+blstroid // 136057 (c) 1987
+blstroid3 // 136057 (c) 1987
+blstroid2 // 136057 (c) 1987
+blstroidg // 136057 (c) 1987
+blstroidh // (proto) (c) 1987
+// Vindicators
+vindictr // 136059 (c) 1988
+vindictre // 136059 (c) 1988
+vindictrg // 136059 (c) 1988
+vindictre4 // 136059 (c) 1988
+vindictr4 // 136059 (c) 1988
+vindictre3 // 136059 (c) 1988
+vindictr2 // 136059 (c) 1988
+vindictr1 // 136059 (c) 1988
+// Toobin
+toobin // 136061 (c) 1988
+toobine // 136061 (c) 1988
+toobing // 136061 (c) 1988
+toobin2 // 136061 (c) 1988
+toobin2e // 136061 (c) 1988
+toobin1 // 136061 (c) 1988
+// Cyberball
+cyberbal // 136064 (c) 1989
+cyberbal2 // 136064 (c) 1989
+cyberbalp // 136064 (c) 1989
+// Atari Tetris
+atetrisc // 136066 (c) 1989
+atetrisc2 // 136066 (c) 1989
+atetris // 136066 (c) 1988
+atetrisa // 136066 (c) 1988
+atetrisb // (bootleg)
+atetrisb2 // (bootleg)
+// Escape from the Planet of Robot Monsters
+eprom // 136069 (c) 1989
+eprom2 // 136069 (c) 1989
+guts // prototype
+// Cyberball 2 Player
+cyberbal2p // 136071 (c) 1989
+cyberbal2p3 // 136071 (c) 1989
+cyberbal2p2 // 136071 (c) 1989
+cyberbal2p1 // 136071 (c) 1989
+// Skull and Crossbones
+skullxbo // 136072 (c) 1989
+skullxbo4 // 136072 (c) 1989
+skullxbo3 // 136072 (c) 1989
+skullxbo2 // 136072 (c) 1989
+skullxbo1 // 136072 (c) 1989
+// Cyberball Tournament
+cyberbalt // 136073 (c) 1989
+cyberbalt1 // 136073 (c) 1989
+
+badlands // 136074 (c) 1989
+badlandsb // bootleg
+klax // 136075 (c) 1989
+klax2 // 136075 (c) 1989
+klax3 // 136075 (c) 1989
+klaxj // 136075 (c) 1989 (Japan)
+klaxd // 136075 (c) 1989 (Germany)
+klaxp1 // prototype
+klaxp2 // prototype
+thunderj // 136076 (c) 1990
+
+hydra // 136079 (c) 1990
+hydrap // (proto) (c) 1990
+hydrap2 // (proto) (c) 1990
+pitfight // 136081 (c) 1990
+pitfight7 // 136081 (c) 1990
+pitfight6 // 136081 (c) 1990
+pitfight5 // 136081 (c) 1990
+pitfight4 // 136081 (c) 1990
+pitfight3 // 136081 (c) 1990
+pitfightj // Japan
+pitfightb // bootleg
+rampart // 136082 (c) 1990
+rampart2p // 136082 (c) 1990
+rampartj // 136082 (c) 1990 (Japan)
+shuuz // 136083 (c) 1990
+shuuz2 // 136083 (c) 1990
+ // 136084 - Marble Man (proto)
+batman // 136085 (c) 1991
+roadriot // 136089 (c) 1991
+roadrioto // 136089 (c) 1991
+offtwall // 136090 (c) 1991
+offtwallc // 136090 (c) 1991
+guardian // 136092 (c) 1992
+relief // 136093 (c) 1992
+relief2 // 136093 (c) 1992
+relief3 // 136093 (c) 1992
+arcadecl // (proto) (c) 1992
+sparkz // (proto) (c) 1992
+motofren // 136094 (c) 1992
+motofrenmd // 136094 (c) 1992
+motofrenft // 136094 (c) 1992
+motofrenmf // 136094 (c) 1992
+spclords // 136095 (c) 1992
+spclordsb // 136095 (c) 1992
+spclordsa // 136095 (c) 1992
+spclordsg // 136095 (c) 1992
+rrreveng // ?? (c) 1993
+rrrevenga // ?? (c) 1993
+rrrevengb // ?? (c) 1993
+beathead // (proto) (c) 1993
+tmek // 136100 (c) 1994
+tmek51p // 136100 (c) 1994
+tmek45 // 136100 (c) 1994
+tmek44 // 136100 (c) 1994
+tmek20 // 136100 (c) 1994
+primrage // 136102 (c) 1994
+primrage20 // 136102 (c) 1994
+metalmx // 136103? (c) 1994
+area51 // 136105 (c) 1995
+area51t // 136105 (c) 1995
+area51a // 136105 (c) 1995
+fishfren // (proto) (c) 1995
+freezeat // (proto) (c) 1996
+freezeatjp // (proto) (c) 1996
+freezeat2 // (proto) (c) 1996
+freezeat3 // (proto) (c) 1996
+freezeat4 // (proto) (c) 1996
+freezeat5 // (proto) (c) 1996
+freezeat6 // (proto) (c) 1996
+area51mx // 136105 (c) 1998
+a51mxr3k // ?? (c) 1998
+maxforce // ?? (c) 1996
+maxf_102 // ?? (c) 1996
+maxf_ng // ?? (c) 1996
+vcircle // (proto) (c) 1996
+a51site4 // ?? (c) 1998
+
+// SNK / Rock-ola games
+sasuke // [1980] Shin Nihon Kikaku (SNK)
+satansat // (c) 1981 SNK
+satansata // (c) 1981 SNK
+zarzon // (c) 1981 Taito, gameplay says SNK
+vanguard // (c) 1981 SNK
+vanguardc // (c) 1981 SNK + Centuri
+vanguardj // (c) 1981 SNK
+fantasy // (c) 1981 SNK
+fantasyu // (c) 1981 Rock-Ola
+fantasyj // (c) 1981 SNK
+pballoon // (c) 1982 SNK
+pballoonr // (c) 1982 SNK (Rock-Ola license)
+nibbler // (c) 1982 Rock-ola
+nibblera // (c) 1982 Rock-ola
+nibblerb // (c) 1982 Rock-ola
+nibblero // (c) 1982 Olympia
+
+// later SNK games, each game can be identified by PCB code and ROM
+// code, the ROM code is the same between versions, and usually based
+// upon the Japanese title.
+lasso // 'WM' (c) 1982
+chameleo // (c) 1983 Jaleco
+wwjgtin // (c) 1984 Jaleco / Casio
+photof // (c) 1984 Jaleco / Casio
+pinbo // (c) 1984 Jaleco
+pinboa // (c) 1984 Jaleco
+pinbos // (c) 1985 Strike
+joyfulr // A2001 (c) 1983
+mnchmobl // A2001 (c) 1983 + Centuri license
+marvins // A2003 (c) 1983
+madcrash // A2005 (c) 1984
+madcrush // A2005 (c) 1984
+vangrd2 // A2005 (c) 1984
+mainsnk // (c) 1984
+canvas // A3008 (c) 1985
+jcross // A3006 (c) 1984
+sgladiat // A3006 (c) 1984
+hal21 // A4031 (c) 1985
+hal21j // (c) 1985 (Japan)
+aso // (c) 1985
+alphamis // (c) 1985
+arian // (c) 1985
+tnk3 // A5001 (c) 1985
+tnk3j // A5001 (c) 1985
+athena // 'UP' (c) 1986
+fitegolf // 'GU' (c) 1988
+fitegolfu // 'GU' (c) 1988
+countryc // A7004 'CC' (c) 1988
+ikari // A5004 'IW' (c) 1986
+ikaria // A5004 'IW' (c) 1986
+ikarinc // A5004 'IW' (c) 1986
+ikarijp // A5004 'IW' (c) 1986 (Japan)
+ikarijpb // bootleg
+victroad // A6002 (c) 1986
+dogosoke // A6002 (c) 1986
+dogosokb // bootleg
+gwar // A7003 'GV' (c) 1987
+gwarj // A7003 'GV' (c) 1987 (Japan)
+gwara // A7003 'GV' (c) 1987
+gwarb // bootleg
+bermudat // (c) 1987
+bermudatj // (c) 1987
+bermudata // A6004 'WW' (c) 1987
+worldwar // A6004 'WW' (c) 1987
+psychos // 'PS' (c) 1987
+psychosj // 'PS' (c) 1987 (Japan)
+chopper // A7003 'KK' (c) 1988
+choppera // A7003 'KK' (c) 1988
+chopperb // A7003 'KK' (c) 1988
+legofair // A7003 'KK' (c) 1988
+fsoccer // A6006 'FS' (c) 1988
+fsoccerj // A6006 'FS' (c) 1988
+fsoccerb // (c) 1988
+tdfever // A6006 'TD' (c) 1987
+tdfeverj // A6006 'TD' (c) 1987
+tdfever2 // A6006 'TD'?(c) 1988
+ikari3 // A7007 'IK3'(c) 1989
+ikari3nr // A7007 'IK3'(c) 1989
+pow // A7008 'DG' (c) 1988
+powj // A7008 'DG' (c) 1988
+searchar // A8007 'BH' (c) 1989
+searcharu // A8007 'BH' (c) 1989
+searcharj // A8007 'BH' (c) 1989
+streetsm // A8007 'S2' (c) 1989
+streetsm1 // A7008 'S2' (c) 1989
+streetsmw // (c) 1989
+streetsmj // A8007 'S2' (c) 1989
+prehisle // A8003 'GT' (c) 1989
+prehisleu // A8003 'GT' (c) 1989
+prehislek // A8003 'GT' (c) 1989
+gensitou // A8003 'GT' (c) 1989
+mechatt // A8002 'MA' (c) 1989
+mechattu // A8002 'MA' (c) 1989
+bbusters // A9003 'BB' (c) 1989
+bbustersu // A9003 'BB' (c) 1989
+
+// Electrocoin on early SNK hardware
+dmndrby // G4001 'DD' (c) 1986
+dmndrbya // G4001 'DD' (c) 1986
+
+// Neo Geo games
+// the four digits number is the game ID stored at address 0x0108 of the program ROM
+// info on prototypes taken from http://www.members.tripod.com/fresa/proto/puzzle.htm
+neogeo
+nam1975 // 0001 (c) 1990 SNK
+bstars // 0002 (c) 1990 SNK
+bstarsh // 0002 (c) 1990 SNK
+tpgolf // 0003 (c) 1990 SNK
+mahretsu // 0004 (c) 1990 SNK
+maglord // 0005 (c) 1990 Alpha Denshi Co.
+maglordh // 0005 (c) 1990 Alpha Denshi Co.
+ridhero // 0006 (c) 1990 SNK
+ridheroh // 0006 (c) 1990 SNK
+alpham2 // 0007 (c) 1991 SNK
+ // 0008 Sunshine (prototype) 1990 SNK
+ncombat // 0009 (c) 1990 Alpha Denshi Co.
+ncombath // 0009 (c) 1990 Alpha Denshi Co.
+cyberlip // 0010 (c) 1990 SNK
+superspy // 0011 (c) 1990 SNK
+ // 0012
+ // 0013
+mutnat // 0014 (c) 1992 SNK
+ // 0015
+kotm // 0016 (c) 1991 SNK
+kotmh // 0016 (c) 1991 SNK
+sengoku // 0017 (c) 1991 SNK
+sengokuh // 0017 (c) 1991 SNK
+burningf // 0018 (c) 1991 SNK
+burningfh // 0018 (c) 1991 SNK
+lbowling // 0019 (c) 1990 SNK
+gpilots // 0020 (c) 1991 SNK
+gpilotsh // 0020 (c) 1991 SNK
+joyjoy // 0021 (c) 1990 SNK
+bjourney // 0022 (c) 1990 Alpha Denshi Co.
+quizdais // 0023 (c) 1991 SNK
+quizdaisk // 0123 (c) 1991 SNK
+lresort // 0024 (c) 1992 SNK
+eightman // 0025 (c) 1991 SNK / Pallas
+ // 0026 Fun Fun Brothers (prototype) 1991 Alpha
+minasan // 0027 (c) 1990 Monolith Corp.
+ // 0028 Dunk Star (prototype) Sammy
+legendos // 0029 (c) 1991 SNK
+2020bb // 0030 (c) 1991 SNK / Pallas
+2020bba // 0030 (c) 1991 SNK / Pallas
+2020bbh // 0030 (c) 1991 SNK / Pallas
+socbrawl // 0031 (c) 1991 SNK
+socbrawlh // 0031 (c) 1991 SNK
+roboarmy // 0032 (c) 1991 SNK
+fatfury1 // 0033 (c) 1991 SNK
+fbfrenzy // 0034 (c) 1992 SNK
+ // 0035 Mystic Wand (prototype) 1991 Alpha
+bakatono // 0036 (c) 1991 Monolith Corp.
+crsword // 0037 (c) 1991 Alpha Denshi Co.
+trally // 0038 (c) 1991 Alpha Denshi Co.
+kotm2 // 0039 (c) 1992 SNK
+sengoku2 // 0040 (c) 1993 SNK
+bstars2 // 0041 (c) 1992 SNK
+quizdai2 // 0042 (c) 1992 SNK
+3countb // 0043 (c) 1993 SNK
+aof // 0044 (c) 1992 SNK
+samsho // 0045 (c) 1993 SNK
+samshoh // 0045 (c) 1993 SNK
+tophuntr // 0046 (c) 1994 SNK
+tophuntrh // 0046 (c) 1994 SNK
+fatfury2 // 0047 (c) 1992 SNK
+janshin // 0048 (c) 1994 Aicom
+androdun // 0049 (c) 1992 Visco
+ncommand // 0050 (c) 1992 Alpha Denshi Co.
+viewpoin // 0051 (c) 1992 Sammy
+ssideki // 0052 (c) 1992 SNK
+wh1 // 0053 (c) 1992 Alpha Denshi Co.
+wh1h // 0053 (c) 1992 Alpha Denshi Co.
+wh1ha // 0053 (c) 1992 Alpha Denshi Co.
+ // 0054 Crossed Swords 2 (CD only? not confirmed, MVS might exist)
+kof94 // 0055 (c) 1994 SNK
+aof2 // 0056 (c) 1994 SNK
+aof2a // 0056 (c) 1994 SNK
+wh2 // 0057 (c) 1993 ADK
+fatfursp // 0058 (c) 1993 SNK
+fatfurspa // 0058 (c) 1993 SNK
+savagere // 0059 (c) 1995 SNK
+fightfev // 0060 (c) 1994 Viccom
+fightfeva // 0060 (c) 1994 Viccom
+ssideki2 // 0061 (c) 1994 SNK
+spinmast // 0062 (c) 1993 Data East Corporation
+samsho2 // 0063 (c) 1994 SNK
+samsho2k // 0063 (c) 1994 SNK (Korean hack)
+wh2j // 0064 (c) 1994 ADK / SNK
+wjammers // 0065 (c) 1994 Data East Corporation
+karnovr // 0066 (c) 1994 Data East Corporation
+gururin // 0067 (c) 1994 Face
+pspikes2 // 0068 (c) 1994 Video System Co.
+ // Super Volley '94 was once released in Mar.1994, and recalled. Then released as Power Spikes 2 (with some tweaks).
+fatfury3 // 0069 (c) 1995 SNK
+zupapa // 0070 Zupapa - released in 2001, 1994 prototype probably exists
+ // 0071 Bang Bang Busters (prototype) 1994 Visco
+ // 0072 Last Odyssey Pinball Fantasia (prototype) 1995 Monolith
+panicbom // 0073 (c) 1994 Eighting / Hudson
+aodk // 0074 (c) 1994 ADK / SNK
+sonicwi2 // 0075 (c) 1994 Video System Co.
+zedblade // 0076 (c) 1994 NMK
+ // 0077 The Warlocks of the Fates (prototype) 1995 Astec
+galaxyfg // 0078 (c) 1995 Sunsoft
+strhoop // 0079 (c) 1994 Data East Corporation
+quizkof // 0080 (c) 1995 Saurus
+quizkofk // 0080 (c) 1995 Saurus
+ssideki3 // 0081 (c) 1995 SNK
+doubledr // 0082 (c) 1995 Technos
+pbobblen // 0083 (c) 1994 Taito
+pbobblenb // bootleg
+kof95 // 0084 (c) 1995 SNK
+kof95h // 0084 (c) 1995 SNK
+ // 0085 Shinsetsu Samurai Spirits Bushidoretsuden / Samurai Shodown RPG (CD only)
+tws96 // 0086 (c) 1996 Tecmo
+samsho3 // 0087 (c) 1995 SNK
+samsho3h // 0087 (c) 1995 SNK
+fswords // 0187 Korean hack of samsho3
+stakwin // 0088 (c) 1995 Saurus
+pulstar // 0089 (c) 1995 Aicom
+whp // 0090 (c) 1995 ADK / SNK
+ // 0091
+kabukikl // 0092 (c) 1995 Hudson
+neobombe // 0093 (c) 1997 Hudson
+gowcaizr // 0094 (c) 1995 Technos
+rbff1 // 0095 (c) 1995 SNK
+rbff1a // 0095 (c) 1995 SNK
+aof3 // 0096 (c) 1996 SNK
+aof3k // 0196 Censored Korean release of aof3
+sonicwi3 // 0097 (c) 1995 Video System Co.
+ // 0098 Idol Mahjong - final romance 2 (CD only? not confirmed, MVS might exist)
+ // 0099 Neo Pool Masters
+turfmast // 0200 (c) 1996 Nazca
+mslug // 0201 (c) 1996 Nazca
+puzzledp // 0202 (c) 1995 Taito (Visco license)
+mosyougi // 0203 (c) 1995 ADK / SNK
+ // 0204 QP (prototype)
+ // 0205 Neo-Geo CD Special (CD only)
+marukodq // 0206 (c) 1995 Takara
+neomrdo // 0207 (c) 1996 Visco
+sdodgeb // 0208 (c) 1996 Technos
+goalx3 // 0209 (c) 1995 Visco
+ // 0210 Karate Ninja Sho (prototype) 1995 Yumekobo
+ // 0211 Oshidashi Zintrick (CD only? not confirmed, MVS might exist) 1996 SNK/ADK
+zintrckb // 0211 hack - this is not a genuine MVS proto, its a bootleg made from the CD version
+overtop // 0212 (c) 1996 ADK
+neodrift // 0213 (c) 1996 Visco
+kof96 // 0214 (c) 1996 SNK
+kof96h // 0214 (c) 1996 SNK
+ssideki4 // 0215 (c) 1996 SNK
+kizuna // 0216 (c) 1996 SNK
+ // Fu-un Super Tag Battle Special Version (4-player battle available) exists
+ninjamas // 0217 (c) 1996 ADK / SNK
+ragnagrd // 0218 (c) 1996 Saurus
+pgoal // 0219 (c) 1996 Saurus
+ // 0220 (c) 1996 Saurus - Choutetsu Brikin'ger - Iron clad (undumped protoype)
+magdrop2 // 0221 (c) 1996 Data East Corporation
+samsho4 // 0222 (c) 1996 SNK
+samsho4k // Censored Korean release of samsho4
+rbffspec // 0223 (c) 1996 SNK
+rbffspeck // 0124 (c) 1996 SNK
+twinspri // 0224 (c) 1996 ADK
+wakuwak7 // 0225 (c) 1996 Sunsoft
+ // 0226 Pair Pair Wars (prototype) 1996 Sunsoft?
+stakwin2 // 0227 (c) 1996 Saurus
+ghostlop // 0228 GhostLop (prototype) 1996? Data East
+ // 0229 King of Fighters '96 CD Collection (CD only)
+breakers // 0230 (c) 1996 Visco
+miexchng // 0231 (c) 1997 Face
+kof97 // 0232 (c) 1997 SNK
+kof97h // 0232 (c) 1997 SNK
+kof97pls // bootleg of kof97
+kog // bootleg of kof97
+magdrop3 // 0233 (c) 1997 Data East Corporation
+lastblad // 0234 (c) 1997 SNK
+lastbladh // 0234 (c) 1997 SNK
+lastsold // 0196 Censored Korean release of lastblad
+puzzldpr // 0235 (c) 1997 Taito (Visco license)
+irrmaze // 0236 (c) 1997 SNK / Saurus
+popbounc // 0237 (c) 1997 Video System Co.
+shocktro // 0238 (c) 1997 Saurus
+shocktroa // 0238 (c) 1997 Saurus
+blazstar // 0239 (c) 1998 Yumekobo
+rbff2 // 0240 (c) 1998 SNK
+rbff2h // 0240 (c) 1998 SNK
+rbff2k // 0140 Censored Korean release of rbff2
+mslug2 // 0241 (c) 1998 SNK
+kof98 // 0242 (c) 1998 SNK
+kof98k // 0242 (c) 1998 SNK
+kof98ka // 0242 (c) 1998 SNK
+kof98h // 0242 (c) 1998 SNK
+lastbld2 // 0243 (c) 1998 SNK
+neocup98 // 0244 (c) 1998 SNK
+breakrev // 0245 (c) 1998 Visco
+shocktr2 // 0246 (c) 1998 Saurus
+lans2004 // bootleg of shocktr2
+flipshot // 0247 (c) 1998 Visco
+pbobbl2n // 0248 (c) 1999 Taito (SNK license)
+ctomaday // 0249 (c) 1999 Visco
+mslugx // 0250 (c) 1999 SNK
+kof99 // 0251 (c) 1999 SNK
+kof99h // 0251 (c) 1999 SNK
+kof99e // 0251 (c) 1999 SNK
+kof99k // 0152 (c) 1999 SNK
+kof99p // 0251 (c) 1999 SNK
+ganryu // 0252 (c) 1999 Visco
+garou // 0253 (c) 1999 SNK
+garouo // 0253 (c) 1999 SNK
+garoup // 0253 (c) 1999 SNK
+garoubl // bootleg
+s1945p // 0254 (c) 1999 Psikyo
+preisle2 // 0255 (c) 1999 Yumekobo
+mslug3 // 0256 (c) 2000 SNK
+mslug3h // 0256 (c) 2000 SNK
+mslug3b6 // bootleg
+kof2000 // 0257 (c) 2000 SNK
+kof2000n // 0257 (c) 2000 SNK
+ // 0258 SNK vs. Capcom?
+bangbead // 0259 (c) 2000 Visco
+nitd // 0260 (c) 2000 Eleven / Gavaking
+nitdbl // bootleg
+sengoku3 // 0261 (c) 2001 Noise Factory / SNK
+kof2001 // 0262 (c) 2001 Eolith / SNK
+kof2001h // 0262 (c) 2001 Eolith / SNK
+cthd2003 // bootleg of kof2001
+ct2k3sp // bootleg of kof2001
+ct2k3sa // bootleg of kof2001
+mslug4 // 0263 (c) 2002 Mega Enterprise
+mslug4h // 0263 (c) 2002 Mega Enterprise
+ms4plus // bootleg
+rotd // 0264 (c) 2002 Evoga
+kof2002 // 0265 (c) 2002 Eolith / Playmore
+kof2002b // bootleg
+kf2k2pls // bootleg
+kf2k2pla // bootleg
+kf2k2mp // bootleg
+kf2k2mp2 // bootleg
+kof10th // bootleg of kof2002
+kf2k5uni // bootleg of kof2002
+kf10thep // bootleg of kof2002
+kof2k4se // bootleg of kof2002
+matrim // 0266 (c) 2002 Atlus
+matrimbl // bootleg
+pnyaa // 0267 (c) 2003 Aiky / Taito
+ms5pcb // 0268 (c) 2003 Playmore
+mslug5 // 0268 (c) 2003 Playmore
+mslug5h // 0268 (c) 2003 Playmore
+ms5plus // bootleg
+svcpcb // 0269 (c) 2003 Playmore / Capcom - JAMMA PCB
+svcpcba // 0269 (c) 2003 Playmore / Capcom - JAMMA PCB
+svc // 0269 (c) 2003 Playmore / Capcom
+svcboot // bootleg
+svcplus // bootleg
+svcplusa // bootleg
+svcsplus // bootleg
+samsho5 // 0270 (c) 2003 Playmore
+samsho5h // 0270 (c) 2003 Playmore
+samsho5b // bootleg
+kf2k3pcb // 0271 (c) 2003 Playmore - JAMMA PCB
+kof2003 // 0271 (c) 2003 Playmore
+kof2003h // 0271 (c) 2003 Playmore
+kf2k3bl // bootleg
+kf2k3bla // bootleg
+kf2k3pl // bootleg
+kf2k3upl // bootleg
+samsh5sp // 0272 (c) 2004 Playmore
+samsh5sph // 0272 (c) 2004 Playmore
+samsh5spn // 0272 (c) 2004 Playmore
+
+// The BrezzaSoft games don't have proper ID codes
+jockeygp
+jockeygpa
+vliner
+vlinero
+
+// Nor does Digger Man
+diggerma // No Game ID (unlicensed), (c) 2000 Kyle Hodgetts, prototype
+
+// Hyper NeoGeo 64 uses a 3 digit rom code?
+
+hng64
+roadedge // 001 1997/09/10 Roads Edge / Round Trip RV
+sams64 // 002 1997/12/19 Samurai Shodown 64 / Samurai Spirits 64
+xrally // 003 1998/05/13 Xtreme Rally / Off Beat Racer!
+bbust2 // 004 1998/09/11 Beast Busters: Second Nightmare
+sams64_2 // 005 1998/10/16 Samurai Shodown: Warrior's Rage / Samurai Spirits: Asura Zanmaden
+fatfurwa // 006 1999/01/28 Fatal Fury: Wild Ambition / Garou Densetsu: Wild Ambition
+buriki // 007 1999/05/21 Buriki One
+
+// Neo Print
+npcartv1
+98best44
+nprsp
+
+// Alpha Denshi games
+shougi // (c) 1982 (Arcade TV Game List - P.80, Left, 9 from top)
+shougi2 // (c) 1982 (Arcade TV Game List - P.80, Left, 10 from top)
+champbas // (c) 1983 Sega
+champbasj // (c) 1983 Alpha Denshi Co.
+champbasja // (c) 1983 Alpha Denshi Co.
+champbb2 // (c) 1983 Sega
+champbb2a // (c) 1983 ?
+champbb2j // (c) 1983 ?
+exctsccr // (c) 1983 Alpha Denshi Co.
+exctsccra // (c) 1983 Alpha Denshi Co.
+exctsccrj // (c) 1983 Alpha Denshi Co.
+exctsccrj2 // (c) 1983 Alpha Denshi Co.
+exctsccrb // bootleg
+exctscc2 // (c) 1984 Alpha Denshi Co.
+talbot // Volt Electronics
+equites // (c) 1984 Alpha Denshi Co.
+equitess // (c) 1984 Alpha Denshi Co./Sega
+gekisou // (c) 1985 Eastern
+bullfgtr // (c) 1984 Alpha Denshi Co.
+bullfgtrs // (c) 1984 Alpha Denshi Co./Sega
+kouyakyu // (c) 1985 Alpha Denshi Co.
+splndrbt // (c) 1985 Alpha Denshi Co.
+hvoltage // (c) 1985 Alpha Denshi Co.
+
+// SNK / Alpha 68K games
+sstingry // (c) 1986 Alpha Denshi Co.
+kyros // (c) 1987 World Games
+kyrosj // (c) 1986 Alpha Denshi Co.
+jongbou // (c) 1987 SNK
+paddlema // Alpha-68K96I 'PM' (c) 1988 SNK
+timesold // Alpha-68K96II 'BT' (c) 1987 SNK / Romstar
+timesold1 // Alpha-68K96II 'BT' (c) 1987
+btlfield // Alpha-68K96II 'BT' (c) 1987
+btlfieldb // bootleg
+skysoldr // Alpha-68K96II 'SS' (c) 1988 SNK (Romstar with dip switch)
+goldmedl // Alpha-68K96II 'GM' (c) 1988 SNK
+goldmedla // Alpha-68K96II 'GM' (c) 1988 SNK
+goldmedlb // Alpha-68K96II bootleg
+skyadvnt // Alpha-68K96V 'SA' (c) 1989 Alpha Denshi Co.
+skyadvntu // Alpha-68K96V 'SA' (c) 1989 SNK of America licensed from Alpha
+skyadvntj // Alpha-68K96V 'SA' (c) 1989 Alpha Denshi Co.
+gangwars // Alpha-68K96V (c) 1989 Alpha Denshi Co.
+gangwarsu // Alpha-68K96V (c) 1989 Alpha Denshi Co.
+sbasebal // Alpha-68K96V (c) 1989 SNK of America licensed from Alpha
+tnextspc // A8003 'NS' (c) 1989
+tnextspcj // A8003 'NS' (c) 1989
+
+meijinsn // (c) 1986 SNK
+
+// Technos games
+scregg // TA-0001 (c) 1983
+eggs // TA-0002 (c) 1983 Universal USA
+dommy // TA-00?? (c) 1983 (Arcade TV Game List - P.90, Left, 13 from top)
+bigprowr // TA-0007 (c) 1983
+tagteam // TA-0007 (c) 1983 + Data East license
+ssozumo // TA-0008 (c) 1984
+mystston // TA-0010 (c) 1984
+myststono // TA-0010 (c) 1984
+dogfgt // TA-0011 (c) 1984
+dogfgtu // TA-0011 (c) 1985 Data East USA, Inc.
+dogfgtj // TA-0011 (c) 1984
+bogeyman // -0204-0 (Data East part number) (c) 1985 (Arcade TV Game List - P.96, Right, 8 from top)
+matmania // TA-0015 (c) 1985 + Taito America license
+excthour // TA-0015 (c) 1985 + Taito license
+maniach // TA-0017 (c) 1986 + Taito America license
+maniach2 // TA-0017 (c) 1986 + Taito America license
+renegade // TA-0018 (c) 1986 + Taito America license
+kuniokun // TA-0018 (c) 1986
+kuniokunb // bootleg
+xsleena // TA-0019 (c) 1986
+xsleenab // bootleg
+solarwar // TA-0019 (c) 1986 Taito + Memetron license
+battlane // -0215, -0216 (Data East part number) (c) 1986 + Taito license
+battlane2 // -0215, -0216 (Data East part number) (c) 1986 + Taito license
+battlane3 // -0215, -0216 (Data East part number) (c) 1986 + Taito license
+ddragon // TA-0021 (c) 1987
+ddragonu // TA-0021 (c) 1987 Taito America
+ddragonua // TA-0021 (c) 1987 Taito America
+ddragonub // TA-0021 (c) 1987 Taito America
+ddragonw // TA-0021 (c) 1987 Taito
+ddragonw1 // TA-0021 (c) 1987 Taito
+ddragonb // bootleg
+ddragonba // bootleg
+ddragon6809 // bootleg
+ddragon6809a // bootleg
+ddragonb2 // bootleg
+spdodgeb // TA-0022 (c) 1987
+nkdodge // TA-0022 (c) 1987 (Japan)
+nkdodgeb // TA-0022 (c) 1987 (Japan)
+chinagat // TA-0023 (c) 1988 Taito + Romstar license (US)
+saiyugou // TA-0023 (c) 1988 (Japan)
+saiyugoub1 // bootleg
+saiyugoub2 // bootleg
+wwfsstar // TA-0024 (c) 1989 (Europe)
+wwfsstara // TA-0024 (c) 1989 (US, newer)
+wwfsstaru // TA-0024 (c) 1989 (US)
+wwfsstarj // TA-0024 (c) 1989 (Japan)
+vball // TA-0025 (c) 1988 (US)
+vball2pj // TA-0025 (c) 1988 (Japan)
+vballb // TA-0025 (c) 1988
+ddragon2 // TA-0026 (c) 1988 (World)
+ddragon2u // TA-0026 (c) 1988 (US)
+toffy // (c) 1993 Midas
+stoffy // (c) 1994 Midas + Unico
+ddungeon // Game Room
+ddungeone // East Coast Coin Company (Melbourne)
+darktowr // Game Room
+tstrike // East Coast Coin Company (Melbourne)
+tstrikea // Game Room
+ctribe // TA-0028 (c) 1990 (US)
+ctribe1 // TA-0028 (c) 1990 (US) - Set 1?
+ctribej // TA-0028 (c) 1990 (Japan)
+ctribeb // bootleg
+ctribeb2 // bootleg
+blockout // TA-0029 (c) 1989 + California Dreams
+blockout2 // TA-0029 (c) 1989 + California Dreams
+blockoutj // TA-0029 (c) 1989 + California Dreams (Japan)
+agress // TA-0029 (c) 1991 Palco
+agressb // TA-0029 (c) 1991 Palco
+ddragon3 // TA-0030 (c) 1990
+ddragon3p // TA-0030 (c) 1990
+ddragon3j // TA-0030 (c) 1990 (Japan)
+ddragon3b // bootleg
+wwfwfest // TA-0031 (c) 1991 (US)
+wwfwfesta // TA-0031 (c) 1991 + Tecmo license (US)
+wwfwfestb // bootleg
+wwfwfestj // TA-0031 (c) 1991 (Japan)
+shadfrce // TA-0032 (c) 1993 (US)
+shadfrcej // TA-0032 (c) 1993 (Japan)
+shadfrcejv2 // TA-0032 (c) 1993 (Japan)
+
+// Stern "Berzerk hardware" games
+berzerk // (c) 1980
+berzerk1 // (c) 1980
+berzerkg // (c) 1980
+frenzy // (c) 1982
+moonwarp // (c) 1982 - prototype
+
+// Stern 'Mazer Blazer hardware' games
+mazerbla // (c) 1983
+mazerblaa // (c) 1983
+greatgun // (c) 1983
+
+// Other Stern
+cliffhgr // (c) 1983
+cliffhgra // (c) 1983
+goaltogo // (c) 1983
+
+// GamePlan games
+toratora // (c) 1980 Game Plan
+megatack // (c) 1980 Centuri
+killcom // (c) 1980 Centuri
+challeng // (c) 1981 Centuri
+kaos // (c) 1981
+
+// Zaccaria games
+sia2650 // (c) 1978
+tinv2650 // (c) 1978
+dodgem // (c) 1979
+galaxia // (c) 1979
+astrowar // (c) 1980
+laserbat // (c) 1981
+lazarian // (c) 1981
+catnmous // (c) 1982
+catnmousa // (c) 1982
+monymony // (c) 1983
+jackrabt // (c) 1984
+jackrabt2 // (c) 1984
+jackrabts // (c) 1984
+
+// UPL games
+mouser // UPL-83001 (c) 1983
+mouserc // UPL-83001 (c) 1983
+nova2001 // UPL-83005 (c) 1983
+nova2001u // UPL-83005 (c) [1983] + Universal license
+ninjakun // UPL-84003 (c) 1984 Taito Corporation
+raiders5 // UPL-85004 (c) 1985
+raiders5t // UPL-85004 (c) 1985 Taito license
+pkunwar // UPL-????? (c) 1985 (Arcade Game TV List - P.98, Left, 22 from top)
+pkunwarj // UPL-????? (c) 1985 (Arcade Game TV List - P.98, Left, 22 from top)
+xxmissio // UPL-86001 [1986]
+ninjakd2 // UPL-????? (c) 1987
+ninjakd2a // UPL-????? (c) 1987
+ninjakd2b // UPL-????? (c) 1987
+rdaction // UPL-87003?(c) 1987 + World Games license
+mnight // UPL-????? (c) 1987 distributed by Kawakus
+arkarea // UPL-87007 (c) 1988 (Arcade TV Game List - P.67, Right, 2 from top)
+robokid // UPL-88013 (c) 1988
+robokidj // UPL-88013 (c) 1988
+robokidj2 // UPL-88013 (c) 1988
+omegaf // UPL-89016 (c) 1989
+omegafs // UPL-89016 (c) 1989
+
+// UPL/NMK/Banpresto games
+urashima // UPL-89052
+tharrier // UPL-89053 (c) 1989 UPL + American Sammy license
+tharrierj // UPL-89053 (c) 1989 UPL (Japan)
+mustang // UPL-90058 (c) 1990 UPL
+mustangs // UPL-90058 (c) 1990 UPL + Seoul Trading
+bioship // UPL-90062 (c) 1990 UPL + American Sammy license
+sbsgomo // UPL-90062 (c) 1990 UPL
+vandyke // UPL-90064 (c) UPL
+vandykejal // UPL-90064 (c) Jaleco
+vandykejal2 // UPL-90064 (c) Jaleco
+vandykeb // bootleg
+blkheart // UPL-91069
+blkheartj // UPL-91069
+acrobatm // UPL-91073 (c) 1991 UPL + Taito license
+strahl // UPL-91074 (c) 1992 UPL (Japan)
+strahla // UPL-91074 (c) 1992 UPL (Japan)
+bjtwin // UPL-93087 (c) 1993 NMK
+bjtwina // UPL-93087 (c) 1993 NMK
+bjtwinp // UPL-93087 (c) 1993 NMK
+tdragon2 // UPL-93091 (c) 1993 NMK
+tdragon2a // UPL-93091 (c) 1993 NMK
+bigbang // UPL-93091 (c) 1993 NMK
+tdragon // (c) 1991 NMK / Tecmo
+tdragon1 // (c) 1991 NMK / Tecmo
+hachamf // (c) 1991 NMK
+macross // (c) 1992 Banpresto
+riot // (c) 1992 NMK
+gunnail // (c) 1993 NMK / Tecmo
+macross2 // (c) 1993 Banpresto
+sabotenb // (c) 1992 NMK / Tecmo
+sabotenba // (c) 1992 NMK / Tecmo
+cactus // bootleg
+nouryoku // (c) 1995 Tecmo
+raphero // (c) 1994 Media Trading Corp
+
+// nmk16.c bootlegs using the Seibu Sound System
+mustangb // bootleg
+mustangb2 // TAB Austria bootleg
+tdragonb // bootleg
+
+// Comad games on unofficial hardware based on nmk16.c
+ssmissin // (c) 1992 Comad
+airattck // (c) 1996 Comad
+airattcka // (c) 1996 Comad
+
+// Bee-Oh games on unofficial hardware based on nmk16.c
+manybloc // (c) 1991 Bee-Oh
+
+// Jaleco Mahjong Games, Similar Hardware to the NMK ones above?
+daireika // (c) 1989 Jaleco/NMK
+mjzoomin // (c) 1990
+kakumei // (c) 1990
+kakumei2 // (c) 1992
+suchipi // (c) 1993
+
+// NMK Double Dealer, Similar Hardware to Jaleco Mahjong games above
+ddealer // (c) 1991 NMK
+
+// Based on nmk16?
+quizpani // (c) 1993 NMK
+acommand // (c) 1990
+
+// don't know what hardare Banpresto used for these games
+macrossp // (c) 1996 Banpresto
+quizmoon // (c) 1997 Banpresto
+
+// Face/NMK games
+gakupara // (c) 1991 NMK
+quizdna // (c) 1992 Face
+gekiretu // (c) 1992 Face
+cultures // (c) 1994 Face
+
+// Williams/Midway TMS games
+narc // (c) 1988 Williams
+narc3 // (c) 1988 Williams
+narc2 // (c) 1988 Williams
+trog // (c) 1990 Midway
+trog4 // (c) 1990 Midway
+trog3 // (c) 1990 Midway
+trogpa6 // (c) 1990 Midway
+trogpa4 // (c) 1990 Midway
+smashtv // (c) 1990 Williams
+smashtv6 // (c) 1990 Williams
+smashtv5 // (c) 1990 Williams
+smashtv4 // (c) 1990 Williams
+smashtv3 // (c) 1990 Williams
+hiimpact // (c) 1990 Williams
+hiimpact4 // (c) 1990 Williams
+hiimpact3 // (c) 1990 Williams
+hiimpact2 // (c) 1990 Williams
+hiimpact1 // (c) 1990 Williams
+hiimpactp // (c) 1990 Williams
+shimpact // (c) 1991 Midway
+shimpactp6 // (c) 1991 Midway
+shimpactp5 // (c) 1991 Midway
+shimpactp4 // (c) 1991 Midway
+strkforc // (c) 1991 Midway
+mk // (c) 1992 Midway
+mkr4 // (c) 1992 Midway
+mktturbo // hack
+mkyturbo // hack
+mkprot4 // (c) 1992 Midway
+mkprot8 // (c) 1992 Midway
+mkprot9 // (c) 1992 Midway
+mkla1 // (c) 1992 Midway
+mkla2 // (c) 1992 Midway
+mkla3 // (c) 1992 Midway
+mkla4 // (c) 1992 Midway
+mkyawdim // bootleg
+term2 // (c) 1992 Midway
+term2la3 // (c) 1992 Midway
+term2la2 // (c) 1992 Midway
+term2la1 // (c) 1992 Midway
+totcarn // (c) 1992 Midway
+totcarnp // (c) 1992 Midway
+mk2 // (c) 1993 Midway
+mk2r31e // (c) 1993 Midway
+mk2r32 // (c) 1993 Midway
+mk2r30 // (c) 1993 Midway
+mk2r21 // (c) 1993 Midway
+mk2r14 // (c) 1993 Midway
+mk2r11 // (c) 1993 Midway
+mk2r42 // hack
+mk2r91 // hack
+mk2chal // hack
+jdreddp // (c) 1993 Midway
+nbajam // (c) 1993 Midway
+nbajamr2 // (c) 1993 Midway
+nbajamte // (c) 1994 Midway
+nbajamt1 // (c) 1994 Midway
+nbajamt2 // (c) 1994 Midway
+nbajamt3 // (c) 1994 Midway
+revx // (c) 1994 Midway
+mk3 // (c) 1994 Midway
+mk3r20 // (c) 1994 Midway
+mk3r10 // (c) 1994 Midway
+mk3p40 // (c) 1994 Midway
+umk3 // (c) 1994 Midway
+umk3r11 // (c) 1994 Midway
+umk3r10 // (c) 1994 Midway
+wwfmania // (c) 1995 Midway
+wwfmaniab // (c) 1995 Midway
+openice // (c) 1995 Midway
+nbahangt // (c) 1996 Midway
+nbamht // (c) 1996 Midway
+nbamht1 // (c) 1996 Midway
+rmpgwt // (c) 1997 Midway
+rmpgwt11 // (c) 1997 Midway
+
+// Midway V-unit games
+crusnusa // (c) 1994 Midway
+crusnusa40 // (c) 1994 Midway
+crusnusa21 // (c) 1994 Midway
+crusnwld // (c) 1996 Midway
+crusnwld23 // (c) 1996 Midway
+crusnwld20 // (c) 1996 Midway
+crusnwld17 // (c) 1996 Midway
+crusnwld13 // (c) 1996 Midway
+offroadc // (c) 1997 Midway (v1.63)
+offroadc4 // (c) 1997 Midway (v1.40)
+offroadc3 // (c) 1997 Midway (v1.30)
+offroadc1 // (c) 1997 Midway (v1.10)
+wargods // (c) 1996 Midway
+
+// Midway Zeus games
+mk4 // (c) 1997 Midway (v3.0) Latest offical release
+mk4a // (c) 1997 Midway (v2.1)
+mk4b // (c) 1997 Midway (v1.0)
+invasnab // (c) 1999 Midway (v5.0) Latest offical release
+invasnv4 // (c) 1999 Midway (v4.0)
+crusnexo // (c) 1999 Midway (v2.4) Latest offical release
+crusnexoa // (c) 1999 Midway (v2.0)
+crusnexob // (c) 1999 Midway (v1.6)
+thegrid // (c) 2001 Midway (v1.2) Latest offical release
+thegrida // (c) 2001 Midway (v1.1)
+
+// Midway / Atari Voodoo based Hardware (Seattle, Flagstaff)
+wg3dh // (c) 1996 Atari Games
+mace // (c) 1996 Atari Games
+macea // (c) 1996 Atari Games
+sfrush // (c) 1996 Atari Games
+sfrushrk // (c) 1996 Atari Games
+calspeed // (c) 1996 Atari Games
+calspeeda // (c) 1996 Atari Games
+vaportrx // (c) 1998 Atari Games
+vaportrxp // (c) 1998 Atari Games
+carnevil // (c) 1998 Midway Games (v1.0.3)
+carnevil1 // (c) 1998 Midway Games (v1.0.1)
+biofreak // (c) 1997 Midway Games (prototype)
+blitz // (c) 1997 Midway Games
+blitz11 // (c) 1997 Midway Games
+blitz99 // (c) 1998 Midway Games
+blitz2k // (c) 1999 Midway Games
+hyprdriv // (c) 1998 Midway Games
+
+// Midway / Atari Voodoo 2 & 3 - based Hardware (Vegas, Denver, Durango)
+gauntleg // (c) 1998 Atari Games
+gauntleg12 // (c) 1998 Atari Games
+tenthdeg // (c) 1998 Atari Games (prototype)
+roadburn // (c) 1999 Atari Games
+sf2049 // (c) 1999 Atari Games
+sf2049se // (c) 1999 Atari Games
+sf2049te // (c) 1999 Atari Games
+warfa // (c) 1999 Atari Games
+nbashowt // (c) 1998 Midway Games
+nbanfl // (c) 1999 Midway Games
+gauntdl // (c) 1999 Midway Games
+gauntdl24 // (c) 1999 Midway Games
+cartfury // (c) 2000 Midway Games
+
+// Midway Quicksilver
+hydrthnd // (c) 1999 Midway Games
+offrthnd // (c) 2000 Midway Games
+
+// Midway Touchmaster / Galaxy Games
+tm // (c) 1996 Midway Games
+tmdo // (c) 1996 Midway Games
+tm2k // (c) 1996 Midway Games
+tm2ka // (c) 1996 Midway Games
+tm2kb // (c) 1996 Midway Games
+tm3k // (c) 1997 Midway Games
+tm3ka // (c) 1997 Midway Games
+tm4k // (c) 1998 Midway Games
+tm4ka // (c) 1998 Midway Games
+tm4kb // (c) 1998 Midway Games
+tm5k // (c) 1998 Midway Games
+tm5kca // (c) 1998 Midway Games
+tm5ka // (c) 1998 Midway Games
+tm7k // (c) 1999 Midway Games
+tm7ka // (c) 1999 Midway Games
+tm7keval // (c) 1999 Midway Games
+tm8k // (c) 2000 Midway Games
+tm8k902 // (c) 2000 Midway Games
+galgbios // (c) 1998 Creative Electronics & Software (CES)
+galgame2 // (c) 1998 Creative Electronics & Software (CES) / Namco
+
+// Creative Electronics & Software
+hrclass
+ccclass
+tsclass
+
+// Cinematronics raster games
+embargo
+tripool // (c) 1981 Noma (Casino Tech license)
+tripoola // (c) 1981 Noma (Costal Games license)
+unclepoo // (c) 1983 Diatec
+joinem // (c) 1986 Global
+loverboy // (c) 1983 Global
+striv // (c) 1985 Hara Industries
+jack // (c) 1982 Cinematronics
+jack2 // (c) 1982 Cinematronics
+jack3 // (c) 1982 Cinematronics
+treahunt // (c) 1982 Hara Ind.
+zzyzzyxx // (c) 1982 Cinematronics + Advanced Microcomputer Systems
+zzyzzyxx2 // (c) 1982 Cinematronics + Advanced Microcomputer Systems
+brix // (c) 1982 Cinematronics + Advanced Microcomputer Systems
+freeze // Cinematronics
+sucasino // (c) 1982 Data Amusement
+
+// Cinematronics vector games
+spacewar // (c) 1977
+spaceshp // (c) 1978 Cinematronics (Sega licence)
+barrier // (c) 1979 Vectorbeam
+starcas // (c) 1980
+starcas1 // (c) 1980
+starcasp // (c) 1980 prototype
+starcase // (c) 1980 Cinematronics (Mottoeis license)
+stellcas // bootleg
+spaceftr // (c) 1981 Zaccaria
+tailg // (c) 1979
+ripoff // (c) 1980
+armora // (c) 1980
+armorap // (c) 1980
+armorar // (c) 1980 Cinematronics (Rock-ola license)
+wotw // (c) 1981
+wotwc // (c) 1981
+warrior // (c) 1979 Vectorbeam
+starhawk // (c) 1979
+solarq // (c) 1981
+boxingb // (c) 1981
+speedfrk // (c) 1979 Vectorbeam
+sundance // (c) 1979
+demon // (c) 1982 Rock-ola
+qb3 // (c) 1982 Rock-ola - prototype
+// this one uses 68000+Z80 instead of the Cinematronics CPU
+cchasm
+cchasm1 // (c) 1983 Cinematronics / GCE
+
+// "The Pit hardware" games
+roundup // (c) 1981 Amenip/Centuri
+fitter // (c) 1981 Taito
+fitterbl // bootleg
+thepit // (c) 1982 Zilec
+thepitu1 // (c) 1982 Centuri (licensed)
+thepitu2 // (c) 1982 Centuri (licensed)
+thepitj // (c) 1982 Taito (licensed)
+thepitm // bootleg
+dockman // (c) 1982 Taito Corp.
+portman // (c) 1982 Nova Games Ltd.
+suprmous // (c) 1982 Taito
+funnymou // (c) 1982 Chuo Co. Ltd
+machomou // (c) 1982 Techstar
+intrepid // (c) 1983 Nova Games Ltd.
+intrepid2 // (c) 1983 Nova Games Ltd.
+zaryavos // (c) 1983 Nova Games of Canada (prototype)
+timelimt // (c) 1983 Chuo Co. Ltd
+progress // (c) 1984 Chuo Co. Ltd
+koroleva // (c) 1988 Terminal
+rtriv // (c) 198? Romar
+
+// TIA-MC1 hardware games
+konek // (c) 1988 Terminal
+sosterm // (c) 1988 Terminal
+bilyard // (c) 1988 Terminal
+
+// Photon hardware games
+phtetris
+phpython
+phklad
+
+// Photon IK2 hardware
+kok
+black
+brod
+
+// Valadon Automation games
+bagman // (c) 1982
+bagnard // (c) 1982
+bagnarda // (c) 1982
+bagmans // (c) 1982 + Stern license
+bagmans2 // (c) 1982 + Stern license
+pickin // (c) 1983
+supdrapo // (c) 1983 + Stern license
+supdrapoa // (c) 1983 + Jeutel license?
+supdrapob // bootleg
+sbagman // (c) 1984
+sbagmans // (c) 1984 + Stern license
+botanic // (c) 1985
+squaitsa // (c) 1985
+tankbust // (c) 1985
+
+// Seibu Denshi / Seibu Kaihatsu games
+stinger // (c) 1983 Seibu Denshi
+stinger2 // (c) 1983 Seibu Denshi
+scion // (c) 1984 Seibu Denshi
+scionc // (c) 1984 Seibu Denshi + Cinematronics license
+kungfut // (c) 1984 Seibu Kaihatsu
+kungfuta // (c) 1984 Seibu Kaihatsu
+wiz // (c) 1985 Seibu Kaihatsu
+wizt // (c) 1985 Taito Corporation
+wizta // (c) 1985 Taito Corporation
+kncljoe // (c) 1985 Taito Corporation
+kncljoea // (c) 1985 Taito Corporation
+bcrusher // bootleg
+empcity // (c) 1986 Seibu Kaihatsu (bootleg?)
+empcityu // (c) 1986 Taito (Romstar License)
+empcityj // (c) 1986 Taito Corporation (Japan)
+empcityi // (c) 1986 Seibu Kaihatsu (Eurobed license)
+stfight // (c) 1986 Seibu Kaihatsu (Germany) (bootleg?)
+stfighta // (c) 1986 Seibu Kaihatsu (bootleg?)
+darkmist // (c) 1986 Taito
+mustache // (c) 1987 March
+cshooter // (c) 1987 Taito
+cshootere // (c) 1987 JKH (bootleg)
+airraid // (c) 1987 Seibu Kaihatsu
+panicr // Seibu / Taito
+deadang // (c) 1988 Seibu Kaihatsu
+leadang // (c) 1988 Seibu Kaihatsu
+ghunter // (c) 1988 Seibu Kaihatsu + Segasa/Sonic license
+dynduke // (c) 1989 Seibu Kaihatsu + Fabtek license
+dyndukef // (c) 1989 Seibu Kaihatsu + Fabtek license
+dbldyn // (c) 1989 Seibu Kaihatsu + Fabtek license
+dbldynf // (c) 1989 Seibu Kaihatsu + Fabtek license
+raiden // (c) 1990 Seibu Kaihatsu
+raidena // (c) 1990 Seibu Kaihatsu
+raidenk // (c) 1990 Seibu Kaihatsu + IBL Corporation license
+raident // (c) 1990 Seibu Kaihatsu + Liang HWA Electronics license
+raidenu // (c) 1990 Seibu Kaihatsu + Fabtek license
+raidenua // (c) 1990 Seibu Kaihatsu + Fabtek license
+sdgndmps // (c) Banpresto / Bandai (Japan)
+dcon // (c) 1992 Success
+sengokmj // (c) 1991 Sigma
+totmejan // (c) 1991 Seibu/Tecmo
+goodejan // (c) 1991 Seibu/Tecmo
+goodejana // (c) 1991 Seibu/Tecmo
+
+
+raiden2 // (c) 1993 Seibu Kaihatsu + Fabtek license
+raiden2a // (c) 1993 Seibu Kaihatsu + Metrotainment license
+raiden2b // (c) 1993 Seibu Kaihatsu
+raiden2c // (c) 1993 Seibu Kaihatsu
+raiden2d // (c) 1993 Seibu Kaihatsu
+raiden2e // (c) 1993 Seibu Kaihatsu
+raiden2f // (c) 1993 Seibu Kaihatsu
+raidndx // (c) 1994 Seibu Kaihatsu
+raidndxj // (c) 1994 Seibu Kaihatsu
+raidndxu // (c) 1994 Seibu Kaihatsu + Fabtek license
+raidndxa1 // (c) 1994 Seibu Kaihatsu + Metrotainment license
+raidndxa2 // (c) 1994 Seibu Kaihatsu + Metrotainment license
+raidndxg // (c) 1994 Seibu Kaihatsu + Tuning license
+zeroteam // (c) 1993 Seibu Kaihatsu
+zeroteama // (c) 1993 Seibu Kaihatsu
+zeroteamb // (c) 1993 Seibu Kaihatsu
+zeroteamc // (c) 1993 Seibu Kaihatsu
+zeroteams // (c) 1993 Seibu Kaihatsu
+zeroteamsr // (c) 1993 Seibu Kaihatsu
+xsedae // (c) 1995 Dream Island
+
+// Newer V33 PCB with COP3 protection
+r2dx_v33 // (c) 1996 Seibu Kaihatsu
+nzerotea // (c) 1997 Seibu Kaihatsu
+
+// Seibu SPI System games
+
+senkyu // (c) 1995 Seibu Kaihatsu
+senkyua // (c) 1995 Seibu Kaihatsu
+batlball // (c) 1995 Seibu Kaihatsu (Tuning License)
+batlballa // (c) 1995 Seibu Kaihatsu (Metrotainment License)
+batlballu // (c) 1995 Seibu Kaihatsu (Metrotainment License)
+
+viprp1 // (c) 1995 Seibu Kaihatsu
+viprp1u // (c) 1995 Seibu Kaihatsu (Fabtek license)
+viprp1j // (c) 1995 Seibu Kaihatsu
+viprp1s // (c) 1995 Seibu Kaihatsu
+viprp1oj // (c) 1995 Seibu Kaihatsu
+viprp1ot // (c) 1995 Seibu Kaihatsu (Tuning License)
+viprp1hk // (c) 1995 Seibu Kaihatsu (Metrotainment License)
+
+ejanhs // (c) 1996 Seibu Kaihatsu
+
+rdft // (c) 1996 Seibu Kaihatsu
+rdftu // (c) 1996 Seibu Kaihatsu (Fabtek license)
+rdftau // (c) 1996 Seibu Kaihatsu
+rdftj // (c) 1996 Seibu Kaihatsu
+rdftadi // (c) 1996 Seibu Kaihatsu (Dream Island license)
+rdftam // (c) 1996 Seibu Kaihatsu (Metrotainment license)
+rdftit // (c) 1996 Seibu Kaihatsu
+rdfta // (c) 1996 Seibu Kaihatsu
+
+rdft2 // (c) 1997 Seibu Kaihatsu (Tuning License)
+rdft2a // (c) 1997 Seibu Kaihatsu (Metrotainment license)
+rdft2a2 // (c) 1997 Seibu Kaihatsu (Dream Island license)
+rdft2j // (c) 1997 Seibu Kaihatsu
+rdft2j2 // (c) 1997 Seibu Kaihatsu
+rdft2t // (c) 1997 Seibu Kaihatsu
+rdft2u // (c) 1997 Seibu Kaihatsu (Fabtek license)
+rdft2us // (c) 1997 Seibu Kaihatsu (Fabtek license)
+rdft22kc // (c) 2000 Seibu Kaihatsu
+
+rfjet // (c) 1998 Seibu Kaihatsu (Tuning License)
+rfjetu // (c) 1998 Seibu Kaihatsu (Fabtek license)
+rfjeta // (c) 1998 Seibu Kaihatsu (Dream Island license)
+rfjetj // (c) 1998 Seibu Kaihatsu
+rfjets // (c) 1998 Seibu Kaihatsu
+rfjet2kc // (c) 2000 Seibu Kaihatsu
+
+ejsakura // (c) 1999 Seibu Kaihatsu
+ejsakura12 // (c) 1999 Seibu Kaihatsu
+
+// Seibu System SH2B games
+feversoc // (c) 2000
+
+// Tad games (Tad games run on Seibu hardware)
+cabal // (c) 1988 Tad + Fabtek license
+cabala // (c) 1988 Tad + Fabtek license
+cabalbl // bootleg
+cabalbl2 // bootleg
+cabalus // (c) 1988 Tad + Fabtek license
+cabalus2 // (c) 1988 Tad + Fabtek license
+toki // (c) 1989 Tad (World)
+tokia // (c) 1989 Tad (World)
+tokiu // (c) 1989 Tad + Fabtek license (US)
+tokiua // (c) 1989 Tad + Fabtek license (US)
+tokib // bootleg
+juju // (c) 1989 Tad (Japan)
+jujub // (c) 1989 Tad (Japan)
+bloodbro // (c) 1990 Tad
+bloodbroa // (c) 1990 Tad
+bloodbrob // (c) 1990 Tad
+weststry // bootleg
+skysmash // (c) 1990 Nihon System Inc.
+legionna // (c) 1992 Tad (World)
+legionnau // (c) 1992 Tad + Fabtek license (US)
+heatbrl // (c) 1992 Tad (World version 3)
+heatbrl2 // (c) 1992 Tad (World version 2)
+heatbrlo // (c) 1992 Tad (World)
+heatbrlu // (c) 1992 Tad (US)
+godzilla // (c) 1993 Banpresto
+denjinmk // (c) 199? Banpresto
+grainbow // (c) 1993 Banpresto
+cupsoc // (c) 1992 Seibu
+cupsoca // (c) 1992 Seibu
+cupsocs // (c) 1992 Seibu
+cupsocs2 // (c) 1992 Seibu
+cupsocsb // bootleg
+cupsocsb2 // bootleg
+olysoc92 // (c) 1992 Seibu
+goal92 // bootleg
+
+// Jaleco games
+exerion // (c) 1983 Jaleco
+exeriont // (c) 1983 Jaleco + Taito America license
+exerionb // bootleg
+fcombat // (c) 1985 Jaleco
+pturn // (c) 1984 Jaleco
+ddayjlc // (c) 1984 Jaleco
+ddayjlca // (c) 1984 Jaleco
+formatz // (c) 1984 Jaleco
+aeroboto // (c) 1984 Williams
+citycon // (c) 1985 Jaleco
+citycona // (c) 1985 Jaleco
+cruisin // (c) 1985 Jaleco/Kitkorp
+momoko // (c) 1986 Jaleco
+argus // (c) 1986 Jaleco
+valtric // (c) 1986 Jaleco
+butasan // (c) 1987 Jaleco
+psychic5 // (c) 1987 Jaleco
+psychic5a // (c) 1987 Jaleco
+bombsa // (c) 1988 Jaleco
+ginganin // (c) 1987 Jaleco
+ginganina // (c) 1987 Jaleco
+skyfox // (c) 1987 Jaleco + Nichibutsu USA license
+exerizer // (c) 1987? Jaleco
+exerizerb // bootleg
+homerun // (c) 1988 Jaleco
+dynashot // (c) 1988 Jaleco
+bigrun // (c) 1989 Jaleco
+cischeat // (c) 1990 Jaleco
+f1gpstar // (c) 1991 Jaleco
+armchmp2 // (c) 1992 Jaleco
+armchmp2o // (c) 1992 Jaleco
+wildplt // (c) 1992 Jaleco
+f1gpstr2 // (c) 1993 Jaleco
+scudhamm // (c) 1994 Jaleco
+tetrisp2 // (c) 1997 Jaleco
+tetrisp2j // (c) 1997 Jaleco
+tetrisp2ja // (c) 1997 Jaleco
+nndmseal // (c) 1997 I'Max/Jaleco
+stepstag // (c) 1999 Jaleco
+step3 // (c) 1999 Jaleco
+rockn // (c) 1999 Jaleco
+rockna // (c) 1999 Jaleco
+rockn2 // (c) 1999 Jaleco
+rocknms // (c) 1999 Jaleco
+rockn3 // (c) 1999 Jaleco
+rockn4 // (c) 2000 Jaleco
+
+// Jaleco Mega System 1 games
+lomakai // (c) 1988 (World)
+makaiden // (c) 1988 (Japan)
+p47 // (c) 1988
+p47j // (c) 1988 (Japan)
+kickoff // (c) 1988 (Japan)
+tshingen // (c) 1988 (Japan)
+tshingena // (c) 1988 (Japan)
+kazan // (c) 1988 (World)
+iganinju // (c) 1988 (Japan)
+astyanax // (c) 1989
+lordofk // (c) 1989 (Japan)
+hachoo // (c) 1989
+jitsupro // (c) 1989 (Japan)
+plusalph // (c) 1989
+stdragon // (c) 1989
+rodland // (c) 1990
+rodlandj // (c) 1990 (Japan)
+rodlandjb // bootleg
+avspirit // (c) 1991
+phantasm // (c) 1991 (Japan)
+monkelf // bootleg
+edf // (c) 1991
+edfu // (c) 1991
+edfbl // (c) 1991
+64street // (c) 1991
+64streetj // (c) 1991 (Japan)
+soldam // (c) 1992
+soldamj // (c) 1992 (Japan)
+bigstrik // (c) 1992
+bigstrkb // bootleg on different hardware
+bestleag // bootleg, by Playmark?
+bestleaw // bootleg
+chimerab // (c) 1993
+cybattlr // (c) 1993
+hayaosi1 // (c) 1993
+peekaboo // (c) 1993
+
+// Jaleco Mega System 32 games
+hayaosi2 // (c) 1993
+hayaosi3 // (c) 1994
+bbbxing // (c) 1994
+47pie2 // (c) 1994
+47pie2o // (c) 1994
+desertwr // (c) 1995
+gametngk // (c) 1995
+tetrisp // (c) 1995 Jaleco / BPS
+p47aces // (c) 1995
+akiss // (c) 1995
+gratia // (c) 1996
+gratiaa // (c) 1996
+kirarast // (c) 1996
+tp2m32 // (c) 1997
+bnstars // (c) 1997
+wpksocv2 // (c) 1997
+
+f1superb // (c) 1994
+
+bnstars1 // (c) 1994
+
+// Video System Co. games
+rabiolep // (c) 1987 V-System Co. (Japan)
+rpunch // (c) 1987 V-System Co. + Bally/Midway/Sente license (US)
+svolley // (c) 1989 V-System Co. (Japan)
+svolleyk // (c) 1989 V-System Co. (Korea)
+svolleyu // (c) 1989 V-System Co. + Data East license (US)
+tail2nos // [1989] V-System Co.
+sformula // [1989] V-System Co. (Japan)
+ojankoc // [1986] V-System Co. (Japan)
+ojankoy // [1986] V-System Co. (Japan)
+ojanko2 // [1987] V-System Co. (Japan)
+ccasino // [1987] V-System Co. (Japan)
+ojankohs // [1988] V-System Co. (Japan)
+nekkyoku // [1988] Video System Co. (Japan)
+idolmj // [1988] (c) System Service (Japan)
+mjnatsu // [1989] Video System presents (Japan)
+natsuiro // [1989] Video System presents (Japan)
+mfunclub // [1989] V-System (Japan)
+daiyogen // [1990] Video System Co. (Japan)
+nmsengen // (c) 1991 Video System (Japan)
+fromance // (c) 1991 Video System Co. (Japan)
+pipedrm // (c) 1990 Video System Co. (World)
+pipedrmu // (c) 1990 Video System Co. (US)
+pipedrmj // (c) 1990 Video System Co. (Japan)
+hatris // (c) 1990 Video System Co. (US)
+hatrisj // (c) 1990 Video System Co. (Japan)
+spinlbrk // (c) 1990 V-System Co. (World)
+spinlbrku // (c) 1990 V-System Co. (US)
+spinlbrkj // (c) 1990 V-System Co. (Japan)
+pspikes // (c) 1991 Video System Co. (World)
+pspikesk // (c) 1991 Video System Co. (Korea)
+svolly91 // (c) 1991 Video System Co. (Japan)
+pspikesb // bootleg
+spikes91 // bootleg
+pspikesc // bootleg
+karatblz // (c) 1991 Video System Co.
+karatblzu // (c) 1991 Video System Co. (US)
+karatblzj // (c) 1991 Video System / Tecmo (Japan)
+turbofrc // (c) 1991 Video System Co.
+aerofgt // (c) 1992 Video System Co.
+aerofgtb // (c) 1992 Video System Co.
+aerofgtc // (c) 1992 Video System Co.
+sonicwi // (c) 1992 Video System Co. (Japan)
+aerfboot // bootleg
+aerfboo2 // bootleg
+wbbc97 // (c) 1997 Comad
+welltris // (c) 1991 Video System Co. (Japan)
+welltrisj // (c) 1991 Video System Co. (Japan)
+quiz18k // (c) 1992 EIM (Welltris hardware)
+f1gp // (c) 1991 Video System Co.
+f1gpb // bootleg
+f1gp2 // (c) 1992 Video System Co.
+crshrace // (c) 1993 Video System Co.
+crshrace2 // (c) 1993 Video System Co.
+taotaido // (c) 1993 Video System Co.
+taotaidoa // (c) 1993 Video System Co.
+gstriker // (c) [1993] Human
+gstrikera // (c) [1993] Human
+vgoalsoc // (c) 199? Temco
+vgoalsca // (c) 199? Temco
+twrldc94 // (c) 1994 Tecmo
+twrldc94a // (c) 1994 Tecmo
+suprslam // (c) 1995 Banpresto
+fromanc2 // (c) 1995 Video System Co. (Japan)
+fromancr // (c) 1995 Video System Co. (Japan)
+fromanc4 // (c) 1998 Video System Co. (Japan)
+inufuku // (c) 1998 Video System Co. (Japan)
+
+// Psikyo games
+samuraia // (c) 1993 (World)
+sngkace // (c) 1993 (Japan)
+gunbird // (c) 1994
+gunbirdk // (c) 1994
+gunbirdj // (c) 1994
+btlkroad // (c) 1994
+s1945 // (c) 1995
+s1945a // (c) 1995
+s1945j // (c) 1995
+s1945jn // (c) 1995
+s1945bl // (c) 1995 (Hong Kong bootleg)
+s1945k // (c) 1995
+tengai // (c) 1996
+tengaij // (c) 1996
+s1945ii // (c) 1997
+soldivid // (c) 1997
+sbomber // (c) 1998
+sbombera // (c) 1998
+daraku // (c) 1998
+gunbird2 // (c) 1998
+s1945iii // (c) 1999
+dragnblz // (c) 2000
+tgm2 // (c) 2000
+tgm2p // (c) 2000
+gnbarich // (c) 2001
+mjgtaste // (c) 2002
+hotgmck // (c) 1997
+hgkairak // (c) 1998
+hotgmck3 // (c) 1999
+hotgm4ev // (c) 2000
+hotgmcki // (c) 2001
+loderndf // (c) 2000
+loderndfa // (c) 2000
+hotdebut // (c) 2000
+
+// Orca games
+marineb // (c) 1982 Orca
+changes // (c) 1982 Orca
+changesa // (c) 1982 Orca + Eastern Micro Electronics license
+looper // (c) 1982 Orca
+springer // (c) 1982 Orca
+hoccer // (c) 1983 Eastern Micro Electronics, Inc.
+hoccer2 // (c) 1983 Eastern Micro Electronics, Inc.
+bcruzm12 // (c) 1983 Sigma Ent. Inc.
+hopprobo // (c) 1983 Sega
+wanted // (c) 1984 Sigma Ent. Inc.
+funkybee // (c) 1982 Orca
+funkybeeb // (c) 1982 Orca
+skylancr // (c) 1983 Orca
+skylancre // (c) 1983 Orca + Esco Trading Co license
+zodiack // (c) 1983 Orca + Esco Trading Co license
+dogfight // (c) 1983 Thunderbolt
+moguchan // (c) 1982 Orca + Eastern Commerce Inc. license (doesn't appear on screen)
+percuss // (c) 1981 Orca
+bounty // (c) 1982 Orca
+espial // (c) 1983 Thunderbolt, Orca logo is hidden in title screen
+espialu // (c) 1983 Thunderbolt, Orca logo is hidden in title screen
+netwars // (c) 1983 Orca + Esco Trading Co license
+// Vastar was made by Orca, but when it was finished, Orca had already bankrupted.
+// So they sold this game as "Made by Sesame Japan" because they couldn't use
+// the name "Orca"
+vastar // (c) 1983 Sesame Japan
+vastar2 // (c) 1983 Sesame Japan
+/*
+other Orca games:
+82 Battle Cross Kit 2P
+82 River Patrol Empire Mfg/Kerstens Ind Ded 2P HC Action
+82 Slalom Kit 2P HC Action
+83 Net Wars 2P
+83 Super Crush Kit 2P Action
+*/
+
+// Gaelco 2D games
+mastboy // (c) 1987 - No Ref on the PCB
+mastboyi // (c) 1987 - No Ref on the PCB
+xorworld // (c) 1990 - prototype
+bigkarnk // (c) 1991 - Ref 901112-1
+// Master Boy 2 // (c) 1991 - Ref ???
+splash // (c) 1992 - Ref 922804
+splash10 // (c) 1992 - Ref 922804
+paintlad // (c) 1992 - ver 1.3
+roldfrog // not a gaelco game but based on splash code
+roldfroga // not a gaelco game but based on splash code
+rebus // not a gaelco game but on similar hw to splash
+funystrp // not a gaelco game but on similar hw to splash
+puckpepl // not a gaelco game but on similar hw to splash
+thoop // (c) 1992 - Ref 922804/1
+squash // (c) 1992 - Ref 922804/2
+wrally // (c) 1993 - Ref 930705
+wrallya // (c) 1993 - Ref 930705
+wrallyb // (c) 1993 - Ref 930217
+glass // (c) 1993 - Ref 931021
+glass10 // (c) 1993 - Ref 931021
+glassbrk // (c) 1993 - Ref 931021 shows "Break Edition" on a real PCB
+targeth // (c) 1994 - Ref 940531
+targetha // (c) 1994 - Ref 940531
+thoop2 // (c) 1994 - Ref ???
+aligator // (c) 1994 - Ref 940411
+aligatorun // (c) 1994 - Ref 940411 (unprotected)
+biomtoy // (c) 1995 - Ref 922804/2 - (unprotected)
+touchgo // (c) 1995 - Ref 950906
+touchgon // (c) 1995 - Ref 950906
+touchgoe // (c) 1995 - Ref 950510-1
+wrally2 // (c) 1995 - Ref 950510
+maniacsp // (c) 1996 - Ref 922804/2 - (prototype)
+maniacsq // (c) 1996 - Ref ??? - (unprotected)
+snowboar // (c) 1996 - Ref 960419/1
+snowboara // (c) 1996 - Ref 960419/1
+bang // (c) 1998 - Ref ???
+bangj // (c) 1999 - Ref ???
+grtesoro // (c) 1999 - Ref ???
+grtesoro4 // (c) 1999 - Ref ???
+
+// Gaelco 3D games
+speedup // (c) 1996 - Ref ???
+surfplnt // (c) 1997 - Ref 971223
+surfplnt40 // (c) 1997 - Ref 970514
+radikalb // (c) 1998 - Ref ???
+
+// SH-4 hardware
+atvtrack // (c) 2002 - Ref 020419
+atvtracka // (c) 2002 - Ref 020419
+
+/*
+Remaining Gaelco Games:
+=======================
+1999: Rolling Extreme
+2000: Football Power
+2001: Smashing Drive
+*/
+
+// Galeco PC based games
+tokyocop // (c) 2003 (Arcade TV Game List - P.168, Right, 19 from bottom)
+
+// Kaneko games
+hvyunit // (c) 1988 Kaneko
+hvyunitj // (c) 1988 Kaneko
+hvyunitjo // (c) 1988 Kaneko
+hvyunitu // (c) 1988 Kaneko
+djboy // (c) 1989 Kaneko
+djboyj // (c) 1989 Kaneko
+djboya // (c) 1989 Kaneko
+airbustr // (c) 1990 Kaneko + Namco
+airbustrj // (c) 1990 Kaneko + Namco (Japan)
+airbustrb // bootleg
+galpanic // (c) 1990 Kaneko
+galpanica // (c) 1990 Kaneko
+galsnew // (c) 1990 Kaneko
+galsnewa // (c) 1990 Kaneko
+galsnewj // (c) 1990 Kaneko
+galsnewk // (c) 1990 Kaneko
+galpani2 // (c) 1993 Kaneko
+galpani2g // (c) 1993 Kaneko
+galpani2t // (c) 1993 Kaneko
+galpani2i // (c) 1993 Kaneko
+galpani2j // (c) 1993 Kaneko
+gp2quiz // (c) 1993 Kaneko
+gp2se // (c) 1994 Kaneko
+jchan // (c) 1995 Kaneko
+jchan2 // (c) 1995 Kaneko
+galpani3 // (c) 1995 Kaneko
+
+// Kaneko "AX System" games
+berlwall // (c) 1991 Kaneko
+berlwallt // (c) 1991 Kaneko
+mgcrystl // (c) 1991 Kaneko (World)
+mgcrystlo // (c) 1991 Kaneko (World)
+mgcrystlj // (c) 1991 Kaneko + distributed by Atlus (Japan)
+blazeon // (c) 1992 Atlus
+sandscrp // (c) 1992 Face
+sandscrpa // (c) 1992 Face
+sandscrpb // (c) 1992 Face
+explbrkr // (c) 1992 Kaneko
+bakubrkr // (c) 1992 Kaneko
+shogwarr // (c) 1992 Kaneko
+shogwarru // (c) 1992 Kaneko
+fjbuster // (c) 1992 Kaneko
+brapboys // (c) 1992 Kaneko
+brapboysj // (c) 1992 Kaneko
+bloodwar // (c) 1994 Kaneko
+oedfight // (c) 1994 Kaneko
+bonkadv // (c) 1994 Kaneko
+gtmr // (c) 1994 Kaneko
+gtmra // (c) 1994 Kaneko
+gtmre // (c) 1994 Kaneko
+gtmrusa // (c) 1994 Kaneko (US)
+gtmr2 // (c) 1995 Kaneko
+gtmr2a // (c) 1995 Kaneko
+gtmr2u // (c) 1995 Kaneko
+
+// Kaneko "Super Nova System" games
+skns
+galpani4 // 1996.09 (c) 1996 Kaneko (Japan)
+galpani4k // 1996.09 (c) 1996 Kaneko (Korea)
+jjparads // 1996.12 (c) 1996 Electro Design Co. (Japan)
+sarukani // 1997.01 (c) 1997 Kaneko / Mediaworks (Japan)
+vblokbrk // 1997.?? (c) 1997 Kaneko / Mediaworks (Asia)
+galpanis // 1997.04 (c) 1997 Kaneko (Japan)
+galpanisk // 1997.04 (c) 1997 Kaneko (Korea)
+sengekis // 1997.?? (c) 1997 Kaneko / Warashi (Asia)
+sengekisj // 1997.07 (c) 1997 Kaneko / Warashi (Japan)
+jjparad2 // 1997.12 (c) 1997 Electro Design Co. (Japan)
+cyvern // 1998.02 (c) 1998 Kaneko (US)
+cyvernj // 1998.02 (c) 1998 Kaneko (Japan)
+ryouran // 1998.07 (c) 1998 Electro Design Co. (Japan)
+puzzloop // 1998.?? (c) 1998 Mitchell (Europe)
+puzzloopj // 1998.12 (c) 1998 Mitchell (Japan)
+puzzloopa // 1998.?? (c) 1998 Mitchell (Asia)
+puzzloopk // 1998.?? (c) 1998 Mitchell (Korea)
+puzzloopu // 1999.05 (c) 1998 Mitchell (USA)
+galpans2 // 1999.02 (c) 1999 Kaneko (Japan)
+galpans2a // 1999.?? (c) 1999 Kaneko (Asia)
+galpansu // 1999.?? (c) 1999 Kaneko (Korea)
+senknow // 1999.04 (c) 1999 Kaneko / Kouyousha (Japan)
+panicstr // 1999.09 (c) 1999 Kaneko (Japan)
+teljan // 1999.11 (c) 1999 Electro Design Co. (Japan)
+gutsn // 2000.06 (c) 2000 Kaneko / Kouyousha (Japan)
+galpans3 // 2002.07 (c) 2002 Kaneko (Japan)
+
+// Seta games
+hanaawas // (c) SetaKikaku
+speedatk // CB-0 (c) SetaKikaku
+srmp1 // UB or UC?? (c) 1987
+srmp2 // UB or UC?? (c) 1987
+srmp3 // ZA-0? (c) 1988
+rmgoldyh // ZF-0? (c) 1988
+mjyuugi // (c) 1990 Visco
+mjyuugia // (c) 1990 Visco
+ponchin // (c) 1991 Visco
+ponchina // (c) 1991 Visco
+
+// Seta 1st Generation HW (seta.c)
+tndrcade // UA-0 (c) 1987 Taito
+tndrcadej // UA-0 (c) 1987 Taito
+twineagl // UA-2 (c) 1988 + Taito license
+downtown // UD-2 (c) 1989 + Romstar or Taito license (DSW)
+downtown2 // UD-2 (c) 1989 + Romstar or Taito license (DSW)
+downtownj // UD-2 (c) 1989 + Romstar or Taito license (DSW)
+downtownp // UD-2 (c) 1989 + Romstar or Taito license (DSW)
+usclssic // UE (c) 1989 + Romstar or Taito license (DSW)
+calibr50 // UH (c) 1989 + Romstar or Taito license (DSW)
+arbalest // UK (c) 1989 + Jordan, Romstar or Taito license (DSW)
+metafox // UP (c) 1989 + Jordan, Romstar or Taito license (DSW)
+setaroul // UF (c) 19?? Seta / Visco
+drgnunit // (c) 1989 Athena / Seta + Romstar or Taito license (DSW)
+wits // (c) 1989 Athena (Visco license)
+thunderl // (c) 1990 Seta + Romstar or Visco license (DSW)
+thunderlbl // (c) 1990 Seta + Romstar or Visco license (DSW) - bootleg with Tetris sound
+wiggie // (c) 1994 Promat (not genuine seta hardware, but based on thunderl code)
+superbar // (c) 1994 Promat (not genuine seta hardware, but based on thunderl code)
+jockeyc // (c) 1990 [Seta] (Visco license)
+rezon // (c) 1991 Allumer
+rezont // (c) 1991 Allumer / Taito
+stg // (c) 1991 Athena / Tecmo
+pairlove // (c) 1991 Athena
+blandia // (c) 1992 Allumer
+blandiap // (c) 1992 Allumer
+blockcar // (c) 1992 Visco
+qzkklogy // (c) 1992 Tecmo
+neobattl // (c) 1992 Banpresto / Sotsu Agency. Sunrise
+umanclub // (c) 1992 Tsuburaya Prod. / Banpresto
+zingzip // UY (c) 1992 Allumer + Tecmo
+zingzipbl // bootleg
+atehate // (C) 1993 Athena
+jjsquawk // (c) 1993 Athena / Able
+jjsquawkb // bootleg
+kamenrid // (c) 1993 Toei / Banpresto
+madshark // (c) 1993 Allumer
+msgundam // (c) 1993 Banpresto
+msgundam1 // (c) 1993 Banpresto
+daioh // (C) 1993 Athena
+oisipuzl // (c) 1993 SunSoft / Atlus
+triplfun // bootleg
+utoukond // (c) 1993 Banpresto + Tsuburaya Prod.
+qzkklgy2 // (c) 1993 Tecmo
+wrofaero // (c) 1993 Yang Cheng
+eightfrc // (c) 1994 Tecmo
+kiwame // (c) 1994 Athena
+krzybowl // (c) 1994 American Sammy
+orbs // (c) 1994 American Sammy
+keroppi // (c) 1993 Sammy
+extdwnhl // (c) 1995 Sammy Japan
+gundhara // (c) 1995 Banpresto
+sokonuke // (c) 1995 Sammy Industries
+zombraid // (c) 1995 American Sammy
+crazyfgt // (c) 1998 Subsino
+inttoote // (c) 1998 Coinmaster
+inttootea // (c) 1998 Coinmaster
+
+// Seta 2nd Generation HW (seta2.c)
+gundamex // (c) 1994 Banpresto
+grdians // (c) 1995 Banpresto
+mj4simai // (c) 1996 Maboroshi Ware
+myangel // (c) 1996 Namco
+myangel2 // (c) 1997 Namco
+pzlbowl // (c) 1999 Nihon System / Moss
+penbros // (c) 2000 Subsino
+deerhunt // (c) 2000 Sammy USA Corporation
+deerhunta // (c) 2000 Sammy USA Corporation
+deerhuntb // (c) 2000 Sammy USA Corporation
+deerhuntc // (c) 2000 Sammy USA Corporation
+turkhunt // (c) 2001 Sammy USA Corporation
+wschamp // (c) 2001 Sammy USA Corporation
+wschampa // (c) 2001 Sammy USA Corporation
+funcube2 // (c) 2001 Namco
+funcube4 // (c) 2001 Namco
+trophyh // (c) 2002 Sammy USA Corporation
+reelquak // (c) ???? <unknown>
+
+// SSV System (Seta, Sammy, Visco) games
+srmp4 // (c) 1993 Seta
+srmp4o // (c) 1993 Seta
+twineag2 // (c) 1994 Seta
+srmp7 // (c) 1997 Seta
+dynagear // (c) 1993 Sammy
+survarts // (c) 1993 Sammy
+survartsu // (c) 1993 Sammy (American)
+eaglshot // (c) 1994 Sammy
+hypreact // (c) 1995 Sammy
+meosism // (c) 1996?Sammy
+hypreac2 // (c) 1997 Sammy
+sxyreact // (c) 1998 Sammy
+sxyreac2 // (c) 1999 Sammy
+cairblad // (c) 1999 Sammy
+keithlcy // (c) 1993 Visco
+drifto94 // (c) 1994 Visco
+janjans1 // (c) 1996 Visco
+stmblade // (c) 1996 Visco
+jsk // (c) 1997 Visco
+koikois2 // (c) 1997 Visco
+mslider // (c) 1997 Visco / Datt Japan
+ryorioh // (c) 1998 Visco
+janjans2 // (c) 2000 Visco
+vasara // (c) 2000 Visco
+vasara2 // (c) 2001 Visco
+vasara2a // (c) 2001 Visco
+
+ultrax // (c) 1995 Banpresto
+gdfs // (c) 1995 Banpresto
+
+jclub2 // (c) 199? Seta
+jclub2o // (c) 199? Seta
+darkhors // bootleg of Jockey Club II
+
+// ST-0016 based games (ST-0016 is a SoC Z80-based HW)
+// plain ST-0016
+renju // (c) 1994 Visco
+koikois // (c) 1995 Seta
+nratechu // (c) 1996 Seta
+dcrown // 199? unknown
+// R3000 + ST-0016
+srmp5 // (c) 199? Seta
+speglsht // (c) 1994 Seta
+// V810 + ST-0016
+mayjinsn // (c) 1994 Seta
+mayjisn2 // (c) 1994 Seta
+
+// Seta System S12
+srmp6 // (c) 1996 Seta (Japan)
+
+// Seta Aleck64 and similar (N64 based)
+aleck64 // (c) 1998 Nintendo/Seta
+11beat // (c) 1998 Hudson
+mtetrisc // (c) 1998 Capcom
+starsldr // (c) 1998 Hudson/Seta
+vivdolls // (c) 1998 Visco
+srmvs // (c) 1999 Seta
+twrshaft // (c) 2003 Aruze
+hipai // (c) 2003 Seta/Aruze (Arcade TV Game List - P.92, Right, 16 from top)
+doncdoon // (c) 2003 Aruze (Arcade TV Game List - P.90, Right, 8 from bottom)
+kurufev // (c) 2003 Aruze (Arcade TV Game List - P.75, Right, 1st entry on top)
+mayjin3 // (c) 2000 Seta (Arcade TV Game List - P.101, Right, 9 from top)
+
+
+// Atlus games
+powerins // (c) 1993 Atlus (USA)
+powerinsj // (c) 1993 Atlus (Japan)
+powerinsa // (c) 1993 Atlus (bootleg of USA version)
+powerinsb // (c) 1993 Atlus (bootleg of USA version)
+ohmygod // (c) 1993 Atlus (Japan)
+naname // (c) 1994 Atlus (Japan)
+blmbycar // (c) 1994 ABM & Gecas - uses same gfx chip as powerins?
+blmbycaru // (c) 1994 ABM & Gecas - uses same gfx chip as powerins?
+watrball // (c) 1996 ABM
+
+// Sun Electronics / SunSoft games
+dai3wksi // 1979.09 Dai San Wakusei (The Third Planet)
+speakres // [Sun Electronics]
+speakresb // bootleg
+stratvox // [1980 Sun Electronics] Taito
+stratvoxb // bootleg
+spacecho // bootleg
+spacecho2 // bootleg
+route16 // (c) 1981 Tehkan/Sun + Centuri license
+route16a // (c) 1981 Tehkan/Sun + Centuri license
+route16b // bootleg
+routex // bootleg
+ttmahjng // Taito
+fnkyfish // (c) 1981 Sun Electronics
+kangaroo // (c) 1982 Sun Electronics
+kangarooa // 136008 (c) 1982 Atari
+kangaroob // (bootleg)
+arabian // TVG13 (c) 1983 Sun Electronics
+arabiana // 136019 (c) 1983 Atari
+markham // TVG14 (c) 1983 Sun Electronics
+strnskil // TVG15 (c) 1984 Sun Electronics
+guiness // TVG15 (c) 1984 Sun Electronics
+pettanp // TVG16 (c) 1984 Sun Electronics (Japan)
+banbam // TVG16 (c) 1984 Sun Electronics
+ikki // TVG17 (c) 1985 Sun Electronics (Japan)
+farmer // TVG17 (c) 1985 Sun Electronics
+shanghai // (c) 1988 Sunsoft (Sun Electronics)
+shangha2 // (c) 1989 Sunsoft (Sun Electronics)
+kothello // (c) 1990 Success
+shangha3 // (c) 1993 Sunsoft
+heberpop // (c) 1994 Sunsoft / Atlus
+blocken // (c) 1994 KID / Visco
+/*
+Other Sun games
+1978.11 (GT)Block Perfect
+1978.12 (GT)Block Challenger
+1979.04 Galaxy Force
+1979.07 Run Away
+1979.12 Warp 1
+1980.10 Cosmo Police (Cosmopolis?)
+*/
+
+// SunA games
+goindol // (c) 1987 Sun a Electronics
+goindolu // (c) 1987 Sun a Electronics
+goindolk // (c) 1987 Sun a Electronics
+rranger // (c) 1988 SunA + Sharp Image license
+sranger // (c) 1988
+srangerb // bootleg
+srangerw // (c) 1988 SunA (WDK License)
+hardhead // (c) 1988 SunA
+hardheadb // bootleg
+pop_hh // bootleg
+sparkman // (c) 1989 SunA
+sparkmana // (c) 1989 SunA
+starfigh // (c) 1990 SunA
+hardhea2 // (c) 1991 SunA
+brickzn // (c) 1992 SunA
+brickzn3 // (c) 1992 SunA
+bestbest // (c) 1994 SunA
+sunaq // (c) 1994 SunA
+bssoccer // (c) 1996 SunA
+uballoon // (c) 1996 SunA
+
+// Dooyong games
+gundealr // (c) 1990 Dooyong
+gundealra // (c) 1990 Dooyong
+gundealrt // (c) 1990 Tecmo
+yamyam // (c) 1990 Dooyong
+wiseguy // (c) 1990 Dooyong
+lastday // (c) 1990 Dooyong
+lastdaya // (c) 1990 Dooyong
+gulfstrm // (c) 1991 Dooyong
+gulfstrmm // (c) 1991 Dooyong + distributed by Media Shoji
+pollux // (c) 1991 Dooyong
+polluxa // (c) 1991 Dooyong
+polluxa2 // (c) 1991 Dooyong
+flytiger // (c) 1992 Dooyong
+bluehawk // (c) 1993 Dooyong
+bluehawkn // (c) 1993 NTC
+sadari // (c) 1993 NTC
+gundl94 // (c) 1994 Dooyong
+primella // (c) 1994 NTC
+superx // (c) 1994 NTC
+superxm // (c) 1994 Mitchell
+rshark // (c) 1995 Dooyong
+popbingo // (c) 1996 Dooyong
+
+// Tong Electronic games
+leprechn // (c) 1982
+potogold // (c) 1982
+leprechp // (c) 1982
+piratetr // (c) 1982
+beezer // (c) 1982
+beezer1 // (c) 1982
+
+// Comad games
+pushman // (c) 1990 Comad
+pushmana // (c) 1990 Comad
+pushmans // (c) 1990 Comad + American Sammy license
+pushmant // (c) 1990 Comad + Top Tronic license
+bballs // (c) 1991 Comad
+zerozone // (c) 1993 Comad
+lvgirl94 // (c) 1994 Comad
+hotpinbl // (c) 1995 Comad & New Japan System
+galspnbl // (c) 1996 Comad
+ // the following ones run on modified Gals Panic hardware
+fantasia // (c) 1994 Comad & New Japan System
+supmodel // (c) 1994 Comad & New Japan System
+newfant // (c) 1995 Comad & New Japan System
+fantsy95 // (c) 1995 Hi-max Technology Inc.
+zipzap // (c) 1995 Barko Corp
+missw96 // (c) 1996 Comad
+missmw96 // (c) 1996 Comad
+fantsia2 // (c) 1997 Comad
+fantsia2a // (c) 1997 Comad
+wownfant // (c) 2002 Comad
+galhustl // (c) 1997 ACE International
+
+// Playmark games
+sslam // (c) 1993 - hack of Namco's Super World Court
+sslama // (c) 1993 - hack of Namco's Super World Court
+powerbal // (c) 1994
+powerbals // (c) 1994
+magicstk // (c) 1995
+hotminda // (c) 1995
+bigtwin // (c) 1995
+bigtwinb // (c) 1995
+wbeachvl // (c) 1995
+wbeachvl2 // (c) 1995
+excelsr // (c) 1995
+hotmind // (c) 1995
+hrdtimes // (c) 1994
+hrdtimesa // (c) 1994
+drtomy // (c) 1993 no copyright message (1993 on pcb), some code taken from 'Big Karnak'
+sderby // (c) 1996
+pmroulet
+spacewin
+
+// Pacific Novelty games
+sharkatt // (c) 1980
+thief // (c) 1981
+natodef // (c) 1982
+natodefa // (c) 1982
+mrflea // (c) 1982
+
+// Tecfri games
+ambush // (c) 1983
+ambushj // (c) 1983 Nippon Amuse license
+ambushv // (c) 1983 Volt Electronics license
+holeland // (c) 1984
+crzrally // (c) 1985
+crzrallya // (c) 1985
+crzrallyg // (c) 1985
+speedbal // (c) 1987
+sauro // (c) 1987
+trckydoc // (c) 1987
+trckydoca // (c) 1987
+
+// Metro games
+karatour // (c) 1992 Mitchell
+ladykill // (c) 1993 Yanyaka + Mitchell license - (Arcade TV Game List - P.101, Right, 2 from Bottom)
+moegonta // (c) 1993 Yanyaka (Japan) (Arcade TV Game List - P.101, Right, 2 from Bottom)
+pangpoms // (c) 1992
+pangpomsm // (c) 1992 Mitchell / Metro
+skyalert // (c) 1992
+poitto // (c) 1993 Metro / Able Corp.
+dharma // (c) 1994
+dharmak // (c) 1994
+lastfort // (c) 1994
+lastforte // (c) 1994
+lastfortk // (c) 1994
+lastfortg // (c) 1994
+toride2g // (c) 1994
+toride2gg // (c) 1994
+toride2j // (c) 1994
+gunmast // (c) 1994
+daitorid // (c) 1995
+daitoa // (c) 1995
+dokyusei // (c) 1995 Make Software / Elf / Media Trading
+dokyusp // (c) 1995 Make Software / Elf / Media Trading
+msgogo // (c) 1995 Metro
+puzzli // (c) 1995 Metro / Banpresto
+3kokushi // (c) 1996 Mitchell
+pururun // (c) 1995 Metro / Banpresto
+balcube // (c) 1996
+mouja // (c) 1996 Etona (Japan)
+bangball // (c) 1996 Banpresto / Kunihiko Tashiro+Goodhouse
+batlbubl // (c) 1996 Banpresto / Kunihiko Tashiro+Goodhouse
+gakusai // (c) 1997 MakeSoft
+gakusai2 // (c) 1998 MakeSoft
+blzntrnd // (c) 1994 Human Amusement
+gstrik2 // (c) 1996 Human Amusement
+gstrik2j
+hyprduel // (c) 1993 Technosoft (Japan)
+hyprduel2 // (c) 1993 Technosoft (Japan)
+magerror // (c) 1994 Technosoft (Japan) (Arcade TV Game List - P.100, Left, 13 from Bottom)
+puzzlet // (c) 2000 Yunizu Corporation (Japan)
+
+// Venture Line games
+spcforce // (c) 1980 Venture Line
+spcforc2 // bootleg
+meteor // (c) 1981 Venture Line
+looping // (c) 1982 Video Games GMBH
+loopingv // (c) 1982 Video Games GMBH (Venture Line license)
+loopingva // (c) 1982 Video Games GMBH (Venture Line license)
+skybump // (c) 1982 Venture Line
+suprridr // (c) 1983 Venture Line + Taito license
+
+// Yun Sung games
+paradise // (c) >1994 Yun Sung
+paradlx // (c) >1994 Yun Sung
+para2dx // (c) >1994 Yun Sung
+tgtball // (c) 1995 Yun Sung
+tgtballa // (c) 1995 Yun Sung
+torus // (c) 1996 Yun Sung
+paprazzi // (c) 1996 Yun Sung
+madball // (c) 1998 Yun Sung
+madballn // (c) 1998 Yun Sung
+cannball // (c) 1995 Yun Sung / Soft Visio
+cannballv // (c) 1995 Yun Sung / T&K
+magix // (c) 1995 Yun Sung
+rocktris // (c) 1994? Yun Sung
+magicbub // (c) Yun Sung
+magicbuba // (c) Yun Sung
+shocking // (c) 1997 Yun Sung
+bombkick // (c) 1998 Yun Sung
+nmg5 // (c) 1998 Yun Sung
+nmg5e // (c) 1998 Yun Sung
+searchey // (c) 1999 Yun Sung
+searchp2 // (c) 1999 Yun Sung
+pclubys // (c) 2000 Yun Sung
+pclubysa // (c) 2000 Yun Sung
+garogun // (c) 2000 Yun Sung
+7ordi // (c) 2002 Yun Sung
+wondstck // (c) ???? Yun Sung
+
+// Zilec games
+blueprnt // (c) 1982 Bally Midway (Zilec in ROM 3U, and the programmer names)
+blueprntj // (c) 1982 Jaleco (Zilec in ROM 3U, and the programmer names)
+saturnzi // (c) 1983 Jaleco (Zilec in ROM R6, and the programmer names)
+
+// Fuuki FG-2 games
+gogomile // (c) 1995
+gogomilej // (c) 1995 (Japan)
+pbancho // (c) 1996 (Japan)
+
+// Fuuki FG-3 games
+asurabld // (c) 1998 (Japan)
+asurabus // (c) 2000 (Japan)
+
+// Unico games
+drgnmst // (c) 1994
+burglarx // (c) 1997
+zeropnt // (c) 1998
+zeropnta // (c) 1998
+zeropnt2 // (c) 1999
+silkroad // (c) 1999
+aoh // (c) 2001
+
+// Afega games
+twinactn // (c) 1996 - bootleg of US AFF Mustang
+stagger1 // (c) 1998
+redhawk // (c) 1997
+redhawke // (c) 1997 Excellent Co., Ltd license
+redhawki // (c) 1997 Haedong Corp. license
+redhawkb // (c) 1997
+grdnstrm // (c) 1998
+grdnstrmk // (c) 1998
+bubl2000 // (c) 1998 Tuning
+hotbubl // (c) 1998 Pandora
+popspops // (c) 1999
+firehawk // (c) 2001 ESD
+mangchi // (c) 2000
+spec2k // (c) 2000 Yonatech
+
+// ESD games
+// http://www.esdgame.co.kr/english/
+multchmp // (c) 1998 (World)
+multchmpk // (c) 1998 (Korea)
+mchampdx // (c) 1999 ESD
+mchampdxa // (c) 1999 ESD
+mchampdxb // (c) 1999 ESD
+hedpanic // (c) 2000 ESD
+hedpanicf // (c) 2000 ESD + Fuuki, Co. Ltd.
+hedpanico // (c) 1999 ESD
+tangtang // (c) 2000 ESD
+swatpolc // (c) 2001 ESD
+
+// Dyna Electronics / Dynax / Nakanihon games
+royalmj // (c) 1982 Nichibutsu
+openmj // (c) 1982 Nichibutsu
+royalmah // Falcon bootleg
+janyoup2 // Falcon bootleg
+janputer // (c) 1982 Taito
+janoh // (c) 1984 Toaplan
+janoha // (c) 1984 Toaplan
+jansou // (c) 1985 Dyna
+jansoua // (c) 1985 Dyna
+mjsiyoub // (c) 1986 Visco
+mjsenka // (c) 1986 Visco
+mjyarou // (c) 1986 Visco / Video System
+mjclub // (c) 1986 Xex
+daisyari // (c) 1989 Best System
+suzume // ?? (c) 1986 Dyna Electronics
+hnayayoi // "02" (c) 1987 Dyna Electronics
+dondenmj // "03" (c) 1986 Dyna Electronics
+ippatsu // ?? (c) 1986 Dyna Electronics
+hnfubuki // "06" (c) 1987 Dynax
+mjdiplob // "07" (c) 1987 Dynax
+untoucha // "08" (c) 1987 Dynax
+tontonb // "09" (c) 1987 Dynax
+makaijan // ?? (c) 1987 Dynax
+hanamai // "16" (c) 1988 Dynax
+majs101b // "17" (c) [1988] Dynax
+mjapinky // 1988 Dynax
+mjdejavu // 1989 Dynax
+mjdejav2 // 1989 Dynax
+hnkochou // "20" (c) 1989 Dynax
+mjderngr // "22" (c) 1989 Dynax
+hnoridur // "23" (c) 1989 Dynax
+drgpunch // "24" (c) 1989 Dynax
+mjfriday // "26" (c) [1989] Dynax
+jantouki // "27" Jantouki 1989 Dynax
+gekisha // "28" 1989 Dynax
+mjifb // "29" 1990 Dynax
+mjifb2 // "29" 1990 Dynax
+mjifb3 // "29" 1990 Dynax
+mjvegas // 1991 Dynax
+mjvegasa // 1991 Dynax
+cafetime // 1992 Dynax
+cafedoll // 1993 Dynax
+janptr96 // 1996 Dynax
+janptrsp // 1997 Dynax
+sprtmtch // "31" (c) 1989 Dynax + Fabtek license
+maya // (c) 1994 Promat
+mayaa // (c) 1994 Promat
+inca // (c) 199? ????
+blktouch // (c) Yang Gi Co Ltd.
+mcnpshnt // "33" Mahjong Campus Hunting 1990 Dynax
+7jigen // "37" 7jigen no Youseitachi 1990 Dynax
+neruton // "45" Mahjong Neruton Haikujiradan 1990 Dynax
+nerutona // "45" Mahjong Neruton Haikujiradan 1990 Dynax
+mjcomv1 // 1991 Dynax
+shpeng // (c) 1995 WSAC Systems
+tenkai // 1991 Dynax
+tenkai2b // 1991 Dynax
+tenkaibb // 1991 Dynax
+tenkaicb // 1991 Dynax
+tenkaid // 1991 Dynax
+tenkaie // 1991 Dynax
+htengoku // 1992 Dynax
+mjreach // 1994 Dynax
+mjdialq2 // "52" (c) 1991 Dynax
+yarunara // "55" Mahjong Yarunara 1991 Dynax
+mjangels // "61" Mahjong Angels 1991 Dynax
+quiztvqq // "64" Quiz TV Gassyuukoku Q&Q 1992 Dynax
+mmpanic // "70" 1992 Nakanihon/Taito
+quizchq // "73" (c) 1993 Nakanihon
+quizchql // "73" (c) 1993 Laxan
+funkyfig // "74" (c) 1993 Nakanihon + East Technology
+animaljr // "75" 1993 Nakanihon/Taito (USA)
+animaljrs // "75" 1993 Nakanihon/Taito (Spanish version)
+animaljrj // "75" 1993 Nakanihon/Taito (Japan)
+hginga // 1994 Dynax
+mjmyster // "?7" 1994 Dynax
+mjmywrld // "?7" 1994 Dynax
+mjmyornt // 1994 Dynax
+mjmyuniv // 1994 Dynax
+quiz365 // "78" (c) 1994 Nakanihon
+quiz365t // "78" (c) 1994 Nakanihon (Taiwan)
+rongrong // "80" (c) 1994 Nakanihon
+rongrongj // "80" (c) 1994 Nakanihon
+rongrongg // "80" (c) 1994 Nakanihon
+hparadis // (c) 1994 Nakanihon
+hgokou // (c) 1995 Nakanihon
+mjdchuka // (c) 1995 Nakanihon
+mjtensin // "100" 1995 Dynax
+nettoqc // "103" (c) 1995 Nakanihon
+majrjhdx // "105" 1996 Dynax
+ddenlovj // "113" (c) 1995 Dynax (Japan)
+ddenlovrk // "113" (c) 1995 Dynax (Korea)
+ddenlovr // "113" (c) 1996 Dynax (Hong Kong)
+ddenlovrb // bootleg
+hanakanz // "507" 1996 Dynax
+akamaru // "501" 1996 Dynax
+sryudens // "502" 1996 Dynax / Face
+mjflove // 1996 Dynax
+hkagerou // "510" Hana Kagerou 1996 Nakanihon
+realbrk // "600" Billiard Academy Real Break 1998 (Europe)
+realbrkk // "600" Billiard Academy Real Break 1998 (Korea)
+realbrkj // "523" Billiard Academy Real Break 1998 (Japan)
+dai2kaku // "522" DaiDaiKakumei (Japan)
+mjchuuka // "???" (c) 1998 Dynax
+mjreach1 // "526" Mahjong Reach Ippatsu 1998 Nihon System/Dynax
+cafebrk // "528" Mahjong Cafe Break (C) 1999 Nakanihon / Dynax
+jongtei // "532" Mahjong Jong-Tei (C) 1999 Dynax
+daimyojn // 2002 Dynax / Techno-Top
+
+pkgnsh // "505" Pachinko Gindama Shoubu 1998 (Japan)
+pkgnshdx // "522" Pachinko Gindama Shoubu DX 1998 (Japan)
+
+hjingi // "???" 1990 Dynax
+hanayara // "???"
+mjelctrn // "???" Mahjong Electron Base parts 2 & 4
+mjelct3 // "???" Mahjong Electron Base parts 2 & 3
+mjelct3a // "???" Mahjong Electron Base parts 2 & 3
+mjelctrb // (c) 1993 Dynax Mahjong Electron Base parts 4
+majxtal7 // "???"
+
+// Sigma games
+nyny // (c) 1980 Sigma Ent. Inc.
+nynyg // (c) 1980 Sigma Ent. Inc. + Gottlieb
+warcadia // (c) 1982 Sigma Ent. Inc.
+r2dtank // (c) 1980 Sigma Ent. Inc.
+spiders // (c) 1981 Sigma Ent. Inc.
+spiders2 // (c) 1981 Sigma Ent. Inc.
+spiders3 // (c) 1981 Sigma Ent. Inc.
+spinner // bootleg
+sub // (c) 1985 Sigma Ent. Inc.
+
+// Sigma B52
+jwildb52 // (c) 199? Sigma
+jwildb52a // (c) 199? Sigma
+jwildb52h // (c) 199? Sigma
+
+// Sigma B98 / Sammy Medal Games
+gegege // (c) 1997 Banpresto / Sigma
+sammymdl // (c) 2000-2003 Sammy
+animalc // (c) 2000 Sammy
+itazuram // (c) 2000 Sammy
+pyenaget // (c) 2000 Sammy
+tdoboon // (c) 2000 Sammy
+haekaka // (c) 2001 Sammy
+
+// IGS games ( www.igs.com.tw
+goldstar // (c) 198? IGS
+goldstbl // (c) 198? IGS
+moonlght // bootleg
+chry10 // bootleg
+chrygld // bootleg
+cabaret // (c) 1992 AMT
+cpoker // (c) 1993? IGS
+cpokert // (c) 1993? Tuning
+csk227it // (c) 198? IGS
+csk234it // (c) 198? IGS
+igs_ncs // (c) 198? IGS
+igs_ncs2 // (c) 2000 IGS
+spk115it // (c) 199? IGS
+spk116it // (c) 199? IGS
+jackie // (c) 1993 IGS
+pktet346 // (c) 199? IGS
+chleague // (c) 199? IGS
+chleagul // (c) 199? IGS
+number10 // (c) IGS (Board labeled Playmark Srl)
+numbr10l // (c) IGS (Board labeled Playmark Srl)
+cpokerpk // (c) SGS (bootleg blue board)
+cpokerpkg // (c) SGS (bootleg green board)
+citalcup // (c) SGS (bootleg of IGS v220it)
+stellecu // (c) 1998
+iqblock // (c) 1993
+grndtour // (c) 1993
+5clown // (c) IGS 1993
+5clowna // (c) IGS 1993
+5clownsp // (c) IGS 1993
+
+// IGS005 + IGS006 + IGS007 + IGS008 Games
+lordgun // (c) 1994
+aliencha // (c) 1994
+alienchac // (c) 1994
+
+// IGS009 Games
+jingbell // (c) 1995?
+gp98 // (c) 1998
+
+// IGS011 Games
+lhb // (c) 1995
+lhbv33c // (c) 1995
+ryukobou // (c) 1995
+dbc // (c) 199?
+lhb2 // (c) 1996
+xymg // (c) 1996
+wlcc // (c) 1996
+vbowl // (c) 1996
+vbowlj // (c) 1996
+drgnwrld // (c) 1997
+drgnwrldv30 // (c) 1995
+drgnwrldv21 // (c) 1995
+drgnwrldv21j // (c) 1995
+drgnwrldv20j // (c) 1995
+drgnwrldv10c // (c) 1995
+drgnwrldv11h // (c) 1995
+nkishusp // (c) 1998
+
+// IGS017 / IGS031 Games
+iqblocka // (c) 1996
+iqblockf // (c) 1996
+tjsb // (c) 1997
+sdmg2 // (c) 1997
+mgdh // (c) 1997
+mgdha // (c) 1997
+mgcs // (c) 1998
+lhzb2 // (c) 1998
+lhzb2a // (c) 1998
+slqz2 // (c) 1998
+tarzan // (c) 1999?
+tarzana // (c) 1999?
+starzan // (c) 2000?
+
+// IGS027A Games
+bigd2 // (c) 2000
+sdwx // (c) 2002
+sddz // (c) 200?
+lhzb3 // (c) 200?
+lhzb4 // (c) 200?
+klxyj // (c) 200?
+mgfx // (c) 200?
+
+// IGS PGM System Games
+pgm
+orlegend // (c) 1997
+orlegende // (c) 1997
+orlegendc // (c) 1997
+orlegendca // (c) 1997
+orlegend111c // (c) 1997
+orlegend105k // (c) 1997
+drgw2 // (c) 1997
+dw2v100x // (c) 1997
+drgw2c // (c) 1997
+drgw2j // (c) 1997
+drgw3 // (c) 1998
+drgw3105 // (c) 1998
+drgw3100 // (c) 1998
+dwex // (c) 1998
+killbld // (c) 1998
+killbld104 // (c) 1998
+kov // (c) 1999
+kovplus // (c) 1999
+kovplusa // (c) 1999
+kov115 // (c) 1999
+kov100 // (c) 1999
+kovsh // (c) 1999
+kovsh103 // (c) 1999
+kovqhsgs // bootleg
+kovlsqh2 // bootleg
+kovlsjb // bootleg
+kovlsjba // bootleg
+photoy2k // (c) 1999
+photoy2k102 // (c) 1999
+photoy2k104 // (c) 1999
+puzlstar // (c) 1999
+olds // (c) 1999
+olds100 // (c) 1999
+olds100a // (c) 1999
+kov2 // (c) 2000
+kov2106 // (c) 2000
+kov2103 // (c) 2000
+kov2102 // (c) 2000
+kov2101 // (c) 2000
+kov2100 // (c) 2000
+kov2p // (c) 2000
+kov2p205 // (c) 2000
+ddp2 // (c) 2001
+ddp2100 // (c) 2001
+ddp2101 // (c) 2001
+puzzli2 // (c) 2001
+martmast // (c) 2001
+martmastc // (c) 2001
+martmastc102 // (c) 2001
+theglad // (c) 2001
+theglada // (c) 2001
+dw2001 // (c) 2001
+py2k2 // (c) 2001
+dmnfrnt // (c) 2002
+dmnfrnta // (c) 2002
+kovshp
+oldsplus
+killbldp
+happy6
+svg
+ket
+keta
+ketb
+ddp3
+ddp3a
+ddp3b
+ddp3blk
+espgal
+orleg2 // (c) 2007
+
+// Spirit Tech. Corp.
+dunhuang // (c) 1995
+
+// RamTek games
+hitme // (c) 05/1976 Ramtek
+hitme1 // (c) 05/1976 Ramtek
+m21 // (c) 08/1976 Mirco
+barricad // (c) 1976 Ramtek
+brickyrd // (c) 1976 Ramtek
+starcrus // (c) 1977 Ramtek
+super21 // (c) 1978 Mirco
+
+// Omori games
+shuttlei // (c) 1979 Omori (Arcade Tv Game List - P.79, Left, 6 from bottom)
+skylove // (c) 1979 Omori
+battlex // (c) 1982 Omori E. Co., Ltd.
+carjmbre // (c) 1983 Omori Electric Co., Ltd.
+popper // (c) 1983 Omori Electric Co., Ltd.
+
+// TCH games
+speedspn // (c) 1994
+mstworld // (c) 1994
+
+kickgoal // (c) 1995
+actionhw // (c) 1995
+
+// U.S. Games games
+usg32 // (c) 1987
+usg82 // (c) 1988
+usg83 // (c) 1988
+usg83x // (c) 1988
+usg182 // (c) 1989
+usg185 // (c) 1991
+usg252 // (c) 1992
+
+// Sanritsu games
+mermaid // (c) 1982 Rock-ola, made by Sanritsu
+yachtmn // (c) 1982 [Sanritsu] Esco
+rougien // (c) 1982 Sanritsu
+drmicro // (c) 1983 Sanritsu
+jantotsu // (c) 1983 Sanritsu
+appoooh // (c) 1984 Sega, made by Sanritsu
+robowres // (c) 1986 Sega
+robowresb // bootleg
+bankp // (c) 1984 Sega, made by Sanritsu
+combh // (c) 1987 Sega, made by Sanritsu
+mjkjidai // (c) 1986 Sanritsu
+chinsan // (c) 1987 Sanritsu
+mayumi // (c) 1988 Victory L.L.C., made by Sanritsu
+
+// Rare games
+xtheball // (c) 1991 Rare
+btoads // (c) 1994 Rare
+kinst // (c) 1994 Rare
+kinst14 // (c) 1994 Rare
+kinst13 // (c) 1994 Rare
+kinstp // (c) 1994 Rare
+kinst2 // (c) 1995 Rare
+kinst2k4 // (c) 1995 Rare
+kinst213 // (c) 1995 Rare
+kinst2k3 // (c) 1995 Rare
+kinst211 // (c) 1995 Rare
+kinst210 // (c) 1995 Rare
+
+// Nihon System games
+gigas // (c) 1986 Sega
+gigasb // (c) 1986 bootleg
+gigasm2b // (c) 1986 bootleg
+oigas // (c) 1986 bootleg
+pbillrd // (c) 1987 Nihon System
+pbillrds // (c) 1988 Nihon System (+ optional Sega)
+freekick // (c) 1988 Nihon System (+ optional Sega)
+freekickb // (c) 1987 bootleg
+freekickb2 // (c) 1987 bootleg
+countrun // (c) 1988 Nihon System (+ optional Sega)
+countrunb // (c) 1988 bootleg
+countrunb2 // (c) 1988 bootleg
+
+// Alba games
+rmhaihai // (c) 1985 Alba
+rmhaihib // (c) 1985 Alba
+rmhaijin // (c) 1986 Alba
+rmhaisei // (c) 1986 Visco
+themj // (c) 1987 Visco
+hanaroku // (c) 1988 Alba
+yumefuda // (c) 198? Alba
+
+// Home Data games
+hourouki // (c) 1987 Home Data
+mhgaiden // (c) 1987 Home Data
+mirderby // (c) 1988 Home Data?
+mjhokite // (c) 1988 Home Data
+mjclinic // (c) 1988 Home Data
+mrokumei // (c) 1988 Home Data
+reikaids // (c) 1988 Home Data
+mjkojink // (c) 1989 Home Data
+vitaminc // (c) 1989 Home Data
+mjyougo // (c) 1989 Home Data
+lemnangl // (c) 1990 Home Data
+mjkinjas // (c) 1991 Home Data
+battlcry // (c) 1991 Home Data
+jogakuen // (c) 1992 Windom corporation
+mjikaga // (c) 1991 Mitchell
+mjprivat // (c) 1991 Matoba
+
+// Art & Magic games
+ultennis // (c) 1993
+ultennisj // (c) 1993
+cheesech // (c) 1994
+stonebal // (c) 1994
+stonebal2 // (c) 1994
+
+shtstar // (c) 1994 Nova
+
+// Dynamo games
+skeetsht // (c) 1991
+toursol // (c) 1995 Dynamo
+toursol1 // (c) 1995 Dynamo
+
+// Taiyo games
+dynamski // (c) 1984 Taiyo
+chinhero // (c) 1984 Taiyo
+chinhero2 // (c) 1984 Taiyo
+chinherot // (c) 1984 Taiyo
+shangkid // (c) 1985 Taiyo + Data East license
+hiryuken // (c) 1985 Taito
+
+// Tatsumi Games
+kingdrby // (c) 1981 Tatsumi
+tx1 // (c) 1983 Tatsumi
+tx1a // (c) 1983 Tatsumi
+// TX-1 V8 // (c) 1984 Tatsumi
+buggyboy // (c) 1985 Tatsumi
+buggyboyjr // (c) 1986 Tatsumi
+lockon // (c) 1986 Tatsumi
+lockonc // (c) 1986 Tatsumi
+// Gray-Out // (c) 1987 Tatsumi
+apache3 // (c) 1988 Tatsumi
+apache3a // (c) 1988 Tatsumi + Kana Corporation license
+roundup5 // (c) 1989 Tatsumi
+// Round Up 5 cockpit
+cyclwarr // (c) 1991 Tatsumi
+bigfight // (c) 1992 Tatsumi
+// Life // (c) 1997 Tatsumi
+
+// Electronic Devices
+mugsmash // (c) Electronic Devices (Italy) / 3D Games (England)
+stlforce // (c) 1994 Electronic Devices (Italy) / Ecogames S.L. (Spain)
+fantland // (c) 198? Electronic Devices Italy
+fantlanda // (c) 198? Electronic Devices Italy
+wheelrun // (c) 1988? International Games
+galaxygn // (c) 1989 Electronic Devices Italy
+borntofi // (c) International Games?
+diverboy // (c) 1992 Electronic Devices
+twinbrat // (c) 1995
+twinbrata // (c) 1995
+ppmast93 // (c) 1993 Electronic Devices S.R.L.
+twins // (c) 1994
+twinsa // (c) 1994
+mwarr
+pzletime
+
+// Arcadia System
+ar_bios
+ar_airh // (c) 1988
+ar_airh2 // (c) 1988
+ar_bowl // (c) 1988
+ar_dart // (c) 1987
+ar_dart2 // (c) 1987
+ar_fast // (c) 1988
+ar_ldrb // (c) 1988
+ar_ldrba // (c) 1988
+ar_ninj // (c) 1987
+ar_ninj2 // (c) 1987
+ar_rdwr // (c) 1988
+ar_sdwr // (c) 1988
+ar_sdwr2 // (c) 1988
+ar_socc // (c) 1989
+ar_spot // (c) 1990
+ar_sprg // (c) 1987
+ar_xeon // (c) 1988
+
+// Sente Super System
+mquake // (c) 1987
+
+// Other Amiga-based games
+upscope // (c) 1986 Grand products
+
+cd32 // (c) 1993
+cndypuzl // (c) 1995
+haremchl // (c) 1995
+lsrquiz // (c) 1995
+lsrquiz2 // (c) 1995
+mgprem11 // (c) 1995
+lasstixx // (c) 1995
+mgnumber // (c) 1995
+odeontw2 // (c) 1999
+
+// American Laser Games
+alg_bios
+maddoga // (c) 1990
+wsjr // (c) 1991
+wsjr15 // (c) 1991
+maddog // (c) 1990
+maddog2 // (c) 1992
+maddog22 // (c) 1992
+maddog21 // (c) 1992
+spacepir // (c) 1992
+gallgall // (c) 1992
+crimepat // (c) 1993
+crimep211 // (c) 1993
+crimep2 // (c) 1993
+lastbh // (c) 1994
+fastdraw // (c) 1995
+aplatoon // (c) 199? Nova?
+zortonbr // (c) 1993 Web Picmatic
+
+// Crystal System
+crysbios
+crysking // 2001 Brezzasoft. Crystal of the kings
+evosocc // 2001 Evoga. Evolution Soccer
+topbladv // 2002 Sonokong. Top Blade V
+officeye
+
+ddz // (c) 200?
+
+psattack // 2004 Uniana
+
+// Bell Fruit Cobra Hardware
+inquiztr // 1989 BFM
+escounts // 1990 BFM
+trebltop // 1991 BFM
+beeline // 1991 BFM
+quizvadr // 1991 BFM
+qos // 1992 BFM
+qosa // 1992 BFM
+qosb // 1992 BFM
+
+// Scorpion 2+Video Board Games
+qntoondo // 1993
+quintoon // 1993
+quintond // 1993
+quintono // 1993
+qntoond // 1993
+pokio // 1994
+slotsnl // 1995
+paradice // 1995
+pyramid // 1996
+sltblgtk // 1996
+sltblgpo // 1996
+sltblgp1 // 1996
+gldncrwn // 1997
+
+// MPU4 Diagnostic ROMs
+mpu4utst
+mpu4tst2
+mpu4met0
+
+// MPU4 Non-Video SWPs
+connect4 // Dolbeck Systems
+
+// MPU4+Video Board Games
+bctvidbs
+dealem // 1987
+adders // 1989
+timemchn // 1990
+turnover // 199?
+skiltrek // 1990
+crmaze // 1994
+crmazed // 1993
+crmazea // 1993
+crmaze2 // 1993
+crmaze2d // 1993
+crmaze2a // 1993
+crmaze3 // 1993
+crmaze3d // 1993
+crmaze3a // 1993
+
+mating // 199?
+matingd // 199?
+
+strikeit // 199?
+strikeitd // 199?
+strikeit2 // 199?
+strikeit2d // 199?
+
+quidgrid // 199?
+quidgridd // 199?
+quidgrid2 // 199?
+quidgrid2d // 199?
+
+eyesdown // 199?
+eyesdownd // 199?
+
+// BwB games
+blox // 199?
+bloxd // 199?
+bwbtetrs // 199?
+prizeinv // 199?
+vgpoker // 199?
+renoreel // 199?
+redhtpkr // 199?
+
+// ADP games
+backgamn // (c) 1990
+quickjac // (c) 1993
+skattv // (c) 1994
+skattva // (c) 1995
+fashiong // (c) 1997
+fashiong2 // (c) 1997
+fstation // (c) 2000
+
+// Other games on adp hardware
+funlddlx // (c) 1999
+
+// JPM Give us a Break hardware
+guab // (c) 1986
+guab3a // (c) 1986
+guab4 // (c) 1986
+guab6 // (c) 1986
+guab6a // (c) 1986
+guab7 // (c) 1986
+guab21 // (c) 1986
+guab43 // (c) 1986
+crisscrs // (c) 1986
+tenup // (c) 1988
+tenup3 // (c) 1988
+
+// JPM System 5 + video expansion 2 Games
+monopoly // (c) 1994
+monoplcl // (c) 1995
+monopldx // (c) 1995
+
+// JPM Impact Games
+cluedo // (c) 1995
+cluedo2c // (c) 1995
+cluedo2 // (c) 1995
+trivialp // (c) 1996
+scrabble // (c) 1997
+hngmnjpm // (c) 1998
+coronatn // (c) 1999
+
+// Other Games
+vega // (c) 19?? Olympia?
+astinvad // (c) 1980 Stern
+kosmokil // bootleg
+kamikaze // Leijac Corporation
+spcking2 // (c) 1979 Konami
+spaceint // [1980] Shoei
+spaceintj // [1980] Shoei
+spacefb // (c) [1980?] Nintendo
+spacefbu // (c) [1980?] Nintendo
+spacefbe // (c) [1980?] Nintendo
+spacefbg // 834-0031 (c) 1980 Gremlin
+spacefbb // bootleg
+spacebrd // bootleg
+spacedem // (c) 1980 Fortrek + made by Nintendo
+omegrace // (c) 1981 Midway
+omegrace2 // (c) 1981 Midway
+deltrace // bootleg
+monzagp // (c) 1981 Olympia
+dday // (c) 1982 Olympia
+ddayc // (c) 1982 Olympia + Centuri license
+stactics // [1981 Sega]
+exterm // (c) 1989 Premier Technology - a Gottlieb game
+flower // (c) 1986 Komax license
+flowerj // 834-5998 (c) 1986 Sega / Alpha license?
+kingofb // (c) 1985 Wood Place Inc.
+ringking // (c) 1985 Data East USA
+ringking2 // (c) 1985 Data East USA
+ringking3 // (c) 1985 Data East USA
+ringkingw // (c) 1985 Wood Place Inc.
+homo // bootleg
+dlair // (c) 1983 Cinematronics
+dlairf // (c) 1983 Cinematronics
+dlaire // (c) 1983 Cinematronics
+dlaird // (c) 1983 Cinematronics
+dlairc // (c) 1983 Cinematronics
+dlairb // (c) 1983 Cinematronics
+dlaira // (c) 1983 Cinematronics
+dleuro // (c) 1983 Atari
+dlital // (c) 1983 Sidam
+spaceace // (c) 1983 Cinematronics
+spaceaa2 // (c) 1983 Cinematronics
+spaceaa // (c)